diff --git a/.github/ALLOWLIST b/.github/ALLOWLIST index 4fa73fc4c939..c275cdfc851b 100644 --- a/.github/ALLOWLIST +++ b/.github/ALLOWLIST @@ -7,7 +7,7 @@ ##################################################### # # Learn about membership in OpenTelemetry community: -# https://github.com/open-telemetry/community/blob/main/community-membership.md +# https://github.com/open-telemetry/community/blob/main/guides/contributor/membership.md # # # Learn about CODEOWNERS file format: @@ -24,4 +24,7 @@ internal/common ## DEPRECATED components ## UNMAINTAINED components -exporter/skywalkingexporter/ +exporter/kineticaexporter/ +exporter/opensearchexporter/ +extension/observer/ecstaskobserver/ +receiver/jmxreceiver/ diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 1bdb4f8fe2fc..5e17e88ddbe5 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -6,7 +6,7 @@ ##################################################### # # Learn about membership in OpenTelemetry community: -# https://github.com/open-telemetry/community/blob/main/community-membership.md +# https://github.com/open-telemetry/community/blob/main/guides/contributor/membership.md # # # Learn about CODEOWNERS file format: @@ -15,273 +15,290 @@ * @open-telemetry/collector-contrib-approvers -cmd/configschema/ @open-telemetry/collector-contrib-approvers @mx-psi @dmitryax -cmd/githubgen/ @open-telemetry/collector-contrib-approvers @atoulme -cmd/opampsupervisor/ @open-telemetry/collector-contrib-approvers @evan-bradley @atoulme @tigrannajaryan -cmd/otelcontribcol/ @open-telemetry/collector-contrib-approvers -cmd/oteltestbedcol/ @open-telemetry/collector-contrib-approvers -cmd/telemetrygen/ @open-telemetry/collector-contrib-approvers @mx-psi @codeboten +cmd/githubgen/ @open-telemetry/collector-contrib-approvers @atoulme +cmd/opampsupervisor/ @open-telemetry/collector-contrib-approvers @evan-bradley @atoulme @tigrannajaryan +cmd/otelcontribcol/ @open-telemetry/collector-contrib-approvers +cmd/oteltestbedcol/ @open-telemetry/collector-contrib-approvers +cmd/telemetrygen/ @open-telemetry/collector-contrib-approvers @mx-psi @codeboten -confmap/provider/s3provider/ @open-telemetry/collector-contrib-approvers @Aneurysm9 -confmap/provider/secretsmanagerprovider/ @open-telemetry/collector-contrib-approvers @driverpt @atoulme +confmap/provider/aesprovider/ @open-telemetry/collector-contrib-approvers @djaglowski @shazlehu +confmap/provider/s3provider/ @open-telemetry/collector-contrib-approvers @Aneurysm9 +confmap/provider/secretsmanagerprovider/ @open-telemetry/collector-contrib-approvers @driverpt @atoulme -connector/countconnector/ @open-telemetry/collector-contrib-approvers @djaglowski @jpkrohling -connector/datadogconnector/ @open-telemetry/collector-contrib-approvers @mx-psi @dineshg13 @ankitpatel96 -connector/exceptionsconnector/ @open-telemetry/collector-contrib-approvers @jpkrohling @marctc -connector/failoverconnector/ @open-telemetry/collector-contrib-approvers @akats7 @djaglowski @fatsheep9146 -connector/grafanacloudconnector/ @open-telemetry/collector-contrib-approvers @jpkrohling @rlankfo @jcreixell -connector/roundrobinconnector/ @open-telemetry/collector-contrib-approvers @bogdandrutu -connector/routingconnector/ @open-telemetry/collector-contrib-approvers @jpkrohling @mwear -connector/servicegraphconnector/ @open-telemetry/collector-contrib-approvers @jpkrohling @mapno -connector/spanmetricsconnector/ @open-telemetry/collector-contrib-approvers @portertech @Frapschen +connector/countconnector/ @open-telemetry/collector-contrib-approvers @djaglowski @jpkrohling +connector/datadogconnector/ @open-telemetry/collector-contrib-approvers @mx-psi @dineshg13 @ankitpatel96 @jade-guiton-dd +connector/exceptionsconnector/ @open-telemetry/collector-contrib-approvers @marctc +connector/failoverconnector/ @open-telemetry/collector-contrib-approvers @akats7 @fatsheep9146 +connector/grafanacloudconnector/ @open-telemetry/collector-contrib-approvers @rlankfo @jcreixell +connector/otlpjsonconnector/ @open-telemetry/collector-contrib-approvers @djaglowski @ChrsMark +connector/roundrobinconnector/ @open-telemetry/collector-contrib-approvers @bogdandrutu +connector/routingconnector/ @open-telemetry/collector-contrib-approvers @jpkrohling @mwear +connector/servicegraphconnector/ @open-telemetry/collector-contrib-approvers @mapno @JaredTan95 +connector/signaltometricsconnector/ @open-telemetry/collector-contrib-approvers @ChrsMark @lahsivjar +connector/spanmetricsconnector/ @open-telemetry/collector-contrib-approvers @portertech @Frapschen +connector/sumconnector/ @open-telemetry/collector-contrib-approvers @greatestusername @shalper2 @crobert-1 -examples/demo/ @open-telemetry/collector-contrib-approvers @open-telemetry/collector-approvers +examples/demo/ @open-telemetry/collector-contrib-approvers @open-telemetry/collector-approvers -exporter/alertmanagerexporter/ @open-telemetry/collector-contrib-approvers @jpkrohling @sokoide @mcube8 -exporter/alibabacloudlogserviceexporter/ @open-telemetry/collector-contrib-approvers @shabicheng @kongluoxing @qiansheng91 -exporter/awscloudwatchlogsexporter/ @open-telemetry/collector-contrib-approvers @boostchicken @bryan-aguilar @rapphil -exporter/awsemfexporter/ @open-telemetry/collector-contrib-approvers @Aneurysm9 @shaochengwang @mxiamxia @bryan-aguilar -exporter/awskinesisexporter/ @open-telemetry/collector-contrib-approvers @Aneurysm9 @MovieStoreGuy -exporter/awss3exporter/ @open-telemetry/collector-contrib-approvers @atoulme @pdelewski -exporter/awsxrayexporter/ @open-telemetry/collector-contrib-approvers @wangzlei @srprash -exporter/azuredataexplorerexporter/ @open-telemetry/collector-contrib-approvers @asaharn @ag-ramachandran -exporter/azuremonitorexporter/ @open-telemetry/collector-contrib-approvers @pcwiese -exporter/carbonexporter/ @open-telemetry/collector-contrib-approvers @aboguszewski-sumo -exporter/cassandraexporter/ @open-telemetry/collector-contrib-approvers @atoulme @emreyalvac -exporter/clickhouseexporter/ @open-telemetry/collector-contrib-approvers @hanjm @dmitryax @Frapschen @SpencerTorres -exporter/coralogixexporter/ @open-telemetry/collector-contrib-approvers @povilasv @matej-g -exporter/datadogexporter/ @open-telemetry/collector-contrib-approvers @mx-psi @dineshg13 @liustanley @songy23 @mackjmr @ankitpatel96 -exporter/datasetexporter/ @open-telemetry/collector-contrib-approvers @atoulme @martin-majlis-s1 @zdaratom-s1 @tomaz-s1 -exporter/elasticsearchexporter/ @open-telemetry/collector-contrib-approvers @JaredTan95 @ycombinator @carsonip -exporter/fileexporter/ @open-telemetry/collector-contrib-approvers @atingchen -exporter/googlecloudexporter/ @open-telemetry/collector-contrib-approvers @aabmass @dashpole @jsuereth @punya @damemi @psx95 -exporter/googlecloudpubsubexporter/ @open-telemetry/collector-contrib-approvers @alexvanboxel -exporter/googlemanagedprometheusexporter/ @open-telemetry/collector-contrib-approvers @aabmass @dashpole @jsuereth @punya @damemi @psx95 -exporter/honeycombmarkerexporter/ @open-telemetry/collector-contrib-approvers @TylerHelmuth @fchikwekwe -exporter/influxdbexporter/ @open-telemetry/collector-contrib-approvers @jacobmarble -exporter/instanaexporter/ @open-telemetry/collector-contrib-approvers @jpkrohling @hickeyma -exporter/kafkaexporter/ @open-telemetry/collector-contrib-approvers @pavolloffay @MovieStoreGuy -exporter/kineticaexporter/ @open-telemetry/collector-contrib-approvers @am-kinetica @TylerHelmuth -exporter/loadbalancingexporter/ @open-telemetry/collector-contrib-approvers @jpkrohling -exporter/logicmonitorexporter/ @open-telemetry/collector-contrib-approvers @bogdandrutu @khyatigandhi6 @avadhut123pisal -exporter/logzioexporter/ @open-telemetry/collector-contrib-approvers @yotamloe -exporter/lokiexporter/ @open-telemetry/collector-contrib-approvers @gramidt @gouthamve @jpkrohling @mar4uk -exporter/mezmoexporter/ @open-telemetry/collector-contrib-approvers @dashpole @billmeyer @gjanco -exporter/opencensusexporter/ @open-telemetry/collector-contrib-approvers @open-telemetry/collector-approvers -exporter/opensearchexporter/ @open-telemetry/collector-contrib-approvers @Aneurysm9 @MitchellGale @MaxKsyunz @YANG-DB -exporter/otelarrowexporter/ @open-telemetry/collector-contrib-approvers @jmacd @moh-osman3 @codeboten -exporter/prometheusexporter/ @open-telemetry/collector-contrib-approvers @Aneurysm9 -exporter/prometheusremotewriteexporter/ @open-telemetry/collector-contrib-approvers @Aneurysm9 @rapphil -exporter/pulsarexporter/ @open-telemetry/collector-contrib-approvers @dmitryax @dao-jun -exporter/rabbitmqexporter/ @open-telemetry/collector-contrib-approvers @swar8080 @atoulme -exporter/sapmexporter/ @open-telemetry/collector-contrib-approvers @dmitryax @atoulme -exporter/sentryexporter/ @open-telemetry/collector-contrib-approvers @AbhiPrasad -exporter/signalfxexporter/ @open-telemetry/collector-contrib-approvers @dmitryax @crobert-1 -exporter/splunkhecexporter/ @open-telemetry/collector-contrib-approvers @atoulme @dmitryax -exporter/sumologicexporter/ @open-telemetry/collector-contrib-approvers @aboguszewski-sumo @kkujawa-sumo @mat-rumian @rnishtala-sumo @sumo-drosiek @swiatekm-sumo -exporter/syslogexporter/ @open-telemetry/collector-contrib-approvers @kkujawa-sumo @rnishtala-sumo @andrzej-stencel -exporter/tencentcloudlogserviceexporter/ @open-telemetry/collector-contrib-approvers @wgliang @yiyang5055 -exporter/zipkinexporter/ @open-telemetry/collector-contrib-approvers @MovieStoreGuy @andrzej-stencel @crobert-1 +exporter/alertmanagerexporter/ @open-telemetry/collector-contrib-approvers @sokoide @mcube8 +exporter/alibabacloudlogserviceexporter/ @open-telemetry/collector-contrib-approvers @shabicheng @kongluoxing @qiansheng91 +exporter/awscloudwatchlogsexporter/ @open-telemetry/collector-contrib-approvers @boostchicken @bryan-aguilar @rapphil +exporter/awsemfexporter/ @open-telemetry/collector-contrib-approvers @Aneurysm9 @mxiamxia @bryan-aguilar +exporter/awskinesisexporter/ @open-telemetry/collector-contrib-approvers @Aneurysm9 @MovieStoreGuy +exporter/awss3exporter/ @open-telemetry/collector-contrib-approvers @atoulme @pdelewski +exporter/awsxrayexporter/ @open-telemetry/collector-contrib-approvers @wangzlei @srprash +exporter/azuredataexplorerexporter/ @open-telemetry/collector-contrib-approvers @ag-ramachandran +exporter/azuremonitorexporter/ @open-telemetry/collector-contrib-approvers @pcwiese +exporter/carbonexporter/ @open-telemetry/collector-contrib-approvers @aboguszewski-sumo +exporter/cassandraexporter/ @open-telemetry/collector-contrib-approvers @atoulme @emreyalvac +exporter/clickhouseexporter/ @open-telemetry/collector-contrib-approvers @hanjm @dmitryax @Frapschen @SpencerTorres +exporter/coralogixexporter/ @open-telemetry/collector-contrib-approvers @povilasv @matej-g +exporter/datadogexporter/ @open-telemetry/collector-contrib-approvers @mx-psi @dineshg13 @liustanley @songy23 @mackjmr @ankitpatel96 @jade-guiton-dd +exporter/datasetexporter/ @open-telemetry/collector-contrib-approvers @atoulme @martin-majlis-s1 @zdaratom-s1 @tomaz-s1 +exporter/dorisexporter/ @open-telemetry/collector-contrib-approvers @atoulme @joker-star-l +exporter/elasticsearchexporter/ @open-telemetry/collector-contrib-approvers @JaredTan95 @carsonip @lahsivjar +exporter/fileexporter/ @open-telemetry/collector-contrib-approvers @atingchen +exporter/googlecloudexporter/ @open-telemetry/collector-contrib-approvers @aabmass @dashpole @jsuereth @punya @psx95 +exporter/googlecloudpubsubexporter/ @open-telemetry/collector-contrib-approvers @alexvanboxel +exporter/googlemanagedprometheusexporter/ @open-telemetry/collector-contrib-approvers @aabmass @dashpole @jsuereth @punya @psx95 +exporter/honeycombmarkerexporter/ @open-telemetry/collector-contrib-approvers @TylerHelmuth @fchikwekwe +exporter/influxdbexporter/ @open-telemetry/collector-contrib-approvers @jacobmarble +exporter/kafkaexporter/ @open-telemetry/collector-contrib-approvers @pavolloffay @MovieStoreGuy +exporter/loadbalancingexporter/ @open-telemetry/collector-contrib-approvers @jpkrohling +exporter/logicmonitorexporter/ @open-telemetry/collector-contrib-approvers @bogdandrutu @khyatigandhi6 @avadhut123pisal +exporter/logzioexporter/ @open-telemetry/collector-contrib-approvers @yotamloe +exporter/lokiexporter/ @open-telemetry/collector-contrib-approvers @gramidt @mar4uk +exporter/mezmoexporter/ @open-telemetry/collector-contrib-approvers @dashpole @billmeyer @gjanco +exporter/opencensusexporter/ @open-telemetry/collector-contrib-approvers @open-telemetry/collector-approvers +exporter/otelarrowexporter/ @open-telemetry/collector-contrib-approvers @jmacd @moh-osman3 @lquerel +exporter/prometheusexporter/ @open-telemetry/collector-contrib-approvers @Aneurysm9 @dashpole @ArthurSens +exporter/prometheusremotewriteexporter/ @open-telemetry/collector-contrib-approvers @Aneurysm9 @rapphil @dashpole @ArthurSens +exporter/pulsarexporter/ @open-telemetry/collector-contrib-approvers @dmitryax @dao-jun +exporter/rabbitmqexporter/ @open-telemetry/collector-contrib-approvers @swar8080 @atoulme +exporter/sapmexporter/ @open-telemetry/collector-contrib-approvers @dmitryax @atoulme +exporter/sentryexporter/ @open-telemetry/collector-contrib-approvers @AbhiPrasad +exporter/signalfxexporter/ @open-telemetry/collector-contrib-approvers @dmitryax @crobert-1 +exporter/splunkhecexporter/ @open-telemetry/collector-contrib-approvers @atoulme @dmitryax +exporter/sumologicexporter/ @open-telemetry/collector-contrib-approvers @rnishtala-sumo @chan-tim-sumo +exporter/syslogexporter/ @open-telemetry/collector-contrib-approvers @kasia-kujawa @rnishtala-sumo @andrzej-stencel +exporter/tencentcloudlogserviceexporter/ @open-telemetry/collector-contrib-approvers @wgliang +exporter/zipkinexporter/ @open-telemetry/collector-contrib-approvers @MovieStoreGuy @andrzej-stencel @crobert-1 -extension/ackextension/ @open-telemetry/collector-contrib-approvers @zpzhuSplunk @splunkericl -extension/asapauthextension/ @open-telemetry/collector-contrib-approvers @jamesmoessis @MovieStoreGuy -extension/awsproxy/ @open-telemetry/collector-contrib-approvers @Aneurysm9 @mxiamxia -extension/basicauthextension/ @open-telemetry/collector-contrib-approvers @jpkrohling @frzifus -extension/bearertokenauthextension/ @open-telemetry/collector-contrib-approvers @jpkrohling @frzifus -extension/encoding/ @open-telemetry/collector-contrib-approvers @atoulme @dao-jun @dmitryax @MovieStoreGuy @VihasMakwana -extension/encoding/avrologencodingextension/ @open-telemetry/collector-contrib-approvers @thmshmm -extension/encoding/jaegerencodingextension/ @open-telemetry/collector-contrib-approvers @MovieStoreGuy @atoulme -extension/encoding/jsonlogencodingextension/ @open-telemetry/collector-contrib-approvers @VihasMakwana @atoulme -extension/encoding/otlpencodingextension/ @open-telemetry/collector-contrib-approvers @dao-jun @VihasMakwana -extension/encoding/textencodingextension/ @open-telemetry/collector-contrib-approvers @MovieStoreGuy @atoulme -extension/encoding/zipkinencodingextension/ @open-telemetry/collector-contrib-approvers @MovieStoreGuy @dao-jun -extension/googleclientauthextension/ @open-telemetry/collector-contrib-approvers @dashpole @damemi @aabmass @jsuereth @punya @psx95 -extension/headerssetterextension/ @open-telemetry/collector-contrib-approvers @jpkrohling -extension/healthcheckextension/ @open-telemetry/collector-contrib-approvers @jpkrohling -extension/healthcheckv2extension/ @open-telemetry/collector-contrib-approvers @jpkrohling @mwear -extension/httpforwarderextension/ @open-telemetry/collector-contrib-approvers @atoulme @rmfitzpatrick -extension/jaegerremotesampling/ @open-telemetry/collector-contrib-approvers @yurishkuro @frzifus -extension/oauth2clientauthextension/ @open-telemetry/collector-contrib-approvers @pavankrish123 @jpkrohling -extension/observer/ @open-telemetry/collector-contrib-approvers @dmitryax @rmfitzpatrick -extension/observer/dockerobserver/ @open-telemetry/collector-contrib-approvers @MovieStoreGuy -extension/observer/ecsobserver/ @open-telemetry/collector-contrib-approvers @dmitryax @rmfitzpatrick -extension/observer/ecstaskobserver/ @open-telemetry/collector-contrib-approvers @rmfitzpatrick -extension/observer/hostobserver/ @open-telemetry/collector-contrib-approvers @MovieStoreGuy -extension/observer/k8sobserver/ @open-telemetry/collector-contrib-approvers @rmfitzpatrick @dmitryax -extension/oidcauthextension/ @open-telemetry/collector-contrib-approvers @jpkrohling -extension/opampcustommessages/ @open-telemetry/collector-contrib-approvers @BinaryFissionGames @evan-bradley -extension/opampextension/ @open-telemetry/collector-contrib-approvers @portertech @evan-bradley @tigrannajaryan -extension/pprofextension/ @open-telemetry/collector-contrib-approvers @MovieStoreGuy -extension/remotetapextension/ @open-telemetry/collector-contrib-approvers @atoulme -extension/sigv4authextension/ @open-telemetry/collector-contrib-approvers @Aneurysm9 @erichsueh3 -extension/solarwindsapmsettingsextension/ @open-telemetry/collector-contrib-approvers @jerrytfleung @cheempz -extension/storage/ @open-telemetry/collector-contrib-approvers @dmitryax @atoulme @djaglowski -extension/storage/dbstorage/ @open-telemetry/collector-contrib-approvers @dmitryax @atoulme -extension/storage/filestorage/ @open-telemetry/collector-contrib-approvers @djaglowski -extension/sumologicextension/ @open-telemetry/collector-contrib-approvers @aboguszewski-sumo @kkujawa-sumo @mat-rumian @rnishtala-sumo @sumo-drosiek @swiatekm-sumo +extension/ackextension/ @open-telemetry/collector-contrib-approvers @zpzhuSplunk @splunkericl +extension/asapauthextension/ @open-telemetry/collector-contrib-approvers @jamesmoessis @MovieStoreGuy +extension/awsproxy/ @open-telemetry/collector-contrib-approvers @Aneurysm9 @mxiamxia +extension/basicauthextension/ @open-telemetry/collector-contrib-approvers @jpkrohling @frzifus +extension/bearertokenauthextension/ @open-telemetry/collector-contrib-approvers @jpkrohling @frzifus +extension/cgroupruntimeextension/ @open-telemetry/collector-contrib-approvers @mx-psi @rogercoll +extension/encoding/ @open-telemetry/collector-contrib-approvers @atoulme @dao-jun @dmitryax @MovieStoreGuy @VihasMakwana +extension/encoding/avrologencodingextension/ @open-telemetry/collector-contrib-approvers @thmshmm +extension/encoding/jaegerencodingextension/ @open-telemetry/collector-contrib-approvers @MovieStoreGuy @atoulme +extension/encoding/jsonlogencodingextension/ @open-telemetry/collector-contrib-approvers @VihasMakwana @atoulme +extension/encoding/otlpencodingextension/ @open-telemetry/collector-contrib-approvers @dao-jun @VihasMakwana +extension/encoding/textencodingextension/ @open-telemetry/collector-contrib-approvers @MovieStoreGuy @atoulme +extension/encoding/zipkinencodingextension/ @open-telemetry/collector-contrib-approvers @MovieStoreGuy @dao-jun +extension/googleclientauthextension/ @open-telemetry/collector-contrib-approvers @dashpole @aabmass @jsuereth @punya @psx95 +extension/headerssetterextension/ @open-telemetry/collector-contrib-approvers +extension/healthcheckextension/ @open-telemetry/collector-contrib-approvers +extension/healthcheckv2extension/ @open-telemetry/collector-contrib-approvers @jpkrohling @mwear +extension/httpforwarderextension/ @open-telemetry/collector-contrib-approvers @atoulme +extension/jaegerremotesampling/ @open-telemetry/collector-contrib-approvers @yurishkuro @frzifus +extension/oauth2clientauthextension/ @open-telemetry/collector-contrib-approvers @pavankrish123 @jpkrohling +extension/observer/ @open-telemetry/collector-contrib-approvers @dmitryax +extension/observer/cfgardenobserver/ @open-telemetry/collector-contrib-approvers @crobert-1 @cemdk @m1rp @jriguera +extension/observer/dockerobserver/ @open-telemetry/collector-contrib-approvers @MovieStoreGuy +extension/observer/ecsobserver/ @open-telemetry/collector-contrib-approvers @dmitryax +extension/observer/hostobserver/ @open-telemetry/collector-contrib-approvers @MovieStoreGuy +extension/observer/k8sobserver/ @open-telemetry/collector-contrib-approvers @dmitryax @ChrsMark +extension/oidcauthextension/ @open-telemetry/collector-contrib-approvers @jpkrohling +extension/opampcustommessages/ @open-telemetry/collector-contrib-approvers @evan-bradley +extension/opampextension/ @open-telemetry/collector-contrib-approvers @portertech @evan-bradley @tigrannajaryan +extension/pprofextension/ @open-telemetry/collector-contrib-approvers @MovieStoreGuy +extension/remotetapextension/ @open-telemetry/collector-contrib-approvers @atoulme +extension/sigv4authextension/ @open-telemetry/collector-contrib-approvers @Aneurysm9 @erichsueh3 +extension/solarwindsapmsettingsextension/ @open-telemetry/collector-contrib-approvers @jerrytfleung @cheempz +extension/storage/ @open-telemetry/collector-contrib-approvers @dmitryax @atoulme @djaglowski +extension/storage/dbstorage/ @open-telemetry/collector-contrib-approvers @dmitryax @atoulme +extension/storage/filestorage/ @open-telemetry/collector-contrib-approvers @djaglowski +extension/storage/redisstorageextension/ @open-telemetry/collector-contrib-approvers @atoulme +extension/sumologicextension/ @open-telemetry/collector-contrib-approvers @rnishtala-sumo @chan-tim-sumo -internal/aws/ @open-telemetry/collector-contrib-approvers @Aneurysm9 @mxiamxia -internal/collectd/ @open-telemetry/collector-contrib-approvers @atoulme -internal/coreinternal/ @open-telemetry/collector-contrib-approvers @open-telemetry/collector-approvers -internal/docker/ @open-telemetry/collector-contrib-approvers @rmfitzpatrick @jamesmoessis -internal/exp/metrics/ @open-telemetry/collector-contrib-approvers @sh0rez @RichieSams -internal/filter/ @open-telemetry/collector-contrib-approvers @open-telemetry/collector-approvers -internal/k8sconfig/ @open-telemetry/collector-contrib-approvers @dmitryax -internal/k8stest/ @open-telemetry/collector-contrib-approvers @crobert-1 -internal/kafka/ @open-telemetry/collector-contrib-approvers @pavolloffay @MovieStoreGuy -internal/kubelet/ @open-telemetry/collector-contrib-approvers @dmitryax -internal/metadataproviders/ @open-telemetry/collector-contrib-approvers @Aneurysm9 @dashpole -internal/pdatautil/ @open-telemetry/collector-contrib-approvers @djaglowski -internal/sharedcomponent/ @open-telemetry/collector-contrib-approvers @open-telemetry/collector-approvers -internal/splunk/ @open-telemetry/collector-contrib-approvers @dmitryax -internal/sqlquery/ @open-telemetry/collector-contrib-approvers @crobert-1 @dmitryax -internal/tools/ @open-telemetry/collector-contrib-approvers +internal/aws/ @open-telemetry/collector-contrib-approvers @Aneurysm9 @mxiamxia +internal/collectd/ @open-telemetry/collector-contrib-approvers @atoulme +internal/coreinternal/ @open-telemetry/collector-contrib-approvers @open-telemetry/collector-approvers +internal/docker/ @open-telemetry/collector-contrib-approvers @jamesmoessis @MovieStoreGuy +internal/exp/metrics/ @open-telemetry/collector-contrib-approvers @sh0rez @RichieSams +internal/filter/ @open-telemetry/collector-contrib-approvers @open-telemetry/collector-approvers +internal/grpcutil/ @open-telemetry/collector-contrib-approvers @jmacd @moh-osman3 @lquerel +internal/k8sconfig/ @open-telemetry/collector-contrib-approvers @dmitryax +internal/k8stest/ @open-telemetry/collector-contrib-approvers @crobert-1 +internal/kafka/ @open-telemetry/collector-contrib-approvers @pavolloffay @MovieStoreGuy +internal/kubelet/ @open-telemetry/collector-contrib-approvers @dmitryax +internal/metadataproviders/ @open-telemetry/collector-contrib-approvers @Aneurysm9 @dashpole +internal/otelarrow/ @open-telemetry/collector-contrib-approvers @jmacd @moh-osman3 +internal/pdatautil/ @open-telemetry/collector-contrib-approvers @djaglowski +internal/rabbitmq/ @open-telemetry/collector-contrib-approvers @swar8080 @atoulme +internal/sharedcomponent/ @open-telemetry/collector-contrib-approvers @open-telemetry/collector-approvers +internal/splunk/ @open-telemetry/collector-contrib-approvers @dmitryax +internal/sqlquery/ @open-telemetry/collector-contrib-approvers @crobert-1 @dmitryax +internal/tools/ @open-telemetry/collector-contrib-approvers -pkg/batchperresourceattr/ @open-telemetry/collector-contrib-approvers @atoulme @dmitryax -pkg/batchpersignal/ @open-telemetry/collector-contrib-approvers @jpkrohling -pkg/experimentalmetricmetadata/ @open-telemetry/collector-contrib-approvers @rmfitzpatrick -pkg/golden/ @open-telemetry/collector-contrib-approvers @djaglowski @atoulme -pkg/ottl/ @open-telemetry/collector-contrib-approvers @TylerHelmuth @kentquirk @bogdandrutu @evan-bradley -pkg/pdatatest/ @open-telemetry/collector-contrib-approvers @djaglowski @fatsheep9146 -pkg/pdatautil/ @open-telemetry/collector-contrib-approvers @dmitryax -pkg/resourcetotelemetry/ @open-telemetry/collector-contrib-approvers @mx-psi -pkg/sampling/ @open-telemetry/collector-contrib-approvers @kentquirk @jmacd -pkg/stanza/ @open-telemetry/collector-contrib-approvers @djaglowski -pkg/translator/azure/ @open-telemetry/collector-contrib-approvers @open-telemetry/collector-approvers @atoulme @cparkins -pkg/translator/jaeger/ @open-telemetry/collector-contrib-approvers @open-telemetry/collector-approvers @frzifus -pkg/translator/loki/ @open-telemetry/collector-contrib-approvers @gouthamve @jpkrohling @mar4uk -pkg/translator/opencensus/ @open-telemetry/collector-contrib-approvers @open-telemetry/collector-approvers -pkg/translator/prometheus/ @open-telemetry/collector-contrib-approvers @dashpole @bertysentry -pkg/translator/prometheusremotewrite/ @open-telemetry/collector-contrib-approvers @Aneurysm9 -pkg/translator/signalfx/ @open-telemetry/collector-contrib-approvers @dmitryax -pkg/translator/skywalking/ @open-telemetry/collector-contrib-approvers @JaredTan95 -pkg/translator/zipkin/ @open-telemetry/collector-contrib-approvers @MovieStoreGuy @andrzej-stencel @crobert-1 -pkg/winperfcounters/ @open-telemetry/collector-contrib-approvers @dashpole @Mrod1598 @BinaryFissionGames @alxbl +pkg/batchperresourceattr/ @open-telemetry/collector-contrib-approvers @atoulme @dmitryax +pkg/batchpersignal/ @open-telemetry/collector-contrib-approvers @jpkrohling +pkg/datadog/ @open-telemetry/collector-contrib-approvers @mx-psi @dineshg13 @liustanley @songy23 @mackjmr @ankitpatel96 @jade-guiton-dd +pkg/experimentalmetricmetadata/ @open-telemetry/collector-contrib-approvers @dmitryax +pkg/golden/ @open-telemetry/collector-contrib-approvers @djaglowski @atoulme +pkg/kafka/topic/ @open-telemetry/collector-contrib-approvers @pavolloffay @MovieStoreGuy +pkg/ottl/ @open-telemetry/collector-contrib-approvers @TylerHelmuth @kentquirk @bogdandrutu @evan-bradley +pkg/pdatatest/ @open-telemetry/collector-contrib-approvers @djaglowski @fatsheep9146 +pkg/pdatautil/ @open-telemetry/collector-contrib-approvers @dmitryax +pkg/resourcetotelemetry/ @open-telemetry/collector-contrib-approvers @mx-psi +pkg/sampling/ @open-telemetry/collector-contrib-approvers @kentquirk @jmacd +pkg/stanza/ @open-telemetry/collector-contrib-approvers @djaglowski +pkg/stanza/fileconsumer/ @open-telemetry/collector-contrib-approvers @djaglowski +pkg/status/ @open-telemetry/collector-contrib-approvers @jpkrohling @mwear +pkg/translator/azure/ @open-telemetry/collector-contrib-approvers @open-telemetry/collector-approvers @atoulme @cparkins +pkg/translator/azurelogs/ @open-telemetry/collector-contrib-approvers @atoulme @cparkins @MikeGoldsmith +pkg/translator/jaeger/ @open-telemetry/collector-contrib-approvers @open-telemetry/collector-approvers @frzifus +pkg/translator/loki/ @open-telemetry/collector-contrib-approvers @gouthamve @mar4uk +pkg/translator/opencensus/ @open-telemetry/collector-contrib-approvers @open-telemetry/collector-approvers +pkg/translator/prometheus/ @open-telemetry/collector-contrib-approvers @dashpole @bertysentry @ArthurSens +pkg/translator/prometheusremotewrite/ @open-telemetry/collector-contrib-approvers @Aneurysm9 @dashpole +pkg/translator/signalfx/ @open-telemetry/collector-contrib-approvers @dmitryax +pkg/translator/skywalking/ @open-telemetry/collector-contrib-approvers @JaredTan95 +pkg/translator/zipkin/ @open-telemetry/collector-contrib-approvers @MovieStoreGuy @andrzej-stencel @crobert-1 +pkg/winperfcounters/ @open-telemetry/collector-contrib-approvers @dashpole @Mrod1598 @alxbl @pjanotti -processor/attributesprocessor/ @open-telemetry/collector-contrib-approvers @boostchicken -processor/cumulativetodeltaprocessor/ @open-telemetry/collector-contrib-approvers @TylerHelmuth -processor/deltatocumulativeprocessor/ @open-telemetry/collector-contrib-approvers @sh0rez @RichieSams @jpkrohling -processor/deltatorateprocessor/ @open-telemetry/collector-contrib-approvers @Aneurysm9 -processor/filterprocessor/ @open-telemetry/collector-contrib-approvers @TylerHelmuth @boostchicken -processor/geoipprocessor/ @open-telemetry/collector-contrib-approvers @andrzej-stencel @michalpristas @rogercoll -processor/groupbyattrsprocessor/ @open-telemetry/collector-contrib-approvers @rnishtala-sumo -processor/groupbytraceprocessor/ @open-telemetry/collector-contrib-approvers @jpkrohling -processor/intervalprocessor/ @open-telemetry/collector-contrib-approvers @RichieSams @sh0rez @djaglowski -processor/k8sattributesprocessor/ @open-telemetry/collector-contrib-approvers @dmitryax @rmfitzpatrick @fatsheep9146 @TylerHelmuth -processor/logstransformprocessor/ @open-telemetry/collector-contrib-approvers @djaglowski @dehaansa -processor/metricsgenerationprocessor/ @open-telemetry/collector-contrib-approvers @Aneurysm9 -processor/metricstransformprocessor/ @open-telemetry/collector-contrib-approvers @dmitryax -processor/probabilisticsamplerprocessor/ @open-telemetry/collector-contrib-approvers @jpkrohling @jmacd -processor/redactionprocessor/ @open-telemetry/collector-contrib-approvers @dmitryax @mx-psi @TylerHelmuth -processor/remotetapprocessor/ @open-telemetry/collector-contrib-approvers @atoulme -processor/resourcedetectionprocessor/ @open-telemetry/collector-contrib-approvers @Aneurysm9 @dashpole -processor/resourcedetectionprocessor/internal/azure/ @open-telemetry/collector-contrib-approvers @mx-psi -processor/resourcedetectionprocessor/internal/heroku/ @open-telemetry/collector-contrib-approvers @atoulme -processor/resourcedetectionprocessor/internal/openshift/ @open-telemetry/collector-contrib-approvers @frzifus -processor/resourceprocessor/ @open-telemetry/collector-contrib-approvers @dmitryax -processor/routingprocessor/ @open-telemetry/collector-contrib-approvers @jpkrohling -processor/schemaprocessor/ @open-telemetry/collector-contrib-approvers @MovieStoreGuy -processor/spanprocessor/ @open-telemetry/collector-contrib-approvers @boostchicken -processor/sumologicprocessor/ @open-telemetry/collector-contrib-approvers @aboguszewski-sumo @kkujawa-sumo @mat-rumian @rnishtala-sumo @sumo-drosiek @swiatekm-sumo -processor/tailsamplingprocessor/ @open-telemetry/collector-contrib-approvers @jpkrohling -processor/transformprocessor/ @open-telemetry/collector-contrib-approvers @TylerHelmuth @kentquirk @bogdandrutu @evan-bradley +processor/attributesprocessor/ @open-telemetry/collector-contrib-approvers @boostchicken +processor/coralogixprocessor/ @open-telemetry/collector-contrib-approvers @crobert-1 @galrose +processor/cumulativetodeltaprocessor/ @open-telemetry/collector-contrib-approvers @TylerHelmuth +processor/deltatocumulativeprocessor/ @open-telemetry/collector-contrib-approvers @sh0rez @RichieSams +processor/deltatorateprocessor/ @open-telemetry/collector-contrib-approvers @Aneurysm9 +processor/filterprocessor/ @open-telemetry/collector-contrib-approvers @TylerHelmuth @boostchicken +processor/geoipprocessor/ @open-telemetry/collector-contrib-approvers @andrzej-stencel @michalpristas @rogercoll +processor/groupbyattrsprocessor/ @open-telemetry/collector-contrib-approvers @rnishtala-sumo +processor/groupbytraceprocessor/ @open-telemetry/collector-contrib-approvers @jpkrohling +processor/intervalprocessor/ @open-telemetry/collector-contrib-approvers @RichieSams @sh0rez +processor/k8sattributesprocessor/ @open-telemetry/collector-contrib-approvers @dmitryax @fatsheep9146 @TylerHelmuth @ChrsMark +processor/logdedupprocessor/ @open-telemetry/collector-contrib-approvers @MikeGoldsmith @djaglowski +processor/logstransformprocessor/ @open-telemetry/collector-contrib-approvers @dehaansa +processor/metricsgenerationprocessor/ @open-telemetry/collector-contrib-approvers @Aneurysm9 +processor/metricstransformprocessor/ @open-telemetry/collector-contrib-approvers @dmitryax +processor/probabilisticsamplerprocessor/ @open-telemetry/collector-contrib-approvers @jpkrohling @jmacd +processor/redactionprocessor/ @open-telemetry/collector-contrib-approvers @dmitryax @mx-psi @TylerHelmuth +processor/remotetapprocessor/ @open-telemetry/collector-contrib-approvers @atoulme @jaronoff97 +processor/resourcedetectionprocessor/ @open-telemetry/collector-contrib-approvers @Aneurysm9 @dashpole +processor/resourceprocessor/ @open-telemetry/collector-contrib-approvers @dmitryax +processor/routingprocessor/ @open-telemetry/collector-contrib-approvers @jpkrohling +processor/schemaprocessor/ @open-telemetry/collector-contrib-approvers @MovieStoreGuy @ankitpatel96 +processor/spanprocessor/ @open-telemetry/collector-contrib-approvers @boostchicken +processor/sumologicprocessor/ @open-telemetry/collector-contrib-approvers @rnishtala-sumo @chan-tim-sumo +processor/tailsamplingprocessor/ @open-telemetry/collector-contrib-approvers @jpkrohling +processor/transformprocessor/ @open-telemetry/collector-contrib-approvers @TylerHelmuth @kentquirk @bogdandrutu @evan-bradley -receiver/activedirectorydsreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski @BinaryFissionGames -receiver/aerospikereceiver/ @open-telemetry/collector-contrib-approvers @djaglowski @antonblock -receiver/apachereceiver/ @open-telemetry/collector-contrib-approvers @djaglowski -receiver/apachesparkreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski @Caleb-Hurshman @mrsillydog -receiver/awscloudwatchmetricsreceiver/ @open-telemetry/collector-contrib-approvers @jpkrohling -receiver/awscloudwatchreceiver/ @open-telemetry/collector-contrib-approvers @schmikei -receiver/awscontainerinsightreceiver/ @open-telemetry/collector-contrib-approvers @Aneurysm9 @pxaws -receiver/awsecscontainermetricsreceiver/ @open-telemetry/collector-contrib-approvers @Aneurysm9 -receiver/awsfirehosereceiver/ @open-telemetry/collector-contrib-approvers @Aneurysm9 -receiver/awss3receiver/ @open-telemetry/collector-contrib-approvers @atoulme @adcharre -receiver/awsxrayreceiver/ @open-telemetry/collector-contrib-approvers @wangzlei @srprash -receiver/azureblobreceiver/ @open-telemetry/collector-contrib-approvers @eedorenko @mx-psi -receiver/azureeventhubreceiver/ @open-telemetry/collector-contrib-approvers @atoulme @cparkins -receiver/azuremonitorreceiver/ @open-telemetry/collector-contrib-approvers @nslaughter @codeboten -receiver/bigipreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski @StefanKurek -receiver/carbonreceiver/ @open-telemetry/collector-contrib-approvers @aboguszewski-sumo -receiver/chronyreceiver/ @open-telemetry/collector-contrib-approvers @MovieStoreGuy @jamesmoessis -receiver/cloudflarereceiver/ @open-telemetry/collector-contrib-approvers @dehaansa @djaglowski -receiver/cloudfoundryreceiver/ @open-telemetry/collector-contrib-approvers @crobert-1 -receiver/collectdreceiver/ @open-telemetry/collector-contrib-approvers @atoulme -receiver/couchdbreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski -receiver/datadogreceiver/ @open-telemetry/collector-contrib-approvers @boostchicken @gouthamve @jpkrohling @MovieStoreGuy -receiver/dockerstatsreceiver/ @open-telemetry/collector-contrib-approvers @rmfitzpatrick @jamesmoessis -receiver/elasticsearchreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski @BinaryFissionGames -receiver/expvarreceiver/ @open-telemetry/collector-contrib-approvers @jamesmoessis @MovieStoreGuy -receiver/filelogreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski -receiver/filestatsreceiver/ @open-telemetry/collector-contrib-approvers @atoulme -receiver/flinkmetricsreceiver/ @open-telemetry/collector-contrib-approvers @JonathanWamsley @djaglowski -receiver/fluentforwardreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax -receiver/gitproviderreceiver/ @open-telemetry/collector-contrib-approvers @adrielp @andrzej-stencel -receiver/googlecloudpubsubreceiver/ @open-telemetry/collector-contrib-approvers @alexvanboxel -receiver/googlecloudspannerreceiver/ @open-telemetry/collector-contrib-approvers @varunraiko -receiver/haproxyreceiver/ @open-telemetry/collector-contrib-approvers @atoulme @MovieStoreGuy -receiver/hostmetricsreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax @braydonk -receiver/httpcheckreceiver/ @open-telemetry/collector-contrib-approvers @codeboten -receiver/iisreceiver/ @open-telemetry/collector-contrib-approvers @Mrod1598 @djaglowski -receiver/influxdbreceiver/ @open-telemetry/collector-contrib-approvers @jacobmarble -receiver/jaegerreceiver/ @open-telemetry/collector-contrib-approvers @yurishkuro -receiver/jmxreceiver/ @open-telemetry/collector-contrib-approvers @rmfitzpatrick -receiver/journaldreceiver/ @open-telemetry/collector-contrib-approvers @sumo-drosiek @djaglowski -receiver/k8sclusterreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax @TylerHelmuth @povilasv -receiver/k8seventsreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax @TylerHelmuth -receiver/k8sobjectsreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax @hvaghani221 @TylerHelmuth -receiver/kafkametricsreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax -receiver/kafkareceiver/ @open-telemetry/collector-contrib-approvers @pavolloffay @MovieStoreGuy -receiver/kubeletstatsreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax @TylerHelmuth -receiver/lokireceiver/ @open-telemetry/collector-contrib-approvers @mar4uk @jpkrohling -receiver/memcachedreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski -receiver/mongodbatlasreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski @schmikei -receiver/mongodbreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski @schmikei -receiver/mysqlreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski -receiver/namedpipereceiver/ @open-telemetry/collector-contrib-approvers @sinkingpoint @djaglowski -receiver/nginxreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski -receiver/nsxtreceiver/ @open-telemetry/collector-contrib-approvers @dashpole @schmikei -receiver/opencensusreceiver/ @open-telemetry/collector-contrib-approvers @open-telemetry/collector-approvers -receiver/oracledbreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax @crobert-1 @atoulme -receiver/osqueryreceiver/ @open-telemetry/collector-contrib-approvers @codeboten @nslaughter @smithclay -receiver/otelarrowreceiver/ @open-telemetry/collector-contrib-approvers @jmacd @moh-osman3 -receiver/otlpjsonfilereceiver/ @open-telemetry/collector-contrib-approvers @djaglowski @atoulme -receiver/podmanreceiver/ @open-telemetry/collector-contrib-approvers @rogercoll -receiver/postgresqlreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski -receiver/prometheusreceiver/ @open-telemetry/collector-contrib-approvers @Aneurysm9 @dashpole -receiver/pulsarreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax @dao-jun -receiver/purefareceiver/ @open-telemetry/collector-contrib-approvers @jpkrohling @dgoscn @chrroberts-pure -receiver/purefbreceiver/ @open-telemetry/collector-contrib-approvers @jpkrohling @dgoscn @chrroberts-pure -receiver/rabbitmqreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski @cpheps -receiver/receivercreator/ @open-telemetry/collector-contrib-approvers @rmfitzpatrick -receiver/redisreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax @hughesjj -receiver/riakreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski @armstrmi -receiver/saphanareceiver/ @open-telemetry/collector-contrib-approvers @dehaansa -receiver/sapmreceiver/ @open-telemetry/collector-contrib-approvers @atoulme -receiver/signalfxreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax -receiver/simpleprometheusreceiver/ @open-telemetry/collector-contrib-approvers @fatsheep9146 -receiver/skywalkingreceiver/ @open-telemetry/collector-contrib-approvers @JaredTan95 -receiver/snmpreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski @StefanKurek @tamir-michaeli -receiver/snowflakereceiver/ @open-telemetry/collector-contrib-approvers @dmitryax @shalper2 -receiver/solacereceiver/ @open-telemetry/collector-contrib-approvers @djaglowski @mcardy -receiver/splunkenterprisereceiver/ @open-telemetry/collector-contrib-approvers @shalper2 @MovieStoreGuy @greatestusername -receiver/splunkhecreceiver/ @open-telemetry/collector-contrib-approvers @atoulme -receiver/sqlqueryreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax @crobert-1 -receiver/sqlserverreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski @StefanKurek -receiver/sshcheckreceiver/ @open-telemetry/collector-contrib-approvers @nslaughter @codeboten -receiver/statsdreceiver/ @open-telemetry/collector-contrib-approvers @jmacd @dmitryax -receiver/syslogreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski @andrzej-stencel -receiver/tcplogreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski -receiver/udplogreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski -receiver/vcenterreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski @schmikei @StefanKurek -receiver/wavefrontreceiver/ @open-telemetry/collector-contrib-approvers @samiura -receiver/webhookeventreceiver/ @open-telemetry/collector-contrib-approvers @atoulme @shalper2 -receiver/windowseventlogreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski @armstrmi @pjanotti -receiver/windowsperfcountersreceiver/ @open-telemetry/collector-contrib-approvers @dashpole @alxbl -receiver/zipkinreceiver/ @open-telemetry/collector-contrib-approvers @MovieStoreGuy @andrzej-stencel @crobert-1 -receiver/zookeeperreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski +receiver/activedirectorydsreceiver/ @open-telemetry/collector-contrib-approvers @pjanotti +receiver/aerospikereceiver/ @open-telemetry/collector-contrib-approvers @antonblock +receiver/apachereceiver/ @open-telemetry/collector-contrib-approvers @djaglowski +receiver/apachesparkreceiver/ @open-telemetry/collector-contrib-approvers @Caleb-Hurshman @mrsillydog +receiver/awscloudwatchmetricsreceiver/ @open-telemetry/collector-contrib-approvers +receiver/awscloudwatchreceiver/ @open-telemetry/collector-contrib-approvers @schmikei +receiver/awscontainerinsightreceiver/ @open-telemetry/collector-contrib-approvers @Aneurysm9 @pxaws +receiver/awsecscontainermetricsreceiver/ @open-telemetry/collector-contrib-approvers @Aneurysm9 +receiver/awsfirehosereceiver/ @open-telemetry/collector-contrib-approvers @Aneurysm9 +receiver/awss3receiver/ @open-telemetry/collector-contrib-approvers @atoulme @adcharre +receiver/awsxrayreceiver/ @open-telemetry/collector-contrib-approvers @wangzlei @srprash +receiver/azureblobreceiver/ @open-telemetry/collector-contrib-approvers @eedorenko @mx-psi +receiver/azureeventhubreceiver/ @open-telemetry/collector-contrib-approvers @atoulme @cparkins +receiver/azuremonitorreceiver/ @open-telemetry/collector-contrib-approvers @nslaughter +receiver/bigipreceiver/ @open-telemetry/collector-contrib-approvers @StefanKurek +receiver/carbonreceiver/ @open-telemetry/collector-contrib-approvers @aboguszewski-sumo +receiver/chronyreceiver/ @open-telemetry/collector-contrib-approvers @MovieStoreGuy @jamesmoessis +receiver/cloudflarereceiver/ @open-telemetry/collector-contrib-approvers @dehaansa +receiver/cloudfoundryreceiver/ @open-telemetry/collector-contrib-approvers @crobert-1 +receiver/collectdreceiver/ @open-telemetry/collector-contrib-approvers @atoulme +receiver/couchdbreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski +receiver/datadogreceiver/ @open-telemetry/collector-contrib-approvers @boostchicken @gouthamve @MovieStoreGuy +receiver/dockerstatsreceiver/ @open-telemetry/collector-contrib-approvers @jamesmoessis +receiver/elasticsearchreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski +receiver/expvarreceiver/ @open-telemetry/collector-contrib-approvers @jamesmoessis @MovieStoreGuy +receiver/filelogreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski +receiver/filestatsreceiver/ @open-telemetry/collector-contrib-approvers @atoulme +receiver/flinkmetricsreceiver/ @open-telemetry/collector-contrib-approvers @JonathanWamsley +receiver/fluentforwardreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax +receiver/githubreceiver/ @open-telemetry/collector-contrib-approvers @adrielp @andrzej-stencel @crobert-1 @TylerHelmuth +receiver/googlecloudmonitoringreceiver/ @open-telemetry/collector-contrib-approvers @dashpole @TylerHelmuth @abhishek-at-cloudwerx +receiver/googlecloudpubsubreceiver/ @open-telemetry/collector-contrib-approvers @alexvanboxel +receiver/googlecloudspannerreceiver/ @open-telemetry/collector-contrib-approvers @dashpole @dsimil @KiranmayiB @harishbohara11 +receiver/haproxyreceiver/ @open-telemetry/collector-contrib-approvers @atoulme @MovieStoreGuy +receiver/hostmetricsreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax @braydonk +receiver/httpcheckreceiver/ @open-telemetry/collector-contrib-approvers @codeboten +receiver/huaweicloudcesreceiver/ @open-telemetry/collector-contrib-approvers @heitorganzeli @narcis96 @mwear +receiver/iisreceiver/ @open-telemetry/collector-contrib-approvers @Mrod1598 @pjanotti +receiver/influxdbreceiver/ @open-telemetry/collector-contrib-approvers @jacobmarble +receiver/jaegerreceiver/ @open-telemetry/collector-contrib-approvers @yurishkuro +receiver/journaldreceiver/ @open-telemetry/collector-contrib-approvers @sumo-drosiek @djaglowski +receiver/k8sclusterreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax @TylerHelmuth @povilasv @ChrsMark +receiver/k8seventsreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax @TylerHelmuth @ChrsMark +receiver/k8sobjectsreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax @hvaghani221 @TylerHelmuth @ChrsMark +receiver/kafkametricsreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax +receiver/kafkareceiver/ @open-telemetry/collector-contrib-approvers @pavolloffay @MovieStoreGuy +receiver/kubeletstatsreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax @TylerHelmuth @ChrsMark +receiver/libhoneyreceiver/ @open-telemetry/collector-contrib-approvers @TylerHelmuth +receiver/lokireceiver/ @open-telemetry/collector-contrib-approvers @mar4uk +receiver/memcachedreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski +receiver/mongodbatlasreceiver/ @open-telemetry/collector-contrib-approvers @schmikei +receiver/mongodbreceiver/ @open-telemetry/collector-contrib-approvers @schmikei +receiver/mysqlreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski +receiver/namedpipereceiver/ @open-telemetry/collector-contrib-approvers @sinkingpoint @djaglowski +receiver/netflowreceiver/ @open-telemetry/collector-contrib-approvers @evan-bradley @dlopes7 +receiver/nginxreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski +receiver/nsxtreceiver/ @open-telemetry/collector-contrib-approvers @dashpole @schmikei +receiver/ntpreceiver/ @open-telemetry/collector-contrib-approvers @atoulme +receiver/opencensusreceiver/ @open-telemetry/collector-contrib-approvers @open-telemetry/collector-approvers +receiver/oracledbreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax @crobert-1 @atoulme +receiver/osqueryreceiver/ @open-telemetry/collector-contrib-approvers @nslaughter @smithclay +receiver/otelarrowreceiver/ @open-telemetry/collector-contrib-approvers @jmacd @moh-osman3 +receiver/otlpjsonfilereceiver/ @open-telemetry/collector-contrib-approvers @djaglowski @atoulme +receiver/podmanreceiver/ @open-telemetry/collector-contrib-approvers @rogercoll +receiver/postgresqlreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski +receiver/prometheusreceiver/ @open-telemetry/collector-contrib-approvers @Aneurysm9 @dashpole +receiver/prometheusremotewritereceiver/ @open-telemetry/collector-contrib-approvers @dashpole @ArthurSens +receiver/pulsarreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax @dao-jun +receiver/purefareceiver/ @open-telemetry/collector-contrib-approvers @jpkrohling @dgoscn @chrroberts-pure +receiver/purefbreceiver/ @open-telemetry/collector-contrib-approvers @jpkrohling @dgoscn @chrroberts-pure +receiver/rabbitmqreceiver/ @open-telemetry/collector-contrib-approvers @cpheps +receiver/receivercreator/ @open-telemetry/collector-contrib-approvers @dmitryax +receiver/redisreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax @hughesjj +receiver/riakreceiver/ @open-telemetry/collector-contrib-approvers @armstrmi +receiver/saphanareceiver/ @open-telemetry/collector-contrib-approvers @dehaansa +receiver/sapmreceiver/ @open-telemetry/collector-contrib-approvers @atoulme +receiver/signalfxreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax +receiver/simpleprometheusreceiver/ @open-telemetry/collector-contrib-approvers @fatsheep9146 +receiver/skywalkingreceiver/ @open-telemetry/collector-contrib-approvers @JaredTan95 +receiver/snmpreceiver/ @open-telemetry/collector-contrib-approvers @StefanKurek @tamir-michaeli +receiver/snowflakereceiver/ @open-telemetry/collector-contrib-approvers @dmitryax @shalper2 +receiver/solacereceiver/ @open-telemetry/collector-contrib-approvers @mcardy +receiver/splunkenterprisereceiver/ @open-telemetry/collector-contrib-approvers @shalper2 @MovieStoreGuy @greatestusername +receiver/splunkhecreceiver/ @open-telemetry/collector-contrib-approvers @atoulme +receiver/sqlqueryreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax @crobert-1 +receiver/sqlserverreceiver/ @open-telemetry/collector-contrib-approvers @StefanKurek +receiver/sshcheckreceiver/ @open-telemetry/collector-contrib-approvers @nslaughter +receiver/statsdreceiver/ @open-telemetry/collector-contrib-approvers @jmacd @dmitryax +receiver/syslogreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski @andrzej-stencel +receiver/systemdreceiver/ @open-telemetry/collector-contrib-approvers @Hemansh31 @atoulme +receiver/tcplogreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski +receiver/tlscheckreceiver/ @open-telemetry/collector-contrib-approvers @atoulme @michael-burt +receiver/udplogreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski +receiver/vcenterreceiver/ @open-telemetry/collector-contrib-approvers @schmikei @StefanKurek +receiver/wavefrontreceiver/ @open-telemetry/collector-contrib-approvers @samiura +receiver/webhookeventreceiver/ @open-telemetry/collector-contrib-approvers @atoulme @shalper2 +receiver/windowseventlogreceiver/ @open-telemetry/collector-contrib-approvers @armstrmi @pjanotti +receiver/windowsperfcountersreceiver/ @open-telemetry/collector-contrib-approvers @dashpole @alxbl @pjanotti +receiver/zipkinreceiver/ @open-telemetry/collector-contrib-approvers @MovieStoreGuy @andrzej-stencel @crobert-1 +receiver/zookeeperreceiver/ @open-telemetry/collector-contrib-approvers @djaglowski -testbed/ @open-telemetry/collector-contrib-approvers @open-telemetry/collector-approvers -testbed/mockdatasenders/mockdatadogagentexporter/ @open-telemetry/collector-contrib-approvers @boostchicken +testbed/ @open-telemetry/collector-contrib-approvers @open-telemetry/collector-approvers +testbed/mockdatasenders/mockdatadogagentexporter/ @open-telemetry/collector-contrib-approvers @boostchicken ##################################################### # @@ -290,8 +307,12 @@ testbed/mockdatasenders/mockdatadogagentexporter/ @open-telemetry/collect ##################################################### reports/distributions/core.yaml @open-telemetry/collector-contrib-approvers reports/distributions/contrib.yaml @open-telemetry/collector-contrib-approvers +reports/distributions/k8s.yaml @open-telemetry/collector-contrib-approvers ## UNMAINTAINED components -exporter/skywalkingexporter/ @open-telemetry/collector-contrib-approvers +exporter/kineticaexporter/ @open-telemetry/collector-contrib-approvers +exporter/opensearchexporter/ @open-telemetry/collector-contrib-approvers +extension/observer/ecstaskobserver/ @open-telemetry/collector-contrib-approvers +receiver/jmxreceiver/ @open-telemetry/collector-contrib-approvers diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index a84793b9912a..ea469c572bcb 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -18,12 +18,12 @@ body: # NOTE: The list below is autogenerated using `make generate-gh-issue-templates` # Do not manually edit it. # Start Collector components list - - cmd/configschema - cmd/githubgen - cmd/opampsupervisor - cmd/otelcontribcol - cmd/oteltestbedcol - cmd/telemetrygen + - confmap/provider/aesprovider - confmap/provider/s3provider - confmap/provider/secretsmanagerprovider - connector/count @@ -31,10 +31,13 @@ body: - connector/exceptions - connector/failover - connector/grafanacloud + - connector/otlpjson - connector/roundrobin - connector/routing - connector/servicegraph + - connector/signaltometrics - connector/spanmetrics + - connector/sum - examples/demo - exporter/alertmanager - exporter/alibabacloudlogservice @@ -51,6 +54,7 @@ body: - exporter/coralogix - exporter/datadog - exporter/dataset + - exporter/doris - exporter/elasticsearch - exporter/file - exporter/googlecloud @@ -58,7 +62,6 @@ body: - exporter/googlemanagedprometheus - exporter/honeycombmarker - exporter/influxdb - - exporter/instana - exporter/kafka - exporter/kinetica - exporter/loadbalancing @@ -76,7 +79,6 @@ body: - exporter/sapm - exporter/sentry - exporter/signalfx - - exporter/skywalking - exporter/splunkhec - exporter/sumologic - exporter/syslog @@ -87,6 +89,7 @@ body: - extension/awsproxy - extension/basicauth - extension/bearertokenauth + - extension/cgroupruntime - extension/encoding - extension/encoding/avrologencoding - extension/encoding/jaegerencoding @@ -102,6 +105,7 @@ body: - extension/jaegerremotesampling - extension/oauth2clientauth - extension/observer + - extension/observer/cfgardenobserver - extension/observer/dockerobserver - extension/observer/ecsobserver - extension/observer/ecstaskobserver @@ -117,6 +121,7 @@ body: - extension/storage - extension/storage/dbstorage - extension/storage/filestorage + - extension/storage/redisstorage - extension/sumologic - internal/aws - internal/collectd @@ -124,27 +129,35 @@ body: - internal/docker - internal/exp/metrics - internal/filter + - internal/grpcutil - internal/k8sconfig - internal/k8stest - internal/kafka - internal/kubelet - internal/metadataproviders + - internal/otelarrow - internal/pdatautil + - internal/rabbitmq - internal/sharedcomponent - internal/splunk - internal/sqlquery - internal/tools - pkg/batchperresourceattr - pkg/batchpersignal + - pkg/datadog - pkg/experimentalmetricmetadata - pkg/golden + - pkg/kafka/topic - pkg/ottl - pkg/pdatatest - pkg/pdatautil - pkg/resourcetotelemetry - pkg/sampling - pkg/stanza + - pkg/stanza/fileconsumer + - pkg/status - pkg/translator/azure + - pkg/translator/azurelogs - pkg/translator/jaeger - pkg/translator/loki - pkg/translator/opencensus @@ -155,6 +168,7 @@ body: - pkg/translator/zipkin - pkg/winperfcounters - processor/attributes + - processor/coralogix - processor/cumulativetodelta - processor/deltatocumulative - processor/deltatorate @@ -164,6 +178,7 @@ body: - processor/groupbytrace - processor/interval - processor/k8sattributes + - processor/logdedup - processor/logstransform - processor/metricsgeneration - processor/metricstransform @@ -172,20 +187,6 @@ body: - processor/remotetap - processor/resource - processor/resourcedetection - - processor/resourcedetection/internal/aws/ec2 - - processor/resourcedetection/internal/aws/ecs - - processor/resourcedetection/internal/aws/eks - - processor/resourcedetection/internal/aws/elasticbeanstalk - - processor/resourcedetection/internal/aws/lambda - - processor/resourcedetection/internal/azure - - processor/resourcedetection/internal/azure/aks - - processor/resourcedetection/internal/consul - - processor/resourcedetection/internal/docker - - processor/resourcedetection/internal/gcp - - processor/resourcedetection/internal/heroku - - processor/resourcedetection/internal/k8snode - - processor/resourcedetection/internal/openshift - - processor/resourcedetection/internal/system - processor/routing - processor/schema - processor/span @@ -221,12 +222,14 @@ body: - receiver/filestats - receiver/flinkmetrics - receiver/fluentforward - - receiver/gitprovider + - receiver/github + - receiver/googlecloudmonitoring - receiver/googlecloudpubsub - receiver/googlecloudspanner - receiver/haproxy - receiver/hostmetrics - receiver/httpcheck + - receiver/huaweicloudces - receiver/iis - receiver/influxdb - receiver/jaeger @@ -238,14 +241,17 @@ body: - receiver/kafka - receiver/kafkametrics - receiver/kubeletstats + - receiver/libhoney - receiver/loki - receiver/memcached - receiver/mongodb - receiver/mongodbatlas - receiver/mysql - receiver/namedpipe + - receiver/netflow - receiver/nginx - receiver/nsxt + - receiver/ntp - receiver/opencensus - receiver/oracledb - receiver/osquery @@ -254,6 +260,7 @@ body: - receiver/podman - receiver/postgresql - receiver/prometheus + - receiver/prometheusremotewrite - receiver/pulsar - receiver/purefa - receiver/purefb @@ -276,7 +283,9 @@ body: - receiver/sshcheck - receiver/statsd - receiver/syslog + - receiver/systemd - receiver/tcplog + - receiver/tlscheck - receiver/udplog - receiver/vcenter - receiver/wavefront diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml index 12789d412fe8..99f72f1c13b1 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -12,12 +12,12 @@ body: # NOTE: The list below is autogenerated using `make generate-gh-issue-templates` # Do not manually edit it. # Start Collector components list - - cmd/configschema - cmd/githubgen - cmd/opampsupervisor - cmd/otelcontribcol - cmd/oteltestbedcol - cmd/telemetrygen + - confmap/provider/aesprovider - confmap/provider/s3provider - confmap/provider/secretsmanagerprovider - connector/count @@ -25,10 +25,13 @@ body: - connector/exceptions - connector/failover - connector/grafanacloud + - connector/otlpjson - connector/roundrobin - connector/routing - connector/servicegraph + - connector/signaltometrics - connector/spanmetrics + - connector/sum - examples/demo - exporter/alertmanager - exporter/alibabacloudlogservice @@ -45,6 +48,7 @@ body: - exporter/coralogix - exporter/datadog - exporter/dataset + - exporter/doris - exporter/elasticsearch - exporter/file - exporter/googlecloud @@ -52,7 +56,6 @@ body: - exporter/googlemanagedprometheus - exporter/honeycombmarker - exporter/influxdb - - exporter/instana - exporter/kafka - exporter/kinetica - exporter/loadbalancing @@ -70,7 +73,6 @@ body: - exporter/sapm - exporter/sentry - exporter/signalfx - - exporter/skywalking - exporter/splunkhec - exporter/sumologic - exporter/syslog @@ -81,6 +83,7 @@ body: - extension/awsproxy - extension/basicauth - extension/bearertokenauth + - extension/cgroupruntime - extension/encoding - extension/encoding/avrologencoding - extension/encoding/jaegerencoding @@ -96,6 +99,7 @@ body: - extension/jaegerremotesampling - extension/oauth2clientauth - extension/observer + - extension/observer/cfgardenobserver - extension/observer/dockerobserver - extension/observer/ecsobserver - extension/observer/ecstaskobserver @@ -111,6 +115,7 @@ body: - extension/storage - extension/storage/dbstorage - extension/storage/filestorage + - extension/storage/redisstorage - extension/sumologic - internal/aws - internal/collectd @@ -118,27 +123,35 @@ body: - internal/docker - internal/exp/metrics - internal/filter + - internal/grpcutil - internal/k8sconfig - internal/k8stest - internal/kafka - internal/kubelet - internal/metadataproviders + - internal/otelarrow - internal/pdatautil + - internal/rabbitmq - internal/sharedcomponent - internal/splunk - internal/sqlquery - internal/tools - pkg/batchperresourceattr - pkg/batchpersignal + - pkg/datadog - pkg/experimentalmetricmetadata - pkg/golden + - pkg/kafka/topic - pkg/ottl - pkg/pdatatest - pkg/pdatautil - pkg/resourcetotelemetry - pkg/sampling - pkg/stanza + - pkg/stanza/fileconsumer + - pkg/status - pkg/translator/azure + - pkg/translator/azurelogs - pkg/translator/jaeger - pkg/translator/loki - pkg/translator/opencensus @@ -149,6 +162,7 @@ body: - pkg/translator/zipkin - pkg/winperfcounters - processor/attributes + - processor/coralogix - processor/cumulativetodelta - processor/deltatocumulative - processor/deltatorate @@ -158,6 +172,7 @@ body: - processor/groupbytrace - processor/interval - processor/k8sattributes + - processor/logdedup - processor/logstransform - processor/metricsgeneration - processor/metricstransform @@ -166,20 +181,6 @@ body: - processor/remotetap - processor/resource - processor/resourcedetection - - processor/resourcedetection/internal/aws/ec2 - - processor/resourcedetection/internal/aws/ecs - - processor/resourcedetection/internal/aws/eks - - processor/resourcedetection/internal/aws/elasticbeanstalk - - processor/resourcedetection/internal/aws/lambda - - processor/resourcedetection/internal/azure - - processor/resourcedetection/internal/azure/aks - - processor/resourcedetection/internal/consul - - processor/resourcedetection/internal/docker - - processor/resourcedetection/internal/gcp - - processor/resourcedetection/internal/heroku - - processor/resourcedetection/internal/k8snode - - processor/resourcedetection/internal/openshift - - processor/resourcedetection/internal/system - processor/routing - processor/schema - processor/span @@ -215,12 +216,14 @@ body: - receiver/filestats - receiver/flinkmetrics - receiver/fluentforward - - receiver/gitprovider + - receiver/github + - receiver/googlecloudmonitoring - receiver/googlecloudpubsub - receiver/googlecloudspanner - receiver/haproxy - receiver/hostmetrics - receiver/httpcheck + - receiver/huaweicloudces - receiver/iis - receiver/influxdb - receiver/jaeger @@ -232,14 +235,17 @@ body: - receiver/kafka - receiver/kafkametrics - receiver/kubeletstats + - receiver/libhoney - receiver/loki - receiver/memcached - receiver/mongodb - receiver/mongodbatlas - receiver/mysql - receiver/namedpipe + - receiver/netflow - receiver/nginx - receiver/nsxt + - receiver/ntp - receiver/opencensus - receiver/oracledb - receiver/osquery @@ -248,6 +254,7 @@ body: - receiver/podman - receiver/postgresql - receiver/prometheus + - receiver/prometheusremotewrite - receiver/pulsar - receiver/purefa - receiver/purefb @@ -270,7 +277,9 @@ body: - receiver/sshcheck - receiver/statsd - receiver/syslog + - receiver/systemd - receiver/tcplog + - receiver/tlscheck - receiver/udplog - receiver/vcenter - receiver/wavefront diff --git a/.github/ISSUE_TEMPLATE/new_component.yaml b/.github/ISSUE_TEMPLATE/new_component.yaml index 982218d463c3..fd410e5e5481 100644 --- a/.github/ISSUE_TEMPLATE/new_component.yaml +++ b/.github/ISSUE_TEMPLATE/new_component.yaml @@ -21,27 +21,18 @@ body: description: Any combination of traces, metrics and/or logs is valid here. validations: required: true - - type: checkboxes - attributes: - label: Is this a vendor-specific component? - description: A vendor-specific component directly interfaces with a vendor-specific API and is expected to be maintained by a representative of the same vendor. - options: - - label: This is a vendor-specific component - - label: If this is a vendor-specific component, I am proposing to contribute and support it as a representative of the vendor. - type: input attributes: label: Code Owner(s) description: A code owner is responsible for supporting the component, including triaging issues, reviewing PRs, and submitting bug fixes. Please list one or more members or aspiring members of the OpenTelemetry project who will serve as code owners. - For vendor-specific components, the code owner is required and must be a representative of the vendor. - For non-vendor components, having a code owner is strongly recommended. However, you may use the issue to try to find a code owner for your component. + Having a code owner is strongly recommended. However, you may use the issue to try to find a code owner for your component. - type: input attributes: label: Sponsor (optional) description: "A sponsor is an approver who will be in charge of being the official reviewer of the code. - For vendor-specific components, it's good to have a volunteer sponsor. If you can't find one, we'll assign one in a round-robin fashion. - For non-vendor components, having a sponsor means that your use-case has been validated. - If there are no sponsors yet for the component, it's fine: use the issue as a means to try to find a sponsor for your component." + Having a sponsor means that your use-case has been validated. If there are no sponsors yet for the component, + it's fine: use the issue as a means to try to find a sponsor for your component. If you are unable to find a sponsor, the component can still live in your own source repository and can be included in Collector distributions using the Collector builder." - type: textarea attributes: label: Additional context diff --git a/.github/ISSUE_TEMPLATE/other.yaml b/.github/ISSUE_TEMPLATE/other.yaml index 50939096177d..c65b1b3fa089 100644 --- a/.github/ISSUE_TEMPLATE/other.yaml +++ b/.github/ISSUE_TEMPLATE/other.yaml @@ -12,12 +12,12 @@ body: # NOTE: The list below is autogenerated using `make generate-gh-issue-templates` # Do not manually edit it. # Start Collector components list - - cmd/configschema - cmd/githubgen - cmd/opampsupervisor - cmd/otelcontribcol - cmd/oteltestbedcol - cmd/telemetrygen + - confmap/provider/aesprovider - confmap/provider/s3provider - confmap/provider/secretsmanagerprovider - connector/count @@ -25,10 +25,13 @@ body: - connector/exceptions - connector/failover - connector/grafanacloud + - connector/otlpjson - connector/roundrobin - connector/routing - connector/servicegraph + - connector/signaltometrics - connector/spanmetrics + - connector/sum - examples/demo - exporter/alertmanager - exporter/alibabacloudlogservice @@ -45,6 +48,7 @@ body: - exporter/coralogix - exporter/datadog - exporter/dataset + - exporter/doris - exporter/elasticsearch - exporter/file - exporter/googlecloud @@ -52,7 +56,6 @@ body: - exporter/googlemanagedprometheus - exporter/honeycombmarker - exporter/influxdb - - exporter/instana - exporter/kafka - exporter/kinetica - exporter/loadbalancing @@ -70,7 +73,6 @@ body: - exporter/sapm - exporter/sentry - exporter/signalfx - - exporter/skywalking - exporter/splunkhec - exporter/sumologic - exporter/syslog @@ -81,6 +83,7 @@ body: - extension/awsproxy - extension/basicauth - extension/bearertokenauth + - extension/cgroupruntime - extension/encoding - extension/encoding/avrologencoding - extension/encoding/jaegerencoding @@ -96,6 +99,7 @@ body: - extension/jaegerremotesampling - extension/oauth2clientauth - extension/observer + - extension/observer/cfgardenobserver - extension/observer/dockerobserver - extension/observer/ecsobserver - extension/observer/ecstaskobserver @@ -111,6 +115,7 @@ body: - extension/storage - extension/storage/dbstorage - extension/storage/filestorage + - extension/storage/redisstorage - extension/sumologic - internal/aws - internal/collectd @@ -118,27 +123,35 @@ body: - internal/docker - internal/exp/metrics - internal/filter + - internal/grpcutil - internal/k8sconfig - internal/k8stest - internal/kafka - internal/kubelet - internal/metadataproviders + - internal/otelarrow - internal/pdatautil + - internal/rabbitmq - internal/sharedcomponent - internal/splunk - internal/sqlquery - internal/tools - pkg/batchperresourceattr - pkg/batchpersignal + - pkg/datadog - pkg/experimentalmetricmetadata - pkg/golden + - pkg/kafka/topic - pkg/ottl - pkg/pdatatest - pkg/pdatautil - pkg/resourcetotelemetry - pkg/sampling - pkg/stanza + - pkg/stanza/fileconsumer + - pkg/status - pkg/translator/azure + - pkg/translator/azurelogs - pkg/translator/jaeger - pkg/translator/loki - pkg/translator/opencensus @@ -149,6 +162,7 @@ body: - pkg/translator/zipkin - pkg/winperfcounters - processor/attributes + - processor/coralogix - processor/cumulativetodelta - processor/deltatocumulative - processor/deltatorate @@ -158,6 +172,7 @@ body: - processor/groupbytrace - processor/interval - processor/k8sattributes + - processor/logdedup - processor/logstransform - processor/metricsgeneration - processor/metricstransform @@ -166,20 +181,6 @@ body: - processor/remotetap - processor/resource - processor/resourcedetection - - processor/resourcedetection/internal/aws/ec2 - - processor/resourcedetection/internal/aws/ecs - - processor/resourcedetection/internal/aws/eks - - processor/resourcedetection/internal/aws/elasticbeanstalk - - processor/resourcedetection/internal/aws/lambda - - processor/resourcedetection/internal/azure - - processor/resourcedetection/internal/azure/aks - - processor/resourcedetection/internal/consul - - processor/resourcedetection/internal/docker - - processor/resourcedetection/internal/gcp - - processor/resourcedetection/internal/heroku - - processor/resourcedetection/internal/k8snode - - processor/resourcedetection/internal/openshift - - processor/resourcedetection/internal/system - processor/routing - processor/schema - processor/span @@ -215,12 +216,14 @@ body: - receiver/filestats - receiver/flinkmetrics - receiver/fluentforward - - receiver/gitprovider + - receiver/github + - receiver/googlecloudmonitoring - receiver/googlecloudpubsub - receiver/googlecloudspanner - receiver/haproxy - receiver/hostmetrics - receiver/httpcheck + - receiver/huaweicloudces - receiver/iis - receiver/influxdb - receiver/jaeger @@ -232,14 +235,17 @@ body: - receiver/kafka - receiver/kafkametrics - receiver/kubeletstats + - receiver/libhoney - receiver/loki - receiver/memcached - receiver/mongodb - receiver/mongodbatlas - receiver/mysql - receiver/namedpipe + - receiver/netflow - receiver/nginx - receiver/nsxt + - receiver/ntp - receiver/opencensus - receiver/oracledb - receiver/osquery @@ -248,6 +254,7 @@ body: - receiver/podman - receiver/postgresql - receiver/prometheus + - receiver/prometheusremotewrite - receiver/pulsar - receiver/purefa - receiver/purefb @@ -270,7 +277,9 @@ body: - receiver/sshcheck - receiver/statsd - receiver/syslog + - receiver/systemd - receiver/tcplog + - receiver/tlscheck - receiver/udplog - receiver/vcenter - receiver/wavefront diff --git a/.github/ISSUE_TEMPLATE/unmaintained.yaml b/.github/ISSUE_TEMPLATE/unmaintained.yaml index 7252c63b3fee..a6402ed0e246 100644 --- a/.github/ISSUE_TEMPLATE/unmaintained.yaml +++ b/.github/ISSUE_TEMPLATE/unmaintained.yaml @@ -17,12 +17,12 @@ body: # NOTE: The list below is autogenerated using `make generate-gh-issue-templates` # Do not manually edit it. # Start Collector components list - - cmd/configschema - cmd/githubgen - cmd/opampsupervisor - cmd/otelcontribcol - cmd/oteltestbedcol - cmd/telemetrygen + - confmap/provider/aesprovider - confmap/provider/s3provider - confmap/provider/secretsmanagerprovider - connector/count @@ -30,10 +30,13 @@ body: - connector/exceptions - connector/failover - connector/grafanacloud + - connector/otlpjson - connector/roundrobin - connector/routing - connector/servicegraph + - connector/signaltometrics - connector/spanmetrics + - connector/sum - examples/demo - exporter/alertmanager - exporter/alibabacloudlogservice @@ -50,6 +53,7 @@ body: - exporter/coralogix - exporter/datadog - exporter/dataset + - exporter/doris - exporter/elasticsearch - exporter/file - exporter/googlecloud @@ -57,7 +61,6 @@ body: - exporter/googlemanagedprometheus - exporter/honeycombmarker - exporter/influxdb - - exporter/instana - exporter/kafka - exporter/kinetica - exporter/loadbalancing @@ -75,7 +78,6 @@ body: - exporter/sapm - exporter/sentry - exporter/signalfx - - exporter/skywalking - exporter/splunkhec - exporter/sumologic - exporter/syslog @@ -86,6 +88,7 @@ body: - extension/awsproxy - extension/basicauth - extension/bearertokenauth + - extension/cgroupruntime - extension/encoding - extension/encoding/avrologencoding - extension/encoding/jaegerencoding @@ -101,6 +104,7 @@ body: - extension/jaegerremotesampling - extension/oauth2clientauth - extension/observer + - extension/observer/cfgardenobserver - extension/observer/dockerobserver - extension/observer/ecsobserver - extension/observer/ecstaskobserver @@ -116,6 +120,7 @@ body: - extension/storage - extension/storage/dbstorage - extension/storage/filestorage + - extension/storage/redisstorage - extension/sumologic - internal/aws - internal/collectd @@ -123,27 +128,35 @@ body: - internal/docker - internal/exp/metrics - internal/filter + - internal/grpcutil - internal/k8sconfig - internal/k8stest - internal/kafka - internal/kubelet - internal/metadataproviders + - internal/otelarrow - internal/pdatautil + - internal/rabbitmq - internal/sharedcomponent - internal/splunk - internal/sqlquery - internal/tools - pkg/batchperresourceattr - pkg/batchpersignal + - pkg/datadog - pkg/experimentalmetricmetadata - pkg/golden + - pkg/kafka/topic - pkg/ottl - pkg/pdatatest - pkg/pdatautil - pkg/resourcetotelemetry - pkg/sampling - pkg/stanza + - pkg/stanza/fileconsumer + - pkg/status - pkg/translator/azure + - pkg/translator/azurelogs - pkg/translator/jaeger - pkg/translator/loki - pkg/translator/opencensus @@ -154,6 +167,7 @@ body: - pkg/translator/zipkin - pkg/winperfcounters - processor/attributes + - processor/coralogix - processor/cumulativetodelta - processor/deltatocumulative - processor/deltatorate @@ -163,6 +177,7 @@ body: - processor/groupbytrace - processor/interval - processor/k8sattributes + - processor/logdedup - processor/logstransform - processor/metricsgeneration - processor/metricstransform @@ -171,20 +186,6 @@ body: - processor/remotetap - processor/resource - processor/resourcedetection - - processor/resourcedetection/internal/aws/ec2 - - processor/resourcedetection/internal/aws/ecs - - processor/resourcedetection/internal/aws/eks - - processor/resourcedetection/internal/aws/elasticbeanstalk - - processor/resourcedetection/internal/aws/lambda - - processor/resourcedetection/internal/azure - - processor/resourcedetection/internal/azure/aks - - processor/resourcedetection/internal/consul - - processor/resourcedetection/internal/docker - - processor/resourcedetection/internal/gcp - - processor/resourcedetection/internal/heroku - - processor/resourcedetection/internal/k8snode - - processor/resourcedetection/internal/openshift - - processor/resourcedetection/internal/system - processor/routing - processor/schema - processor/span @@ -220,12 +221,14 @@ body: - receiver/filestats - receiver/flinkmetrics - receiver/fluentforward - - receiver/gitprovider + - receiver/github + - receiver/googlecloudmonitoring - receiver/googlecloudpubsub - receiver/googlecloudspanner - receiver/haproxy - receiver/hostmetrics - receiver/httpcheck + - receiver/huaweicloudces - receiver/iis - receiver/influxdb - receiver/jaeger @@ -237,14 +240,17 @@ body: - receiver/kafka - receiver/kafkametrics - receiver/kubeletstats + - receiver/libhoney - receiver/loki - receiver/memcached - receiver/mongodb - receiver/mongodbatlas - receiver/mysql - receiver/namedpipe + - receiver/netflow - receiver/nginx - receiver/nsxt + - receiver/ntp - receiver/opencensus - receiver/oracledb - receiver/osquery @@ -253,6 +259,7 @@ body: - receiver/podman - receiver/postgresql - receiver/prometheus + - receiver/prometheusremotewrite - receiver/pulsar - receiver/purefa - receiver/purefb @@ -275,7 +282,9 @@ body: - receiver/sshcheck - receiver/statsd - receiver/syslog + - receiver/systemd - receiver/tcplog + - receiver/tlscheck - receiver/udplog - receiver/vcenter - receiver/wavefront diff --git a/.github/auto_assign.yml b/.github/auto_assign.yml index 2b5c2f30e72e..e178fdd07cd0 100644 --- a/.github/auto_assign.yml +++ b/.github/auto_assign.yml @@ -12,9 +12,10 @@ assigneeGroups: approvers_maintainers: # Approvers - atoulme - - bryan-aguilar - - crobert-1 + - ChrsMark + # - crobert-1 on leave - dashpole + - mwear - songy23 - fatsheep9146 # Maintainers diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index ba32818178e3..ac7757886027 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,9 +1,15 @@ -**Description:** +#### Description -**Link to tracking Issue:** + +#### Link to tracking issue +Fixes -**Testing:** + +#### Testing -**Documentation:** \ No newline at end of file + +#### Documentation + + diff --git a/.github/workflows/add-codeowners-to-pr.yml b/.github/workflows/add-codeowners-to-pr.yml index 12d3fced3674..4c63c8eb0029 100644 --- a/.github/workflows/add-codeowners-to-pr.yml +++ b/.github/workflows/add-codeowners-to-pr.yml @@ -7,7 +7,7 @@ on: jobs: add-owners-to-pr: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 if: ${{ github.actor != 'dependabot[bot]' && github.repository_owner == 'open-telemetry' }} steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/add-labels.yml b/.github/workflows/add-labels.yml index f9742654b507..ec5f20667a32 100644 --- a/.github/workflows/add-labels.yml +++ b/.github/workflows/add-labels.yml @@ -7,7 +7,7 @@ jobs: add-labels: if: ${{ !github.event.issue.pull_request && startsWith(github.event.comment.body, '/label') && github.repository_owner == 'open-telemetry' }} - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/auto-assign-owners.yml b/.github/workflows/auto-assign-owners.yml index b869cfb421b2..427e16ab5b4d 100644 --- a/.github/workflows/auto-assign-owners.yml +++ b/.github/workflows/auto-assign-owners.yml @@ -9,7 +9,7 @@ concurrency: jobs: add-owner: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 if: ${{ github.actor != 'dependabot[bot]' }} steps: - name: run diff --git a/.github/workflows/auto-update-jmx-metrics-component.yml b/.github/workflows/auto-update-jmx-metrics-component.yml index 8c16408f9778..eebac4d891b8 100644 --- a/.github/workflows/auto-update-jmx-metrics-component.yml +++ b/.github/workflows/auto-update-jmx-metrics-component.yml @@ -8,7 +8,7 @@ on: jobs: check-versions: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 outputs: latest-version: ${{ steps.check-versions.outputs.latest-version }} already-added: ${{ steps.check-versions.outputs.already-added }} @@ -48,7 +48,7 @@ jobs: echo "already-opened=$already_opened" >> $GITHUB_OUTPUT update-jmx-metrics-component: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 if: | needs.check-versions.outputs.already-added != 'true' && needs.check-versions.outputs.already-opened != 'true' diff --git a/.github/workflows/build-and-test-arm.yml b/.github/workflows/build-and-test-arm.yml index a3412fa06aa9..b038cc225e54 100644 --- a/.github/workflows/build-and-test-arm.yml +++ b/.github/workflows/build-and-test-arm.yml @@ -1,9 +1,9 @@ name: build-and-test-arm on: push: - branches: [ main ] + branches: [main] tags: - - 'v[0-9]+.[0-9]+.[0-9]+*' + - "v[0-9]+.[0-9]+.[0-9]+*" merge_group: pull_request: types: [opened, synchronize, reopened, labeled, unlabeled] @@ -14,7 +14,6 @@ env: # Make sure to exit early if cache segment download times out after 2 minutes. # We limit cache download as a whole to 5 minutes. SEGMENT_DOWNLOAD_TIMEOUT_MINS: 2 - GOPROXY: https://goproxy1.cncf.selfactuated.dev,direct # Do not cancel this workflow on main. See https://github.com/open-telemetry/opentelemetry-collector-contrib/pull/16616 concurrency: @@ -46,12 +45,12 @@ jobs: - cmd-1 - other timeout-minutes: 30 - runs-on: actuated-arm64-4cpu-4gb + runs-on: otel-linux-arm64 steps: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "~1.22.3" + go-version: "~1.22.5" cache: false - name: Cache Go id: go-cache @@ -61,7 +60,7 @@ jobs: path: | ~/go/bin ~/go/pkg/mod - key: go-build-cache-${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + key: go-build-cache-otel-linux-arm64-go-${{ hashFiles('**/go.sum') }} - name: Install dependencies if: steps.go-cache.outputs.cache-hit != 'true' run: make -j2 gomoddownload @@ -72,7 +71,7 @@ jobs: run: make -j2 gotest GROUP=${{ matrix.group }} arm-unittest: if: ${{ github.actor != 'dependabot[bot]' && (contains(github.event.pull_request.labels.*.name, 'Run ARM') || github.event_name == 'push' || github.event_name == 'merge_group') }} - runs-on: actuated-arm64-4cpu-4gb + runs-on: ubuntu-24.04 needs: [arm-unittest-matrix] steps: - name: Print result diff --git a/.github/workflows/build-and-test-darwin.yaml b/.github/workflows/build-and-test-darwin.yaml new file mode 100644 index 000000000000..6ae971b84192 --- /dev/null +++ b/.github/workflows/build-and-test-darwin.yaml @@ -0,0 +1,100 @@ +name: build-and-test-darwin +on: + push: + branches: [main] + tags: + - "v[0-9]+.[0-9]+.[0-9]+*" + merge_group: + pull_request: + types: [opened, synchronize, reopened, labeled, unlabeled] + branches: + - main +env: + TEST_RESULTS: testbed/tests/results/junit/results.xml + # Make sure to exit early if cache segment download times out after 2 minutes. + # We limit cache download as a whole to 5 minutes. + SEGMENT_DOWNLOAD_TIMEOUT_MINS: 2 + +# Do not cancel this workflow on main. See https://github.com/open-telemetry/opentelemetry-collector-contrib/pull/16616 +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + darwin-build-unittest-binary: + if: ${{ github.actor != 'dependabot[bot]' && (contains(github.event.pull_request.labels.*.name, 'Run Darwin') || github.event_name == 'push' || github.event_name == 'merge_group') }} + runs-on: macos-14 + timeout-minutes: 120 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-go@v5 + with: + go-version: "~1.22.5" + cache: false + - name: Cache Go + id: go-cache + timeout-minutes: 5 + uses: actions/cache@v4 + with: + path: | + ~/go/bin + ~/go/pkg/mod + key: go-build-cache-${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + - name: Install dependencies + if: steps.go-cache.outputs.cache-hit != 'true' + run: make -j2 gomoddownload + - name: Install Tools + if: steps.go-cache.outputs.cache-hit != 'true' + run: make install-tools + - name: Build test binaries + env: + GOTESTARCH: amd64 + run: make gobuildtest GROUP=cgo + - name: Zip test binaries + run: zip -r testbinaries.zip . --include \*builtunitetest.test + - uses: actions/upload-artifact@v4 + with: + name: testbinaries + path: ./testbinaries.zip + retention-days: 1 + darwin-unittest-matrix: + if: ${{ github.actor != 'dependabot[bot]' && (contains(github.event.pull_request.labels.*.name, 'Run Darwin') || github.event_name == 'push' || github.event_name == 'merge_group') }} + needs: [darwin-build-unittest-binary] + strategy: + fail-fast: false + matrix: + os: [macos-12, macos-13] + timeout-minutes: 30 + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-go@v5 + with: + go-version: "~1.22.5" + cache: false + - name: Install Tools + if: steps.go-cache.outputs.cache-hit != 'true' + run: make install-tools + - uses: actions/download-artifact@v4 + with: + name: testbinaries + - name: Unzip binaries to each module + run: unzip testbinaries.zip + - name: Run Unit Tests + run: make -j2 gorunbuilttest GROUP=cgo + darwin-unittest: + if: ${{ github.actor != 'dependabot[bot]' && (contains(github.event.pull_request.labels.*.name, 'Run Darwin') || github.event_name == 'push' || github.event_name == 'merge_group') }} + runs-on: macos-latest + needs: [darwin-unittest-matrix] + steps: + - name: Print result + run: echo ${{ needs.darwin-unittest-matrix.result }} + - name: Interpret result + run: | + if [[ success == ${{ needs.darwin-unittest-matrix.result }} ]] + then + echo "All matrix jobs passed!" + else + echo "One or more matrix jobs failed." + false + fi diff --git a/.github/workflows/build-and-test-windows.yml b/.github/workflows/build-and-test-windows.yml index 39c0a556ce47..dafbfe3838a8 100644 --- a/.github/workflows/build-and-test-windows.yml +++ b/.github/workflows/build-and-test-windows.yml @@ -2,10 +2,10 @@ name: build-and-test-windows on: push: branches: - - 'main' - - 'releases/**' + - "main" + - "releases/**" tags: - - 'v[0-9]+.[0-9]+.[0-9]+*' + - "v[0-9]+.[0-9]+.[0-9]+*" merge_group: pull_request: types: [opened, synchronize, reopened, labeled, unlabeled] @@ -58,7 +58,7 @@ jobs: run: Install-WindowsFeature -name Web-Server -IncludeManagementTools - uses: actions/setup-go@v5 with: - go-version: "1.21.10" + go-version: "1.22.8" cache: false - name: Cache Go id: go-mod-cache @@ -69,6 +69,14 @@ jobs: ~\go\pkg\mod ~\AppData\Local\go-build key: go-build-cache-${{ runner.os }}-${{ matrix.group }}-go-${{ hashFiles('**/go.sum') }} + - name: Ensure required ports in the dynamic range are available + run: | + & ${{ github.workspace }}\.github\workflows\scripts\win-required-ports.ps1 + - name: Build shared test tools + # If component tests share Makefile targets they need to be added here to avoid + # concurrent component tests clashing when building such targets. This applies + # specifically to Windows, see https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/34691 + run: make "$(${PWD} -replace '\\', '/')/.tools/gotestsum" - name: Run Unit tests run: make -j2 gotest GROUP=${{ matrix.group }} windows-unittest: diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index da1da1f256a2..9c811d20dc57 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -1,9 +1,9 @@ name: build-and-test on: push: - branches: [ main ] + branches: [main] tags: - - 'v[0-9]+.[0-9]+.[0-9]+*' + - "v[0-9]+.[0-9]+.[0-9]+*" merge_group: pull_request: env: @@ -20,13 +20,13 @@ concurrency: jobs: setup-environment: timeout-minutes: 30 - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 if: ${{ github.actor != 'dependabot[bot]' }} steps: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.21.10" + go-version: "1.22.8" cache: false - name: Cache Go id: go-cache @@ -36,6 +36,7 @@ jobs: path: | ~/go/bin ~/go/pkg/mod + ./.tools key: go-cache-${{ runner.os }}-${{ hashFiles('**/go.sum') }} - name: Install dependencies if: steps.go-cache.outputs.cache-hit != 'true' @@ -44,14 +45,15 @@ jobs: if: steps.go-cache.outputs.cache-hit != 'true' run: make install-tools check-collector-module-version: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 needs: [setup-environment] steps: - uses: actions/checkout@v4 + - run: make genotelcontribcol - name: Check Collector Module Version run: ./.github/workflows/scripts/check-collector-module-version.sh check-codeowners: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 needs: [setup-environment] steps: - uses: actions/checkout@v4 @@ -65,7 +67,7 @@ jobs: strategy: fail-fast: false matrix: - test: + goos: - windows - linux group: @@ -86,13 +88,13 @@ jobs: - cmd-0 - cmd-1 - other - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 needs: [setup-environment] steps: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.21.10" + go-version: "1.22.8" cache: false - name: Cache Go id: go-cache @@ -102,6 +104,7 @@ jobs: path: | ~/go/bin ~/go/pkg/mod + ./.tools key: go-cache-${{ runner.os }}-${{ hashFiles('**/go.sum') }} - name: Install dependencies if: steps.go-cache.outputs.cache-hit != 'true' @@ -115,10 +118,10 @@ jobs: path: ~/.cache/go-build key: go-lint-build-${{ matrix.group }}-${{ runner.os }}-${{ hashFiles('**/go.sum') }} - name: Lint - run: GOOS=${{ matrix.os }} GOARCH=amd64 make -j2 golint GROUP=${{ matrix.group }} + run: GOOS=${{ matrix.goos }} GOARCH=amd64 make -j2 golint GROUP=${{ matrix.group }} lint: if: ${{ github.actor != 'dependabot[bot]' && always() }} - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 needs: [setup-environment, lint-matrix] steps: - name: Print result @@ -153,7 +156,7 @@ jobs: - pkg - cmd-0 - cmd-1 - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 30 steps: - name: Checkout Repo @@ -161,7 +164,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v5 with: - go-version: "1.21.10" + go-version: "1.22.8" cache: false - name: Cache Go id: go-cache @@ -171,6 +174,7 @@ jobs: path: | ~/go/bin ~/go/pkg/mod + ./.tools key: go-cache-${{ runner.os }}-${{ hashFiles('**/go.sum') }} - name: Install Tools if: steps.go-cache.outputs.cache-hit != 'true' @@ -178,13 +182,13 @@ jobs: - name: Run `govulncheck` run: make -j2 gogovulncheck GROUP=${{ matrix.group }} checks: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 needs: [setup-environment] steps: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.21.10" + go-version: "1.22.8" cache: false - name: Cache Go id: go-cache @@ -194,6 +198,7 @@ jobs: path: | ~/go/bin ~/go/pkg/mod + ./.tools key: go-cache-${{ runner.os }}-${{ hashFiles('**/go.sum') }} - name: Install dependencies if: steps.go-cache.outputs.cache-hit != 'true' @@ -201,6 +206,7 @@ jobs: - name: Install Tools if: steps.go-cache.outputs.cache-hit != 'true' run: make install-tools + - run: make genotelcontribcol - name: CheckDoc run: make checkdoc - name: CheckMetadata @@ -219,23 +225,10 @@ jobs: run: | make gotidy git diff --exit-code || (echo 'go.mod/go.sum deps changes detected, please run "make gotidy" and commit the changes in this PR.' && exit 1) - - name: Gen genotelcontribcol - run: | - make genotelcontribcol - git diff -s --exit-code || (echo 'Generated code is out of date, please run "make genotelcontribcol" and commit the changes in this PR.' && exit 1) - - name: Gen genoteltestbedcol - run: | - make genoteltestbedcol - git diff -s --exit-code || (echo 'Generated code is out of date, please run "make genoteltestbedcol" and commit the changes in this PR.' && exit 1) - name: Gen distributions run: | make gendistributions git diff -s --exit-code || (echo 'Generated code is out of date, please run "make gendistributions" and commit the changes in this PR.' && exit 1) - - name: Gen CODEOWNERS - if: (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v')) && github.repository == 'open-telemetry/opentelemetry-collector-contrib' - run: | - GITHUB_TOKEN=${{ secrets.READ_ORG_AND_USER_TOKEN }} make gengithub - git diff -s --exit-code || (echo 'Generated code is out of date, please apply this diff and commit the changes in this PR.' && git diff && exit 1) - name: CodeGen run: | make -j2 generate @@ -253,8 +246,8 @@ jobs: strategy: fail-fast: false matrix: - go-version: ["1.22.3", "1.21.10"] # 1.20 is interpreted as 1.2 without quotes - runner: [ubuntu-latest] + go-version: ["1.23.0", "1.22.8"] # 1.20 is interpreted as 1.2 without quotes + runner: [ubuntu-24.04] group: - receiver-0 - receiver-1 @@ -289,6 +282,7 @@ jobs: path: | ~/go/bin ~/go/pkg/mod + ./.tools key: go-cache-${{ runner.os }}-${{ hashFiles('**/go.sum') }} - name: Install dependencies if: steps.go-cache.outputs.cache-hit != 'true' @@ -302,19 +296,19 @@ jobs: path: ~/.cache/go-build key: go-test-build-${{ runner.os }}-${{ matrix.go-version }}-${{ matrix.runner }}-${{ hashFiles('**/go.sum') }} - name: Run Unit Tests - if: startsWith( matrix.go-version, '1.21' ) != true + if: startsWith( matrix.go-version, '1.22' ) != true run: make gotest GROUP=${{ matrix.group }} - name: Run Unit Tests With Coverage - if: startsWith( matrix.go-version, '1.21' ) # only run coverage on one version + if: startsWith( matrix.go-version, '1.22' ) # only run coverage on one version run: make gotest-with-cover GROUP=${{ matrix.group }} - uses: actions/upload-artifact@v4 - if: startsWith( matrix.go-version, '1.21' ) # only upload artifact for one version + if: startsWith( matrix.go-version, '1.22' ) # only upload artifact for one version with: name: coverage-artifacts-${{ matrix.go-version }}-${{ matrix.runner }}-${{ matrix.group }} path: ${{ matrix.group }}-coverage.txt unittest: if: ${{ github.actor != 'dependabot[bot]' && always() }} - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 needs: [setup-environment, unittest-matrix] steps: - name: Print result @@ -329,7 +323,7 @@ jobs: false fi coverage: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 needs: [unittest] steps: - uses: actions/checkout@v4 @@ -338,7 +332,7 @@ jobs: merge-multiple: true pattern: coverage-artifacts-* - name: Upload coverage report - uses: codecov/codecov-action@125fc84a9a348dbcf27191600683ec096ec9021c # 4.4.1 + uses: codecov/codecov-action@7f8b4b4bde536c465e797be725718b88c5d95e0e # 5.1.1 env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} @@ -363,13 +357,13 @@ jobs: - pkg - cmd-0 - cmd-1 - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 needs: [setup-environment] steps: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.21.10" + go-version: "1.22.8" cache: false - name: Cache Go id: go-cache @@ -379,14 +373,15 @@ jobs: path: | ~/go/bin ~/go/pkg/mod + ./.tools key: go-cache-${{ runner.os }}-${{ hashFiles('**/go.sum') }} - name: Run Integration Tests run: make gointegration-test GROUP=${{ matrix.group }} integration-tests: if: ${{ github.actor != 'dependabot[bot]' && always() }} - runs-on: ubuntu-latest - needs: [ setup-environment, integration-tests-matrix ] + runs-on: ubuntu-24.04 + needs: [setup-environment, integration-tests-matrix] steps: - name: Print result run: echo ${{ needs.integration-tests-matrix.result }} @@ -401,13 +396,13 @@ jobs: fi correctness-traces: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 needs: [setup-environment] steps: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.21.10" + go-version: "1.22.8" cache: false - name: Cache Go id: go-cache @@ -417,6 +412,7 @@ jobs: path: | ~/go/bin ~/go/pkg/mod + ./.tools key: go-cache-${{ runner.os }}-${{ hashFiles('**/go.sum') }} - name: Install dependencies if: steps.go-cache.outputs.cache-hit != 'true' @@ -427,13 +423,13 @@ jobs: - name: Correctness run: make -C testbed run-correctness-traces-tests correctness-metrics: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 needs: [setup-environment] steps: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.21.10" + go-version: "1.22.8" cache: false - name: Cache Go id: go-cache @@ -443,6 +439,7 @@ jobs: path: | ~/go/bin ~/go/pkg/mod + ./.tools key: go-cache-${{ runner.os }}-${{ hashFiles('**/go.sum') }} - name: Install dependencies if: steps.go-cache.outputs.cache-hit != 'true' @@ -454,15 +451,16 @@ jobs: run: make -C testbed run-correctness-metrics-tests build-examples: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 needs: [setup-environment] steps: - uses: actions/checkout@v4 + - run: make genotelcontribcol - name: Build Examples run: make build-examples cross-compile: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 needs: [setup-environment] strategy: fail-fast: false @@ -480,8 +478,8 @@ jobs: - s390x include: - os: linux - - arch: arm - - arm: 7 + arch: arm + arm: 7 exclude: - os: darwin arch: 386 @@ -503,7 +501,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.21.10" + go-version: "1.22.8" cache: false - name: Cache Go id: go-cache @@ -513,6 +511,7 @@ jobs: path: | ~/go/bin ~/go/pkg/mod + ./.tools key: go-cache-${{ runner.os }}-${{ hashFiles('**/go.sum') }} - name: Install dependencies if: steps.go-cache.outputs.cache-hit != 'true' @@ -520,6 +519,8 @@ jobs: - name: Install Tools if: steps.go-cache.outputs.cache-hit != 'true' run: make install-tools + - name: Generate collector files + run: make genotelcontribcol - name: Build Collector ${{ matrix.binary }} run: make GOOS=${{ matrix.os }} GOARCH=${{ matrix.arch }} GOARM=${{ matrix.arm }} otelcontribcol - name: Upload Collector Binaries @@ -528,57 +529,9 @@ jobs: name: collector-binaries-${{ matrix.os }}-${{ matrix.arch }} path: ./bin/* - build-package: - runs-on: ubuntu-latest - needs: [cross-compile] - strategy: - fail-fast: false - matrix: - package_type: ["deb", "rpm"] - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Install Ruby - uses: ruby/setup-ruby@v1 - with: - ruby-version: '3.3' - - name: Install fpm - run: gem install --no-document fpm -v 1.15.1 - - name: Download Collector Binaries - uses: actions/download-artifact@v4 - with: - merge-multiple: true - path: bin/ - pattern: collector-binaries-* - - run: chmod +x bin/* - - name: Set Release Tag - id: github_tag - run: ./.github/workflows/scripts/set_release_tag.sh - - name: Build ${{ matrix.package_type }} amd64 package - run: ./internal/buildscripts/packaging/fpm/${{ matrix.package_type }}/build.sh "${{ steps.github_tag.outputs.tag }}" "amd64" "./dist/" - - name: Build ${{ matrix.package_type }} arm64 package - run: ./internal/buildscripts/packaging/fpm/${{ matrix.package_type }}/build.sh "${{ steps.github_tag.outputs.tag }}" "arm64" "./dist/" - - name: Build ${{ matrix.package_type }} ppc64le package - run: ./internal/buildscripts/packaging/fpm/${{ matrix.package_type }}/build.sh "${{ steps.github_tag.outputs.tag }}" "ppc64le" "./dist/" - - name: Build ${{ matrix.package_type }} s390x package - run: ./internal/buildscripts/packaging/fpm/${{ matrix.package_type }}/build.sh "${{ steps.github_tag.outputs.tag }}" "s390x" "./dist/" - - name: Test ${{ matrix.package_type }} package - run: | - if [[ "${{ matrix.package_type }}" = "deb" ]]; then - ./internal/buildscripts/packaging/fpm/test.sh dist/otel-contrib-collector*amd64.deb examples/demo/otel-collector-config.yaml - else - ./internal/buildscripts/packaging/fpm/test.sh dist/otel-contrib-collector*x86_64.rpm examples/demo/otel-collector-config.yaml - fi - - name: Upload Packages - uses: actions/upload-artifact@v4 - with: - name: collector-packages-${{ matrix.package_type }} - path: ./dist/* - publish-check: - runs-on: ubuntu-latest - needs: [lint, unittest, integration-tests, build-package] + runs-on: ubuntu-24.04 + needs: [lint, unittest, integration-tests] steps: - uses: actions/checkout@v4 - name: Download Binaries @@ -587,24 +540,18 @@ jobs: merge-multiple: true path: ./bin/ pattern: collector-binaries-* - - name: Download Packages - uses: actions/download-artifact@v4 - with: - merge-multiple: true - path: ./dist/ - pattern: collector-packages-* - name: Verify Distribution Files Exist id: check run: ./.github/workflows/scripts/verify-dist-files-exist.sh publish-dev: - runs-on: ubuntu-latest - needs: [lint, unittest, integration-tests, build-package] + runs-on: ubuntu-24.04 + needs: [lint, unittest, integration-tests] if: (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v')) && github.repository == 'open-telemetry/opentelemetry-collector-contrib' steps: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.21.10" + go-version: "1.22.8" cache: false - name: Mkdir bin and dist run: | @@ -617,6 +564,7 @@ jobs: path: | ~/go/bin ~/go/pkg/mod + ./.tools key: go-cache-${{ runner.os }}-${{ hashFiles('**/go.sum') }} - name: Install dependencies if: steps.go-cache.outputs.cache-hit != 'true' @@ -631,12 +579,6 @@ jobs: path: ./bin/ pattern: collector-binaries-* - run: chmod +x bin/* - - name: Download Packages - uses: actions/download-artifact@v4 - with: - merge-multiple: true - path: ./dist/ - pattern: collector-packages-* - name: Add Permissions to Tool Binaries run: chmod -R +x ./dist - name: Verify Distribution Files Exist @@ -645,14 +587,15 @@ jobs: - name: Build Docker Image if: steps.check.outputs.passed == 'true' run: | - make docker-otelcontribcol - docker tag otelcontribcol:latest otel/opentelemetry-collector-contrib-dev:$GITHUB_SHA - docker tag otelcontribcol:latest otel/opentelemetry-collector-contrib-dev:latest + make genotelcontribcol + make docker-otelcontribcol + docker tag otelcontribcol:latest otel/opentelemetry-collector-contrib-dev:$GITHUB_SHA + docker tag otelcontribcol:latest otel/opentelemetry-collector-contrib-dev:latest - name: Validate Docker Image if: steps.check.outputs.passed == 'true' run: | - docker run otel/opentelemetry-collector-contrib-dev:$GITHUB_SHA --version - docker run otel/opentelemetry-collector-contrib-dev:latest --version + docker run otel/opentelemetry-collector-contrib-dev:$GITHUB_SHA --version + docker run otel/opentelemetry-collector-contrib-dev:latest --version - name: Login to Docker Hub uses: docker/login-action@v3 with: @@ -661,11 +604,11 @@ jobs: - name: Push Docker Image if: steps.check.outputs.passed == 'true' run: | - docker push otel/opentelemetry-collector-contrib-dev:$GITHUB_SHA - docker push otel/opentelemetry-collector-contrib-dev:latest + docker push otel/opentelemetry-collector-contrib-dev:$GITHUB_SHA + docker push otel/opentelemetry-collector-contrib-dev:latest publish-stable: - runs-on: ubuntu-latest - needs: [lint, unittest, integration-tests, build-package] + runs-on: ubuntu-24.04 + needs: [lint, unittest, integration-tests] if: startsWith(github.ref, 'refs/tags/v') && github.repository == 'open-telemetry/opentelemetry-collector-contrib' steps: - uses: actions/checkout@v4 @@ -682,7 +625,7 @@ jobs: # This job updates the "next release" milestone # to the latest released version and creates a new milestone # named "next release" in its place - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 needs: [publish-stable] if: startsWith(github.ref, 'refs/tags/v') && github.repository == 'open-telemetry/opentelemetry-collector-contrib' steps: @@ -710,4 +653,3 @@ jobs: return } } - diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index 2b9db858bc96..f2966c9065ff 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -15,6 +15,8 @@ env: # Make sure to exit early if cache segment download times out after 2 minutes. # We limit cache download as a whole to 5 minutes. SEGMENT_DOWNLOAD_TIMEOUT_MINS: 2 + # renovate: datasource=github-releases depName=tcort/markdown-link-check + MD_LINK_CHECK_VERSION: "3.12.2" concurrency: group: ${{ github.workflow }}-${{ github.head_ref }} @@ -22,7 +24,7 @@ concurrency: jobs: changelog: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 if: ${{ github.actor != 'dependabot[bot]' }} env: PR_HEAD: ${{ github.event.pull_request.head.sha }} @@ -33,7 +35,7 @@ jobs: fetch-depth: 0 - uses: actions/setup-go@v5 with: - go-version: "1.21.10" + go-version: "1.22.8" cache: false - name: Cache Go id: go-cache @@ -84,7 +86,7 @@ jobs: run: make chlog-preview > changelog_preview.md - name: Install markdown-link-check if: ${{ !contains(github.event.pull_request.labels.*.name, 'dependencies') && !contains(github.event.pull_request.labels.*.name, 'Skip Changelog') && !contains(github.event.pull_request.title, '[chore]')}} - run: npm install -g markdown-link-check + run: npm install -g markdown-link-check@${{ env.MD_LINK_CHECK_VERSION }} - name: Run markdown-link-check if: ${{ !contains(github.event.pull_request.labels.*.name, 'dependencies') && !contains(github.event.pull_request.labels.*.name, 'Skip Changelog') && !contains(github.event.pull_request.title, '[chore]')}} run: | diff --git a/.github/workflows/check-codeowners.yaml b/.github/workflows/check-codeowners.yaml new file mode 100644 index 000000000000..e80bb637062e --- /dev/null +++ b/.github/workflows/check-codeowners.yaml @@ -0,0 +1,63 @@ +name: codeowners +on: + push: + branches: [main] + tags: + - "v[0-9]+.[0-9]+.[0-9]+*" + pull_request_target: + types: + - opened + - synchronize + - edited + - reopened +env: + # Make sure to exit early if cache segment download times out after 2 minutes. + # We limit cache download as a whole to 5 minutes. + SEGMENT_DOWNLOAD_TIMEOUT_MINS: 2 + +# Do not cancel this workflow on main. See https://github.com/open-telemetry/opentelemetry-collector-contrib/pull/16616 +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + setup-environment: + timeout-minutes: 30 + runs-on: ubuntu-24.04 + if: ${{ github.actor != 'dependabot[bot]' }} + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-go@v5 + with: + go-version: "1.22.8" + cache: false + - name: Cache Go + id: go-cache + timeout-minutes: 5 + uses: actions/cache@v4 + with: + path: | + ~/go/bin + ~/go/pkg/mod + ./.tools + key: go-cache-${{ runner.os }}-${{ hashFiles('**/go.sum') }} + check-codeowners: + runs-on: ubuntu-24.04 + needs: [setup-environment] + steps: + - uses: actions/checkout@v4 + - name: Gen githubgen tool + if: github.repository == 'open-telemetry/opentelemetry-collector-contrib' + run: | + make githubgen-install + echo "$(go env GOPATH)/bin" >> $GITHUB_PATH + - uses: actions/checkout@v4 + with: + ref: ${{github.event.pull_request.head.ref}} + repository: ${{github.event.pull_request.head.repo.full_name}} + path: pr + - name: Gen CODEOWNERS + run: | + cd pr + GITHUB_TOKEN=${{ secrets.READ_ORG_AND_USER_TOKEN }} githubgen + git diff -s --exit-code || (echo 'Generated code is out of date, please apply this diff and commit the changes in this PR.' && git diff && exit 1) diff --git a/.github/workflows/check-links.yaml b/.github/workflows/check-links.yaml index 83817d99f1f5..69fe83dd18c6 100644 --- a/.github/workflows/check-links.yaml +++ b/.github/workflows/check-links.yaml @@ -9,39 +9,52 @@ concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} cancel-in-progress: true +env: + # renovate: datasource=github-releases depName=tcort/markdown-link-check + MD_LINK_CHECK_VERSION: "3.12.2" + jobs: changedfiles: name: changed files - runs-on: ubuntu-latest - env: - PR_HEAD: ${{ github.event.pull_request.head.sha }} + runs-on: ubuntu-24.04 if: ${{ github.actor != 'dependabot[bot]' }} outputs: - md: ${{ steps.changes.outputs.md }} + md_files: ${{ steps.changed-files.outputs.md_all_changed_files }} + yaml_files: ${{ steps.changed-files.outputs.yaml_all_changed_files }} # used to catch MD_LINK_CHECK_VERSION updates and runs check-links to confirm functionality steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Get changed files - id: changes - run: | - echo "md=$(git diff --name-only --diff-filter=ACMRTUXB $(git merge-base origin/main $PR_HEAD) $PR_HEAD | grep .md$ | xargs)" >> $GITHUB_OUTPUT + id: changed-files + uses: tj-actions/changed-files@v45 + with: + files_yaml: | + md: + - '**.md' + yaml: + - .github/workflows/check-links.yaml + check-links: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 needs: changedfiles - if: ${{needs.changedfiles.outputs.md}} + if: needs.changedfiles.outputs.md_files || needs.changedfiles.outputs.yaml_files steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - - name: Install markdown-link-check - run: npm install -g markdown-link-check - + run: npm install -g markdown-link-check@${{ env.MD_LINK_CHECK_VERSION }} - name: Run markdown-link-check run: | + if [ -n "${{ needs.changedfiles.outputs.yaml_files }}" ]; then + md=$(find . -type f -name "*.md") + else + md="${{ needs.changedfiles.outputs.md_files }}" + fi + markdown-link-check \ --verbose \ --config .github/workflows/check_links_config.json \ - ${{needs.changedfiles.outputs.md}} \ + $md \ || { echo "Check that anchor links are lowercase"; exit 1; } diff --git a/.github/workflows/check_links_config.json b/.github/workflows/check_links_config.json index f48e49e6938e..299206c09254 100644 --- a/.github/workflows/check_links_config.json +++ b/.github/workflows/check_links_config.json @@ -11,6 +11,9 @@ }, { "pattern": "^#" + }, + { + "pattern": "https://blogs\\.oracle\\.com/developers/post/connecting-a-go-application-to-oracle-database" } ], "aliveStatusCodes": [429, 200] diff --git a/.github/workflows/close-stale.yaml b/.github/workflows/close-stale.yaml index b78d73c099de..c50fc3b0a0fe 100644 --- a/.github/workflows/close-stale.yaml +++ b/.github/workflows/close-stale.yaml @@ -6,7 +6,7 @@ on: jobs: stale: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 env: GH_TOKEN: ${{ github.token }} steps: @@ -26,6 +26,7 @@ jobs: exempt-issue-labels: 'never stale' ascending: true operations-per-run: 6000 + exempt-pr-labels: 'never stale' - name: Check rate_limit after run: gh api /rate_limit diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 961fd5e55858..8769d26452c7 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -4,7 +4,7 @@ on: push: branches: [main] paths-ignore: - - '**/README.md' + - "**/README.md" jobs: CodeQL-Build: @@ -14,13 +14,13 @@ jobs: # Force CodeQL to run the extraction on the files compiled by our custom # build command, as opposed to letting the autobuilder figure it out. # See: https://github.com/github/codeql-action/issues/1101#issuecomment-1157729589 - CODEQL_EXTRACTOR_GO_BUILD_TRACING: 'on' + CODEQL_EXTRACTOR_GO_BUILD_TRACING: "on" steps: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.21.10" + go-version: "1.22.8" cache: false # Initializes the CodeQL tools for scanning. @@ -31,9 +31,9 @@ jobs: - name: Build Artifact run: | + make genotelcontribcol make otelcontribcol - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v3 timeout-minutes: 60 - diff --git a/.github/workflows/e2e-tests-windows.yml b/.github/workflows/e2e-tests-windows.yml new file mode 100644 index 000000000000..bcfb4f38d865 --- /dev/null +++ b/.github/workflows/e2e-tests-windows.yml @@ -0,0 +1,142 @@ +name: e2e-tests-windows + +on: + push: + branches: + - main + tags: + - "v[0-9]+.[0-9]+.[0-9]+*" + paths-ignore: + - "**/README.md" + pull_request: + paths-ignore: + - "**/README.md" + merge_group: + +env: + # Make sure to exit early if cache segment download times out after 2 minutes. + # We limit cache download as a whole to 5 minutes. + SEGMENT_DOWNLOAD_TIMEOUT_MINS: 2 + +jobs: + windows-file-changed: + runs-on: ubuntu-latest + if: ${{ github.event_name == 'pull_request' }} + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Did windows files changed + run: echo "changed=$(./.github/workflows/scripts/is_changed_file_windows.sh )" >> "$GITHUB_OUTPUT" + - run: echo $(./.github/workflows/scripts/is_changed_file_windows.sh ${{ github.event.pull_request.base.sha }} ${{ github.sha }} ) + + collector-build: + runs-on: windows-latest + needs: [windows-file-changed] + if: ${{ github.actor != 'dependabot[bot]' && ((contains(github.event.pull_request.labels.*.name, 'Run Windows') || github.event_name == 'push' || github.event_name == 'merge_group') || needs.windows-file-changed.outputs.changed == 'true') }} + steps: + - name: Checkout + uses: actions/checkout@v4 + - uses: actions/setup-go@v5 + with: + go-version: "1.21.12" + cache: false + - name: Cache Go + id: go-mod-cache + timeout-minutes: 25 + uses: actions/cache@v4 + with: + path: | + ~\go\pkg\mod + ~\AppData\Local\go-build + key: go-build-cache-${{ runner.os }}-${{ matrix.group }}-go-${{ hashFiles('**/go.sum') }} + - name: Install dependencies + if: steps.go-mod-cache.outputs.cache-hit != 'true' + run: make -j2 gomoddownload + - name: Generate otelcontribcol files + run: make genotelcontribcol + - name: Build Collector + run: make otelcontribcol + - name: Upload Collector Binary + uses: actions/upload-artifact@v4 + with: + name: collector-binary + path: ./bin/* + + supervisor-test: + runs-on: windows-latest + if: ${{ github.actor != 'dependabot[bot]' && (contains(github.event.pull_request.labels.*.name, 'Run Windows') || github.event_name == 'push' || github.event_name == 'merge_group') }} + needs: [collector-build] + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-go@v5 + with: + go-version: "1.21.12" + cache: false + - name: Cache Go + id: go-mod-cache + timeout-minutes: 25 + uses: actions/cache@v4 + with: + path: | + ~\go\pkg\mod + ~\AppData\Local\go-build + key: go-build-cache-${{ runner.os }}-${{ matrix.group }}-go-${{ hashFiles('**/go.sum') }} + - name: Install dependencies + if: steps.go-mod-cache.outputs.cache-hit != 'true' + run: make -j2 gomoddownload + - name: Download Collector Binary + uses: actions/download-artifact@v4 + with: + name: collector-binary + path: bin/ + - name: Run opampsupervisor e2e tests + run: | + cd cmd/opampsupervisor + go test -v --tags=e2e + + windows-supervisor-service-test: + runs-on: windows-latest + if: ${{ github.actor != 'dependabot[bot]' && (contains(github.event.pull_request.labels.*.name, 'Run Windows') || github.event_name == 'push' || github.event_name == 'merge_group') }} + needs: [collector-build] + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version: ~1.22.8 + cache: false + - name: Cache Go + uses: actions/cache@v4 + env: + cache-name: cache-go-modules + with: + path: | + ~\go\pkg\mod + ~\AppData\Local\go-build + key: go-build-cache-${{ runner.os }}-${{ matrix.group }}-go-${{ hashFiles('**/go.sum') }} + - name: Ensure required ports in the dynamic range are available + run: | + & ${{ github.workspace }}\.github\workflows\scripts\win-required-ports.ps1 + - name: Download Collector Binary + uses: actions/download-artifact@v4 + with: + name: collector-binary + path: bin/ + - name: Build supervisor + run: cd cmd/opampsupervisor; go build + - name: Install supervisor as a service + run: | + New-Service -Name "opampsupervisor" -StartupType "Manual" -BinaryPathName "${PWD}\cmd\opampsupervisor --config ${PWD}\cmd\opampsupervisor\supervisor\testdata\supervisor_windows_service_test_config.yaml\" + eventcreate.exe /t information /id 1 /l application /d "Creating event provider for 'opampsupervisor'" /so opampsupervisor + - name: Test supervisor service + working-directory: ${{ github.workspace }}/cmd/opampsupervisor + run: | + go test -timeout 90s -run ^TestSupervisorAsService$ -v -tags=win32service + - name: Remove opampsupervisor service + if: always() + run: | + Remove-Service opampsupervisor + Remove-Item HKLM:\SYSTEM\CurrentControlSet\Services\EventLog\Application\opampsupervisor diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index 3f623985c13e..deeec0d8373e 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -5,12 +5,12 @@ on: branches: - main tags: - - 'v[0-9]+.[0-9]+.[0-9]+*' + - "v[0-9]+.[0-9]+.[0-9]+*" paths-ignore: - - '**/README.md' + - "**/README.md" pull_request: paths-ignore: - - '**/README.md' + - "**/README.md" merge_group: env: @@ -19,14 +19,14 @@ env: SEGMENT_DOWNLOAD_TIMEOUT_MINS: 2 jobs: collector-build: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 if: ${{ github.actor != 'dependabot[bot]' }} steps: - name: Checkout uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.21.10" + go-version: "1.22.8" cache: false - name: Cache Go id: go-cache @@ -40,6 +40,8 @@ jobs: - name: Install dependencies if: steps.go-cache.outputs.cache-hit != 'true' run: make -j2 gomoddownload + - name: Generate otelcontribcol files + run: make genotelcontribcol - name: Build Collector run: make otelcontribcol - name: Upload Collector Binary @@ -49,13 +51,13 @@ jobs: path: ./bin/* supervisor-test: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 needs: collector-build steps: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.21.10" + go-version: "1.22.8" cache: false - name: Cache Go id: go-cache @@ -81,13 +83,13 @@ jobs: go test -v --tags=e2e docker-build: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - name: Checkout uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.21.10" + go-version: "1.22.8" cache: false - name: Cache Go id: go-cache @@ -101,6 +103,8 @@ jobs: - name: Install dependencies if: steps.go-cache.outputs.cache-hit != 'true' run: make -j2 gomoddownload + - name: Generate otelcontribcol files + run: make genotelcontribcol - name: Build Docker Image run: | make docker-otelcontribcol @@ -120,22 +124,20 @@ jobs: fail-fast: false matrix: k8s-version: - - "v1.26.0" - - "v1.25.3" - - "v1.24.7" - - "v1.23.13" + - "v1.30.0" + - "v1.23.17" component: - receiver/k8sclusterreceiver - processor/k8sattributesprocessor - receiver/kubeletstatsreceiver - receiver/k8sobjectsreceiver - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 needs: docker-build steps: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.21.10" + go-version: "1.22.8" cache: false - name: Cache Go id: go-cache @@ -177,8 +179,8 @@ jobs: kubernetes-test: if: ${{ github.actor != 'dependabot[bot]' && always() }} - runs-on: ubuntu-latest - needs: [ kubernetes-test-matrix ] + runs-on: ubuntu-24.04 + needs: [kubernetes-test-matrix] steps: - name: Print result run: echo ${{ needs.kubernetes-test-matrix.result }} @@ -191,4 +193,3 @@ jobs: echo "One or more matrix jobs failed." false fi - diff --git a/.github/workflows/generate-component-labels.yml b/.github/workflows/generate-component-labels.yml index c7c194677d28..5938aa5621aa 100644 --- a/.github/workflows/generate-component-labels.yml +++ b/.github/workflows/generate-component-labels.yml @@ -10,7 +10,7 @@ on: jobs: generate-component-labels: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 if: ${{ github.repository_owner == 'open-telemetry' }} steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/generate-weekly-report.yml b/.github/workflows/generate-weekly-report.yml index d58b25c651eb..2ff2648f5e74 100644 --- a/.github/workflows/generate-weekly-report.yml +++ b/.github/workflows/generate-weekly-report.yml @@ -10,7 +10,7 @@ on: jobs: get_issues: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 if: ${{ github.repository_owner == 'open-telemetry' }} steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/load-tests.yml b/.github/workflows/load-tests.yml index 713037fba05d..03ddfe36bfed 100644 --- a/.github/workflows/load-tests.yml +++ b/.github/workflows/load-tests.yml @@ -1,11 +1,11 @@ name: load-tests on: push: - branches: [ main ] + branches: [main] tags: - - 'v[0-9]+.[0-9]+.[0-9]+*' + - "v[0-9]+.[0-9]+.[0-9]+*" paths-ignore: - - '**/README.md' + - "**/README.md" # Do not cancel this workflow on main. See https://github.com/open-telemetry/opentelemetry-collector-contrib/pull/16616 concurrency: @@ -28,7 +28,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.21.10" + go-version: "1.22.8" cache: false - name: Cache Go id: go-cache @@ -46,6 +46,7 @@ jobs: - name: Install Tools if: steps.go-cache.outputs.cache-hit != 'true' run: make install-tools + - run: make genoteltestbedcol - run: make oteltestbedcol - name: Upload Testbed Binaries uses: actions/upload-artifact@v4 @@ -66,7 +67,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.21.10" + go-version: "1.22.8" cache: false - name: Cache Go id: go-cache @@ -96,6 +97,7 @@ jobs: env: TEST_ARGS: "-test.run=${{ matrix.test }}" - name: Set results filename + if: ${{ failure() || success() }} id: filename run: echo "name=$(echo '${{ matrix.test }}' | sed -e 's/|/_/g')" >> $GITHUB_OUTPUT - name: Create Test Result Archive @@ -107,32 +109,30 @@ jobs: continue-on-error: true uses: actions/upload-artifact@v4 with: + name: test-result-archive-${{steps.filename.outputs.name}} path: ./*.tar - run: cp testbed/tests/results/benchmarks.json testbed/tests/results/${{steps.filename.outputs.name}}.json - name: Upload benchmarks.json uses: actions/upload-artifact@v4 with: - name: benchmark-results + name: benchmark-results-${{steps.filename.outputs.name}} path: testbed/tests/results/${{steps.filename.outputs.name}}.json - - name: GitHub Issue Generator - if: ${{ failure() && github.ref == 'refs/heads/main' }} - run: ./.tools/issuegenerator $TEST_RESULTS - update-benchmarks: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 needs: [loadtest] if: github.event_name != 'pull_request' steps: - uses: actions/checkout@v4 - uses: actions/download-artifact@v4 with: - name: benchmark-results + pattern: benchmark-results-* + merge-multiple: true path: results - run: jq -s 'map(.[])' results/*.json > output.json - uses: benchmark-action/github-action-benchmark@v1 with: - tool: 'customSmallerIsBetter' + tool: "customSmallerIsBetter" output-file-path: output.json gh-pages-branch: benchmarks max-items-in-chart: 100 diff --git a/.github/workflows/mark-issues-as-stale.yml b/.github/workflows/mark-issues-as-stale.yml index 8cb4c88d35f7..4beaa9afe4a0 100644 --- a/.github/workflows/mark-issues-as-stale.yml +++ b/.github/workflows/mark-issues-as-stale.yml @@ -5,7 +5,7 @@ on: jobs: mark-issues-as-stale: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 if: ${{ github.repository_owner == 'open-telemetry' }} steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/milestone-add-to-pr.yml b/.github/workflows/milestone-add-to-pr.yml index eba56e603175..ec808bbf849c 100644 --- a/.github/workflows/milestone-add-to-pr.yml +++ b/.github/workflows/milestone-add-to-pr.yml @@ -11,7 +11,7 @@ on: jobs: update-pr: if: github.event.pull_request.merged - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - uses: actions/github-script@v7 with: diff --git a/.github/workflows/ping-codeowners-issues.yml b/.github/workflows/ping-codeowners-issues.yml index 9a58d23f1f69..aa7e2090e338 100644 --- a/.github/workflows/ping-codeowners-issues.yml +++ b/.github/workflows/ping-codeowners-issues.yml @@ -5,7 +5,7 @@ on: jobs: ping-owners: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 if: ${{ github.repository_owner == 'open-telemetry' }} steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/ping-codeowners-on-new-issue.yml b/.github/workflows/ping-codeowners-on-new-issue.yml index f4a2025afe9d..4a1b52f48500 100644 --- a/.github/workflows/ping-codeowners-on-new-issue.yml +++ b/.github/workflows/ping-codeowners-on-new-issue.yml @@ -5,7 +5,7 @@ on: jobs: ping-owners-on-new-issue: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 if: ${{ github.repository_owner == 'open-telemetry' }} steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/ping-codeowners-prs.yml b/.github/workflows/ping-codeowners-prs.yml index 40e6c46c83e1..29b697818aa9 100644 --- a/.github/workflows/ping-codeowners-prs.yml +++ b/.github/workflows/ping-codeowners-prs.yml @@ -5,7 +5,7 @@ on: jobs: ping-owners: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 if: ${{ github.actor != 'dependabot[bot]' && github.repository_owner == 'open-telemetry' }} steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml index 6361ae825676..f0f5e86f3d22 100644 --- a/.github/workflows/prepare-release.yml +++ b/.github/workflows/prepare-release.yml @@ -15,18 +15,18 @@ on: jobs: # Releasing opentelemetry-collector-contrib prepare-release: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 with: - repository: 'open-telemetry/opentelemetry-collector' + repository: "open-telemetry/opentelemetry-collector" path: opentelemetry-collector - uses: actions/checkout@v4 with: path: opentelemetry-collector-contrib - uses: actions/setup-go@v5 with: - go-version: "1.21.10" + go-version: "1.22.8" cache: false - name: Prepare release for contrib working-directory: opentelemetry-collector-contrib diff --git a/.github/workflows/prometheus-compliance-tests.yml b/.github/workflows/prometheus-compliance-tests.yml index aad3f5330c11..4d46370937b8 100644 --- a/.github/workflows/prometheus-compliance-tests.yml +++ b/.github/workflows/prometheus-compliance-tests.yml @@ -1,14 +1,14 @@ name: prometheus-compliance-tests on: push: - branches: [ main ] + branches: [main] tags: - - 'v[0-9]+.[0-9]+.[0-9]+*' + - "v[0-9]+.[0-9]+.[0-9]+*" paths-ignore: - - '**/README.md' + - "**/README.md" pull_request: paths-ignore: - - '**/README.md' + - "**/README.md" merge_group: # Do not cancel this workflow on main. See https://github.com/open-telemetry/opentelemetry-collector-contrib/pull/16616 @@ -23,7 +23,7 @@ env: jobs: prometheus-compliance-tests: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 if: ${{ github.actor != 'dependabot[bot]' }} steps: - uses: actions/checkout@v4 @@ -31,7 +31,7 @@ jobs: path: opentelemetry-collector-contrib - uses: actions/setup-go@v5 with: - go-version: "1.21.10" + go-version: "1.22.8" cache: false - name: Cache Go id: go-cache @@ -42,7 +42,10 @@ jobs: ~/go/bin ~/go/pkg/mod ~/.cache/go-build + ./.tools key: prometheus-${{ runner.os }}-go-${{ hashFiles('**/go.mod', '**/go.sum') }} + - run: make genotelcontribcol + working-directory: opentelemetry-collector-contrib - run: make otelcontribcol working-directory: opentelemetry-collector-contrib - name: Checkout compliance repo @@ -53,7 +56,12 @@ jobs: - name: Copy binary to compliance directory # The required name of the downloaded artifact is `otelcol_0.42.0_linux_amd64`, so we place the collector contrib artifact under the same name in the bin folder to run. # Source: https://github.com/prometheus/compliance/blob/12cbdf92abf7737531871ab7620a2de965fc5382/remote_write_sender/targets/otel.go#L8 - run: mkdir compliance/remote_write_sender/bin && cp opentelemetry-collector-contrib/bin/otelcontribcol_linux_amd64 compliance/remote_write_sender/bin/otelcol_0.42.0_linux_amd64 + run: mkdir compliance/remotewrite/sender/bin && cp opentelemetry-collector-contrib/bin/otelcontribcol_linux_amd64 compliance/remotewrite/sender/bin/otelcol_0.42.0_linux_amd64 + - name: clean up mod file + run: go mod tidy + working-directory: compliance/remotewrite/sender - name: Run compliance tests - run: go test -v --tags=compliance -run "TestRemoteWrite/otel/.+" ./ |& tee ./test-report.txt - working-directory: compliance/remote_write_sender + run: | + set -o pipefail && \ + go test -v --tags=compliance -run "TestRemoteWrite/otel/.+" ./ |& tee ./test-report.txt + working-directory: compliance/remotewrite/sender diff --git a/.github/workflows/scripts/add-labels.sh b/.github/workflows/scripts/add-labels.sh index 93d081abaa45..79b123e8579d 100755 --- a/.github/workflows/scripts/add-labels.sh +++ b/.github/workflows/scripts/add-labels.sh @@ -20,18 +20,31 @@ if [[ ${COMMENT:0:6} != "/label" ]]; then fi declare -A COMMON_LABELS +COMMON_LABELS["arm64"]="arm64" COMMON_LABELS["good-first-issue"]="good first issue" COMMON_LABELS["help-wanted"]="help wanted" COMMON_LABELS["needs-discussion"]="needs discussion" COMMON_LABELS["needs-triage"]="needs triage" +COMMON_LABELS["os:mac"]="os:mac" +COMMON_LABELS["os:windows"]="os:windows" COMMON_LABELS["waiting-for-author"]="waiting for author" +COMMON_LABELS["waiting-for-code-owners"]="waiting-for-code-owners" +COMMON_LABELS["bug"]="bug" +COMMON_LABELS["priority:p0"]="priority:p0" +COMMON_LABELS["priority:p1"]="priority:p1" +COMMON_LABELS["priority:p2"]="priority:p2" +COMMON_LABELS["priority:p3"]="priority:p3" +COMMON_LABELS["stale"]="Stale" +COMMON_LABELS["never-stale"]="never stale" LABELS=$(echo "${COMMENT}" | sed -E 's%^/label%%') for LABEL_REQ in ${LABELS}; do LABEL=$(echo "${LABEL_REQ}" | sed -E s/^[+-]?//) - SHOULD_ADD=true + # Trim newlines from label that would cause matching to fail + LABEL=$(echo "${LABEL}" | tr -d '\n') + SHOULD_ADD=true if [[ "${LABEL_REQ:0:1}" = "-" ]]; then SHOULD_ADD=false fi diff --git a/.github/workflows/scripts/check-collector-module-version.sh b/.github/workflows/scripts/check-collector-module-version.sh index 1dc98d1e8d09..c9e479a08929 100755 --- a/.github/workflows/scripts/check-collector-module-version.sh +++ b/.github/workflows/scripts/check-collector-module-version.sh @@ -45,7 +45,7 @@ check_collector_versions_correct() { done } -MAIN_MOD_FILE="./go.mod" +MAIN_MOD_FILE="./cmd/otelcontribcol/go.mod" BETA_MODULE="go.opentelemetry.io/collector" diff --git a/.github/workflows/scripts/generate-weekly-report.js b/.github/workflows/scripts/generate-weekly-report.js index 45b463357f65..f496418e6997 100644 --- a/.github/workflows/scripts/generate-weekly-report.js +++ b/.github/workflows/scripts/generate-weekly-report.js @@ -114,6 +114,10 @@ async function getIssuesData({octokit, context}) { filterPrs: true, alias: "issuesSponsorNeeded", }, + "waiting-for-code-owners": { + filterPrs: false, + alias: "issuesCodeOwnerNeeded", + } }; const issuesNew = await getNewIssues({octokit, context}); @@ -151,6 +155,11 @@ async function getIssuesData({octokit, context}) { count: 0, data: [] }, + issuesCodeOwnerNeeded: { + title: "Issues and PRs that need code owner review", + count: 0, + data: [] + } } // add new issues @@ -181,6 +190,24 @@ async function getIssuesData({octokit, context}) { return stats } +function generateComponentsLookingForOwnersReportSection(lookingForOwners) { + let count = 0 + let section = [] + + // NOTE: the newline after is required for markdown to render correctly + section.push(`
+ Components \n`); + for (const components of Object.values(lookingForOwners)) { + count += Object.keys(components).length + for (const [componentName, metadatafilePath] of Object.entries(components)) { + section.push(`- [ ] [${componentName}](${path.join("../blob/main/", path.dirname(metadatafilePath))}) `) + } + } + + section.push(`
`) + return {count, section} +} + function generateReport({ issuesData, previousReport, componentData }) { const out = [ `## Format`, @@ -219,9 +246,10 @@ function generateReport({ issuesData, previousReport, componentData }) { // generate report for components out.push('\n## Components Report', '
    '); - for (const lbl of Object.keys(componentData)) { + var {byStatus, lookingForOwners} = componentData + for (const lbl of Object.keys(byStatus)) { const section = [``]; - const data = componentData[lbl]; + const data = byStatus[lbl]; const count = Object.keys(data).length; section.push(`
  • ${lbl}: ${count}`); @@ -238,6 +266,11 @@ function generateReport({ issuesData, previousReport, componentData }) { section.push('
  • '); out.push(section.join('\n')); } + + let {count, section} = generateComponentsLookingForOwnersReportSection(lookingForOwners) + out.push(`
  • Seeking new code owners: ${count}`) + out.push(...section) + out.push('
  • ') out.push('
'); const report = out.join('\n'); @@ -285,7 +318,8 @@ function parseJsonFromText(text) { // Parse the found string to JSON return JSON.parse(match[1]); } else { - throw new Error("JSON data not found"); + debug({msg: "No JSON found in previous issue"}) + return null } } @@ -377,37 +411,43 @@ function processFiles(files) { } const processStatusResults = (results) => { - const filteredResults = {}; - + const byStatus = {}; + const lookingForOwners = {}; for (const component in results) { for (const name in results[component]) { const { path, data } = results[component][name]; - if (data && data.status && data.status.stability) { + if (data && data.status) { + if (data.status.stability) { const { stability } = data.status; const statuses = ['unmaintained', 'deprecated']; for (const status of statuses) { if (stability[status] && stability[status].length > 0) { - if (!filteredResults[status]) { - filteredResults[status] = {}; + if (!byStatus[status]) { + byStatus[status] = {}; } - filteredResults[status][name] = { path, stability: data.status.stability, component }; + byStatus[status][name] = { path, stability: data.status.stability, component }; } } + } + if (data.status.codeowners && data.status.codeowners.seeking_new) { + if (!(component in lookingForOwners)) { + lookingForOwners[component] = {} + } + lookingForOwners[component][name] = path + } } } } - return filteredResults; + return {byStatus, lookingForOwners}; }; async function processComponents() { const results = findFilesByName(`.`, 'metadata.yaml'); const resultsClean = processFiles(results) - const resultsWithStability = processStatusResults(resultsClean) - return resultsWithStability - + return processStatusResults(resultsClean) } async function main({ github, context }) { diff --git a/.github/workflows/scripts/is_changed_file_windows.sh b/.github/workflows/scripts/is_changed_file_windows.sh new file mode 100755 index 000000000000..e1f7276e79ad --- /dev/null +++ b/.github/workflows/scripts/is_changed_file_windows.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash + +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +# +# verifies if any changed file is related to windows architecture. +# this script is used to determine if e2e tests should be run on windows. +# +# It's intended to be used in a GitHub Actions workflow: +# bash .github/workflows/scripts/is_changed_file_windows.sh ${{ github.event.pull_request.base.sha }} ${{ github.sha }} + + +# Get changed files +base_sha=$1 +head_sha=$2 +changed_files=$(git diff --name-only $base_sha $head_sha) + +# Find windows related files +windows_files=$(find * -regex ".*windows.*.go") + + +# Loop over changed files and check if they exist in windows_files +found_windows_file=false +for file in $changed_files; do + for windows_file in $windows_files; do + if [[ $file == "$windows_file" ]]; then + found_windows_file=true + break + fi + done +done + +echo "$found_windows_file" \ No newline at end of file diff --git a/.github/workflows/scripts/ping-codeowners-issues.sh b/.github/workflows/scripts/ping-codeowners-issues.sh index a9ce7a875cbe..45b078062214 100755 --- a/.github/workflows/scripts/ping-codeowners-issues.sh +++ b/.github/workflows/scripts/ping-codeowners-issues.sh @@ -20,4 +20,4 @@ if [[ -z "${OWNERS}" ]]; then exit 0 fi -gh issue comment "${ISSUE}" --body "Pinging code owners for ${COMPONENT}: ${OWNERS}. See [Adding Labels via Comments](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#adding-labels-via-comments) if you do not have permissions to add labels yourself." +gh issue comment "${ISSUE}" --body "Pinging code owners for ${COMPONENT}: ${OWNERS}. See [Adding Labels via Comments](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#adding-labels-via-comments) if you do not have permissions to add labels yourself. For example, comment '/label priority:p2 -needs-triaged' to set the priority and remove the needs-triaged label." diff --git a/.github/workflows/scripts/ping-codeowners-on-new-issue.sh b/.github/workflows/scripts/ping-codeowners-on-new-issue.sh index 355fe14e171b..6c1ae4d3c3b6 100755 --- a/.github/workflows/scripts/ping-codeowners-on-new-issue.sh +++ b/.github/workflows/scripts/ping-codeowners-on-new-issue.sh @@ -30,7 +30,7 @@ fi if [[ -n "${TITLE_COMPONENT}" && ! ("${TITLE_COMPONENT}" =~ " ") ]]; then CODEOWNERS=$(COMPONENT="${TITLE_COMPONENT}" "${CUR_DIRECTORY}/get-codeowners.sh" || true) - if [[ -n "${CODEOWNERS}" && ! ("${CODEOWNERS}" =~ ${OPENER}) ]]; then + if [[ -n "${CODEOWNERS}" ]]; then PING_LINES+="- ${TITLE_COMPONENT}: ${CODEOWNERS}\n" PINGED_COMPONENTS["${TITLE_COMPONENT}"]=1 diff --git a/.github/workflows/scripts/release-prepare-release.sh b/.github/workflows/scripts/release-prepare-release.sh index 23f349b28f1e..4f6ebb155aec 100755 --- a/.github/workflows/scripts/release-prepare-release.sh +++ b/.github/workflows/scripts/release-prepare-release.sh @@ -16,6 +16,9 @@ then exit 1 fi +# Expand CURRENT_BETA to escape . character by using [.] +CURRENT_BETA_ESCAPED=${CURRENT_BETA//./[.]} + make chlog-update VERSION="v${CANDIDATE_BETA}" git config user.name opentelemetrybot git config user.email 107717825+opentelemetrybot@users.noreply.github.com @@ -25,15 +28,15 @@ git checkout -b "${BRANCH}" git add --all git commit -m "changelog update ${CANDIDATE_BETA}" -sed -i.bak "s/${CURRENT_BETA}/${CANDIDATE_BETA}/g" versions.yaml +sed -i.bak "s/${CURRENT_BETA_ESCAPED}/${CANDIDATE_BETA}/g" versions.yaml find . -name "*.bak" -type f -delete git add versions.yaml git commit -m "update version.yaml ${CANDIDATE_BETA}" -sed -i.bak "s/v${CURRENT_BETA}/v${CANDIDATE_BETA}/g" ./cmd/oteltestbedcol/builder-config.yaml -sed -i.bak "s/v${CURRENT_BETA}/v${CANDIDATE_BETA}/g" ./cmd/otelcontribcol/builder-config.yaml -sed -i.bak "s/${CURRENT_BETA}-dev/${CANDIDATE_BETA}-dev/g" ./cmd/otelcontribcol/builder-config.yaml -sed -i.bak "s/${CURRENT_BETA}-dev/${CANDIDATE_BETA}-dev/g" ./cmd/oteltestbedcol/builder-config.yaml +sed -i.bak "s/v${CURRENT_BETA_ESCAPED}/v${CANDIDATE_BETA}/g" ./cmd/oteltestbedcol/builder-config.yaml +sed -i.bak "s/v${CURRENT_BETA_ESCAPED}/v${CANDIDATE_BETA}/g" ./cmd/otelcontribcol/builder-config.yaml +sed -i.bak "s/${CURRENT_BETA_ESCAPED}-dev/${CANDIDATE_BETA}-dev/g" ./cmd/otelcontribcol/builder-config.yaml +sed -i.bak "s/${CURRENT_BETA_ESCAPED}-dev/${CANDIDATE_BETA}-dev/g" ./cmd/oteltestbedcol/builder-config.yaml find . -name "*.bak" -type f -delete make genotelcontribcol @@ -64,7 +67,7 @@ git push origin "${BRANCH}" gh pr create --title "[chore] Prepare release ${CANDIDATE_BETA}" --body " The following commands were run to prepare this release: - make chlog-update VERSION=v${CANDIDATE_BETA} -- sed -i.bak s/${CURRENT_BETA}/${CANDIDATE_BETA}/g versions.yaml +- sed -i.bak s/${CURRENT_BETA_ESCAPED}/${CANDIDATE_BETA}/g versions.yaml - make multimod-prerelease - make multimod-sync " diff --git a/.github/workflows/scripts/setup_e2e_tests.sh b/.github/workflows/scripts/setup_e2e_tests.sh index cd1d077b946f..e56fa174377c 100755 --- a/.github/workflows/scripts/setup_e2e_tests.sh +++ b/.github/workflows/scripts/setup_e2e_tests.sh @@ -4,20 +4,21 @@ # SPDX-License-Identifier: Apache-2.0 TESTS="$(make -s -C testbed list-tests | xargs echo|sed 's/ /|/g')" -TESTS=("${TESTS//|/ }") +IFS='|' read -r -a TEST_ARRAY <<< "$TESTS" + MATRIX="{\"include\":[" curr="" -for i in "${!TESTS[@]}"; do -if (( i > 0 && i % 2 == 0 )); then - curr+="|${TESTS[$i]}" -else +for i in "${!TEST_ARRAY[@]}"; do + if (( i > 0 && i % 2 == 0 )); then + curr+="|${TEST_ARRAY[$i]}" + else if [ -n "$curr" ] && (( i>1 )); then - MATRIX+=",{\"test\":\"$curr\"}" + MATRIX+=",{\"test\":\"$curr\"}" elif [ -n "$curr" ]; then - MATRIX+="{\"test\":\"$curr\"}" + MATRIX+="{\"test\":\"$curr\"}" fi - curr="${TESTS[$i]}" -fi + curr="${TEST_ARRAY[$i]}" + fi done MATRIX+=",{\"test\":\"$curr\"}]}" echo "loadtest_matrix=$MATRIX" >> "$GITHUB_OUTPUT" diff --git a/.github/workflows/scripts/verify-dist-files-exist.sh b/.github/workflows/scripts/verify-dist-files-exist.sh index 4db111a94c7a..06b07e8e4bca 100755 --- a/.github/workflows/scripts/verify-dist-files-exist.sh +++ b/.github/workflows/scripts/verify-dist-files-exist.sh @@ -11,14 +11,6 @@ files=( bin/otelcontribcol_linux_amd64 bin/otelcontribcol_linux_s390x bin/otelcontribcol_windows_amd64.exe - dist/otel-contrib-collector-*.aarch64.rpm - dist/otel-contrib-collector_*_amd64.deb - dist/otel-contrib-collector-*.x86_64.rpm - dist/otel-contrib-collector_*_arm64.deb - dist/otel-contrib-collector-*.ppc64le.rpm - dist/otel-contrib-collector_*_ppc64le.deb - dist/otel-contrib-collector_*_s390x.deb - dist/otel-contrib-collector-*.s390x.rpm # skip. See https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/10113 # dist/otel-contrib-collector-*amd64.msi diff --git a/.github/workflows/scripts/win-required-ports.ps1 b/.github/workflows/scripts/win-required-ports.ps1 new file mode 100644 index 000000000000..ef209792de8d --- /dev/null +++ b/.github/workflows/scripts/win-required-ports.ps1 @@ -0,0 +1,20 @@ +<# +.SYNOPSIS + This script ensures that the ports required by the default configuration of the collector are available. +.DESCRIPTION + Certain runs on GitHub Actions sometimes have ports required by the default configuration reserved by other + applications via the WinNAT service. +#> + +#Requires -RunAsAdministrator + +netsh interface ip show excludedportrange protocol=tcp + +Stop-Service winnat + +# Only port in the dynamic range that is being, from time to time, reserved by other applications. +netsh interface ip add excludedportrange protocol=tcp startport=55678 numberofports=2 + +Start-Service winnat + +netsh interface ip show excludedportrange protocol=tcp diff --git a/.github/workflows/shellcheck.yaml b/.github/workflows/shellcheck.yaml index ddcf071147b2..711610bc60a2 100644 --- a/.github/workflows/shellcheck.yaml +++ b/.github/workflows/shellcheck.yaml @@ -9,7 +9,7 @@ permissions: {} jobs: shellcheck: name: shellcheck - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 env: VERSION: v0.10.0 steps: diff --git a/.github/workflows/telemetrygen.yml b/.github/workflows/telemetrygen.yml index 8dee79047409..b80245e3c62f 100644 --- a/.github/workflows/telemetrygen.yml +++ b/.github/workflows/telemetrygen.yml @@ -1,15 +1,15 @@ name: telemetrygen on: push: - branches: [ main ] + branches: [main] tags: - - 'v[0-9]+.[0-9]+.[0-9]+*' + - "v[0-9]+.[0-9]+.[0-9]+*" paths-ignore: - - '**/README.md' + - "**/README.md" merge_group: pull_request: paths-ignore: - - '**/README.md' + - "**/README.md" env: # Make sure to exit early if cache segment download times out after 2 minutes. # We limit cache download as a whole to 5 minutes. @@ -22,13 +22,13 @@ concurrency: jobs: build-dev: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 if: ${{ github.actor != 'dependabot[bot]' }} steps: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.21.10" + go-version: "1.22.8" cache: false - name: Cache Go id: go-cache @@ -51,7 +51,7 @@ jobs: GOOS=linux GOARCH=s390x make telemetrygen cp bin/telemetrygen_* cmd/telemetrygen/ - name: Build telemetrygen - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v6 with: context: cmd/telemetrygen push: false @@ -59,7 +59,7 @@ jobs: platforms: linux/amd64,linux/arm64,linux/s390x,linux/ppc64le publish-latest: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 if: (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v')) && github.repository == 'open-telemetry/opentelemetry-collector-contrib' permissions: packages: write @@ -67,7 +67,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.21.10" + go-version: "1.22.8" cache: false - name: Cache Go id: go-cache @@ -96,7 +96,7 @@ jobs: GOOS=linux GOARCH=s390x make telemetrygen cp bin/telemetrygen_* cmd/telemetrygen/ - name: Push telemetrygen to Github packages - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v6 with: context: cmd/telemetrygen push: true @@ -104,7 +104,7 @@ jobs: platforms: linux/amd64,linux/arm64,linux/s390x,linux/ppc64le publish-stable: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 if: startsWith(github.ref, 'refs/tags/v') && github.repository == 'open-telemetry/opentelemetry-collector-contrib' permissions: packages: write @@ -112,7 +112,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.21.10" + go-version: "1.22.8" cache: false - name: Cache Go id: go-cache @@ -144,7 +144,7 @@ jobs: GOOS=linux GOARCH=s390x make telemetrygen cp bin/telemetrygen_* cmd/telemetrygen/ - name: Push telemetrygen to Github packages - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v6 with: context: cmd/telemetrygen push: true diff --git a/.github/workflows/tidy-dependencies.yml b/.github/workflows/tidy-dependencies.yml index 69078cd4587b..a35e5c882ed1 100644 --- a/.github/workflows/tidy-dependencies.yml +++ b/.github/workflows/tidy-dependencies.yml @@ -13,7 +13,7 @@ env: jobs: setup-environment: timeout-minutes: 30 - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 if: ${{ !contains(github.event.pull_request.labels.*.name, 'dependency-major-update') && (github.actor == 'renovate[bot]' || contains(github.event.pull_request.labels.*.name, 'renovatebot')) }} steps: - uses: actions/checkout@v4 @@ -21,7 +21,7 @@ jobs: ref: ${{ github.head_ref }} - uses: actions/setup-go@v5 with: - go-version: "1.21.10" + go-version: "1.22.8" cache: false - name: Cache Go id: go-cache diff --git a/.gitignore b/.gitignore index 52616038f614..3d8526e84e35 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,9 @@ vendor/ .vscode *.code-workspace +# Project IDX +.idx/ + # Binaries for programs and plugins *.exe *.exe~ @@ -26,6 +29,7 @@ dist/ # Miscellaneous files *.sw[op] *.DS_Store +__debug_bin* # Coverage coverage/* diff --git a/.golangci.yml b/.golangci.yml index 2308439b1d13..8951500c9f83 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -80,13 +80,8 @@ linters-settings: revive: # minimal confidence for issues, default is 0.8 min-confidence: 0.8 - - gofmt: - # simplify code: gofmt with `-s` option, true by default - simplify: true - rewrite-rules: - - pattern: interface{} - replacement: any + rules: + - name: use-any goimports: # put imports beginning with prefix after 3rd-party packages; @@ -132,12 +127,22 @@ linters-settings: predeclared: ignore: copy - gosec: - excludes: - # https://github.com/golangci/golangci-lint/issues/4735 - - G601 - # https://github.com/golangci/golangci-lint/issues/4735 - - G113 + testifylint: + disable: + - float-compare + - require-error + - suite-subtest-run + - encoded-compare # has false positives that cannot be fixed with testifylint-fix + enable-all: true + thelper: + test: + begin: false + benchmark: + begin: false + tb: + begin: false + fuzz: + begin: false linters: enable: @@ -149,7 +154,7 @@ linters: - exhaustive - gci - gocritic - - gofmt + - gofumpt - goimports - gosec - govet @@ -159,10 +164,14 @@ linters: - revive - staticcheck - tenv + - testifylint + - thelper - unconvert - unparam - unused + - usestdlibvars - wastedassign + - whitespace issues: # Excluding configuration per-path, per-linter, per-text and per-source @@ -174,6 +183,3 @@ issues: - text: "G402:" linters: - gosec - - text: "SA1019: \"github.com/open-telemetry/opentelemetry-collector-contrib/cmd/configschema" - linters: - - staticcheck diff --git a/CHANGELOG-API.md b/CHANGELOG-API.md index a24cecdcae52..f1f6c379a64c 100644 --- a/CHANGELOG-API.md +++ b/CHANGELOG-API.md @@ -7,6 +7,174 @@ If you are looking for user-facing changes, check out [CHANGELOG.md](./CHANGELOG +## v0.116.0 + +### 🚩 Deprecations 🚩 + +- `routingprocessor`: Deprecated in favor of the routing connector. (#36616) + +### 💡 Enhancements 💡 + +- `pkg/ottl`: Add the `ottl.ParserCollection` utility to help handling parsers for multiple OTTL contexts (#29017) + The `ottl.ParserCollection` groups contexts' `ottl.Parser`s, choosing the suitable one + to parse a given statement. It supports context inference using the given statements, + and allows prepending the context name to the statements' paths. + + +## v0.115.0 + +### 🛑 Breaking changes 🛑 + +- `pkg/datadog`: Refactor the API that provides metrics translator (#36474) + This is API change only and does not affect end users + +## v0.114.0 + +### 🛑 Breaking changes 🛑 + +- `pkg/stanza`: Changed signature of `emit.Callback` function in `pkg/stanza/fileconsumer/emit` package by introducing `emit.Token` struct that encapsulates the token's body and attributes. (#36260) + +### 💡 Enhancements 💡 + +- `pkg/datadog`: Expose an API `TranslatorFromConfig` that creates a new metrics translator (#36300) + This is only code refactor and has no user-facing impact + +## v0.113.0 + +### 🛑 Breaking changes 🛑 + +- `testbed`: `scenarios.createConfigYaml()` and `utils.CreateConfigYaml()` functions now take processor configs as a struct slice argument instead of `map[string]string`. (#33003) + - This is to preserve processor order. `ProcessorNameAndConfigBody` is the newly created struct. + + +### 💡 Enhancements 💡 + +- `receiver/prometheusremotewrite`: Implement body unmarshaling for Prometheus Remote Write requests (#35624) + Warning - The HTTP Server still doesn't do anything. It's just a placeholder for now. + +## v0.112.0 + +### 🛑 Breaking changes 🛑 + +- `pkg/translator/jaeger`: Remove error from method signature as it always returns nil (#35560) + +### 🚀 New components 🚀 + +- `pkg/status`: Refactors the extension/healthcheckv2extension/internal/status into pkg/status (#34692) + +### 💡 Enhancements 💡 + +- `pkg/translator/prometheusremotewrite`: add FromMetricsV2 (#33661) + The public function is partially implemented and not ready for use +- `receiver/prometheusremotewrite`: Add HTTP Server to handler Prometheus Remote Write requests (#35535) + Warning - The HTTP Server still doesn't do anything. It's just a placeholder for now. + +## v0.111.0 + +### 💡 Enhancements 💡 + +- `opampsupervisor`: Pass config structure instead of file path when using NewSupervisor function (#34379) + +## v0.110.0 + +### 🛑 Breaking changes 🛑 + +- `all`: TimeoutSettings/QueueSettings fields in various Config structs are no longer embedded (#35158) + Structs in which .TimeoutSettings is no longer embedded: + * carbonexporter.Config + * googlecloudpubsubreceiver.Config + Structs in which .TimeoutSettings and .QueueSettings are no longer embedded: + * alertmanagerexporter.Config + * googlecloudexporter.Config + * googlemanagedprometheusexporter.Config + * otelarrowexporter.Config + + +### 🚩 Deprecations 🚩 + +- `datadogexporter`: The datadog exporter config has been deprecated in favor of the new `datadog/config` package. The new package is shared between the Datadog exporter and the Datadog Connector. + (#35067) + The new `datadog/config` package is a shared module for Datadog exporter configuration. The module is shared between the Datadog exporter and the Datadog Connector. + + +### 💡 Enhancements 💡 + +- `pkg/datadog`: Create a new module for Datadog exporter configuration. + (#35067) + This change introduces a new module for Datadog exporter configuration. The module is shared between the Datadog exporter and the Datadog Connector. + +- `kafkaexporter`: Add option to supply destination topic through context. (#34503, #34432) + +## v0.109.0 + +### 🛑 Breaking changes 🛑 + +- `pkg/ottl`: Change the OTTL grammar to support expressing statements context via path names (#29017) + The `ottl.Path` interface requires a new method: `Context() string` +- `prometheusreceiver`: Move the TargetAllocator configuration struct to an internal directory (#33146) + +### 💡 Enhancements 💡 + +- `pkg/ottl`: Add support for localized time parsing into the coreinternal/timeutils (#32977) +- `googlecloudmonitoringreceiver`: Enhancing the Google Cloud monitoring receiver to establish a client connection, scrape GCP Cloud Metrics, and transform them into an OpenTelemetry compatible format for pipeline processing. (#33762) + - Implements client connection to Google Cloud Monitoring API. + - Scrapes timeseries data based on configured metrics. + - Converts the data into OpenTelemetry format for use in the pipeline. + + +## v0.108.0 + +### 🛑 Breaking changes 🛑 + +- `pkg/stanza/operator/input/windows`: Change type name from `EvtRpcLogin` to `EvtRPCLogin`. (#34656) + +## v0.107.0 + +### 🚀 New components 🚀 + +- `googlecloudmonitoringreceiver`: Adding new component - [Google Cloud monitoring](https://cloud.google.com/monitoring/api/metrics_gcp) receiver to fetch GCP Cloud Metrics and transform to OpenTelemetry compatible format. (#33762) + +### 💡 Enhancements 💡 + +- `internal/grpcutil`: Add internal/grpcutil package with gRPC-specified timeout parsing (#33688) +- `pmetrictest`: Add support for histogram comparison options (#34521) +- `kafkaexporter`: add an ability to partition logs based on resource attributes. (#33229) + +## v0.106.1 + +## v0.106.0 + +## v0.105.0 + +## v0.104.0 + +### 🛑 Breaking changes 🛑 + +- `exporter/clickhouse`: Unexport extra configuration methods. (#33647) +- `exporter/clickhouse`: Change internal config type for `create_schema` to use a `bool` instead of `*bool` (#33694) +- `pkg/ottl`: Changed ScopeContext, InstrumentationResourceContext, TransformContext interfaces to make SchemaURL accessible in resources and scopes on all signals (#30229) + +### 💡 Enhancements 💡 + +- `pkg/ottl`: Add ByteSliceLikeGetter interface (#31929) + +## v0.103.0 + +### 🛑 Breaking changes 🛑 + +- `stanza`: remove deprecated code (#33519) + This change removes: + - adapter.LogEmitter, use helper.LogEmitter instead + - adapter.NewLogEmitter, use helper.NewLogEmitter instead + - fileconsumer.Manager's SugaredLogger struct member + - pipeline.DirectedPipeline's SugaredLogger struct member + - testutil.Logger, use zaptest.NewLogger instead + + +### 💡 Enhancements 💡 + +- `pkg/winperfcounters`: It is now possible to force a `watcher` to re-create the PDH query of a given counter via the `Reset()` function. (#32798) + ## v0.102.0 ### 💡 Enhancements 💡 diff --git a/CHANGELOG.md b/CHANGELOG.md index e8ee1bb34c55..aec13c355aae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,1401 @@ If you are looking for developer-facing changes, check out [CHANGELOG-API.md](./ +## v0.116.0 + +### 🛑 Breaking changes 🛑 + +- `jsonlogencodingextension`: Change how logs are marshaled. Instead of marshaling just the first log, marshal all logs into a JSON array. (#34064) +- `githubreceiver`: Update metric names to match VCS Metric Semantic Conventions and scraper key name. (#36714) + * Change the `github` scraper key to `scraper` + * Add `vcs.repository.url.full` attribute + * Change attribute `repository.name` to `vcs.repository.name` + * Change attribute `ref.name` to `vcs.ref.head.name` + * Change attribute `ref.type` to `vcs.ref.head.type` + * Change attribute `change.state` to `vcs.change.state` + * Add attribute `vcs.revision_delta.direction` with `ahead` and `behind` values + * Change metric `vcs.repository.ref.revisions_ahead` to `vcs.ref.revisions_delta` with `vcs.revision_delta.direction=ahead` + * Change metric `vcs.repository.ref.revisions_behind` to `vcs.ref.revisions_delta` with `vcs.revision_delta.direction=behind` + * Change metric `vcs.repository.ref.count` to `vcs.ref.count` + * Change metric `vcs.repository.ref.time` to `vcs.ref.time` + * Add attribute `vcs.line_change.type` with `added` and `removed` values + * Change metric `vcs.repository.ref.lines_added` to `vcs.ref.lines_delta` with `vcs.line_change.type=added` + * Change metric `vcs.repository.ref.lines_removed` to `vcs.ref.lines_delta` with `vcs.line_change.type=removed` + * Change metric `vcs.repository.contributor.count` to `vcs.contributor.count` + * Change metric `vcs.repository.change.time_open` to `vcs.change.duration` with `vcs.change.state=open` + * Change metric `vcs.repository.change.time_to_approval` to `vcs.change.time_to_approval` + * Change metric `vcs.repository.change.time_to_merge` to `vcs.change.time_to_merge` + * Change metric `vcs.repository.change.count` to `vcs.change.count` + +- `processor/tailsampling`: Reverts #33671, allowing for composite policies to specify inverted clauses in conjunction with other policies. This is a change bringing the previous state into place, breaking users who rely on what was introduced as part of #33671. (#34085) + +### 🚩 Deprecations 🚩 + +- `connector/routing`: Deprecate `match_once` parameter. (#29882) +- `routingprocessor`: Deprecated in favor of the routing connector. (#36616) +- `splunkhecexporter`: Add `otel_attrs_to_hec_metadata/*` config fields to replace `hec_metadata_to_otel_attrs/*` fields. (#35092) + `otel_attrs_to_hec_metadata/*` config fields will replace the `hec_metadata_to_otel_attrs/*` fields in a later release. + +- `kineticaexporter`: The kineticaexporter is now Unmaintained as it has no active code owners from the vendor (#36808) + +### 🚀 New components 🚀 + +- `dorisexporter`: Mark the Doris exporter as Alpha. (#33479) +- `libhoneyreceiver`: Introduce the scaffolding of a new component, libhoneyreceiver (#36693) + +### 💡 Enhancements 💡 + +- `purefareceiver`: Implements support for scraping Pure Storage FlashArray with Purity version 6.6.11+ (#36251) +- `azureeventhubreceiver`: support providing one or more time formats for timestamp parsing (#36650) +- `googlecloudmonitoringreceiver`: Add metric-specific labels to googlecloudmonitoringreceiver component (#35711) +- `awss3receiver`: Add support RFC3339 format for starttime and endtime (#36787) +- `awsxrayexporter`: Generate url section in xray segment when `net.peer.name` is available (#35375) +- `clickhouseexporter`: Exporter now sorts attribute maps' keys during INSERT, yielding better compression and predictable aggregates (#33634) +- `datadogconnector`: Flip configs `traces::compute_stats_by_span_kind`, `traces::peer_tags_aggregation` and `traces::peer_service_aggregation` to true by default (#35969) + This enables Datadog APM stats on peer tags by default and is a backwards-compatible change. Read more on https://docs.datadoghq.com/tracing/guide/inferred-service-opt-in/. +- `datadogexporter`: Flip configs `traces::compute_stats_by_span_kind`, `traces::peer_tags_aggregation` and `traces::peer_service_aggregation` to true by default (#35969) + This enables Datadog APM stats on peer tags by default and is a backwards-compatible change. Read more on https://docs.datadoghq.com/tracing/guide/inferred-service-opt-in/. +- `elasticsearchexporter`: Map *.geo.location.{lat,lon} as geo_point field in OTel mode (#36565) + In OTel mapping mode, merge *.geo.location.{lat,lon} to *.geo.location such that they are stored as geo_point in Elasticsearch. +- `fileexporter`: Add support for profiles signal. (#35978) +- `pkg/ottl`: GetXML Converter now supports selecting text, CDATA, and attribute (value) content. (#36821) +- `githubreceiver`: Adds webhook skeleton to GitHub receiver to receive events from GitHub for tracing. (#27460) + This PR adds a skeleton for the GitHub receiver to receive events from GitHub + for tracing via a webhook. The trace portion of this receiver will run and + respond to GET requests for the health check only. + +- `kafkaexporter, kafkareceiver`: Add a new mechanism "AWS_MSK_IAM_OAUTHBEARER" for kafka exporter and kafka receiver. This mechanism use the AWS MSK IAM SASL Signer for Go https://github.com/aws/aws-msk-iam-sasl-signer-go. (#19747) +- `loadbalancingexporter`: Adds a an optional configuration to the k8s resolver which returns hostnames instead of IPs for headless services pointing at statefulsets (#18412) +- `mongodbatlasreceiver`: Adds additional metrics to the MongoDB Atlas receiver (#36525) + Adds a number of new default disabled metrics to the MongoDB Atlas receiver. These metrics are: + - mongodbatlas.disk.partition.queue.depth + - mongodbatlas.disk.partition.throughput + - mongodbatlas.process.cache.ratio + +- `s3exporter`: Upgrading to adopt aws sdk v2 (#36699) +- `opampextension`: Use status subscription for fine granular component health reporting (#35856) +- `pkg/pdatatest`: Add support for Profiles signal comparison. (#36232) +- `receiver/prometheusremotewrite`: Parse labels from Prometheus Remote Write requests into Resource and Metric Attributes. (#35656) + Warning - The HTTP Server still doesn't pass metrics to the next consumer. The component is unusable for now. +- `signaltometrics`: Add config validation and custom OTTL functions (#35930) + Adds config validation for the signal to metrics connector. Also introduces `AdjustedCount` OTTL function. +- `testbed`: Add batcher performance tests (#36206) +- `tesbed`: add options for retry/storage for filelog sender (#36781) + +### 🧰 Bug fixes 🧰 + +- `azuremonitorexporter`: fix bug to remove default config of endpoint which causes failing to parse endpoint correctly. (#36704) +- `receiver/prometheusreceiver`: Metric adjuster no longer assumes that all metrics from a scrape come from the same resource (#36477) +- `connector/datadog, exporter/datadog, pkg/datadog`: throw error if datadog API key contains invalid characters (#36509) +- `parseutils`: Handle escaped quotes when parsing pairs using SplitString. (#36176) +- `exporter/prometheusremotewrite`: Fix exemplar handling when the exemplar is an integer value. (#36657) + Send metrics with exemplars as integer values now are correctly handled. +- `googlecloudmonitoringreceiver`: Fix "no validation found" error if workload is running on Google Cloud Platform (#36607) +- `k8sattributesprocessor`: Override extracted k8s attributes if original value has been empty (#36373) +- `k8sattributesreceiver`: Log any errors encountered during kube client initialisation (#35879) + This addresses an issue where the collector, due to an error encountered during the kubernetes client initialisation, + was reporting an 'unavailable' status via the health check extension without any further information to be found in the logs. + +- `opampextension`: Fix blocking agent shutdown due to unclosed channel (#36764) +- `opampsupervisor`: avoid nil pointer access when reporting the last received remote config (#36850) +- `postgresqlreceiver`: Update the postgresqlreceiver to handle new table schema for the bgwriter metrics in pg17+ (#36784) +- `jaegerreceiver`: Remove ineffectual warning from jaegerreceiver (#35894) +- `datadogexporter`: read response body on pushSketches to allow connection re-use (#36779) +- `sumologicextension`: Skip likely zombie processes on Windows. (#36481) + +## v0.115.0 + +### 🛑 Breaking changes 🛑 + +- `awsfirehosereceiver`: Follow receiver contract based on type of error (#5909) +- `elasticsearchexporter`: Respect `flush::bytes` in sync bulk indexer, `flush::bytes` measures uncompressed size, change default `batcher::max_size_items` to `0` (#36163) + Limit the bulk request size to roughly `flush::bytes` for sync bulk indexer. Sync bulk indexer is used when `batcher::enabled` is either true or false. In order words, sync bulk indexer is not used when batcher config is undefined. Change `flush::bytes` to always measure in uncompressed bytes. Change default `batcher::max_size_items` to `0` as bulk request size limit is now more effectively enforced by `flush::bytes`. +- `k8sattributesprocessor`: Move k8sattr.fieldExtractConfigRegex.disallow feature gate to Beta. (#25128) + Disable the `k8sattr.fieldExtractConfigRegex.disallow` feature gate to get the old behavior. +- `internal`: Remove stable gate `component.UseLocalHostAsDefaultHost` (#36589) +- `cmd/opampsupervisor`: Update default logger output paths to stderr (#36072) + The default output paths for the opamp supervisor logger have been updated to stderr from [stdout, stderr]. + +- `opampsupervisor`: Enable strict unmarshalling of the OpAMP Supervisor config file. An error will now be returned if an invalid config key is set. (#35838) + +### 🚩 Deprecations 🚩 + +- `postgresqlreceiver`: Minimal supported PostgreSQL version updated from 9.6 to 13.0 (#30923) + Aligning on the supported versions as can be seen [in the PostgreSQL releases section](https://www.postgresql.org/support/versioning) +- `exporter/prometheusremotewrite`: Change `exporter.prometheusremotewriteexporter.deprecateCreatedMetric` feature gate from Alpha to Beta version. (#35003) + The `export_created_metric` configuration parameter is now ignored by default. + +### 🚀 New components 🚀 + +- `signaltometricsconnector`: New component for generating metrics from raw signals using user defined OTTL expressions. (#35930) +- `extension/cgroupruntime`: Initial implementation for cgroupruntime extension. (#30289) +- `huaweicloudcesreceiver`: Introduce new receiver fetching data from huawei Cloud Eye Service. (#34953) +- `netflowreceiver`: Introduce the netflow receiver (#32732) + +### 💡 Enhancements 💡 + +- `datadogexporter`: Add a configurable `reporter_period` parameter to the Datadog exporter’s host metadata configuration to allow users to specify the frequency at which host metadata is sent to Datadog. (#36450) +- `awsemfexporter`: Add support for 1 second metric resolution in CloudWatch Embedded Metrics Format based on metric attributes (#29506) +- `awsemfexporter`: Improvement unit conversion during EMF log translation (#35937) +- `sumologicexporter`: adding new products for auto discovery (#35622) +- `postgresqlreceiver`: Added new postgresql metrics to acheive parity with Telegraf (#36528) +- `loadbalancingexporter`: Adding sending_queue, retry_on_failure and timeout settings to loadbalancing exporter configuration (#35378, #16826) + When switching to top-level sending_queue configuration - users should carefully review queue size + In some rare cases setting top-level queue size to n*queueSize might be not enough to prevent data loss + +- `pkg/stanza`: Introduce active file grouping mechanism. (#23787) +- `receivercreator`: Add support for starting receivers/scrapers based on provided annotations' hints for metrics' collection (#34427) +- `tailsamplingprocessor`: Adds decision cache for non-sampled trace IDs (#31583) +- `cmd/opampsupervisor`: Support environment variable expansion in the OpAMP supervisor config. (#36269) +- `pkg/ottl`: Move debug log to `Statement.Execute` so that components using it instead of `StatementSequence` also get debug logs. (#36456) +- `routingconnector`: Add abiilty to route by 'datapoint' context (#36523) +- `signalfxreceiver`: Follow receiver contract based on type of error (#5909) + Use 503 error code for retryable and 400 error code for not-retryable errors instead of responding with a 500 unconditionally. + +### 🧰 Bug fixes 🧰 + +- `cmd/opampsupervisor`: Do not log err if the last received doesn't exist (#36013) +- `receiver/azureeventhub`: When using a storage extension, the component will call Close on the client during component shutdown. This fixes a bug that resulted in a file potentially remaining locked after component shutdown. (#36238) +- `azuremonitorexporter`: Fixes an issue where the Azure Monitor exporter was not sending data to App Insights due to the Telemetry Channel not being flushed. (#35037) +- `exporter/pulsarexporter`: Change configuration option `map_connections_per_broker`, rename to `max_connections_per_broker`. (#36579) +- `failoverconnector`: Resolves a bug that prevents proper recovery when disabling max retries (#36587) +- `googlecloudpubsubexporter`: Fix a goroutine leak during shutdown. (#30438) + A goroutine leak was found in the googlecloudpubsubexporter. + The goroutine leak was caused by the exporter not closing the underlying created gRPC client when using an insecure custom endpoint. + +- `processor/k8sattribute`: fixes parsing of k8s image names to support images with tags and digests. (#36131) +- `clickhouseexporter`: Fix incorrect Resource Attribute `service.name` translation to ClickHouse ServiceName field for Logs Records (#36349) +- `awsfirehosereceiver`: fix timestamp when ingesting logs from CloudWatch through firehose (#36122) +- `pkg/ottl`: Allow indexing []int64, []float64, []bool, and []byte slices (#29441) + It should now be possible to index all slice types +- `opencensusreceiver`: Do not report error message when OpenCensus receiver is shutdown cleanly. (#36622) +- `loadbalancingexporter`: The k8sresolver in loadbalancingexporter was triggering exporter churn in the way the change event was handled. (#35658) +- `vcenterreceiver`: The existing code did not honor TLS settings beyond 'insecure'. All TLS client config should now be honored. (#36482) + +## v0.114.0 + +### 🛑 Breaking changes 🛑 + +- `datadogexporter`: Stop prefixing `http_server_duration`, `http_server_request_size` and `http_server_response_size` with `otelcol` (#36265) + These metrics can be from SDKs rather than collector. Stop prefixing them to be consistent with https://opentelemetry.io/docs/collector/internal-telemetry/#lists-of-internal-metrics +- `otelarrowreceiver`: New admission control metrics are consistent across Arrow and OTLP data paths. (#36334) + `otelcol_otelarrow_admission_in_flight_bytes` new, replaces `otelcol_otel_arrow_receiver_in_flight_bytes` + `otelcol_otelarrow_admission_waiting_bytes`: new, describes waiting requests + `otelcol_otel_arrow_receiver_in_flight_items`: removed + `otelcol_otel_arrow_receiver_in_flight_requests`: removed + + +### 🚩 Deprecations 🚩 + +- `exporter/prometheusremotewrite`: Deprecate configuration option `export_created metric` (#35003) + Disable the exporter.prometheusremotewriteexporter.deprecateCreatedMetric feature gate to temporarily re-enable the created metric. + +### 💡 Enhancements 💡 + +- `datadogreceiver`: Add json handling for the `api/v2/series` endpoint in the datadogreceiver (#36079) +- `googlemanagedprometheus`: Add `CumulativeNormalization` config option to allow users to configure to specify whether to report normalized or un-normalized points. Defaults to normalized. (#36357) +- `elasticsearchexporter`: Translate `k8s.*.name` resource attributes in ECS mode (#36233) + Translate `k8s.job.name`, `k8s.cronjob.name`, `k8s.statefulset.name`, `k8s.replicaset.name`, `k8s.daemonset.name`, `k8s.container.name` to `kubernetes.*.name`. Translate `k8s.cluster.name` to `orchestrator.cluster.name`. +- `encodingextension`: Add support for profiles signal to encodingextension (#36008) +- `k8sattributesprocessor`: Add support for profiles signal (#35983) +- `cmd/githubgen`: Adds a flag to skip checking GitHub organization membership for CODEOWNERS (#36263) +- `container`: Set non root group permissions for container image (#35179) +- `k8sclusterreceiver`: Add support for limiting observed resources to a specific namespace. (#9401) + This change allows to make use of this receiver with `Roles`/`RoleBindings`, as opposed to giving the collector cluster-wide read access. +- `opampextension`: Add content type to opamp extension when reporting EffectiveConfig (#36327) + Add EffectiveConfig.ConfigMap.ConfigMap[*].ContentType as "text/yaml" to the opamp extension when reporting EffectiveConfig. +- `otelarrowreceiver`: Admission control improvements (LIFO); admission.waiter_limit is deprecated, replaced with admission.waiting_limit_mib. (#36074) +- `otelarrowreceiver`: Add a new LIFO-based bounded queue. (#36074) +- `connector/otlpjson`: Throw error on invalid otlp payload. (#35738, #35739) +- `prometheusremotewriteexporter`: reduce allocation when serializing protobuf (#35185) +- `resourcedetectionprocessor`: Introduce support for Profiles signal type. (#35980) +- `routingconnector`: Add ability to route by metric context (#36236) +- `routingconnector`: Add ability to route by span context (#36276) +- `processor/spanprocessor`: Add a new configuration option to keep the original span name when extracting attributes from the span name. (#36120) +- `splunkenterprisereceiver`: Add new metrics for Splunk Enterprise dispatch artifacts caches (#36181) + +### 🧰 Bug fixes 🧰 + +- `pkg/stanza`: Ensure that time parsing happens before entry is sent to downstream operators (#36213) +- `prometheusexporter`: Fixes a race condition between the exporter start and shutdown functions. (#36139) +- `processor/k8sattributes`: Block when starting until the metadata have been synced, to fix that some data couldn't be associated with metadata when the agent was just started. (#32556) +- `exporter/loadbalancing`: Shutdown exporters during collector shutdown. This fixes a memory leak. (#36024) +- `pkg/ottl`: Respect the `depth` option when flattening slices using `flatten` (#36161) + The `depth` option is also now required to be at least `1`. +- `prometheusexporter`: reject metrics whose types have changed, use pre-existing descriptions when help strings change (#28617) +- `pkg/stanza`: Synchronous handling of entries passed from the log emitter to the receiver adapter (#35453) +- `prometheusreceiver`: Fix prometheus receiver to support static scrape config with Target Allocator (#36062) + +## v0.113.0 + +### 🛑 Breaking changes 🛑 + +- `sapmreceiver`: Remove the deprecated access_token_passthrough from SAPM receiver. (#35972) + Please use `include_metadata` instead with the following config option applied to the batch processor: + batch: + metadata_keys: [X-Sf-Token] + +- `pkg/ottl`: Promote `processor.transform.ConvertBetweenSumAndGaugeMetricContext` feature gate to Stable (#36216) + This gate can no longer be disabled. The `convert_sum_to_gauge` and `convert_gauge_to_sum` may now only be used with the `metric` context. + +### 🚩 Deprecations 🚩 + +- `opensearchexporter`: The OpenSearch exporter is now marked as unmaintained and will be removed in 6 months. (#35781) + Any codeowners can reinstate the component by submitting a PR to revert the change or commenting on https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/35781. + + +### 🚀 New components 🚀 + +- `dorisexporter`: metrics implementation (#33479) +- `extensions/observer/cfgardenobserver`: Implemented the observer, the second PR in the 3 PR process for new components (#33618) + +### 💡 Enhancements 💡 + +- `splunkenterprisereceiver`: Add telemetry around the Splunk Enterprise kv-store. (#35445) +- `journaldreceiver`: adds ability to parse journald's MESSAGE field as a string if desired (#36005) +- `journaldreceiver`: allows querying a journald namespace (#36031) +- `hostmetricsreceiver`: Add the system.uptime metric in the hostmetrics receiver (#31627) + This metric is provided by the new `system` scraper. +- `azuredataexplorerexporter`: Add new configuration option `use_default_auth` to enable default authentication for Azure Data Explorer. This option allows users to leverage workload identity for authentication. (#33667) +- `awss3receiver`: Mark the AWS S3 receiver as Alpha. (#30750) +- `opampsupervisor`: Makes the Supervisor's OpAmp server port configurable with 'agent::opamp_server_port'. (#36001) +- `datadogreceiver`: Follow receiver contract based on type of error (#5909) +- `hostmetrics`: Adjust scraper creation to make it so the scraper name is reported with hostmetrics scraper errors. (#35814) +- `pkg/translator/prometheusremotewrite`: `FromMetricsV2` now transforms attributes into labels. (#33661) +- `ntpreceiver`: Move NTP receiver to alpha (#36152) +- `opampsupervisor`: Supervisor waits for configurable healthchecks to report remote config status. (#21079) +- `otelarrowreceiver`: Enable unlimited admission control when request_limit_mib is set to 0. (#36074) +- `pkg/ottl`: Add SliceToMap function (#35256) +- `receiver/prometheusremotewrite`: Implement body unmarshaling for Prometheus Remote Write requests (#35624) + Warning - The HTTP Server still doesn't do anything. It's just a placeholder for now. +- `receiver/prometheusremotewrite`: Implement Content-Type negotiation for Prometheus Remote Write requests (#35565) + Warning - The HTTP Server still doesn't do anything. It's just a placeholder for now. +- `otlpjsonfilereceiver`: Add support for profiles signal (#35977) +- `journaldreceiver`: Restart journalctl if it exits unexpectedly (#35635) +- `routingconnector`: Add ability to route by request metadata. (#19738) +- `exporter/signalfx`: Enabling retrying for dimension properties update without tags in case of 400 response error. (#36044) + Property and tag updates are done using the same API call. After this change, the exporter will retry once to sync + properties in case of 400 response error. + +- `signalfxexporter`: Add more default metrics related to Kubernetes cronjobs, jobs, statefulset, and hpa (#36026) +- `simpleprometheusreceiver`: Support to set `job_name` in config (#31502) +- `solacereceiver`: Add support to the Solace Receiver to convert the new `Move to Dead Message Queue` and new `Delete` spans generated by Solace Event Broker to OTLP. (#36071) +- `routingconnector`: Add ability to route log records individually using OTTL log record context. (#35939) +- `splunkenterprisereceiver`: Add new metrics for Splunk Enterprise dispatch artifacts (#35950) + +### 🧰 Bug fixes 🧰 + +- `awsfirehosereceiver`: make otlp_v1 a valid record type (#35750, #36125) +- `datadogreceiver`: Return a json reponse instead of "OK" when a trace is received with a newer protocol version. (#35705) +- `datadogreceiver`: Changes response message for `/api/v1/check_run` 202 response to be JSON and on par with Datadog API spec (#36027) +- `receiver/windowseventlog`: Fix panic when rendering long event messages. (#36179) +- `hostmetricsreceiver`: Do not set the default value of HOST_PROC_MOUNTINFO to respect root_path (#35990) +- `prometheusexporter`: Fixes an issue where the prometheus exporter would not shut down the server when the collector was stopped. (#35464) +- `k8sobserver`: Enable observation of ingress objects if the `ObserveIngresses` config option is set to true (#35324) +- `pkg/stanza`: Fixed bug causing Operators with DropOnErrorQuiet to send log entries to the next operator. (#35010) + This issue was introduced by a bug fix meant to ensure Silent Operators are not logging errors (#35010). With this fix, + this side effect bug has been resolved. + +- `otelarrowreceiver`: Simplify receiver admission control logic (#36074) +- `otelarrowreceiver`: Avoid breaking telemetry when admission control fails in OTLP handlers. (#36074) +- `dbstorage`: Add postgresql support (#35692) +- `splunkhecreceiver`: Avoid a memory leak by changing how we record obsreports for logs and metrics. (#35294) +- `receiver/filelog`: fix record counting with header (#35869) +- `connector/routing`: Fix detection of duplicate conditions in routing table. (#35962) +- `solacereceiver`: The Solace receiver may unexpectedly terminate on reporting traces when used with a memory limiter processor and under high load (#35958) +- `pkg/stanza/operator`: Retain Operator should propagate the severity field (#35832) + The retain operator should propagate the severity field like it does with timestamps. + +- `pkg/stanza`: Handle error of callback function of `ParserOperator.ProcessWithCallback` (#35769) + `ProcessWithCallback` of `ParserOperator` first calls the `ParseWith` method + which properly handles errors with `HandleEntryError`. + Then the callback function is called and its returned error should also + be handled by the `HandleEntryError` ensuring a consistent experience. + +- `webhookeventreceiver`: Pass the consumer error to EndLogsOp (#35844) + +## v0.112.0 + +### 🛑 Breaking changes 🛑 + +- `elasticsearchexporter`: Enable gzip compression by default (#35865) + To disable compression, set config `compression` to `none`. +- `elasticsearchexporter`: Set body.* for log body in OTel mode (#35771) + Log record body in OTel mapping mode will be stored in body.text, body.structured, body.flattened based on body value type and presence of event.name attribute +- `processor/metricsgeneration`: Remove "experimental_" prefix from metrics generator processor name. (#35426) + +### 🚩 Deprecations 🚩 + +- `sapmreceiver`: Deprecate SAPM receiver (#32125) +- `elasticsearchexporter`: Deprecate retry::max_requests in favor of retry::max_retries (#32344) + retry::max_retries will be exactly retry::max_requests - 1 + +### 🚀 New components 🚀 + +- `confmap/aesprovider`: Initial aes encryption provider. Allows configurations to decrypt secrets using AES encryption. (#35550) +- `systemdreceiver`: Introduce the scaffolding of a new component, systemdreceiver (#33532) +- `ntpreceiver`: Introduce new receiver reporting the offset between the local machine and a NTP server. (#34375) +- `tlscheckreceiver`: Add TLS Check Receiver component to monitor x.509 certificate expiry (#35423) + +### 💡 Enhancements 💡 + +- `awsfirehosereceiver`: Add support for CloudWatch logs (#35077) +- `awsfirehosereceiver`: added OTLP v1 support to Firehose receiver (#34982) +- `awss3receiver`: Add support for monitoring the progress of ingesting data from an S3 bucket via OpAMP custom messages. (#30750) +- `azureeventshubreceiver`: Updates the Azure Event Hub receiver to use the new Resource Logs translator. (#35357) +- `cloudflarereceiver`: Respond 503 on non-permanent and 400 on permanent errors (#35642) +- `elasticsearchexporter`: Add hint in error logs for TSDB version_conflict_engine_exception error (#35546) +- `pkg/ottl`: Add ConvertAttributesToElementsXML Converter (#35328) +- `logdedupprocessor`: Add a `condition` field to the Log DeDuplication Processor. (#35440) +- `opampextension`: Support using auth extensions for authenticating with opamp servers (#35507) +- `azureblobreceiver`: adds support for using azidentity default auth, enabling the use of Azure Managed Identities, e.g. Workload Identities on AKS (#35636) + This change allows to use authentication type "default", which makes the receiver use azidentity default Credentials, + which automatically picks up, identities assigned to e.g. a container or a VirtualMachine + +- `elasticsearchexporter`: Introduce an experimental bodymap mapping mode for logs (#35444) +- `googlecloudexporter`: Google Cloud exporter is marked as mutating. (#35366) +- `googlemanagedprometheusexporter`: GMP exporter is marked as mutating. (#35366) +- `k8sobserver`: Emit endpoint per Pod's container (#35491) +- `mongodbreceiver`: Add support for MongoDB direct connection (#35427) +- `exporter/clickhouse`: Add the ability to override default table names for all metric types. (#34225) + 'metrics_table_name' of the clickhouse exporter config is deprecated and newly introduced parameter 'metrics_tables' should be used instead. + +- `metricsgenerationprocessor`: Introduce functionality to only do metric calculations on data points whose attributes match (#35425) + This functionality can be enabled by the `metricsgeneration.MatchAttributes` feature gate, which is disabled by default. + +- `chronyreceiver`: Move chronyreceiver to beta (#35913) +- `opampextension`: Implement `ReportsHealth` capability in OpAMP extension (#35433) +- `opampextension`: Report OS description semantic convention (`os.description`) as a part of non-identifying agent description. (#35555) +- `otelarrowexporter`: Adjust defaults from https://opentelemetry.io/blog/2024/otel-arrow-production/ experiments. (#35477) +- `pkg/ottl`: Parsing invalid statements and conditions now prints all errors instead of just the first one found. (#35728) +- `pkg/ottl`: Add ParseSimplifiedXML Converter (#35421) +- `receiver/prometheusremotewrite`: Add HTTP Server to handler Prometheus Remote Write requests (#35535) + Warning - The HTTP Server still doesn't do anything. It's just a placeholder for now. +- `rabbitmqexporter`: Allow to configure the name of the AMQP connection in the rabbitmqexporter (#34681) +- `routingconnector`: Allow routing based on OTTL Conditions (#35731) + Each route must contain either a statement or a condition. + +- `sapmreceiver`: Respond 503 on non-permanent and 400 on permanent errors (#35300) +- `opampsupervisor`: Allow collector logs to passthrough to supervisor output to facilitate running in a containerized environment. (#35473) +- `hostmetricsreceiver`: Use HOST_PROC_MOUNTINFO as part of configuration instead of environment variable (#35504) +- `pkg/ottl`: Add ConvertTextToElements Converter (#35364) + +### 🧰 Bug fixes 🧰 + +- `metricstransform`: The previously removed functionality of aggregating against an empty label set is restored. (#34430) +- `datadogreceiver`: Use `Check` name from Service Check structure as metric name rather than hardcoded string `service_check` (#35718) +- `azuredataexplorerexporter`: Fix compression type for Azure Data Explorer exporter by adding the compression type in ingestion properties. (#35353) +- `telemetrygen`: ensure validate is called (#35745) +- `deltatocumulative`: fix meter panic on startup (#35685) + properly constructs the TelemetryBuilder, so it does not panic on startup, rendering the entire component unusable +- `elasticsearchexporter`: Log and drop invalid metrics instead of returning error to avoid upstream retries (#35740) +- `elasticsearchexporter`: Preserve attribute names and metric names on prefix conflict in OTel mapping mode (#35651) + e.g. if there are attributes "a" and "a.b", they should be sent to Elasticsearch as is, instead of "a.value" and "a.b", in OTel mapping mode +- `elasticsearchexporter`: Make OTel mapping mode send to data streams only (#35839) + This prevents auto creating regular indices in OTel mapping mode due to a race condition in Elasticsearch where otel-data index templates are not ready. +- `elasticsearchexporter`: Sanitize datastream routing fields (#34285) + Sanitize the dataset and namespace fields according to https://www.elastic.co/guide/en/ecs/current/ecs-data_stream.html. +- `oidcauthextension`: Fix a goroutine leak during shutdown. (#30438) + A goroutine leak was found in oidcauthextension. The goroutine leak was caused by the oidcauthextension not closing the idle connections in the client and transport. + +- `filelogreceiver`: Supports `add_metadata_from_filepath` for Windows filepaths (#35558) +- `filelogreceiver`: Suppress errors on EBADF when unlocking files. (#35706) + This error is harmless and happens regularly when delete_after_read is set. This is because we acquire the lock right at the start of the ReadToEnd function and then defer the unlock, but that function also performs the delete. So, by the time it returns and the defer runs the file descriptor is no longer valid. +- `kafkareceiver`: Fixes issue causing kafkareceiver to block during Shutdown(). (#30789) +- `hostmetrics receiver`: Fix duplicate filesystem metrics (#34635, #34512) + The hostmetrics exposes duplicate metrics of identical mounts exposed in namespaces. The duplication causes errors in exporters that are sensitive to duplicate metrics. We can safely drop the duplicates as the metrics should be exactly the same. +- `pkg/translator/prometheusremotewrite`: Fix metric comparison func in prom translation layer (#35741) +- `pkg/ottl`: Allow indexing string slice type (#29441) +- `mysqlreceiver`: Add replica metric support for versions of MySQL earlier than 8.0.22. (#35217) +- `stanza/input/windows`: Close remote session while resubscribing (#35577) +- `telemetrygen`: Enable the `--otlp-insecure-skip-verify` flag (#35735) +- `receiver/windowseventlog`: Errors returned when passing data downstream will now be propagated correctly. (#35461) +- `datadogreceiver`: Changes response message for `/api/v1/series` and `/api/v2/series` 202 response to be JSON and on par with Datadog API spec (#35743) + +## v0.111.0 + +### 🛑 Breaking changes 🛑 + +- `instanaexporter`: Remove deprecated instanaexporter (#35367) + Use the `otlp` exporter instead as explained in IBM's [documentation](https://www.ibm.com/docs/en/instana-observability/current?topic=opentelemetry-sending-data-instana-backend). +- `elasticsearchexporter`: Drop cumulative temporality histogram and exponential histogram (#35442) + Cumulative temporality histogram and exponential histogram are not supported by Elasticsearch. Use cumulativetodeltaprocessor to convert cumulative temporality to delta temporality. +- `elasticsearchexporter`: Implement receiver-based routing under *_dynamic_index config (#34246) +- `config`: Move component.UseLocalHostAsDefaultHost feature gate to stable. (#35569) +- `metricsgenerationprocessor`: Generate metrics even when the second metric's value is 0 (#35533) +- `signalfxexporter`: Do not exclude the metric `container.memory.working_set` (#35475) +- `sqlqueryreceiver`: Fail if value for log column in result set is missing, collect errors (#35068) +- `windowseventlogreceiver`: The 'raw' flag no longer suppresses rendering info. (#34720) + Previously, this flag controlled two behaviors simultaneously: + 1. Whether or not the body of the log record was an XML string or structured object. + 2. Whether or not rendering info was resolved. + A separate 'suppress_rendering_info' option now controls rendering info resolution. + This is considered a breaking change because users setting only the 'raw' flag without also setting the + new 'suppress_rendering_info' flag may see a performance decrease along with more detailed events. + + +### 🚩 Deprecations 🚩 + +- `sapmreceiver`: `access_token_passthrough` is deprecated (#35330) + - "`access_token_passthrough` is deprecated." + - "Please enable include_metadata in the receiver and add the following config to the batch processor:" + ```yaml + batch: + metadata_keys: [X-Sf-Token] + ``` + + +### 🚀 New components 🚀 + +- `receiver/prometheusremotewrite`: Add a new receiver for Prometheus Remote Write. + (#33782) + +### 💡 Enhancements 💡 + +- `sumconnector`: adds connector and summing logic along with tests (#32669) +- `receivercreator`: Validate endpoint's configuration before starting receivers (#33145) +- `otelarrowreceiver`: Add admission control in the otelarrow receiver's standard otlp data path. +Also moves admission control config options to a separate block. +arrow.admission_limit_mib -> admission.request_limit_mib +arrow.waiter_limit -> admission.waiter_limit + (#35021) +- `clickhouseexporter`: Upgrading stability for traces to beta (#35186) + The trace exporter has proven to be stable for production deployments. + Trace configuration is unlikely to receive any significant changes. + +- `clickhouseexporter`: Updated the default trace table (#34245) + Reduced data types, improved partitioning and time range queries +- `opampsupervisor`: Add configurable logging for the supervisor. (#35466) +- `datadogreceiver`: Move receiver's metrics stability to alpha. (#18278) +- `datadogreceiver`: Add container id from v0.5 request header (#35345) +- `elasticsearchexporter`: Implement elasticsearch.mapping.hints attribute handling for data points in OTel mapping mode (#35479) + elasticsearch.mapping.hints takes a slice of strings. `_doc_count` enables emitting `_doc_count` for the document. `aggregate_metric_double` causes histogram or exponential histogram to be emitted as aggregate_metric_double. +- `elasticsearchexporter`: Revert TSDB array dimension workaround for metrics OTel mode (#35291) + Remove the workaround to stringify array dimensions as the limitation has been lifted in Elasticsearch v8.16.0. +- `receiver/statsd`: Add support for aggregating on Host/IP. + (#23809) +- `opampsupervisor`: Skip executing the collector if no config is provided (#33680) +- `googlecloudmonitoringreceiver`: Move receiver's stability to alpha. (#33762) +- `hostmetricsreceiver`: Add ability to mute all errors (mainly due to access rights) coming from process scraper of the hostmetricsreceiver (#20435) +- `kubeletstats`: Introduce feature gate for deprecation of container.cpu.utilization, k8s.pod.cpu.utilization and k8s.node.cpu.utilization metrics (#35139) +- `opampsupervisor`: Make supervisor runnable as a Windows Service. (#34774) +- `opampsupervisor`: Add config option for setting the timeout for the initial bootstrap information retrieval from the agent (#34996) +- `pkg/ottl`: Add InsertXML Converter (#35436) +- `pkg/ottl`: Add GetXML Converter (#35462) +- `pkg/ottl`: Add ToKeyValueString Converter (#35334) +- `pkg/ottl`: Add RemoveXML Converter (#35301) +- `geoipprocessor`: No longer return an error when geo metadata is not found by a provider. (#35047) +- `sqlserverreceiver`: Add computer name resource attribute to relevant metrics (#35040) +- `windowseventlogreceiver`: Add 'suppress_rendering_info' option. (#34720) + When this flag is enabled, the receiver will not attempt to resolve rendering info. This can improve performance + but comes at a cost of losing some details in the event log. + +- `windowseventlogreceiver`: Move artificial "remote_server" field to 'attributes["server.address"]'. (#34720) + +### 🧰 Bug fixes 🧰 + +- `webhookeventreceiver`: Fixed a bug where request bodies containing newline characters caused the results to split into multiple log entries (#35028) +- `opampsupervisor`: Only use TLS config when connecting to OpAMP server if using `wss` or `https` protocols. (#35283) +- `metricsgenerationprocessor`: Allow metric calculations to be done on sum metrics (#35428) +- `sqlqueryreceiver`: Fix reprocessing of logs when tracking_column type is timestamp (#35194) +- `windowseventlogreceiver`: While collecting from a remote windows host, the stanza operator will no longer log "subscription handle is already open" constantly during successful collection. (#35520) +- `windowseventlogreceiver`: If collecting from a remote host, the receiver will stop collecting if the host restarts. This change resubscribes when the host restarts. (#35175) + +## v0.110.0 + +### 🛑 Breaking changes 🛑 + +- `pkg/stanza`: Move `filelog.container.removeOriginalTimeField` feature gate to beta (#33389) + - Disable the `filelog.container.removeOriginalTimeField` feature gate to get the old behavior. + +- `resourcedetectionprocessor`: Move `processor.resourcedetection.hostCPUSteppingAsString` feature gate to stable. (#31136) +- `resourcedetectionprocessor`: Remove `processor.resourcedetection.hostCPUModelAndFamilyAsString` feature gate. (#29025) + +### 🚩 Deprecations 🚩 + +- `hostmetricsreceiver`: Set the receiver.hostmetrics.normalizeProcessCPUUtilization feature gate to stable. (#34763) + +### 🚀 New components 🚀 + +- `azurelogs_translater`: Adds a new translater that converts Azure EventHub logs to OpenTelemetry logs used by the Azure Events Hub receiver. (#39704) +- `dorisexporter`: logs implementation (#33479) +- `dorisexporter`: traces implementation (#33479) + +### 💡 Enhancements 💡 + +- `otelarrowexporter`: Allow separate arrow exporter per unique value of configured metadataKeys. (#34178) +- `processor/transform`: Add custom function to the transform processor to convert exponential histograms to explicit histograms. (#33827) +- `datadogconnector`: Map the new OTel semantic convention `deployment.environment.name` to `env` for OTLP traces in APM stats. (#35147) + The old convention `deployment.environment` still works +- `datadogexporter`: Map the new OTel semantic convention `deployment.environment.name` to `env` for OTLP traces, metrics and logs. (#35147) + The old convention `deployment.environment` still works +- `file_storage`: provide a new option to the user to create a directory on start (#34939) +- `headersetterextension`: adding default_value config (#34412) + default_value config item applied in case context value is empty + +- `kafkaexporter`: Add support for encoding extensions in the Kafka exporter. (#34384) + This change adds support for encoding extensions in the Kafka exporter. Loading extensions takes precedence over the internally supported encodings. + +- `datadogexporter`: Adds exporter.datadogexporter.metricremappingdisabled featuregate which disables renaming OpenTelemetry metrics to match Datadog semantics. This feature gate is only for internal use. (#35025) +- `otelarrowexporter`: Add BatcherConfig field following similar in OTLP exporter. (#34802) +- `otelarrowreceiver`: Add gRPC timeout propagation. (#34742) +- `kafkareceiver`: Add support for `otlp_json` encoding to Kafka receiver. The payload is deserialized into OpenTelemetry traces using JSON format. (#33627) + This encoding allows the Kafka receiver to handle trace data in JSON format, + enabling integration with systems that export traces as JSON-encoded data. + +- `pkg/ottl`: Improved JSON unmarshaling performance by 10-20% by switching dependencies. (#35130) +- `pkg/ottl`: Added support for locale in the Time converter (#32978) +- `datadogexporter`: Upgrade logs in Datadog Exporter to beta (#35359) +- `remotetapprocessor`: Origin header is no longer required for websocket connections (#34925) +- `deltatorateprocessor`: Remove unnecessary data copies. (#35165) +- `transformprocessor`: Remove unnecessary data copy when transform sum to/from gauge (#35177) +- `sapmexporter`: Prioritize token in context when accesstokenpassthrough is enabled (#35123) +- `tailsamplingprocessor`: Fix the behavior for numeric tag filters with `inverse_match` set to `true`. (#34296) + +### 🧰 Bug fixes 🧰 + +- `splunkenterprise`: Fix a flaky search related to iops metrics. (#35081) +- `azuremonitorexporter`: fix issue for property endpoint is ignored when using instrumentation_key (#33971) +- `groupbytraceprocessor`: Ensure processor_groupbytrace_incomplete_releases metric has a unit. (#35221) +- `datadogreceiver`: Fix numeric span attributes (#35087) +- `deltatocumulative`: do not drop gauges and summaries (#35284) + Gauges and Summaries are no longer dropped from processor output. + Instead, they are passed through as-is + +- `pkg/stanza`: Do not get formatted message for Windows events without an event provider. (#35135) + Attempting to get the formatted message for Windows events without an event provider can result in an error being logged. | + This change ensures that the formatted message is not retrieved for such events. + +- `cmd/opampsupervisor`: Ensure the Supervisor processes all fields in a ServerToAgent message. (#34349) +- `signalfxexporter`: Ensure token is not sent through for event data (#35154) +- `prometheusreceiver`: Fix the retrieval of scrape configurations by also considering scrape config files (#34786) +- `redactionprocessor`: Fix panic when using the redaction processor in a logs pipeline (#35331) +- `exporter/splunkhec`: Fix incorrect claim that the exporter doesn't mutate data when batching is enabled. (#35306) + The bug lead to runtime panics when the exporter was used with the batcher enabled in a fanout scenario. + + +## v0.109.0 + +### 🛑 Breaking changes 🛑 + +- `clickhouseexporter`: Upgrade trace SpanKind and StatusCode string values (#34799) + This change updates the output of the trace SpanKind and StatusCode fields to be consistent + with the specification's enum values. While this change will not break any deployments, it may affect + queries dependent on the old enum names. + + For more details on old->new values, see this related PR: + https://github.com/open-telemetry/opentelemetry-collector/pull/6250 + +- `spanmetricsconnector`: Improve consistency between metrics generated by spanmetricsconnector. Added traces.span.metrics as default namespace (#33227, #32818) + Default namespace for the generated metrics is traces.span.metrics now. | The deprecated metrics are: calls, duration and events. | The feature flag connector.spanmetrics.legacyMetricNames was added to revert the behavior. +- `servicegraphconnector`: Fix histogram metrics miss unit (#34511) + All metrics will remove the suffix `_seconds`. It will not introduce breaking change if users use | `prometheusexporter` or `prometheusremotewriteexporter` to exporter metrics in pipeline. | In some cases, like using `clickhouseexporter`(save data in native OTLP format), it will be a breaking change. | Users can use `transformprocessor` to add back this suffix. +- `gitproviderreceiver`: The Git Provider Receiver has been renamed to GitHub Receiver. (#34731) + This rename was to better match the OpenTelemetry semantic convention changes in v1.27.0 + and allows for Traces and Log signals to be added to this component. Traces + as mentioned in issue #27460 will be added in a future release to this component. + +- `ottl`: Remove tracing from OTTL due to performance concerns (#34910) +- `vcenterreceiver`: Updated units on several metrics to be more in line with documented semantics. (#34946) + The following are the metrics with their respective unit changes: + - vcenter.datacenter.cpu.limit ({MHz} -> MHz) + - vcenter.cluster.cpu.limit ({MHz} -> MHz) + - vcenter.cluster.cpu.effective ({MHz} -> MHz) + - vcenter.cluster.vsan.operations ({operations/sec} -> {operations/s}) + - vcenter.cluster.vsan.congestions ({congestions/sec} -> {congestions/s}) + - vcenter.host.network.packet.error.rate ({errors/sec} -> {errors/s}) + - vcenter.host.network.packet.rate ({packets/sec} -> {packets/s}) + - vcenter.host.network.packet.drop.rate ({packets/sec} -> {packets/s}) + - vcenter.host.vsan.operations ({operations/sec} -> {operations/s}) + - vcenter.host.vsan.congestions ({congestions/sec} -> {congestions/s}) + - vcenter.resource_pool.cpu.usage ({MHz} -> MHz) + - vcenter.vm.network.throughput (By/sec -> By/s) + - vcenter.vm.network.packet.rate ({packets/sec} -> {packets/s}) + - vcenter.vm.vsan.operations ({operations/sec} -> {operations/s}) + + +### 🚩 Deprecations 🚩 + +- `instanaexporter`: Marking instanaexporter module as deprecated (#34994) + +### 💡 Enhancements 💡 + +- `pkg/ottl`: Added Decode() converter function (#32493) +- `testbed`: Add test case scenarios to handle large files to existing testbed. (#34288) +- `filestorage`: Add directory validation for compaction on-rebound (#35114) +- `windowseventlogreceiver`: Avoid rendering the whole event to obtain the provider name (#34755) +- `datadogreceiver`: add support for sketch metrics in Datadog receiver (#18278) +- `datadogconnector`: Optimize Datadog connector when there are many peer tags and `connector.datadogconnector.NativeIngest` is enabled (#34945) + `connector.datadogconnector.NativeIngest` is currently enabled by default +- `splunkhecexporter`: Drop empty log events (#34871) + Log records with no body are dropped by Splunk on reception + as they contain no log message, albeit they may have attributes. + + This PR removes those logs from consideration to be exported. + + This is in tune with the behavior of splunkhecreceiver, which refuses HEC events with no event (#19769) + +- `elasticsearchexporter`: Add exponential histogram support (#34813) +- `elasticsearchexporter`: Add span event support to traces OTel mapping mode (#34831) + Span events are now supported in OTel mapping mode. They will be routed to `logs-${data_stream.dataset}-${data_stream.namespace}` if `traces_dynamic_index::enabled` is `true`. +- `transformprocessor`: Support aggregating metrics based on their attribute values and substituting the values with a new value. (#16224) +- `kafkareceiver`: Adds tunable fetch sizes to Kafka Receiver (#22741, #34431) + Adds the ability to tune the minumum, default and maximum fetch sizes for the Kafka Receiver +- `solarwindsapmsettingsextension`: Added logic for refresh function (#27668) +- `githubreceiver`: Promote GitHub receiver metrics to alpha status. (#34960) +- `googlecloudmonitoringreceiver`: Enhancing the Google Cloud monitoring receiver to establish a client connection, scrape GCP Cloud Metrics, and transform them into an OpenTelemetry compatible format for pipeline processing. (#33762) + - Implements client connection to Google Cloud Monitoring API. + - Scrapes timeseries data based on configured metrics. + - Converts the data into OpenTelemetry format for use in the pipeline. + +- `processor/interval`: Support for gauge and summary metrics. (#34803) + Only the last value of a gauge or summary metric is reported in the interval processor, instead of all values. +- `kafkareceiver`: Add support for encoding extensions in the Kafka receiver. (#33888) + This change adds support for encoding extensions in the Kafka receiver. Loading extensions takes precedence over the internally supported encodings. + +- `datadogexporter`: Add support for setting a custom log source from resource attribute `datadog.log.source` (#35051) +- `opampextension`: Adds the ability to configure the polling interval for the HTTP client. (#34749) +- `otelarrowexporter`: Add gRPC timeout propagation. (#34733) +- `pkg/ottl`: Add `Sort` function to sort array to ascending order or descending order (#34200) +- `exporter/prometheusexpoter`: Support for Prometheus Created Timestamps. (#32521) +- `redactionprocessor`: Add support for logs and metrics (#34479) +- `exceptionsconnector,servicegraphconnector,spanmetricsconnector`: Extract the `getDimensionValue` function as a common function. (#34627) +- `sqlqueryreceiver`: Support populating log attributes from sql query (#24459) +- `opampsupervisor`: Add new config parameter `agent.health_check_port` to allow configuring the port used by the agent healthcheck extension. (#34643) + +### 🧰 Bug fixes 🧰 + +- `apachereceiver`: Fix panic on invalid endpoint configuration (#34992) +- `deltatocumulative`: drop bad samples (#34979) + removes bad (rejected) samples from output. previously identified and metric-tracked those as such, but didn't actually drop them. + +- `elasticsearchexporter`: Fix dynamic mapping for double values storing integers (#34680) +- `elasticsearchexporter`: Stringify attribute array values in metrics OTel mode (#35004) + Elasticsearch TSDB does not support array dimensions. Workaround it by stringifying attribute array values in OTel mapping mode for metrics. +- `fileconsumer`: Fix bug where max_concurrent_files could not be set to 1. (#35080) +- `servicegraphconnector`: Fix incorrectly reversed latency settings for the server and client (#34933) +- `hostmetricsreceiver`: In filesystem scraper, do not prefix partitions when using the environment variable HOST_PROC_MOUNTINFO (#35043) +- `splunkhecreceiver`: Fix memory leak when the receiver is used for both metrics and logs at the same time (#34886) +- `geoipprocessor`: Avoid using internal empty attribute.Set pointer (#34882) +- `pkg/stanza`: Synchronize shutdown in stanza adapter (#31074) + Stanza-based receivers should now flush all data before shutting down +- `sqlserverreceiver`: Fix bug where metrics were being emitted with the wrong database name resource attribute (#35036) +- `signalfxexporter`: Fix memory leak by re-organizing the exporter's functionality lifecycle (#32781) +- `otlpjsonconnector`: Handle OTLPJSON unmarshal error (#34782) +- `mysqlreceiver`: mysql client raise error when the TABLE_ROWS column is NULL, convert NULL to int64 (#34195) +- `pkg/stanza`: An operator configured with silent errors shouldn't log errors while processing log entries. (#35008) +- `datadogexporter`: Use correct hostname for logs when using Datadog Agent logs pipeline with a gateway deployment. (#35058) + +## v0.108.0 + +### 🛑 Breaking changes 🛑 + +- `all`: Added support for go1.23, bumped the minimum version to 1.22 (#34658) +- `lokiexporter`: Update the scope name for telemetry produced by the lokiexporter from `otelcol/loki` to `github.com/open-telemetry/opentelemetry-collector-contrib/exporter/lokiexporter` (#34612) +- `azuretranslator`: The scope name has been updated from `otelcol/azureresourcelogs` and `otelcol/azureresourcetraces` to `github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/azure` (#34712) +- `datadogreceiver`: The scope name has been updated from `otelcol/datadogreceiver` to `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/datadogreceiver/internal/translator` (#34711) +- `splunkhecexporter`: The scope name has been updated from `otelcol/splunkhec` to `github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter` (#34710) +- `googlecloudmonitorreceiver`: The scope name has been updated from `otelcol/googlecloudmonitoringreceiver` to `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/googlecloudmonitoringreceiver` (#34709) +- `elasticsearchexporter`: Update OTel mapping mode for logs and metrics; Remove trace_flags (#34472) + Update logs and metrics OTel mapping mode to always emit "scope" and zero int, but not emit empty strings for known fields. Breaking change to remove trace_flags from logs. +- `elasticsearchexporter`: Change default retry.retry_on_status to [429] (#32584) + To retain the previous behavior, set retry.retry_on_status to `[429, 500, 502, 503, 504]`. +- `gitproviderreceiver`: Update metric names and attributes to match the newest Semantic Conventions for VCS. (#34278) + Attribute Changes: + - `branch.name` is now `ref.name` + - Added a `ref.type` attribute + - `pull_request.state` is now `change.state` + - `git.vendor.name` is now `vcs.vendor.name` + Metric Changes: + - `git.repository.count` is now `vcs.repository.count` + - `git.repository.contributor.count` is now `vcs.repository.contributor.count` + - `git.repository.branch.count` is now `vcs.repository.ref.count` + - `git.repository.branch.time` is now `vcs.repository.ref.time + - `git.repository.branch.commit.aheadby.count` is now `vcs.repository.ref.revisions_ahead` + - `git.repository.branch.commit.behindby.count` is now `vcs.repository.ref.revisions_behind + - `git.repository.branch.line.addition.count` is now `vcs.repository.ref.lines_added` + - `git.repository.branch.line.deletion.count` is now `vcs.repository.ref.lines_deleted` + - `git.repository.pull_request.time_open` is now `vcs.change.time_open` + - `git.repository.pull_request.time_to_merge` is now `vcs.change.time_to_merge` + - `git.repository.pull_request.time_to_approval` is now `vcs.change.time_to_approval` + - `git.repository.pull_request.count` is now `vcs.change.count` + +- `transformprocessor`: Promote processor.transform.ConvertBetweenSumAndGaugeMetricContext feature flag from alpha to beta (#34567) +- `exporter/datadog`: The `logs::dump_payloads` config option is invalid when the Datadog Agent logs pipeline is enabled (now enabled by default). (#34420) + An error will be raised if `logs::dump_payloads` is set while the Datadog Agent logs pipeline is enabled. To avoid this error, remove the `logs::dump_payloads` config option or temporarily disable the `exporter.datadogexporter.UseLogsAgentExporter` feature gate. +- `vcenterreceiver`: Several host performance metrics now return 1 data point per time series instead of 5. (#34708) + The 5 data points previously sent represented consecutive 20s sampling periods. Depending on the collection interval + these could easily overlap. Sending just the latest of these data points is more in line with other performance metrics. + + This change also fixes an issue with the googlecloud exporter seeing these datapoints as duplicates. + + Following is the list of affected metrics which will now only report a single datapoint per set of unique attribute values. + - vcenter.host.cpu.reserved + - vcenter.host.disk.latency.avg + - vcenter.host.disk.latency.max + - vcenter.host.disk.throughput + - vcenter.host.network.packet.drop.rate + - vcenter.host.network.packet.error.rate + - vcenter.host.network.packet.rate + - vcenter.host.network.throughput + - vcenter.host.network.usage + + +### 🚀 New components 🚀 + +- `exporter/doris`: Add a new component for exporting logs, traces and metrics to Doris (#33479) + +### 💡 Enhancements 💡 + +- `geoipprocessor`: Add a context configuration option to specify the IP address attribute telemetry location. (#34036) +- `awss3receiver`: Enhance the logging of the AWS S3 Receiver in normal operation to make it easier for user to debug what is happening. (#30750) +- `datadogreceiver`: Implement '/info' endpoint (#34772) +- `datadogreceiver`: Add sampling.priority attribute for Probabilistic Sampling Processor (#34267) +- `datadogreceiver`: Implement '/stats' endpoint (#34790) +- `datadogconnector`: Add a config `traces::bucket_interval` (#34554) + `traces::bucket_interval` specifies the time interval size of aggregation buckets that aggregate the Datadog trace metrics. It is also the time interval that Datadog trace metrics payloads are flushed to the pipeline. Default is 10s if unset. +- `deltatocumulative`: Promote to `alpha` stability (#34747) + promotes the deltatocumulative processor to alpha stability, as most features are now implemented and ready for wider testing. +- `deltatocumulative`: explicit-bounds histograms (#30705) + implements aggregation of explicit-bounds (traditional) histograms. +- `elasticsearchexporter`: Add OTel mapping mode for metrics (#34248) +- `elasticsearchexporter`: Add OTel mapping mode for traces (#34588, #34590) + Add OTel mapping mode support for traces, without span events. +- `filelogreceiver`: If acquire_fs_lock is true, attempt to acquire a shared lock before reading a file. (#34801) + Unix only. If a lock cannot be acquired then the file will be ignored until the next poll cycle. +- `solacereceiver`: Updated the format for generated metrics. Included a `receiver_name` attribute that identifies the Solace receiver that generated the metrics (#34541) +- `geoipprocessor`: Move processor's stability to alpha. (#34737) +- `prometheusreceiver`: Ensure Target Allocator's confighttp is used in the receiver's service discovery (#33370) +- `datadogreceiver`: Include error when logging unmarshaling failures in Datadog receiver. (#34515) +- `metricstransformprocessor`: Add scaling exponential histogram support (#29803) +- `exporter/datadog`: Use Datadog Agent logs pipeline by default for exporting logs to Datadog. Upgrades `exporter.datadogexporter.UseLogsAgentExporter` feature flag to beta. (#34420) +- `pkg/ottl`: Introduce `UserAgent` converter to parse UserAgent strings (#32434) + +### 🧰 Bug fixes 🧰 + +- `tailsamplingprocessor`: Update the `policy` value in metrics dimension value to be unique across multiple tail sampling components with the same policy name. (#34192) + This change ensures that the `policy` value in the metrics exported by the tail sampling processor is unique across multiple tail sampling processors with the same policy name. +- `datadogreceiver`: add feature discovery (#34718) +- `datadogconnector`: Put back the `otelcol_` prefix for Datadog internal metrics on trace and APM stats exporting (#34807) + Recovers these metrics from an upstream breaking change. See https://github.com/open-telemetry/opentelemetry-collector/pull/9759 and https://github.com/open-telemetry/opentelemetry-collector/pull/10940. +- `datadogexporter`: Put back the `otelcol_` prefix for Datadog internal metrics on trace and APM stats exporting (#34807) + Recovers these metrics from an upstream breaking change. See https://github.com/open-telemetry/opentelemetry-collector/pull/9759 and https://github.com/open-telemetry/opentelemetry-collector/pull/10940. +- `awsfirehosereceiver`: Fix validation of requests with empty access key (#34847) +- `connector/exceptionsconnector`: Fix dimensions configuration did not take effect for resource attributes (#34603) +- `prometheusreceiver`: Group scraped metrics into resources created from `job` and `instance` label pairs (#34237) + The receiver will now create a resource for each distinct job/instance label combination. + In addition to the label/instance pairs detected from the scraped metrics, a resource representing the overall + scrape configuration will be created. This additional resource will contain the scrape metrics, such as the number of scraped metrics, the scrape duration, etc. + +- `cmd/opampsupervisor`: Fix supervisor support for Windows. (#34570) +- `tailsamplingprocessor`: Fix the behavior for numeric tag filters with `inverse_match` set to `true`. (#34296) +- `pkg/stanza`: fix nil value conversion (#34672) +- `k8sclusterreceiver`: Lower the log level of a message indicating a cache miss from WARN to DEBUG. (#34817) + +## v0.107.0 + +This release fixes CVE-2024-42368 on the `bearerauthtokenextension` (#34516) + +### 🛑 Breaking changes 🛑 + +- `clickhouseexporter`: Add `compress` option to ClickHouse exporter, with default value of `lz4` (#34365) + This change adds a new `compress` option to the config field and enables it by default. + Prior to this change, compression was not enabled by default. + The only way to enable compression prior to this change was via the DSN URL. + With this change, `lz4` compression will be enabled by default. + The list of valid options is provided by the underlying `clickhouse-go` driver. + While this change is marked as breaking, there should be no effect to existing deployments by enabling compression. + Compression should improve network performance on most deployments that have a remote ClickHouse server. + +- Update the scope name for telemetry produce by components. The following table summarizes the changes: + +| Component name | Previous scope | New scope | PR number | +|----------------|----------------|-----------|------------| +| `azureeventhubreceiver` | `otelcol/azureeventhubreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azureeventhubreceiver` | #34611 | +| `cloudfoundryreceiver` | `otelcol/cloudfoundry` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/cloudfoundryreceiver` | #34612 | +| `cloudflarereceiver` | `otelcol/cloudflare` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/cloudflarereceiver` | #34613 | +| `azuremonitorreceiver` | `otelcol/azuremonitorreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azuremonitorreceiver` | #34618 | +| `fileconsumer` | `otelcol/fileconsumer` | `github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer` | #34619 | +| `loadbalancingexporter` | `otelcol/loadbalancing` | `github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter` | #34429 | +| `sumologicexporter` | `otelcol/sumologic` | `github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sumologicexporter` | #34438 | +| `prometheusremotewriteexporter` | `otelcol/prometheusremotewrite` | `github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter` | #34440 | +| `activedirectorydsreceiver` | `otelcol/activedirectorydsreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/activedirectorydsreceiver` | #34492 | +| `aerospikereceiver` | `otelcol/aerospikereceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver` | #34518 | +| `apachereceiver` | `otelcol/apachereceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/apachereceiver` | #34517 | +| `apachesparkreceiver` | `otelcol/apachesparkreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/apachesparkreceiver` | #34519 | +| `bigipreceiver` | `otelcol/bigipreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/bigipreceiver` | #34520 | +| `chronyreceiver` | `otelcol/chronyreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/chronyreceiver` | #34524 | +| `couchdbreceiver` | `otelcol/couchdbreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/couchdbreceiver` | #34525 | +| `countconnector` | `otelcol/countconnector` | `github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector` | #34583 | +| `deltatocumulativeprocessor` | `otelcol/deltatocumulative` | `github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor` | #34550 | +| `dockerstatsreceiver` | `otelcol/dockerstatsreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/dockerstatsreceiver` | #34528 | +| `elasticsearchreceiver` | `otelcol/elasticsearchreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/elasticsearchreceiver` | #34529 | +| `expvarreceiver` | `otelcol/expvarreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/expvarreceiver` | #34530 | +| `filestatsreceiver` | `otelcol/filestatsreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filestatsreceiver` | #34429 | +| `filterprocessor` | `otelcol/filter` | `github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor` | #34550 | +| `flinkmetricsreceiver` | `otelcol/flinkmetricsreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/flinkmetricsreceiver` | #34533 | +| `fluentforwardreceiver` | `otelcol/fluentforwardreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/fluentforwardreceiver` | #34534 | +| `gitproviderreceiver` | `otelcol/gitproviderreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/gitproviderreceiver` | #34496 | +| `googlespannerreceiver` | `otelcol/googlecloudspannermetrics` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/googlespannerreceiver` | #34593 | +| `grafanacloudconnector` | `otelcol/grafanacloud` | `github.com/open-telemetry/opentelemetry-collector-contrib/connector/grafanacloudconnector` | #34552 | +| `groupbyattrsprocessor` | `otelcol/groupbyattrs` | `github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor` | #34550 | +| `groupbytraceprocessor` | `otelcol/groupbytrace` | `github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor` | #34550 | +| `haproxyreceiver` | `otelcol/haproxyreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/haproxyreceiver` | #34498 | +| `hostmetricsreceiver` receiver's scrapers | `otelcol/hostmetricsreceiver/*` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/*` | #34526 | +| `httpcheckreceiver` | `otelcol/httpcheckreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/httpcheckreceiver` | #34497 | +| `iisreceiver` | `otelcol/iisreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/iisreceiver` | #34535 | +| `k8sattributesprocessor` | `otelcol/k8sattributes` | `github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor` | #34550 | +| `k8sclusterreceiver` | `otelcol/k8sclusterreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver` | #34536 | +| `kafkametricsreceiver` | `otelcol/kafkametricsreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkametricsreceiver` | #34538 | +| `kafkareceiver` | `otelcol/kafkareceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver` | #34539 | +| `kubeletstatsreceiver` | `otelcol/kubeletstatsreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kubeletstatsreceiver` | #34537 | +| `memcachedreceiver` | `otelcol/memcachedreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/memcachedreceiver` | #34542 | +| `mongodbatlasreceiver` | `otelcol/mongodbatlasreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mongodbatlasreceiver` | #34543 | +| `mongodbreceiver` | `otelcol/mongodbreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mongodbreceiver` | #34544 | +| `mysqlreceiver` | `otelcol/mysqlreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mysqlreceiver` | #34545 | +| `nginxreceiver` | `otelcol/nginxreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nginxreceiver` | #34493 | +| `nsxtreceiver` | `otelcol/nsxtreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nsxtreceiver` | #34429 | +| `oracledbreceiver` | `otelcol/oracledbreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/oracledbreceiver` | #34491 | +| `otelarrowreceiver` | `otelcol/otelarrowreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/otelarrowreceiver` | #34546 | +| `podmanreceiver` | `otelcol/podmanreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/podmanreceiver` | #34429 | +| `postgresqlreceiver` | `otelcol/postgresqlreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/postgresqlreceiver` | #34476 | +| `probabilisticsamplerprocessor` | `otelcol/probabilisticsampler` | `github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor` | #34550 | +| `prometheusreceiver` | `otelcol/prometheusreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver` | #34589 | +| `rabbitmqreceiver` | `otelcol/rabbitmqreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/rabbitmqreceiver` | #34475 | +| `sshcheckreceiver` | `otelcol/sshcheckreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sshcheckreceiver` | #34448 | +| `vcenterreceiver` | `otelcol/vcenter` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/vcenterreceiver` | #34449 | +| `zookeeperreceiver` | `otelcol/zookeeper` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver` | #34450 | +| `redisreceiver` | `otelcol/redisreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/redisreceiver` | #34470 | +| `riakreceiver` | `otelcol/riakreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/riakreceiver` | #34469 | +| `routingprocessor` | `otelcol/routing` | `github.com/open-telemetry/opentelemetry-collector-contrib/processor/routingprocessor` | #34550 | +| `saphanareceiver` | `otelcol/saphanareceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/saphanareceiver` | #34468 | +| `servicegraphconnector` | `otelcol/servicegraph` | `github.com/open-telemetry/opentelemetry-collector-contrib/connector/servicegraphconnector` | #34552 | +| `snmpreceiver` | `otelcol/snmpreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/snmpreceiver` | #34592 | +| `snowflakereceiver` | `otelcol/snowflakereceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/snowflakereceiver` | #34467 | +| `solacereceiver` | `otelcol/solacereceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/solacereceiver` | #34466 | +| `splunkenterprisereceiver` | `otelcol/splunkenterprisereceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkenterprisereceiver` | #34452 | +| `statsdreceiver` | `otelcol/statsdreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/statsdreceiver` | #34547 | +| `tailsamplingprocessor` | `otelcol/tailsampling` | `github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor` | #34550 | +| `sqlserverreceiver` | `otelcol/sqlserverreceiver` | `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sqlserverreceiver` | #34451 | + +- `elasticsearchreceiver`: Enable more index metrics by default (#34396) + This enables the following metrics by default: + `elasticsearch.index.documents` + `elasticsearch.index.operations.merge.current` + `elasticsearch.index.segments.count` + To preserve previous behavior, update your Elasticsearch receiver configuration to disable these metrics. +- `vcenterreceiver`: Enables all of the vSAN metrics by default. (#34409) + The following metrics will be enabled by default now: + - vcenter.cluster.vsan.throughput + - vcenter.cluster.vsan.operations + - vcenter.cluster.vsan.latency.avg + - vcenter.cluster.vsan.congestions + - vcenter.host.vsan.throughput + - vcenter.host.vsan.operations + - vcenter.host.vsan.latency.avg + - vcenter.host.vsan.congestions + - vcenter.host.vsan.cache.hit_rate + - vcenter.vm.vsan.throughput + - vcenter.vm.vsan.operations + - vcenter.vm.vsan.latency.avg + + +### 🚩 Deprecations 🚩 + +- `exporter/datadog`: Deprecates `logs::dump_payloads` since it is invalid with the Datadog Agent logs pipeline, which will be enabled by default in the v0.108.0 release. (#34490) + +### 🚀 New components 🚀 + +- `logdedupeprocessor`: Add new logdedupeprocessor processor that deduplicates log entries. (#34118) +- `coralogixprocessor`: creating new component for coralogix features (#33090) +- `googlecloudmonitoringreceiver`: Adding new component - [Google Cloud monitoring](https://cloud.google.com/monitoring/api/metrics_gcp) receiver to fetch GCP Cloud Metrics and transform to OpenTelemetry compatible format. (#33762) + +### 💡 Enhancements 💡 + +- `awsemfexporter`: AWS EMF Exporter to update ApplicationSignals log group name and namespace, and adjust AWS service name prefix logic in spans (#33798) +- `azureeventhubreceiver`: Added traces support in azureeventhubreceiver (#33583) +- `exporter/prometheusremotewrite`: Reduce unnecessary memory allocation by removing buffer that was not used by Snappy encoding function. (#34273) +- `exporter/prometheusremotewrite`: Reduce memory allocations of prometheus remote write exporter "batchtimeseries" when large batch sizes are used (#34269) +- `clickhouseexporter`: Updated the default logs table to a more optimized schema (#34203) + Improved partitioning and time range queries. +- `bearertokenauthextension`: use constant time comparison. This fixes CVE-2024-42368 (#34516) +- `processor/k8sattributes`: Add support for `container.image.repo_digests` metadata (#34029) +- `datadogconnector`: Move feature gate `connector.datadogconnector.NativeIngest` to beta (#34549) + When this feature gate is enabled (default), the datadog connector uses the new API to produce APM stats under the hood. | The new API has better throughput when your spans have many attributes (especially container related attributes). Funtional-wise the new API should have no user-facing change compared to the old API. | However if you observe any unexpected behaviors, you can disable this feature gate to revert to the old stats processing APIs. +- `elasticsearchexporter`: Add opt-in support for the experimental `batcher` config (#32377) + By enabling (or explicitly disabling) the batcher, the Elasticsearch exporter's + existing batching/buffering logic will be disabled, and the batch sender will be used. + +- `elasticsearchexporter`: Add summary support for metrics (#34560) +- `hostmetricsreceiver`: add reporting interval to entity event (#34240) +- `elasticsearchreceiver`: Add metric for active index merges (#34387) +- `kafkaexporter`: add an ability to partition logs based on resource attributes. (#33229) +- `logdedupprocessor`: Adds a histogram metric to record the number of aggregated log records. (#34579) +- `logdedupprocessor`: Updates stability level to alpha. (#34575) +- `logdedup`: Make the name of the log deduplication component consistent (#34571) +- `logdedupprocessor`: Ensures any pending aggregated logs are processed and sent to the next consumer before shutting down. (#34615) +- `logdedupprocessor`: Adds a scope aggregator to the logdedup processor enabling the aggregation of logs per scope. (#34606) +- `logdedupprocessor`: Simplifies the processor shutdown behaviour by removing the unnecessary done channel. (#34478) +- `pkg/ottl`: Add support for map literals in OTTL (#32388) +- `pkg/ottl`: Introduce ExtractGrokPatterns converter (#32593) +- `pkg/ottl`: Add the `MD5` function to convert the `value` into a MD5 hash/digest (#33792) +- `pkg/ottl`: Introduce `sha512` converter to generate SHA-512 hash/digest from given payload. (#34007) +- `kafkametricsreceiver`: Add option to configure cluster alias name and add new metrics for kafka topic configurations (#34148) +- `receiver/splunkhec`: Add a regex to enforce metrics naming for Splunk events fields based on metrics documentation. (#34275) +- `telemetrygen`: Support boolean values in `--telemetry-attributes` and `--otlp-attributes` flag (#18928) +- `filelogreceiver`: Check for unsupported fractional seconds directive when converting strptime time layout to native format (#34390) +- `windowseventlogreceiver`: Add remote collection support to Stanza operator windows pkg to support remote log collect for the Windows Event Log receiver. (#33100) + +### 🧰 Bug fixes 🧰 + +- `configauth`: Fix unmarshaling of authentication in HTTP servers. (#34325) + This brings in a bug fix from the core collector. See https://github.com/open-telemetry/opentelemetry-collector/issues/10750. +- `docker_observer`: Change default endpoint for `docker_observer` on Windows to `npipe:////./pipe/docker_engine` (#34358) +- `pkg/translator/jaeger`: Change the translation to jaeger spans to match semantic conventions. (#34368) + `otel.library.name` is deprecated and replaced by `otel.scope.name` + `otel.library.version` is deprecated and replaced by `otel.scope.version` + +- `pkg/stanza`: Ensure that errors from `Process` and `Write` do not break for loops (#34295) +- `cmd/opampsupervisor`: Start even if the OpAMP server cannot be contacted, and continually retry connecting. (#33408, #33799) +- `cmd/opampsupervisor`: Write the generated effective config and agent log files to the user-defined storage directory. (#34341) +- `azuremonitorreceiver`: Add Azure China as a `cloud` option. (#34315) +- `postgresqlreceiver`: Support unix socket based replication by handling null values in the client_addr field (#33107) +- `splunkhecexporter`: Copy the bytes to be placed in the request body to avoid corruption on reuse (#34357) + This bug is a manifestation of https://github.com/golang/go/issues/51907. + Under high load, the pool of buffers used to send requests is reused enough + that the same buffer is used concurrently to process data and be sent as request body. + The fix is to copy the payload into a new byte array before sending it. + +- `syslogexporter`: Fix issue where exporter may hang indefinitely while dialing. (#34393) +- `clickhouseexporter`: Use observed timestamp if timestamp is zero (#34150) + Some OpenTelemetry libraries do not send timestamp for logs, but they should always send | the observed timestamp. In these cases the ClickHouse exporter just stored a zero timestamp | to the database. This changes the behavior to look into the observed timestamp if the timestamp | is zero. +- `webhookeventreceiver`: added a timestamp to the logs generated from incoming events. (#33702) + +## v0.106.1 + +### 🧰 Bug fixes 🧰 + +- `configauth`: Fix unmarshaling of authentication in HTTP servers. (#34325) + This brings in a bug fix from the core collector. See https://github.com/open-telemetry/opentelemetry-collector/issues/10750. + +## v0.106.0 + +### 🛑 Breaking changes 🛑 + +- `vcenterreceiver`: Enables various vCenter metrics that were disabled by default until v0.106.0 (#33607) + The following metrics will be enabled by default "vcenter.datacenter.cluster.count", "vcenter.datacenter.vm.count", "vcenter.datacenter.datastore.count", + "vcenter.datacenter.host.count", "vcenter.datacenter.disk.space", "vcenter.datacenter.cpu.limit", "vcenter.datacenter.memory.limit", + "vcenter.resource_pool.memory.swapped", "vcenter.resource_pool.memory.ballooned", and "vcenter.resource_pool.memory.granted". The + "resourcePoolMemoryUsageAttribute" has also been bumped up to release v.0.107.0 + +- `googlemanagedprometheusexporter`: Fix typo in `exporter.googlemanagedpromethues.intToDouble` feature gate (#34232) + +### 🚩 Deprecations 🚩 + +- `k8sattributesprocessor`: Deprecate `extract.annotations.regex` and `extract.labels.regex` config fields in favor of the `ExtractPatterns` function in the transform processor. The `FieldExtractConfig.Regex` parameter will be removed in version v0.111.0. (#25128) + Deprecating of FieldExtractConfig.Regex parameter means that it is recommended to use the `ExtractPatterns` function from the transform processor instead. To convert your current configuration please check the `ExtractPatterns` function [documentation](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/pkg/ottl/ottlfuncs#extractpatterns). You should use the `pattern` parameter of `ExtractPatterns` instead of using the `FieldExtractConfig.Regex` parameter. + +### 🚀 New components 🚀 + +- `otlpjsonconnector`: New component that will allow extracting otlpjson data from incoming Logs. (#34239, #34208) +- `redis_storage`: Adds a new storage extension using Redis to store data in transit (#31682) + +### 💡 Enhancements 💡 + +- `processor/transform`: Add `scale_metric` function that scales all data points in a metric. (#16214) +- `vcenterreceiver`: Adds vCenter vSAN host metrics. (#33556) + Introduces the following vSAN host metrics to the vCenter receiver: + - vcenter.host.vsan.throughput + - vcenter.host.vsan.iops + - vcenter.host.vsan.congestions + - vcenter.host.vsan.cache.hit_rate + - vcenter.host.vsan.latency.avg + +- `transformprocessor`: Support aggregating metrics based on their attributes. (#16224) +- `metricstransformprocessor`: Adds the 'median' aggregation type to the Metrics Transform Processor. Also uses the refactored aggregation business logic from internal/core package. (#16224) +- `telemetrygen`: uses the go logging SDK instead of pdata (#18902) +- `elasticsearchexporter`: Add explicit bounds histogram support to metrics (#34045) +- `hostmetricsreceiver`: allow configuring log pipeline to send host EntityState event (#33927) +- `elasticsearchexporter`: Introduce an experimental OTel native mapping mode for logs (#33290) +- `extension/healthcheckv2`: Add extension/subcomponent management logic. (#26661) +- `otlpjsonconnector`: Add connector's implementations (#34249, #34208) +- `windowsperfcountersreceiver`: Improve handling of non-existing instances for Windows Performance Counters (#33815) + It is an expected that when querying Windows Performance Counters the targeted instances may not be present. + The receiver will no longer require the use of `recreate_query` to handle non-existing instances. + As soon as the instances are available, the receiver will start collecting metrics for them. + There won't be warning log messages when there are no matches for the configured instances. + +- `kafkareceiver`: Add settings session_timeout and heartbeat_interval to Kafka Receiver for group management facilities (#28630) +- `otelarrowreceiver, otelarrowexporter`: OTel-Arrow internal packages moved into this repository. (#33567) + New integration testing between otelarrowexporter and otelarrowreceiver. +- `otlpjsonconnector`: Move connector's stability to alpha. (#34208, #34253) +- `pkg/ottl`: Adds an `Format` function to OTTL that calls `fmt.Sprintf` (#33405) +- `vcenterreceiver`: Adds a number of default disabled vSAN metrics for Clusters. (#33556) +- `vcenterreceiver`: Adds a number of default disabled vSAN metrics for Virtual Machines. (#33556) + +### 🧰 Bug fixes 🧰 + +- `clickhouseexporter`: Increase the default number of queue consumers to 10 (#34176) +- `opencensusreceiver`: Do not report an error into resource status during receiver shutdown when the listener connection was closed. (#33865) +- `datadogconnector`: Produce stats for non-root client and producer spans when `connector.datadogconnector.NativeIngest` and `compute_top_level_by_span_kind` are enabled (#34197) + You should have only run into this bug when ALL the conditions below are met | 1. feature gate `connector.datadogconnector.NativeIngest` is enabled | 2. config `compute_top_level_by_span_kind` is set to true | 3. config `compute_stats_by_span_kind` is unset or set to false | 4. you have child spans with client or producer span kind +- `datadogconnector`: Respect `_dd.measured` when `connector.datadogconnector.NativeIngest` is enabled (#34197) + Spans with attribute `_dd.measured` set to 1 will always get Datadog APM stats +- `deltatocumulativeprocessor`: fix bucket counts when downscaling exp histograms with odd offsets (#33831) +- `otelarrowreceiver`: Fix potential goroutine leak when in stream-shutdown. (#34236) +- `otelarrowreceiver`: Eliminate one spurious span error. (#34175) +- `pkg/ottl`: Handle JSON array provided to ParseJSON function (#33535) +- `exporter/datadog`: Fixes a bug where `otelcol_exporter_sent_log_records` was reporting double as many logs sent when using the logs agent feature gate. (#33887) +- `statsdeceiver`: Log only non-EOF errors when reading payload received via TCP. (#33951) +- `vcenterreceiver`: Adds destroys to the ContainerViews in the client. (#34254) + This may not be necessary, but it should be better practice than not. + +## v0.105.0 + +### 🛑 Breaking changes 🛑 + +- `skywalkingexporter`: Remove unmaintained component (#23796) +- `elasticsearchexporter`: Make "dedup" option no-op, always de-duplicate. (#33773) + Elasticsearch does not permit duplicate keys in JSON objects, so there is no value in being able to configure deduplication. +- `elasticsearchexporter`: Remove defunct "file" and "fields" configuration settings. (#33803) + This is a breaking change only because removing the attributes would prevent collector startup if those attributes are specified, but otherwise there is no functional change. These configuration attributes have never done anything. +- `stanza`: errors from Operator.Process are returned instead of silently ignored. (#33783) + This public function is affected: https://pkg.go.dev/github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.104.0/operator/helper#WriterOperator.Write +- `vcenterreceiver`: Enables various vCenter metrics that were disabled by default until v0.105 (#34022) + The following metrics will be enabled by default "vcenter.host.network.packet.drop.rate", + "vcenter.vm.cpu.readiness", "vcenter.host.cpu.capacity", and "vcenter.host.cpu.reserved". + + +### 🚩 Deprecations 🚩 + +- `lokiexporter`: Deprecate component (#33916) + +### 🚀 New components 🚀 + +- `sumconnector`: creates a wireframe and initial pr to develop from (#32669) +- `extensions/observer/cfgardenobserver`: Add a new observer that discovers containers through the Garden API (#33618) + +### 💡 Enhancements 💡 + +- `pkg/ottl`: Added Hex() converter function (#31929) +- `pkg/ottl`: Add IsRootSpan() converter function. (#32918) + Converter `IsRootSpan()` returns `true` if the span in the corresponding context is root, that means its `parent_span_id` equals to hexadecimal representation of zero. In all other scenarios function returns `false`. +- `vcenterreceiver`: Adds additional vCenter resource pool metrics and a memory_usage_type attribute for vcenter.resource_pool.memory.usage metric to use. (#33607) + Added "vcenter.resource_pool.memory.swapped", "vcenter.resource_pool.memory.ballooned", and "vcenter.resource_pool.memory.granted" + metrics. Also added an additional attribute, "memory_usage_type" for "vcenter.resource_pool.memory.usage" metric, which is + currently under a feature gate. + +- `kubeletstatsreceiver`: Add `k8s.pod.memory.node.utilization` and `k8s.container.memory.node.utilization` metrics (#33591) +- `vcenterreceiver`: Adds vCenter metrics at the datacenter level. (#33607) + Introduces various datacenter metrics which work by aggregating stats from datastores, clusters, hosts, and VM's. +- `processor/resource, processor/attributes`: Add an option to extract value from a client address by specifying `client.address` value in the `from_context` field. (#34051) +- `awss3receiver`: Add support for retrieving logs and metrics to the AWS S3 Receiver. (#30750) +- `receiver/azuremonitorreceiver`: Add support for Managed Identity and Default Credential auth (#31268, #33584) +- `azuremonitorreceiver`: Add `maximum_number_of_records_per_resource` config parameter in order to overwrite default (#32165) +- `clickhouseexporter`: Upgrading stability for logs to beta (#33615) + The logs exporter has been proven to be stable for large scale production deployments. + Configuration options specific to logs are unlikely to change. + +- `cloudfoundryreceiver`: Add support to receive CloudFoundry Logs (#32671) +- `datadogreceiver`: Add support for metrics in Datadog receiver (#18278) +- `datadogexporter`: Add a feature gate `exporter.datadogexporter.TraceExportUseCustomHTTPClient` that allows a custom HTTP client to be used in trace export (#34025) + This is an experimental feature. By default the feature gate is disabled and trace export uses a default HTTP client. +- `elasticsearchexporter`: Introduce experimental `telemetry.log_request_body` and `telemetry.log_response_body` config (#33854) +- `cmd/opampsupervisor`: Adds support for forwarding custom messages to/from the agent (#33575) +- `geoipprocessor`: Add providers configuration and maxmind provider factory (#33269) +- `healthcheckv2extension`: Add partial gRPC service implementation to healthcheckv2. (#26661) +- `healthcheckv2extension`: Add support for streaming Watch RPC to healthcheckv2 gRPC service. (#26661) +- `healthcheckv2extension`: Add HTTP service to healthcheckv2 (#26661) +- `splunkhecexporter`: Increase the performance of JSON marshaling (#34011) +- `pkg/stanza`: Add `parse_ints` config in json parser to support parsing int or float properly (#33696) +- `loadbalancingexporter`: Adds a new streamID routingKey, which will route based on the datapoint ID. See updated README for details (#32513) +- `awsxrayexporter`: Allow multiple log group names/arns to be set in environmental variables (#33795) +- `dockerobserver`: Add hint to error when using float for `api_version` field (#34043) +- `dockerstatsreceiver`: Add hint to error when using float for `api_version` field (#34043) +- `pkg/ottl`: Emit traces for statement sequence executions to troubleshoot OTTL statements/conditions (#33433) +- `pkg/stanza`: Bump 'logs.jsonParserArray' and 'logs.assignKeys' feature gates to beta. (#33948) + This enables the feature gates by default to allow use of the + `json_array_parser` and `assign_keys` operations. + +- `receiver/filelog`: Add filelog.container.removeOriginalTimeField feature-flag for removing original time field (#33946) +- `statsdreceiver`: Allow configuring summary percentiles (#33701) +- `pkg/stanza`: Switch to faster json parser lib for container operator (#33929) +- `telemetrygen`: telemetrygen `--rate` flag changed from Int64 to Float64 (#33984) +- `extension/opamp`: Rely on the Collector APIs to do config redaction (#34078) + Previously all config fields had to be redacted, now `configopaque.String` is used to determine + which fields should be redacted. As a result, fields that are not sensitive are no longer redacted. + +- `azuremonitorreceiver`: Upgrade stability to alpha (#33689) +- `windowsperfcountersreceiver`: `windowsperfcountersreceiver` now appends an index number to additional instance names that share a name. An example of this is when scraping `
rocess(*)` counters with multiple running instances of the same executable. (#32319) + **NOTES** + - This change can expose cardinality issues where the counters were previously collapsed under the non-indexed instance name. + - The change mimics Windows Performance Monitor behavior: The first instance name remains unchanged, additional instances are suffixed with `#` where `N=1` and is increased for each duplicate. + - e.g. Given 3 powershell instances, this will return `powershell`, `powershell#1` and `powershell#2`. + + +### 🧰 Bug fixes 🧰 + +- `servicegraphconnector`: Fix failed label does not work leads to servicegraph metrics error (#32018) +- `apachesparkreceiver`: Updating the stability to reflect that the component is shipped as part of contrib. (#33906) +- `azureblobreceiver`: Updating the stability to reflect that the component is shipped as part of contrib. (#33902) +- `countconnector`: Updating the stability to reflect that the component is shipped as part of contrib. (#33903) +- `deltatorateprocessor`: Updating the stability to reflect that the component is shipped as part of contrib. (#33904) +- `httpcheckreceiver`: Updating the stability to reflect that the component is shipped as part of contrib. (#33897) +- `metricsgenerationprocessor`: Updating the stability to reflect that the component is shipped as part of contrib. (#33905) +- `podmanreceiver`: Updating the stability to reflect that the component is shipped as part of contrib. (#33899) +- `purefareceiver`: Updating the stability to reflect that the component is shipped as part of contrib. (#33901) +- `purefbreceiver`: Updating the stability to reflect that the component is shipped as part of contrib. (#33900) +- `zookeeperreceiver`: Updating the stability to reflect that the component is shipped as part of contrib. (#33898) +- `probabilisticsamplerprocessor`: Fix bug where log sampling was being reported by the counter `otelcol_processor_probabilistic_sampler_count_traces_sampled` (#33874) +- `cmd/telemetrygen`: Fix `make docker-telemetrygen` command. (#33989) +- `processor/groupbyattrsprocessor`: Fix dropping of metadata fields when processing metrics. (#33419) +- `testbed`: Fixes incorrect count for sent data items in load generator. (#34057) +- `prometheusreceiver`: Fix hash computation to include non exported fields like regex in scrape configuration for TargetAllocator (#29313) +- `datadogexporter`: Exit when API key validation fails and `api::fail_on_invalid_key` is set to `true`. (#33935) +- `kafkametricsreceiver`: Fix issue with incorrect consumer offset (#33309) +- `sqlserverreceiver`: Enable default metrics to properly trigger SQL Server scrape (#34065) +- `syslogreceiver`: Allow to define `max_octets` for octet counting RFC5424 syslog parser (#33182) +- `windowsperfcountersreceiver`: Metric definitions with no matching performance counter are no longer included as metrics with zero datapoints in the scrape output. (#4972) + +## v0.104.0 + +### 🛑 Breaking changes 🛑 + +- `sumologicexporter`: removed compress_encoding (#33604) +- `exporter/clickhouse`: Change behavior of how default database is read from the config (#33693) + Changed the default `database` to `default`. + The final database will prioritize `endpoint`, unless `database` is set to a value not equal to `default`. + If neither are specified then it defaults to the `default` database. + Possible breaking change if someone has the DSN configured in combination with `database` config option. + +- `exporter/clickhouse`: Add `async_insert` config option to enable inserting asynchronously by default. (#33614) + Adds `async_insert` config option to enable inserting asynchronously by default. + To preserve the previous behavior, set `async_insert` to `false` in your config. + When enabled, the exporter will insert asynchronously, which can improve performance for high-throughput deployments. + The `async_insert` option can be set to `true` or `false` to enable or disable async inserts, respectively. The default value is `true`. + Keep in mind this setting is added since the exporter now sets it to default. + Async insert and its related settings can still be defined in `endpoint` and `connection_params`, which take priority over the new config option. + +- `clickhouseexporter`: Add `AggregationTemporality` column to histogram and exponential histogram tables. Rename `AggTemp` column to `AggregationTemporality` in sum table. (#33424) + It's a breaking change. users who upgrade to the latest version need to alter the Clickhouse table: + ```sql + ALTER TABLE otel_metrics_exponential_histogram ADD COLUMN AggregationTemporality Int32 CODEC(ZSTD(1)); + ALTER TABLE otel_metrics_histogram ADD COLUMN AggregationTemporality Int32 CODEC(ZSTD(1)); + ALTER TABLE otel_metrics_sum RENAME COLUMN AggTemp TO AggregationTemporality; + ``` + +- `exporter/clickhouse`: Remove deprecated `ttl_days` config option, use `ttl` instead. (#33648) +- `vcenterreceiver`: Drops support for vCenter 6.7 (#33607) +- `all`: Promote `component.UseLocalHostAsDefaultHost` feature gate to beta. This changes default endpoints from 0.0.0.0 to localhost (#30702) + This change affects the following components: + - extension/awsproxy + - extension/health_check + - extension/health_checkv2 + - extension/jaegerremotesampling + - internal/aws/proxy + - processor/remotetap + - receiver/awsfirehose + - receiver/awsxray + - receiver/influxdb + - receiver/jaeger + - receiver/loki + - receiver/opencensus + - receiver/sapm + - receiver/signalfx + - receiver/skywalking + - receiver/splunk_hec + - receiver/zipkin + - receiver/zookeeper + +- `receiver/mongodb`: Graduate receiver.mongodb.removeDatabaseAttr feature gate to stable (#24972) + +### 🚩 Deprecations 🚩 + +- `exporter/elasticsearch`: Deprecate the "dedot" configuration. (#33772) + dedot has been deprecated, and will always be enabled in ECS mode and disabled for other modes in future +- `exporter/elasticsearch`: Deprecate the "dedup" configuration. (#33773) + dedup has been deprecated, and will always be enabled in future. + +### 🚀 New components 🚀 + +- `otelarrow`: OTel-Arrow exporter and receiver are marked alpha, added to otelcontribcol (#26491) + +### 💡 Enhancements 💡 + +- `exporter/elasticsearch`: Add initial support for metrics (#33513) +- `elasticsearchexporter`: Add translation for k8s.deployment.name resource attribute (#33622) +- `k8sattributesprocessor`: Add support for exposing `k8s.pod.ip` as a resource attribute (#32960) +- `geoipprocessor`: Add MaxMind geoip provider for GeoIP2-City and GeoLite2-City databases. (#32663) +- `vcenterreceiver`: Adds vCenter CPU readiness metric for VMs. (#33607) +- `awsemfexporter`: AWS EMF Exporter to add AppSignals metadata flag into the user-agent (#32998) +- `receiver/mongodb`: Ensure support of 6.0 and 7.0 MongoDB versions with integration tests (#32716) +- `sumologicexporter`: added timeout validation (#33151) +- `clickhouseexporter`: Updated the default logs table to a more optimized schema (#33611) + Simplified data types, improved partitioning and time range queries. +- `datadogconnector`: Add a feature gate `connector.datadogconnector.NativeIngest` that enables datadog connector to use the new native OTel API in APM stats computation. (#33297) + The feature gate `connector.datadogconnector.NativeIngest` is disabled by default. +- `datadogexporter`: Adds Kubernetes DD tags to keep when mapping resource attributes (#33728) + See https://github.com/DataDog/opentelemetry-mapping-go/pull/334 for details. +- `exporter/elasticsearch`: Add data stream routing (#33794, #33756) + `data_stream.dataset` and `data_stream.namespace` in attributes will be respected when config `*_dynamic_index.enabled` is true. + +- `exporter/elasticsearch`: Encode metrics resource attributes in ECS mapping mode (#33823) +- `elasticsearchexporter`: Preserve `host.name` resource attribute in ECS mode (#33670) +- `servicegraphprocessor`: Added a new configuration option `enable_virtual_node_label` to allow users to identify which node is the virtual node in each edge of the service graph. (#31889) +- `pkg/stanza`: Switch JSON parser used by json_parser to github.com/goccy/go-json (#33784) +- `k8sobserver`: Add support for k8s.ingress endpoint. (#32971) +- `statsdreceiver`: Optimize statsdreceiver to reduce object allocations (#33683) +- `routingprocessor`: Use mdatagen to define the component's telemetry (#33526) +- `loadbalancerexporter`: Refactors how the load balancing exporter splits metrics (#32513) + All splitting is *behaviorally*, the same. However, the `resource` routingID now uses the `internal/exp/metrics/identity` package to generate the load balancing key, instead of bespoke code. This means that when upgrading to this version your routes for specific metric groupings could change. However, this will be stable and all future metrics will follow the new routing +- `receiver/mongodbreceiver`: Add `server.address` and `server.port` resource attributes to MongoDB receiver. (#32810, #32350) + The new resource attributes are added to the MongoDB receiver to distinguish metrics coming from different MongoDB instances. + - `server.address`: The address of the MongoDB host, enabled by default. + - `server.port`: The port of the MongoDB host, disabled by default. + +- `observerextension`: Expose host and port in endpoint's environment (#33571) +- `rabbitmqexporter`: Promote rabbitmqexporter to alpha. (#33331) +- `pkg/ottl`: Add a `schema_url` field to access the SchemaURL in resources and scopes on all signals (#30229) +- `solacereceiver`: Renamed some SemConv fields to support latest semantic conventions for messaging spans (version `1.25.0`) (#33499) +- `sqlserverreceiver`: Enable more perf counter metrics when directly connecting to SQL Server (#33420) + This enables the following metrics by default on non Windows-based systems: + `sqlserver.batch.request.rate` + `sqlserver.batch.sql_compilation.rate` + `sqlserver.batch.sql_recompilation.rate` + `sqlserver.page.buffer_cache.hit_ratio` + `sqlserver.user.connection.count` + +- `extension/googleclientauth`: Add Google-signed ID token support (#33185) + Update github.com/GoogleCloudPlatform/opentelemetry-operations-go/extension/googleclientauth to v0.48.0. + With this update, extension/googleclientauth now supports Google-signed ID token as auth header. + +- `vcenterreceiver`: Adds vCenter CPU capacity and network drop rate metrics to hosts. (#33607) + +### 🧰 Bug fixes 🧰 + +- `resourcedetectionprocessor`: Fetch CPU info only if related attributes are enabled (#33774) +- `datasetexporter`: Upgrade dataset-go to v0.19.0 and fix found issues (#33498, #32533, #33675) + Upgrade `dataset-go` library from v0.18.0 to v0.19.0. + Enable skipped integration test and adjust the test so it is passing again. + Do not validate configuration, let the framework run the validation. + +- `datasetexporter`: Upgrade dataset-go to v0.20.0 (#33812) + Upgrade `dataset-go` library from v0.19.0 to v0.20.0. + Make number of outgoing connections configurable. + +- `datadogexporter`: Fix panics on invalid sized trace & span IDs (#33566) + See https://github.com/DataDog/opentelemetry-mapping-go/pull/340 for details. +- `datadogexporter`: Ignore metric datapoints with `no recorded value` flag (#33728) + This flag is not supported by Datadog, so we just ignore these datapoints. See https://github.com/DataDog/opentelemetry-mapping-go/pull/330 for details. +- `tailsamplingprocessor`: Fix precedence of inverted match in and policy (#33671) + Previously if the decision from a policy evaluation was `NotSampled` or `InvertNotSampled` it would return a `NotSampled` decision regardless, effectively downgrading the result. + + This was breaking the documented behaviour that inverted decisions should take precedence over all others. + +- `otelarrowreceiver`: Ensure consume operations are not canceled at stream EOF. (#33570) +- `vcenterreceiver`: Fixes errors in some of the client calls for environments containing multiple datacenters. (#33734) + +## v0.103.0 + +### 🛑 Breaking changes 🛑 + +- `cmd/opampsupervisor,extension/opamp`: Upgrade the opamp-go library to v0.15.0 (#33416) + With this change, UUIDv7 is recommended for the OpAMP extension's instance_uid field instead of ULID. ULIDs will continue to work, but may be displayed as UUIDs. + The supervisor's persistent state (${storage_dir}/persistent_state.yaml) will need to be cleared to generate a new UUIDv7 instead of a ULID. + This change may be incompatible with management servers using v0.14.0 of opamp-go. + +- `mongodbreceiver`: Now only supports `TCP` connections (#32199) + This fixes a bug where hosts had to explicitly set `tcp` as the transport type. The `transport` option has been removed. +- `cmd/configschema`: Removes the deprecated `configschema` command. This command will no longer be released or supported. (#33384) +- `sqlserverreceiver`: sqlserver.database.io.read_latency has been renamed to sqlserver.database.latency with a `direction` attribute. (#29865) + +### 🚩 Deprecations 🚩 + +- `healthcheckextension`: Remove incorrect logic behind `check_collector_pipeline` config (#33469) + This logic incorrectly set the pipeline to OK after waiting for enough callbacks from the + opencensus library to be called. As this was broken, I'm removing it to remove the dependency + on opencensus as well. Improvements will be available via healthcheckv2 extension. + +- `googlecloudspannerreceiver`: Mark the component as unmaintained. If we don't find new maintainers, it will be deprecated and removed. (#32651) + +### 💡 Enhancements 💡 + +- `filelogreceiver`: If include_file_record_number is true, it will add the file record number as the attribute `log.file.record_number` (#33530) +- `kubeletstats`: Add k8s.pod.cpu.node.utilization metric (#33390) +- `awss3exporter`: endpoint should contain the S3 bucket (#32774) +- `awss3receiver`: Add support for encoding extensions to be used in the AWS S3 Receiver. (#30750) +- `gitproviderreceiver`: Adds branch commit and line based metrics (#22028) + Adds the following branch based metrics. + * git.repository.branch.time + * git.repository.branch.commit.aheadby.count + * git.repository.branch.commit.behindby.count + * git.repository.branch.line.deletion.count + * git.repository.branch.line.addition.count + +- `statsdreceiver`: update statsd receiver to use mdatagen (#33524) +- `coralogixexporter`: Allow setting application name from `cx.application.name` and `cx.subsystem.name` resource attributes (#33217) +- `metricstransformprocessor`: Adds the 'count' aggregation type to the Metrics Transform Processor. (#24978) +- `elasticsearchexporter`: Add support for confighttp options, notably "auth". (#33367) + Add support for confighttp and related configuration settings, such as "auth". + This change also means that the Elasticsearch URL may be specified as "endpoint", + like the otlphttp exporter. + +- `elasticsearchexporter`: Check that endpoints are valid URLs during config validation. (#33350) + Check that endpoints are valid URLs during config validation so that + an invalid endpoint causes a fatal error during startup, rather than + leading to a persistent runtime error. + +- `opampsupervisor`: Add config validation for the supervisor config (#32843) +- `statsdreceiver`: Added received/accepted/refused metrics (#24278) +- `filelogreceiver`: Add support for gzip compressed log files (#2328) +- `confmap/provider/secretsmanagerprovider`: Add support for JSON formatted secrets in secretsmanagerprovider confmap (#32143) + The `secretsmanagerprovider` confmap will now allow to get secret by a json key if the secret value is json. + To specify key separate key from secret name/arn by `#` e.g. `mySecret#mySecretKey`. + +- `geoipprocessor`: Add initial processing based on source.address resource attribute (#32663) +- `healthcheckv2extension`: Add shared aggregation logic for status events. (#26661) +- `tailsamplingprocessor`: Simple LRU Decision Cache for "keep" decisions (#31583) +- `processor/tailsampling`: Migrates internal telemetry to OpenTelemetry SDK via mdatagen (#31581) + The metric names and their properties, such as bucket boundaries for histograms, were kept like before, to keep backwards compatibility. +- `kafka`: Added `disable_fast_negotiation` configuration option for Kafka Kerberos authentication, allowing the disabling of PA-FX-FAST negotiation. (#26345) +- `pkg/ottl`: Added `keep_matching_keys` function to allow dropping all keys from a map that don't match the pattern. (#32989) +- `OTel-Arrow`: Update to OTel-Arrow v0.24.0 (#26491) +- `pkg/ottl`: Add debug logs to help troubleshoot OTTL statements/conditions (#33274) +- `pkg/ottl`: Introducing `append` function for appending items into an existing array (#32141) +- `pkg/ottl`: Introducing `Uri` converter parsing URI string into SemConv (#32433) +- `probabilisticsamplerprocessor`: Add Proportional and Equalizing sampling modes (#31918) + Both the existing hash_seed mode and the two new modes use OTEP 235 semantic conventions to encode sampling probability. +- `prometheusreceiver`: Resource attributes produced by the prometheus receiver now include stable semantic conventions for `server` and `url`. (#32814) + To migrate from the legacy net.host.name, net.host.port, and http.scheme resource attributes, | + migrate to server.address, server.port, and url.scheme, and then | + set the receiver.prometheus.removeLegacyResourceAttributes feature gate. + +- `datadogexporter`: The Datadog Exporter now supports the `proxy_url` parameter to configure an HTTP proxy to use when sending telemetry to Datadog. (#33316) +- `spanmetrics`: Produce delta temporality span metrics with StartTimeUnixNano and TimeUnixNano values representing an uninterrupted series (#31671, #30688) + This allows producing delta span metrics instead of the more memory-intensive cumulative metrics, specifically when a downstream component can convert the delta metrics to cumulative. +- `sqlserverreceiver`: Add support for more Database IO metrics (#29865) + The following metrics have been added: + - sqlserver.database.latency + - sqlserver.database.io + - sqlserver.database.operations + +- `cmd/opampsupervisor`: Receive and report effective config to the OpAMP server (#30622) +- `processor/transform`: Add `transform.flatten.logs` featuregate to give each log record a distinct resource and scope. (#32080) + This option is useful when applying transformations which alter the resource or scope. e.g. `set(resource.attributes["to"], attributes["from"])`, which may otherwise result in unexpected behavior. Using this option typically incurs a performance penalty as the processor must compute many hashes and create copies of resource and scope information for every log record. + +- `receiver/windowsperfcounters`: Counter configuration now supports recreating the underlying performance query at scrape time. (#32798) + +### 🧰 Bug fixes 🧰 + +- `filelogreceiver`: Container parser should add k8s metadata as resource attributes and not as log record attributes (#33341) +- `deltatocumulative`: properly drop samples when at limit (#33285) + fixes a segfault in the limiting behavior, where streams exceeding the limit still had their samples processed. due to not being tracked, this led to a nil-pointer deref +- `postgresqlreceiver`: Fix bug where `postgresql.rows` always returning 0 for `state="dead"` (#33489) +- `prometheusreceiver`: Fall back to scrape config job/instance labels for aggregated metrics without instance/job labels (#32555) +- `elasticsearchexporter`: Duplicate Key in JSON (#33454) +- `logzioexporter`: Fix issue where log attributes were not correctly exported (#33231) +- `exporter/datadog`: Prevents collector shut down when Datadog logs pipeline fails to validate API key (#33195) + ## v0.102.0 ### 🛑 Breaking changes 🛑 @@ -499,7 +1894,7 @@ If you are looking for developer-facing changes, check out [CHANGELOG-API.md](./ - `k8sclusterreceiver`: add optional status_last_terminated_reason resource attribute (#31282) - `awsproxyextension`: Expose service_name as configurable option. Previously, it was hardcoded as xray. (#29550) - `datadogexporter`: Add new telemetry metric, `otelcol_datadog_otlp_translator_resources_missing_source` that counts OTLP resources missing a hostname-identifying attribute. (#31805) - - Enable Collector metrics https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/troubleshooting.md#metrics to check for this metric. + - Enable Collector metrics https://opentelemetry.io/docs/collector/internal-telemetry/#configure-internal-metrics to check for this metric. - `extension/opamp`: Promote the OpAMP extension to alpha stability (#31616) - `prometheusremotewriteexporter`: Publish telemetry about translation of metrics from Otel to Prometheus. Don't drop all data points if some fail translation. (#29729) @@ -3860,7 +5255,7 @@ This version has been skipped. ### 🚀 New components 🚀 - `telemetryquerylanguage`: Expose the telemetry query language as a package. (#11751) -- `chronyreceiver`: -| This component is a pure go implementation for capturing data from [chrony](https://chrony.tuxfamily.org/) (#11789) +- `chronyreceiver`: -| This component is a pure go implementation for capturing data from [chrony](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system_administrators_guide/ch-configuring_ntp_using_the_chrony_suite) (#11789) - `otlpjsonfilereceiver`: Add a new file receiver reading JSON-encoded OTLP data, after [serialization specification](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/file-exporter.md#json-file-serialization) (#10836) - `pulsarexporter`: Add Apache Pulsar exporter (#9795) - `solacereceiver`: Add Solace receiver to receive trace data from a Solace PubSub+ Event Broker. (#10572) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8eda4e2361c7..7b2ca3c127d2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -114,9 +114,7 @@ issue](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/ providing the following information: * Who's the sponsor for your component. A sponsor is an approver or maintainer who will be the official reviewer of the code and a code owner - for the component. For vendor-specific components, it is always preferred to find a sponsor. However, if the vendor has not yet contributed - a component of the same class (i.e. receiver, processor, exporter, connector, or extension), then a sponsor will be assigned in a - round-robin fashion. In all other cases, you will need to find a sponsor for the component in order for it to be accepted. + for the component. You will need to find a sponsor for the component in order for it to be accepted. * Some information about your component, such as the reasoning behind it, use-cases, telemetry data types supported, and anything else you think is relevant for us to make a decision about accepting the component. * The configuration options your component will accept. This will give us a better understanding of what it does, and @@ -156,10 +154,15 @@ and its contributors. available configuration settings so users can copy and modify them as needed. - Run `make crosslink` to update intra-repository dependencies. It will add a `replace` directive to `go.mod` file of every intra-repository dependant. This is necessary for your component to be included in the contrib executable. - Add your component to `versions.yaml`. -- All components included in the distribution must be included in [`cmd/otelcontribcol/builder-config.yaml`](./cmd/otelcontribcol/builder-config.yaml) - and in the respective testing harnesses. To align with the test goal of the project, components must be testable within the framework defined within - the folder. If a component can not be properly tested within the existing framework, it must increase the non testable - components number with a comment within the PR explaining as to why it can not be tested. +- All components included in the distribution must be included in + [`cmd/otelcontribcol/builder-config.yaml`](./cmd/otelcontribcol/builder-config.yaml) + and in the respective testing harnesses. To align with the test goal of the + project, components must be testable within the framework defined within the + folder. If a component can not be properly tested within the existing + framework, it must increase the non testable components number with a comment + within the PR explaining as to why it can not be tested. **(Note: this does + not automatically include any components in official release binaries. See + [Releasing new components](#releasing-new-components).)** - Create a `metadata.yaml` file with at minimum the required fields defined in [metadata-schema.yaml](https://github.com/open-telemetry/opentelemetry-collector/blob/main/cmd/mdatagen/metadata-schema.yaml). Here is a minimal representation: @@ -212,6 +215,7 @@ When submitting a component to the community, consider breaking it down into sep * `make generate` * `make multimod-verify` * `make generate-gh-issue-templates` + * `make addlicense` * **Second PR** should include the concrete implementation of the component. If the size of this PR is larger than the recommended size consider splitting it in multiple PRs. @@ -231,33 +235,10 @@ When submitting a component to the community, consider breaking it down into sep to the [OpenTelemetry.io registry](https://github.com/open-telemetry/opentelemetry.io#adding-a-project-to-the-opentelemetry-registry). ### Releasing New Components -After a component has been approved and merged, and has been enabled in `internal/components/`, it must be added to the +After a component has been merged it must be added to the [OpenTelemetry Collector Contrib's release manifest.yaml](https://github.com/open-telemetry/opentelemetry-collector-releases/blob/main/distributions/otelcol-contrib/manifest.yaml) to be included in the distributed otelcol-contrib binaries and docker images. -### Rotating sponsors - -The following GitHub users are the currently available sponsors, either by being an approver or a maintainer of the contrib repository. The list is ordered based on a random sort of the list of sponsors done live at the Collector SIG meeting on 27-Apr-2022 and serves as the seed for the round-robin selection of sponsors, as described in the section above. - -* [@djaglowski](https://github.com/djaglowski) -* [@codeboten](https://github.com/codeboten) -* [@mx-psi](https://github.com/mx-psi) -* [@dmitryax](https://github.com/dmitryax) -* [@evan-bradley](https://github.com/evan-bradley) -* [@MovieStoreGuy](https://github.com/MovieStoreGuy) -* [@bogdandrutu](https://github.com/bogdandrutu) -* [@jpkrohling](https://github.com/jpkrohling) -* [@dashpole](https://github.com/dashpole) -* [@TylerHelmuth](https://github.com/TylerHelmuth) -* [@fatsheep9146](https://github.com/fatsheep9146) -* [@andrzej-stencel](https://github.com/andrzej-stencel) -* [@songy23](https://github.com/songy23) -* [@Bryan Aguilar](https://github.com/bryan-aguilar) -* [@atoulme](https://github.com/atoulme) -* [@crobert-1](https://github.com/crobert-1) - -Whenever a sponsor is picked from the top of this list, please move them to the bottom. - ## Adding metrics to existing receivers Following these steps for contributing additional metrics to existing receivers. - Read instructions [here](https://github.com/open-telemetry/opentelemetry-collector/blob/main/CONTRIBUTING.md#fork) on how to @@ -283,77 +264,7 @@ in general try to follow them. ## Issue Triaging -To help provide a consistent process for seeing issues through to completion, this section details some guidelines and -definitions to keep in mind when triaging issues. - -### Roles - -Determining the root cause of issues is a shared responsibility between those with triager permissions, code owners, -OpenTelemetry community members, issue authors, and anyone else who would like to contribute. - -#### Triagers - -Contributors with [triager](https://github.com/open-telemetry/opentelemetry-collector-contrib/#contributing) permissions can help move -issues along by adding missing component labels, which help organize issues and trigger automations to notify code owners. They can -also use their familiarity with the Collector and its components to investigate issues themselves. Alternatively, they may point issue -authors to another resource or someone else who may know more. - -#### Code Owners - -In many cases, the code owners for an issue are the best resource to help determine the root cause of a bug or whether an enhancement -is fit to be added to a component. Code owners will be notified by repository automations when: - -- a component label is added to an issue -- an issue is opened -- the issue becomes stale - -Code owners may not have triager permissions on the repository, -so they can help triage through investigation and by participating in discussions. They can also help organize issues by -[adding labels via comments](#adding-labels-via-comments). - -#### Community Members - -Community members or interested parties are welcome to help triage issues by investigating the root cause of bugs, adding input for -features they would like to see, or participating in design discussions. - -### Triage process - -Triaging an issue requires getting the issue into a state where there is enough information available on the issue or understanding -between the involved parties to allow work to begin or for the issue to be closed. Facilitating this may involve, but is not limited to: - -- Determining whether the issue is related to the code or documentation, or whether the issue can be resolved without any changes. -- Ensuring that a bug can be reproduced, and if possible, the behavior can be traced back to the offending code or documentation. -- Determining whether a feature request belongs in a component, should be accomplished through other means, or isn't appropriate for a component at this time. -- Guiding any interested parties to another person or resource that may be more knowledgeable about an issue. -- Suggesting an issue for discussion at a SIG meeting if a synchronous discussion would be more productive. - -#### Issue assignment - -Issues are assigned for someone to work on by a triager when someone volunteers to work on an issue. Assignment is intended to prevent duplicate work by making it visible who is -working on a particular task. A person who is assigned to the issue may be assigned to help triage the issue and implement it, or can be assigned after the issue has already been -triaged and is ready for work. If someone who is assigned to an issue is no longer able to work on it, they may request to be unassigned from the issue. - -### Label Definitions - -| Label | When to apply | -| -------------------- |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `bug` | Something that is advertised or intended to work isn't working as expected. | -| `enhancement` | Something that isn't an advertised feature that would be useful to users or maintainers. | -| `flaky test` | A test unexpectedly failed during CI, showing that there is a problem with the tests or test setup that is causing the tests to intermittently fail. | -| `documentation` | This is a collector usability issue that could likely be resolved by providing relevant documentation. Please consider adding new or improving existing documentation before closing issues with this label. | -| `good first issue` | Implementing this issue would not require specialized or in-depth knowledge about the component and is ideal for a new or first-time contributor to take. | -| `help wanted` | The code owners for this component do not expect to have time to work on it soon, and would welcome help from contributors. | -| `discussion needed` | This issue needs more input from the maintainers or community before work can be started. | -| `needs triage` | This label is added automatically, and can be removed when a triager or code owner deems that an issue is either ready for work or should not need any work. See also the [triaging process](#triage-process). | -| `waiting for author` | Can be applied when input is required from the author before the issue can move any further. | -| `priority:p0` | A critical security vulnerability or Collector panic using a default or common configuration unrelated to a specific component. | -| `priority:p1` | An urgent issue that should be worked on quickly, before most other issues. | -| `priority:p2` | A standard bug or enhancement. | -| `priority:p3` | A technical improvement, lower priority bug, or other minor issue. Generally something that is considered a "nice to have." | -| `release:blocker` | This issue must be resolved before the next Collector version can be released. | -| `Sponsor Needed` | A new component has been proposed, but implementation is not ready to begin. This can be because a sponsor has not yet been decided, or because some details on the component still need to be decided. | -| `Accepted Component` | A sponsor has elected to take on a component and implementation is ready to begin. | -| `Vendor Specific Component` | This should be applied to any component proposal where the functionality for the component is particular to a vendor. | +See [issue-triaging.md](./issue-triaging.md) for more information on the issue triaging process. ### Adding Labels via Comments @@ -361,13 +272,24 @@ In order to facilitate proper label usage and to empower Code Owners, you are ab The following general labels are supported: -| Label | Label in Comment | -|----------------------|----------------------| -| `good first issue` | `good-first-issue` | -| `help wanted` | `help-wanted` | -| `discussion needed` | `discussion-needed` | -| `needs triage` | `needs-triage` | -| `waiting for author` | `waiting-for-author` | +| Label | Label in Comment | +|---------------------------|---------------------------| +| `arm64` | `arm64` | +| `good first issue` | `good-first-issue` | +| `help wanted` | `help-wanted` | +| `discussion needed` | `discussion-needed` | +| `needs triage` | `needs-triage` | +| `os:mac` | `os:mac` | +| `os:windows` | `os:windows` | +| `waiting for author` | `waiting-for-author` | +| `waiting-for-code-owners` | `waiting-for-code-owners` | +| `bug` | `bug` | +| `priority:p0` | `priority:p0` | +| `priority:p1` | `priority:p1` | +| `priority:p2` | `priority:p2` | +| `priority:p3` | `priority:p3` | +| `Stale` | `stale` | +| `never stale` | `never-stale` | To delete a label, prepend the label with `-`. Note that you must make a new comment to modify labels; you cannot edit an existing comment. @@ -377,7 +299,13 @@ Example label comment: /label receiver/prometheus help-wanted -exporter/prometheus ``` -## Becoming a Code Owner +## Membership, Roles, and Responsibilities + +### Membership levels + +See the [OpenTelemetry membership guide](https://github.com/open-telemetry/community/blob/main/guides/contributor/membership.md) for information on how to become a member of the OpenTelemetry organization and the different roles available. In addition to the roles listed there we also have a Collector-specific role: code owners. + +### Becoming a Code Owner A Code Owner is responsible for a component within Collector Contrib, as indicated by the [CODEOWNERS file](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/.github/CODEOWNERS). That responsibility includes maintaining the component, triaging and responding to issues, and reviewing pull requests. @@ -390,16 +318,16 @@ Sometimes a component may be in need of a new or additional Code Owner. A few re Code Ownership does not have to be a full-time job. If you can find a couple hours to help out on a recurring basis, please consider pursuing Code Ownership. -### Requirements +#### Requirements If you would like to help and become a Code Owner you must meet the following requirements: -1. [Be a member of the OpenTelemetry organization.](https://github.com/open-telemetry/community/blob/main/community-membership.md#member) +1. [Be a member of the OpenTelemetry organization.](https://github.com/open-telemetry/community/blob/main/guides/contributor/membership.md#member) 2. (Code Owner Discretion) It is best to have resolved an issue related to the component, contributed directly to the component, and/or review component PRs. How much interaction with the component is required before becoming a Code Owner is up to any existing Code Owners. Code Ownership is ultimately up to the judgement of the existing Code Owners and Collector Contrib Maintainers. Meeting the above requirements is not a guarantee to be granted Code Ownership. -### How to become a Code Owner +#### How to become a Code Owner To become a Code Owner, open a PR with the following changes: @@ -410,6 +338,14 @@ To become a Code Owner, open a PR with the following changes: Be sure to tag the existing Code Owners, if any, within the PR to ensure they receive a notification. +### Emeritus roles + +Contributors who are unable to meet the responsibilities of their role are encouraged to move to [emeritus](https://github.com/open-telemetry/community/blob/main/guides/contributor/membership.md#emeritus-maintainerapprovertriager). In case of long temporary absences, contributors are encouraged to let maintainers know on the CNCF Slack (e.g. on the #otel-collector-dev channel or privately via DM) and to mark themselves as 'Busy' on Github. + +In the event that a contributor becomes inactive without prior notice, the maintainers will attempt to contact the contributor via both Github and the CNCF Slack to confirm their status. After two weeks, if the contributor is an approver or maintainer, they may be removed from the Github review auto-assignment. + +If the contributor does not respond within a period of two months, they may be moved to emeritus status at the discretion of the maintainers, following a majority vote among the maintainers (possibly excluding the contributor in question). + ## Makefile Guidelines When adding or modifying the `Makefile`'s in this repository, consider the following design guidelines. diff --git a/Makefile b/Makefile index 5adbfaf09e38..176ba2b07f85 100644 --- a/Makefile +++ b/Makefile @@ -6,6 +6,9 @@ OTEL_VERSION=main OTEL_STABLE_VERSION=main VERSION=$(shell git describe --always --match "v[0-9]*" HEAD) +TRIMMED_VERSION=$(shell grep -o 'v[^-]*' <<< "$(VERSION)" | cut -c 2-) +CORE_VERSIONS=$(SRC_PARENT_DIR)/opentelemetry-collector/versions.yaml +GOMOD=$(SRC_ROOT)/cmd/otelcontribcol/go.mod COMP_REL_PATH=cmd/otelcontribcol/components.go MOD_NAME=github.com/open-telemetry/opentelemetry-collector-contrib @@ -44,10 +47,11 @@ CONNECTOR_MODS := $(shell find ./connector/* $(FIND_MOD_ARGS) -exec $(TO_MOD_DIR INTERNAL_MODS := $(shell find ./internal/* $(FIND_MOD_ARGS) -exec $(TO_MOD_DIR) ) PKG_MODS := $(shell find ./pkg/* $(FIND_MOD_ARGS) -exec $(TO_MOD_DIR) ) CMD_MODS_0 := $(shell find ./cmd/[a-m]* $(FIND_MOD_ARGS) -exec $(TO_MOD_DIR) ) -CMD_MODS_1 := $(shell find ./cmd/[n-z]* $(FIND_MOD_ARGS) -not -path "./cmd/otelcontribcol/*" -exec $(TO_MOD_DIR) ) +CMD_MODS_1 := $(shell find ./cmd/[n-z]* $(FIND_MOD_ARGS) -not -path "./cmd/otel*col/*" -exec $(TO_MOD_DIR) ) CMD_MODS := $(CMD_MODS_0) $(CMD_MODS_1) OTHER_MODS := $(shell find . $(EX_COMPONENTS) $(EX_INTERNAL) $(EX_PKG) $(EX_CMD) $(FIND_MOD_ARGS) -exec $(TO_MOD_DIR) ) $(PWD) ALL_MODS := $(RECEIVER_MODS) $(PROCESSOR_MODS) $(EXPORTER_MODS) $(EXTENSION_MODS) $(CONNECTOR_MODS) $(INTERNAL_MODS) $(PKG_MODS) $(CMD_MODS) $(OTHER_MODS) +CGO_MODS := ./receiver/hostmetricsreceiver FIND_INTEGRATION_TEST_MODS={ find . -type f -name "*integration_test.go" & find . -type f -name "*e2e_test.go" -not -path "./testbed/*"; } INTEGRATION_MODS := $(shell $(FIND_INTEGRATION_TEST_MODS) | xargs $(TO_MOD_DIR) | uniq) @@ -115,6 +119,10 @@ gogci: gotidy: $(MAKE) $(FOR_GROUP_TARGET) TARGET="tidy" +.PHONY: remove-toolchain +remove-toolchain: + $(MAKE) $(FOR_GROUP_TARGET) TARGET="toolchain" + .PHONY: gomoddownload gomoddownload: $(MAKE) $(FOR_GROUP_TARGET) TARGET="moddownload" @@ -128,6 +136,14 @@ gotest-with-cover: @$(MAKE) $(FOR_GROUP_TARGET) TARGET="test-with-cover" $(GOCMD) tool covdata textfmt -i=./coverage/unit -o ./$(GROUP)-coverage.txt +.PHONY: gobuildtest +gobuildtest: + $(MAKE) $(FOR_GROUP_TARGET) TARGET="buildtest" + +.PHONY: gorunbuilttest +gorunbuilttest: + $(MAKE) $(FOR_GROUP_TARGET) TARGET="runbuilttest" + .PHONY: gointegration-test gointegration-test: $(MAKE) $(FOR_GROUP_TARGET) TARGET="mod-integration-test" @@ -144,6 +160,14 @@ golint: gogovulncheck: $(MAKE) $(FOR_GROUP_TARGET) TARGET="govulncheck" +.PHONY: gotestifylint +gotestifylint: + $(MAKE) $(FOR_GROUP_TARGET) TARGET="testifylint" + +.PHONY: gotestifylint-fix +gotestifylint-fix: + $(MAKE) $(FOR_GROUP_TARGET) TARGET="testifylint-fix" + .PHONY: goporto goporto: $(PORTO) $(PORTO) -w --include-internal --skip-dirs "^cmd$$" ./ @@ -245,6 +269,9 @@ for-other-target: $(OTHER_MODS) .PHONY: for-integration-target for-integration-target: $(INTEGRATION_MODS) +.PHONY: for-cgo-target +for-cgo-target: $(CGO_MODS) + # Debugging target, which helps to quickly determine whether for-all-target is working or not. .PHONY: all-pwd all-pwd: @@ -275,13 +302,12 @@ docker-otelcontribcol: docker-telemetrygen: GOOS=linux GOARCH=$(GOARCH) $(MAKE) telemetrygen cp bin/telemetrygen_* cmd/telemetrygen/ - cd cmd/telemetrygen && docker build --platform linux/$(GOARCH) -t telemetrygen:latest . + cd cmd/telemetrygen && docker build --platform linux/$(GOARCH) --build-arg="TARGETOS=$(GOOS)" --build-arg="TARGETARCH=$(GOARCH)" -t telemetrygen:latest . rm cmd/telemetrygen/telemetrygen_* .PHONY: generate generate: install-tools - cd ./internal/tools && go install go.opentelemetry.io/collector/cmd/mdatagen - $(MAKE) for-all CMD="$(GOCMD) generate ./..." + PATH="$$PWD/.tools:$$PATH" $(MAKE) for-all CMD="$(GOCMD) generate ./..." $(MAKE) gofmt .PHONY: githubgen-install @@ -319,38 +345,85 @@ chlog-update: $(CHLOGGEN) .PHONY: genotelcontribcol genotelcontribcol: $(BUILDER) $(BUILDER) --skip-compilation --config cmd/otelcontribcol/builder-config.yaml --output-path cmd/otelcontribcol - $(MAKE) --no-print-directory -C cmd/otelcontribcol fmt # Build the Collector executable. .PHONY: otelcontribcol -otelcontribcol: +otelcontribcol: genotelcontribcol cd ./cmd/otelcontribcol && GO111MODULE=on CGO_ENABLED=0 $(GOCMD) build -trimpath -o ../../bin/otelcontribcol_$(GOOS)_$(GOARCH)$(EXTENSION) \ -tags $(GO_BUILD_TAGS) . +# Build the Collector executable without the symbol table, debug information, and the DWARF symbol table. +.PHONY: otelcontribcollite +otelcontribcollite: genotelcontribcol + cd ./cmd/otelcontribcol && GO111MODULE=on CGO_ENABLED=0 $(GOCMD) build -trimpath -o ../../bin/otelcontribcol_$(GOOS)_$(GOARCH)$(EXTENSION) \ + -tags $(GO_BUILD_TAGS) -ldflags $(GO_BUILD_LDFLAGS) . + .PHONY: genoteltestbedcol genoteltestbedcol: $(BUILDER) $(BUILDER) --skip-compilation --config cmd/oteltestbedcol/builder-config.yaml --output-path cmd/oteltestbedcol - $(MAKE) --no-print-directory -C cmd/oteltestbedcol fmt # Build the Collector executable, with only components used in testbed. .PHONY: oteltestbedcol -oteltestbedcol: +oteltestbedcol: genoteltestbedcol cd ./cmd/oteltestbedcol && GO111MODULE=on CGO_ENABLED=0 $(GOCMD) build -trimpath -o ../../bin/oteltestbedcol_$(GOOS)_$(GOARCH)$(EXTENSION) \ -tags $(GO_BUILD_TAGS) . +.PHONY: oteltestbedcollite +oteltestbedcollite: genoteltestbedcol + cd ./cmd/oteltestbedcol && GO111MODULE=on CGO_ENABLED=0 $(GOCMD) build -trimpath -o ../../bin/oteltestbedcol_$(GOOS)_$(GOARCH)$(EXTENSION) \ + -tags $(GO_BUILD_TAGS) -ldflags $(GO_BUILD_LDFLAGS) . + # Build the telemetrygen executable. .PHONY: telemetrygen telemetrygen: cd ./cmd/telemetrygen && GO111MODULE=on CGO_ENABLED=0 $(GOCMD) build -trimpath -o ../../bin/telemetrygen_$(GOOS)_$(GOARCH)$(EXTENSION) \ -tags $(GO_BUILD_TAGS) . +.PHONY: telemetrygenlite +telemetrygenlite: + cd ./cmd/telemetrygen && GO111MODULE=on CGO_ENABLED=0 $(GOCMD) build -trimpath -o ../../bin/telemetrygen_$(GOOS)_$(GOARCH)$(EXTENSION) \ + -tags $(GO_BUILD_TAGS) -ldflags $(GO_BUILD_LDFLAGS) . + +# helper function to update the core packages in builder-config.yaml +# input parameters are +# $(1) = path/to/versions.yaml (where it greps the relevant packages) +# $(2) = path/to/go.mod (where it greps the package-versions) +# $(3) = path/to/builder-config.yaml (where we want to update the versions) +define updatehelper + if [ ! -f $(1) ] || [ ! -f $(2) ] || [ ! -f $(3) ]; then \ + echo "Usage: updatehelper "; \ + exit 1; \ + fi + grep "go\.opentelemetry\.io" $(1) | sed 's/^[[:space:]]*-[[:space:]]*//' | while IFS= read -r line; do \ + if grep -qF "$$line" $(2); then \ + package=$$(grep -F "$$line" $(2) | head -n 1 | awk '{print $$1}'); \ + version=$$(grep -F "$$line" $(2) | head -n 1 | awk '{print $$2}'); \ + builder_package=$$(grep -F "$$package" $(3) | awk '{print $$3}'); \ + builder_version=$$(grep -F "$$package" $(3) | awk '{print $$4}'); \ + if [ "$$builder_package" == "$$package" ]; then \ + sed -i.bak -e "s|$$builder_package.*$$builder_version|$$builder_package $$version|" $(3); \ + rm $(3).bak; \ + echo "[$(3)]: $$package updated from $$builder_version to $$version"; \ + fi; \ + fi; \ + done +endef + + .PHONY: update-otel update-otel:$(MULTIMOD) $(MULTIMOD) sync -s=true -o ../opentelemetry-collector -m stable --commit-hash $(OTEL_STABLE_VERSION) - git add . && git commit -s -m "[chore] multimod update stable modules" + git add . && git commit -s -m "[chore] multimod update stable modules" ; \ $(MULTIMOD) sync -s=true -o ../opentelemetry-collector -m beta --commit-hash $(OTEL_VERSION) - git add . && git commit -s -m "[chore] multimod update beta modules" + git add . && git commit -s -m "[chore] multimod update beta modules" ; \ $(MAKE) gotidy + $(call updatehelper,$(CORE_VERSIONS),$(GOMOD),./cmd/otelcontribcol/builder-config.yaml) + $(call updatehelper,$(CORE_VERSIONS),$(GOMOD),./cmd/oteltestbedcol/builder-config.yaml) + $(MAKE) genotelcontribcol + $(MAKE) genoteltestbedcol + $(MAKE) oteltestbedcol + $(MAKE) remove-toolchain + git add . && git commit -s -m "[chore] mod and toolchain tidy" ; \ .PHONY: otel-from-tree otel-from-tree: @@ -478,10 +551,8 @@ clean: find . -type f -name 'coverage.out' -delete find . -type f -name 'integration-coverage.txt' -delete find . -type f -name 'integration-coverage.html' -delete - -.PHONY: genconfigdocs -genconfigdocs: - cd cmd/configschema && $(GOCMD) run ./docsgen all + @echo "Removing built binary files" + find . -type f -name 'builtunitetest.test' -delete .PHONY: generate-gh-issue-templates generate-gh-issue-templates: @@ -501,4 +572,4 @@ checks: $(MAKE) gendistributions $(MAKE) -j4 generate $(MAKE) multimod-verify - git diff --exit-code || (echo 'Some files need committing' && git status && exit 1) + git diff --exit-code || (echo 'Some files need committing' && git status && exit 1) diff --git a/Makefile.Common b/Makefile.Common index 6b54df6b6720..3b742e42a2ba 100644 --- a/Makefile.Common +++ b/Makefile.Common @@ -21,10 +21,12 @@ endif # SRC_ROOT is the top of the source tree. SRC_ROOT := $(shell git rev-parse --show-toplevel) # SRC_PARENT_DIR is the absolute path of source tree's parent directory -SRC_PARENT_DIR := $(shell dirname $(SRC_ROOT)) +SRC_PARENT_DIR := $(shell dirname $(SRC_ROOT)) # build tags required by any component should be defined as an independent variables and later added to GO_BUILD_TAGS below GO_BUILD_TAGS="" +# These ldflags allow the build tool to omit the symbol table, debug information, and the DWARF symbol table to downscale binary size. +GO_BUILD_LDFLAGS="-s -w" GOTEST_TIMEOUT?= 600s GOTEST_OPT?= -race -timeout $(GOTEST_TIMEOUT) -parallel 4 --tags=$(GO_BUILD_TAGS) GOTEST_INTEGRATION_OPT?= -race -timeout 360s -parallel 4 @@ -34,6 +36,7 @@ GOTEST_OPT_WITH_INTEGRATION_COVERAGE=$(GOTEST_OPT_WITH_INTEGRATION) -coverprofil GOCMD?= go GOOS=$(shell $(GOCMD) env GOOS) GOARCH=$(shell $(GOCMD) env GOARCH) +GOTESTARCH?=$(GOARCH) # In order to help reduce toil related to managing tooling for the open telemetry collector # this section of the makefile looks at only requiring command definitions to be defined @@ -54,7 +57,7 @@ $(TOOLS_BIN_DIR): mkdir -p $@ $(TOOLS_BIN_NAMES): $(TOOLS_BIN_DIR) $(TOOLS_MOD_DIR)/go.mod - cd $(TOOLS_MOD_DIR) && $(GOCMD) build -o $@ -trimpath $(filter %/$(notdir $@),$(TOOLS_PKG_NAMES)) + cd $(TOOLS_MOD_DIR) && GOOS="" GOARCH="" $(GOCMD) build -o $@ -trimpath $(filter %/$(notdir $@),$(TOOLS_PKG_NAMES)) ADDLICENSE := $(TOOLS_BIN_DIR)/addlicense MDLINKCHECK := $(TOOLS_BIN_DIR)/markdown-link-check @@ -69,11 +72,14 @@ CHECKFILE := $(TOOLS_BIN_DIR)/checkfile CROSSLINK := $(TOOLS_BIN_DIR)/crosslink GOJUNIT := $(TOOLS_BIN_DIR)/go-junit-report BUILDER := $(TOOLS_BIN_DIR)/builder +GOFUMPT := $(TOOLS_BIN_DIR)/gofumpt GOVULNCHECK := $(TOOLS_BIN_DIR)/govulncheck GCI := $(TOOLS_BIN_DIR)/gci GOTESTSUM := $(TOOLS_BIN_DIR)/gotestsum +TESTIFYLINT := $(TOOLS_BIN_DIR)/testifylint GOTESTSUM_OPT?= --rerun-fails=1 +TESTIFYLINT_OPT?= --enable-all --disable=float-compare,require-error,suite-subtest-run,encoded-compare # BUILD_TYPE should be one of (dev, release). BUILD_TYPE?=release @@ -85,7 +91,7 @@ ALL_SRC := $(shell find $(ALL_PKG_DIRS) -name '*.go' \ -not -path '*/local/*' \ -type f | sort) -ALL_SRC_AND_SHELL := find . -type f \( -iname '*.go' -o -iname "*.sh" \) ! -path '**/third_party/*' | sort +ALL_SRC_AND_SHELL := find . -type f \( -iname '*.go' -o -iname "*.sh" \) ! -path '**/third_party/*' | sort # All source code and documents. Used in spell check. ALL_SRC_AND_DOC_CMD := find $(ALL_PKG_DIRS) -name "*.md" -o -name "*.go" -o -name "*.yaml" -not -path '*/third_party/*' -type f | sort @@ -133,24 +139,36 @@ test-with-cover: $(GOTESTSUM) .PHONY: do-unit-tests-with-cover do-unit-tests-with-cover: $(GOTESTSUM) @echo "running $(GOCMD) unit test ./... + coverage in `pwd`" - $(GOTESTSUM) $(GOTESTSUM_OPT) --packages="./..." -- $(GOTEST_OPT_WITH_COVERAGE) + $(GOTESTSUM) $(GOTESTSUM_OPT) --packages="./..." -- $(GOTEST_OPT_WITH_COVERAGE) $(GOCMD) tool cover -html=coverage.txt -o coverage.html +.PHONY: buildtest +buildtest: +ifneq (,$(wildcard ./*.go)) + GOARCH=$(GOTESTARCH) CGO_ENABLED=1 $(GOCMD) test -c -o builtunitetest.test +endif + +.PHONY: runbuilttest +runbuilttest: $(GOTESTSUM) +ifneq (,$(wildcard ./builtunitetest.test)) + $(GOTESTSUM) --raw-command -- $(GOCMD) tool test2json -p "./..." -t ./builtunitetest.test -test.v -test.failfast -test.timeout $(GOTEST_TIMEOUT) +endif + .PHONY: mod-integration-test mod-integration-test: $(GOTESTSUM) @echo "running $(GOCMD) integration test ./... in `pwd`" $(GOTESTSUM) $(GOTESTSUM_OPT) --packages="./..." -- $(GOTEST_OPT_WITH_INTEGRATION) @if [ -e integration-coverage.txt ]; then \ - $(GOCMD) tool cover -html=integration-coverage.txt -o integration-coverage.html; \ - fi + $(GOCMD) tool cover -html=integration-coverage.txt -o integration-coverage.html; \ + fi .PHONY: do-integration-tests-with-cover do-integration-tests-with-cover: $(GOTESTSUM) @echo "running $(GOCMD) integration test ./... + coverage in `pwd`" - $(GOTESTSUM) $(GOTESTSUM_OPT) --packages="./..." -- $(GOTEST_OPT_WITH_INTEGRATION_COVERAGE) + $(GOTESTSUM) $(GOTESTSUM_OPT) --packages="./..." -- $(GOTEST_OPT_WITH_INTEGRATION_COVERAGE) @if [ -e integration-coverage.txt ]; then \ - $(GOCMD) tool cover -html=integration-coverage.txt -o integration-coverage.html; \ - fi + $(GOCMD) tool cover -html=integration-coverage.txt -o integration-coverage.html; \ + fi .PHONY: benchmark benchmark: $(GOTESTSUM) @@ -190,9 +208,9 @@ checklinks: $(MDLINKCHECK) -q -c $(SRC_ROOT)/.github/workflows/check_links_config.json || true .PHONY: fmt -fmt: $(GOIMPORTS) - gofmt -w -s ./ - $(GOIMPORTS) -w -local github.com/open-telemetry/opentelemetry-collector-contrib ./ +fmt: $(GOFUMPT) $(GOIMPORTS) + $(GOFUMPT) -l -w . + $(GOIMPORTS) -w -local github.com/open-telemetry/opentelemetry-collector-contrib ./ .PHONY: lint lint: $(LINT) checklicense misspell @@ -205,7 +223,11 @@ govulncheck: $(GOVULNCHECK) .PHONY: tidy tidy: rm -fr go.sum - $(GOCMD) mod tidy -compat=1.21.0 + $(GOCMD) mod tidy -compat=1.22.0 + +.PHONY: toolchain +toolchain: + $(GOCMD) get toolchain@none .PHONY: misspell misspell: $(TOOLS_BIN_DIR)/misspell @@ -220,6 +242,15 @@ misspell-correction: $(TOOLS_BIN_DIR)/misspell moddownload: $(GOCMD) mod download +.PHONY: testifylint +testifylint: $(TESTIFYLINT) + @echo "running $(TESTIFYLINT)" + $(TESTIFYLINT) $(TESTIFYLINT_OPT) ./... + +.PHONY: testifylint-fix +testifylint-fix: + @$(MAKE) testifylint TESTIFYLINT_OPT="${TESTIFYLINT_OPT} --fix" + .PHONY: gci gci: $(TOOLS_BIN_DIR)/gci @echo "running $(GCI)" diff --git a/NOTICE b/NOTICE index 72a751368a46..c3c924e79ce6 100644 --- a/NOTICE +++ b/NOTICE @@ -24,4 +24,20 @@ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +internal/grpcutil contains code derived from gRPC-Go + +Copyright 2014 gRPC authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/README.md b/README.md index dad96647a1f5..4da0af385719 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Vision   •   - Monitoring + Observability   •   Security   •   @@ -59,7 +59,7 @@ Some features are hidden behind feature gates before they are part of the main c Each component is supported either by the community of OpenTelemetry Collector Contrib maintainers, as defined by the GitHub group [@open-telemetry/collector-contrib-maintainer](https://github.com/orgs/open-telemetry/teams/collector-contrib-maintainer), or by specific vendors. See the individual README files for information about the specific components. -The OpenTelemetry Collector Contrib maintainers may at any time downgrade specific components, including vendor-specific ones, if they are deemed unmaintained or if they pose a risk to the repository and/or binary distribution. +The OpenTelemetry Collector Contrib maintainers may at any time downgrade specific components if they are deemed unmaintained or if they pose a risk to the repository and/or binary distribution. Even though the OpenTelemetry Collector Contrib maintainers are ultimately responsible for the components hosted here, actual support will likely be provided by individual contributors, typically a code owner for the specific component. @@ -70,33 +70,38 @@ See [CONTRIBUTING.md](CONTRIBUTING.md). Triagers ([@open-telemetry/collector-contrib-triagers](https://github.com/orgs/open-telemetry/teams/collector-contrib-triagers)) - [Benedikt Bongartz](https://github.com/frzifus), Red Hat +- [Florian Bacher](https://github.com/bacherfl), Dynatrace - [Jared Tan](https://github.com/JaredTan95), DaoCloud -- [Matt Wear](https://github.com/mwear), Lightstep - [Murphy Chen](https://github.com/Frapschen), DaoCloud +- [Paulo Janotti](https://github.com/pjanotti), Splunk +- [Vihas Makwana](https://github.com/VihasMakwana), Elastic +- [Braydon Kains](https://github.com/braydonk), Google - Actively seeking contributors to triage issues Emeritus Triagers: -- [Alolita Sharma](https://github.com/alolita), AWS -- [Gabriel Aszalos](https://github.com/gbbr), DataDog -- [Goutham Veeramachaneni](https://github.com/gouthamve), Grafana -- [Punya Biswal](https://github.com/punya), Google -- [Steve Flanders](https://github.com/flands), Splunk +- [Alolita Sharma](https://github.com/alolita) +- [Gabriel Aszalos](https://github.com/gbbr) +- [Goutham Veeramachaneni](https://github.com/gouthamve) +- [Punya Biswal](https://github.com/punya) +- [Steve Flanders](https://github.com/flands) Approvers ([@open-telemetry/collector-contrib-approvers](https://github.com/orgs/open-telemetry/teams/collector-contrib-approvers)): - [Antoine Toulme](https://github.com/atoulme), Splunk -- [Bryan Aguilar](https://github.com/bryan-aguilar), AWS -- [Curtis Robert](https://github.com/crobert-1), Splunk +- [Christos Markou](https://github.com/ChrsMark), Elastic +- [Curtis Robert](https://github.com/crobert-1), Splunk (on leave) - [David Ashpole](https://github.com/dashpole), Google +- [Matt Wear](https://github.com/mwear), Lightstep - [Yang Song](https://github.com/songy23), DataDog - [Ziqi Zhao](https://github.com/fatsheep9146), Alibaba Emeritus Approvers: +- [Anthony Mirabella](https://github.com/Aneurysm9) +- [Bryan Aguilar](https://github.com/bryan-aguilar) - [Przemek Maciolek](https://github.com/pmm-sumo) - [Ruslan Kovalov](https://github.com/kovrus) -- [Anthony Mirabella](https://github.com/Aneurysm9), AWS Maintainers ([@open-telemetry/collector-contrib-maintainer](https://github.com/orgs/open-telemetry/teams/collector-contrib-maintainer)): @@ -108,14 +113,14 @@ Maintainers ([@open-telemetry/collector-contrib-maintainer](https://github.com/o - [Evan Bradley](https://github.com/evan-bradley), Dynatrace - [Juraci Paixão Kröhling](https://github.com/jpkrohling), Grafana Labs - [Pablo Baeyens](https://github.com/mx-psi), DataDog -- [Sean Marciniak](https://github.com/MovieStoreGuy), Atlassian +- [Sean Marciniak](https://github.com/MovieStoreGuy), Splunk - [Tyler Helmuth](https://github.com/TylerHelmuth), Honeycomb Emeritus Maintainers -- [Tigran Najaryan](https://github.com/tigrannajaryan), Splunk +- [Tigran Najaryan](https://github.com/tigrannajaryan) -Learn more about roles in the [community repository](https://github.com/open-telemetry/community/blob/main/community-membership.md). +Learn more about roles in the [community repository](https://github.com/open-telemetry/community/blob/main/guides/contributor/membership.md). ## PRs and Reviews diff --git a/cmd/checkapi/main.go b/cmd/checkapi/main.go index 5e99e6237c36..ac8f43dbc266 100644 --- a/cmd/checkapi/main.go +++ b/cmd/checkapi/main.go @@ -99,7 +99,6 @@ func handleFile(f *ast.File, result *api) { result.Structs = append(result.Structs, t.Name.String()) } } - } } if fn, isFn := d.(*ast.FuncDecl); isFn { @@ -112,7 +111,6 @@ func handleFile(f *ast.File, result *api) { exported = true } if fn.Recv.NumFields() > 0 { - for _, t := range fn.Recv.List { for _, n := range t.Names { exported = exported || n.IsExported() diff --git a/cmd/configschema/README.md b/cmd/configschema/README.md deleted file mode 100644 index 16b99d0f2a93..000000000000 --- a/cmd/configschema/README.md +++ /dev/null @@ -1,8 +0,0 @@ -> Deprecated: [v0.92.0] This tool is deprecated and will be removed in a future release. -> See https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/30187 - -# ConfigSchema API - -This package contains an API that can be used to introspect the configuration -struct of a collector component. It can be used to generate documentation or -tools to help users configure the collector. diff --git a/cmd/configschema/cfgmetadatagen/cfgmetadatagen/README.md b/cmd/configschema/cfgmetadatagen/cfgmetadatagen/README.md deleted file mode 100644 index c3bc43745f84..000000000000 --- a/cmd/configschema/cfgmetadatagen/cfgmetadatagen/README.md +++ /dev/null @@ -1,82 +0,0 @@ -> Deprecated: [v0.92.0] This tool is deprecated and will be removed in a future release. -> See https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/30187 - -# Config Metadata YAML Generator (alpha) - -This CLI application creates a configuration metadata YAML file for each -Collector component where each file describes the field names, types, default -values, and inline documentation for the component's configuration. - -## Operation - -By default, this application creates a new `cfg-metadata` output directory -(overridable via the `-o` flag), subdirectories for each component group -(e.g. `receiver`, `exporter`, etc.), and config metadata YAML files within -those directories for each component. - -### Command line flags - -* `-o ` the name of the default parent directory to be created (defaults to `cfg-metadata`) -* `-s ` the path to the collector source root directory (defaults to `../..`) - -## Example Output - -The following is an example config metadata YAML file (for the File Exporter): - -```yaml -type: '*fileexporter.Config' -doc: | - Config defines configuration for file exporter. -fields: -- name: path - kind: string - default: "" - doc: | - Path of the file to write to. Path is relative to current directory. -- name: rotation - type: '*fileexporter.Rotation' - kind: ptr - doc: | - Rotation defines an option about rotation of telemetry files - fields: - - name: max_megabytes - kind: int - doc: | - MaxMegabytes is the maximum size in megabytes of the file before it gets - rotated. It defaults to 100 megabytes. - - name: max_days - kind: int - doc: | - MaxDays is the maximum number of days to retain old log files based on the - timestamp encoded in their filename. Note that a day is defined as 24 - hours and may not exactly correspond to calendar days due to daylight - savings, leap seconds, etc. The default is not to remove old log files - based on age. - - name: max_backups - kind: int - doc: | - MaxBackups is the maximum number of old log files to retain. The default - is to 100 files. - - name: localtime - kind: bool - default: false - doc: | - LocalTime determines if the time used for formatting the timestamps in - backup files is the computer's local time. The default is to use UTC - time. -- name: format - kind: string - default: json - doc: | - FormatType define the data format of encoded telemetry data - Options: - - json[default]: OTLP json bytes. - - proto: OTLP binary protobuf bytes. -- name: compression - kind: string - default: "" - doc: | - Compression Codec used to export telemetry data - Supported compression algorithms:`zstd` - -``` \ No newline at end of file diff --git a/cmd/configschema/cfgmetadatagen/cfgmetadatagen/cli.go b/cmd/configschema/cfgmetadatagen/cfgmetadatagen/cli.go deleted file mode 100644 index bf4142954d83..000000000000 --- a/cmd/configschema/cfgmetadatagen/cfgmetadatagen/cli.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -// Deprecated: [v0.92.0] This package is deprecated and will be removed in a future release. -// See https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/30187 -package cfgmetadatagen - -import ( - "fmt" - "reflect" - - "go.opentelemetry.io/collector/otelcol" - "gopkg.in/yaml.v2" - - "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/configschema" -) - -// GenerateFiles is the entry point for cfgmetadatagen. Component factories are -// passed in so it can be used by other distros. -// Deprecated: [v0.92.0] This package is deprecated and will be removed in a future release. -// See https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/30187 -func GenerateFiles(factories otelcol.Factories, sourceDir string, outputDir string) error { - dr := configschema.NewDirResolver(sourceDir, configschema.DefaultModule) - writer := newMetadataFileWriter(outputDir) - configs := configschema.GetAllCfgInfos(factories) - for _, cfg := range configs { - err := writeComponentYAML(writer, cfg, dr) - if err != nil { - fmt.Printf("skipped writing config meta yaml: %v\n", err) - } - } - return nil -} - -func writeComponentYAML(yw metadataWriter, cfg configschema.CfgInfo, dr configschema.DirResolver) error { - fields, err := configschema.ReadFields(reflect.ValueOf(cfg.CfgInstance), dr) - if err != nil { - return fmt.Errorf("error reading fields for component %v/%v: %w", cfg.Group, cfg.Type, err) - } - yamlBytes, err := yaml.Marshal(fields) - if err != nil { - return fmt.Errorf("error marshaling to yaml: %w", err) - } - err = yw.write(cfg, yamlBytes) - if err != nil { - return fmt.Errorf("error writing component yaml: %w", err) - } - return nil -} diff --git a/cmd/configschema/cfgmetadatagen/cfgmetadatagen/metadata_writer.go b/cmd/configschema/cfgmetadatagen/cfgmetadatagen/metadata_writer.go deleted file mode 100644 index 39cf75207d6e..000000000000 --- a/cmd/configschema/cfgmetadatagen/cfgmetadatagen/metadata_writer.go +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package cfgmetadatagen - -import ( - "fmt" - "os" - "path/filepath" - - "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/configschema" -) - -type metadataWriter interface { - write(cfg configschema.CfgInfo, bytes []byte) error -} - -type metadataFileWriter struct { - baseDir string - dirsCreated map[string]struct{} -} - -func newMetadataFileWriter(dir string) metadataWriter { - return &metadataFileWriter{ - dirsCreated: map[string]struct{}{}, - baseDir: dir, - } -} - -func (w *metadataFileWriter) write(cfg configschema.CfgInfo, yamlBytes []byte) error { - groupDir := filepath.Join(w.baseDir, cfg.Group) - if err := w.prepDir(groupDir); err != nil { - return err - } - filename := filepath.Join(groupDir, fmt.Sprintf("%s.yaml", cfg.Type)) - fmt.Printf("writing file: %s\n", filename) - return os.WriteFile(filename, yamlBytes, 0600) -} - -func (w *metadataFileWriter) prepDir(dir string) error { - if _, ok := w.dirsCreated[dir]; !ok { - if err := os.MkdirAll(dir, 0700); err != nil { - return fmt.Errorf("failed to make dir %q: %w", dir, err) - } - w.dirsCreated[dir] = struct{}{} - } - return nil -} diff --git a/cmd/configschema/cfgmetadatagen/cfgmetadatagen/metadata_writer_test.go b/cmd/configschema/cfgmetadatagen/cfgmetadatagen/metadata_writer_test.go deleted file mode 100644 index cac82e295124..000000000000 --- a/cmd/configschema/cfgmetadatagen/cfgmetadatagen/metadata_writer_test.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -// skipping windows to avoid this golang bug: https://github.com/golang/go/issues/51442 -//go:build !windows - -package cfgmetadatagen - -import ( - "io" - "os" - "path/filepath" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" - - "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/configschema" -) - -func TestMetadataFileWriter(t *testing.T) { - tempDir := t.TempDir() - w := newMetadataFileWriter(tempDir) - err := w.write(configschema.CfgInfo{Group: "mygroup", Type: component.MustNewType("mytype")}, []byte("hello")) - require.NoError(t, err) - file, err := os.Open(filepath.Join(tempDir, "mygroup", "mytype.yaml")) - require.NoError(t, err) - bytes, err := io.ReadAll(file) - require.NoError(t, err) - assert.EqualValues(t, "hello", bytes) -} diff --git a/cmd/configschema/cfgmetadatagen/cfgmetadatagen/package_test.go b/cmd/configschema/cfgmetadatagen/cfgmetadatagen/package_test.go deleted file mode 100644 index 98e6dc536115..000000000000 --- a/cmd/configschema/cfgmetadatagen/cfgmetadatagen/package_test.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package cfgmetadatagen - -import ( - "testing" - - "go.uber.org/goleak" -) - -func TestMain(m *testing.M) { - goleak.VerifyTestMain(m) -} diff --git a/cmd/configschema/cfgmetadatagen/main.go b/cmd/configschema/cfgmetadatagen/main.go deleted file mode 100644 index e461b4fe7b05..000000000000 --- a/cmd/configschema/cfgmetadatagen/main.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -// Deprecated: [v0.92.0] This package is deprecated and will be removed in a future release. -// See https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/30187 -package main - -import ( - "flag" - "fmt" - "os" - "path/filepath" - - "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/configschema/cfgmetadatagen/cfgmetadatagen" - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/components" -) - -func main() { - - sourceDir, outputDir := getFlags() - c, err := components.Components() - if err != nil { - fmt.Printf("error getting components %v", err) - os.Exit(1) - } - err = cfgmetadatagen.GenerateFiles(c, sourceDir, outputDir) - if err != nil { - fmt.Printf("cfg metadata generator failed: %v\n", err) - } -} - -func getFlags() (string, string) { - sourceDir := flag.String("s", filepath.Join("..", ".."), "") - outputDir := flag.String("o", "cfg-metadata", "output dir") - flag.Parse() - return *sourceDir, *outputDir -} diff --git a/cmd/configschema/comments.go b/cmd/configschema/comments.go deleted file mode 100644 index 90362a688f6d..000000000000 --- a/cmd/configschema/comments.go +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -// Deprecated: [v0.92.0] This package is deprecated and will be removed in a future release. -// See https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/30187 -package configschema // import "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/configschema" - -import ( - "go/ast" - "go/parser" - "go/token" - "io/fs" - "path/filepath" - "reflect" - "strings" -) - -// commentsForStruct returns a map of fieldname -> comment for a struct -func commentsForStruct(v reflect.Value, dr DirResolver) (map[string]string, error) { - elem := v - if v.Kind() == reflect.Ptr { - elem = v.Elem() - } - packagePath, err := dr.TypeToPackagePath(elem.Type()) - if err != nil { - return nil, err - } - return searchDirsForComments(packagePath, elem.Type().String()) -} - -func searchDirsForComments(packageDir, typeName string) (map[string]string, error) { - out := map[string]string{} - err := filepath.WalkDir(packageDir, func(path string, d fs.DirEntry, _ error) error { - if d.IsDir() { - commentsForStructName(out, path, typeName) - } - return nil - }) - return out, err -} - -func commentsForStructName(comments map[string]string, dir, typeName string) { - fset := token.NewFileSet() - pkgs, err := parser.ParseDir(fset, dir, nil, parser.ParseComments) - if err != nil { - panic(err) - } - parts := strings.Split(typeName, ".") - targetPkg := parts[0] - targetType := parts[1] - for pkgName, pkg := range pkgs { - if pkgName != targetPkg { - continue - } - for _, file := range pkg.Files { - for _, decl := range file.Decls { - if gd, ok := decl.(*ast.GenDecl); ok { - for _, spec := range gd.Specs { - if ts, ok := spec.(*ast.TypeSpec); ok { - if ts.Name.Name == targetType { - if structComments := gd.Doc.Text(); structComments != "" { - comments["_struct"] = structComments - } - if st, ok := ts.Type.(*ast.StructType); ok { - for _, field := range st.Fields.List { - if name := fieldName(field); name != "" { - comments[name] = field.Doc.Text() - } - } - } - } - } - } - } - } - } - } -} - -func fieldName(field *ast.Field) string { - if field.Names != nil { - return field.Names[0].Name - } else if se, ok := field.Type.(*ast.SelectorExpr); ok { - return se.Sel.Name - } else if id, ok := field.Type.(*ast.Ident); ok { - return id.Name - } - return "" -} diff --git a/cmd/configschema/comments_test.go b/cmd/configschema/comments_test.go deleted file mode 100644 index 2d906a3d3968..000000000000 --- a/cmd/configschema/comments_test.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package configschema - -import ( - "reflect" - "testing" - - "github.com/google/uuid" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/config/configtls" -) - -func TestFieldComments(t *testing.T) { - v := reflect.ValueOf(testStruct{}) - comments, err := commentsForStruct(v, testDR()) - assert.NoError(t, err) - assert.Equal(t, "embedded, package qualified comment\n", comments["Duration"]) - assert.Equal(t, "testStruct comment\n", comments["_struct"]) -} - -func TestExternalType(t *testing.T) { - u, err := uuid.NewUUID() - assert.NoError(t, err) - v := reflect.ValueOf(u) - comments, err := commentsForStruct(v, testDR()) - assert.NoError(t, err) - assert.Equal( - t, - "A UUID is a 128 bit (16 byte) Universal Unique IDentifier as defined in RFC\n4122.\n", - comments["_struct"], - ) -} - -func TestSubPackage(t *testing.T) { - s := configtls.ClientConfig{} - v := reflect.ValueOf(s) - _, err := commentsForStruct(v, testDR()) - require.NoError(t, err) -} diff --git a/cmd/configschema/common_test.go b/cmd/configschema/common_test.go deleted file mode 100644 index 3287e534ea3c..000000000000 --- a/cmd/configschema/common_test.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package configschema - -import ( - "path/filepath" - "time" - - "go.opentelemetry.io/collector/config/configtls" -) - -type testPerson struct { - Name string -} - -// testStruct comment -type testStruct struct { - One string `mapstructure:"one"` - Two int `mapstructure:"two"` - Three uint `mapstructure:"three"` - Four bool `mapstructure:"four"` - // embedded, package qualified comment - time.Duration `mapstructure:"duration"` - Squashed testPerson `mapstructure:",squash"` - PersonPtr *testPerson `mapstructure:"person_ptr"` - PersonStruct testPerson `mapstructure:"person_struct"` - Persons []testPerson `mapstructure:"persons"` - PersonPtrs []*testPerson `mapstructure:"person_ptrs"` - Ignored string `mapstructure:"-"` - TLS configtls.ClientConfig `mapstructure:"tls"` -} - -func testDR() DirResolver { - return DirResolver{ - SrcRoot: filepath.Join("..", ".."), - ModuleName: DefaultModule, - } -} diff --git a/cmd/configschema/configs.go b/cmd/configschema/configs.go deleted file mode 100644 index cb5caad802e4..000000000000 --- a/cmd/configschema/configs.go +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package configschema // import "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/configschema" - -import ( - "fmt" - - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/otelcol" -) - -const ( - receiver = "receiver" - extension = "extension" - processor = "processor" - exporter = "exporter" - connector = "connector" -) - -// CfgInfo contains a component config instance, as well as its group name and -// type. -type CfgInfo struct { - // the name of the component group, e.g. "receiver" - Group string - // the component type, e.g. "otlpreceiver.Config" - Type component.Type - // an instance of the component's configuration struct - CfgInstance any -} - -// GetAllCfgInfos accepts a Factories struct, then creates and returns a CfgInfo -// for each of its components. -func GetAllCfgInfos(components otelcol.Factories) []CfgInfo { - out := make([]CfgInfo, len(components.Receivers)+len(components.Extensions)+len(components.Processors)+len(components.Exporters)+len(components.Connectors)) - i := 0 - for _, f := range components.Receivers { - out[i] = CfgInfo{ - Type: f.Type(), - Group: receiver, - CfgInstance: f.CreateDefaultConfig(), - } - i++ - } - for _, f := range components.Extensions { - out[i] = CfgInfo{ - Type: f.Type(), - Group: extension, - CfgInstance: f.CreateDefaultConfig(), - } - i++ - } - for _, f := range components.Processors { - out[i] = CfgInfo{ - Type: f.Type(), - Group: processor, - CfgInstance: f.CreateDefaultConfig(), - } - i++ - } - for _, f := range components.Exporters { - out[i] = CfgInfo{ - Type: f.Type(), - Group: exporter, - CfgInstance: f.CreateDefaultConfig(), - } - i++ - } - for _, f := range components.Connectors { - out[i] = CfgInfo{ - Type: f.Type(), - Group: connector, - CfgInstance: f.CreateDefaultConfig(), - } - i++ - } - return out -} - -// GetCfgInfo accepts a Factories struct, then creates and returns the default -// config for the component specified by the passed-in componentType and -// componentName. -func GetCfgInfo(components otelcol.Factories, componentType, componentName string) (CfgInfo, error) { - t, err := component.NewType(componentName) - if err != nil { - return CfgInfo{}, fmt.Errorf("failed to build component.Type: %w", err) - } - switch componentType { - case receiver: - f := components.Receivers[t] - if f == nil { - return CfgInfo{}, fmt.Errorf("unknown %s name %q", componentType, componentName) - } - return CfgInfo{ - Type: f.Type(), - Group: componentType, - CfgInstance: f.CreateDefaultConfig(), - }, nil - case processor: - f := components.Processors[t] - if f == nil { - return CfgInfo{}, fmt.Errorf("unknown %s name %q", componentType, componentName) - } - return CfgInfo{ - Type: f.Type(), - Group: componentType, - CfgInstance: f.CreateDefaultConfig(), - }, nil - case exporter: - f := components.Exporters[t] - if f == nil { - return CfgInfo{}, fmt.Errorf("unknown %s name %q", componentType, componentName) - } - return CfgInfo{ - Type: f.Type(), - Group: componentType, - CfgInstance: f.CreateDefaultConfig(), - }, nil - case connector: - f := components.Connectors[t] - if f == nil { - return CfgInfo{}, fmt.Errorf("unknown %s name %q", componentType, componentName) - } - return CfgInfo{ - Type: f.Type(), - Group: componentType, - CfgInstance: f.CreateDefaultConfig(), - }, nil - case extension: - f := components.Extensions[t] - if f == nil { - return CfgInfo{}, fmt.Errorf("unknown %s name %q", componentType, componentName) - } - return CfgInfo{ - Type: f.Type(), - Group: componentType, - CfgInstance: f.CreateDefaultConfig(), - }, nil - } - return CfgInfo{}, fmt.Errorf("unknown component type %q", componentType) -} diff --git a/cmd/configschema/configs_test.go b/cmd/configschema/configs_test.go deleted file mode 100644 index 483cbde192c3..000000000000 --- a/cmd/configschema/configs_test.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package configschema - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/otelcol" - - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/components" -) - -func TestGetAllConfigs(t *testing.T) { - cfgs := GetAllCfgInfos(testComponents()) - require.NotNil(t, cfgs) -} - -func TestCreateReceiverConfig(t *testing.T) { - cfg, err := GetCfgInfo(testComponents(), "receiver", "otlp") - require.NoError(t, err) - require.NotNil(t, cfg) -} - -func TestCreateProcesorConfig(t *testing.T) { - cfg, err := GetCfgInfo(testComponents(), "processor", "filter") - require.NoError(t, err) - require.NotNil(t, cfg) -} - -func TestGetConfig(t *testing.T) { - tests := []struct { - name string - componentType string - }{ - { - name: "otlp", - componentType: "receiver", - }, - { - name: "filter", - componentType: "processor", - }, - { - name: "otlp", - componentType: "exporter", - }, - { - name: "zpages", - componentType: "extension", - }, - } - for _, test := range tests { - t.Run(test.name, func(t *testing.T) { - cfg, err := GetCfgInfo(testComponents(), test.componentType, test.name) - require.NoError(t, err) - require.NotNil(t, cfg) - }) - } -} - -func testComponents() otelcol.Factories { - cmps, err := components.Components() - if err != nil { - panic(err) - } - return cmps -} diff --git a/cmd/configschema/docsgen/README.md b/cmd/configschema/docsgen/README.md deleted file mode 100644 index 7b342699d92c..000000000000 --- a/cmd/configschema/docsgen/README.md +++ /dev/null @@ -1,47 +0,0 @@ -> Deprecated: [v0.92.0] This tool is deprecated and will be removed in a future release. -> See https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/30187 - -# Docsgen CLI Tool - -This package contains a CLI tool that generates markdown files for collector -components. The markdown files present the configuration metadata extracted -by the configschema API in a human readable form that can be used to manually -configure the collector. - -## Usage - -There are two modes of operation, one where markdown files are created for all -components, and another where a markdown file is created for only one, specified -component. - -#### All components - -``` -docsgen all -``` - -Creates config.md files in every directory corresponding to a component -configuration type. - -#### Single component - -``` -docsgen component-type component-name -``` - -Creates a single config.md files in the directory corresponding to the -specified component. - -### Usage Example - -To create a config doc for the otlp receiver, use the command - -``` -docsgen receiver otlp -``` - -This creates a file called `config.md` in `receiver/otlpreceiver`. - -### Output Example - -[OTLP Receiver Config Metadata Doc](https://github.com/open-telemetry/opentelemetry-collector/blob/main/receiver/otlpreceiver/config.md) diff --git a/cmd/configschema/docsgen/docsgen/cli.go b/cmd/configschema/docsgen/docsgen/cli.go deleted file mode 100644 index 10b7a536e02f..000000000000 --- a/cmd/configschema/docsgen/docsgen/cli.go +++ /dev/null @@ -1,136 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -// Deprecated: [v0.92.0] This package is deprecated and will be removed in a future release. -// See https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/30187 -package docsgen // import "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/configschema/docsgen/docsgen" - -import ( - "fmt" - "io" - "log" - "os" - "path/filepath" - "reflect" - "strings" - "text/template" - - "go.opentelemetry.io/collector/otelcol" - - "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/configschema" -) - -const mdFileName = "config.md" - -// CLI is the entrypoint for this package's functionality. It handles command- -// line arguments for the docsgen executable and produces config documentation -// for the specified components. -// Deprecated: [v0.92.0] This package is deprecated and will be removed in a future release. -// See https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/30187 -func CLI(factories otelcol.Factories, dr configschema.DirResolver) { - tableTmpl, err := tableTemplate() - if err != nil { - panic(err) - } - - handleCLI(factories, dr, tableTmpl, os.WriteFile, os.Stdout, os.Args...) -} - -func handleCLI( - factories otelcol.Factories, - dr configschema.DirResolver, - tableTmpl *template.Template, - writeFile writeFileFunc, - wr io.Writer, - args ...string, -) { - if !(len(args) == 2 || len(args) == 3) { - printLines(wr, "usage:", "docsgen all", "docsgen component-type component-name") - return - } - - componentType := args[1] - if componentType == "all" { - allComponents(dr, tableTmpl, factories, writeFile) - return - } - - singleComponent(dr, tableTmpl, factories, componentType, args[2], writeFile) -} - -func printLines(wr io.Writer, lines ...string) { - for _, line := range lines { - _, _ = fmt.Fprintln(wr, line) - } -} - -func allComponents( - dr configschema.DirResolver, - tableTmpl *template.Template, - factories otelcol.Factories, - writeFile writeFileFunc, -) { - configs := configschema.GetAllCfgInfos(factories) - for _, cfg := range configs { - writeConfigDoc(tableTmpl, dr, cfg, writeFile) - } -} - -func singleComponent( - dr configschema.DirResolver, - tableTmpl *template.Template, - factories otelcol.Factories, - componentType, componentName string, - writeFile writeFileFunc, -) { - cfg, err := configschema.GetCfgInfo(factories, componentType, componentName) - if err != nil { - panic(err) - } - - writeConfigDoc(tableTmpl, dr, cfg, writeFile) -} - -type writeFileFunc func(filename string, data []byte, perm os.FileMode) error - -func writeConfigDoc( - tableTmpl *template.Template, - dr configschema.DirResolver, - ci configschema.CfgInfo, - writeFile writeFileFunc, -) { - v := reflect.ValueOf(ci.CfgInstance) - f, err := configschema.ReadFields(v, dr) - if err != nil { - panic(err) - } - - mdBytes := renderHeader(ci.Type.String(), ci.Group, f.Doc) - - f.Name = typeToName(f.Type) - - tableBytes, err := renderTable(tableTmpl, f) - if err != nil { - panic(err) - } - mdBytes = append(mdBytes, tableBytes...) - - if hasTimeDuration(f) { - mdBytes = append(mdBytes, durationBlock...) - } - - dir := dr.ReflectValueToProjectPath(v) - if dir == "" { - log.Printf("writeConfigDoc: skipping, local path not found for component: %s %s", ci.Group, ci.Type) - return - } - err = writeFile(filepath.Join(dir, mdFileName), mdBytes, 0644) - if err != nil { - panic(err) - } -} - -func typeToName(typ string) string { - idx := strings.IndexRune(typ, '.') - return typ[:idx] -} diff --git a/cmd/configschema/docsgen/docsgen/cli_test.go b/cmd/configschema/docsgen/docsgen/cli_test.go deleted file mode 100644 index b47c5e65fa08..000000000000 --- a/cmd/configschema/docsgen/docsgen/cli_test.go +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package docsgen - -import ( - "os" - "path/filepath" - "strings" - "testing" - "text/template" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/otelcol" - - "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/configschema" - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/components" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/redisreceiver" -) - -func TestWriteConfigDoc(t *testing.T) { - cfg := redisreceiver.NewFactory().CreateDefaultConfig() - dr := configschema.NewDirResolver(filepath.Join("..", "..", "..", ".."), configschema.DefaultModule) - outputFilename := "" - tmpl := testTemplate(t) - writeConfigDoc( - tmpl, - dr, - configschema.CfgInfo{ - Group: "receiver", - Type: component.MustNewType("redis"), - CfgInstance: cfg, - }, - func(dir string, _ []byte, _ os.FileMode) error { - outputFilename = dir - return nil - }, - ) - expectedPath := filepath.Join("receiver", "redisreceiver", "config.md") - assert.True(t, strings.HasSuffix(outputFilename, expectedPath)) -} - -func TestHandleCLI_NoArgs(t *testing.T) { - wr := &fakeIOWriter{} - handleCLI( - defaultComponents(t), - configschema.NewDefaultDirResolver(), - testTemplate(t), - func(_ string, _ []byte, _ os.FileMode) error { return nil }, - wr, - ) - assert.Equal(t, 3, len(wr.lines)) -} - -func TestHandleCLI_Single(t *testing.T) { - args := []string{"", "receiver", "redis"} - cs := defaultComponents(t) - wr := &fakeFilesystemWriter{} - - testHandleCLI(t, cs, wr, args) - - assert.Equal(t, 1, len(wr.configFiles)) - assert.Equal(t, 1, len(wr.fileContents)) - assert.True(t, strings.Contains(wr.fileContents[0], `Redis Receiver Reference`)) -} - -func TestHandleCLI_All(t *testing.T) { - t.Skip("this test takes > 5m when -race is used") - args := []string{"", "all"} - c := defaultComponents(t) - writer := &fakeFilesystemWriter{} - testHandleCLI(t, c, writer, args) - assert.NotNil(t, writer.configFiles) - assert.NotNil(t, writer.fileContents) -} - -func defaultComponents(t *testing.T) otelcol.Factories { - factories, err := components.Components() - require.NoError(t, err) - return factories -} - -func testHandleCLI(t *testing.T, cs otelcol.Factories, wr *fakeFilesystemWriter, args []string) { - stdoutWriter := &fakeIOWriter{} - tmpl := testTemplate(t) - dr := configschema.NewDirResolver(filepath.Join("..", "..", "..", ".."), configschema.DefaultModule) - handleCLI(cs, dr, tmpl, wr.writeFile, stdoutWriter, args...) -} - -func testTemplate(t *testing.T) *template.Template { - tmpl, err := template.ParseFiles("testdata/test.tmpl") - require.NoError(t, err) - return tmpl -} - -type fakeFilesystemWriter struct { - configFiles, fileContents []string -} - -func (wr *fakeFilesystemWriter) writeFile(filename string, data []byte, _ os.FileMode) error { - wr.configFiles = append(wr.configFiles, filename) - wr.fileContents = append(wr.fileContents, string(data)) - return nil -} - -type fakeIOWriter struct { - lines []string -} - -func (wr *fakeIOWriter) Write(p []byte) (n int, err error) { - wr.lines = append(wr.lines, string(p)) - return 0, nil -} diff --git a/cmd/configschema/docsgen/docsgen/package_test.go b/cmd/configschema/docsgen/docsgen/package_test.go deleted file mode 100644 index b0e28474f911..000000000000 --- a/cmd/configschema/docsgen/docsgen/package_test.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package docsgen - -import ( - "testing" - - "go.uber.org/goleak" -) - -// The Ignore function calls prevent catching leaks generated by indirect dependencies. -// All of these are leaks that we can't fix from within the collector code base. -// Regarding the OpenCensus ignore: see https://github.com/census-instrumentation/opencensus-go/issues/1191 -// Regarding the DataDog ignore: see https://github.com/DataDog/datadog-agent/issues/22030 -// Regarding the database/sql ignore: see https://github.com/SAP/go-hdb/issues/130 -// Regarding the SAP/go-hdb ignore: see https://github.com/SAP/go-hdb/issues/131 -// Regarding the cihub/seelog ignore: see https://github.com/cihub/seelog/issues/182 -// Regarding the godbus/dbus ignore: see https://github.com/99designs/keyring/issues/135 -func TestMain(m *testing.M) { - goleak.VerifyTestMain(m, - goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), - goleak.IgnoreTopFunction("github.com/DataDog/datadog-agent/pkg/trace/metrics/timing.(*Set).Autoreport.func1"), - // Unfortunately this ignore can't be anymore specific, even though it's caused by the SAP/go-hdb/driver - // package. There's no reference to this package in the goleak output. This has the potential of - // hiding future leaks, so we should remove as soon as the referenced issue is resolved. - goleak.IgnoreTopFunction("database/sql.(*DB).connectionOpener"), - goleak.IgnoreTopFunction("github.com/SAP/go-hdb/driver.(*metrics).collect"), - goleak.IgnoreAnyFunction("github.com/cihub/seelog.(*asyncLoopLogger).processQueue"), - goleak.IgnoreAnyFunction("github.com/godbus/dbus.(*Conn).inWorker")) -} diff --git a/cmd/configschema/docsgen/docsgen/render.go b/cmd/configschema/docsgen/docsgen/render.go deleted file mode 100644 index fa27d057128f..000000000000 --- a/cmd/configschema/docsgen/docsgen/render.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package docsgen // import "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/configschema/docsgen/docsgen" - -import ( - "bytes" - "fmt" - "text/template" - - "golang.org/x/text/cases" - "golang.org/x/text/language" - - "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/configschema" -) - -func renderHeader(typ, group, doc string) []byte { - caser := cases.Title(language.English) - return []byte(fmt.Sprintf( - "# %s %s Reference\n\n%s\n\n", - caser.String(typ), - caser.String(group), - doc, - )) -} - -func renderTable(tmpl *template.Template, field *configschema.Field) ([]byte, error) { - buf := &bytes.Buffer{} - err := executeTableTemplate(tmpl, field, buf) - if err != nil { - return nil, err - } - return buf.Bytes(), nil -} - -func executeTableTemplate(tmpl *template.Template, field *configschema.Field, buf *bytes.Buffer) error { - err := tmpl.Execute(buf, field) - if err != nil { - return err - } - for _, subField := range field.Fields { - if subField.Fields == nil { - continue - } - err = executeTableTemplate(tmpl, subField, buf) - if err != nil { - return err - } - } - return nil -} - -const durationBlock = "### time-Duration \n" + - "An optionally signed sequence of decimal numbers, " + - "each with a unit suffix, such as `300ms`, `-1.5h`, " + - "or `2h45m`. Valid time units are `ns`, `us`, `ms`, `s`, `m`, `h`." - -func hasTimeDuration(f *configschema.Field) bool { - if f.Type == "time.Duration" { - return true - } - for _, sub := range f.Fields { - if hasTimeDuration(sub) { - return true - } - } - return false -} diff --git a/cmd/configschema/docsgen/docsgen/template.go b/cmd/configschema/docsgen/docsgen/template.go deleted file mode 100644 index 4475c859161b..000000000000 --- a/cmd/configschema/docsgen/docsgen/template.go +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package docsgen // import "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/configschema/docsgen/docsgen" - -import ( - "fmt" - "strings" - "text/template" -) - -func tableTemplate() (*template.Template, error) { - return template.New("table").Option("missingkey=zero").Funcs( - template.FuncMap{ - "join": join, - "mkAnchor": mkAnchor, - "isCompoundField": isCompoundField, - "isDuration": isDuration, - }, - ).Parse(tableTemplateStr) -} - -func isCompoundField(kind string) bool { - return kind == "struct" || kind == "ptr" -} - -func join(s string) string { - return strings.ReplaceAll(s, "\n", " ") -} - -// mkAnchor takes a name and a type (e.g. "configtls.ClientConfig") and -// returns a string suitable for use as a markdown anchor. -func mkAnchor(name, typ string) string { - if isDuration(typ) { - return "time-Duration" - } - idx := strings.IndexRune(typ, '.') - // strip "configtls." from e.g. "configtls.ClientConfig" - typeStripped := typ[idx+1:] - concat := fmt.Sprintf("%s-%s", name, typeStripped) - asterisksRemoved := strings.ReplaceAll(concat, "*", "") - dotsToDashes := strings.ReplaceAll(asterisksRemoved, ".", "-") - return strings.ReplaceAll(dotsToDashes, "_", "-") -} - -func isDuration(s string) bool { - return s == "time.Duration" -} - -const tableTemplateStr = `### {{ mkAnchor .Name .Type }} - -| Name | Field Info | Default | Docs | -| ---- | --------- | ------- | ---- | -{{ range .Fields -}} -| {{ .Name }} | -{{- if .Type -}} - {{- $anchor := mkAnchor .Name .Type -}} - {{- if isCompoundField .Kind -}} - [{{ $anchor }}](#{{ $anchor }}) - {{- else -}} - {{- if isDuration .Type -}} - [{{ $anchor }}](#{{ $anchor }}) - {{- else -}} - {{ .Type }} - {{- end -}} - {{- end -}} -{{- else -}} - {{ .Kind }} -{{- end -}} -| {{ .Default }} | {{ join .Doc }} | -{{ end }} -` diff --git a/cmd/configschema/docsgen/docsgen/template_test.go b/cmd/configschema/docsgen/docsgen/template_test.go deleted file mode 100644 index 0f25a355eb21..000000000000 --- a/cmd/configschema/docsgen/docsgen/template_test.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package docsgen - -import ( - "encoding/json" - "os" - "path/filepath" - "testing" - - "github.com/stretchr/testify/require" - - "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/configschema" -) - -func TestTableTemplate(t *testing.T) { - field := testDataField(t) - tmpl, err := tableTemplate() - require.NoError(t, err) - bytes, err := renderTable(tmpl, field) - require.NoError(t, err) - require.NotNil(t, bytes) -} - -func testDataField(t *testing.T) *configschema.Field { - jsonBytes, err := os.ReadFile(filepath.Join("testdata", "otlp-receiver.json")) - require.NoError(t, err) - field := configschema.Field{} - err = json.Unmarshal(jsonBytes, &field) - require.NoError(t, err) - return &field -} diff --git a/cmd/configschema/docsgen/docsgen/testdata/otlp-receiver.json b/cmd/configschema/docsgen/docsgen/testdata/otlp-receiver.json deleted file mode 100644 index b7d9f54fe147..000000000000 --- a/cmd/configschema/docsgen/docsgen/testdata/otlp-receiver.json +++ /dev/null @@ -1,339 +0,0 @@ -{ - "Name": "", - "Type": "*otlpreceiver.Config", - "Kind": "", - "Default": null, - "Doc": "", - "Fields": [ - { - "Name": "protocols", - "Type": "otlpreceiver.Protocols", - "Kind": "struct", - "Default": null, - "Doc": "Protocols is the configuration for the supported protocols, currently gRPC and HTTP (Proto and JSON).\n", - "Fields": [ - { - "Name": "grpc", - "Type": "*configgrpc.ServerConfig", - "Kind": "ptr", - "Default": null, - "Doc": "", - "Fields": [ - { - "Name": "endpoint", - "Type": "", - "Kind": "string", - "Default": "0.0.0.0:4317", - "Doc": "Endpoint configures the address for this network connection.\nFor TCP and UDP networks, the address has the form \"host:port\". The host must be a literal IP address,\nor a host name that can be resolved to IP addresses. The port must be a literal port number or a service name.\nIf the host is a literal IPv6 address it must be enclosed in square brackets, as in \"[2001:db8::1]:80\" or\n\"[fe80::1%zone]:80\". The zone specifies the scope of the literal IPv6 address as defined in RFC 4007.\n", - "Fields": null - }, - { - "Name": "transport", - "Type": "", - "Kind": "string", - "Default": "tcp", - "Doc": "Transport to use. Known protocols are \"tcp\", \"tcp4\" (IPv4-only), \"tcp6\" (IPv6-only), \"udp\", \"udp4\" (IPv4-only),\n\"udp6\" (IPv6-only), \"ip\", \"ip4\" (IPv4-only), \"ip6\" (IPv6-only), \"unix\", \"unixgram\" and \"unixpacket\".\n", - "Fields": null - }, - { - "Name": "tls_settings", - "Type": "*configtls.ServerConfig", - "Kind": "ptr", - "Default": null, - "Doc": "Configures the protocol to use TLS.\nThe default value is nil, which will cause the protocol to not use TLS.\n", - "Fields": [ - { - "Name": "ca_file", - "Type": "", - "Kind": "string", - "Default": null, - "Doc": "Path to the CA cert. For a client this verifies the server certificate.\nFor a server this verifies client certificates. If empty uses system root CA.\n(optional)\n", - "Fields": null - }, - { - "Name": "cert_file", - "Type": "", - "Kind": "string", - "Default": null, - "Doc": "Path to the TLS cert to use for TLS required connections. (optional)\n", - "Fields": null - }, - { - "Name": "key_file", - "Type": "", - "Kind": "string", - "Default": null, - "Doc": "Path to the TLS key to use for TLS required connections. (optional)\n", - "Fields": null - }, - { - "Name": "client_ca_file", - "Type": "", - "Kind": "string", - "Default": null, - "Doc": "Path to the TLS cert to use by the server to verify a client certificate. (optional)\nThis sets the ClientCAs and ClientAuth to RequireAndVerifyClientCert in the TLSConfig. Please refer to\nhttps://godoc.org/crypto/tls#Config for more information. (optional)\n", - "Fields": null - } - ] - }, - { - "Name": "max_recv_msg_size_mib", - "Type": "", - "Kind": "uint64", - "Default": null, - "Doc": "MaxRecvMsgSizeMiB sets the maximum size (in MiB) of messages accepted by the server.\n", - "Fields": null - }, - { - "Name": "max_concurrent_streams", - "Type": "", - "Kind": "uint32", - "Default": null, - "Doc": "MaxConcurrentStreams sets the limit on the number of concurrent streams to each ServerTransport.\nIt has effect only for streaming RPCs.\n", - "Fields": null - }, - { - "Name": "read_buffer_size", - "Type": "", - "Kind": "int", - "Default": 524288, - "Doc": "ReadBufferSize for gRPC server. See grpc.ReadBufferSize\n(https://godoc.org/google.golang.org/grpc#ReadBufferSize).\n", - "Fields": null - }, - { - "Name": "write_buffer_size", - "Type": "", - "Kind": "int", - "Default": null, - "Doc": "WriteBufferSize for gRPC server. See grpc.WriteBufferSize\n(https://godoc.org/google.golang.org/grpc#WriteBufferSize).\n", - "Fields": null - }, - { - "Name": "keepalive", - "Type": "*configgrpc.KeepaliveServerConfig", - "Kind": "ptr", - "Default": null, - "Doc": "Keepalive anchor for all the settings related to keepalive.\n", - "Fields": [ - { - "Name": "server_parameters", - "Type": "*configgrpc.KeepaliveServerParameters", - "Kind": "ptr", - "Default": null, - "Doc": "", - "Fields": [ - { - "Name": "max_connection_idle", - "Type": "time.Duration", - "Kind": "int64", - "Default": null, - "Doc": "", - "Fields": null - }, - { - "Name": "max_connection_age", - "Type": "time.Duration", - "Kind": "int64", - "Default": null, - "Doc": "", - "Fields": null - }, - { - "Name": "max_connection_age_grace", - "Type": "time.Duration", - "Kind": "int64", - "Default": null, - "Doc": "", - "Fields": null - }, - { - "Name": "time", - "Type": "time.Duration", - "Kind": "int64", - "Default": null, - "Doc": "", - "Fields": null - }, - { - "Name": "timeout", - "Type": "time.Duration", - "Kind": "int64", - "Default": null, - "Doc": "", - "Fields": null - } - ] - }, - { - "Name": "enforcement_policy", - "Type": "*configgrpc.KeepaliveEnforcementPolicy", - "Kind": "ptr", - "Default": null, - "Doc": "", - "Fields": [ - { - "Name": "min_time", - "Type": "time.Duration", - "Kind": "int64", - "Default": null, - "Doc": "", - "Fields": null - }, - { - "Name": "permit_without_stream", - "Type": "", - "Kind": "bool", - "Default": null, - "Doc": "", - "Fields": null - } - ] - } - ] - }, - { - "Name": "auth", - "Type": "*configauth.Authentication", - "Kind": "ptr", - "Default": null, - "Doc": "Auth for this receiver\n", - "Fields": [ - { - "Name": "attribute", - "Type": "", - "Kind": "string", - "Default": null, - "Doc": "The attribute (header name) to look for auth data. Optional, default value: \"authentication\".\n", - "Fields": null - }, - { - "Name": "oidc", - "Type": "*configauth.OIDC", - "Kind": "ptr", - "Default": null, - "Doc": "OIDC configures this receiver to use the given OIDC provider as the backend for the authentication mechanism.\nRequired.\n", - "Fields": [ - { - "Name": "issuer_url", - "Type": "", - "Kind": "string", - "Default": null, - "Doc": "IssuerURL is the base URL for the OIDC provider.\nRequired.\n", - "Fields": null - }, - { - "Name": "audience", - "Type": "", - "Kind": "string", - "Default": null, - "Doc": "Audience of the token, used during the verification.\nFor example: \"https://accounts.google.com\" or \"https://login.salesforce.com\".\nRequired.\n", - "Fields": null - }, - { - "Name": "issuer_ca_path", - "Type": "", - "Kind": "string", - "Default": null, - "Doc": "The local path for the issuer CA's TLS server cert.\nOptional.\n", - "Fields": null - }, - { - "Name": "username_claim", - "Type": "", - "Kind": "string", - "Default": null, - "Doc": "The claim to use as the username, in case the token's 'sub' isn't the suitable source.\nOptional.\n", - "Fields": null - }, - { - "Name": "groups_claim", - "Type": "", - "Kind": "string", - "Default": null, - "Doc": "The claim that holds the subject's group membership information.\nOptional.\n", - "Fields": null - } - ] - } - ] - } - ] - }, - { - "Name": "http", - "Type": "*confighttp.ServerConfig", - "Kind": "ptr", - "Default": null, - "Doc": "", - "Fields": [ - { - "Name": "endpoint", - "Type": "", - "Kind": "string", - "Default": "0.0.0.0:4318", - "Doc": "Endpoint configures the listening address for the server.\n", - "Fields": null - }, - { - "Name": "tls_settings", - "Type": "*configtls.ServerConfig", - "Kind": "ptr", - "Default": null, - "Doc": "TLSSetting struct exposes TLS client configuration.\n", - "Fields": [ - { - "Name": "ca_file", - "Type": "", - "Kind": "string", - "Default": null, - "Doc": "Path to the CA cert. For a client this verifies the server certificate.\nFor a server this verifies client certificates. If empty uses system root CA.\n(optional)\n", - "Fields": null - }, - { - "Name": "cert_file", - "Type": "", - "Kind": "string", - "Default": null, - "Doc": "Path to the TLS cert to use for TLS required connections. (optional)\n", - "Fields": null - }, - { - "Name": "key_file", - "Type": "", - "Kind": "string", - "Default": null, - "Doc": "Path to the TLS key to use for TLS required connections. (optional)\n", - "Fields": null - }, - { - "Name": "client_ca_file", - "Type": "", - "Kind": "string", - "Default": null, - "Doc": "Path to the TLS cert to use by the server to verify a client certificate. (optional)\nThis sets the ClientCAs and ClientAuth to RequireAndVerifyClientCert in the TLSConfig. Please refer to\nhttps://godoc.org/crypto/tls#Config for more information. (optional)\n", - "Fields": null - } - ] - }, - { - "Name": "cors_allowed_origins", - "Type": "[]string", - "Kind": "slice", - "Default": null, - "Doc": "CorsOrigins are the allowed CORS origins for HTTP/JSON requests to grpc-gateway adapter\nfor the OTLP receiver. See github.com/rs/cors\nAn empty list means that CORS is not enabled at all. A wildcard (*) can be\nused to match any origin or one or more characters of an origin.\n", - "Fields": null - }, - { - "Name": "cors_allowed_headers", - "Type": "[]string", - "Kind": "slice", - "Default": null, - "Doc": "CorsHeaders are the allowed CORS headers for HTTP/JSON requests to grpc-gateway adapter\nfor the OTLP receiver. See github.com/rs/cors\nCORS needs to be enabled first by providing a non-empty list in CorsOrigins\nA wildcard (*) can be used to match any header.\n", - "Fields": null - } - ] - } - ] - } - ] -} \ No newline at end of file diff --git a/cmd/configschema/docsgen/docsgen/testdata/test.tmpl b/cmd/configschema/docsgen/docsgen/testdata/test.tmpl deleted file mode 100644 index a82ac1116832..000000000000 --- a/cmd/configschema/docsgen/docsgen/testdata/test.tmpl +++ /dev/null @@ -1 +0,0 @@ -{{ .Type }} diff --git a/cmd/configschema/docsgen/main.go b/cmd/configschema/docsgen/main.go deleted file mode 100644 index 2d1495cccc84..000000000000 --- a/cmd/configschema/docsgen/main.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -// Deprecated: [v0.92.0] This package is deprecated and will be removed in a future release. -// See https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/30187 -package main - -import ( - "path/filepath" - - "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/configschema" - "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/configschema/docsgen/docsgen" - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/components" -) - -func main() { - c, err := components.Components() - if err != nil { - panic(err) - } - dr := configschema.NewDirResolver(filepath.Join("..", ".."), configschema.DefaultModule) - docsgen.CLI(c, dr) -} diff --git a/cmd/configschema/fields.go b/cmd/configschema/fields.go deleted file mode 100644 index a2fed157f0cd..000000000000 --- a/cmd/configschema/fields.go +++ /dev/null @@ -1,158 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package configschema // import "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/configschema" - -import ( - "log" - "reflect" - "strings" - "time" - - "github.com/fatih/structtag" -) - -// Field holds attributes and subfields of a config struct. -type Field struct { - Name string `yaml:",omitempty"` - Type string `yaml:",omitempty"` - Kind string `yaml:",omitempty"` - Default any `yaml:",omitempty"` - Doc string `yaml:",omitempty"` - Fields []*Field `yaml:",omitempty"` -} - -// ReadFields accepts both a config struct's Value, as well as a DirResolver, -// and returns a Field pointer for the top level struct as well as all of its -// recursive subfields. -func ReadFields(v reflect.Value, dr DirResolver) (*Field, error) { - cfgType := v.Type() - field := &Field{ - Type: cfgType.String(), - } - err := refl(field, v, dr) - return field, err -} - -func refl(field *Field, v reflect.Value, dr DirResolver) error { - if v.Kind() == reflect.Ptr { - err := refl(field, v.Elem(), dr) - if err != nil { - return err - } - } - if v.Kind() != reflect.Struct { - return nil - } - comments, err := commentsForStruct(v, dr) - if err != nil { - return err - } - - // _struct comments are those that are on the struct type itself. Here we check - // if field.Doc is empty, thus preventing a squashed type with struct comments - // from overwriting the containing struct's comments. - if sc, ok := comments["_struct"]; ok && field.Doc == "" { - field.Doc = sc - } - - for i := 0; i < v.NumField(); i++ { - structField := v.Type().Field(i) - if !structField.IsExported() { - continue - } - tagName, options, err := mapstructure(structField.Tag) - if err != nil { - log.Printf("error parsing mapstructure tag for type: %s: %s: %v", field.Type, structField.Tag, err) - // not fatal, can keep going - } - if tagName == "-" { - continue - } - fv := v.Field(i) - next := field - if !containsSquash(options) { - name := tagName - if name == "" { - name = strings.ToLower(structField.Name) - } - kindStr := fv.Kind().String() - typeStr := fv.Type().String() - if typeStr == kindStr { - typeStr = "" // omit if redundant - } - next = &Field{ - Name: name, - Type: typeStr, - Kind: kindStr, - Doc: comments[structField.Name], - } - field.Fields = append(field.Fields, next) - } - err = handleKind(fv, next, dr) - if err != nil { - return err - } - } - return nil -} - -func handleKind(v reflect.Value, f *Field, dr DirResolver) (err error) { - switch v.Kind() { - case reflect.Struct: - err = refl(f, v, dr) - case reflect.Ptr: - if v.IsNil() { - err = refl(f, reflect.New(v.Type().Elem()), dr) - } else { - err = refl(f, v.Elem(), dr) - } - case reflect.Slice: - e := v.Type().Elem() - if e.Kind() == reflect.Struct { - err = refl(f, reflect.New(e), dr) - } else if e.Kind() == reflect.Ptr { - err = refl(f, reflect.New(e.Elem()), dr) - } - case reflect.String: - f.Default = v.String() - case reflect.Bool: - f.Default = v.Bool() - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - if v.Int() != 0 { - if v.Type() == reflect.TypeOf(time.Duration(0)) { - f.Default = time.Duration(v.Int()).String() - } else { - f.Default = v.Int() - } - } - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - f.Default = v.Uint() - } - return -} - -func mapstructure(st reflect.StructTag) (string, []string, error) { - tag := string(st) - if tag == "" { - return "", nil, nil - } - tags, err := structtag.Parse(tag) - if err != nil { - return "", nil, err - } - ms, err := tags.Get("mapstructure") - if err != nil { - return "", nil, err - } - return ms.Name, ms.Options, nil -} - -func containsSquash(options []string) bool { - for _, option := range options { - if option == "squash" { - return true - } - } - return false -} diff --git a/cmd/configschema/fields_test.go b/cmd/configschema/fields_test.go deleted file mode 100644 index 22d1a661a59e..000000000000 --- a/cmd/configschema/fields_test.go +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package configschema - -import ( - "reflect" - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestReadFieldsWithDefaults(t *testing.T) { - defaults := map[string]any{ - "one": "1", - "two": int64(2), - "three": uint64(3), - "four": true, - "duration": "42ns", - "name": "squashed", - "person_ptr": "foo", - "person_struct": "bar", - } - s := testStruct{ - One: "1", - Two: 2, - Three: 3, - Four: true, - Duration: 42, - Squashed: testPerson{"squashed"}, - PersonPtr: &testPerson{ - Name: "foo", - }, - PersonStruct: testPerson{ - Name: "bar", - }, - } - testReadFields(t, s, defaults) -} - -func TestReadFieldsWithoutDefaults(t *testing.T) { - testReadFields(t, testStruct{}, map[string]any{ - "one": "", - "three": uint64(0), - "four": false, - "name": "", - "person_ptr": "", - "person_struct": "", - }) -} - -func testReadFields(t *testing.T, s testStruct, defaults map[string]any) { - root, _ := ReadFields( - reflect.ValueOf(s), - testDR(), - ) - - assert.Equal(t, "testStruct comment\n", root.Doc) - - assert.Equal(t, "configschema.testStruct", root.Type) - - assert.Equal(t, 11, len(root.Fields)) - - assert.Equal(t, &Field{ - Name: "one", - Kind: "string", - Default: defaults["one"], - }, getFieldByName(root.Fields, "one")) - - assert.Equal(t, &Field{ - Name: "two", - Kind: "int", - Default: defaults["two"], - }, getFieldByName(root.Fields, "two")) - - assert.Equal(t, &Field{ - Name: "three", - Kind: "uint", - Default: defaults["three"], - }, getFieldByName(root.Fields, "three")) - - assert.Equal(t, &Field{ - Name: "four", - Kind: "bool", - Default: defaults["four"], - }, getFieldByName(root.Fields, "four")) - - assert.Equal(t, &Field{ - Name: "duration", - Type: "time.Duration", - Kind: "int64", - Default: defaults["duration"], - Doc: "embedded, package qualified comment\n", - }, getFieldByName(root.Fields, "duration")) - - assert.Equal(t, &Field{ - Name: "name", - Kind: "string", - Default: defaults["name"], - }, getFieldByName(root.Fields, "name")) - - personPtr := getFieldByName(root.Fields, "person_ptr") - assert.Equal(t, "*configschema.testPerson", personPtr.Type) - assert.Equal(t, "ptr", personPtr.Kind) - assert.Equal(t, 1, len(personPtr.Fields)) - assert.Equal(t, &Field{ - Name: "name", - Kind: "string", - Default: defaults["person_ptr"], - }, getFieldByName(personPtr.Fields, "name")) - - personStruct := getFieldByName(root.Fields, "person_struct") - assert.Equal(t, "configschema.testPerson", personStruct.Type) - assert.Equal(t, "struct", personStruct.Kind) - assert.Equal(t, 1, len(personStruct.Fields)) - assert.Equal(t, &Field{ - Name: "name", - Kind: "string", - Default: defaults["person_struct"], - }, getFieldByName(personStruct.Fields, "name")) - - persons := getFieldByName(root.Fields, "persons") - assert.Equal(t, "[]configschema.testPerson", persons.Type) - assert.Equal(t, "slice", persons.Kind) - assert.Equal(t, 1, len(persons.Fields)) - assert.Equal(t, &Field{ - Name: "name", - Kind: "string", - Default: "", - }, getFieldByName(persons.Fields, "name")) - - personPtrs := getFieldByName(root.Fields, "person_ptrs") - assert.Equal(t, "[]*configschema.testPerson", personPtrs.Type) - assert.Equal(t, "slice", personPtrs.Kind) - assert.Equal(t, 1, len(personPtrs.Fields)) - assert.Equal(t, &Field{ - Name: "name", - Kind: "string", - Default: "", - }, getFieldByName(personPtrs.Fields, "name")) -} - -func getFieldByName(fields []*Field, name string) *Field { - for _, f := range fields { - if f.Name == name { - return f - } - } - return nil -} diff --git a/cmd/configschema/go.mod b/cmd/configschema/go.mod deleted file mode 100644 index 477eafd1950c..000000000000 --- a/cmd/configschema/go.mod +++ /dev/null @@ -1,1230 +0,0 @@ -// Deprecated: [v0.92.0] This package is deprecated and will be removed in a future release. -// See https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/30187 -module github.com/open-telemetry/opentelemetry-collector-contrib/cmd/configschema - -go 1.21.0 - -require ( - github.com/fatih/structtag v1.2.0 - github.com/google/uuid v1.6.0 - github.com/open-telemetry/opentelemetry-collector-contrib v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/redisreceiver v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configtls v0.102.0 - go.opentelemetry.io/collector/otelcol v0.102.0 - go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0 - go.uber.org/goleak v1.3.0 - golang.org/x/mod v0.17.0 - golang.org/x/text v0.15.0 - gopkg.in/yaml.v2 v2.4.0 -) - -require ( - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2 // indirect - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor v0.11.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect - github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.16.1 // indirect - github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics v0.16.1 // indirect - github.com/gocql/gocql v1.6.0 // indirect - github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/alibabacloudlogserviceexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awscloudwatchlogsexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsemfexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsxrayexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/azuredataexplorerexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/azuremonitorexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/carbonexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/cassandraexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/clickhouseexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/coralogixexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datasetexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/influxdbexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/logicmonitorexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/logzioexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/lokiexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/mezmoexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/pulsarexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sapmexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sentryexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/signalfxexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/skywalkingexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sumologicexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/tencentcloudlogserviceexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/oauth2clientauthextension v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/ecstaskobserver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/k8sobserver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/oidcauthextension v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutil v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/containerinsight v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/ecsutil v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/k8s v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/docker v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/kubelet v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/sqlquery v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchperresourceattr v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/loki v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/signalfx v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/skywalking v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricsgenerationprocessor v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricstransformprocessor v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/processor/routingprocessor v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/processor/spanprocessor v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/activedirectorydsreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/apachereceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/apachesparkreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awscloudwatchreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awscontainerinsightreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsecscontainermetricsreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsfirehosereceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azuremonitorreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/bigipreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/chronyreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/cloudfoundryreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/collectdreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/couchdbreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/datadogreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/dockerstatsreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/elasticsearchreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/expvarreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/flinkmetricsreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/fluentforwardreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/haproxyreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/httpcheckreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/iisreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/influxdbreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jmxreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/journaldreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8seventsreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sobjectsreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkametricsreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kubeletstatsreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/memcachedreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mongodbatlasreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mongodbreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mysqlreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nginxreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nsxtreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/oracledbreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/otlpjsonfilereceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/podmanreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/postgresqlreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/pulsarreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/rabbitmqreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/riakreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/saphanareceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sapmreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/signalfxreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/skywalkingreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/solacereceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkhecreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sqlserverreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sshcheckreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/tcplogreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/udplogreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/vcenterreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/windowseventlogreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/windowsperfcountersreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver v0.102.0 // indirect - github.com/samber/lo v1.38.1 // indirect - github.com/shoenig/go-m1cpu v0.1.6 // indirect - go.opentelemetry.io/collector/exporter v0.102.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect -) - -require ( - bitbucket.org/atlassian/go-asap/v2 v2.8.0 // indirect - cloud.google.com/go v0.114.0 // indirect - cloud.google.com/go/auth v0.4.2 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.2 // indirect - cloud.google.com/go/compute/metadata v0.3.0 // indirect - cloud.google.com/go/iam v1.1.8 // indirect - cloud.google.com/go/logging v1.10.0 // indirect - cloud.google.com/go/longrunning v0.5.7 // indirect - cloud.google.com/go/monitoring v1.19.0 // indirect - cloud.google.com/go/pubsub v1.38.0 // indirect - cloud.google.com/go/spanner v1.63.0 // indirect - cloud.google.com/go/trace v1.10.7 // indirect - code.cloudfoundry.org/clock v1.0.0 // indirect - code.cloudfoundry.org/go-diodes v0.0.0-20211115184647-b584dd5df32c // indirect - code.cloudfoundry.org/go-loggregator v7.4.0+incompatible // indirect - code.cloudfoundry.org/rfc5424 v0.0.0-20201103192249-000122071b78 // indirect - filippo.io/edwards25519 v1.1.0 // indirect - github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect - github.com/99designs/keyring v1.2.2 // indirect - github.com/AthenZ/athenz v1.10.39 // indirect - github.com/Azure/azure-amqp-common-go/v4 v4.2.0 // indirect - github.com/Azure/azure-event-hubs-go/v3 v3.6.2 // indirect - github.com/Azure/azure-kusto-go v0.15.2 // indirect - github.com/Azure/azure-pipeline-go v0.2.3 // indirect - github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.6.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.5.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2 // indirect - github.com/Azure/azure-storage-queue-go v0.0.0-20230531184854-c06a8eff66fe // indirect - github.com/Azure/go-amqp v1.0.5 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.29 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.23 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect - github.com/Azure/go-autorest/autorest/validation v0.3.1 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/ClickHouse/ch-go v0.61.5 // indirect - github.com/ClickHouse/clickhouse-go/v2 v2.23.0 // indirect - github.com/Code-Hex/go-generics-cache v1.3.1 // indirect - github.com/DataDog/agent-payload/v5 v5.0.119 // indirect - github.com/DataDog/datadog-agent/comp/core/config v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/core/hostname/hostnameinterface v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/core/log v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/core/secrets v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/core/telemetry v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/def v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/logs/agent/config v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline/logsagentpipelineimpl v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/exporter/logsagentexporter v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/metricsclient v0.0.0-20240525065430-d0b647bcb646 // indirect - github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/statsprocessor v0.0.0-20240525065430-d0b647bcb646 // indirect - github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/config/env v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/config/model v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/config/setup v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/config/utils v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/auditor v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/client v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/diagnostic v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/message v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/metrics v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/pipeline v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/processor v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/sds v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/sender v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/sources v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/status/statusinterface v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/status/utils v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/obfuscate v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/proto v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/status/health v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/telemetry v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/trace v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/backoff v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/cgroups v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/executable v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/filesystem v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/fxutil v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/http v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/log v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/optional v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/pointer v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/scrubber v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/startstop v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/statstracker v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/system v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/system/socket v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/winutil v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/version v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-api-client-go/v2 v2.26.0 // indirect - github.com/DataDog/datadog-go/v5 v5.5.0 // indirect - github.com/DataDog/dd-sensitive-data-scanner/sds-go/go v0.0.0-20240419161837-f1b2f553edfe // indirect - github.com/DataDog/go-sqllexer v0.0.9 // indirect - github.com/DataDog/go-tuf v1.1.0-0.5.2 // indirect - github.com/DataDog/gohai v0.0.0-20230524154621-4316413895ee // indirect - github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata v0.16.1 // indirect - github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/logs v0.16.1 // indirect - github.com/DataDog/opentelemetry-mapping-go/pkg/quantile v0.16.1 // indirect - github.com/DataDog/sketches-go v1.4.5 // indirect - github.com/DataDog/viper v1.13.3 // indirect - github.com/DataDog/zstd v1.5.2 // indirect - github.com/GehirnInc/crypt v0.0.0-20200316065508-bb7000b8a962 // indirect - github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.23.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector v0.47.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector/googlemanagedprometheus v0.47.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.23.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.47.0 // indirect - github.com/IBM/sarama v1.43.2 // indirect - github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/ReneKroon/ttlcache/v2 v2.11.0 // indirect - github.com/SAP/go-hdb v1.9.5 // indirect - github.com/SermoDigital/jose v0.9.2-0.20180104203859-803625baeddc // indirect - github.com/Showmax/go-fqdn v1.0.0 // indirect - github.com/aerospike/aerospike-client-go/v6 v6.13.0 // indirect - github.com/alecthomas/participle/v2 v2.1.1 // indirect - github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 // indirect - github.com/aliyun/aliyun-log-go-sdk v0.1.75 // indirect - github.com/andybalholm/brotli v1.1.0 // indirect - github.com/apache/arrow/go/v15 v15.0.0 // indirect - github.com/apache/pulsar-client-go v0.8.1 // indirect - github.com/apache/pulsar-client-go/oauth2 v0.0.0-20220120090717-25e59572242e // indirect - github.com/apache/thrift v0.20.0 // indirect - github.com/ardielle/ardielle-go v1.5.2 // indirect - github.com/armon/go-metrics v0.4.1 // indirect - github.com/armon/go-radix v1.0.0 // indirect - github.com/aws/aws-sdk-go v1.53.11 // indirect - github.com/aws/aws-sdk-go-v2 v1.27.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 // indirect - github.com/aws/aws-sdk-go-v2/config v1.27.16 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.16 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3 // indirect - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.15 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.7 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5 // indirect - github.com/aws/aws-sdk-go-v2/service/kinesis v1.27.8 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1 // indirect - github.com/aws/aws-sdk-go-v2/service/servicediscovery v1.29.10 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.20.9 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.28.10 // indirect - github.com/aws/smithy-go v1.20.2 // indirect - github.com/benbjohnson/clock v1.3.5 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/blang/semver/v4 v4.0.0 // indirect - github.com/bmatcuk/doublestar/v4 v4.6.1 // indirect - github.com/briandowns/spinner v1.23.0 // indirect - github.com/buger/jsonparser v1.1.1 // indirect - github.com/cenkalti/backoff v2.2.1+incompatible // indirect - github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/checkpoint-restore/go-criu/v5 v5.3.0 // indirect - github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect - github.com/cilium/ebpf v0.11.0 // indirect - github.com/cloudfoundry-incubator/uaago v0.0.0-20190307164349-8136b7bbe76e // indirect - github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50 // indirect - github.com/containerd/cgroups/v3 v3.0.3 // indirect - github.com/containerd/console v1.0.3 // indirect - github.com/containerd/ttrpc v1.2.2 // indirect - github.com/coreos/go-oidc/v3 v3.10.0 // indirect - github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/cskr/pubsub v1.0.2 // indirect - github.com/cyphar/filepath-securejoin v0.2.4 // indirect - github.com/danieljoos/wincred v1.1.2 // indirect - github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/dennwc/varint v1.0.0 // indirect - github.com/devigned/tab v0.1.1 // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/digitalocean/godo v1.109.0 // indirect - github.com/distribution/reference v0.5.0 // indirect - github.com/docker/docker v25.0.5+incompatible // indirect - github.com/docker/go-connections v0.5.0 // indirect - github.com/docker/go-units v0.5.0 // indirect - github.com/dustin/go-humanize v1.0.1 // indirect - github.com/dvsekhvalnov/jose2go v1.6.0 // indirect - github.com/eapache/go-resiliency v1.6.0 // indirect - github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 // indirect - github.com/eapache/queue v1.1.0 // indirect - github.com/elastic/elastic-transport-go/v8 v8.5.0 // indirect - github.com/elastic/go-docappender/v2 v2.1.2 // indirect - github.com/elastic/go-elasticsearch/v7 v7.17.10 // indirect - github.com/elastic/go-elasticsearch/v8 v8.13.1 // indirect - github.com/elastic/go-structform v0.0.10 // indirect - github.com/elastic/go-sysinfo v1.7.1 // indirect - github.com/elastic/go-windows v1.0.1 // indirect - github.com/emicklei/go-restful/v3 v3.11.0 // indirect - github.com/envoyproxy/go-control-plane v0.12.0 // indirect - github.com/envoyproxy/protoc-gen-validate v1.0.4 // indirect - github.com/euank/go-kmsg-parser v2.0.0+incompatible // indirect - github.com/expr-lang/expr v1.16.9 // indirect - github.com/facebook/time v0.0.0-20240510113249-fa89cc575891 // indirect - github.com/fatih/color v1.16.0 // indirect - github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/gabriel-vasile/mimetype v1.4.2 // indirect - github.com/getsentry/sentry-go v0.28.0 // indirect - github.com/go-faster/city v1.0.1 // indirect - github.com/go-faster/errors v0.7.1 // indirect - github.com/go-jose/go-jose/v4 v4.0.1 // indirect - github.com/go-kit/kit v0.13.0 // indirect - github.com/go-kit/log v0.2.1 // indirect - github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect - github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect - github.com/go-openapi/jsonpointer v0.20.2 // indirect - github.com/go-openapi/jsonreference v0.20.4 // indirect - github.com/go-openapi/swag v0.22.9 // indirect - github.com/go-resty/resty/v2 v2.12.0 // indirect - github.com/go-sql-driver/mysql v1.8.1 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect - github.com/go-zookeeper/zk v1.0.3 // indirect - github.com/gobwas/glob v0.2.3 // indirect - github.com/goccy/go-json v0.10.2 // indirect - github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect - github.com/godbus/dbus/v5 v5.1.0 // indirect - github.com/gofrs/uuid v4.4.0+incompatible // indirect - github.com/gogo/googleapis v1.4.1 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt v3.2.2+incompatible // indirect - github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang-jwt/jwt/v5 v5.2.1 // indirect - github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect - github.com/golang-sql/sqlexp v0.1.0 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/mock v1.6.0 // indirect - github.com/golang/protobuf v1.5.4 // indirect - github.com/golang/snappy v0.0.4 // indirect - github.com/google/cadvisor v0.49.0 // indirect - github.com/google/flatbuffers v23.5.26+incompatible // indirect - github.com/google/gnostic-models v0.6.8 // indirect - github.com/google/go-cmp v0.6.0 // indirect - github.com/google/go-querystring v1.1.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/s2a-go v0.1.7 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.4 // indirect - github.com/gophercloud/gophercloud v1.8.0 // indirect - github.com/gorilla/mux v1.8.1 // indirect - github.com/gorilla/websocket v1.5.0 // indirect - github.com/gosnmp/gosnmp v1.37.0 // indirect - github.com/grafana/loki/pkg/push v0.0.0-20240514112848-a1b1eeb09583 // indirect - github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd // indirect - github.com/grobie/gomemcache v0.0.0-20230213081705-239240bbc445 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect - github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect - github.com/hashicorp/consul/api v1.28.3 // indirect - github.com/hashicorp/cronexpr v1.1.2 // indirect - github.com/hashicorp/errwrap v1.1.0 // indirect - github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-hclog v1.6.3 // indirect - github.com/hashicorp/go-immutable-radix v1.3.1 // indirect - github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-retryablehttp v0.7.4 // indirect - github.com/hashicorp/go-rootcerts v1.0.2 // indirect - github.com/hashicorp/go-uuid v1.0.3 // indirect - github.com/hashicorp/go-version v1.7.0 // indirect - github.com/hashicorp/golang-lru v1.0.2 // indirect - github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hashicorp/nomad/api v0.0.0-20240306004928-3e7191ccb702 // indirect - github.com/hashicorp/serf v0.10.1 // indirect - github.com/hectane/go-acl v0.0.0-20190604041725-da78bae5fc95 // indirect - github.com/hetznercloud/hcloud-go/v2 v2.6.0 // indirect - github.com/iancoleman/strcase v0.3.0 // indirect - github.com/imdario/mergo v0.3.16 // indirect - github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/influxdata/influxdb-observability/common v0.5.12 // indirect - github.com/influxdata/influxdb-observability/influx2otel v0.5.12 // indirect - github.com/influxdata/influxdb-observability/otel2influx v0.5.12 // indirect - github.com/influxdata/line-protocol/v2 v2.2.1 // indirect - github.com/ionos-cloud/sdk-go/v6 v6.1.11 // indirect - github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect - github.com/jackc/pgx/v5 v5.6.0 // indirect - github.com/jackc/puddle/v2 v2.2.1 // indirect - github.com/jaegertracing/jaeger v1.57.0 // indirect - github.com/jcmturner/aescts/v2 v2.0.0 // indirect - github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect - github.com/jcmturner/gofork v1.7.6 // indirect - github.com/jcmturner/goidentity/v6 v6.0.1 // indirect - github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect - github.com/jcmturner/rpc/v2 v2.0.3 // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 // indirect - github.com/josharian/intern v1.0.0 // indirect - github.com/jpillora/backoff v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/julienschmidt/httprouter v1.3.0 // indirect - github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect - github.com/karrick/godirwalk v1.17.0 // indirect - github.com/klauspost/compress v1.17.8 // indirect - github.com/klauspost/cpuid/v2 v2.2.5 // indirect - github.com/knadh/koanf/maps v0.1.1 // indirect - github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect - github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b // indirect - github.com/kr/fs v0.1.0 // indirect - github.com/kylelemons/godebug v1.1.0 // indirect - github.com/leodido/go-syslog/v4 v4.1.0 // indirect - github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b // indirect - github.com/leoluk/perflib_exporter v0.2.1 // indirect - github.com/lestrrat-go/strftime v1.0.6 // indirect - github.com/lib/pq v1.10.9 // indirect - github.com/lightstep/go-expohisto v1.0.0 // indirect - github.com/linkedin/goavro/v2 v2.9.8 // indirect - github.com/linode/linodego v1.33.0 // indirect - github.com/logicmonitor/lm-data-sdk-go v1.3.0 // indirect - github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c // indirect - github.com/magiconair/properties v1.8.7 // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-ieproxy v0.0.11 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-sqlite3 v1.14.22 // indirect - github.com/microsoft/ApplicationInsights-Go v0.4.4 // indirect - github.com/microsoft/go-mssqldb v1.7.1 // indirect - github.com/miekg/dns v1.1.58 // indirect - github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible // indirect - github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/go-ps v1.0.0 // indirect - github.com/mitchellh/hashstructure v1.1.0 // indirect - github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect - github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c // indirect - github.com/mitchellh/reflectwalk v1.0.2 // indirect - github.com/moby/sys/mountinfo v0.6.2 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect - github.com/mongodb-forks/digest v1.1.0 // indirect - github.com/montanaflynn/stats v0.7.0 // indirect - github.com/mostynb/go-grpc-compression v1.2.2 // indirect - github.com/mrunalp/fileutils v0.5.1 // indirect - github.com/mtibben/percent v0.2.1 // indirect - github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect - github.com/nginxinc/nginx-prometheus-exporter v0.11.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/connector/datadogconnector v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/connector/exceptionsconnector v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/connector/grafanacloudconnector v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/connector/servicegraphconnector v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awskinesisexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlecloudexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlecloudpubsubexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlemanagedprometheusexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opensearchexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/asapauthextension v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/basicauthextension v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/bearertokenauthextension v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/jaegerremotesampling v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/dockerobserver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/hostobserver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/dbstorage v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/filestorage v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/sumologicextension v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/cwlogs v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/metrics v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/proxy v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/xray v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/collectd v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/azure v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/winperfcounters v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsxrayreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azureblobreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azureeventhubreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/carbonreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/googlecloudpubsubreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/googlecloudspannerreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/lokireceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/purefareceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/purefbreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/receivercreator v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/simpleprometheusreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/snmpreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/snowflakereceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkenterprisereceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sqlqueryreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/statsdreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/wavefrontreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/webhookeventreceiver v0.102.0 // indirect - github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.1.0 // indirect - github.com/opencontainers/runc v1.1.12 // indirect - github.com/opencontainers/runtime-spec v1.1.0-rc.3 // indirect - github.com/opencontainers/selinux v1.11.0 // indirect - github.com/opensearch-project/opensearch-go/v2 v2.3.0 // indirect - github.com/openshift/api v3.9.0+incompatible // indirect - github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142 // indirect - github.com/openzipkin/zipkin-go v0.4.3 // indirect - github.com/outcaste-io/ristretto v0.2.1 // indirect - github.com/ovh/go-ovh v1.4.3 // indirect - github.com/patrickmn/go-cache v2.1.0+incompatible // indirect - github.com/paulmach/orb v0.11.1 // indirect - github.com/pelletier/go-toml v1.9.3 // indirect - github.com/pelletier/go-toml/v2 v2.1.0 // indirect - github.com/philhofer/fwd v1.1.2 // indirect - github.com/pierrec/lz4 v2.6.1+incompatible // indirect - github.com/pierrec/lz4/v4 v4.1.21 // indirect - github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/pkg/sftp v1.13.6 // indirect - github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c // indirect - github.com/pquerna/cachecontrol v0.1.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/common/sigv4 v0.1.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e // indirect - github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect - github.com/redis/go-redis/v9 v9.5.1 // indirect - github.com/relvacode/iso8601 v1.4.0 // indirect - github.com/rs/cors v1.11.0 // indirect - github.com/sagikazarmark/locafero v0.4.0 // indirect - github.com/sagikazarmark/slog-shim v0.1.0 // indirect - github.com/scaleway/scaleway-sdk-go v1.0.0-beta.25 // indirect - github.com/scalyr/dataset-go v0.18.0 // indirect - github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646 // indirect - github.com/secure-systems-lab/go-securesystemslib v0.7.0 // indirect - github.com/segmentio/asm v1.2.0 // indirect - github.com/shirou/gopsutil/v3 v3.24.4 // indirect - github.com/shopspring/decimal v1.3.1 // indirect - github.com/signalfx/com_signalfx_metrics_protobuf v0.0.3 // indirect - github.com/signalfx/sapm-proto v0.14.0 // indirect - github.com/sijms/go-ora/v2 v2.8.19 // indirect - github.com/sirupsen/logrus v1.9.3 // indirect - github.com/snowflakedb/gosnowflake v1.10.1-0.20240509141315-5570db2126fe // indirect - github.com/soheilhy/cmux v0.1.5 // indirect - github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spaolacci/murmur3 v1.1.0 // indirect - github.com/spf13/afero v1.11.0 // indirect - github.com/spf13/cast v1.6.0 // indirect - github.com/spf13/cobra v1.8.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.18.2 // indirect - github.com/stormcat24/protodep v0.1.8 // indirect - github.com/stretchr/objx v0.5.2 // indirect - github.com/subosito/gotenv v1.6.0 // indirect - github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 // indirect - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.931 // indirect - github.com/tg123/go-htpasswd v1.2.2 // indirect - github.com/tidwall/gjson v1.14.3 // indirect - github.com/tidwall/match v1.1.1 // indirect - github.com/tidwall/pretty v1.2.0 // indirect - github.com/tidwall/tinylru v1.1.0 // indirect - github.com/tidwall/wal v1.1.7 // indirect - github.com/tilinna/clock v1.1.0 // indirect - github.com/tinylib/msgp v1.1.9 // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect - github.com/valyala/fastjson v1.6.4 // indirect - github.com/vincent-petithory/dataurl v1.0.0 // indirect - github.com/vishvananda/netlink v1.2.1-beta.2 // indirect - github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f // indirect - github.com/vmware/go-vmware-nsxt v0.0.0-20230223012718-d31b8a1ca05e // indirect - github.com/vmware/govmomi v0.36.3 // indirect - github.com/vultr/govultr/v2 v2.17.2 // indirect - github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.1.2 // indirect - github.com/xdg-go/stringprep v1.0.4 // indirect - github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - github.com/yuin/gopher-lua v0.0.0-20220504180219-658193537a64 // indirect - github.com/yusufpapurcu/wmi v1.2.4 // indirect - github.com/zeebo/xxh3 v1.0.2 // indirect - go.elastic.co/apm/module/apmzap/v2 v2.6.0 // indirect - go.elastic.co/apm/v2 v2.6.0 // indirect - go.elastic.co/fastjson v1.3.0 // indirect - go.etcd.io/bbolt v1.3.10 // indirect - go.mongodb.org/atlas v0.36.0 // indirect - go.mongodb.org/mongo-driver v1.15.0 // indirect - go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/configgrpc v0.102.0 // indirect - go.opentelemetry.io/collector/config/confighttp v0.102.0 // indirect - go.opentelemetry.io/collector/config/confignet v0.102.0 // indirect - go.opentelemetry.io/collector/config/configopaque v1.9.0 // indirect - go.opentelemetry.io/collector/config/configretry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/confmap v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0 // indirect - go.opentelemetry.io/collector/connector v0.102.0 // indirect - go.opentelemetry.io/collector/connector/forwardconnector v0.102.0 // indirect - go.opentelemetry.io/collector/consumer v0.102.0 // indirect - go.opentelemetry.io/collector/exporter/debugexporter v0.102.0 // indirect - go.opentelemetry.io/collector/exporter/loggingexporter v0.102.0 // indirect - go.opentelemetry.io/collector/exporter/otlpexporter v0.102.0 // indirect - go.opentelemetry.io/collector/exporter/otlphttpexporter v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/extension/ballastextension v0.102.0 // indirect - go.opentelemetry.io/collector/extension/zpagesextension v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/filter v0.102.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/collector/processor v0.102.0 // indirect - go.opentelemetry.io/collector/processor/batchprocessor v0.102.0 // indirect - go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.102.0 // indirect - go.opentelemetry.io/collector/semconv v0.102.0 // indirect - go.opentelemetry.io/collector/service v0.102.0 // indirect - go.opentelemetry.io/contrib/config v0.7.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/contrib/propagators/b3 v1.27.0 // indirect - go.opentelemetry.io/contrib/zpages v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/bridge/opencensus v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 // indirect - go.opentelemetry.io/otel/metric v1.27.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - go.opentelemetry.io/otel/trace v1.27.0 // indirect - go.opentelemetry.io/proto/otlp v1.2.0 // indirect - go.uber.org/atomic v1.11.0 // indirect - go.uber.org/dig v1.17.0 // indirect - go.uber.org/fx v1.18.2 // indirect - go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.23.0 // indirect - golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/oauth2 v0.20.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/term v0.20.0 // indirect - golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.21.0 // indirect - golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect - gonum.org/v1/gonum v0.15.0 // indirect - google.golang.org/api v0.182.0 // indirect - google.golang.org/genproto v0.0.0-20240521202816-d264139d666e // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240521202816-d264139d666e // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - gopkg.in/zorkian/go-datadog-api.v2 v2.30.0 // indirect - howett.net/plist v1.0.0 // indirect - k8s.io/api v0.29.3 // indirect - k8s.io/apimachinery v0.29.3 // indirect - k8s.io/client-go v0.29.3 // indirect - k8s.io/klog/v2 v2.120.1 // indirect - k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect - k8s.io/kubelet v0.29.3 // indirect - k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0 // indirect - sigs.k8s.io/controller-runtime v0.17.3 // indirect - sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect - sigs.k8s.io/yaml v1.4.0 // indirect - skywalking.apache.org/repo/goapi v0.0.0-20240104145220-ba7202308dd4 // indirect -) - -// Replace references to modules that are in this repository with their relateive paths -// so that we always build with current (latest) version of the source code. - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutil => ../../internal/aws/awsutil - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/containerinsight => ../../internal/aws/containerinsight - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/cwlogs => ./../../internal/aws/cwlogs - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/ecsutil => ../../internal/aws/ecsutil - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/k8s => ../../internal/aws/k8s - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/metrics => ../../internal/aws/metrics - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/proxy => ../../internal/aws/proxy - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/xray => ../../internal/aws/xray - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/common => ../../internal/common - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal => ../../internal/coreinternal - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/docker => ../../internal/docker - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig => ../../internal/k8sconfig - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka => ../../internal/kafka - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/kubelet => ../../internal/kubelet - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders => ../../internal/metadataproviders - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent => ../../internal/sharedcomponent - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk => ../../internal/splunk - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/alibabacloudlogserviceexporter => ../../exporter/alibabacloudlogserviceexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awscloudwatchlogsexporter => ../../exporter/awscloudwatchlogsexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsemfexporter => ../../exporter/awsemfexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awskinesisexporter => ../../exporter/awskinesisexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsxrayexporter => ../../exporter/awsxrayexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/azuredataexplorerexporter => ../../exporter/azuredataexplorerexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/azuremonitorexporter => ../../exporter/azuremonitorexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/carbonexporter => ../../exporter/carbonexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/clickhouseexporter => ../../exporter/clickhouseexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/cassandraexporter => ../../exporter/cassandraexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/coralogixexporter => ../../exporter/coralogixexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter => ../../exporter/datadogexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datasetexporter => ../../exporter/datasetexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter => ../../exporter/elasticsearchexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter => ../../exporter/fileexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlecloudexporter => ../../exporter/googlecloudexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlemanagedprometheusexporter => ../../exporter/googlemanagedprometheusexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlecloudpubsubexporter => ../../exporter/googlecloudpubsubexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/influxdbexporter => ../../exporter/influxdbexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter => ../../exporter/instanaexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter => ../../exporter/kafkaexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter => ../../exporter/loadbalancingexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/logicmonitorexporter => ../../exporter/logicmonitorexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/logzioexporter => ../../exporter/logzioexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/lokiexporter => ../../exporter/lokiexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/mezmoexporter => ../../exporter/mezmoexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter => ../../exporter/opencensusexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opensearchexporter => ../../exporter/opensearchexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter => ../../exporter/prometheusexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter => ../../exporter/prometheusremotewriteexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/pulsarexporter => ../../exporter/pulsarexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sapmexporter => ../../exporter/sapmexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sentryexporter => ../../exporter/sentryexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/signalfxexporter => ../../exporter/signalfxexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/skywalkingexporter => ../../exporter/skywalkingexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter => ../../exporter/splunkhecexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sumologicexporter => ../../exporter/sumologicexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/tencentcloudlogserviceexporter => ../../exporter/tencentcloudlogserviceexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter => ../../exporter/zipkinexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/asapauthextension => ../../extension/asapauthextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy => ../../extension/awsproxy - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/basicauthextension => ../../extension/basicauthextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/bearertokenauthextension => ../../extension/bearertokenauthextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension => ../../extension/headerssetterextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension => ../../extension/healthcheckextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/oauth2clientauthextension => ../../extension/oauth2clientauthextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer => ../../extension/observer - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/ecstaskobserver => ../../extension/observer/ecstaskobserver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/hostobserver => ../../extension/observer/hostobserver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/k8sobserver => ../../extension/observer/k8sobserver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/oidcauthextension => ../../extension/oidcauthextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension => ../../extension/pprofextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension => ../../extension/sigv4authextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchperresourceattr => ../../pkg/batchperresourceattr - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/winperfcounters => ../../pkg/winperfcounters - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal => ../../pkg/batchpersignal - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata => ../../pkg/experimentalmetricmetadata - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry => ../../pkg/resourcetotelemetry - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza => ../../pkg/stanza - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl => ../../pkg/ottl - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest => ../../pkg/pdatatest - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../../pkg/pdatautil - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/azure => ../../pkg/translator/azure - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger => ../../pkg/translator/jaeger - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/loki => ../../pkg/translator/loki - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus => ../../pkg/translator/opencensus - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus => ../../pkg/translator/prometheus - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite => ../../pkg/translator/prometheusremotewrite - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/signalfx => ../../pkg/translator/signalfx - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/skywalking => ../../pkg/translator/skywalking - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin => ../../pkg/translator/zipkin - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor => ../../processor/attributesprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor => ../../processor/cumulativetodeltaprocessor/ - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor => ../../processor/deltatorateprocessor/ - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor => ../../processor/filterprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor => ../../processor/groupbyattrsprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor => ../../processor/groupbytraceprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor => ../../processor/k8sattributesprocessor/ - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricsgenerationprocessor => ../../processor/metricsgenerationprocessor/ - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricstransformprocessor => ../../processor/metricstransformprocessor/ - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor => ../../processor/probabilisticsamplerprocessor/ - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor => ../../processor/resourcedetectionprocessor/ - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor => ../../processor/resourceprocessor/ - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/routingprocessor => ../../processor/routingprocessor/ - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/spanprocessor => ../../processor/spanprocessor/ - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor => ../../processor/tailsamplingprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor => ../../processor/transformprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/activedirectorydsreceiver => ../../receiver/activedirectorydsreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver => ../../receiver/aerospikereceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/apachereceiver => ../../receiver/apachereceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/apachesparkreceiver => ../../receiver/apachesparkreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awscloudwatchreceiver => ../../receiver/awscloudwatchreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awscontainerinsightreceiver => ../../receiver/awscontainerinsightreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsecscontainermetricsreceiver => ../../receiver/awsecscontainermetricsreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsfirehosereceiver => ../../receiver/awsfirehosereceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsxrayreceiver => ../../receiver/awsxrayreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azureblobreceiver => ../../receiver/azureblobreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azuremonitorreceiver => ../../receiver/azuremonitorreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/bigipreceiver => ../../receiver/bigipreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/couchdbreceiver => ../../receiver/couchdbreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/carbonreceiver => ../../receiver/carbonreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/chronyreceiver => ../../receiver/chronyreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/cloudfoundryreceiver => ../../receiver/cloudfoundryreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/collectdreceiver => ../../receiver/collectdreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/datadogreceiver => ../../receiver/datadogreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/dockerstatsreceiver => ../../receiver/dockerstatsreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/elasticsearchreceiver => ../../receiver/elasticsearchreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/expvarreceiver => ../../receiver/expvarreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver => ../../receiver/filelogreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/otlpjsonfilereceiver => ../../receiver/otlpjsonfilereceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/flinkmetricsreceiver => ../../receiver/flinkmetricsreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/fluentforwardreceiver => ../../receiver/fluentforwardreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/googlecloudpubsubreceiver => ../../receiver/googlecloudpubsubreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/googlecloudspannerreceiver => ../../receiver/googlecloudspannerreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/haproxyreceiver => ../../receiver/haproxyreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver => ../../receiver/hostmetricsreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/httpcheckreceiver => ../../receiver/httpcheckreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/influxdbreceiver => ../../receiver/influxdbreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/iisreceiver => ../../receiver/iisreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver => ../../receiver/jaegerreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jmxreceiver => ../../receiver/jmxreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/journaldreceiver => ../../receiver/journaldreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver => ../../receiver/k8sclusterreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkametricsreceiver => ../../receiver/kafkametricsreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8seventsreceiver => ../../receiver/k8seventsreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sobjectsreceiver => ../../receiver/k8sobjectsreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver => ../../receiver/kafkareceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kubeletstatsreceiver => ../../receiver/kubeletstatsreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/lokireceiver => ../../receiver/lokireceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/memcachedreceiver => ../../receiver/memcachedreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mongodbreceiver => ../../receiver/mongodbreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mongodbatlasreceiver => ../../receiver/mongodbatlasreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mysqlreceiver => ../../receiver/mysqlreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nginxreceiver => ../../receiver/nginxreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nsxtreceiver => ../../receiver/nsxtreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver => ../../receiver/opencensusreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/oracledbreceiver => ../../receiver/oracledbreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/podmanreceiver => ../../receiver/podmanreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/postgresqlreceiver => ../../receiver/postgresqlreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver => ../../receiver/prometheusreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/pulsarreceiver => ../../receiver/pulsarreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/purefareceiver => ../../receiver/purefareceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/purefbreceiver => ../../receiver/purefbreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/rabbitmqreceiver => ../../receiver/rabbitmqreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/receivercreator => ../../receiver/receivercreator - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/redisreceiver => ../../receiver/redisreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/riakreceiver => ../../receiver/riakreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/saphanareceiver => ../../receiver/saphanareceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sapmreceiver => ../../receiver/sapmreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/signalfxreceiver => ../../receiver/signalfxreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/simpleprometheusreceiver => ../../receiver/simpleprometheusreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/skywalkingreceiver => ../../receiver/skywalkingreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/snmpreceiver => ../../receiver/snmpreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/solacereceiver => ../../receiver/solacereceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkhecreceiver => ../../receiver/splunkhecreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sqlqueryreceiver => ../../receiver/sqlqueryreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sqlserverreceiver => ../../receiver/sqlserverreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/statsdreceiver => ../../receiver/statsdreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver => ../../receiver/syslogreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/tcplogreceiver => ../../receiver/tcplogreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/udplogreceiver => ../../receiver/udplogreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/vcenterreceiver => ../../receiver/vcenterreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/wavefrontreceiver => ../../receiver/wavefrontreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/webhookeventreceiver => ../../receiver/webhookeventreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/windowseventlogreceiver => ../../receiver/windowseventlogreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/windowsperfcountersreceiver => ../../receiver/windowsperfcountersreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver => ../../receiver/zipkinreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver => ../../receiver/zookeeperreceiver - -// see https://github.com/mattn/go-ieproxy/issues/45 -replace github.com/mattn/go-ieproxy => github.com/mattn/go-ieproxy v0.0.1 - -// see https://github.com/google/gnostic/issues/262 -replace github.com/googleapis/gnostic v0.5.6 => github.com/googleapis/gnostic v0.5.5 - -// see https://github.com/distribution/distribution/issues/3590 -exclude github.com/docker/distribution v2.8.0+incompatible - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter => ../../internal/filter - -retract ( - v0.76.2 - v0.76.1 - v0.65.0 -) - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sshcheckreceiver => ../../receiver/sshcheckreceiver - -// openshift removed all tags from their repo, use the pseudoversion from the release-3.9 branch HEAD -replace github.com/openshift/api v3.9.0+incompatible => github.com/openshift/api v0.0.0-20180801171038-322a19404e37 - -// It appears that the v0.2.0 tag was modified. Replacing with v0.2.1 -replace github.com/outcaste-io/ristretto v0.2.0 => github.com/outcaste-io/ristretto v0.2.1 - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/snowflakereceiver => ../../receiver/snowflakereceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/dockerobserver => ../../extension/observer/dockerobserver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8stest => ../../internal/k8stest - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/jaegerremotesampling => ../../extension/jaegerremotesampling - -replace github.com/open-telemetry/opentelemetry-collector-contrib => ../.. - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azureeventhubreceiver => ../../receiver/azureeventhubreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden => ../../pkg/golden - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/collectd => ../../internal/collectd - -replace ( - github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector => ../../connector/countconnector - github.com/open-telemetry/opentelemetry-collector-contrib/connector/datadogconnector => ../../connector/datadogconnector - github.com/open-telemetry/opentelemetry-collector-contrib/connector/exceptionsconnector => ../../connector/exceptionsconnector - github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector => ../../connector/routingconnector - github.com/open-telemetry/opentelemetry-collector-contrib/connector/servicegraphconnector => ../../connector/servicegraphconnector - github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector => ../../connector/spanmetricsconnector -) - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/sqlquery => ../../internal/sqlquery - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/filestorage => ../../extension/storage/filestorage - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/dbstorage => ../../extension/storage/dbstorage - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage => ../../extension/storage - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/otlpencodingextension => ../../extension/encoding/otlpencodingextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding => ../../extension/encoding - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension => ../../extension/ackextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/connector/grafanacloudconnector => ../../connector/grafanacloudconnector - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/sumologicextension => ../../extension/sumologicextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkenterprisereceiver => ../../receiver/splunkenterprisereceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling => ../../pkg/sampling diff --git a/cmd/configschema/go.sum b/cmd/configschema/go.sum deleted file mode 100644 index bef680c9918e..000000000000 --- a/cmd/configschema/go.sum +++ /dev/null @@ -1,3355 +0,0 @@ -bitbucket.org/atlassian/go-asap/v2 v2.8.0 h1:JL4jktrZT3H8GHkkeJ1RCdhJ5YcOyVccA/2TJ4ae3I0= -bitbucket.org/atlassian/go-asap/v2 v2.8.0/go.mod h1:cuRgWb7eeGtsocKmqY2kPlMMlwpkeNh+QOIkjAMlUBc= -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= -cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= -cloud.google.com/go v0.114.0 h1:OIPFAdfrFDFO2ve2U7r/H5SwSbBzEdrBdE7xkgwc+kY= -cloud.google.com/go v0.114.0/go.mod h1:ZV9La5YYxctro1HTPug5lXH/GefROyW8PPD4T8n9J8E= -cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= -cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= -cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= -cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= -cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= -cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= -cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= -cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= -cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= -cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= -cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= -cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= -cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= -cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= -cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= -cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= -cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= -cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= -cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= -cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= -cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= -cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= -cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= -cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= -cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= -cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= -cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= -cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= -cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= -cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= -cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= -cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= -cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= -cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= -cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= -cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= -cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= -cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= -cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= -cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= -cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= -cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= -cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= -cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= -cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= -cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= -cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= -cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= -cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= -cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= -cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= -cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= -cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= -cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= -cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= -cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= -cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= -cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= -cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= -cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= -cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= -cloud.google.com/go/auth v0.4.2 h1:sb0eyLkhRtpq5jA+a8KWw0W70YcdVca7KJ8TM0AFYDg= -cloud.google.com/go/auth v0.4.2/go.mod h1:Kqvlz1cf1sNA0D+sYJnkPQOP+JMHkuHeIgVmCRtZOLc= -cloud.google.com/go/auth/oauth2adapt v0.2.2 h1:+TTV8aXpjeChS9M+aTtN/TjdQnzJvmzKFt//oWu7HX4= -cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q= -cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= -cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= -cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= -cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= -cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= -cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= -cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= -cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= -cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= -cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= -cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= -cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= -cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= -cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= -cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= -cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= -cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= -cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= -cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= -cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= -cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= -cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= -cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= -cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= -cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= -cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= -cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= -cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= -cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= -cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= -cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= -cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= -cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= -cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= -cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= -cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= -cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= -cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= -cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= -cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= -cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= -cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= -cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= -cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= -cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= -cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= -cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= -cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= -cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= -cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= -cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= -cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= -cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= -cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= -cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= -cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= -cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= -cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= -cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= -cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= -cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= -cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= -cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= -cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= -cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= -cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= -cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= -cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= -cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= -cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= -cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= -cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= -cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= -cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= -cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= -cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= -cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= -cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= -cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= -cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= -cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= -cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= -cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= -cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= -cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= -cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= -cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= -cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= -cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= -cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= -cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= -cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= -cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= -cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= -cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= -cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= -cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= -cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= -cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= -cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= -cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= -cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= -cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= -cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= -cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= -cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= -cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= -cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= -cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= -cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= -cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= -cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= -cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= -cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= -cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= -cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= -cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= -cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= -cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= -cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= -cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= -cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= -cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= -cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= -cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= -cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= -cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= -cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= -cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= -cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= -cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= -cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= -cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= -cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= -cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= -cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= -cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= -cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= -cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= -cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= -cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= -cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= -cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= -cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= -cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= -cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= -cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= -cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= -cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= -cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= -cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= -cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= -cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= -cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= -cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= -cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= -cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= -cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= -cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= -cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= -cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= -cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= -cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= -cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= -cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= -cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= -cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= -cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= -cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= -cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= -cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= -cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= -cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= -cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= -cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= -cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= -cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= -cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= -cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= -cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= -cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= -cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= -cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= -cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= -cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= -cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/iam v1.1.8 h1:r7umDwhj+BQyz0ScZMp4QrGXjSTI3ZINnpgU2nlB/K0= -cloud.google.com/go/iam v1.1.8/go.mod h1:GvE6lyMmfxXauzNq8NbgJbeVQNspG+tcdL/W8QO1+zE= -cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= -cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= -cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= -cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= -cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= -cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= -cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= -cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= -cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= -cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= -cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= -cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= -cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= -cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= -cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= -cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= -cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= -cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= -cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= -cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= -cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= -cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= -cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= -cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= -cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= -cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= -cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= -cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= -cloud.google.com/go/logging v1.10.0 h1:f+ZXMqyrSJ5vZ5pE/zr0xC8y/M9BLNzQeLBwfeZ+wY4= -cloud.google.com/go/logging v1.10.0/go.mod h1:EHOwcxlltJrYGqMGfghSet736KR3hX1MAj614mrMk9I= -cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= -cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= -cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= -cloud.google.com/go/longrunning v0.5.7 h1:WLbHekDbjK1fVFD3ibpFFVoyizlLRl73I7YKuAKilhU= -cloud.google.com/go/longrunning v0.5.7/go.mod h1:8GClkudohy1Fxm3owmBGid8W0pSgodEMwEAztp38Xng= -cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= -cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= -cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= -cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= -cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= -cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= -cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= -cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= -cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= -cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= -cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= -cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= -cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= -cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= -cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= -cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= -cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= -cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= -cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= -cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= -cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= -cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= -cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= -cloud.google.com/go/monitoring v1.19.0 h1:NCXf8hfQi+Kmr56QJezXRZ6GPb80ZI7El1XztyUuLQI= -cloud.google.com/go/monitoring v1.19.0/go.mod h1:25IeMR5cQ5BoZ8j1eogHE5VPJLlReQ7zFp5OiLgiGZw= -cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= -cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= -cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= -cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= -cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= -cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= -cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= -cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= -cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= -cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= -cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= -cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= -cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= -cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= -cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= -cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= -cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= -cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= -cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= -cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= -cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= -cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= -cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= -cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= -cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= -cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= -cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= -cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= -cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= -cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= -cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= -cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= -cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= -cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= -cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= -cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= -cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= -cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= -cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= -cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= -cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= -cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= -cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= -cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= -cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= -cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= -cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= -cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= -cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= -cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= -cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= -cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= -cloud.google.com/go/pubsub v1.38.0 h1:J1OT7h51ifATIedjqk/uBNPh+1hkvUaH4VKbz4UuAsc= -cloud.google.com/go/pubsub v1.38.0/go.mod h1:IPMJSWSus/cu57UyR01Jqa/bNOQA+XnPF6Z4dKW4fAA= -cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= -cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= -cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= -cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= -cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= -cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= -cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= -cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= -cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= -cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= -cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= -cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= -cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= -cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= -cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= -cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= -cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= -cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= -cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= -cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= -cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= -cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= -cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= -cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= -cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= -cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= -cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= -cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= -cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= -cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= -cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= -cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= -cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= -cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= -cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= -cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= -cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= -cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= -cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= -cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= -cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= -cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= -cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= -cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= -cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= -cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= -cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= -cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= -cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= -cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= -cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= -cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= -cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= -cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= -cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= -cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= -cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= -cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= -cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= -cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= -cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= -cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= -cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= -cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= -cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= -cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= -cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= -cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= -cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= -cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= -cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= -cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= -cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= -cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= -cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= -cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= -cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= -cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= -cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= -cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= -cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= -cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= -cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= -cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= -cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= -cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= -cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= -cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= -cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= -cloud.google.com/go/spanner v1.63.0 h1:P6+BY70Wtol4MtryBgnXZVTZfsdySEvWfz0EpyLwHi4= -cloud.google.com/go/spanner v1.63.0/go.mod h1:iqDx7urZpgD7RekZ+CFvBRH6kVTW1ZSEb2HMDKOp5Cc= -cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= -cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= -cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= -cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= -cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= -cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= -cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= -cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= -cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= -cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= -cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= -cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= -cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= -cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= -cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= -cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= -cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= -cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= -cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= -cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= -cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= -cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= -cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= -cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= -cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= -cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= -cloud.google.com/go/trace v1.10.7 h1:gK8z2BIJQ3KIYGddw9RJLne5Fx0FEXkrEQzPaeEYVvk= -cloud.google.com/go/trace v1.10.7/go.mod h1:qk3eiKmZX0ar2dzIJN/3QhY2PIFh1eqcIdaN5uEjQPM= -cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= -cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= -cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= -cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= -cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= -cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= -cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= -cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= -cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= -cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= -cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= -cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= -cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= -cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= -cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= -cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= -cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= -cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= -cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= -cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= -cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= -cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= -cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= -cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= -cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= -cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= -cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= -cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= -cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= -cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= -cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= -cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= -cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= -cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= -cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= -cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= -cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= -cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= -cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= -cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= -cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= -cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= -cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= -code.cloudfoundry.org/clock v0.0.0-20180518195852-02e53af36e6c/go.mod h1:QD9Lzhd/ux6eNQVUDVRJX/RKTigpewimNYBi7ivZKY8= -code.cloudfoundry.org/clock v1.0.0 h1:kFXWQM4bxYvdBw2X8BbBeXwQNgfoWv1vqAk2ZZyBN2o= -code.cloudfoundry.org/clock v1.0.0/go.mod h1:QD9Lzhd/ux6eNQVUDVRJX/RKTigpewimNYBi7ivZKY8= -code.cloudfoundry.org/go-diodes v0.0.0-20211115184647-b584dd5df32c h1:N2GMlHc/SJQk7BkaME/kDHaciVTy4NuRmxVJLhnqKK8= -code.cloudfoundry.org/go-diodes v0.0.0-20211115184647-b584dd5df32c/go.mod h1:o7lq/SmHshDVxHdRJ/fMT3VPcoXyE1HcRXbG8QibO3k= -code.cloudfoundry.org/go-loggregator v7.4.0+incompatible h1:KqZYloMQWM5Zg/BQKunOIA4OODh7djZbk48qqbowNFI= -code.cloudfoundry.org/go-loggregator v7.4.0+incompatible/go.mod h1:KPBTRqj+y738Nhf1+g4JHFaBU8j7dedirR5ETNHvMXU= -code.cloudfoundry.org/rfc5424 v0.0.0-20201103192249-000122071b78 h1:mrZQaZmuDIPhSp6b96b+CRKC2uH44ifa5cjDV2epKis= -code.cloudfoundry.org/rfc5424 v0.0.0-20201103192249-000122071b78/go.mod h1:tkZo8GtzBjySJ7USvxm4E36lNQw1D3xM6oKHGqdaAJ4= -dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= -dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= -filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= -git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= -github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= -github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= -github.com/99designs/keyring v1.1.6/go.mod h1:16e0ds7LGQQcT59QqkTg72Hh5ShM51Byv5PEmW6uoRU= -github.com/99designs/keyring v1.2.2 h1:pZd3neh/EmUzWONb35LxQfvuY7kiSXAq3HQd97+XBn0= -github.com/99designs/keyring v1.2.2/go.mod h1:wes/FrByc8j7lFOAGLGSNEg8f/PaI3cgTBqhFkHUrPk= -github.com/AthenZ/athenz v1.10.39 h1:mtwHTF/v62ewY2Z5KWhuZgVXftBej1/Tn80zx4DcawY= -github.com/AthenZ/athenz v1.10.39/go.mod h1:3Tg8HLsiQZp81BJY58JBeU2BR6B/H4/0MQGfCwhHNEA= -github.com/Azure/azure-amqp-common-go/v4 v4.2.0 h1:q/jLx1KJ8xeI8XGfkOWMN9XrXzAfVTkyvCxPvHCjd2I= -github.com/Azure/azure-amqp-common-go/v4 v4.2.0/go.mod h1:GD3m/WPPma+621UaU6KNjKEo5Hl09z86viKwQjTpV0Q= -github.com/Azure/azure-event-hubs-go/v3 v3.6.2 h1:7rNj1/iqS/i3mUKokA2n2eMYO72TB7lO7OmpbKoakKY= -github.com/Azure/azure-event-hubs-go/v3 v3.6.2/go.mod h1:n+ocYr9j2JCLYqUqz9eI+lx/TEAtL/g6rZzyTFSuIpc= -github.com/Azure/azure-kusto-go v0.15.2 h1:OlABJilic9TythSgWW6i8Fd0SgNTg0t9jBu6WVsaixM= -github.com/Azure/azure-kusto-go v0.15.2/go.mod h1:9F2zvXH8B6eWzgI1S4k1ZXAIufnBZ1bv1cW1kB1n3D0= -github.com/Azure/azure-pipeline-go v0.1.8/go.mod h1:XA1kFWRVhSK+KNFiOhfv83Fv8L9achrP7OxIzeTn1Yg= -github.com/Azure/azure-pipeline-go v0.2.3 h1:7U9HBg1JFK3jHl5qmo4CTZKFTVgMwdFHMVtCdfBE21U= -github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= -github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU= -github.com/Azure/azure-sdk-for-go v68.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqbjDYsgN+RzP4q16yV5eM= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2 h1:FDif4R1+UUR+00q6wquyX90K7A8dN+R5E8GEadoP7sU= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2/go.mod h1:aiYBYui4BJ/BJCAIKs92XiPyQfTaBWqvHujDwKb6CBU= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.6.0 h1:sUFnFjzDUie80h24I7mrKtwCKgLY9L8h5Tp2x9+TWqk= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.6.0/go.mod h1:52JbnQTp15qg5mRkMBHwp0j0ZFwHJ42Sx3zVV5RE9p0= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.5.0 h1:MxA59PGoCFb+vCwRQi3PhQEwHj4+r2dhuv9HG+vM7iM= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.5.0/go.mod h1:uYt4CfhkJA9o0FN7jfE5minm/i4nUE4MjGUJkzB6Zs8= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0 h1:PTFGRSlMKCQelWwxUyYVEUqseBJVemLyqWJjvMyt0do= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0/go.mod h1:LRr2FzBTQlONPPa5HREE5+RjSCTXl7BwOvYOaWTqCaI= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managementgroups/armmanagementgroups v1.0.0 h1:pPvTJ1dY0sA35JOeFq6TsY2xj6Z85Yo23Pj4wCCvu4o= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managementgroups/armmanagementgroups v1.0.0/go.mod h1:mLfWfj8v3jfWKsL9G4eoBoXVcsqcIUTapmdKy7uGOp0= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor v0.11.0 h1:Ds0KRF8ggpEGg4Vo42oX1cIt/IfOhHWJBikksZbVxeg= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor v0.11.0/go.mod h1:jj6P8ybImR+5topJ+eH6fgcemSFBmU6/6bFF8KkwuDI= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 h1:bXwSugBiSbgtz7rOtbfGf+woewp4f06orW9OP5BjHLA= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0/go.mod h1:Y/HgrePTmGy9HjdSGTqZNa+apUpTVIEVKXJyARP2lrk= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 h1:Dd+RhdJn0OTtVGaeDLZpcumkIVCtA/3/Fo42+eoYvVM= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0/go.mod h1:5kakwfW5CjC9KK+Q4wjXAg+ShuIm2mBMua0ZFj2C8PE= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.5.0 h1:AifHbc4mg0x9zW52WOpKbsHaDKuRhlI7TVl47thgQ70= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.5.0/go.mod h1:T5RfihdXtBDxt1Ch2wobif3TvzTdumDy29kahv6AV9A= -github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1 h1:MyVTgWR8qd/Jw1Le0NZebGBUCLbtak3bJ3z1OlqZBpw= -github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1/go.mod h1:GpPjLhVR9dnUoJMyHWSPy71xY9/lcmpzIPZXmF0FCVY= -github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0 h1:D3occbWoio4EBLkbkevetNMAVX197GkzbUMtqjGWn80= -github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0/go.mod h1:bTSOgj05NGRuHHhQwAdPnYr9TOdNmKlZTgGLL6nyAdI= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2 h1:YUUxeiOWgdAQE3pXt2H7QXzZs0q8UBjgRbl56qo8GYM= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2/go.mod h1:dmXQgZuiSubAecswZE+Sm8jkvEa7kQgTPVRvwL/nd0E= -github.com/Azure/azure-storage-queue-go v0.0.0-20230531184854-c06a8eff66fe h1:HGuouUM1533rBXmMtR7qh5pYNSSjUZG90b/MgJAnb/A= -github.com/Azure/azure-storage-queue-go v0.0.0-20230531184854-c06a8eff66fe/go.mod h1:K6am8mT+5iFXgingS9LUc7TmbsW6XBw3nxaRyaMyWc8= -github.com/Azure/go-amqp v1.0.5 h1:po5+ljlcNSU8xtapHTe8gIc8yHxCzC03E8afH2g1ftU= -github.com/Azure/go-amqp v1.0.5/go.mod h1:vZAogwdrkbyK3Mla8m/CxSc/aKdnTZ4IbPxl51Y5WZE= -github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= -github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= -github.com/Azure/go-autorest/autorest v0.11.29 h1:I4+HL/JDvErx2LjyzaVxllw2lRDB5/BT2Bm4g20iqYw= -github.com/Azure/go-autorest/autorest v0.11.29/go.mod h1:ZtEzC4Jy2JDrZLxvWs8LrBWEBycl1hbT1eknI8MtfAs= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.22/go.mod h1:XuAbAEUv2Tta//+voMI038TrJBqjKam0me7qR+L8Cmk= -github.com/Azure/go-autorest/autorest/adal v0.9.23 h1:Yepx8CvFxwNKpH6ja7RZ+sKX+DWYNldbLiALMC3BTz8= -github.com/Azure/go-autorest/autorest/adal v0.9.23/go.mod h1:5pcMqFkdPhviJdlEy3kC/v1ZLnQl0MH6XA5YCcMhy4c= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.12 h1:wkAZRgT/pn8HhFyzfe9UnqOjJYqlembgCTi72Bm/xKk= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.12/go.mod h1:84w/uV8E37feW2NCJ08uT9VBfjfUHpgLVnG2InYD6cg= -github.com/Azure/go-autorest/autorest/azure/cli v0.3.1 h1:LXl088ZQlP0SBppGFsRZonW6hSvwgL5gRByMbvUbx8U= -github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9mNJVoIoLgXcirM2gF5i2kWloofxw= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw= -github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU= -github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.3.1 h1:AgyqjAd94fwNAoTjl/WQXg4VvFeRFpO+UhNyRXqF1ac= -github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/ClickHouse/ch-go v0.61.5 h1:zwR8QbYI0tsMiEcze/uIMK+Tz1D3XZXLdNrlaOpeEI4= -github.com/ClickHouse/ch-go v0.61.5/go.mod h1:s1LJW/F/LcFs5HJnuogFMta50kKDO0lf9zzfrbl0RQg= -github.com/ClickHouse/clickhouse-go/v2 v2.23.0 h1:srmRrkS0BR8gEut87u8jpcZ7geOob6nGj9ifrb+aKmg= -github.com/ClickHouse/clickhouse-go/v2 v2.23.0/go.mod h1:tBhdF3f3RdP7sS59+oBAtTyhWpy0024ZxDMhgxra0QE= -github.com/Code-Hex/go-generics-cache v1.3.1 h1:i8rLwyhoyhaerr7JpjtYjJZUcCbWOdiYO3fZXLiEC4g= -github.com/Code-Hex/go-generics-cache v1.3.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4= -github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= -github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= -github.com/DataDog/agent-payload/v5 v5.0.119 h1:PgeA41P3BE4z+b0j61B6yXnZDw7tB7bxl5EIHyGVG14= -github.com/DataDog/agent-payload/v5 v5.0.119/go.mod h1:FgVQKmVdqdmZTbxIptqJC/l+xEzdiXsaAOs/vGAvWzs= -github.com/DataDog/datadog-agent/cmd/agent/common/path v0.54.0-rc.5 h1:nLwtiYCoD+yb4HfhcJ3hmD9pczYLveOJexH5OHVQWsk= -github.com/DataDog/datadog-agent/cmd/agent/common/path v0.54.0-rc.5/go.mod h1:wJQkyIKR2epsYERgVRrO55fgda+oS5ZyBy2neJFXXGM= -github.com/DataDog/datadog-agent/comp/core/config v0.54.0-rc.5 h1:DKefO1N2aGtsUWRxyziQh3cHS3LuqdFjd+QmHR/qLNk= -github.com/DataDog/datadog-agent/comp/core/config v0.54.0-rc.5/go.mod h1:nDpszL8YD58OU/w2uFtN6oHv0cDDZrRNufYgBDtleVw= -github.com/DataDog/datadog-agent/comp/core/flare/types v0.54.0-rc.5 h1:GTYjjIV8YupcNqcNgcAnrNkbofcb6w7JFVdtfv9On9Q= -github.com/DataDog/datadog-agent/comp/core/flare/types v0.54.0-rc.5/go.mod h1:aChd0OV9bB534m+H4IPglCAs441s/1R+Tau5USeSM+Q= -github.com/DataDog/datadog-agent/comp/core/hostname/hostnameinterface v0.54.0-rc.5 h1:yz7efcj2vC0N0bcRwVItXXsFUl4JFgEzsqe3lDhdu7s= -github.com/DataDog/datadog-agent/comp/core/hostname/hostnameinterface v0.54.0-rc.5/go.mod h1:GhQb1d4Z4Z/E/WnUpmtSKADJSwziEIz0jwU0/MvNTic= -github.com/DataDog/datadog-agent/comp/core/log v0.54.0-rc.5 h1:2tvd3K+Bat8hT2jJBpIAfH/8J9k7v+s+IQcoyVVQitU= -github.com/DataDog/datadog-agent/comp/core/log v0.54.0-rc.5/go.mod h1:mtMxZiwg13b4bHgDf8xE6FHgTcadzI5Cc0lx2MSY1mE= -github.com/DataDog/datadog-agent/comp/core/secrets v0.54.0-rc.5 h1:hhkI7EtQwvhrKXO+oNo7V2ZhlSJ2Pt3uj9rOUeVrlSs= -github.com/DataDog/datadog-agent/comp/core/secrets v0.54.0-rc.5/go.mod h1:Bx0rH0jqLkDzQCBeDsgKGmcehYoQjuO6fE8aGjiQe2A= -github.com/DataDog/datadog-agent/comp/core/telemetry v0.54.0-rc.5 h1:v8WyP8srS/5EfD7OKZCm1aRPT56AXaQ2QqQRO2+fwUM= -github.com/DataDog/datadog-agent/comp/core/telemetry v0.54.0-rc.5/go.mod h1:ZpND0xZO2YVm7FNbPOrVoRMbPFhVRbZC40Vb5xsgyQc= -github.com/DataDog/datadog-agent/comp/def v0.54.0-rc.5 h1:pVYCT2SztEIcF03BdbrDgPfT7C/Pc2earv9YB4/2lU0= -github.com/DataDog/datadog-agent/comp/def v0.54.0-rc.5/go.mod h1:ts1c7j9tfa/BaoBH/gdQPt1LTeLeSh0b7IHMqm7ylDE= -github.com/DataDog/datadog-agent/comp/logs/agent/config v0.54.0-rc.5 h1:V4zdArRqhlZWT0tWj8mJE/pDRcAs4IkBC7Y5N+Gjr7U= -github.com/DataDog/datadog-agent/comp/logs/agent/config v0.54.0-rc.5/go.mod h1:88zmScug+KuG8EEuyaf3CAw5idi7XFMDTq66u6UPW4A= -github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline v0.54.0-rc.5 h1:FAZQ6viOK9CiU8x7aW2PJMlI4nq3bmNnOT642ASUxxc= -github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline v0.54.0-rc.5/go.mod h1:c+WZvnTktqP8inoph1/wvxvfLx9rV/cKoR/zvoEpu6E= -github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline/logsagentpipelineimpl v0.54.0-rc.5 h1:dtJiztozoBiltjE0382hAMtDeEfRnEov186xGZ4TGB0= -github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline/logsagentpipelineimpl v0.54.0-rc.5/go.mod h1:yMYGvbt3AAXiXoadUxEbxWl6C3/Ub2t8dn2UG7Y54SM= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/exporter/logsagentexporter v0.54.0-rc.5 h1:5HcA9XYLdI0Z81o5p7SppdVCYjKoshv9GBrqZfeLvC4= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/exporter/logsagentexporter v0.54.0-rc.5/go.mod h1:R2jDIkQpwYzy4AturN73oJB2X32jtivHW9TvdeN7BAQ= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/metricsclient v0.0.0-20240525065430-d0b647bcb646 h1:KeIeWDAjzQxL6/ruBQmFlT/FRstEz11z/UT3LH+8sAA= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/metricsclient v0.0.0-20240525065430-d0b647bcb646/go.mod h1:TIf/0Kb3DAYAtYbhhxmZ72etu+IKSqy66mcIGBuioik= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/statsprocessor v0.0.0-20240525065430-d0b647bcb646 h1:dyGnQr1QVLhwLdKzCTMsDsnYYUOkOXU4JWT2HuS1LJ4= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/statsprocessor v0.0.0-20240525065430-d0b647bcb646/go.mod h1:m7gt1CfJ/8FgnidFPk2lENaxO9m0mOnWWJQylgJkMzw= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.54.0-rc.5 h1:GuGbndVAnhNa6JOtDsDEWXmZFJB0fp4iCnJ3OO1JSks= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.54.0-rc.5/go.mod h1:6ydg+CWz9UlcBkV4pptOdQXTLNc/8YkTqta6VJFGg1M= -github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.54.0-rc.5 h1:YEvetFgYjf3oZsliKn0ddrz1t4ZvOzzlvOxJ100szlI= -github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.54.0-rc.5/go.mod h1:Mpe5lBwTlmLsu1WwIx8uRbj+Bi8+9gW8rWDfXPRwQVQ= -github.com/DataDog/datadog-agent/pkg/config/env v0.54.0-rc.5 h1:D4e5j805YtqmdhSeCXax020Nht6arNUvuvX4AKDMfu8= -github.com/DataDog/datadog-agent/pkg/config/env v0.54.0-rc.5/go.mod h1:9FPuluS8k4LEpfvlz7KQ6iHmqyTVfvuKxhwZkEUeoI4= -github.com/DataDog/datadog-agent/pkg/config/logs v0.54.0-rc.5 h1:xJ6u0OftjMYixmaDlb5yba3T72kyo/rpI7iuOYiAgJE= -github.com/DataDog/datadog-agent/pkg/config/logs v0.54.0-rc.5/go.mod h1:uo77w0taiJfXk3RV4N71t3WmoHhu6wJ782YmGeV6Ynk= -github.com/DataDog/datadog-agent/pkg/config/model v0.54.0-rc.5 h1:6HhxZQzS2edPF9ZevjWtstu6y17lj4a4fsRiTJ3ObHI= -github.com/DataDog/datadog-agent/pkg/config/model v0.54.0-rc.5/go.mod h1:X6U3mq0dErErZUIQx3GMmrO0jdp7aGN656iSDUW8sfw= -github.com/DataDog/datadog-agent/pkg/config/setup v0.54.0-rc.5 h1:+kl+DEK320zyWZBoFzTofgwN0AzUKpJByf8KdJ7WpJQ= -github.com/DataDog/datadog-agent/pkg/config/setup v0.54.0-rc.5/go.mod h1:2qnUs+85QVGqdK4DOpEaox6MKbfKFo3v2MXl9W8zP9Y= -github.com/DataDog/datadog-agent/pkg/config/utils v0.54.0-rc.5 h1:FQmC8qbWoaH4GFzuSuGFtJCR3kleh6xBmQXISiE8/Ho= -github.com/DataDog/datadog-agent/pkg/config/utils v0.54.0-rc.5/go.mod h1:pWPWng1HBqWccXoYJXfmWgpr+pujCpe4XYtGbiH4IOU= -github.com/DataDog/datadog-agent/pkg/logs/auditor v0.54.0-rc.5 h1:dQIi1vw2MaBmrT0kQv0qE5csFecCzaoPGY8m8KTEiqA= -github.com/DataDog/datadog-agent/pkg/logs/auditor v0.54.0-rc.5/go.mod h1:7w1fYTvDKwfk2J08P3vKEieeULSFASfZ0IgCjEoIF2E= -github.com/DataDog/datadog-agent/pkg/logs/client v0.54.0-rc.5 h1:YMYTquLk0uzYxvyRR1ew1QBf5dMtz3b/uBuwQzVODs4= -github.com/DataDog/datadog-agent/pkg/logs/client v0.54.0-rc.5/go.mod h1:YZbEwh9sPrDqxj02BHUHN6ljR+wohaN5QkkTdNZBLxY= -github.com/DataDog/datadog-agent/pkg/logs/diagnostic v0.54.0-rc.5 h1:klt8iysuxBuycyDu6lE51oCcAzZLJpvA7HiAKyQv9GM= -github.com/DataDog/datadog-agent/pkg/logs/diagnostic v0.54.0-rc.5/go.mod h1:93tXt/40ar1666Kk83CDOsb35xhAhQiPSqEH24zZ164= -github.com/DataDog/datadog-agent/pkg/logs/message v0.54.0-rc.5 h1:tX7zHQ6bmLJTfcRTcGY+91VXCZPEY2/OxKlVg/P4Tec= -github.com/DataDog/datadog-agent/pkg/logs/message v0.54.0-rc.5/go.mod h1:SGUmU3Fz/AtmdJvfos5EokpT4CN9YVi50DbYYZX0q4w= -github.com/DataDog/datadog-agent/pkg/logs/metrics v0.54.0-rc.5 h1:tzzzy68wHmQLIrpbJbmo9ZYqm8pHTlWvjUYnQUMBsUU= -github.com/DataDog/datadog-agent/pkg/logs/metrics v0.54.0-rc.5/go.mod h1:vcMlIQfRoHkafZFAHtHrkmeCSQzGpXtE2iyLkaObnUk= -github.com/DataDog/datadog-agent/pkg/logs/pipeline v0.54.0-rc.5 h1:yJ3W4/CQwlEifXz1FDCehvoVvGwaH4LXuJ6A/TbRMdc= -github.com/DataDog/datadog-agent/pkg/logs/pipeline v0.54.0-rc.5/go.mod h1:WsysKMxzTLQHn75WAUwHHw/SyhGQr+m8fYE3iMYl2gA= -github.com/DataDog/datadog-agent/pkg/logs/processor v0.54.0-rc.5 h1:RqKUVfSHrw5D8nRMIhOaAKQThk7pHRbyDVo2CylYtAY= -github.com/DataDog/datadog-agent/pkg/logs/processor v0.54.0-rc.5/go.mod h1:LwAwQKHHSsOC0sspi58vpN2h4tFEI1ZNtU69OUVFBxc= -github.com/DataDog/datadog-agent/pkg/logs/sds v0.54.0-rc.5 h1:u8dgzzSluJx7WMk3J834CxCP7FCo+z0PU9d1vj7K1HU= -github.com/DataDog/datadog-agent/pkg/logs/sds v0.54.0-rc.5/go.mod h1:+octueIX19RzWrarAkKNIAtFTfETavn6Ku4s217EcSY= -github.com/DataDog/datadog-agent/pkg/logs/sender v0.54.0-rc.5 h1:n5UMZvF+5L3XekeS5bkR0adwcOsogIT9uEtq2vHMhtU= -github.com/DataDog/datadog-agent/pkg/logs/sender v0.54.0-rc.5/go.mod h1:dj51DKlSkf10tqsdfuE4NMZaD2PSzau3G8Le8UmXerA= -github.com/DataDog/datadog-agent/pkg/logs/sources v0.54.0-rc.5 h1:wpvvYERlZsBmdoVMIYFxd2XlvSjBh5en06WkKgWRYk4= -github.com/DataDog/datadog-agent/pkg/logs/sources v0.54.0-rc.5/go.mod h1:bBzxEwKqZRKlkizVUViWjGNkjjF58njl+YiZNLxD/ZI= -github.com/DataDog/datadog-agent/pkg/logs/status/statusinterface v0.54.0-rc.5 h1:KuPBZTbwVJqDMa9ATfg0YWpGl3CxgGJcJZzSmsGVNdI= -github.com/DataDog/datadog-agent/pkg/logs/status/statusinterface v0.54.0-rc.5/go.mod h1:xsyGZLKEr6dZaJlC9QWuyYVXqMnHRwZzn641O3bfB98= -github.com/DataDog/datadog-agent/pkg/logs/status/utils v0.54.0-rc.5 h1:GAai92l2sX1rOQqGzPzE0IGMzS442xTLrHF/EwTywnw= -github.com/DataDog/datadog-agent/pkg/logs/status/utils v0.54.0-rc.5/go.mod h1:TsFFZ6y2/brcnkXLZhfp0k2xrewdyqhXnjxVpkOWIvE= -github.com/DataDog/datadog-agent/pkg/logs/util/testutils v0.54.0-rc.5 h1:9mAiLISlZcol07wCndWd5ErjItibOClx+N2Oyo3lG+A= -github.com/DataDog/datadog-agent/pkg/logs/util/testutils v0.54.0-rc.5/go.mod h1:J5lpbKKJzxPE2i5dsBYJnxbHlFvzPkfxNlhh2p3s18s= -github.com/DataDog/datadog-agent/pkg/obfuscate v0.54.0-rc.5 h1:qZg/3r8lLIgwzpHkqNBdnDKCdHexSxjgkb6FbPBaMnY= -github.com/DataDog/datadog-agent/pkg/obfuscate v0.54.0-rc.5/go.mod h1:4/9D8y6pQo5a/Tg8GAQN8SaRIRWxxyl5QHzPRuu8D0k= -github.com/DataDog/datadog-agent/pkg/proto v0.54.0-rc.5 h1:0HdqgTFchLs6ElI9cVrfjsT/gOF8A7PiY/VI2JMDFJc= -github.com/DataDog/datadog-agent/pkg/proto v0.54.0-rc.5/go.mod h1:gHkSUTn6H6UEZQHY3XWBIGNjfI3Tdi0IxlrxIFBWDwU= -github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.54.0-rc.5 h1:wM6w1HtUOxrn/sgMW00jx+0p4rNzPv+NhPqmIpboyV0= -github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.54.0-rc.5/go.mod h1:3yFk56PJ57yS1GqI9HAsS4PSlAeGCC9RQA7jxKzYj6g= -github.com/DataDog/datadog-agent/pkg/status/health v0.54.0-rc.5 h1:WgoyD4RkoGI3JDy+79SyiPc0AJGyCO5c2toOfxWwW1E= -github.com/DataDog/datadog-agent/pkg/status/health v0.54.0-rc.5/go.mod h1:sNLVlyEtkYal/+kTj+mTp239DdwVuYBYOnpS90RKk5E= -github.com/DataDog/datadog-agent/pkg/telemetry v0.54.0-rc.5 h1:iXZEgoYil4VaadjDsK+GbCkY7rBQyjsnlNJwXr6BwCY= -github.com/DataDog/datadog-agent/pkg/telemetry v0.54.0-rc.5/go.mod h1:4GCwM87F7u9HzugAODVTwS05MFMKC+NoJu6E4Zd/8pY= -github.com/DataDog/datadog-agent/pkg/trace v0.54.0-rc.5 h1:il5yFFe5CubI+bSfHolKr0077dQw0R+U5B9/iwW8aBg= -github.com/DataDog/datadog-agent/pkg/trace v0.54.0-rc.5/go.mod h1:63uSQX6TVeJzl1cFbIp8MkXlF4kUMJs8iUfGhrSgUHY= -github.com/DataDog/datadog-agent/pkg/util/backoff v0.54.0-rc.5 h1:eq+OaYTZ0rzQt1SpC2Tl+szJjUTX2nOC4N0glSzuWQ0= -github.com/DataDog/datadog-agent/pkg/util/backoff v0.54.0-rc.5/go.mod h1:HcSwqoxWLfevi1vuDZuFeRHfSuHGakTN6/u42WbxQHE= -github.com/DataDog/datadog-agent/pkg/util/cgroups v0.54.0-rc.5 h1:z5NnMMxKxO+cExUt0QCCSF7E+wX8LdD3nuL9LlDpR3Y= -github.com/DataDog/datadog-agent/pkg/util/cgroups v0.54.0-rc.5/go.mod h1:40rjMMqmvglVjktjWVUIk3o5W2zAtek0JU4FCsf7bsM= -github.com/DataDog/datadog-agent/pkg/util/executable v0.54.0-rc.5 h1:kxGwRdBPbiEx9mplVMA/rdLKMWcaKJMqO1pIyg56sLk= -github.com/DataDog/datadog-agent/pkg/util/executable v0.54.0-rc.5/go.mod h1:hUJvBzOKfasYzSvlar10ZkrB8I1CR8PhtyGxmlMv/cU= -github.com/DataDog/datadog-agent/pkg/util/filesystem v0.54.0-rc.5 h1:2A1/eg6zwNlUOjdAgaSgXR8eFR0HYLyqpvqLjlxKEP4= -github.com/DataDog/datadog-agent/pkg/util/filesystem v0.54.0-rc.5/go.mod h1:DfBDL+EjOiLI+HYR2N5zw1an1q7oCJQT6lY4oTCZxZ4= -github.com/DataDog/datadog-agent/pkg/util/fxutil v0.54.0-rc.5 h1:Fv7vJj/7qoEIV+ppI257ncx8IVQkDrUyjKSyeE56oTs= -github.com/DataDog/datadog-agent/pkg/util/fxutil v0.54.0-rc.5/go.mod h1:xqWrlGtjVu2ZMoCW9e3R7f13/Qg0IQBzO5AX7J1dC9I= -github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.54.0-rc.5 h1:1buVvWK8DXUveIpZMDc7Rn59mCDWZkQ9OGHjQRKdcas= -github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.54.0-rc.5/go.mod h1:FqMWIncd1TJJdlUYyiQQGJHWe+ZDKAjJSSPlrUBvHHk= -github.com/DataDog/datadog-agent/pkg/util/http v0.54.0-rc.5 h1:81sBly4SXW5Bvt3DHiUuuLpQnEUjhgdVDK69bk0g+58= -github.com/DataDog/datadog-agent/pkg/util/http v0.54.0-rc.5/go.mod h1:hZRz30Xaqm+UiR/KjO6gAo1Qa7v+tsxVqqaWgUkBjxE= -github.com/DataDog/datadog-agent/pkg/util/log v0.54.0-rc.5 h1:BcA7+MK04/HRCFlX5Pn/sQzZu/gF4qA3DOF880Jy/oo= -github.com/DataDog/datadog-agent/pkg/util/log v0.54.0-rc.5/go.mod h1:MFVWM0DMaxEXhCnHLWnh6axtwubmKRn7C+w2xiL+atI= -github.com/DataDog/datadog-agent/pkg/util/optional v0.54.0-rc.5 h1:3+7PwCbvtkOf63fPOzzMGVxNzlaZofPAg6ExPKn72hc= -github.com/DataDog/datadog-agent/pkg/util/optional v0.54.0-rc.5/go.mod h1:wa1JIWnzo9EvOBwzDOeff8HeqgOq9JQANRb99/nKg3A= -github.com/DataDog/datadog-agent/pkg/util/pointer v0.54.0-rc.5 h1:3zfbAoA9HSCJ/RsR/kP2MzntIvoI4szoReu4j3gpJrY= -github.com/DataDog/datadog-agent/pkg/util/pointer v0.54.0-rc.5/go.mod h1:ahpEhdpkifOLy0/XLHas+SseEmMQnwMgV1CMVkSuXL0= -github.com/DataDog/datadog-agent/pkg/util/scrubber v0.54.0-rc.5 h1:Sob3M0CylnKxZ9FX8Ewjka5VRFYZUQLN2J0kyOGYnMM= -github.com/DataDog/datadog-agent/pkg/util/scrubber v0.54.0-rc.5/go.mod h1:8ASCNWHQtcmUedxL+WjbCPSIcGIM8LeVzil7JCzx0js= -github.com/DataDog/datadog-agent/pkg/util/startstop v0.54.0-rc.5 h1:wo+LiNCZ9RQNNuYzCavbgjARHO3OmcqpFw4Mo6J5R+s= -github.com/DataDog/datadog-agent/pkg/util/startstop v0.54.0-rc.5/go.mod h1:F9ysDtw4BnbZIuKdwOdiHranjG9QMv2o7PMVreIhFzI= -github.com/DataDog/datadog-agent/pkg/util/statstracker v0.54.0-rc.5 h1:hU+Zvh4IL/HOEAjDzyIhYMQa4ibbX+dM4p5wWWpZ34U= -github.com/DataDog/datadog-agent/pkg/util/statstracker v0.54.0-rc.5/go.mod h1:KkiJi2f4mcxAJA00ArYw4zTfs0oWMU1bNXqKhymRVZg= -github.com/DataDog/datadog-agent/pkg/util/system v0.54.0-rc.5 h1:b7GZ1xAbkCtw5/hHwkRJoRiheAd9e+T2slJlD34lXbE= -github.com/DataDog/datadog-agent/pkg/util/system v0.54.0-rc.5/go.mod h1:gIg9d09X6uFqDFo7Dd48OCOCAtTLTWIE44+f/e35C3c= -github.com/DataDog/datadog-agent/pkg/util/system/socket v0.54.0-rc.5 h1:alEMYfYHYju+poG90phbdrpg4RYEyK/oFLAi8MM++HU= -github.com/DataDog/datadog-agent/pkg/util/system/socket v0.54.0-rc.5/go.mod h1:RKqan/bns7z9tqZBWSkshY1e6VisZJaU0b/XQcIDyAQ= -github.com/DataDog/datadog-agent/pkg/util/testutil v0.54.0-rc.5 h1:+nmZ4SFAHoskytj/q8+ewx7UtvbKGdDzcbPU0rhxIzU= -github.com/DataDog/datadog-agent/pkg/util/testutil v0.54.0-rc.5/go.mod h1:AyiUcueiQeqBXn60wbVOo3dPYRDNg0Gsfh/GkhatyxE= -github.com/DataDog/datadog-agent/pkg/util/winutil v0.54.0-rc.5 h1:0eWM/VJT1YPFf+nE5u0QdX1CiCiH2LWuvr4cCJ+nC3M= -github.com/DataDog/datadog-agent/pkg/util/winutil v0.54.0-rc.5/go.mod h1:m/wWejBoF6cuPzogMq2sgm86vvsnR1bAkw+Fgxq4vns= -github.com/DataDog/datadog-agent/pkg/version v0.54.0-rc.5 h1:aQEEvgBxk6Vk6ePMldw3fQUYTrl0AaYfUbrT1Ko6bjE= -github.com/DataDog/datadog-agent/pkg/version v0.54.0-rc.5/go.mod h1:EHeMJExE74SMdRoRCEuLOxbRgjfQwCVngMqFBiz1VN8= -github.com/DataDog/datadog-api-client-go/v2 v2.26.0 h1:bZr0hu+hx8L91+yU5EGw8wK3FlCVEIashpx+cylWsf0= -github.com/DataDog/datadog-api-client-go/v2 v2.26.0/go.mod h1:QKOu6vscsh87fMY1lHfLEmNSunyXImj8BUaUWJXOehc= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/DataDog/datadog-go/v5 v5.5.0 h1:G5KHeB8pWBNXT4Jtw0zAkhdxEAWSpWH00geHI6LDrKU= -github.com/DataDog/datadog-go/v5 v5.5.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= -github.com/DataDog/dd-sensitive-data-scanner/sds-go/go v0.0.0-20240419161837-f1b2f553edfe h1:efzxujZ7VHWFxjmWjcJyUEpPrN8qdiZPYb+dBw547Wo= -github.com/DataDog/dd-sensitive-data-scanner/sds-go/go v0.0.0-20240419161837-f1b2f553edfe/go.mod h1:TX7CTOQ3LbQjfAi4SwqUoR5gY1zfUk7VRBDTuArjaDc= -github.com/DataDog/go-sqllexer v0.0.9 h1:Cx2Cu1S0hfj4coCCA8hzjM9+UNFRkcu1avIV//RU5Qw= -github.com/DataDog/go-sqllexer v0.0.9/go.mod h1:nB4Ea2YNsqMwtbWMc4Fm/oP98IIrSPapqwOwPioMspY= -github.com/DataDog/go-tuf v1.1.0-0.5.2 h1:4CagiIekonLSfL8GMHRHcHudo1fQnxELS9g4tiAupQ4= -github.com/DataDog/go-tuf v1.1.0-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= -github.com/DataDog/gohai v0.0.0-20230524154621-4316413895ee h1:tXibLZk3G6HncIFJKaNItsdzcrk4YqILNDZlXPTNt4k= -github.com/DataDog/gohai v0.0.0-20230524154621-4316413895ee/go.mod h1:nTot/Iy0kW16bXgXr6blEc8gFeAS7vTqYlhAxh+dbc0= -github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata v0.16.1 h1:WD5hPS/KfDaYcWxa636972pQ8iOBN9MC/6Is5aSNZc8= -github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata v0.16.1/go.mod h1:P/l++2cDCeeq21KSmCEdXdMH9/WMdXP7uA/vjnxhtz8= -github.com/DataDog/opentelemetry-mapping-go/pkg/internal/sketchtest v0.16.0 h1:VJT1Jjlz/ca999FEqaAS+He7S4eB14a+PJjczgRdgAY= -github.com/DataDog/opentelemetry-mapping-go/pkg/internal/sketchtest v0.16.0/go.mod h1:66XlN7QpQKqIvw8e2UbCXV5X8wGnEw851nT9BjJ75dY= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.16.1 h1:ZI8u3CgdMXpDplrf9/gIr13+/g/tUzUcBMk2ZhXgzLE= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.16.1/go.mod h1:dvIWN9pA2zWNTw5rhDWZgzZnhcfpH++d+8d1SWW6xkY= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/logs v0.16.1 h1:px2+7svK86oeCGd+sT1x/9f0pqIJdApGFnWI0AOPXwA= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/logs v0.16.1/go.mod h1:+LijQ2LdlocAQ4WB+7KsoIGe90bfogkRslubd9swVow= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics v0.16.1 h1:Qm3M3A7/tkYG8JYeF9Mxp3oNEz23EQzvnV0MZR8mJKQ= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics v0.16.1/go.mod h1:HPwVoMccTFfyV94bE29ffwAYnsPykAH7Iso8/5ucLSs= -github.com/DataDog/opentelemetry-mapping-go/pkg/quantile v0.16.1 h1:sQoxh5RytdEFYFLGw3JUwFFhS/A1InFFVldpWAS/Z3g= -github.com/DataDog/opentelemetry-mapping-go/pkg/quantile v0.16.1/go.mod h1:6eYyd+lJYH+uRuZqhyW/u+9ykaXBWetDGj44+txz6jU= -github.com/DataDog/sketches-go v1.4.5 h1:ki7VfeNz7IcNafq7yI/j5U/YCkO3LJiMDtXz9OMQbyE= -github.com/DataDog/sketches-go v1.4.5/go.mod h1:7Y8GN8Jf66DLyDhc94zuWA3uHEt/7ttt8jHOBWWrSOg= -github.com/DataDog/viper v1.13.3 h1:0++798wZLEenL1JbF8dMmwFl6WMlAVxLtzVuws/LlVc= -github.com/DataDog/viper v1.13.3/go.mod h1:wDdUVJ2SHaMaPrCZrlRCObwkubsX8j5sme3LaR/SGTc= -github.com/DataDog/zstd v1.5.0/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= -github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/GehirnInc/crypt v0.0.0-20200316065508-bb7000b8a962 h1:KeNholpO2xKjgaaSyd+DyQRrsQjhbSeS7qe4nEw8aQw= -github.com/GehirnInc/crypt v0.0.0-20200316065508-bb7000b8a962/go.mod h1:kC29dT1vFpj7py2OvG1khBdQpo3kInWP+6QipLbdngo= -github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0 h1:oVLqHXhnYtUwM89y9T1fXGaK9wTkXHgNp8/ZNMQzUxE= -github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.23.0 h1:yRhWveg9NbJcJYoJL4FoSauT2dxnt4N9MIAJ7tvU/mQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.23.0/go.mod h1:p2puVVSKjQ84Qb1gzw2XHLs34WQyHTYFZLaVxypAFYs= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector v0.47.0 h1:riVd60yiSVM8oTZEnM/nscvZ2o4mcol45ZPv62zlu/M= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector v0.47.0/go.mod h1:LoJOu8+DY6cbxXF753iWmZ88nHEudiySwpQg//6mU/0= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector/googlemanagedprometheus v0.47.0 h1:qXG3UhUqfpjCbaFDTW03giIZa4PUMQ6nRoUDEDOhLWI= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector/googlemanagedprometheus v0.47.0/go.mod h1:VkkA3E9i8gTBNBIsAjypbvpwei4dSokmLdHsXLzwHOk= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.23.0 h1:5A4O4OdC7yzkIEPl4GrS+PRYV15zsboaWBT52g3Hc0k= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.23.0/go.mod h1:zO73rmlwRYxQF/6Nul4PA/UIAYJo9BtDAMgPfMthXnw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.47.0 h1:h3GAq9n95A6IYOGqAucbp+tGBxAQul2vj5ORkmRrGxg= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.47.0/go.mod h1:PdB0wkmILI+phhoBhWdrrB4LfORT9tHc03OOn+q3dWU= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.47.0 h1:TOjDcFzPkoglwb5sa6+704TXwYgs+XsN5HYc98ksK+M= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.47.0/go.mod h1:ZC7rjqRzdhRKDK223jQ7Tsz89ZtrSSLH/VFzf7k5Sb0= -github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= -github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/IBM/sarama v1.43.2 h1:HABeEqRUh32z8yzY2hGB/j8mHSzC/HA9zlEjqFNCzSw= -github.com/IBM/sarama v1.43.2/go.mod h1:Kyo4WkF24Z+1nz7xeVUFWIuKVV8RS3wM8mkvPKMdXFQ= -github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:RGWPOewvKIROun94nF7v2cua9qP+thov/7M50KEoeSU= -github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= -github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= -github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/Netflix/go-env v0.0.0-20220526054621-78278af1949d h1:wvStE9wLpws31NiWUx+38wny1msZ/tm+eL5xmm4Y7So= -github.com/Netflix/go-env v0.0.0-20220526054621-78278af1949d/go.mod h1:9XMFaCeRyW7fC9XJOWQ+NdAv8VLG7ys7l3x4ozEGLUQ= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/ReneKroon/ttlcache/v2 v2.11.0 h1:OvlcYFYi941SBN3v9dsDcC2N8vRxyHcCmJb3Vl4QMoM= -github.com/ReneKroon/ttlcache/v2 v2.11.0/go.mod h1:mBxvsNY+BT8qLLd6CuAJubbKo6r0jh3nb5et22bbfGY= -github.com/SAP/go-hdb v1.9.5 h1:rLp9rgs4n0Lvsxi3uTNiUpTM+KpA8tOgbQhcjksmdaA= -github.com/SAP/go-hdb v1.9.5/go.mod h1:eKGk33q3PZ41Lgua4lmqtKgIXpSEYs0teXePqMAcwBg= -github.com/SermoDigital/jose v0.9.2-0.20161205224733-f6df55f235c2/go.mod h1:ARgCUhI1MHQH+ONky/PAtmVHQrP5JlGY0F3poXOp/fA= -github.com/SermoDigital/jose v0.9.2-0.20180104203859-803625baeddc h1:MhBvG7RLaLqlyjxMR6of35vt6MVQ+eXMcgn9X/sy0FE= -github.com/SermoDigital/jose v0.9.2-0.20180104203859-803625baeddc/go.mod h1:ARgCUhI1MHQH+ONky/PAtmVHQrP5JlGY0F3poXOp/fA= -github.com/Showmax/go-fqdn v1.0.0 h1:0rG5IbmVliNT5O19Mfuvna9LL7zlHyRfsSvBPZmF9tM= -github.com/Showmax/go-fqdn v1.0.0/go.mod h1:SfrFBzmDCtCGrnHhoDjuvFnKsWjEQX/Q9ARZvOrJAko= -github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/aerospike/aerospike-client-go/v6 v6.13.0 h1:9V5qKtdF2t9hDUKRKU8POUMKtOyw6pkfhHlVI6L32cU= -github.com/aerospike/aerospike-client-go/v6 v6.13.0/go.mod h1:2Syy0n4FKdgJxn0ZCfLfggVdaTXgMaGW6EOlPV6MGG4= -github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= -github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= -github.com/alecthomas/assert/v2 v2.3.0 h1:mAsH2wmvjsuvyBvAmCtm7zFsBlb8mIHx5ySLVdDZXL0= -github.com/alecthomas/assert/v2 v2.3.0/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= -github.com/alecthomas/participle/v2 v2.1.1 h1:hrjKESvSqGHzRb4yW1ciisFJ4p3MGYih6icjJvbsmV8= -github.com/alecthomas/participle/v2 v2.1.1/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= -github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= -github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 h1:ez/4by2iGztzR4L0zgAOR8lTQK9VlyBVVd7G4omaOQs= -github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4 h1:iC9YFYKDGEy3n/FtqJnOkZsene9olVspKmkX5A2YBEo= -github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4/go.mod h1:sCavSAvdzOjul4cEqeVtvlSaSScfNsTQ+46HwlTL1hc= -github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.4 h1:7Q2FEyqxeZeIkwYMwRC3uphxV4i7O2eV4ETe21d6lS4= -github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.4/go.mod h1:5JHVmnHvGzR2wNdgaW1zDLQG8kOC4Uec8ubkMogW7OQ= -github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68 h1:NqugFkGxx1TXSh/pBcU00Y6bljgDPaFdh5MUSeJ7e50= -github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68/go.mod h1:6pb/Qy8c+lqua8cFpEy7g39NRRqOWc3rOwAy8m5Y2BY= -github.com/alibabacloud-go/endpoint-util v1.1.0 h1:r/4D3VSw888XGaeNpP994zDUaxdgTSHBbVfZlzf6b5Q= -github.com/alibabacloud-go/endpoint-util v1.1.0/go.mod h1:O5FuCALmCKs2Ff7JFJMudHs0I5EBgecXXxZRyswlEjE= -github.com/alibabacloud-go/openapi-util v0.1.0 h1:0z75cIULkDrdEhkLWgi9tnLe+KhAFE/r5Pb3312/eAY= -github.com/alibabacloud-go/openapi-util v0.1.0/go.mod h1:sQuElr4ywwFRlCCberQwKRFhRzIyG4QTP/P4y1CJ6Ws= -github.com/alibabacloud-go/sts-20150401/v2 v2.0.1 h1:CevZp0VdG7Q+1J3qwNj+JL7ztKxsL27+tknbdTK9Y6M= -github.com/alibabacloud-go/sts-20150401/v2 v2.0.1/go.mod h1:8wJW1xC4mVcdRXzOvWJYfCCxmvFzZ0VB9iilVjBeWBc= -github.com/alibabacloud-go/tea v1.1.19 h1:Xroq0M+pr0mC834Djj3Fl4ZA8+GGoA0i7aWse1vmgf4= -github.com/alibabacloud-go/tea v1.1.19/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A= -github.com/alibabacloud-go/tea-utils v1.3.1 h1:iWQeRzRheqCMuiF3+XkfybB3kTgUXkXX+JMrqfLeB2I= -github.com/alibabacloud-go/tea-utils v1.3.1/go.mod h1:EI/o33aBfj3hETm4RLiAxF/ThQdSngxrpF8rKUDJjPE= -github.com/alibabacloud-go/tea-utils/v2 v2.0.1 h1:K6kwgo+UiYx+/kr6CO0PN5ACZDzE3nnn9d77215AkTs= -github.com/alibabacloud-go/tea-utils/v2 v2.0.1/go.mod h1:U5MTY10WwlquGPS34DOeomUGBB0gXbLueiq5Trwu0C4= -github.com/alibabacloud-go/tea-xml v1.1.2 h1:oLxa7JUXm2EDFzMg+7oRsYc+kutgCVwm+bZlhhmvW5M= -github.com/alibabacloud-go/tea-xml v1.1.2/go.mod h1:Rq08vgCcCAjHyRi/M7xlHKUykZCEtyBy9+DPF6GgEu8= -github.com/aliyun/aliyun-log-go-sdk v0.1.75 h1:asM0c8NViqoCx6ULqaldE4YnyRq42rU1eqP6/ditzSg= -github.com/aliyun/aliyun-log-go-sdk v0.1.75/go.mod h1:dcQd3FhFu8UI1H48L+YW49ATTWgzGqWz/S/7Bm07gpY= -github.com/aliyun/credentials-go v1.1.2 h1:qU1vwGIBb3UJ8BwunHDRFtAhS6jnQLnde/yk0+Ih2GY= -github.com/aliyun/credentials-go v1.1.2/go.mod h1:ozcZaMR5kLM7pwtCMEpVmQ242suV6qTJya2bDq4X1Tw= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= -github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= -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/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= -github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= -github.com/apache/arrow/go/v15 v15.0.0 h1:1zZACWf85oEZY5/kd9dsQS7i+2G5zVQcbKTHgslqHNA= -github.com/apache/arrow/go/v15 v15.0.0/go.mod h1:DGXsR3ajT524njufqf95822i+KTh+yea1jass9YXgjA= -github.com/apache/pulsar-client-go v0.8.1 h1:UZINLbH3I5YtNzqkju7g9vrl4CKrEgYSx2rbpvGufrE= -github.com/apache/pulsar-client-go v0.8.1/go.mod h1:yJNcvn/IurarFDxwmoZvb2Ieylg630ifxeO/iXpk27I= -github.com/apache/pulsar-client-go/oauth2 v0.0.0-20220120090717-25e59572242e h1:EqiJ0Xil8NmcXyupNqXV9oYDBeWntEIegxLahrTr8DY= -github.com/apache/pulsar-client-go/oauth2 v0.0.0-20220120090717-25e59572242e/go.mod h1:Xee4tgYLFpYcPMcTfBYWE1uKRzeciodGTSEDMzsR6i8= -github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= -github.com/apache/thrift v0.20.0 h1:631+KvYbsBZxmuJjYwhezVsrfc/TbqtZV4QcxOX1fOI= -github.com/apache/thrift v0.20.0/go.mod h1:hOk1BQqcp2OLzGsyVXdfMk7YFlMxK3aoEVhjD06QhB8= -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/ardielle/ardielle-go v1.5.2 h1:TilHTpHIQJ27R1Tl/iITBzMwiUGSlVfiVhwDNGM3Zj4= -github.com/ardielle/ardielle-go v1.5.2/go.mod h1:I4hy1n795cUhaVt/ojz83SNVCYIGsAFAONtv2Dr7HUI= -github.com/ardielle/ardielle-tools v1.5.4/go.mod h1:oZN+JRMnqGiIhrzkRN9l26Cej9dEx4jeNG6A+AdkShk= -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= -github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= -github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aws/aws-sdk-go v1.32.6/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.44.263/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= -github.com/aws/aws-sdk-go v1.53.11 h1:KcmduYvX15rRqt4ZU/7jKkmDxU/G87LJ9MUI0yQJh00= -github.com/aws/aws-sdk-go v1.53.11/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= -github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.27.0 h1:7bZWKoXhzI+mMR/HjdMx8ZCC5+6fY0lS5tr0bbgiLlo= -github.com/aws/aws-sdk-go-v2 v1.27.0/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 h1:x6xsQXGSmW6frevwDA+vi/wqhp1ct18mVXYN08/93to= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2/go.mod h1:lPprDr1e6cJdyYeGXnRaJoP4Md+cDBvi2eOj00BlGmg= -github.com/aws/aws-sdk-go-v2/config v1.18.25/go.mod h1:dZnYpD5wTW/dQF0rRNLVypB396zWCcPiBIvdvSWHEg4= -github.com/aws/aws-sdk-go-v2/config v1.27.16 h1:knpCuH7laFVGYTNd99Ns5t+8PuRjDn4HnnZK48csipM= -github.com/aws/aws-sdk-go-v2/config v1.27.16/go.mod h1:vutqgRhDUktwSge3hrC3nkuirzkJ4E/mLj5GvI0BQas= -github.com/aws/aws-sdk-go-v2/credentials v1.13.24/go.mod h1:jYPYi99wUOPIFi0rhiOvXeSEReVOzBqFNOX5bXYoG2o= -github.com/aws/aws-sdk-go-v2/credentials v1.17.16 h1:7d2QxY83uYl0l58ceyiSpxg9bSbStqBC6BeEeHEchwo= -github.com/aws/aws-sdk-go-v2/credentials v1.17.16/go.mod h1:Ae6li/6Yc6eMzysRL2BXlPYvnrLLBg3D11/AmOjw50k= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3/go.mod h1:4Q0UFP0YJf0NrsEuEYHpM9fTSEVnD16Z3uyEF7J9JGM= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3 h1:dQLK4TjtnlRGb0czOht2CevZ5l6RSyRWAnKeGd7VAFE= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3/go.mod h1:TL79f2P6+8Q7dTsILpiVST+AL9lkF6PPGI167Ny0Cjw= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.15 h1:7Zwtt/lP3KNRkeZre7soMELMGNoBrutx8nobg1jKWmo= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.15/go.mod h1:436h2adoHb57yd+8W+gYPrrA9U/R/SuAuOO42Ushzhw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33/go.mod h1:7i0PF1ME/2eUPFcjkVIwq+DOygHEoK92t5cDqNgYbIw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7 h1:lf/8VTF2cM+N4SLzaYJERKEWAXq8MOMpZfU6wEPWsPk= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7/go.mod h1:4SjkU7QiqK2M9oozyMzfZ/23LmUY+h3oFqhdeP5OMiI= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27/go.mod h1:UrHnn3QV/d0pBZ6QBAEQcqFLf8FAzLmoUfPVIueOvoM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7 h1:4OYVp0705xu8yjdyoWix0r9wPIRXnIzzOoUpQVHIJ/g= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7/go.mod h1:vd7ESTEvI76T2Na050gODNmNU7+OyKrIKroYTu4ABiI= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34/go.mod h1:Etz2dj6UHYuw+Xw830KfzCfWGMzqvUTCjUj5b76GVDc= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5 h1:81KE7vaZzrl7yHBYHVEzYB8sypz11NMOZ40YlWvPxsU= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5/go.mod h1:LIt2rg7Mcgn09Ygbdh/RdIm0rQ+3BNkbP1gyVMFtRK0= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2/go.mod h1:5CsjAbs3NlGQyZNFACh+zztPDI7fU6eW9QsxjfnuBKg= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.7 h1:ZMeFZ5yk+Ek+jNr1+uwCd2tG89t6oTS5yVWpa6yy2es= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.7/go.mod h1:mxV05U+4JiHqIpGqqYXOHLPKUC6bDXC44bsUhNjOEwY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27/go.mod h1:EOwBD4J4S5qYszS5/3DpkejfuK+Z5/1uzICfPaZLtqw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9 h1:Wx0rlZoEJR7JwlSZcHnEa7CNjrSIyVxMFWGAaXy4fJY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9/go.mod h1:aVMHdE0aHO3v+f/iw01fmXV/5DbfQ3Bi9nN7nd9bE9Y= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5 h1:f9RyWNtS8oH7cZlbn+/JNPpjUk5+5fLd5lM9M0i49Ys= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5/go.mod h1:h5CoMZV2VF297/VLhRhO1WF+XYWOzXo+4HsObA4HjBQ= -github.com/aws/aws-sdk-go-v2/service/kinesis v1.27.8 h1:U1X1JiulWfr3lyIpdx0YCVANbF2UoMVhfv3DiDKBKwc= -github.com/aws/aws-sdk-go-v2/service/kinesis v1.27.8/go.mod h1:YxRRhvHMl4YR2OZR3369QQUc2iLqTc3KUCv9ayD8758= -github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1 h1:6cnno47Me9bRykw9AEv9zkXE+5or7jz8TsskTTccbgc= -github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1/go.mod h1:qmdkIIAC+GCLASF7R2whgNrJADz0QZPX+Seiw/i4S3o= -github.com/aws/aws-sdk-go-v2/service/servicediscovery v1.29.10 h1:MNECBvcQiQxwBsVwZKShXRc1mrYawtj39jIxPXWeAQY= -github.com/aws/aws-sdk-go-v2/service/servicediscovery v1.29.10/go.mod h1:/tT3hQYAj8aGFmy4hYqeR8I5R1uFVaIlHwj6jNU+ohs= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.10/go.mod h1:ouy2P4z6sJN70fR3ka3wD3Ro3KezSxU6eKGQI2+2fjI= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.9 h1:aD7AGQhvPuAxlSUfo0CWU7s6FpkbyykMhGYMvlqTjVs= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.9/go.mod h1:c1qtZUWtygI6ZdvKppzCSXsDOq5I4luJPZ0Ud3juFCA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.10/go.mod h1:AFvkxc8xfBe8XA+5St5XIHHrQQtkxqrRincx4hmMHOk= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.3 h1:Pav5q3cA260Zqez42T9UhIlsd9QeypszRPwC9LdSSsQ= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.3/go.mod h1:9lmoVDVLz/yUZwLaQ676TK02fhCu4+PgRSmMaKR1ozk= -github.com/aws/aws-sdk-go-v2/service/sts v1.19.0/go.mod h1:BgQOMsg8av8jset59jelyPW7NoZcZXLVpDsXunGDrk8= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.10 h1:69tpbPED7jKPyzMcrwSvhWcJ9bPnZsZs18NT40JwM0g= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.10/go.mod h1:0Aqn1MnEuitqfsCNyKsdKLhDUOr4txD/g19EfiUqgws= -github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= -github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= -github.com/basgys/goxml2json v1.1.0 h1:4ln5i4rseYfXNd86lGEB+Vi652IsIXIvggKM/BhUKVw= -github.com/basgys/goxml2json v1.1.0/go.mod h1:wH7a5Np/Q4QoECFIU8zTQlZwZkrilY0itPfecMw41Dw= -github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 h1:6df1vn4bBlDDo4tARvBm7l6KA9iVMnE3NWizDeWSrps= -github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3/go.mod h1:CIWtjkly68+yqLPbvwwR/fjNJA/idrtULjZWh2v1ys0= -github.com/beefsack/go-rate v0.0.0-20220214233405-116f4ca011a0/go.mod h1:6YNgTHLutezwnBvyneBbwvB8C82y3dcoOj5EQJIdGXA= -github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= -github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -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-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= -github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/bmatcuk/doublestar/v4 v4.6.1 h1:FH9SifrbvJhnlQpztAx++wlkk70QBf0iBWDwNy7PA4I= -github.com/bmatcuk/doublestar/v4 v4.6.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/bmizerany/perks v0.0.0-20141205001514-d9a9656a3a4b/go.mod h1:ac9efd0D1fsDb3EJvhqgXRbFx7bs2wqZ10HQPeU8U/Q= -github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/briandowns/spinner v1.23.0 h1:alDF2guRWqa/FOZZYWjlMIx2L6H0wyewPxo/CH4Pt2A= -github.com/briandowns/spinner v1.23.0/go.mod h1:rPG4gmXeN3wQV/TsAY4w8lPdIM6RX3yqeBQJSrbXjuE= -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/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= -github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= -github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/checkpoint-restore/go-criu/v5 v5.3.0 h1:wpFFOoomK3389ue2lAb0Boag6XPht5QYpipxmSNL4d8= -github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cihub/seelog v0.0.0-20151216151435-d2c6e5aa9fbf/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= -github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= -github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= -github.com/cilium/ebpf v0.11.0 h1:V8gS/bTCCjX9uUnkUFUpPsksM8n1lXBAvHcpiFk1X2Y= -github.com/cilium/ebpf v0.11.0/go.mod h1:WE7CZAnqOL2RouJ4f1uyNhqr2P4CCvXFIqdRDUgWsVs= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/clbanning/mxj v1.8.4 h1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I= -github.com/clbanning/mxj/v2 v2.5.5 h1:oT81vUeEiQQ/DcHbzSytRngP6Ky9O+L+0Bw0zSJag9E= -github.com/clbanning/mxj/v2 v2.5.5/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 h1:F1EaeKL/ta07PY/k9Os/UFtwERei2/XzGemhpGnBKNg= -github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80= -github.com/cloudfoundry-incubator/uaago v0.0.0-20190307164349-8136b7bbe76e h1:DFYA2+zpeaTPEOizAJuaee2O7YX3UP5tOMjkeXL8iLo= -github.com/cloudfoundry-incubator/uaago v0.0.0-20190307164349-8136b7bbe76e/go.mod h1:8wJCVaTSjT8phXCkbZWAKIB9JU8BEVHbnSbLgkr8WfY= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50 h1:DBmgJDC9dTfkVyGgipamEh2BpGYxScCH1TOF1LL1cXc= -github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50/go.mod h1:5e1+Vvlzido69INQaVO6d87Qn543Xr6nooe9Kz7oBFM= -github.com/containerd/cgroups/v3 v3.0.3 h1:S5ByHZ/h9PMe5IOQoN7E+nMc2UcLEM/V48DGDJ9kip0= -github.com/containerd/cgroups/v3 v3.0.3/go.mod h1:8HBe7V3aWGLFPd/k03swSIsGjZhHI2WzJmticMgVuz0= -github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= -github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= -github.com/containerd/containerd v1.7.15 h1:afEHXdil9iAm03BmhjzKyXnnEBtjaLJefdU7DV0IFes= -github.com/containerd/containerd v1.7.15/go.mod h1:ISzRRTMF8EXNpJlTzyr2XMhN+j9K302C21/+cr3kUnY= -github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= -github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/containerd/ttrpc v1.2.2 h1:9vqZr0pxwOF5koz6N0N3kJ0zDHokrcPxIR/ZR2YFtOs= -github.com/containerd/ttrpc v1.2.2/go.mod h1:sIT6l32Ph/H9cvnJsfXM5drIVzTr5A2flTf1G5tYZak= -github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY= -github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-oidc/v3 v3.10.0 h1:tDnXHnLyiTVyT/2zLDGj09pFPkhND8Gl8lnTRhoEaJU= -github.com/coreos/go-oidc/v3 v3.10.0/go.mod h1:5j11xcw0D3+SGxn6Z/WFADsgcWVMyNAlSQupk0KK3ac= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= -github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= -github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= -github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= -github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= -github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= -github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= -github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE= -github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= -github.com/devigned/tab v0.1.1 h1:3mD6Kb1mUOYeLpJvTVSDwSg5ZsfSxfvxGRTxRsJsITA= -github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= -github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/digitalocean/godo v1.109.0 h1:4W97RJLJSUQ3veRZDNbp1Ol3Rbn6Lmt9bKGvfqYI5SU= -github.com/digitalocean/godo v1.109.0/go.mod h1:R6EmmWI8CT1+fCtjWY9UCB+L5uufuZH13wk3YhxycCs= -github.com/dimchansky/utfbom v1.1.0 h1:FcM3g+nofKgUteL8dm/UpdRXNC9KmADgTpLKsu0TRo4= -github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= -github.com/dimfeld/httptreemux v5.0.1+incompatible h1:Qj3gVcDNoOthBAqftuD596rm4wg/adLLz5xh5CmpiCA= -github.com/dimfeld/httptreemux v5.0.1+incompatible/go.mod h1:rbUlSV+CCpv/SuqUTP/8Bk2O3LyUV436/yaRGkhP6Z0= -github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= -github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docker/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= -github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= -github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= -github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= -github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= -github.com/dvsekhvalnov/jose2go v1.6.0 h1:Y9gnSnP4qEI0+/uQkHvFXeD2PLPJeXEL+ySMEA2EjTY= -github.com/dvsekhvalnov/jose2go v1.6.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= -github.com/eapache/go-resiliency v1.6.0 h1:CqGDTLtpwuWKn6Nj3uNUdflaq+/kIPsg0gfNzHton30= -github.com/eapache/go-resiliency v1.6.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= -github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 h1:Oy0F4ALJ04o5Qqpdz8XLIpNA3WM/iSIXqxtqo7UGVws= -github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= -github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/elastic/elastic-transport-go/v8 v8.5.0 h1:v5membAl7lvQgBTexPRDBO/RdnlQX+FM9fUVDyXxvH0= -github.com/elastic/elastic-transport-go/v8 v8.5.0/go.mod h1:YLHer5cj0csTzNFXoNQ8qhtGY1GTvSqPnKWKaqQE3Hk= -github.com/elastic/go-docappender/v2 v2.1.2 h1:zkEh+g/CxpJdQR6BqdcApa/A4oRQiiG3iFiIhNCoovs= -github.com/elastic/go-docappender/v2 v2.1.2/go.mod h1:oHi6MsHriWaG8W6T9iyJ/PkEo2+182HIzq+0RRAzzgA= -github.com/elastic/go-elasticsearch/v7 v7.17.10 h1:TCQ8i4PmIJuBunvBS6bwT2ybzVFxxUhhltAs3Gyu1yo= -github.com/elastic/go-elasticsearch/v7 v7.17.10/go.mod h1:OJ4wdbtDNk5g503kvlHLyErCgQwwzmDtaFC4XyOxXA4= -github.com/elastic/go-elasticsearch/v8 v8.13.1 h1:du5F8IzUUyCkzxyHdrO9AtopcG95I/qwi2WK8Kf1xlg= -github.com/elastic/go-elasticsearch/v8 v8.13.1/go.mod h1:DIn7HopJs4oZC/w0WoJR13uMUxtHeq92eI5bqv5CRfI= -github.com/elastic/go-structform v0.0.10 h1:oy08o/Ih2hHTkNcRY/1HhaYvIp5z6t8si8gnCJPDo1w= -github.com/elastic/go-structform v0.0.10/go.mod h1:CZWf9aIRYY5SuKSmOhtXScE5uQiLZNqAFnwKR4OrIM4= -github.com/elastic/go-sysinfo v1.7.1 h1:Wx4DSARcKLllpKT2TnFVdSUJOsybqMYCNQZq1/wO+s0= -github.com/elastic/go-sysinfo v1.7.1/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= -github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= -github.com/elastic/go-windows v1.0.1 h1:AlYZOldA+UJ0/2nBuqWdo90GFCgG9xuyw9SYzGUtJm0= -github.com/elastic/go-windows v1.0.1/go.mod h1:FoVvqWSun28vaDQPbj2Elfc0JahhPB7WQEGa3c814Ss= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= -github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= -github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= -github.com/envoyproxy/go-control-plane v0.12.0 h1:4X+VP1GHd1Mhj6IB5mMeGbLCleqxjletLK6K0rbxyZI= -github.com/envoyproxy/go-control-plane v0.12.0/go.mod h1:ZBTaoJ23lqITozF0M6G4/IragXCQKCnYbmlmtHvwRG0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= -github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= -github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= -github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= -github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= -github.com/euank/go-kmsg-parser v2.0.0+incompatible h1:cHD53+PLQuuQyLZeriD1V/esuG4MuU0Pjs5y6iknohY= -github.com/euank/go-kmsg-parser v2.0.0+incompatible/go.mod h1:MhmAMZ8V4CYH4ybgdRwPr2TU5ThnS43puaKEMpja1uw= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.8.0 h1:lRj6N9Nci7MvzrXuX6HFzU8XjmhPiXPlsKEy1u0KQro= -github.com/evanphx/json-patch/v5 v5.8.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= -github.com/expr-lang/expr v1.16.9 h1:WUAzmR0JNI9JCiF0/ewwHB1gmcGw5wW7nWt8gc6PpCI= -github.com/expr-lang/expr v1.16.9/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= -github.com/facebook/time v0.0.0-20240510113249-fa89cc575891 h1:x6T9k2Jw0IPzSdM2i4tVWmnJ3KJ1fEKwWJ++IzDvPDU= -github.com/facebook/time v0.0.0-20240510113249-fa89cc575891/go.mod h1:2UFAomOuD2vAK1x68czUtCVjAqmyWCEnAXOlmGqf+G0= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= -github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= -github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= -github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= -github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/frankban/quicktest v1.11.0/go.mod h1:K+q6oSqb0W0Ininfk863uOk1lMy69l/P6txr3mVT54s= -github.com/frankban/quicktest v1.11.2/go.mod h1:K+q6oSqb0W0Ininfk863uOk1lMy69l/P6txr3mVT54s= -github.com/frankban/quicktest v1.13.0/go.mod h1:qLE0fzW0VuyUAJgPU19zByoIr0HtCHN/r/VLSOOIySU= -github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= -github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= -github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= -github.com/getsentry/sentry-go v0.28.0 h1:7Rqx9M3ythTKy2J6uZLHmc8Sz9OGgIlseuO1iBX/s0M= -github.com/getsentry/sentry-go v0.28.0/go.mod h1:1fQZ+7l7eeJ3wYi82q5Hg8GqAPgefRq+FP/QhafYVgg= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= -github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-faster/city v1.0.1 h1:4WAxSZ3V2Ws4QRDrscLEDcibJY8uf41H6AhXDrNDcGw= -github.com/go-faster/city v1.0.1/go.mod h1:jKcUJId49qdW3L1qKHH/3wPeUstCVpVSXTM6vO3VcTw= -github.com/go-faster/errors v0.7.1 h1:MkJTnDoEdi9pDabt1dpWf7AA8/BaSYZqibYyhZ20AYg= -github.com/go-faster/errors v0.7.1/go.mod h1:5ySTjWFiphBs07IKuiL69nxdfd5+fzh1u7FPGZP2quo= -github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= -github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= -github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-jose/go-jose/v4 v4.0.1 h1:QVEPDE3OluqXBQZDcnNvQrInro2h0e4eqNbnZSWqS6U= -github.com/go-jose/go-jose/v4 v4.0.1/go.mod h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.13.0 h1:OoneCcHKHQ03LfBpoQCUfCluwd2Vt3ohz+kvbJneZAU= -github.com/go-kit/kit v0.13.0/go.mod h1:phqEHMMUbyrCFCTgH48JueqrM3md2HcAZ8N3XE4FKDg= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= -github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= -github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= -github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= -github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= -github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= -github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.22.9 h1:XX2DssF+mQKM2DHsbgZK74y/zj4mo9I99+89xUmuZCE= -github.com/go-openapi/swag v0.22.9/go.mod h1:3/OXnFfnMAwBD099SwYRk7GD3xOrr1iL7d/XNLXVVwE= -github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-resty/resty/v2 v2.12.0 h1:rsVL8P90LFvkUYq/V5BTVe203WfRIU4gvcf+yfzJzGA= -github.com/go-resty/resty/v2 v2.12.0/go.mod h1:o0yGPrkS3lOe1+eFajk6kBW8ScXzwU3hD69/gt2yB/0= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= -github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg= -github.com/go-test/deep v1.1.0/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg= -github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= -github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/gocql/gocql v1.6.0 h1:IdFdOTbnpbd0pDhl4REKQDM+Q0SzKXQ1Yh+YZZ8T/qU= -github.com/gocql/gocql v1.6.0/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8= -github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= -github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= -github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= -github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= -github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= -github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= -github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= -github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= -github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= -github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/cadvisor v0.49.0 h1:1PYeiORXmcFYi609M4Qvq5IzcvcVaWgYxDt78uH8jYA= -github.com/google/cadvisor v0.49.0/go.mod h1:s6Fqwb2KiWG6leCegVhw4KW40tf9f7m+SF1aXiE8Wsk= -github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/flatbuffers v23.5.26+incompatible h1:M9dgRyhJemaM4Sw8+66GHBu8ioaQmyPLg1b8VwK5WJg= -github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= -github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= -github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7 h1:y3N7Bm7Y9/CtpiVkw/ZWj6lSlDF3F74SfKwfTCer72Q= -github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= -github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= -github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.12.4 h1:9gWcmF85Wvq4ryPFvGFaOgPIs1AQX0d0bcbGw4Z96qg= -github.com/googleapis/gax-go/v2 v2.12.4/go.mod h1:KYEYLorsnIGDi/rPC8b5TdlB9kbKoFubselGIoBMCwI= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gophercloud/gophercloud v1.8.0 h1:TM3Jawprb2NrdOnvcHhWJalmKmAmOGgfZElM/3oBYCk= -github.com/gophercloud/gophercloud v1.8.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= -github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= -github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= -github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= -github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= -github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI= -github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gosnmp/gosnmp v1.37.0 h1:/Tf8D3b9wrnNuf/SfbvO+44mPrjVphBhRtcGg22V07Y= -github.com/gosnmp/gosnmp v1.37.0/go.mod h1:GDH9vNqpsD7f2HvZhKs5dlqSEcAS6s6Qp099oZRCR+M= -github.com/grafana/loki/pkg/push v0.0.0-20240514112848-a1b1eeb09583 h1:dN3eF1S5fvVu2l9WoqYSvmNmPK8Uh2vjE4yUsBq80l4= -github.com/grafana/loki/pkg/push v0.0.0-20240514112848-a1b1eeb09583/go.mod h1:lJEF/Wh5MYlmBem6tOYAFObkLsuikfrEf8Iy9AdMPiQ= -github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= -github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grobie/gomemcache v0.0.0-20230213081705-239240bbc445 h1:FlKQKUYPZ5yDCN248M3R7x8yu2E3yEZ0H7aLomE4EoE= -github.com/grobie/gomemcache v0.0.0-20230213081705-239240bbc445/go.mod h1:L69/dBlPQlWkcnU76WgcppK5e4rrxzQdi6LhLnK/ytA= -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 v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= -github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.13.0/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= -github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= -github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= -github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= -github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.28.3 h1:IE06LST/knnCQ+cxcvzyXRF/DetkgGhJoaOFd4l9xkk= -github.com/hashicorp/consul/api v1.28.3/go.mod h1:7AGcUFu28HkgOKD/GmsIGIFzRTmN0L02AE9Thsr2OhU= -github.com/hashicorp/consul/proto-public v0.6.1 h1:+uzH3olCrksXYWAYHKqK782CtK9scfqH+Unlw3UHhCg= -github.com/hashicorp/consul/proto-public v0.6.1/go.mod h1:cXXbOg74KBNGajC+o8RlA502Esf0R9prcoJgiOX/2Tg= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU= -github.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo= -github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= -github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= -github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= -github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-retryablehttp v0.7.4 h1:ZQgVdpTdAL7WpMIwLzCfbalOcSUdkDZnpUv3/+BxzFA= -github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= -github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= -github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= -github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= -github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= -github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= -github.com/hashicorp/nomad/api v0.0.0-20240306004928-3e7191ccb702 h1:fI1LXuBaS1d9z1kmb++Og6YD8uMRwadXorCwE+xgOFA= -github.com/hashicorp/nomad/api v0.0.0-20240306004928-3e7191ccb702/go.mod h1:z71gkJdrkAt/Rl6C7Q79VE7AwJ5lUF+M+fzFTyIHYB0= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= -github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/hectane/go-acl v0.0.0-20190604041725-da78bae5fc95 h1:S4qyfL2sEm5Budr4KVMyEniCy+PbS55651I/a+Kn/NQ= -github.com/hectane/go-acl v0.0.0-20190604041725-da78bae5fc95/go.mod h1:QiyDdbZLaJ/mZP4Zwc9g2QsfaEA4o7XvvgZegSci5/E= -github.com/hetznercloud/hcloud-go/v2 v2.6.0 h1:RJOA2hHZ7rD1pScA4O1NF6qhkHyUdbbxjHgFNot8928= -github.com/hetznercloud/hcloud-go/v2 v2.6.0/go.mod h1:4J1cSE57+g0WS93IiHLV7ubTHItcp+awzeBp5bM9mfA= -github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= -github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= -github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= -github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/influxdata/influxdb-client-go/v2 v2.13.0 h1:ioBbLmR5NMbAjP4UVA5r9b5xGjpABD7j65pI8kFphDM= -github.com/influxdata/influxdb-client-go/v2 v2.13.0/go.mod h1:k+spCbt9hcvqvUiz0sr5D8LolXHqAAOfPw9v/RIRHl4= -github.com/influxdata/influxdb-observability/common v0.5.12 h1:4YwZ+vsodz6VfoiX+ZqVotmnyCa9vCCPksSBK/WLjBs= -github.com/influxdata/influxdb-observability/common v0.5.12/go.mod h1:u+CABnGO/F1IK51pDlZQroh4+igJNo695XrbLGDBhVc= -github.com/influxdata/influxdb-observability/influx2otel v0.5.12 h1:u0lNE3+63rILk4mtmCYsNyczH/1wEXnM+1aBzBe5akk= -github.com/influxdata/influxdb-observability/influx2otel v0.5.12/go.mod h1:bM407XIJYnrJYJ9Q3q2ytDSOyFhiYmGm0Sz1Qf48RPk= -github.com/influxdata/influxdb-observability/otel2influx v0.5.12 h1:t9gmVOOHbZyEAvIYSoO97Tde1KArVtiYdM0/0Dhmuio= -github.com/influxdata/influxdb-observability/otel2influx v0.5.12/go.mod h1:YGsb8xYfjHvcr2y0+Nj7kOHMTw7fWDbAA4g/qJKkvaU= -github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c h1:qSHzRbhzK8RdXOsAdfDgO49TtqC1oZ+acxPrkfTxcCs= -github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU= -github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/influxdata/line-protocol-corpus v0.0.0-20210519164801-ca6fa5da0184/go.mod h1:03nmhxzZ7Xk2pdG+lmMd7mHDfeVOYFyhOgwO61qWU98= -github.com/influxdata/line-protocol-corpus v0.0.0-20210922080147-aa28ccfb8937 h1:MHJNQ+p99hFATQm6ORoLmpUCF7ovjwEFshs/NHzAbig= -github.com/influxdata/line-protocol-corpus v0.0.0-20210922080147-aa28ccfb8937/go.mod h1:BKR9c0uHSmRgM/se9JhFHtTT7JTO67X23MtKMHtZcpo= -github.com/influxdata/line-protocol/v2 v2.0.0-20210312151457-c52fdecb625a/go.mod h1:6+9Xt5Sq1rWx+glMgxhcg2c0DUaehK+5TDcPZ76GypY= -github.com/influxdata/line-protocol/v2 v2.1.0/go.mod h1:QKw43hdUBg3GTk2iC3iyCxksNj7PX9aUSeYOYE/ceHY= -github.com/influxdata/line-protocol/v2 v2.2.1 h1:EAPkqJ9Km4uAxtMRgUubJyqAr6zgWM0dznKMLRauQRE= -github.com/influxdata/line-protocol/v2 v2.2.1/go.mod h1:DmB3Cnh+3oxmG6LOBIxce4oaL4CPj3OmMPgvauXh+tM= -github.com/ionos-cloud/sdk-go/v6 v6.1.11 h1:J/uRN4UWO3wCyGOeDdMKv8LWRzKu6UIkLEaes38Kzh8= -github.com/ionos-cloud/sdk-go/v6 v6.1.11/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= -github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= -github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.6.0 h1:SWJzexBzPL5jb0GEsrPMLIsi/3jOo7RHlzTjcAeDrPY= -github.com/jackc/pgx/v5 v5.6.0/go.mod h1:DNZ/vlrUnhWCoFGxHAG8U2ljioxukquj7utPDgtQdTw= -github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= -github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= -github.com/jaegertracing/jaeger v1.57.0 h1:3wDtUUPs6NRYH7+d+y8MilDkLHdpPrVlQ2wbcsA62bs= -github.com/jaegertracing/jaeger v1.57.0/go.mod h1:p/1fxIU9hKHl7qEhKC72p2ZYVhvvZvNB73y6V7YyuTs= -github.com/jarcoal/httpmock v1.3.1 h1:iUx3whfZWVf3jT01hQTO/Eo5sAYtB2/rqaUuOtpInww= -github.com/jarcoal/httpmock v1.3.1/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg= -github.com/jawher/mow.cli v1.0.4/go.mod h1:5hQj2V8g+qYmLUVWqu4Wuja1pI57M83EChYLVZ0sMKk= -github.com/jawher/mow.cli v1.2.0/go.mod h1:y+pcA3jBAdo/GIZx/0rFjw/K2bVEODP9rfZOfaiq8Ko= -github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= -github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= -github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= -github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= -github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= -github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= -github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= -github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= -github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8= -github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= -github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= -github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= -github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= -github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4= -github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= -github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -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/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA= -github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= -github.com/karrick/godirwalk v1.17.0 h1:b4kY7nqDdioR/6qnbHQyDvmA17u5G1cZ6J+CZXwSWoI= -github.com/karrick/godirwalk v1.17.0/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d/go.mod h1:JJNrCn9otv/2QP4D7SMJBgaleKpOf66PnW6F5WGNRIc= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= -github.com/klauspost/compress v1.10.8/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= -github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= -github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= -github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= -github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= -github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00= -github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leodido/go-syslog/v4 v4.1.0 h1:Wsl194qyWXr7V6DrGWC3xmxA9Ra6XgWO+toNt2fmCaI= -github.com/leodido/go-syslog/v4 v4.1.0/go.mod h1:eJ8rUfDN5OS6dOkCOBYlg2a+hbAg6pJa99QXXgMrd98= -github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b h1:11UHH39z1RhZ5dc4y4r/4koJo6IYFgTRMe/LlwRTEw0= -github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b/go.mod h1:WZxr2/6a/Ar9bMDc2rN/LJrE/hF6bXE4LPyDSIxwAfg= -github.com/leoluk/perflib_exporter v0.2.1 h1:/3/ut1k/jFt5p4ypjLZKDHDqlXAK6ERZPVWtwdI389I= -github.com/leoluk/perflib_exporter v0.2.1/go.mod h1:MinSWm88jguXFFrGsP56PtleUb4Qtm4tNRH/wXNXRTI= -github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2ttpEmkA4aQ3j4u9dStX2t4M8UM6qqNsG8= -github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is= -github.com/lestrrat-go/strftime v1.0.6 h1:CFGsDEt1pOpFNU+TJB0nhz9jl+K0hZSLE205AhTIGQQ= -github.com/lestrrat-go/strftime v1.0.6/go.mod h1:f7jQKgV5nnJpYgdEasS+/y7EsTb8ykN2z68n3TtcTaw= -github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= -github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lightstep/go-expohisto v1.0.0 h1:UPtTS1rGdtehbbAF7o/dhkWLTDI73UifG8LbfQI7cA4= -github.com/lightstep/go-expohisto v1.0.0/go.mod h1:xDXD0++Mu2FOaItXtdDfksfgxfV0z1TMPa+e/EUd0cs= -github.com/linkedin/goavro/v2 v2.9.8 h1:jN50elxBsGBDGVDEKqUlDuU1cFwJ11K/yrJCBMe/7Wg= -github.com/linkedin/goavro/v2 v2.9.8/go.mod h1:UgQUb2N/pmueQYH9bfqFioWxzYCZXSfF8Jw03O5sjqA= -github.com/linode/linodego v1.33.0 h1:cX2FYry7r6CA1ujBMsdqiM4VhvIQtnWsOuVblzfBhCw= -github.com/linode/linodego v1.33.0/go.mod h1:dSJJgIwqZCF5wnpuC6w5cyIbRtcexAm7uVvuJopGB40= -github.com/logicmonitor/lm-data-sdk-go v1.3.0 h1:Obrexk35IKupFQezngkesR/kMfHQdAEUR1zYbJrOrzg= -github.com/logicmonitor/lm-data-sdk-go v1.3.0/go.mod h1:nIHr4uOPfg6AM7mG1rewg3L4O3rfge34o7UYB7joBM4= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c h1:VtwQ41oftZwlMnOEbMWQtSEUgU64U4s+GHk7hZK+jtY= -github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE= -github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= -github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-ieproxy v0.0.1 h1:qiyop7gCflfhwCzGyeT0gro3sF9AIg9HU98JORTkqfI= -github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= -github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04nTH68g= -github.com/maxatome/go-testdeep v1.12.0/go.mod h1:lPZc/HAcJMP92l7yI6TRz1aZN5URwUBUAfUNvrclaNM= -github.com/microsoft/ApplicationInsights-Go v0.4.4 h1:G4+H9WNs6ygSCe6sUyxRc2U81TI5Es90b2t/MwX5KqY= -github.com/microsoft/ApplicationInsights-Go v0.4.4/go.mod h1:fKRUseBqkw6bDiXTs3ESTiU/4YTIHsQS4W3fP2ieF4U= -github.com/microsoft/go-mssqldb v1.7.1 h1:KU/g8aWeM3Hx7IMOFpiwYiUkU+9zeISb4+tx3ScVfsM= -github.com/microsoft/go-mssqldb v1.7.1/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.58 h1:ca2Hdkz+cDg/7eNF6V56jjzuZ4aCAE+DbVkILdQWG/4= -github.com/miekg/dns v1.1.58/go.mod h1:Ypv+3b/KadlvW9vJfXOTf300O4UqaHFzFCuHz+rPkBY= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible h1:aKW/4cBs+yK6gpqU3K/oIwk9Q/XICqd3zOX/UFuvqmk= -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= -github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= -github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/hashstructure v1.1.0 h1:P6P1hdjqAAknpY/M1CGipelZgp+4y9ja9kmUZPXP+H0= -github.com/mitchellh/hashstructure v1.1.0/go.mod h1:xUDAozZz0Wmdiufv0uyhnHkUTN6/6d8ulp4AwfLKrmA= -github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4= -github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c h1:cqn374mizHuIWj+OSJCajGr/phAmuMug9qIX3l9CflE= -github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= -github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= -github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= -github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= -github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= -github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= -github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= -github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= -github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= -github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/mongodb-forks/digest v1.1.0 h1:7eUdsR1BtqLv0mdNm4OXs6ddWvR4X2/OsLwdKksrOoc= -github.com/mongodb-forks/digest v1.1.0/go.mod h1:rb+EX8zotClD5Dj4NdgxnJXG9nwrlx3NWKJ8xttz1Dg= -github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/montanaflynn/stats v0.7.0 h1:r3y12KyNxj/Sb/iOE46ws+3mS1+MZca1wlHQFPsY/JU= -github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mostynb/go-grpc-compression v1.2.2 h1:XaDbnRvt2+1vgr0b/l0qh4mJAfIxE0bKXtz2Znl3GGI= -github.com/mostynb/go-grpc-compression v1.2.2/go.mod h1:GOCr2KBxXcblCuczg3YdLQlcin1/NfyDA348ckuCH6w= -github.com/mrunalp/fileutils v0.5.1 h1:F+S7ZlNKnrwHfSwdlgNSkKo67ReVf8o9fel6C3dkm/Q= -github.com/mrunalp/fileutils v0.5.1/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= -github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= -github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nginxinc/nginx-prometheus-exporter v0.11.0 h1:21xjnqNgxtni2jDgAQ90bl15uDnrTreO9sIlu1YsX/U= -github.com/nginxinc/nginx-prometheus-exporter v0.11.0/go.mod h1:GdyHnWAb8q8OW1Pssrrqbcqra0SH0Vn6UXICMmyWkw8= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= -github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= -github.com/oapi-codegen/runtime v1.0.0 h1:P4rqFX5fMFWqRzY9M/3YF9+aPSPPB06IzP2P7oOxrWo= -github.com/oapi-codegen/runtime v1.0.0/go.mod h1:LmCUMQuPB4M/nLXilQXhHw+BLZdDb18B34OO356yJ/A= -github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.14.0 h1:vSmGj2Z5YPb9JwCWT6z6ihcUvDhuXLc3sJiqd3jMKAY= -github.com/onsi/ginkgo/v2 v2.14.0/go.mod h1:JkUdW7JkN0V6rFvsHcJ478egV3XH9NxpD27Hal/PhZw= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= -github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= -github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= -github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= -github.com/opencontainers/runc v1.1.12 h1:BOIssBaW1La0/qbNZHXOOa71dZfZEQOzW7dqQf3phss= -github.com/opencontainers/runc v1.1.12/go.mod h1:S+lQwSfncpBha7XTy/5lBwWgm5+y5Ma/O44Ekby9FK8= -github.com/opencontainers/runtime-spec v1.1.0-rc.3 h1:l04uafi6kxByhbxev7OWiuUv0LZxEsYUfDWZ6bztAuU= -github.com/opencontainers/runtime-spec v1.1.0-rc.3/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/selinux v1.11.0 h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaLpt7tQ7oU= -github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec= -github.com/opensearch-project/opensearch-go/v2 v2.3.0 h1:nQIEMr+A92CkhHrZgUhcfsrZjibvB3APXf2a1VwCmMQ= -github.com/opensearch-project/opensearch-go/v2 v2.3.0/go.mod h1:8LDr9FCgUTVoT+5ESjc2+iaZuldqE+23Iq0r1XeNue8= -github.com/openshift/api v0.0.0-20180801171038-322a19404e37 h1:05irGU4HK4IauGGDbsk+ZHrm1wOzMLYjMlfaiqMrBYc= -github.com/openshift/api v0.0.0-20180801171038-322a19404e37/go.mod h1:dh9o4Fs58gpFXGSYfnVxGR9PnV53I8TW84pQaJDdGiY= -github.com/openshift/api v0.0.0-20210521075222-e273a339932a/go.mod h1:izBmoXbUu3z5kUa4FjZhvekTsyzIWiOoaIgJiZBBMQs= -github.com/openshift/build-machinery-go v0.0.0-20210423112049-9415d7ebd33e/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE= -github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142 h1:ZHRIMCFIJN1p9LsJt4HQ+akDrys4PrYnXzOWI5LK03I= -github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142/go.mod h1:fjS8r9mqDVsPb5td3NehsNOAWa4uiFkYEfVZioQ2gH0= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/openzipkin/zipkin-go v0.4.3 h1:9EGwpqkgnwdEIJ+Od7QVSEIH+ocmm5nPat0G7sjsSdg= -github.com/openzipkin/zipkin-go v0.4.3/go.mod h1:M9wCJZFWCo2RiY+o1eBCEMe0Dp2S5LDHcMZmk3RmK7c= -github.com/outcaste-io/ristretto v0.2.1 h1:KCItuNIGJZcursqHr3ghO7fc5ddZLEHspL9UR0cQM64= -github.com/outcaste-io/ristretto v0.2.1/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= -github.com/ovh/go-ovh v1.4.3 h1:Gs3V823zwTFpzgGLZNI6ILS4rmxZgJwJCz54Er9LwD0= -github.com/ovh/go-ovh v1.4.3/go.mod h1:AkPXVtgwB6xlKblMjRKJJmjRp+ogrE7fz2lVgcQY8SY= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= -github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= -github.com/paulmach/orb v0.11.1 h1:3koVegMC4X/WeiXYz9iswopaTwMem53NzTJuTF20JzU= -github.com/paulmach/orb v0.11.1/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU= -github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= -github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= -github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= -github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= -github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM= -github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= -github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= -github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= -github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pkg/sftp v1.13.6 h1:JFZT4XbOU7l77xGSpOdW+pwIMqP044IyjXX6FGyEKFo= -github.com/pkg/sftp v1.13.6/go.mod h1:tz1ryNURKu77RL+GuCzmoJYxQczL3wLNNpPWagdg4Qk= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c h1:NRoLoZvkBTKvR5gQLgA3e0hqjkY9u1wm+iOL45VN/qI= -github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8cTqKc= -github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.31.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= -github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e h1:UmqAuY2OyDoog8+l5FybViJE5B2r+UxVGCUwFTsY5AA= -github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e/go.mod h1:+0ld+ozir7zWFcHA2vVpWAKxXakIioEjPPNOqH+J3ZA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/redis/go-redis/v9 v9.5.1 h1:H1X4D3yHPaYrkL5X06Wh6xNVM/pX0Ft4RV0vMGvLBh8= -github.com/redis/go-redis/v9 v9.5.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M= -github.com/relvacode/iso8601 v1.4.0 h1:GsInVSEJfkYuirYFxa80nMLbH2aydgZpIf52gYZXUJs= -github.com/relvacode/iso8601 v1.4.0/go.mod h1:FlNp+jz+TXpyRqgmM7tnzHHzBnz776kmAH2h3sZCn0I= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= -github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= -github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= -github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= -github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= -github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= -github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= -github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM= -github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.25 h1:/8rfZAdFfafRXOgz+ZpMZZWZ5pYggCY9t7e/BvjaBHM= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.25/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= -github.com/scalyr/dataset-go v0.18.0 h1:CTv7kk/FGdiicTWo3h1brFusHD1yjhVGINFamP8uukw= -github.com/scalyr/dataset-go v0.18.0/go.mod h1:4x0JK5X0UdhZ2TEO3kHu9pTELDRc3WsrBBwQfkOPZKc= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646 h1:RpforrEYXWkmGwJHIGnLZ3tTWStkjVVstwzNGqxX2Ds= -github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= -github.com/secure-systems-lab/go-securesystemslib v0.7.0 h1:OwvJ5jQf9LnIAS83waAjPbcMsODrTQUpJ02eNLUoxBg= -github.com/secure-systems-lab/go-securesystemslib v0.7.0/go.mod h1:/2gYnlnHVQ6xeGtfIqFy7Do03K4cdCY0A/GlJLDKLHI= -github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= -github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= -github.com/shirou/gopsutil/v3 v3.22.12/go.mod h1:Xd7P1kwZcp5VW52+9XsirIKd/BROzbb2wdX3Kqlz9uI= -github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= -github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= -github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= -github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= -github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= -github.com/shoenig/test v1.7.1 h1:UJcjSAI3aUKx52kfcfhblgyhZceouhvvs3OYdWgn+PY= -github.com/shoenig/test v1.7.1/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI= -github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= -github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/signalfx/com_signalfx_metrics_protobuf v0.0.3 h1:32k2QLgsKhcEs55q4REPKyIadvid5FPy2+VMgvbmKJ0= -github.com/signalfx/com_signalfx_metrics_protobuf v0.0.3/go.mod h1:gJrXWi7wSGXfiC7+VheQaz+ypdCt5SmZNL+BRxUe7y4= -github.com/signalfx/sapm-proto v0.14.0 h1:KWh3I5E4EkelB19aP1/54Ik8khSioC/RVRW/riOfRGg= -github.com/signalfx/sapm-proto v0.14.0/go.mod h1:Km6PskZh966cqNoUn3AmRyGRix5VfwnxVBvn2vjRC9U= -github.com/sijms/go-ora/v2 v2.8.19 h1:7LoKZatDYGi18mkpQTR/gQvG9yOdtc7hPAex96Bqisc= -github.com/sijms/go-ora/v2 v2.8.19/go.mod h1:EHxlY6x7y9HAsdfumurRfTd+v8NrEOTR3Xl4FWlH6xk= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/snowflakedb/gosnowflake v1.10.1-0.20240509141315-5570db2126fe h1:tyqmtuppkCBKehjrsrGgcO7xsNBEGWgIlgm9fq/4X4U= -github.com/snowflakedb/gosnowflake v1.10.1-0.20240509141315-5570db2126fe/go.mod h1:hvc58mU03qg78mSz5z17/qnzI56hOdYYK2txWbM0hN0= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= -github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= -github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= -github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= -github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= -github.com/stormcat24/protodep v0.1.8 h1:FOycjjkjZiastf21aRoCjtoVdhsoBE8mZ0RvY6AHqFE= -github.com/stormcat24/protodep v0.1.8/go.mod h1:6OoSZD5GGomKfmH1LvfJxNIRvYhewFXH5+eNv8h4wOM= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= -github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/tedsuo/ifrit v0.0.0-20180802180643-bea94bb476cc/go.mod h1:eyZnKCc955uh98WQvzOm0dgAeLnf2O0Rz0LPoC5ze+0= -github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.931 h1:3kcyl2ZLEWH5pHlUfw1lNXbJ95WUJN1pzfYoOhAajZc= -github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.931/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= -github.com/testcontainers/testcontainers-go v0.31.0 h1:W0VwIhcEVhRflwL9as3dhY6jXjVCA27AkmbnZ+UTh3U= -github.com/testcontainers/testcontainers-go v0.31.0/go.mod h1:D2lAoA0zUFiSY+eAflqK5mcUx/A5hrrORaEQrd0SefI= -github.com/tg123/go-htpasswd v1.2.2 h1:tmNccDsQ+wYsoRfiONzIhDm5OkVHQzN3w4FOBAlN6BY= -github.com/tg123/go-htpasswd v1.2.2/go.mod h1:FcIrK0J+6zptgVwK1JDlqyajW/1B4PtuJ/FLWl7nx8A= -github.com/tidwall/gjson v1.10.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.14.3 h1:9jvXn7olKEHU1S9vwoMGliaT8jq1vJ7IH/n9zD9Dnlw= -github.com/tidwall/gjson v1.14.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= -github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tidwall/tinylru v1.1.0 h1:XY6IUfzVTU9rpwdhKUF6nQdChgCdGjkMfLzbWyiau6I= -github.com/tidwall/tinylru v1.1.0/go.mod h1:3+bX+TJ2baOLMWTnlyNWHh4QMnFyARg2TLTQ6OFbzw8= -github.com/tidwall/wal v1.1.7 h1:emc1TRjIVsdKKSnpwGBAcsAGg0767SvUk8+ygx7Bb+4= -github.com/tidwall/wal v1.1.7/go.mod h1:r6lR1j27W9EPalgHiB7zLJDYu3mzW5BQP5KrzBpYY/E= -github.com/tilinna/clock v1.1.0 h1:6IQQQCo6KoBxVudv6gwtY8o4eDfhHo8ojA5dP0MfhSs= -github.com/tilinna/clock v1.1.0/go.mod h1:ZsP7BcY7sEEz7ktc0IVy8Us6boDrK8VradlKRUGfOao= -github.com/tinylib/msgp v1.1.9 h1:SHf3yoO2sGA0veCJeCBYLHuttAVFHGm2RHgNodW7wQU= -github.com/tinylib/msgp v1.1.9/go.mod h1:BCXGB54lDD8qUEPmiG0cQQUANC4IUQyB2ItS2UDlO/k= -github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= -github.com/tj/assert v0.0.3/go.mod h1:Ne6X72Q+TB1AteidzQncjw9PabbMp4PBMZ1k+vd1Pvk= -github.com/tjfoc/gmsm v1.3.2 h1:7JVkAn5bvUJ7HtU08iW6UiD+UTmJTIToHCfeFzkcCxM= -github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w= -github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20200122045848-3419fae592fc/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ= -github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= -github.com/vincent-petithory/dataurl v1.0.0 h1:cXw+kPto8NLuJtlMsI152irrVw9fRDX8AbShPRpg2CI= -github.com/vincent-petithory/dataurl v1.0.0/go.mod h1:FHafX5vmDzyP+1CQATJn7WFKc9CvnvxyvZy6I1MrG/U= -github.com/vishvananda/netlink v1.2.1-beta.2 h1:Llsql0lnQEbHj0I1OuKyp8otXp0r3q0mPkuhwHfStVs= -github.com/vishvananda/netlink v1.2.1-beta.2/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA= -github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= -github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= -github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= -github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= -github.com/vmware/go-vmware-nsxt v0.0.0-20230223012718-d31b8a1ca05e h1:Vu41Q0Pv3yMdd+tcDW6QeEUIK2L+9ZrPrq8NAMrKSLc= -github.com/vmware/go-vmware-nsxt v0.0.0-20230223012718-d31b8a1ca05e/go.mod h1:aRq5pxwgdJpAuP97SCjX1+Db32z/b0dggQ07FDF+fqE= -github.com/vmware/govmomi v0.36.3 h1:1Ng3CBNQVbFjCQbKtfsewy5o3dFa+EoTjqeThVISUBc= -github.com/vmware/govmomi v0.36.3/go.mod h1:mtGWtM+YhTADHlCgJBiskSRPOZRsN9MSjPzaZLte/oQ= -github.com/vultr/govultr/v2 v2.17.2 h1:gej/rwr91Puc/tgh+j33p/BLR16UrIPnSr+AIwYWZQs= -github.com/vultr/govultr/v2 v2.17.2/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI= -github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= -github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= -github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= -github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= -github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= -github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= -github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yuin/gopher-lua v0.0.0-20220504180219-658193537a64 h1:5mLPGnFdSsevFRFc9q3yYbBkB6tsm4aCwwQV/j1JQAQ= -github.com/yuin/gopher-lua v0.0.0-20220504180219-658193537a64/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= -github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= -github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= -github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -github.com/zorkian/go-datadog-api v2.30.0+incompatible h1:R4ryGocppDqZZbnNc5EDR8xGWF/z/MxzWnqTUijDQes= -github.com/zorkian/go-datadog-api v2.30.0+incompatible/go.mod h1:PkXwHX9CUQa/FpB9ZwAD45N1uhCW4MT/Wj7m36PbKss= -go.einride.tech/aip v0.67.1 h1:d/4TW92OxXBngkSOwWS2CH5rez869KpKMaN44mdxkFI= -go.einride.tech/aip v0.67.1/go.mod h1:ZGX4/zKw8dcgzdLsrvpOOGxfxI2QSk12SlP7d6c0/XI= -go.elastic.co/apm/module/apmelasticsearch/v2 v2.6.0 h1:ukMcwyMaDXsS1dRK2qRYXT2AsfwaUy74TOOYCqkWJow= -go.elastic.co/apm/module/apmelasticsearch/v2 v2.6.0/go.mod h1:YpfiTTrqX5LB/CKBwX89oDCBAxuLJTFv40gcfxJyehM= -go.elastic.co/apm/module/apmhttp/v2 v2.6.0 h1:s8UeNFQmVBCNd4eoz7KDD9rEFhQC0HeUFXz3z9gpAmQ= -go.elastic.co/apm/module/apmhttp/v2 v2.6.0/go.mod h1:D0GLppLuI0Ddwvtl595GUxRgn6Z8L5KaDFVMv2H3GK0= -go.elastic.co/apm/module/apmzap/v2 v2.6.0 h1:R/iVORzGu3F9uM43iEVHD0nwiRo59O0bIXdayKsgayQ= -go.elastic.co/apm/module/apmzap/v2 v2.6.0/go.mod h1:B3i/8xRkqLgi6zNuV+Bp7Pt4cutaOObvrVSa7wUTAPw= -go.elastic.co/apm/v2 v2.6.0 h1:VieBMLQFtXua2YxpYxaSdYGnmmxhLT46gosI5yErJgY= -go.elastic.co/apm/v2 v2.6.0/go.mod h1:33rOXgtHwbgZcDgi6I/GtCSMZQqgxkHC0IQT3gudKvo= -go.elastic.co/fastjson v1.3.0 h1:hJO3OsYIhiqiT4Fgu0ZxAECnKASbwgiS+LMW5oCopKs= -go.elastic.co/fastjson v1.3.0/go.mod h1:K9vDh7O0ODsVKV2B5e2XYLY277QZaCbB3tS1SnARvko= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.10 h1:+BqfJTcCzTItrop8mq/lbzL8wSGtj94UO/3U31shqG0= -go.etcd.io/bbolt v1.3.10/go.mod h1:bK3UQLPJZly7IlNmV7uVHJDxfe5aK9Ll93e/74Y9oEQ= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.mongodb.org/atlas v0.36.0 h1:m05S3AO7zkl+bcG1qaNsEKBnAqnKx2FDwLooHpIG3j4= -go.mongodb.org/atlas v0.36.0/go.mod h1:nfPldE9dSama6G2IbIzmEza02Ly7yFZjMMVscaM0uEc= -go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= -go.mongodb.org/mongo-driver v1.15.0 h1:rJCKC8eEliewXjZGf0ddURtl7tTVy1TK3bfl0gkUSLc= -go.mongodb.org/mongo-driver v1.15.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/configgrpc v0.102.0 h1:cQi5HwpkHvrZJUxZjoGXkWpAuK+gEyp/1Zjn0BrkvmQ= -go.opentelemetry.io/collector/config/configgrpc v0.102.0/go.mod h1:ASpBXzDWLiDGlG8iRFovU5R4LhAefoC4ajm+qIdslOw= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/confignet v0.102.0 h1:+wQevJ/iBnPxL+roY7WWnAjMxB8v4M5QrS3+0iEmauw= -go.opentelemetry.io/collector/config/confignet v0.102.0/go.mod h1:pfOrCTfSZEB6H2rKtx41/3RN4dKs+X2EKQbw3MGRh0E= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0 h1:8Ne/oL6M4kMWK0P3FKV9EduQa+1UOGyVAnFHfSo4c1A= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0/go.mod h1:Xj4Ld/RriP/Bj+5oPpaYJsLNs2wWRDN2TvzX3Lbi6+M= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0 h1:o1iKqN+oM+TZqHoGdnKw1Am2BQlIGCYbxCRzU8T3jbM= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0/go.mod h1:JpCemLtL/sXQ2Rk3Bx7OPPA7Qt/9NVH91q0bR655gSo= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0 h1:SfASE6lxXjrmYj/UibcWdOiFWvRG0zt4hJgenloEhlY= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0/go.mod h1:+Ku0Fvdb5f6e9UkfqJXAV5FaUJVxxg6Ykfx7Js8y+V4= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0 h1:GwJQTXs7pYPUv/fVf+0nBgsJdlrTuY/PfwQ/TRA/sIk= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0/go.mod h1:PGE3DcRgqYWWC2cq2hYZoET1d3Q8JZyPNmgvqXPFWEU= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0 h1:zdYZLiHHtDf4Kk9WU7mW9dW6WAXtBF54I5jmTMRJtiw= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0/go.mod h1:yFsgUM0PbUJkPlbpJfOG6da+YiF0Z80tv7YcnL3qwv4= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0 h1:Y4H+GaCQl2URp9mEJMV5CYOhw+erONqNyvtFoKQfIoA= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0/go.mod h1:g1RjfVD0gHAf/mPOIs3zBoKBeuDsN+rc5x0lZtgA8tI= -go.opentelemetry.io/collector/connector v0.102.0 h1:IvAsVfYRxP0ajmKbUovF8qugkcUtHq6RuYNtjcMa63E= -go.opentelemetry.io/collector/connector v0.102.0/go.mod h1:f4M7wZ/9+XtgTE0fivBFH3WlwntaEd0qFFA0giFkdnY= -go.opentelemetry.io/collector/connector/forwardconnector v0.102.0 h1:g68oHc8sRQ34gIWkq4S/zYS3x0x4PCC3SpC3f3BsM0M= -go.opentelemetry.io/collector/connector/forwardconnector v0.102.0/go.mod h1:ZqgFEDwgdRvoDkA5wH3A/d4ox2KTk+UNKLAHLTvGmPI= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/exporter/debugexporter v0.102.0 h1:b8z8EHdb3Q4f1A/lr6zP9aVv+7HTsouV0XCR8zb+R4w= -go.opentelemetry.io/collector/exporter/debugexporter v0.102.0/go.mod h1:fuFR9OIDtNe/ZGUp1YwrO2t0jy1/AIi4P93e+OoMCWA= -go.opentelemetry.io/collector/exporter/loggingexporter v0.102.0 h1:wtRMOD8m4vJGRc8DNwzEp+q7cc37/VIgxLO4Gguq6c4= -go.opentelemetry.io/collector/exporter/loggingexporter v0.102.0/go.mod h1:SA2/8sJ/T9g6Sk444oUOoyw2KhERrie8mvRM3z6fC8k= -go.opentelemetry.io/collector/exporter/otlpexporter v0.102.0 h1:Nz2ULE5JfDj/houoV+VYSXTWP3/54/kCXH26WjJUNjI= -go.opentelemetry.io/collector/exporter/otlpexporter v0.102.0/go.mod h1:jaMS+3T8lwFc0jEjbqqOC+ArTwpGzR5De8u/jPncyKM= -go.opentelemetry.io/collector/exporter/otlphttpexporter v0.102.0 h1:ayoDBhSkXPrHO/L9MQKhZA/OCDZaOMEfosm+KMw4LBA= -go.opentelemetry.io/collector/exporter/otlphttpexporter v0.102.0/go.mod h1:9SN1giFZMQD0cWqYaBbUIjTnAI7/pWfEBwLosfHwWuY= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/extension/ballastextension v0.102.0 h1:p4gIucFZlTbV4VJ0zxUi8bkQFHnBCimYCe+nZwuPoHk= -go.opentelemetry.io/collector/extension/ballastextension v0.102.0/go.mod h1:hymqiVdV2Fu40lrXk8jm3uQsIFiUu2Fb8ptSzl5Emzw= -go.opentelemetry.io/collector/extension/zpagesextension v0.102.0 h1:BPq98py8nwzaV7KAsxt4ZZAF9LiSRu7ZjHNGavFNyKo= -go.opentelemetry.io/collector/extension/zpagesextension v0.102.0/go.mod h1:P86HW3x3epDS5F4yP0gAvsZiw4xxP1OupTEx2o6UqjY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/filter v0.102.0 h1:2K4Q/l4b+tglMAQmxpscuCr/juyozyPx17Q6Dfm2FwU= -go.opentelemetry.io/collector/filter v0.102.0/go.mod h1:zDVjFCeeVct7hYwejzx+aRC1dbHaPsvv/Ob1SvCiQjE= -go.opentelemetry.io/collector/otelcol v0.102.0 h1:HuE+ok4iUjOrmYhQBSWpG5kBTVhcA24ljPL4pBERZ5E= -go.opentelemetry.io/collector/otelcol v0.102.0/go.mod h1:w8pCRu2nM/jAkLlEAS6ccKtJv5ylUQe6Ugl98zzTfyE= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/processor v0.102.0 h1:JsjTlpBRmoSYxcu3cAbKBchOmL6aNUxLa03ZkWIqZr8= -go.opentelemetry.io/collector/processor v0.102.0/go.mod h1:IaCSDcfy75uQTaOM+LgR1bMf/bUw2eFfzn20uvWYfLQ= -go.opentelemetry.io/collector/processor/batchprocessor v0.102.0 h1:lJSIMwip+Po5jOF/4dpx6c/3N45KJTr/UZoT086T4mI= -go.opentelemetry.io/collector/processor/batchprocessor v0.102.0/go.mod h1:e71Y6SnrCjD19dPjxWWi/kXa5tb0J8rC+9xl/72mLo4= -go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.102.0 h1:osoITPX0RITC8gJkyaNC6rqSKFl9wCeOqagjdNZUL70= -go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.102.0/go.mod h1:2OVM2IJOWVdxkOOt0WCyQSMv2T19OSKNIy1KCqHGXyY= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0 h1:eLc+AK0IQDDysrMt3SLwKaOFIjEwdO8ipwSck3+TUXE= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0/go.mod h1:p9yeFJktNrpwV9ATvaWeZwCMvVkVWnrfbJ4RHI/RS/I= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/collector/service v0.102.0 h1:B5nfyQZF7eB/y+yucl9G/7VsusbXixYXWingXn7VszM= -go.opentelemetry.io/collector/service v0.102.0/go.mod h1:c+0n0DfQeCjgrdplNHYwYbG/5aupTZVYU/50nMQraoc= -go.opentelemetry.io/contrib/config v0.7.0 h1:b1rK5tGTuhhPirJiMxOcyQfZs76j2VapY6ODn3b2Dbs= -go.opentelemetry.io/contrib/config v0.7.0/go.mod h1:8tdiFd8N5etOi3XzBmAoMxplEzI3TcL8dU5rM5/xcOQ= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 h1:vS1Ao/R55RNV4O7TA2Qopok8yN+X0LIP6RVWLFkprck= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0/go.mod h1:BMsdeOxN04K0L5FNUBfjFdvwWGNe/rkmSwH4Aelu/X0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/contrib/propagators/b3 v1.27.0 h1:IjgxbomVrV9za6bRi8fWCNXENs0co37SZedQilP2hm0= -go.opentelemetry.io/contrib/propagators/b3 v1.27.0/go.mod h1:Dv9obQz25lCisDvvs4dy28UPh974CxkahRDUPsY7y9E= -go.opentelemetry.io/contrib/zpages v0.52.0 h1:MPgkMy0Cp3O5EdfVXP0ss3ujhEibysTM4eszx7E7d+E= -go.opentelemetry.io/contrib/zpages v0.52.0/go.mod h1:fqG5AFdoYru3A3DnhibVuaaEfQV2WKxE7fYE1jgDRwk= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/bridge/opencensus v1.27.0 h1:ao9aGGHd+G4YfjBpGs6vbkvt5hoC67STlJA9fCnOAcs= -go.opentelemetry.io/otel/bridge/opencensus v1.27.0/go.mod h1:uRvWtAAXzyVOST0WMPX5JHGBaAvBws+2F8PcC5gMnTk= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 h1:bFgvUr3/O4PHj3VQcFEuYKvRZJX1SJDQ+11JXuSB3/w= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0/go.mod h1:xJntEd2KL6Qdg5lwp97HMLQDVeAhrYxmzFseAMDPQ8I= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 h1:CIHWikMsN3wO+wq1Tp5VGdVRTcON+DmOJSfDjXypKOc= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0/go.mod h1:TNupZ6cxqyFEpLXAZW7On+mLFL0/g0TE3unIYL91xWc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0 h1:/jlt1Y8gXWiHG9FBx6cJaIC5hYx5Fe64nC8w5Cylt/0= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0/go.mod h1:bmToOGOBZ4hA9ghphIc1PAf66VA8KOtsuy3+ScStG20= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 h1:/0YaXu3755A/cFbtXp+21lkXgI0QE5avTWA2HjU9/WE= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0/go.mod h1:m7SFxp0/7IxmJPLIY3JhOcU9CoFzDaCPL6xxQIxhA+o= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= -go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= -go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/dig v1.17.0 h1:5Chju+tUvcC+N7N6EV08BJz41UZuO3BmHcN4A287ZLI= -go.uber.org/dig v1.17.0/go.mod h1:rTxpf7l5I0eBTlE6/9RL+lDybC7WFwY2QH55ZSjy1mU= -go.uber.org/fx v1.18.2 h1:bUNI6oShr+OVFQeU8cDNbnN7VFsu+SsjHzUF51V/GAU= -go.uber.org/fx v1.18.2/go.mod h1:g0V1KMQ66zIRk8bLu3Ea5Jt2w/cHlOIp4wdRsgh0JaY= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= -go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= -go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.14.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= -go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= -golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= -golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= -golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= -golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190529164535-6a60838ec259/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -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-20191025021431-6c3a3bfe00ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/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= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -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-20190614205625-5aca471b1d59/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-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-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210112230658-8b4aab62c064/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= -golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= -gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= -gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= -gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= -gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= -google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= -google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= -google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= -google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= -google.golang.org/api v0.182.0 h1:if5fPvudRQ78GeRx3RayIoiuV7modtErPIZC/T2bIvE= -google.golang.org/api v0.182.0/go.mod h1:cGhjy4caqA5yXRzEhkHI8Y9mfyC2VLTlER2l08xaqtM= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= -google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= -google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= -google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= -google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/genproto v0.0.0-20240521202816-d264139d666e h1:axIBUGXSVho2zB+3tJj8l9Qvm/El5vVYPYqhGA5PmJM= -google.golang.org/genproto v0.0.0-20240521202816-d264139d666e/go.mod h1:gOvX/2dWTqh+u3+IHjFeCxinlz5AZ5qhOufbQPub/dE= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 h1:P8OJ/WCl/Xo4E4zoe4/bifHpSmmKwARqyqE4nW6J2GQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240521202816-d264139d666e h1:Elxv5MwEkCI9f5SkoL6afed6NTdxaGoAo39eANBwHL8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240521202816-d264139d666e/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= -google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= -google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= -google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= -google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= -gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/zorkian/go-datadog-api.v2 v2.30.0 h1:umQdVO0Ytx+kYadhuJNjFtDgIsIEBnKrOTvNuu8ClKI= -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.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= -gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= -howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM= -howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= -k8s.io/api v0.21.1/go.mod h1:FstGROTmsSHBarKc8bylzXih8BLNYTiS3TZcsoEDg2s= -k8s.io/api v0.29.3 h1:2ORfZ7+bGC3YJqGpV0KSDDEVf8hdGQ6A03/50vj8pmw= -k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80= -k8s.io/apimachinery v0.21.1/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY= -k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= -k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= -k8s.io/client-go v0.21.1/go.mod h1:/kEw4RgW+3xnBGzvp9IWxKSNA+lXn3A7AuH3gdOAzLs= -k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg= -k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= -k8s.io/code-generator v0.21.1/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= -k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= -k8s.io/kubelet v0.29.3 h1:X9h0ZHzc+eUeNTaksbN0ItHyvGhQ7Z0HPjnQD2oHdwU= -k8s.io/kubelet v0.29.3/go.mod h1:jDiGuTkFOUynyBKzOoC1xRSWlgAZ9UPcTYeFyjr6vas= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0 h1:jgGTlFYnhF1PM1Ax/lAlxUPE+KfCIXHaathvJg1C3ak= -k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= -modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= -modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= -modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= -modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= -modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= -modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= -modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= -modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= -modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= -modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= -modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= -modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= -modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= -modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= -modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/controller-runtime v0.17.3 h1:65QmN7r3FWgTxDMz9fvGnO1kbf2nu+acg9p2R9oYYYk= -sigs.k8s.io/controller-runtime v0.17.3/go.mod h1:N0jpP5Lo7lMTF9aL56Z/B2oWBJjey6StQM0jRbKQXtY= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= -skywalking.apache.org/repo/goapi v0.0.0-20240104145220-ba7202308dd4 h1:3YIFmsshgsU6FzHgnkG9Z24CkXkgoexBN5O0aSzK79g= -skywalking.apache.org/repo/goapi v0.0.0-20240104145220-ba7202308dd4/go.mod h1:oD2dxcDAHVIt95Ee7kJHgZ5f64QNhrqTjQYARwfafc4= diff --git a/cmd/configschema/metadata.yaml b/cmd/configschema/metadata.yaml deleted file mode 100644 index 4b61cd6491c5..000000000000 --- a/cmd/configschema/metadata.yaml +++ /dev/null @@ -1,7 +0,0 @@ -type: configschema - -status: - class: cmd - codeowners: - active: [mx-psi, dmitryax] - emeritus: [pmcollins] \ No newline at end of file diff --git a/cmd/configschema/package_test.go b/cmd/configschema/package_test.go deleted file mode 100644 index d326dc6613ab..000000000000 --- a/cmd/configschema/package_test.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package configschema - -import ( - "testing" - - "go.uber.org/goleak" -) - -// The Ignore function calls prevent catching leaks generated by indirect dependencies. -// All of these are leaks that we can't fix from within the collector code base. -// Regarding the OpenCensus ignore: see https://github.com/census-instrumentation/opencensus-go/issues/1191 -// Regarding the DataDog ignore: see https://github.com/DataDog/datadog-agent/issues/22030 -// Regarding the database/sql ignore: see https://github.com/SAP/go-hdb/issues/130 -// Regarding the SAP/go-hdb ignore: see https://github.com/SAP/go-hdb/issues/131 -// Regarding the cihub/seelog ignore: see https://github.com/cihub/seelog/issues/182 -// Regarding the godbus/dbus ignore: see https://github.com/99designs/keyring/issues/135 -func TestMain(m *testing.M) { - goleak.VerifyTestMain(m, - goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), - goleak.IgnoreTopFunction("github.com/DataDog/datadog-agent/pkg/trace/metrics/timing.(*Set).Autoreport.func1"), - // Unfortunately this ignore can't be anymore specific, even though it's caused by the SAP/go-hdb/driver - // package. There's no reference to this package in the goleak output. This has the potential of - // hiding future leaks, so we should remove as soon as the referenced issue is resolved. - goleak.IgnoreTopFunction("database/sql.(*DB).connectionOpener"), - goleak.IgnoreTopFunction("github.com/SAP/go-hdb/driver.(*metrics).collect"), - goleak.IgnoreAnyFunction("github.com/cihub/seelog.(*asyncLoopLogger).processQueue"), - goleak.IgnoreAnyFunction("github.com/godbus/dbus.(*Conn).inWorker")) -} diff --git a/cmd/configschema/resolver.go b/cmd/configschema/resolver.go deleted file mode 100644 index fdf958a83372..000000000000 --- a/cmd/configschema/resolver.go +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package configschema // import "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/configschema" - -import ( - "fmt" - "go/build" - "os" - "path/filepath" - "reflect" - "strings" - - "golang.org/x/mod/modfile" - "golang.org/x/mod/module" -) - -// DefaultSrcRoot is the default root of the collector repo, relative to the -// current working directory. Can be used to create a DirResolver. -const DefaultSrcRoot = "." - -// DefaultModule is the module prefix of contrib. Can be used to create a -// DirResolver. -const DefaultModule = "github.com/open-telemetry/opentelemetry-collector-contrib" - -type DirResolverIntf interface { - TypeToPackagePath(t reflect.Type) (string, error) - ReflectValueToProjectPath(v reflect.Value) string -} - -// DirResolver is used to resolve the base directory of a given reflect.Type. -type DirResolver struct { - SrcRoot string - ModuleName string -} - -// NewDefaultDirResolver creates a DirResolver with a default SrcRoot and -// ModuleName, suitable for using this package's API using otelcol with an -// executable running from the otelcol's source root (not tests). -func NewDefaultDirResolver() DirResolver { - return NewDirResolver(DefaultSrcRoot, DefaultModule) -} - -// NewDirResolver creates a DirResolver with a custom SrcRoot and ModuleName. -// Useful for testing and for using this package's API from a repository other -// than otelcol (e.g. contrib). -func NewDirResolver(srcRoot string, moduleName string) DirResolver { - return DirResolver{ - SrcRoot: srcRoot, - ModuleName: moduleName, - } -} - -// TypeToPackagePath accepts a Type and returns the filesystem path. If the -// path does not exist in the current project, returns location in GOPATH. -func (dr DirResolver) TypeToPackagePath(t reflect.Type) (string, error) { - pkgPath := t.PkgPath() - if strings.HasPrefix(pkgPath, dr.ModuleName) { - return dr.packagePathToVerifiedProjectPath(strings.TrimPrefix(pkgPath, dr.ModuleName+"/")) - } - verifiedGoPath, err := dr.packagePathToVerifiedGoPath(pkgPath) - if err != nil { - return "", fmt.Errorf("could not find the pkg %q: %w", pkgPath, err) - } - return verifiedGoPath, nil -} - -// ReflectValueToProjectPath accepts a reflect.Value and returns its directory in the current project. If -// the type doesn't live in the current project, returns "". -func (dr DirResolver) ReflectValueToProjectPath(v reflect.Value) string { - t := v.Type().Elem() - if !strings.HasPrefix(t.PkgPath(), dr.ModuleName) { - return "" - } - trimmed := strings.TrimPrefix(t.PkgPath(), dr.ModuleName+"/") - dir, err := dr.packagePathToVerifiedProjectPath(trimmed) - if err != nil { - return "" - } - return dir -} - -func (dr DirResolver) packagePathToVerifiedProjectPath(packagePath string) (string, error) { - dir := dr.packagePathToProjectPath(packagePath) - _, err := os.ReadDir(dir) - return dir, err -} - -// packagePathToProjectPath returns the path to a package in the local project. -func (dr DirResolver) packagePathToProjectPath(packagePath string) string { - return filepath.Join(dr.SrcRoot, packagePath) -} - -func (dr DirResolver) packagePathToVerifiedGoPath(packagePath string) (string, error) { - dir, err := dr.packagePathToGoPath(packagePath) - if err != nil { - return "", err - } - _, err = os.ReadDir(dir) - return dir, err -} - -// packagePathToGoPath accepts a package path (e.g. -// "go.opentelemetry.io/collector/receiver/otlpreceiver") and returns the -// filesystem path starting at GOPATH by reading the current module's go.mod -// file to get the version and appending it to the filesystem path. -func (dr DirResolver) packagePathToGoPath(packagePath string) (string, error) { - gomodPath := filepath.Join(dr.SrcRoot, "go.mod") - gomodBytes, err := os.ReadFile(gomodPath) - if err != nil { - return "", err - } - parsedModfile, err := modfile.Parse(gomodPath, gomodBytes, nil) - if err != nil { - return "", err - } - for _, modfileRequire := range parsedModfile.Require { - modpath := modfileRequire.Syntax.Token[0] - if strings.HasPrefix(packagePath, modpath) { - return modfileRequreToGoPath(modfileRequire) - } - } - return "", fmt.Errorf("packagePathToGoPath: not found in go.mod: package path %q", packagePath) -} - -// modfileRequreToGoPath converts a modfile.Require value to a fully-qualified -// filesystem path with a GOPATH prefix. -func modfileRequreToGoPath(required *modfile.Require) (string, error) { - path, err := requireTokensToPartialPath(required.Syntax.Token) - if err != nil { - return "", err - } - goPath := os.Getenv("GOPATH") - if goPath == "" { - goPath = build.Default.GOPATH - } - return filepath.Join(goPath, "pkg", "mod", path), nil -} - -// requireTokensToPartialPath converts a string slice of length two e.g. -// ["github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector", -// "42"] from a modfile.Require struct to an escaped, partial filesystem path -// (without the GOPATH prefix) e.g. -// "github.com/!google!cloud!platform/opentelemetry-operations-go/exporter/collector@42" -func requireTokensToPartialPath(tokens []string) (string, error) { - pathPart, err := module.EscapePath(tokens[0]) - if err != nil { - return "", err - } - version := tokens[1] - return fmt.Sprintf("%s@%s", pathPart, version), nil -} diff --git a/cmd/configschema/resolver_test.go b/cmd/configschema/resolver_test.go deleted file mode 100644 index f19f76d1cc9b..000000000000 --- a/cmd/configschema/resolver_test.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package configschema - -import ( - "os" - "path/filepath" - "reflect" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/receiver/otlpreceiver" - - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/redisreceiver" -) - -const gcpCollectorPath = "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector" - -func TestTokensToPartialPath(t *testing.T) { - path, err := requireTokensToPartialPath([]string{gcpCollectorPath, "42"}) - require.NoError(t, err) - assert.Equal(t, "github.com/!google!cloud!platform/opentelemetry-operations-go/exporter/collector@42", path) -} - -func TestPackagePathToGoPath(t *testing.T) { - dr := testDR() - dir, err := dr.packagePathToGoPath(gcpCollectorPath) - require.NoError(t, err) - _, err = os.ReadDir(dir) - require.NoError(t, err) -} - -func TestPackagePathToGoPath_Error(t *testing.T) { - _, err := testDR().packagePathToGoPath("foo/bar") - require.Error(t, err) -} - -func TestTypeToPackagePath_Local(t *testing.T) { - packageDir := testTypeToPackagePath(t, redisreceiver.Config{}) - assert.Equal(t, filepath.Join("..", "..", "receiver", "redisreceiver"), packageDir) -} - -func TestTypeToPackagePath_External(t *testing.T) { - packageDir := testTypeToPackagePath(t, otlpreceiver.Config{}) - assert.Contains(t, packageDir, filepath.Join("pkg", "mod", "go.opentelemetry.io", "collector", "receiver@")) -} - -func TestTypeToPackagePath_Error(t *testing.T) { - dr := NewDirResolver("foo/bar", DefaultModule) - _, err := dr.TypeToPackagePath(reflect.ValueOf(redisreceiver.Config{}).Type()) - require.Error(t, err) -} - -func TestTypeToProjectPath(t *testing.T) { - dir := testDR().ReflectValueToProjectPath(reflect.ValueOf(&redisreceiver.Config{})) - assert.Equal(t, filepath.Join("..", "..", "receiver", "redisreceiver"), dir) -} - -func TestTypetoProjectPath_External(t *testing.T) { - dir := testDR().ReflectValueToProjectPath(reflect.ValueOf(&otlpreceiver.Config{})) - assert.Equal(t, "", dir) -} - -func testTypeToPackagePath(t *testing.T, v any) string { - packageDir, err := testDR().TypeToPackagePath(reflect.ValueOf(v).Type()) - require.NoError(t, err) - return packageDir -} diff --git a/cmd/githubgen/README.md b/cmd/githubgen/README.md index 2703499eba8d..fa81f646815f 100644 --- a/cmd/githubgen/README.md +++ b/cmd/githubgen/README.md @@ -19,7 +19,7 @@ $> GITHUB_TOKEN= githubgen --folder . [--allowlist cmd/githubgen/all ## Checking codeowners against OpenTelemetry membership via Github API -To authenticate, set the environment variable `GITHUB_TOKEN` to a PAT token. +To authenticate, set the environment variable `GITHUB_TOKEN` to a PAT token. If a PAT is not available you can use the `--skipgithub` flag to avoid checking for membership in the GitHub organization. For each codeowner, the script will check if the user is registered as a member of the OpenTelemetry organization. diff --git a/cmd/githubgen/allowlist.txt b/cmd/githubgen/allowlist.txt index 15b721e0324d..1358cd2ecceb 100644 --- a/cmd/githubgen/allowlist.txt +++ b/cmd/githubgen/allowlist.txt @@ -1,18 +1,23 @@ +abhishek-at-cloudwerx +adcharre Caleb-Hurshman -MaxKsyunz -MitchellGale -YANG-DB -asaharn -emreyalvac -shaochengwang -yiyang5055 -am-kinetica +cemdk cheempz -jerrytfleung +dlopes7 driverpt -adcharre +dsimil +galrose +harishbohara11 +heitorganzeli +Hemansh31 jcreixell +jerrytfleung +jriguera +KiranmayiB +m1rp +michael-burt rlankfo +shazlehu swar8080 -zpzhuSplunk thmshmm +zpzhuSplunk \ No newline at end of file diff --git a/cmd/githubgen/codeowners.go b/cmd/githubgen/codeowners.go index 6c9d930a5d3f..70f1b2f9450f 100644 --- a/cmd/githubgen/codeowners.go +++ b/cmd/githubgen/codeowners.go @@ -10,7 +10,7 @@ import ( "sort" "strings" - "github.com/google/go-github/v62/github" + "github.com/google/go-github/v67/github" ) const allowlistHeader = `# Code generated by githubgen. DO NOT EDIT. @@ -22,7 +22,7 @@ const allowlistHeader = `# Code generated by githubgen. DO NOT EDIT. ##################################################### # # Learn about membership in OpenTelemetry community: -# https://github.com/open-telemetry/community/blob/main/community-membership.md +# https://github.com/open-telemetry/community/blob/main/guides/contributor/membership.md # # # Learn about CODEOWNERS file format: @@ -52,7 +52,7 @@ const codeownersHeader = `# Code generated by githubgen. DO NOT EDIT. ##################################################### # # Learn about membership in OpenTelemetry community: -# https://github.com/open-telemetry/community/blob/main/community-membership.md +# https://github.com/open-telemetry/community/blob/main/guides/contributor/membership.md # # # Learn about CODEOWNERS file format: @@ -71,6 +71,7 @@ const distributionCodeownersHeader = ` ` type codeownersGenerator struct { + skipGithub bool } func (cg codeownersGenerator) generate(data *githubData) error { @@ -91,7 +92,7 @@ func (cg codeownersGenerator) generate(data *githubData) error { } var missingCodeowners []string var duplicateCodeowners []string - members, err := getGithubMembers() + members, err := cg.getGithubMembers() if err != nil { return err } @@ -109,7 +110,7 @@ func (cg codeownersGenerator) generate(data *githubData) error { duplicateCodeowners = append(duplicateCodeowners, codeowner) } } - if len(missingCodeowners) > 0 { + if len(missingCodeowners) > 0 && !cg.skipGithub { sort.Strings(missingCodeowners) return fmt.Errorf("codeowners are not members: %s", strings.Join(missingCodeowners, ", ")) } @@ -178,18 +179,22 @@ LOOP: codeowners += fmt.Sprintf("reports/distributions/%s.yaml%s @open-telemetry/collector-contrib-approvers %s\n", dist.Name, strings.Repeat(" ", longestName-len(dist.Name)), strings.Join(maintainers, " ")) } - err = os.WriteFile(filepath.Join(".github", "CODEOWNERS"), []byte(codeowners+unmaintainedCodeowners), 0600) + err = os.WriteFile(filepath.Join(".github", "CODEOWNERS"), []byte(codeowners+unmaintainedCodeowners), 0o600) if err != nil { return err } - err = os.WriteFile(filepath.Join(".github", "ALLOWLIST"), []byte(allowlistHeader+deprecatedList+unmaintainedList), 0600) + err = os.WriteFile(filepath.Join(".github", "ALLOWLIST"), []byte(allowlistHeader+deprecatedList+unmaintainedList), 0o600) if err != nil { return err } return nil } -func getGithubMembers() (map[string]struct{}, error) { +func (cg codeownersGenerator) getGithubMembers() (map[string]struct{}, error) { + if cg.skipGithub { + // don't try to get organization members if no token is expected + return map[string]struct{}{}, nil + } githubToken := os.Getenv("GITHUB_TOKEN") if githubToken == "" { return nil, fmt.Errorf("Set the environment variable `GITHUB_TOKEN` to a PAT token to authenticate") diff --git a/cmd/githubgen/distributions.go b/cmd/githubgen/distributions.go index c5629430b731..95b3588ceb90 100644 --- a/cmd/githubgen/distributions.go +++ b/cmd/githubgen/distributions.go @@ -12,8 +12,7 @@ import ( "gopkg.in/yaml.v3" ) -type distributionsGenerator struct { -} +type distributionsGenerator struct{} type distOutput struct { Name string `yaml:"name"` @@ -54,7 +53,7 @@ func (cg distributionsGenerator) generate(data *githubData) error { if err != nil { return nil } - err = os.WriteFile(filepath.Join("reports", "distributions", fmt.Sprintf("%s.yaml", dist.Name)), b, 0600) + err = os.WriteFile(filepath.Join("reports", "distributions", fmt.Sprintf("%s.yaml", dist.Name)), b, 0o600) if err != nil { return nil } diff --git a/cmd/githubgen/go.mod b/cmd/githubgen/go.mod index c7e229925db0..0fc3c3c11d75 100644 --- a/cmd/githubgen/go.mod +++ b/cmd/githubgen/go.mod @@ -1,20 +1,20 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/cmd/githubgen -go 1.21.0 +go 1.22.0 require ( - github.com/google/go-github/v62 v62.0.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0 + github.com/google/go-github/v67 v67.0.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0 gopkg.in/yaml.v3 v3.0.1 ) require ( - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect go.uber.org/multierr v1.11.0 // indirect diff --git a/cmd/githubgen/go.sum b/cmd/githubgen/go.sum index de4c35dff9bb..2cdc52739386 100644 --- a/cmd/githubgen/go.sum +++ b/cmd/githubgen/go.sum @@ -1,32 +1,38 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-github/v62 v62.0.0 h1:/6mGCaRywZz9MuHyw9gD1CwsbmBX8GWsbFkwMmHdhl4= -github.com/google/go-github/v62 v62.0.0/go.mod h1:EMxeUqGJq2xRu9DYBMwel/mr7kZrzUOfQmmpYrZn2a4= +github.com/google/go-github/v67 v67.0.0 h1:g11NDAmfaBaCO8qYdI9fsmbaRipHNWRIU/2YGvlh4rg= +github.com/google/go-github/v67 v67.0.0/go.mod h1:zH3K7BxjFndr9QSeFibx4lTKkYS3K9nDanoI1NjaOtY= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0 h1:SfASE6lxXjrmYj/UibcWdOiFWvRG0zt4hJgenloEhlY= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0/go.mod h1:+Ku0Fvdb5f6e9UkfqJXAV5FaUJVxxg6Ykfx7Js8y+V4= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0 h1:upFhnU8EyPp0WMR53mJIdx+UR2EGFOr+ppYKzUCY/Vg= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0/go.mod h1:FhjMWU5nf3IctX27lVZomM5SKMyRywShRsA4/rHoBe8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -34,7 +40,8 @@ go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8 go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/cmd/githubgen/issuetemplates.go b/cmd/githubgen/issuetemplates.go index 05fa22c38477..bce61cf19ef4 100644 --- a/cmd/githubgen/issuetemplates.go +++ b/cmd/githubgen/issuetemplates.go @@ -31,8 +31,7 @@ func folderToShortName(folder string) string { return strings.Join(path, "/") } -type issueTemplatesGenerator struct { -} +type issueTemplatesGenerator struct{} func (itg issueTemplatesGenerator) generate(data *githubData) error { keys := map[string]struct{}{} @@ -59,12 +58,11 @@ func (itg issueTemplatesGenerator) generate(data *githubData) error { oldContent := matchOldContent.FindSubmatch(templateContents) if len(oldContent) > 0 { templateContents = bytes.ReplaceAll(templateContents, oldContent[0], replacement) - err = os.WriteFile(filepath.Join(issuesFolder, e.Name()), templateContents, 0600) + err = os.WriteFile(filepath.Join(issuesFolder, e.Name()), templateContents, 0o600) if err != nil { return err } } - } return nil } diff --git a/cmd/githubgen/main.go b/cmd/githubgen/main.go index f4bdd38d1699..10e87c4ecfc3 100644 --- a/cmd/githubgen/main.go +++ b/cmd/githubgen/main.go @@ -32,6 +32,7 @@ type generator interface { func main() { folder := flag.String("folder", ".", "folder investigated for codeowners") allowlistFilePath := flag.String("allowlist", "cmd/githubgen/allowlist.txt", "path to a file containing an allowlist of members outside the OpenTelemetry organization") + skipGithubCheck := flag.Bool("skipgithub", false, "skip checking GitHub membership check for CODEOWNERS generator") flag.Parse() var generators []generator for _, arg := range flag.Args() { @@ -39,7 +40,7 @@ func main() { case "issue-templates": generators = append(generators, issueTemplatesGenerator{}) case "codeowners": - generators = append(generators, codeownersGenerator{}) + generators = append(generators, codeownersGenerator{skipGithub: *skipGithubCheck}) case "distributions": generators = append(generators, distributionsGenerator{}) default: @@ -47,7 +48,7 @@ func main() { } } if len(generators) == 0 { - generators = []generator{issueTemplatesGenerator{}, codeownersGenerator{}} + generators = []generator{issueTemplatesGenerator{}, codeownersGenerator{skipGithub: *skipGithubCheck}} } if err := run(*folder, *allowlistFilePath, generators); err != nil { log.Fatal(err) @@ -112,7 +113,6 @@ func loadMetadata(filePath string) (metadata, error) { } func run(folder string, allowlistFilePath string, generators []generator) error { - components := map[string]metadata{} var foldersList []string maxLength := 0 diff --git a/cmd/opampsupervisor/.gitignore b/cmd/opampsupervisor/.gitignore index fbaf96e91182..dc240c6132a0 100644 --- a/cmd/opampsupervisor/.gitignore +++ b/cmd/opampsupervisor/.gitignore @@ -1,2 +1,3 @@ effective.yaml agent.log +*.dat diff --git a/cmd/opampsupervisor/README.md b/cmd/opampsupervisor/README.md index a292623fc26a..381a9c23b582 100644 --- a/cmd/opampsupervisor/README.md +++ b/cmd/opampsupervisor/README.md @@ -67,7 +67,7 @@ For a list of open issues related to the Supervisor, see [these issues](https:// |--------------------------------|----------------------------------------------------------------------------------| | AcceptsRemoteConfig | ✅ | | ReportsEffectiveConfig | ⚠️ | -| AcceptsPackages | 📅 | +| AcceptsPackages | | | ReportsPackageStatuses | 📅 | | ReportsOwnTraces | 📅 | | ReportsOwnMetrics | ⚠️ | diff --git a/cmd/opampsupervisor/e2e_test.go b/cmd/opampsupervisor/e2e_test.go index 6b089555166b..0ce4f8880991 100644 --- a/cmd/opampsupervisor/e2e_test.go +++ b/cmd/opampsupervisor/e2e_test.go @@ -6,16 +6,22 @@ package main import ( + "bufio" "bytes" "context" "crypto/sha256" + "encoding/json" + "errors" + "fmt" "io" "log" + "net" "net/http" "net/http/httptest" "os" "os/exec" "path" + "path/filepath" "runtime" "strings" "sync/atomic" @@ -23,6 +29,7 @@ import ( "text/template" "time" + "github.com/google/uuid" "github.com/knadh/koanf/parsers/yaml" "github.com/knadh/koanf/providers/file" "github.com/knadh/koanf/providers/rawbytes" @@ -35,9 +42,12 @@ import ( "github.com/stretchr/testify/require" semconv "go.opentelemetry.io/collector/semconv/v1.21.0" "go.uber.org/zap" + "go.uber.org/zap/zapcore" + "google.golang.org/protobuf/proto" "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/opampsupervisor/supervisor" "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/opampsupervisor/supervisor/config" + "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/opampsupervisor/supervisor/telemetry" ) var _ clientTypes.Logger = testLogger{} @@ -55,7 +65,7 @@ func (tl testLogger) Errorf(_ context.Context, format string, args ...any) { } func defaultConnectingHandler(connectionCallbacks server.ConnectionCallbacksStruct) func(request *http.Request) types.ConnectionResponse { - return func(request *http.Request) types.ConnectionResponse { + return func(_ *http.Request) types.ConnectionResponse { return types.ConnectionResponse{ Accept: true, ConnectionCallbacks: connectionCallbacks, @@ -73,10 +83,17 @@ type testingOpAMPServer struct { addr string supervisorConnected chan bool sendToSupervisor func(*protobufs.ServerToAgent) + start func() shutdown func() } func newOpAMPServer(t *testing.T, connectingCallback onConnectingFuncFactory, callbacks server.ConnectionCallbacksStruct) *testingOpAMPServer { + s := newUnstartedOpAMPServer(t, connectingCallback, callbacks) + s.start() + return s +} + +func newUnstartedOpAMPServer(t *testing.T, connectingCallback onConnectingFuncFactory, callbacks server.ConnectionCallbacksStruct) *testingOpAMPServer { var agentConn atomic.Value var isAgentConnected atomic.Bool var didShutdown atomic.Bool @@ -107,7 +124,7 @@ func newOpAMPServer(t *testing.T, connectingCallback onConnectingFuncFactory, ca require.NoError(t, err) mux := http.NewServeMux() mux.HandleFunc("/v1/opamp", handler) - httpSrv := httptest.NewServer(mux) + httpSrv := httptest.NewUnstartedServer(mux) shutdown := func() { if !didShutdown.Load() { @@ -124,7 +141,8 @@ func newOpAMPServer(t *testing.T, connectingCallback onConnectingFuncFactory, ca require.Fail(t, "Agent connection has not been established") } - agentConn.Load().(types.Connection).Send(context.Background(), msg) + err = agentConn.Load().(types.Connection).Send(context.Background(), msg) + require.NoError(t, err) } t.Cleanup(func() { shutdown() @@ -133,13 +151,21 @@ func newOpAMPServer(t *testing.T, connectingCallback onConnectingFuncFactory, ca addr: httpSrv.Listener.Addr().String(), supervisorConnected: connectedChan, sendToSupervisor: send, + start: httpSrv.Start, shutdown: shutdown, } } func newSupervisor(t *testing.T, configType string, extraConfigData map[string]string) *supervisor.Supervisor { cfgFile := getSupervisorConfig(t, configType, extraConfigData) - s, err := supervisor.NewSupervisor(zap.NewNop(), cfgFile.Name()) + + cfg, err := config.Load(cfgFile.Name()) + require.NoError(t, err) + + logger, err := zap.NewDevelopment() + require.NoError(t, err) + + s, err := supervisor.NewSupervisor(logger, cfg) require.NoError(t, err) return s @@ -157,11 +183,12 @@ func getSupervisorConfig(t *testing.T, configType string, extraConfigData map[st if runtime.GOOS == "windows" { extension = ".exe" } + configData := map[string]string{ "goos": runtime.GOOS, "goarch": runtime.GOARCH, "extension": extension, - "storage_dir": t.TempDir(), + "storage_dir": strings.ReplaceAll(t.TempDir(), "\\", "\\\\"), } for key, val := range extraConfigData { @@ -169,7 +196,10 @@ func getSupervisorConfig(t *testing.T, configType string, extraConfigData map[st } err = templ.Execute(&buf, configData) require.NoError(t, err) - cfgFile, _ := os.CreateTemp(t.TempDir(), "config_*.yaml") + cfgFile, err := os.CreateTemp(t.TempDir(), "config_*.yaml") + require.NoError(t, err) + t.Cleanup(func() { cfgFile.Close() }) + _, err = cfgFile.Write(buf.Bytes()) require.NoError(t, err) @@ -195,6 +225,8 @@ func TestSupervisorStartsCollectorWithRemoteConfig(t *testing.T) { }) s := newSupervisor(t, "basic", map[string]string{"url": server.addr}) + + require.Nil(t, s.Start()) defer s.Shutdown() waitForSupervisorConnection(server.supervisorConnected, true) @@ -216,8 +248,9 @@ func TestSupervisorStartsCollectorWithRemoteConfig(t *testing.T) { cfg, ok := agentConfig.Load().(string) if ok { // The effective config may be structurally different compared to what was sent, - // so just check that it includes some strings we know to be unique to the remote config. - return strings.Contains(cfg, inputFile.Name()) && strings.Contains(cfg, outputFile.Name()) + // and will also have some data redacted, + // so just check that it includes the filelog receiver + return strings.Contains(cfg, "filelog") } return false @@ -235,6 +268,147 @@ func TestSupervisorStartsCollectorWithRemoteConfig(t *testing.T) { }, 10*time.Second, 500*time.Millisecond, "Log never appeared in output") } +func TestSupervisorStartsCollectorWithNoOpAMPServer(t *testing.T) { + storageDir := t.TempDir() + remoteConfigFilePath := filepath.Join(storageDir, "last_recv_remote_config.dat") + + cfg, hash, healthcheckPort := createHealthCheckCollectorConf(t) + remoteConfigProto := &protobufs.AgentRemoteConfig{ + Config: &protobufs.AgentConfigMap{ + ConfigMap: map[string]*protobufs.AgentConfigFile{ + "": {Body: cfg.Bytes()}, + }, + }, + ConfigHash: hash, + } + marshalledRemoteConfig, err := proto.Marshal(remoteConfigProto) + require.NoError(t, err) + + require.NoError(t, os.WriteFile(remoteConfigFilePath, marshalledRemoteConfig, 0o600)) + + connected := atomic.Bool{} + server := newUnstartedOpAMPServer(t, defaultConnectingHandler, server.ConnectionCallbacksStruct{ + OnConnectedFunc: func(ctx context.Context, conn types.Connection) { + connected.Store(true) + }, + }) + defer server.shutdown() + + s := newSupervisor(t, "basic", map[string]string{ + "url": server.addr, + "storage_dir": storageDir, + }) + + require.Nil(t, s.Start()) + defer s.Shutdown() + + // Verify the collector runs eventually by pinging the healthcheck extension + require.Eventually(t, func() bool { + resp, err := http.DefaultClient.Get(fmt.Sprintf("http://localhost:%d", healthcheckPort)) + if err != nil { + t.Logf("Failed healthcheck: %s", err) + return false + } + require.NoError(t, resp.Body.Close()) + if resp.StatusCode >= 300 || resp.StatusCode < 200 { + t.Logf("Got non-2xx status code: %d", resp.StatusCode) + return false + } + return true + }, 3*time.Second, 100*time.Millisecond) + + // Start the server and wait for the supervisor to connect + server.start() + + // Verify supervisor connects to server + waitForSupervisorConnection(server.supervisorConnected, true) + + require.True(t, connected.Load(), "Supervisor failed to connect") +} + +func TestSupervisorStartsWithNoOpAMPServer(t *testing.T) { + cfg, hash, inputFile, outputFile := createSimplePipelineCollectorConf(t) + + configuredChan := make(chan struct{}) + connected := atomic.Bool{} + server := newUnstartedOpAMPServer(t, defaultConnectingHandler, server.ConnectionCallbacksStruct{ + OnConnectedFunc: func(ctx context.Context, conn types.Connection) { + connected.Store(true) + }, + OnMessageFunc: func(ctx context.Context, conn types.Connection, message *protobufs.AgentToServer) *protobufs.ServerToAgent { + lastCfgHash := message.GetRemoteConfigStatus().GetLastRemoteConfigHash() + if bytes.Equal(lastCfgHash, hash) { + close(configuredChan) + } + + return &protobufs.ServerToAgent{} + }, + }) + defer server.shutdown() + + // The supervisor is started without a running OpAMP server. + // The supervisor should start successfully, even if the OpAMP server is stopped. + s := newSupervisor(t, "healthcheck_port", map[string]string{ + "url": server.addr, + "healthcheck_port": "12345", + }) + + require.Nil(t, s.Start()) + defer s.Shutdown() + + // Verify the collector is not running after 250 ms by checking the healthcheck endpoint + time.Sleep(250 * time.Millisecond) + _, err := http.DefaultClient.Get("http://localhost:12345") + + if runtime.GOOS != "windows" { + require.ErrorContains(t, err, "connection refused") + } else { + require.ErrorContains(t, err, "No connection could be made") + } + + // Start the server and wait for the supervisor to connect + server.start() + + // Verify supervisor connects to server + waitForSupervisorConnection(server.supervisorConnected, true) + + require.True(t, connected.Load(), "Supervisor failed to connect") + + // Verify that the collector can run a new config sent to it + server.sendToSupervisor(&protobufs.ServerToAgent{ + RemoteConfig: &protobufs.AgentRemoteConfig{ + Config: &protobufs.AgentConfigMap{ + ConfigMap: map[string]*protobufs.AgentConfigFile{ + "": {Body: cfg.Bytes()}, + }, + }, + ConfigHash: hash, + }, + }) + + select { + case <-configuredChan: + case <-time.After(2 * time.Second): + require.FailNow(t, "timed out waiting for collector to reconfigure") + } + + sampleLog := `{"body":"hello, world"}` + n, err := inputFile.WriteString(sampleLog + "\n") + require.NotZero(t, n, "Could not write to input file") + require.NoError(t, err) + + require.Eventually(t, func() bool { + logRecord := make([]byte, 1024) + + n, err = outputFile.Read(logRecord) + if !errors.Is(err, io.EOF) { + require.NoError(t, err) + } + + return n != 0 + }, 10*time.Second, 500*time.Millisecond, "Log never appeared in output") +} + func TestSupervisorRestartsCollectorAfterBadConfig(t *testing.T) { var healthReport atomic.Value var agentConfig atomic.Value @@ -258,6 +432,8 @@ func TestSupervisorRestartsCollectorAfterBadConfig(t *testing.T) { }) s := newSupervisor(t, "basic", map[string]string{"url": server.addr}) + + require.Nil(t, s.Start()) defer s.Shutdown() waitForSupervisorConnection(server.supervisorConnected, true) @@ -334,14 +510,16 @@ func TestSupervisorConfiguresCapabilities(t *testing.T) { }) s := newSupervisor(t, "nocap", map[string]string{"url": server.addr}) + + require.Nil(t, s.Start()) defer s.Shutdown() waitForSupervisorConnection(server.supervisorConnected, true) require.Eventually(t, func() bool { - cap := capabilities.Load() + caps := capabilities.Load() - return cap == uint64(protobufs.AgentCapabilities_AgentCapabilities_ReportsStatus) + return caps == uint64(protobufs.AgentCapabilities_AgentCapabilities_ReportsStatus) }, 5*time.Second, 250*time.Millisecond) } @@ -389,6 +567,8 @@ func TestSupervisorBootstrapsCollector(t *testing.T) { }) s := newSupervisor(t, "nocap", map[string]string{"url": server.addr}) + + require.Nil(t, s.Start()) defer s.Shutdown() waitForSupervisorConnection(server.supervisorConnected, true) @@ -417,6 +597,86 @@ func TestSupervisorBootstrapsCollector(t *testing.T) { }, 5*time.Second, 250*time.Millisecond) } +func TestSupervisorReportsEffectiveConfig(t *testing.T) { + var agentConfig atomic.Value + server := newOpAMPServer( + t, + defaultConnectingHandler, + server.ConnectionCallbacksStruct{ + OnMessageFunc: func(_ context.Context, _ types.Connection, message *protobufs.AgentToServer) *protobufs.ServerToAgent { + if message.EffectiveConfig != nil { + config := message.EffectiveConfig.ConfigMap.ConfigMap[""] + if config != nil { + agentConfig.Store(string(config.Body)) + } + } + + return &protobufs.ServerToAgent{} + }, + }) + + s := newSupervisor(t, "basic", map[string]string{"url": server.addr}) + + require.Nil(t, s.Start()) + defer s.Shutdown() + + waitForSupervisorConnection(server.supervisorConnected, true) + + // Create input and output files so we can "communicate" with a Collector binary. + // The testing package will automatically clean these up after each test. + tempDir := t.TempDir() + testKeyFile, err := os.CreateTemp(tempDir, "confKey") + require.NoError(t, err) + t.Cleanup(func() { testKeyFile.Close() }) + + n, err := testKeyFile.Write([]byte(testKeyFile.Name())) + require.NoError(t, err) + require.NotZero(t, n) + + colCfgTpl, err := os.ReadFile(filepath.Join("testdata", "collector", "split_config.yaml")) + require.NoError(t, err) + + templ, err := template.New("").Parse(string(colCfgTpl)) + require.NoError(t, err) + + var cfg bytes.Buffer + err = templ.Execute( + &cfg, + map[string]string{ + "TestKeyFile": testKeyFile.Name(), + }, + ) + require.NoError(t, err) + + h := sha256.New() + if _, err := io.Copy(h, bytes.NewBuffer(cfg.Bytes())); err != nil { + t.Fatal(err) + } + + server.sendToSupervisor(&protobufs.ServerToAgent{ + RemoteConfig: &protobufs.AgentRemoteConfig{ + Config: &protobufs.AgentConfigMap{ + ConfigMap: map[string]*protobufs.AgentConfigFile{ + "": {Body: cfg.Bytes()}, + }, + }, + ConfigHash: h.Sum(nil), + }, + }) + + require.Eventually(t, func() bool { + cfg, ok := agentConfig.Load().(string) + if ok { + // The effective config may be structurally different compared to what was sent, + // and currently has most values redacted, + // so just check that it includes some strings we know to be unique to the remote config. + return strings.Contains(cfg, "test_key:") + } + + return false + }, 5*time.Second, 500*time.Millisecond, "Collector never reported effective config") +} + func TestSupervisorAgentDescriptionConfigApplies(t *testing.T) { // Load the Supervisor config so we can get the location of // the Collector that will be run. @@ -467,6 +727,8 @@ func TestSupervisorAgentDescriptionConfigApplies(t *testing.T) { }) s := newSupervisor(t, "agent_description", map[string]string{"url": server.addr}) + + require.Nil(t, s.Start()) defer s.Shutdown() waitForSupervisorConnection(server.supervisorConnected, true) @@ -480,7 +742,7 @@ func TestSupervisorAgentDescriptionConfigApplies(t *testing.T) { expectedDescription := &protobufs.AgentDescription{ IdentifyingAttributes: []*protobufs.KeyValue{ stringKeyValue("client.id", "my-client-id"), - stringKeyValue(semconv.AttributeServiceInstanceID, ad.InstanceUid), + stringKeyValue(semconv.AttributeServiceInstanceID, uuid.UUID(ad.InstanceUid).String()), stringKeyValue(semconv.AttributeServiceName, command), stringKeyValue(semconv.AttributeServiceVersion, version), }, @@ -492,7 +754,8 @@ func TestSupervisorAgentDescriptionConfigApplies(t *testing.T) { }, } - require.Equal(t, expectedDescription, ad.AgentDescription) + require.Subset(t, ad.AgentDescription.IdentifyingAttributes, expectedDescription.IdentifyingAttributes) + require.Subset(t, ad.AgentDescription.NonIdentifyingAttributes, expectedDescription.NonIdentifyingAttributes) time.Sleep(250 * time.Millisecond) } @@ -520,9 +783,11 @@ func createSimplePipelineCollectorConf(t *testing.T) (*bytes.Buffer, []byte, *os tempDir := t.TempDir() inputFile, err := os.CreateTemp(tempDir, "input_*.yaml") require.NoError(t, err) + t.Cleanup(func() { inputFile.Close() }) outputFile, err := os.CreateTemp(tempDir, "output_*.yaml") require.NoError(t, err) + t.Cleanup(func() { outputFile.Close() }) colCfgTpl, err := os.ReadFile(path.Join(wd, "testdata", "collector", "simple_pipeline.yaml")) require.NoError(t, err) @@ -560,6 +825,29 @@ func createBadCollectorConf(t *testing.T) (*bytes.Buffer, []byte) { return bytes.NewBuffer(colCfg), h.Sum(nil) } +func createHealthCheckCollectorConf(t *testing.T) (cfg *bytes.Buffer, hash []byte, remotePort int) { + colCfgTpl, err := os.ReadFile(path.Join("testdata", "collector", "healthcheck_config.yaml")) + require.NoError(t, err) + + templ, err := template.New("").Parse(string(colCfgTpl)) + require.NoError(t, err) + + port, err := findRandomPort() + + var confmapBuf bytes.Buffer + err = templ.Execute( + &confmapBuf, + map[string]string{ + "HealthCheckEndpoint": fmt.Sprintf("localhost:%d", port), + }, + ) + require.NoError(t, err) + + h := sha256.Sum256(confmapBuf.Bytes()) + + return &confmapBuf, h[:], port +} + // Wait for the Supervisor to connect to or disconnect from the OpAMP server func waitForSupervisorConnection(connection chan bool, connected bool) { select { @@ -595,6 +883,8 @@ func TestSupervisorRestartCommand(t *testing.T) { }) s := newSupervisor(t, "basic", map[string]string{"url": server.addr}) + + require.Nil(t, s.Start()) defer s.Shutdown() waitForSupervisorConnection(server.supervisorConnected, true) @@ -650,7 +940,7 @@ func TestSupervisorRestartCommand(t *testing.T) { return health.Healthy && health.LastError == "" } return false - }, 10*time.Second, 250*time.Millisecond, "Collector never reported healthy after restart") + }, 30*time.Second, 250*time.Millisecond, "Collector never reported healthy after restart") } func TestSupervisorOpAMPConnectionSettings(t *testing.T) { @@ -661,6 +951,8 @@ func TestSupervisorOpAMPConnectionSettings(t *testing.T) { server.ConnectionCallbacksStruct{}) s := newSupervisor(t, "accepts_conn", map[string]string{"url": initialServer.addr}) + + require.Nil(t, s.Start()) defer s.Shutdown() waitForSupervisorConnection(initialServer.supervisorConnected, true) @@ -672,7 +964,7 @@ func TestSupervisorOpAMPConnectionSettings(t *testing.T) { OnConnectedFunc: func(_ context.Context, _ types.Connection) { connectedToNewServer.Store(true) }, - OnMessageFunc: func(_ context.Context, _ types.Connection, message *protobufs.AgentToServer) *protobufs.ServerToAgent { + OnMessageFunc: func(_ context.Context, _ types.Connection, _ *protobufs.AgentToServer) *protobufs.ServerToAgent { return &protobufs.ServerToAgent{} }, }) @@ -721,6 +1013,8 @@ func TestSupervisorRestartsWithLastReceivedConfig(t *testing.T) { s := newSupervisor(t, "persistence", map[string]string{"url": initialServer.addr, "storage_dir": tempDir}) + require.Nil(t, s.Start()) + waitForSupervisorConnection(initialServer.supervisorConnected, true) cfg, hash, _, _ := createSimplePipelineCollectorConf(t) @@ -763,6 +1057,8 @@ func TestSupervisorRestartsWithLastReceivedConfig(t *testing.T) { defer newServer.shutdown() s1 := newSupervisor(t, "persistence", map[string]string{"url": newServer.addr, "storage_dir": tempDir}) + + require.Nil(t, s1.Start()) defer s1.Shutdown() waitForSupervisorConnection(newServer.supervisorConnected, true) @@ -780,7 +1076,6 @@ func TestSupervisorRestartsWithLastReceivedConfig(t *testing.T) { return strings.Contains(loadedConfig, "filelog") }, 10*time.Second, 500*time.Millisecond, "Collector was not started with the last received remote config") - } func TestSupervisorPersistsInstanceID(t *testing.T) { @@ -788,13 +1083,12 @@ func TestSupervisorPersistsInstanceID(t *testing.T) { // persist and re-use the same instance ID. storageDir := t.TempDir() - agentIDChan := make(chan string, 1) + agentIDChan := make(chan []byte, 1) server := newOpAMPServer( t, defaultConnectingHandler, server.ConnectionCallbacksStruct{ OnMessageFunc: func(_ context.Context, _ types.Connection, message *protobufs.AgentToServer) *protobufs.ServerToAgent { - select { case agentIDChan <- message.InstanceUid: default: @@ -809,18 +1103,20 @@ func TestSupervisorPersistsInstanceID(t *testing.T) { "storage_dir": storageDir, }) + require.Nil(t, s.Start()) + waitForSupervisorConnection(server.supervisorConnected, true) t.Logf("Supervisor connected") - var firstAgentID string + var firstAgentID []byte select { case firstAgentID = <-agentIDChan: case <-time.After(1 * time.Second): t.Fatalf("failed to get first agent ID") } - t.Logf("Got agent ID %s, shutting down supervisor", firstAgentID) + t.Logf("Got agent ID %s, shutting down supervisor", uuid.UUID(firstAgentID)) s.Shutdown() @@ -838,13 +1134,15 @@ func TestSupervisorPersistsInstanceID(t *testing.T) { "url": server.addr, "storage_dir": storageDir, }) + + require.Nil(t, s.Start()) defer s.Shutdown() waitForSupervisorConnection(server.supervisorConnected, true) t.Logf("Supervisor connected") - var secondAgentID string + var secondAgentID []byte select { case secondAgentID = <-agentIDChan: case <-time.After(1 * time.Second): @@ -859,25 +1157,24 @@ func TestSupervisorPersistsNewInstanceID(t *testing.T) { // is properly persisted. storageDir := t.TempDir() - newID := "01HW3GS9NWD840C5C2BZS3KYPW" + newID := uuid.MustParse("018fee23-4a51-7303-a441-73faed7d9deb") - agentIDChan := make(chan string, 1) + agentIDChan := make(chan []byte, 1) server := newOpAMPServer( t, defaultConnectingHandler, server.ConnectionCallbacksStruct{ OnMessageFunc: func(_ context.Context, _ types.Connection, message *protobufs.AgentToServer) *protobufs.ServerToAgent { - select { case agentIDChan <- message.InstanceUid: default: } - if message.InstanceUid != newID { + if !bytes.Equal(message.InstanceUid, newID[:]) { return &protobufs.ServerToAgent{ InstanceUid: message.InstanceUid, AgentIdentification: &protobufs.AgentIdentification{ - NewInstanceUid: newID, + NewInstanceUid: newID[:], }, } } @@ -891,12 +1188,14 @@ func TestSupervisorPersistsNewInstanceID(t *testing.T) { "storage_dir": storageDir, }) + require.Nil(t, s.Start()) + waitForSupervisorConnection(server.supervisorConnected, true) t.Logf("Supervisor connected") for id := range agentIDChan { - if id == newID { + if bytes.Equal(id, newID[:]) { t.Logf("Agent ID was changed to new ID") break } @@ -918,18 +1217,430 @@ func TestSupervisorPersistsNewInstanceID(t *testing.T) { "url": server.addr, "storage_dir": storageDir, }) + + require.Nil(t, s.Start()) defer s.Shutdown() waitForSupervisorConnection(server.supervisorConnected, true) t.Logf("Supervisor connected") - var newRecievedAgentID string + var newRecievedAgentID []byte select { case newRecievedAgentID = <-agentIDChan: case <-time.After(1 * time.Second): t.Fatalf("failed to get second agent ID") } - require.Equal(t, newID, newRecievedAgentID) + require.Equal(t, newID, uuid.UUID(newRecievedAgentID)) +} + +func TestSupervisorWritesAgentFilesToStorageDir(t *testing.T) { + // Tests that the agent logs and effective.yaml are written under the storage directory. + storageDir := t.TempDir() + + server := newOpAMPServer( + t, + defaultConnectingHandler, + server.ConnectionCallbacksStruct{}, + ) + + s := newSupervisor(t, "basic", map[string]string{ + "url": server.addr, + "storage_dir": storageDir, + }) + + require.Nil(t, s.Start()) + + waitForSupervisorConnection(server.supervisorConnected, true) + + t.Logf("Supervisor connected") + + s.Shutdown() + + t.Logf("Supervisor shutdown") + + // Check config and log files are written in storage dir + require.FileExists(t, filepath.Join(storageDir, "agent.log")) + require.FileExists(t, filepath.Join(storageDir, "effective.yaml")) +} + +func TestSupervisorStopsAgentProcessWithEmptyConfigMap(t *testing.T) { + agentCfgChan := make(chan string, 1) + server := newOpAMPServer( + t, + defaultConnectingHandler, + server.ConnectionCallbacksStruct{ + OnMessageFunc: func(_ context.Context, _ types.Connection, message *protobufs.AgentToServer) *protobufs.ServerToAgent { + if message.EffectiveConfig != nil { + config := message.EffectiveConfig.ConfigMap.ConfigMap[""] + if config != nil { + select { + case agentCfgChan <- string(config.Body): + default: + } + } + } + + return &protobufs.ServerToAgent{} + }, + }) + + s := newSupervisor(t, "healthcheck_port", map[string]string{ + "url": server.addr, + "healthcheck_port": "12345", + }) + + require.Nil(t, s.Start()) + defer s.Shutdown() + + waitForSupervisorConnection(server.supervisorConnected, true) + + cfg, hash, _, _ := createSimplePipelineCollectorConf(t) + + server.sendToSupervisor(&protobufs.ServerToAgent{ + RemoteConfig: &protobufs.AgentRemoteConfig{ + Config: &protobufs.AgentConfigMap{ + ConfigMap: map[string]*protobufs.AgentConfigFile{ + "": {Body: cfg.Bytes()}, + }, + }, + ConfigHash: hash, + }, + }) + + select { + case <-agentCfgChan: + case <-time.After(1 * time.Second): + require.FailNow(t, "timed out waitng for agent to report its initial config") + } + + // Use health check endpoint to determine if the collector is actually running + require.Eventually(t, func() bool { + resp, err := http.DefaultClient.Get("http://localhost:12345") + if err != nil { + t.Logf("Failed agent healthcheck request: %s", err) + return false + } + require.NoError(t, resp.Body.Close()) + if resp.StatusCode >= 300 || resp.StatusCode < 200 { + t.Logf("Got non-2xx status code: %d", resp.StatusCode) + return false + } + return true + }, 3*time.Second, 100*time.Millisecond) + + // Send empty config + emptyHash := sha256.Sum256([]byte{}) + server.sendToSupervisor(&protobufs.ServerToAgent{ + RemoteConfig: &protobufs.AgentRemoteConfig{ + Config: &protobufs.AgentConfigMap{ + ConfigMap: map[string]*protobufs.AgentConfigFile{}, + }, + ConfigHash: emptyHash[:], + }, + }) + + select { + case <-agentCfgChan: + case <-time.After(1 * time.Second): + require.FailNow(t, "timed out waitng for agent to report its noop config") + } + + // Verify the collector is not running after 250 ms by checking the healthcheck endpoint + require.EventuallyWithT(t, func(tt *assert.CollectT) { + _, err := http.DefaultClient.Get("http://localhost:12345") + if runtime.GOOS != "windows" { + assert.ErrorContains(tt, err, "connection refused") + } else { + assert.ErrorContains(tt, err, "No connection could be made") + } + }, 3*time.Second, 250*time.Millisecond) +} + +type LogEntry struct { + Level string `json:"level"` + Logger string `json:"logger"` +} + +func TestSupervisorLogging(t *testing.T) { + // Tests that supervisor only logs at Info level and above && that collector logs passthrough and are present in supervisor log file + if runtime.GOOS == "windows" { + t.Skip("Zap does not close the log file and Windows disallows removing files that are still opened.") + } + + storageDir := t.TempDir() + remoteCfgFilePath := filepath.Join(storageDir, "last_recv_remote_config.dat") + + collectorCfg, hash, _, _ := createSimplePipelineCollectorConf(t) + remoteCfgProto := &protobufs.AgentRemoteConfig{ + Config: &protobufs.AgentConfigMap{ + ConfigMap: map[string]*protobufs.AgentConfigFile{ + "": {Body: collectorCfg.Bytes()}, + }, + }, + ConfigHash: hash, + } + marshalledRemoteCfg, err := proto.Marshal(remoteCfgProto) + require.NoError(t, err) + require.NoError(t, os.WriteFile(remoteCfgFilePath, marshalledRemoteCfg, 0o600)) + + connected := atomic.Bool{} + server := newUnstartedOpAMPServer(t, defaultConnectingHandler, server.ConnectionCallbacksStruct{ + OnConnectedFunc: func(ctx context.Context, conn types.Connection) { + connected.Store(true) + }, + }) + defer server.shutdown() + + supervisorLogFilePath := filepath.Join(storageDir, "supervisor_log.log") + cfgFile := getSupervisorConfig(t, "logging", map[string]string{ + "url": server.addr, + "storage_dir": storageDir, + "log_level": "0", + "log_file": supervisorLogFilePath, + }) + + cfg, err := config.Load(cfgFile.Name()) + require.NoError(t, err) + logger, err := telemetry.NewLogger(cfg.Telemetry.Logs) + require.NoError(t, err) + + s, err := supervisor.NewSupervisor(logger, cfg) + require.NoError(t, err) + require.Nil(t, s.Start()) + + // Start the server and wait for the supervisor to connect + server.start() + waitForSupervisorConnection(server.supervisorConnected, true) + require.True(t, connected.Load(), "Supervisor failed to connect") + + s.Shutdown() + + // Read from log file checking for Info level logs + logFile, err := os.Open(supervisorLogFilePath) + require.NoError(t, err) + + scanner := bufio.NewScanner(logFile) + seenCollectorLog := false + for scanner.Scan() { + line := scanner.Bytes() + var log LogEntry + err := json.Unmarshal(line, &log) + require.NoError(t, err) + + level, err := zapcore.ParseLevel(log.Level) + require.NoError(t, err) + require.GreaterOrEqual(t, level, zapcore.InfoLevel) + + if log.Logger == "collector" { + seenCollectorLog = true + } + } + // verify a collector log was read + require.True(t, seenCollectorLog) + require.NoError(t, logFile.Close()) +} + +func TestSupervisorRemoteConfigApplyStatus(t *testing.T) { + var agentConfig atomic.Value + var healthReport atomic.Value + var remoteConfigStatus atomic.Value + server := newOpAMPServer( + t, + defaultConnectingHandler, + server.ConnectionCallbacksStruct{ + OnMessageFunc: func(_ context.Context, _ types.Connection, message *protobufs.AgentToServer) *protobufs.ServerToAgent { + if message.EffectiveConfig != nil { + config := message.EffectiveConfig.ConfigMap.ConfigMap[""] + if config != nil { + agentConfig.Store(string(config.Body)) + } + } + if message.Health != nil { + healthReport.Store(message.Health) + } + if message.RemoteConfigStatus != nil { + remoteConfigStatus.Store(message.RemoteConfigStatus) + } + + return &protobufs.ServerToAgent{} + }, + }) + + s := newSupervisor(t, "report_status", map[string]string{ + "url": server.addr, + "config_apply_timeout": "3s", + }) + require.Nil(t, s.Start()) + defer s.Shutdown() + + waitForSupervisorConnection(server.supervisorConnected, true) + + cfg, hash, inputFile, outputFile := createSimplePipelineCollectorConf(t) + + server.sendToSupervisor(&protobufs.ServerToAgent{ + RemoteConfig: &protobufs.AgentRemoteConfig{ + Config: &protobufs.AgentConfigMap{ + ConfigMap: map[string]*protobufs.AgentConfigFile{ + "": {Body: cfg.Bytes()}, + }, + }, + ConfigHash: hash, + }, + }) + + // Check that the status is set to APPLYING + require.Eventually(t, func() bool { + status, ok := remoteConfigStatus.Load().(*protobufs.RemoteConfigStatus) + return ok && status.Status == protobufs.RemoteConfigStatuses_RemoteConfigStatuses_APPLYING + }, 5*time.Second, 100*time.Millisecond, "Remote config status was not set to APPLYING") + + // Wait for collector to become healthy + require.Eventually(t, func() bool { + health, ok := healthReport.Load().(*protobufs.ComponentHealth) + return ok && health.Healthy + }, 10*time.Second, 10*time.Millisecond, "Collector did not become healthy") + + // Check that the status is set to APPLIED + require.Eventually(t, func() bool { + status, ok := remoteConfigStatus.Load().(*protobufs.RemoteConfigStatus) + return ok && status.Status == protobufs.RemoteConfigStatuses_RemoteConfigStatuses_APPLIED + }, 5*time.Second, 10*time.Millisecond, "Remote config status was not set to APPLIED") + + require.Eventually(t, func() bool { + cfg, ok := agentConfig.Load().(string) + if ok { + // The effective config may be structurally different compared to what was sent, + // and will also have some data redacted, + // so just check that it includes the filelog receiver + return strings.Contains(cfg, "filelog") + } + + return false + }, 5*time.Second, 10*time.Millisecond, "Collector was not started with remote config") + + n, err := inputFile.WriteString("{\"body\":\"hello, world\"}\n") + require.NotZero(t, n, "Could not write to input file") + require.NoError(t, err) + + require.Eventually(t, func() bool { + logRecord := make([]byte, 1024) + n, _ := outputFile.Read(logRecord) + + return n != 0 + }, 10*time.Second, 100*time.Millisecond, "Log never appeared in output") + + // Test with bad configuration + badCfg, badHash := createBadCollectorConf(t) + + server.sendToSupervisor(&protobufs.ServerToAgent{ + RemoteConfig: &protobufs.AgentRemoteConfig{ + Config: &protobufs.AgentConfigMap{ + ConfigMap: map[string]*protobufs.AgentConfigFile{ + "": {Body: badCfg.Bytes()}, + }, + }, + ConfigHash: badHash, + }, + }) + + // Check that the status is set to APPLYING + require.Eventually(t, func() bool { + status, ok := remoteConfigStatus.Load().(*protobufs.RemoteConfigStatus) + return ok && status.Status == protobufs.RemoteConfigStatuses_RemoteConfigStatuses_APPLYING + }, 5*time.Second, 200*time.Millisecond, "Remote config status was not set to APPLYING for bad config") + + // Wait for the health checks to fail + require.Eventually(t, func() bool { + health, ok := healthReport.Load().(*protobufs.ComponentHealth) + return ok && !health.Healthy + }, 30*time.Second, 100*time.Millisecond, "Collector did not become unhealthy with bad config") + + // Check that the status is set to FAILED after failed health checks + require.Eventually(t, func() bool { + status, ok := remoteConfigStatus.Load().(*protobufs.RemoteConfigStatus) + return ok && status.Status == protobufs.RemoteConfigStatuses_RemoteConfigStatuses_FAILED + }, 15*time.Second, 100*time.Millisecond, "Remote config status was not set to FAILED for bad config") +} + +func TestSupervisorOpAmpServerPort(t *testing.T) { + var agentConfig atomic.Value + server := newOpAMPServer( + t, + defaultConnectingHandler, + server.ConnectionCallbacksStruct{ + OnMessageFunc: func(_ context.Context, _ types.Connection, message *protobufs.AgentToServer) *protobufs.ServerToAgent { + if message.EffectiveConfig != nil { + config := message.EffectiveConfig.ConfigMap.ConfigMap[""] + if config != nil { + agentConfig.Store(string(config.Body)) + } + } + + return &protobufs.ServerToAgent{} + }, + }) + + supervisorOpAmpServerPort, err := findRandomPort() + require.NoError(t, err) + + s := newSupervisor(t, "server_port", map[string]string{"url": server.addr, "supervisor_opamp_server_port": fmt.Sprintf("%d", supervisorOpAmpServerPort)}) + + require.Nil(t, s.Start()) + defer s.Shutdown() + + waitForSupervisorConnection(server.supervisorConnected, true) + + cfg, hash, inputFile, outputFile := createSimplePipelineCollectorConf(t) + + server.sendToSupervisor(&protobufs.ServerToAgent{ + RemoteConfig: &protobufs.AgentRemoteConfig{ + Config: &protobufs.AgentConfigMap{ + ConfigMap: map[string]*protobufs.AgentConfigFile{ + "": {Body: cfg.Bytes()}, + }, + }, + ConfigHash: hash, + }, + }) + + require.Eventually(t, func() bool { + cfg, ok := agentConfig.Load().(string) + if ok { + // The effective config may be structurally different compared to what was sent, + // and will also have some data redacted, + // so just check that it includes the filelog receiver + return strings.Contains(cfg, "filelog") + } + + return false + }, 5*time.Second, 500*time.Millisecond, "Collector was not started with remote config") + + n, err := inputFile.WriteString("{\"body\":\"hello, world\"}\n") + require.NotZero(t, n, "Could not write to input file") + require.NoError(t, err) + + require.Eventually(t, func() bool { + logRecord := make([]byte, 1024) + n, _ := outputFile.Read(logRecord) + + return n != 0 + }, 10*time.Second, 500*time.Millisecond, "Log never appeared in output") +} + +func findRandomPort() (int, error) { + l, err := net.Listen("tcp", "localhost:0") + if err != nil { + return 0, err + } + + port := l.Addr().(*net.TCPAddr).Port + + err = l.Close() + if err != nil { + return 0, err + } + + return port, nil } diff --git a/cmd/opampsupervisor/examples/supervisor_darwin.yaml b/cmd/opampsupervisor/examples/supervisor_darwin.yaml index 80d5b8bb5755..c4b9f9f4c9ee 100644 --- a/cmd/opampsupervisor/examples/supervisor_darwin.yaml +++ b/cmd/opampsupervisor/examples/supervisor_darwin.yaml @@ -3,7 +3,7 @@ server: tls: # Disable verification to test locally. # Don't do this in production. - insecure_skip_verify: true + insecure_skip_verify: true # For more TLS settings see config/configtls.ClientConfig capabilities: @@ -15,3 +15,6 @@ capabilities: agent: executable: ../../bin/otelcontribcol_darwin_amd64 + +storage: + directory: . diff --git a/cmd/opampsupervisor/examples/supervisor_linux.yaml b/cmd/opampsupervisor/examples/supervisor_linux.yaml index 00021ece6b40..553f37efb17f 100644 --- a/cmd/opampsupervisor/examples/supervisor_linux.yaml +++ b/cmd/opampsupervisor/examples/supervisor_linux.yaml @@ -3,7 +3,7 @@ server: tls: # Disable verification to test locally. # Don't do this in production. - insecure_skip_verify: true + insecure_skip_verify: true # For more TLS settings see config/configtls.ClientConfig capabilities: @@ -15,3 +15,6 @@ capabilities: agent: executable: ../../bin/otelcontribcol_linux_amd64 + +storage: + directory: . diff --git a/cmd/opampsupervisor/examples/supervisor_windows.yaml b/cmd/opampsupervisor/examples/supervisor_windows.yaml index 13d0a911d78d..a5ff1d0f7ab0 100644 --- a/cmd/opampsupervisor/examples/supervisor_windows.yaml +++ b/cmd/opampsupervisor/examples/supervisor_windows.yaml @@ -3,7 +3,7 @@ server: tls: # Disable verification to test locally. # Don't do this in production. - insecure_skip_verify: true + insecure_skip_verify: true # For more TLS settings see config/configtls.ClientConfig capabilities: @@ -15,3 +15,6 @@ capabilities: agent: executable: ../../bin/otelcontribcol_windows_amd64.exe + +storage: + directory: . diff --git a/cmd/opampsupervisor/go.mod b/cmd/opampsupervisor/go.mod index d4c95b1f90cd..c79e9918355f 100644 --- a/cmd/opampsupervisor/go.mod +++ b/cmd/opampsupervisor/go.mod @@ -1,36 +1,39 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/cmd/opampsupervisor -go 1.21.0 +go 1.22.0 require ( github.com/cenkalti/backoff/v4 v4.3.0 + github.com/google/uuid v1.6.0 + github.com/knadh/koanf/maps v0.1.1 github.com/knadh/koanf/parsers/yaml v0.1.0 - github.com/knadh/koanf/providers/file v0.1.0 + github.com/knadh/koanf/providers/file v1.1.2 github.com/knadh/koanf/providers/rawbytes v0.1.0 - github.com/knadh/koanf/v2 v2.1.1 - github.com/oklog/ulid/v2 v2.1.0 - github.com/open-telemetry/opamp-go v0.14.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/config/configtls v0.102.0 - go.opentelemetry.io/collector/semconv v0.102.0 + github.com/knadh/koanf/v2 v2.1.2 + github.com/open-telemetry/opamp-go v0.17.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/config/configtls v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0 + go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0 + go.opentelemetry.io/collector/semconv v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 - google.golang.org/protobuf v1.34.1 + golang.org/x/sys v0.28.0 + google.golang.org/protobuf v1.35.2 gopkg.in/yaml.v3 v3.0.1 ) require ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/google/go-cmp v0.6.0 // indirect - github.com/gorilla/websocket v1.5.1 // indirect - github.com/knadh/koanf/maps v0.1.1 // indirect + github.com/gorilla/websocket v1.5.3 // indirect + github.com/knadh/koanf/providers/confmap v0.1.0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.18.0 // indirect ) diff --git a/cmd/opampsupervisor/go.sum b/cmd/opampsupervisor/go.sum index 8c656cfca381..c010d36f2f2b 100644 --- a/cmd/opampsupervisor/go.sum +++ b/cmd/opampsupervisor/go.sum @@ -2,26 +2,28 @@ github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK3 github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= -github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/parsers/yaml v0.1.0 h1:ZZ8/iGfRLvKSaMEECEBPM1HQslrZADk8fP1XFUxVI5w= github.com/knadh/koanf/parsers/yaml v0.1.0/go.mod h1:cvbUDC7AL23pImuQP0oRw/hPuccrNBS2bps8asS0CwY= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/providers/file v0.1.0 h1:fs6U7nrV58d3CFAFh8VTde8TM262ObYf3ODrc//Lp+c= -github.com/knadh/koanf/providers/file v0.1.0/go.mod h1:rjJ/nHQl64iYCtAW2QQnF0eSmDEX/YZ/eNFj5yR6BvA= +github.com/knadh/koanf/providers/file v1.1.2 h1:aCC36YGOgV5lTtAFz2qkgtWdeQsgfxUkxDOe+2nQY3w= +github.com/knadh/koanf/providers/file v1.1.2/go.mod h1:/faSBcv2mxPVjFrXck95qeoyoZ5myJ6uxN8OOVNJJCI= github.com/knadh/koanf/providers/rawbytes v0.1.0 h1:dpzgu2KO6uf6oCb4aP05KDmKmAmI51k5pe8RYKQ0qME= github.com/knadh/koanf/providers/rawbytes v0.1.0/go.mod h1:mMTB1/IcJ/yE++A2iEZbY1MLygX7vttU+C+S/YmPu9c= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -30,37 +32,36 @@ github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa1 github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/oklog/ulid/v2 v2.1.0 h1:+9lhoxAP56we25tyYETBBY1YLA2SaoLvUFgrP2miPJU= -github.com/oklog/ulid/v2 v2.1.0/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ= -github.com/open-telemetry/opamp-go v0.14.0 h1:KoziIK+wsFojhUXNTkCSTnCPf0eCMqFAaccOs0HrWIY= -github.com/open-telemetry/opamp-go v0.14.0/go.mod h1:XOGCigljsLSTZ8FfLwvat0M1QDj3conIIgRa77BWrKs= -github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= +github.com/open-telemetry/opamp-go v0.17.0 h1:3R4+B/6Sy8mknLBbzO3gqloqwTT02rCSRcr4ac2B124= +github.com/open-telemetry/opamp-go v0.17.0/go.mod h1:SGDhUoAx7uGutO4ENNMQla/tiSujxgZmMPJXIOPGBdk= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0 h1:AdHaQo/GSSRLJvEFLCMHo02r+u6Ed8j0/MNz7u3noug= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0/go.mod h1:InKYEGFdkwz3H2q648kT6rMCFBhPvevIW9ZbWIY5QR4= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0 h1:upFhnU8EyPp0WMR53mJIdx+UR2EGFOr+ppYKzUCY/Vg= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0/go.mod h1:FhjMWU5nf3IctX27lVZomM5SKMyRywShRsA4/rHoBe8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/cmd/opampsupervisor/main.go b/cmd/opampsupervisor/main.go index b93579842c09..17a62e2033cd 100644 --- a/cmd/opampsupervisor/main.go +++ b/cmd/opampsupervisor/main.go @@ -5,29 +5,50 @@ package main import ( "flag" + "fmt" + "log" "os" "os/signal" - "go.uber.org/zap" - "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/opampsupervisor/supervisor" + "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/opampsupervisor/supervisor/config" + "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/opampsupervisor/supervisor/telemetry" ) func main() { + if err := run(); err != nil { + log.Fatal(err) + } +} + +func runInteractive() error { configFlag := flag.String("config", "", "Path to a supervisor configuration file") flag.Parse() - logger, _ := zap.NewDevelopment() + cfg, err := config.Load(*configFlag) + if err != nil { + return fmt.Errorf("failed to load config: %w", err) + } - supervisor, err := supervisor.NewSupervisor(logger, *configFlag) + logger, err := telemetry.NewLogger(cfg.Telemetry.Logs) if err != nil { - logger.Error(err.Error()) - os.Exit(-1) - return + return fmt.Errorf("failed to create logger: %w", err) + } + + supervisor, err := supervisor.NewSupervisor(logger.Named("supervisor"), cfg) + if err != nil { + return fmt.Errorf("failed to create supervisor: %w", err) + } + + err = supervisor.Start() + if err != nil { + return fmt.Errorf("failed to start supervisor: %w", err) } interrupt := make(chan os.Signal, 1) signal.Notify(interrupt, os.Interrupt) <-interrupt supervisor.Shutdown() + + return nil } diff --git a/cmd/opampsupervisor/main_others.go b/cmd/opampsupervisor/main_others.go new file mode 100644 index 000000000000..e8cec740c72a --- /dev/null +++ b/cmd/opampsupervisor/main_others.go @@ -0,0 +1,10 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +//go:build !windows + +package main + +func run() error { + return runInteractive() +} diff --git a/cmd/opampsupervisor/main_windows.go b/cmd/opampsupervisor/main_windows.go new file mode 100644 index 000000000000..544f065646ad --- /dev/null +++ b/cmd/opampsupervisor/main_windows.go @@ -0,0 +1,70 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +//go:build windows + +package main + +import ( + "errors" + "fmt" + + "golang.org/x/sys/windows" + "golang.org/x/sys/windows/svc" + + "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/opampsupervisor/supervisor" +) + +var ( + kernel32API = windows.NewLazySystemDLL("kernel32.dll") + + allocConsoleProc = kernel32API.NewProc("AllocConsole") + freeConsoleProc = kernel32API.NewProc("FreeConsole") +) + +func run() error { + // always allocate a console in case we're running as service + if err := allocConsole(); err != nil { + if !errors.Is(err, windows.ERROR_ACCESS_DENIED) { + // Per https://learn.microsoft.com/en-us/windows/console/allocconsole#remarks + // AllocConsole fails with this error when there's already a console attached, such as not being ran as service + // ignore this error and only return other errors + return fmt.Errorf("alloc console: %w", err) + } + } + defer func() { + _ = freeConsole() + }() + + // No need to supply service name when startup is invoked through + // the Service Control Manager directly. + if err := svc.Run("", supervisor.NewSvcHandler()); err != nil { + if errors.Is(err, windows.ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) { + // Per https://learn.microsoft.com/en-us/windows/win32/api/winsvc/nf-winsvc-startservicectrldispatchera#return-value + // this means that the process is not running as a service, so run interactively. + + return runInteractive() + } + return fmt.Errorf("failed to start supervisor: %w", err) + } + return nil +} + +// windows services don't get created with a console +// need to allocate a console in order to send CTRL_BREAK_EVENT to agent sub process +func allocConsole() error { + ret, _, err := allocConsoleProc.Call() + if ret == 0 { + return err + } + return nil +} + +// free console once we're done with it +func freeConsole() error { + ret, _, err := freeConsoleProc.Call() + if ret == 0 { + return err + } + return nil +} diff --git a/cmd/opampsupervisor/metadata.yaml b/cmd/opampsupervisor/metadata.yaml index 097313f86fb0..1b13fe07a02c 100644 --- a/cmd/opampsupervisor/metadata.yaml +++ b/cmd/opampsupervisor/metadata.yaml @@ -3,4 +3,4 @@ type: opampsupervisor status: class: cmd codeowners: - active: [evan-bradley, atoulme, tigrannajaryan] \ No newline at end of file + active: [evan-bradley, atoulme, tigrannajaryan] diff --git a/cmd/opampsupervisor/specification/README.md b/cmd/opampsupervisor/specification/README.md index f4404593effd..1214eff9c2a1 100644 --- a/cmd/opampsupervisor/specification/README.md +++ b/cmd/opampsupervisor/specification/README.md @@ -126,6 +126,9 @@ agent: # The interval on which the Collector checks to see if it's been orphaned. orphan_detection_interval: 5s + # The maximum wait duration for retrieving bootstrapping information from the agent + bootstrap_timeout: 3s + # Extra command line flags to pass to the Collector executable. args: @@ -157,9 +160,23 @@ agent: client.id: "01HWWSK84BMT7J45663MBJMTPJ" non_identifying_attributes: custom.attribute: "custom-value" - + + # The port the Collector's health check extension will be configured to use + health_check_port: + + # The port the Supervisor will start its OpAmp server on and the Collector's + # OpAmp extension will connect to + opamp_server_port: + ``` +### Operation When OpAMP Server is Unavailable + +When the supervisor cannot connect to the OpAMP server, the collector will +be run with the last known configuration if a previous configuration is persisted. +If no previous configuration has been persisted, the collector does not run. +The supervisor will continually attempt to reconnect to the OpAMP server with exponential backoff. + ### Executing Collector The Supervisor starts and stops the Collector process as necessary. When @@ -194,6 +211,10 @@ Configuration*](https://github.com/open-telemetry/opamp-spec/blob/main/specifica from the OpAMP Backend, merges it with an optional local config file and writes it to the Collector's config file, then restarts the Collector. +If the remote configuration from the OpAMP Backend contains an empty config map, +the collector will be stopped and will not be run again until a non-empty config map +is received from the OpAMP Backend. + In the future once config file watching is implemented the Collector can reload the config without the need for the Supervisor to restart the Collector process. @@ -234,13 +255,13 @@ configuration. To overcome this problem the Supervisor starts the Collector with an "noop" configuration that collects nothing but allows the opamp extension to be started. The "noop" configuration is a single pipeline -with an OTLP receiver that listens on a random port and a debug -exporter, and the opamp extension. The purpose of the "noop" -configuration is to make sure the Collector starts and the opamp -extension communicates with the Supervisor. +with an nop receiver, a nop exporter, and the opamp extension. +The purpose of the "noop" configuration is to make sure the Collector starts +and the opamp extension communicates with the Supervisor. The Collector is stopped +after the AgentDescription is received from the Collector. Once the initial Collector launch is successful and the remote -configuration is received by the Supervisor the Supervisor restarts the +configuration is received by the Supervisor the Supervisor starts the Collector with the new config. The new config is also cached by the Supervisor in a local file, so that subsequent restarts no longer need to start the Collector using the "noop" configuration. Caching of the @@ -273,7 +294,7 @@ Collector. ### Collector Instance UID The Supervisor maintains a Collector instance_uid (a -[ULID](https://github.com/open-telemetry/opamp-spec/blob/main/specification.md#agenttoserverinstance_uid)). +[UUIDv7](https://www.rfc-editor.org/rfc/rfc9562#section-5.7)). The instance_uid is generated by the Supervisor on the first run or during the Supervisor installation and remains unchanged thereafter. The instance_uid will be used in OpAMP communication. @@ -430,7 +451,7 @@ extensions: # to an extension that implements the Authentication interface. endpoint: - # ULID formatted as a 26 character string in canonical + # UUID formatted as a 36 character string in canonical # representation. Auto-generated on start if missing. # Injected by Supervisor. # Note: can be deprecated after Collector issue #6599 diff --git a/cmd/opampsupervisor/supervisor/commander/commander.go b/cmd/opampsupervisor/supervisor/commander/commander.go index 3445058ee862..1a2e6973f0ec 100644 --- a/cmd/opampsupervisor/supervisor/commander/commander.go +++ b/cmd/opampsupervisor/supervisor/commander/commander.go @@ -4,13 +4,14 @@ package commander import ( + "bufio" "context" "errors" "fmt" "os" "os/exec" + "path/filepath" "sync/atomic" - "syscall" "time" "go.uber.org/zap" @@ -22,7 +23,8 @@ import ( // for the Agent process to finish. type Commander struct { logger *zap.Logger - cfg *config.Agent + cfg config.Agent + logsDir string args []string cmd *exec.Cmd doneCh chan struct{} @@ -30,13 +32,10 @@ type Commander struct { running *atomic.Int64 } -func NewCommander(logger *zap.Logger, cfg *config.Agent, args ...string) (*Commander, error) { - if cfg.Executable == "" { - return nil, errors.New("agent.executable config option must be specified") - } - +func NewCommander(logger *zap.Logger, logsDir string, cfg config.Agent, args ...string) (*Commander, error) { return &Commander{ logger: logger, + logsDir: logsDir, cfg: cfg, args: args, running: &atomic.Int64{}, @@ -73,38 +72,98 @@ func (c *Commander) Start(ctx context.Context) error { c.logger.Debug("Starting agent", zap.String("agent", c.cfg.Executable)) - logFilePath := "agent.log" - logFile, err := os.Create(logFilePath) + c.cmd = exec.CommandContext(ctx, c.cfg.Executable, c.args...) // #nosec G204 + c.cmd.SysProcAttr = sysProcAttrs() + + // PassthroughLogging changes how collector start up happens + if c.cfg.PassthroughLogs { + return c.startWithPassthroughLogging() + } + return c.startNormal() +} + +func (c *Commander) Restart(ctx context.Context) error { + c.logger.Debug("Restarting agent", zap.String("agent", c.cfg.Executable)) + if err := c.Stop(ctx); err != nil { + return err + } + + return c.Start(ctx) +} + +func (c *Commander) startNormal() error { + logFilePath := filepath.Join(c.logsDir, "agent.log") + stdoutFile, err := os.Create(logFilePath) if err != nil { return fmt.Errorf("cannot create %s: %w", logFilePath, err) } - c.cmd = exec.CommandContext(ctx, c.cfg.Executable, c.args...) // #nosec G204 - // Capture standard output and standard error. // https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/21072 - c.cmd.Stdout = logFile - c.cmd.Stderr = logFile + c.cmd.Stdout = stdoutFile + c.cmd.Stderr = stdoutFile if err := c.cmd.Start(); err != nil { - return err + stdoutFile.Close() + return fmt.Errorf("startNormal: %w", err) } c.logger.Debug("Agent process started", zap.Int("pid", c.cmd.Process.Pid)) c.running.Store(1) - go c.watch() + go func() { + defer stdoutFile.Close() + c.watch() + }() return nil } -func (c *Commander) Restart(ctx context.Context) error { - c.logger.Debug("Restarting agent", zap.String("agent", c.cfg.Executable)) - if err := c.Stop(ctx); err != nil { - return err +func (c *Commander) startWithPassthroughLogging() error { + // grab cmd pipes + stdoutPipe, err := c.cmd.StdoutPipe() + if err != nil { + return fmt.Errorf("stdoutPipe: %w", err) + } + stderrPipe, err := c.cmd.StderrPipe() + if err != nil { + return fmt.Errorf("stderrPipe: %w", err) } - return c.Start(ctx) + // start agent + if err := c.cmd.Start(); err != nil { + return fmt.Errorf("start: %w", err) + } + c.running.Store(1) + + colLogger := c.logger.Named("collector") + + // capture agent output + go func() { + scanner := bufio.NewScanner(stdoutPipe) + for scanner.Scan() { + line := scanner.Text() + colLogger.Info(line) + } + if err := scanner.Err(); err != nil { + c.logger.Error("Error reading agent stdout: %w", zap.Error(err)) + } + }() + go func() { + scanner := bufio.NewScanner(stderrPipe) + for scanner.Scan() { + line := scanner.Text() + colLogger.Info(line) + } + if err := scanner.Err(); err != nil { + c.logger.Error("Error reading agent stderr: %w", zap.Error(err)) + } + }() + + c.logger.Debug("Agent process started", zap.Int("pid", c.cmd.Process.Pid)) + + go c.watch() + return nil } func (c *Commander) watch() { @@ -161,7 +220,7 @@ func (c *Commander) Stop(ctx context.Context) error { c.logger.Debug("Stopping agent process", zap.Int("pid", pid)) // Gracefully signal process to stop. - if err := c.cmd.Process.Signal(syscall.SIGTERM); err != nil { + if err := sendShutdownSignal(c.cmd.Process); err != nil { return err } @@ -182,7 +241,7 @@ func (c *Commander) Stop(ctx context.Context) error { c.logger.Debug( "Agent process is not responding to SIGTERM. Sending SIGKILL to kill forcibly.", zap.Int("pid", pid)) - if innerErr = c.cmd.Process.Signal(syscall.SIGKILL); innerErr != nil { + if innerErr = c.cmd.Process.Signal(os.Kill); innerErr != nil { return } }() diff --git a/cmd/opampsupervisor/supervisor/commander/commander_others.go b/cmd/opampsupervisor/supervisor/commander/commander_others.go new file mode 100644 index 000000000000..15fe0f7e97c4 --- /dev/null +++ b/cmd/opampsupervisor/supervisor/commander/commander_others.go @@ -0,0 +1,20 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +//go:build !windows + +package commander + +import ( + "os" + "syscall" +) + +func sendShutdownSignal(process *os.Process) error { + return process.Signal(os.Interrupt) +} + +func sysProcAttrs() *syscall.SysProcAttr { + // On non-windows systems, no extra attributes are needed. + return nil +} diff --git a/cmd/opampsupervisor/supervisor/commander/commander_windows.go b/cmd/opampsupervisor/supervisor/commander/commander_windows.go new file mode 100644 index 000000000000..4f2812903462 --- /dev/null +++ b/cmd/opampsupervisor/supervisor/commander/commander_windows.go @@ -0,0 +1,41 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +//go:build windows + +package commander + +import ( + "fmt" + "os" + "syscall" + + "golang.org/x/sys/windows" +) + +var ( + kernel32API = windows.NewLazySystemDLL("kernel32.dll") + + ctrlEventProc = kernel32API.NewProc("GenerateConsoleCtrlEvent") +) + +func sendShutdownSignal(process *os.Process) error { + // signaling with os.Interrupt is not supported on windows systems, + // so we need to use the windows API to properly send a graceful shutdown signal. + // See: https://learn.microsoft.com/en-us/windows/console/generateconsolectrlevent + r, _, e := ctrlEventProc.Call(syscall.CTRL_BREAK_EVENT, uintptr(process.Pid)) + if r == 0 { + return fmt.Errorf("sendShutdownSignal to PID '%d': %w", process.Pid, e) + } + + return nil +} + +func sysProcAttrs() *syscall.SysProcAttr { + // By default, a ctrl-break event applies to a whole process group, which ends up + // shutting down the supervisor. Instead, we spawn the collector in its own process + // group, so that sending a ctrl-break event shuts down just the collector. + return &syscall.SysProcAttr{ + CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP, + } +} diff --git a/cmd/opampsupervisor/supervisor/config/config.go b/cmd/opampsupervisor/supervisor/config/config.go index a77b642d5586..d3ce5beaa6b0 100644 --- a/cmd/opampsupervisor/supervisor/config/config.go +++ b/cmd/opampsupervisor/supervisor/config/config.go @@ -4,75 +4,262 @@ package config import ( + "context" + "errors" + "fmt" "net/http" + "net/url" "os" "path/filepath" "runtime" "time" + "github.com/open-telemetry/opamp-go/protobufs" "go.opentelemetry.io/collector/config/configtls" + "go.opentelemetry.io/collector/confmap" + "go.opentelemetry.io/collector/confmap/provider/envprovider" + "go.opentelemetry.io/collector/confmap/provider/fileprovider" + "go.uber.org/zap/zapcore" ) // Supervisor is the Supervisor config file format. type Supervisor struct { - Server *OpAMPServer - Agent *Agent - Capabilities *Capabilities `mapstructure:"capabilities"` - Storage Storage `mapstructure:"storage"` + Server OpAMPServer `mapstructure:"server"` + Agent Agent `mapstructure:"agent"` + Capabilities Capabilities `mapstructure:"capabilities"` + Storage Storage `mapstructure:"storage"` + Telemetry Telemetry `mapstructure:"telemetry"` } -type Storage struct { - // Directory is the directory where the Supervisor will store its data. - Directory string `mapstructure:"directory"` +// Load loads the Supervisor config from a file. +func Load(configFile string) (Supervisor, error) { + if configFile == "" { + return Supervisor{}, errors.New("path to config file cannot be empty") + } + + resolverSettings := confmap.ResolverSettings{ + URIs: []string{configFile}, + ProviderFactories: []confmap.ProviderFactory{ + fileprovider.NewFactory(), + envprovider.NewFactory(), + }, + ConverterFactories: []confmap.ConverterFactory{}, + DefaultScheme: "env", + } + + resolver, err := confmap.NewResolver(resolverSettings) + if err != nil { + return Supervisor{}, err + } + + conf, err := resolver.Resolve(context.Background()) + if err != nil { + return Supervisor{}, err + } + + cfg := DefaultSupervisor() + if err = conf.Unmarshal(&cfg); err != nil { + return Supervisor{}, err + } + + if err := cfg.Validate(); err != nil { + return Supervisor{}, fmt.Errorf("cannot validate supervisor config %s: %w", configFile, err) + } + + return cfg, nil } -// DirectoryOrDefault returns the configured storage directory if it was configured, -// otherwise it returns the system default. -func (s Storage) DirectoryOrDefault() string { - if s.Directory == "" { - switch runtime.GOOS { - case "windows": - // Windows default is "%ProgramData%\Otelcol\Supervisor" - // If the ProgramData environment variable is not set, - // it falls back to C:\ProgramData - programDataDir := os.Getenv("ProgramData") - if programDataDir == "" { - programDataDir = `C:\ProgramData` - } - return filepath.Join(programDataDir, "Otelcol", "Supervisor") - default: - // Default for non-windows systems - return "/var/lib/otelcol/supervisor" - } +func (s Supervisor) Validate() error { + if err := s.Server.Validate(); err != nil { + return err + } + + if err := s.Agent.Validate(); err != nil { + return err } - return s.Directory + return nil +} + +type Storage struct { + // Directory is the directory where the Supervisor will store its data. + Directory string `mapstructure:"directory"` } // Capabilities is the set of capabilities that the Supervisor supports. type Capabilities struct { - AcceptsRemoteConfig *bool `mapstructure:"accepts_remote_config"` - AcceptsRestartCommand *bool `mapstructure:"accepts_restart_command"` - AcceptsOpAMPConnectionSettings *bool `mapstructure:"accepts_opamp_connection_settings"` - ReportsEffectiveConfig *bool `mapstructure:"reports_effective_config"` - ReportsOwnMetrics *bool `mapstructure:"reports_own_metrics"` - ReportsHealth *bool `mapstructure:"reports_health"` - ReportsRemoteConfig *bool `mapstructure:"reports_remote_config"` + AcceptsRemoteConfig bool `mapstructure:"accepts_remote_config"` + AcceptsRestartCommand bool `mapstructure:"accepts_restart_command"` + AcceptsOpAMPConnectionSettings bool `mapstructure:"accepts_opamp_connection_settings"` + ReportsEffectiveConfig bool `mapstructure:"reports_effective_config"` + ReportsOwnMetrics bool `mapstructure:"reports_own_metrics"` + ReportsHealth bool `mapstructure:"reports_health"` + ReportsRemoteConfig bool `mapstructure:"reports_remote_config"` +} + +func (c Capabilities) SupportedCapabilities() protobufs.AgentCapabilities { + supportedCapabilities := protobufs.AgentCapabilities_AgentCapabilities_ReportsStatus + + if c.ReportsEffectiveConfig { + supportedCapabilities |= protobufs.AgentCapabilities_AgentCapabilities_ReportsEffectiveConfig + } + + if c.ReportsHealth { + supportedCapabilities |= protobufs.AgentCapabilities_AgentCapabilities_ReportsHealth + } + + if c.ReportsOwnMetrics { + supportedCapabilities |= protobufs.AgentCapabilities_AgentCapabilities_ReportsOwnMetrics + } + + if c.AcceptsRemoteConfig { + supportedCapabilities |= protobufs.AgentCapabilities_AgentCapabilities_AcceptsRemoteConfig + } + + if c.ReportsRemoteConfig { + supportedCapabilities |= protobufs.AgentCapabilities_AgentCapabilities_ReportsRemoteConfig + } + + if c.AcceptsRestartCommand { + supportedCapabilities |= protobufs.AgentCapabilities_AgentCapabilities_AcceptsRestartCommand + } + + if c.AcceptsOpAMPConnectionSettings { + supportedCapabilities |= protobufs.AgentCapabilities_AgentCapabilities_AcceptsOpAMPConnectionSettings + } + + return supportedCapabilities } type OpAMPServer struct { - Endpoint string - Headers http.Header + Endpoint string `mapstructure:"endpoint"` + Headers http.Header `mapstructure:"headers"` TLSSetting configtls.ClientConfig `mapstructure:"tls,omitempty"` } +func (o OpAMPServer) Validate() error { + if o.Endpoint == "" { + return errors.New("server::endpoint must be specified") + } + + url, err := url.Parse(o.Endpoint) + if err != nil { + return fmt.Errorf("invalid URL for server::endpoint: %w", err) + } + + switch url.Scheme { + case "http", "https", "ws", "wss": + default: + return fmt.Errorf(`invalid scheme %q for server::endpoint, must be one of "http", "https", "ws", or "wss"`, url.Scheme) + } + + err = o.TLSSetting.Validate() + if err != nil { + return fmt.Errorf("invalid server::tls settings: %w", err) + } + + return nil +} + type Agent struct { - Executable string + Executable string `mapstructure:"executable"` OrphanDetectionInterval time.Duration `mapstructure:"orphan_detection_interval"` Description AgentDescription `mapstructure:"description"` + ConfigApplyTimeout time.Duration `mapstructure:"config_apply_timeout"` + BootstrapTimeout time.Duration `mapstructure:"bootstrap_timeout"` + HealthCheckPort int `mapstructure:"health_check_port"` + OpAMPServerPort int `mapstructure:"opamp_server_port"` + PassthroughLogs bool `mapstructure:"passthrough_logs"` +} + +func (a Agent) Validate() error { + if a.OrphanDetectionInterval <= 0 { + return errors.New("agent::orphan_detection_interval must be positive") + } + + if a.BootstrapTimeout <= 0 { + return errors.New("agent::bootstrap_timeout must be positive") + } + + if a.HealthCheckPort < 0 || a.HealthCheckPort > 65535 { + return errors.New("agent::health_check_port must be a valid port number") + } + + if a.OpAMPServerPort < 0 || a.OpAMPServerPort > 65535 { + return errors.New("agent::opamp_server_port must be a valid port number") + } + + if a.Executable == "" { + return errors.New("agent::executable must be specified") + } + + _, err := os.Stat(a.Executable) + if err != nil { + return fmt.Errorf("could not stat agent::executable path: %w", err) + } + + if a.ConfigApplyTimeout <= 0 { + return errors.New("agent::config_apply_timeout must be valid duration") + } + + return nil } type AgentDescription struct { IdentifyingAttributes map[string]string `mapstructure:"identifying_attributes"` NonIdentifyingAttributes map[string]string `mapstructure:"non_identifying_attributes"` } + +type Telemetry struct { + // TODO: Add more telemetry options + // Issue here: https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/35582 + Logs Logs `mapstructure:"logs"` +} + +type Logs struct { + Level zapcore.Level `mapstructure:"level"` + OutputPaths []string `mapstructure:"output_paths"` +} + +// DefaultSupervisor returns the default supervisor config +func DefaultSupervisor() Supervisor { + defaultStorageDir := "/var/lib/otelcol/supervisor" + if runtime.GOOS == "windows" { + // Windows default is "%ProgramData%\Otelcol\Supervisor" + // If the ProgramData environment variable is not set, + // it falls back to C:\ProgramData + programDataDir := os.Getenv("ProgramData") + if programDataDir == "" { + programDataDir = `C:\ProgramData` + } + + defaultStorageDir = filepath.Join(programDataDir, "Otelcol", "Supervisor") + } + + return Supervisor{ + Capabilities: Capabilities{ + AcceptsRemoteConfig: false, + AcceptsRestartCommand: false, + AcceptsOpAMPConnectionSettings: false, + ReportsEffectiveConfig: true, + ReportsOwnMetrics: true, + ReportsHealth: true, + ReportsRemoteConfig: false, + }, + Storage: Storage{ + Directory: defaultStorageDir, + }, + Agent: Agent{ + OrphanDetectionInterval: 5 * time.Second, + ConfigApplyTimeout: 5 * time.Second, + BootstrapTimeout: 3 * time.Second, + PassthroughLogs: false, + }, + Telemetry: Telemetry{ + Logs: Logs{ + Level: zapcore.InfoLevel, + OutputPaths: []string{"stderr"}, + }, + }, + } +} diff --git a/cmd/opampsupervisor/supervisor/config/config_test.go b/cmd/opampsupervisor/supervisor/config/config_test.go new file mode 100644 index 000000000000..728654f1741d --- /dev/null +++ b/cmd/opampsupervisor/supervisor/config/config_test.go @@ -0,0 +1,742 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package config + +import ( + "errors" + "fmt" + "net/http" + "os" + "path/filepath" + "testing" + "time" + + "github.com/open-telemetry/opamp-go/protobufs" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/config/configtls" + "go.uber.org/zap/zapcore" +) + +func TestValidate(t *testing.T) { + testCases := []struct { + name string + config Supervisor + expectedError string + }{ + { + name: "Valid filled out config", + config: Supervisor{ + Server: OpAMPServer{ + Endpoint: "wss://localhost:9090/opamp", + Headers: http.Header{ + "Header1": []string{"HeaderValue"}, + }, + TLSSetting: configtls.ClientConfig{ + Insecure: true, + }, + }, + Agent: Agent{ + Executable: "${file_path}", + OrphanDetectionInterval: 5 * time.Second, + ConfigApplyTimeout: 2 * time.Second, + BootstrapTimeout: 5 * time.Second, + }, + Capabilities: Capabilities{ + AcceptsRemoteConfig: true, + }, + Storage: Storage{ + Directory: "/etc/opamp-supervisor/storage", + }, + }, + }, + { + name: "Endpoint unspecified", + config: Supervisor{ + Server: OpAMPServer{ + Headers: http.Header{ + "Header1": []string{"HeaderValue"}, + }, + TLSSetting: configtls.ClientConfig{ + Insecure: true, + }, + }, + Agent: Agent{ + Executable: "${file_path}", + ConfigApplyTimeout: 2 * time.Second, + OrphanDetectionInterval: 5 * time.Second, + }, + Capabilities: Capabilities{ + AcceptsRemoteConfig: true, + }, + Storage: Storage{ + Directory: "/etc/opamp-supervisor/storage", + }, + }, + expectedError: "server::endpoint must be specified", + }, + { + name: "Invalid URL", + config: Supervisor{ + Server: OpAMPServer{ + Endpoint: "\000", + Headers: http.Header{ + "Header1": []string{"HeaderValue"}, + }, + TLSSetting: configtls.ClientConfig{ + Insecure: true, + }, + }, + Agent: Agent{ + Executable: "${file_path}", + ConfigApplyTimeout: 2 * time.Second, + OrphanDetectionInterval: 5 * time.Second, + }, + Capabilities: Capabilities{ + AcceptsRemoteConfig: true, + }, + Storage: Storage{ + Directory: "/etc/opamp-supervisor/storage", + }, + }, + expectedError: "invalid URL for server::endpoint:", + }, + { + name: "Invalid endpoint scheme", + config: Supervisor{ + Server: OpAMPServer{ + Endpoint: "tcp://localhost:9090/opamp", + Headers: http.Header{ + "Header1": []string{"HeaderValue"}, + }, + TLSSetting: configtls.ClientConfig{ + Insecure: true, + }, + }, + Agent: Agent{ + Executable: "${file_path}", + ConfigApplyTimeout: 2 * time.Second, + OrphanDetectionInterval: 5 * time.Second, + }, + Capabilities: Capabilities{ + AcceptsRemoteConfig: true, + }, + Storage: Storage{ + Directory: "/etc/opamp-supervisor/storage", + }, + }, + expectedError: `invalid scheme "tcp" for server::endpoint, must be one of "http", "https", "ws", or "wss"`, + }, + { + name: "Invalid tls settings", + config: Supervisor{ + Server: OpAMPServer{ + Endpoint: "wss://localhost:9090/opamp", + Headers: http.Header{ + "Header1": []string{"HeaderValue"}, + }, + TLSSetting: configtls.ClientConfig{ + Insecure: true, + Config: configtls.Config{ + MaxVersion: "1.2", + MinVersion: "1.3", + }, + }, + }, + Agent: Agent{ + Executable: "${file_path}", + ConfigApplyTimeout: 2 * time.Second, + OrphanDetectionInterval: 5 * time.Second, + }, + Capabilities: Capabilities{ + AcceptsRemoteConfig: true, + }, + Storage: Storage{ + Directory: "/etc/opamp-supervisor/storage", + }, + }, + expectedError: "invalid server::tls settings:", + }, + { + name: "Empty agent executable path", + config: Supervisor{ + Server: OpAMPServer{ + Endpoint: "wss://localhost:9090/opamp", + Headers: http.Header{ + "Header1": []string{"HeaderValue"}, + }, + TLSSetting: configtls.ClientConfig{ + Insecure: true, + }, + }, + Agent: Agent{ + Executable: "", + OrphanDetectionInterval: 5 * time.Second, + ConfigApplyTimeout: 2 * time.Second, + BootstrapTimeout: 5 * time.Second, + }, + Capabilities: Capabilities{ + AcceptsRemoteConfig: true, + }, + Storage: Storage{ + Directory: "/etc/opamp-supervisor/storage", + }, + }, + expectedError: "agent::executable must be specified", + }, + { + name: "agent executable does not exist", + config: Supervisor{ + Server: OpAMPServer{ + Endpoint: "wss://localhost:9090/opamp", + Headers: http.Header{ + "Header1": []string{"HeaderValue"}, + }, + TLSSetting: configtls.ClientConfig{ + Insecure: true, + }, + }, + Agent: Agent{ + Executable: "./path/does/not/exist", + OrphanDetectionInterval: 5 * time.Second, + ConfigApplyTimeout: 2 * time.Second, + BootstrapTimeout: 5 * time.Second, + }, + Capabilities: Capabilities{ + AcceptsRemoteConfig: true, + }, + Storage: Storage{ + Directory: "/etc/opamp-supervisor/storage", + }, + }, + expectedError: "could not stat agent::executable path:", + }, + { + name: "Invalid orphan detection interval", + config: Supervisor{ + Server: OpAMPServer{ + Endpoint: "wss://localhost:9090/opamp", + Headers: http.Header{ + "Header1": []string{"HeaderValue"}, + }, + TLSSetting: configtls.ClientConfig{ + Insecure: true, + }, + }, + Agent: Agent{ + Executable: "${file_path}", + ConfigApplyTimeout: 2 * time.Second, + OrphanDetectionInterval: -1, + }, + Capabilities: Capabilities{ + AcceptsRemoteConfig: true, + }, + Storage: Storage{ + Directory: "/etc/opamp-supervisor/storage", + }, + }, + expectedError: "agent::orphan_detection_interval must be positive", + }, + { + name: "Invalid health check port number", + config: Supervisor{ + Server: OpAMPServer{ + Endpoint: "wss://localhost:9090/opamp", + Headers: http.Header{ + "Header1": []string{"HeaderValue"}, + }, + TLSSetting: configtls.ClientConfig{ + Insecure: true, + }, + }, + Agent: Agent{ + Executable: "${file_path}", + OrphanDetectionInterval: 5 * time.Second, + HealthCheckPort: 65536, + ConfigApplyTimeout: 2 * time.Second, + BootstrapTimeout: 5 * time.Second, + }, + Capabilities: Capabilities{ + AcceptsRemoteConfig: true, + }, + Storage: Storage{ + Directory: "/etc/opamp-supervisor/storage", + }, + }, + expectedError: "agent::health_check_port must be a valid port number", + }, + { + name: "Zero value health check port number", + config: Supervisor{ + Server: OpAMPServer{ + Endpoint: "wss://localhost:9090/opamp", + Headers: http.Header{ + "Header1": []string{"HeaderValue"}, + }, + TLSSetting: configtls.ClientConfig{ + Insecure: true, + }, + }, + Agent: Agent{ + Executable: "${file_path}", + OrphanDetectionInterval: 5 * time.Second, + HealthCheckPort: 0, + ConfigApplyTimeout: 2 * time.Second, + BootstrapTimeout: 5 * time.Second, + }, + Capabilities: Capabilities{ + AcceptsRemoteConfig: true, + }, + Storage: Storage{ + Directory: "/etc/opamp-supervisor/storage", + }, + }, + }, + { + name: "Normal health check port number", + config: Supervisor{ + Server: OpAMPServer{ + Endpoint: "wss://localhost:9090/opamp", + Headers: http.Header{ + "Header1": []string{"HeaderValue"}, + }, + TLSSetting: configtls.ClientConfig{ + Insecure: true, + }, + }, + Agent: Agent{ + Executable: "${file_path}", + OrphanDetectionInterval: 5 * time.Second, + HealthCheckPort: 29848, + ConfigApplyTimeout: 2 * time.Second, + BootstrapTimeout: 5 * time.Second, + }, + Capabilities: Capabilities{ + AcceptsRemoteConfig: true, + }, + Storage: Storage{ + Directory: "/etc/opamp-supervisor/storage", + }, + }, + }, + { + name: "config with invalid agent bootstrap timeout", + config: Supervisor{ + Server: OpAMPServer{ + Endpoint: "wss://localhost:9090/opamp", + Headers: http.Header{ + "Header1": []string{"HeaderValue"}, + }, + TLSSetting: configtls.ClientConfig{ + Insecure: true, + }, + }, + Agent: Agent{ + Executable: "${file_path}", + OrphanDetectionInterval: 5 * time.Second, + ConfigApplyTimeout: 2 * time.Second, + BootstrapTimeout: -5 * time.Second, + }, + Capabilities: Capabilities{ + AcceptsRemoteConfig: true, + }, + Storage: Storage{ + Directory: "/etc/opamp-supervisor/storage", + }, + }, + expectedError: "agent::bootstrap_timeout must be positive", + }, + { + name: "Invalid opamp server port number", + config: Supervisor{ + Server: OpAMPServer{ + Endpoint: "wss://localhost:9090/opamp", + Headers: http.Header{ + "Header1": []string{"HeaderValue"}, + }, + }, + Agent: Agent{ + Executable: "${file_path}", + OrphanDetectionInterval: 5 * time.Second, + ConfigApplyTimeout: 2 * time.Second, + OpAMPServerPort: 65536, + BootstrapTimeout: 5 * time.Second, + }, + Capabilities: Capabilities{ + AcceptsRemoteConfig: true, + }, + Storage: Storage{ + Directory: "/etc/opamp-supervisor/storage", + }, + }, + expectedError: "agent::opamp_server_port must be a valid port number", + }, + { + name: "Zero value opamp server port number", + config: Supervisor{ + Server: OpAMPServer{ + Endpoint: "wss://localhost:9090/opamp", + Headers: http.Header{ + "Header1": []string{"HeaderValue"}, + }, + }, + Agent: Agent{ + Executable: "${file_path}", + OrphanDetectionInterval: 5 * time.Second, + ConfigApplyTimeout: 2 * time.Second, + OpAMPServerPort: 0, + BootstrapTimeout: 5 * time.Second, + }, + Capabilities: Capabilities{ + AcceptsRemoteConfig: true, + }, + Storage: Storage{ + Directory: "/etc/opamp-supervisor/storage", + }, + }, + }, + { + name: "Invalid config apply timeout", + config: Supervisor{ + Server: OpAMPServer{ + Endpoint: "wss://localhost:9090/opamp", + Headers: http.Header{ + "Header1": []string{"HeaderValue"}, + }, + TLSSetting: configtls.ClientConfig{ + Insecure: true, + }, + }, + Agent: Agent{ + Executable: "${file_path}", + OrphanDetectionInterval: 5 * time.Second, + OpAMPServerPort: 8080, + BootstrapTimeout: 5 * time.Second, + }, + Capabilities: Capabilities{ + AcceptsRemoteConfig: true, + }, + Storage: Storage{ + Directory: "/etc/opamp-supervisor/storage", + }, + }, + expectedError: "agent::config_apply_timeout must be valid duration", + }, + } + + // create some fake files for validating agent config + tmpDir := t.TempDir() + + filePath := filepath.Join(tmpDir, "file") + require.NoError(t, os.WriteFile(filePath, []byte{}, 0o600)) + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + // Fill in path to agent executable + tc.config.Agent.Executable = os.Expand(tc.config.Agent.Executable, + func(s string) string { + if s == "file_path" { + return filePath + } + return "" + }) + + err := tc.config.Validate() + + if tc.expectedError == "" { + require.NoError(t, err) + } else { + require.ErrorContains(t, err, tc.expectedError) + } + }) + } +} + +func TestCapabilities_SupportedCapabilities(t *testing.T) { + testCases := []struct { + name string + capabilities Capabilities + expectedAgentCapabilities protobufs.AgentCapabilities + }{ + { + name: "Default capabilities", + capabilities: DefaultSupervisor().Capabilities, + expectedAgentCapabilities: protobufs.AgentCapabilities_AgentCapabilities_ReportsStatus | + protobufs.AgentCapabilities_AgentCapabilities_ReportsOwnMetrics | + protobufs.AgentCapabilities_AgentCapabilities_ReportsEffectiveConfig | + protobufs.AgentCapabilities_AgentCapabilities_ReportsHealth, + }, + { + name: "Empty capabilities", + capabilities: Capabilities{}, + expectedAgentCapabilities: protobufs.AgentCapabilities_AgentCapabilities_ReportsStatus, + }, + { + name: "Many capabilities", + capabilities: Capabilities{ + AcceptsRemoteConfig: true, + AcceptsRestartCommand: true, + AcceptsOpAMPConnectionSettings: true, + ReportsEffectiveConfig: true, + ReportsOwnMetrics: true, + ReportsHealth: true, + ReportsRemoteConfig: true, + }, + expectedAgentCapabilities: protobufs.AgentCapabilities_AgentCapabilities_ReportsStatus | + protobufs.AgentCapabilities_AgentCapabilities_ReportsEffectiveConfig | + protobufs.AgentCapabilities_AgentCapabilities_ReportsHealth | + protobufs.AgentCapabilities_AgentCapabilities_ReportsOwnMetrics | + protobufs.AgentCapabilities_AgentCapabilities_AcceptsRemoteConfig | + protobufs.AgentCapabilities_AgentCapabilities_ReportsRemoteConfig | + protobufs.AgentCapabilities_AgentCapabilities_AcceptsRestartCommand | + protobufs.AgentCapabilities_AgentCapabilities_AcceptsOpAMPConnectionSettings, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + require.Equal(t, tc.expectedAgentCapabilities, tc.capabilities.SupportedCapabilities()) + }) + } +} + +func TestLoad(t *testing.T) { + tmpDir, err := os.MkdirTemp(os.TempDir(), "*") + require.NoError(t, err) + + t.Cleanup(func() { + require.NoError(t, os.Chmod(tmpDir, 0o700)) + require.NoError(t, os.RemoveAll(tmpDir)) + }) + + executablePath := filepath.Join(tmpDir, "binary") + err = os.WriteFile(executablePath, []byte{}, 0o600) + require.NoError(t, err) + + testCases := []struct { + desc string + testFunc func(t *testing.T) + }{ + { + desc: "Minimal Config Supervisor", + testFunc: func(t *testing.T) { + config := ` +server: + endpoint: ws://localhost/v1/opamp + +agent: + executable: %s +` + config = fmt.Sprintf(config, executablePath) + + expected := Supervisor{ + Server: OpAMPServer{ + Endpoint: "ws://localhost/v1/opamp", + }, + Capabilities: DefaultSupervisor().Capabilities, + Storage: DefaultSupervisor().Storage, + Agent: Agent{ + Executable: executablePath, + OrphanDetectionInterval: DefaultSupervisor().Agent.OrphanDetectionInterval, + ConfigApplyTimeout: DefaultSupervisor().Agent.ConfigApplyTimeout, + BootstrapTimeout: DefaultSupervisor().Agent.BootstrapTimeout, + }, + Telemetry: DefaultSupervisor().Telemetry, + } + + cfgPath := setupSupervisorConfigFile(t, tmpDir, config) + runSupervisorConfigLoadTest(t, cfgPath, expected, nil) + }, + }, + { + desc: "Full Config Supervisor", + testFunc: func(t *testing.T) { + config := ` +server: + endpoint: ws://localhost/v1/opamp + tls: + insecure: true + +capabilities: + reports_effective_config: false + reports_own_metrics: false + reports_health: false + accepts_remote_config: true + reports_remote_config: true + accepts_restart_command: true + accepts_opamp_connection_settings: true + +storage: + directory: %s + +agent: + executable: %s + description: + identifying_attributes: + "service.name": "io.opentelemetry.collector" + non_identifying_attributes: + "os.type": darwin + orphan_detection_interval: 10s + config_apply_timeout: 8s + bootstrap_timeout: 8s + health_check_port: 8089 + opamp_server_port: 8090 + passthrough_logs: true + +telemetry: + logs: + level: warn + output_paths: ["stdout"] +` + config = fmt.Sprintf(config, filepath.Join(tmpDir, "storage"), executablePath) + + expected := Supervisor{ + Server: OpAMPServer{ + Endpoint: "ws://localhost/v1/opamp", + TLSSetting: configtls.ClientConfig{ + Insecure: true, + }, + }, + Capabilities: Capabilities{ + ReportsEffectiveConfig: false, + ReportsOwnMetrics: false, + ReportsHealth: false, + AcceptsRemoteConfig: true, + ReportsRemoteConfig: true, + AcceptsRestartCommand: true, + AcceptsOpAMPConnectionSettings: true, + }, + Storage: Storage{ + Directory: filepath.Join(tmpDir, "storage"), + }, + Agent: Agent{ + Executable: executablePath, + Description: AgentDescription{ + IdentifyingAttributes: map[string]string{ + "service.name": "io.opentelemetry.collector", + }, + NonIdentifyingAttributes: map[string]string{ + "os.type": "darwin", + }, + }, + OrphanDetectionInterval: 10 * time.Second, + ConfigApplyTimeout: 8 * time.Second, + BootstrapTimeout: 8 * time.Second, + HealthCheckPort: 8089, + OpAMPServerPort: 8090, + PassthroughLogs: true, + }, + Telemetry: Telemetry{ + Logs: Logs{ + Level: zapcore.WarnLevel, + OutputPaths: []string{"stdout"}, + }, + }, + } + + cfgPath := setupSupervisorConfigFile(t, tmpDir, config) + runSupervisorConfigLoadTest(t, cfgPath, expected, nil) + }, + }, + { + desc: "Environment Variable Config Supervisor", + testFunc: func(t *testing.T) { + config := ` +server: + endpoint: ${TEST_ENDPOINT} + +agent: + executable: ${TEST_EXECUTABLE_PATH} +` + expected := Supervisor{ + Server: OpAMPServer{ + Endpoint: "ws://localhost/v1/opamp", + }, + Capabilities: DefaultSupervisor().Capabilities, + Storage: DefaultSupervisor().Storage, + Agent: Agent{ + Executable: executablePath, + OrphanDetectionInterval: DefaultSupervisor().Agent.OrphanDetectionInterval, + ConfigApplyTimeout: DefaultSupervisor().Agent.ConfigApplyTimeout, + BootstrapTimeout: DefaultSupervisor().Agent.BootstrapTimeout, + }, + Telemetry: DefaultSupervisor().Telemetry, + } + + require.NoError(t, os.Setenv("TEST_ENDPOINT", "ws://localhost/v1/opamp")) + require.NoError(t, os.Setenv("TEST_EXECUTABLE_PATH", executablePath)) + defer func() { + require.NoError(t, os.Unsetenv("TEST_ENDPOINT")) + require.NoError(t, os.Unsetenv("TEST_EXECUTABLE_PATH")) + }() + + cfgPath := setupSupervisorConfigFile(t, tmpDir, config) + runSupervisorConfigLoadTest(t, cfgPath, expected, nil) + }, + }, + { + desc: "Empty Config Filepath", + testFunc: func(t *testing.T) { + runSupervisorConfigLoadTest(t, "", Supervisor{}, errors.New("path to config file cannot be empty")) + }, + }, + { + desc: "Nonexistent Config File", + testFunc: func(t *testing.T) { + config := ` +server: + endpoint: ws://localhost/v1/opamp + +agent: + executable: %s +` + config = fmt.Sprintf(config, executablePath) + + cfgPath := setupSupervisorConfigFile(t, tmpDir, config) + require.NoError(t, os.Remove(cfgPath)) + runSupervisorConfigLoadTest(t, cfgPath, Supervisor{}, errors.New("cannot retrieve the configuration: unable to read the file")) + }, + }, + { + desc: "Failed Validation Supervisor", + testFunc: func(t *testing.T) { + config := ` +server: + +agent: + executable: %s +` + config = fmt.Sprintf(config, executablePath) + cfgPath := setupSupervisorConfigFile(t, tmpDir, config) + runSupervisorConfigLoadTest(t, cfgPath, Supervisor{}, errors.New("cannot validate supervisor config")) + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.desc, tc.testFunc) + } +} + +func setupSupervisorConfigFile(t *testing.T, tmpDir, configString string) string { + t.Helper() + + testDir, err := os.MkdirTemp(tmpDir, "*") + require.NoError(t, err) + cfgPath := filepath.Join(testDir, "config.yaml") + err = os.WriteFile(cfgPath, []byte(configString), 0o600) + require.NoError(t, err) + return cfgPath +} + +func runSupervisorConfigLoadTest(t *testing.T, cfgPath string, expected Supervisor, expectedErr error) { + t.Helper() + + cfg, err := Load(cfgPath) + if expectedErr != nil { + require.ErrorContains(t, err, expectedErr.Error()) + return + } + require.NoError(t, err) + require.Equal(t, expected, cfg) +} diff --git a/cmd/opampsupervisor/supervisor/healthchecker/healthchecker.go b/cmd/opampsupervisor/supervisor/healthchecker/healthchecker.go index 65d7ae6d74ce..5ea3845beeef 100644 --- a/cmd/opampsupervisor/supervisor/healthchecker/healthchecker.go +++ b/cmd/opampsupervisor/supervisor/healthchecker/healthchecker.go @@ -23,7 +23,7 @@ func NewHTTPHealthChecker(endpoint string) *HTTPHealthChecker { } func (h *HTTPHealthChecker) Check(ctx context.Context) error { - req, err := http.NewRequestWithContext(ctx, "GET", h.endpoint, nil) + req, err := http.NewRequestWithContext(ctx, http.MethodGet, h.endpoint, nil) if err != nil { return err } diff --git a/cmd/opampsupervisor/supervisor/logger.go b/cmd/opampsupervisor/supervisor/logger.go index 11811d539372..863b4aba7f5f 100644 --- a/cmd/opampsupervisor/supervisor/logger.go +++ b/cmd/opampsupervisor/supervisor/logger.go @@ -26,8 +26,8 @@ func (o *opAMPLogger) Errorf(_ context.Context, format string, v ...any) { o.l.Errorf(format, v...) } -func newLoggerFromZap(l *zap.Logger) types.Logger { +func newLoggerFromZap(l *zap.Logger, name string) types.Logger { return &opAMPLogger{ - l: l.Sugar(), + l: l.Sugar().Named(name), } } diff --git a/cmd/opampsupervisor/supervisor/persistence.go b/cmd/opampsupervisor/supervisor/persistence.go index e3f4077adc09..40f80091b1c7 100644 --- a/cmd/opampsupervisor/supervisor/persistence.go +++ b/cmd/opampsupervisor/supervisor/persistence.go @@ -4,25 +4,23 @@ package supervisor import ( - "crypto/rand" "errors" "os" - "time" - "github.com/oklog/ulid/v2" + "github.com/google/uuid" "gopkg.in/yaml.v3" ) // persistentState represents persistent state for the supervisor type persistentState struct { - InstanceID ulid.ULID `yaml:"instance_id"` + InstanceID uuid.UUID `yaml:"instance_id"` // Path to the config file that the state should be saved to. // This is not marshaled. configPath string `yaml:"-"` } -func (p *persistentState) SetInstanceID(id ulid.ULID) error { +func (p *persistentState) SetInstanceID(id uuid.UUID) error { p.InstanceID = id return p.writeState() } @@ -33,7 +31,7 @@ func (p *persistentState) writeState() error { return err } - return os.WriteFile(p.configPath, by, 0600) + return os.WriteFile(p.configPath, by, 0o600) } // loadOrCreatePersistentState attempts to load the persistent state from disk. If it doesn't @@ -68,7 +66,7 @@ func loadPersistentState(file string) (*persistentState, error) { } func createNewPersistentState(file string) (*persistentState, error) { - id, err := generateNewULID() + id, err := uuid.NewV7() if err != nil { return nil, err } @@ -80,13 +78,3 @@ func createNewPersistentState(file string) (*persistentState, error) { return p, p.writeState() } - -func generateNewULID() (ulid.ULID, error) { - entropy := ulid.Monotonic(rand.Reader, 0) - id, err := ulid.New(ulid.Timestamp(time.Now()), entropy) - if err != nil { - return ulid.ULID{}, err - } - - return id, nil -} diff --git a/cmd/opampsupervisor/supervisor/persistence_test.go b/cmd/opampsupervisor/supervisor/persistence_test.go index 77e4ba9eb0f9..054221b1f5c3 100644 --- a/cmd/opampsupervisor/supervisor/persistence_test.go +++ b/cmd/opampsupervisor/supervisor/persistence_test.go @@ -8,7 +8,7 @@ import ( "path/filepath" "testing" - "github.com/oklog/ulid/v2" + "github.com/google/uuid" "github.com/stretchr/testify/require" ) @@ -19,24 +19,23 @@ func TestCreateOrLoadPersistentState(t *testing.T) { require.NoError(t, err) // instance ID should be populated - require.NotEqual(t, ulid.ULID{}, state.InstanceID) + require.NotEqual(t, uuid.Nil, state.InstanceID) require.FileExists(t, f) }) t.Run("loads state from file if it exists", func(t *testing.T) { f := filepath.Join(t.TempDir(), "state.yaml") - err := os.WriteFile(f, []byte(`instance_id: "01HW3GS9NWD840C5C2BZS3KYPW"`), 0600) + err := os.WriteFile(f, []byte(`instance_id: "018feed6-905b-7aa6-ba37-b0eec565de03"`), 0o600) require.NoError(t, err) state, err := loadOrCreatePersistentState(f) require.NoError(t, err) // instance ID should be populated with value from file - require.Equal(t, ulid.MustParse("01HW3GS9NWD840C5C2BZS3KYPW"), state.InstanceID) + require.Equal(t, uuid.MustParse("018feed6-905b-7aa6-ba37-b0eec565de03"), state.InstanceID) require.FileExists(t, f) }) - } func TestPersistentState_SetInstanceID(t *testing.T) { @@ -45,29 +44,18 @@ func TestPersistentState_SetInstanceID(t *testing.T) { require.NoError(t, err) // instance ID should be populated - require.NotEqual(t, ulid.ULID{}, state.InstanceID) + require.NotEqual(t, uuid.Nil, state.InstanceID) require.FileExists(t, f) - newULID := ulid.MustParse("01HW3GS9NWD840C5C2BZS3KYPW") - err = state.SetInstanceID(newULID) + newUUID := uuid.MustParse("018fee1f-871a-7d82-b22f-478085b3a1d6") + err = state.SetInstanceID(newUUID) require.NoError(t, err) - require.Equal(t, newULID, state.InstanceID) + require.Equal(t, newUUID, state.InstanceID) // Test that loading the state after setting the instance ID has the new instance ID loadedState, err := loadPersistentState(f) require.NoError(t, err) - require.Equal(t, newULID, loadedState.InstanceID) -} - -func TestGenerateNewULID(t *testing.T) { - // Test generating a new ULID twice returns 2 different results - id1, err := generateNewULID() - require.NoError(t, err) - - id2, err := generateNewULID() - require.NoError(t, err) - - require.NotEqual(t, id1, id2) + require.Equal(t, newUUID, loadedState.InstanceID) } diff --git a/cmd/opampsupervisor/supervisor/pid.go b/cmd/opampsupervisor/supervisor/pid.go new file mode 100644 index 000000000000..fe207299a0dc --- /dev/null +++ b/cmd/opampsupervisor/supervisor/pid.go @@ -0,0 +1,17 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package supervisor + +import "os" + +// pidProvider provides the PID of the current process +type pidProvider interface { + PID() int +} + +type defaultPIDProvider struct{} + +func (defaultPIDProvider) PID() int { + return os.Getpid() +} diff --git a/cmd/opampsupervisor/supervisor/server.go b/cmd/opampsupervisor/supervisor/server.go index 6e4c00697097..cd54f96336eb 100644 --- a/cmd/opampsupervisor/supervisor/server.go +++ b/cmd/opampsupervisor/supervisor/server.go @@ -13,34 +13,50 @@ import ( ) type flattenedSettings struct { - onMessageFunc func(conn serverTypes.Connection, message *protobufs.AgentToServer) - onConnectingFunc func(request *http.Request) - endpoint string + onMessageFunc func(conn serverTypes.Connection, message *protobufs.AgentToServer) + onConnectingFunc func(request *http.Request) (shouldConnect bool, rejectStatusCode int) + onConnectionCloseFunc func(conn serverTypes.Connection) + endpoint string } -func newServerSettings(fs flattenedSettings) server.StartSettings { +func (fs flattenedSettings) toServerSettings() server.StartSettings { return server.StartSettings{ Settings: server.Settings{ - Callbacks: server.CallbacksStruct{ - OnConnectingFunc: func(request *http.Request) serverTypes.ConnectionResponse { - if fs.onConnectingFunc != nil { - fs.onConnectingFunc(request) - } - return serverTypes.ConnectionResponse{ - Accept: true, - ConnectionCallbacks: server.ConnectionCallbacksStruct{ - OnMessageFunc: func(_ context.Context, conn serverTypes.Connection, message *protobufs.AgentToServer) *protobufs.ServerToAgent { - if fs.onMessageFunc != nil { - fs.onMessageFunc(conn, message) - } - - return &protobufs.ServerToAgent{} - }, - }, - } - }, - }, + Callbacks: fs, }, ListenEndpoint: fs.endpoint, } } + +func (fs flattenedSettings) OnConnecting(request *http.Request) serverTypes.ConnectionResponse { + if fs.onConnectingFunc != nil { + shouldConnect, rejectStatusCode := fs.onConnectingFunc(request) + if !shouldConnect { + return serverTypes.ConnectionResponse{ + Accept: false, + HTTPStatusCode: rejectStatusCode, + } + } + } + + return serverTypes.ConnectionResponse{ + Accept: true, + ConnectionCallbacks: fs, + } +} + +func (fs flattenedSettings) OnConnected(_ context.Context, _ serverTypes.Connection) {} + +func (fs flattenedSettings) OnMessage(_ context.Context, conn serverTypes.Connection, message *protobufs.AgentToServer) *protobufs.ServerToAgent { + if fs.onMessageFunc != nil { + fs.onMessageFunc(conn, message) + } + + return &protobufs.ServerToAgent{} +} + +func (fs flattenedSettings) OnConnectionClose(conn serverTypes.Connection) { + if fs.onConnectionCloseFunc != nil { + fs.onConnectionCloseFunc(conn) + } +} diff --git a/cmd/opampsupervisor/supervisor/server_test.go b/cmd/opampsupervisor/supervisor/server_test.go new file mode 100644 index 000000000000..e35c11ab186e --- /dev/null +++ b/cmd/opampsupervisor/supervisor/server_test.go @@ -0,0 +1,85 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package supervisor + +import ( + "context" + "net/http" + "testing" + + "github.com/open-telemetry/opamp-go/protobufs" + serverTypes "github.com/open-telemetry/opamp-go/server/types" + "github.com/stretchr/testify/require" +) + +func Test_flattenedSettings_toServerSettings(t *testing.T) { + fs := flattenedSettings{ + endpoint: "localhost", + } + + serverSettings := fs.toServerSettings() + + require.Equal(t, "localhost", serverSettings.ListenEndpoint) + require.NotNil(t, serverSettings.Callbacks) +} + +func Test_flattenedSettings_OnConnecting(t *testing.T) { + t.Run("accept connection", func(t *testing.T) { + onConnectingFuncCalled := false + fs := flattenedSettings{ + onConnectingFunc: func(_ *http.Request) (shouldConnect bool, rejectStatusCode int) { + onConnectingFuncCalled = true + return true, 0 + }, + } + + cr := fs.OnConnecting(&http.Request{}) + + require.True(t, onConnectingFuncCalled) + require.True(t, cr.Accept) + require.NotNil(t, cr.ConnectionCallbacks) + }) + t.Run("do not accept connection", func(t *testing.T) { + onConnectingFuncCalled := false + fs := flattenedSettings{ + onConnectingFunc: func(_ *http.Request) (shouldConnect bool, rejectStatusCode int) { + onConnectingFuncCalled = true + return false, 500 + }, + } + + cr := fs.OnConnecting(&http.Request{}) + + require.True(t, onConnectingFuncCalled) + require.False(t, cr.Accept) + require.Equal(t, 500, cr.HTTPStatusCode) + }) +} + +func Test_flattenedSettings_OnMessage(t *testing.T) { + onMessageFuncCalled := false + fs := flattenedSettings{ + onMessageFunc: func(_ serverTypes.Connection, _ *protobufs.AgentToServer) { + onMessageFuncCalled = true + }, + } + + sta := fs.OnMessage(context.TODO(), &mockConn{}, &protobufs.AgentToServer{}) + + require.True(t, onMessageFuncCalled) + require.NotNil(t, sta) +} + +func Test_flattenedSettings_OnConnectionClose(t *testing.T) { + onConnectionCloseFuncCalled := false + fs := flattenedSettings{ + onConnectionCloseFunc: func(_ serverTypes.Connection) { + onConnectionCloseFuncCalled = true + }, + } + + fs.OnConnectionClose(&mockConn{}) + + require.True(t, onConnectionCloseFuncCalled) +} diff --git a/cmd/opampsupervisor/supervisor/supervisor.go b/cmd/opampsupervisor/supervisor/supervisor.go index c35685c3a68f..e446805efb45 100644 --- a/cmd/opampsupervisor/supervisor/supervisor.go +++ b/cmd/opampsupervisor/supervisor/supervisor.go @@ -6,11 +6,13 @@ package supervisor import ( "bytes" "context" + "crypto/tls" _ "embed" "errors" "fmt" "net" "net/http" + "net/url" "os" "path/filepath" "sort" @@ -20,11 +22,11 @@ import ( "time" "github.com/cenkalti/backoff/v4" + "github.com/google/uuid" + "github.com/knadh/koanf/maps" "github.com/knadh/koanf/parsers/yaml" - "github.com/knadh/koanf/providers/file" "github.com/knadh/koanf/providers/rawbytes" "github.com/knadh/koanf/v2" - "github.com/oklog/ulid/v2" "github.com/open-telemetry/opamp-go/client" "github.com/open-telemetry/opamp-go/client/types" "github.com/open-telemetry/opamp-go/protobufs" @@ -42,12 +44,15 @@ import ( ) var ( - //go:embed templates/bootstrap.yaml - bootstrapConfTpl string + //go:embed templates/nooppipeline.yaml + noopPipelineTpl string //go:embed templates/extraconfig.yaml extraConfigTpl string + //go:embed templates/opampextension.yaml + opampextensionTpl string + //go:embed templates/owntelemetry.yaml ownTelemetryTpl string @@ -55,12 +60,29 @@ var ( lastRecvOwnMetricsConfigFile = "last_recv_own_metrics_config.dat" ) -const persistentStateFile = "persistent_state.yaml" +const ( + persistentStateFileName = "persistent_state.yaml" + agentConfigFileName = "effective.yaml" +) + +const maxBufferedCustomMessages = 10 + +type configState struct { + // Supervisor-assembled config to be given to the Collector. + mergedConfig string + // true if the server provided configmap was empty + configMapIsEmpty bool +} + +func (c *configState) equal(other *configState) bool { + return other.mergedConfig == c.mergedConfig && other.configMapIsEmpty == c.configMapIsEmpty +} // Supervisor implements supervising of OpenTelemetry Collector and uses OpAMPClient // to work with an OpAMP Server. type Supervisor struct { - logger *zap.Logger + logger *zap.Logger + pidProvider pidProvider // Commander that starts/stops the Agent process. commander *commander.Commander @@ -74,14 +96,17 @@ type Supervisor struct { // Supervisor's own config. config config.Supervisor - agentDescription *protobufs.AgentDescription + agentDescription *atomic.Value // Supervisor's persistent state persistentState *persistentState - bootstrapTemplate *template.Template - extraConfigTemplate *template.Template - ownTelemetryTemplate *template.Template + noopPipelineTemplate *template.Template + opampextensionTemplate *template.Template + extraConfigTemplate *template.Template + ownTelemetryTemplate *template.Template + + agentConn *atomic.Value // A config section to be added to the Collector's config to fetch its own metrics. // TODO: store this persistently so that when starting we can compose the effective @@ -93,184 +118,195 @@ type Supervisor struct { // will listen on for health check requests from the Supervisor. agentHealthCheckEndpoint string + // Internal config state for agent use. See the configState struct for more details. + cfgState *atomic.Value + // Final effective config of the Collector. effectiveConfig *atomic.Value - // Location of the effective config file. - effectiveConfigFilePath string - // Last received remote config. remoteConfig *protobufs.AgentRemoteConfig // A channel to indicate there is a new config to apply. hasNewConfig chan struct{} + // configApplyTimeout is the maximum time to wait for the agent to apply a new config. + // After this time passes without the agent reporting health as OK, the agent is considered unhealthy. + configApplyTimeout time.Duration + // lastHealthFromClient is the last health status of the agent received from the client. + lastHealthFromClient *protobufs.ComponentHealth + // lastHealth is the last health status of the agent. + lastHealth *protobufs.ComponentHealth // The OpAMP client to connect to the OpAMP Server. opampClient client.OpAMPClient - doneChan chan struct{} - supervisorWG sync.WaitGroup + doneChan chan struct{} + agentWG sync.WaitGroup + + customMessageToServer chan *protobufs.CustomMessage + customMessageWG sync.WaitGroup - agentHasStarted bool + // agentHasStarted is true if the agent has started. + agentHasStarted bool + // agentStartHealthCheckAttempts is the number of health check attempts made by the agent since it started. agentStartHealthCheckAttempts int - agentRestarting atomic.Bool + // agentRestarting is true if the agent is restarting. + agentRestarting atomic.Bool - connectedToOpAMPServer chan struct{} + // The OpAMP server to communicate with the Collector's OpAMP extension + opampServer server.OpAMPServer + opampServerPort int } -func NewSupervisor(logger *zap.Logger, configFile string) (*Supervisor, error) { +func NewSupervisor(logger *zap.Logger, cfg config.Supervisor) (*Supervisor, error) { s := &Supervisor{ logger: logger, + pidProvider: defaultPIDProvider{}, hasNewConfig: make(chan struct{}, 1), - effectiveConfigFilePath: "effective.yaml", agentConfigOwnMetricsSection: &atomic.Value{}, + cfgState: &atomic.Value{}, effectiveConfig: &atomic.Value{}, - connectedToOpAMPServer: make(chan struct{}), + agentDescription: &atomic.Value{}, doneChan: make(chan struct{}), + customMessageToServer: make(chan *protobufs.CustomMessage, maxBufferedCustomMessages), + agentConn: &atomic.Value{}, } - if err := s.createTemplates(); err != nil { return nil, err } - if err := s.loadConfig(configFile); err != nil { - return nil, fmt.Errorf("error loading config: %w", err) + if err := cfg.Validate(); err != nil { + return nil, fmt.Errorf("error validating config: %w", err) } + s.config = cfg - storageDir := s.config.Storage.DirectoryOrDefault() - if err := os.MkdirAll(storageDir, 0700); err != nil { + if err := os.MkdirAll(s.config.Storage.Directory, 0o700); err != nil { return nil, fmt.Errorf("error creating storage dir: %w", err) } + s.configApplyTimeout = s.config.Agent.ConfigApplyTimeout + + return s, nil +} + +func (s *Supervisor) Start() error { var err error - s.persistentState, err = loadOrCreatePersistentState(s.persistentStateFile()) + s.persistentState, err = loadOrCreatePersistentState(s.persistentStateFilePath()) if err != nil { - return nil, err + return err } if err = s.getBootstrapInfo(); err != nil { - return nil, fmt.Errorf("could not get bootstrap info from the Collector: %w", err) + return fmt.Errorf("could not get bootstrap info from the Collector: %w", err) } - healthCheckPort, err := s.findRandomPort() - - if err != nil { - return nil, fmt.Errorf("could not find port for health check: %w", err) + healthCheckPort := s.config.Agent.HealthCheckPort + if healthCheckPort == 0 { + healthCheckPort, err = s.findRandomPort() + if err != nil { + return fmt.Errorf("could not find port for health check: %w", err) + } } s.agentHealthCheckEndpoint = fmt.Sprintf("localhost:%d", healthCheckPort) - logger.Debug("Supervisor starting", + s.logger.Info("Supervisor starting", zap.String("id", s.persistentState.InstanceID.String())) - s.loadAgentEffectiveConfig() - - if err = s.startOpAMP(); err != nil { - return nil, fmt.Errorf("cannot start OpAMP client: %w", err) + err = s.loadAndWriteInitialMergedConfig() + if err != nil { + return fmt.Errorf("failed loading initial config: %w", err) } - if connErr := s.waitForOpAMPConnection(); connErr != nil { - return nil, fmt.Errorf("failed to connect to the OpAMP server: %w", connErr) + if err = s.startOpAMP(); err != nil { + return fmt.Errorf("cannot start OpAMP client: %w", err) } s.commander, err = commander.NewCommander( s.logger, + s.config.Storage.Directory, s.config.Agent, - "--config", s.effectiveConfigFilePath, + "--config", s.agentConfigFilePath(), ) if err != nil { - return nil, err + return err } s.startHealthCheckTicker() - s.supervisorWG.Add(1) + s.agentWG.Add(1) go func() { - defer s.supervisorWG.Done() + defer s.agentWG.Done() s.runAgentProcess() }() - return s, nil + s.customMessageWG.Add(1) + go func() { + defer s.customMessageWG.Done() + s.forwardCustomMessagesToServerLoop() + }() + + return nil } func (s *Supervisor) createTemplates() error { var err error - if s.bootstrapTemplate, err = template.New("bootstrap").Parse(bootstrapConfTpl); err != nil { + if s.noopPipelineTemplate, err = template.New("nooppipeline").Parse(noopPipelineTpl); err != nil { return err } if s.extraConfigTemplate, err = template.New("extraconfig").Parse(extraConfigTpl); err != nil { return err } - if s.ownTelemetryTemplate, err = template.New("owntelemetry").Parse(ownTelemetryTpl); err != nil { + if s.opampextensionTemplate, err = template.New("opampextension").Parse(opampextensionTpl); err != nil { return err } - - return nil -} - -func (s *Supervisor) loadConfig(configFile string) error { - if configFile == "" { - return errors.New("path to config file cannot be empty") - } - - k := koanf.New("::") - if err := k.Load(file.Provider(configFile), yaml.Parser()); err != nil { + if s.ownTelemetryTemplate, err = template.New("owntelemetry").Parse(ownTelemetryTpl); err != nil { return err } - decodeConf := koanf.UnmarshalConf{ - Tag: "mapstructure", - } - - if err := k.UnmarshalWithConf("", &s.config, decodeConf); err != nil { - return fmt.Errorf("cannot parse %v: %w", configFile, err) - } - return nil } +// getBootstrapInfo obtains the Collector's agent description by +// starting a Collector with a specific config that only starts +// an OpAMP extension, obtains the agent description, then +// shuts down the Collector. This only needs to happen +// once per Collector binary. func (s *Supervisor) getBootstrapInfo() (err error) { - supervisorPort, err := s.findRandomPort() + s.opampServerPort, err = s.getSupervisorOpAMPServerPort() if err != nil { return err } - var cfg bytes.Buffer - - orphanPollInterval := 5 * time.Second - if s.config.Agent != nil && s.config.Agent.OrphanDetectionInterval > 0 { - orphanPollInterval = s.config.Agent.OrphanDetectionInterval - } - - err = s.bootstrapTemplate.Execute(&cfg, map[string]any{ - "InstanceUid": s.persistentState.InstanceID.String(), - "SupervisorPort": supervisorPort, - "PID": os.Getpid(), - "PPIDPollInterval": orphanPollInterval, - }) + bootstrapConfig, err := s.composeNoopConfig() if err != nil { return err } - s.writeEffectiveConfigToFile(cfg.String(), s.effectiveConfigFilePath) + err = os.WriteFile(s.agentConfigFilePath(), bootstrapConfig, 0o600) + if err != nil { + return fmt.Errorf("failed to write agent config: %w", err) + } - srv := server.New(newLoggerFromZap(s.logger)) + srv := server.New(newLoggerFromZap(s.logger, "opamp-server")) done := make(chan error, 1) var connected atomic.Bool - err = srv.Start(newServerSettings(flattenedSettings{ - endpoint: fmt.Sprintf("localhost:%d", supervisorPort), - onConnectingFunc: func(_ *http.Request) { + // Start a one-shot server to get the Collector's agent description + // using the Collector's OpAMP extension. + err = srv.Start(flattenedSettings{ + endpoint: fmt.Sprintf("localhost:%d", s.opampServerPort), + onConnectingFunc: func(_ *http.Request) (bool, int) { connected.Store(true) - + return true, http.StatusOK }, onMessageFunc: func(_ serverTypes.Connection, message *protobufs.AgentToServer) { if message.AgentDescription != nil { instanceIDSeen := false s.setAgentDescription(message.AgentDescription) - identAttr := s.agentDescription.IdentifyingAttributes + identAttr := message.AgentDescription.IdentifyingAttributes for _, attr := range identAttr { if attr.Key == semconv.AttributeServiceInstanceID { @@ -295,7 +331,7 @@ func (s *Supervisor) getBootstrapInfo() (err error) { done <- nil } }, - })) + }.toServerSettings()) if err != nil { return err } @@ -308,8 +344,9 @@ func (s *Supervisor) getBootstrapInfo() (err error) { cmd, err := commander.NewCommander( s.logger, + s.config.Storage.Directory, s.config.Agent, - "--config", s.effectiveConfigFilePath, + "--config", s.agentConfigFilePath(), ) if err != nil { return err @@ -326,8 +363,7 @@ func (s *Supervisor) getBootstrapInfo() (err error) { }() select { - // TODO make timeout configurable - case <-time.After(3 * time.Second): + case <-time.After(s.config.Agent.BootstrapTimeout): if connected.Load() { return errors.New("collector connected but never responded with an AgentDescription message") } else { @@ -338,49 +374,32 @@ func (s *Supervisor) getBootstrapInfo() (err error) { } } -func (s *Supervisor) Capabilities() protobufs.AgentCapabilities { - var supportedCapabilities protobufs.AgentCapabilities - if c := s.config.Capabilities; c != nil { - // ReportsEffectiveConfig is set if unspecified or explicitly set to true. - if (c.ReportsEffectiveConfig != nil && *c.ReportsEffectiveConfig) || c.ReportsEffectiveConfig == nil { - supportedCapabilities |= protobufs.AgentCapabilities_AgentCapabilities_ReportsEffectiveConfig - } - - // ReportsHealth is set if unspecified or explicitly set to true. - if (c.ReportsHealth != nil && *c.ReportsHealth) || c.ReportsHealth == nil { - supportedCapabilities |= protobufs.AgentCapabilities_AgentCapabilities_ReportsHealth - } - - // ReportsOwnMetrics is set if unspecified or explicitly set to true. - if (c.ReportsOwnMetrics != nil && *c.ReportsOwnMetrics) || c.ReportsOwnMetrics == nil { - supportedCapabilities |= protobufs.AgentCapabilities_AgentCapabilities_ReportsOwnMetrics - } - - if c.AcceptsRemoteConfig != nil && *c.AcceptsRemoteConfig { - supportedCapabilities |= protobufs.AgentCapabilities_AgentCapabilities_AcceptsRemoteConfig - } - - if c.ReportsRemoteConfig != nil && *c.ReportsRemoteConfig { - supportedCapabilities |= protobufs.AgentCapabilities_AgentCapabilities_ReportsRemoteConfig - } - - if c.AcceptsRestartCommand != nil && *c.AcceptsRestartCommand { - supportedCapabilities |= protobufs.AgentCapabilities_AgentCapabilities_AcceptsRestartCommand - } +func (s *Supervisor) startOpAMP() error { + if err := s.startOpAMPClient(); err != nil { + return err + } - if c.AcceptsOpAMPConnectionSettings != nil && *c.AcceptsOpAMPConnectionSettings { - supportedCapabilities |= protobufs.AgentCapabilities_AgentCapabilities_AcceptsOpAMPConnectionSettings - } + if err := s.startOpAMPServer(); err != nil { + return err } - return supportedCapabilities + + return nil } -func (s *Supervisor) startOpAMP() error { - s.opampClient = client.NewWebSocket(newLoggerFromZap(s.logger)) +func (s *Supervisor) startOpAMPClient() error { + s.opampClient = client.NewWebSocket(newLoggerFromZap(s.logger, "opamp-client")) - tlsConfig, err := s.config.Server.TLSSetting.LoadTLSConfig(context.Background()) + // determine if we need to load a TLS config or not + var tlsConfig *tls.Config + parsedURL, err := url.Parse(s.config.Server.Endpoint) if err != nil { - return err + return fmt.Errorf("parse server endpoint: %w", err) + } + if parsedURL.Scheme == "wss" || parsedURL.Scheme == "https" { + tlsConfig, err = s.config.Server.TLSSetting.LoadTLSConfig(context.Background()) + if err != nil { + return err + } } s.logger.Debug("Connecting to OpAMP server...", zap.String("endpoint", s.config.Server.Endpoint), zap.Any("headers", s.config.Server.Headers)) @@ -388,10 +407,9 @@ func (s *Supervisor) startOpAMP() error { OpAMPServerURL: s.config.Server.Endpoint, Header: s.config.Server.Headers, TLSConfig: tlsConfig, - InstanceUid: s.persistentState.InstanceID.String(), + InstanceUid: types.InstanceUid(s.persistentState.InstanceID), Callbacks: types.CallbacksStruct{ OnConnectFunc: func(_ context.Context) { - s.connectedToOpAMPServer <- struct{}{} s.logger.Debug("Connected to the server.") }, OnConnectFailedFunc: func(_ context.Context, err error) { @@ -420,35 +438,143 @@ func (s *Supervisor) startOpAMP() error { return s.createEffectiveConfigMsg(), nil }, }, - Capabilities: s.Capabilities(), + Capabilities: s.config.Capabilities.SupportedCapabilities(), } - err = s.opampClient.SetAgentDescription(s.agentDescription) - if err != nil { + ad := s.agentDescription.Load().(*protobufs.AgentDescription) + if err = s.opampClient.SetAgentDescription(ad); err != nil { return err } - err = s.opampClient.SetHealth(&protobufs.ComponentHealth{Healthy: false}) - if err != nil { + if err = s.opampClient.SetHealth(&protobufs.ComponentHealth{Healthy: false}); err != nil { return err } s.logger.Debug("Starting OpAMP client...") + if err = s.opampClient.Start(context.Background(), settings); err != nil { + return err + } + s.logger.Debug("OpAMP client started.") + + return nil +} + +// startOpAMPServer starts an OpAMP server that will communicate +// with an OpAMP extension running inside a Collector to receive +// data from inside the Collector. The internal server's lifetime is not +// matched to the Collector's process, but may be restarted +// depending on information received by the Supervisor from the remote +// OpAMP server. +func (s *Supervisor) startOpAMPServer() error { + s.opampServer = server.New(newLoggerFromZap(s.logger, "opamp-server")) - err = s.opampClient.Start(context.Background(), settings) + var err error + s.opampServerPort, err = s.getSupervisorOpAMPServerPort() if err != nil { return err } - s.logger.Debug("OpAMP Client started.") + s.logger.Debug("Starting OpAMP server...") + + connected := &atomic.Bool{} + + err = s.opampServer.Start(flattenedSettings{ + endpoint: fmt.Sprintf("localhost:%d", s.opampServerPort), + onConnectingFunc: func(_ *http.Request) (bool, int) { + // Only allow one agent to be connected the this server at a time. + alreadyConnected := connected.Swap(true) + return !alreadyConnected, http.StatusConflict + }, + onMessageFunc: s.handleAgentOpAMPMessage, + onConnectionCloseFunc: func(_ serverTypes.Connection) { + connected.Store(false) + }, + }.toServerSettings()) + if err != nil { + return err + } + + s.logger.Debug("OpAMP server started.") return nil } +func (s *Supervisor) handleAgentOpAMPMessage(conn serverTypes.Connection, message *protobufs.AgentToServer) { + s.agentConn.Store(conn) + + s.logger.Debug("Received OpAMP message from the agent") + if message.AgentDescription != nil { + s.setAgentDescription(message.AgentDescription) + } + + if message.EffectiveConfig != nil { + if cfg, ok := message.EffectiveConfig.GetConfigMap().GetConfigMap()[""]; ok { + s.logger.Debug("Received effective config from agent") + s.effectiveConfig.Store(string(cfg.Body)) + err := s.opampClient.UpdateEffectiveConfig(context.Background()) + if err != nil { + s.logger.Error("The OpAMP client failed to update the effective config", zap.Error(err)) + } + } else { + s.logger.Error("Got effective config message, but the instance config was not present. Ignoring effective config.") + } + } + + // Proxy client capabilities to server + if message.CustomCapabilities != nil { + err := s.opampClient.SetCustomCapabilities(message.CustomCapabilities) + if err != nil { + s.logger.Error("Failed to send custom capabilities to OpAMP server") + } + } + + // Proxy agent custom messages to server + if message.CustomMessage != nil { + select { + case s.customMessageToServer <- message.CustomMessage: + default: + s.logger.Warn( + "Buffer full, skipping forwarding custom message to server", + zap.String("capability", message.CustomMessage.Capability), + zap.String("type", message.CustomMessage.Type), + ) + } + } + + if message.Health != nil { + s.logger.Debug("Received health status from agent", zap.Bool("healthy", message.Health.Healthy)) + s.lastHealthFromClient = message.Health + } +} + +func (s *Supervisor) forwardCustomMessagesToServerLoop() { + for { + select { + case cm := <-s.customMessageToServer: + for { + sendingChan, err := s.opampClient.SendCustomMessage(cm) + switch { + case errors.Is(err, types.ErrCustomMessagePending): + s.logger.Debug("Custom message pending, waiting to send...") + <-sendingChan + continue + case err == nil: // OK + s.logger.Debug("Custom message forwarded to server.") + default: + s.logger.Error("Failed to send custom message to OpAMP server") + } + break + } + case <-s.doneChan: + return + } + } +} + // setAgentDescription sets the agent description, merging in any user-specified attributes from the supervisor configuration. func (s *Supervisor) setAgentDescription(ad *protobufs.AgentDescription) { ad.IdentifyingAttributes = applyKeyValueOverrides(s.config.Agent.Description.IdentifyingAttributes, ad.IdentifyingAttributes) ad.NonIdentifyingAttributes = applyKeyValueOverrides(s.config.Agent.Description.NonIdentifyingAttributes, ad.NonIdentifyingAttributes) - s.agentDescription = ad + s.agentDescription.Store(ad) } // applyKeyValueOverrides merges the overrides map into the array of key value pairs. @@ -489,7 +615,7 @@ func applyKeyValueOverrides(overrides map[string]string, orig []*protobufs.KeyVa return kvOut } -func (s *Supervisor) stopOpAMP() error { +func (s *Supervisor) stopOpAMPClient() error { s.logger.Debug("Stopping OpAMP client...") ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() @@ -499,6 +625,7 @@ func (s *Supervisor) stopOpAMP() error { return err } s.logger.Debug("OpAMP client stopped.") + return nil } @@ -516,7 +643,7 @@ func (s *Supervisor) onOpampConnectionSettings(_ context.Context, settings *prot return nil } - newServerConfig := &config.OpAMPServer{} + newServerConfig := config.OpAMPServer{} if settings.DestinationEndpoint != "" { newServerConfig.Endpoint = settings.DestinationEndpoint @@ -525,11 +652,11 @@ func (s *Supervisor) onOpampConnectionSettings(_ context.Context, settings *prot newServerConfig.Headers = s.getHeadersFromSettings(settings.Headers) } if settings.Certificate != nil { - if len(settings.Certificate.CaPublicKey) != 0 { - newServerConfig.TLSSetting.CAPem = configopaque.String(settings.Certificate.CaPublicKey) + if len(settings.Certificate.CaCert) != 0 { + newServerConfig.TLSSetting.CAPem = configopaque.String(settings.Certificate.CaCert) } - if len(settings.Certificate.PublicKey) != 0 { - newServerConfig.TLSSetting.CertPem = configopaque.String(settings.Certificate.PublicKey) + if len(settings.Certificate.Cert) != 0 { + newServerConfig.TLSSetting.CertPem = configopaque.String(settings.Certificate.Cert) } if len(settings.Certificate.PrivateKey) != 0 { newServerConfig.TLSSetting.KeyPem = configopaque.String(settings.Certificate.PrivateKey) @@ -538,7 +665,12 @@ func (s *Supervisor) onOpampConnectionSettings(_ context.Context, settings *prot newServerConfig.TLSSetting = configtls.ClientConfig{Insecure: true} } - if err := s.stopOpAMP(); err != nil { + if err := newServerConfig.Validate(); err != nil { + s.logger.Error("New OpAMP settings resulted in invalid configuration", zap.Error(err)) + return err + } + + if err := s.stopOpAMPClient(); err != nil { s.logger.Error("Cannot stop the OpAMP client", zap.Error(err)) return err } @@ -548,41 +680,63 @@ func (s *Supervisor) onOpampConnectionSettings(_ context.Context, settings *prot // update the OpAMP server config s.config.Server = newServerConfig - if err := s.startOpAMP(); err != nil { + if err := s.startOpAMPClient(); err != nil { s.logger.Error("Cannot connect to the OpAMP server using the new settings", zap.Error(err)) // revert the OpAMP server config s.config.Server = oldServerConfig // start the OpAMP client with the old settings - if err := s.startOpAMP(); err != nil { + if err := s.startOpAMPClient(); err != nil { s.logger.Error("Cannot reconnect to the OpAMP server after restoring old settings", zap.Error(err)) return err } } - return s.waitForOpAMPConnection() + return nil } -func (s *Supervisor) waitForOpAMPConnection() error { - // wait for the OpAMP client to connect to the server or timeout - select { - case <-s.connectedToOpAMPServer: - return nil - case <-time.After(10 * time.Second): - return errors.New("timed out waiting for the server to connect") +func (s *Supervisor) composeNoopPipeline() ([]byte, error) { + var cfg bytes.Buffer + err := s.noopPipelineTemplate.Execute(&cfg, map[string]any{ + "InstanceUid": s.persistentState.InstanceID.String(), + "SupervisorPort": s.opampServerPort, + }) + if err != nil { + return nil, err + } + + return cfg.Bytes(), nil +} + +func (s *Supervisor) composeNoopConfig() ([]byte, error) { + k := koanf.New("::") + + cfg, err := s.composeNoopPipeline() + if err != nil { + return nil, err + } + if err = k.Load(rawbytes.Provider(cfg), yaml.Parser(), koanf.WithMergeFunc(configMergeFunc)); err != nil { + return nil, err } + if err = k.Load(rawbytes.Provider(s.composeOpAMPExtensionConfig()), yaml.Parser(), koanf.WithMergeFunc(configMergeFunc)); err != nil { + return nil, err + } + + return k.Marshal(yaml.Parser()) } func (s *Supervisor) composeExtraLocalConfig() []byte { var cfg bytes.Buffer resourceAttrs := map[string]string{} - for _, attr := range s.agentDescription.IdentifyingAttributes { + ad := s.agentDescription.Load().(*protobufs.AgentDescription) + for _, attr := range ad.IdentifyingAttributes { resourceAttrs[attr.Key] = attr.Value.GetStringValue() } - for _, attr := range s.agentDescription.NonIdentifyingAttributes { + for _, attr := range ad.NonIdentifyingAttributes { resourceAttrs[attr.Key] = attr.Value.GetStringValue() } tplVars := map[string]any{ "Healthcheck": s.agentHealthCheckEndpoint, "ResourceAttributes": resourceAttrs, + "SupervisorPort": s.opampServerPort, } err := s.extraConfigTemplate.Execute( &cfg, @@ -596,26 +750,40 @@ func (s *Supervisor) composeExtraLocalConfig() []byte { return cfg.Bytes() } -func (s *Supervisor) loadAgentEffectiveConfig() { - var effectiveConfigBytes, effFromFile, lastRecvRemoteConfig, lastRecvOwnMetricsConfig []byte - var err error +func (s *Supervisor) composeOpAMPExtensionConfig() []byte { + orphanPollInterval := 5 * time.Second + if s.config.Agent.OrphanDetectionInterval > 0 { + orphanPollInterval = s.config.Agent.OrphanDetectionInterval + } - effFromFile, err = os.ReadFile(s.effectiveConfigFilePath) - if err == nil { - // We have an effective config file. - effectiveConfigBytes = effFromFile - } else { - // No effective config file, just use the initial config. - effectiveConfigBytes = s.composeExtraLocalConfig() + var cfg bytes.Buffer + tplVars := map[string]any{ + "InstanceUid": s.persistentState.InstanceID.String(), + "SupervisorPort": s.opampServerPort, + "PID": s.pidProvider.PID(), + "PPIDPollInterval": orphanPollInterval, + } + err := s.opampextensionTemplate.Execute( + &cfg, + tplVars, + ) + if err != nil { + s.logger.Error("Could not compose local config", zap.Error(err)) + return nil } - s.effectiveConfig.Store(string(effectiveConfigBytes)) + return cfg.Bytes() +} - if s.config.Capabilities != nil && s.config.Capabilities.AcceptsRemoteConfig != nil && - *s.config.Capabilities.AcceptsRemoteConfig { +func (s *Supervisor) loadAndWriteInitialMergedConfig() error { + var lastRecvRemoteConfig, lastRecvOwnMetricsConfig []byte + var err error + + if s.config.Capabilities.AcceptsRemoteConfig { // Try to load the last received remote config if it exists. - lastRecvRemoteConfig, err = os.ReadFile(filepath.Join(s.config.Storage.DirectoryOrDefault(), lastRecvRemoteConfigFile)) - if err == nil { + lastRecvRemoteConfig, err = os.ReadFile(filepath.Join(s.config.Storage.Directory, lastRecvRemoteConfigFile)) + switch { + case err == nil: config := &protobufs.AgentRemoteConfig{} err = proto.Unmarshal(lastRecvRemoteConfig, config) if err != nil { @@ -623,17 +791,18 @@ func (s *Supervisor) loadAgentEffectiveConfig() { } else { s.remoteConfig = config } - } else { + case errors.Is(err, os.ErrNotExist): + s.logger.Info("No last received remote config found") + default: s.logger.Error("error while reading last received config", zap.Error(err)) } } else { s.logger.Debug("Remote config is not supported, will not attempt to load config from fil") } - if s.config.Capabilities != nil && s.config.Capabilities.ReportsOwnMetrics != nil && - *s.config.Capabilities.ReportsOwnMetrics { + if s.config.Capabilities.ReportsOwnMetrics { // Try to load the last received own metrics config if it exists. - lastRecvOwnMetricsConfig, err = os.ReadFile(filepath.Join(s.config.Storage.DirectoryOrDefault(), lastRecvOwnMetricsConfigFile)) + lastRecvOwnMetricsConfig, err = os.ReadFile(filepath.Join(s.config.Storage.Directory, lastRecvOwnMetricsConfigFile)) if err == nil { set := &protobufs.TelemetryConnectionSettings{} err = proto.Unmarshal(lastRecvOwnMetricsConfig, set) @@ -647,11 +816,18 @@ func (s *Supervisor) loadAgentEffectiveConfig() { s.logger.Debug("Own metrics is not supported, will not attempt to load config from file") } - _, err = s.recalcEffectiveConfig() + _, err = s.composeMergedConfig(s.remoteConfig) if err != nil { - s.logger.Error("Error composing effective config. Ignoring received config", zap.Error(err)) - return + return fmt.Errorf("could not compose initial merged config: %w", err) + } + + // write the initial merged config to disk + cfgState := s.cfgState.Load().(*configState) + if err := os.WriteFile(s.agentConfigFilePath(), []byte(cfgState.mergedConfig), 0o600); err != nil { + s.logger.Error("Failed to write agent config.", zap.Error(err)) } + + return nil } // createEffectiveConfigMsg create an EffectiveConfig with the content of the @@ -659,7 +835,12 @@ func (s *Supervisor) loadAgentEffectiveConfig() { func (s *Supervisor) createEffectiveConfigMsg() *protobufs.EffectiveConfig { cfgStr, ok := s.effectiveConfig.Load().(string) if !ok { - cfgStr = "" + cfgState, ok := s.cfgState.Load().(*configState) + if !ok { + cfgStr = "" + } else { + cfgStr = cfgState.mergedConfig + } } cfg := &protobufs.EffectiveConfig{ @@ -682,7 +863,6 @@ func (s *Supervisor) setupOwnMetrics(_ context.Context, settings *protobufs.Tele s.logger.Debug("Enabling own metrics pipeline in the config") port, err := s.findRandomPort() - if err != nil { s.logger.Error("Could not setup own metrics", zap.Error(err)) return @@ -699,36 +879,34 @@ func (s *Supervisor) setupOwnMetrics(_ context.Context, settings *protobufs.Tele s.logger.Error("Could not setup own metrics", zap.Error(err)) return } - } s.agentConfigOwnMetricsSection.Store(cfg.String()) // Need to recalculate the Agent config so that the metric config is included in it. - configChanged, err := s.recalcEffectiveConfig() + configChanged, err := s.composeMergedConfig(s.remoteConfig) if err != nil { + s.logger.Error("Error composing merged config for own metrics. Ignoring agent self metrics config", zap.Error(err)) return } return configChanged } -// composeEffectiveConfig composes the effective config from multiple sources: +// composeMergedConfig composes the merged config from multiple sources: // 1) the remote config from OpAMP Server // 2) the own metrics config section // 3) the local override config that is hard-coded in the Supervisor. -func (s *Supervisor) composeEffectiveConfig(config *protobufs.AgentRemoteConfig) (configChanged bool, err error) { +func (s *Supervisor) composeMergedConfig(config *protobufs.AgentRemoteConfig) (configChanged bool, err error) { + k := koanf.New("::") - var k = koanf.New("::") + configMapIsEmpty := len(config.GetConfig().GetConfigMap()) == 0 - // Begin with empty config. We will merge received configs on top of it. - if err = k.Load(rawbytes.Provider([]byte{}), yaml.Parser()); err != nil { - return false, err - } + if !configMapIsEmpty { + c := config.GetConfig() - if config != nil && config.Config != nil { // Sort to make sure the order of merging is stable. var names []string - for name := range config.Config.ConfigMap { + for name := range c.ConfigMap { if name == "" { // skip instance config continue @@ -743,11 +921,11 @@ func (s *Supervisor) composeEffectiveConfig(config *protobufs.AgentRemoteConfig) // Merge received configs. for _, name := range names { - item := config.Config.ConfigMap[name] + item := c.ConfigMap[name] if item == nil { continue } - var k2 = koanf.New("::") + k2 := koanf.New("::") err = k2.Load(rawbytes.Provider(item.Body), yaml.Parser()) if err != nil { return false, fmt.Errorf("cannot parse config named %s: %w", name, err) @@ -757,46 +935,55 @@ func (s *Supervisor) composeEffectiveConfig(config *protobufs.AgentRemoteConfig) return false, fmt.Errorf("cannot merge config named %s: %w", name, err) } } + } else { + // Add noop pipeline + var noopConfig []byte + noopConfig, err = s.composeNoopPipeline() + if err != nil { + return false, fmt.Errorf("could not compose noop pipeline: %w", err) + } + + if err = k.Load(rawbytes.Provider(noopConfig), yaml.Parser(), koanf.WithMergeFunc(configMergeFunc)); err != nil { + return false, fmt.Errorf("could not merge noop pipeline: %w", err) + } } // Merge own metrics config. ownMetricsCfg, ok := s.agentConfigOwnMetricsSection.Load().(string) if ok { - if err = k.Load(rawbytes.Provider([]byte(ownMetricsCfg)), yaml.Parser()); err != nil { + if err = k.Load(rawbytes.Provider([]byte(ownMetricsCfg)), yaml.Parser(), koanf.WithMergeFunc(configMergeFunc)); err != nil { return false, err } } // Merge local config last since it has the highest precedence. - if err = k.Load(rawbytes.Provider(s.composeExtraLocalConfig()), yaml.Parser()); err != nil { + if err = k.Load(rawbytes.Provider(s.composeExtraLocalConfig()), yaml.Parser(), koanf.WithMergeFunc(configMergeFunc)); err != nil { return false, err } - // The merged final result is our effective config. - effectiveConfigBytes, err := k.Marshal(yaml.Parser()) + if err = k.Load(rawbytes.Provider(s.composeOpAMPExtensionConfig()), yaml.Parser(), koanf.WithMergeFunc(configMergeFunc)); err != nil { + return false, err + } + + // The merged final result is our new merged config. + newMergedConfigBytes, err := k.Marshal(yaml.Parser()) if err != nil { return false, err } - // Check if effective config is changed. - newEffectiveConfig := string(effectiveConfigBytes) - configChanged = false - if s.effectiveConfig.Load().(string) != newEffectiveConfig { - s.logger.Debug("Effective config changed.") - s.effectiveConfig.Store(newEffectiveConfig) - configChanged = true + // Check if supervisor's merged config is changed. + + newConfigState := &configState{ + mergedConfig: string(newMergedConfigBytes), + configMapIsEmpty: configMapIsEmpty, } - return configChanged, nil -} + configChanged = false -// Recalculate the Agent's effective config and if the config changes, signal to the -// background goroutine that the config needs to be applied to the Agent. -func (s *Supervisor) recalcEffectiveConfig() (configChanged bool, err error) { - configChanged, err = s.composeEffectiveConfig(s.remoteConfig) - if err != nil { - s.logger.Error("Error composing effective config. Ignoring received config", zap.Error(err)) - return configChanged, err + oldConfigState := s.cfgState.Swap(newConfigState) + if oldConfigState == nil || !oldConfigState.(*configState).equal(newConfigState) { + s.logger.Debug("Merged config changed.") + configChanged = true } return configChanged, nil @@ -814,11 +1001,16 @@ func (s *Supervisor) handleRestartCommand() error { } func (s *Supervisor) startAgent() { + if s.cfgState.Load().(*configState).configMapIsEmpty { + // Don't start the agent if there is no config to run + s.logger.Info("No config present, not starting agent.") + return + } + err := s.commander.Start(context.Background()) if err != nil { s.logger.Error("Cannot start the agent", zap.Error(err)) err = s.opampClient.SetHealth(&protobufs.ComponentHealth{Healthy: false, LastError: fmt.Sprintf("Cannot start the agent: %v", err)}) - if err != nil { s.logger.Error("Failed to report OpAMP client health", zap.Error(err)) } @@ -855,11 +1047,6 @@ func (s *Supervisor) healthCheck() { err := s.healthChecker.Check(ctx) cancel() - if errors.Is(err, s.lastHealthCheckErr) { - // No difference from last check. Nothing new to report. - return - } - // Prepare OpAMP health report. health := &protobufs.ComponentHealth{ StartTimeUnixNano: uint64(s.startedAt.UnixNano()), @@ -870,6 +1057,10 @@ func (s *Supervisor) healthCheck() { if !s.agentHasStarted && s.agentStartHealthCheckAttempts < 10 { health.LastError = "Agent is starting" s.agentStartHealthCheckAttempts++ + // if we have a last health status, use it + if s.lastHealth != nil && s.lastHealth.Healthy { + health.Healthy = s.lastHealth.Healthy + } } else { health.LastError = err.Error() s.logger.Error("Agent is not healthy", zap.Error(err)) @@ -879,6 +1070,12 @@ func (s *Supervisor) healthCheck() { health.Healthy = true s.logger.Debug("Agent is healthy.") } + s.lastHealth = health + + if err != nil && errors.Is(err, s.lastHealthCheckErr) { + // No difference from last check. Nothing new to report. + return + } // Report via OpAMP. if err2 := s.opampClient.SetHealth(health); err2 != nil { @@ -890,7 +1087,7 @@ func (s *Supervisor) healthCheck() { } func (s *Supervisor) runAgentProcess() { - if _, err := os.Stat(s.effectiveConfigFilePath); err == nil { + if _, err := os.Stat(s.agentConfigFilePath()); err == nil { // We have an effective config file saved previously. Use it to start the agent. s.logger.Debug("Effective config found, starting agent initial time") s.startAgent() @@ -899,9 +1096,21 @@ func (s *Supervisor) runAgentProcess() { restartTimer := time.NewTimer(0) restartTimer.Stop() + configApplyTimeoutTimer := time.NewTimer(0) + configApplyTimeoutTimer.Stop() + for { select { case <-s.hasNewConfig: + s.lastHealthFromClient = nil + if !configApplyTimeoutTimer.Stop() { + select { + case <-configApplyTimeoutTimer.C: // Try to drain the channel + default: + } + } + configApplyTimeoutTimer.Reset(s.config.Agent.ConfigApplyTimeout) + s.logger.Debug("Restarting agent due to new config") restartTimer.Stop() s.stopAgentApplyConfig() @@ -919,7 +1128,6 @@ func (s *Supervisor) runAgentProcess() { s.commander.Pid(), s.commander.ExitCode(), ) err := s.opampClient.SetHealth(&protobufs.ComponentHealth{Healthy: false, LastError: errMsg}) - if err != nil { s.logger.Error("Could not report health to OpAMP server", zap.Error(err)) } @@ -940,6 +1148,13 @@ func (s *Supervisor) runAgentProcess() { s.logger.Debug("Agent starting after start backoff") s.startAgent() + case <-configApplyTimeoutTimer.C: + if s.lastHealthFromClient == nil || !s.lastHealthFromClient.Healthy { + s.reportConfigStatus(protobufs.RemoteConfigStatuses_RemoteConfigStatuses_FAILED, "Config apply timeout exceeded") + } else { + s.reportConfigStatus(protobufs.RemoteConfigStatuses_RemoteConfigStatuses_APPLIED, "") + } + case <-s.healthCheckTicker.C: s.healthCheck() @@ -955,27 +1170,14 @@ func (s *Supervisor) runAgentProcess() { func (s *Supervisor) stopAgentApplyConfig() { s.logger.Debug("Stopping the agent to apply new config") - cfg := s.effectiveConfig.Load().(string) + cfgState := s.cfgState.Load().(*configState) err := s.commander.Stop(context.Background()) - if err != nil { s.logger.Error("Could not stop agent process", zap.Error(err)) } - s.writeEffectiveConfigToFile(cfg, s.effectiveConfigFilePath) -} - -func (s *Supervisor) writeEffectiveConfigToFile(cfg string, filePath string) { - f, err := os.Create(filePath) - if err != nil { - s.logger.Error("Cannot create effective config file", zap.Error(err)) - } - defer f.Close() - - _, err = f.WriteString(cfg) - - if err != nil { - s.logger.Error("Cannot write effective config file", zap.Error(err)) + if err := os.WriteFile(s.agentConfigFilePath(), []byte(cfgState.mergedConfig), 0o600); err != nil { + s.logger.Error("Failed to write agent config.", zap.Error(err)) } } @@ -983,26 +1185,39 @@ func (s *Supervisor) Shutdown() { s.logger.Debug("Supervisor shutting down...") close(s.doneChan) + // Shutdown in order from producer to consumer (agent -> customMessageForwarder -> local OpAMP server -> client to remote OpAMP server). + s.agentWG.Wait() + s.customMessageWG.Wait() + + if s.opampServer != nil { + s.logger.Debug("Stopping OpAMP server...") + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + err := s.opampServer.Stop(ctx) + if err != nil { + s.logger.Error("Could not stop the OpAMP Server") + } else { + s.logger.Debug("OpAMP server stopped.") + } + } + if s.opampClient != nil { err := s.opampClient.SetHealth( &protobufs.ComponentHealth{ Healthy: false, LastError: "Supervisor is shutdown", }, ) - if err != nil { s.logger.Error("Could not report health to OpAMP server", zap.Error(err)) } - err = s.stopOpAMP() - + err = s.stopOpAMPClient() if err != nil { s.logger.Error("Could not stop the OpAMP client", zap.Error(err)) } } - s.supervisorWG.Wait() - if s.healthCheckTicker != nil { s.healthCheckTicker.Stop() } @@ -1014,7 +1229,7 @@ func (s *Supervisor) saveLastReceivedConfig(config *protobufs.AgentRemoteConfig) return err } - return os.WriteFile(filepath.Join(s.config.Storage.DirectoryOrDefault(), lastRecvRemoteConfigFile), cfg, 0600) + return os.WriteFile(filepath.Join(s.config.Storage.Directory, lastRecvRemoteConfigFile), cfg, 0o600) } func (s *Supervisor) saveLastReceivedOwnTelemetrySettings(set *protobufs.TelemetryConnectionSettings, filePath string) error { @@ -1023,70 +1238,36 @@ func (s *Supervisor) saveLastReceivedOwnTelemetrySettings(set *protobufs.Telemet return err } - return os.WriteFile(filepath.Join(s.config.Storage.DirectoryOrDefault(), filePath), cfg, 0600) + return os.WriteFile(filepath.Join(s.config.Storage.Directory, filePath), cfg, 0o600) +} + +func (s *Supervisor) reportConfigStatus(status protobufs.RemoteConfigStatuses, errorMessage string) { + err := s.opampClient.SetRemoteConfigStatus(&protobufs.RemoteConfigStatus{ + LastRemoteConfigHash: s.remoteConfig.GetConfigHash(), + Status: status, + ErrorMessage: errorMessage, + }) + if err != nil { + s.logger.Error("Could not report OpAMP remote config status", zap.Error(err)) + } } func (s *Supervisor) onMessage(ctx context.Context, msg *types.MessageData) { configChanged := false - if msg.RemoteConfig != nil { - if err := s.saveLastReceivedConfig(msg.RemoteConfig); err != nil { - s.logger.Error("Could not save last received remote config", zap.Error(err)) - } - s.remoteConfig = msg.RemoteConfig - s.logger.Debug("Received remote config from server", zap.String("hash", fmt.Sprintf("%x", s.remoteConfig.ConfigHash))) - var err error - configChanged, err = s.recalcEffectiveConfig() - if err != nil { - err = s.opampClient.SetRemoteConfigStatus(&protobufs.RemoteConfigStatus{ - LastRemoteConfigHash: msg.RemoteConfig.ConfigHash, - Status: protobufs.RemoteConfigStatuses_RemoteConfigStatuses_FAILED, - ErrorMessage: err.Error(), - }) - if err != nil { - s.logger.Error("Could not report failed OpAMP remote config status", zap.Error(err)) - } - } else { - err = s.opampClient.SetRemoteConfigStatus(&protobufs.RemoteConfigStatus{ - LastRemoteConfigHash: msg.RemoteConfig.ConfigHash, - Status: protobufs.RemoteConfigStatuses_RemoteConfigStatuses_APPLIED, - }) - if err != nil { - s.logger.Error("Could not report applied OpAMP remote config status", zap.Error(err)) - } - } + if msg.AgentIdentification != nil { + configChanged = s.processAgentIdentificationMessage(msg.AgentIdentification) || configChanged } - if msg.OwnMetricsConnSettings != nil { - if err := s.saveLastReceivedOwnTelemetrySettings(msg.OwnMetricsConnSettings, lastRecvOwnMetricsConfigFile); err != nil { - s.logger.Error("Could not save last received own telemetry settings", zap.Error(err)) - } - configChanged = s.setupOwnMetrics(ctx, msg.OwnMetricsConnSettings) || configChanged + if msg.RemoteConfig != nil { + configChanged = s.processRemoteConfigMessage(msg.RemoteConfig) || configChanged } - if msg.AgentIdentification != nil { - newInstanceID, err := ulid.Parse(msg.AgentIdentification.NewInstanceUid) - if err != nil { - s.logger.Error("Failed to parse instance ULID", zap.Error(err)) - } - - s.logger.Debug("Agent identity is changing", - zap.String("old_id", s.persistentState.InstanceID.String()), - zap.String("new_id", newInstanceID.String())) - - err = s.persistentState.SetInstanceID(newInstanceID) - if err != nil { - s.logger.Error("Failed to persist new instance ID, instance ID will revert on restart.", zap.String("new_id", newInstanceID.String()), zap.Error(err)) - } - - err = s.opampClient.SetAgentDescription(s.agentDescription) - if err != nil { - s.logger.Error("Failed to send agent description to OpAMP server") - } - - configChanged = true + if msg.OwnMetricsConnSettings != nil { + configChanged = s.processOwnMetricsConnSettingsMessage(ctx, msg.OwnMetricsConnSettings) || configChanged } + // Update the agent config if any messages have touched the config if configChanged { err := s.opampClient.UpdateEffectiveConfig(ctx) if err != nil { @@ -1100,15 +1281,113 @@ func (s *Supervisor) onMessage(ctx context.Context, msg *types.MessageData) { default: } } + + messageToAgent := &protobufs.ServerToAgent{ + InstanceUid: s.persistentState.InstanceID[:], + } + haveMessageForAgent := false + // Proxy server capabilities to opamp extension + if msg.CustomCapabilities != nil { + messageToAgent.CustomCapabilities = msg.CustomCapabilities + haveMessageForAgent = true + } + + // Proxy server messages to opamp extension + if msg.CustomMessage != nil { + messageToAgent.CustomMessage = msg.CustomMessage + haveMessageForAgent = true + } + + // Send any messages that need proxying to the agent. + if haveMessageForAgent { + conn, ok := s.agentConn.Load().(serverTypes.Connection) + if ok { + err := conn.Send(ctx, messageToAgent) + if err != nil { + s.logger.Error("Error forwarding message to agent from server", zap.Error(err)) + } + } + } } -func (s *Supervisor) persistentStateFile() string { - return filepath.Join(s.config.Storage.DirectoryOrDefault(), persistentStateFile) +// processRemoteConfigMessage processes an AgentRemoteConfig message, returning true if the agent config has changed. +func (s *Supervisor) processRemoteConfigMessage(msg *protobufs.AgentRemoteConfig) bool { + if err := s.saveLastReceivedConfig(msg); err != nil { + s.logger.Error("Could not save last received remote config", zap.Error(err)) + } + + s.remoteConfig = msg + s.logger.Debug("Received remote config from server", zap.String("hash", fmt.Sprintf("%x", s.remoteConfig.ConfigHash))) + + var err error + configChanged, err := s.composeMergedConfig(s.remoteConfig) + if err != nil { + s.logger.Error("Error composing merged config. Reporting failed remote config status.", zap.Error(err)) + s.reportConfigStatus(protobufs.RemoteConfigStatuses_RemoteConfigStatuses_FAILED, err.Error()) + } else { + s.reportConfigStatus(protobufs.RemoteConfigStatuses_RemoteConfigStatuses_APPLYING, "") + } + + return configChanged +} + +// processOwnMetricsConnSettingsMessage processes a TelemetryConnectionSettings message, returning true if the agent config has changed. +func (s *Supervisor) processOwnMetricsConnSettingsMessage(ctx context.Context, msg *protobufs.TelemetryConnectionSettings) bool { + if err := s.saveLastReceivedOwnTelemetrySettings(msg, lastRecvOwnMetricsConfigFile); err != nil { + s.logger.Error("Could not save last received own telemetry settings", zap.Error(err)) + } + return s.setupOwnMetrics(ctx, msg) +} + +// processAgentIdentificationMessage processes an AgentIdentification message, returning true if the agent config has changed. +func (s *Supervisor) processAgentIdentificationMessage(msg *protobufs.AgentIdentification) bool { + newInstanceID, err := uuid.FromBytes(msg.NewInstanceUid) + if err != nil { + s.logger.Error("Failed to parse instance UUID", zap.Error(err)) + return false + } + + s.logger.Debug("Agent identity is changing", + zap.String("old_id", s.persistentState.InstanceID.String()), + zap.String("new_id", newInstanceID.String())) + + err = s.persistentState.SetInstanceID(newInstanceID) + if err != nil { + s.logger.Error("Failed to persist new instance ID, instance ID will revert on restart.", zap.String("new_id", newInstanceID.String()), zap.Error(err)) + } + + err = s.opampClient.SetAgentDescription(s.agentDescription.Load().(*protobufs.AgentDescription)) + if err != nil { + s.logger.Error("Failed to send agent description to OpAMP server") + } + + // Need to recalculate the Agent config so that the new agent identification is included in it. + configChanged, err := s.composeMergedConfig(s.remoteConfig) + if err != nil { + s.logger.Error("Error composing merged config with new instance ID", zap.Error(err)) + return false + } + + return configChanged +} + +func (s *Supervisor) persistentStateFilePath() string { + return filepath.Join(s.config.Storage.Directory, persistentStateFileName) +} + +func (s *Supervisor) agentConfigFilePath() string { + return filepath.Join(s.config.Storage.Directory, agentConfigFileName) +} + +func (s *Supervisor) getSupervisorOpAMPServerPort() (int, error) { + if s.config.Agent.OpAMPServerPort != 0 { + return s.config.Agent.OpAMPServerPort, nil + } + return s.findRandomPort() } func (s *Supervisor) findRandomPort() (int, error) { l, err := net.Listen("tcp", "localhost:0") - if err != nil { return 0, err } @@ -1116,10 +1395,30 @@ func (s *Supervisor) findRandomPort() (int, error) { port := l.Addr().(*net.TCPAddr).Port err = l.Close() - if err != nil { return 0, err } return port, nil } + +// The default koanf behavior is to override lists in the config. +// Instead, we provide this function, which merges the source and destination config's +// extension lists by concatenating the two. +// Will be resolved by https://github.com/open-telemetry/opentelemetry-collector/issues/8754 +func configMergeFunc(src, dest map[string]any) error { + srcExtensions := maps.Search(src, []string{"service", "extensions"}) + destExtensions := maps.Search(dest, []string{"service", "extensions"}) + + maps.Merge(src, dest) + + if destExt, ok := destExtensions.([]any); ok { + if srcExt, ok := srcExtensions.([]any); ok { + if service, ok := dest["service"].(map[string]any); ok { + service["extensions"] = append(destExt, srcExt...) + } + } + } + + return nil +} diff --git a/cmd/opampsupervisor/supervisor/supervisor_test.go b/cmd/opampsupervisor/supervisor/supervisor_test.go index 2ac31db6c10e..fcd132a16da6 100644 --- a/cmd/opampsupervisor/supervisor/supervisor_test.go +++ b/cmd/opampsupervisor/supervisor/supervisor_test.go @@ -5,30 +5,115 @@ package supervisor import ( "bytes" + "context" + "fmt" + "net" "os" + "path/filepath" + "regexp" + "runtime" + "strings" "sync/atomic" "testing" + "time" + "github.com/google/uuid" + "github.com/open-telemetry/opamp-go/client" + "github.com/open-telemetry/opamp-go/client/types" "github.com/open-telemetry/opamp-go/protobufs" + serverTypes "github.com/open-telemetry/opamp-go/server/types" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.uber.org/zap" + "google.golang.org/protobuf/proto" "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/opampsupervisor/supervisor/config" ) +func setupSupervisorConfig(t *testing.T) config.Supervisor { + t.Helper() + + tmpDir, err := os.MkdirTemp(os.TempDir(), "*") + require.NoError(t, err) + + executablePath := filepath.Join(tmpDir, "binary") + err = os.WriteFile(executablePath, []byte{}, 0o600) + require.NoError(t, err) + + configuration := ` +server: + endpoint: ws://localhost/v1/opamp + tls: + insecure: true + +capabilities: + reports_effective_config: true + reports_own_metrics: true + reports_health: true + accepts_remote_config: true + reports_remote_config: true + accepts_restart_command: true + +storage: + directory: %s + +agent: + executable: %s +` + configuration = fmt.Sprintf(configuration, filepath.Join(tmpDir, "storage"), executablePath) + + cfgPath := filepath.Join(tmpDir, "config.yaml") + err = os.WriteFile(cfgPath, []byte(configuration), 0o600) + require.NoError(t, err) + + cfg, err := config.Load(cfgPath) + require.NoError(t, err) + + t.Cleanup(func() { + require.NoError(t, os.Chmod(tmpDir, 0o700)) + require.NoError(t, os.RemoveAll(tmpDir)) + }) + + return cfg +} + +func Test_NewSupervisor(t *testing.T) { + cfg := setupSupervisorConfig(t) + supervisor, err := NewSupervisor(zap.L(), cfg) + require.NoError(t, err) + require.NotNil(t, supervisor) +} + +func Test_NewSupervisorFailedStorageCreation(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("Skipping test on Windows because chmod doesn't affect permissions on Windows, so this test won't work.") + } + cfg := setupSupervisorConfig(t) + + dir := filepath.Dir(cfg.Storage.Directory) + require.NoError(t, os.Chmod(dir, 0o500)) + + supervisor, err := NewSupervisor(zap.L(), cfg) + require.Error(t, err) + require.ErrorContains(t, err, "error creating storage dir") + require.Nil(t, supervisor) +} + func Test_composeEffectiveConfig(t *testing.T) { acceptsRemoteConfig := true s := Supervisor{ logger: zap.NewNop(), - config: config.Supervisor{Capabilities: &config.Capabilities{AcceptsRemoteConfig: &acceptsRemoteConfig}}, + persistentState: &persistentState{}, + config: config.Supervisor{Capabilities: config.Capabilities{AcceptsRemoteConfig: acceptsRemoteConfig}}, + pidProvider: staticPIDProvider(1234), hasNewConfig: make(chan struct{}, 1), - effectiveConfigFilePath: "effective.yaml", agentConfigOwnMetricsSection: &atomic.Value{}, - effectiveConfig: &atomic.Value{}, + cfgState: &atomic.Value{}, agentHealthCheckEndpoint: "localhost:8000", } - s.agentDescription = &protobufs.AgentDescription{ + agentDesc := &atomic.Value{} + agentDesc.Store(&protobufs.AgentDescription{ IdentifyingAttributes: []*protobufs.KeyValue{ { Key: "service.name", @@ -39,7 +124,9 @@ func Test_composeEffectiveConfig(t *testing.T) { }, }, }, - } + }) + + s.agentDescription = agentDesc fileLogConfig := ` receivers: @@ -58,9 +145,9 @@ service: exporters: [file]` require.NoError(t, s.createTemplates()) - s.loadAgentEffectiveConfig() + require.NoError(t, s.loadAndWriteInitialMergedConfig()) - configChanged, err := s.composeEffectiveConfig(&protobufs.AgentRemoteConfig{ + configChanged, err := s.composeMergedConfig(&protobufs.AgentRemoteConfig{ Config: &protobufs.AgentConfigMap{ ConfigMap: map[string]*protobufs.AgentConfigFile{ "": { @@ -76,5 +163,1235 @@ service: expectedConfig = bytes.ReplaceAll(expectedConfig, []byte("\r\n"), []byte("\n")) require.True(t, configChanged) - require.Equal(t, string(expectedConfig), s.effectiveConfig.Load().(string)) + require.Equal(t, string(expectedConfig), s.cfgState.Load().(*configState).mergedConfig) +} + +func Test_onMessage(t *testing.T) { + t.Run("AgentIdentification - New instance ID is valid", func(t *testing.T) { + agentDesc := &atomic.Value{} + agentDesc.Store(&protobufs.AgentDescription{}) + initialID := uuid.MustParse("018fee23-4a51-7303-a441-73faed7d9deb") + newID := uuid.MustParse("018fef3f-14a8-73ef-b63e-3b96b146ea38") + s := Supervisor{ + logger: zap.NewNop(), + pidProvider: defaultPIDProvider{}, + config: config.Supervisor{}, + hasNewConfig: make(chan struct{}, 1), + persistentState: &persistentState{InstanceID: initialID}, + agentDescription: agentDesc, + agentConfigOwnMetricsSection: &atomic.Value{}, + cfgState: &atomic.Value{}, + effectiveConfig: &atomic.Value{}, + agentHealthCheckEndpoint: "localhost:8000", + opampClient: client.NewHTTP(newLoggerFromZap(zap.NewNop(), "opamp-client")), + } + require.NoError(t, s.createTemplates()) + + s.onMessage(context.Background(), &types.MessageData{ + AgentIdentification: &protobufs.AgentIdentification{ + NewInstanceUid: newID[:], + }, + }) + + require.Equal(t, newID, s.persistentState.InstanceID) + }) + + t.Run("AgentIdentification - New instance ID is invalid", func(t *testing.T) { + agentDesc := &atomic.Value{} + agentDesc.Store(&protobufs.AgentDescription{}) + + testUUID := uuid.MustParse("018fee23-4a51-7303-a441-73faed7d9deb") + s := Supervisor{ + logger: zap.NewNop(), + pidProvider: defaultPIDProvider{}, + config: config.Supervisor{}, + hasNewConfig: make(chan struct{}, 1), + persistentState: &persistentState{InstanceID: testUUID}, + agentDescription: agentDesc, + agentConfigOwnMetricsSection: &atomic.Value{}, + cfgState: &atomic.Value{}, + effectiveConfig: &atomic.Value{}, + agentHealthCheckEndpoint: "localhost:8000", + } + require.NoError(t, s.createTemplates()) + + s.onMessage(context.Background(), &types.MessageData{ + AgentIdentification: &protobufs.AgentIdentification{ + NewInstanceUid: []byte("invalid-value"), + }, + }) + + require.Equal(t, testUUID, s.persistentState.InstanceID) + }) + + t.Run("CustomMessage - Custom message from server is forwarded to agent", func(t *testing.T) { + customMessage := &protobufs.CustomMessage{ + Capability: "teapot", + Type: "brew", + Data: []byte("chamomile"), + } + + testUUID := uuid.MustParse("018fee23-4a51-7303-a441-73faed7d9deb") + gotMessage := false + var agentConn serverTypes.Connection = &mockConn{ + sendFunc: func(_ context.Context, message *protobufs.ServerToAgent) error { + require.Equal(t, &protobufs.ServerToAgent{ + InstanceUid: testUUID[:], + CustomMessage: customMessage, + }, message) + gotMessage = true + + return nil + }, + } + + agentConnAtomic := &atomic.Value{} + agentConnAtomic.Store(agentConn) + + s := Supervisor{ + logger: zap.NewNop(), + pidProvider: defaultPIDProvider{}, + config: config.Supervisor{}, + hasNewConfig: make(chan struct{}, 1), + persistentState: &persistentState{InstanceID: testUUID}, + agentConfigOwnMetricsSection: &atomic.Value{}, + cfgState: &atomic.Value{}, + effectiveConfig: &atomic.Value{}, + agentConn: agentConnAtomic, + agentHealthCheckEndpoint: "localhost:8000", + customMessageToServer: make(chan *protobufs.CustomMessage, 10), + doneChan: make(chan struct{}), + } + + s.onMessage(context.Background(), &types.MessageData{ + CustomMessage: customMessage, + }) + + require.True(t, gotMessage, "Message was not sent to agent") + }) + + t.Run("CustomCapabilities - Custom capabilities from server are forwarded to agent", func(t *testing.T) { + customCapabilities := &protobufs.CustomCapabilities{ + Capabilities: []string{"coffeemaker", "teapot"}, + } + testUUID := uuid.MustParse("018fee23-4a51-7303-a441-73faed7d9deb") + gotMessage := false + var agentConn serverTypes.Connection = &mockConn{ + sendFunc: func(_ context.Context, message *protobufs.ServerToAgent) error { + require.Equal(t, &protobufs.ServerToAgent{ + InstanceUid: testUUID[:], + CustomCapabilities: customCapabilities, + }, message) + gotMessage = true + + return nil + }, + } + + agentConnAtomic := &atomic.Value{} + agentConnAtomic.Store(agentConn) + + s := Supervisor{ + logger: zap.NewNop(), + pidProvider: defaultPIDProvider{}, + config: config.Supervisor{}, + hasNewConfig: make(chan struct{}, 1), + persistentState: &persistentState{InstanceID: testUUID}, + agentConfigOwnMetricsSection: &atomic.Value{}, + effectiveConfig: &atomic.Value{}, + agentConn: agentConnAtomic, + agentHealthCheckEndpoint: "localhost:8000", + customMessageToServer: make(chan *protobufs.CustomMessage, 10), + doneChan: make(chan struct{}), + } + + s.onMessage(context.Background(), &types.MessageData{ + CustomCapabilities: customCapabilities, + }) + + require.True(t, gotMessage, "Message was not sent to agent") + }) + + t.Run("Processes all ServerToAgent fields", func(t *testing.T) { + agentDesc := &atomic.Value{} + agentDesc.Store(&protobufs.AgentDescription{ + NonIdentifyingAttributes: []*protobufs.KeyValue{ + { + Key: "runtime.type", + Value: &protobufs.AnyValue{ + Value: &protobufs.AnyValue_StringValue{ + StringValue: "test", + }, + }, + }, + }, + }) + initialID := uuid.MustParse("018fee23-4a51-7303-a441-73faed7d9deb") + newID := uuid.MustParse("018fef3f-14a8-73ef-b63e-3b96b146ea38") + s := Supervisor{ + logger: zap.NewNop(), + pidProvider: defaultPIDProvider{}, + config: config.Supervisor{}, + hasNewConfig: make(chan struct{}, 1), + persistentState: &persistentState{InstanceID: initialID}, + agentDescription: agentDesc, + agentConfigOwnMetricsSection: &atomic.Value{}, + cfgState: &atomic.Value{}, + effectiveConfig: &atomic.Value{}, + agentHealthCheckEndpoint: "localhost:8000", + opampClient: client.NewHTTP(newLoggerFromZap(zap.NewNop(), "opamp-client")), + } + require.NoError(t, s.createTemplates()) + + s.onMessage(context.Background(), &types.MessageData{ + AgentIdentification: &protobufs.AgentIdentification{ + NewInstanceUid: newID[:], + }, + RemoteConfig: &protobufs.AgentRemoteConfig{ + Config: &protobufs.AgentConfigMap{ + ConfigMap: map[string]*protobufs.AgentConfigFile{ + "": { + Body: []byte(""), + }, + }, + }, + }, + OwnMetricsConnSettings: &protobufs.TelemetryConnectionSettings{ + DestinationEndpoint: "http://localhost:4318", + }, + }) + + require.Equal(t, newID, s.persistentState.InstanceID) + t.Log(s.cfgState.Load()) + mergedCfg := s.cfgState.Load().(*configState).mergedConfig + require.Contains(t, mergedCfg, "prometheus/own_metrics") + require.Contains(t, mergedCfg, newID.String()) + require.Contains(t, mergedCfg, "runtime.type: test") + }) + t.Run("RemoteConfig - Remote Config message is processed and merged into local config", func(t *testing.T) { + const testConfigMessage = `receivers: + debug:` + + const expectedMergedConfig = `extensions: + health_check: + endpoint: localhost:8000 + opamp: + instance_uid: 018fee23-4a51-7303-a441-73faed7d9deb + ppid: 88888 + ppid_poll_interval: 5s + server: + ws: + endpoint: ws://127.0.0.1:0/v1/opamp + tls: + insecure: true +receivers: + debug: null +service: + extensions: + - health_check + - opamp + telemetry: + logs: + encoding: json + resource: null +` + + remoteConfig := &protobufs.AgentRemoteConfig{ + Config: &protobufs.AgentConfigMap{ + ConfigMap: map[string]*protobufs.AgentConfigFile{ + "": { + Body: []byte(testConfigMessage), + }, + }, + }, + ConfigHash: []byte("hash"), + } + testUUID := uuid.MustParse("018fee23-4a51-7303-a441-73faed7d9deb") + + remoteConfigStatusUpdated := false + mc := &mockOpAMPClient{ + setRemoteConfigStatusFunc: func(rcs *protobufs.RemoteConfigStatus) error { + remoteConfigStatusUpdated = true + assert.Equal( + t, + &protobufs.RemoteConfigStatus{ + LastRemoteConfigHash: remoteConfig.ConfigHash, + Status: protobufs.RemoteConfigStatuses_RemoteConfigStatuses_APPLYING, + }, + rcs, + ) + return nil + }, + updateEffectiveConfigFunc: func(_ context.Context) error { + return nil + }, + } + + configStorageDir := t.TempDir() + + s := Supervisor{ + logger: zap.NewNop(), + pidProvider: staticPIDProvider(88888), + config: config.Supervisor{ + Storage: config.Storage{ + Directory: configStorageDir, + }, + }, + hasNewConfig: make(chan struct{}, 1), + persistentState: &persistentState{InstanceID: testUUID}, + agentConfigOwnMetricsSection: &atomic.Value{}, + effectiveConfig: &atomic.Value{}, + opampClient: mc, + agentDescription: &atomic.Value{}, + cfgState: &atomic.Value{}, + agentHealthCheckEndpoint: "localhost:8000", + customMessageToServer: make(chan *protobufs.CustomMessage, 10), + doneChan: make(chan struct{}), + } + + require.NoError(t, s.createTemplates()) + + s.agentDescription.Store(&protobufs.AgentDescription{ + IdentifyingAttributes: []*protobufs.KeyValue{}, + NonIdentifyingAttributes: []*protobufs.KeyValue{}, + }) + + s.onMessage(context.Background(), &types.MessageData{ + RemoteConfig: remoteConfig, + }) + + fileContent, err := os.ReadFile(filepath.Join(configStorageDir, lastRecvRemoteConfigFile)) + require.NoError(t, err) + assert.Contains(t, string(fileContent), testConfigMessage) + assert.Equal(t, expectedMergedConfig, s.cfgState.Load().(*configState).mergedConfig) + assert.True(t, remoteConfigStatusUpdated) + }) + t.Run("RemoteConfig - Remote Config message is processed but OpAmp Client fails", func(t *testing.T) { + const testConfigMessage = `receivers: + debug:` + + const expectedMergedConfig = `extensions: + health_check: + endpoint: localhost:8000 + opamp: + instance_uid: 018fee23-4a51-7303-a441-73faed7d9deb + ppid: 88888 + ppid_poll_interval: 5s + server: + ws: + endpoint: ws://127.0.0.1:0/v1/opamp + tls: + insecure: true +receivers: + debug: null +service: + extensions: + - health_check + - opamp + telemetry: + logs: + encoding: json + resource: null +` + + remoteConfig := &protobufs.AgentRemoteConfig{ + Config: &protobufs.AgentConfigMap{ + ConfigMap: map[string]*protobufs.AgentConfigFile{ + "": { + Body: []byte(testConfigMessage), + }, + }, + }, + ConfigHash: []byte("hash"), + } + testUUID := uuid.MustParse("018fee23-4a51-7303-a441-73faed7d9deb") + + remoteConfigStatusUpdated := false + mc := &mockOpAMPClient{ + setRemoteConfigStatusFunc: func(rcs *protobufs.RemoteConfigStatus) error { + remoteConfigStatusUpdated = true + assert.Equal( + t, + &protobufs.RemoteConfigStatus{ + LastRemoteConfigHash: remoteConfig.ConfigHash, + Status: protobufs.RemoteConfigStatuses_RemoteConfigStatuses_APPLYING, + }, + rcs, + ) + return fmt.Errorf("unexpected error") + }, + updateEffectiveConfigFunc: func(_ context.Context) error { + return nil + }, + } + + configStorageDir := t.TempDir() + + s := Supervisor{ + logger: zap.NewNop(), + pidProvider: staticPIDProvider(88888), + config: config.Supervisor{ + Storage: config.Storage{ + Directory: configStorageDir, + }, + }, + hasNewConfig: make(chan struct{}, 1), + persistentState: &persistentState{InstanceID: testUUID}, + agentConfigOwnMetricsSection: &atomic.Value{}, + effectiveConfig: &atomic.Value{}, + opampClient: mc, + agentDescription: &atomic.Value{}, + cfgState: &atomic.Value{}, + agentHealthCheckEndpoint: "localhost:8000", + customMessageToServer: make(chan *protobufs.CustomMessage, 10), + doneChan: make(chan struct{}), + } + + require.NoError(t, s.createTemplates()) + + s.agentDescription.Store(&protobufs.AgentDescription{ + IdentifyingAttributes: []*protobufs.KeyValue{}, + NonIdentifyingAttributes: []*protobufs.KeyValue{}, + }) + + s.onMessage(context.Background(), &types.MessageData{ + RemoteConfig: remoteConfig, + }) + + fileContent, err := os.ReadFile(filepath.Join(configStorageDir, lastRecvRemoteConfigFile)) + require.NoError(t, err) + assert.Contains(t, string(fileContent), testConfigMessage) + assert.Equal(t, expectedMergedConfig, s.cfgState.Load().(*configState).mergedConfig) + assert.True(t, remoteConfigStatusUpdated) + }) + t.Run("RemoteConfig - Invalid Remote Config message is detected and status is set appropriately", func(t *testing.T) { + const testConfigMessage = `invalid` + + remoteConfig := &protobufs.AgentRemoteConfig{ + Config: &protobufs.AgentConfigMap{ + ConfigMap: map[string]*protobufs.AgentConfigFile{ + "": { + Body: []byte(testConfigMessage), + }, + }, + }, + ConfigHash: []byte("hash"), + } + testUUID := uuid.MustParse("018fee23-4a51-7303-a441-73faed7d9deb") + + remoteConfigStatusUpdated := false + mc := &mockOpAMPClient{ + setRemoteConfigStatusFunc: func(rcs *protobufs.RemoteConfigStatus) error { + remoteConfigStatusUpdated = true + assert.Equal(t, remoteConfig.ConfigHash, rcs.LastRemoteConfigHash) + assert.Equal(t, protobufs.RemoteConfigStatuses_RemoteConfigStatuses_FAILED, rcs.Status) + assert.NotEmpty(t, rcs.ErrorMessage) + return nil + }, + updateEffectiveConfigFunc: func(_ context.Context) error { + return nil + }, + } + + configStorageDir := t.TempDir() + + s := Supervisor{ + logger: zap.NewNop(), + pidProvider: defaultPIDProvider{}, + config: config.Supervisor{ + Storage: config.Storage{ + Directory: configStorageDir, + }, + }, + hasNewConfig: make(chan struct{}, 1), + persistentState: &persistentState{InstanceID: testUUID}, + agentConfigOwnMetricsSection: &atomic.Value{}, + effectiveConfig: &atomic.Value{}, + opampClient: mc, + agentDescription: &atomic.Value{}, + cfgState: &atomic.Value{}, + agentHealthCheckEndpoint: "localhost:8000", + customMessageToServer: make(chan *protobufs.CustomMessage, 10), + doneChan: make(chan struct{}), + } + + require.NoError(t, s.createTemplates()) + + s.agentDescription.Store(&protobufs.AgentDescription{ + IdentifyingAttributes: []*protobufs.KeyValue{}, + NonIdentifyingAttributes: []*protobufs.KeyValue{}, + }) + + s.onMessage(context.Background(), &types.MessageData{ + RemoteConfig: remoteConfig, + }) + + fileContent, err := os.ReadFile(filepath.Join(configStorageDir, lastRecvRemoteConfigFile)) + require.NoError(t, err) + assert.Contains(t, string(fileContent), testConfigMessage) + assert.Nil(t, s.cfgState.Load()) + assert.True(t, remoteConfigStatusUpdated) + }) +} + +func Test_handleAgentOpAMPMessage(t *testing.T) { + t.Run("CustomMessage - Custom message from agent is forwarded to server", func(t *testing.T) { + customMessage := &protobufs.CustomMessage{ + Capability: "teapot", + Type: "brew", + Data: []byte("chamomile"), + } + + gotMessageChan := make(chan struct{}) + client := &mockOpAMPClient{ + sendCustomMessageFunc: func(message *protobufs.CustomMessage) (messageSendingChannel chan struct{}, err error) { + require.Equal(t, customMessage, message) + + close(gotMessageChan) + msgChan := make(chan struct{}, 1) + msgChan <- struct{}{} + return msgChan, nil + }, + } + + testUUID := uuid.MustParse("018fee23-4a51-7303-a441-73faed7d9deb") + s := Supervisor{ + logger: zap.NewNop(), + pidProvider: defaultPIDProvider{}, + config: config.Supervisor{}, + hasNewConfig: make(chan struct{}, 1), + persistentState: &persistentState{InstanceID: testUUID}, + agentConfigOwnMetricsSection: &atomic.Value{}, + effectiveConfig: &atomic.Value{}, + agentConn: &atomic.Value{}, + opampClient: client, + agentHealthCheckEndpoint: "localhost:8000", + customMessageToServer: make(chan *protobufs.CustomMessage, 10), + doneChan: make(chan struct{}), + } + + loopDoneChan := make(chan struct{}) + go func() { + defer close(loopDoneChan) + s.forwardCustomMessagesToServerLoop() + }() + + s.handleAgentOpAMPMessage(&mockConn{}, &protobufs.AgentToServer{ + CustomMessage: customMessage, + }) + + select { + case <-gotMessageChan: + case <-time.After(2 * time.Second): + t.Fatal("Timeout waiting for custom message to send") + } + + close(s.doneChan) + + select { + case <-loopDoneChan: + case <-time.After(2 * time.Second): + t.Fatal("Timeout waiting for forward loop to stop") + } + }) + + t.Run("CustomCapabilities - Custom capabilities from agent are forwarded to server", func(t *testing.T) { + customCapabilities := &protobufs.CustomCapabilities{ + Capabilities: []string{"coffeemaker", "teapot"}, + } + + client := &mockOpAMPClient{ + setCustomCapabilitiesFunc: func(caps *protobufs.CustomCapabilities) error { + require.Equal(t, customCapabilities, caps) + return nil + }, + } + + testUUID := uuid.MustParse("018fee23-4a51-7303-a441-73faed7d9deb") + s := Supervisor{ + logger: zap.NewNop(), + pidProvider: defaultPIDProvider{}, + config: config.Supervisor{}, + hasNewConfig: make(chan struct{}, 1), + persistentState: &persistentState{InstanceID: testUUID}, + agentConfigOwnMetricsSection: &atomic.Value{}, + effectiveConfig: &atomic.Value{}, + agentConn: &atomic.Value{}, + opampClient: client, + agentHealthCheckEndpoint: "localhost:8000", + customMessageToServer: make(chan *protobufs.CustomMessage, 10), + doneChan: make(chan struct{}), + } + + s.handleAgentOpAMPMessage(&mockConn{}, &protobufs.AgentToServer{ + CustomCapabilities: customCapabilities, + }) + }) + + t.Run("EffectiveConfig - Effective config from agent is stored in OpAmpClient", func(t *testing.T) { + updatedClientEffectiveConfig := false + mc := &mockOpAMPClient{ + updateEffectiveConfigFunc: func(_ context.Context) error { + updatedClientEffectiveConfig = true + return nil + }, + } + + testUUID := uuid.MustParse("018fee23-4a51-7303-a441-73faed7d9deb") + s := Supervisor{ + logger: zap.NewNop(), + pidProvider: defaultPIDProvider{}, + config: config.Supervisor{}, + hasNewConfig: make(chan struct{}, 1), + persistentState: &persistentState{InstanceID: testUUID}, + agentConfigOwnMetricsSection: &atomic.Value{}, + effectiveConfig: &atomic.Value{}, + agentConn: &atomic.Value{}, + opampClient: mc, + agentHealthCheckEndpoint: "localhost:8000", + customMessageToServer: make(chan *protobufs.CustomMessage, 10), + doneChan: make(chan struct{}), + } + + s.handleAgentOpAMPMessage(&mockConn{}, &protobufs.AgentToServer{ + EffectiveConfig: &protobufs.EffectiveConfig{ + ConfigMap: &protobufs.AgentConfigMap{ + ConfigMap: map[string]*protobufs.AgentConfigFile{ + "": { + Body: []byte("test"), + }, + }, + }, + }, + }) + + assert.Equal(t, "test", s.effectiveConfig.Load()) + assert.True(t, updatedClientEffectiveConfig) + }) + t.Run("EffectiveConfig - Effective config from agent is stored in OpAmpClient; client returns error", func(t *testing.T) { + updatedClientEffectiveConfig := false + mc := &mockOpAMPClient{ + updateEffectiveConfigFunc: func(_ context.Context) error { + updatedClientEffectiveConfig = true + return fmt.Errorf("unexpected error") + }, + } + + testUUID := uuid.MustParse("018fee23-4a51-7303-a441-73faed7d9deb") + s := Supervisor{ + logger: zap.NewNop(), + pidProvider: defaultPIDProvider{}, + config: config.Supervisor{}, + hasNewConfig: make(chan struct{}, 1), + persistentState: &persistentState{InstanceID: testUUID}, + agentConfigOwnMetricsSection: &atomic.Value{}, + effectiveConfig: &atomic.Value{}, + agentConn: &atomic.Value{}, + opampClient: mc, + agentHealthCheckEndpoint: "localhost:8000", + customMessageToServer: make(chan *protobufs.CustomMessage, 10), + doneChan: make(chan struct{}), + } + + s.handleAgentOpAMPMessage(&mockConn{}, &protobufs.AgentToServer{ + EffectiveConfig: &protobufs.EffectiveConfig{ + ConfigMap: &protobufs.AgentConfigMap{ + ConfigMap: map[string]*protobufs.AgentConfigFile{ + "": { + Body: []byte("test"), + }, + }, + }, + }, + }) + + assert.Equal(t, "test", s.effectiveConfig.Load()) + assert.True(t, updatedClientEffectiveConfig) + }) + t.Run("EffectiveConfig - Effective config message contains an empty config", func(t *testing.T) { + updatedClientEffectiveConfig := false + mc := &mockOpAMPClient{ + updateEffectiveConfigFunc: func(_ context.Context) error { + updatedClientEffectiveConfig = true + return nil + }, + } + + testUUID := uuid.MustParse("018fee23-4a51-7303-a441-73faed7d9deb") + s := Supervisor{ + logger: zap.NewNop(), + pidProvider: defaultPIDProvider{}, + config: config.Supervisor{}, + hasNewConfig: make(chan struct{}, 1), + persistentState: &persistentState{InstanceID: testUUID}, + agentConfigOwnMetricsSection: &atomic.Value{}, + effectiveConfig: &atomic.Value{}, + agentConn: &atomic.Value{}, + opampClient: mc, + agentHealthCheckEndpoint: "localhost:8000", + customMessageToServer: make(chan *protobufs.CustomMessage, 10), + doneChan: make(chan struct{}), + } + + s.handleAgentOpAMPMessage(&mockConn{}, &protobufs.AgentToServer{ + EffectiveConfig: &protobufs.EffectiveConfig{ + ConfigMap: &protobufs.AgentConfigMap{ + ConfigMap: map[string]*protobufs.AgentConfigFile{}, + }, + }, + }) + + assert.Empty(t, s.effectiveConfig.Load()) + assert.False(t, updatedClientEffectiveConfig) + }) +} + +func TestSupervisor_setAgentDescription(t *testing.T) { + s := &Supervisor{ + agentDescription: &atomic.Value{}, + config: config.Supervisor{ + Agent: config.Agent{ + Description: config.AgentDescription{ + IdentifyingAttributes: map[string]string{ + "overriding-attribute": "overridden-value", + "additional-attribute": "additional-value", + }, + NonIdentifyingAttributes: map[string]string{ + "overriding-attribute": "overridden-value", + "additional-attribute": "additional-value", + }, + }, + }, + }, + } + + ad := &protobufs.AgentDescription{ + IdentifyingAttributes: []*protobufs.KeyValue{ + { + Key: "overriding-attribute", + Value: &protobufs.AnyValue{ + Value: &protobufs.AnyValue_StringValue{ + StringValue: "old-value", + }, + }, + }, + { + Key: "other-attribute", + Value: &protobufs.AnyValue{ + Value: &protobufs.AnyValue_StringValue{ + StringValue: "old-value", + }, + }, + }, + }, + NonIdentifyingAttributes: []*protobufs.KeyValue{ + { + Key: "overriding-attribute", + Value: &protobufs.AnyValue{ + Value: &protobufs.AnyValue_StringValue{ + StringValue: "old-value", + }, + }, + }, + { + Key: "other-attribute", + Value: &protobufs.AnyValue{ + Value: &protobufs.AnyValue_StringValue{ + StringValue: "old-value", + }, + }, + }, + }, + } + s.setAgentDescription(ad) + + updatedAgentDescription := s.agentDescription.Load() + + expectedAgentDescription := &protobufs.AgentDescription{ + IdentifyingAttributes: []*protobufs.KeyValue{ + { + Key: "additional-attribute", + Value: &protobufs.AnyValue{ + Value: &protobufs.AnyValue_StringValue{ + StringValue: "additional-value", + }, + }, + }, + { + Key: "other-attribute", + Value: &protobufs.AnyValue{ + Value: &protobufs.AnyValue_StringValue{ + StringValue: "old-value", + }, + }, + }, + { + Key: "overriding-attribute", + Value: &protobufs.AnyValue{ + Value: &protobufs.AnyValue_StringValue{ + StringValue: "overridden-value", + }, + }, + }, + }, + NonIdentifyingAttributes: []*protobufs.KeyValue{ + { + Key: "additional-attribute", + Value: &protobufs.AnyValue{ + Value: &protobufs.AnyValue_StringValue{ + StringValue: "additional-value", + }, + }, + }, + { + Key: "other-attribute", + Value: &protobufs.AnyValue{ + Value: &protobufs.AnyValue_StringValue{ + StringValue: "old-value", + }, + }, + }, + { + Key: "overriding-attribute", + Value: &protobufs.AnyValue{ + Value: &protobufs.AnyValue_StringValue{ + StringValue: "overridden-value", + }, + }, + }, + }, + } + + assert.Equal(t, expectedAgentDescription, updatedAgentDescription) +} + +type staticPIDProvider int + +func (s staticPIDProvider) PID() int { + return int(s) +} + +type mockOpAMPClient struct { + agentDesc *protobufs.AgentDescription + sendCustomMessageFunc func(message *protobufs.CustomMessage) (messageSendingChannel chan struct{}, err error) + setCustomCapabilitiesFunc func(customCapabilities *protobufs.CustomCapabilities) error + updateEffectiveConfigFunc func(ctx context.Context) error + setRemoteConfigStatusFunc func(rcs *protobufs.RemoteConfigStatus) error +} + +func (mockOpAMPClient) Start(_ context.Context, _ types.StartSettings) error { + return nil +} + +func (mockOpAMPClient) Stop(_ context.Context) error { + return nil +} + +func (m *mockOpAMPClient) SetAgentDescription(descr *protobufs.AgentDescription) error { + m.agentDesc = descr + return nil +} + +func (m mockOpAMPClient) AgentDescription() *protobufs.AgentDescription { + return m.agentDesc +} + +func (mockOpAMPClient) SetHealth(_ *protobufs.ComponentHealth) error { + return nil +} + +func (m mockOpAMPClient) UpdateEffectiveConfig(ctx context.Context) error { + return m.updateEffectiveConfigFunc(ctx) +} + +func (m mockOpAMPClient) SetRemoteConfigStatus(rcs *protobufs.RemoteConfigStatus) error { + return m.setRemoteConfigStatusFunc(rcs) +} + +func (mockOpAMPClient) SetPackageStatuses(_ *protobufs.PackageStatuses) error { + return nil +} + +func (mockOpAMPClient) RequestConnectionSettings(_ *protobufs.ConnectionSettingsRequest) error { + return nil +} + +func (m mockOpAMPClient) SetCustomCapabilities(customCapabilities *protobufs.CustomCapabilities) error { + if m.setCustomCapabilitiesFunc != nil { + return m.setCustomCapabilitiesFunc(customCapabilities) + } + return nil +} + +func (m mockOpAMPClient) SendCustomMessage(message *protobufs.CustomMessage) (messageSendingChannel chan struct{}, err error) { + if m.sendCustomMessageFunc != nil { + return m.sendCustomMessageFunc(message) + } + + msgChan := make(chan struct{}, 1) + msgChan <- struct{}{} + return msgChan, nil +} + +func (m mockOpAMPClient) SetFlags(_ protobufs.AgentToServerFlags) {} + +type mockConn struct { + sendFunc func(ctx context.Context, message *protobufs.ServerToAgent) error +} + +func (mockConn) Connection() net.Conn { + return nil +} + +func (m mockConn) Send(ctx context.Context, message *protobufs.ServerToAgent) error { + if m.sendFunc != nil { + return m.sendFunc(ctx, message) + } + return nil +} + +func (mockConn) Disconnect() error { + return nil +} + +func TestSupervisor_findRandomPort(t *testing.T) { + s := Supervisor{} + port, err := s.findRandomPort() + + require.NoError(t, err) + require.NotZero(t, port) +} + +func TestSupervisor_setupOwnMetrics(t *testing.T) { + testUUID := uuid.MustParse("018fee23-4a51-7303-a441-73faed7d9deb") + t.Run("No DestinationEndpoint set", func(t *testing.T) { + s := Supervisor{ + logger: zap.NewNop(), + agentConfigOwnMetricsSection: &atomic.Value{}, + cfgState: &atomic.Value{}, + persistentState: &persistentState{InstanceID: testUUID}, + pidProvider: staticPIDProvider(1234), + } + require.NoError(t, s.createTemplates()) + + agentDesc := &atomic.Value{} + agentDesc.Store(&protobufs.AgentDescription{ + IdentifyingAttributes: []*protobufs.KeyValue{ + { + Key: "service.name", + Value: &protobufs.AnyValue{ + Value: &protobufs.AnyValue_StringValue{ + StringValue: "otelcol", + }, + }, + }, + }, + }) + + s.agentDescription = agentDesc + + configChanged := s.setupOwnMetrics(context.Background(), &protobufs.TelemetryConnectionSettings{ + DestinationEndpoint: "", + }) + + assert.True(t, configChanged) + assert.Empty(t, s.agentConfigOwnMetricsSection.Load().(string)) + }) + t.Run("DestinationEndpoint set - enable own metrics", func(t *testing.T) { + s := Supervisor{ + logger: zap.NewNop(), + agentConfigOwnMetricsSection: &atomic.Value{}, + cfgState: &atomic.Value{}, + persistentState: &persistentState{InstanceID: testUUID}, + pidProvider: staticPIDProvider(1234), + } + err := s.createTemplates() + + agentDesc := &atomic.Value{} + agentDesc.Store(&protobufs.AgentDescription{ + IdentifyingAttributes: []*protobufs.KeyValue{ + { + Key: "service.name", + Value: &protobufs.AnyValue{ + Value: &protobufs.AnyValue_StringValue{ + StringValue: "otelcol", + }, + }, + }, + }, + }) + + s.agentDescription = agentDesc + + require.NoError(t, err) + + configChanged := s.setupOwnMetrics(context.Background(), &protobufs.TelemetryConnectionSettings{ + DestinationEndpoint: "localhost", + }) + + expectedOwnMetricsSection := `receivers: + # Collect own metrics + prometheus/own_metrics: + config: + scrape_configs: + - job_name: 'otel-collector' + scrape_interval: 10s + static_configs: + - targets: ['0.0.0.0:55555'] +exporters: + otlphttp/own_metrics: + metrics_endpoint: "localhost" + +service: + telemetry: + metrics: + address: ":55555" + pipelines: + metrics/own_metrics: + receivers: [prometheus/own_metrics] + exporters: [otlphttp/own_metrics] +` + + assert.True(t, configChanged) + + got := s.agentConfigOwnMetricsSection.Load().(string) + got = strings.ReplaceAll(got, "\r\n", "\n") + + // replace the port because that changes on each run + portRegex := regexp.MustCompile(":[0-9]{5}") + replaced := portRegex.ReplaceAll([]byte(got), []byte(":55555")) + assert.Equal(t, expectedOwnMetricsSection, string(replaced)) + }) +} + +func TestSupervisor_createEffectiveConfigMsg(t *testing.T) { + t.Run("empty config", func(t *testing.T) { + s := Supervisor{ + effectiveConfig: &atomic.Value{}, + cfgState: &atomic.Value{}, + } + got := s.createEffectiveConfigMsg() + + assert.Empty(t, got.ConfigMap.ConfigMap[""].Body) + }) + t.Run("effective and merged config set - prefer effective config", func(t *testing.T) { + s := Supervisor{ + effectiveConfig: &atomic.Value{}, + cfgState: &atomic.Value{}, + } + + s.effectiveConfig.Store("effective") + s.cfgState.Store("merged") + + got := s.createEffectiveConfigMsg() + + assert.Equal(t, []byte("effective"), got.ConfigMap.ConfigMap[""].Body) + }) + t.Run("only merged config set", func(t *testing.T) { + s := Supervisor{ + effectiveConfig: &atomic.Value{}, + cfgState: &atomic.Value{}, + } + + s.cfgState.Store(&configState{mergedConfig: "merged"}) + + got := s.createEffectiveConfigMsg() + + assert.Equal(t, []byte("merged"), got.ConfigMap.ConfigMap[""].Body) + }) +} + +func TestSupervisor_loadAndWriteInitialMergedConfig(t *testing.T) { + t.Run("load initial config", func(t *testing.T) { + configDir := t.TempDir() + + const testLastReceivedRemoteConfig = `receiver: + debug/remote: +` + + const expectedMergedConfig = `exporters: + otlphttp/own_metrics: + metrics_endpoint: localhost +extensions: + health_check: + endpoint: "" + opamp: + instance_uid: 018fee23-4a51-7303-a441-73faed7d9deb + ppid: 1234 + ppid_poll_interval: 5s + server: + ws: + endpoint: ws://127.0.0.1:0/v1/opamp + tls: + insecure: true +receiver: + debug/remote: null +receivers: + prometheus/own_metrics: + config: + scrape_configs: + - job_name: otel-collector + scrape_interval: 10s + static_configs: + - targets: + - 0.0.0.0:55555 +service: + extensions: + - health_check + - opamp + pipelines: + metrics/own_metrics: + exporters: + - otlphttp/own_metrics + receivers: + - prometheus/own_metrics + telemetry: + logs: + encoding: json + metrics: + address: :55555 + resource: + service.name: otelcol +` + + remoteCfg := &protobufs.AgentRemoteConfig{ + Config: &protobufs.AgentConfigMap{ + ConfigMap: map[string]*protobufs.AgentConfigFile{ + "": { + Body: []byte(testLastReceivedRemoteConfig), + }, + }, + }, + ConfigHash: []byte("hash"), + } + + marshalledRemoteCfg, err := proto.Marshal(remoteCfg) + require.NoError(t, err) + + ownMetricsCfg := &protobufs.TelemetryConnectionSettings{ + DestinationEndpoint: "localhost", + } + + marshalledOwnMetricsCfg, err := proto.Marshal(ownMetricsCfg) + require.NoError(t, err) + + require.NoError(t, os.WriteFile(filepath.Join(configDir, lastRecvRemoteConfigFile), marshalledRemoteCfg, 0o600)) + require.NoError(t, os.WriteFile(filepath.Join(configDir, lastRecvOwnMetricsConfigFile), marshalledOwnMetricsCfg, 0o600)) + + s := Supervisor{ + logger: zap.NewNop(), + config: config.Supervisor{ + Capabilities: config.Capabilities{ + AcceptsRemoteConfig: true, + ReportsOwnMetrics: true, + }, + Storage: config.Storage{ + Directory: configDir, + }, + }, + agentConfigOwnMetricsSection: &atomic.Value{}, + cfgState: &atomic.Value{}, + persistentState: &persistentState{ + InstanceID: uuid.MustParse("018fee23-4a51-7303-a441-73faed7d9deb"), + }, + pidProvider: staticPIDProvider(1234), + } + agentDesc := &atomic.Value{} + agentDesc.Store(&protobufs.AgentDescription{ + IdentifyingAttributes: []*protobufs.KeyValue{ + { + Key: "service.name", + Value: &protobufs.AnyValue{ + Value: &protobufs.AnyValue_StringValue{ + StringValue: "otelcol", + }, + }, + }, + }, + }) + + s.agentDescription = agentDesc + + require.NoError(t, s.createTemplates()) + require.NoError(t, s.loadAndWriteInitialMergedConfig()) + + assert.Equal(t, remoteCfg.String(), s.remoteConfig.String()) + + gotMergedConfig := s.cfgState.Load().(*configState).mergedConfig + gotMergedConfig = strings.ReplaceAll(gotMergedConfig, "\r\n", "\n") + // replace random port numbers + portRegex := regexp.MustCompile(":[0-9]{5}") + replacedMergedConfig := portRegex.ReplaceAll([]byte(gotMergedConfig), []byte(":55555")) + assert.Equal(t, expectedMergedConfig, string(replacedMergedConfig)) + }) +} + +func TestSupervisor_composeNoopConfig(t *testing.T) { + const expectedConfig = `exporters: + nop: null +extensions: + opamp: + instance_uid: 018fee23-4a51-7303-a441-73faed7d9deb + ppid: 1234 + ppid_poll_interval: 5s + server: + ws: + endpoint: ws://127.0.0.1:0/v1/opamp + tls: + insecure: true +receivers: + nop: null +service: + extensions: + - opamp + pipelines: + traces: + exporters: + - nop + receivers: + - nop +` + s := Supervisor{ + persistentState: &persistentState{ + InstanceID: uuid.MustParse("018fee23-4a51-7303-a441-73faed7d9deb"), + }, + pidProvider: staticPIDProvider(1234), + } + + require.NoError(t, s.createTemplates()) + + noopConfigBytes, err := s.composeNoopConfig() + noopConfig := strings.ReplaceAll(string(noopConfigBytes), "\r\n", "\n") + + require.NoError(t, err) + require.Equal(t, expectedConfig, noopConfig) +} + +func TestSupervisor_configStrictUnmarshal(t *testing.T) { + tmpDir, err := os.MkdirTemp(os.TempDir(), "*") + require.NoError(t, err) + + configuration := ` +server: + endpoint: ws://localhost/v1/opamp + tls: + insecure: true + +capabilities: + reports_effective_config: true + invalid_key: invalid_value +` + + cfgPath := filepath.Join(tmpDir, "config.yaml") + err = os.WriteFile(cfgPath, []byte(configuration), 0o600) + require.NoError(t, err) + + _, err = config.Load(cfgPath) + require.Error(t, err) + require.ErrorContains(t, err, "decoding failed") + + t.Cleanup(func() { + require.NoError(t, os.Chmod(tmpDir, 0o700)) + require.NoError(t, os.RemoveAll(tmpDir)) + }) } diff --git a/cmd/opampsupervisor/supervisor/supervisor_windows.go b/cmd/opampsupervisor/supervisor/supervisor_windows.go new file mode 100644 index 000000000000..9c2a0fab4e47 --- /dev/null +++ b/cmd/opampsupervisor/supervisor/supervisor_windows.go @@ -0,0 +1,169 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +//go:build windows + +package supervisor + +import ( + "flag" + "fmt" + + "go.uber.org/zap" + "go.uber.org/zap/zapcore" + "golang.org/x/sys/windows" + "golang.org/x/sys/windows/svc" + "golang.org/x/sys/windows/svc/eventlog" + + "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/opampsupervisor/supervisor/config" +) + +type windowsService struct { + sup *Supervisor +} + +func NewSvcHandler() svc.Handler { + return &windowsService{} +} + +func (ws *windowsService) Execute(args []string, requests <-chan svc.ChangeRequest, changes chan<- svc.Status) (ssec bool, errno uint32) { + // The first argument supplied to service.Execute is the service name. If this is + // not provided for some reason, raise a relevant error to the system event log + if len(args) == 0 { + return false, uint32(windows.ERROR_INVALID_SERVICENAME) + } + + elog, err := openEventLog(args[0]) + if err != nil { + return false, uint32(windows.ERROR_EVENTLOG_CANT_START) + } + + changes <- svc.Status{State: svc.StartPending} + if err = ws.start(elog); err != nil { + _ = elog.Error(3, fmt.Sprintf("failed to start service: %v", err)) + return false, uint32(windows.ERROR_EXCEPTION_IN_SERVICE) + } + changes <- svc.Status{State: svc.Running, Accepts: svc.AcceptStop | svc.AcceptShutdown} + + for req := range requests { + switch req.Cmd { + case svc.Interrogate: + changes <- req.CurrentStatus + + case svc.Stop, svc.Shutdown: + changes <- svc.Status{State: svc.StopPending} + ws.stop() + changes <- svc.Status{State: svc.Stopped} + return false, 0 + + default: + _ = elog.Error(3, fmt.Sprintf("unexpected service control request #%d", req.Cmd)) + return false, uint32(windows.ERROR_INVALID_SERVICE_CONTROL) + } + } + + return false, 0 +} + +func (ws *windowsService) start(elog *eventlog.Log) error { + configFlag := flag.String("config", "", "Path to a supervisor configuration file") + flag.Parse() + + logger, _ := zap.NewDevelopment(zap.WrapCore(withWindowsCore(elog))) + + cfg, err := config.Load(*configFlag) + if err != nil { + return fmt.Errorf("load config: %w", err) + } + + sup, err := NewSupervisor(logger, cfg) + if err != nil { + return fmt.Errorf("new supervisor: %w", err) + } + ws.sup = sup + + return ws.sup.Start() +} + +func (ws *windowsService) stop() { + ws.sup.Shutdown() +} + +func openEventLog(serviceName string) (*eventlog.Log, error) { + elog, err := eventlog.Open(serviceName) + if err != nil { + return nil, fmt.Errorf("service failed to open event log: %w", err) + } + + return elog, nil +} + +// Logger wrappings +var _ zapcore.Core = (*windowsEventLogCore)(nil) + +type windowsEventLogCore struct { + core zapcore.Core + elog *eventlog.Log + encoder zapcore.Encoder +} + +func (w windowsEventLogCore) Enabled(level zapcore.Level) bool { + return w.core.Enabled(level) +} + +func (w windowsEventLogCore) With(fields []zapcore.Field) zapcore.Core { + enc := w.encoder.Clone() + for _, field := range fields { + field.AddTo(enc) + } + return windowsEventLogCore{ + core: w.core, + elog: w.elog, + encoder: enc, + } +} + +func (w windowsEventLogCore) Check(ent zapcore.Entry, ce *zapcore.CheckedEntry) *zapcore.CheckedEntry { + if w.Enabled(ent.Level) { + return ce.AddCore(ent, w) + } + return ce +} + +func (w windowsEventLogCore) Write(ent zapcore.Entry, fields []zapcore.Field) error { + buf, err := w.encoder.EncodeEntry(ent, fields) + if err != nil { + _ = w.elog.Warning(2, fmt.Sprintf("failed encoding log entry %v\r\n", err)) + return err + } + msg := buf.String() + buf.Free() + + switch ent.Level { + case zapcore.FatalLevel, zapcore.PanicLevel, zapcore.DPanicLevel: + // golang.org/x/sys/windows/svc/eventlog does not support Critical level event logs + return w.elog.Error(3, msg) + case zapcore.ErrorLevel: + return w.elog.Error(3, msg) + case zapcore.WarnLevel: + return w.elog.Warning(2, msg) + case zapcore.InfoLevel: + return w.elog.Info(1, msg) + } + // We would not be here if debug were disabled so log as info to not drop. + return w.elog.Info(1, msg) +} + +func (w windowsEventLogCore) Sync() error { + return w.core.Sync() +} + +// TODO: If supervisor logging becomes configurable, update this function to respect that config +func withWindowsCore(elog *eventlog.Log) func(zapcore.Core) zapcore.Core { + return func(core zapcore.Core) zapcore.Core { + // Use the Windows Event Log + encoderConfig := zap.NewProductionEncoderConfig() + encoderConfig.LineEnding = "\r\n" + return windowsEventLogCore{core, elog, zapcore.NewConsoleEncoder(encoderConfig)} + } +} diff --git a/cmd/opampsupervisor/supervisor/supervisor_windows_service_test.go b/cmd/opampsupervisor/supervisor/supervisor_windows_service_test.go new file mode 100644 index 000000000000..99ee80ca1021 --- /dev/null +++ b/cmd/opampsupervisor/supervisor/supervisor_windows_service_test.go @@ -0,0 +1,127 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +//go:build windows && win32service + +package supervisor + +import ( + "context" + "encoding/xml" + "os/exec" + "testing" + "time" + + "github.com/stretchr/testify/require" + "golang.org/x/sys/windows/svc" + "golang.org/x/sys/windows/svc/mgr" + + "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/opampsupervisor/supervisor/healthchecker" +) + +const ( + supervisorServiceName = "opampsupervisor" +) + +// Test the supervisor as a Windows service. +// The test assumes that the service and respective event source are already created. +// +// To test locally: +// * Build the supervisor and collector binaries. Note you'll need to update the name of the collector binary in the supervisor config file +// - cd cmd/opampsupervisor; go build +// - make otelcontribcol +// +// * Install the Windows service +// - New-Service -Name "opampsupervisor" -StartupType "Manual" -BinaryPathName "${PWD}\cmd\opampsupervisor --config ${PWD}\cmd\opampsupervisor\supervisor\testdata\supervisor_windows_service_test_config.yaml\" +// +// * Create event log source +// - eventcreate.exe /t information /id 1 /l application /d "Creating event provider for 'opampsupervisor'" /so opampsupervisor +// + +// The test also must be executed with administrative privileges. +func TestSupervisorAsService(t *testing.T) { + scm, err := mgr.Connect() + require.NoError(t, err) + defer scm.Disconnect() + + service, err := scm.OpenService(supervisorServiceName) + require.NoError(t, err) + defer service.Close() + + // start up supervisor service + startTime := time.Now() + err = service.Start() + require.NoError(t, err) + + defer func() { + _, err = service.Control(svc.Stop) + require.NoError(t, err) + + require.Eventually(t, func() bool { + status, _ := service.Query() + return status.State == svc.Stopped + }, 10*time.Second, 500*time.Millisecond) + }() + + // wait for supervisor service to start + require.Eventually(t, func() bool { + status, _ := service.Query() + return status.State == svc.Running + }, 10*time.Second, 500*time.Millisecond) + + // verify supervisor service started & healthy + // Read the events from the opampsupervisor source and check that they were emitted after the service + // command started. This is a simple validation that the messages are being logged on the + // Windows event log. + cmd := exec.Command("wevtutil.exe", "qe", "Application", "/c:1", "/rd:true", "/f:RenderedXml", "/q:*[System[Provider[@Name='opampsupervisor']]]") + out, err := cmd.CombinedOutput() + require.NoError(t, err) + + var e Event + require.NoError(t, xml.Unmarshal([]byte(out), &e)) + + eventTime, err := time.Parse("2006-01-02T15:04:05.9999999Z07:00", e.System.TimeCreated.SystemTime) + require.NoError(t, err) + + require.True(t, eventTime.After(startTime.In(time.UTC))) + + // verify the collector is running healthy + hc := healthchecker.NewHTTPHealthChecker("http://127.0.0.1:12345") + err = hc.Check(context.Background()) + require.NoError(t, err) +} + +// Helper types to read the XML events from the event log using wevtutil +type Event struct { + XMLName xml.Name `xml:"Event"` + System System `xml:"System"` + Data string `xml:"EventData>Data"` +} + +type System struct { + Provider Provider `xml:"Provider"` + EventID int `xml:"EventID"` + Version int `xml:"Version"` + Level int `xml:"Level"` + Task int `xml:"Task"` + Opcode int `xml:"Opcode"` + Keywords string `xml:"Keywords"` + TimeCreated TimeCreated `xml:"TimeCreated"` + EventRecordID int `xml:"EventRecordID"` + Execution Execution `xml:"Execution"` + Channel string `xml:"Channel"` + Computer string `xml:"Computer"` +} + +type Provider struct { + Name string `xml:"Name,attr"` +} + +type TimeCreated struct { + SystemTime string `xml:"SystemTime,attr"` +} + +type Execution struct { + ProcessID string `xml:"ProcessID,attr"` + ThreadID string `xml:"ThreadID,attr"` +} diff --git a/cmd/opampsupervisor/supervisor/telemetry/logger.go b/cmd/opampsupervisor/supervisor/telemetry/logger.go new file mode 100644 index 000000000000..0bec527b1188 --- /dev/null +++ b/cmd/opampsupervisor/supervisor/telemetry/logger.go @@ -0,0 +1,23 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package telemetry + +import ( + "go.uber.org/zap" + + "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/opampsupervisor/supervisor/config" +) + +func NewLogger(cfg config.Logs) (*zap.Logger, error) { + zapCfg := zap.NewProductionConfig() + + zapCfg.Level = zap.NewAtomicLevelAt(cfg.Level) + zapCfg.OutputPaths = cfg.OutputPaths + + logger, err := zapCfg.Build() + if err != nil { + return nil, err + } + return logger, nil +} diff --git a/cmd/opampsupervisor/supervisor/templates/bootstrap.yaml b/cmd/opampsupervisor/supervisor/templates/bootstrap.yaml deleted file mode 100644 index 7f383312453c..000000000000 --- a/cmd/opampsupervisor/supervisor/templates/bootstrap.yaml +++ /dev/null @@ -1,22 +0,0 @@ -receivers: - nop: -exporters: - nop: - -extensions: - opamp: - instance_uid: "{{.InstanceUid}}" - server: - ws: - endpoint: "ws://localhost:{{.SupervisorPort}}/v1/opamp" - tls: - insecure: true - ppid: {{.PID}} - ppid_poll_interval: {{.PPIDPollInterval}} - -service: - pipelines: - traces: - receivers: [nop] - exporters: [nop] - extensions: [opamp] diff --git a/cmd/opampsupervisor/supervisor/templates/nooppipeline.yaml b/cmd/opampsupervisor/supervisor/templates/nooppipeline.yaml new file mode 100644 index 000000000000..67bfdd611482 --- /dev/null +++ b/cmd/opampsupervisor/supervisor/templates/nooppipeline.yaml @@ -0,0 +1,10 @@ +receivers: + nop: +exporters: + nop: + +service: + pipelines: + traces: + receivers: [nop] + exporters: [nop] diff --git a/cmd/opampsupervisor/supervisor/templates/opampextension.yaml b/cmd/opampsupervisor/supervisor/templates/opampextension.yaml new file mode 100644 index 000000000000..e016e7ebc268 --- /dev/null +++ b/cmd/opampsupervisor/supervisor/templates/opampextension.yaml @@ -0,0 +1,13 @@ +extensions: + opamp: + instance_uid: "{{.InstanceUid}}" + server: + ws: + endpoint: "ws://127.0.0.1:{{.SupervisorPort}}/v1/opamp" + tls: + insecure: true + ppid: {{.PID}} + ppid_poll_interval: {{.PPIDPollInterval}} + +service: + extensions: [opamp] diff --git a/cmd/opampsupervisor/supervisor/testdata/supervisor_windows_service_test_config.yaml b/cmd/opampsupervisor/supervisor/testdata/supervisor_windows_service_test_config.yaml new file mode 100644 index 000000000000..eba517814733 --- /dev/null +++ b/cmd/opampsupervisor/supervisor/testdata/supervisor_windows_service_test_config.yaml @@ -0,0 +1,17 @@ +server: + endpoint: ws://localhost:3001/v1/opamp + +capabilities: + reports_effective_config: true + reports_own_metrics: true + reports_health: true + accepts_remote_config: true + reports_remote_config: true + accepts_restart_command: true + +agent: + executable: ../../../bin/collector_binary + health_check_port: 12345 + +storage: + directory: "./testdata/storage" diff --git a/cmd/opampsupervisor/testdata/collector/effective_config.yaml b/cmd/opampsupervisor/testdata/collector/effective_config.yaml index 5573cc570593..15ba948a6ca6 100644 --- a/cmd/opampsupervisor/testdata/collector/effective_config.yaml +++ b/cmd/opampsupervisor/testdata/collector/effective_config.yaml @@ -4,6 +4,15 @@ exporters: extensions: health_check: endpoint: localhost:8000 + opamp: + instance_uid: 00000000-0000-0000-0000-000000000000 + ppid: 1234 + ppid_poll_interval: 5s + server: + ws: + endpoint: ws://127.0.0.1:0/v1/opamp + tls: + insecure: true receivers: filelog: include: @@ -12,6 +21,7 @@ receivers: service: extensions: - health_check + - opamp pipelines: logs: exporters: diff --git a/cmd/opampsupervisor/testdata/collector/healthcheck_config.yaml b/cmd/opampsupervisor/testdata/collector/healthcheck_config.yaml new file mode 100644 index 000000000000..e6baee1be269 --- /dev/null +++ b/cmd/opampsupervisor/testdata/collector/healthcheck_config.yaml @@ -0,0 +1,16 @@ +receivers: + nop: + +exporters: + nop: + +extensions: + health_check/livenesscheck: + endpoint: "{{ .HealthCheckEndpoint }}" + +service: + extensions: [health_check/livenesscheck] + pipelines: + logs: + receivers: [nop] + exporters: [nop] diff --git a/cmd/opampsupervisor/testdata/collector/split_config.yaml b/cmd/opampsupervisor/testdata/collector/split_config.yaml new file mode 100644 index 000000000000..f3e688203e82 --- /dev/null +++ b/cmd/opampsupervisor/testdata/collector/split_config.yaml @@ -0,0 +1,14 @@ +receivers: + nop: + +exporters: + nop: + +service: + pipelines: + logs: + receivers: [nop] + exporters: [nop] + telemetry: + resource: + test_key: '${file:{{.TestKeyFile}}}' \ No newline at end of file diff --git a/cmd/opampsupervisor/testdata/supervisor/supervisor_accepts_conn.yaml b/cmd/opampsupervisor/testdata/supervisor/supervisor_accepts_conn.yaml index e86ab6cb25f0..9caaea49296b 100644 --- a/cmd/opampsupervisor/testdata/supervisor/supervisor_accepts_conn.yaml +++ b/cmd/opampsupervisor/testdata/supervisor/supervisor_accepts_conn.yaml @@ -1,7 +1,5 @@ server: endpoint: ws://{{.url}}/v1/opamp - tls: - insecure: true capabilities: reports_effective_config: true @@ -12,7 +10,7 @@ capabilities: accepts_opamp_connection_settings: true storage: - directory: "{{.storage_dir}}" + directory: '{{.storage_dir}}' agent: executable: ../../bin/otelcontribcol_{{.goos}}_{{.goarch}}{{.extension}} diff --git a/cmd/opampsupervisor/testdata/supervisor/supervisor_agent_description.yaml b/cmd/opampsupervisor/testdata/supervisor/supervisor_agent_description.yaml index be601485ee9b..a87e3edd3bb0 100644 --- a/cmd/opampsupervisor/testdata/supervisor/supervisor_agent_description.yaml +++ b/cmd/opampsupervisor/testdata/supervisor/supervisor_agent_description.yaml @@ -1,7 +1,5 @@ server: endpoint: ws://{{.url}}/v1/opamp - tls: - insecure: true capabilities: reports_effective_config: true @@ -12,7 +10,7 @@ capabilities: accepts_restart_command: true storage: - directory: "{{.storage_dir}}" + directory: '{{.storage_dir}}' agent: executable: ../../bin/otelcontribcol_{{.goos}}_{{.goarch}}{{.extension}} diff --git a/cmd/opampsupervisor/testdata/supervisor/supervisor_basic.yaml b/cmd/opampsupervisor/testdata/supervisor/supervisor_basic.yaml index 75490189b904..bfe228f86e32 100644 --- a/cmd/opampsupervisor/testdata/supervisor/supervisor_basic.yaml +++ b/cmd/opampsupervisor/testdata/supervisor/supervisor_basic.yaml @@ -1,7 +1,5 @@ server: endpoint: ws://{{.url}}/v1/opamp - tls: - insecure: true capabilities: reports_effective_config: true @@ -12,7 +10,7 @@ capabilities: accepts_restart_command: true storage: - directory: "{{.storage_dir}}" + directory: '{{.storage_dir}}' agent: executable: ../../bin/otelcontribcol_{{.goos}}_{{.goarch}}{{.extension}} diff --git a/cmd/opampsupervisor/testdata/supervisor/supervisor_healthcheck_port.yaml b/cmd/opampsupervisor/testdata/supervisor/supervisor_healthcheck_port.yaml new file mode 100644 index 000000000000..b9d226058e4a --- /dev/null +++ b/cmd/opampsupervisor/testdata/supervisor/supervisor_healthcheck_port.yaml @@ -0,0 +1,17 @@ +server: + endpoint: ws://{{.url}}/v1/opamp + +capabilities: + reports_effective_config: true + reports_own_metrics: true + reports_health: true + accepts_remote_config: true + reports_remote_config: true + accepts_restart_command: true + +storage: + directory: '{{.storage_dir}}' + +agent: + executable: ../../bin/otelcontribcol_{{.goos}}_{{.goarch}}{{.extension}} + health_check_port: {{ .healthcheck_port }} diff --git a/cmd/opampsupervisor/testdata/supervisor/supervisor_logging.yaml b/cmd/opampsupervisor/testdata/supervisor/supervisor_logging.yaml new file mode 100644 index 000000000000..161fda828730 --- /dev/null +++ b/cmd/opampsupervisor/testdata/supervisor/supervisor_logging.yaml @@ -0,0 +1,22 @@ +server: + endpoint: ws://{{.url}}/v1/opamp + +capabilities: + reports_effective_config: true + reports_own_metrics: true + reports_health: true + accepts_remote_config: true + reports_remote_config: true + accepts_restart_command: true + +storage: + directory: '{{.storage_dir}}' + +agent: + executable: ../../bin/otelcontribcol_{{.goos}}_{{.goarch}}{{.extension}} + passthrough_logs: true + +telemetry: + logs: + level: {{.log_level}} # info level logs + output_paths: ['{{.log_file}}'] diff --git a/cmd/opampsupervisor/testdata/supervisor/supervisor_nocap.yaml b/cmd/opampsupervisor/testdata/supervisor/supervisor_nocap.yaml index ca0d9378887d..cab98dd081e4 100644 --- a/cmd/opampsupervisor/testdata/supervisor/supervisor_nocap.yaml +++ b/cmd/opampsupervisor/testdata/supervisor/supervisor_nocap.yaml @@ -1,7 +1,5 @@ server: endpoint: ws://{{.url}}/v1/opamp - tls: - insecure: true capabilities: reports_effective_config: false @@ -11,7 +9,7 @@ capabilities: reports_remote_config: false storage: - directory: "{{.storage_dir}}" + directory: '{{.storage_dir}}' agent: executable: ../../bin/otelcontribcol_{{.goos}}_{{.goarch}}{{.extension}} diff --git a/cmd/opampsupervisor/testdata/supervisor/supervisor_persistence.yaml b/cmd/opampsupervisor/testdata/supervisor/supervisor_persistence.yaml index 7595f758f851..723f3fb98902 100644 --- a/cmd/opampsupervisor/testdata/supervisor/supervisor_persistence.yaml +++ b/cmd/opampsupervisor/testdata/supervisor/supervisor_persistence.yaml @@ -1,7 +1,5 @@ server: endpoint: ws://{{.url}}/v1/opamp - tls: - insecure: true capabilities: reports_effective_config: true @@ -11,7 +9,7 @@ capabilities: reports_remote_config: true storage: - directory: {{.storage_dir}} + directory: '{{.storage_dir}}' agent: executable: ../../bin/otelcontribcol_{{.goos}}_{{.goarch}}{{.extension}} diff --git a/cmd/opampsupervisor/testdata/supervisor/supervisor_report_status.yaml b/cmd/opampsupervisor/testdata/supervisor/supervisor_report_status.yaml new file mode 100644 index 000000000000..9beaacec6216 --- /dev/null +++ b/cmd/opampsupervisor/testdata/supervisor/supervisor_report_status.yaml @@ -0,0 +1,19 @@ +server: + endpoint: ws://{{.url}}/v1/opamp + tls: + insecure: true + +capabilities: + reports_effective_config: true + reports_own_metrics: true + reports_health: true + accepts_remote_config: true + reports_remote_config: true + accepts_restart_command: true + +storage: + directory: "{{.storage_dir}}" + +agent: + executable: ../../bin/otelcontribcol_{{.goos}}_{{.goarch}}{{.extension}} + config_apply_timeout: {{.config_apply_timeout}} diff --git a/cmd/opampsupervisor/testdata/supervisor/supervisor_server_port.yaml b/cmd/opampsupervisor/testdata/supervisor/supervisor_server_port.yaml new file mode 100644 index 000000000000..d1335e797f70 --- /dev/null +++ b/cmd/opampsupervisor/testdata/supervisor/supervisor_server_port.yaml @@ -0,0 +1,17 @@ +server: + endpoint: ws://{{.url}}/v1/opamp + +capabilities: + reports_effective_config: true + reports_own_metrics: true + reports_health: true + accepts_remote_config: true + reports_remote_config: true + accepts_restart_command: true + +storage: + directory: '{{.storage_dir}}' + +agent: + executable: ../../bin/otelcontribcol_{{.goos}}_{{.goarch}}{{.extension}} + opamp_server_port: {{ .supervisor_opamp_server_port }} diff --git a/cmd/opampsupervisor/testdata/supervisor/supervisor_test.yaml b/cmd/opampsupervisor/testdata/supervisor/supervisor_test.yaml index 68881cd4970c..8c5f028e3f6e 100644 --- a/cmd/opampsupervisor/testdata/supervisor/supervisor_test.yaml +++ b/cmd/opampsupervisor/testdata/supervisor/supervisor_test.yaml @@ -11,7 +11,7 @@ capabilities: reports_remote_config: true storage: - directory: "{{.storage_dir}}" + directory: '{{.storage_dir}}' agent: executable: ../../bin/otelcontribcol_darwin_arm64 diff --git a/cmd/otelcontribcol/.gitignore b/cmd/otelcontribcol/.gitignore new file mode 100644 index 000000000000..4d27b9ae4d4a --- /dev/null +++ b/cmd/otelcontribcol/.gitignore @@ -0,0 +1,4 @@ +* +!builder-config.yaml +!Dockerfile +!metadata.yaml diff --git a/cmd/otelcontribcol/Dockerfile b/cmd/otelcontribcol/Dockerfile index 10b37eaf6e72..3c2cd1d372a8 100644 --- a/cmd/otelcontribcol/Dockerfile +++ b/cmd/otelcontribcol/Dockerfile @@ -1,12 +1,11 @@ -FROM alpine:latest as prep +FROM alpine:latest AS prep RUN apk --update add ca-certificates -RUN mkdir -p /tmp - FROM scratch ARG USER_UID=10001 -USER ${USER_UID} +ARG USER_GID=10001 +USER ${USER_UID}:${USER_GID} COPY --from=prep /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt COPY otelcontribcol / diff --git a/cmd/otelcontribcol/Makefile b/cmd/otelcontribcol/Makefile deleted file mode 100644 index 1994cf483835..000000000000 --- a/cmd/otelcontribcol/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -include ../../Makefile.Common - -lint: checklicense misspell - @echo "skipping lint: https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/29449" diff --git a/cmd/otelcontribcol/builder-config.yaml b/cmd/otelcontribcol/builder-config.yaml index 1b85d6c7bc49..3de89d69304f 100644 --- a/cmd/otelcontribcol/builder-config.yaml +++ b/cmd/otelcontribcol/builder-config.yaml @@ -1,232 +1,248 @@ +# NOTE: +# This builder configuration is NOT used to build any official binary. +# To see the builder manifests used for official binaries, +# check https://github.com/open-telemetry/opentelemetry-collector-releases +# +# For the OpenTelemetry Collector Contrib official distribution sources, check +# https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib + dist: module: github.com/open-telemetry/opentelemetry-collector-contrib/cmd/otelcontribcol name: otelcontribcol description: Local OpenTelemetry Collector Contrib binary, testing only. - version: 0.102.0-dev - otelcol_version: 0.102.0 + version: 0.116.0-dev extensions: - - gomod: go.opentelemetry.io/collector/extension/zpagesextension v0.102.0 - - gomod: go.opentelemetry.io/collector/extension/ballastextension v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/asapauthextension v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/basicauthextension v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/bearertokenauthextension v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/googleclientauthextension v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/httpforwarderextension v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/jaegerremotesampling v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/oauth2clientauthextension v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/ecsobserver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/ecstaskobserver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/hostobserver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/k8sobserver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/dockerobserver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/oidcauthextension v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/opampextension v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/remotetapextension v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/solarwindsapmsettingsextension v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/dbstorage v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/filestorage v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/sumologicextension v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/otlpencodingextension v0.102.0 - import: github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/otlpencodingextension - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/jaegerencodingextension v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/jsonlogencodingextension v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/textencodingextension v0.102.0 - import: github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/textencodingextension - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/zipkinencodingextension v0.102.0 - import: github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/zipkinencodingextension + - gomod: go.opentelemetry.io/collector/extension/zpagesextension v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/asapauthextension v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/basicauthextension v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/bearertokenauthextension v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/googleclientauthextension v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/httpforwarderextension v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/jaegerremotesampling v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/oauth2clientauthextension v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/cfgardenobserver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/dockerobserver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/ecsobserver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/ecstaskobserver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/hostobserver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/k8sobserver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/oidcauthextension v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/opampextension v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/remotetapextension v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/solarwindsapmsettingsextension v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/dbstorage v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/filestorage v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/sumologicextension v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/otlpencodingextension v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/jaegerencodingextension v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/avrologencodingextension v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/jsonlogencodingextension v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/textencodingextension v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/zipkinencodingextension v0.116.0 exporters: - - gomod: go.opentelemetry.io/collector/exporter/debugexporter v0.102.0 - - gomod: go.opentelemetry.io/collector/exporter/nopexporter v0.102.0 - - gomod: go.opentelemetry.io/collector/exporter/otlpexporter v0.102.0 - - gomod: go.opentelemetry.io/collector/exporter/otlphttpexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/alertmanagerexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/alibabacloudlogserviceexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awscloudwatchlogsexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsemfexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awskinesisexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awss3exporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsxrayexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/azuredataexplorerexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/azuremonitorexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/carbonexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/clickhouseexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/cassandraexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/coralogixexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datasetexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlecloudexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlecloudpubsubexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlemanagedprometheusexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/honeycombmarkerexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/influxdbexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/logicmonitorexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/logzioexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/lokiexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/mezmoexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opensearchexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/pulsarexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sapmexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sentryexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/signalfxexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/skywalkingexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sumologicexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/tencentcloudlogserviceexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.102.0 + - gomod: go.opentelemetry.io/collector/exporter/debugexporter v0.116.0 + - gomod: go.opentelemetry.io/collector/exporter/nopexporter v0.116.0 + - gomod: go.opentelemetry.io/collector/exporter/otlpexporter v0.116.0 + - gomod: go.opentelemetry.io/collector/exporter/otlphttpexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/alertmanagerexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/alibabacloudlogserviceexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awscloudwatchlogsexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsemfexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awskinesisexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awss3exporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsxrayexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/azuredataexplorerexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/azuremonitorexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/carbonexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/clickhouseexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/cassandraexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/coralogixexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datasetexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/dorisexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlecloudexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlecloudpubsubexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlemanagedprometheusexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/honeycombmarkerexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/influxdbexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/logicmonitorexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/logzioexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/lokiexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/mezmoexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opensearchexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/otelarrowexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/pulsarexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/rabbitmqexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sapmexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sentryexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/signalfxexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sumologicexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/tencentcloudlogserviceexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.116.0 processors: - - gomod: go.opentelemetry.io/collector/processor/batchprocessor v0.102.0 - - gomod: go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/intervalprocessor v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricsgenerationprocessor v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricstransformprocessor v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/redactionprocessor v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/routingprocessor v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/sumologicprocessor v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/spanprocessor v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/remotetapprocessor v0.102.0 + - gomod: go.opentelemetry.io/collector/processor/batchprocessor v0.116.0 + - gomod: go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/intervalprocessor v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/logdedupprocessor v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricsgenerationprocessor v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricstransformprocessor v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/redactionprocessor v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/routingprocessor v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/sumologicprocessor v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/spanprocessor v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/remotetapprocessor v0.116.0 receivers: - - gomod: go.opentelemetry.io/collector/receiver/nopreceiver v0.102.0 - - gomod: go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/activedirectorydsreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/apachereceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/apachesparkreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awscloudwatchreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awscontainerinsightreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsecscontainermetricsreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsfirehosereceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsxrayreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azureblobreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azureeventhubreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azuremonitorreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/bigipreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/carbonreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/chronyreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/cloudflarereceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/cloudfoundryreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/collectdreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/couchdbreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/datadogreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/dockerstatsreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/elasticsearchreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/expvarreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filestatsreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/flinkmetricsreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/fluentforwardreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/googlecloudpubsubreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/googlecloudspannerreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/haproxyreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/httpcheckreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/influxdbreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/iisreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jmxreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/journaldreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8seventsreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sobjectsreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkametricsreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kubeletstatsreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/lokireceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/memcachedreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mongodbatlasreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mongodbreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mysqlreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/namedpipereceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nginxreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nsxtreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/oracledbreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/otlpjsonfilereceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/podmanreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/postgresqlreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/pulsarreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/purefareceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/purefbreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/rabbitmqreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/receivercreator v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/redisreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/riakreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sapmreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/signalfxreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/simpleprometheusreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/skywalkingreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/snowflakereceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/solacereceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkenterprisereceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkhecreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sqlqueryreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sqlserverreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sshcheckreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/statsdreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/tcplogreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/udplogreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/vcenterreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/wavefrontreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/webhookeventreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/snmpreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/windowsperfcountersreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/windowseventlogreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver v0.102.0 + - gomod: go.opentelemetry.io/collector/receiver/nopreceiver v0.116.0 + - gomod: go.opentelemetry.io/collector/receiver/otlpreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/activedirectorydsreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/apachereceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/apachesparkreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awscloudwatchreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awscontainerinsightreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsecscontainermetricsreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsfirehosereceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awss3receiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsxrayreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azureblobreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azureeventhubreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azuremonitorreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/bigipreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/carbonreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/chronyreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/cloudflarereceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/cloudfoundryreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/collectdreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/couchdbreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/datadogreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/dockerstatsreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/elasticsearchreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/expvarreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filestatsreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/flinkmetricsreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/fluentforwardreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/githubreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/googlecloudmonitoringreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/googlecloudpubsubreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/googlecloudspannerreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/haproxyreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/httpcheckreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/influxdbreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/iisreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jmxreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/journaldreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8seventsreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sobjectsreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkametricsreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kubeletstatsreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/lokireceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/memcachedreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mongodbatlasreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mongodbreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mysqlreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/namedpipereceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nginxreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nsxtreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/ntpreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/oracledbreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/otelarrowreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/otlpjsonfilereceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/podmanreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/postgresqlreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/pulsarreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/purefareceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/purefbreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/rabbitmqreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/receivercreator v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/redisreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/riakreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sapmreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/signalfxreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/simpleprometheusreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/skywalkingreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/snowflakereceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/solacereceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkenterprisereceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkhecreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sqlqueryreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sqlserverreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sshcheckreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/statsdreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/tcplogreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/udplogreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/vcenterreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/wavefrontreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/webhookeventreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/snmpreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/windowsperfcountersreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/windowseventlogreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver v0.116.0 connectors: - - gomod: go.opentelemetry.io/collector/connector/forwardconnector v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/connector/datadogconnector v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/connector/exceptionsconnector v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/connector/failoverconnector v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/connector/grafanacloudconnector v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/connector/roundrobinconnector v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/connector/servicegraphconnector v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.102.0 + - gomod: go.opentelemetry.io/collector/connector/forwardconnector v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/connector/datadogconnector v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/connector/exceptionsconnector v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/connector/failoverconnector v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/connector/grafanacloudconnector v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/connector/otlpjsonconnector v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/connector/roundrobinconnector v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/connector/servicegraphconnector v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/connector/sumconnector v0.116.0 providers: - - gomod: go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0 - - gomod: go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0 - - gomod: go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0 - - gomod: go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0 - - gomod: go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/confmap/provider/s3provider v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/confmap/provider/secretsmanagerprovider v0.102.0 + - gomod: go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0 + - gomod: go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0 + - gomod: go.opentelemetry.io/collector/confmap/provider/httpprovider v1.22.0 + - gomod: go.opentelemetry.io/collector/confmap/provider/httpsprovider v1.22.0 + - gomod: go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.22.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/confmap/provider/s3provider v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/confmap/provider/secretsmanagerprovider v0.116.0 replaces: - github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage => ../../extension/storage @@ -236,6 +252,7 @@ replaces: - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/cwlogs => ../../internal/aws/cwlogs - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common => ../../internal/common - github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics => ../../internal/exp/metrics + - github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow => ../../internal/otelarrow - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsxrayreceiver => ../../receiver/awsxrayreceiver - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azureblobreceiver => ../../receiver/azureblobreceiver - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sobjectsreceiver => ../../receiver/k8sobjectsreceiver @@ -245,6 +262,7 @@ replaces: - github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/k8sobserver => ../../extension/observer/k8sobserver - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sentryexporter => ../../exporter/sentryexporter - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nsxtreceiver => ../../receiver/nsxtreceiver + - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/ntpreceiver => ../../receiver/ntpreceiver - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kubeletstatsreceiver => ../../receiver/kubeletstatsreceiver - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/dockerstatsreceiver => ../../receiver/dockerstatsreceiver - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlecloudpubsubexporter => ../../exporter/googlecloudpubsubexporter @@ -252,6 +270,7 @@ replaces: - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/postgresqlreceiver => ../../receiver/postgresqlreceiver - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/receivercreator => ../../receiver/receivercreator - github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor => ../../processor/k8sattributesprocessor + - github.com/open-telemetry/opentelemetry-collector-contrib/processor/logdedupprocessor => ../../processor/logdedupprocessor - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsemfexporter => ../../exporter/awsemfexporter - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver => ../../receiver/opencensusreceiver - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkhecreceiver => ../../receiver/splunkhecreceiver @@ -259,8 +278,8 @@ replaces: - github.com/open-telemetry/opentelemetry-collector-contrib/processor/spanprocessor => ../../processor/spanprocessor - github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy => ../../extension/awsproxy - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin => ../../pkg/translator/zipkin + - github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor => ../../processor/geoipprocessor/ - github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor => ../../processor/groupbyattrsprocessor - - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/skywalkingexporter => ../../exporter/skywalkingexporter - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/mezmoexporter => ../../exporter/mezmoexporter - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/clickhouseexporter => ../../exporter/clickhouseexporter - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/cassandraexporter => ../../exporter/cassandraexporter @@ -343,6 +362,7 @@ replaces: - github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig => ../../internal/k8sconfig - github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8stest => ../../internal/k8stest - github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka => ../../internal/kafka + - github.com/open-telemetry/opentelemetry-collector-contrib/internal/rabbitmq => ../../internal/rabbitmq - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/carbonreceiver => ../../receiver/carbonreceiver - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter => ../../exporter/splunkhecexporter - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter => ../../exporter/prometheusexporter @@ -364,6 +384,7 @@ replaces: - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/activedirectorydsreceiver => ../../receiver/activedirectorydsreceiver - github.com/open-telemetry/opentelemetry-collector-contrib/processor/routingprocessor => ../../processor/routingprocessor - github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor => ../../processor/deltatorateprocessor + - github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor => ../../processor/deltatocumulativeprocessor - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter => ../../exporter/datadogexporter - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datasetexporter => ../../exporter/datasetexporter - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/containerinsight => ../../internal/aws/containerinsight @@ -381,6 +402,7 @@ replaces: - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter => ../../exporter/fileexporter - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry => ../../pkg/resourcetotelemetry - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden => ../../pkg/golden + - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/kafka/topic => ../../pkg/kafka/topic - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter => ../../exporter/opencensusexporter - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opensearchexporter => ../../exporter/opensearchexporter - github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders => ../../internal/metadataproviders @@ -413,7 +435,6 @@ replaces: - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus => ../../pkg/translator/prometheus - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/googlecloudpubsubreceiver => ../../receiver/googlecloudpubsubreceiver - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sumologicexporter => ../../exporter/sumologicexporter - - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter => ../../exporter/instanaexporter - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/honeycombmarkerexporter => ../../exporter/honeycombmarkerexporter - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/otlpjsonfilereceiver => ../../receiver/otlpjsonfilereceiver - github.com/open-telemetry/opentelemetry-collector-contrib/processor/redactionprocessor => ../../processor/redactionprocessor @@ -434,8 +455,6 @@ replaces: - github.com/open-telemetry/opentelemetry-collector-contrib/processor/remotetapprocessor => ../../processor/remotetapprocessor - github.com/open-telemetry/opentelemetry-collector-contrib/processor/sumologicprocessor => ../../processor/sumologicprocessor - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter => ../../exporter/syslogexporter - # see https://github.com/mattn/go-ieproxy/issues/45 - - github.com/mattn/go-ieproxy => github.com/mattn/go-ieproxy v0.0.1 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest => ../../pkg/pdatatest - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../../pkg/pdatautil - github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector => ../../connector/countconnector @@ -443,18 +462,21 @@ replaces: - github.com/open-telemetry/opentelemetry-collector-contrib/connector/exceptionsconnector => ../../connector/exceptionsconnector - github.com/open-telemetry/opentelemetry-collector-contrib/connector/failoverconnector => ../../connector/failoverconnector - github.com/open-telemetry/opentelemetry-collector-contrib/connector/grafanacloudconnector => ../../connector/grafanacloudconnector + - github.com/open-telemetry/opentelemetry-collector-contrib/connector/otlpjsonconnector => ../../connector/otlpjsonconnector - github.com/open-telemetry/opentelemetry-collector-contrib/connector/roundrobinconnector => ../../connector/roundrobinconnector - github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector => ../../connector/routingconnector - github.com/open-telemetry/opentelemetry-collector-contrib/connector/servicegraphconnector => ../../connector/servicegraphconnector - github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector => ../../connector/spanmetricsconnector + - github.com/open-telemetry/opentelemetry-collector-contrib/connector/sumconnector => ../../connector/sumconnector - github.com/openshift/api v3.9.0+incompatible => github.com/openshift/api v0.0.0-20180801171038-322a19404e37 - - github.com/outcaste-io/ristretto v0.2.0 => github.com/outcaste-io/ristretto v0.2.1 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/azure => ../../pkg/translator/azure + - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/azurelogs => ../../pkg/translator/azurelogs - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/skywalking => ../../pkg/translator/skywalking - github.com/open-telemetry/opentelemetry-collector-contrib/internal/collectd => ../../internal/collectd - github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding => ../../extension/encoding - github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/otlpencodingextension => ../../extension/encoding/otlpencodingextension - github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/zipkinencodingextension => ../../extension/encoding/zipkinencodingextension + - github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/avrologencodingextension => ../../extension/encoding/avrologencodingextension - github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/jsonlogencodingextension => ../../extension/encoding/jsonlogencodingextension - github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/textencodingextension => ../../extension/encoding/textencodingextension - github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/jaegerencodingextension => ../../extension/encoding/jaegerencodingextension @@ -471,3 +493,15 @@ replaces: - github.com/open-telemetry/opentelemetry-collector-contrib/confmap/provider/s3provider => ../../confmap/provider/s3provider - github.com/open-telemetry/opentelemetry-collector-contrib/confmap/provider/secretsmanagerprovider => ../../confmap/provider/secretsmanagerprovider - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling => ../../pkg/sampling + - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/datadog => ../../pkg/datadog + - github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil => ../../internal/pdatautil + - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/otelarrowexporter => ../../exporter/otelarrowexporter + - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/otelarrowreceiver => ../../receiver/otelarrowreceiver + - github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/cfgardenobserver => ../../extension/observer/cfgardenobserver + - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/rabbitmqexporter => ../../exporter/rabbitmqexporter + - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/githubreceiver => ../../receiver/githubreceiver + - github.com/open-telemetry/opentelemetry-collector-contrib/internal/grpcutil => ../../internal/grpcutil + - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/googlecloudmonitoringreceiver => ../../receiver/googlecloudmonitoringreceiver + - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status => ../../pkg/status + - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awss3receiver => ../../receiver/awss3receiver + - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/dorisexporter => ../../exporter/dorisexporter diff --git a/cmd/otelcontribcol/components.go b/cmd/otelcontribcol/components.go deleted file mode 100644 index 2ca7c997d6d9..000000000000 --- a/cmd/otelcontribcol/components.go +++ /dev/null @@ -1,452 +0,0 @@ -// Code generated by "go.opentelemetry.io/collector/cmd/builder". DO NOT EDIT. - -package main - -import ( - "go.opentelemetry.io/collector/connector" - forwardconnector "go.opentelemetry.io/collector/connector/forwardconnector" - "go.opentelemetry.io/collector/exporter" - debugexporter "go.opentelemetry.io/collector/exporter/debugexporter" - nopexporter "go.opentelemetry.io/collector/exporter/nopexporter" - otlpexporter "go.opentelemetry.io/collector/exporter/otlpexporter" - otlphttpexporter "go.opentelemetry.io/collector/exporter/otlphttpexporter" - "go.opentelemetry.io/collector/extension" - ballastextension "go.opentelemetry.io/collector/extension/ballastextension" - zpagesextension "go.opentelemetry.io/collector/extension/zpagesextension" - "go.opentelemetry.io/collector/otelcol" - "go.opentelemetry.io/collector/processor" - batchprocessor "go.opentelemetry.io/collector/processor/batchprocessor" - memorylimiterprocessor "go.opentelemetry.io/collector/processor/memorylimiterprocessor" - "go.opentelemetry.io/collector/receiver" - nopreceiver "go.opentelemetry.io/collector/receiver/nopreceiver" - otlpreceiver "go.opentelemetry.io/collector/receiver/otlpreceiver" - - countconnector "github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector" - datadogconnector "github.com/open-telemetry/opentelemetry-collector-contrib/connector/datadogconnector" - exceptionsconnector "github.com/open-telemetry/opentelemetry-collector-contrib/connector/exceptionsconnector" - failoverconnector "github.com/open-telemetry/opentelemetry-collector-contrib/connector/failoverconnector" - grafanacloudconnector "github.com/open-telemetry/opentelemetry-collector-contrib/connector/grafanacloudconnector" - roundrobinconnector "github.com/open-telemetry/opentelemetry-collector-contrib/connector/roundrobinconnector" - routingconnector "github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector" - servicegraphconnector "github.com/open-telemetry/opentelemetry-collector-contrib/connector/servicegraphconnector" - spanmetricsconnector "github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector" - alertmanagerexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/alertmanagerexporter" - alibabacloudlogserviceexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/alibabacloudlogserviceexporter" - awscloudwatchlogsexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awscloudwatchlogsexporter" - awsemfexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsemfexporter" - awskinesisexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awskinesisexporter" - awss3exporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awss3exporter" - awsxrayexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsxrayexporter" - azuredataexplorerexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/azuredataexplorerexporter" - azuremonitorexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/azuremonitorexporter" - carbonexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/carbonexporter" - cassandraexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/cassandraexporter" - clickhouseexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/clickhouseexporter" - coralogixexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/coralogixexporter" - datadogexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter" - datasetexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datasetexporter" - elasticsearchexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter" - fileexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter" - googlecloudexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlecloudexporter" - googlecloudpubsubexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlecloudpubsubexporter" - googlemanagedprometheusexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlemanagedprometheusexporter" - honeycombmarkerexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/honeycombmarkerexporter" - influxdbexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/influxdbexporter" - instanaexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter" - kafkaexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter" - loadbalancingexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter" - logicmonitorexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/logicmonitorexporter" - logzioexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/logzioexporter" - lokiexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/lokiexporter" - mezmoexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/mezmoexporter" - opencensusexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter" - opensearchexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opensearchexporter" - prometheusexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter" - prometheusremotewriteexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter" - pulsarexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/pulsarexporter" - sapmexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sapmexporter" - sentryexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sentryexporter" - signalfxexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/signalfxexporter" - skywalkingexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/skywalkingexporter" - splunkhecexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter" - sumologicexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sumologicexporter" - syslogexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter" - tencentcloudlogserviceexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/tencentcloudlogserviceexporter" - zipkinexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter" - ackextension "github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension" - asapauthextension "github.com/open-telemetry/opentelemetry-collector-contrib/extension/asapauthextension" - awsproxy "github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy" - basicauthextension "github.com/open-telemetry/opentelemetry-collector-contrib/extension/basicauthextension" - bearertokenauthextension "github.com/open-telemetry/opentelemetry-collector-contrib/extension/bearertokenauthextension" - jaegerencodingextension "github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/jaegerencodingextension" - jsonlogencodingextension "github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/jsonlogencodingextension" - otlpencodingextension "github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/otlpencodingextension" - textencodingextension "github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/textencodingextension" - zipkinencodingextension "github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/zipkinencodingextension" - googleclientauthextension "github.com/open-telemetry/opentelemetry-collector-contrib/extension/googleclientauthextension" - headerssetterextension "github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension" - healthcheckextension "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension" - healthcheckv2extension "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension" - httpforwarderextension "github.com/open-telemetry/opentelemetry-collector-contrib/extension/httpforwarderextension" - jaegerremotesampling "github.com/open-telemetry/opentelemetry-collector-contrib/extension/jaegerremotesampling" - oauth2clientauthextension "github.com/open-telemetry/opentelemetry-collector-contrib/extension/oauth2clientauthextension" - dockerobserver "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/dockerobserver" - ecsobserver "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/ecsobserver" - ecstaskobserver "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/ecstaskobserver" - hostobserver "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/hostobserver" - k8sobserver "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/k8sobserver" - oidcauthextension "github.com/open-telemetry/opentelemetry-collector-contrib/extension/oidcauthextension" - opampextension "github.com/open-telemetry/opentelemetry-collector-contrib/extension/opampextension" - pprofextension "github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension" - remotetapextension "github.com/open-telemetry/opentelemetry-collector-contrib/extension/remotetapextension" - sigv4authextension "github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension" - solarwindsapmsettingsextension "github.com/open-telemetry/opentelemetry-collector-contrib/extension/solarwindsapmsettingsextension" - dbstorage "github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/dbstorage" - filestorage "github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/filestorage" - sumologicextension "github.com/open-telemetry/opentelemetry-collector-contrib/extension/sumologicextension" - attributesprocessor "github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor" - cumulativetodeltaprocessor "github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor" - deltatorateprocessor "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor" - filterprocessor "github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor" - groupbyattrsprocessor "github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor" - groupbytraceprocessor "github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor" - intervalprocessor "github.com/open-telemetry/opentelemetry-collector-contrib/processor/intervalprocessor" - k8sattributesprocessor "github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor" - metricsgenerationprocessor "github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricsgenerationprocessor" - metricstransformprocessor "github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricstransformprocessor" - probabilisticsamplerprocessor "github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor" - redactionprocessor "github.com/open-telemetry/opentelemetry-collector-contrib/processor/redactionprocessor" - remotetapprocessor "github.com/open-telemetry/opentelemetry-collector-contrib/processor/remotetapprocessor" - resourcedetectionprocessor "github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor" - resourceprocessor "github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor" - routingprocessor "github.com/open-telemetry/opentelemetry-collector-contrib/processor/routingprocessor" - spanprocessor "github.com/open-telemetry/opentelemetry-collector-contrib/processor/spanprocessor" - sumologicprocessor "github.com/open-telemetry/opentelemetry-collector-contrib/processor/sumologicprocessor" - tailsamplingprocessor "github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor" - transformprocessor "github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor" - activedirectorydsreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/activedirectorydsreceiver" - aerospikereceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver" - apachereceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/apachereceiver" - apachesparkreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/apachesparkreceiver" - awscloudwatchreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awscloudwatchreceiver" - awscontainerinsightreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awscontainerinsightreceiver" - awsecscontainermetricsreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsecscontainermetricsreceiver" - awsfirehosereceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsfirehosereceiver" - awsxrayreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsxrayreceiver" - azureblobreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azureblobreceiver" - azureeventhubreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azureeventhubreceiver" - azuremonitorreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azuremonitorreceiver" - bigipreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/bigipreceiver" - carbonreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/carbonreceiver" - chronyreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/chronyreceiver" - cloudflarereceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/cloudflarereceiver" - cloudfoundryreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/cloudfoundryreceiver" - collectdreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/collectdreceiver" - couchdbreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/couchdbreceiver" - datadogreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/datadogreceiver" - dockerstatsreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/dockerstatsreceiver" - elasticsearchreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/elasticsearchreceiver" - expvarreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/expvarreceiver" - filelogreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver" - filestatsreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filestatsreceiver" - flinkmetricsreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/flinkmetricsreceiver" - fluentforwardreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/fluentforwardreceiver" - googlecloudpubsubreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/googlecloudpubsubreceiver" - googlecloudspannerreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/googlecloudspannerreceiver" - haproxyreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/haproxyreceiver" - hostmetricsreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver" - httpcheckreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/httpcheckreceiver" - iisreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/iisreceiver" - influxdbreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/influxdbreceiver" - jaegerreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver" - jmxreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jmxreceiver" - journaldreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/journaldreceiver" - k8sclusterreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver" - k8seventsreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8seventsreceiver" - k8sobjectsreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sobjectsreceiver" - kafkametricsreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkametricsreceiver" - kafkareceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver" - kubeletstatsreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kubeletstatsreceiver" - lokireceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/lokireceiver" - memcachedreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/memcachedreceiver" - mongodbatlasreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mongodbatlasreceiver" - mongodbreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mongodbreceiver" - mysqlreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mysqlreceiver" - namedpipereceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/namedpipereceiver" - nginxreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nginxreceiver" - nsxtreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nsxtreceiver" - opencensusreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver" - oracledbreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/oracledbreceiver" - otlpjsonfilereceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/otlpjsonfilereceiver" - podmanreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/podmanreceiver" - postgresqlreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/postgresqlreceiver" - prometheusreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver" - pulsarreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/pulsarreceiver" - purefareceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/purefareceiver" - purefbreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/purefbreceiver" - rabbitmqreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/rabbitmqreceiver" - receivercreator "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/receivercreator" - redisreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/redisreceiver" - riakreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/riakreceiver" - sapmreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sapmreceiver" - signalfxreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/signalfxreceiver" - simpleprometheusreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/simpleprometheusreceiver" - skywalkingreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/skywalkingreceiver" - snmpreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/snmpreceiver" - snowflakereceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/snowflakereceiver" - solacereceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/solacereceiver" - splunkenterprisereceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkenterprisereceiver" - splunkhecreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkhecreceiver" - sqlqueryreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sqlqueryreceiver" - sqlserverreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sqlserverreceiver" - sshcheckreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sshcheckreceiver" - statsdreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/statsdreceiver" - syslogreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver" - tcplogreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/tcplogreceiver" - udplogreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/udplogreceiver" - vcenterreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/vcenterreceiver" - wavefrontreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/wavefrontreceiver" - webhookeventreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/webhookeventreceiver" - windowseventlogreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/windowseventlogreceiver" - windowsperfcountersreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/windowsperfcountersreceiver" - zipkinreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver" - zookeeperreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver" -) - -func components() (otelcol.Factories, error) { - var err error - factories := otelcol.Factories{} - - factories.Extensions, err = extension.MakeFactoryMap( - zpagesextension.NewFactory(), - ballastextension.NewFactory(), - ackextension.NewFactory(), - asapauthextension.NewFactory(), - awsproxy.NewFactory(), - basicauthextension.NewFactory(), - bearertokenauthextension.NewFactory(), - googleclientauthextension.NewFactory(), - headerssetterextension.NewFactory(), - healthcheckextension.NewFactory(), - healthcheckv2extension.NewFactory(), - httpforwarderextension.NewFactory(), - jaegerremotesampling.NewFactory(), - oauth2clientauthextension.NewFactory(), - ecsobserver.NewFactory(), - ecstaskobserver.NewFactory(), - hostobserver.NewFactory(), - k8sobserver.NewFactory(), - dockerobserver.NewFactory(), - oidcauthextension.NewFactory(), - opampextension.NewFactory(), - pprofextension.NewFactory(), - remotetapextension.NewFactory(), - sigv4authextension.NewFactory(), - solarwindsapmsettingsextension.NewFactory(), - dbstorage.NewFactory(), - filestorage.NewFactory(), - sumologicextension.NewFactory(), - otlpencodingextension.NewFactory(), - jaegerencodingextension.NewFactory(), - jsonlogencodingextension.NewFactory(), - textencodingextension.NewFactory(), - zipkinencodingextension.NewFactory(), - ) - if err != nil { - return otelcol.Factories{}, err - } - - factories.Receivers, err = receiver.MakeFactoryMap( - nopreceiver.NewFactory(), - otlpreceiver.NewFactory(), - activedirectorydsreceiver.NewFactory(), - aerospikereceiver.NewFactory(), - apachereceiver.NewFactory(), - apachesparkreceiver.NewFactory(), - awscloudwatchreceiver.NewFactory(), - awscontainerinsightreceiver.NewFactory(), - awsecscontainermetricsreceiver.NewFactory(), - awsfirehosereceiver.NewFactory(), - awsxrayreceiver.NewFactory(), - azureblobreceiver.NewFactory(), - azureeventhubreceiver.NewFactory(), - azuremonitorreceiver.NewFactory(), - bigipreceiver.NewFactory(), - carbonreceiver.NewFactory(), - chronyreceiver.NewFactory(), - cloudflarereceiver.NewFactory(), - cloudfoundryreceiver.NewFactory(), - collectdreceiver.NewFactory(), - couchdbreceiver.NewFactory(), - datadogreceiver.NewFactory(), - dockerstatsreceiver.NewFactory(), - elasticsearchreceiver.NewFactory(), - expvarreceiver.NewFactory(), - filelogreceiver.NewFactory(), - filestatsreceiver.NewFactory(), - flinkmetricsreceiver.NewFactory(), - fluentforwardreceiver.NewFactory(), - googlecloudpubsubreceiver.NewFactory(), - googlecloudspannerreceiver.NewFactory(), - haproxyreceiver.NewFactory(), - hostmetricsreceiver.NewFactory(), - httpcheckreceiver.NewFactory(), - influxdbreceiver.NewFactory(), - iisreceiver.NewFactory(), - jaegerreceiver.NewFactory(), - jmxreceiver.NewFactory(), - journaldreceiver.NewFactory(), - k8sclusterreceiver.NewFactory(), - k8seventsreceiver.NewFactory(), - k8sobjectsreceiver.NewFactory(), - kafkametricsreceiver.NewFactory(), - kafkareceiver.NewFactory(), - kubeletstatsreceiver.NewFactory(), - lokireceiver.NewFactory(), - memcachedreceiver.NewFactory(), - mongodbatlasreceiver.NewFactory(), - mongodbreceiver.NewFactory(), - mysqlreceiver.NewFactory(), - namedpipereceiver.NewFactory(), - nginxreceiver.NewFactory(), - nsxtreceiver.NewFactory(), - opencensusreceiver.NewFactory(), - oracledbreceiver.NewFactory(), - otlpjsonfilereceiver.NewFactory(), - podmanreceiver.NewFactory(), - postgresqlreceiver.NewFactory(), - prometheusreceiver.NewFactory(), - pulsarreceiver.NewFactory(), - purefareceiver.NewFactory(), - purefbreceiver.NewFactory(), - rabbitmqreceiver.NewFactory(), - receivercreator.NewFactory(), - redisreceiver.NewFactory(), - riakreceiver.NewFactory(), - sapmreceiver.NewFactory(), - signalfxreceiver.NewFactory(), - simpleprometheusreceiver.NewFactory(), - skywalkingreceiver.NewFactory(), - snowflakereceiver.NewFactory(), - solacereceiver.NewFactory(), - splunkenterprisereceiver.NewFactory(), - splunkhecreceiver.NewFactory(), - sqlqueryreceiver.NewFactory(), - sqlserverreceiver.NewFactory(), - sshcheckreceiver.NewFactory(), - statsdreceiver.NewFactory(), - syslogreceiver.NewFactory(), - tcplogreceiver.NewFactory(), - udplogreceiver.NewFactory(), - vcenterreceiver.NewFactory(), - wavefrontreceiver.NewFactory(), - webhookeventreceiver.NewFactory(), - snmpreceiver.NewFactory(), - windowsperfcountersreceiver.NewFactory(), - windowseventlogreceiver.NewFactory(), - zipkinreceiver.NewFactory(), - zookeeperreceiver.NewFactory(), - ) - if err != nil { - return otelcol.Factories{}, err - } - - factories.Exporters, err = exporter.MakeFactoryMap( - debugexporter.NewFactory(), - nopexporter.NewFactory(), - otlpexporter.NewFactory(), - otlphttpexporter.NewFactory(), - alertmanagerexporter.NewFactory(), - alibabacloudlogserviceexporter.NewFactory(), - awscloudwatchlogsexporter.NewFactory(), - awsemfexporter.NewFactory(), - awskinesisexporter.NewFactory(), - awss3exporter.NewFactory(), - awsxrayexporter.NewFactory(), - azuredataexplorerexporter.NewFactory(), - azuremonitorexporter.NewFactory(), - carbonexporter.NewFactory(), - clickhouseexporter.NewFactory(), - cassandraexporter.NewFactory(), - coralogixexporter.NewFactory(), - datadogexporter.NewFactory(), - datasetexporter.NewFactory(), - elasticsearchexporter.NewFactory(), - fileexporter.NewFactory(), - googlecloudexporter.NewFactory(), - googlecloudpubsubexporter.NewFactory(), - googlemanagedprometheusexporter.NewFactory(), - honeycombmarkerexporter.NewFactory(), - influxdbexporter.NewFactory(), - instanaexporter.NewFactory(), - kafkaexporter.NewFactory(), - loadbalancingexporter.NewFactory(), - logicmonitorexporter.NewFactory(), - logzioexporter.NewFactory(), - lokiexporter.NewFactory(), - mezmoexporter.NewFactory(), - opencensusexporter.NewFactory(), - opensearchexporter.NewFactory(), - prometheusexporter.NewFactory(), - prometheusremotewriteexporter.NewFactory(), - pulsarexporter.NewFactory(), - sapmexporter.NewFactory(), - sentryexporter.NewFactory(), - signalfxexporter.NewFactory(), - skywalkingexporter.NewFactory(), - splunkhecexporter.NewFactory(), - sumologicexporter.NewFactory(), - syslogexporter.NewFactory(), - tencentcloudlogserviceexporter.NewFactory(), - zipkinexporter.NewFactory(), - ) - if err != nil { - return otelcol.Factories{}, err - } - - factories.Processors, err = processor.MakeFactoryMap( - batchprocessor.NewFactory(), - memorylimiterprocessor.NewFactory(), - attributesprocessor.NewFactory(), - cumulativetodeltaprocessor.NewFactory(), - deltatorateprocessor.NewFactory(), - filterprocessor.NewFactory(), - groupbyattrsprocessor.NewFactory(), - groupbytraceprocessor.NewFactory(), - intervalprocessor.NewFactory(), - k8sattributesprocessor.NewFactory(), - metricsgenerationprocessor.NewFactory(), - metricstransformprocessor.NewFactory(), - probabilisticsamplerprocessor.NewFactory(), - redactionprocessor.NewFactory(), - resourcedetectionprocessor.NewFactory(), - resourceprocessor.NewFactory(), - routingprocessor.NewFactory(), - sumologicprocessor.NewFactory(), - spanprocessor.NewFactory(), - tailsamplingprocessor.NewFactory(), - transformprocessor.NewFactory(), - remotetapprocessor.NewFactory(), - ) - if err != nil { - return otelcol.Factories{}, err - } - - factories.Connectors, err = connector.MakeFactoryMap( - forwardconnector.NewFactory(), - countconnector.NewFactory(), - datadogconnector.NewFactory(), - exceptionsconnector.NewFactory(), - failoverconnector.NewFactory(), - grafanacloudconnector.NewFactory(), - roundrobinconnector.NewFactory(), - routingconnector.NewFactory(), - servicegraphconnector.NewFactory(), - spanmetricsconnector.NewFactory(), - ) - if err != nil { - return otelcol.Factories{}, err - } - - return factories, nil -} diff --git a/cmd/otelcontribcol/distribution_metadata_test.go b/cmd/otelcontribcol/distribution_metadata_test.go deleted file mode 100644 index 8a85183d2d51..000000000000 --- a/cmd/otelcontribcol/distribution_metadata_test.go +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "context" - "os" - "path/filepath" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/confmap" - "go.opentelemetry.io/collector/confmap/provider/fileprovider" -) - -func TestComponentsArePresent(t *testing.T) { - components, err := components() - require.NoError(t, err) - var metadataComponents []string - e := filepath.Walk(filepath.Join("..", ".."), func(path string, info os.FileInfo, err error) error { - if err == nil && "metadata.yaml" == info.Name() { - metadataComponents = append(metadataComponents, path) - } - return nil - }) - require.NoError(t, e) - - for _, metadataComponent := range metadataComponents { - t.Run(metadataComponent, func(tt *testing.T) { - m, err := loadMetadata(metadataComponent) - require.NoError(tt, err) - if m.Status == nil { - tt.Skip("no status present, skipping", metadataComponent) - return - } - inDevelopment := len(m.Status.Stability) == 0 - deprecated := false - inUse := false - for stability, pipelines := range m.Status.Stability { - if len(pipelines) > 0 { - switch stability { - case "development": - inDevelopment = true - case "deprecated": - deprecated = true - case "unmaintained": - // consider not in use. - default: // alpha, beta, stable - inUse = true - } - } - } - - if inDevelopment && !inUse { - tt.Skip("component in development, skipping", metadataComponent) - return - } - - if deprecated && !inUse { - tt.Skip("component deprecated, skipping", metadataComponent) - return - } - - cType := component.MustNewType(m.Type) - switch m.Status.Class { - case "connector": - assert.NotNil(tt, components.Connectors[cType], "missing connector: %s", m.Type) - case "exporter": - assert.NotNil(tt, components.Exporters[cType], "missing exporter: %s", m.Type) - case "extension": - assert.NotNil(tt, components.Extensions[cType], "missing extension: %s", m.Type) - case "processor": - assert.NotNil(tt, components.Processors[cType], "missing processor: %s", m.Type) - case "receiver": - assert.NotNil(tt, components.Receivers[cType], "missing receiver: %s", m.Type) - } - }) - } -} - -func loadMetadata(filePath string) (metadata, error) { - cp, err := fileprovider.NewFactory().Create(confmap.ProviderSettings{}).Retrieve(context.Background(), "file:"+filePath, nil) - if err != nil { - return metadata{}, err - } - - conf, err := cp.AsConf() - if err != nil { - return metadata{}, err - } - - md := metadata{} - if err := conf.Unmarshal(&md, confmap.WithIgnoreUnused()); err != nil { - return md, err - } - - return md, nil -} - -type metadata struct { - Type string `mapstructure:"type"` - Status *status `mapstructure:"status"` -} - -type status struct { - Stability map[string][]string `mapstructure:"stability"` - Distributions []string `mapstructure:"distributions"` - Class string `mapstructure:"class"` - Warnings []string `mapstructure:"warnings"` -} diff --git a/cmd/otelcontribcol/exporters_test.go b/cmd/otelcontribcol/exporters_test.go deleted file mode 100644 index 4ced0cc48e51..000000000000 --- a/cmd/otelcontribcol/exporters_test.go +++ /dev/null @@ -1,737 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "context" - "errors" - "path/filepath" - "runtime" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/config/configgrpc" - "go.opentelemetry.io/collector/config/confighttp" - "go.opentelemetry.io/collector/config/configopaque" - "go.opentelemetry.io/collector/exporter" - "go.opentelemetry.io/collector/exporter/exportertest" - "go.opentelemetry.io/collector/exporter/otlpexporter" - "go.opentelemetry.io/collector/exporter/otlphttpexporter" - "go.opentelemetry.io/collector/pdata/pcommon" - "go.opentelemetry.io/collector/pdata/plog" - "go.opentelemetry.io/collector/pdata/pmetric" - "go.opentelemetry.io/collector/pdata/ptrace" - - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/alertmanagerexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/alibabacloudlogserviceexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awscloudwatchlogsexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsemfexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awskinesisexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsxrayexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/azuredataexplorerexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/azuremonitorexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/carbonexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/cassandraexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/clickhouseexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/coralogixexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datasetexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/honeycombmarkerexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/influxdbexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/logicmonitorexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/logzioexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/lokiexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/mezmoexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opensearchexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/pulsarexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sapmexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sentryexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/signalfxexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/skywalkingexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sumologicexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/tencentcloudlogserviceexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/testutil" -) - -func TestDefaultExporters(t *testing.T) { - factories, err := components() - assert.NoError(t, err) - - expFactories := factories.Exporters - endpoint := testutil.GetAvailableLocalAddress(t) - - tests := []struct { - getConfigFn getExporterConfigFn - exporter component.Type - skipLifecycle bool - expectConsumeErr bool - }{ - { - exporter: "awscloudwatchlogs", - getConfigFn: func() component.Config { - cfg := expFactories["awscloudwatchlogs"].CreateDefaultConfig().(*awscloudwatchlogsexporter.Config) - cfg.Endpoint = "http://" + endpoint - cfg.Region = "local" - - // disable queue/retry to validate passing the test data synchronously - cfg.QueueSettings.Enabled = false - cfg.BackOffConfig.Enabled = false - return cfg - }, - expectConsumeErr: true, - }, - { - exporter: "awss3", - expectConsumeErr: true, - }, - { - exporter: "file", - getConfigFn: func() component.Config { - cfg := expFactories["file"].CreateDefaultConfig().(*fileexporter.Config) - cfg.Path = filepath.Join(t.TempDir(), "file.exporter.random.file") - return cfg - }, - skipLifecycle: runtime.GOOS == "windows", // On Windows not all handles are closed when the exporter is shutdown. - }, - { - exporter: "kafka", - getConfigFn: func() component.Config { - cfg := expFactories["kafka"].CreateDefaultConfig().(*kafkaexporter.Config) - cfg.Brokers = []string{"invalid:9092"} - // this disables contacting the broker so we can successfully create the exporter - cfg.Metadata.Full = false - // disable queue/retry to validate passing the test data synchronously - cfg.QueueSettings.Enabled = false - cfg.BackOffConfig.Enabled = false - return cfg - }, - expectConsumeErr: true, - }, - { - exporter: "debug", - }, - { - exporter: "opencensus", - getConfigFn: func() component.Config { - cfg := expFactories["opencensus"].CreateDefaultConfig().(*opencensusexporter.Config) - cfg.ClientConfig = configgrpc.ClientConfig{ - Endpoint: endpoint, - } - // disable queue/retry to validate passing the test data synchronously - cfg.QueueSettings.Enabled = false - cfg.BackOffConfig.Enabled = false - return cfg - }, - expectConsumeErr: true, - }, - { - exporter: "opensearch", - getConfigFn: func() component.Config { - cfg := expFactories["opensearch"].CreateDefaultConfig().(*opensearchexporter.Config) - cfg.ClientConfig = confighttp.ClientConfig{ - Endpoint: "http://" + endpoint, - } - return cfg - }, - expectConsumeErr: true, - }, - { - exporter: "otlp", - getConfigFn: func() component.Config { - cfg := expFactories["otlp"].CreateDefaultConfig().(*otlpexporter.Config) - cfg.ClientConfig = configgrpc.ClientConfig{ - Endpoint: endpoint, - } - // disable queue/retry to validate passing the test data synchronously - cfg.QueueConfig.Enabled = false - cfg.RetryConfig.Enabled = false - return cfg - }, - expectConsumeErr: true, - }, - { - exporter: "otlphttp", - getConfigFn: func() component.Config { - cfg := expFactories["otlphttp"].CreateDefaultConfig().(*otlphttpexporter.Config) - cfg.Endpoint = "http://" + endpoint - // disable queue/retry to validate passing the test data synchronously - cfg.QueueConfig.Enabled = false - cfg.RetryConfig.Enabled = false - return cfg - }, - expectConsumeErr: true, - }, - { - exporter: "prometheus", - getConfigFn: func() component.Config { - cfg := expFactories["prometheus"].CreateDefaultConfig().(*prometheusexporter.Config) - cfg.Endpoint = endpoint - return cfg - }, - }, - { - exporter: "prometheusremotewrite", - getConfigFn: func() component.Config { - cfg := expFactories["prometheusremotewrite"].CreateDefaultConfig().(*prometheusremotewriteexporter.Config) - // disable queue/retry to validate passing the test data synchronously - cfg.RemoteWriteQueue.Enabled = false - cfg.BackOffConfig.Enabled = false - return cfg - }, - expectConsumeErr: true, - }, - { - exporter: "pulsar", - getConfigFn: func() component.Config { - cfg := expFactories["pulsar"].CreateDefaultConfig().(*pulsarexporter.Config) - cfg.Endpoint = "http://localhost:6650" - return cfg - }, - skipLifecycle: true, - }, - { - exporter: "sapm", - getConfigFn: func() component.Config { - cfg := expFactories["sapm"].CreateDefaultConfig().(*sapmexporter.Config) - cfg.Endpoint = "http://" + endpoint - // disable queue/retry to validate passing the test data synchronously - cfg.QueueSettings.Enabled = false - cfg.BackOffConfig.Enabled = false - return cfg - }, - expectConsumeErr: true, - }, - { - exporter: "signalfx", - getConfigFn: func() component.Config { - cfg := expFactories["signalfx"].CreateDefaultConfig().(*signalfxexporter.Config) - cfg.AccessToken = "my_fake_token" - cfg.IngestURL = "http://" + endpoint - cfg.APIURL = "http://" + endpoint - // disable queue/retry to validate passing the test data synchronously - cfg.QueueSettings.Enabled = false - cfg.BackOffConfig.Enabled = false - return cfg - }, - expectConsumeErr: true, - }, - { - exporter: "splunk_hec", - getConfigFn: func() component.Config { - cfg := expFactories["splunk_hec"].CreateDefaultConfig().(*splunkhecexporter.Config) - cfg.Token = "my_fake_token" - cfg.Endpoint = "http://" + endpoint - // disable queue/retry to validate passing the test data synchronously - cfg.QueueSettings.Enabled = false - cfg.BackOffConfig.Enabled = false - return cfg - }, - expectConsumeErr: true, - }, - { - exporter: "zipkin", - getConfigFn: func() component.Config { - cfg := expFactories["zipkin"].CreateDefaultConfig().(*zipkinexporter.Config) - cfg.Endpoint = endpoint - // disable queue/retry to validate passing the test data synchronously - cfg.QueueSettings.Enabled = false - cfg.BackOffConfig.Enabled = false - return cfg - }, - expectConsumeErr: true, - }, - { - exporter: "awskinesis", - getConfigFn: func() component.Config { - cfg := expFactories["awskinesis"].CreateDefaultConfig().(*awskinesisexporter.Config) - cfg.AWS.KinesisEndpoint = "http://" + endpoint - return cfg - }, - skipLifecycle: true, - }, - { - exporter: "alertmanager", - getConfigFn: func() component.Config { - cfg := expFactories["alertmanager"].CreateDefaultConfig().(*alertmanagerexporter.Config) - cfg.ClientConfig = confighttp.ClientConfig{ - Endpoint: "http://" + endpoint, - } - cfg.GeneratorURL = "opentelemetry-collector" - cfg.DefaultSeverity = "info" - // disable queue/retry to validate passing the test data synchronously - cfg.QueueSettings.Enabled = false - cfg.BackoffConfig.Enabled = false - return cfg - }, - expectConsumeErr: true, - }, - { - exporter: "alibabacloud_logservice", - getConfigFn: func() component.Config { - cfg := expFactories["alibabacloud_logservice"].CreateDefaultConfig().(*alibabacloudlogserviceexporter.Config) - cfg.Endpoint = "http://" + endpoint - cfg.Project = "otel-testing" - cfg.Logstore = "otel-data" - return cfg - }, - }, - { - exporter: "awsemf", - getConfigFn: func() component.Config { - cfg := expFactories["awsemf"].CreateDefaultConfig().(*awsemfexporter.Config) - cfg.Endpoint = "http://" + endpoint - cfg.Region = "local" - return cfg - }, - expectConsumeErr: true, - }, - { - exporter: "awsxray", - getConfigFn: func() component.Config { - cfg := expFactories["awsxray"].CreateDefaultConfig().(*awsxrayexporter.Config) - cfg.Endpoint = "http://" + endpoint - cfg.Region = "local" - return cfg - }, - expectConsumeErr: true, - }, - { - exporter: "azuredataexplorer", - getConfigFn: func() component.Config { - cfg := expFactories["azuredataexplorer"].CreateDefaultConfig().(*azuredataexplorerexporter.Config) - cfg.ClusterURI = "https://" + endpoint - cfg.ApplicationID = "otel-app-id" - cfg.ApplicationKey = "otel-app-key" - cfg.TenantID = "otel-tenant-id" - return cfg - }, - skipLifecycle: true, - }, - { - exporter: "azuremonitor", - getConfigFn: func() component.Config { - cfg := expFactories["azuremonitor"].CreateDefaultConfig().(*azuremonitorexporter.Config) - cfg.Endpoint = "http://" + endpoint - cfg.ConnectionString = configopaque.String("InstrumentationKey=00000000-0000-0000-0000-000000000000;IngestionEndpoint=" + cfg.Endpoint) - - return cfg - }, - }, - { - exporter: "carbon", - getConfigFn: func() component.Config { - cfg := expFactories["carbon"].CreateDefaultConfig().(*carbonexporter.Config) - cfg.Endpoint = "http://" + endpoint - return cfg - }, - expectConsumeErr: true, - }, - { - exporter: "clickhouse", - getConfigFn: func() component.Config { - cfg := expFactories["clickhouse"].CreateDefaultConfig().(*clickhouseexporter.Config) - cfg.Endpoint = "tcp://" + endpoint - return cfg - }, - skipLifecycle: true, - }, - { - exporter: "cassandra", - getConfigFn: func() component.Config { - cfg := expFactories["cassandra"].CreateDefaultConfig().(*cassandraexporter.Config) - cfg.DSN = endpoint - return cfg - }, - skipLifecycle: true, - }, - { - exporter: "coralogix", - getConfigFn: func() component.Config { - cfg := expFactories["coralogix"].CreateDefaultConfig().(*coralogixexporter.Config) - cfg.Traces.Endpoint = endpoint - cfg.Logs.Endpoint = endpoint - cfg.Metrics.Endpoint = endpoint - // disable queue/retry to validate passing the test data synchronously - cfg.QueueSettings.Enabled = false - cfg.BackOffConfig.Enabled = false - return cfg - }, - expectConsumeErr: true, - }, - { - exporter: "datadog", - getConfigFn: func() component.Config { - cfg := expFactories["datadog"].CreateDefaultConfig().(*datadogexporter.Config) - cfg.API.Key = "cutedogsgotoheaven" - // disable queue/retry to validate passing the test data synchronously - cfg.QueueSettings.Enabled = false - cfg.BackOffConfig.Enabled = false - return cfg - }, - expectConsumeErr: true, - }, - { - exporter: "dataset", - getConfigFn: func() component.Config { - cfg := expFactories["dataset"].CreateDefaultConfig().(*datasetexporter.Config) - cfg.DatasetURL = "https://" + endpoint - cfg.APIKey = "secret-key" - // disable queue/retry to validate passing the test data synchronously - cfg.QueueSettings.Enabled = false - cfg.BackOffConfig.Enabled = false - return cfg - }, - expectConsumeErr: true, - skipLifecycle: true, // shutdown fails if there is buffered data - }, - { - exporter: "elasticsearch", - getConfigFn: func() component.Config { - cfg := expFactories["elasticsearch"].CreateDefaultConfig().(*elasticsearchexporter.Config) - cfg.Endpoints = []string{"http://" + endpoint} - // disable queue to validate passing the test data synchronously - cfg.QueueSettings.Enabled = false - return cfg - }, - }, - { - exporter: "googlecloud", - skipLifecycle: true, // Requires credentials to be able to successfully load the exporter - }, - { - exporter: "googlemanagedprometheus", - skipLifecycle: true, // Requires credentials to be able to successfully load the exporter - }, - { - exporter: "googlecloudpubsub", - skipLifecycle: true, - }, - { - exporter: "honeycombmarker", - getConfigFn: func() component.Config { - cfg := expFactories["honeycombmarker"].CreateDefaultConfig().(*honeycombmarkerexporter.Config) - cfg.Endpoint = "http://" + endpoint - // disable queue to validate passing the test data synchronously - cfg.QueueSettings.Enabled = false - cfg.BackOffConfig.Enabled = false - return cfg - }, - expectConsumeErr: true, - }, - { - exporter: "influxdb", - getConfigFn: func() component.Config { - cfg := expFactories["influxdb"].CreateDefaultConfig().(*influxdbexporter.Config) - cfg.Endpoint = "http://" + endpoint - // disable queue to validate passing the test data synchronously - cfg.QueueSettings.Enabled = false - cfg.BackOffConfig.Enabled = false - return cfg - }, - skipLifecycle: true, - }, - { - exporter: "instana", - getConfigFn: func() component.Config { - cfg := expFactories["instana"].CreateDefaultConfig().(*instanaexporter.Config) - cfg.Endpoint = "http://" + endpoint - cfg.AgentKey = "Key1" - return cfg - }, - expectConsumeErr: true, - }, - { - exporter: "loadbalancing", - getConfigFn: func() component.Config { - cfg := expFactories["loadbalancing"].CreateDefaultConfig().(*loadbalancingexporter.Config) - cfg.Resolver = loadbalancingexporter.ResolverSettings{Static: &loadbalancingexporter.StaticResolver{Hostnames: []string{"127.0.0.1"}}} - return cfg - }, - expectConsumeErr: true, // the exporter requires traces with service.name resource attribute - }, - { - exporter: "logicmonitor", - getConfigFn: func() component.Config { - cfg := expFactories["logicmonitor"].CreateDefaultConfig().(*logicmonitorexporter.Config) - // disable queue to validate passing the test data synchronously - cfg.QueueSettings.Enabled = false - cfg.BackOffConfig.Enabled = false - return cfg - }, - skipLifecycle: true, - }, - { - exporter: "logzio", - getConfigFn: func() component.Config { - cfg := expFactories["logzio"].CreateDefaultConfig().(*logzioexporter.Config) - cfg.Endpoint = "http://" + endpoint - // disable queue to validate passing the test data synchronously - cfg.QueueSettings.Enabled = false - cfg.BackOffConfig.Enabled = false - return cfg - }, - expectConsumeErr: true, - }, - { - exporter: "loki", - getConfigFn: func() component.Config { - cfg := expFactories["loki"].CreateDefaultConfig().(*lokiexporter.Config) - cfg.Endpoint = "http://" + endpoint - // disable queue to validate passing the test data synchronously - cfg.QueueSettings.Enabled = false - cfg.BackOffConfig.Enabled = false - return cfg - }, - expectConsumeErr: true, - }, - { - exporter: "mezmo", - getConfigFn: func() component.Config { - cfg := expFactories["mezmo"].CreateDefaultConfig().(*mezmoexporter.Config) - cfg.Endpoint = "http://" + endpoint - // disable queue to validate passing the test data synchronously - cfg.QueueSettings.Enabled = false - cfg.BackOffConfig.Enabled = false - return cfg - }, - }, - { - exporter: "sentry", - getConfigFn: func() component.Config { - cfg := expFactories["sentry"].CreateDefaultConfig().(*sentryexporter.Config) - return cfg - }, - skipLifecycle: true, // causes race detector to fail - }, - { - exporter: "skywalking", - getConfigFn: func() component.Config { - cfg := expFactories["skywalking"].CreateDefaultConfig().(*skywalkingexporter.Config) - // disable queue to validate passing the test data synchronously - cfg.QueueSettings.Enabled = false - cfg.BackOffConfig.Enabled = false - return cfg - }, - skipLifecycle: true, - }, - { - exporter: "sumologic", - getConfigFn: func() component.Config { - cfg := expFactories["sumologic"].CreateDefaultConfig().(*sumologicexporter.Config) - cfg.Endpoint = "http://" + endpoint - // disable queue to validate passing the test data synchronously - cfg.QueueSettings.Enabled = false - cfg.BackOffConfig.Enabled = false - return cfg - }, - expectConsumeErr: true, - }, - { - exporter: "syslog", - getConfigFn: func() component.Config { - cfg := expFactories["syslog"].CreateDefaultConfig().(*syslogexporter.Config) - cfg.Endpoint = "http://" + endpoint - // disable queue to validate passing the test data synchronously - cfg.QueueSettings.Enabled = false - cfg.BackOffConfig.Enabled = false - return cfg - }, - expectConsumeErr: true, - }, - { - exporter: "tencentcloud_logservice", - getConfigFn: func() component.Config { - cfg := expFactories["tencentcloud_logservice"].CreateDefaultConfig().(*tencentcloudlogserviceexporter.Config) - return cfg - }, - expectConsumeErr: true, - }, - } - - assert.Equal(t, len(expFactories), len(tests), "All user configurable components must be added to the lifecycle test") - for _, tt := range tests { - t.Run(string(tt.exporter), func(t *testing.T) { - factory := expFactories[tt.exporter] - assert.Equal(t, tt.exporter, factory.Type()) - t.Run("shutdown", func(t *testing.T) { - verifyExporterShutdown(t, factory, tt.getConfigFn) - }) - t.Run("lifecycle", func(t *testing.T) { - if tt.skipLifecycle { - t.SkipNow() - } - verifyExporterLifecycle(t, factory, tt.getConfigFn, tt.expectConsumeErr) - }) - }) - } -} - -// GetExporterConfigFn is used customize the configuration passed to the verification. -// This is used to change ports or provide values required but not provided by the -// default configuration. -type getExporterConfigFn func() component.Config - -// verifyExporterLifecycle is used to test if an exporter type can handle the typical -// lifecycle of a component. The getConfigFn parameter only need to be specified if -// the test can't be done with the default configuration for the component. -func verifyExporterLifecycle(t *testing.T, factory exporter.Factory, getConfigFn getExporterConfigFn, expectErr bool) { - ctx := context.Background() - host := newAssertNoErrorHost(t) - expCreateSettings := exportertest.NewNopCreateSettings() - - cfg := factory.CreateDefaultConfig() - if getConfigFn != nil { - cfg = getConfigFn() - } - - createFns := []createExporterFn{ - wrapCreateLogsExp(factory), - wrapCreateTracesExp(factory), - wrapCreateMetricsExp(factory), - } - - for i := 0; i < 2; i++ { - var exps []component.Component - for _, createFn := range createFns { - exp, err := createFn(ctx, expCreateSettings, cfg) - if errors.Is(err, component.ErrDataTypeIsNotSupported) { - continue - } - require.NoError(t, err) - require.NoError(t, exp.Start(ctx, host)) - exps = append(exps, exp) - } - for _, exp := range exps { - var err error - assert.NotPanics(t, func() { - switch e := exp.(type) { - case exporter.Logs: - logs := generateTestLogs() - if !e.Capabilities().MutatesData { - logs.MarkReadOnly() - } - err = e.ConsumeLogs(ctx, logs) - case exporter.Metrics: - metrics := generateTestMetrics() - if !e.Capabilities().MutatesData { - metrics.MarkReadOnly() - } - err = e.ConsumeMetrics(ctx, metrics) - case exporter.Traces: - traces := generateTestTraces() - if !e.Capabilities().MutatesData { - traces.MarkReadOnly() - } - err = e.ConsumeTraces(ctx, traces) - } - }) - if !expectErr { - assert.NoError(t, err) - } - assert.NoError(t, exp.Shutdown(ctx)) - } - } -} - -func generateTestLogs() plog.Logs { - logs := plog.NewLogs() - rl := logs.ResourceLogs().AppendEmpty() - rl.Resource().Attributes().PutStr("resource", "R1") - l := rl.ScopeLogs().AppendEmpty().LogRecords().AppendEmpty() - l.Body().SetStr("test log message") - l.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) - return logs -} - -func generateTestMetrics() pmetric.Metrics { - metrics := pmetric.NewMetrics() - rm := metrics.ResourceMetrics().AppendEmpty() - rm.Resource().Attributes().PutStr("resource", "R1") - m := rm.ScopeMetrics().AppendEmpty().Metrics().AppendEmpty() - m.SetName("test_metric") - dp := m.Gauge().DataPoints().AppendEmpty() - dp.Attributes().PutStr("test_attr", "value_1") - dp.SetIntValue(123) - dp.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) - return metrics -} - -func generateTestTraces() ptrace.Traces { - traces := ptrace.NewTraces() - rs := traces.ResourceSpans().AppendEmpty() - rs.Resource().Attributes().PutStr("resource", "R1") - span := rs.ScopeSpans().AppendEmpty().Spans().AppendEmpty() - span.Attributes().PutStr("test_attr", "value_1") - span.SetName("test_span") - span.SetStartTimestamp(pcommon.NewTimestampFromTime(time.Now().Add(-1 * time.Second))) - span.SetEndTimestamp(pcommon.NewTimestampFromTime(time.Now())) - return traces -} - -// verifyExporterShutdown is used to test if an exporter type can be shutdown without being started first. -func verifyExporterShutdown(tb testing.TB, factory exporter.Factory, getConfigFn getExporterConfigFn) { - ctx := context.Background() - expCreateSettings := exportertest.NewNopCreateSettings() - - if getConfigFn == nil { - getConfigFn = factory.CreateDefaultConfig - } - - createFns := []createExporterFn{ - wrapCreateLogsExp(factory), - wrapCreateTracesExp(factory), - wrapCreateMetricsExp(factory), - } - - for _, createFn := range createFns { - r, err := createFn(ctx, expCreateSettings, getConfigFn()) - if errors.Is(err, component.ErrDataTypeIsNotSupported) { - continue - } - if r == nil { - continue - } - assert.NotPanics(tb, func() { - assert.NoError(tb, r.Shutdown(ctx)) - }) - } -} - -type createExporterFn func( - ctx context.Context, - set exporter.CreateSettings, - cfg component.Config, -) (component.Component, error) - -func wrapCreateLogsExp(factory exporter.Factory) createExporterFn { - return func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) - } -} - -func wrapCreateTracesExp(factory exporter.Factory) createExporterFn { - return func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) - } -} - -func wrapCreateMetricsExp(factory exporter.Factory) createExporterFn { - return func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsExporter(ctx, set, cfg) - } -} diff --git a/cmd/otelcontribcol/extensions_test.go b/cmd/otelcontribcol/extensions_test.go deleted file mode 100644 index a670d134050c..000000000000 --- a/cmd/otelcontribcol/extensions_test.go +++ /dev/null @@ -1,360 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "context" - "errors" - "os" - "path/filepath" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/component/componenttest" - "go.opentelemetry.io/collector/extension" - "go.opentelemetry.io/collector/extension/ballastextension" - "go.opentelemetry.io/collector/extension/extensiontest" - "go.opentelemetry.io/collector/extension/zpagesextension" - - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/asapauthextension" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/basicauthextension" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/bearertokenauthextension" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/googleclientauthextension" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/httpforwarderextension" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/jaegerremotesampling" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/oauth2clientauthextension" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/ecstaskobserver" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/hostobserver" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/opampextension" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/remotetapextension" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/dbstorage" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/filestorage" - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/testutil" -) - -func TestDefaultExtensions(t *testing.T) { - allFactories, err := components() - require.NoError(t, err) - - extFactories := allFactories.Extensions - endpoint := testutil.GetAvailableLocalAddress(t) - - tests := []struct { - getConfigFn getExtensionConfigFn - extension component.Type - skipLifecycle bool - }{ - { - extension: "health_check", - getConfigFn: func() component.Config { - cfg := extFactories["health_check"].CreateDefaultConfig().(*healthcheckextension.Config) - cfg.Endpoint = endpoint - return cfg - }, - }, - { - extension: "healthcheckv2", - getConfigFn: func() component.Config { - cfg := extFactories["healthcheckv2"].CreateDefaultConfig().(*healthcheckv2extension.Config) - cfg.Endpoint = endpoint - return cfg - }, - }, - { - extension: "pprof", - getConfigFn: func() component.Config { - cfg := extFactories["pprof"].CreateDefaultConfig().(*pprofextension.Config) - cfg.TCPAddr.Endpoint = endpoint - return cfg - }, - }, - { - extension: "sigv4auth", - getConfigFn: func() component.Config { - cfg := extFactories["sigv4auth"].CreateDefaultConfig().(*sigv4authextension.Config) - return cfg - }, - }, - { - extension: "zpages", - getConfigFn: func() component.Config { - cfg := extFactories["zpages"].CreateDefaultConfig().(*zpagesextension.Config) - cfg.TCPAddr.Endpoint = endpoint - return cfg - }, - }, - { - extension: "basicauth", - getConfigFn: func() component.Config { - cfg := extFactories["basicauth"].CreateDefaultConfig().(*basicauthextension.Config) - // No need to clean up, t.TempDir will be deleted entirely. - fileName := filepath.Join(t.TempDir(), "random.file") - require.NoError(t, os.WriteFile(fileName, []byte("username:password"), 0600)) - - cfg.Htpasswd = &basicauthextension.HtpasswdSettings{ - File: fileName, - Inline: "username:password", - } - return cfg - }, - }, - { - extension: "bearertokenauth", - getConfigFn: func() component.Config { - cfg := extFactories["bearertokenauth"].CreateDefaultConfig().(*bearertokenauthextension.Config) - cfg.BearerToken = "sometoken" - return cfg - }, - }, - { - extension: "memory_ballast", - getConfigFn: func() component.Config { - cfg := extFactories["memory_ballast"].CreateDefaultConfig().(*ballastextension.Config) - return cfg - }, - }, - { - extension: "asapclient", - getConfigFn: func() component.Config { - cfg := extFactories["asapclient"].CreateDefaultConfig().(*asapauthextension.Config) - cfg.KeyID = "test_issuer/test_kid" - cfg.Issuer = "test_issuer" - cfg.Audience = []string{"some_service"} - cfg.TTL = 10 * time.Second - // Valid PEM data required for successful initialisation. Key not actually used anywhere. - cfg.PrivateKey = "data:application/pkcs8;kid=test;base64,MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgE" + - "AAkEA0ZPr5JeyVDoB8RyZqQsx6qUD+9gMFg1/0hgdAvmytWBMXQJYdwkK2dFJwwZcWJVhJGcOJBDfB/8tcbdJd34KZQIDAQ" + - "ABAkBZD20tJTHJDSWKGsdJyNIbjqhUu4jXTkFFPK4Hd6jz3gV3fFvGnaolsD5Bt50dTXAiSCpFNSb9M9GY6XUAAdlBAiEA6" + - "MccfdZRfVapxKtAZbjXuAgMvnPtTvkVmwvhWLT5Wy0CIQDmfE8Et/pou0Jl6eM0eniT8/8oRzBWgy9ejDGfj86PGQIgWePq" + - "IL4OofRBgu0O5TlINI0HPtTNo12U9lbUIslgMdECICXT2RQpLcvqj+cyD7wZLZj6vrHZnTFVrnyR/cL2UyxhAiBswe/MCcD" + - "7T7J4QkNrCG+ceQGypc7LsxlIxQuKh5GWYA==" - return cfg - }, - }, - { - extension: "ecs_observer", - skipLifecycle: true, - }, - { - extension: "ecs_task_observer", - getConfigFn: func() component.Config { - cfg := extFactories["ecs_task_observer"].CreateDefaultConfig().(*ecstaskobserver.Config) - cfg.Endpoint = "http://localhost" - return cfg - }, - }, - { - extension: "awsproxy", - skipLifecycle: true, // Requires EC2 metadata service to be running - }, - { - extension: "http_forwarder", - getConfigFn: func() component.Config { - cfg := extFactories["http_forwarder"].CreateDefaultConfig().(*httpforwarderextension.Config) - cfg.Egress.Endpoint = "http://" + endpoint - cfg.Ingress.Endpoint = testutil.GetAvailableLocalAddress(t) - return cfg - }, - }, - { - extension: "oauth2client", - getConfigFn: func() component.Config { - cfg := extFactories["oauth2client"].CreateDefaultConfig().(*oauth2clientauthextension.Config) - cfg.ClientID = "otel-extension" - cfg.ClientSecret = "testsarehard" - cfg.TokenURL = "http://" + endpoint - return cfg - }, - }, - { - extension: "oidc", - skipLifecycle: true, // Requires a running OIDC server in order to complete life cycle testing - }, - { - extension: "db_storage", - getConfigFn: func() component.Config { - cfg := extFactories["db_storage"].CreateDefaultConfig().(*dbstorage.Config) - cfg.DriverName = "sqlite3" - cfg.DataSource = filepath.Join(t.TempDir(), "foo.db") - return cfg - }, - }, - { - extension: "file_storage", - getConfigFn: func() component.Config { - cfg := extFactories["file_storage"].CreateDefaultConfig().(*filestorage.Config) - cfg.Directory = t.TempDir() - return cfg - }, - }, - { - extension: "host_observer", - getConfigFn: func() component.Config { - cfg := extFactories["host_observer"].CreateDefaultConfig().(*hostobserver.Config) - return cfg - }, - }, - { - extension: "k8s_observer", - skipLifecycle: true, // Requires a K8s api to interfact with and validate - }, - { - extension: "docker_observer", - skipLifecycle: true, // Requires a docker api to interface and validate. - }, - { - extension: "headers_setter", - getConfigFn: func() component.Config { - cfg := extFactories["headers_setter"].CreateDefaultConfig().(*headerssetterextension.Config) - return cfg - }, - }, - { - extension: "jaegerremotesampling", - skipLifecycle: true, - getConfigFn: func() component.Config { - return extFactories["jaegerremotesampling"].CreateDefaultConfig().(*jaegerremotesampling.Config) - }, - }, - { - extension: "otlp_encoding", - }, - { - extension: "text_encoding", - }, - { - extension: "jaeger_encoding", - }, - { - extension: "json_log_encoding", - }, - { - extension: "zipkin_encoding", - }, - { - extension: "remotetap", - getConfigFn: func() component.Config { - return extFactories["remotetap"].CreateDefaultConfig().(*remotetapextension.Config) - }, - }, - { - extension: "opamp", - getConfigFn: func() component.Config { - cfg := extFactories["opamp"].CreateDefaultConfig().(*opampextension.Config) - cfg.Server.WS.Endpoint = "wss://" + endpoint - return cfg - }, - }, - { - extension: "solarwindsapmsettings", - skipLifecycle: true, // Requires Solarwinds APM endpoint and token - }, - { - extension: "ackextension", - getConfigFn: func() component.Config { - return extFactories["ackextension"].CreateDefaultConfig().(*ackextension.Config) - }, - }, - { - extension: "googleclientauthextension", - getConfigFn: func() component.Config { - return extFactories["googleclientauthextension"].CreateDefaultConfig().(*googleclientauthextension.Config) - }, - skipLifecycle: true, - }, - } - - extensionCount := 0 - expectedExtensions := map[component.Type]struct{}{} - for k := range extFactories { - expectedExtensions[k] = struct{}{} - } - for _, tt := range tests { - _, ok := extFactories[tt.extension] - if !ok { - // not part of the distro, skipping. - continue - } - delete(expectedExtensions, tt.extension) - extensionCount++ - t.Run(string(tt.extension), func(t *testing.T) { - factory := extFactories[tt.extension] - assert.Equal(t, tt.extension, factory.Type()) - - t.Run("shutdown", func(t *testing.T) { - verifyExtensionShutdown(t, factory, tt.getConfigFn) - }) - t.Run("lifecycle", func(t *testing.T) { - if tt.skipLifecycle { - t.SkipNow() - } - verifyExtensionLifecycle(t, factory, tt.getConfigFn) - }) - - }) - } - assert.Len(t, extFactories, extensionCount, "All extensions must be added to the lifecycle tests", expectedExtensions) -} - -// getExtensionConfigFn is used customize the configuration passed to the verification. -// This is used to change ports or provide values required but not provided by the -// default configuration. -type getExtensionConfigFn func() component.Config - -// verifyExtensionLifecycle is used to test if an extension type can handle the typical -// lifecycle of a component. The getConfigFn parameter only need to be specified if -// the test can't be done with the default configuration for the component. -func verifyExtensionLifecycle(t *testing.T, factory extension.Factory, getConfigFn getExtensionConfigFn) { - ctx := context.Background() - host := componenttest.NewNopHost() - extCreateSet := extensiontest.NewNopCreateSettings() - extCreateSet.ReportStatus = func(event *component.StatusEvent) { - require.NoError(t, event.Err()) - } - - if getConfigFn == nil { - getConfigFn = factory.CreateDefaultConfig - } - - firstExt, err := factory.CreateExtension(ctx, extCreateSet, getConfigFn()) - require.NoError(t, err) - require.NoError(t, firstExt.Start(ctx, host)) - require.NoError(t, firstExt.Shutdown(ctx)) - - secondExt, err := factory.CreateExtension(ctx, extCreateSet, getConfigFn()) - require.NoError(t, err) - require.NoError(t, secondExt.Start(ctx, host)) - require.NoError(t, secondExt.Shutdown(ctx)) -} - -// verifyExtensionShutdown is used to test if an extension type can be shutdown without being started first. -func verifyExtensionShutdown(tb testing.TB, factory extension.Factory, getConfigFn getExtensionConfigFn) { - ctx := context.Background() - extCreateSet := extensiontest.NewNopCreateSettings() - - if getConfigFn == nil { - getConfigFn = factory.CreateDefaultConfig - } - - e, err := factory.CreateExtension(ctx, extCreateSet, getConfigFn()) - if errors.Is(err, component.ErrDataTypeIsNotSupported) { - return - } - if e == nil { - return - } - - assert.NotPanics(tb, func() { - assert.NoError(tb, e.Shutdown(ctx)) - }) -} diff --git a/cmd/otelcontribcol/go.mod b/cmd/otelcontribcol/go.mod deleted file mode 100644 index a90ca82c6e0c..000000000000 --- a/cmd/otelcontribcol/go.mod +++ /dev/null @@ -1,1298 +0,0 @@ -// Code generated by "go.opentelemetry.io/collector/cmd/builder". DO NOT EDIT. - -module github.com/open-telemetry/opentelemetry-collector-contrib/cmd/otelcontribcol - -go 1.21.0 - -toolchain go1.21.10 - -require ( - github.com/open-telemetry/opentelemetry-collector-contrib/confmap/provider/s3provider v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/confmap/provider/secretsmanagerprovider v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/connector/datadogconnector v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/connector/exceptionsconnector v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/connector/failoverconnector v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/connector/grafanacloudconnector v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/connector/roundrobinconnector v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/connector/servicegraphconnector v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/alertmanagerexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/alibabacloudlogserviceexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awscloudwatchlogsexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsemfexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awskinesisexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awss3exporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsxrayexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/azuredataexplorerexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/azuremonitorexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/carbonexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/cassandraexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/clickhouseexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/coralogixexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datasetexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlecloudexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlecloudpubsubexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlemanagedprometheusexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/honeycombmarkerexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/influxdbexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/logicmonitorexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/logzioexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/lokiexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/mezmoexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opensearchexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/pulsarexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sapmexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sentryexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/signalfxexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/skywalkingexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sumologicexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/tencentcloudlogserviceexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/asapauthextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/basicauthextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/bearertokenauthextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/jaegerencodingextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/jsonlogencodingextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/otlpencodingextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/textencodingextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/zipkinencodingextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/googleclientauthextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/httpforwarderextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/jaegerremotesampling v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/oauth2clientauthextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/dockerobserver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/ecsobserver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/ecstaskobserver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/hostobserver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/k8sobserver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/oidcauthextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/opampextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/remotetapextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/solarwindsapmsettingsextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/dbstorage v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/filestorage v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/sumologicextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/intervalprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricsgenerationprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricstransformprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/redactionprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/remotetapprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/routingprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/spanprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/sumologicprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/activedirectorydsreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/apachereceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/apachesparkreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awscloudwatchreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awscontainerinsightreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsecscontainermetricsreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsfirehosereceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsxrayreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azureblobreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azureeventhubreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azuremonitorreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/bigipreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/carbonreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/chronyreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/cloudflarereceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/cloudfoundryreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/collectdreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/couchdbreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/datadogreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/dockerstatsreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/elasticsearchreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/expvarreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filestatsreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/flinkmetricsreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/fluentforwardreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/googlecloudpubsubreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/googlecloudspannerreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/haproxyreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/httpcheckreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/iisreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/influxdbreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jmxreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/journaldreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8seventsreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sobjectsreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkametricsreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kubeletstatsreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/lokireceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/memcachedreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mongodbatlasreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mongodbreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mysqlreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/namedpipereceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nginxreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nsxtreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/oracledbreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/otlpjsonfilereceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/podmanreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/postgresqlreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/pulsarreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/purefareceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/purefbreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/rabbitmqreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/receivercreator v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/redisreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/riakreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sapmreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/signalfxreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/simpleprometheusreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/skywalkingreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/snmpreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/snowflakereceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/solacereceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkenterprisereceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkhecreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sqlqueryreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sqlserverreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sshcheckreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/statsdreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/tcplogreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/udplogreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/vcenterreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/wavefrontreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/webhookeventreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/windowseventlogreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/windowsperfcountersreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver v0.102.0 - github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configgrpc v0.102.0 - go.opentelemetry.io/collector/config/confighttp v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0 - go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0 - go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0 - go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0 - go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0 - go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0 - go.opentelemetry.io/collector/connector v0.102.0 - go.opentelemetry.io/collector/connector/forwardconnector v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/exporter/debugexporter v0.102.0 - go.opentelemetry.io/collector/exporter/nopexporter v0.102.0 - go.opentelemetry.io/collector/exporter/otlpexporter v0.102.0 - go.opentelemetry.io/collector/exporter/otlphttpexporter v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/collector/extension/ballastextension v0.102.0 - go.opentelemetry.io/collector/extension/zpagesextension v0.102.0 - go.opentelemetry.io/collector/otelcol v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/processor v0.102.0 - go.opentelemetry.io/collector/processor/batchprocessor v0.102.0 - go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.102.0 - go.opentelemetry.io/collector/receiver v0.102.0 - go.opentelemetry.io/collector/receiver/nopreceiver v0.102.0 - go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0 - golang.org/x/sys v0.20.0 -) - -require ( - bitbucket.org/atlassian/go-asap/v2 v2.8.0 // indirect - cloud.google.com/go v0.114.0 // indirect - cloud.google.com/go/auth v0.4.2 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.2 // indirect - cloud.google.com/go/compute/metadata v0.3.0 // indirect - cloud.google.com/go/iam v1.1.8 // indirect - cloud.google.com/go/logging v1.10.0 // indirect - cloud.google.com/go/longrunning v0.5.7 // indirect - cloud.google.com/go/monitoring v1.19.0 // indirect - cloud.google.com/go/pubsub v1.38.0 // indirect - cloud.google.com/go/spanner v1.63.0 // indirect - cloud.google.com/go/trace v1.10.7 // indirect - code.cloudfoundry.org/clock v0.0.0-20180518195852-02e53af36e6c // indirect - code.cloudfoundry.org/go-diodes v0.0.0-20211115184647-b584dd5df32c // indirect - code.cloudfoundry.org/go-loggregator v7.4.0+incompatible // indirect - code.cloudfoundry.org/rfc5424 v0.0.0-20201103192249-000122071b78 // indirect - filippo.io/edwards25519 v1.1.0 // indirect - github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect - github.com/99designs/keyring v1.2.2 // indirect - github.com/AthenZ/athenz v1.10.39 // indirect - github.com/Azure/azure-amqp-common-go/v4 v4.2.0 // indirect - github.com/Azure/azure-event-hubs-go/v3 v3.6.2 // indirect - github.com/Azure/azure-kusto-go v0.15.2 // indirect - github.com/Azure/azure-pipeline-go v0.2.3 // indirect - github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.6.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.5.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor v0.11.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2 // indirect - github.com/Azure/azure-storage-queue-go v0.0.0-20230531184854-c06a8eff66fe // indirect - github.com/Azure/go-amqp v1.0.5 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.29 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.23 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect - github.com/Azure/go-autorest/autorest/validation v0.3.1 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect - github.com/ClickHouse/ch-go v0.61.5 // indirect - github.com/ClickHouse/clickhouse-go/v2 v2.23.0 // indirect - github.com/Code-Hex/go-generics-cache v1.3.1 // indirect - github.com/DataDog/agent-payload/v5 v5.0.119 // indirect - github.com/DataDog/datadog-agent/comp/core/config v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/core/hostname/hostnameinterface v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/core/log v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/core/secrets v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/core/telemetry v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/def v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/logs/agent/config v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline/logsagentpipelineimpl v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/exporter/logsagentexporter v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/metricsclient v0.0.0-20240525065430-d0b647bcb646 // indirect - github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/statsprocessor v0.0.0-20240525065430-d0b647bcb646 // indirect - github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/config/env v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/config/model v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/config/setup v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/config/utils v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/auditor v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/client v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/diagnostic v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/message v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/metrics v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/pipeline v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/processor v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/sds v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/sender v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/sources v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/status/statusinterface v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/status/utils v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/obfuscate v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/proto v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/status/health v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/telemetry v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/trace v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/backoff v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/cgroups v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/executable v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/filesystem v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/fxutil v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/http v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/log v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/optional v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/pointer v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/scrubber v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/startstop v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/statstracker v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/system v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/system/socket v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/winutil v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/version v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-api-client-go/v2 v2.26.0 // indirect - github.com/DataDog/datadog-go/v5 v5.5.0 // indirect - github.com/DataDog/dd-sensitive-data-scanner/sds-go/go v0.0.0-20240419161837-f1b2f553edfe // indirect - github.com/DataDog/go-sqllexer v0.0.9 // indirect - github.com/DataDog/go-tuf v1.1.0-0.5.2 // indirect - github.com/DataDog/gohai v0.0.0-20230524154621-4316413895ee // indirect - github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata v0.16.1 // indirect - github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.16.1 // indirect - github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/logs v0.16.1 // indirect - github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics v0.16.1 // indirect - github.com/DataDog/opentelemetry-mapping-go/pkg/quantile v0.16.1 // indirect - github.com/DataDog/sketches-go v1.4.5 // indirect - github.com/DataDog/viper v1.13.3 // indirect - github.com/DataDog/zstd v1.5.2 // indirect - github.com/GehirnInc/crypt v0.0.0-20200316065508-bb7000b8a962 // indirect - github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.23.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector v0.47.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector/googlemanagedprometheus v0.47.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.23.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/extension/googleclientauthextension v0.47.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.47.0 // indirect - github.com/IBM/sarama v1.43.2 // indirect - github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/ReneKroon/ttlcache/v2 v2.11.0 // indirect - github.com/SAP/go-hdb v1.9.5 // indirect - github.com/SermoDigital/jose v0.9.2-0.20180104203859-803625baeddc // indirect - github.com/Showmax/go-fqdn v1.0.0 // indirect - github.com/aerospike/aerospike-client-go/v6 v6.13.0 // indirect - github.com/alecthomas/participle/v2 v2.1.1 // indirect - github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 // indirect - github.com/aliyun/aliyun-log-go-sdk v0.1.75 // indirect - github.com/andybalholm/brotli v1.1.0 // indirect - github.com/apache/arrow/go/v15 v15.0.0 // indirect - github.com/apache/pulsar-client-go v0.8.1 // indirect - github.com/apache/pulsar-client-go/oauth2 v0.0.0-20220120090717-25e59572242e // indirect - github.com/apache/thrift v0.20.0 // indirect - github.com/ardielle/ardielle-go v1.5.2 // indirect - github.com/armon/go-metrics v0.4.1 // indirect - github.com/armon/go-radix v1.0.0 // indirect - github.com/aws/aws-sdk-go v1.53.11 // indirect - github.com/aws/aws-sdk-go-v2 v1.27.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 // indirect - github.com/aws/aws-sdk-go-v2/config v1.27.16 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.16 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3 // indirect - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.15 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.7 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.9 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.7 // indirect - github.com/aws/aws-sdk-go-v2/service/kinesis v1.27.8 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.54.3 // indirect - github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.29.1 // indirect - github.com/aws/aws-sdk-go-v2/service/servicediscovery v1.29.10 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.20.9 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.28.10 // indirect - github.com/aws/smithy-go v1.20.2 // indirect - github.com/benbjohnson/clock v1.3.5 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/blang/semver/v4 v4.0.0 // indirect - github.com/bmatcuk/doublestar/v4 v4.6.1 // indirect - github.com/briandowns/spinner v1.23.0 // indirect - github.com/buger/jsonparser v1.1.1 // indirect - github.com/cenkalti/backoff v2.2.1+incompatible // indirect - github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/checkpoint-restore/go-criu/v5 v5.3.0 // indirect - github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect - github.com/cilium/ebpf v0.11.0 // indirect - github.com/cloudfoundry-incubator/uaago v0.0.0-20190307164349-8136b7bbe76e // indirect - github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50 // indirect - github.com/containerd/cgroups/v3 v3.0.3 // indirect - github.com/containerd/console v1.0.3 // indirect - github.com/containerd/ttrpc v1.2.2 // indirect - github.com/coreos/go-oidc/v3 v3.10.0 // indirect - github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/cskr/pubsub v1.0.2 // indirect - github.com/cyphar/filepath-securejoin v0.2.4 // indirect - github.com/danieljoos/wincred v1.1.2 // indirect - github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/dennwc/varint v1.0.0 // indirect - github.com/devigned/tab v0.1.1 // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/digitalocean/godo v1.109.0 // indirect - github.com/distribution/reference v0.5.0 // indirect - github.com/docker/docker v25.0.5+incompatible // indirect - github.com/docker/go-connections v0.5.0 // indirect - github.com/docker/go-units v0.5.0 // indirect - github.com/dustin/go-humanize v1.0.1 // indirect - github.com/dvsekhvalnov/jose2go v1.6.0 // indirect - github.com/eapache/go-resiliency v1.6.0 // indirect - github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 // indirect - github.com/eapache/queue v1.1.0 // indirect - github.com/elastic/elastic-transport-go/v8 v8.5.0 // indirect - github.com/elastic/go-docappender/v2 v2.1.2 // indirect - github.com/elastic/go-elasticsearch/v7 v7.17.10 // indirect - github.com/elastic/go-elasticsearch/v8 v8.13.1 // indirect - github.com/elastic/go-structform v0.0.10 // indirect - github.com/elastic/go-sysinfo v1.7.1 // indirect - github.com/elastic/go-windows v1.0.1 // indirect - github.com/emicklei/go-restful/v3 v3.11.0 // indirect - github.com/envoyproxy/go-control-plane v0.12.0 // indirect - github.com/envoyproxy/protoc-gen-validate v1.0.4 // indirect - github.com/euank/go-kmsg-parser v2.0.0+incompatible // indirect - github.com/expr-lang/expr v1.16.9 // indirect - github.com/facebook/time v0.0.0-20240510113249-fa89cc575891 // indirect - github.com/fatih/color v1.16.0 // indirect - github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/gabriel-vasile/mimetype v1.4.2 // indirect - github.com/getsentry/sentry-go v0.28.0 // indirect - github.com/go-faster/city v1.0.1 // indirect - github.com/go-faster/errors v0.7.1 // indirect - github.com/go-jose/go-jose/v4 v4.0.1 // indirect - github.com/go-kit/kit v0.13.0 // indirect - github.com/go-kit/log v0.2.1 // indirect - github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect - github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect - github.com/go-openapi/jsonpointer v0.20.2 // indirect - github.com/go-openapi/jsonreference v0.20.4 // indirect - github.com/go-openapi/swag v0.22.9 // indirect - github.com/go-resty/resty/v2 v2.12.0 // indirect - github.com/go-sql-driver/mysql v1.8.1 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect - github.com/go-zookeeper/zk v1.0.3 // indirect - github.com/gobwas/glob v0.2.3 // indirect - github.com/goccy/go-json v0.10.2 // indirect - github.com/gocql/gocql v1.6.0 // indirect - github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect - github.com/godbus/dbus/v5 v5.0.6 // indirect - github.com/gofrs/uuid v4.4.0+incompatible // indirect - github.com/gogo/googleapis v1.4.1 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt v3.2.2+incompatible // indirect - github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang-jwt/jwt/v5 v5.2.1 // indirect - github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect - github.com/golang-sql/sqlexp v0.1.0 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/mock v1.6.0 // indirect - github.com/golang/protobuf v1.5.4 // indirect - github.com/golang/snappy v0.0.4 // indirect - github.com/google/cadvisor v0.49.0 // indirect - github.com/google/flatbuffers v23.5.26+incompatible // indirect - github.com/google/gnostic-models v0.6.8 // indirect - github.com/google/go-cmp v0.6.0 // indirect - github.com/google/go-querystring v1.1.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/s2a-go v0.1.7 // indirect - github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.4 // indirect - github.com/gophercloud/gophercloud v1.8.0 // indirect - github.com/gorilla/mux v1.8.1 // indirect - github.com/gorilla/websocket v1.5.1 // indirect - github.com/gosnmp/gosnmp v1.37.0 // indirect - github.com/grafana/loki/pkg/push v0.0.0-20240514112848-a1b1eeb09583 // indirect - github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd // indirect - github.com/grobie/gomemcache v0.0.0-20230213081705-239240bbc445 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect - github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect - github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect - github.com/hashicorp/consul/api v1.28.3 // indirect - github.com/hashicorp/cronexpr v1.1.2 // indirect - github.com/hashicorp/errwrap v1.1.0 // indirect - github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-hclog v1.6.3 // indirect - github.com/hashicorp/go-immutable-radix v1.3.1 // indirect - github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-retryablehttp v0.7.4 // indirect - github.com/hashicorp/go-rootcerts v1.0.2 // indirect - github.com/hashicorp/go-uuid v1.0.3 // indirect - github.com/hashicorp/go-version v1.7.0 // indirect - github.com/hashicorp/golang-lru v1.0.2 // indirect - github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hashicorp/nomad/api v0.0.0-20240306004928-3e7191ccb702 // indirect - github.com/hashicorp/serf v0.10.1 // indirect - github.com/hectane/go-acl v0.0.0-20190604041725-da78bae5fc95 // indirect - github.com/hetznercloud/hcloud-go/v2 v2.6.0 // indirect - github.com/iancoleman/strcase v0.3.0 // indirect - github.com/imdario/mergo v0.3.16 // indirect - github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/influxdata/influxdb-observability/common v0.5.12 // indirect - github.com/influxdata/influxdb-observability/influx2otel v0.5.12 // indirect - github.com/influxdata/influxdb-observability/otel2influx v0.5.12 // indirect - github.com/influxdata/line-protocol/v2 v2.2.1 // indirect - github.com/ionos-cloud/sdk-go/v6 v6.1.11 // indirect - github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect - github.com/jackc/pgx/v5 v5.6.0 // indirect - github.com/jackc/puddle/v2 v2.2.1 // indirect - github.com/jaegertracing/jaeger v1.57.0 // indirect - github.com/jcmturner/aescts/v2 v2.0.0 // indirect - github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect - github.com/jcmturner/gofork v1.7.6 // indirect - github.com/jcmturner/goidentity/v6 v6.0.1 // indirect - github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect - github.com/jcmturner/rpc/v2 v2.0.3 // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 // indirect - github.com/josharian/intern v1.0.0 // indirect - github.com/jpillora/backoff v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/julienschmidt/httprouter v1.3.0 // indirect - github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect - github.com/karrick/godirwalk v1.17.0 // indirect - github.com/klauspost/compress v1.17.8 // indirect - github.com/klauspost/cpuid/v2 v2.2.5 // indirect - github.com/knadh/koanf/maps v0.1.1 // indirect - github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect - github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b // indirect - github.com/kr/fs v0.1.0 // indirect - github.com/kylelemons/godebug v1.1.0 // indirect - github.com/leodido/go-syslog/v4 v4.1.0 // indirect - github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b // indirect - github.com/leoluk/perflib_exporter v0.2.1 // indirect - github.com/lestrrat-go/strftime v1.0.6 // indirect - github.com/lib/pq v1.10.9 // indirect - github.com/lightstep/go-expohisto v1.0.0 // indirect - github.com/linkedin/goavro/v2 v2.9.8 // indirect - github.com/linode/linodego v1.33.0 // indirect - github.com/logicmonitor/lm-data-sdk-go v1.3.0 // indirect - github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c // indirect - github.com/magiconair/properties v1.8.7 // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-ieproxy v0.0.11 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-sqlite3 v1.14.22 // indirect - github.com/microsoft/ApplicationInsights-Go v0.4.4 // indirect - github.com/microsoft/go-mssqldb v1.7.1 // indirect - github.com/miekg/dns v1.1.58 // indirect - github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible // indirect - github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/go-ps v1.0.0 // indirect - github.com/mitchellh/hashstructure v1.1.0 // indirect - github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect - github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c // indirect - github.com/mitchellh/reflectwalk v1.0.2 // indirect - github.com/moby/sys/mountinfo v0.6.2 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect - github.com/mongodb-forks/digest v1.1.0 // indirect - github.com/montanaflynn/stats v0.7.0 // indirect - github.com/mostynb/go-grpc-compression v1.2.2 // indirect - github.com/mrunalp/fileutils v0.5.1 // indirect - github.com/mtibben/percent v0.2.1 // indirect - github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect - github.com/nginxinc/nginx-prometheus-exporter v0.11.0 // indirect - github.com/oklog/ulid/v2 v2.1.0 // indirect - github.com/open-telemetry/opamp-go v0.14.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/opampcustommessages v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutil v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/containerinsight v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/cwlogs v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/ecsutil v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/k8s v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/metrics v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/proxy v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/xray v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/collectd v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/docker v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/kubelet v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/sqlquery v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchperresourceattr v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/azure v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/loki v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/signalfx v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/skywalking v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/winperfcounters v0.102.0 // indirect - github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.1.0 // indirect - github.com/opencontainers/runc v1.1.12 // indirect - github.com/opencontainers/runtime-spec v1.1.0-rc.3 // indirect - github.com/opencontainers/selinux v1.10.0 // indirect - github.com/opensearch-project/opensearch-go/v2 v2.3.0 // indirect - github.com/openshift/api v3.9.0+incompatible // indirect - github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142 // indirect - github.com/openzipkin/zipkin-go v0.4.3 // indirect - github.com/outcaste-io/ristretto v0.2.1 // indirect - github.com/ovh/go-ovh v1.4.3 // indirect - github.com/patrickmn/go-cache v2.1.0+incompatible // indirect - github.com/paulmach/orb v0.11.1 // indirect - github.com/pelletier/go-toml v1.9.3 // indirect - github.com/pelletier/go-toml/v2 v2.1.0 // indirect - github.com/philhofer/fwd v1.1.2 // indirect - github.com/pierrec/lz4 v2.6.1+incompatible // indirect - github.com/pierrec/lz4/v4 v4.1.21 // indirect - github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/pkg/sftp v1.13.6 // indirect - github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c // indirect - github.com/pquerna/cachecontrol v0.1.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/common/sigv4 v0.1.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect - github.com/redis/go-redis/v9 v9.5.1 // indirect - github.com/relvacode/iso8601 v1.4.0 // indirect - github.com/rs/cors v1.11.0 // indirect - github.com/sagikazarmark/locafero v0.4.0 // indirect - github.com/sagikazarmark/slog-shim v0.1.0 // indirect - github.com/samber/lo v1.38.1 // indirect - github.com/scaleway/scaleway-sdk-go v1.0.0-beta.25 // indirect - github.com/scalyr/dataset-go v0.18.0 // indirect - github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646 // indirect - github.com/secure-systems-lab/go-securesystemslib v0.7.0 // indirect - github.com/segmentio/asm v1.2.0 // indirect - github.com/shirou/gopsutil/v3 v3.24.4 // indirect - github.com/shoenig/go-m1cpu v0.1.6 // indirect - github.com/shopspring/decimal v1.3.1 // indirect - github.com/signalfx/com_signalfx_metrics_protobuf v0.0.3 // indirect - github.com/signalfx/sapm-proto v0.14.0 // indirect - github.com/sijms/go-ora/v2 v2.8.19 // indirect - github.com/sirupsen/logrus v1.9.3 // indirect - github.com/snowflakedb/gosnowflake v1.10.1-0.20240509141315-5570db2126fe // indirect - github.com/soheilhy/cmux v0.1.5 // indirect - github.com/solarwindscloud/apm-proto v1.0.3 // indirect - github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spaolacci/murmur3 v1.1.0 // indirect - github.com/spf13/afero v1.11.0 // indirect - github.com/spf13/cast v1.6.0 // indirect - github.com/spf13/cobra v1.8.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.18.2 // indirect - github.com/stormcat24/protodep v0.1.8 // indirect - github.com/stretchr/objx v0.5.2 // indirect - github.com/subosito/gotenv v1.6.0 // indirect - github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 // indirect - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.931 // indirect - github.com/tg123/go-htpasswd v1.2.2 // indirect - github.com/tidwall/gjson v1.14.2 // indirect - github.com/tidwall/match v1.1.1 // indirect - github.com/tidwall/pretty v1.2.0 // indirect - github.com/tidwall/tinylru v1.1.0 // indirect - github.com/tidwall/wal v1.1.7 // indirect - github.com/tilinna/clock v1.1.0 // indirect - github.com/tinylib/msgp v1.1.9 // indirect - github.com/tklauser/go-sysconf v0.3.14 // indirect - github.com/tklauser/numcpus v0.8.0 // indirect - github.com/valyala/fastjson v1.6.4 // indirect - github.com/vincent-petithory/dataurl v1.0.0 // indirect - github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852 // indirect - github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae // indirect - github.com/vmware/go-vmware-nsxt v0.0.0-20230223012718-d31b8a1ca05e // indirect - github.com/vmware/govmomi v0.36.3 // indirect - github.com/vultr/govultr/v2 v2.17.2 // indirect - github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.1.2 // indirect - github.com/xdg-go/stringprep v1.0.4 // indirect - github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - github.com/yuin/gopher-lua v0.0.0-20220504180219-658193537a64 // indirect - github.com/yusufpapurcu/wmi v1.2.4 // indirect - github.com/zeebo/xxh3 v1.0.2 // indirect - go.elastic.co/apm/module/apmzap/v2 v2.6.0 // indirect - go.elastic.co/apm/v2 v2.6.0 // indirect - go.elastic.co/fastjson v1.3.0 // indirect - go.etcd.io/bbolt v1.3.10 // indirect - go.mongodb.org/atlas v0.36.0 // indirect - go.mongodb.org/mongo-driver v1.15.0 // indirect - go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/confignet v0.102.0 // indirect - go.opentelemetry.io/collector/config/configretry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/filter v0.102.0 // indirect - go.opentelemetry.io/collector/semconv v0.102.0 // indirect - go.opentelemetry.io/collector/service v0.102.0 // indirect - go.opentelemetry.io/contrib/config v0.7.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/contrib/propagators/b3 v1.27.0 // indirect - go.opentelemetry.io/contrib/zpages v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/bridge/opencensus v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 // indirect - go.opentelemetry.io/otel/metric v1.27.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - go.opentelemetry.io/otel/trace v1.27.0 // indirect - go.opentelemetry.io/proto/otlp v1.2.0 // indirect - go.uber.org/atomic v1.11.0 // indirect - go.uber.org/dig v1.17.0 // indirect - go.uber.org/fx v1.18.2 // indirect - go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.23.0 // indirect - golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/mod v0.17.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/oauth2 v0.20.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/term v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.21.0 // indirect - golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect - gonum.org/v1/gonum v0.15.0 // indirect - google.golang.org/api v0.182.0 // indirect - google.golang.org/genproto v0.0.0-20240513163218-0867130af1f8 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240521202816-d264139d666e // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - gopkg.in/zorkian/go-datadog-api.v2 v2.30.0 // indirect - howett.net/plist v1.0.0 // indirect - k8s.io/api v0.29.3 // indirect - k8s.io/apimachinery v0.29.3 // indirect - k8s.io/client-go v0.29.3 // indirect - k8s.io/klog/v2 v2.120.1 // indirect - k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect - k8s.io/kubelet v0.29.3 // indirect - k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0 // indirect - sigs.k8s.io/controller-runtime v0.17.3 // indirect - sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect - sigs.k8s.io/yaml v1.4.0 // indirect - skywalking.apache.org/repo/goapi v0.0.0-20240104145220-ba7202308dd4 // indirect -) - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage => ../../extension/storage - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/dbstorage => ../../extension/storage/dbstorage - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/filestorage => ../../extension/storage/filestorage - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal => ../../pkg/batchpersignal - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/cwlogs => ../../internal/aws/cwlogs - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/common => ../../internal/common - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics => ../../internal/exp/metrics - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsxrayreceiver => ../../receiver/awsxrayreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azureblobreceiver => ../../receiver/azureblobreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sobjectsreceiver => ../../receiver/k8sobjectsreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/haproxyreceiver => ../../receiver/haproxyreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/httpcheckreceiver => ../../receiver/httpcheckreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/dockerobserver => ../../extension/observer/dockerobserver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/k8sobserver => ../../extension/observer/k8sobserver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sentryexporter => ../../exporter/sentryexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nsxtreceiver => ../../receiver/nsxtreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kubeletstatsreceiver => ../../receiver/kubeletstatsreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/dockerstatsreceiver => ../../receiver/dockerstatsreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlecloudpubsubexporter => ../../exporter/googlecloudpubsubexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsxrayexporter => ../../exporter/awsxrayexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/postgresqlreceiver => ../../receiver/postgresqlreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/receivercreator => ../../receiver/receivercreator - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor => ../../processor/k8sattributesprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsemfexporter => ../../exporter/awsemfexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver => ../../receiver/opencensusreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkhecreceiver => ../../receiver/splunkhecreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/collectdreceiver => ../../receiver/collectdreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/spanprocessor => ../../processor/spanprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy => ../../extension/awsproxy - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin => ../../pkg/translator/zipkin - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor => ../../processor/groupbyattrsprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/skywalkingexporter => ../../exporter/skywalkingexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/mezmoexporter => ../../exporter/mezmoexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/clickhouseexporter => ../../exporter/clickhouseexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/cassandraexporter => ../../exporter/cassandraexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/udplogreceiver => ../../receiver/udplogreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk => ../../internal/splunk - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/podmanreceiver => ../../receiver/podmanreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/flinkmetricsreceiver => ../../receiver/flinkmetricsreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsecscontainermetricsreceiver => ../../receiver/awsecscontainermetricsreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/oidcauthextension => ../../extension/oidcauthextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awskinesisexporter => ../../exporter/awskinesisexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl => ../../pkg/ottl - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nginxreceiver => ../../receiver/nginxreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/couchdbreceiver => ../../receiver/couchdbreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor => ../../processor/resourcedetectionprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension => ../../extension/healthcheckextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension => ../../extension/healthcheckv2extension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension => ../../extension/headerssetterextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlemanagedprometheusexporter => ../../exporter/googlemanagedprometheusexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver => ../../receiver/aerospikereceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor => ../../processor/cumulativetodeltaprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/intervalprocessor => ../../processor/intervalprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sapmreceiver => ../../receiver/sapmreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver => ../../receiver/zipkinreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver => ../../receiver/jaegerreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/xray => ../../internal/aws/xray - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/k8s => ../../internal/aws/k8s - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mysqlreceiver => ../../receiver/mysqlreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/asapauthextension => ../../extension/asapauthextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchperresourceattr => ../../pkg/batchperresourceattr - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/vcenterreceiver => ../../receiver/vcenterreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/statsdreceiver => ../../receiver/statsdreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter => ../../exporter/prometheusremotewriteexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor => ../../processor/groupbytraceprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/tencentcloudlogserviceexporter => ../../exporter/tencentcloudlogserviceexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter => ../../exporter/loadbalancingexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/logicmonitorexporter => ../../exporter/logicmonitorexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azureeventhubreceiver => ../../receiver/azureeventhubreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azuremonitorreceiver => ../../receiver/azuremonitorreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jmxreceiver => ../../receiver/jmxreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsfirehosereceiver => ../../receiver/awsfirehosereceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/oauth2clientauthextension => ../../extension/oauth2clientauthextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter => ../../exporter/kafkaexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer => ../../extension/observer - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/coralogixexporter => ../../exporter/coralogixexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/tcplogreceiver => ../../receiver/tcplogreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension => ../../extension/pprofextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/loki => ../../pkg/translator/loki - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/metrics => ../../internal/aws/metrics - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/journaldreceiver => ../../receiver/journaldreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/logzioexporter => ../../exporter/logzioexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal => ../../internal/coreinternal - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8seventsreceiver => ../../receiver/k8seventsreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver => ../../receiver/k8sclusterreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor => ../../processor/transformprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor => ../../processor/filterprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/hostobserver => ../../extension/observer/hostobserver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver => ../../receiver/kafkareceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/bearertokenauthextension => ../../extension/bearertokenauthextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata => ../../pkg/experimentalmetricmetadata - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza => ../../pkg/stanza - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/fluentforwardreceiver => ../../receiver/fluentforwardreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/redisreceiver => ../../receiver/redisreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/basicauthextension => ../../extension/basicauthextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/influxdbexporter => ../../exporter/influxdbexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/alertmanagerexporter => ../../exporter/alertmanagerexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/alibabacloudlogserviceexporter => ../../exporter/alibabacloudlogserviceexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger => ../../pkg/translator/jaeger - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/docker => ../../internal/docker - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/ecsutil => ../../internal/aws/ecsutil - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/rabbitmqreceiver => ../../receiver/rabbitmqreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/elasticsearchreceiver => ../../receiver/elasticsearchreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricsgenerationprocessor => ../../processor/metricsgenerationprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor => ../../processor/attributesprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sqlqueryreceiver => ../../receiver/sqlqueryreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/purefareceiver => ../../receiver/purefareceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/purefbreceiver => ../../receiver/purefbreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/memcachedreceiver => ../../receiver/memcachedreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/azuremonitorexporter => ../../exporter/azuremonitorexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/azuredataexplorerexporter => ../../exporter/azuredataexplorerexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig => ../../internal/k8sconfig - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8stest => ../../internal/k8stest - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka => ../../internal/kafka - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/carbonreceiver => ../../receiver/carbonreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter => ../../exporter/splunkhecexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter => ../../exporter/prometheusexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/influxdbreceiver => ../../receiver/influxdbreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awscontainerinsightreceiver => ../../receiver/awscontainerinsightreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricstransformprocessor => ../../processor/metricstransformprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension => ../../extension/sigv4authextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus => ../../pkg/translator/opencensus - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/pulsarexporter => ../../exporter/pulsarexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter => ../../exporter/zipkinexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver => ../../receiver/hostmetricsreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/signalfx => ../../pkg/translator/signalfx - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/signalfxreceiver => ../../receiver/signalfxreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/windowsperfcountersreceiver => ../../receiver/windowsperfcountersreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/simpleprometheusreceiver => ../../receiver/simpleprometheusreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkametricsreceiver => ../../receiver/kafkametricsreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/cloudfoundryreceiver => ../../receiver/cloudfoundryreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter => ../../internal/filter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/activedirectorydsreceiver => ../../receiver/activedirectorydsreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/routingprocessor => ../../processor/routingprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor => ../../processor/deltatorateprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter => ../../exporter/datadogexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datasetexporter => ../../exporter/datasetexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/containerinsight => ../../internal/aws/containerinsight - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutil => ../../internal/aws/awsutil - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver => ../../receiver/zookeeperreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/wavefrontreceiver => ../../receiver/wavefrontreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mongodbreceiver => ../../receiver/mongodbreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite => ../../pkg/translator/prometheusremotewrite - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver => ../../receiver/filelogreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/signalfxexporter => ../../exporter/signalfxexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/solacereceiver => ../../receiver/solacereceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/iisreceiver => ../../receiver/iisreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/bigipreceiver => ../../receiver/bigipreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor => ../../processor/probabilisticsamplerprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter => ../../exporter/fileexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry => ../../pkg/resourcetotelemetry - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden => ../../pkg/golden - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter => ../../exporter/opencensusexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opensearchexporter => ../../exporter/opensearchexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders => ../../internal/metadataproviders - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/proxy => ../../internal/aws/proxy - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/snmpreceiver => ../../receiver/snmpreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mongodbatlasreceiver => ../../receiver/mongodbatlasreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awscloudwatchreceiver => ../../receiver/awscloudwatchreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/lokiexporter => ../../exporter/lokiexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent => ../../internal/sharedcomponent - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/expvarreceiver => ../../receiver/expvarreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/apachereceiver => ../../receiver/apachereceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/apachesparkreceiver => ../../receiver/apachesparkreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/httpforwarderextension => ../../extension/httpforwarderextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter => ../../exporter/elasticsearchexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awscloudwatchlogsexporter => ../../exporter/awscloudwatchlogsexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/googlecloudspannerreceiver => ../../receiver/googlecloudspannerreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver => ../../receiver/prometheusreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sapmexporter => ../../exporter/sapmexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/kubelet => ../../internal/kubelet - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sqlserverreceiver => ../../receiver/sqlserverreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/skywalkingreceiver => ../../receiver/skywalkingreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/snowflakereceiver => ../../receiver/snowflakereceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/riakreceiver => ../../receiver/riakreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor => ../../processor/tailsamplingprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver => ../../receiver/syslogreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor => ../../processor/resourceprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/carbonexporter => ../../exporter/carbonexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/winperfcounters => ../../pkg/winperfcounters - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlecloudexporter => ../../exporter/googlecloudexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus => ../../pkg/translator/prometheus - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/googlecloudpubsubreceiver => ../../receiver/googlecloudpubsubreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sumologicexporter => ../../exporter/sumologicexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter => ../../exporter/instanaexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/honeycombmarkerexporter => ../../exporter/honeycombmarkerexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/otlpjsonfilereceiver => ../../receiver/otlpjsonfilereceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/redactionprocessor => ../../processor/redactionprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/jaegerremotesampling => ../../extension/jaegerremotesampling - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sshcheckreceiver => ../../receiver/sshcheckreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/datadogreceiver => ../../receiver/datadogreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/chronyreceiver => ../../receiver/chronyreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/ecstaskobserver => ../../extension/observer/ecstaskobserver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/lokireceiver => ../../receiver/lokireceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filestatsreceiver => ../../receiver/filestatsreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awss3exporter => ../../exporter/awss3exporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/pulsarreceiver => ../../receiver/pulsarreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/oracledbreceiver => ../../receiver/oracledbreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/cloudflarereceiver => ../../receiver/cloudflarereceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/windowseventlogreceiver => ../../receiver/windowseventlogreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/webhookeventreceiver => ../../receiver/webhookeventreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/ecsobserver => ../../extension/observer/ecsobserver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/remotetapprocessor => ../../processor/remotetapprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/sumologicprocessor => ../../processor/sumologicprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter => ../../exporter/syslogexporter - -replace github.com/mattn/go-ieproxy => github.com/mattn/go-ieproxy v0.0.1 - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest => ../../pkg/pdatatest - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../../pkg/pdatautil - -replace github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector => ../../connector/countconnector - -replace github.com/open-telemetry/opentelemetry-collector-contrib/connector/datadogconnector => ../../connector/datadogconnector - -replace github.com/open-telemetry/opentelemetry-collector-contrib/connector/exceptionsconnector => ../../connector/exceptionsconnector - -replace github.com/open-telemetry/opentelemetry-collector-contrib/connector/failoverconnector => ../../connector/failoverconnector - -replace github.com/open-telemetry/opentelemetry-collector-contrib/connector/grafanacloudconnector => ../../connector/grafanacloudconnector - -replace github.com/open-telemetry/opentelemetry-collector-contrib/connector/roundrobinconnector => ../../connector/roundrobinconnector - -replace github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector => ../../connector/routingconnector - -replace github.com/open-telemetry/opentelemetry-collector-contrib/connector/servicegraphconnector => ../../connector/servicegraphconnector - -replace github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector => ../../connector/spanmetricsconnector - -replace github.com/openshift/api v3.9.0+incompatible => github.com/openshift/api v0.0.0-20180801171038-322a19404e37 - -replace github.com/outcaste-io/ristretto v0.2.0 => github.com/outcaste-io/ristretto v0.2.1 - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/azure => ../../pkg/translator/azure - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/skywalking => ../../pkg/translator/skywalking - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/collectd => ../../internal/collectd - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding => ../../extension/encoding - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/otlpencodingextension => ../../extension/encoding/otlpencodingextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/zipkinencodingextension => ../../extension/encoding/zipkinencodingextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/jsonlogencodingextension => ../../extension/encoding/jsonlogencodingextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/textencodingextension => ../../extension/encoding/textencodingextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/jaegerencodingextension => ../../extension/encoding/jaegerencodingextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/remotetapextension => ../../extension/remotetapextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/opampextension => ../../extension/opampextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/solarwindsapmsettingsextension => ../../extension/solarwindsapmsettingsextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/sumologicextension => ../../extension/sumologicextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/namedpipereceiver => ../../receiver/namedpipereceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/sqlquery => ../../internal/sqlquery - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension => ../../extension/ackextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/googleclientauthextension => ../../extension/googleclientauthextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkenterprisereceiver => ../../receiver/splunkenterprisereceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/opampcustommessages => ../../extension/opampcustommessages - -replace github.com/open-telemetry/opentelemetry-collector-contrib/confmap/provider/s3provider => ../../confmap/provider/s3provider - -replace github.com/open-telemetry/opentelemetry-collector-contrib/confmap/provider/secretsmanagerprovider => ../../confmap/provider/secretsmanagerprovider - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling => ../../pkg/sampling diff --git a/cmd/otelcontribcol/go.sum b/cmd/otelcontribcol/go.sum deleted file mode 100644 index 0a0b94b9c13f..000000000000 --- a/cmd/otelcontribcol/go.sum +++ /dev/null @@ -1,3367 +0,0 @@ -bitbucket.org/atlassian/go-asap/v2 v2.8.0 h1:JL4jktrZT3H8GHkkeJ1RCdhJ5YcOyVccA/2TJ4ae3I0= -bitbucket.org/atlassian/go-asap/v2 v2.8.0/go.mod h1:cuRgWb7eeGtsocKmqY2kPlMMlwpkeNh+QOIkjAMlUBc= -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= -cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= -cloud.google.com/go v0.114.0 h1:OIPFAdfrFDFO2ve2U7r/H5SwSbBzEdrBdE7xkgwc+kY= -cloud.google.com/go v0.114.0/go.mod h1:ZV9La5YYxctro1HTPug5lXH/GefROyW8PPD4T8n9J8E= -cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= -cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= -cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= -cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= -cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= -cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= -cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= -cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= -cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= -cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= -cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= -cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= -cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= -cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= -cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= -cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= -cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= -cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= -cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= -cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= -cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= -cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= -cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= -cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= -cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= -cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= -cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= -cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= -cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= -cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= -cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= -cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= -cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= -cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= -cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= -cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= -cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= -cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= -cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= -cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= -cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= -cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= -cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= -cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= -cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= -cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= -cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= -cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= -cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= -cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= -cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= -cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= -cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= -cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= -cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= -cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= -cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= -cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= -cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= -cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= -cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= -cloud.google.com/go/auth v0.4.2 h1:sb0eyLkhRtpq5jA+a8KWw0W70YcdVca7KJ8TM0AFYDg= -cloud.google.com/go/auth v0.4.2/go.mod h1:Kqvlz1cf1sNA0D+sYJnkPQOP+JMHkuHeIgVmCRtZOLc= -cloud.google.com/go/auth/oauth2adapt v0.2.2 h1:+TTV8aXpjeChS9M+aTtN/TjdQnzJvmzKFt//oWu7HX4= -cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q= -cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= -cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= -cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= -cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= -cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= -cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= -cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= -cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= -cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= -cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= -cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= -cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= -cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= -cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= -cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= -cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= -cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= -cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= -cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= -cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= -cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= -cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= -cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= -cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= -cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= -cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= -cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= -cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= -cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= -cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= -cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= -cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= -cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= -cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= -cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= -cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= -cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= -cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= -cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= -cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= -cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= -cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= -cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= -cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= -cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= -cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= -cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= -cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= -cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= -cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= -cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= -cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= -cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= -cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= -cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= -cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= -cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= -cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= -cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= -cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= -cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= -cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= -cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= -cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= -cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= -cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= -cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= -cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= -cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= -cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= -cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= -cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= -cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= -cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= -cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= -cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= -cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= -cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= -cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= -cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= -cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= -cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= -cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= -cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= -cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= -cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= -cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= -cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= -cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= -cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= -cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= -cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= -cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= -cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= -cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= -cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= -cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= -cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= -cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= -cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= -cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= -cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= -cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= -cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= -cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= -cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= -cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= -cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= -cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= -cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= -cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= -cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= -cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= -cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= -cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= -cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= -cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= -cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= -cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= -cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= -cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= -cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= -cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= -cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= -cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= -cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= -cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= -cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= -cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= -cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= -cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= -cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= -cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= -cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= -cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= -cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= -cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= -cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= -cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= -cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= -cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= -cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= -cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= -cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= -cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= -cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= -cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= -cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= -cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= -cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= -cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= -cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= -cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= -cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= -cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= -cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= -cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= -cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= -cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= -cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= -cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= -cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= -cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= -cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= -cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= -cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= -cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= -cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= -cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= -cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= -cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= -cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= -cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= -cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= -cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= -cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= -cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= -cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= -cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= -cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= -cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= -cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= -cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= -cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= -cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= -cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/iam v1.1.8 h1:r7umDwhj+BQyz0ScZMp4QrGXjSTI3ZINnpgU2nlB/K0= -cloud.google.com/go/iam v1.1.8/go.mod h1:GvE6lyMmfxXauzNq8NbgJbeVQNspG+tcdL/W8QO1+zE= -cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= -cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= -cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= -cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= -cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= -cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= -cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= -cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= -cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= -cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= -cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= -cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= -cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= -cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= -cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= -cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= -cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= -cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= -cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= -cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= -cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= -cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= -cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= -cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= -cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= -cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= -cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= -cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= -cloud.google.com/go/logging v1.10.0 h1:f+ZXMqyrSJ5vZ5pE/zr0xC8y/M9BLNzQeLBwfeZ+wY4= -cloud.google.com/go/logging v1.10.0/go.mod h1:EHOwcxlltJrYGqMGfghSet736KR3hX1MAj614mrMk9I= -cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= -cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= -cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= -cloud.google.com/go/longrunning v0.5.7 h1:WLbHekDbjK1fVFD3ibpFFVoyizlLRl73I7YKuAKilhU= -cloud.google.com/go/longrunning v0.5.7/go.mod h1:8GClkudohy1Fxm3owmBGid8W0pSgodEMwEAztp38Xng= -cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= -cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= -cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= -cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= -cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= -cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= -cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= -cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= -cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= -cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= -cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= -cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= -cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= -cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= -cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= -cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= -cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= -cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= -cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= -cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= -cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= -cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= -cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= -cloud.google.com/go/monitoring v1.19.0 h1:NCXf8hfQi+Kmr56QJezXRZ6GPb80ZI7El1XztyUuLQI= -cloud.google.com/go/monitoring v1.19.0/go.mod h1:25IeMR5cQ5BoZ8j1eogHE5VPJLlReQ7zFp5OiLgiGZw= -cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= -cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= -cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= -cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= -cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= -cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= -cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= -cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= -cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= -cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= -cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= -cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= -cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= -cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= -cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= -cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= -cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= -cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= -cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= -cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= -cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= -cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= -cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= -cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= -cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= -cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= -cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= -cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= -cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= -cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= -cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= -cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= -cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= -cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= -cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= -cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= -cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= -cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= -cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= -cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= -cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= -cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= -cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= -cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= -cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= -cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= -cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= -cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= -cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= -cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= -cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= -cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= -cloud.google.com/go/pubsub v1.38.0 h1:J1OT7h51ifATIedjqk/uBNPh+1hkvUaH4VKbz4UuAsc= -cloud.google.com/go/pubsub v1.38.0/go.mod h1:IPMJSWSus/cu57UyR01Jqa/bNOQA+XnPF6Z4dKW4fAA= -cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= -cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= -cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= -cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= -cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= -cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= -cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= -cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= -cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= -cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= -cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= -cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= -cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= -cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= -cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= -cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= -cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= -cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= -cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= -cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= -cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= -cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= -cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= -cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= -cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= -cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= -cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= -cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= -cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= -cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= -cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= -cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= -cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= -cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= -cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= -cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= -cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= -cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= -cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= -cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= -cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= -cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= -cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= -cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= -cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= -cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= -cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= -cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= -cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= -cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= -cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= -cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= -cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= -cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= -cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= -cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= -cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= -cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= -cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= -cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= -cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= -cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= -cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= -cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= -cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= -cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= -cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= -cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= -cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= -cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= -cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= -cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= -cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= -cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= -cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= -cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= -cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= -cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= -cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= -cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= -cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= -cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= -cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= -cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= -cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= -cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= -cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= -cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= -cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= -cloud.google.com/go/spanner v1.63.0 h1:P6+BY70Wtol4MtryBgnXZVTZfsdySEvWfz0EpyLwHi4= -cloud.google.com/go/spanner v1.63.0/go.mod h1:iqDx7urZpgD7RekZ+CFvBRH6kVTW1ZSEb2HMDKOp5Cc= -cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= -cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= -cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= -cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= -cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= -cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= -cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= -cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= -cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= -cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= -cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= -cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= -cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= -cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= -cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= -cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= -cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= -cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= -cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= -cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= -cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= -cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= -cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= -cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= -cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= -cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= -cloud.google.com/go/trace v1.10.7 h1:gK8z2BIJQ3KIYGddw9RJLne5Fx0FEXkrEQzPaeEYVvk= -cloud.google.com/go/trace v1.10.7/go.mod h1:qk3eiKmZX0ar2dzIJN/3QhY2PIFh1eqcIdaN5uEjQPM= -cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= -cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= -cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= -cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= -cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= -cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= -cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= -cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= -cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= -cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= -cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= -cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= -cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= -cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= -cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= -cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= -cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= -cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= -cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= -cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= -cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= -cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= -cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= -cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= -cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= -cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= -cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= -cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= -cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= -cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= -cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= -cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= -cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= -cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= -cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= -cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= -cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= -cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= -cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= -cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= -cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= -cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= -cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= -code.cloudfoundry.org/clock v0.0.0-20180518195852-02e53af36e6c h1:5eeuG0BHx1+DHeT3AP+ISKZ2ht1UjGhm581ljqYpVeQ= -code.cloudfoundry.org/clock v0.0.0-20180518195852-02e53af36e6c/go.mod h1:QD9Lzhd/ux6eNQVUDVRJX/RKTigpewimNYBi7ivZKY8= -code.cloudfoundry.org/go-diodes v0.0.0-20211115184647-b584dd5df32c h1:N2GMlHc/SJQk7BkaME/kDHaciVTy4NuRmxVJLhnqKK8= -code.cloudfoundry.org/go-diodes v0.0.0-20211115184647-b584dd5df32c/go.mod h1:o7lq/SmHshDVxHdRJ/fMT3VPcoXyE1HcRXbG8QibO3k= -code.cloudfoundry.org/go-loggregator v7.4.0+incompatible h1:KqZYloMQWM5Zg/BQKunOIA4OODh7djZbk48qqbowNFI= -code.cloudfoundry.org/go-loggregator v7.4.0+incompatible/go.mod h1:KPBTRqj+y738Nhf1+g4JHFaBU8j7dedirR5ETNHvMXU= -code.cloudfoundry.org/rfc5424 v0.0.0-20201103192249-000122071b78 h1:mrZQaZmuDIPhSp6b96b+CRKC2uH44ifa5cjDV2epKis= -code.cloudfoundry.org/rfc5424 v0.0.0-20201103192249-000122071b78/go.mod h1:tkZo8GtzBjySJ7USvxm4E36lNQw1D3xM6oKHGqdaAJ4= -dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= -dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= -filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= -git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= -github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= -github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= -github.com/99designs/keyring v1.1.6/go.mod h1:16e0ds7LGQQcT59QqkTg72Hh5ShM51Byv5PEmW6uoRU= -github.com/99designs/keyring v1.2.2 h1:pZd3neh/EmUzWONb35LxQfvuY7kiSXAq3HQd97+XBn0= -github.com/99designs/keyring v1.2.2/go.mod h1:wes/FrByc8j7lFOAGLGSNEg8f/PaI3cgTBqhFkHUrPk= -github.com/AthenZ/athenz v1.10.39 h1:mtwHTF/v62ewY2Z5KWhuZgVXftBej1/Tn80zx4DcawY= -github.com/AthenZ/athenz v1.10.39/go.mod h1:3Tg8HLsiQZp81BJY58JBeU2BR6B/H4/0MQGfCwhHNEA= -github.com/Azure/azure-amqp-common-go/v4 v4.2.0 h1:q/jLx1KJ8xeI8XGfkOWMN9XrXzAfVTkyvCxPvHCjd2I= -github.com/Azure/azure-amqp-common-go/v4 v4.2.0/go.mod h1:GD3m/WPPma+621UaU6KNjKEo5Hl09z86viKwQjTpV0Q= -github.com/Azure/azure-event-hubs-go/v3 v3.6.2 h1:7rNj1/iqS/i3mUKokA2n2eMYO72TB7lO7OmpbKoakKY= -github.com/Azure/azure-event-hubs-go/v3 v3.6.2/go.mod h1:n+ocYr9j2JCLYqUqz9eI+lx/TEAtL/g6rZzyTFSuIpc= -github.com/Azure/azure-kusto-go v0.15.2 h1:OlABJilic9TythSgWW6i8Fd0SgNTg0t9jBu6WVsaixM= -github.com/Azure/azure-kusto-go v0.15.2/go.mod h1:9F2zvXH8B6eWzgI1S4k1ZXAIufnBZ1bv1cW1kB1n3D0= -github.com/Azure/azure-pipeline-go v0.1.8/go.mod h1:XA1kFWRVhSK+KNFiOhfv83Fv8L9achrP7OxIzeTn1Yg= -github.com/Azure/azure-pipeline-go v0.2.3 h1:7U9HBg1JFK3jHl5qmo4CTZKFTVgMwdFHMVtCdfBE21U= -github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= -github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU= -github.com/Azure/azure-sdk-for-go v68.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqbjDYsgN+RzP4q16yV5eM= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2 h1:FDif4R1+UUR+00q6wquyX90K7A8dN+R5E8GEadoP7sU= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2/go.mod h1:aiYBYui4BJ/BJCAIKs92XiPyQfTaBWqvHujDwKb6CBU= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.6.0 h1:sUFnFjzDUie80h24I7mrKtwCKgLY9L8h5Tp2x9+TWqk= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.6.0/go.mod h1:52JbnQTp15qg5mRkMBHwp0j0ZFwHJ42Sx3zVV5RE9p0= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.5.0 h1:MxA59PGoCFb+vCwRQi3PhQEwHj4+r2dhuv9HG+vM7iM= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.5.0/go.mod h1:uYt4CfhkJA9o0FN7jfE5minm/i4nUE4MjGUJkzB6Zs8= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0 h1:PTFGRSlMKCQelWwxUyYVEUqseBJVemLyqWJjvMyt0do= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0/go.mod h1:LRr2FzBTQlONPPa5HREE5+RjSCTXl7BwOvYOaWTqCaI= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managementgroups/armmanagementgroups v1.0.0 h1:pPvTJ1dY0sA35JOeFq6TsY2xj6Z85Yo23Pj4wCCvu4o= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managementgroups/armmanagementgroups v1.0.0/go.mod h1:mLfWfj8v3jfWKsL9G4eoBoXVcsqcIUTapmdKy7uGOp0= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor v0.11.0 h1:Ds0KRF8ggpEGg4Vo42oX1cIt/IfOhHWJBikksZbVxeg= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor v0.11.0/go.mod h1:jj6P8ybImR+5topJ+eH6fgcemSFBmU6/6bFF8KkwuDI= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 h1:bXwSugBiSbgtz7rOtbfGf+woewp4f06orW9OP5BjHLA= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0/go.mod h1:Y/HgrePTmGy9HjdSGTqZNa+apUpTVIEVKXJyARP2lrk= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 h1:Dd+RhdJn0OTtVGaeDLZpcumkIVCtA/3/Fo42+eoYvVM= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0/go.mod h1:5kakwfW5CjC9KK+Q4wjXAg+ShuIm2mBMua0ZFj2C8PE= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.5.0 h1:AifHbc4mg0x9zW52WOpKbsHaDKuRhlI7TVl47thgQ70= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.5.0/go.mod h1:T5RfihdXtBDxt1Ch2wobif3TvzTdumDy29kahv6AV9A= -github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1 h1:MyVTgWR8qd/Jw1Le0NZebGBUCLbtak3bJ3z1OlqZBpw= -github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1/go.mod h1:GpPjLhVR9dnUoJMyHWSPy71xY9/lcmpzIPZXmF0FCVY= -github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0 h1:D3occbWoio4EBLkbkevetNMAVX197GkzbUMtqjGWn80= -github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0/go.mod h1:bTSOgj05NGRuHHhQwAdPnYr9TOdNmKlZTgGLL6nyAdI= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2 h1:YUUxeiOWgdAQE3pXt2H7QXzZs0q8UBjgRbl56qo8GYM= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2/go.mod h1:dmXQgZuiSubAecswZE+Sm8jkvEa7kQgTPVRvwL/nd0E= -github.com/Azure/azure-storage-queue-go v0.0.0-20230531184854-c06a8eff66fe h1:HGuouUM1533rBXmMtR7qh5pYNSSjUZG90b/MgJAnb/A= -github.com/Azure/azure-storage-queue-go v0.0.0-20230531184854-c06a8eff66fe/go.mod h1:K6am8mT+5iFXgingS9LUc7TmbsW6XBw3nxaRyaMyWc8= -github.com/Azure/go-amqp v1.0.5 h1:po5+ljlcNSU8xtapHTe8gIc8yHxCzC03E8afH2g1ftU= -github.com/Azure/go-amqp v1.0.5/go.mod h1:vZAogwdrkbyK3Mla8m/CxSc/aKdnTZ4IbPxl51Y5WZE= -github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= -github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= -github.com/Azure/go-autorest/autorest v0.11.29 h1:I4+HL/JDvErx2LjyzaVxllw2lRDB5/BT2Bm4g20iqYw= -github.com/Azure/go-autorest/autorest v0.11.29/go.mod h1:ZtEzC4Jy2JDrZLxvWs8LrBWEBycl1hbT1eknI8MtfAs= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.22/go.mod h1:XuAbAEUv2Tta//+voMI038TrJBqjKam0me7qR+L8Cmk= -github.com/Azure/go-autorest/autorest/adal v0.9.23 h1:Yepx8CvFxwNKpH6ja7RZ+sKX+DWYNldbLiALMC3BTz8= -github.com/Azure/go-autorest/autorest/adal v0.9.23/go.mod h1:5pcMqFkdPhviJdlEy3kC/v1ZLnQl0MH6XA5YCcMhy4c= -github.com/Azure/go-autorest/autorest/azure/auth v0.4.2 h1:iM6UAvjR97ZIeR93qTcwpKNMpV+/FTWjwEbuPD495Tk= -github.com/Azure/go-autorest/autorest/azure/auth v0.4.2/go.mod h1:90gmfKdlmKgfjUpnCEpOJzsUEjrWDSLwHIG73tSXddM= -github.com/Azure/go-autorest/autorest/azure/cli v0.3.1 h1:LXl088ZQlP0SBppGFsRZonW6hSvwgL5gRByMbvUbx8U= -github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9mNJVoIoLgXcirM2gF5i2kWloofxw= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw= -github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU= -github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.3.1 h1:AgyqjAd94fwNAoTjl/WQXg4VvFeRFpO+UhNyRXqF1ac= -github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/ClickHouse/ch-go v0.61.5 h1:zwR8QbYI0tsMiEcze/uIMK+Tz1D3XZXLdNrlaOpeEI4= -github.com/ClickHouse/ch-go v0.61.5/go.mod h1:s1LJW/F/LcFs5HJnuogFMta50kKDO0lf9zzfrbl0RQg= -github.com/ClickHouse/clickhouse-go/v2 v2.23.0 h1:srmRrkS0BR8gEut87u8jpcZ7geOob6nGj9ifrb+aKmg= -github.com/ClickHouse/clickhouse-go/v2 v2.23.0/go.mod h1:tBhdF3f3RdP7sS59+oBAtTyhWpy0024ZxDMhgxra0QE= -github.com/Code-Hex/go-generics-cache v1.3.1 h1:i8rLwyhoyhaerr7JpjtYjJZUcCbWOdiYO3fZXLiEC4g= -github.com/Code-Hex/go-generics-cache v1.3.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4= -github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= -github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= -github.com/DataDog/agent-payload/v5 v5.0.119 h1:PgeA41P3BE4z+b0j61B6yXnZDw7tB7bxl5EIHyGVG14= -github.com/DataDog/agent-payload/v5 v5.0.119/go.mod h1:FgVQKmVdqdmZTbxIptqJC/l+xEzdiXsaAOs/vGAvWzs= -github.com/DataDog/datadog-agent/cmd/agent/common/path v0.54.0-rc.5 h1:nLwtiYCoD+yb4HfhcJ3hmD9pczYLveOJexH5OHVQWsk= -github.com/DataDog/datadog-agent/cmd/agent/common/path v0.54.0-rc.5/go.mod h1:wJQkyIKR2epsYERgVRrO55fgda+oS5ZyBy2neJFXXGM= -github.com/DataDog/datadog-agent/comp/core/config v0.54.0-rc.5 h1:DKefO1N2aGtsUWRxyziQh3cHS3LuqdFjd+QmHR/qLNk= -github.com/DataDog/datadog-agent/comp/core/config v0.54.0-rc.5/go.mod h1:nDpszL8YD58OU/w2uFtN6oHv0cDDZrRNufYgBDtleVw= -github.com/DataDog/datadog-agent/comp/core/flare/types v0.54.0-rc.5 h1:GTYjjIV8YupcNqcNgcAnrNkbofcb6w7JFVdtfv9On9Q= -github.com/DataDog/datadog-agent/comp/core/flare/types v0.54.0-rc.5/go.mod h1:aChd0OV9bB534m+H4IPglCAs441s/1R+Tau5USeSM+Q= -github.com/DataDog/datadog-agent/comp/core/hostname/hostnameinterface v0.54.0-rc.5 h1:yz7efcj2vC0N0bcRwVItXXsFUl4JFgEzsqe3lDhdu7s= -github.com/DataDog/datadog-agent/comp/core/hostname/hostnameinterface v0.54.0-rc.5/go.mod h1:GhQb1d4Z4Z/E/WnUpmtSKADJSwziEIz0jwU0/MvNTic= -github.com/DataDog/datadog-agent/comp/core/log v0.54.0-rc.5 h1:2tvd3K+Bat8hT2jJBpIAfH/8J9k7v+s+IQcoyVVQitU= -github.com/DataDog/datadog-agent/comp/core/log v0.54.0-rc.5/go.mod h1:mtMxZiwg13b4bHgDf8xE6FHgTcadzI5Cc0lx2MSY1mE= -github.com/DataDog/datadog-agent/comp/core/secrets v0.54.0-rc.5 h1:hhkI7EtQwvhrKXO+oNo7V2ZhlSJ2Pt3uj9rOUeVrlSs= -github.com/DataDog/datadog-agent/comp/core/secrets v0.54.0-rc.5/go.mod h1:Bx0rH0jqLkDzQCBeDsgKGmcehYoQjuO6fE8aGjiQe2A= -github.com/DataDog/datadog-agent/comp/core/telemetry v0.54.0-rc.5 h1:v8WyP8srS/5EfD7OKZCm1aRPT56AXaQ2QqQRO2+fwUM= -github.com/DataDog/datadog-agent/comp/core/telemetry v0.54.0-rc.5/go.mod h1:ZpND0xZO2YVm7FNbPOrVoRMbPFhVRbZC40Vb5xsgyQc= -github.com/DataDog/datadog-agent/comp/def v0.54.0-rc.5 h1:pVYCT2SztEIcF03BdbrDgPfT7C/Pc2earv9YB4/2lU0= -github.com/DataDog/datadog-agent/comp/def v0.54.0-rc.5/go.mod h1:ts1c7j9tfa/BaoBH/gdQPt1LTeLeSh0b7IHMqm7ylDE= -github.com/DataDog/datadog-agent/comp/logs/agent/config v0.54.0-rc.5 h1:V4zdArRqhlZWT0tWj8mJE/pDRcAs4IkBC7Y5N+Gjr7U= -github.com/DataDog/datadog-agent/comp/logs/agent/config v0.54.0-rc.5/go.mod h1:88zmScug+KuG8EEuyaf3CAw5idi7XFMDTq66u6UPW4A= -github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline v0.54.0-rc.5 h1:FAZQ6viOK9CiU8x7aW2PJMlI4nq3bmNnOT642ASUxxc= -github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline v0.54.0-rc.5/go.mod h1:c+WZvnTktqP8inoph1/wvxvfLx9rV/cKoR/zvoEpu6E= -github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline/logsagentpipelineimpl v0.54.0-rc.5 h1:dtJiztozoBiltjE0382hAMtDeEfRnEov186xGZ4TGB0= -github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline/logsagentpipelineimpl v0.54.0-rc.5/go.mod h1:yMYGvbt3AAXiXoadUxEbxWl6C3/Ub2t8dn2UG7Y54SM= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/exporter/logsagentexporter v0.54.0-rc.5 h1:5HcA9XYLdI0Z81o5p7SppdVCYjKoshv9GBrqZfeLvC4= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/exporter/logsagentexporter v0.54.0-rc.5/go.mod h1:R2jDIkQpwYzy4AturN73oJB2X32jtivHW9TvdeN7BAQ= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/metricsclient v0.0.0-20240525065430-d0b647bcb646 h1:KeIeWDAjzQxL6/ruBQmFlT/FRstEz11z/UT3LH+8sAA= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/metricsclient v0.0.0-20240525065430-d0b647bcb646/go.mod h1:TIf/0Kb3DAYAtYbhhxmZ72etu+IKSqy66mcIGBuioik= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/statsprocessor v0.0.0-20240525065430-d0b647bcb646 h1:dyGnQr1QVLhwLdKzCTMsDsnYYUOkOXU4JWT2HuS1LJ4= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/statsprocessor v0.0.0-20240525065430-d0b647bcb646/go.mod h1:m7gt1CfJ/8FgnidFPk2lENaxO9m0mOnWWJQylgJkMzw= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.54.0-rc.5 h1:GuGbndVAnhNa6JOtDsDEWXmZFJB0fp4iCnJ3OO1JSks= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.54.0-rc.5/go.mod h1:6ydg+CWz9UlcBkV4pptOdQXTLNc/8YkTqta6VJFGg1M= -github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.54.0-rc.5 h1:YEvetFgYjf3oZsliKn0ddrz1t4ZvOzzlvOxJ100szlI= -github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.54.0-rc.5/go.mod h1:Mpe5lBwTlmLsu1WwIx8uRbj+Bi8+9gW8rWDfXPRwQVQ= -github.com/DataDog/datadog-agent/pkg/config/env v0.54.0-rc.5 h1:D4e5j805YtqmdhSeCXax020Nht6arNUvuvX4AKDMfu8= -github.com/DataDog/datadog-agent/pkg/config/env v0.54.0-rc.5/go.mod h1:9FPuluS8k4LEpfvlz7KQ6iHmqyTVfvuKxhwZkEUeoI4= -github.com/DataDog/datadog-agent/pkg/config/logs v0.54.0-rc.5 h1:xJ6u0OftjMYixmaDlb5yba3T72kyo/rpI7iuOYiAgJE= -github.com/DataDog/datadog-agent/pkg/config/logs v0.54.0-rc.5/go.mod h1:uo77w0taiJfXk3RV4N71t3WmoHhu6wJ782YmGeV6Ynk= -github.com/DataDog/datadog-agent/pkg/config/model v0.54.0-rc.5 h1:6HhxZQzS2edPF9ZevjWtstu6y17lj4a4fsRiTJ3ObHI= -github.com/DataDog/datadog-agent/pkg/config/model v0.54.0-rc.5/go.mod h1:X6U3mq0dErErZUIQx3GMmrO0jdp7aGN656iSDUW8sfw= -github.com/DataDog/datadog-agent/pkg/config/setup v0.54.0-rc.5 h1:+kl+DEK320zyWZBoFzTofgwN0AzUKpJByf8KdJ7WpJQ= -github.com/DataDog/datadog-agent/pkg/config/setup v0.54.0-rc.5/go.mod h1:2qnUs+85QVGqdK4DOpEaox6MKbfKFo3v2MXl9W8zP9Y= -github.com/DataDog/datadog-agent/pkg/config/utils v0.54.0-rc.5 h1:FQmC8qbWoaH4GFzuSuGFtJCR3kleh6xBmQXISiE8/Ho= -github.com/DataDog/datadog-agent/pkg/config/utils v0.54.0-rc.5/go.mod h1:pWPWng1HBqWccXoYJXfmWgpr+pujCpe4XYtGbiH4IOU= -github.com/DataDog/datadog-agent/pkg/logs/auditor v0.54.0-rc.5 h1:dQIi1vw2MaBmrT0kQv0qE5csFecCzaoPGY8m8KTEiqA= -github.com/DataDog/datadog-agent/pkg/logs/auditor v0.54.0-rc.5/go.mod h1:7w1fYTvDKwfk2J08P3vKEieeULSFASfZ0IgCjEoIF2E= -github.com/DataDog/datadog-agent/pkg/logs/client v0.54.0-rc.5 h1:YMYTquLk0uzYxvyRR1ew1QBf5dMtz3b/uBuwQzVODs4= -github.com/DataDog/datadog-agent/pkg/logs/client v0.54.0-rc.5/go.mod h1:YZbEwh9sPrDqxj02BHUHN6ljR+wohaN5QkkTdNZBLxY= -github.com/DataDog/datadog-agent/pkg/logs/diagnostic v0.54.0-rc.5 h1:klt8iysuxBuycyDu6lE51oCcAzZLJpvA7HiAKyQv9GM= -github.com/DataDog/datadog-agent/pkg/logs/diagnostic v0.54.0-rc.5/go.mod h1:93tXt/40ar1666Kk83CDOsb35xhAhQiPSqEH24zZ164= -github.com/DataDog/datadog-agent/pkg/logs/message v0.54.0-rc.5 h1:tX7zHQ6bmLJTfcRTcGY+91VXCZPEY2/OxKlVg/P4Tec= -github.com/DataDog/datadog-agent/pkg/logs/message v0.54.0-rc.5/go.mod h1:SGUmU3Fz/AtmdJvfos5EokpT4CN9YVi50DbYYZX0q4w= -github.com/DataDog/datadog-agent/pkg/logs/metrics v0.54.0-rc.5 h1:tzzzy68wHmQLIrpbJbmo9ZYqm8pHTlWvjUYnQUMBsUU= -github.com/DataDog/datadog-agent/pkg/logs/metrics v0.54.0-rc.5/go.mod h1:vcMlIQfRoHkafZFAHtHrkmeCSQzGpXtE2iyLkaObnUk= -github.com/DataDog/datadog-agent/pkg/logs/pipeline v0.54.0-rc.5 h1:yJ3W4/CQwlEifXz1FDCehvoVvGwaH4LXuJ6A/TbRMdc= -github.com/DataDog/datadog-agent/pkg/logs/pipeline v0.54.0-rc.5/go.mod h1:WsysKMxzTLQHn75WAUwHHw/SyhGQr+m8fYE3iMYl2gA= -github.com/DataDog/datadog-agent/pkg/logs/processor v0.54.0-rc.5 h1:RqKUVfSHrw5D8nRMIhOaAKQThk7pHRbyDVo2CylYtAY= -github.com/DataDog/datadog-agent/pkg/logs/processor v0.54.0-rc.5/go.mod h1:LwAwQKHHSsOC0sspi58vpN2h4tFEI1ZNtU69OUVFBxc= -github.com/DataDog/datadog-agent/pkg/logs/sds v0.54.0-rc.5 h1:u8dgzzSluJx7WMk3J834CxCP7FCo+z0PU9d1vj7K1HU= -github.com/DataDog/datadog-agent/pkg/logs/sds v0.54.0-rc.5/go.mod h1:+octueIX19RzWrarAkKNIAtFTfETavn6Ku4s217EcSY= -github.com/DataDog/datadog-agent/pkg/logs/sender v0.54.0-rc.5 h1:n5UMZvF+5L3XekeS5bkR0adwcOsogIT9uEtq2vHMhtU= -github.com/DataDog/datadog-agent/pkg/logs/sender v0.54.0-rc.5/go.mod h1:dj51DKlSkf10tqsdfuE4NMZaD2PSzau3G8Le8UmXerA= -github.com/DataDog/datadog-agent/pkg/logs/sources v0.54.0-rc.5 h1:wpvvYERlZsBmdoVMIYFxd2XlvSjBh5en06WkKgWRYk4= -github.com/DataDog/datadog-agent/pkg/logs/sources v0.54.0-rc.5/go.mod h1:bBzxEwKqZRKlkizVUViWjGNkjjF58njl+YiZNLxD/ZI= -github.com/DataDog/datadog-agent/pkg/logs/status/statusinterface v0.54.0-rc.5 h1:KuPBZTbwVJqDMa9ATfg0YWpGl3CxgGJcJZzSmsGVNdI= -github.com/DataDog/datadog-agent/pkg/logs/status/statusinterface v0.54.0-rc.5/go.mod h1:xsyGZLKEr6dZaJlC9QWuyYVXqMnHRwZzn641O3bfB98= -github.com/DataDog/datadog-agent/pkg/logs/status/utils v0.54.0-rc.5 h1:GAai92l2sX1rOQqGzPzE0IGMzS442xTLrHF/EwTywnw= -github.com/DataDog/datadog-agent/pkg/logs/status/utils v0.54.0-rc.5/go.mod h1:TsFFZ6y2/brcnkXLZhfp0k2xrewdyqhXnjxVpkOWIvE= -github.com/DataDog/datadog-agent/pkg/logs/util/testutils v0.54.0-rc.5 h1:9mAiLISlZcol07wCndWd5ErjItibOClx+N2Oyo3lG+A= -github.com/DataDog/datadog-agent/pkg/logs/util/testutils v0.54.0-rc.5/go.mod h1:J5lpbKKJzxPE2i5dsBYJnxbHlFvzPkfxNlhh2p3s18s= -github.com/DataDog/datadog-agent/pkg/obfuscate v0.54.0-rc.5 h1:qZg/3r8lLIgwzpHkqNBdnDKCdHexSxjgkb6FbPBaMnY= -github.com/DataDog/datadog-agent/pkg/obfuscate v0.54.0-rc.5/go.mod h1:4/9D8y6pQo5a/Tg8GAQN8SaRIRWxxyl5QHzPRuu8D0k= -github.com/DataDog/datadog-agent/pkg/proto v0.54.0-rc.5 h1:0HdqgTFchLs6ElI9cVrfjsT/gOF8A7PiY/VI2JMDFJc= -github.com/DataDog/datadog-agent/pkg/proto v0.54.0-rc.5/go.mod h1:gHkSUTn6H6UEZQHY3XWBIGNjfI3Tdi0IxlrxIFBWDwU= -github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.54.0-rc.5 h1:wM6w1HtUOxrn/sgMW00jx+0p4rNzPv+NhPqmIpboyV0= -github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.54.0-rc.5/go.mod h1:3yFk56PJ57yS1GqI9HAsS4PSlAeGCC9RQA7jxKzYj6g= -github.com/DataDog/datadog-agent/pkg/status/health v0.54.0-rc.5 h1:WgoyD4RkoGI3JDy+79SyiPc0AJGyCO5c2toOfxWwW1E= -github.com/DataDog/datadog-agent/pkg/status/health v0.54.0-rc.5/go.mod h1:sNLVlyEtkYal/+kTj+mTp239DdwVuYBYOnpS90RKk5E= -github.com/DataDog/datadog-agent/pkg/telemetry v0.54.0-rc.5 h1:iXZEgoYil4VaadjDsK+GbCkY7rBQyjsnlNJwXr6BwCY= -github.com/DataDog/datadog-agent/pkg/telemetry v0.54.0-rc.5/go.mod h1:4GCwM87F7u9HzugAODVTwS05MFMKC+NoJu6E4Zd/8pY= -github.com/DataDog/datadog-agent/pkg/trace v0.54.0-rc.5 h1:il5yFFe5CubI+bSfHolKr0077dQw0R+U5B9/iwW8aBg= -github.com/DataDog/datadog-agent/pkg/trace v0.54.0-rc.5/go.mod h1:63uSQX6TVeJzl1cFbIp8MkXlF4kUMJs8iUfGhrSgUHY= -github.com/DataDog/datadog-agent/pkg/util/backoff v0.54.0-rc.5 h1:eq+OaYTZ0rzQt1SpC2Tl+szJjUTX2nOC4N0glSzuWQ0= -github.com/DataDog/datadog-agent/pkg/util/backoff v0.54.0-rc.5/go.mod h1:HcSwqoxWLfevi1vuDZuFeRHfSuHGakTN6/u42WbxQHE= -github.com/DataDog/datadog-agent/pkg/util/cgroups v0.54.0-rc.5 h1:z5NnMMxKxO+cExUt0QCCSF7E+wX8LdD3nuL9LlDpR3Y= -github.com/DataDog/datadog-agent/pkg/util/cgroups v0.54.0-rc.5/go.mod h1:40rjMMqmvglVjktjWVUIk3o5W2zAtek0JU4FCsf7bsM= -github.com/DataDog/datadog-agent/pkg/util/executable v0.54.0-rc.5 h1:kxGwRdBPbiEx9mplVMA/rdLKMWcaKJMqO1pIyg56sLk= -github.com/DataDog/datadog-agent/pkg/util/executable v0.54.0-rc.5/go.mod h1:hUJvBzOKfasYzSvlar10ZkrB8I1CR8PhtyGxmlMv/cU= -github.com/DataDog/datadog-agent/pkg/util/filesystem v0.54.0-rc.5 h1:2A1/eg6zwNlUOjdAgaSgXR8eFR0HYLyqpvqLjlxKEP4= -github.com/DataDog/datadog-agent/pkg/util/filesystem v0.54.0-rc.5/go.mod h1:DfBDL+EjOiLI+HYR2N5zw1an1q7oCJQT6lY4oTCZxZ4= -github.com/DataDog/datadog-agent/pkg/util/fxutil v0.54.0-rc.5 h1:Fv7vJj/7qoEIV+ppI257ncx8IVQkDrUyjKSyeE56oTs= -github.com/DataDog/datadog-agent/pkg/util/fxutil v0.54.0-rc.5/go.mod h1:xqWrlGtjVu2ZMoCW9e3R7f13/Qg0IQBzO5AX7J1dC9I= -github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.54.0-rc.5 h1:1buVvWK8DXUveIpZMDc7Rn59mCDWZkQ9OGHjQRKdcas= -github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.54.0-rc.5/go.mod h1:FqMWIncd1TJJdlUYyiQQGJHWe+ZDKAjJSSPlrUBvHHk= -github.com/DataDog/datadog-agent/pkg/util/http v0.54.0-rc.5 h1:81sBly4SXW5Bvt3DHiUuuLpQnEUjhgdVDK69bk0g+58= -github.com/DataDog/datadog-agent/pkg/util/http v0.54.0-rc.5/go.mod h1:hZRz30Xaqm+UiR/KjO6gAo1Qa7v+tsxVqqaWgUkBjxE= -github.com/DataDog/datadog-agent/pkg/util/log v0.54.0-rc.5 h1:BcA7+MK04/HRCFlX5Pn/sQzZu/gF4qA3DOF880Jy/oo= -github.com/DataDog/datadog-agent/pkg/util/log v0.54.0-rc.5/go.mod h1:MFVWM0DMaxEXhCnHLWnh6axtwubmKRn7C+w2xiL+atI= -github.com/DataDog/datadog-agent/pkg/util/optional v0.54.0-rc.5 h1:3+7PwCbvtkOf63fPOzzMGVxNzlaZofPAg6ExPKn72hc= -github.com/DataDog/datadog-agent/pkg/util/optional v0.54.0-rc.5/go.mod h1:wa1JIWnzo9EvOBwzDOeff8HeqgOq9JQANRb99/nKg3A= -github.com/DataDog/datadog-agent/pkg/util/pointer v0.54.0-rc.5 h1:3zfbAoA9HSCJ/RsR/kP2MzntIvoI4szoReu4j3gpJrY= -github.com/DataDog/datadog-agent/pkg/util/pointer v0.54.0-rc.5/go.mod h1:ahpEhdpkifOLy0/XLHas+SseEmMQnwMgV1CMVkSuXL0= -github.com/DataDog/datadog-agent/pkg/util/scrubber v0.54.0-rc.5 h1:Sob3M0CylnKxZ9FX8Ewjka5VRFYZUQLN2J0kyOGYnMM= -github.com/DataDog/datadog-agent/pkg/util/scrubber v0.54.0-rc.5/go.mod h1:8ASCNWHQtcmUedxL+WjbCPSIcGIM8LeVzil7JCzx0js= -github.com/DataDog/datadog-agent/pkg/util/startstop v0.54.0-rc.5 h1:wo+LiNCZ9RQNNuYzCavbgjARHO3OmcqpFw4Mo6J5R+s= -github.com/DataDog/datadog-agent/pkg/util/startstop v0.54.0-rc.5/go.mod h1:F9ysDtw4BnbZIuKdwOdiHranjG9QMv2o7PMVreIhFzI= -github.com/DataDog/datadog-agent/pkg/util/statstracker v0.54.0-rc.5 h1:hU+Zvh4IL/HOEAjDzyIhYMQa4ibbX+dM4p5wWWpZ34U= -github.com/DataDog/datadog-agent/pkg/util/statstracker v0.54.0-rc.5/go.mod h1:KkiJi2f4mcxAJA00ArYw4zTfs0oWMU1bNXqKhymRVZg= -github.com/DataDog/datadog-agent/pkg/util/system v0.54.0-rc.5 h1:b7GZ1xAbkCtw5/hHwkRJoRiheAd9e+T2slJlD34lXbE= -github.com/DataDog/datadog-agent/pkg/util/system v0.54.0-rc.5/go.mod h1:gIg9d09X6uFqDFo7Dd48OCOCAtTLTWIE44+f/e35C3c= -github.com/DataDog/datadog-agent/pkg/util/system/socket v0.54.0-rc.5 h1:alEMYfYHYju+poG90phbdrpg4RYEyK/oFLAi8MM++HU= -github.com/DataDog/datadog-agent/pkg/util/system/socket v0.54.0-rc.5/go.mod h1:RKqan/bns7z9tqZBWSkshY1e6VisZJaU0b/XQcIDyAQ= -github.com/DataDog/datadog-agent/pkg/util/testutil v0.54.0-rc.5 h1:+nmZ4SFAHoskytj/q8+ewx7UtvbKGdDzcbPU0rhxIzU= -github.com/DataDog/datadog-agent/pkg/util/testutil v0.54.0-rc.5/go.mod h1:AyiUcueiQeqBXn60wbVOo3dPYRDNg0Gsfh/GkhatyxE= -github.com/DataDog/datadog-agent/pkg/util/winutil v0.54.0-rc.5 h1:0eWM/VJT1YPFf+nE5u0QdX1CiCiH2LWuvr4cCJ+nC3M= -github.com/DataDog/datadog-agent/pkg/util/winutil v0.54.0-rc.5/go.mod h1:m/wWejBoF6cuPzogMq2sgm86vvsnR1bAkw+Fgxq4vns= -github.com/DataDog/datadog-agent/pkg/version v0.54.0-rc.5 h1:aQEEvgBxk6Vk6ePMldw3fQUYTrl0AaYfUbrT1Ko6bjE= -github.com/DataDog/datadog-agent/pkg/version v0.54.0-rc.5/go.mod h1:EHeMJExE74SMdRoRCEuLOxbRgjfQwCVngMqFBiz1VN8= -github.com/DataDog/datadog-api-client-go/v2 v2.26.0 h1:bZr0hu+hx8L91+yU5EGw8wK3FlCVEIashpx+cylWsf0= -github.com/DataDog/datadog-api-client-go/v2 v2.26.0/go.mod h1:QKOu6vscsh87fMY1lHfLEmNSunyXImj8BUaUWJXOehc= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/DataDog/datadog-go/v5 v5.5.0 h1:G5KHeB8pWBNXT4Jtw0zAkhdxEAWSpWH00geHI6LDrKU= -github.com/DataDog/datadog-go/v5 v5.5.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= -github.com/DataDog/dd-sensitive-data-scanner/sds-go/go v0.0.0-20240419161837-f1b2f553edfe h1:efzxujZ7VHWFxjmWjcJyUEpPrN8qdiZPYb+dBw547Wo= -github.com/DataDog/dd-sensitive-data-scanner/sds-go/go v0.0.0-20240419161837-f1b2f553edfe/go.mod h1:TX7CTOQ3LbQjfAi4SwqUoR5gY1zfUk7VRBDTuArjaDc= -github.com/DataDog/go-sqllexer v0.0.9 h1:Cx2Cu1S0hfj4coCCA8hzjM9+UNFRkcu1avIV//RU5Qw= -github.com/DataDog/go-sqllexer v0.0.9/go.mod h1:nB4Ea2YNsqMwtbWMc4Fm/oP98IIrSPapqwOwPioMspY= -github.com/DataDog/go-tuf v1.1.0-0.5.2 h1:4CagiIekonLSfL8GMHRHcHudo1fQnxELS9g4tiAupQ4= -github.com/DataDog/go-tuf v1.1.0-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= -github.com/DataDog/gohai v0.0.0-20230524154621-4316413895ee h1:tXibLZk3G6HncIFJKaNItsdzcrk4YqILNDZlXPTNt4k= -github.com/DataDog/gohai v0.0.0-20230524154621-4316413895ee/go.mod h1:nTot/Iy0kW16bXgXr6blEc8gFeAS7vTqYlhAxh+dbc0= -github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata v0.16.1 h1:WD5hPS/KfDaYcWxa636972pQ8iOBN9MC/6Is5aSNZc8= -github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata v0.16.1/go.mod h1:P/l++2cDCeeq21KSmCEdXdMH9/WMdXP7uA/vjnxhtz8= -github.com/DataDog/opentelemetry-mapping-go/pkg/internal/sketchtest v0.16.0 h1:VJT1Jjlz/ca999FEqaAS+He7S4eB14a+PJjczgRdgAY= -github.com/DataDog/opentelemetry-mapping-go/pkg/internal/sketchtest v0.16.0/go.mod h1:66XlN7QpQKqIvw8e2UbCXV5X8wGnEw851nT9BjJ75dY= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.16.1 h1:ZI8u3CgdMXpDplrf9/gIr13+/g/tUzUcBMk2ZhXgzLE= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.16.1/go.mod h1:dvIWN9pA2zWNTw5rhDWZgzZnhcfpH++d+8d1SWW6xkY= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/logs v0.16.1 h1:px2+7svK86oeCGd+sT1x/9f0pqIJdApGFnWI0AOPXwA= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/logs v0.16.1/go.mod h1:+LijQ2LdlocAQ4WB+7KsoIGe90bfogkRslubd9swVow= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics v0.16.1 h1:Qm3M3A7/tkYG8JYeF9Mxp3oNEz23EQzvnV0MZR8mJKQ= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics v0.16.1/go.mod h1:HPwVoMccTFfyV94bE29ffwAYnsPykAH7Iso8/5ucLSs= -github.com/DataDog/opentelemetry-mapping-go/pkg/quantile v0.16.1 h1:sQoxh5RytdEFYFLGw3JUwFFhS/A1InFFVldpWAS/Z3g= -github.com/DataDog/opentelemetry-mapping-go/pkg/quantile v0.16.1/go.mod h1:6eYyd+lJYH+uRuZqhyW/u+9ykaXBWetDGj44+txz6jU= -github.com/DataDog/sketches-go v1.4.5 h1:ki7VfeNz7IcNafq7yI/j5U/YCkO3LJiMDtXz9OMQbyE= -github.com/DataDog/sketches-go v1.4.5/go.mod h1:7Y8GN8Jf66DLyDhc94zuWA3uHEt/7ttt8jHOBWWrSOg= -github.com/DataDog/viper v1.13.3 h1:0++798wZLEenL1JbF8dMmwFl6WMlAVxLtzVuws/LlVc= -github.com/DataDog/viper v1.13.3/go.mod h1:wDdUVJ2SHaMaPrCZrlRCObwkubsX8j5sme3LaR/SGTc= -github.com/DataDog/zstd v1.5.0/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= -github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/GehirnInc/crypt v0.0.0-20200316065508-bb7000b8a962 h1:KeNholpO2xKjgaaSyd+DyQRrsQjhbSeS7qe4nEw8aQw= -github.com/GehirnInc/crypt v0.0.0-20200316065508-bb7000b8a962/go.mod h1:kC29dT1vFpj7py2OvG1khBdQpo3kInWP+6QipLbdngo= -github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0 h1:oVLqHXhnYtUwM89y9T1fXGaK9wTkXHgNp8/ZNMQzUxE= -github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.23.0 h1:yRhWveg9NbJcJYoJL4FoSauT2dxnt4N9MIAJ7tvU/mQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.23.0/go.mod h1:p2puVVSKjQ84Qb1gzw2XHLs34WQyHTYFZLaVxypAFYs= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector v0.47.0 h1:riVd60yiSVM8oTZEnM/nscvZ2o4mcol45ZPv62zlu/M= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector v0.47.0/go.mod h1:LoJOu8+DY6cbxXF753iWmZ88nHEudiySwpQg//6mU/0= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector/googlemanagedprometheus v0.47.0 h1:qXG3UhUqfpjCbaFDTW03giIZa4PUMQ6nRoUDEDOhLWI= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector/googlemanagedprometheus v0.47.0/go.mod h1:VkkA3E9i8gTBNBIsAjypbvpwei4dSokmLdHsXLzwHOk= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.23.0 h1:5A4O4OdC7yzkIEPl4GrS+PRYV15zsboaWBT52g3Hc0k= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.23.0/go.mod h1:zO73rmlwRYxQF/6Nul4PA/UIAYJo9BtDAMgPfMthXnw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/extension/googleclientauthextension v0.47.0 h1:brqsR0YSucfnOCqzhhrcigJOcjpa0kcVDWuoxGZ9NYY= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/extension/googleclientauthextension v0.47.0/go.mod h1:uBZ1COkHkA29NwckOOEQVlYc5nP6QNH3KYFd3lAUeeo= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.47.0 h1:h3GAq9n95A6IYOGqAucbp+tGBxAQul2vj5ORkmRrGxg= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.47.0/go.mod h1:PdB0wkmILI+phhoBhWdrrB4LfORT9tHc03OOn+q3dWU= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.47.0 h1:TOjDcFzPkoglwb5sa6+704TXwYgs+XsN5HYc98ksK+M= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.47.0/go.mod h1:ZC7rjqRzdhRKDK223jQ7Tsz89ZtrSSLH/VFzf7k5Sb0= -github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= -github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/IBM/sarama v1.43.2 h1:HABeEqRUh32z8yzY2hGB/j8mHSzC/HA9zlEjqFNCzSw= -github.com/IBM/sarama v1.43.2/go.mod h1:Kyo4WkF24Z+1nz7xeVUFWIuKVV8RS3wM8mkvPKMdXFQ= -github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:RGWPOewvKIROun94nF7v2cua9qP+thov/7M50KEoeSU= -github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= -github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= -github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/Netflix/go-env v0.0.0-20220526054621-78278af1949d h1:wvStE9wLpws31NiWUx+38wny1msZ/tm+eL5xmm4Y7So= -github.com/Netflix/go-env v0.0.0-20220526054621-78278af1949d/go.mod h1:9XMFaCeRyW7fC9XJOWQ+NdAv8VLG7ys7l3x4ozEGLUQ= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/ReneKroon/ttlcache/v2 v2.11.0 h1:OvlcYFYi941SBN3v9dsDcC2N8vRxyHcCmJb3Vl4QMoM= -github.com/ReneKroon/ttlcache/v2 v2.11.0/go.mod h1:mBxvsNY+BT8qLLd6CuAJubbKo6r0jh3nb5et22bbfGY= -github.com/SAP/go-hdb v1.9.5 h1:rLp9rgs4n0Lvsxi3uTNiUpTM+KpA8tOgbQhcjksmdaA= -github.com/SAP/go-hdb v1.9.5/go.mod h1:eKGk33q3PZ41Lgua4lmqtKgIXpSEYs0teXePqMAcwBg= -github.com/SermoDigital/jose v0.9.2-0.20161205224733-f6df55f235c2/go.mod h1:ARgCUhI1MHQH+ONky/PAtmVHQrP5JlGY0F3poXOp/fA= -github.com/SermoDigital/jose v0.9.2-0.20180104203859-803625baeddc h1:MhBvG7RLaLqlyjxMR6of35vt6MVQ+eXMcgn9X/sy0FE= -github.com/SermoDigital/jose v0.9.2-0.20180104203859-803625baeddc/go.mod h1:ARgCUhI1MHQH+ONky/PAtmVHQrP5JlGY0F3poXOp/fA= -github.com/Showmax/go-fqdn v1.0.0 h1:0rG5IbmVliNT5O19Mfuvna9LL7zlHyRfsSvBPZmF9tM= -github.com/Showmax/go-fqdn v1.0.0/go.mod h1:SfrFBzmDCtCGrnHhoDjuvFnKsWjEQX/Q9ARZvOrJAko= -github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/aerospike/aerospike-client-go/v6 v6.13.0 h1:9V5qKtdF2t9hDUKRKU8POUMKtOyw6pkfhHlVI6L32cU= -github.com/aerospike/aerospike-client-go/v6 v6.13.0/go.mod h1:2Syy0n4FKdgJxn0ZCfLfggVdaTXgMaGW6EOlPV6MGG4= -github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= -github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= -github.com/alecthomas/assert/v2 v2.3.0 h1:mAsH2wmvjsuvyBvAmCtm7zFsBlb8mIHx5ySLVdDZXL0= -github.com/alecthomas/assert/v2 v2.3.0/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= -github.com/alecthomas/participle/v2 v2.1.1 h1:hrjKESvSqGHzRb4yW1ciisFJ4p3MGYih6icjJvbsmV8= -github.com/alecthomas/participle/v2 v2.1.1/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= -github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= -github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 h1:ez/4by2iGztzR4L0zgAOR8lTQK9VlyBVVd7G4omaOQs= -github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4 h1:iC9YFYKDGEy3n/FtqJnOkZsene9olVspKmkX5A2YBEo= -github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4/go.mod h1:sCavSAvdzOjul4cEqeVtvlSaSScfNsTQ+46HwlTL1hc= -github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.4 h1:7Q2FEyqxeZeIkwYMwRC3uphxV4i7O2eV4ETe21d6lS4= -github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.4/go.mod h1:5JHVmnHvGzR2wNdgaW1zDLQG8kOC4Uec8ubkMogW7OQ= -github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68 h1:NqugFkGxx1TXSh/pBcU00Y6bljgDPaFdh5MUSeJ7e50= -github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68/go.mod h1:6pb/Qy8c+lqua8cFpEy7g39NRRqOWc3rOwAy8m5Y2BY= -github.com/alibabacloud-go/endpoint-util v1.1.0 h1:r/4D3VSw888XGaeNpP994zDUaxdgTSHBbVfZlzf6b5Q= -github.com/alibabacloud-go/endpoint-util v1.1.0/go.mod h1:O5FuCALmCKs2Ff7JFJMudHs0I5EBgecXXxZRyswlEjE= -github.com/alibabacloud-go/openapi-util v0.1.0 h1:0z75cIULkDrdEhkLWgi9tnLe+KhAFE/r5Pb3312/eAY= -github.com/alibabacloud-go/openapi-util v0.1.0/go.mod h1:sQuElr4ywwFRlCCberQwKRFhRzIyG4QTP/P4y1CJ6Ws= -github.com/alibabacloud-go/sts-20150401/v2 v2.0.1 h1:CevZp0VdG7Q+1J3qwNj+JL7ztKxsL27+tknbdTK9Y6M= -github.com/alibabacloud-go/sts-20150401/v2 v2.0.1/go.mod h1:8wJW1xC4mVcdRXzOvWJYfCCxmvFzZ0VB9iilVjBeWBc= -github.com/alibabacloud-go/tea v1.1.19 h1:Xroq0M+pr0mC834Djj3Fl4ZA8+GGoA0i7aWse1vmgf4= -github.com/alibabacloud-go/tea v1.1.19/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A= -github.com/alibabacloud-go/tea-utils v1.3.1 h1:iWQeRzRheqCMuiF3+XkfybB3kTgUXkXX+JMrqfLeB2I= -github.com/alibabacloud-go/tea-utils v1.3.1/go.mod h1:EI/o33aBfj3hETm4RLiAxF/ThQdSngxrpF8rKUDJjPE= -github.com/alibabacloud-go/tea-utils/v2 v2.0.1 h1:K6kwgo+UiYx+/kr6CO0PN5ACZDzE3nnn9d77215AkTs= -github.com/alibabacloud-go/tea-utils/v2 v2.0.1/go.mod h1:U5MTY10WwlquGPS34DOeomUGBB0gXbLueiq5Trwu0C4= -github.com/alibabacloud-go/tea-xml v1.1.2 h1:oLxa7JUXm2EDFzMg+7oRsYc+kutgCVwm+bZlhhmvW5M= -github.com/alibabacloud-go/tea-xml v1.1.2/go.mod h1:Rq08vgCcCAjHyRi/M7xlHKUykZCEtyBy9+DPF6GgEu8= -github.com/aliyun/aliyun-log-go-sdk v0.1.75 h1:asM0c8NViqoCx6ULqaldE4YnyRq42rU1eqP6/ditzSg= -github.com/aliyun/aliyun-log-go-sdk v0.1.75/go.mod h1:dcQd3FhFu8UI1H48L+YW49ATTWgzGqWz/S/7Bm07gpY= -github.com/aliyun/credentials-go v1.1.2 h1:qU1vwGIBb3UJ8BwunHDRFtAhS6jnQLnde/yk0+Ih2GY= -github.com/aliyun/credentials-go v1.1.2/go.mod h1:ozcZaMR5kLM7pwtCMEpVmQ242suV6qTJya2bDq4X1Tw= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= -github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= -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/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= -github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= -github.com/apache/arrow/go/v15 v15.0.0 h1:1zZACWf85oEZY5/kd9dsQS7i+2G5zVQcbKTHgslqHNA= -github.com/apache/arrow/go/v15 v15.0.0/go.mod h1:DGXsR3ajT524njufqf95822i+KTh+yea1jass9YXgjA= -github.com/apache/pulsar-client-go v0.8.1 h1:UZINLbH3I5YtNzqkju7g9vrl4CKrEgYSx2rbpvGufrE= -github.com/apache/pulsar-client-go v0.8.1/go.mod h1:yJNcvn/IurarFDxwmoZvb2Ieylg630ifxeO/iXpk27I= -github.com/apache/pulsar-client-go/oauth2 v0.0.0-20220120090717-25e59572242e h1:EqiJ0Xil8NmcXyupNqXV9oYDBeWntEIegxLahrTr8DY= -github.com/apache/pulsar-client-go/oauth2 v0.0.0-20220120090717-25e59572242e/go.mod h1:Xee4tgYLFpYcPMcTfBYWE1uKRzeciodGTSEDMzsR6i8= -github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= -github.com/apache/thrift v0.20.0 h1:631+KvYbsBZxmuJjYwhezVsrfc/TbqtZV4QcxOX1fOI= -github.com/apache/thrift v0.20.0/go.mod h1:hOk1BQqcp2OLzGsyVXdfMk7YFlMxK3aoEVhjD06QhB8= -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/ardielle/ardielle-go v1.5.2 h1:TilHTpHIQJ27R1Tl/iITBzMwiUGSlVfiVhwDNGM3Zj4= -github.com/ardielle/ardielle-go v1.5.2/go.mod h1:I4hy1n795cUhaVt/ojz83SNVCYIGsAFAONtv2Dr7HUI= -github.com/ardielle/ardielle-tools v1.5.4/go.mod h1:oZN+JRMnqGiIhrzkRN9l26Cej9dEx4jeNG6A+AdkShk= -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= -github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= -github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aws/aws-sdk-go v1.32.6/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.44.263/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= -github.com/aws/aws-sdk-go v1.53.11 h1:KcmduYvX15rRqt4ZU/7jKkmDxU/G87LJ9MUI0yQJh00= -github.com/aws/aws-sdk-go v1.53.11/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= -github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.27.0 h1:7bZWKoXhzI+mMR/HjdMx8ZCC5+6fY0lS5tr0bbgiLlo= -github.com/aws/aws-sdk-go-v2 v1.27.0/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 h1:x6xsQXGSmW6frevwDA+vi/wqhp1ct18mVXYN08/93to= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2/go.mod h1:lPprDr1e6cJdyYeGXnRaJoP4Md+cDBvi2eOj00BlGmg= -github.com/aws/aws-sdk-go-v2/config v1.18.25/go.mod h1:dZnYpD5wTW/dQF0rRNLVypB396zWCcPiBIvdvSWHEg4= -github.com/aws/aws-sdk-go-v2/config v1.27.16 h1:knpCuH7laFVGYTNd99Ns5t+8PuRjDn4HnnZK48csipM= -github.com/aws/aws-sdk-go-v2/config v1.27.16/go.mod h1:vutqgRhDUktwSge3hrC3nkuirzkJ4E/mLj5GvI0BQas= -github.com/aws/aws-sdk-go-v2/credentials v1.13.24/go.mod h1:jYPYi99wUOPIFi0rhiOvXeSEReVOzBqFNOX5bXYoG2o= -github.com/aws/aws-sdk-go-v2/credentials v1.17.16 h1:7d2QxY83uYl0l58ceyiSpxg9bSbStqBC6BeEeHEchwo= -github.com/aws/aws-sdk-go-v2/credentials v1.17.16/go.mod h1:Ae6li/6Yc6eMzysRL2BXlPYvnrLLBg3D11/AmOjw50k= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3/go.mod h1:4Q0UFP0YJf0NrsEuEYHpM9fTSEVnD16Z3uyEF7J9JGM= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3 h1:dQLK4TjtnlRGb0czOht2CevZ5l6RSyRWAnKeGd7VAFE= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3/go.mod h1:TL79f2P6+8Q7dTsILpiVST+AL9lkF6PPGI167Ny0Cjw= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.15 h1:7Zwtt/lP3KNRkeZre7soMELMGNoBrutx8nobg1jKWmo= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.15/go.mod h1:436h2adoHb57yd+8W+gYPrrA9U/R/SuAuOO42Ushzhw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33/go.mod h1:7i0PF1ME/2eUPFcjkVIwq+DOygHEoK92t5cDqNgYbIw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7 h1:lf/8VTF2cM+N4SLzaYJERKEWAXq8MOMpZfU6wEPWsPk= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7/go.mod h1:4SjkU7QiqK2M9oozyMzfZ/23LmUY+h3oFqhdeP5OMiI= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27/go.mod h1:UrHnn3QV/d0pBZ6QBAEQcqFLf8FAzLmoUfPVIueOvoM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7 h1:4OYVp0705xu8yjdyoWix0r9wPIRXnIzzOoUpQVHIJ/g= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7/go.mod h1:vd7ESTEvI76T2Na050gODNmNU7+OyKrIKroYTu4ABiI= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34/go.mod h1:Etz2dj6UHYuw+Xw830KfzCfWGMzqvUTCjUj5b76GVDc= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.7 h1:/FUtT3xsoHO3cfh+I/kCbcMCN98QZRsiFet/V8QkWSs= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.7/go.mod h1:MaCAgWpGooQoCWZnMur97rGn5dp350w2+CeiV5406wE= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2/go.mod h1:5CsjAbs3NlGQyZNFACh+zztPDI7fU6eW9QsxjfnuBKg= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.9 h1:UXqEWQI0n+q0QixzU0yUUQBZXRd5037qdInTIHFTl98= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.9/go.mod h1:xP6Gq6fzGZT8w/ZN+XvGMZ2RU1LeEs7b2yUP5DN8NY4= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27/go.mod h1:EOwBD4J4S5qYszS5/3DpkejfuK+Z5/1uzICfPaZLtqw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9 h1:Wx0rlZoEJR7JwlSZcHnEa7CNjrSIyVxMFWGAaXy4fJY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9/go.mod h1:aVMHdE0aHO3v+f/iw01fmXV/5DbfQ3Bi9nN7nd9bE9Y= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.7 h1:uO5XR6QGBcmPyo2gxofYJLFkcVQ4izOoGDNenlZhTEk= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.7/go.mod h1:feeeAYfAcwTReM6vbwjEyDmiGho+YgBhaFULuXDW8kc= -github.com/aws/aws-sdk-go-v2/service/kinesis v1.27.8 h1:U1X1JiulWfr3lyIpdx0YCVANbF2UoMVhfv3DiDKBKwc= -github.com/aws/aws-sdk-go-v2/service/kinesis v1.27.8/go.mod h1:YxRRhvHMl4YR2OZR3369QQUc2iLqTc3KUCv9ayD8758= -github.com/aws/aws-sdk-go-v2/service/s3 v1.54.3 h1:57NtjG+WLims0TxIQbjTqebZUKDM03DfM11ANAekW0s= -github.com/aws/aws-sdk-go-v2/service/s3 v1.54.3/go.mod h1:739CllldowZiPPsDFcJHNF4FXrVxaSGVnZ9Ez9Iz9hc= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.29.1 h1:NSWsFzdHN41mJ5I/DOFzxgkKSYNHQADHn7Mu+lU/AKw= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.29.1/go.mod h1:5mMk0DgUgaHlcqtN65fNyZI0ZDX3i9Cw+nwq75HKB3U= -github.com/aws/aws-sdk-go-v2/service/servicediscovery v1.29.10 h1:MNECBvcQiQxwBsVwZKShXRc1mrYawtj39jIxPXWeAQY= -github.com/aws/aws-sdk-go-v2/service/servicediscovery v1.29.10/go.mod h1:/tT3hQYAj8aGFmy4hYqeR8I5R1uFVaIlHwj6jNU+ohs= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.10/go.mod h1:ouy2P4z6sJN70fR3ka3wD3Ro3KezSxU6eKGQI2+2fjI= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.9 h1:aD7AGQhvPuAxlSUfo0CWU7s6FpkbyykMhGYMvlqTjVs= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.9/go.mod h1:c1qtZUWtygI6ZdvKppzCSXsDOq5I4luJPZ0Ud3juFCA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.10/go.mod h1:AFvkxc8xfBe8XA+5St5XIHHrQQtkxqrRincx4hmMHOk= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.3 h1:Pav5q3cA260Zqez42T9UhIlsd9QeypszRPwC9LdSSsQ= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.3/go.mod h1:9lmoVDVLz/yUZwLaQ676TK02fhCu4+PgRSmMaKR1ozk= -github.com/aws/aws-sdk-go-v2/service/sts v1.19.0/go.mod h1:BgQOMsg8av8jset59jelyPW7NoZcZXLVpDsXunGDrk8= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.10 h1:69tpbPED7jKPyzMcrwSvhWcJ9bPnZsZs18NT40JwM0g= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.10/go.mod h1:0Aqn1MnEuitqfsCNyKsdKLhDUOr4txD/g19EfiUqgws= -github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= -github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= -github.com/basgys/goxml2json v1.1.0 h1:4ln5i4rseYfXNd86lGEB+Vi652IsIXIvggKM/BhUKVw= -github.com/basgys/goxml2json v1.1.0/go.mod h1:wH7a5Np/Q4QoECFIU8zTQlZwZkrilY0itPfecMw41Dw= -github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 h1:6df1vn4bBlDDo4tARvBm7l6KA9iVMnE3NWizDeWSrps= -github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3/go.mod h1:CIWtjkly68+yqLPbvwwR/fjNJA/idrtULjZWh2v1ys0= -github.com/beefsack/go-rate v0.0.0-20220214233405-116f4ca011a0/go.mod h1:6YNgTHLutezwnBvyneBbwvB8C82y3dcoOj5EQJIdGXA= -github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= -github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -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-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= -github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/bmatcuk/doublestar/v4 v4.6.1 h1:FH9SifrbvJhnlQpztAx++wlkk70QBf0iBWDwNy7PA4I= -github.com/bmatcuk/doublestar/v4 v4.6.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/bmizerany/perks v0.0.0-20141205001514-d9a9656a3a4b/go.mod h1:ac9efd0D1fsDb3EJvhqgXRbFx7bs2wqZ10HQPeU8U/Q= -github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/briandowns/spinner v1.23.0 h1:alDF2guRWqa/FOZZYWjlMIx2L6H0wyewPxo/CH4Pt2A= -github.com/briandowns/spinner v1.23.0/go.mod h1:rPG4gmXeN3wQV/TsAY4w8lPdIM6RX3yqeBQJSrbXjuE= -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/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= -github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= -github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/checkpoint-restore/go-criu/v5 v5.3.0 h1:wpFFOoomK3389ue2lAb0Boag6XPht5QYpipxmSNL4d8= -github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cihub/seelog v0.0.0-20151216151435-d2c6e5aa9fbf/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= -github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= -github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= -github.com/cilium/ebpf v0.11.0 h1:V8gS/bTCCjX9uUnkUFUpPsksM8n1lXBAvHcpiFk1X2Y= -github.com/cilium/ebpf v0.11.0/go.mod h1:WE7CZAnqOL2RouJ4f1uyNhqr2P4CCvXFIqdRDUgWsVs= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/clbanning/mxj v1.8.4 h1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I= -github.com/clbanning/mxj/v2 v2.5.5 h1:oT81vUeEiQQ/DcHbzSytRngP6Ky9O+L+0Bw0zSJag9E= -github.com/clbanning/mxj/v2 v2.5.5/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 h1:F1EaeKL/ta07PY/k9Os/UFtwERei2/XzGemhpGnBKNg= -github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80= -github.com/cloudfoundry-incubator/uaago v0.0.0-20190307164349-8136b7bbe76e h1:DFYA2+zpeaTPEOizAJuaee2O7YX3UP5tOMjkeXL8iLo= -github.com/cloudfoundry-incubator/uaago v0.0.0-20190307164349-8136b7bbe76e/go.mod h1:8wJCVaTSjT8phXCkbZWAKIB9JU8BEVHbnSbLgkr8WfY= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50 h1:DBmgJDC9dTfkVyGgipamEh2BpGYxScCH1TOF1LL1cXc= -github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50/go.mod h1:5e1+Vvlzido69INQaVO6d87Qn543Xr6nooe9Kz7oBFM= -github.com/containerd/cgroups/v3 v3.0.3 h1:S5ByHZ/h9PMe5IOQoN7E+nMc2UcLEM/V48DGDJ9kip0= -github.com/containerd/cgroups/v3 v3.0.3/go.mod h1:8HBe7V3aWGLFPd/k03swSIsGjZhHI2WzJmticMgVuz0= -github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= -github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= -github.com/containerd/containerd v1.7.15 h1:afEHXdil9iAm03BmhjzKyXnnEBtjaLJefdU7DV0IFes= -github.com/containerd/containerd v1.7.15/go.mod h1:ISzRRTMF8EXNpJlTzyr2XMhN+j9K302C21/+cr3kUnY= -github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= -github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/containerd/ttrpc v1.2.2 h1:9vqZr0pxwOF5koz6N0N3kJ0zDHokrcPxIR/ZR2YFtOs= -github.com/containerd/ttrpc v1.2.2/go.mod h1:sIT6l32Ph/H9cvnJsfXM5drIVzTr5A2flTf1G5tYZak= -github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY= -github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-oidc/v3 v3.10.0 h1:tDnXHnLyiTVyT/2zLDGj09pFPkhND8Gl8lnTRhoEaJU= -github.com/coreos/go-oidc/v3 v3.10.0/go.mod h1:5j11xcw0D3+SGxn6Z/WFADsgcWVMyNAlSQupk0KK3ac= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= -github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= -github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= -github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= -github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= -github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= -github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= -github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE= -github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= -github.com/devigned/tab v0.1.1 h1:3mD6Kb1mUOYeLpJvTVSDwSg5ZsfSxfvxGRTxRsJsITA= -github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= -github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/digitalocean/godo v1.109.0 h1:4W97RJLJSUQ3veRZDNbp1Ol3Rbn6Lmt9bKGvfqYI5SU= -github.com/digitalocean/godo v1.109.0/go.mod h1:R6EmmWI8CT1+fCtjWY9UCB+L5uufuZH13wk3YhxycCs= -github.com/dimchansky/utfbom v1.1.0 h1:FcM3g+nofKgUteL8dm/UpdRXNC9KmADgTpLKsu0TRo4= -github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= -github.com/dimfeld/httptreemux v5.0.1+incompatible h1:Qj3gVcDNoOthBAqftuD596rm4wg/adLLz5xh5CmpiCA= -github.com/dimfeld/httptreemux v5.0.1+incompatible/go.mod h1:rbUlSV+CCpv/SuqUTP/8Bk2O3LyUV436/yaRGkhP6Z0= -github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= -github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docker/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= -github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= -github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= -github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= -github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= -github.com/dvsekhvalnov/jose2go v1.6.0 h1:Y9gnSnP4qEI0+/uQkHvFXeD2PLPJeXEL+ySMEA2EjTY= -github.com/dvsekhvalnov/jose2go v1.6.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= -github.com/eapache/go-resiliency v1.6.0 h1:CqGDTLtpwuWKn6Nj3uNUdflaq+/kIPsg0gfNzHton30= -github.com/eapache/go-resiliency v1.6.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= -github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 h1:Oy0F4ALJ04o5Qqpdz8XLIpNA3WM/iSIXqxtqo7UGVws= -github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= -github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/elastic/elastic-transport-go/v8 v8.5.0 h1:v5membAl7lvQgBTexPRDBO/RdnlQX+FM9fUVDyXxvH0= -github.com/elastic/elastic-transport-go/v8 v8.5.0/go.mod h1:YLHer5cj0csTzNFXoNQ8qhtGY1GTvSqPnKWKaqQE3Hk= -github.com/elastic/go-docappender/v2 v2.1.2 h1:zkEh+g/CxpJdQR6BqdcApa/A4oRQiiG3iFiIhNCoovs= -github.com/elastic/go-docappender/v2 v2.1.2/go.mod h1:oHi6MsHriWaG8W6T9iyJ/PkEo2+182HIzq+0RRAzzgA= -github.com/elastic/go-elasticsearch/v7 v7.17.10 h1:TCQ8i4PmIJuBunvBS6bwT2ybzVFxxUhhltAs3Gyu1yo= -github.com/elastic/go-elasticsearch/v7 v7.17.10/go.mod h1:OJ4wdbtDNk5g503kvlHLyErCgQwwzmDtaFC4XyOxXA4= -github.com/elastic/go-elasticsearch/v8 v8.13.1 h1:du5F8IzUUyCkzxyHdrO9AtopcG95I/qwi2WK8Kf1xlg= -github.com/elastic/go-elasticsearch/v8 v8.13.1/go.mod h1:DIn7HopJs4oZC/w0WoJR13uMUxtHeq92eI5bqv5CRfI= -github.com/elastic/go-structform v0.0.10 h1:oy08o/Ih2hHTkNcRY/1HhaYvIp5z6t8si8gnCJPDo1w= -github.com/elastic/go-structform v0.0.10/go.mod h1:CZWf9aIRYY5SuKSmOhtXScE5uQiLZNqAFnwKR4OrIM4= -github.com/elastic/go-sysinfo v1.7.1 h1:Wx4DSARcKLllpKT2TnFVdSUJOsybqMYCNQZq1/wO+s0= -github.com/elastic/go-sysinfo v1.7.1/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= -github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= -github.com/elastic/go-windows v1.0.1 h1:AlYZOldA+UJ0/2nBuqWdo90GFCgG9xuyw9SYzGUtJm0= -github.com/elastic/go-windows v1.0.1/go.mod h1:FoVvqWSun28vaDQPbj2Elfc0JahhPB7WQEGa3c814Ss= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= -github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= -github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= -github.com/envoyproxy/go-control-plane v0.12.0 h1:4X+VP1GHd1Mhj6IB5mMeGbLCleqxjletLK6K0rbxyZI= -github.com/envoyproxy/go-control-plane v0.12.0/go.mod h1:ZBTaoJ23lqITozF0M6G4/IragXCQKCnYbmlmtHvwRG0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= -github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= -github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= -github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= -github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= -github.com/euank/go-kmsg-parser v2.0.0+incompatible h1:cHD53+PLQuuQyLZeriD1V/esuG4MuU0Pjs5y6iknohY= -github.com/euank/go-kmsg-parser v2.0.0+incompatible/go.mod h1:MhmAMZ8V4CYH4ybgdRwPr2TU5ThnS43puaKEMpja1uw= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.8.0 h1:lRj6N9Nci7MvzrXuX6HFzU8XjmhPiXPlsKEy1u0KQro= -github.com/evanphx/json-patch/v5 v5.8.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= -github.com/expr-lang/expr v1.16.9 h1:WUAzmR0JNI9JCiF0/ewwHB1gmcGw5wW7nWt8gc6PpCI= -github.com/expr-lang/expr v1.16.9/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= -github.com/facebook/time v0.0.0-20240510113249-fa89cc575891 h1:x6T9k2Jw0IPzSdM2i4tVWmnJ3KJ1fEKwWJ++IzDvPDU= -github.com/facebook/time v0.0.0-20240510113249-fa89cc575891/go.mod h1:2UFAomOuD2vAK1x68czUtCVjAqmyWCEnAXOlmGqf+G0= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= -github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= -github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= -github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/frankban/quicktest v1.11.0/go.mod h1:K+q6oSqb0W0Ininfk863uOk1lMy69l/P6txr3mVT54s= -github.com/frankban/quicktest v1.11.2/go.mod h1:K+q6oSqb0W0Ininfk863uOk1lMy69l/P6txr3mVT54s= -github.com/frankban/quicktest v1.13.0/go.mod h1:qLE0fzW0VuyUAJgPU19zByoIr0HtCHN/r/VLSOOIySU= -github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= -github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= -github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= -github.com/getsentry/sentry-go v0.28.0 h1:7Rqx9M3ythTKy2J6uZLHmc8Sz9OGgIlseuO1iBX/s0M= -github.com/getsentry/sentry-go v0.28.0/go.mod h1:1fQZ+7l7eeJ3wYi82q5Hg8GqAPgefRq+FP/QhafYVgg= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= -github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-faster/city v1.0.1 h1:4WAxSZ3V2Ws4QRDrscLEDcibJY8uf41H6AhXDrNDcGw= -github.com/go-faster/city v1.0.1/go.mod h1:jKcUJId49qdW3L1qKHH/3wPeUstCVpVSXTM6vO3VcTw= -github.com/go-faster/errors v0.7.1 h1:MkJTnDoEdi9pDabt1dpWf7AA8/BaSYZqibYyhZ20AYg= -github.com/go-faster/errors v0.7.1/go.mod h1:5ySTjWFiphBs07IKuiL69nxdfd5+fzh1u7FPGZP2quo= -github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= -github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= -github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-jose/go-jose/v4 v4.0.1 h1:QVEPDE3OluqXBQZDcnNvQrInro2h0e4eqNbnZSWqS6U= -github.com/go-jose/go-jose/v4 v4.0.1/go.mod h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.13.0 h1:OoneCcHKHQ03LfBpoQCUfCluwd2Vt3ohz+kvbJneZAU= -github.com/go-kit/kit v0.13.0/go.mod h1:phqEHMMUbyrCFCTgH48JueqrM3md2HcAZ8N3XE4FKDg= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= -github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= -github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= -github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= -github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= -github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= -github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.22.9 h1:XX2DssF+mQKM2DHsbgZK74y/zj4mo9I99+89xUmuZCE= -github.com/go-openapi/swag v0.22.9/go.mod h1:3/OXnFfnMAwBD099SwYRk7GD3xOrr1iL7d/XNLXVVwE= -github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-resty/resty/v2 v2.12.0 h1:rsVL8P90LFvkUYq/V5BTVe203WfRIU4gvcf+yfzJzGA= -github.com/go-resty/resty/v2 v2.12.0/go.mod h1:o0yGPrkS3lOe1+eFajk6kBW8ScXzwU3hD69/gt2yB/0= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= -github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg= -github.com/go-test/deep v1.1.0/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg= -github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= -github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/gocql/gocql v1.6.0 h1:IdFdOTbnpbd0pDhl4REKQDM+Q0SzKXQ1Yh+YZZ8T/qU= -github.com/gocql/gocql v1.6.0/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8= -github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= -github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.6 h1:mkgN1ofwASrYnJ5W6U/BxG15eXXXjirgZc7CLqkcaro= -github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= -github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= -github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= -github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= -github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= -github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= -github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cadvisor v0.49.0 h1:1PYeiORXmcFYi609M4Qvq5IzcvcVaWgYxDt78uH8jYA= -github.com/google/cadvisor v0.49.0/go.mod h1:s6Fqwb2KiWG6leCegVhw4KW40tf9f7m+SF1aXiE8Wsk= -github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/flatbuffers v23.5.26+incompatible h1:M9dgRyhJemaM4Sw8+66GHBu8ioaQmyPLg1b8VwK5WJg= -github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= -github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= -github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7 h1:y3N7Bm7Y9/CtpiVkw/ZWj6lSlDF3F74SfKwfTCer72Q= -github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= -github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= -github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.12.4 h1:9gWcmF85Wvq4ryPFvGFaOgPIs1AQX0d0bcbGw4Z96qg= -github.com/googleapis/gax-go/v2 v2.12.4/go.mod h1:KYEYLorsnIGDi/rPC8b5TdlB9kbKoFubselGIoBMCwI= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gophercloud/gophercloud v1.8.0 h1:TM3Jawprb2NrdOnvcHhWJalmKmAmOGgfZElM/3oBYCk= -github.com/gophercloud/gophercloud v1.8.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= -github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= -github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= -github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= -github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= -github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI= -github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= -github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= -github.com/gosnmp/gosnmp v1.37.0 h1:/Tf8D3b9wrnNuf/SfbvO+44mPrjVphBhRtcGg22V07Y= -github.com/gosnmp/gosnmp v1.37.0/go.mod h1:GDH9vNqpsD7f2HvZhKs5dlqSEcAS6s6Qp099oZRCR+M= -github.com/grafana/loki/pkg/push v0.0.0-20240514112848-a1b1eeb09583 h1:dN3eF1S5fvVu2l9WoqYSvmNmPK8Uh2vjE4yUsBq80l4= -github.com/grafana/loki/pkg/push v0.0.0-20240514112848-a1b1eeb09583/go.mod h1:lJEF/Wh5MYlmBem6tOYAFObkLsuikfrEf8Iy9AdMPiQ= -github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= -github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grobie/gomemcache v0.0.0-20230213081705-239240bbc445 h1:FlKQKUYPZ5yDCN248M3R7x8yu2E3yEZ0H7aLomE4EoE= -github.com/grobie/gomemcache v0.0.0-20230213081705-239240bbc445/go.mod h1:L69/dBlPQlWkcnU76WgcppK5e4rrxzQdi6LhLnK/ytA= -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 v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= -github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.13.0/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= -github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= -github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= -github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= -github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.28.3 h1:IE06LST/knnCQ+cxcvzyXRF/DetkgGhJoaOFd4l9xkk= -github.com/hashicorp/consul/api v1.28.3/go.mod h1:7AGcUFu28HkgOKD/GmsIGIFzRTmN0L02AE9Thsr2OhU= -github.com/hashicorp/consul/proto-public v0.6.1 h1:+uzH3olCrksXYWAYHKqK782CtK9scfqH+Unlw3UHhCg= -github.com/hashicorp/consul/proto-public v0.6.1/go.mod h1:cXXbOg74KBNGajC+o8RlA502Esf0R9prcoJgiOX/2Tg= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU= -github.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo= -github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= -github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= -github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= -github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-retryablehttp v0.7.4 h1:ZQgVdpTdAL7WpMIwLzCfbalOcSUdkDZnpUv3/+BxzFA= -github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= -github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= -github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= -github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= -github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= -github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= -github.com/hashicorp/nomad/api v0.0.0-20240306004928-3e7191ccb702 h1:fI1LXuBaS1d9z1kmb++Og6YD8uMRwadXorCwE+xgOFA= -github.com/hashicorp/nomad/api v0.0.0-20240306004928-3e7191ccb702/go.mod h1:z71gkJdrkAt/Rl6C7Q79VE7AwJ5lUF+M+fzFTyIHYB0= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= -github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/hectane/go-acl v0.0.0-20190604041725-da78bae5fc95 h1:S4qyfL2sEm5Budr4KVMyEniCy+PbS55651I/a+Kn/NQ= -github.com/hectane/go-acl v0.0.0-20190604041725-da78bae5fc95/go.mod h1:QiyDdbZLaJ/mZP4Zwc9g2QsfaEA4o7XvvgZegSci5/E= -github.com/hetznercloud/hcloud-go/v2 v2.6.0 h1:RJOA2hHZ7rD1pScA4O1NF6qhkHyUdbbxjHgFNot8928= -github.com/hetznercloud/hcloud-go/v2 v2.6.0/go.mod h1:4J1cSE57+g0WS93IiHLV7ubTHItcp+awzeBp5bM9mfA= -github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= -github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= -github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= -github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/influxdata/influxdb-client-go/v2 v2.13.0 h1:ioBbLmR5NMbAjP4UVA5r9b5xGjpABD7j65pI8kFphDM= -github.com/influxdata/influxdb-client-go/v2 v2.13.0/go.mod h1:k+spCbt9hcvqvUiz0sr5D8LolXHqAAOfPw9v/RIRHl4= -github.com/influxdata/influxdb-observability/common v0.5.12 h1:4YwZ+vsodz6VfoiX+ZqVotmnyCa9vCCPksSBK/WLjBs= -github.com/influxdata/influxdb-observability/common v0.5.12/go.mod h1:u+CABnGO/F1IK51pDlZQroh4+igJNo695XrbLGDBhVc= -github.com/influxdata/influxdb-observability/influx2otel v0.5.12 h1:u0lNE3+63rILk4mtmCYsNyczH/1wEXnM+1aBzBe5akk= -github.com/influxdata/influxdb-observability/influx2otel v0.5.12/go.mod h1:bM407XIJYnrJYJ9Q3q2ytDSOyFhiYmGm0Sz1Qf48RPk= -github.com/influxdata/influxdb-observability/otel2influx v0.5.12 h1:t9gmVOOHbZyEAvIYSoO97Tde1KArVtiYdM0/0Dhmuio= -github.com/influxdata/influxdb-observability/otel2influx v0.5.12/go.mod h1:YGsb8xYfjHvcr2y0+Nj7kOHMTw7fWDbAA4g/qJKkvaU= -github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c h1:qSHzRbhzK8RdXOsAdfDgO49TtqC1oZ+acxPrkfTxcCs= -github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU= -github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/influxdata/line-protocol-corpus v0.0.0-20210519164801-ca6fa5da0184/go.mod h1:03nmhxzZ7Xk2pdG+lmMd7mHDfeVOYFyhOgwO61qWU98= -github.com/influxdata/line-protocol-corpus v0.0.0-20210922080147-aa28ccfb8937 h1:MHJNQ+p99hFATQm6ORoLmpUCF7ovjwEFshs/NHzAbig= -github.com/influxdata/line-protocol-corpus v0.0.0-20210922080147-aa28ccfb8937/go.mod h1:BKR9c0uHSmRgM/se9JhFHtTT7JTO67X23MtKMHtZcpo= -github.com/influxdata/line-protocol/v2 v2.0.0-20210312151457-c52fdecb625a/go.mod h1:6+9Xt5Sq1rWx+glMgxhcg2c0DUaehK+5TDcPZ76GypY= -github.com/influxdata/line-protocol/v2 v2.1.0/go.mod h1:QKw43hdUBg3GTk2iC3iyCxksNj7PX9aUSeYOYE/ceHY= -github.com/influxdata/line-protocol/v2 v2.2.1 h1:EAPkqJ9Km4uAxtMRgUubJyqAr6zgWM0dznKMLRauQRE= -github.com/influxdata/line-protocol/v2 v2.2.1/go.mod h1:DmB3Cnh+3oxmG6LOBIxce4oaL4CPj3OmMPgvauXh+tM= -github.com/ionos-cloud/sdk-go/v6 v6.1.11 h1:J/uRN4UWO3wCyGOeDdMKv8LWRzKu6UIkLEaes38Kzh8= -github.com/ionos-cloud/sdk-go/v6 v6.1.11/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= -github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= -github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.6.0 h1:SWJzexBzPL5jb0GEsrPMLIsi/3jOo7RHlzTjcAeDrPY= -github.com/jackc/pgx/v5 v5.6.0/go.mod h1:DNZ/vlrUnhWCoFGxHAG8U2ljioxukquj7utPDgtQdTw= -github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= -github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= -github.com/jaegertracing/jaeger v1.57.0 h1:3wDtUUPs6NRYH7+d+y8MilDkLHdpPrVlQ2wbcsA62bs= -github.com/jaegertracing/jaeger v1.57.0/go.mod h1:p/1fxIU9hKHl7qEhKC72p2ZYVhvvZvNB73y6V7YyuTs= -github.com/jarcoal/httpmock v1.3.1 h1:iUx3whfZWVf3jT01hQTO/Eo5sAYtB2/rqaUuOtpInww= -github.com/jarcoal/httpmock v1.3.1/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg= -github.com/jawher/mow.cli v1.0.4/go.mod h1:5hQj2V8g+qYmLUVWqu4Wuja1pI57M83EChYLVZ0sMKk= -github.com/jawher/mow.cli v1.2.0/go.mod h1:y+pcA3jBAdo/GIZx/0rFjw/K2bVEODP9rfZOfaiq8Ko= -github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= -github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= -github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= -github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= -github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= -github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= -github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= -github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= -github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8= -github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= -github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= -github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= -github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= -github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4= -github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= -github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -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/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA= -github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= -github.com/karrick/godirwalk v1.17.0 h1:b4kY7nqDdioR/6qnbHQyDvmA17u5G1cZ6J+CZXwSWoI= -github.com/karrick/godirwalk v1.17.0/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d/go.mod h1:JJNrCn9otv/2QP4D7SMJBgaleKpOf66PnW6F5WGNRIc= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= -github.com/klauspost/compress v1.10.8/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= -github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= -github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= -github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= -github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= -github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00= -github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leodido/go-syslog/v4 v4.1.0 h1:Wsl194qyWXr7V6DrGWC3xmxA9Ra6XgWO+toNt2fmCaI= -github.com/leodido/go-syslog/v4 v4.1.0/go.mod h1:eJ8rUfDN5OS6dOkCOBYlg2a+hbAg6pJa99QXXgMrd98= -github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b h1:11UHH39z1RhZ5dc4y4r/4koJo6IYFgTRMe/LlwRTEw0= -github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b/go.mod h1:WZxr2/6a/Ar9bMDc2rN/LJrE/hF6bXE4LPyDSIxwAfg= -github.com/leoluk/perflib_exporter v0.2.1 h1:/3/ut1k/jFt5p4ypjLZKDHDqlXAK6ERZPVWtwdI389I= -github.com/leoluk/perflib_exporter v0.2.1/go.mod h1:MinSWm88jguXFFrGsP56PtleUb4Qtm4tNRH/wXNXRTI= -github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2ttpEmkA4aQ3j4u9dStX2t4M8UM6qqNsG8= -github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is= -github.com/lestrrat-go/strftime v1.0.6 h1:CFGsDEt1pOpFNU+TJB0nhz9jl+K0hZSLE205AhTIGQQ= -github.com/lestrrat-go/strftime v1.0.6/go.mod h1:f7jQKgV5nnJpYgdEasS+/y7EsTb8ykN2z68n3TtcTaw= -github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= -github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lightstep/go-expohisto v1.0.0 h1:UPtTS1rGdtehbbAF7o/dhkWLTDI73UifG8LbfQI7cA4= -github.com/lightstep/go-expohisto v1.0.0/go.mod h1:xDXD0++Mu2FOaItXtdDfksfgxfV0z1TMPa+e/EUd0cs= -github.com/linkedin/goavro/v2 v2.9.8 h1:jN50elxBsGBDGVDEKqUlDuU1cFwJ11K/yrJCBMe/7Wg= -github.com/linkedin/goavro/v2 v2.9.8/go.mod h1:UgQUb2N/pmueQYH9bfqFioWxzYCZXSfF8Jw03O5sjqA= -github.com/linode/linodego v1.33.0 h1:cX2FYry7r6CA1ujBMsdqiM4VhvIQtnWsOuVblzfBhCw= -github.com/linode/linodego v1.33.0/go.mod h1:dSJJgIwqZCF5wnpuC6w5cyIbRtcexAm7uVvuJopGB40= -github.com/logicmonitor/lm-data-sdk-go v1.3.0 h1:Obrexk35IKupFQezngkesR/kMfHQdAEUR1zYbJrOrzg= -github.com/logicmonitor/lm-data-sdk-go v1.3.0/go.mod h1:nIHr4uOPfg6AM7mG1rewg3L4O3rfge34o7UYB7joBM4= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c h1:VtwQ41oftZwlMnOEbMWQtSEUgU64U4s+GHk7hZK+jtY= -github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE= -github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= -github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-ieproxy v0.0.1 h1:qiyop7gCflfhwCzGyeT0gro3sF9AIg9HU98JORTkqfI= -github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= -github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04nTH68g= -github.com/maxatome/go-testdeep v1.12.0/go.mod h1:lPZc/HAcJMP92l7yI6TRz1aZN5URwUBUAfUNvrclaNM= -github.com/microsoft/ApplicationInsights-Go v0.4.4 h1:G4+H9WNs6ygSCe6sUyxRc2U81TI5Es90b2t/MwX5KqY= -github.com/microsoft/ApplicationInsights-Go v0.4.4/go.mod h1:fKRUseBqkw6bDiXTs3ESTiU/4YTIHsQS4W3fP2ieF4U= -github.com/microsoft/go-mssqldb v1.7.1 h1:KU/g8aWeM3Hx7IMOFpiwYiUkU+9zeISb4+tx3ScVfsM= -github.com/microsoft/go-mssqldb v1.7.1/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.58 h1:ca2Hdkz+cDg/7eNF6V56jjzuZ4aCAE+DbVkILdQWG/4= -github.com/miekg/dns v1.1.58/go.mod h1:Ypv+3b/KadlvW9vJfXOTf300O4UqaHFzFCuHz+rPkBY= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible h1:aKW/4cBs+yK6gpqU3K/oIwk9Q/XICqd3zOX/UFuvqmk= -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= -github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= -github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/hashstructure v1.1.0 h1:P6P1hdjqAAknpY/M1CGipelZgp+4y9ja9kmUZPXP+H0= -github.com/mitchellh/hashstructure v1.1.0/go.mod h1:xUDAozZz0Wmdiufv0uyhnHkUTN6/6d8ulp4AwfLKrmA= -github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4= -github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c h1:cqn374mizHuIWj+OSJCajGr/phAmuMug9qIX3l9CflE= -github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= -github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= -github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= -github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= -github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= -github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= -github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= -github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= -github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= -github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/mongodb-forks/digest v1.1.0 h1:7eUdsR1BtqLv0mdNm4OXs6ddWvR4X2/OsLwdKksrOoc= -github.com/mongodb-forks/digest v1.1.0/go.mod h1:rb+EX8zotClD5Dj4NdgxnJXG9nwrlx3NWKJ8xttz1Dg= -github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/montanaflynn/stats v0.7.0 h1:r3y12KyNxj/Sb/iOE46ws+3mS1+MZca1wlHQFPsY/JU= -github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mostynb/go-grpc-compression v1.2.2 h1:XaDbnRvt2+1vgr0b/l0qh4mJAfIxE0bKXtz2Znl3GGI= -github.com/mostynb/go-grpc-compression v1.2.2/go.mod h1:GOCr2KBxXcblCuczg3YdLQlcin1/NfyDA348ckuCH6w= -github.com/mrunalp/fileutils v0.5.1 h1:F+S7ZlNKnrwHfSwdlgNSkKo67ReVf8o9fel6C3dkm/Q= -github.com/mrunalp/fileutils v0.5.1/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= -github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= -github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nginxinc/nginx-prometheus-exporter v0.11.0 h1:21xjnqNgxtni2jDgAQ90bl15uDnrTreO9sIlu1YsX/U= -github.com/nginxinc/nginx-prometheus-exporter v0.11.0/go.mod h1:GdyHnWAb8q8OW1Pssrrqbcqra0SH0Vn6UXICMmyWkw8= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= -github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= -github.com/oapi-codegen/runtime v1.0.0 h1:P4rqFX5fMFWqRzY9M/3YF9+aPSPPB06IzP2P7oOxrWo= -github.com/oapi-codegen/runtime v1.0.0/go.mod h1:LmCUMQuPB4M/nLXilQXhHw+BLZdDb18B34OO356yJ/A= -github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/oklog/ulid/v2 v2.1.0 h1:+9lhoxAP56we25tyYETBBY1YLA2SaoLvUFgrP2miPJU= -github.com/oklog/ulid/v2 v2.1.0/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.14.0 h1:vSmGj2Z5YPb9JwCWT6z6ihcUvDhuXLc3sJiqd3jMKAY= -github.com/onsi/ginkgo/v2 v2.14.0/go.mod h1:JkUdW7JkN0V6rFvsHcJ478egV3XH9NxpD27Hal/PhZw= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= -github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= -github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= -github.com/open-telemetry/opamp-go v0.14.0 h1:KoziIK+wsFojhUXNTkCSTnCPf0eCMqFAaccOs0HrWIY= -github.com/open-telemetry/opamp-go v0.14.0/go.mod h1:XOGCigljsLSTZ8FfLwvat0M1QDj3conIIgRa77BWrKs= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= -github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= -github.com/opencontainers/runc v1.1.12 h1:BOIssBaW1La0/qbNZHXOOa71dZfZEQOzW7dqQf3phss= -github.com/opencontainers/runc v1.1.12/go.mod h1:S+lQwSfncpBha7XTy/5lBwWgm5+y5Ma/O44Ekby9FK8= -github.com/opencontainers/runtime-spec v1.1.0-rc.3 h1:l04uafi6kxByhbxev7OWiuUv0LZxEsYUfDWZ6bztAuU= -github.com/opencontainers/runtime-spec v1.1.0-rc.3/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/selinux v1.10.0 h1:rAiKF8hTcgLI3w0DHm6i0ylVVcOrlgR1kK99DRLDhyU= -github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= -github.com/opensearch-project/opensearch-go/v2 v2.3.0 h1:nQIEMr+A92CkhHrZgUhcfsrZjibvB3APXf2a1VwCmMQ= -github.com/opensearch-project/opensearch-go/v2 v2.3.0/go.mod h1:8LDr9FCgUTVoT+5ESjc2+iaZuldqE+23Iq0r1XeNue8= -github.com/openshift/api v0.0.0-20180801171038-322a19404e37 h1:05irGU4HK4IauGGDbsk+ZHrm1wOzMLYjMlfaiqMrBYc= -github.com/openshift/api v0.0.0-20180801171038-322a19404e37/go.mod h1:dh9o4Fs58gpFXGSYfnVxGR9PnV53I8TW84pQaJDdGiY= -github.com/openshift/api v0.0.0-20210521075222-e273a339932a/go.mod h1:izBmoXbUu3z5kUa4FjZhvekTsyzIWiOoaIgJiZBBMQs= -github.com/openshift/build-machinery-go v0.0.0-20210423112049-9415d7ebd33e/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE= -github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142 h1:ZHRIMCFIJN1p9LsJt4HQ+akDrys4PrYnXzOWI5LK03I= -github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142/go.mod h1:fjS8r9mqDVsPb5td3NehsNOAWa4uiFkYEfVZioQ2gH0= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/openzipkin/zipkin-go v0.4.3 h1:9EGwpqkgnwdEIJ+Od7QVSEIH+ocmm5nPat0G7sjsSdg= -github.com/openzipkin/zipkin-go v0.4.3/go.mod h1:M9wCJZFWCo2RiY+o1eBCEMe0Dp2S5LDHcMZmk3RmK7c= -github.com/outcaste-io/ristretto v0.2.1 h1:KCItuNIGJZcursqHr3ghO7fc5ddZLEHspL9UR0cQM64= -github.com/outcaste-io/ristretto v0.2.1/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= -github.com/ovh/go-ovh v1.4.3 h1:Gs3V823zwTFpzgGLZNI6ILS4rmxZgJwJCz54Er9LwD0= -github.com/ovh/go-ovh v1.4.3/go.mod h1:AkPXVtgwB6xlKblMjRKJJmjRp+ogrE7fz2lVgcQY8SY= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= -github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= -github.com/paulmach/orb v0.11.1 h1:3koVegMC4X/WeiXYz9iswopaTwMem53NzTJuTF20JzU= -github.com/paulmach/orb v0.11.1/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU= -github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY= -github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= -github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= -github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= -github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= -github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM= -github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= -github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= -github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= -github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pkg/sftp v1.13.6 h1:JFZT4XbOU7l77xGSpOdW+pwIMqP044IyjXX6FGyEKFo= -github.com/pkg/sftp v1.13.6/go.mod h1:tz1ryNURKu77RL+GuCzmoJYxQczL3wLNNpPWagdg4Qk= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c h1:NRoLoZvkBTKvR5gQLgA3e0hqjkY9u1wm+iOL45VN/qI= -github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8cTqKc= -github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.31.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= -github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e h1:UmqAuY2OyDoog8+l5FybViJE5B2r+UxVGCUwFTsY5AA= -github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e/go.mod h1:+0ld+ozir7zWFcHA2vVpWAKxXakIioEjPPNOqH+J3ZA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/redis/go-redis/v9 v9.5.1 h1:H1X4D3yHPaYrkL5X06Wh6xNVM/pX0Ft4RV0vMGvLBh8= -github.com/redis/go-redis/v9 v9.5.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M= -github.com/relvacode/iso8601 v1.4.0 h1:GsInVSEJfkYuirYFxa80nMLbH2aydgZpIf52gYZXUJs= -github.com/relvacode/iso8601 v1.4.0/go.mod h1:FlNp+jz+TXpyRqgmM7tnzHHzBnz776kmAH2h3sZCn0I= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= -github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= -github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= -github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= -github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= -github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= -github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= -github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM= -github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.25 h1:/8rfZAdFfafRXOgz+ZpMZZWZ5pYggCY9t7e/BvjaBHM= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.25/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= -github.com/scalyr/dataset-go v0.18.0 h1:CTv7kk/FGdiicTWo3h1brFusHD1yjhVGINFamP8uukw= -github.com/scalyr/dataset-go v0.18.0/go.mod h1:4x0JK5X0UdhZ2TEO3kHu9pTELDRc3WsrBBwQfkOPZKc= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646 h1:RpforrEYXWkmGwJHIGnLZ3tTWStkjVVstwzNGqxX2Ds= -github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= -github.com/secure-systems-lab/go-securesystemslib v0.7.0 h1:OwvJ5jQf9LnIAS83waAjPbcMsODrTQUpJ02eNLUoxBg= -github.com/secure-systems-lab/go-securesystemslib v0.7.0/go.mod h1:/2gYnlnHVQ6xeGtfIqFy7Do03K4cdCY0A/GlJLDKLHI= -github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= -github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= -github.com/shirou/gopsutil/v3 v3.22.12/go.mod h1:Xd7P1kwZcp5VW52+9XsirIKd/BROzbb2wdX3Kqlz9uI= -github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= -github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= -github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= -github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= -github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= -github.com/shoenig/test v1.7.1 h1:UJcjSAI3aUKx52kfcfhblgyhZceouhvvs3OYdWgn+PY= -github.com/shoenig/test v1.7.1/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI= -github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= -github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/signalfx/com_signalfx_metrics_protobuf v0.0.3 h1:32k2QLgsKhcEs55q4REPKyIadvid5FPy2+VMgvbmKJ0= -github.com/signalfx/com_signalfx_metrics_protobuf v0.0.3/go.mod h1:gJrXWi7wSGXfiC7+VheQaz+ypdCt5SmZNL+BRxUe7y4= -github.com/signalfx/sapm-proto v0.14.0 h1:KWh3I5E4EkelB19aP1/54Ik8khSioC/RVRW/riOfRGg= -github.com/signalfx/sapm-proto v0.14.0/go.mod h1:Km6PskZh966cqNoUn3AmRyGRix5VfwnxVBvn2vjRC9U= -github.com/sijms/go-ora/v2 v2.8.19 h1:7LoKZatDYGi18mkpQTR/gQvG9yOdtc7hPAex96Bqisc= -github.com/sijms/go-ora/v2 v2.8.19/go.mod h1:EHxlY6x7y9HAsdfumurRfTd+v8NrEOTR3Xl4FWlH6xk= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/snowflakedb/gosnowflake v1.10.1-0.20240509141315-5570db2126fe h1:tyqmtuppkCBKehjrsrGgcO7xsNBEGWgIlgm9fq/4X4U= -github.com/snowflakedb/gosnowflake v1.10.1-0.20240509141315-5570db2126fe/go.mod h1:hvc58mU03qg78mSz5z17/qnzI56hOdYYK2txWbM0hN0= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/solarwindscloud/apm-proto v1.0.3 h1:fmPwWNrM5kduAqvmH8mCD0E9MASK8m/mtPmw0yXGOBs= -github.com/solarwindscloud/apm-proto v1.0.3/go.mod h1:PIMzXc8HpB0ryT4Oci4pUz8F0m1X7Q/hVXkQE4jGv6Y= -github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= -github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= -github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= -github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= -github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= -github.com/stormcat24/protodep v0.1.8 h1:FOycjjkjZiastf21aRoCjtoVdhsoBE8mZ0RvY6AHqFE= -github.com/stormcat24/protodep v0.1.8/go.mod h1:6OoSZD5GGomKfmH1LvfJxNIRvYhewFXH5+eNv8h4wOM= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= -github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/tedsuo/ifrit v0.0.0-20180802180643-bea94bb476cc/go.mod h1:eyZnKCc955uh98WQvzOm0dgAeLnf2O0Rz0LPoC5ze+0= -github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.931 h1:3kcyl2ZLEWH5pHlUfw1lNXbJ95WUJN1pzfYoOhAajZc= -github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.931/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= -github.com/testcontainers/testcontainers-go v0.31.0 h1:W0VwIhcEVhRflwL9as3dhY6jXjVCA27AkmbnZ+UTh3U= -github.com/testcontainers/testcontainers-go v0.31.0/go.mod h1:D2lAoA0zUFiSY+eAflqK5mcUx/A5hrrORaEQrd0SefI= -github.com/tg123/go-htpasswd v1.2.2 h1:tmNccDsQ+wYsoRfiONzIhDm5OkVHQzN3w4FOBAlN6BY= -github.com/tg123/go-htpasswd v1.2.2/go.mod h1:FcIrK0J+6zptgVwK1JDlqyajW/1B4PtuJ/FLWl7nx8A= -github.com/tidwall/gjson v1.10.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.14.2 h1:6BBkirS0rAHjumnjHF6qgy5d2YAJ1TLIaFE2lzfOLqo= -github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= -github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tidwall/tinylru v1.1.0 h1:XY6IUfzVTU9rpwdhKUF6nQdChgCdGjkMfLzbWyiau6I= -github.com/tidwall/tinylru v1.1.0/go.mod h1:3+bX+TJ2baOLMWTnlyNWHh4QMnFyARg2TLTQ6OFbzw8= -github.com/tidwall/wal v1.1.7 h1:emc1TRjIVsdKKSnpwGBAcsAGg0767SvUk8+ygx7Bb+4= -github.com/tidwall/wal v1.1.7/go.mod h1:r6lR1j27W9EPalgHiB7zLJDYu3mzW5BQP5KrzBpYY/E= -github.com/tilinna/clock v1.1.0 h1:6IQQQCo6KoBxVudv6gwtY8o4eDfhHo8ojA5dP0MfhSs= -github.com/tilinna/clock v1.1.0/go.mod h1:ZsP7BcY7sEEz7ktc0IVy8Us6boDrK8VradlKRUGfOao= -github.com/tinylib/msgp v1.1.9 h1:SHf3yoO2sGA0veCJeCBYLHuttAVFHGm2RHgNodW7wQU= -github.com/tinylib/msgp v1.1.9/go.mod h1:BCXGB54lDD8qUEPmiG0cQQUANC4IUQyB2ItS2UDlO/k= -github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= -github.com/tj/assert v0.0.3/go.mod h1:Ne6X72Q+TB1AteidzQncjw9PabbMp4PBMZ1k+vd1Pvk= -github.com/tjfoc/gmsm v1.3.2 h1:7JVkAn5bvUJ7HtU08iW6UiD+UTmJTIToHCfeFzkcCxM= -github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w= -github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU= -github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY= -github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY= -github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20200122045848-3419fae592fc/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ= -github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= -github.com/vincent-petithory/dataurl v1.0.0 h1:cXw+kPto8NLuJtlMsI152irrVw9fRDX8AbShPRpg2CI= -github.com/vincent-petithory/dataurl v1.0.0/go.mod h1:FHafX5vmDzyP+1CQATJn7WFKc9CvnvxyvZy6I1MrG/U= -github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852 h1:cPXZWzzG0NllBLdjWoD1nDfaqu98YMv+OneaKc8sPOA= -github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae h1:4hwBBUfQCFe3Cym0ZtKyq7L16eZUtYKs+BaHDN6mAns= -github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= -github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= -github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= -github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= -github.com/vmware/go-vmware-nsxt v0.0.0-20230223012718-d31b8a1ca05e h1:Vu41Q0Pv3yMdd+tcDW6QeEUIK2L+9ZrPrq8NAMrKSLc= -github.com/vmware/go-vmware-nsxt v0.0.0-20230223012718-d31b8a1ca05e/go.mod h1:aRq5pxwgdJpAuP97SCjX1+Db32z/b0dggQ07FDF+fqE= -github.com/vmware/govmomi v0.36.3 h1:1Ng3CBNQVbFjCQbKtfsewy5o3dFa+EoTjqeThVISUBc= -github.com/vmware/govmomi v0.36.3/go.mod h1:mtGWtM+YhTADHlCgJBiskSRPOZRsN9MSjPzaZLte/oQ= -github.com/vultr/govultr/v2 v2.17.2 h1:gej/rwr91Puc/tgh+j33p/BLR16UrIPnSr+AIwYWZQs= -github.com/vultr/govultr/v2 v2.17.2/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI= -github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= -github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= -github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= -github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= -github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= -github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= -github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yuin/gopher-lua v0.0.0-20220504180219-658193537a64 h1:5mLPGnFdSsevFRFc9q3yYbBkB6tsm4aCwwQV/j1JQAQ= -github.com/yuin/gopher-lua v0.0.0-20220504180219-658193537a64/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= -github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= -github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= -github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -github.com/zorkian/go-datadog-api v2.30.0+incompatible h1:R4ryGocppDqZZbnNc5EDR8xGWF/z/MxzWnqTUijDQes= -github.com/zorkian/go-datadog-api v2.30.0+incompatible/go.mod h1:PkXwHX9CUQa/FpB9ZwAD45N1uhCW4MT/Wj7m36PbKss= -go.einride.tech/aip v0.67.1 h1:d/4TW92OxXBngkSOwWS2CH5rez869KpKMaN44mdxkFI= -go.einride.tech/aip v0.67.1/go.mod h1:ZGX4/zKw8dcgzdLsrvpOOGxfxI2QSk12SlP7d6c0/XI= -go.elastic.co/apm/module/apmelasticsearch/v2 v2.6.0 h1:ukMcwyMaDXsS1dRK2qRYXT2AsfwaUy74TOOYCqkWJow= -go.elastic.co/apm/module/apmelasticsearch/v2 v2.6.0/go.mod h1:YpfiTTrqX5LB/CKBwX89oDCBAxuLJTFv40gcfxJyehM= -go.elastic.co/apm/module/apmhttp/v2 v2.6.0 h1:s8UeNFQmVBCNd4eoz7KDD9rEFhQC0HeUFXz3z9gpAmQ= -go.elastic.co/apm/module/apmhttp/v2 v2.6.0/go.mod h1:D0GLppLuI0Ddwvtl595GUxRgn6Z8L5KaDFVMv2H3GK0= -go.elastic.co/apm/module/apmzap/v2 v2.6.0 h1:R/iVORzGu3F9uM43iEVHD0nwiRo59O0bIXdayKsgayQ= -go.elastic.co/apm/module/apmzap/v2 v2.6.0/go.mod h1:B3i/8xRkqLgi6zNuV+Bp7Pt4cutaOObvrVSa7wUTAPw= -go.elastic.co/apm/v2 v2.6.0 h1:VieBMLQFtXua2YxpYxaSdYGnmmxhLT46gosI5yErJgY= -go.elastic.co/apm/v2 v2.6.0/go.mod h1:33rOXgtHwbgZcDgi6I/GtCSMZQqgxkHC0IQT3gudKvo= -go.elastic.co/fastjson v1.3.0 h1:hJO3OsYIhiqiT4Fgu0ZxAECnKASbwgiS+LMW5oCopKs= -go.elastic.co/fastjson v1.3.0/go.mod h1:K9vDh7O0ODsVKV2B5e2XYLY277QZaCbB3tS1SnARvko= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.10 h1:+BqfJTcCzTItrop8mq/lbzL8wSGtj94UO/3U31shqG0= -go.etcd.io/bbolt v1.3.10/go.mod h1:bK3UQLPJZly7IlNmV7uVHJDxfe5aK9Ll93e/74Y9oEQ= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.mongodb.org/atlas v0.36.0 h1:m05S3AO7zkl+bcG1qaNsEKBnAqnKx2FDwLooHpIG3j4= -go.mongodb.org/atlas v0.36.0/go.mod h1:nfPldE9dSama6G2IbIzmEza02Ly7yFZjMMVscaM0uEc= -go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= -go.mongodb.org/mongo-driver v1.15.0 h1:rJCKC8eEliewXjZGf0ddURtl7tTVy1TK3bfl0gkUSLc= -go.mongodb.org/mongo-driver v1.15.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/configgrpc v0.102.0 h1:cQi5HwpkHvrZJUxZjoGXkWpAuK+gEyp/1Zjn0BrkvmQ= -go.opentelemetry.io/collector/config/configgrpc v0.102.0/go.mod h1:ASpBXzDWLiDGlG8iRFovU5R4LhAefoC4ajm+qIdslOw= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/confignet v0.102.0 h1:+wQevJ/iBnPxL+roY7WWnAjMxB8v4M5QrS3+0iEmauw= -go.opentelemetry.io/collector/config/confignet v0.102.0/go.mod h1:pfOrCTfSZEB6H2rKtx41/3RN4dKs+X2EKQbw3MGRh0E= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0 h1:8Ne/oL6M4kMWK0P3FKV9EduQa+1UOGyVAnFHfSo4c1A= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0/go.mod h1:Xj4Ld/RriP/Bj+5oPpaYJsLNs2wWRDN2TvzX3Lbi6+M= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0 h1:o1iKqN+oM+TZqHoGdnKw1Am2BQlIGCYbxCRzU8T3jbM= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0/go.mod h1:JpCemLtL/sXQ2Rk3Bx7OPPA7Qt/9NVH91q0bR655gSo= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0 h1:SfASE6lxXjrmYj/UibcWdOiFWvRG0zt4hJgenloEhlY= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0/go.mod h1:+Ku0Fvdb5f6e9UkfqJXAV5FaUJVxxg6Ykfx7Js8y+V4= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0 h1:GwJQTXs7pYPUv/fVf+0nBgsJdlrTuY/PfwQ/TRA/sIk= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0/go.mod h1:PGE3DcRgqYWWC2cq2hYZoET1d3Q8JZyPNmgvqXPFWEU= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0 h1:zdYZLiHHtDf4Kk9WU7mW9dW6WAXtBF54I5jmTMRJtiw= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0/go.mod h1:yFsgUM0PbUJkPlbpJfOG6da+YiF0Z80tv7YcnL3qwv4= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0 h1:Y4H+GaCQl2URp9mEJMV5CYOhw+erONqNyvtFoKQfIoA= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0/go.mod h1:g1RjfVD0gHAf/mPOIs3zBoKBeuDsN+rc5x0lZtgA8tI= -go.opentelemetry.io/collector/connector v0.102.0 h1:IvAsVfYRxP0ajmKbUovF8qugkcUtHq6RuYNtjcMa63E= -go.opentelemetry.io/collector/connector v0.102.0/go.mod h1:f4M7wZ/9+XtgTE0fivBFH3WlwntaEd0qFFA0giFkdnY= -go.opentelemetry.io/collector/connector/forwardconnector v0.102.0 h1:g68oHc8sRQ34gIWkq4S/zYS3x0x4PCC3SpC3f3BsM0M= -go.opentelemetry.io/collector/connector/forwardconnector v0.102.0/go.mod h1:ZqgFEDwgdRvoDkA5wH3A/d4ox2KTk+UNKLAHLTvGmPI= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/exporter/debugexporter v0.102.0 h1:b8z8EHdb3Q4f1A/lr6zP9aVv+7HTsouV0XCR8zb+R4w= -go.opentelemetry.io/collector/exporter/debugexporter v0.102.0/go.mod h1:fuFR9OIDtNe/ZGUp1YwrO2t0jy1/AIi4P93e+OoMCWA= -go.opentelemetry.io/collector/exporter/nopexporter v0.102.0 h1:BI9DOcJBTs+g2Lgn7o0qG87SVXwmwgah/A5Ul24OHsA= -go.opentelemetry.io/collector/exporter/nopexporter v0.102.0/go.mod h1:QCTMgCyvmHVuqwVPYxnhM4JlKlErbBqM8XBWtWKwtqA= -go.opentelemetry.io/collector/exporter/otlpexporter v0.102.0 h1:Nz2ULE5JfDj/houoV+VYSXTWP3/54/kCXH26WjJUNjI= -go.opentelemetry.io/collector/exporter/otlpexporter v0.102.0/go.mod h1:jaMS+3T8lwFc0jEjbqqOC+ArTwpGzR5De8u/jPncyKM= -go.opentelemetry.io/collector/exporter/otlphttpexporter v0.102.0 h1:ayoDBhSkXPrHO/L9MQKhZA/OCDZaOMEfosm+KMw4LBA= -go.opentelemetry.io/collector/exporter/otlphttpexporter v0.102.0/go.mod h1:9SN1giFZMQD0cWqYaBbUIjTnAI7/pWfEBwLosfHwWuY= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/extension/ballastextension v0.102.0 h1:p4gIucFZlTbV4VJ0zxUi8bkQFHnBCimYCe+nZwuPoHk= -go.opentelemetry.io/collector/extension/ballastextension v0.102.0/go.mod h1:hymqiVdV2Fu40lrXk8jm3uQsIFiUu2Fb8ptSzl5Emzw= -go.opentelemetry.io/collector/extension/zpagesextension v0.102.0 h1:BPq98py8nwzaV7KAsxt4ZZAF9LiSRu7ZjHNGavFNyKo= -go.opentelemetry.io/collector/extension/zpagesextension v0.102.0/go.mod h1:P86HW3x3epDS5F4yP0gAvsZiw4xxP1OupTEx2o6UqjY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/filter v0.102.0 h1:2K4Q/l4b+tglMAQmxpscuCr/juyozyPx17Q6Dfm2FwU= -go.opentelemetry.io/collector/filter v0.102.0/go.mod h1:zDVjFCeeVct7hYwejzx+aRC1dbHaPsvv/Ob1SvCiQjE= -go.opentelemetry.io/collector/otelcol v0.102.0 h1:HuE+ok4iUjOrmYhQBSWpG5kBTVhcA24ljPL4pBERZ5E= -go.opentelemetry.io/collector/otelcol v0.102.0/go.mod h1:w8pCRu2nM/jAkLlEAS6ccKtJv5ylUQe6Ugl98zzTfyE= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/processor v0.102.0 h1:JsjTlpBRmoSYxcu3cAbKBchOmL6aNUxLa03ZkWIqZr8= -go.opentelemetry.io/collector/processor v0.102.0/go.mod h1:IaCSDcfy75uQTaOM+LgR1bMf/bUw2eFfzn20uvWYfLQ= -go.opentelemetry.io/collector/processor/batchprocessor v0.102.0 h1:lJSIMwip+Po5jOF/4dpx6c/3N45KJTr/UZoT086T4mI= -go.opentelemetry.io/collector/processor/batchprocessor v0.102.0/go.mod h1:e71Y6SnrCjD19dPjxWWi/kXa5tb0J8rC+9xl/72mLo4= -go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.102.0 h1:osoITPX0RITC8gJkyaNC6rqSKFl9wCeOqagjdNZUL70= -go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.102.0/go.mod h1:2OVM2IJOWVdxkOOt0WCyQSMv2T19OSKNIy1KCqHGXyY= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/receiver/nopreceiver v0.102.0 h1:k2ExzXMqMXvV4g6OORziPDd0rxnZqxThAQ7SPFI6P2E= -go.opentelemetry.io/collector/receiver/nopreceiver v0.102.0/go.mod h1:917QcjiKspazQBiuv3rS4Z7h0dkZEaKiZdJW4/VmpZc= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0 h1:eLc+AK0IQDDysrMt3SLwKaOFIjEwdO8ipwSck3+TUXE= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0/go.mod h1:p9yeFJktNrpwV9ATvaWeZwCMvVkVWnrfbJ4RHI/RS/I= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/collector/service v0.102.0 h1:B5nfyQZF7eB/y+yucl9G/7VsusbXixYXWingXn7VszM= -go.opentelemetry.io/collector/service v0.102.0/go.mod h1:c+0n0DfQeCjgrdplNHYwYbG/5aupTZVYU/50nMQraoc= -go.opentelemetry.io/contrib/config v0.7.0 h1:b1rK5tGTuhhPirJiMxOcyQfZs76j2VapY6ODn3b2Dbs= -go.opentelemetry.io/contrib/config v0.7.0/go.mod h1:8tdiFd8N5etOi3XzBmAoMxplEzI3TcL8dU5rM5/xcOQ= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 h1:vS1Ao/R55RNV4O7TA2Qopok8yN+X0LIP6RVWLFkprck= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0/go.mod h1:BMsdeOxN04K0L5FNUBfjFdvwWGNe/rkmSwH4Aelu/X0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/contrib/propagators/b3 v1.27.0 h1:IjgxbomVrV9za6bRi8fWCNXENs0co37SZedQilP2hm0= -go.opentelemetry.io/contrib/propagators/b3 v1.27.0/go.mod h1:Dv9obQz25lCisDvvs4dy28UPh974CxkahRDUPsY7y9E= -go.opentelemetry.io/contrib/zpages v0.52.0 h1:MPgkMy0Cp3O5EdfVXP0ss3ujhEibysTM4eszx7E7d+E= -go.opentelemetry.io/contrib/zpages v0.52.0/go.mod h1:fqG5AFdoYru3A3DnhibVuaaEfQV2WKxE7fYE1jgDRwk= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/bridge/opencensus v1.27.0 h1:ao9aGGHd+G4YfjBpGs6vbkvt5hoC67STlJA9fCnOAcs= -go.opentelemetry.io/otel/bridge/opencensus v1.27.0/go.mod h1:uRvWtAAXzyVOST0WMPX5JHGBaAvBws+2F8PcC5gMnTk= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 h1:bFgvUr3/O4PHj3VQcFEuYKvRZJX1SJDQ+11JXuSB3/w= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0/go.mod h1:xJntEd2KL6Qdg5lwp97HMLQDVeAhrYxmzFseAMDPQ8I= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 h1:CIHWikMsN3wO+wq1Tp5VGdVRTcON+DmOJSfDjXypKOc= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0/go.mod h1:TNupZ6cxqyFEpLXAZW7On+mLFL0/g0TE3unIYL91xWc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0 h1:/jlt1Y8gXWiHG9FBx6cJaIC5hYx5Fe64nC8w5Cylt/0= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0/go.mod h1:bmToOGOBZ4hA9ghphIc1PAf66VA8KOtsuy3+ScStG20= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 h1:/0YaXu3755A/cFbtXp+21lkXgI0QE5avTWA2HjU9/WE= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0/go.mod h1:m7SFxp0/7IxmJPLIY3JhOcU9CoFzDaCPL6xxQIxhA+o= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= -go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= -go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/dig v1.17.0 h1:5Chju+tUvcC+N7N6EV08BJz41UZuO3BmHcN4A287ZLI= -go.uber.org/dig v1.17.0/go.mod h1:rTxpf7l5I0eBTlE6/9RL+lDybC7WFwY2QH55ZSjy1mU= -go.uber.org/fx v1.18.2 h1:bUNI6oShr+OVFQeU8cDNbnN7VFsu+SsjHzUF51V/GAU= -go.uber.org/fx v1.18.2/go.mod h1:g0V1KMQ66zIRk8bLu3Ea5Jt2w/cHlOIp4wdRsgh0JaY= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= -go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= -go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.14.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= -go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= -golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= -golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= -golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= -golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190529164535-6a60838ec259/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -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-20191025021431-6c3a3bfe00ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/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= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -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-20190614205625-5aca471b1d59/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-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-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210112230658-8b4aab62c064/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= -golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= -gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= -gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= -gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= -gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= -google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= -google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= -google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= -google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= -google.golang.org/api v0.182.0 h1:if5fPvudRQ78GeRx3RayIoiuV7modtErPIZC/T2bIvE= -google.golang.org/api v0.182.0/go.mod h1:cGhjy4caqA5yXRzEhkHI8Y9mfyC2VLTlER2l08xaqtM= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= -google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= -google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= -google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= -google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/genproto v0.0.0-20240513163218-0867130af1f8 h1:XpH03M6PDRKTo1oGfZBXu2SzwcbfxUokgobVinuUZoU= -google.golang.org/genproto v0.0.0-20240513163218-0867130af1f8/go.mod h1:OLh2Ylz+WlYAJaSBRpJIJLP8iQP+8da+fpxbwNEAV/o= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 h1:P8OJ/WCl/Xo4E4zoe4/bifHpSmmKwARqyqE4nW6J2GQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240521202816-d264139d666e h1:Elxv5MwEkCI9f5SkoL6afed6NTdxaGoAo39eANBwHL8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240521202816-d264139d666e/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= -google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= -google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= -google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= -google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= -gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/zorkian/go-datadog-api.v2 v2.30.0 h1:umQdVO0Ytx+kYadhuJNjFtDgIsIEBnKrOTvNuu8ClKI= -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.2.0 h1:I0DwBVMGAx26dttAj1BtJLAkVGncrkkUXfJLC4Flt/I= -gotest.tools/v3 v3.2.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= -howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM= -howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= -k8s.io/api v0.21.1/go.mod h1:FstGROTmsSHBarKc8bylzXih8BLNYTiS3TZcsoEDg2s= -k8s.io/api v0.29.3 h1:2ORfZ7+bGC3YJqGpV0KSDDEVf8hdGQ6A03/50vj8pmw= -k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80= -k8s.io/apimachinery v0.21.1/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY= -k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= -k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= -k8s.io/client-go v0.21.1/go.mod h1:/kEw4RgW+3xnBGzvp9IWxKSNA+lXn3A7AuH3gdOAzLs= -k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg= -k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= -k8s.io/code-generator v0.21.1/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= -k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= -k8s.io/kubelet v0.29.3 h1:X9h0ZHzc+eUeNTaksbN0ItHyvGhQ7Z0HPjnQD2oHdwU= -k8s.io/kubelet v0.29.3/go.mod h1:jDiGuTkFOUynyBKzOoC1xRSWlgAZ9UPcTYeFyjr6vas= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0 h1:jgGTlFYnhF1PM1Ax/lAlxUPE+KfCIXHaathvJg1C3ak= -k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= -modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= -modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= -modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= -modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= -modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= -modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= -modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= -modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= -modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= -modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= -modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= -modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= -modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= -modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= -modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/controller-runtime v0.17.3 h1:65QmN7r3FWgTxDMz9fvGnO1kbf2nu+acg9p2R9oYYYk= -sigs.k8s.io/controller-runtime v0.17.3/go.mod h1:N0jpP5Lo7lMTF9aL56Z/B2oWBJjey6StQM0jRbKQXtY= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= -skywalking.apache.org/repo/goapi v0.0.0-20240104145220-ba7202308dd4 h1:3YIFmsshgsU6FzHgnkG9Z24CkXkgoexBN5O0aSzK79g= -skywalking.apache.org/repo/goapi v0.0.0-20240104145220-ba7202308dd4/go.mod h1:oD2dxcDAHVIt95Ee7kJHgZ5f64QNhrqTjQYARwfafc4= diff --git a/cmd/otelcontribcol/main.go b/cmd/otelcontribcol/main.go deleted file mode 100644 index 8325d09ed7b8..000000000000 --- a/cmd/otelcontribcol/main.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by "go.opentelemetry.io/collector/cmd/builder". DO NOT EDIT. - -// Program otelcontribcol is an OpenTelemetry Collector binary. -package main - -import ( - "log" - - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/confmap" - "go.opentelemetry.io/collector/confmap/converter/expandconverter" - envprovider "go.opentelemetry.io/collector/confmap/provider/envprovider" - fileprovider "go.opentelemetry.io/collector/confmap/provider/fileprovider" - httpprovider "go.opentelemetry.io/collector/confmap/provider/httpprovider" - httpsprovider "go.opentelemetry.io/collector/confmap/provider/httpsprovider" - yamlprovider "go.opentelemetry.io/collector/confmap/provider/yamlprovider" - "go.opentelemetry.io/collector/otelcol" - - s3provider "github.com/open-telemetry/opentelemetry-collector-contrib/confmap/provider/s3provider" - secretsmanagerprovider "github.com/open-telemetry/opentelemetry-collector-contrib/confmap/provider/secretsmanagerprovider" -) - -func main() { - info := component.BuildInfo{ - Command: "otelcontribcol", - Description: "Local OpenTelemetry Collector Contrib binary, testing only.", - Version: "0.102.0-dev", - } - - set := otelcol.CollectorSettings{ - BuildInfo: info, - Factories: components, - ConfigProviderSettings: otelcol.ConfigProviderSettings{ - ResolverSettings: confmap.ResolverSettings{ - ProviderFactories: []confmap.ProviderFactory{ - envprovider.NewFactory(), - fileprovider.NewFactory(), - httpprovider.NewFactory(), - httpsprovider.NewFactory(), - yamlprovider.NewFactory(), - s3provider.NewFactory(), - secretsmanagerprovider.NewFactory(), - }, - ConverterFactories: []confmap.ConverterFactory{ - expandconverter.NewFactory(), - }, - }, - }, - } - - if err := run(set); err != nil { - log.Fatal(err) - } -} - -func runInteractive(params otelcol.CollectorSettings) error { - cmd := otelcol.NewCommand(params) - if err := cmd.Execute(); err != nil { - log.Fatalf("collector server run finished with error: %v", err) - } - - return nil -} diff --git a/cmd/otelcontribcol/main_others.go b/cmd/otelcontribcol/main_others.go deleted file mode 100644 index 3735aecb5867..000000000000 --- a/cmd/otelcontribcol/main_others.go +++ /dev/null @@ -1,11 +0,0 @@ -// Code generated by "go.opentelemetry.io/collector/cmd/builder". DO NOT EDIT. - -//go:build !windows - -package main - -import "go.opentelemetry.io/collector/otelcol" - -func run(params otelcol.CollectorSettings) error { - return runInteractive(params) -} diff --git a/cmd/otelcontribcol/main_windows.go b/cmd/otelcontribcol/main_windows.go deleted file mode 100644 index bb68124a52c9..000000000000 --- a/cmd/otelcontribcol/main_windows.go +++ /dev/null @@ -1,30 +0,0 @@ -// Code generated by "go.opentelemetry.io/collector/cmd/builder". DO NOT EDIT. - -//go:build windows - -package main - -import ( - "errors" - "fmt" - - "go.opentelemetry.io/collector/otelcol" - "golang.org/x/sys/windows" - "golang.org/x/sys/windows/svc" -) - -func run(params otelcol.CollectorSettings) error { - // No need to supply service name when startup is invoked through - // the Service Control Manager directly. - if err := svc.Run("", otelcol.NewSvcHandler(params)); err != nil { - if errors.Is(err, windows.ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) { - // Per https://learn.microsoft.com/en-us/windows/win32/api/winsvc/nf-winsvc-startservicectrldispatchera#return-value - // this means that the process is not running as a service, so run interactively. - return runInteractive(params) - } - - return fmt.Errorf("failed to start collector server: %w", err) - } - - return nil -} diff --git a/cmd/otelcontribcol/metadata.yaml b/cmd/otelcontribcol/metadata.yaml index 0b1f42508bf8..8ae3a0e69a4b 100644 --- a/cmd/otelcontribcol/metadata.yaml +++ b/cmd/otelcontribcol/metadata.yaml @@ -3,4 +3,4 @@ type: otelcontribcol status: class: cmd codeowners: - active: [] \ No newline at end of file + active: [] diff --git a/cmd/otelcontribcol/receivers_test.go b/cmd/otelcontribcol/receivers_test.go deleted file mode 100644 index b2de7709530d..000000000000 --- a/cmd/otelcontribcol/receivers_test.go +++ /dev/null @@ -1,586 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "context" - "errors" - "path/filepath" - "runtime" - "testing" - - promconfig "github.com/prometheus/prometheus/config" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/consumer/consumertest" - "go.opentelemetry.io/collector/receiver" - "go.opentelemetry.io/collector/receiver/receivertest" - - tcpop "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/input/tcp" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awscloudwatchreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azureblobreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azureeventhubreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azuremonitorreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/carbonreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/chronyreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/datadogreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jmxreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mongodbatlasreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/namedpipereceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/otlpjsonfilereceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/redisreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/snmpreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/tcplogreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/udplogreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/webhookeventreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/windowseventlogreceiver" -) - -func TestDefaultReceivers(t *testing.T) { - allFactories, err := components() - assert.NoError(t, err) - - rcvrFactories := allFactories.Receivers - - tests := []struct { - getConfigFn getReceiverConfigFn - receiver component.Type - skipLifecycle bool - }{ - { - receiver: "active_directory_ds", - skipLifecycle: true, // Requires a running windows service - }, - { - receiver: "aerospike", - }, - { - receiver: "apache", - }, - { - receiver: "apachespark", - }, - { - receiver: "awscloudwatch", - getConfigFn: func() component.Config { - cfg := rcvrFactories["awscloudwatch"].CreateDefaultConfig().(*awscloudwatchreceiver.Config) - cfg.Region = "us-west-2" - cfg.Logs.Groups = awscloudwatchreceiver.GroupConfig{AutodiscoverConfig: nil} - return cfg - }, - }, - { - receiver: "awscontainerinsightreceiver", - // TODO: skipped since it will only function in a container environment with procfs in expected location. - skipLifecycle: true, - }, - { - receiver: "awsecscontainermetrics", - skipLifecycle: true, // Requires container metaendpoint to be running - }, - { - receiver: "awsfirehose", - }, - { - receiver: "awsxray", - skipLifecycle: true, // Requires AWS endpoint to check identity to run - }, - { - receiver: "azureblob", - getConfigFn: func() component.Config { - cfg := rcvrFactories["azureblob"].CreateDefaultConfig().(*azureblobreceiver.Config) - cfg.ConnectionString = "DefaultEndpointsProtocol=http;AccountName=accountName;AccountKey=accountKey==;BlobEndpoint=test" - cfg.EventHub.EndPoint = "DefaultEndpointsProtocol=http;SharedAccessKeyName=secret;SharedAccessKey=secret;Endpoint=test.test" - return cfg - }, - skipLifecycle: true, // Requires Azure event hub to run - }, - { - receiver: "azureeventhub", - getConfigFn: func() component.Config { - cfg := rcvrFactories["azureeventhub"].CreateDefaultConfig().(*azureeventhubreceiver.Config) - cfg.Connection = "Endpoint=sb://example.com/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=superSecret1234=;EntityPath=hubName" - return cfg - }, - skipLifecycle: true, // Requires Azure event hub to run - }, - { - receiver: "azuremonitor", - getConfigFn: func() component.Config { - cfg := rcvrFactories["azuremonitor"].CreateDefaultConfig().(*azuremonitorreceiver.Config) - cfg.TenantID = "tenant_id" - cfg.SubscriptionID = "subscription_id" - cfg.ClientID = "client_id" - cfg.ClientSecret = "client_secret" - return cfg - }, - skipLifecycle: true, // Requires Azure event hub to run - }, - { - receiver: "bigip", - }, - { - receiver: "carbon", - getConfigFn: func() component.Config { - cfg := rcvrFactories["carbon"].CreateDefaultConfig().(*carbonreceiver.Config) - cfg.Endpoint = "0.0.0.0:0" - return cfg - }, - skipLifecycle: true, // Panics after test have completed, requires a wait group - }, - { - receiver: "cloudflare", - skipLifecycle: true, - }, - { - receiver: "cloudfoundry", - skipLifecycle: true, // Requires UAA (auth) endpoint to run - }, - { - receiver: "chrony", - getConfigFn: func() component.Config { - cfg := rcvrFactories["chrony"].CreateDefaultConfig().(*chronyreceiver.Config) - cfg.Endpoint = "udp://localhost:323" - return cfg - }, - }, - { - receiver: "collectd", - }, - { - receiver: "couchdb", - }, - { - receiver: "datadog", - getConfigFn: func() component.Config { - cfg := rcvrFactories["datadog"].CreateDefaultConfig().(*datadogreceiver.Config) - cfg.Endpoint = "localhost:0" // Using a randomly assigned address - return cfg - }, - }, - { - receiver: "docker_stats", - skipLifecycle: true, - }, - { - receiver: "elasticsearch", - }, - { - receiver: "expvar", - }, - { - receiver: "filelog", - getConfigFn: func() component.Config { - cfg := rcvrFactories["filelog"].CreateDefaultConfig().(*filelogreceiver.FileLogConfig) - cfg.InputConfig.Include = []string{filepath.Join(t.TempDir(), "*")} - return cfg - }, - }, - { - receiver: "file", - skipLifecycle: true, // Requires an existing JSONL file - }, - { - receiver: "filestats", - }, - { - receiver: "flinkmetrics", - }, - { - receiver: "fluentforward", - }, - { - receiver: "googlecloudspanner", - }, - { - receiver: "googlecloudpubsub", - skipLifecycle: true, // Requires a pubsub subscription - }, - { - receiver: "haproxy", - }, - { - receiver: "hostmetrics", - }, - { - receiver: "httpcheck", - }, - { - receiver: "influxdb", - }, - { - receiver: "iis", - skipLifecycle: true, // Requires a running windows process - }, - { - receiver: "jaeger", - }, - { - receiver: "jmx", - skipLifecycle: true, // Requires a running instance with JMX - getConfigFn: func() component.Config { - cfg := jmxreceiver.NewFactory().CreateDefaultConfig().(*jmxreceiver.Config) - cfg.Endpoint = "localhost:1234" - cfg.TargetSystem = "jvm" - return cfg - }, - }, - { - receiver: "journald", - skipLifecycle: runtime.GOOS != "linux", - }, - { - receiver: "k8s_events", - skipLifecycle: true, // need a valid Kubernetes host and port - }, - { - receiver: "k8sobjects", - skipLifecycle: true, // need a valid Kubernetes host and port - }, - { - receiver: "kafka", - skipLifecycle: true, // TODO: It needs access to internals to successful start. - }, - { - receiver: "kafkametrics", - }, - { - receiver: "k8s_cluster", - skipLifecycle: true, // Requires access to the k8s host and port in order to run - }, - { - receiver: "kubeletstats", - skipLifecycle: true, // Requires access to certificates to auth against kubelet - }, - { - receiver: "loki", - }, - { - receiver: "memcached", - }, - { - receiver: "mongodb", - skipLifecycle: true, // Causes tests to timeout - }, - { - receiver: "mongodbatlas", - getConfigFn: func() component.Config { - cfg := rcvrFactories["mongodbatlas"].CreateDefaultConfig().(*mongodbatlasreceiver.Config) - cfg.Logs.Enabled = true - return cfg - }, - }, - { - receiver: "mysql", - }, - { - receiver: "nginx", - }, - { - receiver: "nsxt", - }, - { - receiver: "opencensus", - skipLifecycle: true, // TODO: Usage of CMux doesn't allow proper shutdown. - }, - { - receiver: "oracledb", - }, - { - receiver: "otlp", - }, - { - receiver: "otlpjsonfile", - getConfigFn: func() component.Config { - cfg := rcvrFactories["otlpjsonfile"].CreateDefaultConfig().(*otlpjsonfilereceiver.Config) - cfg.Include = []string{"/tmp/*.log"} - return cfg - }, - }, - { - receiver: "podman_stats", - skipLifecycle: true, // Requires a running podman daemon - }, - { - receiver: "postgresql", - }, - { - receiver: "prometheus", - getConfigFn: func() component.Config { - cfg := rcvrFactories["prometheus"].CreateDefaultConfig().(*prometheusreceiver.Config) - cfg.PrometheusConfig.ScrapeConfigs = []*promconfig.ScrapeConfig{ - {JobName: "test"}, - } - return cfg - }, - }, - { - receiver: "pulsar", - skipLifecycle: true, // TODO It requires a running pulsar instance to start successfully. - }, - { - receiver: "rabbitmq", - }, - { - receiver: "purefa", - }, - { - receiver: "purefb", - }, - { - receiver: "receiver_creator", - }, - { - receiver: "redis", - getConfigFn: func() component.Config { - cfg := rcvrFactories["redis"].CreateDefaultConfig().(*redisreceiver.Config) - cfg.Endpoint = "localhost:6379" - return cfg - }, - }, - { - receiver: "riak", - }, - { - receiver: "sapm", - }, - { - receiver: "signalfx", - }, - { - receiver: "prometheus_simple", - }, - { - receiver: "skywalking", - }, - { - receiver: "snmp", - getConfigFn: func() component.Config { - cfg := rcvrFactories["snmp"].CreateDefaultConfig().(*snmpreceiver.Config) - cfg.Metrics = map[string]*snmpreceiver.MetricConfig{ - "m1": { - Unit: "1", - Gauge: &snmpreceiver.GaugeMetric{ValueType: "int"}, - ScalarOIDs: []snmpreceiver.ScalarOID{{ - OID: ".1", - }}, - }, - } - return cfg - }, - }, - { - receiver: "snowflake", - }, - { - receiver: "splunkenterprise", - }, - { - receiver: "splunk_hec", - }, - { - receiver: "sqlquery", - }, - { - receiver: "sqlserver", - skipLifecycle: true, // Requires a running windows process - }, - { - receiver: "sshcheck", - skipLifecycle: runtime.GOOS == "windows", - }, - - { - receiver: "statsd", - }, - { - receiver: "wavefront", - skipLifecycle: true, // Depends on carbon receiver to be running correctly - }, - { - receiver: "webhookevent", - getConfigFn: func() component.Config { - cfg := rcvrFactories["webhookevent"].CreateDefaultConfig().(*webhookeventreceiver.Config) - cfg.Endpoint = "127.0.0.1:8088" - return cfg - }, - }, - { - receiver: "windowseventlog", - skipLifecycle: runtime.GOOS != "windows", - getConfigFn: func() component.Config { - cfg := rcvrFactories["windowseventlog"].CreateDefaultConfig().(*windowseventlogreceiver.WindowsLogConfig) - cfg.InputConfig.Channel = "Application" - return cfg - }, - }, - { - receiver: "windowsperfcounters", - skipLifecycle: runtime.GOOS != "windows", - }, - { - receiver: "zipkin", - }, - { - receiver: "zookeeper", - }, - { - receiver: "syslog", - getConfigFn: func() component.Config { - cfg := rcvrFactories["syslog"].CreateDefaultConfig().(*syslogreceiver.SysLogConfig) - cfg.InputConfig.TCP = &tcpop.NewConfig().BaseConfig - cfg.InputConfig.TCP.ListenAddress = "0.0.0.0:0" - cfg.InputConfig.Protocol = "rfc5424" - return cfg - }, - }, - { - receiver: "tcplog", - getConfigFn: func() component.Config { - cfg := rcvrFactories["tcplog"].CreateDefaultConfig().(*tcplogreceiver.TCPLogConfig) - cfg.InputConfig.ListenAddress = "0.0.0.0:0" - return cfg - }, - }, - { - receiver: "udplog", - getConfigFn: func() component.Config { - cfg := rcvrFactories["udplog"].CreateDefaultConfig().(*udplogreceiver.UDPLogConfig) - cfg.InputConfig.ListenAddress = "0.0.0.0:0" - return cfg - }, - }, - { - receiver: "vcenter", - }, - { - receiver: "solace", - skipLifecycle: true, // Requires a solace broker to connect to - }, - { - receiver: "namedpipe", - skipLifecycle: runtime.GOOS != "linux", - getConfigFn: func() component.Config { - cfg := rcvrFactories["namedpipe"].CreateDefaultConfig().(*namedpipereceiver.NamedPipeConfig) - cfg.InputConfig.Path = "/tmp/foo" - return cfg - }, - }, - } - - assert.Equal(t, len(rcvrFactories), len(tests), "All receivers must be added to the lifecycle suite") - for _, tt := range tests { - t.Run(string(tt.receiver), func(t *testing.T) { - factory := rcvrFactories[tt.receiver] - assert.Equal(t, tt.receiver, factory.Type()) - - t.Run("shutdown", func(t *testing.T) { - verifyReceiverShutdown(t, factory, tt.getConfigFn) - }) - t.Run("lifecycle", func(t *testing.T) { - if tt.skipLifecycle { - t.SkipNow() - } - verifyReceiverLifecycle(t, factory, tt.getConfigFn) - }) - }) - } -} - -// getReceiverConfigFn is used customize the configuration passed to the verification. -// This is used to change ports or provide values required but not provided by the -// default configuration. -type getReceiverConfigFn func() component.Config - -// verifyReceiverLifecycle is used to test if a receiver type can handle the typical -// lifecycle of a component. The getConfigFn parameter only need to be specified if -// the test can't be done with the default configuration for the component. -func verifyReceiverLifecycle(t *testing.T, factory receiver.Factory, getConfigFn getReceiverConfigFn) { - ctx := context.Background() - host := newAssertNoErrorHost(t) - receiverCreateSet := receivertest.NewNopCreateSettings() - - if getConfigFn == nil { - getConfigFn = factory.CreateDefaultConfig - } - - createFns := []createReceiverFn{ - wrapCreateLogsRcvr(factory), - wrapCreateTracesRcvr(factory), - wrapCreateMetricsRcvr(factory), - } - - for _, createFn := range createFns { - firstRcvr, err := createFn(ctx, receiverCreateSet, getConfigFn()) - if errors.Is(err, component.ErrDataTypeIsNotSupported) { - continue - } - require.NoError(t, err) - require.NoError(t, firstRcvr.Start(ctx, host)) - require.NoError(t, firstRcvr.Shutdown(ctx)) - - secondRcvr, err := createFn(ctx, receiverCreateSet, getConfigFn()) - require.NoError(t, err) - require.NoError(t, secondRcvr.Start(ctx, host)) - require.NoError(t, secondRcvr.Shutdown(ctx)) - } -} - -// verifyReceiverShutdown is used to test if a receiver type can be shutdown without being started first. -func verifyReceiverShutdown(tb testing.TB, factory receiver.Factory, getConfigFn getReceiverConfigFn) { - ctx := context.Background() - receiverCreateSet := receivertest.NewNopCreateSettings() - - if getConfigFn == nil { - getConfigFn = factory.CreateDefaultConfig - } - - createFns := []createReceiverFn{ - wrapCreateLogsRcvr(factory), - wrapCreateTracesRcvr(factory), - wrapCreateMetricsRcvr(factory), - } - - for _, createFn := range createFns { - r, err := createFn(ctx, receiverCreateSet, getConfigFn()) - if errors.Is(err, component.ErrDataTypeIsNotSupported) { - continue - } - if r == nil { - continue - } - assert.NotPanics(tb, func() { - assert.NoError(tb, r.Shutdown(ctx)) - }) - } -} - -// assertNoErrorHost implements a component.Host that asserts that there were no errors. -type createReceiverFn func( - ctx context.Context, - set receiver.CreateSettings, - cfg component.Config, -) (component.Component, error) - -func wrapCreateLogsRcvr(factory receiver.Factory) createReceiverFn { - return func(ctx context.Context, set receiver.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsReceiver(ctx, set, cfg, consumertest.NewNop()) - } -} - -func wrapCreateMetricsRcvr(factory receiver.Factory) createReceiverFn { - return func(ctx context.Context, set receiver.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsReceiver(ctx, set, cfg, consumertest.NewNop()) - } -} - -func wrapCreateTracesRcvr(factory receiver.Factory) createReceiverFn { - return func(ctx context.Context, set receiver.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesReceiver(ctx, set, cfg, consumertest.NewNop()) - } -} diff --git a/cmd/oteltestbedcol/.gitignore b/cmd/oteltestbedcol/.gitignore new file mode 100644 index 000000000000..2eeb73dec3d3 --- /dev/null +++ b/cmd/oteltestbedcol/.gitignore @@ -0,0 +1,3 @@ +* +!builder-config.yaml +!metadata.yaml diff --git a/cmd/oteltestbedcol/Makefile b/cmd/oteltestbedcol/Makefile deleted file mode 100644 index 1994cf483835..000000000000 --- a/cmd/oteltestbedcol/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -include ../../Makefile.Common - -lint: checklicense misspell - @echo "skipping lint: https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/29449" diff --git a/cmd/oteltestbedcol/builder-config.yaml b/cmd/oteltestbedcol/builder-config.yaml index 25b0cfb3ebdf..b5db40de6216 100644 --- a/cmd/oteltestbedcol/builder-config.yaml +++ b/cmd/oteltestbedcol/builder-config.yaml @@ -1,51 +1,63 @@ +# NOTE: +# This builder configuration is NOT used to build any official binary. +# To see the builder manifests used for official binaries, +# check https://github.com/open-telemetry/opentelemetry-collector-releases + dist: module: github.com/open-telemetry/opentelemetry-collector-contrib/cmd/oteltestbedcol name: oteltestbedcol description: OpenTelemetry Collector binary for testbed only tests. - version: 0.102.0-dev - otelcol_version: 0.102.0 + version: 0.116.0-dev extensions: - - gomod: go.opentelemetry.io/collector/extension/ballastextension v0.102.0 - - gomod: go.opentelemetry.io/collector/extension/zpagesextension v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/filestorage v0.102.0 + - gomod: go.opentelemetry.io/collector/extension/zpagesextension v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/filestorage v0.116.0 exporters: - - gomod: go.opentelemetry.io/collector/exporter/debugexporter v0.102.0 - - gomod: go.opentelemetry.io/collector/exporter/otlpexporter v0.102.0 - - gomod: go.opentelemetry.io/collector/exporter/otlphttpexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/carbonexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opensearchexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sapmexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/signalfxexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.102.0 + - gomod: go.opentelemetry.io/collector/exporter/debugexporter v0.116.0 + - gomod: go.opentelemetry.io/collector/exporter/otlpexporter v0.116.0 + - gomod: go.opentelemetry.io/collector/exporter/otlphttpexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/carbonexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opensearchexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sapmexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/signalfxexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.116.0 processors: - - gomod: go.opentelemetry.io/collector/processor/batchprocessor v0.102.0 - - gomod: go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.102.0 + - gomod: go.opentelemetry.io/collector/processor/batchprocessor v0.116.0 + - gomod: go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.116.0 receivers: - - gomod: go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/carbonreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/fluentforwardreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sapmreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/signalfxreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkhecreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/tcplogreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/udplogreceiver v0.102.0 - - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.102.0 + - gomod: go.opentelemetry.io/collector/receiver/otlpreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/carbonreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/fluentforwardreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sapmreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/signalfxreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkhecreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/tcplogreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/udplogreceiver v0.116.0 + - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.116.0 + +providers: + - gomod: go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0 + - gomod: go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0 + - gomod: go.opentelemetry.io/collector/confmap/provider/httpprovider v1.22.0 + - gomod: go.opentelemetry.io/collector/confmap/provider/httpsprovider v1.22.0 + - gomod: go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.22.0 replaces: - github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage => ../../extension/storage @@ -90,13 +102,12 @@ replaces: - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sapmexporter => ../../exporter/sapmexporter - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver => ../../receiver/syslogreceiver - github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor => ../../processor/resourceprocessor + - github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor => ../../processor/transformprocessor + - github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor => ../../processor/filterprocessor - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/carbonexporter => ../../exporter/carbonexporter - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus => ../../pkg/translator/prometheus - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden => ../../pkg/golden - # see https://github.com/mattn/go-ieproxy/issues/45 - - github.com/mattn/go-ieproxy => github.com/mattn/go-ieproxy v0.0.1 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest => ../../pkg/pdatatest - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../../pkg/pdatautil - github.com/openshift/api v3.9.0+incompatible => github.com/openshift/api v0.0.0-20180801171038-322a19404e37 - - github.com/outcaste-io/ristretto v0.2.0 => github.com/outcaste-io/ristretto v0.2.1 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension => ../../extension/ackextension diff --git a/cmd/oteltestbedcol/components.go b/cmd/oteltestbedcol/components.go deleted file mode 100644 index d3a593c7b081..000000000000 --- a/cmd/oteltestbedcol/components.go +++ /dev/null @@ -1,117 +0,0 @@ -// Code generated by "go.opentelemetry.io/collector/cmd/builder". DO NOT EDIT. - -package main - -import ( - "go.opentelemetry.io/collector/connector" - "go.opentelemetry.io/collector/exporter" - debugexporter "go.opentelemetry.io/collector/exporter/debugexporter" - otlpexporter "go.opentelemetry.io/collector/exporter/otlpexporter" - otlphttpexporter "go.opentelemetry.io/collector/exporter/otlphttpexporter" - "go.opentelemetry.io/collector/extension" - ballastextension "go.opentelemetry.io/collector/extension/ballastextension" - zpagesextension "go.opentelemetry.io/collector/extension/zpagesextension" - "go.opentelemetry.io/collector/otelcol" - "go.opentelemetry.io/collector/processor" - batchprocessor "go.opentelemetry.io/collector/processor/batchprocessor" - memorylimiterprocessor "go.opentelemetry.io/collector/processor/memorylimiterprocessor" - "go.opentelemetry.io/collector/receiver" - otlpreceiver "go.opentelemetry.io/collector/receiver/otlpreceiver" - - carbonexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/carbonexporter" - opencensusexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter" - opensearchexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opensearchexporter" - prometheusexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter" - sapmexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sapmexporter" - signalfxexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/signalfxexporter" - splunkhecexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter" - syslogexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter" - zipkinexporter "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter" - pprofextension "github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension" - filestorage "github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/filestorage" - attributesprocessor "github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor" - resourceprocessor "github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor" - carbonreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/carbonreceiver" - filelogreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver" - fluentforwardreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/fluentforwardreceiver" - jaegerreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver" - opencensusreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver" - prometheusreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver" - sapmreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sapmreceiver" - signalfxreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/signalfxreceiver" - splunkhecreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkhecreceiver" - syslogreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver" - tcplogreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/tcplogreceiver" - udplogreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/udplogreceiver" - zipkinreceiver "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver" -) - -func components() (otelcol.Factories, error) { - var err error - factories := otelcol.Factories{} - - factories.Extensions, err = extension.MakeFactoryMap( - ballastextension.NewFactory(), - zpagesextension.NewFactory(), - pprofextension.NewFactory(), - filestorage.NewFactory(), - ) - if err != nil { - return otelcol.Factories{}, err - } - - factories.Receivers, err = receiver.MakeFactoryMap( - otlpreceiver.NewFactory(), - carbonreceiver.NewFactory(), - filelogreceiver.NewFactory(), - fluentforwardreceiver.NewFactory(), - jaegerreceiver.NewFactory(), - opencensusreceiver.NewFactory(), - prometheusreceiver.NewFactory(), - sapmreceiver.NewFactory(), - signalfxreceiver.NewFactory(), - splunkhecreceiver.NewFactory(), - syslogreceiver.NewFactory(), - tcplogreceiver.NewFactory(), - udplogreceiver.NewFactory(), - zipkinreceiver.NewFactory(), - ) - if err != nil { - return otelcol.Factories{}, err - } - - factories.Exporters, err = exporter.MakeFactoryMap( - debugexporter.NewFactory(), - otlpexporter.NewFactory(), - otlphttpexporter.NewFactory(), - carbonexporter.NewFactory(), - opencensusexporter.NewFactory(), - opensearchexporter.NewFactory(), - prometheusexporter.NewFactory(), - sapmexporter.NewFactory(), - signalfxexporter.NewFactory(), - splunkhecexporter.NewFactory(), - syslogexporter.NewFactory(), - zipkinexporter.NewFactory(), - ) - if err != nil { - return otelcol.Factories{}, err - } - - factories.Processors, err = processor.MakeFactoryMap( - batchprocessor.NewFactory(), - memorylimiterprocessor.NewFactory(), - attributesprocessor.NewFactory(), - resourceprocessor.NewFactory(), - ) - if err != nil { - return otelcol.Factories{}, err - } - - factories.Connectors, err = connector.MakeFactoryMap() - if err != nil { - return otelcol.Factories{}, err - } - - return factories, nil -} diff --git a/cmd/oteltestbedcol/go.mod b/cmd/oteltestbedcol/go.mod deleted file mode 100644 index 7e89652137df..000000000000 --- a/cmd/oteltestbedcol/go.mod +++ /dev/null @@ -1,397 +0,0 @@ -// Code generated by "go.opentelemetry.io/collector/cmd/builder". DO NOT EDIT. - -module github.com/open-telemetry/opentelemetry-collector-contrib/cmd/oteltestbedcol - -go 1.21.0 - -toolchain go1.21.10 - -require ( - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/carbonexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opensearchexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sapmexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/signalfxexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/filestorage v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/carbonreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/fluentforwardreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sapmreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/signalfxreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkhecreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/tcplogreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/udplogreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.102.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0 - go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0 - go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0 - go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0 - go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0 - go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0 - go.opentelemetry.io/collector/connector v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/exporter/debugexporter v0.102.0 - go.opentelemetry.io/collector/exporter/otlpexporter v0.102.0 - go.opentelemetry.io/collector/exporter/otlphttpexporter v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/collector/extension/ballastextension v0.102.0 - go.opentelemetry.io/collector/extension/zpagesextension v0.102.0 - go.opentelemetry.io/collector/otelcol v0.102.0 - go.opentelemetry.io/collector/processor v0.102.0 - go.opentelemetry.io/collector/processor/batchprocessor v0.102.0 - go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.102.0 - go.opentelemetry.io/collector/receiver v0.102.0 - go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0 - go.uber.org/goleak v1.3.0 - golang.org/x/sys v0.20.0 -) - -require ( - cloud.google.com/go/compute/metadata v0.3.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.10.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 // indirect - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.5.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 // indirect - github.com/Code-Hex/go-generics-cache v1.3.1 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/alecthomas/participle/v2 v2.1.1 // indirect - github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 // indirect - github.com/apache/thrift v0.20.0 // indirect - github.com/armon/go-metrics v0.4.1 // indirect - github.com/aws/aws-sdk-go v1.51.17 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/bmatcuk/doublestar/v4 v4.6.1 // indirect - github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50 // indirect - github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/dennwc/varint v1.0.0 // indirect - github.com/digitalocean/godo v1.109.0 // indirect - github.com/distribution/reference v0.5.0 // indirect - github.com/docker/docker v25.0.5+incompatible // indirect - github.com/docker/go-connections v0.5.0 // indirect - github.com/docker/go-units v0.5.0 // indirect - github.com/elastic/go-structform v0.0.10 // indirect - github.com/emicklei/go-restful/v3 v3.11.0 // indirect - github.com/envoyproxy/go-control-plane v0.12.0 // indirect - github.com/envoyproxy/protoc-gen-validate v1.0.4 // indirect - github.com/expr-lang/expr v1.16.9 // indirect - github.com/fatih/color v1.15.0 // indirect - github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-kit/log v0.2.1 // indirect - github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect - github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect - github.com/go-openapi/jsonpointer v0.20.2 // indirect - github.com/go-openapi/jsonreference v0.20.4 // indirect - github.com/go-openapi/swag v0.22.9 // indirect - github.com/go-resty/resty/v2 v2.12.0 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect - github.com/go-zookeeper/zk v1.0.3 // indirect - github.com/gobwas/glob v0.2.3 // indirect - github.com/gogo/googleapis v1.4.1 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v5 v5.2.0 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.4 // indirect - github.com/golang/snappy v0.0.4 // indirect - github.com/google/gnostic-models v0.6.8 // indirect - github.com/google/go-cmp v0.6.0 // indirect - github.com/google/go-querystring v1.1.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/s2a-go v0.1.7 // indirect - github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.2 // indirect - github.com/gophercloud/gophercloud v1.8.0 // indirect - github.com/gorilla/mux v1.8.1 // indirect - github.com/gorilla/websocket v1.5.0 // indirect - github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect - github.com/hashicorp/consul/api v1.28.2 // indirect - github.com/hashicorp/cronexpr v1.1.2 // indirect - github.com/hashicorp/errwrap v1.1.0 // indirect - github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-hclog v1.6.3 // indirect - github.com/hashicorp/go-immutable-radix v1.3.1 // indirect - github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-retryablehttp v0.7.4 // indirect - github.com/hashicorp/go-rootcerts v1.0.2 // indirect - github.com/hashicorp/go-version v1.7.0 // indirect - github.com/hashicorp/golang-lru v1.0.2 // indirect - github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect - github.com/hashicorp/nomad/api v0.0.0-20240306004928-3e7191ccb702 // indirect - github.com/hashicorp/serf v0.10.1 // indirect - github.com/hetznercloud/hcloud-go/v2 v2.6.0 // indirect - github.com/iancoleman/strcase v0.3.0 // indirect - github.com/imdario/mergo v0.3.16 // indirect - github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/ionos-cloud/sdk-go/v6 v6.1.11 // indirect - github.com/jaegertracing/jaeger v1.57.0 // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/josharian/intern v1.0.0 // indirect - github.com/jpillora/backoff v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.8 // indirect - github.com/knadh/koanf/maps v0.1.1 // indirect - github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect - github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b // indirect - github.com/kylelemons/godebug v1.1.0 // indirect - github.com/leodido/go-syslog/v4 v4.1.0 // indirect - github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b // indirect - github.com/linode/linodego v1.33.0 // indirect - github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect - github.com/miekg/dns v1.1.58 // indirect - github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect - github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c // indirect - github.com/mitchellh/reflectwalk v1.0.2 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/mostynb/go-grpc-compression v1.2.2 // indirect - github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchperresourceattr v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/signalfx v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.102.0 // indirect - github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.1.0 // indirect - github.com/opensearch-project/opensearch-go/v2 v2.3.0 // indirect - github.com/openzipkin/zipkin-go v0.4.3 // indirect - github.com/ovh/go-ovh v1.4.3 // indirect - github.com/philhofer/fwd v1.1.2 // indirect - github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/common/sigv4 v0.1.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e // indirect - github.com/rs/cors v1.11.0 // indirect - github.com/scaleway/scaleway-sdk-go v1.0.0-beta.25 // indirect - github.com/shirou/gopsutil/v3 v3.24.4 // indirect - github.com/shoenig/go-m1cpu v0.1.6 // indirect - github.com/signalfx/com_signalfx_metrics_protobuf v0.0.3 // indirect - github.com/signalfx/sapm-proto v0.14.0 // indirect - github.com/soheilhy/cmux v0.1.5 // indirect - github.com/spf13/cobra v1.8.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/tinylib/msgp v1.1.9 // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect - github.com/valyala/fastjson v1.6.4 // indirect - github.com/vultr/govultr/v2 v2.17.2 // indirect - github.com/yusufpapurcu/wmi v1.2.4 // indirect - go.etcd.io/bbolt v1.3.10 // indirect - go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/configgrpc v0.102.0 // indirect - go.opentelemetry.io/collector/config/confighttp v0.102.0 // indirect - go.opentelemetry.io/collector/config/confignet v0.102.0 // indirect - go.opentelemetry.io/collector/config/configopaque v1.9.0 // indirect - go.opentelemetry.io/collector/config/configretry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/consumer v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/collector/semconv v0.102.0 // indirect - go.opentelemetry.io/collector/service v0.102.0 // indirect - go.opentelemetry.io/contrib/config v0.7.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/contrib/propagators/b3 v1.27.0 // indirect - go.opentelemetry.io/contrib/zpages v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/bridge/opencensus v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 // indirect - go.opentelemetry.io/otel/metric v1.27.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - go.opentelemetry.io/otel/trace v1.27.0 // indirect - go.opentelemetry.io/proto/otlp v1.2.0 // indirect - go.uber.org/atomic v1.11.0 // indirect - go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.23.0 // indirect - golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/mod v0.17.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/oauth2 v0.20.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/term v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.21.0 // indirect - gonum.org/v1/gonum v0.15.0 // indirect - google.golang.org/api v0.169.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.29.3 // indirect - k8s.io/apimachinery v0.29.3 // indirect - k8s.io/client-go v0.29.3 // indirect - k8s.io/klog/v2 v2.120.1 // indirect - k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect - k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect - sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect -) - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage => ../../extension/storage - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/filestorage => ../../extension/storage/filestorage - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/common => ../../internal/common - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver => ../../receiver/opencensusreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkhecreceiver => ../../receiver/splunkhecreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin => ../../pkg/translator/zipkin - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/udplogreceiver => ../../receiver/udplogreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk => ../../internal/splunk - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl => ../../pkg/ottl - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sapmreceiver => ../../receiver/sapmreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver => ../../receiver/zipkinreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver => ../../receiver/jaegerreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchperresourceattr => ../../pkg/batchperresourceattr - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter => ../../exporter/prometheusremotewriteexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/tcplogreceiver => ../../receiver/tcplogreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension => ../../extension/pprofextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal => ../../internal/coreinternal - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata => ../../pkg/experimentalmetricmetadata - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza => ../../pkg/stanza - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/fluentforwardreceiver => ../../receiver/fluentforwardreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger => ../../pkg/translator/jaeger - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor => ../../processor/attributesprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/carbonreceiver => ../../receiver/carbonreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter => ../../exporter/splunkhecexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter => ../../exporter/syslogexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter => ../../exporter/prometheusexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus => ../../pkg/translator/opencensus - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter => ../../exporter/zipkinexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/signalfx => ../../pkg/translator/signalfx - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/signalfxreceiver => ../../receiver/signalfxreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter => ../../internal/filter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite => ../../pkg/translator/prometheusremotewrite - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver => ../../receiver/filelogreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/signalfxexporter => ../../exporter/signalfxexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry => ../../pkg/resourcetotelemetry - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter => ../../exporter/opencensusexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opensearchexporter => ../../exporter/opensearchexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent => ../../internal/sharedcomponent - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver => ../../receiver/prometheusreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sapmexporter => ../../exporter/sapmexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver => ../../receiver/syslogreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor => ../../processor/resourceprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/carbonexporter => ../../exporter/carbonexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus => ../../pkg/translator/prometheus - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden => ../../pkg/golden - -replace github.com/mattn/go-ieproxy => github.com/mattn/go-ieproxy v0.0.1 - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest => ../../pkg/pdatatest - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../../pkg/pdatautil - -replace github.com/openshift/api v3.9.0+incompatible => github.com/openshift/api v0.0.0-20180801171038-322a19404e37 - -replace github.com/outcaste-io/ristretto v0.2.0 => github.com/outcaste-io/ristretto v0.2.1 - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension => ../../extension/ackextension diff --git a/cmd/oteltestbedcol/go.sum b/cmd/oteltestbedcol/go.sum deleted file mode 100644 index ab727e96b054..000000000000 --- a/cmd/oteltestbedcol/go.sum +++ /dev/null @@ -1,1209 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= -cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= -dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.10.0 h1:n1DH8TPV4qqPTje2RcUBYwtrTWlabVp4n46+74X2pn4= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.10.0/go.mod h1:HDcZnuGbiyppErN6lB+idp4CKhjbc8gwjto6OPpyggM= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1 h1:sO0/P7g68FrryJzljemN+6GTssUXdANk6aJ7T1ZxnsQ= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1/go.mod h1:h8hyGFDsU5HMivxiS2iYFZsgDbU9OnnJ163x5UGVKYo= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 h1:LqbJ/WzJUwBf8UiaSzgX7aMclParm9/5Vgp+TY51uBQ= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2/go.mod h1:yInRyqWXAuaPrgI7p70+lDDgh3mlBohis29jGMISnmc= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.5.0 h1:MxA59PGoCFb+vCwRQi3PhQEwHj4+r2dhuv9HG+vM7iM= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.5.0/go.mod h1:uYt4CfhkJA9o0FN7jfE5minm/i4nUE4MjGUJkzB6Zs8= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0 h1:PTFGRSlMKCQelWwxUyYVEUqseBJVemLyqWJjvMyt0do= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0/go.mod h1:LRr2FzBTQlONPPa5HREE5+RjSCTXl7BwOvYOaWTqCaI= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 h1:bXwSugBiSbgtz7rOtbfGf+woewp4f06orW9OP5BjHLA= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0/go.mod h1:Y/HgrePTmGy9HjdSGTqZNa+apUpTVIEVKXJyARP2lrk= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.1.1 h1:7CBQ+Ei8SP2c6ydQTGCCrS35bDxgTMfoP2miAwK++OU= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.1.1/go.mod h1:c/wcGeGx5FUPbM/JltUYHZcKmigwyVLJlDq+4HdtXaw= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 h1:DzHpqpoJVaCgOUdVHxE8QB52S6NiVdDQvGlny1qvPqA= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Code-Hex/go-generics-cache v1.3.1 h1:i8rLwyhoyhaerr7JpjtYjJZUcCbWOdiYO3fZXLiEC4g= -github.com/Code-Hex/go-generics-cache v1.3.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= -github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= -github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w= -github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/alecthomas/assert/v2 v2.3.0 h1:mAsH2wmvjsuvyBvAmCtm7zFsBlb8mIHx5ySLVdDZXL0= -github.com/alecthomas/assert/v2 v2.3.0/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= -github.com/alecthomas/participle/v2 v2.1.1 h1:hrjKESvSqGHzRb4yW1ciisFJ4p3MGYih6icjJvbsmV8= -github.com/alecthomas/participle/v2 v2.1.1/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= -github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= -github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 h1:ez/4by2iGztzR4L0zgAOR8lTQK9VlyBVVd7G4omaOQs= -github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/apache/thrift v0.20.0 h1:631+KvYbsBZxmuJjYwhezVsrfc/TbqtZV4QcxOX1fOI= -github.com/apache/thrift v0.20.0/go.mod h1:hOk1BQqcp2OLzGsyVXdfMk7YFlMxK3aoEVhjD06QhB8= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= -github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.44.263/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= -github.com/aws/aws-sdk-go v1.51.17 h1:Cfa40lCdjv9OxC3X1Ks3a6O1Tu3gOANSyKHOSw/zuWU= -github.com/aws/aws-sdk-go v1.51.17/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= -github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2/config v1.18.25/go.mod h1:dZnYpD5wTW/dQF0rRNLVypB396zWCcPiBIvdvSWHEg4= -github.com/aws/aws-sdk-go-v2/credentials v1.13.24/go.mod h1:jYPYi99wUOPIFi0rhiOvXeSEReVOzBqFNOX5bXYoG2o= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3/go.mod h1:4Q0UFP0YJf0NrsEuEYHpM9fTSEVnD16Z3uyEF7J9JGM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33/go.mod h1:7i0PF1ME/2eUPFcjkVIwq+DOygHEoK92t5cDqNgYbIw= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27/go.mod h1:UrHnn3QV/d0pBZ6QBAEQcqFLf8FAzLmoUfPVIueOvoM= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34/go.mod h1:Etz2dj6UHYuw+Xw830KfzCfWGMzqvUTCjUj5b76GVDc= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27/go.mod h1:EOwBD4J4S5qYszS5/3DpkejfuK+Z5/1uzICfPaZLtqw= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.10/go.mod h1:ouy2P4z6sJN70fR3ka3wD3Ro3KezSxU6eKGQI2+2fjI= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.10/go.mod h1:AFvkxc8xfBe8XA+5St5XIHHrQQtkxqrRincx4hmMHOk= -github.com/aws/aws-sdk-go-v2/service/sts v1.19.0/go.mod h1:BgQOMsg8av8jset59jelyPW7NoZcZXLVpDsXunGDrk8= -github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 h1:6df1vn4bBlDDo4tARvBm7l6KA9iVMnE3NWizDeWSrps= -github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3/go.mod h1:CIWtjkly68+yqLPbvwwR/fjNJA/idrtULjZWh2v1ys0= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -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/bmatcuk/doublestar/v4 v4.6.1 h1:FH9SifrbvJhnlQpztAx++wlkk70QBf0iBWDwNy7PA4I= -github.com/bmatcuk/doublestar/v4 v4.6.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= -github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= -github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= -github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50 h1:DBmgJDC9dTfkVyGgipamEh2BpGYxScCH1TOF1LL1cXc= -github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50/go.mod h1:5e1+Vvlzido69INQaVO6d87Qn543Xr6nooe9Kz7oBFM= -github.com/containerd/containerd v1.7.15 h1:afEHXdil9iAm03BmhjzKyXnnEBtjaLJefdU7DV0IFes= -github.com/containerd/containerd v1.7.15/go.mod h1:ISzRRTMF8EXNpJlTzyr2XMhN+j9K302C21/+cr3kUnY= -github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= -github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= -github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE= -github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= -github.com/digitalocean/godo v1.109.0 h1:4W97RJLJSUQ3veRZDNbp1Ol3Rbn6Lmt9bKGvfqYI5SU= -github.com/digitalocean/godo v1.109.0/go.mod h1:R6EmmWI8CT1+fCtjWY9UCB+L5uufuZH13wk3YhxycCs= -github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= -github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docker/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= -github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= -github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= -github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= -github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/elastic/go-structform v0.0.10 h1:oy08o/Ih2hHTkNcRY/1HhaYvIp5z6t8si8gnCJPDo1w= -github.com/elastic/go-structform v0.0.10/go.mod h1:CZWf9aIRYY5SuKSmOhtXScE5uQiLZNqAFnwKR4OrIM4= -github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= -github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.12.0 h1:4X+VP1GHd1Mhj6IB5mMeGbLCleqxjletLK6K0rbxyZI= -github.com/envoyproxy/go-control-plane v0.12.0/go.mod h1:ZBTaoJ23lqITozF0M6G4/IragXCQKCnYbmlmtHvwRG0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= -github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/expr-lang/expr v1.16.9 h1:WUAzmR0JNI9JCiF0/ewwHB1gmcGw5wW7nWt8gc6PpCI= -github.com/expr-lang/expr v1.16.9/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= -github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.13.0 h1:OoneCcHKHQ03LfBpoQCUfCluwd2Vt3ohz+kvbJneZAU= -github.com/go-kit/kit v0.13.0/go.mod h1:phqEHMMUbyrCFCTgH48JueqrM3md2HcAZ8N3XE4FKDg= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= -github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= -github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= -github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= -github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= -github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= -github.com/go-openapi/swag v0.22.9 h1:XX2DssF+mQKM2DHsbgZK74y/zj4mo9I99+89xUmuZCE= -github.com/go-openapi/swag v0.22.9/go.mod h1:3/OXnFfnMAwBD099SwYRk7GD3xOrr1iL7d/XNLXVVwE= -github.com/go-resty/resty/v2 v2.12.0 h1:rsVL8P90LFvkUYq/V5BTVe203WfRIU4gvcf+yfzJzGA= -github.com/go-resty/resty/v2 v2.12.0/go.mod h1:o0yGPrkS3lOe1+eFajk6kBW8ScXzwU3hD69/gt2yB/0= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg= -github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= -github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= -github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw= -github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= -github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= -github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7 h1:y3N7Bm7Y9/CtpiVkw/ZWj6lSlDF3F74SfKwfTCer72Q= -github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= -github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= -github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.12.2 h1:mhN09QQW1jEWeMF74zGR81R30z4VJzjZsfkUhuHF+DA= -github.com/googleapis/gax-go/v2 v2.12.2/go.mod h1:61M8vcyyXR2kqKFxKrfA22jaA8JGF7Dc8App1U3H6jc= -github.com/gophercloud/gophercloud v1.8.0 h1:TM3Jawprb2NrdOnvcHhWJalmKmAmOGgfZElM/3oBYCk= -github.com/gophercloud/gophercloud v1.8.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= -github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= -github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= -github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= -github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= -github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= -github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= -github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= -github.com/hashicorp/consul/api v1.28.2 h1:mXfkRHrpHN4YY3RqL09nXU1eHKLNiuAN4kHvDQ16k/8= -github.com/hashicorp/consul/api v1.28.2/go.mod h1:KyzqzgMEya+IZPcD65YFoOVAgPpbfERu4I/tzG6/ueE= -github.com/hashicorp/consul/sdk v0.16.0 h1:SE9m0W6DEfgIVCJX7xU+iv/hUl4m/nxqMTnCdMxDpJ8= -github.com/hashicorp/consul/sdk v0.16.0/go.mod h1:7pxqqhqoaPqnBnzXD1StKed62LqJeClzVsUEy85Zr0A= -github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= -github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= -github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= -github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-retryablehttp v0.7.4 h1:ZQgVdpTdAL7WpMIwLzCfbalOcSUdkDZnpUv3/+BxzFA= -github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= -github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= -github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= -github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= -github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= -github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= -github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= -github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= -github.com/hashicorp/nomad/api v0.0.0-20240306004928-3e7191ccb702 h1:fI1LXuBaS1d9z1kmb++Og6YD8uMRwadXorCwE+xgOFA= -github.com/hashicorp/nomad/api v0.0.0-20240306004928-3e7191ccb702/go.mod h1:z71gkJdrkAt/Rl6C7Q79VE7AwJ5lUF+M+fzFTyIHYB0= -github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= -github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/hetznercloud/hcloud-go/v2 v2.6.0 h1:RJOA2hHZ7rD1pScA4O1NF6qhkHyUdbbxjHgFNot8928= -github.com/hetznercloud/hcloud-go/v2 v2.6.0/go.mod h1:4J1cSE57+g0WS93IiHLV7ubTHItcp+awzeBp5bM9mfA= -github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= -github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= -github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= -github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= -github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/ionos-cloud/sdk-go/v6 v6.1.11 h1:J/uRN4UWO3wCyGOeDdMKv8LWRzKu6UIkLEaes38Kzh8= -github.com/ionos-cloud/sdk-go/v6 v6.1.11/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= -github.com/jaegertracing/jaeger v1.57.0 h1:3wDtUUPs6NRYH7+d+y8MilDkLHdpPrVlQ2wbcsA62bs= -github.com/jaegertracing/jaeger v1.57.0/go.mod h1:p/1fxIU9hKHl7qEhKC72p2ZYVhvvZvNB73y6V7YyuTs= -github.com/jarcoal/httpmock v1.3.1 h1:iUx3whfZWVf3jT01hQTO/Eo5sAYtB2/rqaUuOtpInww= -github.com/jarcoal/httpmock v1.3.1/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -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/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= -github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= -github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= -github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= -github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00= -github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leodido/go-syslog/v4 v4.1.0 h1:Wsl194qyWXr7V6DrGWC3xmxA9Ra6XgWO+toNt2fmCaI= -github.com/leodido/go-syslog/v4 v4.1.0/go.mod h1:eJ8rUfDN5OS6dOkCOBYlg2a+hbAg6pJa99QXXgMrd98= -github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b h1:11UHH39z1RhZ5dc4y4r/4koJo6IYFgTRMe/LlwRTEw0= -github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b/go.mod h1:WZxr2/6a/Ar9bMDc2rN/LJrE/hF6bXE4LPyDSIxwAfg= -github.com/linode/linodego v1.33.0 h1:cX2FYry7r6CA1ujBMsdqiM4VhvIQtnWsOuVblzfBhCw= -github.com/linode/linodego v1.33.0/go.mod h1:dSJJgIwqZCF5wnpuC6w5cyIbRtcexAm7uVvuJopGB40= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c h1:VtwQ41oftZwlMnOEbMWQtSEUgU64U4s+GHk7hZK+jtY= -github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE= -github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= -github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04nTH68g= -github.com/maxatome/go-testdeep v1.12.0/go.mod h1:lPZc/HAcJMP92l7yI6TRz1aZN5URwUBUAfUNvrclaNM= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.58 h1:ca2Hdkz+cDg/7eNF6V56jjzuZ4aCAE+DbVkILdQWG/4= -github.com/miekg/dns v1.1.58/go.mod h1:Ypv+3b/KadlvW9vJfXOTf300O4UqaHFzFCuHz+rPkBY= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= -github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= -github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4= -github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c h1:cqn374mizHuIWj+OSJCajGr/phAmuMug9qIX3l9CflE= -github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= -github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= -github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= -github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= -github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= -github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= -github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= -github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mostynb/go-grpc-compression v1.2.2 h1:XaDbnRvt2+1vgr0b/l0qh4mJAfIxE0bKXtz2Znl3GGI= -github.com/mostynb/go-grpc-compression v1.2.2/go.mod h1:GOCr2KBxXcblCuczg3YdLQlcin1/NfyDA348ckuCH6w= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= -github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= -github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg= -github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= -github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= -github.com/opensearch-project/opensearch-go/v2 v2.3.0 h1:nQIEMr+A92CkhHrZgUhcfsrZjibvB3APXf2a1VwCmMQ= -github.com/opensearch-project/opensearch-go/v2 v2.3.0/go.mod h1:8LDr9FCgUTVoT+5ESjc2+iaZuldqE+23Iq0r1XeNue8= -github.com/openzipkin/zipkin-go v0.4.3 h1:9EGwpqkgnwdEIJ+Od7QVSEIH+ocmm5nPat0G7sjsSdg= -github.com/openzipkin/zipkin-go v0.4.3/go.mod h1:M9wCJZFWCo2RiY+o1eBCEMe0Dp2S5LDHcMZmk3RmK7c= -github.com/ovh/go-ovh v1.4.3 h1:Gs3V823zwTFpzgGLZNI6ILS4rmxZgJwJCz54Er9LwD0= -github.com/ovh/go-ovh v1.4.3/go.mod h1:AkPXVtgwB6xlKblMjRKJJmjRp+ogrE7fz2lVgcQY8SY= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= -github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= -github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= -github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= -github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= -github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c h1:NRoLoZvkBTKvR5gQLgA3e0hqjkY9u1wm+iOL45VN/qI= -github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= -github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e h1:UmqAuY2OyDoog8+l5FybViJE5B2r+UxVGCUwFTsY5AA= -github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e/go.mod h1:+0ld+ozir7zWFcHA2vVpWAKxXakIioEjPPNOqH+J3ZA= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= -github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= -github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -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/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= -github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= -github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= -github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.25 h1:/8rfZAdFfafRXOgz+ZpMZZWZ5pYggCY9t7e/BvjaBHM= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.25/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= -github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= -github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= -github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= -github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= -github.com/shoenig/test v1.7.1 h1:UJcjSAI3aUKx52kfcfhblgyhZceouhvvs3OYdWgn+PY= -github.com/shoenig/test v1.7.1/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI= -github.com/signalfx/com_signalfx_metrics_protobuf v0.0.3 h1:32k2QLgsKhcEs55q4REPKyIadvid5FPy2+VMgvbmKJ0= -github.com/signalfx/com_signalfx_metrics_protobuf v0.0.3/go.mod h1:gJrXWi7wSGXfiC7+VheQaz+ypdCt5SmZNL+BRxUe7y4= -github.com/signalfx/sapm-proto v0.14.0 h1:KWh3I5E4EkelB19aP1/54Ik8khSioC/RVRW/riOfRGg= -github.com/signalfx/sapm-proto v0.14.0/go.mod h1:Km6PskZh966cqNoUn3AmRyGRix5VfwnxVBvn2vjRC9U= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= -github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= -github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= -github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= -github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= -github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= -github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -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 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= -github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/testcontainers/testcontainers-go v0.31.0 h1:W0VwIhcEVhRflwL9as3dhY6jXjVCA27AkmbnZ+UTh3U= -github.com/testcontainers/testcontainers-go v0.31.0/go.mod h1:D2lAoA0zUFiSY+eAflqK5mcUx/A5hrrORaEQrd0SefI= -github.com/tidwall/gjson v1.10.2 h1:APbLGOM0rrEkd8WBw9C24nllro4ajFuJu0Sc9hRz8Bo= -github.com/tidwall/gjson v1.10.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= -github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tidwall/tinylru v1.1.0 h1:XY6IUfzVTU9rpwdhKUF6nQdChgCdGjkMfLzbWyiau6I= -github.com/tidwall/tinylru v1.1.0/go.mod h1:3+bX+TJ2baOLMWTnlyNWHh4QMnFyARg2TLTQ6OFbzw8= -github.com/tidwall/wal v1.1.7 h1:emc1TRjIVsdKKSnpwGBAcsAGg0767SvUk8+ygx7Bb+4= -github.com/tidwall/wal v1.1.7/go.mod h1:r6lR1j27W9EPalgHiB7zLJDYu3mzW5BQP5KrzBpYY/E= -github.com/tinylib/msgp v1.1.9 h1:SHf3yoO2sGA0veCJeCBYLHuttAVFHGm2RHgNodW7wQU= -github.com/tinylib/msgp v1.1.9/go.mod h1:BCXGB54lDD8qUEPmiG0cQQUANC4IUQyB2ItS2UDlO/k= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ= -github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= -github.com/vultr/govultr/v2 v2.17.2 h1:gej/rwr91Puc/tgh+j33p/BLR16UrIPnSr+AIwYWZQs= -github.com/vultr/govultr/v2 v2.17.2/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= -github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.etcd.io/bbolt v1.3.10 h1:+BqfJTcCzTItrop8mq/lbzL8wSGtj94UO/3U31shqG0= -go.etcd.io/bbolt v1.3.10/go.mod h1:bK3UQLPJZly7IlNmV7uVHJDxfe5aK9Ll93e/74Y9oEQ= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/configgrpc v0.102.0 h1:cQi5HwpkHvrZJUxZjoGXkWpAuK+gEyp/1Zjn0BrkvmQ= -go.opentelemetry.io/collector/config/configgrpc v0.102.0/go.mod h1:ASpBXzDWLiDGlG8iRFovU5R4LhAefoC4ajm+qIdslOw= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/confignet v0.102.0 h1:+wQevJ/iBnPxL+roY7WWnAjMxB8v4M5QrS3+0iEmauw= -go.opentelemetry.io/collector/config/confignet v0.102.0/go.mod h1:pfOrCTfSZEB6H2rKtx41/3RN4dKs+X2EKQbw3MGRh0E= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0 h1:8Ne/oL6M4kMWK0P3FKV9EduQa+1UOGyVAnFHfSo4c1A= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0/go.mod h1:Xj4Ld/RriP/Bj+5oPpaYJsLNs2wWRDN2TvzX3Lbi6+M= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0 h1:o1iKqN+oM+TZqHoGdnKw1Am2BQlIGCYbxCRzU8T3jbM= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0/go.mod h1:JpCemLtL/sXQ2Rk3Bx7OPPA7Qt/9NVH91q0bR655gSo= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0 h1:SfASE6lxXjrmYj/UibcWdOiFWvRG0zt4hJgenloEhlY= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0/go.mod h1:+Ku0Fvdb5f6e9UkfqJXAV5FaUJVxxg6Ykfx7Js8y+V4= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0 h1:GwJQTXs7pYPUv/fVf+0nBgsJdlrTuY/PfwQ/TRA/sIk= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0/go.mod h1:PGE3DcRgqYWWC2cq2hYZoET1d3Q8JZyPNmgvqXPFWEU= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0 h1:zdYZLiHHtDf4Kk9WU7mW9dW6WAXtBF54I5jmTMRJtiw= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0/go.mod h1:yFsgUM0PbUJkPlbpJfOG6da+YiF0Z80tv7YcnL3qwv4= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0 h1:Y4H+GaCQl2URp9mEJMV5CYOhw+erONqNyvtFoKQfIoA= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0/go.mod h1:g1RjfVD0gHAf/mPOIs3zBoKBeuDsN+rc5x0lZtgA8tI= -go.opentelemetry.io/collector/connector v0.102.0 h1:IvAsVfYRxP0ajmKbUovF8qugkcUtHq6RuYNtjcMa63E= -go.opentelemetry.io/collector/connector v0.102.0/go.mod h1:f4M7wZ/9+XtgTE0fivBFH3WlwntaEd0qFFA0giFkdnY= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/exporter/debugexporter v0.102.0 h1:b8z8EHdb3Q4f1A/lr6zP9aVv+7HTsouV0XCR8zb+R4w= -go.opentelemetry.io/collector/exporter/debugexporter v0.102.0/go.mod h1:fuFR9OIDtNe/ZGUp1YwrO2t0jy1/AIi4P93e+OoMCWA= -go.opentelemetry.io/collector/exporter/otlpexporter v0.102.0 h1:Nz2ULE5JfDj/houoV+VYSXTWP3/54/kCXH26WjJUNjI= -go.opentelemetry.io/collector/exporter/otlpexporter v0.102.0/go.mod h1:jaMS+3T8lwFc0jEjbqqOC+ArTwpGzR5De8u/jPncyKM= -go.opentelemetry.io/collector/exporter/otlphttpexporter v0.102.0 h1:ayoDBhSkXPrHO/L9MQKhZA/OCDZaOMEfosm+KMw4LBA= -go.opentelemetry.io/collector/exporter/otlphttpexporter v0.102.0/go.mod h1:9SN1giFZMQD0cWqYaBbUIjTnAI7/pWfEBwLosfHwWuY= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/extension/ballastextension v0.102.0 h1:p4gIucFZlTbV4VJ0zxUi8bkQFHnBCimYCe+nZwuPoHk= -go.opentelemetry.io/collector/extension/ballastextension v0.102.0/go.mod h1:hymqiVdV2Fu40lrXk8jm3uQsIFiUu2Fb8ptSzl5Emzw= -go.opentelemetry.io/collector/extension/zpagesextension v0.102.0 h1:BPq98py8nwzaV7KAsxt4ZZAF9LiSRu7ZjHNGavFNyKo= -go.opentelemetry.io/collector/extension/zpagesextension v0.102.0/go.mod h1:P86HW3x3epDS5F4yP0gAvsZiw4xxP1OupTEx2o6UqjY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/otelcol v0.102.0 h1:HuE+ok4iUjOrmYhQBSWpG5kBTVhcA24ljPL4pBERZ5E= -go.opentelemetry.io/collector/otelcol v0.102.0/go.mod h1:w8pCRu2nM/jAkLlEAS6ccKtJv5ylUQe6Ugl98zzTfyE= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/processor v0.102.0 h1:JsjTlpBRmoSYxcu3cAbKBchOmL6aNUxLa03ZkWIqZr8= -go.opentelemetry.io/collector/processor v0.102.0/go.mod h1:IaCSDcfy75uQTaOM+LgR1bMf/bUw2eFfzn20uvWYfLQ= -go.opentelemetry.io/collector/processor/batchprocessor v0.102.0 h1:lJSIMwip+Po5jOF/4dpx6c/3N45KJTr/UZoT086T4mI= -go.opentelemetry.io/collector/processor/batchprocessor v0.102.0/go.mod h1:e71Y6SnrCjD19dPjxWWi/kXa5tb0J8rC+9xl/72mLo4= -go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.102.0 h1:osoITPX0RITC8gJkyaNC6rqSKFl9wCeOqagjdNZUL70= -go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.102.0/go.mod h1:2OVM2IJOWVdxkOOt0WCyQSMv2T19OSKNIy1KCqHGXyY= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0 h1:eLc+AK0IQDDysrMt3SLwKaOFIjEwdO8ipwSck3+TUXE= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0/go.mod h1:p9yeFJktNrpwV9ATvaWeZwCMvVkVWnrfbJ4RHI/RS/I= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/collector/service v0.102.0 h1:B5nfyQZF7eB/y+yucl9G/7VsusbXixYXWingXn7VszM= -go.opentelemetry.io/collector/service v0.102.0/go.mod h1:c+0n0DfQeCjgrdplNHYwYbG/5aupTZVYU/50nMQraoc= -go.opentelemetry.io/contrib/config v0.7.0 h1:b1rK5tGTuhhPirJiMxOcyQfZs76j2VapY6ODn3b2Dbs= -go.opentelemetry.io/contrib/config v0.7.0/go.mod h1:8tdiFd8N5etOi3XzBmAoMxplEzI3TcL8dU5rM5/xcOQ= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 h1:vS1Ao/R55RNV4O7TA2Qopok8yN+X0LIP6RVWLFkprck= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0/go.mod h1:BMsdeOxN04K0L5FNUBfjFdvwWGNe/rkmSwH4Aelu/X0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/contrib/propagators/b3 v1.27.0 h1:IjgxbomVrV9za6bRi8fWCNXENs0co37SZedQilP2hm0= -go.opentelemetry.io/contrib/propagators/b3 v1.27.0/go.mod h1:Dv9obQz25lCisDvvs4dy28UPh974CxkahRDUPsY7y9E= -go.opentelemetry.io/contrib/zpages v0.52.0 h1:MPgkMy0Cp3O5EdfVXP0ss3ujhEibysTM4eszx7E7d+E= -go.opentelemetry.io/contrib/zpages v0.52.0/go.mod h1:fqG5AFdoYru3A3DnhibVuaaEfQV2WKxE7fYE1jgDRwk= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/bridge/opencensus v1.27.0 h1:ao9aGGHd+G4YfjBpGs6vbkvt5hoC67STlJA9fCnOAcs= -go.opentelemetry.io/otel/bridge/opencensus v1.27.0/go.mod h1:uRvWtAAXzyVOST0WMPX5JHGBaAvBws+2F8PcC5gMnTk= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 h1:bFgvUr3/O4PHj3VQcFEuYKvRZJX1SJDQ+11JXuSB3/w= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0/go.mod h1:xJntEd2KL6Qdg5lwp97HMLQDVeAhrYxmzFseAMDPQ8I= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 h1:CIHWikMsN3wO+wq1Tp5VGdVRTcON+DmOJSfDjXypKOc= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0/go.mod h1:TNupZ6cxqyFEpLXAZW7On+mLFL0/g0TE3unIYL91xWc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0 h1:/jlt1Y8gXWiHG9FBx6cJaIC5hYx5Fe64nC8w5Cylt/0= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0/go.mod h1:bmToOGOBZ4hA9ghphIc1PAf66VA8KOtsuy3+ScStG20= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 h1:/0YaXu3755A/cFbtXp+21lkXgI0QE5avTWA2HjU9/WE= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0/go.mod h1:m7SFxp0/7IxmJPLIY3JhOcU9CoFzDaCPL6xxQIxhA+o= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= -go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= -go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= -go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= -go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= -go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= -go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= -go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= -golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/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= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -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-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-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= -golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= -gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.169.0 h1:QwWPy71FgMWqJN/l6jVlFHUa29a7dcUy02I8o799nPY= -google.golang.org/api v0.169.0/go.mod h1:gpNOiMA2tZ4mf5R9Iwf4rK/Dcz0fbdIgWYWVoxmsyLg= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 h1:P8OJ/WCl/Xo4E4zoe4/bifHpSmmKwARqyqE4nW6J2GQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.29.3 h1:2ORfZ7+bGC3YJqGpV0KSDDEVf8hdGQ6A03/50vj8pmw= -k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80= -k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= -k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= -k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg= -k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= -k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= -k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -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= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/cmd/oteltestbedcol/main.go b/cmd/oteltestbedcol/main.go deleted file mode 100644 index 4ebbbba0c375..000000000000 --- a/cmd/oteltestbedcol/main.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by "go.opentelemetry.io/collector/cmd/builder". DO NOT EDIT. - -// Program oteltestbedcol is an OpenTelemetry Collector binary. -package main - -import ( - "log" - - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/confmap" - "go.opentelemetry.io/collector/confmap/converter/expandconverter" - envprovider "go.opentelemetry.io/collector/confmap/provider/envprovider" - fileprovider "go.opentelemetry.io/collector/confmap/provider/fileprovider" - httpprovider "go.opentelemetry.io/collector/confmap/provider/httpprovider" - httpsprovider "go.opentelemetry.io/collector/confmap/provider/httpsprovider" - yamlprovider "go.opentelemetry.io/collector/confmap/provider/yamlprovider" - "go.opentelemetry.io/collector/otelcol" -) - -func main() { - info := component.BuildInfo{ - Command: "oteltestbedcol", - Description: "OpenTelemetry Collector binary for testbed only tests.", - Version: "0.102.0-dev", - } - - set := otelcol.CollectorSettings{ - BuildInfo: info, - Factories: components, - ConfigProviderSettings: otelcol.ConfigProviderSettings{ - ResolverSettings: confmap.ResolverSettings{ - ProviderFactories: []confmap.ProviderFactory{ - envprovider.NewFactory(), - fileprovider.NewFactory(), - httpprovider.NewFactory(), - httpsprovider.NewFactory(), - yamlprovider.NewFactory(), - }, - ConverterFactories: []confmap.ConverterFactory{ - expandconverter.NewFactory(), - }, - }, - }, - } - - if err := run(set); err != nil { - log.Fatal(err) - } -} - -func runInteractive(params otelcol.CollectorSettings) error { - cmd := otelcol.NewCommand(params) - if err := cmd.Execute(); err != nil { - log.Fatalf("collector server run finished with error: %v", err) - } - - return nil -} diff --git a/cmd/oteltestbedcol/main_others.go b/cmd/oteltestbedcol/main_others.go deleted file mode 100644 index 3735aecb5867..000000000000 --- a/cmd/oteltestbedcol/main_others.go +++ /dev/null @@ -1,11 +0,0 @@ -// Code generated by "go.opentelemetry.io/collector/cmd/builder". DO NOT EDIT. - -//go:build !windows - -package main - -import "go.opentelemetry.io/collector/otelcol" - -func run(params otelcol.CollectorSettings) error { - return runInteractive(params) -} diff --git a/cmd/oteltestbedcol/main_windows.go b/cmd/oteltestbedcol/main_windows.go deleted file mode 100644 index bb68124a52c9..000000000000 --- a/cmd/oteltestbedcol/main_windows.go +++ /dev/null @@ -1,30 +0,0 @@ -// Code generated by "go.opentelemetry.io/collector/cmd/builder". DO NOT EDIT. - -//go:build windows - -package main - -import ( - "errors" - "fmt" - - "go.opentelemetry.io/collector/otelcol" - "golang.org/x/sys/windows" - "golang.org/x/sys/windows/svc" -) - -func run(params otelcol.CollectorSettings) error { - // No need to supply service name when startup is invoked through - // the Service Control Manager directly. - if err := svc.Run("", otelcol.NewSvcHandler(params)); err != nil { - if errors.Is(err, windows.ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) { - // Per https://learn.microsoft.com/en-us/windows/win32/api/winsvc/nf-winsvc-startservicectrldispatchera#return-value - // this means that the process is not running as a service, so run interactively. - return runInteractive(params) - } - - return fmt.Errorf("failed to start collector server: %w", err) - } - - return nil -} diff --git a/cmd/oteltestbedcol/metadata.yaml b/cmd/oteltestbedcol/metadata.yaml index ac90b5c56685..e7e25c98929b 100644 --- a/cmd/oteltestbedcol/metadata.yaml +++ b/cmd/oteltestbedcol/metadata.yaml @@ -3,4 +3,4 @@ type: oteltestbedcol status: class: cmd codeowners: - active: [] \ No newline at end of file + active: [] diff --git a/cmd/oteltestbedcol/package_test.go b/cmd/oteltestbedcol/package_test.go deleted file mode 100644 index ca84920f45f1..000000000000 --- a/cmd/oteltestbedcol/package_test.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "testing" - - "go.uber.org/goleak" -) - -func TestMain(m *testing.M) { - goleak.VerifyTestMain(m, goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start")) -} diff --git a/cmd/telemetrygen/Dockerfile b/cmd/telemetrygen/Dockerfile index ba1d577e41b4..9704d8f5da63 100644 --- a/cmd/telemetrygen/Dockerfile +++ b/cmd/telemetrygen/Dockerfile @@ -4,7 +4,8 @@ RUN apk --update add ca-certificates FROM scratch ARG USER_UID=10001 -USER ${USER_UID} +ARG USER_GID=10001 +USER ${USER_UID}:${USER_GID} ARG TARGETOS ARG TARGETARCH diff --git a/cmd/telemetrygen/README.md b/cmd/telemetrygen/README.md index 272a286f5868..eeed5c0c0fa5 100644 --- a/cmd/telemetrygen/README.md +++ b/cmd/telemetrygen/README.md @@ -8,8 +8,8 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Acmd%2Ftelemetrygen%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Acmd%2Ftelemetrygen) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Acmd%2Ftelemetrygen%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Acmd%2Ftelemetrygen) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@mx-psi](https://www.github.com/mx-psi), [@codeboten](https://www.github.com/codeboten) | -[development]: https://github.com/open-telemetry/opentelemetry-collector#development -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[development]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#development +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha This utility simulates a client generating **traces**, **metrics**, and **logs**. It is useful for testing and demonstration purposes. @@ -32,7 +32,7 @@ You can build locally the Docker image with: make docker-telemetrygen ``` -Using github actions, we also push a docker image on commit to main or on release to this [Github docker registry](https://github.com/open-telemetry/opentelemetry-collector-contrib/pkgs/container/opentelemetry-collector-contrib%2Ftelemetrygen). +Using github actions, we also push a docker image on commit to main or on release to this [Github docker registry](https://github.com/orgs/open-telemetry/packages/container/package/opentelemetry-collector-contrib%2Ftelemetrygen). ## Running diff --git a/cmd/telemetrygen/config.go b/cmd/telemetrygen/config.go index f20a758fffc9..80aaaaa1e5d4 100644 --- a/cmd/telemetrygen/config.go +++ b/cmd/telemetrygen/config.go @@ -76,7 +76,6 @@ func init() { // Disabling completion command for end user // https://github.com/spf13/cobra/blob/master/shell_completions.md rootCmd.CompletionOptions.DisableDefaultCmd = true - } // Execute tries to run the input command diff --git a/cmd/telemetrygen/go.mod b/cmd/telemetrygen/go.mod index 34a0ac20c65a..1e10d213108c 100644 --- a/cmd/telemetrygen/go.mod +++ b/cmd/telemetrygen/go.mod @@ -1,60 +1,58 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/cmd/telemetrygen -go 1.21.0 +go 1.22.7 require ( github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 - github.com/spf13/cobra v1.8.0 + github.com/spf13/cobra v1.8.1 github.com/spf13/pflag v1.0.5 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel v1.27.0 - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 - go.opentelemetry.io/otel/sdk v1.27.0 - go.opentelemetry.io/otel/sdk/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/semconv v0.116.0 + go.opentelemetry.io/otel v1.32.0 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 + go.opentelemetry.io/otel/log v0.8.0 + go.opentelemetry.io/otel/sdk v1.32.0 + go.opentelemetry.io/otel/sdk/log v0.8.0 + go.opentelemetry.io/otel/sdk/metric v1.32.0 + go.opentelemetry.io/otel/trace v1.32.0 + go.opentelemetry.io/proto/otlp v1.4.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 - golang.org/x/time v0.5.0 - google.golang.org/grpc v1.64.0 + golang.org/x/time v0.8.0 + google.golang.org/grpc v1.68.1 ) require ( github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.4 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/knadh/koanf/maps v0.1.1 // indirect - github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect - github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/confmap v0.102.0 // indirect - go.opentelemetry.io/otel/metric v1.27.0 // indirect - go.opentelemetry.io/proto/otlp v1.2.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.20.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/cmd/telemetrygen/go.sum b/cmd/telemetrygen/go.sum index 215ce176cea7..75c6945e353f 100644 --- a/cmd/telemetrygen/go.sum +++ b/cmd/telemetrygen/go.sum @@ -6,7 +6,7 @@ github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyY github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -17,13 +17,11 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -37,22 +35,18 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 h1:TmHmbvxPmaegwhDubVz0lICL0J5Ka2vwTzhoePEXsGE= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0/go.mod h1:qztMSjm835F2bXf+5HKAPIS5qsmQDqZna/PgVt4rWtI= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= -github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= -github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= -github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -61,10 +55,6 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -75,12 +65,12 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -89,42 +79,48 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 h1:bFgvUr3/O4PHj3VQcFEuYKvRZJX1SJDQ+11JXuSB3/w= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0/go.mod h1:xJntEd2KL6Qdg5lwp97HMLQDVeAhrYxmzFseAMDPQ8I= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 h1:CIHWikMsN3wO+wq1Tp5VGdVRTcON+DmOJSfDjXypKOc= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0/go.mod h1:TNupZ6cxqyFEpLXAZW7On+mLFL0/g0TE3unIYL91xWc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= -go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= -go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0 h1:WzNab7hOOLzdDF/EoWCt4glhrbMPVMOO5JYTmpz36Ls= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0/go.mod h1:hKvJwTzJdp90Vh7p6q/9PAOd55dI6WA6sWj62a/JvSs= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 h1:S+LdBGiQXtJdowoJoQPEtI52syEP/JYBUpjO49EQhV8= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0/go.mod h1:5KXybFvPGds3QinJWQT7pmXf+TN5YIa7CNYObWRkj50= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 h1:j7ZSD+5yn+lo3sGV69nW04rRR0jhYnBwjuX3r0HvnK0= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0/go.mod h1:WXbYJTUaZXAbYd8lbgGuvih0yuCfOFC5RJoYnoLcGz8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 h1:t/Qur3vKSkUCcDVaSumWF2PKHt85pc7fRvFuoVT8qFU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0/go.mod h1:Rl61tySSdcOJWoEgYZVtmnKdA0GeKrSqkHC1t+91CH8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 h1:IJFEoHiytixx8cMiVAO+GmHR6Frwu+u5Ur8njpFO6Ac= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0/go.mod h1:3rHrKNtLIoS0oZwkY2vxi+oJcwFRWdtUyRII+so45p8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 h1:9kV11HXBHZAvuPUZxmMWrH8hZn/6UnHX4K0mu36vNsU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0/go.mod h1:JyA0FHXe22E1NeNiHmVp7kFHglnexDQ7uRWDiiJ1hKQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 h1:cMyu9O88joYEaI47CnQkxO1XZdpoTF9fEnW2duIddhw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0/go.mod h1:6Am3rn7P9TVVeXYG+wtcGE7IE1tsQ+bP3AuWcKt/gOI= +go.opentelemetry.io/otel/log v0.8.0 h1:egZ8vV5atrUWUbnSsHn6vB8R21G2wrKqNiDt3iWertk= +go.opentelemetry.io/otel/log v0.8.0/go.mod h1:M9qvDdUTRCopJcGRKg57+JSQ9LgLBrwwfC32epk5NX8= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/log v0.8.0 h1:zg7GUYXqxk1jnGF/dTdLPrK06xJdrXgqgFLnI4Crxvs= +go.opentelemetry.io/otel/sdk/log v0.8.0/go.mod h1:50iXr0UVwQrYS45KbruFrEt4LvAdCaWWgIrsN3ZQggo= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.opentelemetry.io/proto/otlp v1.4.0 h1:TA9WRvW6zMwP+Ssb6fLoUIuirti1gGbP28GcKG1jgeg= +go.opentelemetry.io/proto/otlp v1.4.0/go.mod h1:PPBWZIP98o2ElSqI35IHfu7hIhSwvc5N38Jw8pXuGFY= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -153,8 +149,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -167,14 +163,14 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= +golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg= +golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -193,19 +189,19 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 h1:P8OJ/WCl/Xo4E4zoe4/bifHpSmmKwARqyqE4nW6J2GQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291 h1:AgADTJarZTBqgjiUzRgfaBchgYB3/WFTC80GPwsMcRI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697 h1:pgr/4QbFyktUv9CtQ/Fq4gzEE6/Xs7iCXbktaGzLHbQ= +google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697/go.mod h1:+D9ySVjN8nY8YCVjc5O7PZDIdZporIDY3KaGfJunh88= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697 h1:LWZqQOEjDyONlF1H6afSWpAL/znlREo2tHfLoe+8LMA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/cmd/telemetrygen/internal/common/config.go b/cmd/telemetrygen/internal/common/config.go index cfe9a432e90a..c6592b6fa582 100644 --- a/cmd/telemetrygen/internal/common/config.go +++ b/cmd/telemetrygen/internal/common/config.go @@ -5,6 +5,7 @@ package common import ( "fmt" + "strconv" "strings" "time" @@ -22,7 +23,7 @@ const ( defaultHTTPEndpoint = "localhost:4318" ) -type KeyValue map[string]string +type KeyValue map[string]any var _ pflag.Value = (*KeyValue)(nil) @@ -36,6 +37,14 @@ func (v *KeyValue) Set(s string) error { return errFormatOTLPAttributes } val := kv[1] + if val == "true" { + (*v)[kv[0]] = true + return nil + } + if val == "false" { + (*v)[kv[0]] = false + return nil + } if len(val) < 2 || !strings.HasPrefix(val, "\"") || !strings.HasSuffix(val, "\"") { return errDoubleQuotesOTLPAttributes } @@ -45,12 +54,12 @@ func (v *KeyValue) Set(s string) error { } func (v *KeyValue) Type() string { - return "map[string]string" + return "map[string]any" } type Config struct { WorkerCount int - Rate int64 + Rate float64 TotalDuration time.Duration ReportingInterval time.Duration SkipSettingGRPCLogger bool @@ -94,8 +103,13 @@ func (c *Config) GetAttributes() []attribute.KeyValue { var attributes []attribute.KeyValue if len(c.ResourceAttributes) > 0 { - for k, v := range c.ResourceAttributes { - attributes = append(attributes, attribute.String(k, v)) + for k, t := range c.ResourceAttributes { + switch v := t.(type) { + case string: + attributes = append(attributes, attribute.String(k, v)) + case bool: + attributes = append(attributes, attribute.Bool(k, v)) + } } } return attributes @@ -105,17 +119,37 @@ func (c *Config) GetTelemetryAttributes() []attribute.KeyValue { var attributes []attribute.KeyValue if len(c.TelemetryAttributes) > 0 { - for k, v := range c.TelemetryAttributes { - attributes = append(attributes, attribute.String(k, v)) + for k, t := range c.TelemetryAttributes { + switch v := t.(type) { + case string: + attributes = append(attributes, attribute.String(k, v)) + case bool: + attributes = append(attributes, attribute.Bool(k, v)) + } } } return attributes } +func (c *Config) GetHeaders() map[string]string { + m := make(map[string]string, len(c.Headers)) + + for k, t := range c.Headers { + switch v := t.(type) { + case bool: + m[k] = strconv.FormatBool(v) + case string: + m[k] = v + } + } + + return m +} + // CommonFlags registers common config flags. func (c *Config) CommonFlags(fs *pflag.FlagSet) { fs.IntVar(&c.WorkerCount, "workers", 1, "Number of workers (goroutines) to run") - fs.Int64Var(&c.Rate, "rate", 0, "Approximately how many metrics per second each worker should generate. Zero means no throttling.") + fs.Float64Var(&c.Rate, "rate", 0, "Approximately how many metrics/spans/logs per second each worker should generate. Zero means no throttling.") fs.DurationVar(&c.TotalDuration, "duration", 0, "For how long to run the test") fs.DurationVar(&c.ReportingInterval, "interval", 1*time.Second, "Reporting interval") @@ -125,21 +159,23 @@ func (c *Config) CommonFlags(fs *pflag.FlagSet) { fs.BoolVar(&c.UseHTTP, "otlp-http", false, "Whether to use HTTP exporter rather than a gRPC one") // custom headers - c.Headers = make(map[string]string) + c.Headers = make(KeyValue) fs.Var(&c.Headers, "otlp-header", "Custom header to be passed along with each OTLP request. The value is expected in the format key=\"value\". "+ "Note you may need to escape the quotes when using the tool from a cli. "+ `Flag may be repeated to set multiple headers (e.g --otlp-header key1=\"value1\" --otlp-header key2=\"value2\")`) // custom resource attributes - c.ResourceAttributes = make(map[string]string) + c.ResourceAttributes = make(KeyValue) fs.Var(&c.ResourceAttributes, "otlp-attributes", "Custom resource attributes to use. The value is expected in the format key=\"value\". "+ + "You can use key=true or key=false. to set boolean attribute."+ "Note you may need to escape the quotes when using the tool from a cli. "+ - `Flag may be repeated to set multiple attributes (e.g --otlp-attributes key1=\"value1\" --otlp-attributes key2=\"value2\")`) + `Flag may be repeated to set multiple attributes (e.g --otlp-attributes key1=\"value1\" --otlp-attributes key2=\"value2\" --telemetry-attributes key3=true)`) - c.TelemetryAttributes = make(map[string]string) + c.TelemetryAttributes = make(KeyValue) fs.Var(&c.TelemetryAttributes, "telemetry-attributes", "Custom telemetry attributes to use. The value is expected in the format key=\"value\". "+ + "You can use key=true or key=false. to set boolean attribute."+ "Note you may need to escape the quotes when using the tool from a cli. "+ - `Flag may be repeated to set multiple attributes (e.g --telemetry-attributes key1=\"value1\" --telemetry-attributes key2=\"value2\")`) + `Flag may be repeated to set multiple attributes (e.g --telemetry-attributes key1=\"value1\" --telemetry-attributes key2=\"value2\" --telemetry-attributes key3=true)`) // TLS CA configuration fs.StringVar(&c.CaFile, "ca-cert", "", "Trusted Certificate Authority to verify server certificate") diff --git a/cmd/telemetrygen/internal/common/config_test.go b/cmd/telemetrygen/internal/common/config_test.go index ebdcd0af6a78..88db86c540ae 100644 --- a/cmd/telemetrygen/internal/common/config_test.go +++ b/cmd/telemetrygen/internal/common/config_test.go @@ -17,11 +17,11 @@ func TestKeyValueSet(t *testing.T) { }{ { flag: "key=\"value\"", - expected: KeyValue(map[string]string{"key": "value"}), + expected: KeyValue(map[string]any{"key": "value"}), }, { flag: "key=\"\"", - expected: KeyValue(map[string]string{"key": ""}), + expected: KeyValue(map[string]any{"key": ""}), }, { flag: "key=\"", @@ -35,11 +35,19 @@ func TestKeyValueSet(t *testing.T) { flag: "key", err: errFormatOTLPAttributes, }, + { + flag: "key=true", + expected: KeyValue(map[string]any{"key": true}), + }, + { + flag: "key=false", + expected: KeyValue(map[string]any{"key": false}), + }, } for _, tt := range tests { t.Run(tt.flag, func(t *testing.T) { - kv := KeyValue(make(map[string]string)) + kv := KeyValue(make(map[string]any)) err := kv.Set(tt.flag) if err != nil || tt.err != nil { assert.Equal(t, err, tt.err) diff --git a/cmd/telemetrygen/internal/common/tls_utils.go b/cmd/telemetrygen/internal/common/tls_utils.go index 286d7345adc1..6759541ec508 100644 --- a/cmd/telemetrygen/internal/common/tls_utils.go +++ b/cmd/telemetrygen/internal/common/tls_utils.go @@ -28,52 +28,37 @@ func caPool(caFile string) (*x509.CertPool, error) { return pool, nil } -func GetTLSCredentialsForGRPCExporter(caFile string, cAuth ClientAuth) (credentials.TransportCredentials, error) { - - pool, err := caPool(caFile) +func GetTLSCredentialsForGRPCExporter( + caFile string, + cAuth ClientAuth, + insecureSkipVerify bool, +) (credentials.TransportCredentials, error) { + tlsConfig, err := getTLSConfig(caFile, cAuth, insecureSkipVerify) if err != nil { return nil, err } + return credentials.NewTLS(tlsConfig), nil +} - var creds credentials.TransportCredentials - - if caFile != "" { - creds = credentials.NewTLS(&tls.Config{ - RootCAs: pool, - }) - } else { - creds = credentials.NewTLS(&tls.Config{}) - } - - // Configuration for mTLS - if cAuth.Enabled { - keypair, err := tls.LoadX509KeyPair(cAuth.ClientCertFile, cAuth.ClientKeyFile) - if err != nil { - return nil, err - } - creds = credentials.NewTLS(&tls.Config{ - RootCAs: pool, - Certificates: []tls.Certificate{keypair}, - }) - } - - return creds, nil +func GetTLSCredentialsForHTTPExporter( + caFile string, + cAuth ClientAuth, + insecureSkipVerify bool, +) (*tls.Config, error) { + return getTLSConfig(caFile, cAuth, insecureSkipVerify) } -func GetTLSCredentialsForHTTPExporter(caFile string, cAuth ClientAuth) (*tls.Config, error) { - pool, err := caPool(caFile) - if err != nil { - return nil, err +func getTLSConfig(caFile string, cAuth ClientAuth, insecureSkipVerify bool) (*tls.Config, error) { + tlsCfg := tls.Config{ + InsecureSkipVerify: insecureSkipVerify, } - var tlsCfg tls.Config - if caFile != "" { - tlsCfg = tls.Config{ - RootCAs: pool, + pool, err := caPool(caFile) + if err != nil { + return nil, err } - } else { - tlsCfg = tls.Config{} + tlsCfg.RootCAs = pool } // Configuration for mTLS @@ -82,7 +67,6 @@ func GetTLSCredentialsForHTTPExporter(caFile string, cAuth ClientAuth) (*tls.Con if err != nil { return nil, err } - tlsCfg.ClientAuth = tls.RequireAndVerifyClientCert tlsCfg.Certificates = []tls.Certificate{keypair} } return &tlsCfg, nil diff --git a/cmd/telemetrygen/internal/common/validate.go b/cmd/telemetrygen/internal/common/validate.go index 19a70ba230f2..b9441f8f22e3 100644 --- a/cmd/telemetrygen/internal/common/validate.go +++ b/cmd/telemetrygen/internal/common/validate.go @@ -9,15 +9,15 @@ import ( ) var ( - errInvalidTraceIDLenght = fmt.Errorf("TraceID must be a 32 character hex string, like: 'ae87dadd90e9935a4bc9660628efd569'") - errInvalidSpanIDLenght = fmt.Errorf("SpanID must be a 16 character hex string, like: '5828fa4960140870'") + errInvalidTraceIDLength = fmt.Errorf("TraceID must be a 32 character hex string, like: 'ae87dadd90e9935a4bc9660628efd569'") + errInvalidSpanIDLength = fmt.Errorf("SpanID must be a 16 character hex string, like: '5828fa4960140870'") errInvalidTraceID = fmt.Errorf("failed to create traceID byte array from the given traceID, make sure the traceID is a hex representation of a [16]byte, like: 'ae87dadd90e9935a4bc9660628efd569'") errInvalidSpanID = fmt.Errorf("failed to create SpanID byte array from the given SpanID, make sure the SpanID is a hex representation of a [8]byte, like: '5828fa4960140870'") ) func ValidateTraceID(traceID string) error { if len(traceID) != 32 { - return errInvalidTraceIDLenght + return errInvalidTraceIDLength } _, err := hex.DecodeString(traceID) @@ -30,7 +30,7 @@ func ValidateTraceID(traceID string) error { func ValidateSpanID(spanID string) error { if len(spanID) != 16 { - return errInvalidSpanIDLenght + return errInvalidSpanIDLength } _, err := hex.DecodeString(spanID) if err != nil { diff --git a/cmd/telemetrygen/internal/common/validate_test.go b/cmd/telemetrygen/internal/common/validate_test.go index 62e199725a00..54134fa667e1 100644 --- a/cmd/telemetrygen/internal/common/validate_test.go +++ b/cmd/telemetrygen/internal/common/validate_test.go @@ -23,7 +23,7 @@ func TestValidateTraceID(t *testing.T) { { name: "InvalidLength", traceID: "invalid-length", - expected: errInvalidTraceIDLenght, + expected: errInvalidTraceIDLength, }, { name: "InvalidTraceID", @@ -53,7 +53,7 @@ func TestValidateSpanID(t *testing.T) { { name: "InvalidLength", spanID: "invalid-length", - expected: errInvalidSpanIDLenght, + expected: errInvalidSpanIDLength, }, { name: "InvalidTraceID", diff --git a/cmd/telemetrygen/internal/e2etest/e2e_test.go b/cmd/telemetrygen/internal/e2etest/e2e_test.go index 6cd5067186f6..0d76261a9350 100644 --- a/cmd/telemetrygen/internal/e2etest/e2e_test.go +++ b/cmd/telemetrygen/internal/e2etest/e2e_test.go @@ -8,6 +8,7 @@ import ( "testing" "time" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/consumer/consumertest" @@ -25,7 +26,7 @@ func TestGenerateTraces(t *testing.T) { rCfg := f.CreateDefaultConfig() endpoint := testutil.GetAvailableLocalAddress(t) rCfg.(*otlpreceiver.Config).GRPC.NetAddr.Endpoint = endpoint - r, err := f.CreateTracesReceiver(context.Background(), receivertest.NewNopCreateSettings(), rCfg, sink) + r, err := f.CreateTraces(context.Background(), receivertest.NewNopSettings(), rCfg, sink) require.NoError(t, err) err = r.Start(context.Background(), componenttest.NewNopHost()) require.NoError(t, err) @@ -53,7 +54,7 @@ func TestGenerateTraces(t *testing.T) { } go func() { err = traces.Start(cfg) - require.NoError(t, err) + assert.NoError(t, err) }() require.Eventually(t, func() bool { return len(sink.AllTraces()) > 0 diff --git a/cmd/telemetrygen/internal/e2etest/go.mod b/cmd/telemetrygen/internal/e2etest/go.mod index 6e91c03de684..45542b08f76b 100644 --- a/cmd/telemetrygen/internal/e2etest/go.mod +++ b/cmd/telemetrygen/internal/e2etest/go.mod @@ -1,88 +1,93 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/cmd/telemetrygen/internal/e2etest -go 1.21.0 +go 1.22.7 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/cmd/telemetrygen v0.101.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.101.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/receiver v0.102.0 - go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0 + github.com/open-telemetry/opentelemetry-collector-contrib/cmd/telemetrygen v0.115.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.115.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/receiver/otlpreceiver v0.116.0 + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.6.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/mostynb/go-grpc-compression v1.2.2 // indirect + github.com/mostynb/go-grpc-compression v1.2.3 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/rs/cors v1.10.1 // indirect + github.com/rs/cors v1.11.1 // indirect github.com/spf13/pflag v1.0.5 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/configgrpc v0.102.0 // indirect - go.opentelemetry.io/collector/config/confighttp v0.102.0 // indirect - go.opentelemetry.io/collector/config/confignet v0.102.0 // indirect - go.opentelemetry.io/collector/config/configopaque v1.9.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/confmap v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/metric v1.27.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - go.opentelemetry.io/otel/trace v1.27.0 // indirect - go.opentelemetry.io/proto/otlp v1.2.0 // indirect + go.opentelemetry.io/collector v0.116.0 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/component v0.116.0 // indirect + go.opentelemetry.io/collector/component/componentstatus v0.116.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/configgrpc v0.116.0 // indirect + go.opentelemetry.io/collector/config/confighttp v0.116.0 // indirect + go.opentelemetry.io/collector/config/confignet v1.22.0 // indirect + go.opentelemetry.io/collector/config/configopaque v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/configtls v1.22.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/confmap v1.22.0 // indirect + go.opentelemetry.io/collector/consumer v1.22.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/internal/sharedcomponent v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + go.opentelemetry.io/proto/otlp v1.4.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - golang.org/x/time v0.5.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + golang.org/x/time v0.8.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/cmd/telemetrygen/internal/e2etest/go.sum b/cmd/telemetrygen/internal/e2etest/go.sum index bcc25e28a551..aefe0fabd214 100644 --- a/cmd/telemetrygen/internal/e2etest/go.sum +++ b/cmd/telemetrygen/internal/e2etest/go.sum @@ -1,13 +1,9 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -19,18 +15,18 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -50,22 +46,22 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 h1:TmHmbvxPmaegwhDubVz0lICL0J5Ka2vwTzhoePEXsGE= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0/go.mod h1:qztMSjm835F2bXf+5HKAPIS5qsmQDqZna/PgVt4rWtI= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -83,25 +79,19 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mostynb/go-grpc-compression v1.2.2 h1:XaDbnRvt2+1vgr0b/l0qh4mJAfIxE0bKXtz2Znl3GGI= -github.com/mostynb/go-grpc-compression v1.2.2/go.mod h1:GOCr2KBxXcblCuczg3YdLQlcin1/NfyDA348ckuCH6w= +github.com/mostynb/go-grpc-compression v1.2.3 h1:42/BKWMy0KEJGSdWvzqIyOZ95YcR9mLPqKctH7Uo//I= +github.com/mostynb/go-grpc-compression v1.2.3/go.mod h1:AghIxF3P57umzqM9yz795+y1Vjs47Km/Y2FE6ouQ7Lg= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= @@ -111,84 +101,96 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/configgrpc v0.102.0 h1:cQi5HwpkHvrZJUxZjoGXkWpAuK+gEyp/1Zjn0BrkvmQ= -go.opentelemetry.io/collector/config/configgrpc v0.102.0/go.mod h1:ASpBXzDWLiDGlG8iRFovU5R4LhAefoC4ajm+qIdslOw= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/confignet v0.102.0 h1:+wQevJ/iBnPxL+roY7WWnAjMxB8v4M5QrS3+0iEmauw= -go.opentelemetry.io/collector/config/confignet v0.102.0/go.mod h1:pfOrCTfSZEB6H2rKtx41/3RN4dKs+X2EKQbw3MGRh0E= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0 h1:eLc+AK0IQDDysrMt3SLwKaOFIjEwdO8ipwSck3+TUXE= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0/go.mod h1:p9yeFJktNrpwV9ATvaWeZwCMvVkVWnrfbJ4RHI/RS/I= -go.opentelemetry.io/contrib/config v0.7.0 h1:b1rK5tGTuhhPirJiMxOcyQfZs76j2VapY6ODn3b2Dbs= -go.opentelemetry.io/contrib/config v0.7.0/go.mod h1:8tdiFd8N5etOi3XzBmAoMxplEzI3TcL8dU5rM5/xcOQ= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 h1:vS1Ao/R55RNV4O7TA2Qopok8yN+X0LIP6RVWLFkprck= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0/go.mod h1:BMsdeOxN04K0L5FNUBfjFdvwWGNe/rkmSwH4Aelu/X0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 h1:bFgvUr3/O4PHj3VQcFEuYKvRZJX1SJDQ+11JXuSB3/w= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0/go.mod h1:xJntEd2KL6Qdg5lwp97HMLQDVeAhrYxmzFseAMDPQ8I= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 h1:CIHWikMsN3wO+wq1Tp5VGdVRTcON+DmOJSfDjXypKOc= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0/go.mod h1:TNupZ6cxqyFEpLXAZW7On+mLFL0/g0TE3unIYL91xWc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0 h1:/jlt1Y8gXWiHG9FBx6cJaIC5hYx5Fe64nC8w5Cylt/0= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0/go.mod h1:bmToOGOBZ4hA9ghphIc1PAf66VA8KOtsuy3+ScStG20= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 h1:/0YaXu3755A/cFbtXp+21lkXgI0QE5avTWA2HjU9/WE= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0/go.mod h1:m7SFxp0/7IxmJPLIY3JhOcU9CoFzDaCPL6xxQIxhA+o= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= -go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= -go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= +go.opentelemetry.io/collector v0.116.0 h1:Dscd6Nsnc7hjFQosO0SofcPQsXRfcj5N5PjQAslnmj4= +go.opentelemetry.io/collector v0.116.0/go.mod h1:Ug2hpW0SINPmJAGVEALRlux78NTZc3YXSuh5/Q/hFrA= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/configgrpc v0.116.0 h1:O8Y1X9wDH5dDdqDJ9kqoaMrxEauaDSJBg9aNC6QgB7g= +go.opentelemetry.io/collector/config/configgrpc v0.116.0/go.mod h1:RPrSQrr6xhIaAK2DdcECi142NjSo0npQfVQB3nommSo= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/confignet v1.22.0 h1:SBEMHJZWD8J4qgFw1O+BEkXW9AWldDi6Fz5YeDeoU58= +go.opentelemetry.io/collector/config/confignet v1.22.0/go.mod h1:ZppUH1hgUJOubawEsxsQ9MzEYFytqo2GnVSS7d4CVxc= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/internal/sharedcomponent v0.116.0 h1:5QhpnwgogQhBrcsOjk1Yhkugopj043XlSDB1lpHKCGo= +go.opentelemetry.io/collector/internal/sharedcomponent v0.116.0/go.mod h1:wMQM1Sqbj6J6jNVBb5hawkCfmqrLJ0hAeDKkalUfrEY= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.116.0 h1:81u+wJsQp9VfrAdVpVvcV31YAs8qsZp/UnMmG9YCJ0A= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.116.0/go.mod h1:JXIwjUyh3Q+gNvr7YE937se4/E4UJ/oz5z9xbJeVl3M= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 h1:yMkBS9yViCc7U7yeLzJPM2XizlfdVvBRSmsQDWu6qc0= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0/go.mod h1:n8MR6/liuGB5EmTETUBeU5ZgqMOlqKRxUaqPQBOANZ8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 h1:IJFEoHiytixx8cMiVAO+GmHR6Frwu+u5Ur8njpFO6Ac= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0/go.mod h1:3rHrKNtLIoS0oZwkY2vxi+oJcwFRWdtUyRII+so45p8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 h1:9kV11HXBHZAvuPUZxmMWrH8hZn/6UnHX4K0mu36vNsU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0/go.mod h1:JyA0FHXe22E1NeNiHmVp7kFHglnexDQ7uRWDiiJ1hKQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 h1:cMyu9O88joYEaI47CnQkxO1XZdpoTF9fEnW2duIddhw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0/go.mod h1:6Am3rn7P9TVVeXYG+wtcGE7IE1tsQ+bP3AuWcKt/gOI= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.opentelemetry.io/proto/otlp v1.4.0 h1:TA9WRvW6zMwP+Ssb6fLoUIuirti1gGbP28GcKG1jgeg= +go.opentelemetry.io/proto/otlp v1.4.0/go.mod h1:PPBWZIP98o2ElSqI35IHfu7hIhSwvc5N38Jw8pXuGFY= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -217,8 +219,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -231,14 +233,14 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg= +golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -257,19 +259,19 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 h1:P8OJ/WCl/Xo4E4zoe4/bifHpSmmKwARqyqE4nW6J2GQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697 h1:pgr/4QbFyktUv9CtQ/Fq4gzEE6/Xs7iCXbktaGzLHbQ= +google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697/go.mod h1:+D9ySVjN8nY8YCVjc5O7PZDIdZporIDY3KaGfJunh88= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697 h1:LWZqQOEjDyONlF1H6afSWpAL/znlREo2tHfLoe+8LMA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/cmd/telemetrygen/internal/logs/config.go b/cmd/telemetrygen/internal/logs/config.go index 6a619b51223b..dd17973bb66d 100644 --- a/cmd/telemetrygen/internal/logs/config.go +++ b/cmd/telemetrygen/internal/logs/config.go @@ -4,6 +4,8 @@ package logs import ( + "fmt" + "github.com/spf13/pflag" "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/telemetrygen/internal/common" @@ -36,6 +38,10 @@ func (c *Config) Flags(fs *pflag.FlagSet) { // Validate validates the test scenario parameters. func (c *Config) Validate() error { + if c.TotalDuration <= 0 && c.NumLogs <= 0 { + return fmt.Errorf("either `logs` or `duration` must be greater than 0") + } + if c.TraceID != "" { if err := common.ValidateTraceID(c.TraceID); err != nil { return err diff --git a/cmd/telemetrygen/internal/logs/exporter.go b/cmd/telemetrygen/internal/logs/exporter.go index dbecda7b8981..9543a45370cd 100644 --- a/cmd/telemetrygen/internal/logs/exporter.go +++ b/cmd/telemetrygen/internal/logs/exporter.go @@ -4,119 +4,63 @@ package logs import ( - "bytes" - "context" "fmt" - "io" - "net/http" - "go.opentelemetry.io/collector/pdata/plog" - "go.opentelemetry.io/collector/pdata/plog/plogotlp" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" - "google.golang.org/grpc/metadata" + "go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc" + "go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp" "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/telemetrygen/internal/common" ) -type exporter interface { - export(plog.Logs) error -} - -func newExporter(cfg *Config) (exporter, error) { - if cfg.UseHTTP { - if cfg.Insecure { - return &httpClientExporter{ - client: http.DefaultClient, - cfg: cfg, - }, nil - } - creds, err := common.GetTLSCredentialsForHTTPExporter(cfg.CaFile, cfg.ClientAuth) - if err != nil { - return nil, fmt.Errorf("failed to get TLS credentials: %w", err) - } - return &httpClientExporter{ - client: &http.Client{Transport: &http.Transport{TLSClientConfig: creds}}, - cfg: cfg, - }, nil +// grpcExporterOptions creates the configuration options for a gRPC-based OTLP log exporter. +// It configures the exporter with the provided endpoint, connection security settings, and headers. +func grpcExporterOptions(cfg *Config) ([]otlploggrpc.Option, error) { + grpcExpOpt := []otlploggrpc.Option{ + otlploggrpc.WithEndpoint(cfg.Endpoint()), } - // Exporter with GRPC - var err error - var clientConn *grpc.ClientConn if cfg.Insecure { - clientConn, err = grpc.NewClient(cfg.Endpoint(), grpc.WithTransportCredentials(insecure.NewCredentials())) - if err != nil { - return nil, err - } + grpcExpOpt = append(grpcExpOpt, otlploggrpc.WithInsecure()) } else { - creds, err := common.GetTLSCredentialsForGRPCExporter(cfg.CaFile, cfg.ClientAuth) + credentials, err := common.GetTLSCredentialsForGRPCExporter( + cfg.CaFile, cfg.ClientAuth, cfg.InsecureSkipVerify, + ) if err != nil { return nil, fmt.Errorf("failed to get TLS credentials: %w", err) } - clientConn, err = grpc.NewClient(cfg.Endpoint(), grpc.WithTransportCredentials(creds)) - if err != nil { - return nil, err - } + grpcExpOpt = append(grpcExpOpt, otlploggrpc.WithTLSCredentials(credentials)) } - return &gRPCClientExporter{client: plogotlp.NewGRPCClient(clientConn), cfg: cfg}, nil -} -type gRPCClientExporter struct { - client plogotlp.GRPCClient - cfg *Config -} - -func (e *gRPCClientExporter) export(logs plog.Logs) error { - md := metadata.New(map[string]string{}) - for k, v := range e.cfg.Headers { - md.Set(k, v) - } - ctx := metadata.NewOutgoingContext(context.Background(), md) - req := plogotlp.NewExportRequestFromLogs(logs) - if _, err := e.client.Export(ctx, req); err != nil { - return err + if len(cfg.Headers) > 0 { + grpcExpOpt = append(grpcExpOpt, otlploggrpc.WithHeaders(cfg.GetHeaders())) } - return nil -} -type httpClientExporter struct { - client *http.Client - cfg *Config + return grpcExpOpt, nil } -func (e *httpClientExporter) export(logs plog.Logs) error { - scheme := "https" - if e.cfg.Insecure { - scheme = "http" +// httpExporterOptions creates the configuration options for an HTTP-based OTLP log exporter. +// It configures the exporter with the provided endpoint, URL path, connection security settings, and headers. +func httpExporterOptions(cfg *Config) ([]otlploghttp.Option, error) { + httpExpOpt := []otlploghttp.Option{ + otlploghttp.WithEndpoint(cfg.Endpoint()), + otlploghttp.WithURLPath(cfg.HTTPPath), } - path := e.cfg.HTTPPath - url := fmt.Sprintf("%s://%s%s", scheme, e.cfg.Endpoint(), path) - req := plogotlp.NewExportRequestFromLogs(logs) - body, err := req.MarshalProto() - if err != nil { - return fmt.Errorf("failed to marshal logs to protobuf: %w", err) + if cfg.Insecure { + httpExpOpt = append(httpExpOpt, otlploghttp.WithInsecure()) + } else { + tlsCfg, err := common.GetTLSCredentialsForHTTPExporter( + cfg.CaFile, cfg.ClientAuth, cfg.InsecureSkipVerify, + ) + if err != nil { + return nil, fmt.Errorf("failed to get TLS credentials: %w", err) + } + httpExpOpt = append(httpExpOpt, otlploghttp.WithTLSClientConfig(tlsCfg)) } - httpReq, err := http.NewRequestWithContext(context.Background(), "POST", url, bytes.NewReader(body)) - if err != nil { - return fmt.Errorf("failed to create logs HTTP request: %w", err) - } - for k, v := range e.cfg.Headers { - httpReq.Header.Set(k, v) - } - httpReq.Header.Set("Content-Type", "application/x-protobuf") - resp, err := e.client.Do(httpReq) - if err != nil { - return fmt.Errorf("failed to execute logs HTTP request: %w", err) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - var respData bytes.Buffer - _, _ = io.Copy(&respData, resp.Body) - return fmt.Errorf("log request failed with status %s (%s)", resp.Status, respData.String()) + if len(cfg.Headers) > 0 { + httpExpOpt = append(httpExpOpt, otlploghttp.WithHeaders(cfg.GetHeaders())) } - return nil + return httpExpOpt, nil } diff --git a/cmd/telemetrygen/internal/logs/logs.go b/cmd/telemetrygen/internal/logs/logs.go index 2f0d1cd6b306..ff428fc93e1b 100644 --- a/cmd/telemetrygen/internal/logs/logs.go +++ b/cmd/telemetrygen/internal/logs/logs.go @@ -4,12 +4,17 @@ package logs import ( + "context" "fmt" "sync" "sync/atomic" "time" "go.opentelemetry.io/collector/pdata/plog" + "go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc" + "go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp" + "go.opentelemetry.io/otel/log" + sdklog "go.opentelemetry.io/otel/sdk/log" "go.opentelemetry.io/otel/sdk/resource" semconv "go.opentelemetry.io/otel/semconv/v1.4.0" "go.uber.org/zap" @@ -24,19 +29,37 @@ func Start(cfg *Config) error { if err != nil { return err } - - e, err := newExporter(cfg) - if err != nil { - return err - } - - if err = cfg.Validate(); err != nil { - logger.Error("failed to validate the parameters for the test scenario.", zap.Error(err)) - return err + expFunc := func() (sdklog.Exporter, error) { + var exp sdklog.Exporter + if cfg.UseHTTP { + var exporterOpts []otlploghttp.Option + + logger.Info("starting HTTP exporter") + exporterOpts, err = httpExporterOptions(cfg) + if err != nil { + return nil, err + } + exp, err = otlploghttp.New(context.Background(), exporterOpts...) + if err != nil { + return nil, fmt.Errorf("failed to obtain OTLP HTTP exporter: %w", err) + } + } else { + var exporterOpts []otlploggrpc.Option + + logger.Info("starting gRPC exporter") + exporterOpts, err = grpcExporterOptions(cfg) + if err != nil { + return nil, err + } + exp, err = otlploggrpc.New(context.Background(), exporterOpts...) + if err != nil { + return nil, fmt.Errorf("failed to obtain OTLP gRPC exporter: %w", err) + } + } + return exp, err } - if err = Run(cfg, e, logger); err != nil { - logger.Error("failed to execute the test scenario.", zap.Error(err)) + if err = Run(cfg, expFunc, logger); err != nil { return err } @@ -44,11 +67,13 @@ func Start(cfg *Config) error { } // Run executes the test scenario. -func Run(c *Config, exp exporter, logger *zap.Logger) error { +func Run(c *Config, exp func() (sdklog.Exporter, error), logger *zap.Logger) error { + if err := c.Validate(); err != nil { + return err + } + if c.TotalDuration > 0 { c.NumLogs = 0 - } else if c.NumLogs <= 0 { - return fmt.Errorf("either `logs` or `duration` must be greater than 0") } limit := rate.Limit(c.Rate) @@ -97,14 +122,12 @@ func Run(c *Config, exp exporter, logger *zap.Logger) error { return nil } -func parseSeverity(severityText string, severityNumber int32) (string, plog.SeverityNumber, error) { - // severityNumber must range in [1,24] - if severityNumber <= 0 || severityNumber >= 25 { - return "", 0, fmt.Errorf("severity-number is out of range, the valid range is [1,24]") +func parseSeverity(severityText string, severityNumber int32) (string, log.Severity, error) { + sn := log.Severity(severityNumber) + if sn < log.SeverityTrace1 || sn > log.SeverityFatal4 { + return "", log.SeverityUndefined, fmt.Errorf("severity-number is out of range, the valid range is [1,24]") } - sn := plog.SeverityNumber(severityNumber) - // severity number should match well-known severityText switch severityText { case plog.SeverityNumberTrace.String(): diff --git a/cmd/telemetrygen/internal/logs/worker.go b/cmd/telemetrygen/internal/logs/worker.go index 118a4784f443..d259e0abc8a1 100644 --- a/cmd/telemetrygen/internal/logs/worker.go +++ b/cmd/telemetrygen/internal/logs/worker.go @@ -10,80 +10,92 @@ import ( "sync/atomic" "time" - "go.opentelemetry.io/collector/pdata/pcommon" - "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/log" + sdklog "go.opentelemetry.io/otel/sdk/log" + "go.opentelemetry.io/otel/sdk/log/logtest" "go.opentelemetry.io/otel/sdk/resource" + "go.opentelemetry.io/otel/trace" "go.uber.org/zap" "golang.org/x/time/rate" ) type worker struct { - running *atomic.Bool // pointer to shared flag that indicates it's time to stop the test - numLogs int // how many logs the worker has to generate (only when duration==0) - body string // the body of the log - severityNumber plog.SeverityNumber // the severityNumber of the log - severityText string // the severityText of the log - totalDuration time.Duration // how long to run the test for (overrides `numLogs`) - limitPerSecond rate.Limit // how many logs per second to generate - wg *sync.WaitGroup // notify when done - logger *zap.Logger // logger - index int // worker index - traceID string // traceID string - spanID string // spanID string + running *atomic.Bool // pointer to shared flag that indicates it's time to stop the test + numLogs int // how many logs the worker has to generate (only when duration==0) + body string // the body of the log + severityNumber log.Severity // the severityNumber of the log + severityText string // the severityText of the log + totalDuration time.Duration // how long to run the test for (overrides `numLogs`) + limitPerSecond rate.Limit // how many logs per second to generate + wg *sync.WaitGroup // notify when done + logger *zap.Logger // logger + index int // worker index + traceID string // traceID string + spanID string // spanID string } -func (w worker) simulateLogs(res *resource.Resource, exporter exporter, telemetryAttributes []attribute.KeyValue) { +func (w worker) simulateLogs(res *resource.Resource, exporterFunc func() (sdklog.Exporter, error), telemetryAttributes []attribute.KeyValue) { limiter := rate.NewLimiter(w.limitPerSecond, 1) var i int64 - for w.running.Load() { - logs := plog.NewLogs() - nRes := logs.ResourceLogs().AppendEmpty().Resource() - attrs := res.Attributes() - for _, attr := range attrs { - nRes.Attributes().PutStr(string(attr.Key), attr.Value.AsString()) + exporter, err := exporterFunc() + if err != nil { + w.logger.Error("failed to create the exporter", zap.Error(err)) + return + } + + defer func() { + w.logger.Info("stopping the exporter") + if tempError := exporter.Shutdown(context.Background()); tempError != nil { + w.logger.Error("failed to stop the exporter", zap.Error(tempError)) } + }() - log := logs.ResourceLogs().At(0).ScopeLogs().AppendEmpty().LogRecords().AppendEmpty() - log.Body().SetStr(w.body) - log.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) - log.SetDroppedAttributesCount(1) - log.SetSeverityNumber(w.severityNumber) - log.SetSeverityText(w.severityText) - log.Attributes() - lattrs := log.Attributes() - lattrs.PutStr("app", "server") + for w.running.Load() { + var tid trace.TraceID + var sid trace.SpanID - if w.traceID != "" { + if w.spanID != "" { // we checked this for errors in the Validate function // nolint: errcheck - b, _ := hex.DecodeString(w.traceID) - - tid := pcommon.TraceID(b) - log.SetTraceID(tid) + b, _ := hex.DecodeString(w.spanID) + sid = trace.SpanID(b) } - - if w.spanID != "" { + if w.traceID != "" { // we checked this for errors in the Validate function // nolint: errcheck - b, _ := hex.DecodeString(w.spanID) - - sid := pcommon.SpanID(b) - log.SetSpanID(sid) + b, _ := hex.DecodeString(w.traceID) + tid = trace.TraceID(b) } + attrs := []log.KeyValue{log.String("app", "server")} for i, attr := range telemetryAttributes { - lattrs.PutStr(string(attr.Key), telemetryAttributes[i].Value.AsString()) + attrs = append(attrs, log.String(string(attr.Key), telemetryAttributes[i].Value.AsString())) } - if err := exporter.export(logs); err != nil { - w.logger.Fatal("exporter failed", zap.Error(err)) + rf := logtest.RecordFactory{ + Timestamp: time.Now(), + Severity: w.severityNumber, + SeverityText: w.severityText, + Body: log.StringValue(w.body), + Attributes: attrs, + TraceID: tid, + SpanID: sid, + Resource: res, + DroppedAttributes: 1, } + + logs := []sdklog.Record{rf.NewRecord()} + if err := limiter.Wait(context.Background()); err != nil { w.logger.Fatal("limiter wait failed, retry", zap.Error(err)) } + if err := exporter.Export(context.Background(), logs); err != nil { + w.logger.Fatal("exporter failed", zap.Error(err)) + } + i++ if w.numLogs != 0 && i >= int64(w.numLogs) { break diff --git a/cmd/telemetrygen/internal/logs/worker_test.go b/cmd/telemetrygen/internal/logs/worker_test.go index 68f9eb9d5198..2d1095afe326 100644 --- a/cmd/telemetrygen/internal/logs/worker_test.go +++ b/cmd/telemetrygen/internal/logs/worker_test.go @@ -4,12 +4,14 @@ package logs import ( + "context" "testing" "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/pdata/plog" + "go.opentelemetry.io/otel/log" + sdklog "go.opentelemetry.io/otel/sdk/log" "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/telemetrygen/internal/common" @@ -23,11 +25,19 @@ const ( ) type mockExporter struct { - logs []plog.Logs + logs []sdklog.Record } -func (m *mockExporter) export(logs plog.Logs) error { - m.logs = append(m.logs, logs) +func (m *mockExporter) Export(_ context.Context, records []sdklog.Record) error { + m.logs = append(m.logs, records...) + return nil +} + +func (m *mockExporter) Shutdown(_ context.Context) error { + return nil +} + +func (m *mockExporter) ForceFlush(_ context.Context) error { return nil } @@ -41,16 +51,19 @@ func TestFixedNumberOfLogs(t *testing.T) { SeverityNumber: 9, } - exp := &mockExporter{} + m := &mockExporter{} + expFunc := func() (sdklog.Exporter, error) { + return m, nil + } // test logger, _ := zap.NewDevelopment() - require.NoError(t, Run(cfg, exp, logger)) + require.NoError(t, Run(cfg, expFunc, logger)) time.Sleep(1 * time.Second) // verify - require.Len(t, exp.logs, 5) + require.Len(t, m.logs, 5) } func TestRateOfLogs(t *testing.T) { @@ -63,16 +76,19 @@ func TestRateOfLogs(t *testing.T) { SeverityText: "Info", SeverityNumber: 9, } - exp := &mockExporter{} + m := &mockExporter{} + expFunc := func() (sdklog.Exporter, error) { + return m, nil + } // test - require.NoError(t, Run(cfg, exp, zap.NewNop())) + require.NoError(t, Run(cfg, expFunc, zap.NewNop())) // verify // the minimum acceptable number of logs for the rate of 10/sec for half a second - assert.True(t, len(exp.logs) >= 5, "there should have been 5 or more logs, had %d", len(exp.logs)) + assert.GreaterOrEqual(t, len(m.logs), 5, "there should have been 5 or more logs, had %d", len(m.logs)) // the maximum acceptable number of logs for the rate of 10/sec for half a second - assert.True(t, len(exp.logs) <= 20, "there should have been less than 20 logs, had %d", len(exp.logs)) + assert.LessOrEqual(t, len(m.logs), 20, "there should have been less than 20 logs, had %d", len(m.logs)) } func TestUnthrottled(t *testing.T) { @@ -84,13 +100,16 @@ func TestUnthrottled(t *testing.T) { SeverityText: "Info", SeverityNumber: 9, } - exp := &mockExporter{} + m := &mockExporter{} + expFunc := func() (sdklog.Exporter, error) { + return m, nil + } // test logger, _ := zap.NewDevelopment() - require.NoError(t, Run(cfg, exp, logger)) + require.NoError(t, Run(cfg, expFunc, logger)) - assert.True(t, len(exp.logs) > 100, "there should have been more than 100 logs, had %d", len(exp.logs)) + assert.Greater(t, len(m.logs), 100, "there should have been more than 100 logs, had %d", len(m.logs)) } func TestCustomBody(t *testing.T) { @@ -103,34 +122,36 @@ func TestCustomBody(t *testing.T) { SeverityText: "Info", SeverityNumber: 9, } - exp := &mockExporter{} + m := &mockExporter{} + expFunc := func() (sdklog.Exporter, error) { + return m, nil + } // test logger, _ := zap.NewDevelopment() - require.NoError(t, Run(cfg, exp, logger)) + require.NoError(t, Run(cfg, expFunc, logger)) - assert.Equal(t, "custom body", exp.logs[0].ResourceLogs().At(0).ScopeLogs().At(0).LogRecords().At(0).Body().AsString()) + assert.Equal(t, "custom body", m.logs[0].Body().AsString()) } func TestLogsWithNoTelemetryAttributes(t *testing.T) { cfg := configWithNoAttributes(2, "custom body") - exp := &mockExporter{} + m := &mockExporter{} + expFunc := func() (sdklog.Exporter, error) { + return m, nil + } // test logger, _ := zap.NewDevelopment() - require.NoError(t, Run(cfg, exp, logger)) + require.NoError(t, Run(cfg, expFunc, logger)) time.Sleep(1 * time.Second) // verify - require.Len(t, exp.logs, 2) - for _, log := range exp.logs { - rlogs := log.ResourceLogs() - for i := 0; i < rlogs.Len(); i++ { - attrs := rlogs.At(i).ScopeLogs().At(0).LogRecords().At(0).Attributes() - assert.Equal(t, 1, attrs.Len(), "shouldn't have more than 1 attribute") - } + require.Len(t, m.logs, 2) + for _, log := range m.logs { + assert.Equal(t, 1, log.AttributesLen(), "shouldn't have more than 1 attribute") } } @@ -138,29 +159,28 @@ func TestLogsWithOneTelemetryAttributes(t *testing.T) { qty := 1 cfg := configWithOneAttribute(qty, "custom body") - exp := &mockExporter{} + m := &mockExporter{} + expFunc := func() (sdklog.Exporter, error) { + return m, nil + } // test logger, _ := zap.NewDevelopment() - require.NoError(t, Run(cfg, exp, logger)) + require.NoError(t, Run(cfg, expFunc, logger)) time.Sleep(1 * time.Second) // verify - require.Len(t, exp.logs, qty) - for _, log := range exp.logs { - rlogs := log.ResourceLogs() - for i := 0; i < rlogs.Len(); i++ { - attrs := rlogs.At(i).ScopeLogs().At(0).LogRecords().At(0).Attributes() - assert.Equal(t, 2, attrs.Len(), "shouldn't have less than 2 attributes") - - val, ok := attrs.Get(telemetryAttrKeyOne) - assert.Truef(t, ok, "there should be an attribute with key %s", telemetryAttrKeyOne) - if ok { - assert.EqualValues(t, val.AsString(), telemetryAttrValueOne) - } + require.Len(t, m.logs, qty) + for _, l := range m.logs { + assert.Equal(t, 2, l.AttributesLen(), "shouldn't have less than 2 attributes") - } + l.WalkAttributes(func(attr log.KeyValue) bool { + if attr.Key == telemetryAttrKeyOne { + assert.EqualValues(t, telemetryAttrValueOne, attr.Value.AsString()) + } + return true + }) } } @@ -168,22 +188,21 @@ func TestLogsWithMultipleTelemetryAttributes(t *testing.T) { qty := 1 cfg := configWithMultipleAttributes(qty, "custom body") - exp := &mockExporter{} + m := &mockExporter{} + expFunc := func() (sdklog.Exporter, error) { + return m, nil + } // test logger, _ := zap.NewDevelopment() - require.NoError(t, Run(cfg, exp, logger)) + require.NoError(t, Run(cfg, expFunc, logger)) time.Sleep(1 * time.Second) // verify - require.Len(t, exp.logs, qty) - for _, log := range exp.logs { - rlogs := log.ResourceLogs() - for i := 0; i < rlogs.Len(); i++ { - attrs := rlogs.At(i).ScopeLogs().At(0).LogRecords().At(0).Attributes() - assert.Equal(t, 3, attrs.Len(), "shouldn't have less than 3 attributes") - } + require.Len(t, m.logs, qty) + for _, l := range m.logs { + assert.Equal(t, 3, l.AttributesLen(), "shouldn't have less than 3 attributes") } } @@ -193,21 +212,72 @@ func TestLogsWithTraceIDAndSpanID(t *testing.T) { cfg.TraceID = "ae87dadd90e9935a4bc9660628efd569" cfg.SpanID = "5828fa4960140870" - exp := &mockExporter{} + m := &mockExporter{} + expFunc := func() (sdklog.Exporter, error) { + return m, nil + } // test logger, _ := zap.NewDevelopment() - require.NoError(t, Run(cfg, exp, logger)) + require.NoError(t, Run(cfg, expFunc, logger)) // verify - require.Len(t, exp.logs, qty) - for _, log := range exp.logs { - rlogs := log.ResourceLogs() - for i := 0; i < rlogs.Len(); i++ { - log := rlogs.At(i).ScopeLogs().At(0).LogRecords().At(0) - assert.Equal(t, "ae87dadd90e9935a4bc9660628efd569", log.TraceID().String()) - assert.Equal(t, "5828fa4960140870", log.SpanID().String()) - } + require.Len(t, m.logs, qty) + for _, l := range m.logs { + assert.Equal(t, "ae87dadd90e9935a4bc9660628efd569", l.TraceID().String()) + assert.Equal(t, "5828fa4960140870", l.SpanID().String()) + } +} + +func TestValidate(t *testing.T) { + tests := []struct { + name string + cfg *Config + wantErrMessage string + }{ + { + name: "No duration or NumLogs", + cfg: &Config{ + Config: common.Config{ + WorkerCount: 1, + }, + TraceID: "123", + }, + wantErrMessage: "either `logs` or `duration` must be greater than 0", + }, + { + name: "TraceID invalid", + cfg: &Config{ + Config: common.Config{ + WorkerCount: 1, + }, + NumLogs: 5, + TraceID: "123", + }, + wantErrMessage: "TraceID must be a 32 character hex string, like: 'ae87dadd90e9935a4bc9660628efd569'", + }, + { + name: "SpanID invalid", + cfg: &Config{ + Config: common.Config{ + WorkerCount: 1, + }, + NumLogs: 5, + TraceID: "ae87dadd90e9935a4bc9660628efd569", + SpanID: "123", + }, + wantErrMessage: "SpanID must be a 16 character hex string, like: '5828fa4960140870'", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + m := &mockExporter{} + expFunc := func() (sdklog.Exporter, error) { + return m, nil + } + logger, _ := zap.NewDevelopment() + require.EqualError(t, Run(tt.cfg, expFunc, logger), tt.wantErrMessage) + }) } } diff --git a/cmd/telemetrygen/internal/metrics/config.go b/cmd/telemetrygen/internal/metrics/config.go index cab4633d28fb..16c1306a9071 100644 --- a/cmd/telemetrygen/internal/metrics/config.go +++ b/cmd/telemetrygen/internal/metrics/config.go @@ -4,6 +4,8 @@ package metrics import ( + "fmt" + "github.com/spf13/pflag" "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/telemetrygen/internal/common" @@ -34,11 +36,14 @@ func (c *Config) Flags(fs *pflag.FlagSet) { fs.StringVar(&c.TraceID, "trace-id", "", "TraceID to use as exemplar") fs.StringVar(&c.SpanID, "span-id", "", "SpanID to use as exemplar") - } // Validate validates the test scenario parameters. func (c *Config) Validate() error { + if c.TotalDuration <= 0 && c.NumMetrics <= 0 { + return fmt.Errorf("either `metrics` or `duration` must be greater than 0") + } + if c.TraceID != "" { if err := common.ValidateTraceID(c.TraceID); err != nil { return err diff --git a/cmd/telemetrygen/internal/metrics/exporter.go b/cmd/telemetrygen/internal/metrics/exporter.go index 00af1ea0d75a..d8323ffbebd0 100644 --- a/cmd/telemetrygen/internal/metrics/exporter.go +++ b/cmd/telemetrygen/internal/metrics/exporter.go @@ -22,7 +22,9 @@ func grpcExporterOptions(cfg *Config) ([]otlpmetricgrpc.Option, error) { if cfg.Insecure { grpcExpOpt = append(grpcExpOpt, otlpmetricgrpc.WithInsecure()) } else { - credentials, err := common.GetTLSCredentialsForGRPCExporter(cfg.CaFile, cfg.ClientAuth) + credentials, err := common.GetTLSCredentialsForGRPCExporter( + cfg.CaFile, cfg.ClientAuth, cfg.InsecureSkipVerify, + ) if err != nil { return nil, fmt.Errorf("failed to get TLS credentials: %w", err) } @@ -30,7 +32,7 @@ func grpcExporterOptions(cfg *Config) ([]otlpmetricgrpc.Option, error) { } if len(cfg.Headers) > 0 { - grpcExpOpt = append(grpcExpOpt, otlpmetricgrpc.WithHeaders(cfg.Headers)) + grpcExpOpt = append(grpcExpOpt, otlpmetricgrpc.WithHeaders(cfg.GetHeaders())) } return grpcExpOpt, nil @@ -47,7 +49,9 @@ func httpExporterOptions(cfg *Config) ([]otlpmetrichttp.Option, error) { if cfg.Insecure { httpExpOpt = append(httpExpOpt, otlpmetrichttp.WithInsecure()) } else { - tlsCfg, err := common.GetTLSCredentialsForHTTPExporter(cfg.CaFile, cfg.ClientAuth) + tlsCfg, err := common.GetTLSCredentialsForHTTPExporter( + cfg.CaFile, cfg.ClientAuth, cfg.InsecureSkipVerify, + ) if err != nil { return nil, fmt.Errorf("failed to get TLS credentials: %w", err) } @@ -55,7 +59,7 @@ func httpExporterOptions(cfg *Config) ([]otlpmetrichttp.Option, error) { } if len(cfg.Headers) > 0 { - httpExpOpt = append(httpExpOpt, otlpmetrichttp.WithHeaders(cfg.Headers)) + httpExpOpt = append(httpExpOpt, otlpmetrichttp.WithHeaders(cfg.GetHeaders())) } return httpExpOpt, nil diff --git a/cmd/telemetrygen/internal/metrics/metrics.go b/cmd/telemetrygen/internal/metrics/metrics.go index 837f8f6ee711..baed4c4b5362 100644 --- a/cmd/telemetrygen/internal/metrics/metrics.go +++ b/cmd/telemetrygen/internal/metrics/metrics.go @@ -62,7 +62,6 @@ func Start(cfg *Config) error { } if err = Run(cfg, expFunc, logger); err != nil { - logger.Error("failed to stop the exporter", zap.Error(err)) return err } @@ -71,10 +70,12 @@ func Start(cfg *Config) error { // Run executes the test scenario. func Run(c *Config, exp func() (sdkmetric.Exporter, error), logger *zap.Logger) error { + if err := c.Validate(); err != nil { + return err + } + if c.TotalDuration > 0 { c.NumMetrics = 0 - } else if c.NumMetrics <= 0 { - return fmt.Errorf("either `metrics` or `duration` must be greater than 0") } limit := rate.Limit(c.Rate) diff --git a/cmd/telemetrygen/internal/metrics/worker.go b/cmd/telemetrygen/internal/metrics/worker.go index da3abf140aa1..17978fb9bdf6 100644 --- a/cmd/telemetrygen/internal/metrics/worker.go +++ b/cmd/telemetrygen/internal/metrics/worker.go @@ -91,13 +91,14 @@ func (w worker) simulateMetrics(res *resource.Resource, exporterFunc func() (sdk ScopeMetrics: []metricdata.ScopeMetrics{{Metrics: metrics}}, } - if err := exporter.Export(context.Background(), &rm); err != nil { - w.logger.Fatal("exporter failed", zap.Error(err)) - } if err := limiter.Wait(context.Background()); err != nil { w.logger.Fatal("limiter wait failed, retry", zap.Error(err)) } + if err := exporter.Export(context.Background(), &rm); err != nil { + w.logger.Fatal("exporter failed", zap.Error(err)) + } + i++ if w.numMetrics != 0 && i >= int64(w.numMetrics) { break diff --git a/cmd/telemetrygen/internal/metrics/worker_test.go b/cmd/telemetrygen/internal/metrics/worker_test.go index 4ae1711c8ab9..7574ac203757 100644 --- a/cmd/telemetrygen/internal/metrics/worker_test.go +++ b/cmd/telemetrygen/internal/metrics/worker_test.go @@ -93,9 +93,9 @@ func TestRateOfMetrics(t *testing.T) { // assert // the minimum acceptable number of metrics for the rate of 10/sec for half a second - assert.True(t, len(m.rms) >= 6, "there should have been more than 6 metrics, had %d", len(m.rms)) + assert.GreaterOrEqual(t, len(m.rms), 6, "there should have been more than 6 metrics, had %d", len(m.rms)) // the maximum acceptable number of metrics for the rate of 10/sec for half a second - assert.True(t, len(m.rms) <= 20, "there should have been less than 20 metrics, had %d", len(m.rms)) + assert.LessOrEqual(t, len(m.rms), 20, "there should have been less than 20 metrics, had %d", len(m.rms)) } func TestUnthrottled(t *testing.T) { @@ -117,7 +117,7 @@ func TestUnthrottled(t *testing.T) { require.NoError(t, Run(cfg, expFunc, logger)) // assert - assert.True(t, len(m.rms) > 100, "there should have been more than 100 metrics, had %d", len(m.rms)) + assert.Greater(t, len(m.rms), 100, "there should have been more than 100 metrics, had %d", len(m.rms)) } func TestSumNoTelemetryAttrs(t *testing.T) { @@ -202,7 +202,7 @@ func TestSumSingleTelemetryAttr(t *testing.T) { attr := ms.Data.(metricdata.Sum[int64]).DataPoints[0].Attributes assert.Equal(t, 1, attr.Len(), "it must have a single attribute here") actualValue, _ := attr.Value(telemetryAttrKeyOne) - assert.Equal(t, actualValue.AsString(), telemetryAttrValueOne, "it should be "+telemetryAttrValueOne) + assert.Equal(t, telemetryAttrValueOne, actualValue.AsString(), "it should be "+telemetryAttrValueOne) } } @@ -232,7 +232,7 @@ func TestGaugeSingleTelemetryAttr(t *testing.T) { attr := ms.Data.(metricdata.Gauge[int64]).DataPoints[0].Attributes assert.Equal(t, 1, attr.Len(), "it must have a single attribute here") actualValue, _ := attr.Value(telemetryAttrKeyOne) - assert.Equal(t, actualValue.AsString(), telemetryAttrValueOne, "it should be "+telemetryAttrValueOne) + assert.Equal(t, telemetryAttrValueOne, actualValue.AsString(), "it should be "+telemetryAttrValueOne) } } @@ -300,6 +300,61 @@ func TestGaugeMultipleTelemetryAttr(t *testing.T) { } } +func TestValidate(t *testing.T) { + tests := []struct { + name string + cfg *Config + wantErrMessage string + }{ + { + name: "No duration or NumMetrics", + cfg: &Config{ + Config: common.Config{ + WorkerCount: 1, + }, + MetricType: metricTypeSum, + TraceID: "123", + }, + wantErrMessage: "either `metrics` or `duration` must be greater than 0", + }, + { + name: "TraceID invalid", + cfg: &Config{ + Config: common.Config{ + WorkerCount: 1, + }, + NumMetrics: 5, + MetricType: metricTypeSum, + TraceID: "123", + }, + wantErrMessage: "TraceID must be a 32 character hex string, like: 'ae87dadd90e9935a4bc9660628efd569'", + }, + { + name: "SpanID invalid", + cfg: &Config{ + Config: common.Config{ + WorkerCount: 1, + }, + NumMetrics: 5, + MetricType: metricTypeSum, + TraceID: "ae87dadd90e9935a4bc9660628efd569", + SpanID: "123", + }, + wantErrMessage: "SpanID must be a 16 character hex string, like: '5828fa4960140870'", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + m := &mockExporter{} + expFunc := func() (sdkmetric.Exporter, error) { + return m, nil + } + logger, _ := zap.NewDevelopment() + require.EqualError(t, Run(tt.cfg, expFunc, logger), tt.wantErrMessage) + }) + } +} + func configWithNoAttributes(metric metricType, qty int) *Config { return &Config{ Config: common.Config{ diff --git a/cmd/telemetrygen/internal/traces/config.go b/cmd/telemetrygen/internal/traces/config.go index 7b553b3cf04c..5bb63dffbd9a 100644 --- a/cmd/telemetrygen/internal/traces/config.go +++ b/cmd/telemetrygen/internal/traces/config.go @@ -4,6 +4,7 @@ package traces import ( + "fmt" "time" "github.com/spf13/pflag" @@ -40,3 +41,11 @@ func (c *Config) Flags(fs *pflag.FlagSet) { fs.IntVar(&c.LoadSize, "size", 0, "Desired minimum size in MB of string data for each trace generated. This can be used to test traces with large payloads, i.e. when testing the OTLP receiver endpoint max receive size.") fs.DurationVar(&c.SpanDuration, "span-duration", 123*time.Microsecond, "The duration of each generated span.") } + +// Validate validates the test scenario parameters. +func (c *Config) Validate() error { + if c.TotalDuration <= 0 && c.NumTraces <= 0 { + return fmt.Errorf("either `traces` or `duration` must be greater than 0") + } + return nil +} diff --git a/cmd/telemetrygen/internal/traces/exporter.go b/cmd/telemetrygen/internal/traces/exporter.go index b5913841454a..4d75c36635c3 100644 --- a/cmd/telemetrygen/internal/traces/exporter.go +++ b/cmd/telemetrygen/internal/traces/exporter.go @@ -22,7 +22,9 @@ func grpcExporterOptions(cfg *Config) ([]otlptracegrpc.Option, error) { if cfg.Insecure { grpcExpOpt = append(grpcExpOpt, otlptracegrpc.WithInsecure()) } else { - credentials, err := common.GetTLSCredentialsForGRPCExporter(cfg.CaFile, cfg.ClientAuth) + credentials, err := common.GetTLSCredentialsForGRPCExporter( + cfg.CaFile, cfg.ClientAuth, cfg.InsecureSkipVerify, + ) if err != nil { return nil, fmt.Errorf("failed to get TLS credentials: %w", err) } @@ -30,7 +32,7 @@ func grpcExporterOptions(cfg *Config) ([]otlptracegrpc.Option, error) { } if len(cfg.Headers) > 0 { - grpcExpOpt = append(grpcExpOpt, otlptracegrpc.WithHeaders(cfg.Headers)) + grpcExpOpt = append(grpcExpOpt, otlptracegrpc.WithHeaders(cfg.GetHeaders())) } return grpcExpOpt, nil @@ -47,7 +49,9 @@ func httpExporterOptions(cfg *Config) ([]otlptracehttp.Option, error) { if cfg.Insecure { httpExpOpt = append(httpExpOpt, otlptracehttp.WithInsecure()) } else { - tlsCfg, err := common.GetTLSCredentialsForHTTPExporter(cfg.CaFile, cfg.ClientAuth) + tlsCfg, err := common.GetTLSCredentialsForHTTPExporter( + cfg.CaFile, cfg.ClientAuth, cfg.InsecureSkipVerify, + ) if err != nil { return nil, fmt.Errorf("failed to get TLS credentials: %w", err) } @@ -55,7 +59,7 @@ func httpExporterOptions(cfg *Config) ([]otlptracehttp.Option, error) { } if len(cfg.Headers) > 0 { - httpExpOpt = append(httpExpOpt, otlptracehttp.WithHeaders(cfg.Headers)) + httpExpOpt = append(httpExpOpt, otlptracehttp.WithHeaders(cfg.GetHeaders())) } return httpExpOpt, nil diff --git a/cmd/telemetrygen/internal/traces/exporter_test.go b/cmd/telemetrygen/internal/traces/exporter_test.go new file mode 100644 index 000000000000..36313c20b576 --- /dev/null +++ b/cmd/telemetrygen/internal/traces/exporter_test.go @@ -0,0 +1,137 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package traces + +import ( + "context" + "encoding/pem" + "net/http" + "net/http/httptest" + "net/url" + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp" + tracepb "go.opentelemetry.io/proto/otlp/trace/v1" + + "github.com/open-telemetry/opentelemetry-collector-contrib/cmd/telemetrygen/internal/common" +) + +func TestHTTPExporterOptions_TLS(t *testing.T) { + // TODO add test cases for mTLS + for name, tc := range map[string]struct { + tls bool + tlsServerCA bool // use the httptest.Server's TLS cert as the CA + cfg Config + + expectTransportError bool + }{ + "Insecure": { + tls: false, + cfg: Config{Config: common.Config{Insecure: true}}, + }, + "InsecureSkipVerify": { + tls: true, + cfg: Config{Config: common.Config{InsecureSkipVerify: true}}, + }, + "InsecureSkipVerifyDisabled": { + tls: true, + expectTransportError: true, + }, + "CaFile": { + tls: true, + tlsServerCA: true, + }, + } { + t.Run(name, func(t *testing.T) { + var called bool + var h http.HandlerFunc = func(http.ResponseWriter, *http.Request) { + called = true + } + var srv *httptest.Server + if tc.tls { + srv = httptest.NewTLSServer(h) + } else { + srv = httptest.NewServer(h) + } + defer srv.Close() + srvURL, _ := url.Parse(srv.URL) + + cfg := tc.cfg + cfg.CustomEndpoint = srvURL.Host + if tc.tlsServerCA { + caFile := filepath.Join(t.TempDir(), "cert.pem") + err := os.WriteFile(caFile, pem.EncodeToMemory(&pem.Block{ + Type: "CERTIFICATE", + Bytes: srv.TLS.Certificates[0].Certificate[0], + }), 0o600) + require.NoError(t, err) + cfg.CaFile = caFile + } + + opts, err := httpExporterOptions(&cfg) + require.NoError(t, err) + client := otlptracehttp.NewClient(opts...) + + err = client.UploadTraces(context.Background(), []*tracepb.ResourceSpans{}) + if tc.expectTransportError { + require.Error(t, err) + assert.False(t, called) + } else { + require.NoError(t, err) + assert.True(t, called) + } + }) + } +} + +func TestHTTPExporterOptions_HTTP(t *testing.T) { + for name, tc := range map[string]struct { + cfg Config + + expectedHTTPPath string + expectedHeader http.Header + }{ + "HTTPPath": { + cfg: Config{Config: common.Config{HTTPPath: "/foo"}}, + expectedHTTPPath: "/foo", + }, + "Headers": { + cfg: Config{ + Config: common.Config{Headers: map[string]any{"a": "b"}}, + }, + expectedHTTPPath: "/v1/traces", + expectedHeader: http.Header{"a": []string{"b"}}, + }, + } { + t.Run(name, func(t *testing.T) { + var httpPath string + var header http.Header + var h http.HandlerFunc = func(_ http.ResponseWriter, r *http.Request) { + httpPath = r.URL.Path + header = r.Header + } + srv := httptest.NewServer(h) + defer srv.Close() + srvURL, _ := url.Parse(srv.URL) + + cfg := tc.cfg + cfg.Insecure = true + cfg.CustomEndpoint = srvURL.Host + opts, err := httpExporterOptions(&cfg) + require.NoError(t, err) + client := otlptracehttp.NewClient(opts...) + + err = client.UploadTraces(context.Background(), []*tracepb.ResourceSpans{}) + require.NoError(t, err) + assert.Equal(t, tc.expectedHTTPPath, httpPath) + for k, expected := range tc.expectedHeader { + assert.Equal(t, expected, []string{header.Get(k)}) + } + }) + } +} diff --git a/cmd/telemetrygen/internal/traces/traces.go b/cmd/telemetrygen/internal/traces/traces.go index 02817577b915..29c0aacc5d27 100644 --- a/cmd/telemetrygen/internal/traces/traces.go +++ b/cmd/telemetrygen/internal/traces/traces.go @@ -102,10 +102,12 @@ func Start(cfg *Config) error { // Run executes the test scenario. func Run(c *Config, logger *zap.Logger) error { + if err := c.Validate(); err != nil { + return err + } + if c.TotalDuration > 0 { c.NumTraces = 0 - } else if c.NumTraces <= 0 { - return fmt.Errorf("either `traces` or `duration` must be greater than 0") } limit := rate.Limit(c.Rate) diff --git a/cmd/telemetrygen/internal/traces/worker.go b/cmd/telemetrygen/internal/traces/worker.go index cb71e2917e66..c3cc86d747ff 100644 --- a/cmd/telemetrygen/internal/traces/worker.go +++ b/cmd/telemetrygen/internal/traces/worker.go @@ -50,6 +50,10 @@ func (w worker) simulateTraces(telemetryAttributes []attribute.KeyValue) { spanStart := time.Now() spanEnd := spanStart.Add(w.spanDuration) + if err := limiter.Wait(context.Background()); err != nil { + w.logger.Fatal("limiter waited failed, retry", zap.Error(err)) + } + ctx, sp := tracer.Start(context.Background(), "lets-go", trace.WithAttributes( semconv.NetPeerIPKey.String(fakeIP), semconv.PeerServiceKey.String("telemetrygen-server"), @@ -74,6 +78,10 @@ func (w worker) simulateTraces(telemetryAttributes []attribute.KeyValue) { var endTimestamp trace.SpanEventOption for j := 0; j < w.numChildSpans; j++ { + if err := limiter.Wait(context.Background()); err != nil { + w.logger.Fatal("limiter waited failed, retry", zap.Error(err)) + } + _, child := tracer.Start(childCtx, "okey-dokey-"+strconv.Itoa(j), trace.WithAttributes( semconv.NetPeerIPKey.String(fakeIP), semconv.PeerServiceKey.String("telemetrygen-client"), @@ -83,10 +91,6 @@ func (w worker) simulateTraces(telemetryAttributes []attribute.KeyValue) { ) child.SetAttributes(telemetryAttributes...) - if err := limiter.Wait(context.Background()); err != nil { - w.logger.Fatal("limiter waited failed, retry", zap.Error(err)) - } - endTimestamp = trace.WithTimestamp(spanEnd) child.SetStatus(w.statusCode, "") child.End(endTimestamp) diff --git a/cmd/telemetrygen/internal/traces/worker_test.go b/cmd/telemetrygen/internal/traces/worker_test.go index 0fbbf858de61..8c85b90cb305 100644 --- a/cmd/telemetrygen/internal/traces/worker_test.go +++ b/cmd/telemetrygen/internal/traces/worker_test.go @@ -93,16 +93,16 @@ func TestRateOfSpans(t *testing.T) { } // sanity check - require.Len(t, syncer.spans, 0) + require.Empty(t, syncer.spans) // test require.NoError(t, Run(cfg, zap.NewNop())) // verify // the minimum acceptable number of spans for the rate of 10/sec for half a second - assert.True(t, len(syncer.spans) >= 6, "there should have been more than 6 spans, had %d", len(syncer.spans)) + assert.GreaterOrEqual(t, len(syncer.spans), 6, "there should have been more than 6 spans, had %d", len(syncer.spans)) // the maximum acceptable number of spans for the rate of 10/sec for half a second - assert.True(t, len(syncer.spans) <= 20, "there should have been less than 20 spans, had %d", len(syncer.spans)) + assert.LessOrEqual(t, len(syncer.spans), 20, "there should have been less than 20 spans, had %d", len(syncer.spans)) } func TestSpanDuration(t *testing.T) { @@ -125,7 +125,7 @@ func TestSpanDuration(t *testing.T) { } // sanity check - require.Len(t, syncer.spans, 0) + require.Empty(t, syncer.spans) // test require.NoError(t, Run(cfg, zap.NewNop())) @@ -154,14 +154,14 @@ func TestUnthrottled(t *testing.T) { } // sanity check - require.Len(t, syncer.spans, 0) + require.Empty(t, syncer.spans) // test require.NoError(t, Run(cfg, zap.NewNop())) // verify // the minimum acceptable number of spans -- the real number should be > 10k, but CI env might be slower - assert.True(t, len(syncer.spans) > 100, "there should have been more than 100 spans, had %d", len(syncer.spans)) + assert.Greater(t, len(syncer.spans), 100, "there should have been more than 100 spans, had %d", len(syncer.spans)) } func TestSpanKind(t *testing.T) { @@ -185,7 +185,7 @@ func TestSpanKind(t *testing.T) { // verify that the default Span Kind is being overridden for _, span := range syncer.spans { - assert.NotEqual(t, span.SpanKind(), trace.SpanKindInternal) + assert.NotEqual(t, trace.SpanKindInternal, span.SpanKind()) } } @@ -235,7 +235,7 @@ func TestSpanStatuses(t *testing.T) { require.NoError(t, Run(cfg, zap.NewNop())) // verify that the default the span status is set as expected for _, span := range syncer.spans { - assert.Equal(t, span.Status().Code, tt.spanStatus, fmt.Sprintf("span status: %v and expected status %v", span.Status().Code, tt.spanStatus)) + assert.Equalf(t, span.Status().Code, tt.spanStatus, "span status: %v and expected status %v", span.Status().Code, tt.spanStatus) } } else { require.Error(t, Run(cfg, zap.NewNop())) @@ -262,7 +262,7 @@ func TestSpansWithNoAttrs(t *testing.T) { assert.Len(t, syncer.spans, 4) // each trace has two spans for _, span := range syncer.spans { attributes := span.Attributes() - assert.Equal(t, 2, len(attributes), "it shouldn't have more than 2 fixed attributes") + assert.Len(t, attributes, 2, "it shouldn't have more than 2 fixed attributes") } } @@ -284,7 +284,7 @@ func TestSpansWithOneAttrs(t *testing.T) { assert.Len(t, syncer.spans, 4) // each trace has two spans for _, span := range syncer.spans { attributes := span.Attributes() - assert.Equal(t, 3, len(attributes), "it should have more than 3 attributes") + assert.Len(t, attributes, 3, "it should have more than 3 attributes") } } @@ -306,7 +306,37 @@ func TestSpansWithMultipleAttrs(t *testing.T) { assert.Len(t, syncer.spans, 4) // each trace has two spans for _, span := range syncer.spans { attributes := span.Attributes() - assert.Equal(t, 4, len(attributes), "it should have more than 4 attributes") + assert.Len(t, attributes, 4, "it should have more than 4 attributes") + } +} + +func TestValidate(t *testing.T) { + tests := []struct { + name string + cfg *Config + wantErrMessage string + }{ + { + name: "No duration or NumTraces", + cfg: &Config{ + Config: common.Config{ + WorkerCount: 1, + }, + }, + wantErrMessage: "either `traces` or `duration` must be greater than 0", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + syncer := &mockSyncer{} + + tracerProvider := sdktrace.NewTracerProvider() + sp := sdktrace.NewSimpleSpanProcessor(syncer) + tracerProvider.RegisterSpanProcessor(sp) + otel.SetTracerProvider(tracerProvider) + logger, _ := zap.NewDevelopment() + require.EqualError(t, Run(tt.cfg, logger), tt.wantErrMessage) + }) } } @@ -361,5 +391,4 @@ func configWithMultipleAttributes(qty int, statusCode string) *Config { NumTraces: qty, StatusCode: statusCode, } - } diff --git a/confmap/provider/aesprovider/Makefile b/confmap/provider/aesprovider/Makefile new file mode 100644 index 000000000000..bdd863a203be --- /dev/null +++ b/confmap/provider/aesprovider/Makefile @@ -0,0 +1 @@ +include ../../../Makefile.Common diff --git a/confmap/provider/aesprovider/README.md b/confmap/provider/aesprovider/README.md new file mode 100644 index 000000000000..36a5fc7f26c4 --- /dev/null +++ b/confmap/provider/aesprovider/README.md @@ -0,0 +1,33 @@ +## Summary + +This package provides a `confmap.Provider` implementation for symmetric AES encryption of credentials (and other sensitive values) in configurations. It relies on the environment variable `OTEL_AES_CREDENTIAL_PROVIDER` set to the value of the AES key, base64 encoded. 16, 24, or 32 byte keys are supported, selecting AES-128, AES-192, or AES-256 respectively. + +An AES 32-byte (AES-256) key can be generated using the following command: + +```shell +openssl rand -base64 32 +``` + +## How it works + Use placeholders with the following pattern `${aes:}` in a configuration. The value will be decrypted using the AES key provided in the environment variable `OTEL_AES_CREDENTIAL_PROVIDER` + +> For example: +> +> ```shell +> export OTEL_AES_CREDENTIAL_PROVIDER="GQi+Y8HwOYzs8lAOjHUqB7vXlN8bVU2k0TAKtzwJzac=" +> ``` +> +> ```yaml +> password: ${aes:RsEf6cTWrssi8tlssfs1AJs2bRMrVm2Ce5TaWPY=} +> ``` +> +> will resolve to: +> ```yaml +> password: '1' +> ``` + +## Caveats + +Since AES is a symmetric encryption algorithm, the same key must be used to encrypt and decrypt the values. If the key needs to be exchanged between the collector and a server, it should be done over a secure connection. + +When the collector persists its configuration to disk, storing the key in the environment prevents compromising secrets in the configuration. It still presents a vulnerability if the attacker has access to the collector's memory or the environment's configuration, but increases security over plaintext configurations. \ No newline at end of file diff --git a/confmap/provider/aesprovider/go.mod b/confmap/provider/aesprovider/go.mod new file mode 100644 index 000000000000..06e4f78aaa61 --- /dev/null +++ b/confmap/provider/aesprovider/go.mod @@ -0,0 +1,23 @@ +module github.com/open-telemetry/opentelemetry-collector-contrib/confmap/provider/aesprovider + +go 1.22.0 + +require ( + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.uber.org/zap v1.27.0 + +) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/knadh/koanf/maps v0.1.1 // indirect + github.com/knadh/koanf/providers/confmap v0.1.0 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/confmap/provider/aesprovider/go.sum b/confmap/provider/aesprovider/go.sum new file mode 100644 index 000000000000..a735e8cc3a96 --- /dev/null +++ b/confmap/provider/aesprovider/go.sum @@ -0,0 +1,37 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= +github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= +github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= +github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/confmap/provider/aesprovider/metadata.yaml b/confmap/provider/aesprovider/metadata.yaml new file mode 100644 index 000000000000..41c92fa8bbd5 --- /dev/null +++ b/confmap/provider/aesprovider/metadata.yaml @@ -0,0 +1,3 @@ +status: + codeowners: + active: [djaglowski, shazlehu] \ No newline at end of file diff --git a/confmap/provider/aesprovider/provider.go b/confmap/provider/aesprovider/provider.go new file mode 100644 index 000000000000..5b4e326762fa --- /dev/null +++ b/confmap/provider/aesprovider/provider.go @@ -0,0 +1,106 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package aesprovider // import "github.com/open-telemetry/opentelemetry-collector-contrib/confmap/provider/aesprovider" + +import ( + "context" + "crypto/aes" + "crypto/cipher" + "encoding/base64" + "fmt" + "os" + "strings" + + "go.opentelemetry.io/collector/confmap" + "go.uber.org/zap" +) + +const ( + schemaName = "aes" + // This environment variable holds a base64-encoded AES key, either 16, 24, or 32 bytes to select AES-128, AES-192, or AES-256. + keyEnvVar = "OTEL_AES_CREDENTIAL_PROVIDER" +) + +type provider struct { + logger *zap.Logger + key []byte +} + +// NewFactory creates a new provider factory +func NewFactory() confmap.ProviderFactory { + return confmap.NewProviderFactory( + func(settings confmap.ProviderSettings) confmap.Provider { + return &provider{ + logger: settings.Logger, + } + }) +} + +func (*provider) Scheme() string { + return schemaName +} + +func (*provider) Shutdown(context.Context) error { + return nil +} + +func (p *provider) Retrieve(_ context.Context, uri string, _ confmap.WatcherFunc) (*confmap.Retrieved, error) { + if !strings.HasPrefix(uri, schemaName+":") { + return nil, fmt.Errorf("%q uri is not supported by %q provider", uri, schemaName) + } + + if p.key == nil { + // base64 decode env var + base64Key, ok := os.LookupEnv(keyEnvVar) + if !ok { + return nil, fmt.Errorf("env var %q not set, required for %q provider", keyEnvVar, schemaName) + } + key, err := base64.StdEncoding.DecodeString(base64Key) + if err != nil { + return nil, fmt.Errorf("%q provider uri failed to base64 decode key: %w", schemaName, err) + } + p.key = key + } + + // Remove schemaName + cipherText := strings.Replace(uri, schemaName+":", "", 1) + + clearText, err := p.decrypt(cipherText) + if err != nil { + return nil, fmt.Errorf("%q provider failed to decrypt value: %w", schemaName, err) + } + + return confmap.NewRetrieved(clearText) +} + +func (p *provider) decrypt(cipherText string) (string, error) { + cipherBytes, err := base64.StdEncoding.DecodeString(cipherText) + if err != nil { + return "", err + } + + block, err := aes.NewCipher(p.key) + if err != nil { + return "", err + } + + aesGCM, err := cipher.NewGCM(block) + if err != nil { + return "", err + } + + nonceSize := aesGCM.NonceSize() + if len(cipherBytes) < nonceSize { + return "", fmt.Errorf("ciphertext too short") + } + + nonce, cipherBytes := cipherBytes[:nonceSize], cipherBytes[nonceSize:] + + clearBytes, err := aesGCM.Open(nil, nonce, cipherBytes, nil) + if err != nil { + return "", err + } + + return string(clearBytes), nil +} diff --git a/confmap/provider/aesprovider/provider_test.go b/confmap/provider/aesprovider/provider_test.go new file mode 100644 index 000000000000..cc8e62489246 --- /dev/null +++ b/confmap/provider/aesprovider/provider_test.go @@ -0,0 +1,120 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package aesprovider + +import ( + "context" + "os" + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/confmap" +) + +func TestAESCredentialProvider(t *testing.T) { + tests := []struct { + name string + configValue string + expectedValue string + expectedError string + envVars map[string]string + }{ + { + name: "Valid type, key, JSON value", + configValue: `aes:RsEf6cTWrssi8tls+5Tlk3H8AQBVT2uVDcJ88zj3Sph1iSN8z97yGlxNrWf7oUHSyS4lISEcuqrQq2sPsvcl480rEajM0DIWNVoPi2ApKhADCygGoRxbykm4Tuce+rx0aWIPj1zDkuBM6NIYI1E9H2gxrH+P89Hlwmwq26S3HkqIvtW/BFAHJ8Z08iIg95NFwdbZBu4bMwY93r0KWhL0Y4xk9PGmCZhHk5jaaCgd5YREhJCH8ahenZ/t71yGdu71gSIVbg1xwGZNDKf9wRpOCW4oVQ+OWORDrgKX+58QZMOu0zjRxIkeFQV66xMIEziLYERW0xnT/GthH2+FdO/OlrUlzTBnQBbgqpp86cW1xKPFE1XeFJAIHXca7sYIjl/bz6csiUGSXKVyzApsz6fQEhaFwPGw7YKg/hN4+AEu7zYwHlpiPZyQZVE8xPEgwAy1ZKKk7nJ391ujXohXEsmc7u40bOdQmvktyjemf3KcYSCSoVqvdm49K8/ZfKgG1LMCSnHMk0HWdVGyO8jjBj3RnhpT1/dQ/aMudwPMsPFE+85GYEPTe9Sjq8erkjLRfGomDYWJhSpMESMovVRKpyjv9W+3xS0fHracj1AIx8iRQ9KNq7YKSX9n+wtE7LXMr6CUxwDs0wm1FCdVpc/JfH7BghbAh9qNSZg7qeNWQO9BG9vVa31EpRTDHOOogzGOQU2APtjc0qU65we6lpShBl2HU6S/5SgjB5m9ZnCsJSqlCQTf/e/Riuvx8l5LBlv1JNbHnLD6LO7xarpEKzR2Nc2N2+6pP86SvVB/ZqxGug06SUckjQbrmVrjU5X0RFWQAb4ZdPUobxk2xOXGhxUxEB/pDv5DcuDaEry97XsYBgzYpCtVZr8uQc5kd5jPcMsVgIYo78t+v+2yvCdYtRSHOrAcrOyBbrXCo1yI4UA9qAmfBE1PWC7km9xdhtlIAA5Szei+2oRxCwSvVO0TeYCwByDmYDolL0Tv5jtdgsPbcgnZsL/b9KRBAUU4wXKVm55mzw3AiOehX/bms84XLnRWZaxN06tJ/DiMbMcatTQP0pxk4zoemVD66wo7dA8U0nrnfP8AMfQmFQ==`, + expectedValue: `{ "type": "service_account", "project_id": "my-test-project-12345", "private_key_id": "abcdef1234567890abcdef1234567890abcdef12", "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCAmMwggJfAgEAAoGBALKlO+j9ALhlg5po\nfakePrivateKeyValue+/abc/def/123/fakeData==\n-----END PRIVATE KEY-----\n", "client_email": "test-service-account@my-test-project-12345.iam.gserviceaccount.com", "client_id": "123456789012345678901", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/test-service-account%40my-test-project-12345.iam.gserviceaccount.com" }`, + + envVars: map[string]string{ + "OTEL_AES_CREDENTIAL_PROVIDER": "GQi+Y8HwOYzs8lAOjHUqB7vXlN8bVU2k0TAKtzwJzac=", + }, + }, + + { + name: "Invalid base64 key", + configValue: `aes:RsEf6cTWrssi8tlssfs1AJs2bRMrVm2Ce5TaWPY=`, + expectedError: `"aes" provider uri failed to base64 decode key: illegal base64 data at input byte 25`, + + envVars: map[string]string{ + "OTEL_AES_CREDENTIAL_PROVIDER": "GQi+Y8lN8bVU2k0TAKtzwJzac=", + }, + }, + { + name: "Invalid AES key", + configValue: `aes:RsEf6cTWrssi8tls+5Tlk3H8AQBVT2uVDcJ88zj3Sph1iSN8z97yGlxNrWf7oUHSyS4lISEcuqrQq2sPsvcl480rEajM0DIWNVoPi2ApKhADCygGoRxbykm4Tuce+rx0aWIPj1zDkuBM6NIYI1E9H2gxrH+P89Hlwmwq26S3HkqIvtW/BFAHJ8Z08iIg95NFwdbZBu4bMwY93r0KWhL0Y4xk9PGmCZhHk5jaaCgd5YREhJCH8ahenZ/t71yGdu71gSIVbg1xwGZNDKf9wRpOCW4oVQ+OWORDrgKX+58QZMOu0zjRxIkeFQV66xMIEziLYERW0xnT/GthH2+FdO/OlrUlzTBnQBbgqpp86cW1xKPFE1XeFJAIHXca7sYIjl/bz6csiUGSXKVyzApsz6fQEhaFwPGw7YKg/hN4+AEu7zYwHlpiPZyQZVE8xPEgwAy1ZKKk7nJ391ujXohXEsmc7u40bOdQmvktyjemf3KcYSCSoVqvdm49K8/ZfKgG1LMCSnHMk0HWdVGyO8jjBj3RnhpT1/dQ/aMudwPMsPFE+85GYEPTe9Sjq8erkjLRfGomDYWJhSpMESMovVRKpyjv9W+3xS0fHracj1AIx8iRQ9KNq7YKSX9n+wtE7LXMr6CUxwDs0wm1FCdVpc/JfH7BghbAh9qNSZg7qeNWQO9BG9vVa31EpRTDHOOogzGOQU2APtjc0qU65we6lpShBl2HU6S/5SgjB5m9ZnCsJSqlCQTf/e/Riuvx8l5LBlv1JNbHnLD6LO7xarpEKzR2Nc2N2+6pP86SvVB/ZqxGug06SUckjQbrmVrjU5X0RFWQAb4ZdPUobxk2xOXGhxUxEB/pDv5DcuDaEry97XsYBgzYpCtVZr8uQc5kd5jPcMsVgIYo78t+v+2yvCdYtRSHOrAcrOyBbrXCo1yI4UA9qAmfBE1PWC7km9xdhtlIAA5Szei+2oRxCwSvVO0TeYCwByDmYDolL0Tv5jtdgsPbcgnZsL/b9KRBAUU4wXKVm55mzw3AiOehX/bms84XLnRWZaxN06tJ/DiMbMcatTQP0pxk4zoemVD66wo7dA8U0nrnfP8AMfQmFQ==`, + expectedError: `"aes" provider failed to decrypt value: crypto/aes: invalid key size 1`, + + envVars: map[string]string{ + "OTEL_AES_CREDENTIAL_PROVIDER": "MQ==", + }, + }, + + { + name: "simple message", + configValue: "aes:RsEf6cTWrssi8tlssfs1AJs2bRMrVm2Ce5TaWPY=", + expectedValue: "1", + envVars: map[string]string{ + "OTEL_AES_CREDENTIAL_PROVIDER": "GQi+Y8HwOYzs8lAOjHUqB7vXlN8bVU2k0TAKtzwJzac=", + }, + }, + { + name: "empty message", + configValue: "aes:RsEf6cTWrssi8tlsZ4V68iFEJRFI8o71+QoYYw==", + expectedValue: "", + envVars: map[string]string{ + "OTEL_AES_CREDENTIAL_PROVIDER": "GQi+Y8HwOYzs8lAOjHUqB7vXlN8bVU2k0TAKtzwJzac=", + }, + }, + { + name: "Truncated base64 value", + configValue: "aes:R=", + expectedError: `"aes" provider failed to decrypt value: illegal base64 data at input byte 1`, + envVars: map[string]string{ + "OTEL_AES_CREDENTIAL_PROVIDER": "GQi+Y8HwOYzs8lAOjHUqB7vXlN8bVU2k0TAKtzwJzac=", + }, + }, + { + name: "Truncated encryted text", + configValue: "aes:MQ==", + expectedError: `"aes" provider failed to decrypt value: ciphertext too short`, + envVars: map[string]string{ + "OTEL_AES_CREDENTIAL_PROVIDER": "GQi+Y8HwOYzs8lAOjHUqB7vXlN8bVU2k0TAKtzwJzac=", + }, + }, + { + name: "Wrong schema", + configValue: "foo:MQ==", + expectedError: `"foo:MQ==" uri is not supported by "aes" provider`, + }, + { + name: "No env vars", + configValue: "aes:MQ==", + expectedError: `env var "OTEL_AES_CREDENTIAL_PROVIDER" not set, required for "aes" provider`, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + os.Clearenv() + for k, v := range tt.envVars { + if err := os.Setenv(k, v); err != nil { + t.Fatalf("Failed to set env var %s: %v", k, err) + } + } + + p := NewFactory().Create(confmap.ProviderSettings{}) + retrieved, err := p.Retrieve(context.Background(), tt.configValue, nil) + if tt.expectedError == "" { + require.NoError(t, err) + } else { + require.Error(t, err) + require.Equal(t, tt.expectedError, err.Error()) + return + } + require.NotNil(t, retrieved) + stringValue, err := retrieved.AsString() + require.NoError(t, err) + require.Equal(t, tt.expectedValue, stringValue) + }) + } +} diff --git a/confmap/provider/s3provider/README.md b/confmap/provider/s3provider/README.md index b863f876890e..d61a968b557e 100644 --- a/confmap/provider/s3provider/README.md +++ b/confmap/provider/s3provider/README.md @@ -1,5 +1,5 @@ ## Summary -This package provides a `ConfigMapProvider` implementation for Amazon S3 (`s3provider`) that allows the Collector the ability to load configuration by fetching and reading config objects stored in Amazon S3. +This package provides a `ConfigMapProvider` implementation for Amazon S3 (`s3provider`) that allows the Collector the ability to load configuration by fetching and reading config objects stored in Amazon S3. ## How it works - It will be called by `ConfigMapResolver` to load configuration for the Collector. - By giving a config URI starting with prefix `s3://`, this `s3provider` will be used to download config objects from the given S3 URIs, and then use the downloaded configuration during Collector initialization. diff --git a/confmap/provider/s3provider/go.mod b/confmap/provider/s3provider/go.mod index 5baf98871c16..184abb54ad65 100644 --- a/confmap/provider/s3provider/go.mod +++ b/confmap/provider/s3provider/go.mod @@ -1,38 +1,38 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/confmap/provider/s3provider -go 1.21.0 +go 1.22.0 require ( - github.com/aws/aws-sdk-go-v2 v1.27.0 - github.com/aws/aws-sdk-go-v2/config v1.27.16 - github.com/aws/aws-sdk-go-v2/service/s3 v1.54.3 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/confmap v0.102.0 + github.com/aws/aws-sdk-go-v2 v1.32.6 + github.com/aws/aws-sdk-go-v2/config v1.28.6 + github.com/aws/aws-sdk-go-v2/service/s3 v1.71.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/confmap v1.22.0 go.uber.org/goleak v1.3.0 gopkg.in/yaml.v2 v2.4.0 ) require ( - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.16 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.7 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.9 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.7 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.20.9 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.28.10 // indirect - github.com/aws/smithy-go v1.20.2 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.47 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.25 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.6 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.6 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.24.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.33.2 // indirect + github.com/aws/smithy-go v1.22.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect diff --git a/confmap/provider/s3provider/go.sum b/confmap/provider/s3provider/go.sum index 3da3d03e883f..0df10f67eef5 100644 --- a/confmap/provider/s3provider/go.sum +++ b/confmap/provider/s3provider/go.sum @@ -1,51 +1,51 @@ -github.com/aws/aws-sdk-go-v2 v1.27.0 h1:7bZWKoXhzI+mMR/HjdMx8ZCC5+6fY0lS5tr0bbgiLlo= -github.com/aws/aws-sdk-go-v2 v1.27.0/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 h1:x6xsQXGSmW6frevwDA+vi/wqhp1ct18mVXYN08/93to= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2/go.mod h1:lPprDr1e6cJdyYeGXnRaJoP4Md+cDBvi2eOj00BlGmg= -github.com/aws/aws-sdk-go-v2/config v1.27.16 h1:knpCuH7laFVGYTNd99Ns5t+8PuRjDn4HnnZK48csipM= -github.com/aws/aws-sdk-go-v2/config v1.27.16/go.mod h1:vutqgRhDUktwSge3hrC3nkuirzkJ4E/mLj5GvI0BQas= -github.com/aws/aws-sdk-go-v2/credentials v1.17.16 h1:7d2QxY83uYl0l58ceyiSpxg9bSbStqBC6BeEeHEchwo= -github.com/aws/aws-sdk-go-v2/credentials v1.17.16/go.mod h1:Ae6li/6Yc6eMzysRL2BXlPYvnrLLBg3D11/AmOjw50k= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3 h1:dQLK4TjtnlRGb0czOht2CevZ5l6RSyRWAnKeGd7VAFE= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3/go.mod h1:TL79f2P6+8Q7dTsILpiVST+AL9lkF6PPGI167Ny0Cjw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7 h1:lf/8VTF2cM+N4SLzaYJERKEWAXq8MOMpZfU6wEPWsPk= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7/go.mod h1:4SjkU7QiqK2M9oozyMzfZ/23LmUY+h3oFqhdeP5OMiI= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7 h1:4OYVp0705xu8yjdyoWix0r9wPIRXnIzzOoUpQVHIJ/g= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7/go.mod h1:vd7ESTEvI76T2Na050gODNmNU7+OyKrIKroYTu4ABiI= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.7 h1:/FUtT3xsoHO3cfh+I/kCbcMCN98QZRsiFet/V8QkWSs= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.7/go.mod h1:MaCAgWpGooQoCWZnMur97rGn5dp350w2+CeiV5406wE= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2/go.mod h1:5CsjAbs3NlGQyZNFACh+zztPDI7fU6eW9QsxjfnuBKg= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.9 h1:UXqEWQI0n+q0QixzU0yUUQBZXRd5037qdInTIHFTl98= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.9/go.mod h1:xP6Gq6fzGZT8w/ZN+XvGMZ2RU1LeEs7b2yUP5DN8NY4= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9 h1:Wx0rlZoEJR7JwlSZcHnEa7CNjrSIyVxMFWGAaXy4fJY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9/go.mod h1:aVMHdE0aHO3v+f/iw01fmXV/5DbfQ3Bi9nN7nd9bE9Y= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.7 h1:uO5XR6QGBcmPyo2gxofYJLFkcVQ4izOoGDNenlZhTEk= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.7/go.mod h1:feeeAYfAcwTReM6vbwjEyDmiGho+YgBhaFULuXDW8kc= -github.com/aws/aws-sdk-go-v2/service/s3 v1.54.3 h1:57NtjG+WLims0TxIQbjTqebZUKDM03DfM11ANAekW0s= -github.com/aws/aws-sdk-go-v2/service/s3 v1.54.3/go.mod h1:739CllldowZiPPsDFcJHNF4FXrVxaSGVnZ9Ez9Iz9hc= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.9 h1:aD7AGQhvPuAxlSUfo0CWU7s6FpkbyykMhGYMvlqTjVs= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.9/go.mod h1:c1qtZUWtygI6ZdvKppzCSXsDOq5I4luJPZ0Ud3juFCA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.3 h1:Pav5q3cA260Zqez42T9UhIlsd9QeypszRPwC9LdSSsQ= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.3/go.mod h1:9lmoVDVLz/yUZwLaQ676TK02fhCu4+PgRSmMaKR1ozk= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.10 h1:69tpbPED7jKPyzMcrwSvhWcJ9bPnZsZs18NT40JwM0g= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.10/go.mod h1:0Aqn1MnEuitqfsCNyKsdKLhDUOr4txD/g19EfiUqgws= -github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= -github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= +github.com/aws/aws-sdk-go-v2 v1.32.6 h1:7BokKRgRPuGmKkFMhEg/jSul+tB9VvXhcViILtfG8b4= +github.com/aws/aws-sdk-go-v2 v1.32.6/go.mod h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 h1:lL7IfaFzngfx0ZwUGOZdsFFnQ5uLvR0hWqqhyE7Q9M8= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7/go.mod h1:QraP0UcVlQJsmHfioCrveWOC1nbiWUl3ej08h4mXWoc= +github.com/aws/aws-sdk-go-v2/config v1.28.6 h1:D89IKtGrs/I3QXOLNTH93NJYtDhm8SYa9Q5CsPShmyo= +github.com/aws/aws-sdk-go-v2/config v1.28.6/go.mod h1:GDzxJ5wyyFSCoLkS+UhGB0dArhb9mI+Co4dHtoTxbko= +github.com/aws/aws-sdk-go-v2/credentials v1.17.47 h1:48bA+3/fCdi2yAwVt+3COvmatZ6jUDNkDTIsqDiMUdw= +github.com/aws/aws-sdk-go-v2/credentials v1.17.47/go.mod h1:+KdckOejLW3Ks3b0E3b5rHsr2f9yuORBum0WPnE5o5w= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21 h1:AmoU1pziydclFT/xRV+xXE/Vb8fttJCLRPv8oAkprc0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21/go.mod h1:AjUdLYe4Tgs6kpH4Bv7uMZo7pottoyHMn4eTcIcneaY= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25 h1:s/fF4+yDQDoElYhfIVvSNyeCydfbuTKzhxSXDXCPasU= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25/go.mod h1:IgPfDv5jqFIzQSNbUEMoitNooSMXjRSDkhXv8jiROvU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25 h1:ZntTCl5EsYnhN/IygQEUugpdwbhdkom9uHcbCftiGgA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25/go.mod h1:DBdPrgeocww+CSl1C8cEV8PN1mHMBhuCDLpXezyvWkE= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.25 h1:r67ps7oHCYnflpgDy2LZU0MAQtQbYIOqNNnqGO6xQkE= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.25/go.mod h1:GrGY+Q4fIokYLtjCVB/aFfCVL6hhGUFl8inD18fDalE= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.6 h1:HCpPsWqmYQieU7SS6E9HXfdAMSud0pteVXieJmcpIRI= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.6/go.mod h1:ngUiVRCco++u+soRRVBIvBZxSMMvOVMXA4PJ36JLfSw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6 h1:50+XsN70RS7dwJ2CkVNXzj7U2L1HKP8nqTd3XWEXBN4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6/go.mod h1:WqgLmwY7so32kG01zD8CPTJWVWM+TzJoOVHwTg4aPug= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.6 h1:BbGDtTi0T1DYlmjBiCr/le3wzhA37O8QTC5/Ab8+EXk= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.6/go.mod h1:hLMJt7Q8ePgViKupeymbqI0la+t9/iYFBjxQCFwuAwI= +github.com/aws/aws-sdk-go-v2/service/s3 v1.71.0 h1:nyuzXooUNJexRT0Oy0UQY6AhOzxPxhtt4DcBIHyCnmw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.71.0/go.mod h1:sT/iQz8JK3u/5gZkT+Hmr7GzVZehUMkRZpOaAwYXeGY= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.7 h1:rLnYAfXQ3YAccocshIH5mzNNwZBkBo+bP6EhIxak6Hw= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.7/go.mod h1:ZHtuQJ6t9A/+YDuxOLnbryAmITtr8UysSny3qcyvJTc= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6 h1:JnhTZR3PiYDNKlXy50/pNeix9aGMo6lLpXwJ1mw8MD4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6/go.mod h1:URronUEGfXZN1VpdktPSD1EkAL9mfrV+2F4sjH38qOY= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.2 h1:s4074ZO1Hk8qv65GqNXqDjmkf4HSQqJukaLuuW0TpDA= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.2/go.mod h1:mVggCnIWoM09jP71Wh+ea7+5gAp53q+49wDFs1SW5z8= +github.com/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro= +github.com/aws/smithy-go v1.22.1/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= @@ -54,10 +54,12 @@ github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zx github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -65,8 +67,8 @@ go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8 go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/confmap/provider/s3provider/provider_test.go b/confmap/provider/s3provider/provider_test.go index c82a4b69eaf7..3d585e694018 100644 --- a/confmap/provider/s3provider/provider_test.go +++ b/confmap/provider/s3provider/provider_test.go @@ -61,7 +61,6 @@ func TestFunctionalityS3URISplit(t *testing.T) { } func TestURIs(t *testing.T) { - tests := []struct { name string uri string diff --git a/confmap/provider/s3provider/testdata/otel-config.yaml b/confmap/provider/s3provider/testdata/otel-config.yaml index 8505ef559360..dca6c9a98041 100644 --- a/confmap/provider/s3provider/testdata/otel-config.yaml +++ b/confmap/provider/s3provider/testdata/otel-config.yaml @@ -1,6 +1,4 @@ extensions: - memory_ballast: - size_mib: 512 zpages: endpoint: 0.0.0.0:55679 @@ -34,4 +32,4 @@ service: processors: [memory_limiter, batch] exporters: [debug] - extensions: [memory_ballast, zpages] + extensions: [zpages] diff --git a/confmap/provider/secretsmanagerprovider/README.md b/confmap/provider/secretsmanagerprovider/README.md index fad55427eea2..475cf8369a21 100644 --- a/confmap/provider/secretsmanagerprovider/README.md +++ b/confmap/provider/secretsmanagerprovider/README.md @@ -5,7 +5,8 @@ Collector the ability to read data stored in AWS Secrets Manager. ## How it works - Just use the placeholders with the following pattern `${secretsmanager:}` - Make sure you have the `secretsmanager:GetSecretValue` in the OTEL Collector Role +- If your secret is a json string, you can get the value for a json key using the following pattern `${secretsmanager:#json-key}` Prerequisites: -- Need to setup access keys from IAM console (aws_access_key_id and aws_secret_access_key) with permission to access Amazon Secrets Manager -- For details, can take a look at https://aws.github.io/aws-sdk-go-v2/docs/configuring-sdk/ \ No newline at end of file +- Need to set up access keys from IAM console (aws_access_key_id and aws_secret_access_key) with permission to access Amazon Secrets Manager +- For details, can take a look at https://aws.github.io/aws-sdk-go-v2/docs/configuring-sdk/ diff --git a/confmap/provider/secretsmanagerprovider/go.mod b/confmap/provider/secretsmanagerprovider/go.mod index d56a77850400..07c7e7699504 100644 --- a/confmap/provider/secretsmanagerprovider/go.mod +++ b/confmap/provider/secretsmanagerprovider/go.mod @@ -1,29 +1,35 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/confmap/provider/secretsmanagerprovider -go 1.21.0 +go 1.22.0 require ( - github.com/aws/aws-sdk-go-v2 v1.27.0 - github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.29.1 - github.com/aws/smithy-go v1.20.2 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/confmap v0.102.0 + github.com/aws/aws-sdk-go-v2/config v1.28.6 + github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.7 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/confmap v1.22.0 ) require ( - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7 // indirect + github.com/aws/aws-sdk-go-v2 v1.32.6 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.47 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.24.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.33.2 // indirect + github.com/aws/smithy-go v1.22.1 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/knadh/koanf v1.5.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect - github.com/kr/pretty v0.3.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/rogpeppe/go-internal v1.10.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/confmap/provider/secretsmanagerprovider/go.sum b/confmap/provider/secretsmanagerprovider/go.sum index 04916335529e..42309ed4da21 100644 --- a/confmap/provider/secretsmanagerprovider/go.sum +++ b/confmap/provider/secretsmanagerprovider/go.sum @@ -12,25 +12,43 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aws/aws-sdk-go-v2 v1.9.2/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= -github.com/aws/aws-sdk-go-v2 v1.27.0 h1:7bZWKoXhzI+mMR/HjdMx8ZCC5+6fY0lS5tr0bbgiLlo= -github.com/aws/aws-sdk-go-v2 v1.27.0/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= +github.com/aws/aws-sdk-go-v2 v1.32.6 h1:7BokKRgRPuGmKkFMhEg/jSul+tB9VvXhcViILtfG8b4= +github.com/aws/aws-sdk-go-v2 v1.32.6/go.mod h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U= github.com/aws/aws-sdk-go-v2/config v1.8.3/go.mod h1:4AEiLtAb8kLs7vgw2ZV3p2VZ1+hBavOc84hqxVNpCyw= +github.com/aws/aws-sdk-go-v2/config v1.28.6 h1:D89IKtGrs/I3QXOLNTH93NJYtDhm8SYa9Q5CsPShmyo= +github.com/aws/aws-sdk-go-v2/config v1.28.6/go.mod h1:GDzxJ5wyyFSCoLkS+UhGB0dArhb9mI+Co4dHtoTxbko= github.com/aws/aws-sdk-go-v2/credentials v1.4.3/go.mod h1:FNNC6nQZQUuyhq5aE5c7ata8o9e4ECGmS4lAXC7o1mQ= +github.com/aws/aws-sdk-go-v2/credentials v1.17.47 h1:48bA+3/fCdi2yAwVt+3COvmatZ6jUDNkDTIsqDiMUdw= +github.com/aws/aws-sdk-go-v2/credentials v1.17.47/go.mod h1:+KdckOejLW3Ks3b0E3b5rHsr2f9yuORBum0WPnE5o5w= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.6.0/go.mod h1:gqlclDEZp4aqJOancXK6TN24aKhT0W0Ae9MHk3wzTMM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7 h1:lf/8VTF2cM+N4SLzaYJERKEWAXq8MOMpZfU6wEPWsPk= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7/go.mod h1:4SjkU7QiqK2M9oozyMzfZ/23LmUY+h3oFqhdeP5OMiI= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7 h1:4OYVp0705xu8yjdyoWix0r9wPIRXnIzzOoUpQVHIJ/g= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7/go.mod h1:vd7ESTEvI76T2Na050gODNmNU7+OyKrIKroYTu4ABiI= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21 h1:AmoU1pziydclFT/xRV+xXE/Vb8fttJCLRPv8oAkprc0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21/go.mod h1:AjUdLYe4Tgs6kpH4Bv7uMZo7pottoyHMn4eTcIcneaY= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25 h1:s/fF4+yDQDoElYhfIVvSNyeCydfbuTKzhxSXDXCPasU= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25/go.mod h1:IgPfDv5jqFIzQSNbUEMoitNooSMXjRSDkhXv8jiROvU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25 h1:ZntTCl5EsYnhN/IygQEUugpdwbhdkom9uHcbCftiGgA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25/go.mod h1:DBdPrgeocww+CSl1C8cEV8PN1mHMBhuCDLpXezyvWkE= github.com/aws/aws-sdk-go-v2/internal/ini v1.2.4/go.mod h1:ZcBrrI3zBKlhGFNYWvju0I3TR93I7YIgAfy82Fh4lcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= github.com/aws/aws-sdk-go-v2/service/appconfig v1.4.2/go.mod h1:FZ3HkCe+b10uFZZkFdvf98LHW21k49W8o8J366lqVKY= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.3.2/go.mod h1:72HRZDLMtmVQiLG2tLfQcaWLCssELvGl+Zf2WVxMmR8= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.29.1 h1:NSWsFzdHN41mJ5I/DOFzxgkKSYNHQADHn7Mu+lU/AKw= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.29.1/go.mod h1:5mMk0DgUgaHlcqtN65fNyZI0ZDX3i9Cw+nwq75HKB3U= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6 h1:50+XsN70RS7dwJ2CkVNXzj7U2L1HKP8nqTd3XWEXBN4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6/go.mod h1:WqgLmwY7so32kG01zD8CPTJWVWM+TzJoOVHwTg4aPug= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.7 h1:Nyfbgei75bohfmZNxgN27i528dGYVzqWJGlAO6lzXy8= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.7/go.mod h1:FG4p/DciRxPgjA+BEOlwRHN0iA8hX2h9g5buSy3cTDA= github.com/aws/aws-sdk-go-v2/service/sso v1.4.2/go.mod h1:NBvT9R1MEF+Ud6ApJKM0G+IkPchKS7p7c2YPKwHmBOk= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.7 h1:rLnYAfXQ3YAccocshIH5mzNNwZBkBo+bP6EhIxak6Hw= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.7/go.mod h1:ZHtuQJ6t9A/+YDuxOLnbryAmITtr8UysSny3qcyvJTc= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6 h1:JnhTZR3PiYDNKlXy50/pNeix9aGMo6lLpXwJ1mw8MD4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6/go.mod h1:URronUEGfXZN1VpdktPSD1EkAL9mfrV+2F4sjH38qOY= github.com/aws/aws-sdk-go-v2/service/sts v1.7.2/go.mod h1:8EzeIqfWt2wWT4rJVu3f21TfrhJ8AEMzVybRNSb/b4g= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.2 h1:s4074ZO1Hk8qv65GqNXqDjmkf4HSQqJukaLuuW0TpDA= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.2/go.mod h1:mVggCnIWoM09jP71Wh+ea7+5gAp53q+49wDFs1SW5z8= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= -github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= -github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= +github.com/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro= +github.com/aws/smithy-go v1.22.1/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= @@ -42,7 +60,6 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -67,8 +84,8 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= @@ -150,14 +167,13 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/knadh/koanf v1.5.0 h1:q2TSd/3Pyc/5yP9ldIrSdIz26MCcyNQzW0pEAugLPNs= github.com/knadh/koanf v1.5.0/go.mod h1:Hgyjp4y8v44hpZtPzs7JZfRAW5AhN7KfZcwv1RYggDs= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -202,7 +218,6 @@ github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FI github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -228,7 +243,6 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/rhnvrm/simples3 v0.6.1/go.mod h1:Y+3vYm2V7Y4VijFoJHHTrja6OgPrJ2cBti8dPGkC3sA= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -246,16 +260,16 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= diff --git a/confmap/provider/secretsmanagerprovider/provider.go b/confmap/provider/secretsmanagerprovider/provider.go index 515966547785..50c8fef263de 100644 --- a/confmap/provider/secretsmanagerprovider/provider.go +++ b/confmap/provider/secretsmanagerprovider/provider.go @@ -5,19 +5,25 @@ package secretsmanagerprovider // import "github.com/open-telemetry/opentelemetr import ( "context" + "encoding/json" "fmt" "strings" + "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/secretsmanager" "go.opentelemetry.io/collector/confmap" ) +type secretsManagerClient interface { + GetSecretValue(ctx context.Context, params *secretsmanager.GetSecretValueInput, optFns ...func(*secretsmanager.Options)) (*secretsmanager.GetSecretValueOutput, error) +} + const ( schemeName = "secretsmanager" ) type provider struct { - client *secretsmanager.Client + client secretsManagerClient } // NewFactory returns a new confmap.ProviderFactory that creates a confmap.Provider @@ -40,7 +46,7 @@ func newWithSettings(_ confmap.ProviderSettings) confmap.Provider { // // Deprecated: [v0.100.0] Use NewFactory() instead. func New() confmap.Provider { - return &provider{} + return &provider{client: nil} } func (provider *provider) Retrieve(ctx context.Context, uri string, _ confmap.WatcherFunc) (*confmap.Retrieved, error) { @@ -48,7 +54,18 @@ func (provider *provider) Retrieve(ctx context.Context, uri string, _ confmap.Wa return nil, fmt.Errorf("%q uri is not supported by %q provider", uri, schemeName) } - secretArn := strings.Replace(uri, schemeName+":", "", 1) + // initialize the secrets manager client in the first call of Retrieve + if provider.client == nil { + cfg, err := config.LoadDefaultConfig(ctx) + if err != nil { + return nil, fmt.Errorf("failed to load configurations to initialize an AWS SDK client, error: %w", err) + } + + provider.client = secretsmanager.NewFromConfig(cfg) + } + + // Remove schemeName and split by # to get the json key + secretArn, secretJSONKey, jsonKeyFound := strings.Cut(strings.Replace(uri, schemeName+":", "", 1), "#") input := &secretsmanager.GetSecretValueInput{ SecretId: &secretArn, @@ -56,13 +73,28 @@ func (provider *provider) Retrieve(ctx context.Context, uri string, _ confmap.Wa response, err := provider.client.GetSecretValue(ctx, input) if err != nil { - return nil, err + return nil, fmt.Errorf("error gtting secret: %w", err) } if response.SecretString == nil { return nil, nil } + if jsonKeyFound { + var secretFieldsMap map[string]any + err := json.Unmarshal([]byte(*response.SecretString), &secretFieldsMap) + if err != nil { + return nil, fmt.Errorf("error unmarshalling secret string: %w", err) + } + + secretValue, ok := secretFieldsMap[secretJSONKey] + if !ok { + return nil, fmt.Errorf("field %q not found in secret map", secretJSONKey) + } + + return confmap.NewRetrieved(secretValue) + } + return confmap.NewRetrieved(*response.SecretString) } diff --git a/confmap/provider/secretsmanagerprovider/provider_test.go b/confmap/provider/secretsmanagerprovider/provider_test.go index 390e7d218463..6f604f96ec8a 100644 --- a/confmap/provider/secretsmanagerprovider/provider_test.go +++ b/confmap/provider/secretsmanagerprovider/provider_test.go @@ -5,67 +5,56 @@ package secretsmanagerprovider import ( "context" - "encoding/json" - "net/http" - "net/http/httptest" + "fmt" "testing" - "time" - "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/secretsmanager" - transport "github.com/aws/smithy-go/endpoints" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/confmap" ) -type resolver struct { - url string +// Mock AWS secretsmanager +type testSecretManagerClient struct { + secretValue string } -func (r resolver) ResolveEndpoint(ctx context.Context, params secretsmanager.EndpointParameters) (transport.Endpoint, error) { - region := "us-east-1" - params.Region = ®ion - params.Endpoint = &r.url - - old := secretsmanager.NewDefaultEndpointResolverV2() - return old.ResolveEndpoint(ctx, params) +// Implement GetSecretValue() +func (client *testSecretManagerClient) GetSecretValue(_ context.Context, _ *secretsmanager.GetSecretValueInput, + _ ...func(*secretsmanager.Options), +) (*secretsmanager.GetSecretValueOutput, error) { + return &secretsmanager.GetSecretValueOutput{SecretString: &client.secretValue}, nil } -// Create a provider mocking s3provider works in normal cases -func NewTestProvider(url string) confmap.Provider { - cfg := aws.NewConfig() - - return &provider{client: secretsmanager.NewFromConfig(*cfg, secretsmanager.WithEndpointResolverV2(resolver{url: url}))} +// Create a provider using mock secretsmanager client +func NewTestProvider(secretValue string) confmap.Provider { + return &provider{client: &testSecretManagerClient{secretValue: secretValue}} } func TestSecretsManagerFetchSecret(t *testing.T) { secretName := "FOO" secretValue := "BAR" - s := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) { - if request.Header.Get("X-Amz-Target") == "secretsmanager.GetSecretValue" { - response := &struct { - Arn string `json:"ARN"` - CreatedDate int64 `json:"CreatedDate"` - Name string `json:"Name"` - SecretString string `json:"SecretString"` - }{ - Arn: secretName, - CreatedDate: time.Now().Unix(), - Name: secretName, - SecretString: secretValue, - } - - b, _ := json.Marshal(response) - _, err := writer.Write(b) - require.NoError(t, err) - writer.WriteHeader(http.StatusOK) - } - })) - defer s.Close() - fp := NewTestProvider(s.URL) + fp := NewTestProvider(secretValue) + result, err := fp.Retrieve(context.Background(), "secretsmanager:"+secretName, nil) + + assert.NoError(t, err) + assert.NoError(t, fp.Shutdown(context.Background())) + + value, err := result.AsRaw() + assert.NoError(t, err) + assert.NotNil(t, value) + assert.Equal(t, secretValue, value) +} + +func TestFetchSecretsManagerFieldValidJson(t *testing.T) { + secretName := "FOO#field1" + secretValue := "BAR" + secretJSON := fmt.Sprintf("{\"field1\": \"%s\"}", secretValue) + + fp := NewTestProvider(secretJSON) result, err := fp.Retrieve(context.Background(), "secretsmanager:"+secretName, nil) + assert.NoError(t, err) assert.NoError(t, fp.Shutdown(context.Background())) @@ -75,6 +64,29 @@ func TestSecretsManagerFetchSecret(t *testing.T) { assert.Equal(t, secretValue, value) } +func TestFetchSecretsManagerFieldInvalidJson(t *testing.T) { + secretName := "FOO#field1" + secretValue := "BAR" + + fp := NewTestProvider(secretValue) + _, err := fp.Retrieve(context.Background(), "secretsmanager:"+secretName, nil) + + assert.Error(t, err) + assert.NoError(t, fp.Shutdown(context.Background())) +} + +func TestFetchSecretsManagerFieldMissingInJson(t *testing.T) { + secretName := "FOO#field1" + secretValue := "BAR" + secretJSON := fmt.Sprintf("{\"field0\": \"%s\"}", secretValue) + + fp := NewTestProvider(secretJSON) + _, err := fp.Retrieve(context.Background(), "secretsmanager:"+secretName, nil) + + assert.Error(t, err) + assert.NoError(t, fp.Shutdown(context.Background())) +} + func TestFactory(t *testing.T) { p := NewFactory().Create(confmap.ProviderSettings{}) _, ok := p.(*provider) diff --git a/connector/countconnector/README.md b/connector/countconnector/README.md index 278868f0815d..bd226f07ec82 100644 --- a/connector/countconnector/README.md +++ b/connector/countconnector/README.md @@ -2,24 +2,25 @@ | Status | | | ------------- |-----------| -| Distributions | [contrib] | +| Distributions | [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aconnector%2Fcount%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aconnector%2Fcount) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aconnector%2Fcount%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aconnector%2Fcount) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@djaglowski](https://www.github.com/djaglowski), [@jpkrohling](https://www.github.com/jpkrohling) | -[development]: https://github.com/open-telemetry/opentelemetry-collector#development +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s ## Supported Pipeline Types | [Exporter Pipeline Type] | [Receiver Pipeline Type] | [Stability Level] | | ------------------------ | ------------------------ | ----------------- | -| traces | metrics | [development] | -| metrics | metrics | [development] | -| logs | metrics | [development] | +| traces | metrics | [alpha] | +| metrics | metrics | [alpha] | +| logs | metrics | [alpha] | [Exporter Pipeline Type]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md#exporter-pipeline-type [Receiver Pipeline Type]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md#receiver-pipeline-type -[Stability Level]: https://github.com/open-telemetry/opentelemetry-collector#stability-levels +[Stability Level]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#stability-levels The `count` connector can be used to count spans, span events, metrics, data points, and log records. @@ -35,7 +36,7 @@ default behavior of the connector. | [Exporter Pipeline Type] | Description | Default Metric Names | | ------------------------ | ----------------------------------- | -------------------------------------------- | | traces | Counts all spans and span events. | `trace.span.count`, `trace.span.event.count` | -| metrics | Counts all metrics and data points. | `metric.count`, `metric.data_point.count` | +| metrics | Counts all metrics and data points. | `metric.count`, `metric.datapoint.count` | | logs | Counts all log records. | `log.record.count` | For example, in the following configuration the connector will count spans and span events from the `traces/in` diff --git a/connector/countconnector/config_test.go b/connector/countconnector/config_test.go index c19fef80ff4a..02728e2ed18a 100644 --- a/connector/countconnector/config_test.go +++ b/connector/countconnector/config_test.go @@ -279,7 +279,8 @@ func TestLoadConfig(t *testing.T) { }, Metrics: map[string]MetricInfo{ "my.metric.count": { - Description: "My metric count."}, + Description: "My metric count.", + }, "limited.metric.count": { Description: "Limited metric count.", Conditions: []string{`IsMatch(resource.attributes["host.name"], "pod-m")`}, @@ -382,7 +383,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, tc.name).String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.Equal(t, tc.expect, cfg) }) @@ -515,8 +516,7 @@ func TestConfigErrors(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { err := tc.input.Validate() - assert.Error(t, err) - assert.Contains(t, err.Error(), tc.expect) + assert.ErrorContains(t, err, tc.expect) }) } } diff --git a/connector/countconnector/connector.go b/connector/countconnector/connector.go index 2cf5280fecec..3a6ef3f443f0 100644 --- a/connector/countconnector/connector.go +++ b/connector/countconnector/connector.go @@ -15,6 +15,7 @@ import ( "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" + "github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector/internal/metadata" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottldatapoint" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottllog" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottlmetric" @@ -22,8 +23,6 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottlspanevent" ) -const scopeName = "otelcol/countconnector" - // count can count spans, span event, metrics, data points, or log records // and emit the counts onto a metrics pipeline. type count struct { @@ -56,12 +55,12 @@ func (c *count) ConsumeTraces(ctx context.Context, td ptrace.Traces) error { for k := 0; k < scopeSpan.Spans().Len(); k++ { span := scopeSpan.Spans().At(k) - sCtx := ottlspan.NewTransformContext(span, scopeSpan.Scope(), resourceSpan.Resource()) + sCtx := ottlspan.NewTransformContext(span, scopeSpan.Scope(), resourceSpan.Resource(), scopeSpan, resourceSpan) multiError = errors.Join(multiError, spansCounter.update(ctx, span.Attributes(), sCtx)) for l := 0; l < span.Events().Len(); l++ { event := span.Events().At(l) - eCtx := ottlspanevent.NewTransformContext(event, span, scopeSpan.Scope(), resourceSpan.Resource()) + eCtx := ottlspanevent.NewTransformContext(event, span, scopeSpan.Scope(), resourceSpan.Resource(), scopeSpan, resourceSpan) multiError = errors.Join(multiError, spanEventsCounter.update(ctx, event.Attributes(), eCtx)) } } @@ -76,7 +75,7 @@ func (c *count) ConsumeTraces(ctx context.Context, td ptrace.Traces) error { countResource.ScopeMetrics().EnsureCapacity(resourceSpan.ScopeSpans().Len()) countScope := countResource.ScopeMetrics().AppendEmpty() - countScope.Scope().SetName(scopeName) + countScope.Scope().SetName(metadata.ScopeName) spansCounter.appendMetricsTo(countScope.Metrics()) spanEventsCounter.appendMetricsTo(countScope.Metrics()) @@ -101,7 +100,7 @@ func (c *count) ConsumeMetrics(ctx context.Context, md pmetric.Metrics) error { for k := 0; k < scopeMetrics.Metrics().Len(); k++ { metric := scopeMetrics.Metrics().At(k) - mCtx := ottlmetric.NewTransformContext(metric, scopeMetrics.Metrics(), scopeMetrics.Scope(), resourceMetric.Resource()) + mCtx := ottlmetric.NewTransformContext(metric, scopeMetrics.Metrics(), scopeMetrics.Scope(), resourceMetric.Resource(), scopeMetrics, resourceMetric) multiError = errors.Join(multiError, metricsCounter.update(ctx, pcommon.NewMap(), mCtx)) //exhaustive:enforce @@ -109,31 +108,31 @@ func (c *count) ConsumeMetrics(ctx context.Context, md pmetric.Metrics) error { case pmetric.MetricTypeGauge: dps := metric.Gauge().DataPoints() for i := 0; i < dps.Len(); i++ { - dCtx := ottldatapoint.NewTransformContext(dps.At(i), metric, scopeMetrics.Metrics(), scopeMetrics.Scope(), resourceMetric.Resource()) + dCtx := ottldatapoint.NewTransformContext(dps.At(i), metric, scopeMetrics.Metrics(), scopeMetrics.Scope(), resourceMetric.Resource(), scopeMetrics, resourceMetric) multiError = errors.Join(multiError, dataPointsCounter.update(ctx, dps.At(i).Attributes(), dCtx)) } case pmetric.MetricTypeSum: dps := metric.Sum().DataPoints() for i := 0; i < dps.Len(); i++ { - dCtx := ottldatapoint.NewTransformContext(dps.At(i), metric, scopeMetrics.Metrics(), scopeMetrics.Scope(), resourceMetric.Resource()) + dCtx := ottldatapoint.NewTransformContext(dps.At(i), metric, scopeMetrics.Metrics(), scopeMetrics.Scope(), resourceMetric.Resource(), scopeMetrics, resourceMetric) multiError = errors.Join(multiError, dataPointsCounter.update(ctx, dps.At(i).Attributes(), dCtx)) } case pmetric.MetricTypeSummary: dps := metric.Summary().DataPoints() for i := 0; i < dps.Len(); i++ { - dCtx := ottldatapoint.NewTransformContext(dps.At(i), metric, scopeMetrics.Metrics(), scopeMetrics.Scope(), resourceMetric.Resource()) + dCtx := ottldatapoint.NewTransformContext(dps.At(i), metric, scopeMetrics.Metrics(), scopeMetrics.Scope(), resourceMetric.Resource(), scopeMetrics, resourceMetric) multiError = errors.Join(multiError, dataPointsCounter.update(ctx, dps.At(i).Attributes(), dCtx)) } case pmetric.MetricTypeHistogram: dps := metric.Histogram().DataPoints() for i := 0; i < dps.Len(); i++ { - dCtx := ottldatapoint.NewTransformContext(dps.At(i), metric, scopeMetrics.Metrics(), scopeMetrics.Scope(), resourceMetric.Resource()) + dCtx := ottldatapoint.NewTransformContext(dps.At(i), metric, scopeMetrics.Metrics(), scopeMetrics.Scope(), resourceMetric.Resource(), scopeMetrics, resourceMetric) multiError = errors.Join(multiError, dataPointsCounter.update(ctx, dps.At(i).Attributes(), dCtx)) } case pmetric.MetricTypeExponentialHistogram: dps := metric.ExponentialHistogram().DataPoints() for i := 0; i < dps.Len(); i++ { - dCtx := ottldatapoint.NewTransformContext(dps.At(i), metric, scopeMetrics.Metrics(), scopeMetrics.Scope(), resourceMetric.Resource()) + dCtx := ottldatapoint.NewTransformContext(dps.At(i), metric, scopeMetrics.Metrics(), scopeMetrics.Scope(), resourceMetric.Resource(), scopeMetrics, resourceMetric) multiError = errors.Join(multiError, dataPointsCounter.update(ctx, dps.At(i).Attributes(), dCtx)) } case pmetric.MetricTypeEmpty: @@ -151,7 +150,7 @@ func (c *count) ConsumeMetrics(ctx context.Context, md pmetric.Metrics) error { countResource.ScopeMetrics().EnsureCapacity(resourceMetric.ScopeMetrics().Len()) countScope := countResource.ScopeMetrics().AppendEmpty() - countScope.Scope().SetName(scopeName) + countScope.Scope().SetName(metadata.ScopeName) metricsCounter.appendMetricsTo(countScope.Metrics()) dataPointsCounter.appendMetricsTo(countScope.Metrics()) @@ -176,7 +175,7 @@ func (c *count) ConsumeLogs(ctx context.Context, ld plog.Logs) error { for k := 0; k < scopeLogs.LogRecords().Len(); k++ { logRecord := scopeLogs.LogRecords().At(k) - lCtx := ottllog.NewTransformContext(logRecord, scopeLogs.Scope(), resourceLog.Resource()) + lCtx := ottllog.NewTransformContext(logRecord, scopeLogs.Scope(), resourceLog.Resource(), scopeLogs, resourceLog) multiError = errors.Join(multiError, counter.update(ctx, logRecord.Attributes(), lCtx)) } } @@ -190,7 +189,7 @@ func (c *count) ConsumeLogs(ctx context.Context, ld plog.Logs) error { countResource.ScopeMetrics().EnsureCapacity(resourceLog.ScopeLogs().Len()) countScope := countResource.ScopeMetrics().AppendEmpty() - countScope.Scope().SetName(scopeName) + countScope.Scope().SetName(metadata.ScopeName) counter.appendMetricsTo(countScope.Metrics()) } diff --git a/connector/countconnector/connector_test.go b/connector/countconnector/connector_test.go index 535ac5f8e052..44ad48f8e9a5 100644 --- a/connector/countconnector/connector_test.go +++ b/connector/countconnector/connector_test.go @@ -250,7 +250,7 @@ func TestTracesToMetrics(t *testing.T) { factory := NewFactory() sink := &consumertest.MetricsSink{} conn, err := factory.CreateTracesToMetrics(context.Background(), - connectortest.NewNopCreateSettings(), tc.cfg, sink) + connectortest.NewNopSettings(), tc.cfg, sink) require.NoError(t, err) require.NotNil(t, conn) assert.False(t, conn.Capabilities().MutatesData) @@ -265,7 +265,7 @@ func TestTracesToMetrics(t *testing.T) { assert.NoError(t, conn.ConsumeTraces(context.Background(), testSpans)) allMetrics := sink.AllMetrics() - assert.Equal(t, 1, len(allMetrics)) + assert.Len(t, allMetrics, 1) // golden.WriteMetrics(t, filepath.Join("testdata", "traces", tc.name+".yaml"), allMetrics[0]) expected, err := golden.ReadMetrics(filepath.Join("testdata", "traces", tc.name+".yaml")) @@ -492,7 +492,7 @@ func TestMetricsToMetrics(t *testing.T) { factory := NewFactory() sink := &consumertest.MetricsSink{} conn, err := factory.CreateMetricsToMetrics(context.Background(), - connectortest.NewNopCreateSettings(), tc.cfg, sink) + connectortest.NewNopSettings(), tc.cfg, sink) require.NoError(t, err) require.NotNil(t, conn) assert.False(t, conn.Capabilities().MutatesData) @@ -507,7 +507,7 @@ func TestMetricsToMetrics(t *testing.T) { assert.NoError(t, conn.ConsumeMetrics(context.Background(), testMetrics)) allMetrics := sink.AllMetrics() - assert.Equal(t, 1, len(allMetrics)) + assert.Len(t, allMetrics, 1) // golden.WriteMetrics(t, filepath.Join("testdata", "metrics", tc.name+".yaml"), allMetrics[0]) expected, err := golden.ReadMetrics(filepath.Join("testdata", "metrics", tc.name+".yaml")) @@ -664,7 +664,7 @@ func TestLogsToMetrics(t *testing.T) { factory := NewFactory() sink := &consumertest.MetricsSink{} conn, err := factory.CreateLogsToMetrics(context.Background(), - connectortest.NewNopCreateSettings(), tc.cfg, sink) + connectortest.NewNopSettings(), tc.cfg, sink) require.NoError(t, err) require.NotNil(t, conn) assert.False(t, conn.Capabilities().MutatesData) @@ -679,7 +679,7 @@ func TestLogsToMetrics(t *testing.T) { assert.NoError(t, conn.ConsumeLogs(context.Background(), testLogs)) allMetrics := sink.AllMetrics() - assert.Equal(t, 1, len(allMetrics)) + assert.Len(t, allMetrics, 1) // golden.WriteMetrics(t, filepath.Join("testdata", "logs", tc.name+".yaml"), allMetrics[0]) expected, err := golden.ReadMetrics(filepath.Join("testdata", "logs", tc.name+".yaml")) diff --git a/connector/countconnector/factory.go b/connector/countconnector/factory.go index 271f9bbb9e56..ce4d35524fe5 100644 --- a/connector/countconnector/factory.go +++ b/connector/countconnector/factory.go @@ -13,7 +13,6 @@ import ( "go.opentelemetry.io/collector/consumer" "github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector/internal/metadata" - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter/expr" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter/filterottl" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottldatapoint" @@ -42,7 +41,7 @@ func createDefaultConfig() component.Config { // createTracesToMetrics creates a traces to metrics connector based on provided config. func createTracesToMetrics( _ context.Context, - set connector.CreateSettings, + set connector.Settings, cfg component.Config, nextConsumer consumer.Metrics, ) (connector.Traces, error) { @@ -86,7 +85,7 @@ func createTracesToMetrics( // createMetricsToMetrics creates a metricds to metrics connector based on provided config. func createMetricsToMetrics( _ context.Context, - set connector.CreateSettings, + set connector.Settings, cfg component.Config, nextConsumer consumer.Metrics, ) (connector.Metrics, error) { @@ -129,7 +128,7 @@ func createMetricsToMetrics( // createLogsToMetrics creates a logs to metrics connector based on provided config. func createLogsToMetrics( _ context.Context, - set connector.CreateSettings, + set connector.Settings, cfg component.Config, nextConsumer consumer.Metrics, ) (connector.Logs, error) { @@ -156,7 +155,7 @@ func createLogsToMetrics( } type metricDef[K any] struct { - condition expr.BoolExpr[K] + condition *ottl.ConditionSequence[K] desc string attrs []AttributeConfig } diff --git a/connector/countconnector/generated_component_test.go b/connector/countconnector/generated_component_test.go index b8baf65c0462..84497553e240 100644 --- a/connector/countconnector/generated_component_test.go +++ b/connector/countconnector/generated_component_test.go @@ -14,6 +14,7 @@ import ( "go.opentelemetry.io/collector/connector/connectortest" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/consumer/consumertest" + "go.opentelemetry.io/collector/pipeline" ) func TestComponentFactoryType(t *testing.T) { @@ -29,29 +30,29 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set connector.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs_to_metrics", - createFn: func(ctx context.Context, set connector.CreateSettings, cfg component.Config) (component.Component, error) { - router := connector.NewMetricsRouter(map[component.ID]consumer.Metrics{component.NewID(component.DataTypeMetrics): consumertest.NewNop()}) + createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) { + router := connector.NewMetricsRouter(map[pipeline.ID]consumer.Metrics{pipeline.NewID(pipeline.SignalMetrics): consumertest.NewNop()}) return factory.CreateLogsToMetrics(ctx, set, cfg, router) }, }, { name: "metrics_to_metrics", - createFn: func(ctx context.Context, set connector.CreateSettings, cfg component.Config) (component.Component, error) { - router := connector.NewMetricsRouter(map[component.ID]consumer.Metrics{component.NewID(component.DataTypeMetrics): consumertest.NewNop()}) + createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) { + router := connector.NewMetricsRouter(map[pipeline.ID]consumer.Metrics{pipeline.NewID(pipeline.SignalMetrics): consumertest.NewNop()}) return factory.CreateMetricsToMetrics(ctx, set, cfg, router) }, }, { name: "traces_to_metrics", - createFn: func(ctx context.Context, set connector.CreateSettings, cfg component.Config) (component.Component, error) { - router := connector.NewMetricsRouter(map[component.ID]consumer.Metrics{component.NewID(component.DataTypeMetrics): consumertest.NewNop()}) + createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) { + router := connector.NewMetricsRouter(map[pipeline.ID]consumer.Metrics{pipeline.NewID(pipeline.SignalMetrics): consumertest.NewNop()}) return factory.CreateTracesToMetrics(ctx, set, cfg, router) }, }, @@ -64,21 +65,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), connectortest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), connectortest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - firstConnector, err := test.createFn(context.Background(), connectortest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + firstConnector, err := tt.createFn(context.Background(), connectortest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() require.NoError(t, err) require.NoError(t, firstConnector.Start(context.Background(), host)) require.NoError(t, firstConnector.Shutdown(context.Background())) - secondConnector, err := test.createFn(context.Background(), connectortest.NewNopCreateSettings(), cfg) + secondConnector, err := tt.createFn(context.Background(), connectortest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, secondConnector.Start(context.Background(), host)) require.NoError(t, secondConnector.Shutdown(context.Background())) diff --git a/connector/countconnector/go.mod b/connector/countconnector/go.mod index bd769d3abec6..6e498bb9a40a 100644 --- a/connector/countconnector/go.mod +++ b/connector/countconnector/go.mod @@ -1,66 +1,79 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/connector v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/connector v0.116.0 + go.opentelemetry.io/collector/connector/connectortest v0.116.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/pipeline v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) require ( github.com/alecthomas/participle/v2 v2.1.1 // indirect - github.com/beorn7/perks v1.0.1 // indirect + github.com/antchfx/xmlquery v1.4.2 // indirect + github.com/antchfx/xpath v1.3.2 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/elastic/go-grok v0.3.1 // indirect + github.com/elastic/lunes v0.1.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gobwas/glob v0.2.3 // indirect + github.com/goccy/go-json v0.10.4 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/iancoleman/strcase v0.3.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect + github.com/magefile/mage v1.15.0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/connector/xconnector v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 // indirect + go.opentelemetry.io/collector/semconv v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/connector/countconnector/go.sum b/connector/countconnector/go.sum index 143a6caa9672..54c7414a2806 100644 --- a/connector/countconnector/go.sum +++ b/connector/countconnector/go.sum @@ -4,29 +4,43 @@ github.com/alecthomas/participle/v2 v2.1.1 h1:hrjKESvSqGHzRb4yW1ciisFJ4p3MGYih6i github.com/alecthomas/participle/v2 v2.1.1/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= -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/antchfx/xmlquery v1.4.2 h1:MZKd9+wblwxfQ1zd1AdrTsqVaMjMCwow3IqkCSe00KA= +github.com/antchfx/xmlquery v1.4.2/go.mod h1:QXhvf5ldTuGqhd1SHNvvtlhhdQLks4dD0awIVhXIDTA= +github.com/antchfx/xpath v1.3.2 h1:LNjzlsSjinu3bQpw9hWMY9ocB80oLOWuQqFvO6xt51U= +github.com/antchfx/xpath v1.3.2/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/elastic/go-grok v0.3.1 h1:WEhUxe2KrwycMnlvMimJXvzRa7DoByJB4PVUIE1ZD/U= +github.com/elastic/go-grok v0.3.1/go.mod h1:n38ls8ZgOboZRgKcjMY8eFeZFMmcL9n2lP0iHhIDk64= +github.com/elastic/lunes v0.1.0 h1:amRtLPjwkWtzDF/RKzcEPMvSsSseLDLW+bnhfNSLRe4= +github.com/elastic/lunes v0.1.0/go.mod h1:xGphYIt3XdZRtyWosHQTErsQTd4OP1p9wsbVoHelrd4= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= +github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= @@ -41,12 +55,14 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= +github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= @@ -58,50 +74,61 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 h1:SIKIoA4e/5Y9ZOl0DCe3eVMLPOQzJxgZpfdHHeauNTM= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6/go.mod h1:BUbeWZiieNxAuuADTBNb3/aeje6on3DhU3rpWsQSB1E= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/connector v0.102.0 h1:IvAsVfYRxP0ajmKbUovF8qugkcUtHq6RuYNtjcMa63E= -go.opentelemetry.io/collector/connector v0.102.0/go.mod h1:f4M7wZ/9+XtgTE0fivBFH3WlwntaEd0qFFA0giFkdnY= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/connector v0.116.0 h1:0Pz8RAXH1swLeA1fiyGGQWdv0Kemz4mbq+jnmd1TACE= +go.opentelemetry.io/collector/connector v0.116.0/go.mod h1:VQiZ2yW9KhZuF0yjDbvlgrAxm7+o8KQoxHxurQWLjKU= +go.opentelemetry.io/collector/connector/connectortest v0.116.0 h1:MdttvjqdZmp0ewW5IPCEtzzYmCqxrQxsjJ5m6gMVjzA= +go.opentelemetry.io/collector/connector/connectortest v0.116.0/go.mod h1:ko7aPyvAVf6SvRhWGZdPXSyk+7zPmsSCcMq0gYPMMIQ= +go.opentelemetry.io/collector/connector/xconnector v0.116.0 h1:fFJzrRco0g7HMkhnQ+ehlvicFf58vzsCLXnfuHyQM8w= +go.opentelemetry.io/collector/connector/xconnector v0.116.0/go.mod h1:m9oCk32zX6wDciYBpy+qMQkWKtOxb0gAkEUm8+trflY= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 h1:KKFb3u8iLk4V5GYz7eVpw8QgEdob5koX6GNEbaoDQJY= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0/go.mod h1:YyWHUWeSnRmy2CF7kPHpwJ6qkVjufbLZ8PYuY0Ph0o8= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 h1:PFNy+Il/kqPdPL9rhG+1kG63Aauya+FhBKGXoB6ivxU= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0/go.mod h1:bVn9V4TGyeXi58/JDkeXCuKtc+V+qcOoTl8hNpV0qa8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -111,44 +138,64 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/connector/countconnector/internal/metadata/generated_status.go b/connector/countconnector/internal/metadata/generated_status.go index 6bdacd9ef42e..a41d1daf30a5 100644 --- a/connector/countconnector/internal/metadata/generated_status.go +++ b/connector/countconnector/internal/metadata/generated_status.go @@ -7,11 +7,12 @@ import ( ) var ( - Type = component.MustNewType("count") + Type = component.MustNewType("count") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector" ) const ( - TracesToMetricsStability = component.StabilityLevelDevelopment - MetricsToMetricsStability = component.StabilityLevelDevelopment - LogsToMetricsStability = component.StabilityLevelDevelopment + TracesToMetricsStability = component.StabilityLevelAlpha + MetricsToMetricsStability = component.StabilityLevelAlpha + LogsToMetricsStability = component.StabilityLevelAlpha ) diff --git a/connector/countconnector/internal/metadata/generated_telemetry.go b/connector/countconnector/internal/metadata/generated_telemetry.go deleted file mode 100644 index 8a930ee16274..000000000000 --- a/connector/countconnector/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/countconnector") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/countconnector") -} diff --git a/connector/countconnector/internal/metadata/generated_telemetry_test.go b/connector/countconnector/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 88d3e3228697..000000000000 --- a/connector/countconnector/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/countconnector", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/countconnector", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/connector/countconnector/metadata.yaml b/connector/countconnector/metadata.yaml index 1bc57a1ff9c2..75ef53faff03 100644 --- a/connector/countconnector/metadata.yaml +++ b/connector/countconnector/metadata.yaml @@ -1,11 +1,10 @@ type: count -scope_name: otelcol/countconnector status: class: connector stability: - development: [traces_to_metrics, metrics_to_metrics, logs_to_metrics] - distributions: [contrib] + alpha: [traces_to_metrics, metrics_to_metrics, logs_to_metrics] + distributions: [contrib, k8s] codeowners: active: [djaglowski, jpkrohling] diff --git a/connector/countconnector/testdata/logs/condition_and_attribute.yaml b/connector/countconnector/testdata/logs/condition_and_attribute.yaml index ec37f4da96b2..82c440744d29 100644 --- a/connector/countconnector/testdata/logs/condition_and_attribute.yaml +++ b/connector/countconnector/testdata/logs/condition_and_attribute.yaml @@ -28,7 +28,7 @@ resourceMetrics: timeUnixNano: "1678390948399018000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -58,4 +58,4 @@ resourceMetrics: timeUnixNano: "1678390948399021000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector diff --git a/connector/countconnector/testdata/logs/default_attribute_value.yaml b/connector/countconnector/testdata/logs/default_attribute_value.yaml index f9a007db4ed0..ba4cdd77f938 100644 --- a/connector/countconnector/testdata/logs/default_attribute_value.yaml +++ b/connector/countconnector/testdata/logs/default_attribute_value.yaml @@ -43,7 +43,7 @@ resourceMetrics: timeUnixNano: "1678390948398365000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -88,7 +88,7 @@ resourceMetrics: timeUnixNano: "1678390948398368000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -130,7 +130,7 @@ resourceMetrics: timeUnixNano: "1678390948398371000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: {} scopeMetrics: - metrics: @@ -168,4 +168,4 @@ resourceMetrics: timeUnixNano: "1678390948398373000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector diff --git a/connector/countconnector/testdata/logs/multiple_attributes.yaml b/connector/countconnector/testdata/logs/multiple_attributes.yaml index 72f2f633fa1b..015794fc7620 100644 --- a/connector/countconnector/testdata/logs/multiple_attributes.yaml +++ b/connector/countconnector/testdata/logs/multiple_attributes.yaml @@ -34,7 +34,7 @@ resourceMetrics: timeUnixNano: "1678390948397879000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -70,7 +70,7 @@ resourceMetrics: timeUnixNano: "1678390948397882000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -103,7 +103,7 @@ resourceMetrics: timeUnixNano: "1678390948397884000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: {} scopeMetrics: - metrics: @@ -132,4 +132,4 @@ resourceMetrics: timeUnixNano: "1678390948397886000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector diff --git a/connector/countconnector/testdata/logs/multiple_conditions.yaml b/connector/countconnector/testdata/logs/multiple_conditions.yaml index a207af502552..7f8128882367 100644 --- a/connector/countconnector/testdata/logs/multiple_conditions.yaml +++ b/connector/countconnector/testdata/logs/multiple_conditions.yaml @@ -18,7 +18,7 @@ resourceMetrics: timeUnixNano: "1678390948395853000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -38,7 +38,7 @@ resourceMetrics: timeUnixNano: "1678390948395856000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -55,7 +55,7 @@ resourceMetrics: timeUnixNano: "1678390948395858000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: {} scopeMetrics: - metrics: @@ -68,4 +68,4 @@ resourceMetrics: timeUnixNano: "1678390948395859000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector diff --git a/connector/countconnector/testdata/logs/multiple_metrics.yaml b/connector/countconnector/testdata/logs/multiple_metrics.yaml index 31b62cd6c55e..1f3f0f06643d 100644 --- a/connector/countconnector/testdata/logs/multiple_metrics.yaml +++ b/connector/countconnector/testdata/logs/multiple_metrics.yaml @@ -26,7 +26,7 @@ resourceMetrics: timeUnixNano: "1678390948396984000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -54,7 +54,7 @@ resourceMetrics: timeUnixNano: "1678390948396988000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -71,7 +71,7 @@ resourceMetrics: timeUnixNano: "1678390948396990000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: {} scopeMetrics: - metrics: @@ -84,4 +84,4 @@ resourceMetrics: timeUnixNano: "1678390948396992000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector diff --git a/connector/countconnector/testdata/logs/one_attribute.yaml b/connector/countconnector/testdata/logs/one_attribute.yaml index 356fc4961cad..46ec178c063e 100644 --- a/connector/countconnector/testdata/logs/one_attribute.yaml +++ b/connector/countconnector/testdata/logs/one_attribute.yaml @@ -28,7 +28,7 @@ resourceMetrics: timeUnixNano: "1678390948397419000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -58,7 +58,7 @@ resourceMetrics: timeUnixNano: "1678390948397423000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -85,7 +85,7 @@ resourceMetrics: timeUnixNano: "1678390948397425000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: {} scopeMetrics: - metrics: @@ -108,4 +108,4 @@ resourceMetrics: timeUnixNano: "1678390948397427000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector diff --git a/connector/countconnector/testdata/logs/one_condition.yaml b/connector/countconnector/testdata/logs/one_condition.yaml index c24c54ebdaac..a0ff1e5314a3 100644 --- a/connector/countconnector/testdata/logs/one_condition.yaml +++ b/connector/countconnector/testdata/logs/one_condition.yaml @@ -18,7 +18,7 @@ resourceMetrics: timeUnixNano: "1678390948395244000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -38,4 +38,4 @@ resourceMetrics: timeUnixNano: "1678390948395279000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector diff --git a/connector/countconnector/testdata/logs/zero_conditions.yaml b/connector/countconnector/testdata/logs/zero_conditions.yaml index 8d449ab2f1db..2eb91cedd03a 100644 --- a/connector/countconnector/testdata/logs/zero_conditions.yaml +++ b/connector/countconnector/testdata/logs/zero_conditions.yaml @@ -18,7 +18,7 @@ resourceMetrics: timeUnixNano: "1678390948393725000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -38,7 +38,7 @@ resourceMetrics: timeUnixNano: "1678390948393759000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -55,7 +55,7 @@ resourceMetrics: timeUnixNano: "1678390948393760000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: {} scopeMetrics: - metrics: @@ -68,4 +68,4 @@ resourceMetrics: timeUnixNano: "1678390948393761000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector diff --git a/connector/countconnector/testdata/metrics/condition_and_attribute.yaml b/connector/countconnector/testdata/metrics/condition_and_attribute.yaml index bcaadfa8d523..c7b8c73d4237 100644 --- a/connector/countconnector/testdata/metrics/condition_and_attribute.yaml +++ b/connector/countconnector/testdata/metrics/condition_and_attribute.yaml @@ -28,7 +28,7 @@ resourceMetrics: timeUnixNano: "1678391923823222000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -58,4 +58,4 @@ resourceMetrics: timeUnixNano: "1678391923823233000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector diff --git a/connector/countconnector/testdata/metrics/default_attribute_value.yaml b/connector/countconnector/testdata/metrics/default_attribute_value.yaml index 1ea25a5e940b..127363720801 100644 --- a/connector/countconnector/testdata/metrics/default_attribute_value.yaml +++ b/connector/countconnector/testdata/metrics/default_attribute_value.yaml @@ -43,7 +43,7 @@ resourceMetrics: timeUnixNano: "1678391923822404000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -88,7 +88,7 @@ resourceMetrics: timeUnixNano: "1678391923822416000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -130,7 +130,7 @@ resourceMetrics: timeUnixNano: "1678391923822426000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: {} scopeMetrics: - metrics: @@ -168,4 +168,4 @@ resourceMetrics: timeUnixNano: "1678391923822435000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector diff --git a/connector/countconnector/testdata/metrics/default_int_attribute_value.yaml b/connector/countconnector/testdata/metrics/default_int_attribute_value.yaml index c926c241f38e..f96a2567b099 100644 --- a/connector/countconnector/testdata/metrics/default_int_attribute_value.yaml +++ b/connector/countconnector/testdata/metrics/default_int_attribute_value.yaml @@ -49,4 +49,4 @@ resourceMetrics: timeUnixNano: "1678391923821179000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector diff --git a/connector/countconnector/testdata/metrics/int_attribute_value.yaml b/connector/countconnector/testdata/metrics/int_attribute_value.yaml index 7aad8ba58fb5..6bec737c76ce 100644 --- a/connector/countconnector/testdata/metrics/int_attribute_value.yaml +++ b/connector/countconnector/testdata/metrics/int_attribute_value.yaml @@ -28,4 +28,4 @@ resourceMetrics: timeUnixNano: "1678391923821179000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector diff --git a/connector/countconnector/testdata/metrics/multiple_attributes.yaml b/connector/countconnector/testdata/metrics/multiple_attributes.yaml index 7bfaa928cd2a..ba81d6f36041 100644 --- a/connector/countconnector/testdata/metrics/multiple_attributes.yaml +++ b/connector/countconnector/testdata/metrics/multiple_attributes.yaml @@ -34,7 +34,7 @@ resourceMetrics: timeUnixNano: "1678391923821783000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -70,7 +70,7 @@ resourceMetrics: timeUnixNano: "1678391923821792000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -103,7 +103,7 @@ resourceMetrics: timeUnixNano: "1678391923821800000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: {} scopeMetrics: - metrics: @@ -132,4 +132,4 @@ resourceMetrics: timeUnixNano: "1678391923821807000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector diff --git a/connector/countconnector/testdata/metrics/multiple_conditions.yaml b/connector/countconnector/testdata/metrics/multiple_conditions.yaml index 71add19a4049..e8caf81ce729 100644 --- a/connector/countconnector/testdata/metrics/multiple_conditions.yaml +++ b/connector/countconnector/testdata/metrics/multiple_conditions.yaml @@ -26,7 +26,7 @@ resourceMetrics: timeUnixNano: "1678391923819487000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -54,7 +54,7 @@ resourceMetrics: timeUnixNano: "1678391923819499000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -79,7 +79,7 @@ resourceMetrics: timeUnixNano: "1678391923819510000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: {} scopeMetrics: - metrics: @@ -100,7 +100,7 @@ resourceMetrics: timeUnixNano: "1678391923819529000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.int @@ -120,4 +120,4 @@ resourceMetrics: timeUnixNano: "1678391923819487000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector diff --git a/connector/countconnector/testdata/metrics/multiple_metrics.yaml b/connector/countconnector/testdata/metrics/multiple_metrics.yaml index 08fc634ae780..b97c011d59f6 100644 --- a/connector/countconnector/testdata/metrics/multiple_metrics.yaml +++ b/connector/countconnector/testdata/metrics/multiple_metrics.yaml @@ -42,7 +42,7 @@ resourceMetrics: timeUnixNano: "1678391923820453000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -86,7 +86,7 @@ resourceMetrics: timeUnixNano: "1678391923820468000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -127,7 +127,7 @@ resourceMetrics: timeUnixNano: "1678391923820480000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: {} scopeMetrics: - metrics: @@ -164,7 +164,7 @@ resourceMetrics: timeUnixNano: "1678391923820491000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.int @@ -200,4 +200,4 @@ resourceMetrics: timeUnixNano: "1678391923820480000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector diff --git a/connector/countconnector/testdata/metrics/one_attribute.yaml b/connector/countconnector/testdata/metrics/one_attribute.yaml index eca04a304e73..c19d07a3d464 100644 --- a/connector/countconnector/testdata/metrics/one_attribute.yaml +++ b/connector/countconnector/testdata/metrics/one_attribute.yaml @@ -28,7 +28,7 @@ resourceMetrics: timeUnixNano: "1678391923821179000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -58,7 +58,7 @@ resourceMetrics: timeUnixNano: "1678391923821189000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -85,7 +85,7 @@ resourceMetrics: timeUnixNano: "1678391923821196000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: {} scopeMetrics: - metrics: @@ -108,4 +108,4 @@ resourceMetrics: timeUnixNano: "1678391923821203000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector diff --git a/connector/countconnector/testdata/metrics/one_condition.yaml b/connector/countconnector/testdata/metrics/one_condition.yaml index 305d61443e93..e2af08664333 100644 --- a/connector/countconnector/testdata/metrics/one_condition.yaml +++ b/connector/countconnector/testdata/metrics/one_condition.yaml @@ -26,7 +26,7 @@ resourceMetrics: timeUnixNano: "1678391923818482000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -54,4 +54,4 @@ resourceMetrics: timeUnixNano: "1678391923818549000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector diff --git a/connector/countconnector/testdata/metrics/zero_conditions.yaml b/connector/countconnector/testdata/metrics/zero_conditions.yaml index 53790a61374b..58477be59855 100644 --- a/connector/countconnector/testdata/metrics/zero_conditions.yaml +++ b/connector/countconnector/testdata/metrics/zero_conditions.yaml @@ -26,7 +26,7 @@ resourceMetrics: timeUnixNano: "1678391923815881000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -54,7 +54,7 @@ resourceMetrics: timeUnixNano: "1678391923815923000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -79,7 +79,7 @@ resourceMetrics: timeUnixNano: "1678391923815929000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: {} scopeMetrics: - metrics: @@ -100,7 +100,7 @@ resourceMetrics: timeUnixNano: "1678391923815933000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.int @@ -128,4 +128,4 @@ resourceMetrics: timeUnixNano: "1678391923815929000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector diff --git a/connector/countconnector/testdata/traces/condition_and_attribute.yaml b/connector/countconnector/testdata/traces/condition_and_attribute.yaml index 5a1aada4f80c..ae639b75daa5 100644 --- a/connector/countconnector/testdata/traces/condition_and_attribute.yaml +++ b/connector/countconnector/testdata/traces/condition_and_attribute.yaml @@ -46,7 +46,7 @@ resourceMetrics: timeUnixNano: "1678392127929006000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -94,4 +94,4 @@ resourceMetrics: timeUnixNano: "1678392127929018000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector diff --git a/connector/countconnector/testdata/traces/default_attribute_value.yaml b/connector/countconnector/testdata/traces/default_attribute_value.yaml index 737fefe94e25..07207339c2ff 100644 --- a/connector/countconnector/testdata/traces/default_attribute_value.yaml +++ b/connector/countconnector/testdata/traces/default_attribute_value.yaml @@ -76,7 +76,7 @@ resourceMetrics: timeUnixNano: "1678392127927843000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -154,7 +154,7 @@ resourceMetrics: timeUnixNano: "1678392127927856000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -229,7 +229,7 @@ resourceMetrics: timeUnixNano: "1678392127927865000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: {} scopeMetrics: - metrics: @@ -300,4 +300,4 @@ resourceMetrics: timeUnixNano: "1678392127927874000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector diff --git a/connector/countconnector/testdata/traces/multiple_attributes.yaml b/connector/countconnector/testdata/traces/multiple_attributes.yaml index c8542486c4f0..dcfc3450f3bd 100644 --- a/connector/countconnector/testdata/traces/multiple_attributes.yaml +++ b/connector/countconnector/testdata/traces/multiple_attributes.yaml @@ -58,7 +58,7 @@ resourceMetrics: timeUnixNano: "1678392127926637000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -118,7 +118,7 @@ resourceMetrics: timeUnixNano: "1678392127926647000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -175,7 +175,7 @@ resourceMetrics: timeUnixNano: "1678392127926654000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: {} scopeMetrics: - metrics: @@ -228,4 +228,4 @@ resourceMetrics: timeUnixNano: "1678392127926661000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector diff --git a/connector/countconnector/testdata/traces/multiple_conditions.yaml b/connector/countconnector/testdata/traces/multiple_conditions.yaml index 9d58df750231..2ae2b7978e83 100644 --- a/connector/countconnector/testdata/traces/multiple_conditions.yaml +++ b/connector/countconnector/testdata/traces/multiple_conditions.yaml @@ -26,7 +26,7 @@ resourceMetrics: timeUnixNano: "1678392127923826000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -54,7 +54,7 @@ resourceMetrics: timeUnixNano: "1678392127923836000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -79,7 +79,7 @@ resourceMetrics: timeUnixNano: "1678392127923843000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: {} scopeMetrics: - metrics: @@ -100,4 +100,4 @@ resourceMetrics: timeUnixNano: "1678392127923849000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector diff --git a/connector/countconnector/testdata/traces/multiple_metrics.yaml b/connector/countconnector/testdata/traces/multiple_metrics.yaml index 7a217f4f6774..5cb4a710c3dd 100644 --- a/connector/countconnector/testdata/traces/multiple_metrics.yaml +++ b/connector/countconnector/testdata/traces/multiple_metrics.yaml @@ -42,7 +42,7 @@ resourceMetrics: timeUnixNano: "1678392127924753000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -86,7 +86,7 @@ resourceMetrics: timeUnixNano: "1678392127924764000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -127,7 +127,7 @@ resourceMetrics: timeUnixNano: "1678392127924772000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: {} scopeMetrics: - metrics: @@ -164,4 +164,4 @@ resourceMetrics: timeUnixNano: "1678392127924780000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector diff --git a/connector/countconnector/testdata/traces/one_attribute.yaml b/connector/countconnector/testdata/traces/one_attribute.yaml index 94dd7c967e6a..04dc47112dcd 100644 --- a/connector/countconnector/testdata/traces/one_attribute.yaml +++ b/connector/countconnector/testdata/traces/one_attribute.yaml @@ -46,7 +46,7 @@ resourceMetrics: timeUnixNano: "1678392127925459000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -94,7 +94,7 @@ resourceMetrics: timeUnixNano: "1678392127925468000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -139,7 +139,7 @@ resourceMetrics: timeUnixNano: "1678392127925474000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: {} scopeMetrics: - metrics: @@ -180,4 +180,4 @@ resourceMetrics: timeUnixNano: "1678392127925497000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector diff --git a/connector/countconnector/testdata/traces/one_condition.yaml b/connector/countconnector/testdata/traces/one_condition.yaml index 53849b49faac..77b0343adceb 100644 --- a/connector/countconnector/testdata/traces/one_condition.yaml +++ b/connector/countconnector/testdata/traces/one_condition.yaml @@ -26,7 +26,7 @@ resourceMetrics: timeUnixNano: "1678392127922310000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -54,4 +54,4 @@ resourceMetrics: timeUnixNano: "1678392127922364000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector diff --git a/connector/countconnector/testdata/traces/zero_conditions.yaml b/connector/countconnector/testdata/traces/zero_conditions.yaml index 6399c16d33a8..86485eeb0f5a 100644 --- a/connector/countconnector/testdata/traces/zero_conditions.yaml +++ b/connector/countconnector/testdata/traces/zero_conditions.yaml @@ -26,7 +26,7 @@ resourceMetrics: timeUnixNano: "1678392127920605000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -54,7 +54,7 @@ resourceMetrics: timeUnixNano: "1678392127920632000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: attributes: - key: resource.required @@ -79,7 +79,7 @@ resourceMetrics: timeUnixNano: "1678392127920635000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector - resource: {} scopeMetrics: - metrics: @@ -100,4 +100,4 @@ resourceMetrics: timeUnixNano: "1678392127920638000" isMonotonic: true scope: - name: otelcol/countconnector + name: github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector diff --git a/connector/datadogconnector/README.md b/connector/datadogconnector/README.md index 550986d40d84..a80b0c33eb91 100644 --- a/connector/datadogconnector/README.md +++ b/connector/datadogconnector/README.md @@ -5,10 +5,10 @@ | ------------- |-----------| | Distributions | [contrib] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aconnector%2Fdatadog%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aconnector%2Fdatadog) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aconnector%2Fdatadog%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aconnector%2Fdatadog) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@mx-psi](https://www.github.com/mx-psi), [@dineshg13](https://www.github.com/dineshg13), [@ankitpatel96](https://www.github.com/ankitpatel96) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@mx-psi](https://www.github.com/mx-psi), [@dineshg13](https://www.github.com/dineshg13), [@ankitpatel96](https://www.github.com/ankitpatel96), [@jade-guiton-dd](https://www.github.com/jade-guiton-dd) | | Emeritus | [@gbbr](https://www.github.com/gbbr) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib ## Supported Pipeline Types @@ -20,34 +20,27 @@ [Exporter Pipeline Type]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md#exporter-pipeline-type [Receiver Pipeline Type]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md#receiver-pipeline-type -[Stability Level]: https://github.com/open-telemetry/opentelemetry-collector#stability-levels +[Stability Level]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#stability-levels ## Description -The Datadog Connector is a connector component that computes Datadog APM Stats pre-sampling in the event that your traces pipeline is sampled using components such as the tailsamplingprocessor or probabilisticsamplerprocessor. +The Datadog Connector is a connector component that derives APM statistics, in the form of metrics, from service traces, for display in the Datadog APM product. This component is *required* for trace-emitting services and their statistics to appear in Datadog APM. -The connector is most applicable when using the sampling components such as the [tailsamplingprocessor](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/tailsamplingprocessor#tail-sampling-processor), or the [probabilisticsamplerprocessor](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/probabilisticsamplerprocessor) in one of your pipelines. The sampled pipeline should be duplicated and the `datadog` connector should be added to the the pipeline that is not being sampled to ensure that Datadog APM Stats are accurate in the backend. +The Datadog connector can also forward the traces passed into it into another trace pipeline. Notably, if you plan to sample your traces with the [tailsamplingprocessor](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/tailsamplingprocessor#tail-sampling-processor) or the [probabilisticsamplerprocessor](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/probabilisticsamplerprocessor), you should place the Datadog connector upstream to ensure that the metrics are computed before sampling, ensuring their accuracy. An example is given below. ## Usage -To use the Datadog Connector, add the connector to one set of the duplicated pipelines while sampling the other. The Datadog Connector will compute APM Stats on all spans that it sees. Here is an example on how to add it to a pipeline using the [probabilisticsampler]: - - - - - - -
Before After
- ```yaml # ... processors: # ... probabilistic_sampler: sampling_percentage: 20 - # add the "datadog" processor definition - datadog: + +connectors: + # add the "datadog" connector definition and further configurations + datadog/connector: exporters: datadog: @@ -58,53 +51,21 @@ service: pipelines: traces: receivers: [otlp] - # prepend it to the sampler in your pipeline: - processors: [batch, datadog, probabilistic_sampler] + processors: [batch] + exporters: [datadog/connector] + + traces/2: # this pipeline uses sampling + receivers: [datadog/connector] + processors: [batch, probabilistic_sampler] exporters: [datadog] metrics: - receivers: [otlp] + receivers: [datadog/connector] processors: [batch] exporters: [datadog] ``` - - -```yaml -# ... -processors: - probabilistic_sampler: - sampling_percentage: 20 - -connectors: - # add the "datadog" connector definition and further configurations - datadog/connector: - -exporters: - datadog: - api: - key: ${env:DD_API_KEY} - -service: - pipelines: - traces: - receivers: [otlp] - processors: [batch] - exporters: [datadog/connector] - - traces/2: # this pipeline uses sampling - receivers: [datadog/connector] - processors: [batch, probabilistic_sampler] - exporters: [datadog] - - metrics: - receivers: [datadog/connector] - processors: [batch] - exporters: [datadog] -``` -
- -Here we have two traces pipelines that ingest the same data but one is being sampled. The one that is sampled has its data sent to the datadog backend for you to see the sampled subset of the total traces sent across. The other non-sampled pipeline of traces sends its data to the metrics pipeline to be used in the APM stats. This unsampled pipeline gives the full picture of how much data the application emits in traces. +In this example configuration, incoming traces are received through OTLP, and processed by the Datadog connector in the `traces` pipeline. The traces are then forwarded to the `traces/2` pipeline, where a sample of them is exported to Datadog. In parallel, the APM stats computed from the full stream of traces are sent to the `metrics` pipeline, where they are exported to Datadog as well. ## Configurations @@ -172,12 +133,12 @@ connectors: ## @param resource_attributes_as_container_tags - enables the use of resource attributes as container tags - Optional ## A list of resource attributes that should be used as container tags. # - # resource_attributes_as_container_tags: ["could.availability_zone", "could.region"] -``` - -**NOTE**: `compute_stats_by_span_kind` and `peer_tags_aggregation` only work when the feature gate `connector.datadogconnector.performance` is enabled. See below for details on this feature gate. - -## Feature Gate for Performance - -In case you are experiencing high memory usage with Datadog Connector, similar to [issue](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/29755), use the feature gate `connector.datadogconnector.performance`. With the feature gate enabled, Datadog Connector takes OTLP traces and produces OTLP metric with the name `dd.internal.stats.payload`. This Metric has an attribute `dd.internal.stats.payload` that contains the bytes for StatsPayload. With the feature gate, we can use Datadog Connector only in conjunction with Datadog Exporter. Please enable the feature only if needed for performance reasons and higher throughput. Enable the feature gate on all collectors (especially in gateway deployment) in the pipeline that sends data to Datadog. We plan to refactor this component in the future so that the signals produced are usable in any metrics pipeline. + # resource_attributes_as_container_tags: ["cloud.availability_zone", "cloud.region"] + ## @param bucket_interval specifies the time interval size of aggregation buckets that aggregate the Datadog trace metrics. + ## It is also the time interval that Datadog trace metrics payloads are flushed to the pipeline. + ## If you are concerned about the metric volume generated by the Datadog connector and the resulting networking egress, try increasing bucket_interval. + ## Default is 10s if unset. + # + # bucket_interval: 30s +``` diff --git a/connector/datadogconnector/benchmark_test.go b/connector/datadogconnector/benchmark_test.go new file mode 100644 index 000000000000..efdeb0a4290d --- /dev/null +++ b/connector/datadogconnector/benchmark_test.go @@ -0,0 +1,94 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package datadogconnector // import "github.com/open-telemetry/opentelemetry-collector-contrib/connector/datadogconnector" + +import ( + "context" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/connector/connectortest" + "go.opentelemetry.io/collector/consumer/consumertest" + "go.opentelemetry.io/collector/featuregate" + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/ptrace" +) + +func genTrace() ptrace.Traces { + start := time.Now().Add(-1 * time.Second) + end := time.Now() + traces := ptrace.NewTraces() + rspan := traces.ResourceSpans().AppendEmpty() + rattrs := rspan.Resource().Attributes() + rattrs.PutStr("deployment.environment", "test_env") + rattrs.PutStr("service.name", "test_svc") + sspan := rspan.ScopeSpans().AppendEmpty() + span := sspan.Spans().AppendEmpty() + span.SetTraceID(testTraceID) + span.SetSpanID(testSpanID1) + span.SetStartTimestamp(pcommon.NewTimestampFromTime(start)) + span.SetEndTimestamp(pcommon.NewTimestampFromTime(end)) + span.SetName("span_name") + span.SetKind(ptrace.SpanKindClient) + span.Attributes().PutStr("peer.service", "my_peer_svc") + span.Attributes().PutStr("rpc.service", "my_rpc_svc") + span.Attributes().PutStr("net.peer.name", "my_net_peer") + return traces +} + +func BenchmarkPeerTags_Native(b *testing.B) { + benchmarkPeerTags(b) +} + +func BenchmarkPeerTags_Legacy(b *testing.B) { + err := featuregate.GlobalRegistry().Set(NativeIngestFeatureGate.ID(), false) + assert.NoError(b, err) + defer func() { + _ = featuregate.GlobalRegistry().Set(NativeIngestFeatureGate.ID(), true) + }() + + benchmarkPeerTags(b) +} + +func benchmarkPeerTags(b *testing.B) { + cfg := NewFactory().CreateDefaultConfig().(*Config) + cfg.Traces.ComputeStatsBySpanKind = true + cfg.Traces.PeerTagsAggregation = true + cfg.Traces.BucketInterval = 1 * time.Millisecond + cfg.Traces.TraceBuffer = 0 + + factory := NewFactory() + creationParams := connectortest.NewNopSettings() + metricsSink := &consumertest.MetricsSink{} + + tconn, err := factory.CreateTracesToMetrics(context.Background(), creationParams, cfg, metricsSink) + assert.NoError(b, err) + + err = tconn.Start(context.Background(), componenttest.NewNopHost()) + if err != nil { + b.Errorf("Error starting connector: %v", err) + return + } + defer func() { + require.NoError(b, tconn.Shutdown(context.Background())) + }() + + b.ResetTimer() + + for n := 0; n < b.N; n++ { + err = tconn.ConsumeTraces(context.Background(), genTrace()) + assert.NoError(b, err) + for { + metrics := metricsSink.AllMetrics() + if len(metrics) > 0 { + assert.Len(b, metrics, 1) + break + } + } + metricsSink.Reset() + } +} diff --git a/connector/datadogconnector/config.go b/connector/datadogconnector/config.go index bebece6aeb8c..f0c2abd3b549 100644 --- a/connector/datadogconnector/config.go +++ b/connector/datadogconnector/config.go @@ -4,10 +4,9 @@ package datadogconnector // import "github.com/open-telemetry/opentelemetry-collector-contrib/connector/datadogconnector" import ( - "fmt" - "regexp" - "go.opentelemetry.io/collector/component" + + datadogconfig "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/datadog/config" ) var _ component.Config = (*Config)(nil) @@ -18,90 +17,11 @@ type Config struct { Traces TracesConfig `mapstructure:"traces"` } +// Deprecated: [v0.110.0] Use `datadog.TracesConnectorConfig` instead. // TracesConfig defines the traces specific configuration options -type TracesConfig struct { - // ignored resources - // A blocklist of regular expressions can be provided to disable certain traces based on their resource name - // all entries must be surrounded by double quotes and separated by commas. - // ignore_resources: ["(GET|POST) /healthcheck"] - IgnoreResources []string `mapstructure:"ignore_resources"` - - // SpanNameRemappings is the map of datadog span names and preferred name to map to. This can be used to - // automatically map Datadog Span Operation Names to an updated value. All entries should be key/value pairs. - // span_name_remappings: - // io.opentelemetry.javaagent.spring.client: spring.client - // instrumentation:express.server: express - // go.opentelemetry.io_contrib_instrumentation_net_http_otelhttp.client: http.client - SpanNameRemappings map[string]string `mapstructure:"span_name_remappings"` - - // If set to true the OpenTelemetry span name will used in the Datadog resource name. - // If set to false the resource name will be filled with the instrumentation library name + span kind. - // The default value is `false`. - SpanNameAsResourceName bool `mapstructure:"span_name_as_resource_name"` - - // If set to true, enables an additional stats computation check on spans to see they have an eligible `span.kind` (server, consumer, client, producer). - // If enabled, a span with an eligible `span.kind` will have stats computed. If disabled, only top-level and measured spans will have stats computed. - // NOTE: For stats computed from OTel traces, only top-level spans are considered when this option is off. - // If you are sending OTel traces and want stats on non-top-level spans, this flag will need to be enabled. - // If you are sending OTel traces and do not want stats computed by span kind, you need to disable this flag and disable `compute_top_level_by_span_kind`. - ComputeStatsBySpanKind bool `mapstructure:"compute_stats_by_span_kind"` - - // If set to true, root spans and spans with a server or consumer `span.kind` will be marked as top-level. - // Additionally, spans with a client or producer `span.kind` will have stats computed. - // Enabling this config option may increase the number of spans that generate trace metrics, and may change which spans appear as top-level in Datadog. - // ComputeTopLevelBySpanKind needs to be enabled in both the Datadog connector and Datadog exporter configs if both components are being used. - // The default value is `false`. - ComputeTopLevelBySpanKind bool `mapstructure:"compute_top_level_by_span_kind"` - - // If set to true, enables aggregation of peer related tags (e.g., `peer.service`, `db.instance`, etc.) in the datadog connector. - // If disabled, aggregated trace stats will not include these tags as dimensions on trace metrics. - // For the best experience with peer tags, Datadog also recommends enabling `compute_stats_by_span_kind`. - // If you are using an OTel tracer, it's best to have both enabled because client/producer spans with relevant peer tags - // may not be marked by the datadog connector as top-level spans. - // If enabling both causes the datadog connector to consume too many resources, try disabling `compute_stats_by_span_kind` first. - // A high cardinality of peer tags or APM resources can also contribute to higher CPU and memory consumption. - // You can check for the cardinality of these fields by making trace search queries in the Datadog UI. - // The default list of peer tags can be found in https://github.com/DataDog/datadog-agent/blob/main/pkg/trace/stats/concentrator.go. - PeerTagsAggregation bool `mapstructure:"peer_tags_aggregation"` +type TracesConfig = datadogconfig.TracesConnectorConfig - // [BETA] Optional list of supplementary peer tags that go beyond the defaults. The Datadog backend validates all tags - // and will drop ones that are unapproved. The default set of peer tags can be found at - // https://github.com/DataDog/datadog-agent/blob/505170c4ac8c3cbff1a61cf5f84b28d835c91058/pkg/trace/stats/concentrator.go#L55. - PeerTags []string `mapstructure:"peer_tags"` - - // TraceBuffer specifies the number of Datadog Agent TracerPayloads to buffer before dropping. - // The default value is 1000. - TraceBuffer int `mapstructure:"trace_buffer"` - - // ResourceAttributesAsContainerTags specifies the list of resource attributes to be used as container tags. - ResourceAttributesAsContainerTags []string `mapstructure:"resource_attributes_as_container_tags"` -} - -// Validate the configuration for errors. This is required by component.Config. +// Validate checks if the configuration is valid func (c *Config) Validate() error { - if c.Traces.IgnoreResources != nil { - for _, entry := range c.Traces.IgnoreResources { - _, err := regexp.Compile(entry) - if err != nil { - return fmt.Errorf("%q is not valid resource filter regular expression", entry) - } - } - } - - if c.Traces.SpanNameRemappings != nil { - for key, value := range c.Traces.SpanNameRemappings { - if value == "" { - return fmt.Errorf("%q is not valid value for span name remapping", value) - } - if key == "" { - return fmt.Errorf("%q is not valid key for span name remapping", key) - } - } - } - - if c.Traces.TraceBuffer < 0 { - return fmt.Errorf("Trace buffer must be non-negative") - } - - return nil + return c.Traces.Validate() } diff --git a/connector/datadogconnector/config_test.go b/connector/datadogconnector/config_test.go index 307f9e920dcd..092eee911fdd 100644 --- a/connector/datadogconnector/config_test.go +++ b/connector/datadogconnector/config_test.go @@ -5,12 +5,14 @@ package datadogconnector import ( "testing" + "time" "github.com/stretchr/testify/assert" + + datadogconfig "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/datadog/config" ) func TestValidate(t *testing.T) { - tests := []struct { name string cfg *Config @@ -20,36 +22,46 @@ func TestValidate(t *testing.T) { name: "span name remapping valid", cfg: &Config{ Traces: TracesConfig{ - SpanNameRemappings: map[string]string{"old.opentelemetryspan.name": "updated.name"}, + TracesConfig: datadogconfig.TracesConfig{ + SpanNameRemappings: map[string]string{"old.opentelemetryspan.name": "updated.name"}, + }, }, }, }, { name: "span name remapping empty val", cfg: &Config{Traces: TracesConfig{ - SpanNameRemappings: map[string]string{"oldname": ""}, + TracesConfig: datadogconfig.TracesConfig{ + SpanNameRemappings: map[string]string{"oldname": ""}, + }, }}, - err: "\"\" is not valid value for span name remapping", + err: "'' is not valid value for span name remapping", }, { name: "span name remapping empty key", cfg: &Config{Traces: TracesConfig{ - SpanNameRemappings: map[string]string{"": "newname"}, + TracesConfig: datadogconfig.TracesConfig{ + SpanNameRemappings: map[string]string{"": "newname"}, + }, }}, - err: "\"\" is not valid key for span name remapping", + err: "'' is not valid key for span name remapping", }, { name: "ignore resources valid", cfg: &Config{Traces: TracesConfig{ - IgnoreResources: []string{"[123]"}, + TracesConfig: datadogconfig.TracesConfig{ + IgnoreResources: []string{"[123]"}, + }, }}, }, { name: "ignore resources missing bracket", cfg: &Config{Traces: TracesConfig{ - IgnoreResources: []string{"[123"}, + TracesConfig: datadogconfig.TracesConfig{ + IgnoreResources: []string{"[123"}, + }, }}, - err: "\"[123\" is not valid resource filter regular expression", + err: "'[123' is not valid resource filter regular expression", }, { name: "With trace_buffer", @@ -62,13 +74,30 @@ func TestValidate(t *testing.T) { cfg: &Config{Traces: TracesConfig{ TraceBuffer: -10, }}, - err: "Trace buffer must be non-negative", + err: "trace buffer must be non-negative", }, { name: "With peer_tags", cfg: &Config{ - Traces: TracesConfig{PeerTags: []string{"tag1", "tag2"}}, + Traces: TracesConfig{ + TracesConfig: datadogconfig.TracesConfig{ + PeerTags: []string{"tag1", "tag2"}, + }, + }, + }, + }, + { + name: "With bucket_interval", + cfg: &Config{ + Traces: TracesConfig{BucketInterval: 30 * time.Second}, + }, + }, + { + name: "neg bucket_interval", + cfg: &Config{ + Traces: TracesConfig{BucketInterval: -30 * time.Second}, }, + err: "bucket interval must be non-negative", }, } for _, testInstance := range tests { diff --git a/connector/datadogconnector/connector.go b/connector/datadogconnector/connector.go index 711cbcffc559..f81c244f801a 100644 --- a/connector/datadogconnector/connector.go +++ b/connector/datadogconnector/connector.go @@ -21,7 +21,7 @@ import ( "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" - semconv "go.opentelemetry.io/collector/semconv/v1.17.0" + semconv "go.opentelemetry.io/collector/semconv/v1.27.0" "go.opentelemetry.io/otel/metric/noop" "go.uber.org/zap" ) @@ -117,6 +117,9 @@ func getTraceAgentCfg(logger *zap.Logger, cfg TracesConfig, attributesTranslator logger.Info("traces::compute_top_level_by_span_kind needs to be enabled in both the Datadog connector and Datadog exporter configs if both components are being used") acfg.Features["enable_otlp_compute_top_level_by_span_kind"] = struct{}{} } + if v := cfg.BucketInterval; v > 0 { + acfg.BucketInterval = v + } return acfg } @@ -194,7 +197,6 @@ func (c *traceToMetricConnector) enrichStatsPayload(stats *pb.StatsPayload) { for _, stat := range stats.Stats { if stat.ContainerID != "" { if tags, ok := c.containerTagCache.Get(stat.ContainerID); ok { - tagList := tags.(*sync.Map) for _, tag := range stat.Tags { tagList.Store(tag, struct{}{}) diff --git a/connector/datadogconnector/connector_native.go b/connector/datadogconnector/connector_native.go new file mode 100644 index 000000000000..a78f410845b1 --- /dev/null +++ b/connector/datadogconnector/connector_native.go @@ -0,0 +1,160 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package datadogconnector // import "github.com/open-telemetry/opentelemetry-collector-contrib/connector/datadogconnector" + +import ( + "context" + "fmt" + "time" + + "github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/statsprocessor" + pb "github.com/DataDog/datadog-agent/pkg/proto/pbgo/trace" + "github.com/DataDog/datadog-agent/pkg/trace/config" + "github.com/DataDog/datadog-agent/pkg/trace/stats" + "github.com/DataDog/datadog-go/v5/statsd" + "github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes" + "github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/consumer" + "go.opentelemetry.io/collector/pdata/pmetric" + "go.opentelemetry.io/collector/pdata/ptrace" + "go.opentelemetry.io/otel/metric/noop" + "go.uber.org/zap" +) + +// traceToMetricConnectorNative is the schema for connector +type traceToMetricConnectorNative struct { + metricsConsumer consumer.Metrics // the next component in the pipeline to ingest metrics after connector + logger *zap.Logger + + // concentrator ingests spans and produces APM stats + concentrator *stats.Concentrator + + // tcfg is the trace agent config + tcfg *config.AgentConfig + + // ctagKeys are container tag keys + ctagKeys []string + + // peerTagKeys are peer tag keys to group APM stats + peerTagKeys []string + + // translator specifies the translator used to transform APM Stats Payloads + // from the agent to OTLP Metrics. + translator *metrics.Translator + + // statsout specifies the channel through which the agent will output Stats Payloads + // resulting from ingested traces. + statsout chan *pb.StatsPayload + + // exit specifies the exit channel, which will be closed upon shutdown. + exit chan struct{} + + // isStarted tracks whether Start() has been called. + isStarted bool +} + +var _ component.Component = (*traceToMetricConnectorNative)(nil) // testing that the connectorImp properly implements the type Component interface + +// newTraceToMetricConnectorNative creates a new connector with native OTel span ingestion +func newTraceToMetricConnectorNative(set component.TelemetrySettings, cfg component.Config, metricsConsumer consumer.Metrics, metricsClient statsd.ClientInterface) (*traceToMetricConnectorNative, error) { + set.Logger.Info("Building datadog connector for traces to metrics") + statsout := make(chan *pb.StatsPayload, 100) + statsWriter := statsprocessor.NewOtelStatsWriter(statsout) + set.MeterProvider = noop.NewMeterProvider() // disable metrics for the connector + attributesTranslator, err := attributes.NewTranslator(set) + if err != nil { + return nil, fmt.Errorf("failed to create attributes translator: %w", err) + } + trans, err := metrics.NewTranslator(set, attributesTranslator) + if err != nil { + return nil, fmt.Errorf("failed to create metrics translator: %w", err) + } + + tcfg := getTraceAgentCfg(set.Logger, cfg.(*Config).Traces, attributesTranslator) + return &traceToMetricConnectorNative{ + logger: set.Logger, + translator: trans, + tcfg: tcfg, + ctagKeys: cfg.(*Config).Traces.ResourceAttributesAsContainerTags, + peerTagKeys: tcfg.ConfiguredPeerTags(), + concentrator: stats.NewConcentrator(tcfg, statsWriter, time.Now(), metricsClient), + statsout: statsout, + metricsConsumer: metricsConsumer, + exit: make(chan struct{}), + }, nil +} + +// Start implements the component.Component interface. +func (c *traceToMetricConnectorNative) Start(_ context.Context, _ component.Host) error { + c.logger.Info("Starting datadogconnector") + c.concentrator.Start() + go c.run() + c.isStarted = true + return nil +} + +// Shutdown implements the component.Component interface. +func (c *traceToMetricConnectorNative) Shutdown(context.Context) error { + if !c.isStarted { + // Note: it is not necessary to manually close c.exit, c.in and c.concentrator.exit channels as these are unused. + c.logger.Info("Requested shutdown, but not started, ignoring.") + return nil + } + c.logger.Info("Shutting down datadog connector") + c.logger.Info("Stopping concentrator") + // stop the concentrator and wait for the run loop to exit + c.concentrator.Stop() + c.exit <- struct{}{} // signal exit + <-c.exit // wait for close + return nil +} + +// Capabilities implements the consumer interface. +// tells use whether the component(connector) will mutate the data passed into it. if set to true the connector does modify the data +func (c *traceToMetricConnectorNative) Capabilities() consumer.Capabilities { + return consumer.Capabilities{MutatesData: false} +} + +func (c *traceToMetricConnectorNative) ConsumeTraces(_ context.Context, traces ptrace.Traces) error { + inputs := stats.OTLPTracesToConcentratorInputs(traces, c.tcfg, c.ctagKeys, c.peerTagKeys) + for _, input := range inputs { + c.concentrator.Add(input) + } + return nil +} + +// run awaits incoming stats resulting from the agent's ingestion, converts them +// to metrics and flushes them using the configured metrics exporter. +func (c *traceToMetricConnectorNative) run() { + defer close(c.exit) + for { + select { + case stats := <-c.statsout: + if len(stats.Stats) == 0 { + continue + } + var mx pmetric.Metrics + var err error + + c.logger.Debug("Received stats payload", zap.Any("stats", stats)) + + mx, err = c.translator.StatsToMetrics(stats) + if err != nil { + c.logger.Error("Failed to convert stats to metrics", zap.Error(err)) + continue + } + // APM stats as metrics + ctx := context.TODO() + + // send metrics to the consumer or next component in pipeline + if err := c.metricsConsumer.ConsumeMetrics(ctx, mx); err != nil { + c.logger.Error("Failed ConsumeMetrics", zap.Error(err)) + return + } + case <-c.exit: + return + } + } +} diff --git a/connector/datadogconnector/connector_native_test.go b/connector/datadogconnector/connector_native_test.go new file mode 100644 index 000000000000..dc3c67c2f093 --- /dev/null +++ b/connector/datadogconnector/connector_native_test.go @@ -0,0 +1,250 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package datadogconnector + +import ( + "context" + "sort" + "testing" + "time" + + pb "github.com/DataDog/datadog-agent/pkg/proto/pbgo/trace" + "github.com/google/go-cmp/cmp" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/connector/connectortest" + "go.opentelemetry.io/collector/consumer/consumertest" + "go.opentelemetry.io/collector/pdata/ptrace" + semconv "go.opentelemetry.io/collector/semconv/v1.27.0" + "go.uber.org/zap" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/testing/protocmp" +) + +var _ component.Component = (*traceToMetricConnectorNative)(nil) // testing that the connectorImp properly implements the type Component interface + +// create test to create a connector, check that basic code compiles +func TestNewConnectorNative(t *testing.T) { + factory := NewFactory() + + creationParams := connectortest.NewNopSettings() + cfg := factory.CreateDefaultConfig().(*Config) + + tconn, err := factory.CreateTracesToMetrics(context.Background(), creationParams, cfg, consumertest.NewNop()) + assert.NoError(t, err) + + _, ok := tconn.(*traceToMetricConnectorNative) + assert.True(t, ok) // checks if the created connector implements the connectorImp struct +} + +func TestTraceToTraceConnectorNative(t *testing.T) { + factory := NewFactory() + + creationParams := connectortest.NewNopSettings() + cfg := factory.CreateDefaultConfig().(*Config) + + tconn, err := factory.CreateTracesToTraces(context.Background(), creationParams, cfg, consumertest.NewNop()) + assert.NoError(t, err) + + _, ok := tconn.(*traceToTraceConnector) + assert.True(t, ok) // checks if the created connector implements the connectorImp struct +} + +func creteConnectorNative(t *testing.T) (*traceToMetricConnectorNative, *consumertest.MetricsSink) { + cfg := NewFactory().CreateDefaultConfig().(*Config) + cfg.Traces.ResourceAttributesAsContainerTags = []string{semconv.AttributeCloudAvailabilityZone, semconv.AttributeCloudRegion, "az"} + return creteConnectorNativeWithCfg(t, cfg) +} + +func creteConnectorNativeWithCfg(t *testing.T, cfg *Config) (*traceToMetricConnectorNative, *consumertest.MetricsSink) { + factory := NewFactory() + + creationParams := connectortest.NewNopSettings() + metricsSink := &consumertest.MetricsSink{} + + cfg.Traces.BucketInterval = 1 * time.Second + tconn, err := factory.CreateTracesToMetrics(context.Background(), creationParams, cfg, metricsSink) + assert.NoError(t, err) + + connector, ok := tconn.(*traceToMetricConnectorNative) + require.True(t, ok) + return connector, metricsSink +} + +func TestContainerTagsNative(t *testing.T) { + connector, metricsSink := creteConnectorNative(t) + err := connector.Start(context.Background(), componenttest.NewNopHost()) + if err != nil { + t.Errorf("Error starting connector: %v", err) + return + } + defer func() { + _ = connector.Shutdown(context.Background()) + }() + + trace1 := generateTrace() + + err = connector.ConsumeTraces(context.Background(), trace1) + assert.NoError(t, err) + + // Send two traces to ensure unique container tags are added to the cache + trace2 := generateTrace() + err = connector.ConsumeTraces(context.Background(), trace2) + assert.NoError(t, err) + + for { + if len(metricsSink.AllMetrics()) > 0 { + break + } + time.Sleep(100 * time.Millisecond) + } + + // check if the container tags are added to the metrics + metrics := metricsSink.AllMetrics() + assert.Len(t, metrics, 1) + + ch := make(chan []byte, 100) + tr := newTranslatorWithStatsChannel(t, zap.NewNop(), ch) + _, err = tr.MapMetrics(context.Background(), metrics[0], nil) + require.NoError(t, err) + msg := <-ch + sp := &pb.StatsPayload{} + + err = proto.Unmarshal(msg, sp) + require.NoError(t, err) + + tags := sp.Stats[0].Tags + assert.Len(t, tags, 3) + assert.ElementsMatch(t, []string{"region:my-region", "zone:my-zone", "az:my-az"}, tags) +} + +var ( + testTraceID = [16]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16} + testSpanID1 = [8]byte{1, 2, 3, 4, 5, 6, 7, 8} + testSpanID2 = [8]byte{2, 2, 3, 4, 5, 6, 7, 8} + testSpanID3 = [8]byte{3, 2, 3, 4, 5, 6, 7, 8} + testSpanID4 = [8]byte{4, 2, 3, 4, 5, 6, 7, 8} +) + +func TestMeasuredAndClientKindNative(t *testing.T) { + cfg := NewFactory().CreateDefaultConfig().(*Config) + cfg.Traces.ComputeTopLevelBySpanKind = true + connector, metricsSink := creteConnectorNativeWithCfg(t, cfg) + err := connector.Start(context.Background(), componenttest.NewNopHost()) + if err != nil { + t.Errorf("Error starting connector: %v", err) + return + } + defer func() { + require.NoError(t, connector.Shutdown(context.Background())) + }() + + td := ptrace.NewTraces() + res := td.ResourceSpans().AppendEmpty().Resource() + res.Attributes().PutStr("service.name", "svc") + res.Attributes().PutStr(semconv.AttributeDeploymentEnvironmentName, "my-env") + + ss := td.ResourceSpans().At(0).ScopeSpans().AppendEmpty().Spans() + // Root span + s1 := ss.AppendEmpty() + s1.SetName("parent") + s1.SetKind(ptrace.SpanKindServer) + s1.SetTraceID(testTraceID) + s1.SetSpanID(testSpanID1) + // Child span with internal kind does not get stats + s2 := ss.AppendEmpty() + s2.SetName("child1") + s2.SetKind(ptrace.SpanKindInternal) + s2.SetTraceID(testTraceID) + s2.SetSpanID(testSpanID2) + s2.SetParentSpanID(testSpanID1) + // Child span with internal kind and the _dd.measured key gets stats + s3 := ss.AppendEmpty() + s3.SetName("child2") + s3.SetKind(ptrace.SpanKindInternal) + s3.SetTraceID(testTraceID) + s3.SetSpanID(testSpanID3) + s3.SetParentSpanID(testSpanID1) + s3.Attributes().PutInt("_dd.measured", 1) + // Child span with client kind gets stats + s4 := ss.AppendEmpty() + s4.SetName("child3") + s4.SetKind(ptrace.SpanKindClient) + s4.SetTraceID(testTraceID) + s4.SetSpanID(testSpanID4) + s4.SetParentSpanID(testSpanID1) + + err = connector.ConsumeTraces(context.Background(), td) + assert.NoError(t, err) + + timeout := time.Now().Add(1 * time.Minute) + for time.Now().Before(timeout) { + if len(metricsSink.AllMetrics()) > 0 { + break + } + time.Sleep(100 * time.Millisecond) + } + + metrics := metricsSink.AllMetrics() + require.Len(t, metrics, 1) + + ch := make(chan []byte, 100) + tr := newTranslatorWithStatsChannel(t, zap.NewNop(), ch) + _, err = tr.MapMetrics(context.Background(), metrics[0], nil) + require.NoError(t, err) + msg := <-ch + sp := &pb.StatsPayload{} + + err = proto.Unmarshal(msg, sp) + require.NoError(t, err) + assert.Len(t, sp.Stats, 1) + assert.Len(t, sp.Stats[0].Stats, 1) + assert.Equal(t, "my-env", sp.Stats[0].Env) + assert.Len(t, sp.Stats[0].Stats[0].Stats, 3) + cgss := sp.Stats[0].Stats[0].Stats + sort.Slice(cgss, func(i, j int) bool { + return cgss[i].Resource < cgss[j].Resource + }) + expected := []*pb.ClientGroupedStats{ + { + Service: "svc", + Name: "opentelemetry.internal", + Resource: "child2", + Type: "custom", + Hits: 1, + TopLevelHits: 0, + SpanKind: "internal", + IsTraceRoot: pb.Trilean_FALSE, + }, + { + Service: "svc", + Name: "opentelemetry.client", + Resource: "child3", + Type: "http", + Hits: 1, + TopLevelHits: 0, + SpanKind: "client", + IsTraceRoot: pb.Trilean_FALSE, + }, + { + Service: "svc", + Name: "opentelemetry.server", + Resource: "parent", + Type: "web", + Hits: 1, + TopLevelHits: 1, + SpanKind: "server", + IsTraceRoot: pb.Trilean_TRUE, + }, + } + if diff := cmp.Diff( + cgss, + expected, + protocmp.Transform(), + protocmp.IgnoreFields(&pb.ClientGroupedStats{}, "duration", "okSummary", "errorSummary")); diff != "" { + t.Errorf("Diff between APM stats -want +got:\n%v", diff) + } +} diff --git a/connector/datadogconnector/connector_test.go b/connector/datadogconnector/connector_test.go index 4fb76843df72..71ca2db0e58d 100644 --- a/connector/datadogconnector/connector_test.go +++ b/connector/datadogconnector/connector_test.go @@ -18,9 +18,10 @@ import ( "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/connector/connectortest" "go.opentelemetry.io/collector/consumer/consumertest" + "go.opentelemetry.io/collector/featuregate" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" - semconv "go.opentelemetry.io/collector/semconv/v1.5.0" + semconv "go.opentelemetry.io/collector/semconv/v1.27.0" "go.uber.org/zap" "google.golang.org/protobuf/proto" ) @@ -29,9 +30,15 @@ var _ component.Component = (*traceToMetricConnector)(nil) // testing that the c // create test to create a connector, check that basic code compiles func TestNewConnector(t *testing.T) { + err := featuregate.GlobalRegistry().Set(NativeIngestFeatureGate.ID(), false) + assert.NoError(t, err) + defer func() { + _ = featuregate.GlobalRegistry().Set(NativeIngestFeatureGate.ID(), true) + }() + factory := NewFactory() - creationParams := connectortest.NewNopCreateSettings() + creationParams := connectortest.NewNopSettings() cfg := factory.CreateDefaultConfig().(*Config) traceToMetricsConnector, err := factory.CreateTracesToMetrics(context.Background(), creationParams, cfg, consumertest.NewNop()) @@ -42,9 +49,15 @@ func TestNewConnector(t *testing.T) { } func TestTraceToTraceConnector(t *testing.T) { + err := featuregate.GlobalRegistry().Set(NativeIngestFeatureGate.ID(), false) + assert.NoError(t, err) + defer func() { + _ = featuregate.GlobalRegistry().Set(NativeIngestFeatureGate.ID(), true) + }() + factory := NewFactory() - creationParams := connectortest.NewNopCreateSettings() + creationParams := connectortest.NewNopSettings() cfg := factory.CreateDefaultConfig().(*Config) traceToTracesConnector, err := factory.CreateTracesToTraces(context.Background(), creationParams, cfg, consumertest.NewNop()) @@ -101,11 +114,18 @@ func fillSpanOne(span ptrace.Span) { } func creteConnector(t *testing.T) (*traceToMetricConnector, *consumertest.MetricsSink) { + err := featuregate.GlobalRegistry().Set(NativeIngestFeatureGate.ID(), false) + assert.NoError(t, err) + defer func() { + _ = featuregate.GlobalRegistry().Set(NativeIngestFeatureGate.ID(), true) + }() + factory := NewFactory() - creationParams := connectortest.NewNopCreateSettings() + creationParams := connectortest.NewNopSettings() cfg := factory.CreateDefaultConfig().(*Config) cfg.Traces.ResourceAttributesAsContainerTags = []string{semconv.AttributeCloudAvailabilityZone, semconv.AttributeCloudRegion, "az"} + cfg.Traces.BucketInterval = 1 * time.Second metricsSink := &consumertest.MetricsSink{} @@ -138,7 +158,7 @@ func TestContainerTags(t *testing.T) { err = connector.ConsumeTraces(context.Background(), trace2) assert.NoError(t, err) // check if the container tags are added to the cache - assert.Equal(t, 1, len(connector.containerTagCache.Items())) + assert.Len(t, connector.containerTagCache.Items(), 1) count := 0 connector.containerTagCache.Items()["my-container-id"].Object.(*sync.Map).Range(func(_, _ any) bool { count++ @@ -155,7 +175,7 @@ func TestContainerTags(t *testing.T) { // check if the container tags are added to the metrics metrics := metricsSink.AllMetrics() - assert.Equal(t, 1, len(metrics)) + assert.Len(t, metrics, 1) ch := make(chan []byte, 100) tr := newTranslatorWithStatsChannel(t, zap.NewNop(), ch) @@ -168,7 +188,7 @@ func TestContainerTags(t *testing.T) { require.NoError(t, err) tags := sp.Stats[0].Tags - assert.Equal(t, 3, len(tags)) + assert.Len(t, tags, 3) assert.ElementsMatch(t, []string{"region:my-region", "zone:my-zone", "az:my-az"}, tags) } diff --git a/connector/datadogconnector/example_test.go b/connector/datadogconnector/example_test.go index 13ef46e716f0..b9c297f5c559 100644 --- a/connector/datadogconnector/example_test.go +++ b/connector/datadogconnector/example_test.go @@ -22,9 +22,11 @@ import ( ) func TestExamples(t *testing.T) { - t.Setenv("DD_API_KEY", "testvalue") + t.Setenv("DD_API_KEY", "aaaaaaaaa") factories := newTestComponents(t) const configFile = "./examples/config.yaml" + // https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/33594 + // nolint:staticcheck _, err := otelcoltest.LoadConfigAndValidate(configFile, factories) require.NoError(t, err, "All yaml config must validate. Please ensure that all necessary component factories are added in newTestComponents()") } diff --git a/connector/datadogconnector/examples/config.yaml b/connector/datadogconnector/examples/config.yaml index d01c9b65ce25..f958baff9a80 100644 --- a/connector/datadogconnector/examples/config.yaml +++ b/connector/datadogconnector/examples/config.yaml @@ -78,6 +78,12 @@ connectors: ## A list of resource attributes that should be used as container tags. # resource_attributes_as_container_tags: ["could.availability_zone", "could.region"] + ## @param bucket_interval specifies the time interval size of aggregation buckets that aggregate the Datadog trace metrics. + ## It is also the time interval that Datadog trace metrics payloads are flushed to the pipeline. + ## If you are concerned about the metric volume generated by the Datadog connector and the resulting networking egress, try increasing bucket_interval. + ## Default is 10s if unset. + # + bucket_interval: 30s exporters: debug: verbosity: detailed diff --git a/connector/datadogconnector/factory.go b/connector/datadogconnector/factory.go index fe6ed4ded352..8cd5781f8d00 100644 --- a/connector/datadogconnector/factory.go +++ b/connector/datadogconnector/factory.go @@ -7,14 +7,28 @@ package datadogconnector // import "github.com/open-telemetry/opentelemetry-coll import ( "context" + "time" "github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/metricsclient" "github.com/DataDog/datadog-agent/pkg/trace/timing" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/connector" "go.opentelemetry.io/collector/consumer" + "go.opentelemetry.io/collector/featuregate" + "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/connector/datadogconnector/internal/metadata" + datadogconfig "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/datadog/config" +) + +const nativeIngestFeatureGateName = "connector.datadogconnector.NativeIngest" + +// NativeIngestFeatureGate is the feature gate that controls native OTel spans ingestion in Datadog APM stats +var NativeIngestFeatureGate = featuregate.GlobalRegistry().MustRegister( + nativeIngestFeatureGateName, + featuregate.StageBeta, + featuregate.WithRegisterDescription("When enabled, datadogconnector uses the native OTel API to ingest OTel spans and produce APM stats."), + featuregate.WithRegisterFromVersion("v0.104.0"), ) // NewFactory creates a factory for tailtracer connector. @@ -30,24 +44,36 @@ func NewFactory() connector.Factory { func createDefaultConfig() component.Config { return &Config{ Traces: TracesConfig{ - IgnoreResources: []string{}, - TraceBuffer: 1000, + TracesConfig: datadogconfig.TracesConfig{ + IgnoreResources: []string{}, + PeerServiceAggregation: true, + PeerTagsAggregation: true, + ComputeStatsBySpanKind: true, + }, + + TraceBuffer: 1000, + BucketInterval: 10 * time.Second, }, } } // defines the consumer type of the connector // we want to consume traces and export metrics therefore define nextConsumer as metrics, consumer is the next component in the pipeline -func createTracesToMetricsConnector(_ context.Context, params connector.CreateSettings, cfg component.Config, nextConsumer consumer.Metrics) (connector.Traces, error) { +func createTracesToMetricsConnector(_ context.Context, params connector.Settings, cfg component.Config, nextConsumer consumer.Metrics) (c connector.Traces, err error) { metricsClient := metricsclient.InitializeMetricClient(params.MeterProvider, metricsclient.ConnectorSourceTag) - timingReporter := timing.New(metricsClient) - c, err := newTraceToMetricConnector(params.TelemetrySettings, cfg, nextConsumer, metricsClient, timingReporter) + if NativeIngestFeatureGate.IsEnabled() { + params.Logger.Info("Datadog connector using the native OTel API to ingest OTel spans and produce APM stats. To revert to the legacy processing pipeline, disable the feature gate", zap.String("feature gate", nativeIngestFeatureGateName)) + c, err = newTraceToMetricConnectorNative(params.TelemetrySettings, cfg, nextConsumer, metricsClient) + } else { + params.Logger.Info("Datadog connector using the old processing pipelines to ingest OTel spans and produce APM stats.") + c, err = newTraceToMetricConnector(params.TelemetrySettings, cfg, nextConsumer, metricsClient, timing.New(metricsClient)) + } if err != nil { return nil, err } return c, nil } -func createTracesToTracesConnector(_ context.Context, params connector.CreateSettings, _ component.Config, nextConsumer consumer.Traces) (connector.Traces, error) { +func createTracesToTracesConnector(_ context.Context, params connector.Settings, _ component.Config, nextConsumer consumer.Traces) (connector.Traces, error) { return newTraceToTraceConnector(params.Logger, nextConsumer), nil } diff --git a/connector/datadogconnector/factory_test.go b/connector/datadogconnector/factory_test.go index 8dc505d731bd..bce1dadd9040 100644 --- a/connector/datadogconnector/factory_test.go +++ b/connector/datadogconnector/factory_test.go @@ -5,9 +5,12 @@ package datadogconnector import ( "testing" + "time" "github.com/stretchr/testify/assert" "go.opentelemetry.io/collector/component/componenttest" + + datadogconfig "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/datadog/config" ) func TestCreateDefaultConfig(t *testing.T) { @@ -17,8 +20,14 @@ func TestCreateDefaultConfig(t *testing.T) { assert.Equal(t, &Config{ Traces: TracesConfig{ - IgnoreResources: []string{}, - TraceBuffer: 1000, + TracesConfig: datadogconfig.TracesConfig{ + IgnoreResources: []string{}, + PeerServiceAggregation: true, + PeerTagsAggregation: true, + ComputeStatsBySpanKind: true, + }, + TraceBuffer: 1000, + BucketInterval: 10 * time.Second, }, }, cfg, "failed to create default config") diff --git a/connector/datadogconnector/generated_component_test.go b/connector/datadogconnector/generated_component_test.go index a5f6642bfab2..299417144987 100644 --- a/connector/datadogconnector/generated_component_test.go +++ b/connector/datadogconnector/generated_component_test.go @@ -14,6 +14,7 @@ import ( "go.opentelemetry.io/collector/connector/connectortest" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/consumer/consumertest" + "go.opentelemetry.io/collector/pipeline" ) func TestComponentFactoryType(t *testing.T) { @@ -29,21 +30,21 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set connector.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) }{ { name: "traces_to_metrics", - createFn: func(ctx context.Context, set connector.CreateSettings, cfg component.Config) (component.Component, error) { - router := connector.NewMetricsRouter(map[component.ID]consumer.Metrics{component.NewID(component.DataTypeMetrics): consumertest.NewNop()}) + createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) { + router := connector.NewMetricsRouter(map[pipeline.ID]consumer.Metrics{pipeline.NewID(pipeline.SignalMetrics): consumertest.NewNop()}) return factory.CreateTracesToMetrics(ctx, set, cfg, router) }, }, { name: "traces_to_traces", - createFn: func(ctx context.Context, set connector.CreateSettings, cfg component.Config) (component.Component, error) { - router := connector.NewTracesRouter(map[component.ID]consumer.Traces{component.NewID(component.DataTypeTraces): consumertest.NewNop()}) + createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) { + router := connector.NewTracesRouter(map[pipeline.ID]consumer.Traces{pipeline.NewID(pipeline.SignalTraces): consumertest.NewNop()}) return factory.CreateTracesToTraces(ctx, set, cfg, router) }, }, @@ -56,21 +57,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), connectortest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), connectortest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - firstConnector, err := test.createFn(context.Background(), connectortest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + firstConnector, err := tt.createFn(context.Background(), connectortest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() require.NoError(t, err) require.NoError(t, firstConnector.Start(context.Background(), host)) require.NoError(t, firstConnector.Shutdown(context.Background())) - secondConnector, err := test.createFn(context.Background(), connectortest.NewNopCreateSettings(), cfg) + secondConnector, err := tt.createFn(context.Background(), connectortest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, secondConnector.Start(context.Background(), host)) require.NoError(t, secondConnector.Shutdown(context.Background())) diff --git a/connector/datadogconnector/go.mod b/connector/datadogconnector/go.mod index 326b2625f8c0..41973a9e311b 100644 --- a/connector/datadogconnector/go.mod +++ b/connector/datadogconnector/go.mod @@ -1,104 +1,122 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/connector/datadogconnector -go 1.21.0 +go 1.22.0 require ( - github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/metricsclient v0.0.0-20240525065430-d0b647bcb646 - github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/statsprocessor v0.0.0-20240525065430-d0b647bcb646 - github.com/DataDog/datadog-agent/pkg/proto v0.54.0-rc.5 - github.com/DataDog/datadog-agent/pkg/trace v0.54.0-rc.5 + github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/metricsclient v0.59.0 + github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/statsprocessor v0.59.0 + github.com/DataDog/datadog-agent/pkg/proto v0.59.0 + github.com/DataDog/datadog-agent/pkg/trace v0.59.0 github.com/DataDog/datadog-go/v5 v5.5.0 - github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.16.1 - github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics v0.16.1 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.102.0 + github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.22.0 + github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics v0.22.0 + github.com/google/go-cmp v0.6.0 + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/datadog v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.116.0 github.com/patrickmn/go-cache v2.1.0+incompatible - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/connector v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/exporter/debugexporter v0.102.0 - go.opentelemetry.io/collector/otelcol v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/processor v0.102.0 - go.opentelemetry.io/collector/processor/batchprocessor v0.102.0 - go.opentelemetry.io/collector/receiver v0.102.0 - go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/connector v0.116.0 + go.opentelemetry.io/collector/connector/connectortest v0.116.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/debugexporter v0.116.0 + go.opentelemetry.io/collector/featuregate v1.22.0 + go.opentelemetry.io/collector/otelcol v0.116.0 + go.opentelemetry.io/collector/otelcol/otelcoltest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/pipeline v0.116.0 + go.opentelemetry.io/collector/processor v0.116.0 + go.opentelemetry.io/collector/processor/batchprocessor v0.116.0 + go.opentelemetry.io/collector/receiver v0.116.0 + go.opentelemetry.io/collector/receiver/otlpreceiver v0.116.0 + go.opentelemetry.io/collector/semconv v0.116.0 + go.opentelemetry.io/otel/metric v1.32.0 go.uber.org/zap v1.27.0 - google.golang.org/protobuf v1.34.1 + google.golang.org/protobuf v1.35.2 ) require ( - cloud.google.com/go/compute/metadata v0.3.0 // indirect - github.com/DataDog/agent-payload/v5 v5.0.119 // indirect - github.com/DataDog/datadog-agent/comp/core/config v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/core/hostname/hostnameinterface v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/core/log v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/core/secrets v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/core/telemetry v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/def v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/logs/agent/config v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline/logsagentpipelineimpl v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/exporter/logsagentexporter v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/config/env v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/config/model v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/config/setup v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/config/utils v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/auditor v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/client v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/diagnostic v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/message v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/metrics v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/pipeline v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/processor v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/sds v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/sender v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/sources v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/status/statusinterface v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/status/utils v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/obfuscate v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/status/health v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/telemetry v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/backoff v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/cgroups v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/executable v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/filesystem v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/fxutil v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/http v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/log v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/optional v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/pointer v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/scrubber v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/startstop v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/statstracker v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/system v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/system/socket v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/winutil v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/version v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-api-client-go/v2 v2.26.0 // indirect - github.com/DataDog/dd-sensitive-data-scanner/sds-go/go v0.0.0-20240419161837-f1b2f553edfe // indirect - github.com/DataDog/go-sqllexer v0.0.9 // indirect + cloud.google.com/go/compute/metadata v0.5.2 // indirect + github.com/DataDog/agent-payload/v5 v5.0.137 // indirect + github.com/DataDog/datadog-agent/comp/core/config v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/core/flare/builder v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/core/flare/types v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/core/hostname/hostnameinterface v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/core/log v0.56.2 // indirect + github.com/DataDog/datadog-agent/comp/core/log/def v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/core/secrets v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/core/telemetry v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/def v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/logs/agent/config v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline/logsagentpipelineimpl v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/exporter/logsagentexporter v0.62.0-devel.0.20241213165407-f95df913d2b7 // indirect + github.com/DataDog/datadog-agent/comp/trace/compression/def v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/trace/compression/impl-gzip v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/config/env v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/config/mock v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/config/model v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/config/nodetreemodel v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/config/setup v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/config/structure v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/config/teeconfig v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/config/utils v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/auditor v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/client v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/diagnostic v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/message v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/metrics v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/pipeline v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/processor v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/sds v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/sender v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/sources v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/status/statusinterface v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/status/utils v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/status/health v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/telemetry v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/backoff v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/cgroups v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/executable v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/filesystem v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/fxutil v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/http v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.59.1 // indirect + github.com/DataDog/datadog-agent/pkg/util/optional v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/pointer v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.59.1 // indirect + github.com/DataDog/datadog-agent/pkg/util/startstop v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/statstracker v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/system v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/system/socket v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/winutil v0.59.1 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.59.1 // indirect + github.com/DataDog/datadog-api-client-go/v2 v2.33.0 // indirect + github.com/DataDog/dd-sensitive-data-scanner/sds-go/go v0.0.0-20240816154533-f7f9beb53a42 // indirect + github.com/DataDog/go-sqllexer v0.0.15 // indirect github.com/DataDog/go-tuf v1.1.0-0.5.2 // indirect github.com/DataDog/gohai v0.0.0-20230524154621-4316413895ee // indirect - github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata v0.16.1 // indirect - github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/logs v0.16.1 // indirect - github.com/DataDog/opentelemetry-mapping-go/pkg/quantile v0.16.1 // indirect - github.com/DataDog/sketches-go v1.4.5 // indirect - github.com/DataDog/viper v1.13.3 // indirect - github.com/DataDog/zstd v1.5.2 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.23.0 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata v0.22.0 // indirect + github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/logs v0.22.0 // indirect + github.com/DataDog/opentelemetry-mapping-go/pkg/quantile v0.22.0 // indirect + github.com/DataDog/sketches-go v1.4.6 // indirect + github.com/DataDog/viper v1.14.0 // indirect + github.com/DataDog/zstd v1.5.6 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/alecthomas/participle/v2 v2.1.1 // indirect - github.com/aws/aws-sdk-go v1.53.11 // indirect + github.com/antchfx/xmlquery v1.4.2 // indirect + github.com/antchfx/xpath v1.3.2 // indirect + github.com/aws/aws-sdk-go v1.55.5 // indirect github.com/benbjohnson/clock v1.3.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/briandowns/spinner v1.23.0 // indirect @@ -111,19 +129,23 @@ require ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.1 // indirect + github.com/elastic/go-grok v0.3.1 // indirect + github.com/elastic/lunes v0.1.0 // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect - github.com/fatih/color v1.16.0 // indirect + github.com/fatih/color v1.18.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-openapi/jsonpointer v0.20.2 // indirect github.com/go-openapi/jsonreference v0.20.4 // indirect github.com/go-openapi/swag v0.22.9 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gobwas/glob v0.2.3 // indirect - github.com/goccy/go-json v0.10.2 // indirect + github.com/goccy/go-json v0.10.4 // indirect github.com/godbus/dbus/v5 v5.0.6 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect @@ -131,16 +153,15 @@ require ( github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/gnostic-models v0.6.8 // indirect - github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-version v1.7.0 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect + github.com/hashicorp/hcl v1.0.1-vault-5 // indirect github.com/hectane/go-acl v0.0.0-20190604041725-da78bae5fc95 // indirect github.com/iancoleman/strcase v0.3.0 // indirect github.com/imdario/mergo v0.3.16 // indirect @@ -150,11 +171,12 @@ require ( github.com/json-iterator/go v1.1.12 // indirect github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect github.com/karrick/godirwalk v1.17.0 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c // indirect + github.com/magefile/mage v1.15.0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect @@ -165,115 +187,138 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect - github.com/mostynb/go-grpc-compression v1.2.2 // indirect + github.com/mostynb/go-grpc-compression v1.2.3 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/ecsutil v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.102.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/ecsutil v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.116.0 // indirect github.com/opencontainers/runtime-spec v1.1.0-rc.3 // indirect github.com/openshift/api v3.9.0+incompatible // indirect github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142 // indirect github.com/outcaste-io/ristretto v0.2.1 // indirect - github.com/pelletier/go-toml v1.2.0 // indirect - github.com/philhofer/fwd v1.1.2 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c // indirect - github.com/prometheus/client_golang v1.19.1 // indirect + github.com/prometheus/client_golang v1.20.5 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/rs/cors v1.10.1 // indirect + github.com/prometheus/common v0.61.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/rs/cors v1.11.1 // indirect github.com/secure-systems-lab/go-securesystemslib v0.7.0 // indirect - github.com/shirou/gopsutil/v3 v3.24.4 // indirect + github.com/shirou/gopsutil/v3 v3.24.5 // indirect + github.com/shirou/gopsutil/v4 v4.24.11 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect - github.com/spf13/afero v1.10.0 // indirect - github.com/spf13/cast v1.5.1 // indirect - github.com/spf13/cobra v1.8.0 // indirect - github.com/spf13/jwalterweatherman v1.0.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.7.0 // indirect + github.com/spf13/cobra v1.8.1 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stormcat24/protodep v0.1.8 // indirect github.com/stretchr/objx v0.5.2 // indirect - github.com/tinylib/msgp v1.1.9 // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect + github.com/tinylib/msgp v1.2.4 // indirect + github.com/tklauser/go-sysconf v0.3.14 // indirect + github.com/tklauser/numcpus v0.8.0 // indirect + github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 // indirect + github.com/x448/float16 v0.8.4 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect - go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/configgrpc v0.102.0 // indirect - go.opentelemetry.io/collector/config/confighttp v0.102.0 // indirect - go.opentelemetry.io/collector/config/confignet v0.102.0 // indirect - go.opentelemetry.io/collector/config/configopaque v1.9.0 // indirect - go.opentelemetry.io/collector/config/configretry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/pdata/testdata v0.102.0 // indirect - go.opentelemetry.io/collector/service v0.102.0 // indirect - go.opentelemetry.io/contrib/config v0.7.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/contrib/propagators/b3 v1.27.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/bridge/opencensus v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - go.opentelemetry.io/proto/otlp v1.2.0 // indirect + go.opentelemetry.io/collector v0.116.0 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/component/componentstatus v0.116.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/configgrpc v0.116.0 // indirect + go.opentelemetry.io/collector/config/confighttp v0.116.0 // indirect + go.opentelemetry.io/collector/config/confignet v1.22.0 // indirect + go.opentelemetry.io/collector/config/configopaque v1.22.0 // indirect + go.opentelemetry.io/collector/config/configretry v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/configtls v1.22.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0 // indirect + go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0 // indirect + go.opentelemetry.io/collector/confmap/provider/httpprovider v1.22.0 // indirect + go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.22.0 // indirect + go.opentelemetry.io/collector/connector/xconnector v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0 // indirect + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 // indirect + go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/internal/sharedcomponent v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/testdata v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 // indirect + go.opentelemetry.io/collector/processor/processortest v0.116.0 // indirect + go.opentelemetry.io/collector/processor/xprocessor v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/collector/service v0.116.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.6.0 // indirect + go.opentelemetry.io/contrib/config v0.10.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/contrib/propagators/b3 v1.31.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.54.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 // indirect + go.opentelemetry.io/otel/log v0.8.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.7.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/atomic v1.11.0 // indirect - go.uber.org/dig v1.17.0 // indirect - go.uber.org/fx v1.18.2 // indirect + go.uber.org/dig v1.18.0 // indirect + go.uber.org/fx v1.22.2 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/mod v0.17.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/oauth2 v0.20.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/term v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.21.0 // indirect - gonum.org/v1/gonum v0.15.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect + golang.org/x/exp v0.0.0-20241210194714-1829a127f884 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/oauth2 v0.24.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect + golang.org/x/time v0.6.0 // indirect + gonum.org/v1/gonum v0.15.1 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/grpc v1.68.1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gopkg.in/zorkian/go-datadog-api.v2 v2.30.0 // indirect - k8s.io/api v0.29.3 // indirect - k8s.io/apimachinery v0.29.3 // indirect - k8s.io/client-go v0.29.3 // indirect - k8s.io/klog/v2 v2.120.1 // indirect - k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect - k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + k8s.io/api v0.31.3 // indirect + k8s.io/apimachinery v0.31.3 // indirect + k8s.io/client-go v0.31.3 // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect + k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor => ../../processor/tailsamplingprocessor @@ -335,3 +380,9 @@ replace github.com/openshift/api v3.9.0+incompatible => github.com/openshift/api replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor => ../../processor/transformprocessor replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling => ../../pkg/sampling + +replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil => ../../internal/pdatautil + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata => ../../pkg/experimentalmetricmetadata + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/datadog => ../../pkg/datadog diff --git a/connector/datadogconnector/go.sum b/connector/datadogconnector/go.sum index 7bd132ea35e7..2b8ac4ef7197 100644 --- a/connector/datadogconnector/go.sum +++ b/connector/datadogconnector/go.sum @@ -3,49 +3,39 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go v0.110.10 h1:LXy9GEO+timppncPIAZoOj3l58LIU9k+kn48AN7IO3Y= +cloud.google.com/go/auth v0.7.0 h1:kf/x9B3WTbBUHkC+1VS8wwwli9TzhSt0vSTVBmMR8Ts= +cloud.google.com/go/auth v0.7.0/go.mod h1:D+WqdrpcjmiCgWrXmLLxOVq1GACoE36chW6KXoEvuIw= +cloud.google.com/go/auth/oauth2adapt v0.2.2 h1:+TTV8aXpjeChS9M+aTtN/TjdQnzJvmzKFt//oWu7HX4= +cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= -cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo= +cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.10.0 h1:n1DH8TPV4qqPTje2RcUBYwtrTWlabVp4n46+74X2pn4= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.10.0/go.mod h1:HDcZnuGbiyppErN6lB+idp4CKhjbc8gwjto6OPpyggM= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1 h1:sO0/P7g68FrryJzljemN+6GTssUXdANk6aJ7T1ZxnsQ= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1/go.mod h1:h8hyGFDsU5HMivxiS2iYFZsgDbU9OnnJ163x5UGVKYo= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 h1:LqbJ/WzJUwBf8UiaSzgX7aMclParm9/5Vgp+TY51uBQ= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2/go.mod h1:yInRyqWXAuaPrgI7p70+lDDgh3mlBohis29jGMISnmc= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.5.0 h1:MxA59PGoCFb+vCwRQi3PhQEwHj4+r2dhuv9HG+vM7iM= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.5.0/go.mod h1:uYt4CfhkJA9o0FN7jfE5minm/i4nUE4MjGUJkzB6Zs8= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0 h1:GJHeeA2N7xrG3q30L2UXDyuWRzDM900/65j70wcM4Ww= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0/go.mod h1:l38EPgmsp71HHLq9j7De57JcKOWPyhrsW1Awm1JS6K0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0 h1:LkHbJbgF3YyvC53aqYGR+wWQDn2Rdp9AQdGndf9QvY4= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0/go.mod h1:QyiQdW4f4/BIfB8ZutZ2s+28RAgfa/pT+zS++ZHyM1I= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 h1:bXwSugBiSbgtz7rOtbfGf+woewp4f06orW9OP5BjHLA= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0/go.mod h1:Y/HgrePTmGy9HjdSGTqZNa+apUpTVIEVKXJyARP2lrk= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= @@ -55,167 +45,187 @@ github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSY github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 h1:DzHpqpoJVaCgOUdVHxE8QB52S6NiVdDQvGlny1qvPqA= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Code-Hex/go-generics-cache v1.3.1 h1:i8rLwyhoyhaerr7JpjtYjJZUcCbWOdiYO3fZXLiEC4g= -github.com/Code-Hex/go-generics-cache v1.3.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4= -github.com/DataDog/agent-payload/v5 v5.0.119 h1:PgeA41P3BE4z+b0j61B6yXnZDw7tB7bxl5EIHyGVG14= -github.com/DataDog/agent-payload/v5 v5.0.119/go.mod h1:FgVQKmVdqdmZTbxIptqJC/l+xEzdiXsaAOs/vGAvWzs= -github.com/DataDog/datadog-agent/cmd/agent/common/path v0.54.0-rc.5 h1:nLwtiYCoD+yb4HfhcJ3hmD9pczYLveOJexH5OHVQWsk= -github.com/DataDog/datadog-agent/cmd/agent/common/path v0.54.0-rc.5/go.mod h1:wJQkyIKR2epsYERgVRrO55fgda+oS5ZyBy2neJFXXGM= -github.com/DataDog/datadog-agent/comp/core/config v0.54.0-rc.5 h1:DKefO1N2aGtsUWRxyziQh3cHS3LuqdFjd+QmHR/qLNk= -github.com/DataDog/datadog-agent/comp/core/config v0.54.0-rc.5/go.mod h1:nDpszL8YD58OU/w2uFtN6oHv0cDDZrRNufYgBDtleVw= -github.com/DataDog/datadog-agent/comp/core/flare/types v0.54.0-rc.5 h1:GTYjjIV8YupcNqcNgcAnrNkbofcb6w7JFVdtfv9On9Q= -github.com/DataDog/datadog-agent/comp/core/flare/types v0.54.0-rc.5/go.mod h1:aChd0OV9bB534m+H4IPglCAs441s/1R+Tau5USeSM+Q= -github.com/DataDog/datadog-agent/comp/core/hostname/hostnameinterface v0.54.0-rc.5 h1:yz7efcj2vC0N0bcRwVItXXsFUl4JFgEzsqe3lDhdu7s= -github.com/DataDog/datadog-agent/comp/core/hostname/hostnameinterface v0.54.0-rc.5/go.mod h1:GhQb1d4Z4Z/E/WnUpmtSKADJSwziEIz0jwU0/MvNTic= -github.com/DataDog/datadog-agent/comp/core/log v0.54.0-rc.5 h1:2tvd3K+Bat8hT2jJBpIAfH/8J9k7v+s+IQcoyVVQitU= -github.com/DataDog/datadog-agent/comp/core/log v0.54.0-rc.5/go.mod h1:mtMxZiwg13b4bHgDf8xE6FHgTcadzI5Cc0lx2MSY1mE= -github.com/DataDog/datadog-agent/comp/core/secrets v0.54.0-rc.5 h1:hhkI7EtQwvhrKXO+oNo7V2ZhlSJ2Pt3uj9rOUeVrlSs= -github.com/DataDog/datadog-agent/comp/core/secrets v0.54.0-rc.5/go.mod h1:Bx0rH0jqLkDzQCBeDsgKGmcehYoQjuO6fE8aGjiQe2A= -github.com/DataDog/datadog-agent/comp/core/telemetry v0.54.0-rc.5 h1:v8WyP8srS/5EfD7OKZCm1aRPT56AXaQ2QqQRO2+fwUM= -github.com/DataDog/datadog-agent/comp/core/telemetry v0.54.0-rc.5/go.mod h1:ZpND0xZO2YVm7FNbPOrVoRMbPFhVRbZC40Vb5xsgyQc= -github.com/DataDog/datadog-agent/comp/def v0.54.0-rc.5 h1:pVYCT2SztEIcF03BdbrDgPfT7C/Pc2earv9YB4/2lU0= -github.com/DataDog/datadog-agent/comp/def v0.54.0-rc.5/go.mod h1:ts1c7j9tfa/BaoBH/gdQPt1LTeLeSh0b7IHMqm7ylDE= -github.com/DataDog/datadog-agent/comp/logs/agent/config v0.54.0-rc.5 h1:V4zdArRqhlZWT0tWj8mJE/pDRcAs4IkBC7Y5N+Gjr7U= -github.com/DataDog/datadog-agent/comp/logs/agent/config v0.54.0-rc.5/go.mod h1:88zmScug+KuG8EEuyaf3CAw5idi7XFMDTq66u6UPW4A= -github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline v0.54.0-rc.5 h1:FAZQ6viOK9CiU8x7aW2PJMlI4nq3bmNnOT642ASUxxc= -github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline v0.54.0-rc.5/go.mod h1:c+WZvnTktqP8inoph1/wvxvfLx9rV/cKoR/zvoEpu6E= -github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline/logsagentpipelineimpl v0.54.0-rc.5 h1:dtJiztozoBiltjE0382hAMtDeEfRnEov186xGZ4TGB0= -github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline/logsagentpipelineimpl v0.54.0-rc.5/go.mod h1:yMYGvbt3AAXiXoadUxEbxWl6C3/Ub2t8dn2UG7Y54SM= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/exporter/logsagentexporter v0.54.0-rc.5 h1:5HcA9XYLdI0Z81o5p7SppdVCYjKoshv9GBrqZfeLvC4= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/exporter/logsagentexporter v0.54.0-rc.5/go.mod h1:R2jDIkQpwYzy4AturN73oJB2X32jtivHW9TvdeN7BAQ= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/metricsclient v0.0.0-20240525065430-d0b647bcb646 h1:KeIeWDAjzQxL6/ruBQmFlT/FRstEz11z/UT3LH+8sAA= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/metricsclient v0.0.0-20240525065430-d0b647bcb646/go.mod h1:TIf/0Kb3DAYAtYbhhxmZ72etu+IKSqy66mcIGBuioik= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/statsprocessor v0.0.0-20240525065430-d0b647bcb646 h1:dyGnQr1QVLhwLdKzCTMsDsnYYUOkOXU4JWT2HuS1LJ4= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/statsprocessor v0.0.0-20240525065430-d0b647bcb646/go.mod h1:m7gt1CfJ/8FgnidFPk2lENaxO9m0mOnWWJQylgJkMzw= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.54.0-rc.5 h1:GuGbndVAnhNa6JOtDsDEWXmZFJB0fp4iCnJ3OO1JSks= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.54.0-rc.5/go.mod h1:6ydg+CWz9UlcBkV4pptOdQXTLNc/8YkTqta6VJFGg1M= -github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.54.0-rc.5 h1:YEvetFgYjf3oZsliKn0ddrz1t4ZvOzzlvOxJ100szlI= -github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.54.0-rc.5/go.mod h1:Mpe5lBwTlmLsu1WwIx8uRbj+Bi8+9gW8rWDfXPRwQVQ= -github.com/DataDog/datadog-agent/pkg/config/env v0.54.0-rc.5 h1:D4e5j805YtqmdhSeCXax020Nht6arNUvuvX4AKDMfu8= -github.com/DataDog/datadog-agent/pkg/config/env v0.54.0-rc.5/go.mod h1:9FPuluS8k4LEpfvlz7KQ6iHmqyTVfvuKxhwZkEUeoI4= -github.com/DataDog/datadog-agent/pkg/config/logs v0.54.0-rc.5 h1:xJ6u0OftjMYixmaDlb5yba3T72kyo/rpI7iuOYiAgJE= -github.com/DataDog/datadog-agent/pkg/config/logs v0.54.0-rc.5/go.mod h1:uo77w0taiJfXk3RV4N71t3WmoHhu6wJ782YmGeV6Ynk= -github.com/DataDog/datadog-agent/pkg/config/model v0.54.0-rc.5 h1:6HhxZQzS2edPF9ZevjWtstu6y17lj4a4fsRiTJ3ObHI= -github.com/DataDog/datadog-agent/pkg/config/model v0.54.0-rc.5/go.mod h1:X6U3mq0dErErZUIQx3GMmrO0jdp7aGN656iSDUW8sfw= -github.com/DataDog/datadog-agent/pkg/config/setup v0.54.0-rc.5 h1:+kl+DEK320zyWZBoFzTofgwN0AzUKpJByf8KdJ7WpJQ= -github.com/DataDog/datadog-agent/pkg/config/setup v0.54.0-rc.5/go.mod h1:2qnUs+85QVGqdK4DOpEaox6MKbfKFo3v2MXl9W8zP9Y= -github.com/DataDog/datadog-agent/pkg/config/utils v0.54.0-rc.5 h1:FQmC8qbWoaH4GFzuSuGFtJCR3kleh6xBmQXISiE8/Ho= -github.com/DataDog/datadog-agent/pkg/config/utils v0.54.0-rc.5/go.mod h1:pWPWng1HBqWccXoYJXfmWgpr+pujCpe4XYtGbiH4IOU= -github.com/DataDog/datadog-agent/pkg/logs/auditor v0.54.0-rc.5 h1:dQIi1vw2MaBmrT0kQv0qE5csFecCzaoPGY8m8KTEiqA= -github.com/DataDog/datadog-agent/pkg/logs/auditor v0.54.0-rc.5/go.mod h1:7w1fYTvDKwfk2J08P3vKEieeULSFASfZ0IgCjEoIF2E= -github.com/DataDog/datadog-agent/pkg/logs/client v0.54.0-rc.5 h1:YMYTquLk0uzYxvyRR1ew1QBf5dMtz3b/uBuwQzVODs4= -github.com/DataDog/datadog-agent/pkg/logs/client v0.54.0-rc.5/go.mod h1:YZbEwh9sPrDqxj02BHUHN6ljR+wohaN5QkkTdNZBLxY= -github.com/DataDog/datadog-agent/pkg/logs/diagnostic v0.54.0-rc.5 h1:klt8iysuxBuycyDu6lE51oCcAzZLJpvA7HiAKyQv9GM= -github.com/DataDog/datadog-agent/pkg/logs/diagnostic v0.54.0-rc.5/go.mod h1:93tXt/40ar1666Kk83CDOsb35xhAhQiPSqEH24zZ164= -github.com/DataDog/datadog-agent/pkg/logs/message v0.54.0-rc.5 h1:tX7zHQ6bmLJTfcRTcGY+91VXCZPEY2/OxKlVg/P4Tec= -github.com/DataDog/datadog-agent/pkg/logs/message v0.54.0-rc.5/go.mod h1:SGUmU3Fz/AtmdJvfos5EokpT4CN9YVi50DbYYZX0q4w= -github.com/DataDog/datadog-agent/pkg/logs/metrics v0.54.0-rc.5 h1:tzzzy68wHmQLIrpbJbmo9ZYqm8pHTlWvjUYnQUMBsUU= -github.com/DataDog/datadog-agent/pkg/logs/metrics v0.54.0-rc.5/go.mod h1:vcMlIQfRoHkafZFAHtHrkmeCSQzGpXtE2iyLkaObnUk= -github.com/DataDog/datadog-agent/pkg/logs/pipeline v0.54.0-rc.5 h1:yJ3W4/CQwlEifXz1FDCehvoVvGwaH4LXuJ6A/TbRMdc= -github.com/DataDog/datadog-agent/pkg/logs/pipeline v0.54.0-rc.5/go.mod h1:WsysKMxzTLQHn75WAUwHHw/SyhGQr+m8fYE3iMYl2gA= -github.com/DataDog/datadog-agent/pkg/logs/processor v0.54.0-rc.5 h1:RqKUVfSHrw5D8nRMIhOaAKQThk7pHRbyDVo2CylYtAY= -github.com/DataDog/datadog-agent/pkg/logs/processor v0.54.0-rc.5/go.mod h1:LwAwQKHHSsOC0sspi58vpN2h4tFEI1ZNtU69OUVFBxc= -github.com/DataDog/datadog-agent/pkg/logs/sds v0.54.0-rc.5 h1:u8dgzzSluJx7WMk3J834CxCP7FCo+z0PU9d1vj7K1HU= -github.com/DataDog/datadog-agent/pkg/logs/sds v0.54.0-rc.5/go.mod h1:+octueIX19RzWrarAkKNIAtFTfETavn6Ku4s217EcSY= -github.com/DataDog/datadog-agent/pkg/logs/sender v0.54.0-rc.5 h1:n5UMZvF+5L3XekeS5bkR0adwcOsogIT9uEtq2vHMhtU= -github.com/DataDog/datadog-agent/pkg/logs/sender v0.54.0-rc.5/go.mod h1:dj51DKlSkf10tqsdfuE4NMZaD2PSzau3G8Le8UmXerA= -github.com/DataDog/datadog-agent/pkg/logs/sources v0.54.0-rc.5 h1:wpvvYERlZsBmdoVMIYFxd2XlvSjBh5en06WkKgWRYk4= -github.com/DataDog/datadog-agent/pkg/logs/sources v0.54.0-rc.5/go.mod h1:bBzxEwKqZRKlkizVUViWjGNkjjF58njl+YiZNLxD/ZI= -github.com/DataDog/datadog-agent/pkg/logs/status/statusinterface v0.54.0-rc.5 h1:KuPBZTbwVJqDMa9ATfg0YWpGl3CxgGJcJZzSmsGVNdI= -github.com/DataDog/datadog-agent/pkg/logs/status/statusinterface v0.54.0-rc.5/go.mod h1:xsyGZLKEr6dZaJlC9QWuyYVXqMnHRwZzn641O3bfB98= -github.com/DataDog/datadog-agent/pkg/logs/status/utils v0.54.0-rc.5 h1:GAai92l2sX1rOQqGzPzE0IGMzS442xTLrHF/EwTywnw= -github.com/DataDog/datadog-agent/pkg/logs/status/utils v0.54.0-rc.5/go.mod h1:TsFFZ6y2/brcnkXLZhfp0k2xrewdyqhXnjxVpkOWIvE= -github.com/DataDog/datadog-agent/pkg/logs/util/testutils v0.54.0-rc.5 h1:9mAiLISlZcol07wCndWd5ErjItibOClx+N2Oyo3lG+A= -github.com/DataDog/datadog-agent/pkg/logs/util/testutils v0.54.0-rc.5/go.mod h1:J5lpbKKJzxPE2i5dsBYJnxbHlFvzPkfxNlhh2p3s18s= -github.com/DataDog/datadog-agent/pkg/obfuscate v0.54.0-rc.5 h1:qZg/3r8lLIgwzpHkqNBdnDKCdHexSxjgkb6FbPBaMnY= -github.com/DataDog/datadog-agent/pkg/obfuscate v0.54.0-rc.5/go.mod h1:4/9D8y6pQo5a/Tg8GAQN8SaRIRWxxyl5QHzPRuu8D0k= -github.com/DataDog/datadog-agent/pkg/proto v0.54.0-rc.5 h1:0HdqgTFchLs6ElI9cVrfjsT/gOF8A7PiY/VI2JMDFJc= -github.com/DataDog/datadog-agent/pkg/proto v0.54.0-rc.5/go.mod h1:gHkSUTn6H6UEZQHY3XWBIGNjfI3Tdi0IxlrxIFBWDwU= -github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.54.0-rc.5 h1:wM6w1HtUOxrn/sgMW00jx+0p4rNzPv+NhPqmIpboyV0= -github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.54.0-rc.5/go.mod h1:3yFk56PJ57yS1GqI9HAsS4PSlAeGCC9RQA7jxKzYj6g= -github.com/DataDog/datadog-agent/pkg/status/health v0.54.0-rc.5 h1:WgoyD4RkoGI3JDy+79SyiPc0AJGyCO5c2toOfxWwW1E= -github.com/DataDog/datadog-agent/pkg/status/health v0.54.0-rc.5/go.mod h1:sNLVlyEtkYal/+kTj+mTp239DdwVuYBYOnpS90RKk5E= -github.com/DataDog/datadog-agent/pkg/telemetry v0.54.0-rc.5 h1:iXZEgoYil4VaadjDsK+GbCkY7rBQyjsnlNJwXr6BwCY= -github.com/DataDog/datadog-agent/pkg/telemetry v0.54.0-rc.5/go.mod h1:4GCwM87F7u9HzugAODVTwS05MFMKC+NoJu6E4Zd/8pY= -github.com/DataDog/datadog-agent/pkg/trace v0.54.0-rc.5 h1:il5yFFe5CubI+bSfHolKr0077dQw0R+U5B9/iwW8aBg= -github.com/DataDog/datadog-agent/pkg/trace v0.54.0-rc.5/go.mod h1:63uSQX6TVeJzl1cFbIp8MkXlF4kUMJs8iUfGhrSgUHY= -github.com/DataDog/datadog-agent/pkg/util/backoff v0.54.0-rc.5 h1:eq+OaYTZ0rzQt1SpC2Tl+szJjUTX2nOC4N0glSzuWQ0= -github.com/DataDog/datadog-agent/pkg/util/backoff v0.54.0-rc.5/go.mod h1:HcSwqoxWLfevi1vuDZuFeRHfSuHGakTN6/u42WbxQHE= -github.com/DataDog/datadog-agent/pkg/util/cgroups v0.54.0-rc.5 h1:z5NnMMxKxO+cExUt0QCCSF7E+wX8LdD3nuL9LlDpR3Y= -github.com/DataDog/datadog-agent/pkg/util/cgroups v0.54.0-rc.5/go.mod h1:40rjMMqmvglVjktjWVUIk3o5W2zAtek0JU4FCsf7bsM= -github.com/DataDog/datadog-agent/pkg/util/executable v0.54.0-rc.5 h1:kxGwRdBPbiEx9mplVMA/rdLKMWcaKJMqO1pIyg56sLk= -github.com/DataDog/datadog-agent/pkg/util/executable v0.54.0-rc.5/go.mod h1:hUJvBzOKfasYzSvlar10ZkrB8I1CR8PhtyGxmlMv/cU= -github.com/DataDog/datadog-agent/pkg/util/filesystem v0.54.0-rc.5 h1:2A1/eg6zwNlUOjdAgaSgXR8eFR0HYLyqpvqLjlxKEP4= -github.com/DataDog/datadog-agent/pkg/util/filesystem v0.54.0-rc.5/go.mod h1:DfBDL+EjOiLI+HYR2N5zw1an1q7oCJQT6lY4oTCZxZ4= -github.com/DataDog/datadog-agent/pkg/util/fxutil v0.54.0-rc.5 h1:Fv7vJj/7qoEIV+ppI257ncx8IVQkDrUyjKSyeE56oTs= -github.com/DataDog/datadog-agent/pkg/util/fxutil v0.54.0-rc.5/go.mod h1:xqWrlGtjVu2ZMoCW9e3R7f13/Qg0IQBzO5AX7J1dC9I= -github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.54.0-rc.5 h1:1buVvWK8DXUveIpZMDc7Rn59mCDWZkQ9OGHjQRKdcas= -github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.54.0-rc.5/go.mod h1:FqMWIncd1TJJdlUYyiQQGJHWe+ZDKAjJSSPlrUBvHHk= -github.com/DataDog/datadog-agent/pkg/util/http v0.54.0-rc.5 h1:81sBly4SXW5Bvt3DHiUuuLpQnEUjhgdVDK69bk0g+58= -github.com/DataDog/datadog-agent/pkg/util/http v0.54.0-rc.5/go.mod h1:hZRz30Xaqm+UiR/KjO6gAo1Qa7v+tsxVqqaWgUkBjxE= -github.com/DataDog/datadog-agent/pkg/util/log v0.54.0-rc.5 h1:BcA7+MK04/HRCFlX5Pn/sQzZu/gF4qA3DOF880Jy/oo= -github.com/DataDog/datadog-agent/pkg/util/log v0.54.0-rc.5/go.mod h1:MFVWM0DMaxEXhCnHLWnh6axtwubmKRn7C+w2xiL+atI= -github.com/DataDog/datadog-agent/pkg/util/optional v0.54.0-rc.5 h1:3+7PwCbvtkOf63fPOzzMGVxNzlaZofPAg6ExPKn72hc= -github.com/DataDog/datadog-agent/pkg/util/optional v0.54.0-rc.5/go.mod h1:wa1JIWnzo9EvOBwzDOeff8HeqgOq9JQANRb99/nKg3A= -github.com/DataDog/datadog-agent/pkg/util/pointer v0.54.0-rc.5 h1:3zfbAoA9HSCJ/RsR/kP2MzntIvoI4szoReu4j3gpJrY= -github.com/DataDog/datadog-agent/pkg/util/pointer v0.54.0-rc.5/go.mod h1:ahpEhdpkifOLy0/XLHas+SseEmMQnwMgV1CMVkSuXL0= -github.com/DataDog/datadog-agent/pkg/util/scrubber v0.54.0-rc.5 h1:Sob3M0CylnKxZ9FX8Ewjka5VRFYZUQLN2J0kyOGYnMM= -github.com/DataDog/datadog-agent/pkg/util/scrubber v0.54.0-rc.5/go.mod h1:8ASCNWHQtcmUedxL+WjbCPSIcGIM8LeVzil7JCzx0js= -github.com/DataDog/datadog-agent/pkg/util/startstop v0.54.0-rc.5 h1:wo+LiNCZ9RQNNuYzCavbgjARHO3OmcqpFw4Mo6J5R+s= -github.com/DataDog/datadog-agent/pkg/util/startstop v0.54.0-rc.5/go.mod h1:F9ysDtw4BnbZIuKdwOdiHranjG9QMv2o7PMVreIhFzI= -github.com/DataDog/datadog-agent/pkg/util/statstracker v0.54.0-rc.5 h1:hU+Zvh4IL/HOEAjDzyIhYMQa4ibbX+dM4p5wWWpZ34U= -github.com/DataDog/datadog-agent/pkg/util/statstracker v0.54.0-rc.5/go.mod h1:KkiJi2f4mcxAJA00ArYw4zTfs0oWMU1bNXqKhymRVZg= -github.com/DataDog/datadog-agent/pkg/util/system v0.54.0-rc.5 h1:b7GZ1xAbkCtw5/hHwkRJoRiheAd9e+T2slJlD34lXbE= -github.com/DataDog/datadog-agent/pkg/util/system v0.54.0-rc.5/go.mod h1:gIg9d09X6uFqDFo7Dd48OCOCAtTLTWIE44+f/e35C3c= -github.com/DataDog/datadog-agent/pkg/util/system/socket v0.54.0-rc.5 h1:alEMYfYHYju+poG90phbdrpg4RYEyK/oFLAi8MM++HU= -github.com/DataDog/datadog-agent/pkg/util/system/socket v0.54.0-rc.5/go.mod h1:RKqan/bns7z9tqZBWSkshY1e6VisZJaU0b/XQcIDyAQ= -github.com/DataDog/datadog-agent/pkg/util/testutil v0.54.0-rc.5 h1:+nmZ4SFAHoskytj/q8+ewx7UtvbKGdDzcbPU0rhxIzU= -github.com/DataDog/datadog-agent/pkg/util/testutil v0.54.0-rc.5/go.mod h1:AyiUcueiQeqBXn60wbVOo3dPYRDNg0Gsfh/GkhatyxE= -github.com/DataDog/datadog-agent/pkg/util/winutil v0.54.0-rc.5 h1:0eWM/VJT1YPFf+nE5u0QdX1CiCiH2LWuvr4cCJ+nC3M= -github.com/DataDog/datadog-agent/pkg/util/winutil v0.54.0-rc.5/go.mod h1:m/wWejBoF6cuPzogMq2sgm86vvsnR1bAkw+Fgxq4vns= -github.com/DataDog/datadog-agent/pkg/version v0.54.0-rc.5 h1:aQEEvgBxk6Vk6ePMldw3fQUYTrl0AaYfUbrT1Ko6bjE= -github.com/DataDog/datadog-agent/pkg/version v0.54.0-rc.5/go.mod h1:EHeMJExE74SMdRoRCEuLOxbRgjfQwCVngMqFBiz1VN8= -github.com/DataDog/datadog-api-client-go/v2 v2.26.0 h1:bZr0hu+hx8L91+yU5EGw8wK3FlCVEIashpx+cylWsf0= -github.com/DataDog/datadog-api-client-go/v2 v2.26.0/go.mod h1:QKOu6vscsh87fMY1lHfLEmNSunyXImj8BUaUWJXOehc= +github.com/Code-Hex/go-generics-cache v1.5.1 h1:6vhZGc5M7Y/YD8cIUcY8kcuQLB4cHR7U+0KMqAA0KcU= +github.com/Code-Hex/go-generics-cache v1.5.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4= +github.com/DataDog/agent-payload/v5 v5.0.137 h1:nV02RrYj6AwlQBGIEv6yG23CuxGtG0YWoFZAVE6vwxY= +github.com/DataDog/agent-payload/v5 v5.0.137/go.mod h1:lxh9lb5xYrBXjblpIWYUi4deJqVbkIfkjwesi5nskDc= +github.com/DataDog/datadog-agent/cmd/agent/common/path v0.59.0 h1:PolEv4Se/H2jBCKdiOPNELEG5OuXWKrqpsxZMUQ4g14= +github.com/DataDog/datadog-agent/cmd/agent/common/path v0.59.0/go.mod h1:ve34W4f7PGC5zbot0HB+W3xkNZN7obINz89o8N/biP8= +github.com/DataDog/datadog-agent/comp/api/api/def v0.59.0 h1:zfXuUtnet+GWssR+Zi4lns5iIqlYQWiKXtKWb+6dJ+g= +github.com/DataDog/datadog-agent/comp/api/api/def v0.59.0/go.mod h1:gsXkdySqo/hjJmw/b4W9VYiGcRTJaq0uOVwMFAukl4U= +github.com/DataDog/datadog-agent/comp/core/config v0.59.0 h1:SxZsc9E6+d+Gb5fCfo/HnvRi8qTrTcLFE0//lX9+pM8= +github.com/DataDog/datadog-agent/comp/core/config v0.59.0/go.mod h1:2vRyHTEIHey2fsN9JO8z8bj7SSpC5VewuZsHJAA9k6I= +github.com/DataDog/datadog-agent/comp/core/flare/builder v0.59.0 h1:qpvXvXK+Az2dKgzx3pPaAvS/tsrl1QXI4FndDtcjgvY= +github.com/DataDog/datadog-agent/comp/core/flare/builder v0.59.0/go.mod h1:cg7JgU501CDIZNiyEfnwbBbk9nOsUy2nsKADIAdRnmk= +github.com/DataDog/datadog-agent/comp/core/flare/types v0.59.0 h1:Kz5NUsZFT4pTUh4P/A2bBiBTNkfT80ZfHig8LOuHBiY= +github.com/DataDog/datadog-agent/comp/core/flare/types v0.59.0/go.mod h1:n32X+eH1UMvlfZOwu70t6ySopwbN1yBfaVcpNgaCkG4= +github.com/DataDog/datadog-agent/comp/core/hostname/hostnameinterface v0.59.0 h1:m939bF+E/+nPZ1jGU1J9ZVeI3fCk8nbAjl9H9MMz2A0= +github.com/DataDog/datadog-agent/comp/core/hostname/hostnameinterface v0.59.0/go.mod h1:jjiRtHmQcGwHmP4l4T49t4i2fU2NM097LEG6VaI8CIk= +github.com/DataDog/datadog-agent/comp/core/log v0.56.2 h1:qvBT+FfjKGqimyEvmsNHCZKbTfBJAdUZSVy2IZQ8HS4= +github.com/DataDog/datadog-agent/comp/core/log v0.56.2/go.mod h1:ivJ/RMZjTNkoPPNDX+v/nnBwABLCiMv1vQA5tk/HCR4= +github.com/DataDog/datadog-agent/comp/core/log/def v0.59.0 h1:4je3YuTFhqmw0a0oksSsVPglNT4b37gosaRv9T/TLYQ= +github.com/DataDog/datadog-agent/comp/core/log/def v0.59.0/go.mod h1:uFF83DUAQYoQKKdddr6ptnCPiRik/lr9y+B2JxgLWRs= +github.com/DataDog/datadog-agent/comp/core/log/mock v0.59.0 h1:ndq+1XRChjuYIgfLuRuGQ5trGtq/Qpa/vnTG/6r9bKs= +github.com/DataDog/datadog-agent/comp/core/log/mock v0.59.0/go.mod h1:Ii6q5lgyvXKRmt8Puaan94V5iOiX4xOd+1OU7ZX8Lo4= +github.com/DataDog/datadog-agent/comp/core/secrets v0.59.0 h1:RS7z5/VuZtPc2NLdFRerDubYtZgWbgf1dOZpdhclgb8= +github.com/DataDog/datadog-agent/comp/core/secrets v0.59.0/go.mod h1:hKbelRO2zUJbU4KI1NumVvBIYq45RtQ3JC2LJvJU/y8= +github.com/DataDog/datadog-agent/comp/core/telemetry v0.59.0 h1:ApJD+u0a5anQZkmCw3y2ljhMC56BcjlT6klAZaoXLYk= +github.com/DataDog/datadog-agent/comp/core/telemetry v0.59.0/go.mod h1:mNPruKhnFUe7xiFMnPIMweb7O1HkTh0C78Llhd+Y9xA= +github.com/DataDog/datadog-agent/comp/def v0.59.0 h1:AO1oQ4/ZqYtzklm7glhYqQLyr4me4qg34sf4HRzyMcQ= +github.com/DataDog/datadog-agent/comp/def v0.59.0/go.mod h1:2xorAm6FmIl275/ayDZSUg53Hz4oQ/X8ELyp7I1N3fM= +github.com/DataDog/datadog-agent/comp/logs/agent/config v0.59.0 h1:olhlCNtCG5BKHsRJrwR4i7XZkeMbTRKz4OFayLrvD6o= +github.com/DataDog/datadog-agent/comp/logs/agent/config v0.59.0/go.mod h1:QrNGc1TWXhNagr1/nVSiUI+n8SFczoS8vpZdKtASxnQ= +github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline v0.59.0 h1:kM1pYOA1EmlT47b8Buxvlm6EVykG9T72gUuQL+Uur8s= +github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline v0.59.0/go.mod h1:2SrdlZ37IBATRjnPhNs4qBqaZCZ7HkEb4DNWXn/DsXY= +github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline/logsagentpipelineimpl v0.59.0 h1:SJhZCcJDZEEHzR2p9dGQ56jIy08ZfqajiBIBgLShtzU= +github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline/logsagentpipelineimpl v0.59.0/go.mod h1:uyfsYUV6L7W4duN9rlFrEN+r3REPPwCSE4Nj8WjDhDE= +github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/exporter/logsagentexporter v0.62.0-devel.0.20241213165407-f95df913d2b7 h1:SsisBoKdz1hfQQpfOa1XuVMksKRHOgZ84LRuadAS2LU= +github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/exporter/logsagentexporter v0.62.0-devel.0.20241213165407-f95df913d2b7/go.mod h1:Zt7cD4W15XoFigBKDbLeOjho0IyP2Qo8c41QWy/kgRM= +github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/metricsclient v0.59.0 h1:LyhDLcabmvRZk2ehGlZYXuW2MpA7RoR87C6jQ7gUQ24= +github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/metricsclient v0.59.0/go.mod h1:tG+1FklWteENGZb3gE/13Sn80YfMEI6APmZxY8nSQHo= +github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/statsprocessor v0.59.0 h1:3eTrUZGpI5EjzIINZhilZXRUd6ND7W98bUUe4UF+arE= +github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/statsprocessor v0.59.0/go.mod h1:Dp1J09BVqtGHR3yj82q4mCVNq5qkhDs/cTI5/DlvJxk= +github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.57.0-devel.0.20240718200853-81bf3b2e412d h1:wdjJ+/tBYiFLwno+lBPP66rm5jIf6ycGPRr21ogBBzE= +github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.57.0-devel.0.20240718200853-81bf3b2e412d/go.mod h1:CHa8CY2k0/wZkx/4KPi/WU/0m5YCfWZI1SAs1imElMA= +github.com/DataDog/datadog-agent/comp/trace/compression/def v0.59.0 h1:u/IbNqKfYodJIprc/rkpcwLz/5OFox95ujemwR9AHuo= +github.com/DataDog/datadog-agent/comp/trace/compression/def v0.59.0/go.mod h1:samFXdP0HVSwD223LPLzcPKUjRQ6/uwr/1wMPo2HhRg= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-gzip v0.59.0 h1:Z/fqQiBYwTTt27IIBdX6oivtIxfqm0o0gNqA1zoATm4= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-gzip v0.59.0/go.mod h1:x1xzklye6fB16nIh4HrvbOYN/WP4OJNJpvZylelI3tI= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-zstd v0.59.0 h1:m9wM1fLNndxJWVXwZegwQ2wAp6CK0uFqF/sh/5Rw1PY= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-zstd v0.59.0/go.mod h1:t1BtP+u27pjTeOX/5otD7klkUIHB0Mh4ToeeeHs+oRY= +github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.59.0 h1:Etckua/+tAA9nA6Ssbgx+sKDIdgiobVFuhRvQWDAGHQ= +github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.59.0/go.mod h1:s9QBNtoBURzy/0FeBInQ7kawNj04OnBNUo8xYr26z3E= +github.com/DataDog/datadog-agent/pkg/config/env v0.59.0 h1:8oHEWArrc7dYJunz5ZtLzSVsGkW4JUk+v/QLgcUuvRI= +github.com/DataDog/datadog-agent/pkg/config/env v0.59.0/go.mod h1:8DoSDz72MFB3o09Tn90OUnUiQ60kDvObWh9xmaG+4cI= +github.com/DataDog/datadog-agent/pkg/config/mock v0.59.0 h1:bg/anB+tp85oaFKvdMrbaYO0idWbErtm8i4rp4dra5k= +github.com/DataDog/datadog-agent/pkg/config/mock v0.59.0/go.mod h1:xVhwIc1BVvXN7UUM+604EOyoSRIF9B84Vn6Xn5n3GXE= +github.com/DataDog/datadog-agent/pkg/config/model v0.59.0 h1:8x6VWgK/mrG++vU1QkbfVI3YBWy2AyQHgOVyFYwX4lE= +github.com/DataDog/datadog-agent/pkg/config/model v0.59.0/go.mod h1:+IfFsWw9OM26lwDmTfy6RVF5LhEmFC8LgO4OGajyuvk= +github.com/DataDog/datadog-agent/pkg/config/nodetreemodel v0.59.0 h1:8MTR7i4xNFoVp0gyzHghn2s7AZcuu25GJDQvTGwtGC8= +github.com/DataDog/datadog-agent/pkg/config/nodetreemodel v0.59.0/go.mod h1:aYSdawfzI8vX0YlS19KKxpLR8oG1Rqp2rH+wFPv4MFs= +github.com/DataDog/datadog-agent/pkg/config/setup v0.59.0 h1:6cNxX6N7HIZqGVSKD4Fzh30Ldky8ckaQnd7B4bXzErg= +github.com/DataDog/datadog-agent/pkg/config/setup v0.59.0/go.mod h1:JEO3nqqPJn1lh8tSabgRqXHOth2l++ZYEfzRRYGUji0= +github.com/DataDog/datadog-agent/pkg/config/structure v0.59.0 h1:U7+yV+Ul/Cmvt7HKuf6TXkwq9/RhaaWNOX+xReUgqwQ= +github.com/DataDog/datadog-agent/pkg/config/structure v0.59.0/go.mod h1:rdbxYVSC1Xjh8RODr06j8Mbku7dXnRr3SWxi5wsl9pA= +github.com/DataDog/datadog-agent/pkg/config/teeconfig v0.59.0 h1:8iCSoIKcNqiX/QEmWbjRcH5za/Aj06QtIfT8JNJZXDU= +github.com/DataDog/datadog-agent/pkg/config/teeconfig v0.59.0/go.mod h1:oi5YMuCZKA98ACJz5cx/lXM+pZ4HAUgc5bSP73M4G3w= +github.com/DataDog/datadog-agent/pkg/config/utils v0.59.0 h1:ZA4WUpcb23Ts/BQ2fEDodGd45QtQFuJ0xSrvxME8JBQ= +github.com/DataDog/datadog-agent/pkg/config/utils v0.59.0/go.mod h1:n8JbD8n9omhs/MWZij6yA6RgHAOYx54BXMTRR2v+32A= +github.com/DataDog/datadog-agent/pkg/logs/auditor v0.59.0 h1:5PDZmH8KW0PYSfywoNlHkjoTNSYefq4N6X55CBqiCeU= +github.com/DataDog/datadog-agent/pkg/logs/auditor v0.59.0/go.mod h1:mcWSkLVkuJmhqr4GkwHbhuELNxn46VNg487xL33LAQQ= +github.com/DataDog/datadog-agent/pkg/logs/client v0.59.0 h1:GC6gjPzImitUI26X9X23G4WuDyv/+KKjYHLoxmIllJ8= +github.com/DataDog/datadog-agent/pkg/logs/client v0.59.0/go.mod h1:EE6EkO4YH+hQlhQAPrcTxT3Ye72fOFwQxqyQsOFr2fk= +github.com/DataDog/datadog-agent/pkg/logs/diagnostic v0.59.0 h1:a/2kYMMKo9um9Dla5QExkvors05CFgyfrPkxClZz8L0= +github.com/DataDog/datadog-agent/pkg/logs/diagnostic v0.59.0/go.mod h1:Mc9HEEgXpsQEZKEtb7I42Yg5ShZyNXxJShdVslkhW2g= +github.com/DataDog/datadog-agent/pkg/logs/message v0.59.0 h1:hv2fiwwX53r4tdzv0YHbBDoGBLJcKrA4ErqC01XnCrY= +github.com/DataDog/datadog-agent/pkg/logs/message v0.59.0/go.mod h1:RS8UIJB31rymy8W5va8I1EFkd4hbSAbHUWPZYzfwH+M= +github.com/DataDog/datadog-agent/pkg/logs/metrics v0.59.0 h1:mQzAZGQaYlnQVyralxBs2KxYAm8Gb8IL45eimmX0Zr4= +github.com/DataDog/datadog-agent/pkg/logs/metrics v0.59.0/go.mod h1:liRnSv3VpZpv/rHGiYYBCBlkx2Sy98rw2/5hu9g1T/E= +github.com/DataDog/datadog-agent/pkg/logs/pipeline v0.59.0 h1:3i0bNOq5IwPKKYpKl2zgkwOecvfxl2/mFZ5M4q8un7U= +github.com/DataDog/datadog-agent/pkg/logs/pipeline v0.59.0/go.mod h1:xVtael5+vGMu08nvdlnqB7IhbwjTYCLHuXMjVodVFM8= +github.com/DataDog/datadog-agent/pkg/logs/processor v0.59.0 h1:F71SRQbj2bqLHAw8+R/fqMQCTiDjusD36u13/yK55Bo= +github.com/DataDog/datadog-agent/pkg/logs/processor v0.59.0/go.mod h1:XuBR8eeLrxNOI5ex2BlH67P4lmOZIs5p9Vnse/71zVY= +github.com/DataDog/datadog-agent/pkg/logs/sds v0.59.0 h1:CPxkTGZuir7z6ZnEXovdUNQE0nAHmXAtBLvFMppxHvs= +github.com/DataDog/datadog-agent/pkg/logs/sds v0.59.0/go.mod h1:MOhCsu2zQMIwT2NBQYWjXzHgNYCKZwPJu08TKlBa1IU= +github.com/DataDog/datadog-agent/pkg/logs/sender v0.59.0 h1:fd2pUQXyxV8Zvw2axC0/IzBRwaEWeOYuItvo3NnS0eY= +github.com/DataDog/datadog-agent/pkg/logs/sender v0.59.0/go.mod h1:iVtgk6B4bl7HggNx5TECj4LIj8PYmoDIf1Hn1lL61cA= +github.com/DataDog/datadog-agent/pkg/logs/sources v0.59.0 h1:odwHx0k2Hod6wrsnt/P5dI2deVCwVaMNKSSxpsOvHR8= +github.com/DataDog/datadog-agent/pkg/logs/sources v0.59.0/go.mod h1:t95T+iw+/9VP40ymxXrrLIMJ+MiFJm0vIZml3KpwuyI= +github.com/DataDog/datadog-agent/pkg/logs/status/statusinterface v0.59.0 h1:th5J71WmJpXVcY+yR5YalOzrLjoYEDn/HT+allWEInQ= +github.com/DataDog/datadog-agent/pkg/logs/status/statusinterface v0.59.0/go.mod h1:PaduNrh0GJ3UEKG30VMu0M6hi7KuYf3VviLdIG9xV9k= +github.com/DataDog/datadog-agent/pkg/logs/status/utils v0.59.0 h1:BvvXnKJjZfLUcwcTnj8gWoJAlFfTd8q5Rh39SV97VFM= +github.com/DataDog/datadog-agent/pkg/logs/status/utils v0.59.0/go.mod h1:p2NTG+cIhVGlKELJfRteGCec37ICptIpeB2x/MsRkbw= +github.com/DataDog/datadog-agent/pkg/logs/util/testutils v0.59.0 h1:Lx1CcCOi+Wgvjxzj8pEz1HtxWuZpjIkHyrBXidzU9Hw= +github.com/DataDog/datadog-agent/pkg/logs/util/testutils v0.59.0/go.mod h1:+uqKrMsDA16MMC98rqDkp7Jn8cpYLI/JPAVcno8MEmE= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.59.0 h1:uX6/XoKMS7KYXe+R+vwgw+eRdmn16xfa9PDF5dxgumE= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.59.0/go.mod h1:ATVw8kr3U1Eqz3qBz9kS6WFDKji9XyoAsHKSlj3hPTM= +github.com/DataDog/datadog-agent/pkg/proto v0.59.0 h1:hHgSABsmMpA3IatWlnYRAKlfqBACsWyqsLCEcUA8BCs= +github.com/DataDog/datadog-agent/pkg/proto v0.59.0/go.mod h1:weaq7HP9vUa7YAMcvMs7bhT7pmHk3sq7XRBQOcaSUak= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.59.0 h1:9C8TVNz0IiNoD6tuEKPY/vMIUjB7kN0OaLyImhatWjg= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.59.0/go.mod h1:c4th0IFaP0Q1ofRa0GcPB9hJWN+cmUoEfOI1Ub0O50A= +github.com/DataDog/datadog-agent/pkg/status/health v0.59.0 h1:gDeDYddUBwkzeNRxeRceIB46YvxB/2+KoCFcN4qvVag= +github.com/DataDog/datadog-agent/pkg/status/health v0.59.0/go.mod h1:EkC/SgFR03BKwBitVV4dIuP+ofwPlUCkVi5K5k1Dh2Y= +github.com/DataDog/datadog-agent/pkg/telemetry v0.59.0 h1:4WEY5NILyM/WFXwzgvgdju1rfO4cru2SXJyU1JLgFyc= +github.com/DataDog/datadog-agent/pkg/telemetry v0.59.0/go.mod h1:DmEXCX0hBizZpdpbS64o9sPj47iiUzh9F7uGUazF+ZA= +github.com/DataDog/datadog-agent/pkg/trace v0.59.0 h1:LHfmBEfidWE6R5onNLIFnX3jc4MRBwdqJ6XLQxvBAG0= +github.com/DataDog/datadog-agent/pkg/trace v0.59.0/go.mod h1:6XfyUYonzDI1qy9tZBUgMgGYJarHDxIZtfs6PNRbf/w= +github.com/DataDog/datadog-agent/pkg/util/backoff v0.59.0 h1:EaTwOrTRpMEdomryGVMfHyN0wEsKkaL3/Tw9qRt9SSY= +github.com/DataDog/datadog-agent/pkg/util/backoff v0.59.0/go.mod h1:2RMfdYkKyeh8hXs6WgaamkkEyK35Xo55C4rFG4dO1k8= +github.com/DataDog/datadog-agent/pkg/util/cgroups v0.59.0 h1:uV3oUyl0uQN8anXZXQiw+hbQ8UNNtSkrnDCDklhAjeI= +github.com/DataDog/datadog-agent/pkg/util/cgroups v0.59.0/go.mod h1:+51MjREuUnHTYSnI9zBqv2aVOF4dlhDwQiCMeZyY7Z0= +github.com/DataDog/datadog-agent/pkg/util/executable v0.59.0 h1:24sLjJ4p4Co/82weJsqkNxWZjG8zdS7yeJBGVOqjHxM= +github.com/DataDog/datadog-agent/pkg/util/executable v0.59.0/go.mod h1:mSSn2OzsdgoUnPyBmF8rEDU+ee1RFp+H6LFsJSteN9o= +github.com/DataDog/datadog-agent/pkg/util/filesystem v0.59.0 h1:VV/SYXyZirAaUxMsWUpmZYcX9AIgbGadElznJZXPCig= +github.com/DataDog/datadog-agent/pkg/util/filesystem v0.59.0/go.mod h1:1Oy0TNkovXuDB0Uu8OzszIuDezYSPg8qFCEyx02ipc4= +github.com/DataDog/datadog-agent/pkg/util/fxutil v0.59.0 h1:b4sUQuXnE+M+1ToTViNGelw8yfaXRuhOqBSczdQ8wEM= +github.com/DataDog/datadog-agent/pkg/util/fxutil v0.59.0/go.mod h1:vl91pbe6A2L9kqNEmSDrS8vlj4cADSBq3Z3YRQ1rpKY= +github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.59.0 h1:8qlROMBQixtDVQwjvttGSM8hTmN3tnFQugOyh614ACc= +github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.59.0/go.mod h1:4EPWYAplHgdaLZsP/NuLEfh21NuvF+JdVtwttTqQlUY= +github.com/DataDog/datadog-agent/pkg/util/http v0.59.0 h1:6Dshh+6K5NGV2TdHsZeeDRsBrgvQ0rJw8OhMWonMFu4= +github.com/DataDog/datadog-agent/pkg/util/http v0.59.0/go.mod h1:Cf5xtpWzHGn7rvEAM4fdw1OUABXLbA/Bqf3dCt/0qtM= +github.com/DataDog/datadog-agent/pkg/util/log v0.59.1 h1:3Zc0tI5XAKMGqdSbseneXGOVtzp017yPm/L4wzsCPDw= +github.com/DataDog/datadog-agent/pkg/util/log v0.59.1/go.mod h1:nW37eZ8+OsEGA/YhtOgiI2vFaXausm3dfjXUVh++heQ= +github.com/DataDog/datadog-agent/pkg/util/log/setup v0.59.0 h1:1gQ81041dHofvio6mn0EnmAG8hYR52VOlCjONIvpkks= +github.com/DataDog/datadog-agent/pkg/util/log/setup v0.59.0/go.mod h1:9aftpZaZs8Z7EWHGQO3+biYHVRxN/V4WELSK6P5c0DY= +github.com/DataDog/datadog-agent/pkg/util/optional v0.59.0 h1:IOZeoApM4NI6dw+Sdo4PalVU1Z6uoY3vuKdl5Jm6g2M= +github.com/DataDog/datadog-agent/pkg/util/optional v0.59.0/go.mod h1:xWT/KJdJg2/0pZyAKZ6XmIiE5sM+AyUo4qvKuPHQ17U= +github.com/DataDog/datadog-agent/pkg/util/pointer v0.59.0 h1:K/3aHtAsvlAIbw0/3ah66f1glnpdLNm69XSYXdcnDtw= +github.com/DataDog/datadog-agent/pkg/util/pointer v0.59.0/go.mod h1:t1DlnUEMltkvwPLc7zCtP1u5cBDu+30daR2VhQO5bvA= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.59.1 h1:UnRouTSYwGa5gib1QX4LUNk16+G1vmK3wn8qr9F0Hp4= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.59.1/go.mod h1:krOxbYZc4KKE7bdEDu10lLSQBjdeSFS/XDSclsaSf1Y= +github.com/DataDog/datadog-agent/pkg/util/startstop v0.59.0 h1:zPO6AX/UcbMCuGjnrK0cuDgULbOyzZFYvuxf/qbZjGg= +github.com/DataDog/datadog-agent/pkg/util/startstop v0.59.0/go.mod h1:IkqOyNbrg9hXqCMyL+g+Ldhz4q6VVOPqbHQxS4lLiRs= +github.com/DataDog/datadog-agent/pkg/util/statstracker v0.59.0 h1:CYY4C03mcJCqB04DKttAbNPrQouJLSL94m/KLaURv3Y= +github.com/DataDog/datadog-agent/pkg/util/statstracker v0.59.0/go.mod h1:Et2HSDjQvMhgs9ZdH7T5I4q04g5Fj23EtmeIaen/9/M= +github.com/DataDog/datadog-agent/pkg/util/system v0.59.0 h1:9fpWOSJyuBHdpzQkUYFoyC57Bv+umHeMMSQmwmm900k= +github.com/DataDog/datadog-agent/pkg/util/system v0.59.0/go.mod h1:rdBzS773XYudLd/IH2mUzz3+kJ2N2PcFWEdRGEGYlP0= +github.com/DataDog/datadog-agent/pkg/util/system/socket v0.59.0 h1:8l2FgdcIUNPyI4J+w5OaY3k2byB11HqZ/mcg2AcJSSI= +github.com/DataDog/datadog-agent/pkg/util/system/socket v0.59.0/go.mod h1:C63BEsAoSlfoB4WadEMO1guB+dvfl95zQaMLw394zNM= +github.com/DataDog/datadog-agent/pkg/util/testutil v0.59.0 h1:f6EtElJXr8UN6FftNEeqIyT2jzvAtldQI+eb7qaYvrA= +github.com/DataDog/datadog-agent/pkg/util/testutil v0.59.0/go.mod h1:m/uWLdpGEi3x/5gybZFeYNEnIdKhGtWW8kFZuM+GSFA= +github.com/DataDog/datadog-agent/pkg/util/winutil v0.59.1 h1:EE1+1pWfb5bxprz0+I+ERnCm6Pm2fI46+Sop3CfISps= +github.com/DataDog/datadog-agent/pkg/util/winutil v0.59.1/go.mod h1:CezVaH66o/kyTtOYLYBjy/CTqwkM9HzPpDFppfRu6bE= +github.com/DataDog/datadog-agent/pkg/version v0.59.1 h1:6C39A9t2Noe3Ndk0yH7d0ys5t+KRewLvMLWN/A0OStY= +github.com/DataDog/datadog-agent/pkg/version v0.59.1/go.mod h1:rcA7LtIB5WLpxsems/bWO1iXkyGEgHHje7vJ0b20ZpU= +github.com/DataDog/datadog-api-client-go/v2 v2.33.0 h1:OI6kDnJeQmkjfGzxmP0XUQUxMD4tp6oAPXnnJ4VpgUM= +github.com/DataDog/datadog-api-client-go/v2 v2.33.0/go.mod h1:d3tOEgUd2kfsr9uuHQdY+nXrWp4uikgTgVCPdKNK30U= github.com/DataDog/datadog-go/v5 v5.5.0 h1:G5KHeB8pWBNXT4Jtw0zAkhdxEAWSpWH00geHI6LDrKU= github.com/DataDog/datadog-go/v5 v5.5.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= -github.com/DataDog/dd-sensitive-data-scanner/sds-go/go v0.0.0-20240419161837-f1b2f553edfe h1:efzxujZ7VHWFxjmWjcJyUEpPrN8qdiZPYb+dBw547Wo= -github.com/DataDog/dd-sensitive-data-scanner/sds-go/go v0.0.0-20240419161837-f1b2f553edfe/go.mod h1:TX7CTOQ3LbQjfAi4SwqUoR5gY1zfUk7VRBDTuArjaDc= -github.com/DataDog/go-sqllexer v0.0.9 h1:Cx2Cu1S0hfj4coCCA8hzjM9+UNFRkcu1avIV//RU5Qw= -github.com/DataDog/go-sqllexer v0.0.9/go.mod h1:nB4Ea2YNsqMwtbWMc4Fm/oP98IIrSPapqwOwPioMspY= +github.com/DataDog/dd-sensitive-data-scanner/sds-go/go v0.0.0-20240816154533-f7f9beb53a42 h1:RoH7VLzTnxHEugRPIgnGlxwDFszFGI7b3WZZUtWuPRM= +github.com/DataDog/dd-sensitive-data-scanner/sds-go/go v0.0.0-20240816154533-f7f9beb53a42/go.mod h1:TX7CTOQ3LbQjfAi4SwqUoR5gY1zfUk7VRBDTuArjaDc= +github.com/DataDog/go-sqllexer v0.0.15 h1:rUUu52dP8EQhJLnUw0MIAxZp0BQx2fOTuMztr3vtHUU= +github.com/DataDog/go-sqllexer v0.0.15/go.mod h1:KwkYhpFEVIq+BfobkTC1vfqm4gTi65skV/DpDBXtexc= github.com/DataDog/go-tuf v1.1.0-0.5.2 h1:4CagiIekonLSfL8GMHRHcHudo1fQnxELS9g4tiAupQ4= github.com/DataDog/go-tuf v1.1.0-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= github.com/DataDog/gohai v0.0.0-20230524154621-4316413895ee h1:tXibLZk3G6HncIFJKaNItsdzcrk4YqILNDZlXPTNt4k= github.com/DataDog/gohai v0.0.0-20230524154621-4316413895ee/go.mod h1:nTot/Iy0kW16bXgXr6blEc8gFeAS7vTqYlhAxh+dbc0= -github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata v0.16.1 h1:WD5hPS/KfDaYcWxa636972pQ8iOBN9MC/6Is5aSNZc8= -github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata v0.16.1/go.mod h1:P/l++2cDCeeq21KSmCEdXdMH9/WMdXP7uA/vjnxhtz8= -github.com/DataDog/opentelemetry-mapping-go/pkg/internal/sketchtest v0.16.0 h1:VJT1Jjlz/ca999FEqaAS+He7S4eB14a+PJjczgRdgAY= -github.com/DataDog/opentelemetry-mapping-go/pkg/internal/sketchtest v0.16.0/go.mod h1:66XlN7QpQKqIvw8e2UbCXV5X8wGnEw851nT9BjJ75dY= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.16.1 h1:ZI8u3CgdMXpDplrf9/gIr13+/g/tUzUcBMk2ZhXgzLE= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.16.1/go.mod h1:dvIWN9pA2zWNTw5rhDWZgzZnhcfpH++d+8d1SWW6xkY= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/logs v0.16.1 h1:px2+7svK86oeCGd+sT1x/9f0pqIJdApGFnWI0AOPXwA= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/logs v0.16.1/go.mod h1:+LijQ2LdlocAQ4WB+7KsoIGe90bfogkRslubd9swVow= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics v0.16.1 h1:Qm3M3A7/tkYG8JYeF9Mxp3oNEz23EQzvnV0MZR8mJKQ= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics v0.16.1/go.mod h1:HPwVoMccTFfyV94bE29ffwAYnsPykAH7Iso8/5ucLSs= -github.com/DataDog/opentelemetry-mapping-go/pkg/quantile v0.16.1 h1:sQoxh5RytdEFYFLGw3JUwFFhS/A1InFFVldpWAS/Z3g= -github.com/DataDog/opentelemetry-mapping-go/pkg/quantile v0.16.1/go.mod h1:6eYyd+lJYH+uRuZqhyW/u+9ykaXBWetDGj44+txz6jU= -github.com/DataDog/sketches-go v1.4.5 h1:ki7VfeNz7IcNafq7yI/j5U/YCkO3LJiMDtXz9OMQbyE= -github.com/DataDog/sketches-go v1.4.5/go.mod h1:7Y8GN8Jf66DLyDhc94zuWA3uHEt/7ttt8jHOBWWrSOg= -github.com/DataDog/viper v1.13.3 h1:0++798wZLEenL1JbF8dMmwFl6WMlAVxLtzVuws/LlVc= -github.com/DataDog/viper v1.13.3/go.mod h1:wDdUVJ2SHaMaPrCZrlRCObwkubsX8j5sme3LaR/SGTc= -github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= -github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.23.0 h1:yRhWveg9NbJcJYoJL4FoSauT2dxnt4N9MIAJ7tvU/mQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.23.0/go.mod h1:p2puVVSKjQ84Qb1gzw2XHLs34WQyHTYFZLaVxypAFYs= +github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata v0.22.0 h1:r1Dx2cRHCBWkVluSZA41i4eoI/nOGbcrrZdkqWjoFCc= +github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata v0.22.0/go.mod h1:+/dkO8ZiMa8rfm4SmtTF6qPUdBbBcvsWWKaO4xPKAIk= +github.com/DataDog/opentelemetry-mapping-go/pkg/internal/sketchtest v0.22.0 h1:cXcKVEU1D0HlguR7GunnvuI70TghkarCa9DApqzMY94= +github.com/DataDog/opentelemetry-mapping-go/pkg/internal/sketchtest v0.22.0/go.mod h1:ES00EXfyEKgUkjd93tAXCxJA6i0seeOhZoS5Cj2qzzg= +github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.22.0 h1:yfk2cF8Bx98fSFpGrehEHh1FRqewfxcCTAbUDt5r3F8= +github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.22.0/go.mod h1:9qzpnBSxSOnKzbF/uHket3SSlQihQHix/ZRC2nZUUYQ= +github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/logs v0.22.0 h1:Zqj8YUZ/ualUhM8GDCQX6xKnUJKEiG0eYdFGWmIDG30= +github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/logs v0.22.0/go.mod h1:lpr4q6g2TB0BHeLHaz/XleKm8YXQjuxiQEb9Q9HXXE0= +github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics v0.22.0 h1:w9+ngZDYUMLW+GSRA8x1DvVbuMR+cwlGb8VLwZfgBGs= +github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics v0.22.0/go.mod h1:UsfqLgiD6Sjhpjkg+YzAd+TdKUZ2m6ZZ8t+tEkLNTMA= +github.com/DataDog/opentelemetry-mapping-go/pkg/quantile v0.22.0 h1:63SzQz9Ab8XJj8fQKQz6UZNBhOm8rucwzbDfwTVF6dQ= +github.com/DataDog/opentelemetry-mapping-go/pkg/quantile v0.22.0/go.mod h1:E/PY/aQ6S/N5hBPHXZRGmovs5b1BSi4RHGNcB4yP/Z0= +github.com/DataDog/sketches-go v1.4.6 h1:acd5fb+QdUzGrosfNLwrIhqyrbMORpvBy7mE+vHlT3I= +github.com/DataDog/sketches-go v1.4.6/go.mod h1:7Y8GN8Jf66DLyDhc94zuWA3uHEt/7ttt8jHOBWWrSOg= +github.com/DataDog/viper v1.14.0 h1:dIjTe/uJiah+QFqFZ+MXeqgmUvWhg37l37ZxFWxr3is= +github.com/DataDog/viper v1.14.0/go.mod h1:wDdUVJ2SHaMaPrCZrlRCObwkubsX8j5sme3LaR/SGTc= +github.com/DataDog/zstd v1.5.6 h1:LbEglqepa/ipmmQJUDnSsfvA8e8IStVcGaFWDuxvGOY= +github.com/DataDog/zstd v1.5.6/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 h1:3c8yed4lgqTt+oTQ+JNMDo+F4xprBf+O/il4ZC0nRLw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0/go.mod h1:obipzmGjfSjam60XLwGfqUkJsfiheAl+TUjG+4yzyPM= github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= @@ -232,23 +242,27 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 h1:ez/4by2iGztzR4L0zgAOR8lTQK9VlyBVVd7G4omaOQs= -github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 h1:t3eaIm0rUkzbrIewtiFmMK5RXHej2XnoXNhxVsAYUfg= +github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= +github.com/antchfx/xmlquery v1.4.2 h1:MZKd9+wblwxfQ1zd1AdrTsqVaMjMCwow3IqkCSe00KA= +github.com/antchfx/xmlquery v1.4.2/go.mod h1:QXhvf5ldTuGqhd1SHNvvtlhhdQLks4dD0awIVhXIDTA= +github.com/antchfx/xpath v1.3.2 h1:LNjzlsSjinu3bQpw9hWMY9ocB80oLOWuQqFvO6xt51U= +github.com/antchfx/xpath v1.3.2/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aws/aws-sdk-go v1.53.11 h1:KcmduYvX15rRqt4ZU/7jKkmDxU/G87LJ9MUI0yQJh00= -github.com/aws/aws-sdk-go v1.53.11/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= +github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= 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/bmatcuk/doublestar/v4 v4.6.1 h1:FH9SifrbvJhnlQpztAx++wlkk70QBf0iBWDwNy7PA4I= -github.com/bmatcuk/doublestar/v4 v4.6.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= +github.com/bmatcuk/doublestar/v4 v4.7.1 h1:fdDeAqgT47acgwd9bd9HxJRDmc9UAmPpc+2m0CXv75Q= +github.com/bmatcuk/doublestar/v4 v4.7.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= github.com/briandowns/spinner v1.23.0 h1:alDF2guRWqa/FOZZYWjlMIx2L6H0wyewPxo/CH4Pt2A= github.com/briandowns/spinner v1.23.0/go.mod h1:rPG4gmXeN3wQV/TsAY4w8lPdIM6RX3yqeBQJSrbXjuE= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= @@ -267,11 +281,8 @@ github.com/cihub/seelog v0.0.0-20151216151435-d2c6e5aa9fbf/go.mod h1:9d6lWj8KzO/ github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50 h1:DBmgJDC9dTfkVyGgipamEh2BpGYxScCH1TOF1LL1cXc= -github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50/go.mod h1:5e1+Vvlzido69INQaVO6d87Qn543Xr6nooe9Kz7oBFM= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/containerd/cgroups/v3 v3.0.3 h1:S5ByHZ/h9PMe5IOQoN7E+nMc2UcLEM/V48DGDJ9kip0= github.com/containerd/cgroups/v3 v3.0.3/go.mod h1:8HBe7V3aWGLFPd/k03swSIsGjZhHI2WzJmticMgVuz0= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= @@ -284,7 +295,7 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7 github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -297,12 +308,12 @@ github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUn github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/digitalocean/godo v1.109.0 h1:4W97RJLJSUQ3veRZDNbp1Ol3Rbn6Lmt9bKGvfqYI5SU= -github.com/digitalocean/godo v1.109.0/go.mod h1:R6EmmWI8CT1+fCtjWY9UCB+L5uufuZH13wk3YhxycCs= -github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= -github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= -github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/digitalocean/godo v1.118.0 h1:lkzGFQmACrVCp7UqH1sAi4JK/PWwlc5aaxubgorKmC4= +github.com/digitalocean/godo v1.118.0/go.mod h1:Vk0vpCot2HOAJwc5WE8wljZGtJ3ZtWIc8MQ8rF38sdo= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/docker v27.4.0+incompatible h1:I9z7sQ5qyzO0BfAb9IMOawRkAGxhYsidKiTMcm0DU+A= +github.com/docker/docker v27.4.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -311,34 +322,38 @@ github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/BE= +github.com/ebitengine/purego v0.8.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/elastic/go-grok v0.3.1 h1:WEhUxe2KrwycMnlvMimJXvzRa7DoByJB4PVUIE1ZD/U= +github.com/elastic/go-grok v0.3.1/go.mod h1:n38ls8ZgOboZRgKcjMY8eFeZFMmcL9n2lP0iHhIDk64= +github.com/elastic/lunes v0.1.0 h1:amRtLPjwkWtzDF/RKzcEPMvSsSseLDLW+bnhfNSLRe4= +github.com/elastic/lunes v0.1.0/go.mod h1:xGphYIt3XdZRtyWosHQTErsQTd4OP1p9wsbVoHelrd4= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.12.0 h1:4X+VP1GHd1Mhj6IB5mMeGbLCleqxjletLK6K0rbxyZI= -github.com/envoyproxy/go-control-plane v0.12.0/go.mod h1:ZBTaoJ23lqITozF0M6G4/IragXCQKCnYbmlmtHvwRG0= +github.com/envoyproxy/go-control-plane v0.13.0 h1:HzkeUz1Knt+3bK+8LG1bxOO/jzWZmdxpwC51i202les= +github.com/envoyproxy/go-control-plane v0.13.0/go.mod h1:GRaKG3dwvFoTg4nj7aXdZnvMg4d7nvT/wl9WgVXn3Q8= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= -github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= +github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM= +github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/expr-lang/expr v1.16.9 h1:WUAzmR0JNI9JCiF0/ewwHB1gmcGw5wW7nWt8gc6PpCI= github.com/expr-lang/expr v1.16.9/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= -github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= -github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= -github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -355,12 +370,13 @@ github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7 github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= @@ -375,19 +391,19 @@ github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.22.9 h1:XX2DssF+mQKM2DHsbgZK74y/zj4mo9I99+89xUmuZCE= github.com/go-openapi/swag v0.22.9/go.mod h1:3/OXnFfnMAwBD099SwYRk7GD3xOrr1iL7d/XNLXVVwE= -github.com/go-resty/resty/v2 v2.12.0 h1:rsVL8P90LFvkUYq/V5BTVe203WfRIU4gvcf+yfzJzGA= -github.com/go-resty/resty/v2 v2.12.0/go.mod h1:o0yGPrkS3lOe1+eFajk6kBW8ScXzwU3hD69/gt2yB/0= +github.com/go-resty/resty/v2 v2.13.1 h1:x+LHXBI2nMB1vqndymf26quycC4aggYJ7DECYbiz03g= +github.com/go-resty/resty/v2 v2.13.1/go.mod h1:GznXlLxkq6Nh4sU59rPmUw3VtgpO3aS96ORAI6Q7d+0= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg= github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= +github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.6 h1:mkgN1ofwASrYnJ5W6U/BxG15eXXXjirgZc7CLqkcaro= github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -396,8 +412,8 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw= -github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -410,8 +426,6 @@ github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -419,14 +433,12 @@ github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= @@ -440,12 +452,8 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= @@ -457,20 +465,13 @@ github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7 h1:y3N7Bm7Y9/CtpiVkw/ZWj6lSlDF3F74SfKwfTCer72Q= -github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af h1:kmjWCqn2qkEml422C2Rrd27c3VGxi6a/6HNq8QmHRKM= +github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= @@ -482,29 +483,28 @@ github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfF github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.12.2 h1:mhN09QQW1jEWeMF74zGR81R30z4VJzjZsfkUhuHF+DA= -github.com/googleapis/gax-go/v2 v2.12.2/go.mod h1:61M8vcyyXR2kqKFxKrfA22jaA8JGF7Dc8App1U3H6jc= +github.com/googleapis/gax-go/v2 v2.12.5 h1:8gw9KZK8TiVKB6q3zHY3SBzLnrGp6HQjyfYBYGmXdxA= +github.com/googleapis/gax-go/v2 v2.12.5/go.mod h1:BUDKcWo+RaKq5SC9vVYL0wLADa3VcfswbOMMRmB9H3E= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gophercloud/gophercloud v1.8.0 h1:TM3Jawprb2NrdOnvcHhWJalmKmAmOGgfZElM/3oBYCk= -github.com/gophercloud/gophercloud v1.8.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= +github.com/gophercloud/gophercloud v1.13.0 h1:8iY9d1DAbzMW6Vok1AxbbK5ZaUjzMp0tdyt4fX9IeJ0= +github.com/gophercloud/gophercloud v1.13.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= -github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc h1:GN2Lv3MGO7AS6PrRoT6yV5+wkrOpcszoIsO4+4ds248= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= 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-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.13.0/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= -github.com/hashicorp/consul/api v1.28.3 h1:IE06LST/knnCQ+cxcvzyXRF/DetkgGhJoaOFd4l9xkk= -github.com/hashicorp/consul/api v1.28.3/go.mod h1:7AGcUFu28HkgOKD/GmsIGIFzRTmN0L02AE9Thsr2OhU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= +github.com/hashicorp/consul/api v1.30.0 h1:ArHVMMILb1nQv8vZSGIwwQd2gtc+oSQZ6CalyiyH2XQ= +github.com/hashicorp/consul/api v1.30.0/go.mod h1:B2uGchvaXVW2JhFoS8nqTxMD5PBykr4ebY4JWHTTeLM= github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -512,41 +512,42 @@ github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= -github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.7.4 h1:ZQgVdpTdAL7WpMIwLzCfbalOcSUdkDZnpUv3/+BxzFA= -github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= +github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= +github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/nomad/api v0.0.0-20240306004928-3e7191ccb702 h1:fI1LXuBaS1d9z1kmb++Og6YD8uMRwadXorCwE+xgOFA= -github.com/hashicorp/nomad/api v0.0.0-20240306004928-3e7191ccb702/go.mod h1:z71gkJdrkAt/Rl6C7Q79VE7AwJ5lUF+M+fzFTyIHYB0= +github.com/hashicorp/hcl v1.0.1-vault-5 h1:kI3hhbbyzr4dldA8UdTb7ZlVVlI2DACdCfz31RPDgJM= +github.com/hashicorp/hcl v1.0.1-vault-5/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM= +github.com/hashicorp/nomad/api v0.0.0-20240717122358-3d93bd3778f3 h1:fgVfQ4AC1avVOnu2cfms8VAiD8lUq3vWI8mTocOXN/w= +github.com/hashicorp/nomad/api v0.0.0-20240717122358-3d93bd3778f3/go.mod h1:svtxn6QnrQ69P23VvIWMR34tg3vmwLz4UdUzm1dSCgE= github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/hectane/go-acl v0.0.0-20190604041725-da78bae5fc95 h1:S4qyfL2sEm5Budr4KVMyEniCy+PbS55651I/a+Kn/NQ= github.com/hectane/go-acl v0.0.0-20190604041725-da78bae5fc95/go.mod h1:QiyDdbZLaJ/mZP4Zwc9g2QsfaEA4o7XvvgZegSci5/E= -github.com/hetznercloud/hcloud-go/v2 v2.6.0 h1:RJOA2hHZ7rD1pScA4O1NF6qhkHyUdbbxjHgFNot8928= -github.com/hetznercloud/hcloud-go/v2 v2.6.0/go.mod h1:4J1cSE57+g0WS93IiHLV7ubTHItcp+awzeBp5bM9mfA= +github.com/hetznercloud/hcloud-go/v2 v2.10.2 h1:9gyTUPhfNbfbS40Spgij5mV5k37bOZgt8iHKCbfGs5I= +github.com/hetznercloud/hcloud-go/v2 v2.10.2/go.mod h1:xQ+8KhIS62W0D78Dpi57jsufWh844gUw1az5OUvaeq8= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= @@ -559,6 +560,8 @@ github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHW github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= @@ -580,18 +583,17 @@ github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvW github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -604,19 +606,19 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leodido/go-syslog/v4 v4.1.0 h1:Wsl194qyWXr7V6DrGWC3xmxA9Ra6XgWO+toNt2fmCaI= -github.com/leodido/go-syslog/v4 v4.1.0/go.mod h1:eJ8rUfDN5OS6dOkCOBYlg2a+hbAg6pJa99QXXgMrd98= +github.com/leodido/go-syslog/v4 v4.2.0 h1:A7vpbYxsO4e2E8udaurkLlxP5LDpDbmPMsGnuhb7jVk= +github.com/leodido/go-syslog/v4 v4.2.0/go.mod h1:eJ8rUfDN5OS6dOkCOBYlg2a+hbAg6pJa99QXXgMrd98= github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b h1:11UHH39z1RhZ5dc4y4r/4koJo6IYFgTRMe/LlwRTEw0= github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b/go.mod h1:WZxr2/6a/Ar9bMDc2rN/LJrE/hF6bXE4LPyDSIxwAfg= -github.com/leoluk/perflib_exporter v0.2.1 h1:/3/ut1k/jFt5p4ypjLZKDHDqlXAK6ERZPVWtwdI389I= -github.com/leoluk/perflib_exporter v0.2.1/go.mod h1:MinSWm88jguXFFrGsP56PtleUb4Qtm4tNRH/wXNXRTI= github.com/lightstep/go-expohisto v1.0.0 h1:UPtTS1rGdtehbbAF7o/dhkWLTDI73UifG8LbfQI7cA4= github.com/lightstep/go-expohisto v1.0.0/go.mod h1:xDXD0++Mu2FOaItXtdDfksfgxfV0z1TMPa+e/EUd0cs= -github.com/linode/linodego v1.33.0 h1:cX2FYry7r6CA1ujBMsdqiM4VhvIQtnWsOuVblzfBhCw= -github.com/linode/linodego v1.33.0/go.mod h1:dSJJgIwqZCF5wnpuC6w5cyIbRtcexAm7uVvuJopGB40= +github.com/linode/linodego v1.37.0 h1:B/2Spzv9jYXzKA+p+GD8fVCNJ7Wuw6P91ZDD9eCkkso= +github.com/linode/linodego v1.37.0/go.mod h1:L7GXKFD3PoN2xSEtFc04wIXP5WK65O10jYQx0PQISWQ= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c h1:VtwQ41oftZwlMnOEbMWQtSEUgU64U4s+GHk7hZK+jtY= github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE= +github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= +github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= @@ -631,19 +633,19 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/miekg/dns v1.1.58 h1:ca2Hdkz+cDg/7eNF6V56jjzuZ4aCAE+DbVkILdQWG/4= -github.com/miekg/dns v1.1.58/go.mod h1:Ypv+3b/KadlvW9vJfXOTf300O4UqaHFzFCuHz+rPkBY= +github.com/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs= +github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4= -github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c h1:cqn374mizHuIWj+OSJCajGr/phAmuMug9qIX3l9CflE= github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= @@ -654,8 +656,8 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/mostynb/go-grpc-compression v1.2.2 h1:XaDbnRvt2+1vgr0b/l0qh4mJAfIxE0bKXtz2Znl3GGI= -github.com/mostynb/go-grpc-compression v1.2.2/go.mod h1:GOCr2KBxXcblCuczg3YdLQlcin1/NfyDA348ckuCH6w= +github.com/mostynb/go-grpc-compression v1.2.3 h1:42/BKWMy0KEJGSdWvzqIyOZ95YcR9mLPqKctH7Uo//I= +github.com/mostynb/go-grpc-compression v1.2.3/go.mod h1:AghIxF3P57umzqM9yz795+y1Vjs47Km/Y2FE6ouQ7Lg= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= @@ -669,12 +671,12 @@ github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= -github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= +github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= +github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg= -github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= @@ -690,34 +692,40 @@ github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142/go.mod h1:fjS8 github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/outcaste-io/ristretto v0.2.1 h1:KCItuNIGJZcursqHr3ghO7fc5ddZLEHspL9UR0cQM64= github.com/outcaste-io/ristretto v0.2.1/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= -github.com/ovh/go-ovh v1.4.3 h1:Gs3V823zwTFpzgGLZNI6ILS4rmxZgJwJCz54Er9LwD0= -github.com/ovh/go-ovh v1.4.3/go.mod h1:AkPXVtgwB6xlKblMjRKJJmjRp+ogrE7fz2lVgcQY8SY= +github.com/ovh/go-ovh v1.6.0 h1:ixLOwxQdzYDx296sXcgS35TOPEahJkpjMGtzPadCjQI= +github.com/ovh/go-ovh v1.6.0/go.mod h1:cTVDnl94z4tl8pP1uZ/8jlVxntjSIf09bNcQ5TJSC7c= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= -github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= -github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= +github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c h1:dAMKvw0MlJT1GshSTtih8C2gDs04w8dReiOGXrGLNoY= +github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c h1:NRoLoZvkBTKvR5gQLgA3e0hqjkY9u1wm+iOL45VN/qI= github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus-community/windows_exporter v0.27.2 h1:/tdRTouPMVsC4qt8+s9NOPEm7L/9qdDxmasiETlx+Wk= +github.com/prometheus-community/windows_exporter v0.27.2/go.mod h1:8+T6hfv71nvgVIzguouXkIGoa15ni+uXHHULBOA2bZo= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= +github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -728,34 +736,36 @@ github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7q github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= +github.com/prometheus/common v0.61.0 h1:3gv/GThfX0cV2lpO7gkTUwZru38mxevy90Bj8YFSRQQ= +github.com/prometheus/common v0.61.0/go.mod h1:zr29OCN/2BsJRaFwG8QOBr41D6kkchKbpeNH7pAjb/s= github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e h1:UmqAuY2OyDoog8+l5FybViJE5B2r+UxVGCUwFTsY5AA= -github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e/go.mod h1:+0ld+ozir7zWFcHA2vVpWAKxXakIioEjPPNOqH+J3ZA= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/prometheus/prometheus v0.54.1 h1:vKuwQNjnYN2/mDoWfHXDhAsz/68q/dQDb+YbcEqU7MQ= +github.com/prometheus/prometheus v0.54.1/go.mod h1:xlLByHhk2g3ycakQGrMaU8K7OySZx98BzeCR99991NY= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.25 h1:/8rfZAdFfafRXOgz+ZpMZZWZ5pYggCY9t7e/BvjaBHM= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.25/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.29 h1:BkTk4gynLjguayxrYxZoMZjBnAOh7ntQvUkOFmkMqPU= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.29/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= github.com/secure-systems-lab/go-securesystemslib v0.7.0 h1:OwvJ5jQf9LnIAS83waAjPbcMsODrTQUpJ02eNLUoxBg= github.com/secure-systems-lab/go-securesystemslib v0.7.0/go.mod h1:/2gYnlnHVQ6xeGtfIqFy7Do03K4cdCY0A/GlJLDKLHI= github.com/shirou/gopsutil/v3 v3.22.12/go.mod h1:Xd7P1kwZcp5VW52+9XsirIKd/BROzbb2wdX3Kqlz9uI= -github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= -github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= +github.com/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI= +github.com/shirou/gopsutil/v3 v3.24.5/go.mod h1:bsoOS1aStSs9ErQ1WWfxllSeS1K5D+U30r2NfcubMVk= +github.com/shirou/gopsutil/v4 v4.24.11 h1:WaU9xqGFKvFfsUv94SXcUPD7rCkU0vr/asVdQOBZNj8= +github.com/shirou/gopsutil/v4 v4.24.11/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= @@ -769,15 +779,16 @@ github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4k github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= -github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= -github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= -github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= +github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w= +github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -795,27 +806,27 @@ github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= 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 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tinylib/msgp v1.1.9 h1:SHf3yoO2sGA0veCJeCBYLHuttAVFHGm2RHgNodW7wQU= -github.com/tinylib/msgp v1.1.9/go.mod h1:BCXGB54lDD8qUEPmiG0cQQUANC4IUQyB2ItS2UDlO/k= +github.com/tinylib/msgp v1.2.4 h1:yLFeUGostXXSGW5vxfT5dXG/qzkn4schv2I7at5+hVU= +github.com/tinylib/msgp v1.2.4/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU= +github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY= github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY= +github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20200122045848-3419fae592fc/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 h1:SIKIoA4e/5Y9ZOl0DCe3eVMLPOQzJxgZpfdHHeauNTM= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6/go.mod h1:BUbeWZiieNxAuuADTBNb3/aeje6on3DhU3rpWsQSB1E= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= @@ -827,13 +838,14 @@ github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vb github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= github.com/vultr/govultr/v2 v2.17.2 h1:gej/rwr91Puc/tgh+j33p/BLR16UrIPnSr+AIwYWZQs= github.com/vultr/govultr/v2 v2.17.2/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= @@ -844,135 +856,195 @@ go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/configgrpc v0.102.0 h1:cQi5HwpkHvrZJUxZjoGXkWpAuK+gEyp/1Zjn0BrkvmQ= -go.opentelemetry.io/collector/config/configgrpc v0.102.0/go.mod h1:ASpBXzDWLiDGlG8iRFovU5R4LhAefoC4ajm+qIdslOw= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/confignet v0.102.0 h1:+wQevJ/iBnPxL+roY7WWnAjMxB8v4M5QrS3+0iEmauw= -go.opentelemetry.io/collector/config/confignet v0.102.0/go.mod h1:pfOrCTfSZEB6H2rKtx41/3RN4dKs+X2EKQbw3MGRh0E= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0 h1:8Ne/oL6M4kMWK0P3FKV9EduQa+1UOGyVAnFHfSo4c1A= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0/go.mod h1:Xj4Ld/RriP/Bj+5oPpaYJsLNs2wWRDN2TvzX3Lbi6+M= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0 h1:o1iKqN+oM+TZqHoGdnKw1Am2BQlIGCYbxCRzU8T3jbM= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0/go.mod h1:JpCemLtL/sXQ2Rk3Bx7OPPA7Qt/9NVH91q0bR655gSo= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0 h1:SfASE6lxXjrmYj/UibcWdOiFWvRG0zt4hJgenloEhlY= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0/go.mod h1:+Ku0Fvdb5f6e9UkfqJXAV5FaUJVxxg6Ykfx7Js8y+V4= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0 h1:GwJQTXs7pYPUv/fVf+0nBgsJdlrTuY/PfwQ/TRA/sIk= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0/go.mod h1:PGE3DcRgqYWWC2cq2hYZoET1d3Q8JZyPNmgvqXPFWEU= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0 h1:zdYZLiHHtDf4Kk9WU7mW9dW6WAXtBF54I5jmTMRJtiw= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0/go.mod h1:yFsgUM0PbUJkPlbpJfOG6da+YiF0Z80tv7YcnL3qwv4= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0 h1:Y4H+GaCQl2URp9mEJMV5CYOhw+erONqNyvtFoKQfIoA= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0/go.mod h1:g1RjfVD0gHAf/mPOIs3zBoKBeuDsN+rc5x0lZtgA8tI= -go.opentelemetry.io/collector/connector v0.102.0 h1:IvAsVfYRxP0ajmKbUovF8qugkcUtHq6RuYNtjcMa63E= -go.opentelemetry.io/collector/connector v0.102.0/go.mod h1:f4M7wZ/9+XtgTE0fivBFH3WlwntaEd0qFFA0giFkdnY= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/exporter/debugexporter v0.102.0 h1:b8z8EHdb3Q4f1A/lr6zP9aVv+7HTsouV0XCR8zb+R4w= -go.opentelemetry.io/collector/exporter/debugexporter v0.102.0/go.mod h1:fuFR9OIDtNe/ZGUp1YwrO2t0jy1/AIi4P93e+OoMCWA= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/extension/zpagesextension v0.102.0 h1:BPq98py8nwzaV7KAsxt4ZZAF9LiSRu7ZjHNGavFNyKo= -go.opentelemetry.io/collector/extension/zpagesextension v0.102.0/go.mod h1:P86HW3x3epDS5F4yP0gAvsZiw4xxP1OupTEx2o6UqjY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/filter v0.102.0 h1:2K4Q/l4b+tglMAQmxpscuCr/juyozyPx17Q6Dfm2FwU= -go.opentelemetry.io/collector/filter v0.102.0/go.mod h1:zDVjFCeeVct7hYwejzx+aRC1dbHaPsvv/Ob1SvCiQjE= -go.opentelemetry.io/collector/otelcol v0.102.0 h1:HuE+ok4iUjOrmYhQBSWpG5kBTVhcA24ljPL4pBERZ5E= -go.opentelemetry.io/collector/otelcol v0.102.0/go.mod h1:w8pCRu2nM/jAkLlEAS6ccKtJv5ylUQe6Ugl98zzTfyE= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/processor v0.102.0 h1:JsjTlpBRmoSYxcu3cAbKBchOmL6aNUxLa03ZkWIqZr8= -go.opentelemetry.io/collector/processor v0.102.0/go.mod h1:IaCSDcfy75uQTaOM+LgR1bMf/bUw2eFfzn20uvWYfLQ= -go.opentelemetry.io/collector/processor/batchprocessor v0.102.0 h1:lJSIMwip+Po5jOF/4dpx6c/3N45KJTr/UZoT086T4mI= -go.opentelemetry.io/collector/processor/batchprocessor v0.102.0/go.mod h1:e71Y6SnrCjD19dPjxWWi/kXa5tb0J8rC+9xl/72mLo4= -go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.102.0 h1:osoITPX0RITC8gJkyaNC6rqSKFl9wCeOqagjdNZUL70= -go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.102.0/go.mod h1:2OVM2IJOWVdxkOOt0WCyQSMv2T19OSKNIy1KCqHGXyY= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0 h1:eLc+AK0IQDDysrMt3SLwKaOFIjEwdO8ipwSck3+TUXE= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0/go.mod h1:p9yeFJktNrpwV9ATvaWeZwCMvVkVWnrfbJ4RHI/RS/I= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/collector/service v0.102.0 h1:B5nfyQZF7eB/y+yucl9G/7VsusbXixYXWingXn7VszM= -go.opentelemetry.io/collector/service v0.102.0/go.mod h1:c+0n0DfQeCjgrdplNHYwYbG/5aupTZVYU/50nMQraoc= -go.opentelemetry.io/contrib/config v0.7.0 h1:b1rK5tGTuhhPirJiMxOcyQfZs76j2VapY6ODn3b2Dbs= -go.opentelemetry.io/contrib/config v0.7.0/go.mod h1:8tdiFd8N5etOi3XzBmAoMxplEzI3TcL8dU5rM5/xcOQ= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 h1:vS1Ao/R55RNV4O7TA2Qopok8yN+X0LIP6RVWLFkprck= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0/go.mod h1:BMsdeOxN04K0L5FNUBfjFdvwWGNe/rkmSwH4Aelu/X0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/contrib/propagators/b3 v1.27.0 h1:IjgxbomVrV9za6bRi8fWCNXENs0co37SZedQilP2hm0= -go.opentelemetry.io/contrib/propagators/b3 v1.27.0/go.mod h1:Dv9obQz25lCisDvvs4dy28UPh974CxkahRDUPsY7y9E= -go.opentelemetry.io/contrib/zpages v0.52.0 h1:MPgkMy0Cp3O5EdfVXP0ss3ujhEibysTM4eszx7E7d+E= -go.opentelemetry.io/contrib/zpages v0.52.0/go.mod h1:fqG5AFdoYru3A3DnhibVuaaEfQV2WKxE7fYE1jgDRwk= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/bridge/opencensus v1.27.0 h1:ao9aGGHd+G4YfjBpGs6vbkvt5hoC67STlJA9fCnOAcs= -go.opentelemetry.io/otel/bridge/opencensus v1.27.0/go.mod h1:uRvWtAAXzyVOST0WMPX5JHGBaAvBws+2F8PcC5gMnTk= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 h1:bFgvUr3/O4PHj3VQcFEuYKvRZJX1SJDQ+11JXuSB3/w= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0/go.mod h1:xJntEd2KL6Qdg5lwp97HMLQDVeAhrYxmzFseAMDPQ8I= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 h1:CIHWikMsN3wO+wq1Tp5VGdVRTcON+DmOJSfDjXypKOc= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0/go.mod h1:TNupZ6cxqyFEpLXAZW7On+mLFL0/g0TE3unIYL91xWc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0 h1:/jlt1Y8gXWiHG9FBx6cJaIC5hYx5Fe64nC8w5Cylt/0= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0/go.mod h1:bmToOGOBZ4hA9ghphIc1PAf66VA8KOtsuy3+ScStG20= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 h1:/0YaXu3755A/cFbtXp+21lkXgI0QE5avTWA2HjU9/WE= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0/go.mod h1:m7SFxp0/7IxmJPLIY3JhOcU9CoFzDaCPL6xxQIxhA+o= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= -go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= -go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= +go.opentelemetry.io/collector v0.116.0 h1:Dscd6Nsnc7hjFQosO0SofcPQsXRfcj5N5PjQAslnmj4= +go.opentelemetry.io/collector v0.116.0/go.mod h1:Ug2hpW0SINPmJAGVEALRlux78NTZc3YXSuh5/Q/hFrA= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/configgrpc v0.116.0 h1:O8Y1X9wDH5dDdqDJ9kqoaMrxEauaDSJBg9aNC6QgB7g= +go.opentelemetry.io/collector/config/configgrpc v0.116.0/go.mod h1:RPrSQrr6xhIaAK2DdcECi142NjSo0npQfVQB3nommSo= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/confignet v1.22.0 h1:SBEMHJZWD8J4qgFw1O+BEkXW9AWldDi6Fz5YeDeoU58= +go.opentelemetry.io/collector/config/confignet v1.22.0/go.mod h1:ZppUH1hgUJOubawEsxsQ9MzEYFytqo2GnVSS7d4CVxc= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0 h1:AdHaQo/GSSRLJvEFLCMHo02r+u6Ed8j0/MNz7u3noug= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0/go.mod h1:InKYEGFdkwz3H2q648kT6rMCFBhPvevIW9ZbWIY5QR4= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0 h1:upFhnU8EyPp0WMR53mJIdx+UR2EGFOr+ppYKzUCY/Vg= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0/go.mod h1:FhjMWU5nf3IctX27lVZomM5SKMyRywShRsA4/rHoBe8= +go.opentelemetry.io/collector/confmap/provider/httpprovider v1.22.0 h1:jKLicfZRiA+G/sgso26aM6Dmmva4Dx9Txk2R58+R3e8= +go.opentelemetry.io/collector/confmap/provider/httpprovider v1.22.0/go.mod h1:nZhEGDufHuZAaeVyFVz15IluXwrnQRCp+U/w7j8Lx9Y= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.22.0 h1:dkiNwLxBqeNDN5fIwtvr2GoA0I2xZB2SEdQ9ceBbJVs= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.22.0/go.mod h1:P9SxKZvim1C3K1R2j3gI+Qb4/l9MffX2sY5f9ajsk7Y= +go.opentelemetry.io/collector/connector v0.116.0 h1:0Pz8RAXH1swLeA1fiyGGQWdv0Kemz4mbq+jnmd1TACE= +go.opentelemetry.io/collector/connector v0.116.0/go.mod h1:VQiZ2yW9KhZuF0yjDbvlgrAxm7+o8KQoxHxurQWLjKU= +go.opentelemetry.io/collector/connector/connectortest v0.116.0 h1:MdttvjqdZmp0ewW5IPCEtzzYmCqxrQxsjJ5m6gMVjzA= +go.opentelemetry.io/collector/connector/connectortest v0.116.0/go.mod h1:ko7aPyvAVf6SvRhWGZdPXSyk+7zPmsSCcMq0gYPMMIQ= +go.opentelemetry.io/collector/connector/xconnector v0.116.0 h1:fFJzrRco0g7HMkhnQ+ehlvicFf58vzsCLXnfuHyQM8w= +go.opentelemetry.io/collector/connector/xconnector v0.116.0/go.mod h1:m9oCk32zX6wDciYBpy+qMQkWKtOxb0gAkEUm8+trflY= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.116.0 h1:sSPDz4Qu7H86SrxtE6sQHDuWjFkTWHdKyGdsxhjZzcw= +go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.116.0/go.mod h1:0K7jbkCWtydn1IA3JwAUJeLVL79tJTxWoXR2gYTnCk0= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/debugexporter v0.116.0 h1:NCVGIkaA0eSDZPg0/NdWt7ivUmVukPVEixBDTulMa08= +go.opentelemetry.io/collector/exporter/debugexporter v0.116.0/go.mod h1:QZL/MKrgErI7O64ams2lmsQduLOkw/SLmtvS7W+iQNo= +go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.116.0 h1:BzMvZf9RKRcQPFjGnQSEWvfI5Er9kXfzyZ/4GHkUTa4= +go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.116.0/go.mod h1:RCbA3MNnZPTy2mViwQxMlnrq5moJ1XgetNQx2XHIpaI= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0 h1:bXDgoiDiwFfrO5S6q1Wpe0su303CW4Qxthoy4CxG6eg= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0/go.mod h1:uFZlAPxk2+s6zk1W+u22DgxxSDugWy0QaY5kQzjNy7Q= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/extension/zpagesextension v0.116.0 h1:D0VY/ESPwkREfMaqJleGVTiCYoCs3MDipU93ywaIn68= +go.opentelemetry.io/collector/extension/zpagesextension v0.116.0/go.mod h1:MqkQSYKarMrjVSyGrAes1FBcsW6HDDPj/ouvcDvSjfk= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/filter v0.116.0 h1:pvN3W2JIEHxWbCLlUS1HxrRo3ZQrN4BiWyLvPFyKfvQ= +go.opentelemetry.io/collector/filter v0.116.0/go.mod h1:GoLxnSI6uE6QzmGOaiz0mkgirbQpj2A2Nb18bTKv5gI= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 h1:KKFb3u8iLk4V5GYz7eVpw8QgEdob5koX6GNEbaoDQJY= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0/go.mod h1:YyWHUWeSnRmy2CF7kPHpwJ6qkVjufbLZ8PYuY0Ph0o8= +go.opentelemetry.io/collector/internal/memorylimiter v0.116.0 h1:xLt/2jPHvaWQiNle66DsTz3kRbWoQ93AEMfSeKyCdN0= +go.opentelemetry.io/collector/internal/memorylimiter v0.116.0/go.mod h1:12KU4unWjF3nxrpOuuTi4TGK3KaD+kzmgA2Vd86MhWU= +go.opentelemetry.io/collector/internal/sharedcomponent v0.116.0 h1:5QhpnwgogQhBrcsOjk1Yhkugopj043XlSDB1lpHKCGo= +go.opentelemetry.io/collector/internal/sharedcomponent v0.116.0/go.mod h1:wMQM1Sqbj6J6jNVBb5hawkCfmqrLJ0hAeDKkalUfrEY= +go.opentelemetry.io/collector/otelcol v0.116.0 h1:8NoPEY2uAemwNzUcMxiZuuI8w/Ff+0p1DXXk6NVEGlk= +go.opentelemetry.io/collector/otelcol v0.116.0/go.mod h1:c/EhsBdHmC44SxhWMi7pTlYB+I6GBSJNBsj9NCwXMxM= +go.opentelemetry.io/collector/otelcol/otelcoltest v0.116.0 h1:ZNg2kFLKnreaGSMfbr74k1yEbHLxG4ZbVvSIr+XleXo= +go.opentelemetry.io/collector/otelcol/otelcoltest v0.116.0/go.mod h1:TruQJSWWiDRlSYZTcLSE0GeECJZALDw8X8dvoYXUJ+A= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 h1:PFNy+Il/kqPdPL9rhG+1kG63Aauya+FhBKGXoB6ivxU= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0/go.mod h1:bVn9V4TGyeXi58/JDkeXCuKtc+V+qcOoTl8hNpV0qa8= +go.opentelemetry.io/collector/processor v0.116.0 h1:Kyu4tPzTdWNHtZjcxvI/bGNAgyv8L8Kem2r/Mk4IDAw= +go.opentelemetry.io/collector/processor v0.116.0/go.mod h1:+/Ugy48RAxlZEXmN2cw51W8t5wdHS9No+GAoP+moskk= +go.opentelemetry.io/collector/processor/batchprocessor v0.116.0 h1:jZMC+jlay3xCBBjcL85oT8nMFB5B3zvvwS6lW6xVGAc= +go.opentelemetry.io/collector/processor/batchprocessor v0.116.0/go.mod h1:KmLVhDjnatsZm5xQkgRLl12lwvHohmk3djJXfu8m33c= +go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.116.0 h1:7YwVMfpr0igtILydBFDXJsEGskI/4FIKPqc0hGIjJIE= +go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.116.0/go.mod h1:nMEGCezCKUedDmxTLNL9cpFUhG2ku8ThNn7t/wfKWI0= +go.opentelemetry.io/collector/processor/processorhelper/xprocessorhelper v0.116.0 h1:1tIEJSN3HeCY602B5h2b1K6ocNn/HMNC2E+u7o3ceZA= +go.opentelemetry.io/collector/processor/processorhelper/xprocessorhelper v0.116.0/go.mod h1:r8oKp+HrgZDp4L6RiNYoEk3x+LMrt9lEiCW6WiaYuJM= +go.opentelemetry.io/collector/processor/processortest v0.116.0 h1:+IqNEVEE0E2MsO2g7+Y/9dz35sDuvAXRXrLts9NdXrA= +go.opentelemetry.io/collector/processor/processortest v0.116.0/go.mod h1:DLaQDBxzgeeaUO0ULMn/efos9PmHZkmYCHuxwCsiVHI= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0 h1:iin/UwuWvSLB7ZNfINFUYbZ5lxIi1NjZ2brkyyFdiRA= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0/go.mod h1:cnA43/XpKDbaOmd8buqKp/LGJ2l/OoCqbR//u5DMfn8= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.116.0 h1:81u+wJsQp9VfrAdVpVvcV31YAs8qsZp/UnMmG9YCJ0A= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.116.0/go.mod h1:JXIwjUyh3Q+gNvr7YE937se4/E4UJ/oz5z9xbJeVl3M= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/scraper v0.116.0 h1:Gdg3v/QUZobHcAAewOlwlaE4XlkRQl3FFut906XuCiw= +go.opentelemetry.io/collector/scraper v0.116.0/go.mod h1:G4SmTIPG8RbxVhTF3zj4EFJx+1tceZbZxhS6mtXOeg0= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/collector/service v0.116.0 h1:1rFmax3ILOlQq4bW//0VKRcG/HmN2rxrgfTybn6bisU= +go.opentelemetry.io/collector/service v0.116.0/go.mod h1:CzQzj72mWr5arag+q8uUWGRuUkenNo5Gw9oA97SFZ78= +go.opentelemetry.io/contrib/bridges/otelzap v0.6.0 h1:j8icMXyyqNf6HGuwlYhniPnVsbJIq7n+WirDu3VAJdQ= +go.opentelemetry.io/contrib/bridges/otelzap v0.6.0/go.mod h1:evIOZpl+kAlU5IsaYX2Siw+IbpacAZvXemVsgt70uvw= +go.opentelemetry.io/contrib/config v0.10.0 h1:2JknAzMaYjxrHkTnZh3eOme/Y2P5eHE2SWfhfV6Xd6c= +go.opentelemetry.io/contrib/config v0.10.0/go.mod h1:aND2M6/KfNkntI5cyvHriR/zvZgPf8j9yETdSmvpfmc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 h1:yMkBS9yViCc7U7yeLzJPM2XizlfdVvBRSmsQDWu6qc0= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0/go.mod h1:n8MR6/liuGB5EmTETUBeU5ZgqMOlqKRxUaqPQBOANZ8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/contrib/propagators/b3 v1.31.0 h1:PQPXYscmwbCp76QDvO4hMngF2j8Bx/OTV86laEl8uqo= +go.opentelemetry.io/contrib/propagators/b3 v1.31.0/go.mod h1:jbqfV8wDdqSDrAYxVpXQnpM0XFMq2FtDesblJ7blOwQ= +go.opentelemetry.io/contrib/zpages v0.56.0 h1:W7vP6s3juzL5KiHpr41zLNmsJ0QAZudYu8ay0zGAoko= +go.opentelemetry.io/contrib/zpages v0.56.0/go.mod h1:IxPRP4TYHw9jLeaEOSDIiA9zmyJNZNO6sbW55iMvSXs= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 h1:mMOmtYie9Fx6TSVzw4W+NTpvoaS1JWWga37oI1a/4qQ= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0/go.mod h1:yy7nDsMMBUkD+jeekJ36ur5f3jJIrmCwUrY67VFhNpA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 h1:j7ZSD+5yn+lo3sGV69nW04rRR0jhYnBwjuX3r0HvnK0= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0/go.mod h1:WXbYJTUaZXAbYd8lbgGuvih0yuCfOFC5RJoYnoLcGz8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 h1:t/Qur3vKSkUCcDVaSumWF2PKHt85pc7fRvFuoVT8qFU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0/go.mod h1:Rl61tySSdcOJWoEgYZVtmnKdA0GeKrSqkHC1t+91CH8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 h1:K0XaT3DwHAcV4nKLzcQvwAgSyisUghWoY20I7huthMk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0/go.mod h1:B5Ki776z/MBnVha1Nzwp5arlzBbE3+1jk+pGmaP5HME= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy03iVTXP6ffeN2iXrxfGsZGCjVx0/4KlizjyBwU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0/go.mod h1:TMu73/k1CP8nBUpDLc71Wj/Kf7ZS9FK5b53VapRsP9o= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 h1:lUsI2TYsQw2r1IASwoROaCnjdj2cvC2+Jbxvk6nHnWU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0/go.mod h1:2HpZxxQurfGxJlJDblybejHB6RX6pmExPNe517hREw4= +go.opentelemetry.io/otel/exporters/prometheus v0.54.0 h1:rFwzp68QMgtzu9PgP3jm9XaMICI6TsofWWPcBDKwlsU= +go.opentelemetry.io/otel/exporters/prometheus v0.54.0/go.mod h1:QyjcV9qDP6VeK5qPyKETvNjmaaEc7+gqjh4SS0ZYzDU= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 h1:TwmL3O3fRR80m8EshBrd8YydEZMcUCsZXzOUlnFohwM= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0/go.mod h1:tH98dDv5KPmPThswbXA0fr0Lwfs+OhK8HgaCo7PjRrk= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 h1:SZmDnHcgp3zwlPBS2JX2urGYe/jBKEIT6ZedHRUyCz8= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0/go.mod h1:fdWW0HtZJ7+jNpTKUR0GpMEDP69nR8YBJQxNiVCE3jk= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 h1:UGZ1QwZWY67Z6BmckTU+9Rxn04m2bD3gD6Mk0OIOCPk= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0/go.mod h1:fcwWuDuaObkkChiDlhEpSq9+X1C0omv+s5mBtToAQ64= +go.opentelemetry.io/otel/log v0.8.0 h1:egZ8vV5atrUWUbnSsHn6vB8R21G2wrKqNiDt3iWertk= +go.opentelemetry.io/otel/log v0.8.0/go.mod h1:M9qvDdUTRCopJcGRKg57+JSQ9LgLBrwwfC32epk5NX8= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/log v0.7.0 h1:dXkeI2S0MLc5g0/AwxTZv6EUEjctiH8aG14Am56NTmQ= +go.opentelemetry.io/otel/sdk/log v0.7.0/go.mod h1:oIRXpW+WD6M8BuGj5rtS0aRu/86cbDV/dAfNaZBIjYM= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/dig v1.17.0 h1:5Chju+tUvcC+N7N6EV08BJz41UZuO3BmHcN4A287ZLI= -go.uber.org/dig v1.17.0/go.mod h1:rTxpf7l5I0eBTlE6/9RL+lDybC7WFwY2QH55ZSjy1mU= -go.uber.org/fx v1.18.2 h1:bUNI6oShr+OVFQeU8cDNbnN7VFsu+SsjHzUF51V/GAU= -go.uber.org/fx v1.18.2/go.mod h1:g0V1KMQ66zIRk8bLu3Ea5Jt2w/cHlOIp4wdRsgh0JaY= +go.uber.org/dig v1.18.0 h1:imUL1UiY0Mg4bqbFfsRQO5G4CGRBec/ZujWTvSVp3pw= +go.uber.org/dig v1.18.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= +go.uber.org/fx v1.22.2 h1:iPW+OPxv0G8w75OemJ1RAnTUrF55zOJlXlo1TbJ0Buw= +go.uber.org/fx v1.22.2/go.mod h1:o/D9n+2mLP6v1EG+qsdT1O8wKopYAsqZasju97SDFCU= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= @@ -993,10 +1065,9 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1007,8 +1078,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= +golang.org/x/exp v0.0.0-20241210194714-1829a127f884 h1:Y/Mj/94zIQQGHVSv1tTtQBDaQaJe62U9bkDZKKyhPCU= +golang.org/x/exp v0.0.0-20241210194714-1829a127f884/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1021,7 +1092,6 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -1031,11 +1101,10 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1051,7 +1120,6 @@ golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1062,48 +1130,32 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= -golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1132,58 +1184,50 @@ golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= +golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1219,36 +1263,21 @@ golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= -golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8= +golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= -gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= +gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= +gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1258,25 +1287,14 @@ google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsb google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.169.0 h1:QwWPy71FgMWqJN/l6jVlFHUa29a7dcUy02I8o799nPY= -google.golang.org/api v0.169.0/go.mod h1:gpNOiMA2tZ4mf5R9Iwf4rK/Dcz0fbdIgWYWVoxmsyLg= +google.golang.org/api v0.188.0 h1:51y8fJ/b1AaaBRJr4yWm96fPcuxSo0JcegXE3DaHQHw= +google.golang.org/api v0.188.0/go.mod h1:VR0d+2SIiWOYG3r/jdm7adPW9hI2aRv9ETOSCQ9Beag= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -1297,49 +1315,23 @@ google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvx google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 h1:P8OJ/WCl/Xo4E4zoe4/bifHpSmmKwARqyqE4nW6J2GQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1348,10 +1340,9 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1388,30 +1379,29 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.21.1/go.mod h1:FstGROTmsSHBarKc8bylzXih8BLNYTiS3TZcsoEDg2s= -k8s.io/api v0.29.3 h1:2ORfZ7+bGC3YJqGpV0KSDDEVf8hdGQ6A03/50vj8pmw= -k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80= +k8s.io/api v0.31.3 h1:umzm5o8lFbdN/hIXbrK9oRpOproJO62CV1zqxXrLgk8= +k8s.io/api v0.31.3/go.mod h1:UJrkIp9pnMOI9K2nlL6vwpxRzzEX5sWgn8kGQe92kCE= k8s.io/apimachinery v0.21.1/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY= -k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= -k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= +k8s.io/apimachinery v0.31.3 h1:6l0WhcYgasZ/wk9ktLq5vLaoXJJr5ts6lkaQzgeYPq4= +k8s.io/apimachinery v0.31.3/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= k8s.io/client-go v0.21.1/go.mod h1:/kEw4RgW+3xnBGzvp9IWxKSNA+lXn3A7AuH3gdOAzLs= -k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg= -k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= +k8s.io/client-go v0.31.3 h1:CAlZuM+PH2cm+86LOBemaJI/lQ5linJ6UFxKX/SoG+4= +k8s.io/client-go v0.31.3/go.mod h1:2CgjPUTpv3fE5dNygAr2NcM8nhHzXvxB8KL5gYc3kJs= k8s.io/code-generator v0.21.1/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= -k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= 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= @@ -1422,5 +1412,5 @@ sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/connector/datadogconnector/internal/metadata/generated_status.go b/connector/datadogconnector/internal/metadata/generated_status.go index 07449ae998e7..bfad5160875e 100644 --- a/connector/datadogconnector/internal/metadata/generated_status.go +++ b/connector/datadogconnector/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("datadog") + Type = component.MustNewType("datadog") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/connector/datadogconnector" ) const ( diff --git a/connector/datadogconnector/internal/metadata/generated_telemetry.go b/connector/datadogconnector/internal/metadata/generated_telemetry.go deleted file mode 100644 index 6f07d78230d4..000000000000 --- a/connector/datadogconnector/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/datadog") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/datadog") -} diff --git a/connector/datadogconnector/internal/metadata/generated_telemetry_test.go b/connector/datadogconnector/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 58fb984fcc04..000000000000 --- a/connector/datadogconnector/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/datadog", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/datadog", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/connector/datadogconnector/metadata.yaml b/connector/datadogconnector/metadata.yaml index 5986d4d9a51e..42aeeee24f4e 100644 --- a/connector/datadogconnector/metadata.yaml +++ b/connector/datadogconnector/metadata.yaml @@ -1,5 +1,4 @@ type: datadog -scope_name: otelcol/datadog status: class: connector @@ -7,7 +6,7 @@ status: beta: [traces_to_metrics, traces_to_traces] distributions: [contrib] codeowners: - active: [mx-psi, dineshg13, ankitpatel96] + active: [mx-psi, dineshg13, ankitpatel96, jade-guiton-dd] emeritus: [gbbr] tests: diff --git a/connector/exceptionsconnector/README.md b/connector/exceptionsconnector/README.md index d6a29fee099d..14ceb097eaf9 100644 --- a/connector/exceptionsconnector/README.md +++ b/connector/exceptionsconnector/README.md @@ -3,12 +3,13 @@ | Status | | | ------------- |-----------| -| Distributions | [contrib] | +| Distributions | [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aconnector%2Fexceptions%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aconnector%2Fexceptions) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aconnector%2Fexceptions%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aconnector%2Fexceptions) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@jpkrohling](https://www.github.com/jpkrohling), [@marctc](https://www.github.com/marctc) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@marctc](https://www.github.com/marctc) | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s ## Supported Pipeline Types @@ -19,7 +20,7 @@ [Exporter Pipeline Type]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md#exporter-pipeline-type [Receiver Pipeline Type]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md#receiver-pipeline-type -[Stability Level]: https://github.com/open-telemetry/opentelemetry-collector#stability-levels +[Stability Level]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#stability-levels ## Overview diff --git a/connector/exceptionsconnector/config_test.go b/connector/exceptionsconnector/config_test.go index f128153144b8..cfe8099a692a 100644 --- a/connector/exceptionsconnector/config_test.go +++ b/connector/exceptionsconnector/config_test.go @@ -50,7 +50,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - err = component.UnmarshalConfig(sub, cfg) + err = sub.Unmarshal(cfg) assert.NoError(t, err) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) diff --git a/connector/exceptionsconnector/connector.go b/connector/exceptionsconnector/connector.go index e6fad832bc47..c465a1ff42ac 100644 --- a/connector/exceptionsconnector/connector.go +++ b/connector/exceptionsconnector/connector.go @@ -5,7 +5,9 @@ package exceptionsconnector // import "github.com/open-telemetry/opentelemetry-c import ( "go.opentelemetry.io/collector/pdata/pcommon" - conventions "go.opentelemetry.io/collector/semconv/v1.18.0" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" + + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil" ) const ( @@ -20,21 +22,16 @@ const ( eventNameExc = "exception" // OpenTelemetry non-standard constant. ) -type dimension struct { - name string - value *pcommon.Value -} - -func newDimensions(cfgDims []Dimension) []dimension { +func newDimensions(cfgDims []Dimension) []pdatautil.Dimension { if len(cfgDims) == 0 { return nil } - dims := make([]dimension, len(cfgDims)) + dims := make([]pdatautil.Dimension, len(cfgDims)) for i := range cfgDims { - dims[i].name = cfgDims[i].Name + dims[i].Name = cfgDims[i].Name if cfgDims[i].Default != nil { val := pcommon.NewValueStr(*cfgDims[i].Default) - dims[i].value = &val + dims[i].Value = &val } } return dims @@ -47,17 +44,21 @@ func newDimensions(cfgDims []Dimension) []dimension { // // The ok flag indicates if a dimension value was fetched in order to differentiate // an empty string value from a state where no value was found. -func getDimensionValue(d dimension, spanAttrs pcommon.Map, eventAttrs pcommon.Map) (v pcommon.Value, ok bool) { +func getDimensionValue(d pdatautil.Dimension, spanAttrs pcommon.Map, eventAttrs pcommon.Map, resourceAttr pcommon.Map) (v pcommon.Value, ok bool) { // The more specific span attribute should take precedence. - if attr, exists := spanAttrs.Get(d.name); exists { + if attr, exists := spanAttrs.Get(d.Name); exists { + return attr, true + } + if attr, exists := eventAttrs.Get(d.Name); exists { return attr, true } - if attr, exists := eventAttrs.Get(d.name); exists { + // falling back to searching in resource attributes + if attr, exists := resourceAttr.Get(d.Name); exists { return attr, true } // Set the default if configured, otherwise this metric will have no value set for the dimension. - if d.value != nil { - return *d.value, true + if d.Value != nil { + return *d.Value, true } return v, ok } diff --git a/connector/exceptionsconnector/connector_logs.go b/connector/exceptionsconnector/connector_logs.go index a7a58f5294a2..e8de93475aee 100644 --- a/connector/exceptionsconnector/connector_logs.go +++ b/connector/exceptionsconnector/connector_logs.go @@ -11,17 +11,18 @@ import ( "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/traceutil" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil" ) type logsConnector struct { config Config // Additional dimensions to add to logs. - dimensions []dimension + dimensions []pdatautil.Dimension logsConsumer consumer.Logs component.StartFunc @@ -68,7 +69,7 @@ func (c *logsConnector) ConsumeTraces(ctx context.Context, traces ptrace.Traces) for l := 0; l < span.Events().Len(); l++ { event := span.Events().At(l) if event.Name() == eventNameExc { - c.attrToLogRecord(sl, serviceName, span, event) + c.attrToLogRecord(sl, serviceName, span, event, resourceAttr) } } } @@ -91,7 +92,7 @@ func (c *logsConnector) newScopeLogs(ld plog.Logs) plog.ScopeLogs { return sl } -func (c *logsConnector) attrToLogRecord(sl plog.ScopeLogs, serviceName string, span ptrace.Span, event ptrace.SpanEvent) plog.LogRecord { +func (c *logsConnector) attrToLogRecord(sl plog.ScopeLogs, serviceName string, span ptrace.Span, event ptrace.SpanEvent, resourceAttrs pcommon.Map) plog.LogRecord { logRecord := sl.LogRecords().AppendEmpty() logRecord.SetTimestamp(event.Timestamp()) @@ -113,20 +114,13 @@ func (c *logsConnector) attrToLogRecord(sl plog.ScopeLogs, serviceName string, s // Add configured dimension attributes to the log record. for _, d := range c.dimensions { - if v, ok := getDimensionValue(d, spanAttrs, eventAttrs); ok { - logRecord.Attributes().PutStr(d.name, v.Str()) + if v, ok := pdatautil.GetDimensionValue(d, spanAttrs, eventAttrs, resourceAttrs); ok { + logRecord.Attributes().PutStr(d.Name, v.Str()) } } // Add stacktrace to the log record. - logRecord.Attributes().PutStr(exceptionStacktraceKey, getValue(eventAttrs, exceptionStacktraceKey)) + attrVal, _ := pdatautil.GetAttributeValue(exceptionStacktraceKey, eventAttrs) + logRecord.Attributes().PutStr(exceptionStacktraceKey, attrVal) return logRecord } - -// getValue returns the value of the attribute with the given key. -func getValue(attr pcommon.Map, key string) string { - if attrVal, ok := attr.Get(key); ok { - return attrVal.Str() - } - return "" -} diff --git a/connector/exceptionsconnector/connector_metrics.go b/connector/exceptionsconnector/connector_metrics.go index 6ed5c0669d94..a9a62d39143e 100644 --- a/connector/exceptionsconnector/connector_metrics.go +++ b/connector/exceptionsconnector/connector_metrics.go @@ -14,10 +14,11 @@ import ( "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/traceutil" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil" ) const ( @@ -29,7 +30,7 @@ type metricsConnector struct { config Config // Additional dimensions to add to metrics. - dimensions []dimension + dimensions []pdatautil.Dimension keyBuf *bytes.Buffer @@ -92,10 +93,10 @@ func (c *metricsConnector) ConsumeTraces(ctx context.Context, traces ptrace.Trac eventAttrs := event.Attributes() c.keyBuf.Reset() - buildKey(c.keyBuf, serviceName, span, c.dimensions, eventAttrs) + buildKey(c.keyBuf, serviceName, span, c.dimensions, eventAttrs, resourceAttr) key := c.keyBuf.String() - attrs := buildDimensionKVs(c.dimensions, serviceName, span, eventAttrs) + attrs := buildDimensionKVs(c.dimensions, serviceName, span, eventAttrs, resourceAttr) exc := c.addException(key, attrs) c.addExemplar(exc, span.TraceID(), span.SpanID()) } @@ -175,7 +176,7 @@ func (c *metricsConnector) addExemplar(exc *exception, traceID pcommon.TraceID, e.SetDoubleValue(float64(exc.count)) } -func buildDimensionKVs(dimensions []dimension, serviceName string, span ptrace.Span, eventAttrs pcommon.Map) pcommon.Map { +func buildDimensionKVs(dimensions []pdatautil.Dimension, serviceName string, span ptrace.Span, eventAttrs pcommon.Map, resourceAttrs pcommon.Map) pcommon.Map { dims := pcommon.NewMap() dims.EnsureCapacity(3 + len(dimensions)) dims.PutStr(serviceNameKey, serviceName) @@ -183,8 +184,8 @@ func buildDimensionKVs(dimensions []dimension, serviceName string, span ptrace.S dims.PutStr(spanKindKey, traceutil.SpanKindStr(span.Kind())) dims.PutStr(statusCodeKey, traceutil.StatusCodeStr(span.Status().Code())) for _, d := range dimensions { - if v, ok := getDimensionValue(d, span.Attributes(), eventAttrs); ok { - v.CopyTo(dims.PutEmpty(d.name)) + if v, ok := pdatautil.GetDimensionValue(d, span.Attributes(), eventAttrs, resourceAttrs); ok { + v.CopyTo(dims.PutEmpty(d.Name)) } } return dims @@ -195,14 +196,14 @@ func buildDimensionKVs(dimensions []dimension, serviceName string, span ptrace.S // or resource attributes. If the dimension exists in both, the span's attributes, being the most specific, takes precedence. // // The metric key is a simple concatenation of dimension values, delimited by a null character. -func buildKey(dest *bytes.Buffer, serviceName string, span ptrace.Span, optionalDims []dimension, eventAttrs pcommon.Map) { +func buildKey(dest *bytes.Buffer, serviceName string, span ptrace.Span, optionalDims []pdatautil.Dimension, eventAttrs pcommon.Map, resourceAttrs pcommon.Map) { concatDimensionValue(dest, serviceName, false) concatDimensionValue(dest, span.Name(), true) concatDimensionValue(dest, traceutil.SpanKindStr(span.Kind()), true) concatDimensionValue(dest, traceutil.StatusCodeStr(span.Status().Code()), true) for _, d := range optionalDims { - if v, ok := getDimensionValue(d, span.Attributes(), eventAttrs); ok { + if v, ok := getDimensionValue(d, span.Attributes(), eventAttrs, resourceAttrs); ok { concatDimensionValue(dest, v.AsString(), true) } } diff --git a/connector/exceptionsconnector/connector_metrics_test.go b/connector/exceptionsconnector/connector_metrics_test.go index f196677a78a8..ef0b350a761c 100644 --- a/connector/exceptionsconnector/connector_metrics_test.go +++ b/connector/exceptionsconnector/connector_metrics_test.go @@ -20,6 +20,8 @@ import ( "go.uber.org/zap" "go.uber.org/zap/zaptest" "google.golang.org/grpc/metadata" + + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil" ) // metricID represents the minimum attributes that uniquely identifies a metric in our tests. @@ -43,7 +45,7 @@ func TestConnectorConsumeTraces(t *testing.T) { testcases := []struct { name string - verifier func(t testing.TB, input pmetric.Metrics) bool + verifier func(tb testing.TB, input pmetric.Metrics) bool traces []ptrace.Traces }{ { @@ -83,7 +85,7 @@ func TestConnectorConsumeTraces(t *testing.T) { assert.NoError(t, err) metrics := msink.AllMetrics() - assert.Greater(t, len(metrics), 0) + assert.NotEmpty(t, metrics) tc.verifier(t, metrics[len(metrics)-1]) } }) @@ -103,10 +105,9 @@ func TestConnectorConsumeTraces(t *testing.T) { assert.NoError(t, err) metrics := msink.AllMetrics() - assert.Greater(t, len(metrics), 0) + assert.NotEmpty(t, metrics) verifyBadMetricsOkay(t, metrics[len(metrics)-1]) }) - } func BenchmarkConnectorConsumeTraces(b *testing.B) { @@ -152,8 +153,8 @@ func newTestMetricsConnector(mcon consumer.Metrics, defaultNullValue *string, lo } // verifyConsumeMetricsInputCumulative expects one accumulation of metrics, and marked as cumulative -func verifyConsumeMetricsInputCumulative(t testing.TB, input pmetric.Metrics) bool { - return verifyConsumeMetricsInput(t, input, 1) +func verifyConsumeMetricsInputCumulative(tb testing.TB, input pmetric.Metrics) bool { + return verifyConsumeMetricsInput(tb, input, 1) } func verifyBadMetricsOkay(_ testing.TB, _ pmetric.Metrics) bool { @@ -162,53 +163,52 @@ func verifyBadMetricsOkay(_ testing.TB, _ pmetric.Metrics) bool { // verifyMultipleCumulativeConsumptions expects the amount of accumulations as kept track of by numCumulativeConsumptions. // numCumulativeConsumptions acts as a multiplier for the values, since the cumulative metrics are additive. -func verifyMultipleCumulativeConsumptions() func(t testing.TB, input pmetric.Metrics) bool { +func verifyMultipleCumulativeConsumptions() func(tb testing.TB, input pmetric.Metrics) bool { numCumulativeConsumptions := 0 - return func(t testing.TB, input pmetric.Metrics) bool { + return func(tb testing.TB, input pmetric.Metrics) bool { numCumulativeConsumptions++ - return verifyConsumeMetricsInput(t, input, numCumulativeConsumptions) + return verifyConsumeMetricsInput(tb, input, numCumulativeConsumptions) } } // verifyConsumeMetricsInput verifies the input of the ConsumeMetrics call from this connector. // This is the best point to verify the computed metrics from spans are as expected. -func verifyConsumeMetricsInput(t testing.TB, input pmetric.Metrics, numCumulativeConsumptions int) bool { - require.Equal(t, 3, input.DataPointCount(), "Should be 1 for each generated span") +func verifyConsumeMetricsInput(tb testing.TB, input pmetric.Metrics, numCumulativeConsumptions int) bool { + require.Equal(tb, 3, input.DataPointCount(), "Should be 1 for each generated span") rm := input.ResourceMetrics() - require.Equal(t, 1, rm.Len()) + require.Equal(tb, 1, rm.Len()) ilm := rm.At(0).ScopeMetrics() - require.Equal(t, 1, ilm.Len()) - assert.Equal(t, "exceptionsconnector", ilm.At(0).Scope().Name()) + require.Equal(tb, 1, ilm.Len()) + assert.Equal(tb, "exceptionsconnector", ilm.At(0).Scope().Name()) m := ilm.At(0).Metrics() - require.Equal(t, 1, m.Len()) + require.Equal(tb, 1, m.Len()) seenMetricIDs := make(map[metricID]bool) // The first 3 data points are for call counts. - assert.Equal(t, "exceptions", m.At(0).Name()) - assert.True(t, m.At(0).Sum().IsMonotonic()) + assert.Equal(tb, "exceptions", m.At(0).Name()) + assert.True(tb, m.At(0).Sum().IsMonotonic()) callsDps := m.At(0).Sum().DataPoints() - require.Equal(t, 3, callsDps.Len()) + require.Equal(tb, 3, callsDps.Len()) for dpi := 0; dpi < 3; dpi++ { dp := callsDps.At(dpi) - assert.Equal(t, int64(numCumulativeConsumptions), dp.IntValue(), "There should only be one metric per Service/kind combination") - assert.NotZero(t, dp.StartTimestamp(), "StartTimestamp should be set") - assert.NotZero(t, dp.Timestamp(), "Timestamp should be set") - verifyMetricLabels(dp, t, seenMetricIDs) + assert.Equal(tb, int64(numCumulativeConsumptions), dp.IntValue(), "There should only be one metric per Service/kind combination") + assert.NotZero(tb, dp.StartTimestamp(), "StartTimestamp should be set") + assert.NotZero(tb, dp.Timestamp(), "Timestamp should be set") + verifyMetricLabels(tb, dp, seenMetricIDs) - assert.Equal(t, 1, dp.Exemplars().Len()) + assert.Equal(tb, 1, dp.Exemplars().Len()) exemplar := dp.Exemplars().At(0) - assert.NotZero(t, exemplar.Timestamp()) - assert.NotZero(t, exemplar.TraceID()) - assert.NotZero(t, exemplar.SpanID()) - + assert.NotZero(tb, exemplar.Timestamp()) + assert.NotZero(tb, exemplar.TraceID()) + assert.NotZero(tb, exemplar.SpanID()) } return true } -func verifyMetricLabels(dp metricDataPoint, t testing.TB, seenMetricIDs map[metricID]bool) { +func verifyMetricLabels(tb testing.TB, dp metricDataPoint, seenMetricIDs map[metricID]bool) { mID := metricID{} wantDimensions := map[string]pcommon.Value{ stringAttrName: pcommon.NewValueStr("stringAttrValue"), @@ -233,17 +233,17 @@ func verifyMetricLabels(dp metricDataPoint, t testing.TB, seenMetricIDs map[metr case statusCodeKey: mID.statusCode = v.Str() case notInSpanAttrName1: - assert.Fail(t, notInSpanAttrName1+" should not be in this metric") + assert.Fail(tb, notInSpanAttrName1+" should not be in this metric") default: - assert.Equal(t, wantDimensions[k], v) + assert.Equal(tb, wantDimensions[k], v) delete(wantDimensions, k) } return true }) - assert.Empty(t, wantDimensions, "Did not see all expected dimensions in metric. Missing: ", wantDimensions) + assert.Empty(tb, wantDimensions, "Did not see all expected dimensions in metric. Missing: ", wantDimensions) // Service/kind should be a unique metric. - assert.False(t, seenMetricIDs[mID]) + assert.False(tb, seenMetricIDs[mID]) seenMetricIDs[mID] = true } @@ -261,12 +261,12 @@ func TestBuildKeySameServiceOperationCharSequence(t *testing.T) { span0 := ptrace.NewSpan() span0.SetName("c") buf := &bytes.Buffer{} - buildKey(buf, "ab", span0, nil, pcommon.NewMap()) + buildKey(buf, "ab", span0, nil, pcommon.NewMap(), pcommon.NewMap()) k0 := buf.String() buf.Reset() span1 := ptrace.NewSpan() span1.SetName("bc") - buildKey(buf, "a", span1, nil, pcommon.NewMap()) + buildKey(buf, "a", span1, nil, pcommon.NewMap(), pcommon.NewMap()) k1 := buf.String() assert.NotEqual(t, k0, k1) assert.Equal(t, "ab\u0000c\u0000SPAN_KIND_UNSPECIFIED\u0000STATUS_CODE_UNSET", k0) @@ -277,7 +277,7 @@ func TestBuildKeyWithDimensions(t *testing.T) { defaultFoo := pcommon.NewValueStr("bar") for _, tc := range []struct { name string - optionalDims []dimension + optionalDims []pdatautil.Dimension resourceAttrMap map[string]any spanAttrMap map[string]any wantKey string @@ -288,22 +288,22 @@ func TestBuildKeyWithDimensions(t *testing.T) { }, { name: "neither span nor resource contains key, dim provides default", - optionalDims: []dimension{ - {name: "foo", value: &defaultFoo}, + optionalDims: []pdatautil.Dimension{ + {Name: "foo", Value: &defaultFoo}, }, wantKey: "ab\u0000c\u0000SPAN_KIND_UNSPECIFIED\u0000STATUS_CODE_UNSET\u0000bar", }, { name: "neither span nor resource contains key, dim provides no default", - optionalDims: []dimension{ - {name: "foo"}, + optionalDims: []pdatautil.Dimension{ + {Name: "foo"}, }, wantKey: "ab\u0000c\u0000SPAN_KIND_UNSPECIFIED\u0000STATUS_CODE_UNSET", }, { name: "span attribute contains dimension", - optionalDims: []dimension{ - {name: "foo"}, + optionalDims: []pdatautil.Dimension{ + {Name: "foo"}, }, spanAttrMap: map[string]any{ "foo": 99, @@ -312,8 +312,8 @@ func TestBuildKeyWithDimensions(t *testing.T) { }, { name: "resource attribute contains dimension", - optionalDims: []dimension{ - {name: "foo"}, + optionalDims: []pdatautil.Dimension{ + {Name: "foo"}, }, resourceAttrMap: map[string]any{ "foo": 99, @@ -322,8 +322,8 @@ func TestBuildKeyWithDimensions(t *testing.T) { }, { name: "both span and resource attribute contains dimension, should prefer span attribute", - optionalDims: []dimension{ - {name: "foo"}, + optionalDims: []pdatautil.Dimension{ + {Name: "foo"}, }, spanAttrMap: map[string]any{ "foo": 100, @@ -341,7 +341,7 @@ func TestBuildKeyWithDimensions(t *testing.T) { assert.NoError(t, span0.Attributes().FromRaw(tc.spanAttrMap)) span0.SetName("c") buf := &bytes.Buffer{} - buildKey(buf, "ab", span0, tc.optionalDims, resAttr) + buildKey(buf, "ab", span0, tc.optionalDims, pcommon.NewMap(), resAttr) assert.Equal(t, tc.wantKey, buf.String()) }) } diff --git a/connector/exceptionsconnector/connector_test.go b/connector/exceptionsconnector/connector_test.go index df029791549d..fcdb12ca3219 100644 --- a/connector/exceptionsconnector/connector_test.go +++ b/connector/exceptionsconnector/connector_test.go @@ -8,7 +8,7 @@ import ( "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" ) const ( diff --git a/connector/exceptionsconnector/factory.go b/connector/exceptionsconnector/factory.go index ce222817d433..92cfb7955f50 100644 --- a/connector/exceptionsconnector/factory.go +++ b/connector/exceptionsconnector/factory.go @@ -34,13 +34,13 @@ func createDefaultConfig() component.Config { } } -func createTracesToMetricsConnector(_ context.Context, params connector.CreateSettings, cfg component.Config, nextConsumer consumer.Metrics) (connector.Traces, error) { +func createTracesToMetricsConnector(_ context.Context, params connector.Settings, cfg component.Config, nextConsumer consumer.Metrics) (connector.Traces, error) { mc := newMetricsConnector(params.Logger, cfg) mc.metricsConsumer = nextConsumer return mc, nil } -func createTracesToLogsConnector(_ context.Context, params connector.CreateSettings, cfg component.Config, nextConsumer consumer.Logs) (connector.Traces, error) { +func createTracesToLogsConnector(_ context.Context, params connector.Settings, cfg component.Config, nextConsumer consumer.Logs) (connector.Traces, error) { lc := newLogsConnector(params.Logger, cfg) lc.logsConsumer = nextConsumer return lc, nil diff --git a/connector/exceptionsconnector/factory_test.go b/connector/exceptionsconnector/factory_test.go index 642bc93d19c9..ed55b8a2b4be 100644 --- a/connector/exceptionsconnector/factory_test.go +++ b/connector/exceptionsconnector/factory_test.go @@ -5,21 +5,24 @@ package exceptionsconnector import ( "context" + "net/http" "testing" "github.com/stretchr/testify/assert" "go.opentelemetry.io/collector/connector/connectortest" "go.opentelemetry.io/collector/consumer/consumertest" "go.opentelemetry.io/collector/pdata/pcommon" + + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil" ) func TestNewConnector(t *testing.T) { - defaultMethod := "GET" + defaultMethod := http.MethodGet defaultMethodValue := pcommon.NewValueStr(defaultMethod) for _, tc := range []struct { name string dimensions []Dimension - wantDimensions []dimension + wantDimensions []pdatautil.Dimension }{ { name: "simplest config (use defaults)", @@ -30,9 +33,9 @@ func TestNewConnector(t *testing.T) { {Name: "http.method", Default: &defaultMethod}, {Name: "http.status_code"}, }, - wantDimensions: []dimension{ - {name: "http.method", value: &defaultMethodValue}, - {"http.status_code", nil}, + wantDimensions: []pdatautil.Dimension{ + {Name: "http.method", Value: &defaultMethodValue}, + {Name: "http.status_code", Value: nil}, }, }, } { @@ -40,7 +43,7 @@ func TestNewConnector(t *testing.T) { // Prepare factory := NewFactory() - creationParams := connectortest.NewNopCreateSettings() + creationParams := connectortest.NewNopSettings() cfg := factory.CreateDefaultConfig().(*Config) cfg.Dimensions = tc.dimensions diff --git a/connector/exceptionsconnector/generated_component_test.go b/connector/exceptionsconnector/generated_component_test.go index f22380e95a7b..a2e720ad9b78 100644 --- a/connector/exceptionsconnector/generated_component_test.go +++ b/connector/exceptionsconnector/generated_component_test.go @@ -14,6 +14,7 @@ import ( "go.opentelemetry.io/collector/connector/connectortest" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/consumer/consumertest" + "go.opentelemetry.io/collector/pipeline" ) func TestComponentFactoryType(t *testing.T) { @@ -29,21 +30,21 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set connector.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) }{ { name: "traces_to_logs", - createFn: func(ctx context.Context, set connector.CreateSettings, cfg component.Config) (component.Component, error) { - router := connector.NewLogsRouter(map[component.ID]consumer.Logs{component.NewID(component.DataTypeLogs): consumertest.NewNop()}) + createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) { + router := connector.NewLogsRouter(map[pipeline.ID]consumer.Logs{pipeline.NewID(pipeline.SignalLogs): consumertest.NewNop()}) return factory.CreateTracesToLogs(ctx, set, cfg, router) }, }, { name: "traces_to_metrics", - createFn: func(ctx context.Context, set connector.CreateSettings, cfg component.Config) (component.Component, error) { - router := connector.NewMetricsRouter(map[component.ID]consumer.Metrics{component.NewID(component.DataTypeMetrics): consumertest.NewNop()}) + createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) { + router := connector.NewMetricsRouter(map[pipeline.ID]consumer.Metrics{pipeline.NewID(pipeline.SignalMetrics): consumertest.NewNop()}) return factory.CreateTracesToMetrics(ctx, set, cfg, router) }, }, @@ -56,21 +57,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), connectortest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), connectortest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - firstConnector, err := test.createFn(context.Background(), connectortest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + firstConnector, err := tt.createFn(context.Background(), connectortest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() require.NoError(t, err) require.NoError(t, firstConnector.Start(context.Background(), host)) require.NoError(t, firstConnector.Shutdown(context.Background())) - secondConnector, err := test.createFn(context.Background(), connectortest.NewNopCreateSettings(), cfg) + secondConnector, err := tt.createFn(context.Background(), connectortest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, secondConnector.Start(context.Background(), host)) require.NoError(t, secondConnector.Shutdown(context.Background())) diff --git a/connector/exceptionsconnector/go.mod b/connector/exceptionsconnector/go.mod index c5f041252690..90051e7baede 100644 --- a/connector/exceptionsconnector/go.mod +++ b/connector/exceptionsconnector/go.mod @@ -1,67 +1,72 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/connector/exceptionsconnector -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/connector v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/connector v0.116.0 + go.opentelemetry.io/collector/connector/connectortest v0.116.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/pipeline v0.116.0 + go.opentelemetry.io/collector/semconv v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 - google.golang.org/grpc v1.64.0 + google.golang.org/grpc v1.68.1 ) require ( - github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/connector/xconnector v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal => ../../internal/coreinternal -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../../pkg/pdatautil +replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil => ../../internal/pdatautil replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest => ../../pkg/pdatatest replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden => ../../pkg/golden + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../../pkg/pdatautil diff --git a/connector/exceptionsconnector/go.sum b/connector/exceptionsconnector/go.sum index 39199e8c77ae..40848ef58300 100644 --- a/connector/exceptionsconnector/go.sum +++ b/connector/exceptionsconnector/go.sum @@ -1,19 +1,19 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -27,8 +27,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -44,52 +44,58 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/connector v0.102.0 h1:IvAsVfYRxP0ajmKbUovF8qugkcUtHq6RuYNtjcMa63E= -go.opentelemetry.io/collector/connector v0.102.0/go.mod h1:f4M7wZ/9+XtgTE0fivBFH3WlwntaEd0qFFA0giFkdnY= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/connector v0.116.0 h1:0Pz8RAXH1swLeA1fiyGGQWdv0Kemz4mbq+jnmd1TACE= +go.opentelemetry.io/collector/connector v0.116.0/go.mod h1:VQiZ2yW9KhZuF0yjDbvlgrAxm7+o8KQoxHxurQWLjKU= +go.opentelemetry.io/collector/connector/connectortest v0.116.0 h1:MdttvjqdZmp0ewW5IPCEtzzYmCqxrQxsjJ5m6gMVjzA= +go.opentelemetry.io/collector/connector/connectortest v0.116.0/go.mod h1:ko7aPyvAVf6SvRhWGZdPXSyk+7zPmsSCcMq0gYPMMIQ= +go.opentelemetry.io/collector/connector/xconnector v0.116.0 h1:fFJzrRco0g7HMkhnQ+ehlvicFf58vzsCLXnfuHyQM8w= +go.opentelemetry.io/collector/connector/xconnector v0.116.0/go.mod h1:m9oCk32zX6wDciYBpy+qMQkWKtOxb0gAkEUm8+trflY= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 h1:KKFb3u8iLk4V5GYz7eVpw8QgEdob5koX6GNEbaoDQJY= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0/go.mod h1:YyWHUWeSnRmy2CF7kPHpwJ6qkVjufbLZ8PYuY0Ph0o8= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 h1:PFNy+Il/kqPdPL9rhG+1kG63Aauya+FhBKGXoB6ivxU= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0/go.mod h1:bVn9V4TGyeXi58/JDkeXCuKtc+V+qcOoTl8hNpV0qa8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -105,20 +111,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -127,12 +133,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/connector/exceptionsconnector/internal/metadata/generated_status.go b/connector/exceptionsconnector/internal/metadata/generated_status.go index ac54b0b98128..27b0df5271fc 100644 --- a/connector/exceptionsconnector/internal/metadata/generated_status.go +++ b/connector/exceptionsconnector/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("exceptions") + Type = component.MustNewType("exceptions") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/connector/exceptionsconnector" ) const ( diff --git a/connector/exceptionsconnector/internal/metadata/generated_telemetry.go b/connector/exceptionsconnector/internal/metadata/generated_telemetry.go deleted file mode 100644 index 28d2ea801c76..000000000000 --- a/connector/exceptionsconnector/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/exceptions") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/exceptions") -} diff --git a/connector/exceptionsconnector/internal/metadata/generated_telemetry_test.go b/connector/exceptionsconnector/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 388154453208..000000000000 --- a/connector/exceptionsconnector/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/exceptions", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/exceptions", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/connector/exceptionsconnector/metadata.yaml b/connector/exceptionsconnector/metadata.yaml index 9b1d65b140e7..81e18bb7fd07 100644 --- a/connector/exceptionsconnector/metadata.yaml +++ b/connector/exceptionsconnector/metadata.yaml @@ -1,13 +1,12 @@ type: exceptions -scope_name: otelcol/exceptions status: class: connector stability: alpha: [traces_to_metrics, traces_to_logs] - distributions: [contrib] + distributions: [contrib, k8s] codeowners: - active: [jpkrohling, marctc] + active: [marctc] tests: config: diff --git a/connector/failoverconnector/README.md b/connector/failoverconnector/README.md index 329c113223f5..38a43cd4cb72 100644 --- a/connector/failoverconnector/README.md +++ b/connector/failoverconnector/README.md @@ -3,12 +3,13 @@ | Status | | | ------------- |-----------| -| Distributions | [contrib] | +| Distributions | [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aconnector%2Ffailover%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aconnector%2Ffailover) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aconnector%2Ffailover%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aconnector%2Ffailover) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@akats7](https://www.github.com/akats7), [@djaglowski](https://www.github.com/djaglowski), [@fatsheep9146](https://www.github.com/fatsheep9146) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@akats7](https://www.github.com/akats7), [@fatsheep9146](https://www.github.com/fatsheep9146) | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s ## Supported Pipeline Types @@ -20,7 +21,7 @@ [Exporter Pipeline Type]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md#exporter-pipeline-type [Receiver Pipeline Type]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md#receiver-pipeline-type -[Stability Level]: https://github.com/open-telemetry/opentelemetry-collector#stability-levels +[Stability Level]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#stability-levels Allows for health based routing between trace, metric, and log pipelines depending on the health of target downstream exporters. diff --git a/connector/failoverconnector/config.go b/connector/failoverconnector/config.go index 3ea82c03fe36..d5ce66d55ade 100644 --- a/connector/failoverconnector/config.go +++ b/connector/failoverconnector/config.go @@ -7,7 +7,7 @@ import ( "errors" "time" - "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/pipeline" ) var ( @@ -19,7 +19,7 @@ type Config struct { // PipelinePriority is the list of pipeline level priorities in a 1 - n configuration, multiple pipelines can // sit at a single priority level and will be routed in a fanout. If any pipeline at a level fails, the // level is considered unhealthy - PipelinePriority [][]component.ID `mapstructure:"priority_levels"` + PipelinePriority [][]pipeline.ID `mapstructure:"priority_levels"` // RetryInterval is the frequency at which the pipeline levels will attempt to recover by going over // all levels below the current diff --git a/connector/failoverconnector/config_test.go b/connector/failoverconnector/config_test.go index 4f8a886ca0a3..e39255763d8a 100644 --- a/connector/failoverconnector/config_test.go +++ b/connector/failoverconnector/config_test.go @@ -12,6 +12,7 @@ import ( "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/confmap/confmaptest" + "go.opentelemetry.io/collector/pipeline" "github.com/open-telemetry/opentelemetry-collector-contrib/connector/failoverconnector/internal/metadata" ) @@ -24,9 +25,9 @@ func TestLoadConfig(t *testing.T) { { id: component.NewIDWithName(metadata.Type, "default"), expected: &Config{ - PipelinePriority: [][]component.ID{ + PipelinePriority: [][]pipeline.ID{ { - component.NewIDWithName(component.DataTypeTraces, ""), + pipeline.NewIDWithName(pipeline.SignalTraces, ""), }, }, RetryInterval: 10 * time.Minute, @@ -37,19 +38,19 @@ func TestLoadConfig(t *testing.T) { { id: component.NewIDWithName(metadata.Type, "full"), expected: &Config{ - PipelinePriority: [][]component.ID{ + PipelinePriority: [][]pipeline.ID{ { - component.NewIDWithName(component.DataTypeTraces, "first"), - component.NewIDWithName(component.DataTypeTraces, "also_first"), + pipeline.NewIDWithName(pipeline.SignalTraces, "first"), + pipeline.NewIDWithName(pipeline.SignalTraces, "also_first"), }, { - component.NewIDWithName(component.DataTypeTraces, "second"), + pipeline.NewIDWithName(pipeline.SignalTraces, "second"), }, { - component.NewIDWithName(component.DataTypeTraces, "third"), + pipeline.NewIDWithName(pipeline.SignalTraces, "third"), }, { - component.NewIDWithName(component.DataTypeTraces, "fourth"), + pipeline.NewIDWithName(pipeline.SignalTraces, "fourth"), }, }, RetryInterval: 5 * time.Minute, @@ -69,7 +70,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tc.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tc.expected, cfg) @@ -106,7 +107,7 @@ func TestValidateConfig(t *testing.T) { sub, err := cm.Sub(tc.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.EqualError(t, component.ValidateConfig(cfg), tc.err.Error()) }) diff --git a/connector/failoverconnector/factory.go b/connector/failoverconnector/factory.go index 0ad9b4d7eecc..fa80e88c7317 100644 --- a/connector/failoverconnector/factory.go +++ b/connector/failoverconnector/factory.go @@ -34,7 +34,7 @@ func createDefaultConfig() component.Config { func createTracesToTraces( _ context.Context, - set connector.CreateSettings, + set connector.Settings, cfg component.Config, traces consumer.Traces, ) (connector.Traces, error) { @@ -43,7 +43,7 @@ func createTracesToTraces( func createMetricsToMetrics( _ context.Context, - set connector.CreateSettings, + set connector.Settings, cfg component.Config, metrics consumer.Metrics, ) (connector.Metrics, error) { @@ -52,7 +52,7 @@ func createMetricsToMetrics( func createLogsToLogs( _ context.Context, - set connector.CreateSettings, + set connector.Settings, cfg component.Config, logs consumer.Logs, ) (connector.Logs, error) { diff --git a/connector/failoverconnector/factory_test.go b/connector/failoverconnector/factory_test.go index 1990eee65329..9043414f8e32 100644 --- a/connector/failoverconnector/factory_test.go +++ b/connector/failoverconnector/factory_test.go @@ -9,32 +9,32 @@ import ( "time" "github.com/stretchr/testify/assert" - "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/connector" "go.opentelemetry.io/collector/connector/connectortest" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/consumer/consumertest" + "go.opentelemetry.io/collector/pipeline" ) func TestNewFactory(t *testing.T) { - traces0 := component.NewIDWithName(component.DataTypeTraces, "0") - traces1 := component.NewIDWithName(component.DataTypeTraces, "1") - traces2 := component.NewIDWithName(component.DataTypeTraces, "2") + traces0 := pipeline.NewIDWithName(pipeline.SignalTraces, "0") + traces1 := pipeline.NewIDWithName(pipeline.SignalTraces, "1") + traces2 := pipeline.NewIDWithName(pipeline.SignalTraces, "2") cfg := &Config{ - PipelinePriority: [][]component.ID{{traces0, traces1}, {traces2}}, + PipelinePriority: [][]pipeline.ID{{traces0, traces1}, {traces2}}, RetryInterval: 5 * time.Minute, RetryGap: 10 * time.Second, MaxRetries: 5, } - router := connector.NewTracesRouter(map[component.ID]consumer.Traces{ + router := connector.NewTracesRouter(map[pipeline.ID]consumer.Traces{ traces0: consumertest.NewNop(), traces1: consumertest.NewNop(), traces2: consumertest.NewNop(), }) conn, err := NewFactory().CreateTracesToTraces(context.Background(), - connectortest.NewNopCreateSettings(), cfg, router.(consumer.Traces)) + connectortest.NewNopSettings(), cfg, router.(consumer.Traces)) defer func() { assert.NoError(t, conn.Shutdown(context.Background())) }() diff --git a/connector/failoverconnector/failover.go b/connector/failoverconnector/failover.go index f76341646d72..931a94aa1561 100644 --- a/connector/failoverconnector/failover.go +++ b/connector/failoverconnector/failover.go @@ -7,12 +7,12 @@ import ( "errors" "sync" - "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/pipeline" "github.com/open-telemetry/opentelemetry-collector-contrib/connector/failoverconnector/internal/state" ) -type consumerProvider[C any] func(...component.ID) (C, error) +type consumerProvider[C any] func(...pipeline.ID) (C, error) type failoverRouter[C any] struct { consumerProvider consumerProvider[C] diff --git a/connector/failoverconnector/failover_test.go b/connector/failoverconnector/failover_test.go index 6df18c85468c..6ef406835612 100644 --- a/connector/failoverconnector/failover_test.go +++ b/connector/failoverconnector/failover_test.go @@ -9,28 +9,28 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/connector" "go.opentelemetry.io/collector/connector/connectortest" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/consumer/consumertest" + "go.opentelemetry.io/collector/pipeline" ) func TestFailoverRecovery(t *testing.T) { var sinkFirst, sinkSecond, sinkThird, sinkFourth consumertest.TracesSink - tracesFirst := component.NewIDWithName(component.DataTypeTraces, "traces/first") - tracesSecond := component.NewIDWithName(component.DataTypeTraces, "traces/second") - tracesThird := component.NewIDWithName(component.DataTypeTraces, "traces/third") - tracesFourth := component.NewIDWithName(component.DataTypeTraces, "traces/fourth") + tracesFirst := pipeline.NewIDWithName(pipeline.SignalTraces, "traces/first") + tracesSecond := pipeline.NewIDWithName(pipeline.SignalTraces, "traces/second") + tracesThird := pipeline.NewIDWithName(pipeline.SignalTraces, "traces/third") + tracesFourth := pipeline.NewIDWithName(pipeline.SignalTraces, "traces/fourth") cfg := &Config{ - PipelinePriority: [][]component.ID{{tracesFirst}, {tracesSecond}, {tracesThird}, {tracesFourth}}, + PipelinePriority: [][]pipeline.ID{{tracesFirst}, {tracesSecond}, {tracesThird}, {tracesFourth}}, RetryInterval: 50 * time.Millisecond, RetryGap: 10 * time.Millisecond, MaxRetries: 10000, } - router := connector.NewTracesRouter(map[component.ID]consumer.Traces{ + router := connector.NewTracesRouter(map[pipeline.ID]consumer.Traces{ tracesFirst: &sinkFirst, tracesSecond: &sinkSecond, tracesThird: &sinkThird, @@ -38,7 +38,7 @@ func TestFailoverRecovery(t *testing.T) { }) conn, err := NewFactory().CreateTracesToTraces(context.Background(), - connectortest.NewNopCreateSettings(), cfg, router.(consumer.Traces)) + connectortest.NewNopSettings(), cfg, router.(consumer.Traces)) require.NoError(t, err) @@ -58,7 +58,7 @@ func TestFailoverRecovery(t *testing.T) { require.NoError(t, conn.ConsumeTraces(context.Background(), tr)) idx := failoverConnector.failover.pS.TestStableIndex() - require.Equal(t, idx, 1) + require.Equal(t, 1, idx) failoverConnector.failover.ModifyConsumerAtIndex(0, &sinkFirst) @@ -75,7 +75,7 @@ func TestFailoverRecovery(t *testing.T) { require.NoError(t, conn.ConsumeTraces(context.Background(), tr)) idx := failoverConnector.failover.pS.TestStableIndex() - require.Equal(t, idx, 1) + require.Equal(t, 1, idx) failoverConnector.failover.ModifyConsumerAtIndex(0, &sinkFirst) @@ -97,7 +97,7 @@ func TestFailoverRecovery(t *testing.T) { require.NoError(t, conn.ConsumeTraces(context.Background(), tr)) idx := failoverConnector.failover.pS.TestStableIndex() - require.Equal(t, idx, 2) + require.Equal(t, 2, idx) // Simulate recovery of exporter failoverConnector.failover.ModifyConsumerAtIndex(1, &sinkSecond) @@ -154,19 +154,19 @@ func TestFailoverRecovery(t *testing.T) { func TestFailoverRecovery_MaxRetries(t *testing.T) { var sinkFirst, sinkSecond, sinkThird, sinkFourth consumertest.TracesSink - tracesFirst := component.NewIDWithName(component.DataTypeTraces, "traces/first") - tracesSecond := component.NewIDWithName(component.DataTypeTraces, "traces/second") - tracesThird := component.NewIDWithName(component.DataTypeTraces, "traces/third") - tracesFourth := component.NewIDWithName(component.DataTypeTraces, "traces/fourth") + tracesFirst := pipeline.NewIDWithName(pipeline.SignalTraces, "traces/first") + tracesSecond := pipeline.NewIDWithName(pipeline.SignalTraces, "traces/second") + tracesThird := pipeline.NewIDWithName(pipeline.SignalTraces, "traces/third") + tracesFourth := pipeline.NewIDWithName(pipeline.SignalTraces, "traces/fourth") cfg := &Config{ - PipelinePriority: [][]component.ID{{tracesFirst}, {tracesSecond}, {tracesThird}, {tracesFourth}}, + PipelinePriority: [][]pipeline.ID{{tracesFirst}, {tracesSecond}, {tracesThird}, {tracesFourth}}, RetryInterval: 50 * time.Millisecond, RetryGap: 10 * time.Millisecond, MaxRetries: 10000, } - router := connector.NewTracesRouter(map[component.ID]consumer.Traces{ + router := connector.NewTracesRouter(map[pipeline.ID]consumer.Traces{ tracesFirst: &sinkFirst, tracesSecond: &sinkSecond, tracesThird: &sinkThird, @@ -174,7 +174,7 @@ func TestFailoverRecovery_MaxRetries(t *testing.T) { }) conn, err := NewFactory().CreateTracesToTraces(context.Background(), - connectortest.NewNopCreateSettings(), cfg, router.(consumer.Traces)) + connectortest.NewNopSettings(), cfg, router.(consumer.Traces)) require.NoError(t, err) @@ -202,7 +202,7 @@ func TestFailoverRecovery_MaxRetries(t *testing.T) { failoverConnector.failover.ModifyConsumerAtIndex(0, consumertest.NewErr(errTracesConsumer)) failoverConnector.failover.ModifyConsumerAtIndex(1, consumertest.NewErr(errTracesConsumer)) - failoverConnector.failover.pS.SetRetryCountToMax(0) + failoverConnector.failover.pS.SetRetryCountToValue(0, cfg.MaxRetries) require.Eventually(t, func() bool { return consumeTracesAndCheckStable(failoverConnector, 2, tr) @@ -211,15 +211,79 @@ func TestFailoverRecovery_MaxRetries(t *testing.T) { failoverConnector.failover.ModifyConsumerAtIndex(0, &sinkFirst) failoverConnector.failover.ModifyConsumerAtIndex(1, &sinkSecond) + // Check that level 0 is skipped because max retry value is hit require.Eventually(t, func() bool { return consumeTracesAndCheckStable(failoverConnector, 1, tr) }, 3*time.Second, 5*time.Millisecond) +} + +func TestFailoverRecovery_MaxRetriesDisabled(t *testing.T) { + var sinkFirst, sinkSecond, sinkThird, sinkFourth consumertest.TracesSink + tracesFirst := pipeline.NewIDWithName(pipeline.SignalTraces, "traces/first") + tracesSecond := pipeline.NewIDWithName(pipeline.SignalTraces, "traces/second") + tracesThird := pipeline.NewIDWithName(pipeline.SignalTraces, "traces/third") + tracesFourth := pipeline.NewIDWithName(pipeline.SignalTraces, "traces/fourth") + + cfg := &Config{ + PipelinePriority: [][]pipeline.ID{{tracesFirst}, {tracesSecond}, {tracesThird}, {tracesFourth}}, + RetryInterval: 50 * time.Millisecond, + RetryGap: 10 * time.Millisecond, + MaxRetries: 0, + } + + router := connector.NewTracesRouter(map[pipeline.ID]consumer.Traces{ + tracesFirst: &sinkFirst, + tracesSecond: &sinkSecond, + tracesThird: &sinkThird, + tracesFourth: &sinkFourth, + }) + + conn, err := NewFactory().CreateTracesToTraces(context.Background(), + connectortest.NewNopSettings(), cfg, router.(consumer.Traces)) + + require.NoError(t, err) + + failoverConnector := conn.(*tracesFailover) + + tr := sampleTrace() + + defer func() { + assert.NoError(t, failoverConnector.Shutdown(context.Background())) + }() + + failoverConnector.failover.ModifyConsumerAtIndex(0, consumertest.NewErr(errTracesConsumer)) + failoverConnector.failover.ModifyConsumerAtIndex(1, consumertest.NewErr(errTracesConsumer)) + + require.Eventually(t, func() bool { + return consumeTracesAndCheckStable(failoverConnector, 2, tr) + }, 3*time.Second, 5*time.Millisecond) + + failoverConnector.failover.ModifyConsumerAtIndex(0, &sinkFirst) + failoverConnector.failover.ModifyConsumerAtIndex(1, &sinkSecond) + require.Eventually(t, func() bool { + return consumeTracesAndCheckStable(failoverConnector, 0, tr) + }, 3*time.Second, 5*time.Millisecond) + + failoverConnector.failover.ModifyConsumerAtIndex(0, consumertest.NewErr(errTracesConsumer)) + failoverConnector.failover.ModifyConsumerAtIndex(1, consumertest.NewErr(errTracesConsumer)) + failoverConnector.failover.pS.SetRetryCountToValue(0, cfg.MaxRetries) + + require.Eventually(t, func() bool { + return consumeTracesAndCheckStable(failoverConnector, 2, tr) + }, 3*time.Second, 5*time.Millisecond) + + failoverConnector.failover.ModifyConsumerAtIndex(0, &sinkFirst) + failoverConnector.failover.ModifyConsumerAtIndex(1, &sinkSecond) + + // Check that still resets to level 0 even though max retry value is hit + require.Eventually(t, func() bool { + return consumeTracesAndCheckStable(failoverConnector, 0, tr) + }, 3*time.Second, 5*time.Millisecond) } func resetConsumers(conn *tracesFailover, consumers ...consumer.Traces) { for i, sink := range consumers { - conn.failover.ModifyConsumerAtIndex(i, sink) } conn.failover.pS.TestSetStableIndex(0) diff --git a/connector/failoverconnector/go.mod b/connector/failoverconnector/go.mod index 13a89551044f..9c3dfd2fbd5a 100644 --- a/connector/failoverconnector/go.mod +++ b/connector/failoverconnector/go.mod @@ -1,54 +1,55 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/connector/failoverconnector -go 1.21.0 +go 1.22.0 require ( - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/connector v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/connector v0.116.0 + go.opentelemetry.io/collector/connector/connectortest v0.116.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/pipeline v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/connector/xconnector v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/connector/failoverconnector/go.sum b/connector/failoverconnector/go.sum index ebb54f65c50f..ca661f0c3e2a 100644 --- a/connector/failoverconnector/go.sum +++ b/connector/failoverconnector/go.sum @@ -1,20 +1,18 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -28,8 +26,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -46,50 +44,56 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/connector v0.102.0 h1:IvAsVfYRxP0ajmKbUovF8qugkcUtHq6RuYNtjcMa63E= -go.opentelemetry.io/collector/connector v0.102.0/go.mod h1:f4M7wZ/9+XtgTE0fivBFH3WlwntaEd0qFFA0giFkdnY= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/connector v0.116.0 h1:0Pz8RAXH1swLeA1fiyGGQWdv0Kemz4mbq+jnmd1TACE= +go.opentelemetry.io/collector/connector v0.116.0/go.mod h1:VQiZ2yW9KhZuF0yjDbvlgrAxm7+o8KQoxHxurQWLjKU= +go.opentelemetry.io/collector/connector/connectortest v0.116.0 h1:MdttvjqdZmp0ewW5IPCEtzzYmCqxrQxsjJ5m6gMVjzA= +go.opentelemetry.io/collector/connector/connectortest v0.116.0/go.mod h1:ko7aPyvAVf6SvRhWGZdPXSyk+7zPmsSCcMq0gYPMMIQ= +go.opentelemetry.io/collector/connector/xconnector v0.116.0 h1:fFJzrRco0g7HMkhnQ+ehlvicFf58vzsCLXnfuHyQM8w= +go.opentelemetry.io/collector/connector/xconnector v0.116.0/go.mod h1:m9oCk32zX6wDciYBpy+qMQkWKtOxb0gAkEUm8+trflY= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 h1:KKFb3u8iLk4V5GYz7eVpw8QgEdob5koX6GNEbaoDQJY= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0/go.mod h1:YyWHUWeSnRmy2CF7kPHpwJ6qkVjufbLZ8PYuY0Ph0o8= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 h1:PFNy+Il/kqPdPL9rhG+1kG63Aauya+FhBKGXoB6ivxU= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0/go.mod h1:bVn9V4TGyeXi58/JDkeXCuKtc+V+qcOoTl8hNpV0qa8= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -105,20 +109,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -127,12 +131,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/connector/failoverconnector/internal/metadata/generated_status.go b/connector/failoverconnector/internal/metadata/generated_status.go index 2cf0f9841943..e5536a36ff18 100644 --- a/connector/failoverconnector/internal/metadata/generated_status.go +++ b/connector/failoverconnector/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("failover") + Type = component.MustNewType("failover") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/connector/failoverconnector" ) const ( diff --git a/connector/failoverconnector/internal/metadata/generated_telemetry.go b/connector/failoverconnector/internal/metadata/generated_telemetry.go deleted file mode 100644 index 0e0b766465e1..000000000000 --- a/connector/failoverconnector/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/failover") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/failover") -} diff --git a/connector/failoverconnector/internal/metadata/generated_telemetry_test.go b/connector/failoverconnector/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index cc7caf7c5be8..000000000000 --- a/connector/failoverconnector/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/failover", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/failover", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/connector/failoverconnector/internal/state/pipeline_selector.go b/connector/failoverconnector/internal/state/pipeline_selector.go index 316af30fad30..08bcedf9bb5f 100644 --- a/connector/failoverconnector/internal/state/pipeline_selector.go +++ b/connector/failoverconnector/internal/state/pipeline_selector.go @@ -87,13 +87,12 @@ func (p *PipelineSelector) setToNextPriorityPipeline(idx int) { // RetryHighPriorityPipelines responsible for single iteration through all higher priority pipelines func (p *PipelineSelector) retryHighPriorityPipelines(ctx context.Context, retryGap time.Duration) { - ticker := time.NewTicker(retryGap) defer ticker.Stop() for i := 0; i < len(p.pipelineRetries); i++ { - if p.maxRetriesUsed(i) { + if p.exceededMaxRetries(i) { continue } select { @@ -111,7 +110,7 @@ func (p *PipelineSelector) retryHighPriorityPipelines(ctx context.Context, retry // checkContinueRetry checks if retry should be suspended if all higher priority levels have exceeded their max retries func (p *PipelineSelector) checkContinueRetry(index int) bool { for i := 0; i < index; i++ { - if p.loadRetryCount(i) < p.constants.MaxRetries { + if p.constants.MaxRetries == 0 || p.loadRetryCount(i) < p.constants.MaxRetries { return true } } @@ -128,11 +127,6 @@ func (p *PipelineSelector) setToStableIndex(idx int) { p.currentIndex.Store(p.stableIndex.Load()) } -// MaxRetriesUsed exported access to maxRetriesUsed -func (p *PipelineSelector) maxRetriesUsed(idx int) bool { - return p.loadRetryCount(idx) >= p.constants.MaxRetries -} - // SetNewStableIndex Update stableIndex to the passed stable index func (p *PipelineSelector) setNewStableIndex(idx int) { p.resetRetryCount(idx) @@ -250,8 +244,8 @@ func (p *PipelineSelector) TestRetryPipelines(ctx context.Context, retryInterval p.enableRetry(ctx, retryInterval, retryGap) } -func (p *PipelineSelector) SetRetryCountToMax(idx int) { - p.pipelineRetries[idx].Store(int32(p.constants.MaxRetries)) +func (p *PipelineSelector) SetRetryCountToValue(idx int, val int) { + p.pipelineRetries[idx].Store(int32(val)) } func (p *PipelineSelector) ResetRetryCount(idx int) { diff --git a/connector/failoverconnector/internal/state/pipeline_selector_test.go b/connector/failoverconnector/internal/state/pipeline_selector_test.go index 7123b3b70496..13e7d06f5364 100644 --- a/connector/failoverconnector/internal/state/pipeline_selector_test.go +++ b/connector/failoverconnector/internal/state/pipeline_selector_test.go @@ -22,8 +22,8 @@ func TestSelectPipeline(t *testing.T) { idx, ch := pS.SelectedPipeline() - require.Equal(t, idx, 0) - require.Equal(t, pS.ChannelIndex(ch), 0) + require.Equal(t, 0, idx) + require.Equal(t, 0, pS.ChannelIndex(ch)) } func TestHandlePipelineError(t *testing.T) { @@ -44,7 +44,7 @@ func TestHandlePipelineError(t *testing.T) { }() idx, ch := pS.SelectedPipeline() - require.Equal(t, idx, 0) + require.Equal(t, 0, idx) ch <- false require.Eventually(t, func() bool { diff --git a/connector/failoverconnector/logs.go b/connector/failoverconnector/logs.go index 540e10ff6175..029aed4714b5 100644 --- a/connector/failoverconnector/logs.go +++ b/connector/failoverconnector/logs.go @@ -63,7 +63,7 @@ func (f *logsFailover) Shutdown(_ context.Context) error { return nil } -func newLogsToLogs(set connector.CreateSettings, cfg component.Config, logs consumer.Logs) (connector.Logs, error) { +func newLogsToLogs(set connector.Settings, cfg component.Config, logs consumer.Logs) (connector.Logs, error) { config := cfg.(*Config) lr, ok := logs.(connector.LogsRouterAndConsumer) if !ok { diff --git a/connector/failoverconnector/logs_test.go b/connector/failoverconnector/logs_test.go index 7039f844d2e9..01522d218812 100644 --- a/connector/failoverconnector/logs_test.go +++ b/connector/failoverconnector/logs_test.go @@ -10,37 +10,37 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/connector" "go.opentelemetry.io/collector/connector/connectortest" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/consumer/consumertest" "go.opentelemetry.io/collector/pdata/plog" + "go.opentelemetry.io/collector/pipeline" ) var errLogsConsumer = errors.New("Error from ConsumeLogs") func TestLogsRegisterConsumers(t *testing.T) { var sinkFirst, sinkSecond, sinkThird consumertest.LogsSink - logsFirst := component.NewIDWithName(component.DataTypeLogs, "logs/first") - logsSecond := component.NewIDWithName(component.DataTypeLogs, "logs/second") - logsThird := component.NewIDWithName(component.DataTypeLogs, "logs/third") + logsFirst := pipeline.NewIDWithName(pipeline.SignalLogs, "logs/first") + logsSecond := pipeline.NewIDWithName(pipeline.SignalLogs, "logs/second") + logsThird := pipeline.NewIDWithName(pipeline.SignalLogs, "logs/third") cfg := &Config{ - PipelinePriority: [][]component.ID{{logsFirst}, {logsSecond}, {logsThird}}, + PipelinePriority: [][]pipeline.ID{{logsFirst}, {logsSecond}, {logsThird}}, RetryInterval: 50 * time.Millisecond, RetryGap: 10 * time.Millisecond, MaxRetries: 10000, } - router := connector.NewLogsRouter(map[component.ID]consumer.Logs{ + router := connector.NewLogsRouter(map[pipeline.ID]consumer.Logs{ logsFirst: &sinkFirst, logsSecond: &sinkSecond, logsThird: &sinkThird, }) conn, err := NewFactory().CreateLogsToLogs(context.Background(), - connectortest.NewNopCreateSettings(), cfg, router.(consumer.Logs)) + connectortest.NewNopSettings(), cfg, router.(consumer.Logs)) failoverConnector := conn.(*logsFailover) defer func() { @@ -62,25 +62,25 @@ func TestLogsRegisterConsumers(t *testing.T) { func TestLogsWithValidFailover(t *testing.T) { var sinkFirst, sinkSecond, sinkThird consumertest.LogsSink - logsFirst := component.NewIDWithName(component.DataTypeLogs, "logs/first") - logsSecond := component.NewIDWithName(component.DataTypeLogs, "logs/second") - logsThird := component.NewIDWithName(component.DataTypeLogs, "logs/third") + logsFirst := pipeline.NewIDWithName(pipeline.SignalLogs, "logs/first") + logsSecond := pipeline.NewIDWithName(pipeline.SignalLogs, "logs/second") + logsThird := pipeline.NewIDWithName(pipeline.SignalLogs, "logs/third") cfg := &Config{ - PipelinePriority: [][]component.ID{{logsFirst}, {logsSecond}, {logsThird}}, + PipelinePriority: [][]pipeline.ID{{logsFirst}, {logsSecond}, {logsThird}}, RetryInterval: 50 * time.Millisecond, RetryGap: 10 * time.Millisecond, MaxRetries: 10000, } - router := connector.NewLogsRouter(map[component.ID]consumer.Logs{ + router := connector.NewLogsRouter(map[pipeline.ID]consumer.Logs{ logsFirst: &sinkFirst, logsSecond: &sinkSecond, logsThird: &sinkThird, }) conn, err := NewFactory().CreateLogsToLogs(context.Background(), - connectortest.NewNopCreateSettings(), cfg, router.(consumer.Logs)) + connectortest.NewNopSettings(), cfg, router.(consumer.Logs)) require.NoError(t, err) @@ -99,25 +99,25 @@ func TestLogsWithValidFailover(t *testing.T) { func TestLogsWithFailoverError(t *testing.T) { var sinkFirst, sinkSecond, sinkThird consumertest.LogsSink - logsFirst := component.NewIDWithName(component.DataTypeLogs, "logs/first") - logsSecond := component.NewIDWithName(component.DataTypeLogs, "logs/second") - logsThird := component.NewIDWithName(component.DataTypeLogs, "logs/third") + logsFirst := pipeline.NewIDWithName(pipeline.SignalLogs, "logs/first") + logsSecond := pipeline.NewIDWithName(pipeline.SignalLogs, "logs/second") + logsThird := pipeline.NewIDWithName(pipeline.SignalLogs, "logs/third") cfg := &Config{ - PipelinePriority: [][]component.ID{{logsFirst}, {logsSecond}, {logsThird}}, + PipelinePriority: [][]pipeline.ID{{logsFirst}, {logsSecond}, {logsThird}}, RetryInterval: 50 * time.Millisecond, RetryGap: 10 * time.Millisecond, MaxRetries: 10000, } - router := connector.NewLogsRouter(map[component.ID]consumer.Logs{ + router := connector.NewLogsRouter(map[pipeline.ID]consumer.Logs{ logsFirst: &sinkFirst, logsSecond: &sinkSecond, logsThird: &sinkThird, }) conn, err := NewFactory().CreateLogsToLogs(context.Background(), - connectortest.NewNopCreateSettings(), cfg, router.(consumer.Logs)) + connectortest.NewNopSettings(), cfg, router.(consumer.Logs)) require.NoError(t, err) diff --git a/connector/failoverconnector/metadata.yaml b/connector/failoverconnector/metadata.yaml index 91cfc3a67e72..3182dac4f07c 100644 --- a/connector/failoverconnector/metadata.yaml +++ b/connector/failoverconnector/metadata.yaml @@ -1,13 +1,12 @@ type: failover -scope_name: otelcol/failover status: class: connector stability: alpha: [traces_to_traces, metrics_to_metrics, logs_to_logs] - distributions: [contrib] + distributions: [contrib, k8s] codeowners: - active: [akats7, djaglowski, fatsheep9146] + active: [akats7, fatsheep9146] tests: skip_lifecycle: true diff --git a/connector/failoverconnector/metrics.go b/connector/failoverconnector/metrics.go index 0e0e42777838..be34029dcae7 100644 --- a/connector/failoverconnector/metrics.go +++ b/connector/failoverconnector/metrics.go @@ -63,7 +63,7 @@ func (f *metricsFailover) Shutdown(_ context.Context) error { return nil } -func newMetricsToMetrics(set connector.CreateSettings, cfg component.Config, metrics consumer.Metrics) (connector.Metrics, error) { +func newMetricsToMetrics(set connector.Settings, cfg component.Config, metrics consumer.Metrics) (connector.Metrics, error) { config := cfg.(*Config) mr, ok := metrics.(connector.MetricsRouterAndConsumer) if !ok { diff --git a/connector/failoverconnector/metrics_test.go b/connector/failoverconnector/metrics_test.go index 179ab8f3f35b..fab5e4199ef3 100644 --- a/connector/failoverconnector/metrics_test.go +++ b/connector/failoverconnector/metrics_test.go @@ -10,37 +10,37 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/connector" "go.opentelemetry.io/collector/connector/connectortest" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/consumer/consumertest" "go.opentelemetry.io/collector/pdata/pmetric" + "go.opentelemetry.io/collector/pipeline" ) var errMetricsConsumer = errors.New("Error from ConsumeMetrics") func TestMetricsRegisterConsumers(t *testing.T) { var sinkFirst, sinkSecond, sinkThird consumertest.MetricsSink - metricsFirst := component.NewIDWithName(component.DataTypeMetrics, "metrics/first") - metricsSecond := component.NewIDWithName(component.DataTypeMetrics, "metrics/second") - metricsThird := component.NewIDWithName(component.DataTypeMetrics, "metrics/third") + metricsFirst := pipeline.NewIDWithName(pipeline.SignalMetrics, "metrics/first") + metricsSecond := pipeline.NewIDWithName(pipeline.SignalMetrics, "metrics/second") + metricsThird := pipeline.NewIDWithName(pipeline.SignalMetrics, "metrics/third") cfg := &Config{ - PipelinePriority: [][]component.ID{{metricsFirst}, {metricsSecond}, {metricsThird}}, + PipelinePriority: [][]pipeline.ID{{metricsFirst}, {metricsSecond}, {metricsThird}}, RetryInterval: 50 * time.Millisecond, RetryGap: 10 * time.Millisecond, MaxRetries: 10000, } - router := connector.NewMetricsRouter(map[component.ID]consumer.Metrics{ + router := connector.NewMetricsRouter(map[pipeline.ID]consumer.Metrics{ metricsFirst: &sinkFirst, metricsSecond: &sinkSecond, metricsThird: &sinkThird, }) conn, err := NewFactory().CreateMetricsToMetrics(context.Background(), - connectortest.NewNopCreateSettings(), cfg, router.(consumer.Metrics)) + connectortest.NewNopSettings(), cfg, router.(consumer.Metrics)) failoverConnector := conn.(*metricsFailover) defer func() { @@ -62,25 +62,25 @@ func TestMetricsRegisterConsumers(t *testing.T) { func TestMetricsWithValidFailover(t *testing.T) { var sinkFirst, sinkSecond, sinkThird consumertest.MetricsSink - metricsFirst := component.NewIDWithName(component.DataTypeMetrics, "metrics/first") - metricsSecond := component.NewIDWithName(component.DataTypeMetrics, "metrics/second") - metricsThird := component.NewIDWithName(component.DataTypeMetrics, "metrics/third") + metricsFirst := pipeline.NewIDWithName(pipeline.SignalMetrics, "metrics/first") + metricsSecond := pipeline.NewIDWithName(pipeline.SignalMetrics, "metrics/second") + metricsThird := pipeline.NewIDWithName(pipeline.SignalMetrics, "metrics/third") cfg := &Config{ - PipelinePriority: [][]component.ID{{metricsFirst}, {metricsSecond}, {metricsThird}}, + PipelinePriority: [][]pipeline.ID{{metricsFirst}, {metricsSecond}, {metricsThird}}, RetryInterval: 50 * time.Millisecond, RetryGap: 10 * time.Millisecond, MaxRetries: 10000, } - router := connector.NewMetricsRouter(map[component.ID]consumer.Metrics{ + router := connector.NewMetricsRouter(map[pipeline.ID]consumer.Metrics{ metricsFirst: &sinkFirst, metricsSecond: &sinkSecond, metricsThird: &sinkThird, }) conn, err := NewFactory().CreateMetricsToMetrics(context.Background(), - connectortest.NewNopCreateSettings(), cfg, router.(consumer.Metrics)) + connectortest.NewNopSettings(), cfg, router.(consumer.Metrics)) require.NoError(t, err) @@ -99,25 +99,25 @@ func TestMetricsWithValidFailover(t *testing.T) { func TestMetricsWithFailoverError(t *testing.T) { var sinkFirst, sinkSecond, sinkThird consumertest.MetricsSink - metricsFirst := component.NewIDWithName(component.DataTypeMetrics, "metrics/first") - metricsSecond := component.NewIDWithName(component.DataTypeMetrics, "metrics/second") - metricsThird := component.NewIDWithName(component.DataTypeMetrics, "metrics/third") + metricsFirst := pipeline.NewIDWithName(pipeline.SignalMetrics, "metrics/first") + metricsSecond := pipeline.NewIDWithName(pipeline.SignalMetrics, "metrics/second") + metricsThird := pipeline.NewIDWithName(pipeline.SignalMetrics, "metrics/third") cfg := &Config{ - PipelinePriority: [][]component.ID{{metricsFirst}, {metricsSecond}, {metricsThird}}, + PipelinePriority: [][]pipeline.ID{{metricsFirst}, {metricsSecond}, {metricsThird}}, RetryInterval: 50 * time.Millisecond, RetryGap: 10 * time.Millisecond, MaxRetries: 10000, } - router := connector.NewMetricsRouter(map[component.ID]consumer.Metrics{ + router := connector.NewMetricsRouter(map[pipeline.ID]consumer.Metrics{ metricsFirst: &sinkFirst, metricsSecond: &sinkSecond, metricsThird: &sinkThird, }) conn, err := NewFactory().CreateMetricsToMetrics(context.Background(), - connectortest.NewNopCreateSettings(), cfg, router.(consumer.Metrics)) + connectortest.NewNopSettings(), cfg, router.(consumer.Metrics)) require.NoError(t, err) diff --git a/connector/failoverconnector/testdata/config.yaml b/connector/failoverconnector/testdata/config.yaml index f221350848a9..ca75875bb994 100644 --- a/connector/failoverconnector/testdata/config.yaml +++ b/connector/failoverconnector/testdata/config.yaml @@ -1,7 +1,8 @@ failover: failover/default: - priority_levels: [traces] + priority_levels: + - [traces] failover/full: priority_levels: diff --git a/connector/failoverconnector/traces.go b/connector/failoverconnector/traces.go index 957bc8eb12f1..73f02189695c 100644 --- a/connector/failoverconnector/traces.go +++ b/connector/failoverconnector/traces.go @@ -63,7 +63,7 @@ func (f *tracesFailover) Shutdown(_ context.Context) error { return nil } -func newTracesToTraces(set connector.CreateSettings, cfg component.Config, traces consumer.Traces) (connector.Traces, error) { +func newTracesToTraces(set connector.Settings, cfg component.Config, traces consumer.Traces) (connector.Traces, error) { config := cfg.(*Config) tr, ok := traces.(connector.TracesRouterAndConsumer) if !ok { diff --git a/connector/failoverconnector/traces_test.go b/connector/failoverconnector/traces_test.go index 7b2d02f6cb00..66b80e61f374 100644 --- a/connector/failoverconnector/traces_test.go +++ b/connector/failoverconnector/traces_test.go @@ -10,37 +10,37 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/connector" "go.opentelemetry.io/collector/connector/connectortest" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/consumer/consumertest" "go.opentelemetry.io/collector/pdata/ptrace" + "go.opentelemetry.io/collector/pipeline" ) var errTracesConsumer = errors.New("Error from ConsumeTraces") func TestTracesRegisterConsumers(t *testing.T) { var sinkFirst, sinkSecond, sinkThird consumertest.TracesSink - tracesFirst := component.NewIDWithName(component.DataTypeTraces, "traces/first") - tracesSecond := component.NewIDWithName(component.DataTypeTraces, "traces/second") - tracesThird := component.NewIDWithName(component.DataTypeTraces, "traces/third") + tracesFirst := pipeline.NewIDWithName(pipeline.SignalTraces, "traces/first") + tracesSecond := pipeline.NewIDWithName(pipeline.SignalTraces, "traces/second") + tracesThird := pipeline.NewIDWithName(pipeline.SignalTraces, "traces/third") cfg := &Config{ - PipelinePriority: [][]component.ID{{tracesFirst}, {tracesSecond}, {tracesThird}}, + PipelinePriority: [][]pipeline.ID{{tracesFirst}, {tracesSecond}, {tracesThird}}, RetryInterval: 25 * time.Millisecond, RetryGap: 5 * time.Millisecond, MaxRetries: 10000, } - router := connector.NewTracesRouter(map[component.ID]consumer.Traces{ + router := connector.NewTracesRouter(map[pipeline.ID]consumer.Traces{ tracesFirst: &sinkFirst, tracesSecond: &sinkSecond, tracesThird: &sinkThird, }) conn, err := NewFactory().CreateTracesToTraces(context.Background(), - connectortest.NewNopCreateSettings(), cfg, router.(consumer.Traces)) + connectortest.NewNopSettings(), cfg, router.(consumer.Traces)) failoverConnector := conn.(*tracesFailover) defer func() { @@ -63,26 +63,26 @@ func TestTracesRegisterConsumers(t *testing.T) { func TestTracesWithValidFailover(t *testing.T) { var sinkSecond, sinkThird consumertest.TracesSink - tracesFirst := component.NewIDWithName(component.DataTypeTraces, "traces/first") - tracesSecond := component.NewIDWithName(component.DataTypeTraces, "traces/second") - tracesThird := component.NewIDWithName(component.DataTypeTraces, "traces/third") + tracesFirst := pipeline.NewIDWithName(pipeline.SignalTraces, "traces/first") + tracesSecond := pipeline.NewIDWithName(pipeline.SignalTraces, "traces/second") + tracesThird := pipeline.NewIDWithName(pipeline.SignalTraces, "traces/third") noOp := consumertest.NewNop() cfg := &Config{ - PipelinePriority: [][]component.ID{{tracesFirst}, {tracesSecond}, {tracesThird}}, + PipelinePriority: [][]pipeline.ID{{tracesFirst}, {tracesSecond}, {tracesThird}}, RetryInterval: 50 * time.Millisecond, RetryGap: 10 * time.Millisecond, MaxRetries: 10000, } - router := connector.NewTracesRouter(map[component.ID]consumer.Traces{ + router := connector.NewTracesRouter(map[pipeline.ID]consumer.Traces{ tracesFirst: noOp, tracesSecond: &sinkSecond, tracesThird: &sinkThird, }) conn, err := NewFactory().CreateTracesToTraces(context.Background(), - connectortest.NewNopCreateSettings(), cfg, router.(consumer.Traces)) + connectortest.NewNopSettings(), cfg, router.(consumer.Traces)) require.NoError(t, err) @@ -101,26 +101,26 @@ func TestTracesWithValidFailover(t *testing.T) { func TestTracesWithFailoverError(t *testing.T) { var sinkSecond, sinkThird consumertest.TracesSink - tracesFirst := component.NewIDWithName(component.DataTypeTraces, "traces/first") - tracesSecond := component.NewIDWithName(component.DataTypeTraces, "traces/second") - tracesThird := component.NewIDWithName(component.DataTypeTraces, "traces/third") + tracesFirst := pipeline.NewIDWithName(pipeline.SignalTraces, "traces/first") + tracesSecond := pipeline.NewIDWithName(pipeline.SignalTraces, "traces/second") + tracesThird := pipeline.NewIDWithName(pipeline.SignalTraces, "traces/third") noOp := consumertest.NewNop() cfg := &Config{ - PipelinePriority: [][]component.ID{{tracesFirst}, {tracesSecond}, {tracesThird}}, + PipelinePriority: [][]pipeline.ID{{tracesFirst}, {tracesSecond}, {tracesThird}}, RetryInterval: 50 * time.Millisecond, RetryGap: 10 * time.Millisecond, MaxRetries: 10000, } - router := connector.NewTracesRouter(map[component.ID]consumer.Traces{ + router := connector.NewTracesRouter(map[pipeline.ID]consumer.Traces{ tracesFirst: noOp, tracesSecond: &sinkSecond, tracesThird: &sinkThird, }) conn, err := NewFactory().CreateTracesToTraces(context.Background(), - connectortest.NewNopCreateSettings(), cfg, router.(consumer.Traces)) + connectortest.NewNopSettings(), cfg, router.(consumer.Traces)) require.NoError(t, err) diff --git a/connector/grafanacloudconnector/README.md b/connector/grafanacloudconnector/README.md index 41c415c8d770..6bf11c3f4528 100644 --- a/connector/grafanacloudconnector/README.md +++ b/connector/grafanacloudconnector/README.md @@ -5,9 +5,9 @@ | ------------- |-----------| | Distributions | [contrib] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aconnector%2Fgrafanacloud%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aconnector%2Fgrafanacloud) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aconnector%2Fgrafanacloud%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aconnector%2Fgrafanacloud) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@jpkrohling](https://www.github.com/jpkrohling), [@rlankfo](https://www.github.com/rlankfo), [@jcreixell](https://www.github.com/jcreixell) \| Seeking more code owners! | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@rlankfo](https://www.github.com/rlankfo), [@jcreixell](https://www.github.com/jcreixell) | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib ## Supported Pipeline Types @@ -18,7 +18,7 @@ [Exporter Pipeline Type]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md#exporter-pipeline-type [Receiver Pipeline Type]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md#receiver-pipeline-type -[Stability Level]: https://github.com/open-telemetry/opentelemetry-collector#stability-levels +[Stability Level]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#stability-levels ## Overview diff --git a/connector/grafanacloudconnector/config_test.go b/connector/grafanacloudconnector/config_test.go index 9c0a4a6792d4..0a84a7225b5f 100644 --- a/connector/grafanacloudconnector/config_test.go +++ b/connector/grafanacloudconnector/config_test.go @@ -43,7 +43,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, tc.name).String()) assert.NilError(t, err) - assert.NilError(t, component.UnmarshalConfig(sub, cfg)) + assert.NilError(t, sub.Unmarshal(cfg)) assert.DeepEqual(t, tc.expect, cfg) }) } diff --git a/connector/grafanacloudconnector/connector.go b/connector/grafanacloudconnector/connector.go index ac0056c884dd..b71860a1028e 100644 --- a/connector/grafanacloudconnector/connector.go +++ b/connector/grafanacloudconnector/connector.go @@ -12,7 +12,6 @@ import ( "go.opentelemetry.io/collector/connector" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/pdata/ptrace" - "go.opentelemetry.io/otel/metric" "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/connector/grafanacloudconnector/internal/metadata" @@ -36,40 +35,13 @@ type connectorImp struct { metricsConsumer consumer.Metrics hostMetrics *hostMetrics - metricHostCount metric.Int64ObservableGauge - metricFlushCount metric.Int64Counter - metricDatapointCount metric.Int64Counter + telemetryBuilder *metadata.TelemetryBuilder } func newConnector(logger *zap.Logger, set component.TelemetrySettings, config component.Config) (*connectorImp, error) { hm := newHostMetrics() - mHostCount, err := metadata.Meter(set).Int64ObservableGauge( - "grafanacloud_host_count", - metric.WithDescription("Number of unique hosts"), - metric.WithUnit("1"), - metric.WithInt64Callback(func(_ context.Context, result metric.Int64Observer) error { - result.Observe(int64(hm.count())) - return nil - }), - ) - - if err != nil { - return nil, err - } - - mFlushCount, err := metadata.Meter(set).Int64Counter( - "grafanacloud_flush_count", - metric.WithDescription("Number of metrics flushes"), - metric.WithUnit("1"), - ) - if err != nil { - return nil, err - } - - mDatapointCount, err := metadata.Meter(set).Int64Counter( - "grafanacloud_datapoint_count", - metric.WithDescription("Number of datapoints sent to Grafana Cloud"), - metric.WithUnit("1"), + telemetryBuilder, err := metadata.NewTelemetryBuilder(set, + metadata.WithGrafanacloudHostCountCallback(func() int64 { return int64(hm.count()) }), ) if err != nil { return nil, err @@ -77,13 +49,11 @@ func newConnector(logger *zap.Logger, set component.TelemetrySettings, config co cfg := config.(*Config) return &connectorImp{ - config: *cfg, - logger: logger, - done: make(chan struct{}), - hostMetrics: hm, - metricHostCount: mHostCount, - metricFlushCount: mFlushCount, - metricDatapointCount: mDatapointCount, + config: *cfg, + logger: logger, + done: make(chan struct{}), + hostMetrics: hm, + telemetryBuilder: telemetryBuilder, }, nil } @@ -155,9 +125,9 @@ func (c *connectorImp) flush(ctx context.Context) error { if count > 0 { c.hostMetrics.reset() c.logger.Debug("Flushing metrics", zap.Int("count", count)) - c.metricDatapointCount.Add(ctx, int64(metrics.DataPointCount())) + c.telemetryBuilder.GrafanacloudDatapointCount.Add(ctx, int64(metrics.DataPointCount())) err = c.metricsConsumer.ConsumeMetrics(ctx, *metrics) } - c.metricFlushCount.Add(ctx, int64(1)) + c.telemetryBuilder.GrafanacloudFlushCount.Add(ctx, int64(1)) return err } diff --git a/connector/grafanacloudconnector/connector_test.go b/connector/grafanacloudconnector/connector_test.go index 1c191680e13b..32272ac306d7 100644 --- a/connector/grafanacloudconnector/connector_test.go +++ b/connector/grafanacloudconnector/connector_test.go @@ -46,7 +46,7 @@ func TestNewConnector(t *testing.T) { cfg.MetricsFlushInterval = *tc.metricsFlushInterval } - c, err := factory.CreateTracesToMetrics(context.Background(), connectortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + c, err := factory.CreateTracesToMetrics(context.Background(), connectortest.NewNopSettings(), cfg, consumertest.NewNop()) imp := c.(*connectorImp) assert.NilError(t, err) @@ -76,7 +76,7 @@ func TestConsumeTraces(t *testing.T) { cfg.MetricsFlushInterval = 50 * time.Millisecond sink := &consumertest.MetricsSink{} - c, err := factory.CreateTracesToMetrics(context.Background(), connectortest.NewNopCreateSettings(), cfg, sink) + c, err := factory.CreateTracesToMetrics(context.Background(), connectortest.NewNopSettings(), cfg, sink) assert.NilError(t, err) ctx := context.Background() diff --git a/connector/grafanacloudconnector/documentation.md b/connector/grafanacloudconnector/documentation.md new file mode 100644 index 000000000000..cd959c9e6175 --- /dev/null +++ b/connector/grafanacloudconnector/documentation.md @@ -0,0 +1,31 @@ +[comment]: <> (Code generated by mdatagen. DO NOT EDIT.) + +# grafanacloud + +## Internal Telemetry + +The following telemetry is emitted by this component. + +### otelcol_grafanacloud_datapoint_count + +Number of datapoints sent to Grafana Cloud + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| 1 | Sum | Int | true | + +### otelcol_grafanacloud_flush_count + +Number of metrics flushes + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| 1 | Sum | Int | true | + +### otelcol_grafanacloud_host_count + +Number of unique hosts + +| Unit | Metric Type | Value Type | +| ---- | ----------- | ---------- | +| 1 | Gauge | Int | diff --git a/connector/grafanacloudconnector/factory.go b/connector/grafanacloudconnector/factory.go index d2bac2b00dac..945a43a35710 100644 --- a/connector/grafanacloudconnector/factory.go +++ b/connector/grafanacloudconnector/factory.go @@ -29,7 +29,7 @@ func createDefaultConfig() component.Config { } } -func createTracesToMetricsConnector(_ context.Context, params connector.CreateSettings, cfg component.Config, next consumer.Metrics) (connector.Traces, error) { +func createTracesToMetricsConnector(_ context.Context, params connector.Settings, cfg component.Config, next consumer.Metrics) (connector.Traces, error) { c, err := newConnector(params.Logger, params.TelemetrySettings, cfg) if err != nil { return nil, err diff --git a/connector/grafanacloudconnector/generated_component_telemetry_test.go b/connector/grafanacloudconnector/generated_component_telemetry_test.go new file mode 100644 index 000000000000..b118839d199b --- /dev/null +++ b/connector/grafanacloudconnector/generated_component_telemetry_test.go @@ -0,0 +1,84 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package grafanacloudconnector + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + sdkmetric "go.opentelemetry.io/otel/sdk/metric" + "go.opentelemetry.io/otel/sdk/metric/metricdata" + "go.opentelemetry.io/otel/sdk/metric/metricdata/metricdatatest" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/config/configtelemetry" + "go.opentelemetry.io/collector/connector" + "go.opentelemetry.io/collector/connector/connectortest" +) + +type componentTestTelemetry struct { + reader *sdkmetric.ManualReader + meterProvider *sdkmetric.MeterProvider +} + +func (tt *componentTestTelemetry) NewSettings() connector.Settings { + set := connectortest.NewNopSettings() + set.ID = component.NewID(component.MustNewType("grafanacloud")) + set.TelemetrySettings = tt.newTelemetrySettings() + return set +} + +func (tt *componentTestTelemetry) newTelemetrySettings() component.TelemetrySettings { + set := componenttest.NewNopTelemetrySettings() + set.MeterProvider = tt.meterProvider + set.MetricsLevel = configtelemetry.LevelDetailed + return set +} + +func setupTestTelemetry() componentTestTelemetry { + reader := sdkmetric.NewManualReader() + return componentTestTelemetry{ + reader: reader, + meterProvider: sdkmetric.NewMeterProvider(sdkmetric.WithReader(reader)), + } +} + +func (tt *componentTestTelemetry) assertMetrics(t *testing.T, expected []metricdata.Metrics) { + var md metricdata.ResourceMetrics + require.NoError(t, tt.reader.Collect(context.Background(), &md)) + // ensure all required metrics are present + for _, want := range expected { + got := tt.getMetric(want.Name, md) + metricdatatest.AssertEqual(t, want, got, metricdatatest.IgnoreTimestamp()) + } + + // ensure no additional metrics are emitted + require.Equal(t, len(expected), tt.len(md)) +} + +func (tt *componentTestTelemetry) getMetric(name string, got metricdata.ResourceMetrics) metricdata.Metrics { + for _, sm := range got.ScopeMetrics { + for _, m := range sm.Metrics { + if m.Name == name { + return m + } + } + } + + return metricdata.Metrics{} +} + +func (tt *componentTestTelemetry) len(got metricdata.ResourceMetrics) int { + metricsCount := 0 + for _, sm := range got.ScopeMetrics { + metricsCount += len(sm.Metrics) + } + + return metricsCount +} + +func (tt *componentTestTelemetry) Shutdown(ctx context.Context) error { + return tt.meterProvider.Shutdown(ctx) +} diff --git a/connector/grafanacloudconnector/generated_component_test.go b/connector/grafanacloudconnector/generated_component_test.go index 49e14f9b716d..1c6c45f74bda 100644 --- a/connector/grafanacloudconnector/generated_component_test.go +++ b/connector/grafanacloudconnector/generated_component_test.go @@ -14,6 +14,7 @@ import ( "go.opentelemetry.io/collector/connector/connectortest" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/consumer/consumertest" + "go.opentelemetry.io/collector/pipeline" ) func TestComponentFactoryType(t *testing.T) { @@ -29,13 +30,13 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set connector.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) }{ { name: "traces_to_metrics", - createFn: func(ctx context.Context, set connector.CreateSettings, cfg component.Config) (component.Component, error) { - router := connector.NewMetricsRouter(map[component.ID]consumer.Metrics{component.NewID(component.DataTypeMetrics): consumertest.NewNop()}) + createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) { + router := connector.NewMetricsRouter(map[pipeline.ID]consumer.Metrics{pipeline.NewID(pipeline.SignalMetrics): consumertest.NewNop()}) return factory.CreateTracesToMetrics(ctx, set, cfg, router) }, }, @@ -48,21 +49,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), connectortest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), connectortest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - firstConnector, err := test.createFn(context.Background(), connectortest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + firstConnector, err := tt.createFn(context.Background(), connectortest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() require.NoError(t, err) require.NoError(t, firstConnector.Start(context.Background(), host)) require.NoError(t, firstConnector.Shutdown(context.Background())) - secondConnector, err := test.createFn(context.Background(), connectortest.NewNopCreateSettings(), cfg) + secondConnector, err := tt.createFn(context.Background(), connectortest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, secondConnector.Start(context.Background(), host)) require.NoError(t, secondConnector.Shutdown(context.Background())) diff --git a/connector/grafanacloudconnector/go.mod b/connector/grafanacloudconnector/go.mod index 86ff4781e58c..77e9d25f1271 100644 --- a/connector/grafanacloudconnector/go.mod +++ b/connector/grafanacloudconnector/go.mod @@ -1,57 +1,58 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/connector/grafanacloudconnector -go 1.21.0 +go 1.22.0 require ( - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/connector v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/connector v0.116.0 + go.opentelemetry.io/collector/connector/connectortest v0.116.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/pipeline v0.116.0 + go.opentelemetry.io/otel/metric v1.32.0 + go.opentelemetry.io/otel/sdk/metric v1.32.0 + go.opentelemetry.io/otel/trace v1.32.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 gotest.tools v2.2.0+incompatible ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/uuid v1.6.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/connector/xconnector v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/connector/grafanacloudconnector/go.sum b/connector/grafanacloudconnector/go.sum index 3bdcda5d6ff3..2eac67203ce2 100644 --- a/connector/grafanacloudconnector/go.sum +++ b/connector/grafanacloudconnector/go.sum @@ -1,19 +1,17 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -27,8 +25,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -46,50 +44,56 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/connector v0.102.0 h1:IvAsVfYRxP0ajmKbUovF8qugkcUtHq6RuYNtjcMa63E= -go.opentelemetry.io/collector/connector v0.102.0/go.mod h1:f4M7wZ/9+XtgTE0fivBFH3WlwntaEd0qFFA0giFkdnY= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/connector v0.116.0 h1:0Pz8RAXH1swLeA1fiyGGQWdv0Kemz4mbq+jnmd1TACE= +go.opentelemetry.io/collector/connector v0.116.0/go.mod h1:VQiZ2yW9KhZuF0yjDbvlgrAxm7+o8KQoxHxurQWLjKU= +go.opentelemetry.io/collector/connector/connectortest v0.116.0 h1:MdttvjqdZmp0ewW5IPCEtzzYmCqxrQxsjJ5m6gMVjzA= +go.opentelemetry.io/collector/connector/connectortest v0.116.0/go.mod h1:ko7aPyvAVf6SvRhWGZdPXSyk+7zPmsSCcMq0gYPMMIQ= +go.opentelemetry.io/collector/connector/xconnector v0.116.0 h1:fFJzrRco0g7HMkhnQ+ehlvicFf58vzsCLXnfuHyQM8w= +go.opentelemetry.io/collector/connector/xconnector v0.116.0/go.mod h1:m9oCk32zX6wDciYBpy+qMQkWKtOxb0gAkEUm8+trflY= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 h1:KKFb3u8iLk4V5GYz7eVpw8QgEdob5koX6GNEbaoDQJY= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0/go.mod h1:YyWHUWeSnRmy2CF7kPHpwJ6qkVjufbLZ8PYuY0Ph0o8= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 h1:PFNy+Il/kqPdPL9rhG+1kG63Aauya+FhBKGXoB6ivxU= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0/go.mod h1:bVn9V4TGyeXi58/JDkeXCuKtc+V+qcOoTl8hNpV0qa8= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -105,20 +109,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -127,12 +131,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/connector/grafanacloudconnector/internal/metadata/generated_status.go b/connector/grafanacloudconnector/internal/metadata/generated_status.go index 76a21312c24a..dedfab136802 100644 --- a/connector/grafanacloudconnector/internal/metadata/generated_status.go +++ b/connector/grafanacloudconnector/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("grafanacloud") + Type = component.MustNewType("grafanacloud") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/connector/grafanacloudconnector" ) const ( diff --git a/connector/grafanacloudconnector/internal/metadata/generated_telemetry.go b/connector/grafanacloudconnector/internal/metadata/generated_telemetry.go index 572ca57b285d..5733800b40ca 100644 --- a/connector/grafanacloudconnector/internal/metadata/generated_telemetry.go +++ b/connector/grafanacloudconnector/internal/metadata/generated_telemetry.go @@ -3,15 +3,91 @@ package metadata import ( - "go.opentelemetry.io/collector/component" + "context" + "errors" + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/metric/noop" "go.opentelemetry.io/otel/trace" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configtelemetry" ) func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/grafanacloud") + return settings.MeterProvider.Meter("github.com/open-telemetry/opentelemetry-collector-contrib/connector/grafanacloudconnector") } func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/grafanacloud") + return settings.TracerProvider.Tracer("github.com/open-telemetry/opentelemetry-collector-contrib/connector/grafanacloudconnector") +} + +// TelemetryBuilder provides an interface for components to report telemetry +// as defined in metadata and user config. +type TelemetryBuilder struct { + meter metric.Meter + GrafanacloudDatapointCount metric.Int64Counter + GrafanacloudFlushCount metric.Int64Counter + GrafanacloudHostCount metric.Int64ObservableGauge + observeGrafanacloudHostCount func(context.Context, metric.Observer) error +} + +// TelemetryBuilderOption applies changes to default builder. +type TelemetryBuilderOption interface { + apply(*TelemetryBuilder) +} + +type telemetryBuilderOptionFunc func(mb *TelemetryBuilder) + +func (tbof telemetryBuilderOptionFunc) apply(mb *TelemetryBuilder) { + tbof(mb) +} + +// WithGrafanacloudHostCountCallback sets callback for observable GrafanacloudHostCount metric. +func WithGrafanacloudHostCountCallback(cb func() int64, opts ...metric.ObserveOption) TelemetryBuilderOption { + return telemetryBuilderOptionFunc(func(builder *TelemetryBuilder) { + builder.observeGrafanacloudHostCount = func(_ context.Context, o metric.Observer) error { + o.ObserveInt64(builder.GrafanacloudHostCount, cb(), opts...) + return nil + } + }) +} + +// NewTelemetryBuilder provides a struct with methods to update all internal telemetry +// for a component +func NewTelemetryBuilder(settings component.TelemetrySettings, options ...TelemetryBuilderOption) (*TelemetryBuilder, error) { + builder := TelemetryBuilder{} + for _, op := range options { + op.apply(&builder) + } + builder.meter = Meter(settings) + var err, errs error + builder.GrafanacloudDatapointCount, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_grafanacloud_datapoint_count", + metric.WithDescription("Number of datapoints sent to Grafana Cloud"), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + builder.GrafanacloudFlushCount, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_grafanacloud_flush_count", + metric.WithDescription("Number of metrics flushes"), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + builder.GrafanacloudHostCount, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64ObservableGauge( + "otelcol_grafanacloud_host_count", + metric.WithDescription("Number of unique hosts"), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + _, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).RegisterCallback(builder.observeGrafanacloudHostCount, builder.GrafanacloudHostCount) + errs = errors.Join(errs, err) + return &builder, errs +} + +func getLeveledMeter(meter metric.Meter, cfgLevel, srvLevel configtelemetry.Level) metric.Meter { + if cfgLevel <= srvLevel { + return meter + } + return noop.Meter{} } diff --git a/connector/grafanacloudconnector/internal/metadata/generated_telemetry_test.go b/connector/grafanacloudconnector/internal/metadata/generated_telemetry_test.go index 020c5c37b2cd..dacf9b2ea200 100644 --- a/connector/grafanacloudconnector/internal/metadata/generated_telemetry_test.go +++ b/connector/grafanacloudconnector/internal/metadata/generated_telemetry_test.go @@ -14,6 +14,7 @@ import ( nooptrace "go.opentelemetry.io/otel/trace/noop" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" ) type mockMeter struct { @@ -49,15 +50,25 @@ func TestProviders(t *testing.T) { meter := Meter(set) if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/grafanacloud", m.name) + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/connector/grafanacloudconnector", m.name) } else { require.Fail(t, "returned Meter not mockMeter") } tracer := Tracer(set) if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/grafanacloud", m.name) + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/connector/grafanacloudconnector", m.name) } else { require.Fail(t, "returned Meter not mockTracer") } } + +func TestNewTelemetryBuilder(t *testing.T) { + set := componenttest.NewNopTelemetrySettings() + applied := false + _, err := NewTelemetryBuilder(set, telemetryBuilderOptionFunc(func(b *TelemetryBuilder) { + applied = true + })) + require.NoError(t, err) + require.True(t, applied) +} diff --git a/connector/grafanacloudconnector/metadata.yaml b/connector/grafanacloudconnector/metadata.yaml index df5a33ad6cc2..91a34a2e87a5 100644 --- a/connector/grafanacloudconnector/metadata.yaml +++ b/connector/grafanacloudconnector/metadata.yaml @@ -1,5 +1,4 @@ type: grafanacloud -scope_name: otelcol/grafanacloud status: class: connector @@ -7,9 +6,33 @@ status: alpha: [traces_to_metrics] distributions: [contrib] codeowners: - active: [jpkrohling, rlankfo, jcreixell] + active: [rlankfo, jcreixell] emeritus: [] - seeking_new: true + seeking_new: false tests: config: + +telemetry: + metrics: + grafanacloud_host_count: + description: Number of unique hosts + unit: "1" + enabled: true + gauge: + value_type: int + async: true + grafanacloud_flush_count: + description: Number of metrics flushes + unit: "1" + enabled: true + sum: + value_type: int + monotonic: true + grafanacloud_datapoint_count: + description: Number of datapoints sent to Grafana Cloud + unit: "1" + enabled: true + sum: + value_type: int + monotonic: true diff --git a/cmd/configschema/Makefile b/connector/otlpjsonconnector/Makefile similarity index 100% rename from cmd/configschema/Makefile rename to connector/otlpjsonconnector/Makefile diff --git a/connector/otlpjsonconnector/README.md b/connector/otlpjsonconnector/README.md new file mode 100644 index 000000000000..e96b5cd16cf0 --- /dev/null +++ b/connector/otlpjsonconnector/README.md @@ -0,0 +1,69 @@ +# otlpjson Connector + + +| Status | | +| ------------- |-----------| +| Distributions | [contrib], [k8s] | +| Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aconnector%2Fotlpjson%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aconnector%2Fotlpjson) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aconnector%2Fotlpjson%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aconnector%2Fotlpjson) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@djaglowski](https://www.github.com/djaglowski), [@ChrsMark](https://www.github.com/ChrsMark) | + +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha +[contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s + +## Supported Pipeline Types + +| [Exporter Pipeline Type] | [Receiver Pipeline Type] | [Stability Level] | +| ------------------------ | ------------------------ | ----------------- | +| logs | metrics | [alpha] | +| logs | traces | [alpha] | +| logs | logs | [alpha] | + +[Exporter Pipeline Type]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md#exporter-pipeline-type +[Receiver Pipeline Type]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md#receiver-pipeline-type +[Stability Level]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#stability-levels + + +Allows to extract otlpjson data from incoming Logs and specifically the `Body` field. +The data is written in +[Protobuf JSON +encoding](https://developers.google.com/protocol-buffers/docs/proto3#json) +using [OpenTelemetry +protocol](https://github.com/open-telemetry/opentelemetry-proto). + +## Configuration + +#### Configuration Example: + +```yaml +receivers: + filelog: + include: + - /var/log/foo.log + +exporters: + debug: + +connectors: + otlpjson: + +service: + pipelines: + logs/raw: + receivers: [filelog] + exporters: [otlpjson] + metrics/otlp: + receivers: [otlpjson] + exporters: [debug] + logs/otlp: + receivers: [otlpjson] + exporters: [debug] + traces/otlp: + receivers: [otlpjson] + exporters: [debug] +``` + +[Connectors README]:https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md +[Exporter Pipeline Type]:https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md#exporter-pipeline-type +[Receiver Pipeline Type]:https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md#receiver-pipeline-type +[contrib]:https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib \ No newline at end of file diff --git a/connector/otlpjsonconnector/config.go b/connector/otlpjsonconnector/config.go new file mode 100644 index 000000000000..509a2039283c --- /dev/null +++ b/connector/otlpjsonconnector/config.go @@ -0,0 +1,6 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package otlpjsonconnector // import "github.com/open-telemetry/opentelemetry-collector-contrib/connector/otlpjsonconnector" + +type Config struct{} diff --git a/connector/otlpjsonconnector/connector_test.go b/connector/otlpjsonconnector/connector_test.go new file mode 100644 index 000000000000..cd433e75ccb3 --- /dev/null +++ b/connector/otlpjsonconnector/connector_test.go @@ -0,0 +1,226 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package otlpjsonconnector + +import ( + "context" + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/connector/connectortest" + "go.opentelemetry.io/collector/consumer/consumertest" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/plogtest" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/pmetrictest" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/ptracetest" +) + +func TestLogsToLogs2(t *testing.T) { + testCases := []struct { + name string + inputFile string + expectedFile string + expectedLogs int + }{ + { + name: "correct log metric", + inputFile: "input-log.yaml", + expectedFile: "output-log.yaml", + expectedLogs: 1, + }, + { + name: "invalid log", + inputFile: "input-invalid-log.yaml", + expectedLogs: 0, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + factory := NewFactory() + sink := &consumertest.LogsSink{} + conn, err := factory.CreateLogsToLogs(context.Background(), + + connectortest.NewNopSettings(), createDefaultConfig(), sink) + require.NoError(t, err) + require.NotNil(t, conn) + assert.False(t, conn.Capabilities().MutatesData) + + require.NoError(t, conn.Start(context.Background(), componenttest.NewNopHost())) + defer func() { + assert.NoError(t, conn.Shutdown(context.Background())) + }() + + testLogs, err := golden.ReadLogs(filepath.Join("testdata", "logsToLogs", tc.inputFile)) + assert.NoError(t, err) + assert.NoError(t, conn.ConsumeLogs(context.Background(), testLogs)) + + allLogs := sink.AllLogs() + assert.Len(t, allLogs, tc.expectedLogs) + + if tc.expectedLogs > 0 { + // golden.WriteLogs(t, filepath.Join("testdata", "logsToLogs", tc.expectedFile), allLogs[0]) + expected, err := golden.ReadLogs(filepath.Join("testdata", "logsToLogs", tc.expectedFile)) + assert.NoError(t, err) + assert.NoError(t, plogtest.CompareLogs(expected, allLogs[0])) + } + }) + } +} + +func TestLogsToMetrics(t *testing.T) { + testCases := []struct { + name string + inputFile string + expectedFile string + expectedMetrics int + }{ + { + name: "correct log metric", + inputFile: "input-metric.yaml", + expectedFile: "output-metric.yaml", + expectedMetrics: 1, + }, + { + name: "invalid metric", + inputFile: "input-invalid-metric.yaml", + expectedMetrics: 0, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + factory := NewFactory() + sink := &consumertest.MetricsSink{} + conn, err := factory.CreateLogsToMetrics(context.Background(), + + connectortest.NewNopSettings(), createDefaultConfig(), sink) + require.NoError(t, err) + require.NotNil(t, conn) + assert.False(t, conn.Capabilities().MutatesData) + + require.NoError(t, conn.Start(context.Background(), componenttest.NewNopHost())) + defer func() { + assert.NoError(t, conn.Shutdown(context.Background())) + }() + + testLogs, err := golden.ReadLogs(filepath.Join("testdata", "logsToMetrics", tc.inputFile)) + assert.NoError(t, err) + assert.NoError(t, conn.ConsumeLogs(context.Background(), testLogs)) + + allMetrics := sink.AllMetrics() + assert.Len(t, allMetrics, tc.expectedMetrics) + + if tc.expectedMetrics > 0 { + // golden.WriteMetrics(t, filepath.Join("testdata", "logsToMetrics", tc.expectedFile), allMetrics[0]) + expected, err := golden.ReadMetrics(filepath.Join("testdata", "logsToMetrics", tc.expectedFile)) + assert.NoError(t, err) + assert.NoError(t, pmetrictest.CompareMetrics(expected, allMetrics[0])) + } + }) + } +} + +func TestLogsToTraces(t *testing.T) { + testCases := []struct { + name string + inputFile string + expectedFile string + expectedTraces int + }{ + { + name: "correct log trace", + inputFile: "input-trace.yaml", + expectedFile: "output-trace.yaml", + expectedTraces: 1, + }, + { + name: "invalid trace", + inputFile: "input-invalid-trace.yaml", + expectedTraces: 0, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + factory := NewFactory() + sink := &consumertest.TracesSink{} + conn, err := factory.CreateLogsToTraces(context.Background(), + + connectortest.NewNopSettings(), createDefaultConfig(), sink) + require.NoError(t, err) + require.NotNil(t, conn) + assert.False(t, conn.Capabilities().MutatesData) + + require.NoError(t, conn.Start(context.Background(), componenttest.NewNopHost())) + defer func() { + assert.NoError(t, conn.Shutdown(context.Background())) + }() + + testLogs, err := golden.ReadLogs(filepath.Join("testdata", "logsToTraces", tc.inputFile)) + assert.NoError(t, err) + assert.NoError(t, conn.ConsumeLogs(context.Background(), testLogs)) + + allMetrics := sink.AllTraces() + assert.Len(t, allMetrics, tc.expectedTraces) + + if tc.expectedTraces > 0 { + // golden.WriteTraces(t, filepath.Join("testdata", "logsToTraces", tc.expectedFile), allMetrics[0]) + expected, err := golden.ReadTraces(filepath.Join("testdata", "logsToTraces", tc.expectedFile)) + assert.NoError(t, err) + assert.NoError(t, ptracetest.CompareTraces(expected, allMetrics[0])) + } + }) + } +} + +// This benchmark looks at how performance is affected when all three connectors are consuming logs (at the same time) +func BenchmarkConsumeLogs(b *testing.B) { + inputlogs := "input-log.yaml" + inputTraces := "input-trace.yaml" + inputMetrics := "input-metric.yaml" + + factory := NewFactory() + // initialize log -> log connector + logsink := &consumertest.LogsSink{} + logscon, _ := factory.CreateLogsToLogs(context.Background(), + connectortest.NewNopSettings(), createDefaultConfig(), logsink) + + require.NoError(b, logscon.Start(context.Background(), componenttest.NewNopHost())) + defer func() { + assert.NoError(b, logscon.Shutdown(context.Background())) + }() + + // initialize log -> traces connector + tracesink := &consumertest.TracesSink{} + traceconn, _ := factory.CreateLogsToTraces(context.Background(), + connectortest.NewNopSettings(), createDefaultConfig(), tracesink) + require.NoError(b, traceconn.Start(context.Background(), componenttest.NewNopHost())) + defer func() { + assert.NoError(b, traceconn.Shutdown(context.Background())) + }() + + // initialize log -> metric connector + metricsink := &consumertest.MetricsSink{} + metricconn, _ := factory.CreateLogsToMetrics(context.Background(), + connectortest.NewNopSettings(), createDefaultConfig(), metricsink) + require.NoError(b, metricconn.Start(context.Background(), componenttest.NewNopHost())) + defer func() { + assert.NoError(b, metricconn.Shutdown(context.Background())) + }() + + testLogs, _ := golden.ReadLogs(filepath.Join("testdata", "logsToLogs", inputlogs)) + testTraces, _ := golden.ReadLogs(filepath.Join("testdata", "logsToTraces", inputTraces)) + testMetrics, _ := golden.ReadLogs(filepath.Join("testdata", "logsToMetrics", inputMetrics)) + + for i := 0; i < b.N; i++ { + assert.NoError(b, logscon.ConsumeLogs(context.Background(), testLogs)) + assert.NoError(b, traceconn.ConsumeLogs(context.Background(), testTraces)) + assert.NoError(b, metricconn.ConsumeLogs(context.Background(), testMetrics)) + } +} diff --git a/connector/otlpjsonconnector/doc.go b/connector/otlpjsonconnector/doc.go new file mode 100644 index 000000000000..baf3aede2b17 --- /dev/null +++ b/connector/otlpjsonconnector/doc.go @@ -0,0 +1,6 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +//go:generate mdatagen metadata.yaml + +package otlpjsonconnector // import "github.com/open-telemetry/opentelemetry-collector-contrib/connector/otlpjsonconnector" diff --git a/connector/otlpjsonconnector/factory.go b/connector/otlpjsonconnector/factory.go new file mode 100644 index 000000000000..45d031ede216 --- /dev/null +++ b/connector/otlpjsonconnector/factory.go @@ -0,0 +1,67 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package otlpjsonconnector // import "github.com/open-telemetry/opentelemetry-collector-contrib/connector/otlpjsonconnector" + +import ( + "context" + "regexp" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/connector" + "go.opentelemetry.io/collector/consumer" + + "github.com/open-telemetry/opentelemetry-collector-contrib/connector/otlpjsonconnector/internal/metadata" +) + +var ( + logRegex = regexp.MustCompile(`^\{\s*"resourceLogs"\s*:\s*\[`) + metricRegex = regexp.MustCompile(`^\{\s*"resourceMetrics"\s*:\s*\[`) + traceRegex = regexp.MustCompile(`^\{\s*"resourceSpans"\s*:\s*\[`) +) + +// NewFactory returns a ConnectorFactory. +func NewFactory() connector.Factory { + return connector.NewFactory( + metadata.Type, + createDefaultConfig, + connector.WithLogsToTraces(createTracesConnector, component.StabilityLevelAlpha), + connector.WithLogsToMetrics(createMetricsConnector, component.StabilityLevelAlpha), + connector.WithLogsToLogs(createLogsConnector, component.StabilityLevelAlpha), + ) +} + +// createDefaultConfig creates the default configuration. +func createDefaultConfig() component.Config { + return &Config{} +} + +// createLogsConnector returns a connector which consume logs and export logs +func createLogsConnector( + _ context.Context, + set connector.Settings, + cfg component.Config, + nextConsumer consumer.Logs, +) (connector.Logs, error) { + return newLogsConnector(set, cfg, nextConsumer), nil +} + +// createTracesConnector returns a connector which consume logs and export traces +func createTracesConnector( + _ context.Context, + set connector.Settings, + cfg component.Config, + nextConsumer consumer.Traces, +) (connector.Logs, error) { + return newTracesConnector(set, cfg, nextConsumer), nil +} + +// createMetricsConnector returns a connector which consume logs and export metrics +func createMetricsConnector( + _ context.Context, + set connector.Settings, + cfg component.Config, + nextConsumer consumer.Metrics, +) (connector.Logs, error) { + return newMetricsConnector(set, cfg, nextConsumer), nil +} diff --git a/connector/otlpjsonconnector/factory_test.go b/connector/otlpjsonconnector/factory_test.go new file mode 100644 index 000000000000..8a8c9f5578f8 --- /dev/null +++ b/connector/otlpjsonconnector/factory_test.go @@ -0,0 +1,30 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package otlpjsonconnector + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + "go.opentelemetry.io/collector/connector/connectortest" + "go.opentelemetry.io/collector/consumer" + "go.opentelemetry.io/collector/pdata/plog" +) + +func TestNewFactory(t *testing.T) { + cfg := &Config{} + + lc, err := consumer.NewLogs(func(context.Context, plog.Logs) error { + return nil + }) + assert.NoError(t, err) + + factory := NewFactory() + conn, err := factory.CreateLogsToLogs(context.Background(), + connectortest.NewNopSettings(), cfg, lc) + + assert.NoError(t, err) + assert.NotNil(t, conn) +} diff --git a/connector/otlpjsonconnector/generated_component_test.go b/connector/otlpjsonconnector/generated_component_test.go new file mode 100644 index 000000000000..1653f7f14bc1 --- /dev/null +++ b/connector/otlpjsonconnector/generated_component_test.go @@ -0,0 +1,88 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package otlpjsonconnector + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/confmap/confmaptest" + "go.opentelemetry.io/collector/connector" + "go.opentelemetry.io/collector/connector/connectortest" + "go.opentelemetry.io/collector/consumer" + "go.opentelemetry.io/collector/consumer/consumertest" + "go.opentelemetry.io/collector/pipeline" +) + +func TestComponentFactoryType(t *testing.T) { + require.Equal(t, "otlpjson", NewFactory().Type().String()) +} + +func TestComponentConfigStruct(t *testing.T) { + require.NoError(t, componenttest.CheckConfigStruct(NewFactory().CreateDefaultConfig())) +} + +func TestComponentLifecycle(t *testing.T) { + factory := NewFactory() + + tests := []struct { + name string + createFn func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) + }{ + + { + name: "logs_to_logs", + createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) { + router := connector.NewLogsRouter(map[pipeline.ID]consumer.Logs{pipeline.NewID(pipeline.SignalLogs): consumertest.NewNop()}) + return factory.CreateLogsToLogs(ctx, set, cfg, router) + }, + }, + + { + name: "logs_to_metrics", + createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) { + router := connector.NewMetricsRouter(map[pipeline.ID]consumer.Metrics{pipeline.NewID(pipeline.SignalMetrics): consumertest.NewNop()}) + return factory.CreateLogsToMetrics(ctx, set, cfg, router) + }, + }, + + { + name: "logs_to_traces", + createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) { + router := connector.NewTracesRouter(map[pipeline.ID]consumer.Traces{pipeline.NewID(pipeline.SignalTraces): consumertest.NewNop()}) + return factory.CreateLogsToTraces(ctx, set, cfg, router) + }, + }, + } + + cm, err := confmaptest.LoadConf("metadata.yaml") + require.NoError(t, err) + cfg := factory.CreateDefaultConfig() + sub, err := cm.Sub("tests::config") + require.NoError(t, err) + require.NoError(t, sub.Unmarshal(&cfg)) + + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), connectortest.NewNopSettings(), cfg) + require.NoError(t, err) + err = c.Shutdown(context.Background()) + require.NoError(t, err) + }) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + firstConnector, err := tt.createFn(context.Background(), connectortest.NewNopSettings(), cfg) + require.NoError(t, err) + host := componenttest.NewNopHost() + require.NoError(t, err) + require.NoError(t, firstConnector.Start(context.Background(), host)) + require.NoError(t, firstConnector.Shutdown(context.Background())) + secondConnector, err := tt.createFn(context.Background(), connectortest.NewNopSettings(), cfg) + require.NoError(t, err) + require.NoError(t, secondConnector.Start(context.Background(), host)) + require.NoError(t, secondConnector.Shutdown(context.Background())) + }) + } +} diff --git a/connector/otlpjsonconnector/generated_package_test.go b/connector/otlpjsonconnector/generated_package_test.go new file mode 100644 index 000000000000..4b175e766bb3 --- /dev/null +++ b/connector/otlpjsonconnector/generated_package_test.go @@ -0,0 +1,13 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package otlpjsonconnector + +import ( + "testing" + + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + goleak.VerifyTestMain(m) +} diff --git a/connector/otlpjsonconnector/go.mod b/connector/otlpjsonconnector/go.mod new file mode 100644 index 000000000000..fc2e011ca4e8 --- /dev/null +++ b/connector/otlpjsonconnector/go.mod @@ -0,0 +1,65 @@ +module github.com/open-telemetry/opentelemetry-collector-contrib/connector/otlpjsonconnector + +go 1.22.0 + +require ( + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/connector v0.116.0 + go.opentelemetry.io/collector/connector/connectortest v0.116.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/pipeline v0.116.0 + go.uber.org/goleak v1.3.0 + go.uber.org/zap v1.27.0 +) + +require ( + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/knadh/koanf/maps v0.1.1 // indirect + github.com/knadh/koanf/providers/confmap v0.1.0 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/connector/xconnector v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../../pkg/pdatautil + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest => ../../pkg/pdatatest + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden => ../../pkg/golden diff --git a/connector/otlpjsonconnector/go.sum b/connector/otlpjsonconnector/go.sum new file mode 100644 index 000000000000..22a514628e25 --- /dev/null +++ b/connector/otlpjsonconnector/go.sum @@ -0,0 +1,144 @@ +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= +github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= +github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= +github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/connector v0.116.0 h1:0Pz8RAXH1swLeA1fiyGGQWdv0Kemz4mbq+jnmd1TACE= +go.opentelemetry.io/collector/connector v0.116.0/go.mod h1:VQiZ2yW9KhZuF0yjDbvlgrAxm7+o8KQoxHxurQWLjKU= +go.opentelemetry.io/collector/connector/connectortest v0.116.0 h1:MdttvjqdZmp0ewW5IPCEtzzYmCqxrQxsjJ5m6gMVjzA= +go.opentelemetry.io/collector/connector/connectortest v0.116.0/go.mod h1:ko7aPyvAVf6SvRhWGZdPXSyk+7zPmsSCcMq0gYPMMIQ= +go.opentelemetry.io/collector/connector/xconnector v0.116.0 h1:fFJzrRco0g7HMkhnQ+ehlvicFf58vzsCLXnfuHyQM8w= +go.opentelemetry.io/collector/connector/xconnector v0.116.0/go.mod h1:m9oCk32zX6wDciYBpy+qMQkWKtOxb0gAkEUm8+trflY= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 h1:KKFb3u8iLk4V5GYz7eVpw8QgEdob5koX6GNEbaoDQJY= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0/go.mod h1:YyWHUWeSnRmy2CF7kPHpwJ6qkVjufbLZ8PYuY0Ph0o8= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 h1:PFNy+Il/kqPdPL9rhG+1kG63Aauya+FhBKGXoB6ivxU= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0/go.mod h1:bVn9V4TGyeXi58/JDkeXCuKtc+V+qcOoTl8hNpV0qa8= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/connector/otlpjsonconnector/internal/metadata/generated_status.go b/connector/otlpjsonconnector/internal/metadata/generated_status.go new file mode 100644 index 000000000000..3f76e90795cd --- /dev/null +++ b/connector/otlpjsonconnector/internal/metadata/generated_status.go @@ -0,0 +1,18 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "go.opentelemetry.io/collector/component" +) + +var ( + Type = component.MustNewType("otlpjson") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/connector/otlpjsonconnector" +) + +const ( + LogsToMetricsStability = component.StabilityLevelAlpha + LogsToTracesStability = component.StabilityLevelAlpha + LogsToLogsStability = component.StabilityLevelAlpha +) diff --git a/connector/otlpjsonconnector/logs.go b/connector/otlpjsonconnector/logs.go new file mode 100644 index 000000000000..4be368b89688 --- /dev/null +++ b/connector/otlpjsonconnector/logs.go @@ -0,0 +1,79 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package otlpjsonconnector // import "github.com/open-telemetry/opentelemetry-collector-contrib/connector/otlpjsonconnector" + +import ( + "context" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/connector" + "go.opentelemetry.io/collector/consumer" + "go.opentelemetry.io/collector/pdata/plog" + "go.uber.org/zap" +) + +type connectorLogs struct { + config Config + logsConsumer consumer.Logs + logger *zap.Logger + + component.StartFunc + component.ShutdownFunc +} + +// newLogsConnector is a function to create a new connector for logs extraction +func newLogsConnector(set connector.Settings, config component.Config, logsConsumer consumer.Logs) *connectorLogs { + set.TelemetrySettings.Logger.Info("Building otlpjson connector for logs") + cfg := config.(*Config) + + return &connectorLogs{ + config: *cfg, + logger: set.TelemetrySettings.Logger, + logsConsumer: logsConsumer, + } +} + +// Capabilities implements the consumer interface +func (c *connectorLogs) Capabilities() consumer.Capabilities { + return consumer.Capabilities{MutatesData: false} +} + +// ConsumeLogs method is called for each instance of a log sent to the connector +func (c *connectorLogs) ConsumeLogs(ctx context.Context, pl plog.Logs) error { + // loop through the levels of logs + logsUnmarshaler := &plog.JSONUnmarshaler{} + for i := 0; i < pl.ResourceLogs().Len(); i++ { + li := pl.ResourceLogs().At(i) + for j := 0; j < li.ScopeLogs().Len(); j++ { + logRecord := li.ScopeLogs().At(j) + for k := 0; k < logRecord.LogRecords().Len(); k++ { + lRecord := logRecord.LogRecords().At(k) + token := lRecord.Body() + + // Check if the "resourceLogs" key exists in the JSON data + value := token.AsString() + switch { + case logRegex.MatchString(value): + var l plog.Logs + l, err := logsUnmarshaler.UnmarshalLogs([]byte(value)) + if err != nil { + c.logger.Error("could not extract logs from otlp json", zap.Error(err)) + continue + } + err = c.logsConsumer.ConsumeLogs(ctx, l) + if err != nil { + c.logger.Error("could not consume logs from otlp json", zap.Error(err)) + } + case metricRegex.MatchString(value), traceRegex.MatchString(value): + // If it's a metric or trace payload, simply continue + continue + default: + // If no regex matches, log the invalid payload + c.logger.Error("Invalid otlp payload") + } + } + } + } + return nil +} diff --git a/connector/otlpjsonconnector/metadata.yaml b/connector/otlpjsonconnector/metadata.yaml new file mode 100644 index 000000000000..90855c9d1bd6 --- /dev/null +++ b/connector/otlpjsonconnector/metadata.yaml @@ -0,0 +1,9 @@ +type: otlpjson + +status: + class: connector + stability: + alpha: [logs_to_metrics, logs_to_traces, logs_to_logs] + distributions: [contrib, k8s] + codeowners: + active: [djaglowski, ChrsMark] diff --git a/connector/otlpjsonconnector/metrics.go b/connector/otlpjsonconnector/metrics.go new file mode 100644 index 000000000000..603a5c9b5454 --- /dev/null +++ b/connector/otlpjsonconnector/metrics.go @@ -0,0 +1,79 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package otlpjsonconnector // import "github.com/open-telemetry/opentelemetry-collector-contrib/connector/otlpjsonconnector" + +import ( + "context" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/connector" + "go.opentelemetry.io/collector/consumer" + "go.opentelemetry.io/collector/pdata/plog" + "go.opentelemetry.io/collector/pdata/pmetric" + "go.uber.org/zap" +) + +type connectorMetrics struct { + config Config + metricsConsumer consumer.Metrics + logger *zap.Logger + + component.StartFunc + component.ShutdownFunc +} + +// newMetricsConnector is a function to create a new connector for metrics extraction +func newMetricsConnector(set connector.Settings, config component.Config, metricsConsumer consumer.Metrics) *connectorMetrics { + set.TelemetrySettings.Logger.Info("Building otlpjson connector for metrics") + cfg := config.(*Config) + + return &connectorMetrics{ + config: *cfg, + logger: set.TelemetrySettings.Logger, + metricsConsumer: metricsConsumer, + } +} + +// Capabilities implements the consumer interface. +func (c *connectorMetrics) Capabilities() consumer.Capabilities { + return consumer.Capabilities{MutatesData: false} +} + +// ConsumeLogs method is called for each instance of a log sent to the connector +func (c *connectorMetrics) ConsumeLogs(ctx context.Context, pl plog.Logs) error { + // loop through the levels of logs + metricsUnmarshaler := &pmetric.JSONUnmarshaler{} + for i := 0; i < pl.ResourceLogs().Len(); i++ { + li := pl.ResourceLogs().At(i) + for j := 0; j < li.ScopeLogs().Len(); j++ { + logRecord := li.ScopeLogs().At(j) + for k := 0; k < logRecord.LogRecords().Len(); k++ { + lRecord := logRecord.LogRecords().At(k) + token := lRecord.Body() + + value := token.AsString() + switch { + case metricRegex.MatchString(value): + var m pmetric.Metrics + m, err := metricsUnmarshaler.UnmarshalMetrics([]byte(value)) + if err != nil { + c.logger.Error("could not extract metrics from otlp json", zap.Error(err)) + continue + } + err = c.metricsConsumer.ConsumeMetrics(ctx, m) + if err != nil { + c.logger.Error("could not consume metrics from otlp json", zap.Error(err)) + } + case logRegex.MatchString(value), traceRegex.MatchString(value): + // If it's a log or trace payload, simply continue + continue + default: + // If no regex matches, log the invalid payload + c.logger.Error("Invalid otlp payload") + } + } + } + } + return nil +} diff --git a/connector/otlpjsonconnector/testdata/config.yaml b/connector/otlpjsonconnector/testdata/config.yaml new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/connector/otlpjsonconnector/testdata/logsToLogs/input-invalid-log.yaml b/connector/otlpjsonconnector/testdata/logsToLogs/input-invalid-log.yaml new file mode 100644 index 000000000000..1f5579de8383 --- /dev/null +++ b/connector/otlpjsonconnector/testdata/logsToLogs/input-invalid-log.yaml @@ -0,0 +1,11 @@ +# Error: readLog.traceId: parse trace_id:invalid length for ID, error found in #10 byte +resourceLogs: + - resource: + scopeLogs: + - logRecords: + - attributes: + body: + stringValue: '{"resourceLogs":[{"resource":{"attributes":[{"key":"resource-attr","value":{"stringValue":"resource-attr-val-1"}}]},"scopeLogs":[{"scope":{},"logRecords":[{"timeUnixNano":"1581452773000000789","severityNumber":9,"severityText":"Info","body":{"stringValue":"This is a log message"},"attributes":[{"key":"app","value":{"stringValue":"server"}},{"key":"instance_num","value":{"intValue":"1"}}],"droppedAttributesCount":1,"traceId":"inmyB8/qrDAAP6cV5ZFR9A==","spanId":"0102040800000000"}]}]}]}' + spanId: "" + traceId: "" + scope: {} diff --git a/connector/otlpjsonconnector/testdata/logsToLogs/input-log.yaml b/connector/otlpjsonconnector/testdata/logsToLogs/input-log.yaml new file mode 100644 index 000000000000..5a317663a0c5 --- /dev/null +++ b/connector/otlpjsonconnector/testdata/logsToLogs/input-log.yaml @@ -0,0 +1,10 @@ +resourceLogs: + - resource: + scopeLogs: + - logRecords: + - attributes: + body: + stringValue: '{"resourceLogs":[{"resource":{"attributes":[{"key":"resource-attr","value":{"stringValue":"resource-attr-val-1"}}]},"scopeLogs":[{"scope":{},"logRecords":[{"timeUnixNano":"1581452773000000789","severityNumber":9,"severityText":"Info","body":{"stringValue":"This is a log message"},"attributes":[{"key":"app","value":{"stringValue":"server"}},{"key":"instance_num","value":{"intValue":"1"}}],"droppedAttributesCount":1,"traceId":"08040201000000000000000000000000","spanId":"0102040800000000"}]}]}]}' + spanId: "" + traceId: "" + scope: {} diff --git a/connector/otlpjsonconnector/testdata/logsToLogs/output-log.yaml b/connector/otlpjsonconnector/testdata/logsToLogs/output-log.yaml new file mode 100644 index 000000000000..8b242f643373 --- /dev/null +++ b/connector/otlpjsonconnector/testdata/logsToLogs/output-log.yaml @@ -0,0 +1,24 @@ +resourceLogs: + - resource: + attributes: + - key: resource-attr + value: + stringValue: resource-attr-val-1 + scopeLogs: + - logRecords: + - attributes: + - key: app + value: + stringValue: server + - key: instance_num + value: + intValue: "1" + body: + stringValue: This is a log message + droppedAttributesCount: 1 + severityNumber: 9 + severityText: Info + spanId: "0102040800000000" + timeUnixNano: "1581452773000000789" + traceId: "08040201000000000000000000000000" + scope: {} diff --git a/connector/otlpjsonconnector/testdata/logsToMetrics/input-invalid-metric.yaml b/connector/otlpjsonconnector/testdata/logsToMetrics/input-invalid-metric.yaml new file mode 100644 index 000000000000..33669a42bd38 --- /dev/null +++ b/connector/otlpjsonconnector/testdata/logsToMetrics/input-invalid-metric.yaml @@ -0,0 +1,11 @@ +# Error: ReadInt64: strconv.ParseInt: parsing "notAndInt123": invalid syntax, error found in #10 byte +resourceLogs: + - resource: + scopeLogs: + - logRecords: + - attributes: + body: + stringValue: '{"resourceMetrics":[{"resource":{"attributes":[{"key":"resource-attr","value":{"stringValue":"resource-attr-val-1"}}]},"scopeMetrics":[{"scope":{},"metrics":[{"name":"gauge-int","unit":"1","gauge":{"dataPoints":[{"attributes":[{"key":"label-1","value":{"stringValue":"label-value-1"}}],"startTimeUnixNano":"1581452772000000321","timeUnixNano":"1581452773000000789","asInt":"notAndInt123"},{"attributes":[{"key":"label-2","value":{"stringValue":"label-value-2"}}],"startTimeUnixNano":"1581452772000000321","timeUnixNano":"1581452773000000789","asInt":"456"}]}}]}]}]}' + spanId: "" + traceId: "" + scope: {} diff --git a/connector/otlpjsonconnector/testdata/logsToMetrics/input-metric.yaml b/connector/otlpjsonconnector/testdata/logsToMetrics/input-metric.yaml new file mode 100644 index 000000000000..6a5b6a350a38 --- /dev/null +++ b/connector/otlpjsonconnector/testdata/logsToMetrics/input-metric.yaml @@ -0,0 +1,11 @@ +resourceLogs: + - resource: + scopeLogs: + - logRecords: + - attributes: + body: + stringValue: '{"resourceMetrics":[{"resource":{"attributes":[{"key":"resource-attr","value":{"stringValue":"resource-attr-val-1"}}]},"scopeMetrics":[{"scope":{},"metrics":[{"name":"gauge-int","unit":"1","gauge":{"dataPoints":[{"attributes":[{"key":"label-2","value":{"stringValue":"label-value-2"}}],"startTimeUnixNano":"1000000","timeUnixNano":"1000000","asInt":"456"}]}}]}]}]}' + spanId: "" + traceId: "" + scope: {} + diff --git a/connector/otlpjsonconnector/testdata/logsToMetrics/output-invalid-metric.yaml b/connector/otlpjsonconnector/testdata/logsToMetrics/output-invalid-metric.yaml new file mode 100644 index 000000000000..561bf75f27c5 --- /dev/null +++ b/connector/otlpjsonconnector/testdata/logsToMetrics/output-invalid-metric.yaml @@ -0,0 +1,27 @@ +resourceMetrics: + - resource: + attributes: + - key: resource-attr + value: + stringValue: resource-attr-val-1 + scopeMetrics: + - metrics: + - gauge: + dataPoints: + - asInt: "123" + attributes: + - key: label-1 + value: + stringValue: label-value-1 + startTimeUnixNano: "1000000" + timeUnixNano: "2000000" + - asInt: "456" + attributes: + - key: label-2 + value: + stringValue: label-value-2 + startTimeUnixNano: "1000000" + timeUnixNano: "2000000" + name: gauge-int + unit: "1" + scope: {} diff --git a/connector/otlpjsonconnector/testdata/logsToMetrics/output-metric.yaml b/connector/otlpjsonconnector/testdata/logsToMetrics/output-metric.yaml new file mode 100644 index 000000000000..dd643600baf9 --- /dev/null +++ b/connector/otlpjsonconnector/testdata/logsToMetrics/output-metric.yaml @@ -0,0 +1,20 @@ +resourceMetrics: + - resource: + attributes: + - key: resource-attr + value: + stringValue: resource-attr-val-1 + scopeMetrics: + - metrics: + - gauge: + dataPoints: + - asInt: "456" + attributes: + - key: label-2 + value: + stringValue: label-value-2 + startTimeUnixNano: "1000000" + timeUnixNano: "1000000" + name: gauge-int + unit: "1" + scope: {} diff --git a/connector/otlpjsonconnector/testdata/logsToTraces/input-invalid-trace.yaml b/connector/otlpjsonconnector/testdata/logsToTraces/input-invalid-trace.yaml new file mode 100644 index 000000000000..19b2e7a08ee4 --- /dev/null +++ b/connector/otlpjsonconnector/testdata/logsToTraces/input-invalid-trace.yaml @@ -0,0 +1,11 @@ +# Error: readSpan.traceId: parse trace_id:invalid length for ID, error found in #10 byte +resourceLogs: + - resource: + scopeLogs: + - logRecords: + - attributes: + body: + stringValue: '{"resourceSpans":[{"resource":{"attributes":[{"key":"resource-attr","value":{"stringValue":"0"}},{"key":"service.name","value":{"stringValue":"starter-otel"}},{"key":"service.version","value":{"stringValue":"52"}}],"droppedAttributesCount":0},"scopeSpans":[{"scope":{"name":"go.opentelemetry.io/otel/sdk/tracer","version":"","attributes":[],"droppedAttributesCount":0},"spans":[{"traceId":"inmyB8/qrDAAP6cV5ZFR9A==","spanId":"FcpNz02EdAs=","traceState":"","parentSpanId":"","flags":256,"name":"serve","kind":"SPAN_KIND_INTERNAL","startTimeUnixNano":"1723610203654164405","endTimeUnixNano":"1723610203654483065","attributes":[],"droppedAttributesCount":0,"events":[],"droppedEventsCount":0,"links":[],"droppedLinksCount":0,"status":{"message":"","code":"STATUS_CODE_UNSET"}}],"schemaUrl":""}],"schemaUrl":"https://opentelemetry.io/schemas/1.7.0"}]}' + spanId: "" + traceId: "" + scope: {} diff --git a/connector/otlpjsonconnector/testdata/logsToTraces/input-trace.yaml b/connector/otlpjsonconnector/testdata/logsToTraces/input-trace.yaml new file mode 100644 index 000000000000..f64a79404219 --- /dev/null +++ b/connector/otlpjsonconnector/testdata/logsToTraces/input-trace.yaml @@ -0,0 +1,11 @@ +resourceLogs: + - resource: + scopeLogs: + - logRecords: + - attributes: + body: + stringValue: '{"resourceSpans":[{"resource":{"attributes":[{"key":"resource-attr","value":{"stringValue":"resource-attr-val-1"}}]},"scopeSpans":[{"scope":{},"spans":[{"traceId":"0102030405060708090a0b0c0d0e0f10","spanId":"1112131415161718","traceState":"ot=th:0","parentSpanId":"","name":"operationA","startTimeUnixNano":"1581452772000000321","endTimeUnixNano":"1581452773000000789","droppedAttributesCount":1,"events":[{"timeUnixNano":"1581452773000000123","name":"event-with-attr","attributes":[{"key":"span-event-attr","value":{"stringValue":"span-event-attr-val"}}],"droppedAttributesCount":2},{"timeUnixNano":"1581452773000000123","name":"event","droppedAttributesCount":2}],"droppedEventsCount":1,"status":{"message":"status-cancelled","code":2}}]}]}]}' + spanId: "" + traceId: "" + scope: {} + diff --git a/connector/otlpjsonconnector/testdata/logsToTraces/output-trace.yaml b/connector/otlpjsonconnector/testdata/logsToTraces/output-trace.yaml new file mode 100644 index 000000000000..5e4382c0440c --- /dev/null +++ b/connector/otlpjsonconnector/testdata/logsToTraces/output-trace.yaml @@ -0,0 +1,32 @@ +resourceSpans: + - resource: + attributes: + - key: resource-attr + value: + stringValue: resource-attr-val-1 + scopeSpans: + - scope: {} + spans: + - droppedAttributesCount: 1 + droppedEventsCount: 1 + endTimeUnixNano: "1581452773000000789" + events: + - attributes: + - key: span-event-attr + value: + stringValue: span-event-attr-val + droppedAttributesCount: 2 + name: event-with-attr + timeUnixNano: "1581452773000000123" + - droppedAttributesCount: 2 + name: event + timeUnixNano: "1581452773000000123" + name: operationA + parentSpanId: "" + spanId: "1112131415161718" + startTimeUnixNano: "1581452772000000321" + status: + code: 2 + message: status-cancelled + traceId: 0102030405060708090a0b0c0d0e0f10 + traceState: ot=th:0 diff --git a/connector/otlpjsonconnector/traces.go b/connector/otlpjsonconnector/traces.go new file mode 100644 index 000000000000..2b1e4b1f7bc9 --- /dev/null +++ b/connector/otlpjsonconnector/traces.go @@ -0,0 +1,79 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package otlpjsonconnector // import "github.com/open-telemetry/opentelemetry-collector-contrib/connector/otlpjsonconnector" + +import ( + "context" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/connector" + "go.opentelemetry.io/collector/consumer" + "go.opentelemetry.io/collector/pdata/plog" + "go.opentelemetry.io/collector/pdata/ptrace" + "go.uber.org/zap" +) + +type connectorTraces struct { + config Config + tracesConsumer consumer.Traces + logger *zap.Logger + + component.StartFunc + component.ShutdownFunc +} + +// newTracesConnector is a function to create a new connector for traces extraction +func newTracesConnector(set connector.Settings, config component.Config, tracesConsumer consumer.Traces) *connectorTraces { + set.TelemetrySettings.Logger.Info("Building otlpjson connector for traces") + cfg := config.(*Config) + + return &connectorTraces{ + config: *cfg, + logger: set.TelemetrySettings.Logger, + tracesConsumer: tracesConsumer, + } +} + +// Capabilities implements the consumer interface. +func (c *connectorTraces) Capabilities() consumer.Capabilities { + return consumer.Capabilities{MutatesData: false} +} + +// ConsumeLogs method is called for each instance of a log sent to the connector +func (c *connectorTraces) ConsumeLogs(ctx context.Context, pl plog.Logs) error { + // loop through the levels of logs + tracesUnmarshaler := &ptrace.JSONUnmarshaler{} + for i := 0; i < pl.ResourceLogs().Len(); i++ { + li := pl.ResourceLogs().At(i) + for j := 0; j < li.ScopeLogs().Len(); j++ { + logRecord := li.ScopeLogs().At(j) + for k := 0; k < logRecord.LogRecords().Len(); k++ { + lRecord := logRecord.LogRecords().At(k) + token := lRecord.Body() + + value := token.AsString() + switch { + case traceRegex.MatchString(value): + var t ptrace.Traces + t, err := tracesUnmarshaler.UnmarshalTraces([]byte(value)) + if err != nil { + c.logger.Error("could not extract traces from otlp json", zap.Error(err)) + continue + } + err = c.tracesConsumer.ConsumeTraces(ctx, t) + if err != nil { + c.logger.Error("could not consume traces from otlp json", zap.Error(err)) + } + case metricRegex.MatchString(value), logRegex.MatchString(value): + // If it's a metric or log payload, continue to the next iteration + continue + default: + // If no regex matches, log the invalid payload + c.logger.Error("Invalid otlp payload") + } + } + } + } + return nil +} diff --git a/connector/roundrobinconnector/README.md b/connector/roundrobinconnector/README.md index f2b315f188b5..260b89da83d5 100644 --- a/connector/roundrobinconnector/README.md +++ b/connector/roundrobinconnector/README.md @@ -2,12 +2,13 @@ | Status | | | ------------- |-----------| -| Distributions | [contrib] | +| Distributions | [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aconnector%2Froundrobin%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aconnector%2Froundrobin) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aconnector%2Froundrobin%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aconnector%2Froundrobin) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@bogdandrutu](https://www.github.com/bogdandrutu) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s ## Supported Pipeline Types @@ -19,7 +20,7 @@ [Exporter Pipeline Type]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md#exporter-pipeline-type [Receiver Pipeline Type]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md#receiver-pipeline-type -[Stability Level]: https://github.com/open-telemetry/opentelemetry-collector#stability-levels +[Stability Level]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#stability-levels The `roundrobin` connector can fork pipelines of the same type and equally split the load between them. diff --git a/connector/roundrobinconnector/connector.go b/connector/roundrobinconnector/connector.go index 845dae033d15..2e1be12f6e9e 100644 --- a/connector/roundrobinconnector/connector.go +++ b/connector/roundrobinconnector/connector.go @@ -13,6 +13,7 @@ import ( "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" + "go.opentelemetry.io/collector/pipeline" ) func allConsumers[T any](r router[T]) ([]T, error) { @@ -29,8 +30,8 @@ func allConsumers[T any](r router[T]) ([]T, error) { } type router[T any] interface { - PipelineIDs() []component.ID - Consumer(pipelineIDs ...component.ID) (T, error) + PipelineIDs() []pipeline.ID + Consumer(pipelineIDs ...pipeline.ID) (T, error) } func newLogs(nextConsumer consumer.Logs) (connector.Logs, error) { diff --git a/connector/roundrobinconnector/connector_test.go b/connector/roundrobinconnector/connector_test.go index 3342093e9a97..a9c092c5076e 100644 --- a/connector/roundrobinconnector/connector_test.go +++ b/connector/roundrobinconnector/connector_test.go @@ -9,7 +9,6 @@ import ( "testing" "github.com/stretchr/testify/assert" - "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/connector" "go.opentelemetry.io/collector/connector/connectortest" @@ -18,12 +17,13 @@ import ( "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" + "go.opentelemetry.io/collector/pipeline" ) -func newPipelineMap[T any](tp component.Type, consumers ...T) map[component.ID]T { - ret := make(map[component.ID]T, len(consumers)) +func newPipelineMap[T any](signal pipeline.Signal, consumers ...T) map[pipeline.ID]T { + ret := make(map[pipeline.ID]T, len(consumers)) for i, cons := range consumers { - ret[component.NewIDWithName(tp, strconv.Itoa(i))] = cons + ret[pipeline.NewIDWithName(signal, strconv.Itoa(i))] = cons } return ret } @@ -34,13 +34,13 @@ func TestLogsRoundRobin(t *testing.T) { assert.Equal(t, &Config{}, cfg) ctx := context.Background() - set := connectortest.NewNopCreateSettings() + set := connectortest.NewNopSettings() host := componenttest.NewNopHost() sink1 := new(consumertest.LogsSink) sink2 := new(consumertest.LogsSink) sink3 := new(consumertest.LogsSink) - logs, err := f.CreateLogsToLogs(ctx, set, cfg, connector.NewLogsRouter(newPipelineMap[consumer.Logs](component.DataTypeLogs, sink1, sink2, sink3))) + logs, err := f.CreateLogsToLogs(ctx, set, cfg, connector.NewLogsRouter(newPipelineMap[consumer.Logs](pipeline.SignalLogs, sink1, sink2, sink3))) assert.NoError(t, err) assert.NotNil(t, logs) @@ -50,17 +50,17 @@ func TestLogsRoundRobin(t *testing.T) { assert.NoError(t, logs.ConsumeLogs(ctx, plog.NewLogs())) assert.NoError(t, logs.ConsumeLogs(ctx, plog.NewLogs())) - assert.Equal(t, 1, len(sink1.AllLogs())) - assert.Equal(t, 1, len(sink2.AllLogs())) - assert.Equal(t, 1, len(sink3.AllLogs())) + assert.Len(t, sink1.AllLogs(), 1) + assert.Len(t, sink2.AllLogs(), 1) + assert.Len(t, sink3.AllLogs(), 1) assert.NoError(t, logs.ConsumeLogs(ctx, plog.NewLogs())) assert.NoError(t, logs.ConsumeLogs(ctx, plog.NewLogs())) assert.NoError(t, logs.ConsumeLogs(ctx, plog.NewLogs())) - assert.Equal(t, 2, len(sink1.AllLogs())) - assert.Equal(t, 2, len(sink2.AllLogs())) - assert.Equal(t, 2, len(sink3.AllLogs())) + assert.Len(t, sink1.AllLogs(), 2) + assert.Len(t, sink2.AllLogs(), 2) + assert.Len(t, sink3.AllLogs(), 2) assert.NoError(t, logs.Shutdown(ctx)) } @@ -71,13 +71,13 @@ func TestMetricsRoundRobin(t *testing.T) { assert.Equal(t, &Config{}, cfg) ctx := context.Background() - set := connectortest.NewNopCreateSettings() + set := connectortest.NewNopSettings() host := componenttest.NewNopHost() sink1 := new(consumertest.MetricsSink) sink2 := new(consumertest.MetricsSink) sink3 := new(consumertest.MetricsSink) - metrics, err := f.CreateMetricsToMetrics(ctx, set, cfg, connector.NewMetricsRouter(newPipelineMap[consumer.Metrics](component.DataTypeMetrics, sink1, sink2, sink3))) + metrics, err := f.CreateMetricsToMetrics(ctx, set, cfg, connector.NewMetricsRouter(newPipelineMap[consumer.Metrics](pipeline.SignalMetrics, sink1, sink2, sink3))) assert.NoError(t, err) assert.NotNil(t, metrics) @@ -87,17 +87,17 @@ func TestMetricsRoundRobin(t *testing.T) { assert.NoError(t, metrics.ConsumeMetrics(ctx, pmetric.NewMetrics())) assert.NoError(t, metrics.ConsumeMetrics(ctx, pmetric.NewMetrics())) - assert.Equal(t, 1, len(sink1.AllMetrics())) - assert.Equal(t, 1, len(sink2.AllMetrics())) - assert.Equal(t, 1, len(sink3.AllMetrics())) + assert.Len(t, sink1.AllMetrics(), 1) + assert.Len(t, sink2.AllMetrics(), 1) + assert.Len(t, sink3.AllMetrics(), 1) assert.NoError(t, metrics.ConsumeMetrics(ctx, pmetric.NewMetrics())) assert.NoError(t, metrics.ConsumeMetrics(ctx, pmetric.NewMetrics())) assert.NoError(t, metrics.ConsumeMetrics(ctx, pmetric.NewMetrics())) - assert.Equal(t, 2, len(sink1.AllMetrics())) - assert.Equal(t, 2, len(sink2.AllMetrics())) - assert.Equal(t, 2, len(sink3.AllMetrics())) + assert.Len(t, sink1.AllMetrics(), 2) + assert.Len(t, sink2.AllMetrics(), 2) + assert.Len(t, sink3.AllMetrics(), 2) assert.NoError(t, metrics.Shutdown(ctx)) } @@ -108,13 +108,13 @@ func TestTracesRoundRobin(t *testing.T) { assert.Equal(t, &Config{}, cfg) ctx := context.Background() - set := connectortest.NewNopCreateSettings() + set := connectortest.NewNopSettings() host := componenttest.NewNopHost() sink1 := new(consumertest.TracesSink) sink2 := new(consumertest.TracesSink) sink3 := new(consumertest.TracesSink) - traces, err := f.CreateTracesToTraces(ctx, set, cfg, connector.NewTracesRouter(newPipelineMap[consumer.Traces](component.DataTypeTraces, sink1, sink2, sink3))) + traces, err := f.CreateTracesToTraces(ctx, set, cfg, connector.NewTracesRouter(newPipelineMap[consumer.Traces](pipeline.SignalTraces, sink1, sink2, sink3))) assert.NoError(t, err) assert.NotNil(t, traces) @@ -124,17 +124,17 @@ func TestTracesRoundRobin(t *testing.T) { assert.NoError(t, traces.ConsumeTraces(ctx, ptrace.NewTraces())) assert.NoError(t, traces.ConsumeTraces(ctx, ptrace.NewTraces())) - assert.Equal(t, 1, len(sink1.AllTraces())) - assert.Equal(t, 1, len(sink2.AllTraces())) - assert.Equal(t, 1, len(sink3.AllTraces())) + assert.Len(t, sink1.AllTraces(), 1) + assert.Len(t, sink2.AllTraces(), 1) + assert.Len(t, sink3.AllTraces(), 1) assert.NoError(t, traces.ConsumeTraces(ctx, ptrace.NewTraces())) assert.NoError(t, traces.ConsumeTraces(ctx, ptrace.NewTraces())) assert.NoError(t, traces.ConsumeTraces(ctx, ptrace.NewTraces())) - assert.Equal(t, 2, len(sink1.AllTraces())) - assert.Equal(t, 2, len(sink2.AllTraces())) - assert.Equal(t, 2, len(sink3.AllTraces())) + assert.Len(t, sink1.AllTraces(), 2) + assert.Len(t, sink2.AllTraces(), 2) + assert.Len(t, sink3.AllTraces(), 2) assert.NoError(t, traces.Shutdown(ctx)) } diff --git a/connector/roundrobinconnector/factory.go b/connector/roundrobinconnector/factory.go index da917a37a378..652e6fbeaf3f 100644 --- a/connector/roundrobinconnector/factory.go +++ b/connector/roundrobinconnector/factory.go @@ -34,7 +34,7 @@ func createDefaultConfig() component.Config { // createLogsToLogs creates a log receiver based on provided config. func createLogsToLogs( _ context.Context, - _ connector.CreateSettings, + _ connector.Settings, _ component.Config, nextConsumer consumer.Logs, ) (connector.Logs, error) { @@ -44,7 +44,7 @@ func createLogsToLogs( // createMetricsToMetrics creates a metrics receiver based on provided config. func createMetricsToMetrics( _ context.Context, - _ connector.CreateSettings, + _ connector.Settings, _ component.Config, nextConsumer consumer.Metrics, ) (connector.Metrics, error) { @@ -54,7 +54,7 @@ func createMetricsToMetrics( // createTracesToTraces creates a trace receiver based on provided config. func createTracesToTraces( _ context.Context, - _ connector.CreateSettings, + _ connector.Settings, _ component.Config, nextConsumer consumer.Traces, ) (connector.Traces, error) { diff --git a/connector/roundrobinconnector/generated_component_test.go b/connector/roundrobinconnector/generated_component_test.go index f4753d24eb93..ffa18e5f716a 100644 --- a/connector/roundrobinconnector/generated_component_test.go +++ b/connector/roundrobinconnector/generated_component_test.go @@ -14,6 +14,7 @@ import ( "go.opentelemetry.io/collector/connector/connectortest" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/consumer/consumertest" + "go.opentelemetry.io/collector/pipeline" ) func TestComponentFactoryType(t *testing.T) { @@ -29,29 +30,29 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set connector.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs_to_logs", - createFn: func(ctx context.Context, set connector.CreateSettings, cfg component.Config) (component.Component, error) { - router := connector.NewLogsRouter(map[component.ID]consumer.Logs{component.NewID(component.DataTypeLogs): consumertest.NewNop()}) + createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) { + router := connector.NewLogsRouter(map[pipeline.ID]consumer.Logs{pipeline.NewID(pipeline.SignalLogs): consumertest.NewNop()}) return factory.CreateLogsToLogs(ctx, set, cfg, router) }, }, { name: "metrics_to_metrics", - createFn: func(ctx context.Context, set connector.CreateSettings, cfg component.Config) (component.Component, error) { - router := connector.NewMetricsRouter(map[component.ID]consumer.Metrics{component.NewID(component.DataTypeMetrics): consumertest.NewNop()}) + createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) { + router := connector.NewMetricsRouter(map[pipeline.ID]consumer.Metrics{pipeline.NewID(pipeline.SignalMetrics): consumertest.NewNop()}) return factory.CreateMetricsToMetrics(ctx, set, cfg, router) }, }, { name: "traces_to_traces", - createFn: func(ctx context.Context, set connector.CreateSettings, cfg component.Config) (component.Component, error) { - router := connector.NewTracesRouter(map[component.ID]consumer.Traces{component.NewID(component.DataTypeTraces): consumertest.NewNop()}) + createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) { + router := connector.NewTracesRouter(map[pipeline.ID]consumer.Traces{pipeline.NewID(pipeline.SignalTraces): consumertest.NewNop()}) return factory.CreateTracesToTraces(ctx, set, cfg, router) }, }, @@ -64,21 +65,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), connectortest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), connectortest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - firstConnector, err := test.createFn(context.Background(), connectortest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + firstConnector, err := tt.createFn(context.Background(), connectortest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() require.NoError(t, err) require.NoError(t, firstConnector.Start(context.Background(), host)) require.NoError(t, firstConnector.Shutdown(context.Background())) - secondConnector, err := test.createFn(context.Background(), connectortest.NewNopCreateSettings(), cfg) + secondConnector, err := tt.createFn(context.Background(), connectortest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, secondConnector.Start(context.Background(), host)) require.NoError(t, secondConnector.Shutdown(context.Background())) diff --git a/connector/roundrobinconnector/go.mod b/connector/roundrobinconnector/go.mod index 2c45705d32a2..2a28fc9a3219 100644 --- a/connector/roundrobinconnector/go.mod +++ b/connector/roundrobinconnector/go.mod @@ -1,54 +1,55 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/connector/roundrobinconnector -go 1.21.0 +go 1.22.0 require ( - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/connector v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/connector v0.116.0 + go.opentelemetry.io/collector/connector/connectortest v0.116.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/pipeline v0.116.0 go.uber.org/goleak v1.3.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/connector/xconnector v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/connector/roundrobinconnector/go.sum b/connector/roundrobinconnector/go.sum index 3395931beeba..5923775a817e 100644 --- a/connector/roundrobinconnector/go.sum +++ b/connector/roundrobinconnector/go.sum @@ -1,19 +1,17 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -27,8 +25,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -44,50 +42,56 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/connector v0.102.0 h1:IvAsVfYRxP0ajmKbUovF8qugkcUtHq6RuYNtjcMa63E= -go.opentelemetry.io/collector/connector v0.102.0/go.mod h1:f4M7wZ/9+XtgTE0fivBFH3WlwntaEd0qFFA0giFkdnY= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/connector v0.116.0 h1:0Pz8RAXH1swLeA1fiyGGQWdv0Kemz4mbq+jnmd1TACE= +go.opentelemetry.io/collector/connector v0.116.0/go.mod h1:VQiZ2yW9KhZuF0yjDbvlgrAxm7+o8KQoxHxurQWLjKU= +go.opentelemetry.io/collector/connector/connectortest v0.116.0 h1:MdttvjqdZmp0ewW5IPCEtzzYmCqxrQxsjJ5m6gMVjzA= +go.opentelemetry.io/collector/connector/connectortest v0.116.0/go.mod h1:ko7aPyvAVf6SvRhWGZdPXSyk+7zPmsSCcMq0gYPMMIQ= +go.opentelemetry.io/collector/connector/xconnector v0.116.0 h1:fFJzrRco0g7HMkhnQ+ehlvicFf58vzsCLXnfuHyQM8w= +go.opentelemetry.io/collector/connector/xconnector v0.116.0/go.mod h1:m9oCk32zX6wDciYBpy+qMQkWKtOxb0gAkEUm8+trflY= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 h1:KKFb3u8iLk4V5GYz7eVpw8QgEdob5koX6GNEbaoDQJY= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0/go.mod h1:YyWHUWeSnRmy2CF7kPHpwJ6qkVjufbLZ8PYuY0Ph0o8= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 h1:PFNy+Il/kqPdPL9rhG+1kG63Aauya+FhBKGXoB6ivxU= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0/go.mod h1:bVn9V4TGyeXi58/JDkeXCuKtc+V+qcOoTl8hNpV0qa8= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -103,20 +107,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -125,12 +129,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/connector/roundrobinconnector/internal/metadata/generated_status.go b/connector/roundrobinconnector/internal/metadata/generated_status.go index b43d2b3fe518..74ff2835a9ae 100644 --- a/connector/roundrobinconnector/internal/metadata/generated_status.go +++ b/connector/roundrobinconnector/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("roundrobin") + Type = component.MustNewType("roundrobin") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/connector/roundrobinconnector" ) const ( diff --git a/connector/roundrobinconnector/internal/metadata/generated_telemetry.go b/connector/roundrobinconnector/internal/metadata/generated_telemetry.go deleted file mode 100644 index 3552054dff68..000000000000 --- a/connector/roundrobinconnector/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/roundrobinconnector") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/roundrobinconnector") -} diff --git a/connector/roundrobinconnector/internal/metadata/generated_telemetry_test.go b/connector/roundrobinconnector/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 236dea42f048..000000000000 --- a/connector/roundrobinconnector/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/roundrobinconnector", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/roundrobinconnector", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/connector/roundrobinconnector/metadata.yaml b/connector/roundrobinconnector/metadata.yaml index 6c09dfad1dc3..438317a347f8 100644 --- a/connector/roundrobinconnector/metadata.yaml +++ b/connector/roundrobinconnector/metadata.yaml @@ -1,11 +1,10 @@ type: roundrobin -scope_name: otelcol/roundrobinconnector status: class: connector stability: beta: [traces_to_traces, metrics_to_metrics, logs_to_logs] - distributions: [contrib] + distributions: [contrib, k8s] codeowners: active: [bogdandrutu] diff --git a/connector/routingconnector/README.md b/connector/routingconnector/README.md index 7ce1b0dd9937..4f88654e378a 100644 --- a/connector/routingconnector/README.md +++ b/connector/routingconnector/README.md @@ -3,12 +3,13 @@ | Status | | | ------------- |-----------| -| Distributions | [contrib] | +| Distributions | [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aconnector%2Frouting%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aconnector%2Frouting) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aconnector%2Frouting%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aconnector%2Frouting) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@jpkrohling](https://www.github.com/jpkrohling), [@mwear](https://www.github.com/mwear) | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s ## Supported Pipeline Types @@ -20,11 +21,26 @@ [Exporter Pipeline Type]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md#exporter-pipeline-type [Receiver Pipeline Type]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md#receiver-pipeline-type -[Stability Level]: https://github.com/open-telemetry/opentelemetry-collector#stability-levels +[Stability Level]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#stability-levels Routes logs, metrics or traces based on resource attributes to specific pipelines using [OpenTelemetry Transformation Language (OTTL)](../../pkg/ottl/README.md) statements as routing conditions. +## Notice + +The `match_once` field is deprecated as of `v0.116.0`. The deprecation schedule is planned as follows: + +- `v0.116.0`: The field is deprecated. If `false` is used, a warning will be logged. +- `v0.117.0`: The default value will change from `false` to `true`. If `false` is used, an error will be logged. +- `v0.118.0`: The field will be disconnected from behavior of the connector. +- `v0.120.0`: The field will be removed. + +### Migration + +It is recommended to set `match_once: true` until `v0.117.0` and then remove all usage of the field before `v0.120.0`. + +For detailed guidance on how to migrate configuration from `match_once: false` to `match_once: true`, see [Config Migration](#config-migration.md). + ## Configuration If you are not already familiar with connectors, you may find it helpful to first visit the [Connectors README]. @@ -32,13 +48,36 @@ If you are not already familiar with connectors, you may find it helpful to firs The following settings are available: - `table (required)`: the routing table for this connector. -- `table.statement (required)`: the routing condition provided as the [OTTL] statement. +- `table.context (optional, default: resource)`: the [OTTL Context] in which the statement will be evaluated. Currently, only `resource`, `span`, `metric`, `datapoint`, `log`, and `request` are supported. +- `table.statement`: the routing condition provided as the [OTTL] statement. Required if `table.condition` is not provided. May not be used for `request` context. +- `table.condition`: the routing condition provided as the [OTTL] condition. Required if `table.statement` is not provided. Required for `request` context. - `table.pipelines (required)`: the list of pipelines to use when the routing condition is met. - `default_pipelines (optional)`: contains the list of pipelines to use when a record does not meet any of specified conditions. - `error_mode (optional)`: determines how errors returned from OTTL statements are handled. Valid values are `propagate`, `ignore` and `silent`. If `ignore` or `silent` is used and a statement's condition has an error then the payload will be routed to the default pipelines. When `silent` is used the error is not logged. If not supplied, `propagate` is used. -- `match_once (optional, default: false)`: determines whether the connector matches multiple statements or not. If enabled, the payload will be routed to the first pipeline in the `table` whose routing condition is met. +- `match_once (optional, default: false)`: determines whether the connector matches multiple statements or not. If enabled, the payload will be routed to the first pipeline in the `table` whose routing condition is met. May only be `false` when used with `resource` context. + +### Limitations + +- The `match_once` setting is only supported when using the `resource` context. If any routes use `span`, `metric`, `datapoint`, `log` or `request` context, `match_once` must be set to `true`. +- The `request` context requires use of the `condition` setting, and relies on a very limited grammar. Conditions must be in the form of `request["key"] == "value"` or `request["key"] != "value"`. (In the future, this grammar may be expanded to support more complex conditions.) + +### Supported [OTTL] functions -Example: +- [IsMatch](../../pkg/ottl/ottlfuncs/README.md#IsMatch) +- [delete_key](../../pkg/ottl/ottlfuncs/README.md#delete_key) +- [delete_matching_keys](../../pkg/ottl/ottlfuncs/README.md#delete_matching_keys) + +## Additional Settings + +The full list of settings exposed for this connector are documented [here](./config.go) with detailed sample configuration files: + +- [logs](./testdata/config/logs.yaml) +- [metrics](./testdata/config/metrics.yaml) +- [traces](./testdata/config/traces.yaml) + +## Examples + +Route traces based on an attribute: ```yaml receivers: @@ -89,31 +128,336 @@ service: exporters: [jaeger/ecorp] ``` -A signal may get matched by routing conditions of more than one routing table entry. In this case, the signal will be routed to all pipelines of matching routes. -Respectively, if none of the routing conditions met, then a signal is routed to default pipelines. +Route logs based on tenant: -## Differences between the Routing Connector and Routing Processor +```yaml +receivers: + otlp: -- The connector will only route using [OTTL] statements which can only be applied to resource attributes. It does not support matching on context values at this time. -- The connector routes to pipelines, not exporters as the processor does. +exporters: + file/other: + path: ./other.log + file/acme: + path: ./acme.log + file/ecorp: + path: ./ecorp.log -### OTTL Limitations -- Currently, it is not possible to specify boolean statements without function invocation as the routing condition. It is required to provide the NOOP `route()` or any other supported function as part of the routing statement, see [#13545](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/13545) for more information. -- Supported [OTTL] functions: - - [IsMatch](../../pkg/ottl/ottlfuncs/README.md#IsMatch) - - [delete_key](../../pkg/ottl/ottlfuncs/README.md#delete_key) - - [delete_matching_keys](../../pkg/ottl/ottlfuncs/README.md#delete_matching_keys) +connectors: + routing: + match_once: true + default_pipelines: [logs/other] + table: + - context: request + condition: request["X-Tenant"] == "acme" + pipelines: [logs/acme] + - context: request + condition: request["X-Tenant"] == "ecorp" + pipelines: [logs/ecorp] -## Additional Settings -The full list of settings exposed for this connector are documented [here](./config.go) with detailed sample configuration files: +service: + pipelines: + logs/in: + receivers: [otlp] + exporters: [routing] + logs/acme: + receivers: [routing] + exporters: [file/acme] + logs/ecorp: + receivers: [routing] + exporters: [file/ecorp] + logs/other: + receivers: [routing] + exporters: [file/other] +``` -- [logs](./testdata/config_logs.yaml) -- [metrics](./testdata/config_metrics.yaml) -- [traces](./testdata/config_traces.yaml) +Route logs based on region: + +```yaml +receivers: + otlp: + +exporters: + file/other: + path: ./other.log + file/east: + path: ./east.log + file/west: + path: ./west.log + +connectors: + routing: + match_once: true + default_pipelines: [logs/other] + table: + - context: log + condition: attributes["region"] == "east" + pipelines: [logs/east] + - context: log + condition: attributes["region"] == "west" + pipelines: [logs/west] + +service: + pipelines: + logs/in: + receivers: [otlp] + exporters: [routing] + logs/east: + receivers: [routing] + exporters: [file/east] + logs/west: + receivers: [routing] + exporters: [file/west] + logs/other: + receivers: [routing] + exporters: [file/other] +``` + +Route all low level logs to cheap storage. Route the remainder based on service name: + +```yaml +receivers: + otlp: + +exporters: + file/cheap: + path: ./cheap.log + file/service1: + path: ./service1-important.log + file/ecorp: + path: ./service2-important.log + +connectors: + routing: + match_once: true + table: + - context: log + condition: severity_number < SEVERITY_NUMBER_ERROR + pipelines: [logs/cheap] + - context: resource + condition: attributes["service.name"] == "service1" + pipelines: [logs/service1] + - context: resource + condition: attributes["service.name"] == "service2" + pipelines: [logs/service2] + +service: + pipelines: + logs/in: + receivers: [otlp] + exporters: [routing] + logs/cheap: + receivers: [routing] + exporters: [file/cheap] + logs/service1: + receivers: [routing] + exporters: [file/service1] + logs/service2: + receivers: [routing] + exporters: [file/service2] +``` + +Route all low level logs to cheap storage. Route the remainder based on tenant: + +```yaml +receivers: + otlp: + +exporters: + file/cheap: + path: ./cheap.log + file/acme: + path: ./acme.log + file/ecorp: + path: ./ecorp.log + +connectors: + routing: + match_once: true + table: + - context: log + condition: severity_number < SEVERITY_NUMBER_ERROR + pipelines: [logs/cheap] + - context: request + condition: request["X-Tenant"] == "acme" + pipelines: [logs/acme] + - context: request + condition: request["X-Tenant"] == "ecorp" + pipelines: [logs/ecorp] + +service: + pipelines: + logs/in: + receivers: [otlp] + exporters: [routing] + logs/cheap: + receivers: [routing] + exporters: [file/cheap] + logs/acme: + receivers: [routing] + exporters: [file/acme] + logs/ecorp: + receivers: [routing] + exporters: [file/ecorp] +``` + +## Config Migration + +The following examples demonstrate some strategies for migrating a configuration to `match_once: true`. + +### Example without `default_pipelines` + +If not using `default_pipelines`, you may be able to split the router into multiple parallel routers. +In the following example, the `"env"` and `"region"` are not directly related. + +```yaml +routing: + match_once: false + table: + - condition: attributes["env"] == "prod" + pipelines: [ logs/prod ] + - condition: attributes["env"] == "dev" + pipelines: [ logs/dev ] + - condition: attributes["region"] == "east" + pipelines: [ logs/east ] + - condition: attributes["region"] == "west" + pipelines: [ logs/west ] + +service: + pipelines: + logs/in::exporters: [routing] + logs/prod::receivers: [routing] + logs/dev::receivers: [routing] + logs/east::receivers: [routing] + logs/west::receivers: [routing] +``` + +Therefore, the same behavior can be achieved using separate routers. Listing both routers in the pipeline configuration will +result in each receiving an independent handle to the data. The same data can then match routes in both routers. + +```yaml +routing/env: + match_once: true + table: + - condition: attributes["env"] == "prod" + pipelines: [ logs/prod ] + - condition: attributes["env"] == "dev" + pipelines: [ logs/dev ] +routing/region: + match_once: true + table: + - condition: attributes["region"] == "east" + pipelines: [ logs/east ] + - condition: attributes["region"] == "west" + pipelines: [ logs/west ] + +service: + pipelines: + logs/in::exporters: [routing/env, routing/region] + logs/prod::receivers: [routing/env] + logs/dev::receivers: [routing/env] + logs/east::receivers: [routing/region] + logs/west::receivers: [routing/region] +``` + +### Example with `default_pipelines` + +The following example demonstrates strategies for migrating to `match_once: true` while using `default_pipelines`. + +```yaml +routing: + match_once: false + default_pipelines: [ logs/default ] + table: + - condition: attributes["env"] == "prod" + pipelines: [ logs/prod ] + - condition: attributes["env"] == "dev" + pipelines: [ logs/dev ] + - condition: attributes["region"] == "east" + pipelines: [ logs/east ] + - condition: attributes["region"] == "west" + pipelines: [ logs/west ] + +service: + pipelines: + logs/in::exporters: [routing] + logs/default::receivers: [routing] + logs/prod::receivers: [routing] + logs/dev::receivers: [routing] + logs/east::receivers: [routing] + logs/west::receivers: [routing] +``` + +If the number of routes are limited, you may be able to articulate a route for each combination of conditions. This avoids the need to change any pipelines. + +```yaml +routing: + match_once: true + default_pipelines: [ logs/default ] + table: + - condition: attributes["env"] == "prod" and attributes["region"] == "east" + pipelines: [ logs/prod, logs/east ] + - condition: attributes["env"] == "prod" and attributes["region"] == "west" + pipelines: [ logs/prod, logs/west ] + - condition: attributes["env"] == "dev" and attributes["region"] == "east" + pipelines: [ logs/dev, logs/east ] + - condition: attributes["env"] == "dev" and attributes["region"] == "west" + pipelines: [ logs/dev, logs/west ] + +service: + pipelines: + logs/in::exporters: [routing] + logs/default::receivers: [routing] + logs/prod::receivers: [routing] + logs/dev::receivers: [routing] + logs/east::receivers: [routing] + logs/west::receivers: [routing] +``` + +A more general solution is to use a layered approach. In this design, the first layer is a single router that sorts data according to whether it matches +_any route_ or _no route_. This allows the second layer to work without `default_pipelines`. The downside to this approach is that the set of conditions +in the first and second layers must be kept in sync. + +```yaml +# First layer separates logs that match no routes +routing: + match_once: true + default_pipelines: [ logs/default ] + table: # all routes forward to second layer + - condition: attributes["env"] == "prod" + pipelines: [ logs/env, logs/region ] + - condition: attributes["env"] == "dev" + pipelines: [ logs/env, logs/region ] + - condition: attributes["region"] == "east" + pipelines: [ logs/env, logs/region ] + - condition: attributes["region"] == "west" + pipelines: [ logs/env, logs/region ] + +# Second layer routes logs based on environment and region +routing/env: + match_once: true + table: + - condition: attributes["env"] == "prod" + pipelines: [ logs/prod ] + - condition: attributes["env"] == "dev" + pipelines: [ logs/dev ] +routing/region: + match_once: true + table: + - condition: attributes["region"] == "east" + pipelines: [ logs/east ] + - condition: attributes["region"] == "west" + pipelines: [ logs/west ] + +service: + pipelines: + logs/in::exporters: [routing] + logs/prod::receivers: [routing/env] + logs/dev::receivers: [routing/env] + logs/east::receivers: [routing/region] + logs/west::receivers: [routing/region] +``` -[in development]:https://github.com/open-telemetry/opentelemetry-collector#in-development [Connectors README]:https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md -[Exporter Pipeline Type]:https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md#exporter-pipeline-type -[Receiver Pipeline Type]:https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md#receiver-pipeline-type -[contrib]:https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib -[OTTL]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/processing.md#telemetry-query-language + +[OTTL]: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/pkg/ottl/README.md +[OTTL Context]: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/pkg/ottl/LANGUAGE.md#contexts \ No newline at end of file diff --git a/connector/routingconnector/config.go b/connector/routingconnector/config.go index 5f79cdcde6e1..b3d5add7160e 100644 --- a/connector/routingconnector/config.go +++ b/connector/routingconnector/config.go @@ -5,17 +5,19 @@ package routingconnector // import "github.com/open-telemetry/opentelemetry-coll import ( "errors" + "fmt" - "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/pipeline" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" ) var ( - errEmptyRoute = errors.New("invalid route: no statement provided") - errNoPipelines = errors.New("invalid route: no pipelines defined") - errUnexpectedConsumer = errors.New("expected consumer to be a connector router") - errNoTableItems = errors.New("invalid routing table: the routing table is empty") + errNoConditionOrStatement = errors.New("invalid route: no condition or statement provided") + errConditionAndStatement = errors.New("invalid route: both condition and statement provided") + errNoPipelines = errors.New("invalid route: no pipelines defined") + errUnexpectedConsumer = errors.New("expected consumer to be a connector router") + errNoTableItems = errors.New("invalid routing table: the routing table is empty") ) // Config defines configuration for the Routing processor. @@ -23,7 +25,7 @@ type Config struct { // DefaultPipelines contains the list of pipelines to use when a more specific record can't be // found in the routing table. // Optional. - DefaultPipelines []component.ID `mapstructure:"default_pipelines"` + DefaultPipelines []pipeline.ID `mapstructure:"default_pipelines"` // ErrorMode determines how the processor reacts to errors that occur while processing an OTTL // condition. @@ -55,28 +57,55 @@ func (c *Config) Validate() error { // validate that every route has a value for the routing attribute and has // at least one pipeline for _, item := range c.Table { - if len(item.Statement) == 0 { - return errEmptyRoute + if item.Statement == "" && item.Condition == "" { + return errNoConditionOrStatement + } + if item.Statement != "" && item.Condition != "" { + return errConditionAndStatement } - if len(item.Pipelines) == 0 { return errNoPipelines } - } + switch item.Context { + case "", "resource": // ok + case "request": + if item.Statement != "" || item.Condition == "" { + return fmt.Errorf("%q context requires a 'condition'", item.Context) + } + if _, err := parseRequestCondition(item.Condition); err != nil { + return err + } + fallthrough + case "span", "metric", "datapoint", "log": // ok + if !c.MatchOnce { + return fmt.Errorf(`%q context is not supported with "match_once: false"`, item.Context) + } + default: + return errors.New("invalid context: " + item.Context) + } + } return nil } // RoutingTableItem specifies how data should be routed to the different pipelines type RoutingTableItem struct { + // One of "request", "resource", "log" (other OTTL contexts will be added in the future) + // Optional. Default "resource". + Context string `mapstructure:"context"` + // Statement is a OTTL statement used for making a routing decision. - // Required when 'Value' isn't provided. + // One of 'Statement' or 'Condition' must be provided. Statement string `mapstructure:"statement"` + // Condition is an OTTL condition used for making a routing decision. + // One of 'Statement' or 'Condition' must be provided. + Condition string `mapstructure:"condition"` + // Pipelines contains the list of pipelines to use when the value from the FromAttribute field // matches this table item. When no pipelines are specified, the ones specified under // DefaultPipelines are used, if any. // The routing processor will fail upon the first failure from these pipelines. // Optional. - Pipelines []component.ID `mapstructure:"pipelines"` + Pipelines []pipeline.ID `mapstructure:"pipelines"` } diff --git a/connector/routingconnector/config_test.go b/connector/routingconnector/config_test.go index 350883f38065..7356804005d8 100644 --- a/connector/routingconnector/config_test.go +++ b/connector/routingconnector/config_test.go @@ -11,6 +11,7 @@ import ( "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/confmap/confmaptest" + "go.opentelemetry.io/collector/pipeline" "github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector/internal/metadata" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" @@ -23,75 +24,75 @@ func TestLoadConfig(t *testing.T) { expected component.Config }{ { - configPath: "config_traces.yaml", + configPath: filepath.Join("testdata", "config", "traces.yaml"), id: component.NewIDWithName(metadata.Type, ""), expected: &Config{ - DefaultPipelines: []component.ID{ - component.NewIDWithName(component.DataTypeTraces, "otlp-all"), + DefaultPipelines: []pipeline.ID{ + pipeline.NewIDWithName(pipeline.SignalTraces, "otlp-all"), }, ErrorMode: ottl.PropagateError, Table: []RoutingTableItem{ { Statement: `route() where attributes["X-Tenant"] == "acme"`, - Pipelines: []component.ID{ - component.NewIDWithName(component.DataTypeTraces, "jaeger-acme"), - component.NewIDWithName(component.DataTypeTraces, "otlp-acme"), + Pipelines: []pipeline.ID{ + pipeline.NewIDWithName(pipeline.SignalTraces, "jaeger-acme"), + pipeline.NewIDWithName(pipeline.SignalTraces, "otlp-acme"), }, }, { Statement: `route() where attributes["X-Tenant"] == "globex"`, - Pipelines: []component.ID{ - component.NewIDWithName(component.DataTypeTraces, "otlp-globex"), + Pipelines: []pipeline.ID{ + pipeline.NewIDWithName(pipeline.SignalTraces, "otlp-globex"), }, }, }, }, }, { - configPath: "config_metrics.yaml", + configPath: filepath.Join("testdata", "config", "metrics.yaml"), id: component.NewIDWithName(metadata.Type, ""), expected: &Config{ - DefaultPipelines: []component.ID{ - component.NewIDWithName(component.DataTypeMetrics, "otlp-all"), + DefaultPipelines: []pipeline.ID{ + pipeline.NewIDWithName(pipeline.SignalMetrics, "otlp-all"), }, ErrorMode: ottl.PropagateError, Table: []RoutingTableItem{ { Statement: `route() where attributes["X-Tenant"] == "acme"`, - Pipelines: []component.ID{ - component.NewIDWithName(component.DataTypeMetrics, "jaeger-acme"), - component.NewIDWithName(component.DataTypeMetrics, "otlp-acme"), + Pipelines: []pipeline.ID{ + pipeline.NewIDWithName(pipeline.SignalMetrics, "jaeger-acme"), + pipeline.NewIDWithName(pipeline.SignalMetrics, "otlp-acme"), }, }, { Statement: `route() where attributes["X-Tenant"] == "globex"`, - Pipelines: []component.ID{ - component.NewIDWithName(component.DataTypeMetrics, "otlp-globex"), + Pipelines: []pipeline.ID{ + pipeline.NewIDWithName(pipeline.SignalMetrics, "otlp-globex"), }, }, }, }, }, { - configPath: "config_logs.yaml", + configPath: filepath.Join("testdata", "config", "logs.yaml"), id: component.NewIDWithName(metadata.Type, ""), expected: &Config{ - DefaultPipelines: []component.ID{ - component.NewIDWithName(component.DataTypeLogs, "otlp-all"), + DefaultPipelines: []pipeline.ID{ + pipeline.NewIDWithName(pipeline.SignalLogs, "otlp-all"), }, ErrorMode: ottl.PropagateError, Table: []RoutingTableItem{ { Statement: `route() where attributes["X-Tenant"] == "acme"`, - Pipelines: []component.ID{ - component.NewIDWithName(component.DataTypeLogs, "jaeger-acme"), - component.NewIDWithName(component.DataTypeLogs, "otlp-acme"), + Pipelines: []pipeline.ID{ + pipeline.NewIDWithName(pipeline.SignalLogs, "jaeger-acme"), + pipeline.NewIDWithName(pipeline.SignalLogs, "otlp-acme"), }, }, { Statement: `route() where attributes["X-Tenant"] == "globex"`, - Pipelines: []component.ID{ - component.NewIDWithName(component.DataTypeLogs, "otlp-globex"), + Pipelines: []pipeline.ID{ + pipeline.NewIDWithName(pipeline.SignalLogs, "otlp-globex"), }, }, }, @@ -101,7 +102,7 @@ func TestLoadConfig(t *testing.T) { for _, tt := range testcases { t.Run(tt.configPath, func(t *testing.T) { - cm, err := confmaptest.LoadConf(filepath.Join("testdata", tt.configPath)) + cm, err := confmaptest.LoadConf(tt.configPath) require.NoError(t, err) factory := NewFactory() @@ -109,7 +110,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) @@ -128,13 +129,13 @@ func TestValidateConfig(t *testing.T) { config: &Config{ Table: []RoutingTableItem{ { - Pipelines: []component.ID{ - component.NewIDWithName(component.DataTypeTraces, "otlp"), + Pipelines: []pipeline.ID{ + pipeline.NewIDWithName(pipeline.SignalTraces, "otlp"), }, }, }, }, - error: "invalid route: no statement provided", + error: "invalid route: no condition or statement provided", }, { name: "no pipeline provided", @@ -150,8 +151,8 @@ func TestValidateConfig(t *testing.T) { { name: "no routes provided", config: &Config{ - DefaultPipelines: []component.ID{ - component.NewIDWithName(component.DataTypeTraces, "default"), + DefaultPipelines: []pipeline.ID{ + pipeline.NewIDWithName(pipeline.SignalTraces, "default"), }, }, error: "invalid routing table: the routing table is empty", @@ -161,11 +162,193 @@ func TestValidateConfig(t *testing.T) { config: &Config{}, error: "invalid routing table: the routing table is empty", }, + { + name: "condition provided", + config: &Config{ + Table: []RoutingTableItem{ + { + Condition: `attributes["attr"] == "acme"`, + Pipelines: []pipeline.ID{ + pipeline.NewIDWithName(pipeline.SignalTraces, "otlp"), + }, + }, + }, + }, + }, + { + name: "statement provided", + config: &Config{ + Table: []RoutingTableItem{ + { + Statement: `route() where attributes["attr"] == "acme"`, + Pipelines: []pipeline.ID{ + pipeline.NewIDWithName(pipeline.SignalTraces, "otlp"), + }, + }, + }, + }, + }, + { + name: "both condition and statement provided", + config: &Config{ + Table: []RoutingTableItem{ + { + Condition: `attributes["attr"] == "acme"`, + Statement: `route() where attributes["attr"] == "acme"`, + Pipelines: []pipeline.ID{ + pipeline.NewIDWithName(pipeline.SignalTraces, "otlp"), + }, + }, + }, + }, + error: "invalid route: both condition and statement provided", + }, + { + name: "invalid context", + config: &Config{ + Table: []RoutingTableItem{ + { + Context: "invalid", + Statement: `route() where attributes["attr"] == "acme"`, + Pipelines: []pipeline.ID{ + pipeline.NewIDWithName(pipeline.SignalTraces, "otlp"), + }, + }, + }, + }, + error: "invalid context: invalid", + }, + { + name: "span context with match_once false", + config: &Config{ + MatchOnce: false, + Table: []RoutingTableItem{ + { + Context: "span", + Statement: `route() where attributes["attr"] == "acme"`, + Pipelines: []pipeline.ID{ + pipeline.NewIDWithName(pipeline.SignalTraces, "otlp"), + }, + }, + }, + }, + error: `"span" context is not supported with "match_once: false"`, + }, + { + name: "metric context with match_once false", + config: &Config{ + MatchOnce: false, + Table: []RoutingTableItem{ + { + Context: "metric", + Statement: `route() where attributes["attr"] == "acme"`, + Pipelines: []pipeline.ID{ + pipeline.NewIDWithName(pipeline.SignalTraces, "otlp"), + }, + }, + }, + }, + error: `"metric" context is not supported with "match_once: false"`, + }, + { + name: "datapoint context with match_once false", + config: &Config{ + MatchOnce: false, + Table: []RoutingTableItem{ + { + Context: "datapoint", + Statement: `route() where attributes["attr"] == "acme"`, + Pipelines: []pipeline.ID{ + pipeline.NewIDWithName(pipeline.SignalTraces, "otlp"), + }, + }, + }, + }, + error: `"datapoint" context is not supported with "match_once: false"`, + }, + { + name: "log context with match_once false", + config: &Config{ + MatchOnce: false, + Table: []RoutingTableItem{ + { + Context: "log", + Statement: `route() where attributes["attr"] == "acme"`, + Pipelines: []pipeline.ID{ + pipeline.NewIDWithName(pipeline.SignalTraces, "otlp"), + }, + }, + }, + }, + error: `"log" context is not supported with "match_once: false"`, + }, + { + name: "request context with statement", + config: &Config{ + Table: []RoutingTableItem{ + { + Context: "request", + Statement: `route() where attributes["attr"] == "acme"`, + Pipelines: []pipeline.ID{ + pipeline.NewIDWithName(pipeline.SignalTraces, "otlp"), + }, + }, + }, + }, + error: `"request" context requires a 'condition'`, + }, + { + name: "request context with invalid condition", + config: &Config{ + Table: []RoutingTableItem{ + { + Context: "request", + Condition: `attributes["attr"] == "acme"`, + Pipelines: []pipeline.ID{ + pipeline.NewIDWithName(pipeline.SignalTraces, "otlp"), + }, + }, + }, + }, + error: `condition must have format 'request[""] '`, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - assert.EqualError(t, component.ValidateConfig(tt.config), tt.error) + if tt.error == "" { + assert.NoError(t, component.ValidateConfig(tt.config)) + } else { + assert.EqualError(t, component.ValidateConfig(tt.config), tt.error) + } }) } } + +type testConfigOption func(*Config) + +func withRoute(context, condition string, pipelines ...pipeline.ID) testConfigOption { + return func(cfg *Config) { + cfg.Table = append(cfg.Table, + RoutingTableItem{ + Context: context, + Condition: condition, + Pipelines: pipelines, + }) + } +} + +func withDefault(pipelines ...pipeline.ID) testConfigOption { + return func(cfg *Config) { + cfg.DefaultPipelines = pipelines + } +} + +func testConfig(opts ...testConfigOption) *Config { + cfg := createDefaultConfig().(*Config) + cfg.MatchOnce = true + for _, opt := range opts { + opt(cfg) + } + return cfg +} diff --git a/connector/routingconnector/factory.go b/connector/routingconnector/factory.go index 9019213ed884..ad4bc4a23fb4 100644 --- a/connector/routingconnector/factory.go +++ b/connector/routingconnector/factory.go @@ -37,7 +37,7 @@ func createDefaultConfig() component.Config { // createTracesToTraces creates a traces to traces connector based on provided config. func createTracesToTraces( _ context.Context, - set connector.CreateSettings, + set connector.Settings, cfg component.Config, traces consumer.Traces, ) (connector.Traces, error) { @@ -47,7 +47,7 @@ func createTracesToTraces( // createMetricsToMetrics creates a metrics to metrics connector based on provided config. func createMetricsToMetrics( _ context.Context, - set connector.CreateSettings, + set connector.Settings, cfg component.Config, metrics consumer.Metrics, ) (connector.Metrics, error) { @@ -57,7 +57,7 @@ func createMetricsToMetrics( // createLogsToLogs creates a logs to logs connector based on provided config. func createLogsToLogs( _ context.Context, - set connector.CreateSettings, + set connector.Settings, cfg component.Config, logs consumer.Logs, ) (connector.Logs, error) { diff --git a/connector/routingconnector/factory_test.go b/connector/routingconnector/factory_test.go index 56f436223b2c..1ec28eeb821a 100644 --- a/connector/routingconnector/factory_test.go +++ b/connector/routingconnector/factory_test.go @@ -8,31 +8,31 @@ import ( "testing" "github.com/stretchr/testify/assert" - "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/connector" "go.opentelemetry.io/collector/connector/connectortest" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/consumer/consumertest" + "go.opentelemetry.io/collector/pipeline" ) func TestConnectorCreatedWithValidConfiguration(t *testing.T) { cfg := &Config{ Table: []RoutingTableItem{{ Statement: `route() where attributes["X-Tenant"] == "acme"`, - Pipelines: []component.ID{ - component.NewIDWithName(component.DataTypeTraces, "0"), + Pipelines: []pipeline.ID{ + pipeline.NewIDWithName(pipeline.SignalTraces, "0"), }, }}, } - router := connector.NewTracesRouter(map[component.ID]consumer.Traces{ - component.NewIDWithName(component.DataTypeTraces, "default"): consumertest.NewNop(), - component.NewIDWithName(component.DataTypeTraces, "0"): consumertest.NewNop(), + router := connector.NewTracesRouter(map[pipeline.ID]consumer.Traces{ + pipeline.NewIDWithName(pipeline.SignalTraces, "default"): consumertest.NewNop(), + pipeline.NewIDWithName(pipeline.SignalTraces, "0"): consumertest.NewNop(), }) factory := NewFactory() conn, err := factory.CreateTracesToTraces(context.Background(), - connectortest.NewNopCreateSettings(), cfg, router.(consumer.Traces)) + connectortest.NewNopSettings(), cfg, router.(consumer.Traces)) assert.NoError(t, err) assert.NotNil(t, conn) @@ -42,8 +42,8 @@ func TestCreationFailsWithIncorrectConsumer(t *testing.T) { cfg := &Config{ Table: []RoutingTableItem{{ Statement: `route() where attributes["X-Tenant"] == "acme"`, - Pipelines: []component.ID{ - component.NewIDWithName(component.DataTypeTraces, "0"), + Pipelines: []pipeline.ID{ + pipeline.NewIDWithName(pipeline.SignalTraces, "0"), }, }}, } @@ -54,7 +54,7 @@ func TestCreationFailsWithIncorrectConsumer(t *testing.T) { factory := NewFactory() conn, err := factory.CreateTracesToTraces(context.Background(), - connectortest.NewNopCreateSettings(), cfg, consumer) + connectortest.NewNopSettings(), cfg, consumer) assert.ErrorIs(t, err, errUnexpectedConsumer) assert.Nil(t, conn) diff --git a/connector/routingconnector/go.mod b/connector/routingconnector/go.mod index 86fead3cd5a5..cc21cc17282e 100644 --- a/connector/routingconnector/go.mod +++ b/connector/routingconnector/go.mod @@ -1,61 +1,77 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/connector v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/client v1.22.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/connector v0.116.0 + go.opentelemetry.io/collector/connector/connectortest v0.116.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/pipeline v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 + google.golang.org/grpc v1.68.1 ) require ( github.com/alecthomas/participle/v2 v2.1.1 // indirect - github.com/beorn7/perks v1.0.1 // indirect + github.com/antchfx/xmlquery v1.4.2 // indirect + github.com/antchfx/xpath v1.3.2 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/elastic/go-grok v0.3.1 // indirect + github.com/elastic/lunes v0.1.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gobwas/glob v0.2.3 // indirect + github.com/goccy/go-json v0.10.4 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/iancoleman/strcase v0.3.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect + github.com/magefile/mage v1.15.0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/connector/xconnector v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 // indirect + go.opentelemetry.io/collector/semconv v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/protobuf v1.35.2 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/connector/routingconnector/go.sum b/connector/routingconnector/go.sum index 434f4a139bc3..f8c8b8565c45 100644 --- a/connector/routingconnector/go.sum +++ b/connector/routingconnector/go.sum @@ -4,30 +4,44 @@ github.com/alecthomas/participle/v2 v2.1.1 h1:hrjKESvSqGHzRb4yW1ciisFJ4p3MGYih6i github.com/alecthomas/participle/v2 v2.1.1/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= -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/antchfx/xmlquery v1.4.2 h1:MZKd9+wblwxfQ1zd1AdrTsqVaMjMCwow3IqkCSe00KA= +github.com/antchfx/xmlquery v1.4.2/go.mod h1:QXhvf5ldTuGqhd1SHNvvtlhhdQLks4dD0awIVhXIDTA= +github.com/antchfx/xpath v1.3.2 h1:LNjzlsSjinu3bQpw9hWMY9ocB80oLOWuQqFvO6xt51U= +github.com/antchfx/xpath v1.3.2/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/elastic/go-grok v0.3.1 h1:WEhUxe2KrwycMnlvMimJXvzRa7DoByJB4PVUIE1ZD/U= +github.com/elastic/go-grok v0.3.1/go.mod h1:n38ls8ZgOboZRgKcjMY8eFeZFMmcL9n2lP0iHhIDk64= +github.com/elastic/lunes v0.1.0 h1:amRtLPjwkWtzDF/RKzcEPMvSsSseLDLW+bnhfNSLRe4= +github.com/elastic/lunes v0.1.0/go.mod h1:xGphYIt3XdZRtyWosHQTErsQTd4OP1p9wsbVoHelrd4= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= +github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= @@ -40,12 +54,14 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= +github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= @@ -58,50 +74,63 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 h1:SIKIoA4e/5Y9ZOl0DCe3eVMLPOQzJxgZpfdHHeauNTM= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6/go.mod h1:BUbeWZiieNxAuuADTBNb3/aeje6on3DhU3rpWsQSB1E= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/connector v0.102.0 h1:IvAsVfYRxP0ajmKbUovF8qugkcUtHq6RuYNtjcMa63E= -go.opentelemetry.io/collector/connector v0.102.0/go.mod h1:f4M7wZ/9+XtgTE0fivBFH3WlwntaEd0qFFA0giFkdnY= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/connector v0.116.0 h1:0Pz8RAXH1swLeA1fiyGGQWdv0Kemz4mbq+jnmd1TACE= +go.opentelemetry.io/collector/connector v0.116.0/go.mod h1:VQiZ2yW9KhZuF0yjDbvlgrAxm7+o8KQoxHxurQWLjKU= +go.opentelemetry.io/collector/connector/connectortest v0.116.0 h1:MdttvjqdZmp0ewW5IPCEtzzYmCqxrQxsjJ5m6gMVjzA= +go.opentelemetry.io/collector/connector/connectortest v0.116.0/go.mod h1:ko7aPyvAVf6SvRhWGZdPXSyk+7zPmsSCcMq0gYPMMIQ= +go.opentelemetry.io/collector/connector/xconnector v0.116.0 h1:fFJzrRco0g7HMkhnQ+ehlvicFf58vzsCLXnfuHyQM8w= +go.opentelemetry.io/collector/connector/xconnector v0.116.0/go.mod h1:m9oCk32zX6wDciYBpy+qMQkWKtOxb0gAkEUm8+trflY= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 h1:KKFb3u8iLk4V5GYz7eVpw8QgEdob5koX6GNEbaoDQJY= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0/go.mod h1:YyWHUWeSnRmy2CF7kPHpwJ6qkVjufbLZ8PYuY0Ph0o8= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 h1:PFNy+Il/kqPdPL9rhG+1kG63Aauya+FhBKGXoB6ivxU= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0/go.mod h1:bVn9V4TGyeXi58/JDkeXCuKtc+V+qcOoTl8hNpV0qa8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -111,44 +140,64 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/connector/routingconnector/internal/metadata/generated_status.go b/connector/routingconnector/internal/metadata/generated_status.go index 42c44165d439..f846134222a0 100644 --- a/connector/routingconnector/internal/metadata/generated_status.go +++ b/connector/routingconnector/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("routing") + Type = component.MustNewType("routing") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector" ) const ( diff --git a/connector/routingconnector/internal/metadata/generated_telemetry.go b/connector/routingconnector/internal/metadata/generated_telemetry.go deleted file mode 100644 index a567f072d910..000000000000 --- a/connector/routingconnector/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/routing") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/routing") -} diff --git a/connector/routingconnector/internal/metadata/generated_telemetry_test.go b/connector/routingconnector/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 599fcdbe75f4..000000000000 --- a/connector/routingconnector/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/routing", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/routing", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/connector/routingconnector/internal/plogutil/logs.go b/connector/routingconnector/internal/plogutil/logs.go new file mode 100644 index 000000000000..5374073b7fd9 --- /dev/null +++ b/connector/routingconnector/internal/plogutil/logs.go @@ -0,0 +1,63 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package plogutil // import "github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector/internal/plogutil" + +import ( + "go.opentelemetry.io/collector/pdata/plog" +) + +// MoveResourcesIf calls f sequentially for each ResourceLogs present in the first plog.Logs. +// If f returns true, the element is removed from the first plog.Logs and added to the second plog.Logs. +func MoveResourcesIf(from, to plog.Logs, f func(plog.ResourceLogs) bool) { + from.ResourceLogs().RemoveIf(func(rl plog.ResourceLogs) bool { + if !f(rl) { + return false + } + rl.CopyTo(to.ResourceLogs().AppendEmpty()) + return true + }) +} + +// MoveRecordsWithContextIf calls f sequentially for each LogRecord present in the first plog.Logs. +// If f returns true, the element is removed from the first plog.Logs and added to the second plog.Logs. +// Notably, the Resource and Scope associated with the LogRecord are created in the second plog.Logs only once. +// Resources or Scopes are removed from the original if they become empty. All ordering is preserved. +func MoveRecordsWithContextIf(from, to plog.Logs, f func(plog.ResourceLogs, plog.ScopeLogs, plog.LogRecord) bool) { + rls := from.ResourceLogs() + for i := 0; i < rls.Len(); i++ { + rl := rls.At(i) + sls := rl.ScopeLogs() + var rlCopy *plog.ResourceLogs + for j := 0; j < sls.Len(); j++ { + sl := sls.At(j) + lrs := sl.LogRecords() + var slCopy *plog.ScopeLogs + lrs.RemoveIf(func(lr plog.LogRecord) bool { + if !f(rl, sl, lr) { + return false + } + if rlCopy == nil { + rlc := to.ResourceLogs().AppendEmpty() + rlCopy = &rlc + rl.Resource().CopyTo(rlCopy.Resource()) + rlCopy.SetSchemaUrl(rl.SchemaUrl()) + } + if slCopy == nil { + slc := rlCopy.ScopeLogs().AppendEmpty() + slCopy = &slc + sl.Scope().CopyTo(slCopy.Scope()) + slCopy.SetSchemaUrl(sl.SchemaUrl()) + } + lr.CopyTo(slCopy.LogRecords().AppendEmpty()) + return true + }) + } + sls.RemoveIf(func(sl plog.ScopeLogs) bool { + return sl.LogRecords().Len() == 0 + }) + } + rls.RemoveIf(func(rl plog.ResourceLogs) bool { + return rl.ScopeLogs().Len() == 0 + }) +} diff --git a/connector/routingconnector/internal/plogutil/logs_test.go b/connector/routingconnector/internal/plogutil/logs_test.go new file mode 100644 index 000000000000..b428e2e8583e --- /dev/null +++ b/connector/routingconnector/internal/plogutil/logs_test.go @@ -0,0 +1,235 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package plogutil_test + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "go.opentelemetry.io/collector/pdata/plog" + + "github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector/internal/plogutil" + "github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector/internal/plogutiltest" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/plogtest" +) + +func TestMoveResourcesIf(t *testing.T) { + testCases := []struct { + name string + moveIf func(plog.ResourceLogs) bool + from plog.Logs + to plog.Logs + expectFrom plog.Logs + expectTo plog.Logs + }{ + { + name: "move_none", + moveIf: func(plog.ResourceLogs) bool { + return false + }, + from: plogutiltest.NewLogs("AB", "CD", "EF"), + to: plog.NewLogs(), + expectFrom: plogutiltest.NewLogs("AB", "CD", "EF"), + expectTo: plog.NewLogs(), + }, + { + name: "move_all", + moveIf: func(plog.ResourceLogs) bool { + return true + }, + from: plogutiltest.NewLogs("AB", "CD", "EF"), + to: plog.NewLogs(), + expectFrom: plog.NewLogs(), + expectTo: plogutiltest.NewLogs("AB", "CD", "EF"), + }, + { + name: "move_one", + moveIf: func(rl plog.ResourceLogs) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceA" + }, + from: plogutiltest.NewLogs("AB", "CD", "EF"), + to: plog.NewLogs(), + expectFrom: plogutiltest.NewLogs("B", "CD", "EF"), + expectTo: plogutiltest.NewLogs("A", "CD", "EF"), + }, + { + name: "move_to_preexisting", + moveIf: func(rl plog.ResourceLogs) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceB" + }, + from: plogutiltest.NewLogs("AB", "CD", "EF"), + to: plogutiltest.NewLogs("1", "2", "3"), + expectFrom: plogutiltest.NewLogs("A", "CD", "EF"), + expectTo: plogutiltest.NewLogsFromOpts( + plogutiltest.Resource("1", + plogutiltest.Scope("2", plogutiltest.LogRecord("3")), + ), + plogutiltest.Resource("B", + plogutiltest.Scope("C", plogutiltest.LogRecord("E"), plogutiltest.LogRecord("F")), + plogutiltest.Scope("D", plogutiltest.LogRecord("E"), plogutiltest.LogRecord("F")), + ), + ), + }, + } + + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + plogutil.MoveResourcesIf(tt.from, tt.to, tt.moveIf) + assert.NoError(t, plogtest.CompareLogs(tt.expectFrom, tt.from), "from not modified as expected") + assert.NoError(t, plogtest.CompareLogs(tt.expectTo, tt.to), "to not as expected") + }) + } +} + +func TestMoveRecordsWithContextIf(t *testing.T) { + testCases := []struct { + name string + moveIf func(plog.ResourceLogs, plog.ScopeLogs, plog.LogRecord) bool + from plog.Logs + to plog.Logs + expectFrom plog.Logs + expectTo plog.Logs + }{ + { + name: "move_none", + moveIf: func(plog.ResourceLogs, plog.ScopeLogs, plog.LogRecord) bool { + return false + }, + from: plogutiltest.NewLogs("AB", "CD", "EF"), + to: plog.NewLogs(), + expectFrom: plogutiltest.NewLogs("AB", "CD", "EF"), + expectTo: plog.NewLogs(), + }, + { + name: "move_all", + moveIf: func(plog.ResourceLogs, plog.ScopeLogs, plog.LogRecord) bool { + return true + }, + from: plogutiltest.NewLogs("AB", "CD", "EF"), + to: plog.NewLogs(), + expectFrom: plog.NewLogs(), + expectTo: plogutiltest.NewLogs("AB", "CD", "EF"), + }, + { + name: "move_all_from_one_resource", + moveIf: func(rl plog.ResourceLogs, _ plog.ScopeLogs, _ plog.LogRecord) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceB" + }, + from: plogutiltest.NewLogs("AB", "CD", "EF"), + to: plog.NewLogs(), + expectFrom: plogutiltest.NewLogs("A", "CD", "EF"), + expectTo: plogutiltest.NewLogs("B", "CD", "EF"), + }, + { + name: "move_all_from_one_scope", + moveIf: func(rl plog.ResourceLogs, sl plog.ScopeLogs, _ plog.LogRecord) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceB" && sl.Scope().Name() == "scopeC" + }, + from: plogutiltest.NewLogs("AB", "CD", "EF"), + to: plog.NewLogs(), + expectFrom: plogutiltest.NewLogsFromOpts( + plogutiltest.Resource("A", + plogutiltest.Scope("C", plogutiltest.LogRecord("E"), plogutiltest.LogRecord("F")), + plogutiltest.Scope("D", plogutiltest.LogRecord("E"), plogutiltest.LogRecord("F")), + ), + plogutiltest.Resource("B", + plogutiltest.Scope("D", plogutiltest.LogRecord("E"), plogutiltest.LogRecord("F")), + ), + ), + expectTo: plogutiltest.NewLogs("B", "C", "EF"), + }, + { + name: "move_all_from_one_scope_in_each_resource", + moveIf: func(_ plog.ResourceLogs, sl plog.ScopeLogs, _ plog.LogRecord) bool { + return sl.Scope().Name() == "scopeD" + }, + from: plogutiltest.NewLogs("AB", "CD", "EF"), + to: plog.NewLogs(), + expectFrom: plogutiltest.NewLogs("AB", "C", "EF"), + expectTo: plogutiltest.NewLogs("AB", "D", "EF"), + }, + { + name: "move_one", + moveIf: func(rl plog.ResourceLogs, sl plog.ScopeLogs, lr plog.LogRecord) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceA" && sl.Scope().Name() == "scopeD" && lr.Body().AsString() == "logF" + }, + from: plogutiltest.NewLogs("AB", "CD", "EF"), + to: plog.NewLogs(), + expectFrom: plogutiltest.NewLogsFromOpts( + plogutiltest.Resource("A", + plogutiltest.Scope("C", plogutiltest.LogRecord("E"), plogutiltest.LogRecord("F")), + plogutiltest.Scope("D", plogutiltest.LogRecord("E")), + ), + plogutiltest.Resource("B", + plogutiltest.Scope("C", plogutiltest.LogRecord("E"), plogutiltest.LogRecord("F")), + plogutiltest.Scope("D", plogutiltest.LogRecord("E"), plogutiltest.LogRecord("F")), + ), + ), + expectTo: plogutiltest.NewLogs("A", "D", "F"), + }, + { + name: "move_one_from_each_scope", + moveIf: func(_ plog.ResourceLogs, _ plog.ScopeLogs, lr plog.LogRecord) bool { + return lr.Body().AsString() == "logE" + }, + from: plogutiltest.NewLogs("AB", "CD", "EF"), + to: plog.NewLogs(), + expectFrom: plogutiltest.NewLogs("AB", "CD", "F"), + expectTo: plogutiltest.NewLogs("AB", "CD", "E"), + }, + { + name: "move_one_from_each_scope_in_one_resource", + moveIf: func(rl plog.ResourceLogs, _ plog.ScopeLogs, lr plog.LogRecord) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceB" && lr.Body().AsString() == "logE" + }, + from: plogutiltest.NewLogs("AB", "CD", "EF"), + to: plog.NewLogs(), + expectFrom: plogutiltest.NewLogsFromOpts( + plogutiltest.Resource("A", + plogutiltest.Scope("C", plogutiltest.LogRecord("E"), plogutiltest.LogRecord("F")), + plogutiltest.Scope("D", plogutiltest.LogRecord("E"), plogutiltest.LogRecord("F")), + ), + plogutiltest.Resource("B", + plogutiltest.Scope("C", plogutiltest.LogRecord("F")), + plogutiltest.Scope("D", plogutiltest.LogRecord("F")), + ), + ), + expectTo: plogutiltest.NewLogs("B", "CD", "E"), + }, + { + name: "move_some_to_preexisting", + moveIf: func(_ plog.ResourceLogs, sl plog.ScopeLogs, _ plog.LogRecord) bool { + return sl.Scope().Name() == "scopeD" + }, + from: plogutiltest.NewLogs("AB", "CD", "EF"), + to: plogutiltest.NewLogs("1", "2", "3"), + expectFrom: plogutiltest.NewLogs("AB", "C", "EF"), + expectTo: plogutiltest.NewLogsFromOpts( + plogutiltest.Resource("1", + plogutiltest.Scope("2", plogutiltest.LogRecord("3")), + ), + plogutiltest.Resource("A", + plogutiltest.Scope("D", plogutiltest.LogRecord("E"), plogutiltest.LogRecord("F")), + ), + plogutiltest.Resource("B", + plogutiltest.Scope("D", plogutiltest.LogRecord("E"), plogutiltest.LogRecord("F")), + ), + ), + }, + } + + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + plogutil.MoveRecordsWithContextIf(tt.from, tt.to, tt.moveIf) + assert.NoError(t, plogtest.CompareLogs(tt.expectFrom, tt.from), "from not modified as expected") + assert.NoError(t, plogtest.CompareLogs(tt.expectTo, tt.to), "to not as expected") + }) + } +} diff --git a/connector/routingconnector/internal/plogutiltest/logs.go b/connector/routingconnector/internal/plogutiltest/logs.go new file mode 100644 index 000000000000..81bd5761a3b2 --- /dev/null +++ b/connector/routingconnector/internal/plogutiltest/logs.go @@ -0,0 +1,70 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package plogutiltest // import "github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector/internal/plogutiltest" + +import "go.opentelemetry.io/collector/pdata/plog" + +// NewLogs returns a plog.Logs with a uniform structure where resources, scopes, and +// log records are identical across all instances, except for one identifying field. +// +// Identifying fields: +// - Resources have an attribute called "resourceName" with a value of "resourceN". +// - Scopes have a name with a value of "scopeN". +// - LogRecords have a body with a value of "logN". +// +// Example: NewLogs("AB", "XYZ", "1234") returns: +// +// resourceA, resourceB +// each with scopeX, scopeY, scopeZ +// each with log1, log2, log3, log4 +// +// Each byte in the input string is a unique ID for the corresponding element. +func NewLogs(resourceIDs, scopeIDs, logRecordIDs string) plog.Logs { + ld := plog.NewLogs() + for resourceN := 0; resourceN < len(resourceIDs); resourceN++ { + rl := ld.ResourceLogs().AppendEmpty() + rl.Resource().Attributes().PutStr("resourceName", "resource"+string(resourceIDs[resourceN])) + for scopeN := 0; scopeN < len(scopeIDs); scopeN++ { + sl := rl.ScopeLogs().AppendEmpty() + sl.Scope().SetName("scope" + string(scopeIDs[scopeN])) + for logRecordN := 0; logRecordN < len(logRecordIDs); logRecordN++ { + lr := sl.LogRecords().AppendEmpty() + lr.Body().SetStr("log" + string(logRecordIDs[logRecordN])) + } + } + } + return ld +} + +func NewLogsFromOpts(resources ...plog.ResourceLogs) plog.Logs { + ld := plog.NewLogs() + for _, resource := range resources { + resource.CopyTo(ld.ResourceLogs().AppendEmpty()) + } + return ld +} + +func Resource(id string, scopes ...plog.ScopeLogs) plog.ResourceLogs { + rl := plog.NewResourceLogs() + rl.Resource().Attributes().PutStr("resourceName", "resource"+id) + for _, scope := range scopes { + scope.CopyTo(rl.ScopeLogs().AppendEmpty()) + } + return rl +} + +func Scope(id string, logs ...plog.LogRecord) plog.ScopeLogs { + s := plog.NewScopeLogs() + s.Scope().SetName("scope" + id) + for _, log := range logs { + log.CopyTo(s.LogRecords().AppendEmpty()) + } + return s +} + +func LogRecord(id string) plog.LogRecord { + lr := plog.NewLogRecord() + lr.Body().SetStr("log" + id) + return lr +} diff --git a/connector/routingconnector/internal/plogutiltest/logs_test.go b/connector/routingconnector/internal/plogutiltest/logs_test.go new file mode 100644 index 000000000000..c00cef21bec4 --- /dev/null +++ b/connector/routingconnector/internal/plogutiltest/logs_test.go @@ -0,0 +1,140 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package plogutiltest_test + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "go.opentelemetry.io/collector/pdata/plog" + + "github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector/internal/plogutiltest" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/plogtest" +) + +func TestNewLogs(t *testing.T) { + t.Run("empty", func(t *testing.T) { + expected := plog.NewLogs() + assert.NoError(t, plogtest.CompareLogs(expected, plogutiltest.NewLogs("", "", ""))) + assert.NoError(t, plogtest.CompareLogs(expected, plogutiltest.NewLogsFromOpts())) + }) + + t.Run("simple", func(t *testing.T) { + expected := func() plog.Logs { + ld := plog.NewLogs() + r := ld.ResourceLogs().AppendEmpty() + r.Resource().Attributes().PutStr("resourceName", "resourceA") // resourceA + s := r.ScopeLogs().AppendEmpty() + s.Scope().SetName("scopeB") // resourceA.scopeB + l := s.LogRecords().AppendEmpty() + l.Body().SetStr("logC") // resourceA.scopeB.logC + return ld + }() + assert.NoError(t, plogtest.CompareLogs(expected, plogutiltest.NewLogs("A", "B", "C"))) + assert.NoError(t, plogtest.CompareLogs(expected, plogutiltest.NewLogsFromOpts( + plogutiltest.Resource("A", plogutiltest.Scope("B", plogutiltest.LogRecord("C"))), + ))) + }) + + t.Run("two_resources", func(t *testing.T) { + expected := func() plog.Logs { + ld := plog.NewLogs() + r := ld.ResourceLogs().AppendEmpty() + r.Resource().Attributes().PutStr("resourceName", "resourceA") // resourceA + s := r.ScopeLogs().AppendEmpty() + s.Scope().SetName("scopeC") // resourceA.scopeC + l := s.LogRecords().AppendEmpty() + l.Body().SetStr("logD") // resourceA.scopeC.logD + r = ld.ResourceLogs().AppendEmpty() + r.Resource().Attributes().PutStr("resourceName", "resourceB") // resourceB + s = r.ScopeLogs().AppendEmpty() + s.Scope().SetName("scopeC") // resourceB.scopeC + l = s.LogRecords().AppendEmpty() + l.Body().SetStr("logD") // resourceB.scopeC.logD + return ld + }() + assert.NoError(t, plogtest.CompareLogs(expected, plogutiltest.NewLogs("AB", "C", "D"))) + assert.NoError(t, plogtest.CompareLogs(expected, plogutiltest.NewLogsFromOpts( + plogutiltest.Resource("A", plogutiltest.Scope("C", plogutiltest.LogRecord("D"))), + plogutiltest.Resource("B", plogutiltest.Scope("C", plogutiltest.LogRecord("D"))), + ))) + }) + + t.Run("two_scopes", func(t *testing.T) { + expected := func() plog.Logs { + ld := plog.NewLogs() + r := ld.ResourceLogs().AppendEmpty() + r.Resource().Attributes().PutStr("resourceName", "resourceA") // resourceA + s := r.ScopeLogs().AppendEmpty() + s.Scope().SetName("scopeB") // resourceA.scopeB + l := s.LogRecords().AppendEmpty() + l.Body().SetStr("logD") // resourceA.scopeB.logD + s = r.ScopeLogs().AppendEmpty() + s.Scope().SetName("scopeC") // resourceA.scopeC + l = s.LogRecords().AppendEmpty() + l.Body().SetStr("logD") // resourceA.scopeC.logD + return ld + }() + assert.NoError(t, plogtest.CompareLogs(expected, plogutiltest.NewLogs("A", "BC", "D"))) + assert.NoError(t, plogtest.CompareLogs(expected, plogutiltest.NewLogsFromOpts( + plogutiltest.Resource("A", + plogutiltest.Scope("B", plogutiltest.LogRecord("D")), + plogutiltest.Scope("C", plogutiltest.LogRecord("D")), + ), + ))) + }) + + t.Run("two_records", func(t *testing.T) { + expected := func() plog.Logs { + ld := plog.NewLogs() + r := ld.ResourceLogs().AppendEmpty() + r.Resource().Attributes().PutStr("resourceName", "resourceA") // resourceA + s := r.ScopeLogs().AppendEmpty() + s.Scope().SetName("scopeB") // resourceA.scopeB + l := s.LogRecords().AppendEmpty() + l.Body().SetStr("logC") // resourceA.scopeB.logC + l = s.LogRecords().AppendEmpty() + l.Body().SetStr("logD") // resourceA.scopeB.logD + return ld + }() + assert.NoError(t, plogtest.CompareLogs(expected, plogutiltest.NewLogs("A", "B", "CD"))) + assert.NoError(t, plogtest.CompareLogs(expected, plogutiltest.NewLogsFromOpts( + plogutiltest.Resource("A", plogutiltest.Scope("B", plogutiltest.LogRecord("C"), plogutiltest.LogRecord("D"))), + ))) + }) + + t.Run("asymetrical_scopes", func(t *testing.T) { + expected := func() plog.Logs { + ld := plog.NewLogs() + r := ld.ResourceLogs().AppendEmpty() + r.Resource().Attributes().PutStr("resourceName", "resourceA") // resourceA + s := r.ScopeLogs().AppendEmpty() + s.Scope().SetName("scopeC") // resourceA.scopeC + l := s.LogRecords().AppendEmpty() + l.Body().SetStr("logE") // resourceA.scopeC.logE + s = r.ScopeLogs().AppendEmpty() + s.Scope().SetName("scopeD") // resourceA.scopeD + l = s.LogRecords().AppendEmpty() + l.Body().SetStr("logE") // resourceA.scopeD.logE + r = ld.ResourceLogs().AppendEmpty() + r.Resource().Attributes().PutStr("resourceName", "resourceB") // resourceB + s = r.ScopeLogs().AppendEmpty() + s.Scope().SetName("scopeD") // resourceB.scopeD + l = s.LogRecords().AppendEmpty() + l.Body().SetStr("logF") // resourceB.scopeD.logF + l = s.LogRecords().AppendEmpty() + l.Body().SetStr("logG") // resourceB.scopeD.logG + return ld + }() + assert.NoError(t, plogtest.CompareLogs(expected, plogutiltest.NewLogsFromOpts( + plogutiltest.Resource("A", + plogutiltest.Scope("C", plogutiltest.LogRecord("E")), + plogutiltest.Scope("D", plogutiltest.LogRecord("E")), + ), + plogutiltest.Resource("B", + plogutiltest.Scope("D", plogutiltest.LogRecord("F"), plogutiltest.LogRecord("G")), + ), + ))) + }) +} diff --git a/connector/routingconnector/internal/pmetricutil/metrics.go b/connector/routingconnector/internal/pmetricutil/metrics.go new file mode 100644 index 000000000000..3744506405de --- /dev/null +++ b/connector/routingconnector/internal/pmetricutil/metrics.go @@ -0,0 +1,254 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package pmetricutil // import "github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector/internal/pmetricutil" + +import "go.opentelemetry.io/collector/pdata/pmetric" + +// MoveResourcesIf calls f sequentially for each ResourceSpans present in the first pmetric.Metrics. +// If f returns true, the element is removed from the first pmetric.Metrics and added to the second pmetric.Metrics. +func MoveResourcesIf(from, to pmetric.Metrics, f func(pmetric.ResourceMetrics) bool) { + from.ResourceMetrics().RemoveIf(func(rs pmetric.ResourceMetrics) bool { + if !f(rs) { + return false + } + rs.CopyTo(to.ResourceMetrics().AppendEmpty()) + return true + }) +} + +// MoveMetricsWithContextIf calls f sequentially for each Metric present in the first pmetric.Metrics. +// If f returns true, the element is removed from the first pmetric.Metrics and added to the second pmetric.Metrics. +// Notably, the Resource and Scope associated with the Metric are created in the second pmetric.Metrics only once. +// Resources or Scopes are removed from the original if they become empty. All ordering is preserved. +func MoveMetricsWithContextIf(from, to pmetric.Metrics, f func(pmetric.ResourceMetrics, pmetric.ScopeMetrics, pmetric.Metric) bool) { + rms := from.ResourceMetrics() + for i := 0; i < rms.Len(); i++ { + rm := rms.At(i) + sms := rm.ScopeMetrics() + var rmCopy *pmetric.ResourceMetrics + for j := 0; j < sms.Len(); j++ { + sm := sms.At(j) + ms := sm.Metrics() + var smCopy *pmetric.ScopeMetrics + ms.RemoveIf(func(m pmetric.Metric) bool { + if !f(rm, sm, m) { + return false + } + if rmCopy == nil { + rmc := to.ResourceMetrics().AppendEmpty() + rmCopy = &rmc + rm.Resource().CopyTo(rmCopy.Resource()) + rmCopy.SetSchemaUrl(rm.SchemaUrl()) + } + if smCopy == nil { + smc := rmCopy.ScopeMetrics().AppendEmpty() + smCopy = &smc + sm.Scope().CopyTo(smCopy.Scope()) + smCopy.SetSchemaUrl(sm.SchemaUrl()) + } + m.CopyTo(smCopy.Metrics().AppendEmpty()) + return true + }) + } + sms.RemoveIf(func(sm pmetric.ScopeMetrics) bool { + return sm.Metrics().Len() == 0 + }) + } + rms.RemoveIf(func(rm pmetric.ResourceMetrics) bool { + return rm.ScopeMetrics().Len() == 0 + }) +} + +// MoveDataPointsWithContextIf calls f sequentially for each DataPoint present in the first pmetric.Metrics. +// If f returns true, the element is removed from the first pmetric.Metrics and added to the second pmetric.Metrics. +// Notably, the Resource, Scope, and Metric associated with the DataPoint are created in the second pmetric.Metrics only once. +// Resources, Scopes, or Metrics are removed from the original if they become empty. All ordering is preserved. +func MoveDataPointsWithContextIf(from, to pmetric.Metrics, f func(pmetric.ResourceMetrics, pmetric.ScopeMetrics, pmetric.Metric, any) bool) { + rms := from.ResourceMetrics() + for i := 0; i < rms.Len(); i++ { + rm := rms.At(i) + sms := rm.ScopeMetrics() + var rmCopy *pmetric.ResourceMetrics + for j := 0; j < sms.Len(); j++ { + sm := sms.At(j) + ms := sm.Metrics() + var smCopy *pmetric.ScopeMetrics + for k := 0; k < ms.Len(); k++ { + m := ms.At(k) + var mCopy *pmetric.Metric + + // TODO condense this code + switch m.Type() { + case pmetric.MetricTypeGauge: + dps := m.Gauge().DataPoints() + dps.RemoveIf(func(dp pmetric.NumberDataPoint) bool { + if !f(rm, sm, m, dp) { + return false + } + if rmCopy == nil { + rmc := to.ResourceMetrics().AppendEmpty() + rmCopy = &rmc + rm.Resource().CopyTo(rmCopy.Resource()) + rmCopy.SetSchemaUrl(rm.SchemaUrl()) + } + if smCopy == nil { + smc := rmCopy.ScopeMetrics().AppendEmpty() + smCopy = &smc + sm.Scope().CopyTo(smCopy.Scope()) + smCopy.SetSchemaUrl(sm.SchemaUrl()) + } + if mCopy == nil { + mc := smCopy.Metrics().AppendEmpty() + mCopy = &mc + mCopy.SetName(m.Name()) + mCopy.SetDescription(m.Description()) + mCopy.SetUnit(m.Unit()) + mCopy.SetEmptyGauge() + } + dp.CopyTo(mCopy.Gauge().DataPoints().AppendEmpty()) + return true + }) + case pmetric.MetricTypeSum: + dps := m.Sum().DataPoints() + dps.RemoveIf(func(dp pmetric.NumberDataPoint) bool { + if !f(rm, sm, m, dp) { + return false + } + if rmCopy == nil { + rmc := to.ResourceMetrics().AppendEmpty() + rmCopy = &rmc + rm.Resource().CopyTo(rmCopy.Resource()) + rmCopy.SetSchemaUrl(rm.SchemaUrl()) + } + if smCopy == nil { + smc := rmCopy.ScopeMetrics().AppendEmpty() + smCopy = &smc + sm.Scope().CopyTo(smCopy.Scope()) + smCopy.SetSchemaUrl(sm.SchemaUrl()) + } + if mCopy == nil { + mc := smCopy.Metrics().AppendEmpty() + mCopy = &mc + mCopy.SetName(m.Name()) + mCopy.SetDescription(m.Description()) + mCopy.SetUnit(m.Unit()) + mCopy.SetEmptySum() + } + dp.CopyTo(mCopy.Sum().DataPoints().AppendEmpty()) + return true + }) + case pmetric.MetricTypeHistogram: + dps := m.Histogram().DataPoints() + dps.RemoveIf(func(dp pmetric.HistogramDataPoint) bool { + if !f(rm, sm, m, dp) { + return false + } + if rmCopy == nil { + rmc := to.ResourceMetrics().AppendEmpty() + rmCopy = &rmc + rm.Resource().CopyTo(rmCopy.Resource()) + rmCopy.SetSchemaUrl(rm.SchemaUrl()) + } + if smCopy == nil { + smc := rmCopy.ScopeMetrics().AppendEmpty() + smCopy = &smc + sm.Scope().CopyTo(smCopy.Scope()) + smCopy.SetSchemaUrl(sm.SchemaUrl()) + } + if mCopy == nil { + mc := smCopy.Metrics().AppendEmpty() + mCopy = &mc + mCopy.SetName(m.Name()) + mCopy.SetDescription(m.Description()) + mCopy.SetUnit(m.Unit()) + mCopy.SetEmptyHistogram() + } + dp.CopyTo(mCopy.Histogram().DataPoints().AppendEmpty()) + return true + }) + case pmetric.MetricTypeExponentialHistogram: + dps := m.ExponentialHistogram().DataPoints() + dps.RemoveIf(func(dp pmetric.ExponentialHistogramDataPoint) bool { + if !f(rm, sm, m, dp) { + return false + } + if rmCopy == nil { + rmc := to.ResourceMetrics().AppendEmpty() + rmCopy = &rmc + rm.Resource().CopyTo(rmCopy.Resource()) + rmCopy.SetSchemaUrl(rm.SchemaUrl()) + } + if smCopy == nil { + smc := rmCopy.ScopeMetrics().AppendEmpty() + smCopy = &smc + sm.Scope().CopyTo(smCopy.Scope()) + smCopy.SetSchemaUrl(sm.SchemaUrl()) + } + if mCopy == nil { + mc := smCopy.Metrics().AppendEmpty() + mCopy = &mc + mCopy.SetName(m.Name()) + mCopy.SetDescription(m.Description()) + mCopy.SetUnit(m.Unit()) + mCopy.SetEmptyExponentialHistogram() + } + dp.CopyTo(mCopy.ExponentialHistogram().DataPoints().AppendEmpty()) + return true + }) + case pmetric.MetricTypeSummary: + dps := m.Summary().DataPoints() + dps.RemoveIf(func(dp pmetric.SummaryDataPoint) bool { + if !f(rm, sm, m, dp) { + return false + } + if rmCopy == nil { + rmc := to.ResourceMetrics().AppendEmpty() + rmCopy = &rmc + rm.Resource().CopyTo(rmCopy.Resource()) + rmCopy.SetSchemaUrl(rm.SchemaUrl()) + } + if smCopy == nil { + smc := rmCopy.ScopeMetrics().AppendEmpty() + smCopy = &smc + sm.Scope().CopyTo(smCopy.Scope()) + smCopy.SetSchemaUrl(sm.SchemaUrl()) + } + if mCopy == nil { + mc := smCopy.Metrics().AppendEmpty() + mCopy = &mc + mCopy.SetName(m.Name()) + mCopy.SetDescription(m.Description()) + mCopy.SetUnit(m.Unit()) + mCopy.SetEmptySummary() + } + dp.CopyTo(mCopy.Summary().DataPoints().AppendEmpty()) + return true + }) + } + } + ms.RemoveIf(func(m pmetric.Metric) bool { + var numDPs int + switch m.Type() { + case pmetric.MetricTypeGauge: + numDPs = m.Gauge().DataPoints().Len() + case pmetric.MetricTypeSum: + numDPs = m.Sum().DataPoints().Len() + case pmetric.MetricTypeHistogram: + numDPs = m.Histogram().DataPoints().Len() + case pmetric.MetricTypeExponentialHistogram: + numDPs = m.ExponentialHistogram().DataPoints().Len() + case pmetric.MetricTypeSummary: + numDPs = m.Summary().DataPoints().Len() + } + return numDPs == 0 + }) + } + sms.RemoveIf(func(sm pmetric.ScopeMetrics) bool { + return sm.Metrics().Len() == 0 + }) + } + rms.RemoveIf(func(rm pmetric.ResourceMetrics) bool { + return rm.ScopeMetrics().Len() == 0 + }) +} diff --git a/connector/routingconnector/internal/pmetricutil/metrics_test.go b/connector/routingconnector/internal/pmetricutil/metrics_test.go new file mode 100644 index 000000000000..371377cf33bb --- /dev/null +++ b/connector/routingconnector/internal/pmetricutil/metrics_test.go @@ -0,0 +1,1508 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package pmetricutil_test + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "go.opentelemetry.io/collector/pdata/pmetric" + + "github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector/internal/pmetricutil" + "github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector/internal/pmetricutiltest" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/pmetrictest" +) + +func TestMoveResourcesIf(t *testing.T) { + testCases := []struct { + name string + moveIf func(pmetric.ResourceMetrics) bool + from pmetric.Metrics + to pmetric.Metrics + expectFrom pmetric.Metrics + expectTo pmetric.Metrics + }{ + { + name: "move_none", + moveIf: func(pmetric.ResourceMetrics) bool { + return false + }, + from: pmetricutiltest.NewGauges("AB", "CD", "EF", "FG"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewGauges("AB", "CD", "EF", "FG"), + expectTo: pmetric.NewMetrics(), + }, + { + name: "move_all", + moveIf: func(pmetric.ResourceMetrics) bool { + return true + }, + from: pmetricutiltest.NewGauges("AB", "CD", "EF", "FG"), + to: pmetric.NewMetrics(), + expectFrom: pmetric.NewMetrics(), + expectTo: pmetricutiltest.NewGauges("AB", "CD", "EF", "FG"), + }, + { + name: "move_one", + moveIf: func(rl pmetric.ResourceMetrics) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceA" + }, + from: pmetricutiltest.NewGauges("AB", "CD", "EF", "FG"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewGauges("B", "CD", "EF", "FG"), + expectTo: pmetricutiltest.NewGauges("A", "CD", "EF", "FG"), + }, + { + name: "move_to_preexisting", + moveIf: func(rl pmetric.ResourceMetrics) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceB" + }, + from: pmetricutiltest.NewGauges("AB", "CD", "EF", "FG"), + to: pmetricutiltest.NewGauges("1", "2", "3", "4"), + expectFrom: pmetricutiltest.NewGauges("A", "CD", "EF", "FG"), + expectTo: func() pmetric.Metrics { + move := pmetricutiltest.NewGauges("B", "CD", "EF", "FG") + moveTo := pmetricutiltest.NewGauges("1", "2", "3", "4") + move.ResourceMetrics().MoveAndAppendTo(moveTo.ResourceMetrics()) + return moveTo + }(), + }, + } + + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + pmetricutil.MoveResourcesIf(tt.from, tt.to, tt.moveIf) + assert.NoError(t, pmetrictest.CompareMetrics(tt.expectFrom, tt.from), "from not modified as expected") + assert.NoError(t, pmetrictest.CompareMetrics(tt.expectTo, tt.to), "to not as expected") + }) + } +} + +func TestMoveMetricsWithContextIf(t *testing.T) { + testCases := []struct { + name string + moveIf func(pmetric.ResourceMetrics, pmetric.ScopeMetrics, pmetric.Metric) bool + from pmetric.Metrics + to pmetric.Metrics + expectFrom pmetric.Metrics + expectTo pmetric.Metrics + }{ + { + name: "move_none", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, _ pmetric.Metric) bool { + return false + }, + from: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectTo: pmetric.NewMetrics(), + }, + { + name: "move_all", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, _ pmetric.Metric) bool { + return true + }, + from: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetric.NewMetrics(), + expectTo: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + }, + { + name: "move_all_from_one_resource", + moveIf: func(rl pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, _ pmetric.Metric) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceB" + }, + from: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewGauges("A", "CD", "EF", "GH"), + expectTo: pmetricutiltest.NewGauges("B", "CD", "EF", "GH"), + }, + { + name: "move_all_from_one_scope", + moveIf: func(rl pmetric.ResourceMetrics, sl pmetric.ScopeMetrics, _ pmetric.Metric) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceB" && sl.Scope().Name() == "scopeC" + }, + from: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("C", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + ), + pmetricutiltest.Resource("B", + pmetricutiltest.Scope("D", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + ), + ), + expectTo: pmetricutiltest.NewGauges("B", "C", "EF", "GH"), + }, + { + name: "move_all_from_one_scope_in_each_resource", + moveIf: func(_ pmetric.ResourceMetrics, sl pmetric.ScopeMetrics, _ pmetric.Metric) bool { + return sl.Scope().Name() == "scopeD" + }, + from: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewGauges("AB", "C", "EF", "GH"), + expectTo: pmetricutiltest.NewGauges("AB", "D", "EF", "GH"), + }, + { + name: "move_one", + moveIf: func(rl pmetric.ResourceMetrics, sl pmetric.ScopeMetrics, m pmetric.Metric) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceA" && sl.Scope().Name() == "scopeD" && m.Name() == "metricF" + }, + from: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("C", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + ), + pmetricutiltest.Resource("B", + pmetricutiltest.Scope("C", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + ), + ), + expectTo: pmetricutiltest.NewGauges("A", "D", "F", "GH"), + }, + { + name: "move_one_from_each_scope", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, m pmetric.Metric) bool { + return m.Name() == "metricE" + }, + from: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewGauges("AB", "CD", "F", "GH"), + expectTo: pmetricutiltest.NewGauges("AB", "CD", "E", "GH"), + }, + { + name: "move_one_from_each_scope_in_one_resource", + moveIf: func(rl pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, m pmetric.Metric) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceB" && m.Name() == "metricE" + }, + from: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("C", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + ), + pmetricutiltest.Resource("B", + pmetricutiltest.Scope("C", + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + ), + ), + expectTo: pmetricutiltest.NewGauges("B", "CD", "E", "GH"), + }, + { + name: "move_some_to_preexisting", + moveIf: func(_ pmetric.ResourceMetrics, sl pmetric.ScopeMetrics, _ pmetric.Metric) bool { + return sl.Scope().Name() == "scopeD" + }, + from: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + to: pmetricutiltest.NewGauges("1", "2", "3", "4"), + expectFrom: pmetricutiltest.NewGauges("AB", "C", "EF", "GH"), + expectTo: pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("1", pmetricutiltest.Scope("2", + pmetricutiltest.Gauge("3", pmetricutiltest.NumberDataPoint("4")), + )), + pmetricutiltest.Resource("A", pmetricutiltest.Scope("D", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + )), + pmetricutiltest.Resource("B", pmetricutiltest.Scope("D", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + )), + ), + }, + } + + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + pmetricutil.MoveMetricsWithContextIf(tt.from, tt.to, tt.moveIf) + assert.NoError(t, pmetrictest.CompareMetrics(tt.expectFrom, tt.from), "from not modified as expected") + assert.NoError(t, pmetrictest.CompareMetrics(tt.expectTo, tt.to), "to not as expected") + }) + } +} + +func TestMoveDataPointsWithContextIf(t *testing.T) { + testCases := []struct { + name string + moveIf func(pmetric.ResourceMetrics, pmetric.ScopeMetrics, pmetric.Metric, any) bool + from pmetric.Metrics + to pmetric.Metrics + expectFrom pmetric.Metrics + expectTo pmetric.Metrics + }{ + // gauge + { + name: "gauge/move_none", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, _ pmetric.Metric, _ any) bool { + return false + }, + from: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectTo: pmetric.NewMetrics(), + }, + { + name: "gauge/move_all", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, _ pmetric.Metric, _ any) bool { + return true + }, + from: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetric.NewMetrics(), + expectTo: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + }, + { + name: "gauge/move_all_from_one_resource", + moveIf: func(rl pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, _ pmetric.Metric, _ any) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceB" + }, + from: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewGauges("A", "CD", "EF", "GH"), + expectTo: pmetricutiltest.NewGauges("B", "CD", "EF", "GH"), + }, + { + name: "gauge/move_all_from_one_scope", + moveIf: func(rl pmetric.ResourceMetrics, sl pmetric.ScopeMetrics, _ pmetric.Metric, _ any) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceB" && sl.Scope().Name() == "scopeC" + }, + from: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("C", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + ), + pmetricutiltest.Resource("B", + pmetricutiltest.Scope("D", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + ), + ), + expectTo: pmetricutiltest.NewGauges("B", "C", "EF", "GH"), + }, + { + name: "gauge/move_all_from_one_metric", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, m pmetric.Metric, _ any) bool { + return m.Name() == "metricE" + }, + from: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewGauges("AB", "CD", "F", "GH"), + expectTo: pmetricutiltest.NewGauges("AB", "CD", "E", "GH"), + }, + { + name: "gauge/move_all_from_one_scope_in_each_resource", + moveIf: func(_ pmetric.ResourceMetrics, sl pmetric.ScopeMetrics, _ pmetric.Metric, _ any) bool { + return sl.Scope().Name() == "scopeD" + }, + from: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewGauges("AB", "C", "EF", "GH"), + expectTo: pmetricutiltest.NewGauges("AB", "D", "EF", "GH"), + }, + { + name: "gauge/move_all_from_one_metric_in_each_scope", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, m pmetric.Metric, _ any) bool { + return m.Name() == "metricF" + }, + from: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewGauges("AB", "CD", "E", "GH"), + expectTo: pmetricutiltest.NewGauges("AB", "CD", "F", "GH"), + }, + { + name: "gauge/move_one", + moveIf: func(rl pmetric.ResourceMetrics, sl pmetric.ScopeMetrics, m pmetric.Metric, dp any) bool { + rname, ok1 := rl.Resource().Attributes().Get("resourceName") + dpname, ok2 := dp.(pmetric.NumberDataPoint).Attributes().Get("dpName") + return ok1 && ok2 && rname.AsString() == "resourceA" && sl.Scope().Name() == "scopeD" && m.Name() == "metricF" && dpname.AsString() == "dpG" + }, + from: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("C", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("H")), + ), + ), + pmetricutiltest.Resource("B", + pmetricutiltest.Scope("C", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + ), + ), + expectTo: pmetricutiltest.NewGauges("A", "D", "F", "G"), + }, + { + name: "gauge/move_one_from_each_resource", + moveIf: func(_ pmetric.ResourceMetrics, sl pmetric.ScopeMetrics, m pmetric.Metric, dp any) bool { + dpname, ok := dp.(pmetric.NumberDataPoint).Attributes().Get("dpName") + return ok && sl.Scope().Name() == "scopeD" && m.Name() == "metricE" && dpname.AsString() == "dpG" + }, + from: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("C", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + ), + pmetricutiltest.Resource("B", + pmetricutiltest.Scope("C", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + ), + ), + expectTo: pmetricutiltest.NewGauges("AB", "D", "E", "G"), + }, + { + name: "gauge/move_one_from_each_scope", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, m pmetric.Metric, dp any) bool { + dpname, ok := dp.(pmetric.NumberDataPoint).Attributes().Get("dpName") + return ok && m.Name() == "metricE" && dpname.AsString() == "dpG" + }, + from: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("C", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + ), + pmetricutiltest.Resource("B", + pmetricutiltest.Scope("C", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + ), + ), + expectTo: pmetricutiltest.NewGauges("AB", "CD", "E", "G"), + }, + { + name: "gauge/move_one_from_each_metric", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, _ pmetric.Metric, dp any) bool { + dpname, ok := dp.(pmetric.NumberDataPoint).Attributes().Get("dpName") + return ok && dpname.AsString() == "dpG" + }, + from: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewGauges("AB", "CD", "EF", "H"), + expectTo: pmetricutiltest.NewGauges("AB", "CD", "EF", "G"), + }, + { + name: "gauge/move_one_from_each_scope_in_one_resource", + moveIf: func(rl pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, m pmetric.Metric, _ any) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceB" && m.Name() == "metricE" + }, + from: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("C", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + ), + pmetricutiltest.Resource("B", + pmetricutiltest.Scope("C", + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + ), + ), + expectTo: pmetricutiltest.NewGauges("B", "CD", "E", "GH"), + }, + { + name: "gauge/move_some_to_preexisting", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, _ pmetric.Metric, dp any) bool { + dpname, ok := dp.(pmetric.NumberDataPoint).Attributes().Get("dpName") + return ok && dpname.AsString() == "dpG" + }, + from: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + to: pmetricutiltest.NewGauges("1", "2", "3", "4"), + expectFrom: pmetricutiltest.NewGauges("AB", "CD", "EF", "H"), + expectTo: func() pmetric.Metrics { + orig := pmetricutiltest.NewGauges("1", "2", "3", "4") + extra := pmetricutiltest.NewGauges("AB", "CD", "EF", "G") + extra.ResourceMetrics().MoveAndAppendTo(orig.ResourceMetrics()) + return orig + }(), + }, + + // sum + { + name: "sum/move_none", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, _ pmetric.Metric, _ any) bool { + return false + }, + from: pmetricutiltest.NewSums("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewSums("AB", "CD", "EF", "GH"), + expectTo: pmetric.NewMetrics(), + }, + { + name: "sum/move_all", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, _ pmetric.Metric, _ any) bool { + return true + }, + from: pmetricutiltest.NewSums("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetric.NewMetrics(), + expectTo: pmetricutiltest.NewSums("AB", "CD", "EF", "GH"), + }, + { + name: "sum/move_all_from_one_resource", + moveIf: func(rl pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, _ pmetric.Metric, _ any) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceB" + }, + from: pmetricutiltest.NewSums("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewSums("A", "CD", "EF", "GH"), + expectTo: pmetricutiltest.NewSums("B", "CD", "EF", "GH"), + }, + { + name: "sum/move_all_from_one_scope", + moveIf: func(rl pmetric.ResourceMetrics, sl pmetric.ScopeMetrics, _ pmetric.Metric, _ any) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceB" && sl.Scope().Name() == "scopeC" + }, + from: pmetricutiltest.NewSums("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("C", + pmetricutiltest.Sum("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Sum("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Sum("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Sum("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + ), + pmetricutiltest.Resource("B", + pmetricutiltest.Scope("D", + pmetricutiltest.Sum("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Sum("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + ), + ), + expectTo: pmetricutiltest.NewSums("B", "C", "EF", "GH"), + }, + { + name: "sum/move_all_from_one_metric", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, m pmetric.Metric, _ any) bool { + return m.Name() == "metricE" + }, + from: pmetricutiltest.NewSums("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewSums("AB", "CD", "F", "GH"), + expectTo: pmetricutiltest.NewSums("AB", "CD", "E", "GH"), + }, + { + name: "sum/move_all_from_one_scope_in_each_resource", + moveIf: func(_ pmetric.ResourceMetrics, sl pmetric.ScopeMetrics, _ pmetric.Metric, _ any) bool { + return sl.Scope().Name() == "scopeD" + }, + from: pmetricutiltest.NewSums("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewSums("AB", "C", "EF", "GH"), + expectTo: pmetricutiltest.NewSums("AB", "D", "EF", "GH"), + }, + { + name: "sum/move_all_from_one_metric_in_each_scope", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, m pmetric.Metric, _ any) bool { + return m.Name() == "metricF" + }, + from: pmetricutiltest.NewSums("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewSums("AB", "CD", "E", "GH"), + expectTo: pmetricutiltest.NewSums("AB", "CD", "F", "GH"), + }, + { + name: "sum/move_one", + moveIf: func(rl pmetric.ResourceMetrics, sl pmetric.ScopeMetrics, m pmetric.Metric, dp any) bool { + rname, ok1 := rl.Resource().Attributes().Get("resourceName") + dpname, ok2 := dp.(pmetric.NumberDataPoint).Attributes().Get("dpName") + return ok1 && ok2 && rname.AsString() == "resourceA" && sl.Scope().Name() == "scopeD" && m.Name() == "metricF" && dpname.AsString() == "dpG" + }, + from: pmetricutiltest.NewSums("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("C", + pmetricutiltest.Sum("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Sum("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Sum("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Sum("F", pmetricutiltest.NumberDataPoint("H")), + ), + ), + pmetricutiltest.Resource("B", + pmetricutiltest.Scope("C", + pmetricutiltest.Sum("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Sum("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Sum("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Sum("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + ), + ), + expectTo: pmetricutiltest.NewSums("A", "D", "F", "G"), + }, + { + name: "sum/move_one_from_each_resource", + moveIf: func(_ pmetric.ResourceMetrics, sl pmetric.ScopeMetrics, m pmetric.Metric, dp any) bool { + dpname, ok := dp.(pmetric.NumberDataPoint).Attributes().Get("dpName") + return ok && sl.Scope().Name() == "scopeD" && m.Name() == "metricE" && dpname.AsString() == "dpG" + }, + from: pmetricutiltest.NewSums("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("C", + pmetricutiltest.Sum("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Sum("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Sum("E", pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Sum("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + ), + pmetricutiltest.Resource("B", + pmetricutiltest.Scope("C", + pmetricutiltest.Sum("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Sum("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Sum("E", pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Sum("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + ), + ), + expectTo: pmetricutiltest.NewSums("AB", "D", "E", "G"), + }, + { + name: "sum/move_one_from_each_scope", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, m pmetric.Metric, dp any) bool { + dpname, ok := dp.(pmetric.NumberDataPoint).Attributes().Get("dpName") + return ok && m.Name() == "metricE" && dpname.AsString() == "dpG" + }, + from: pmetricutiltest.NewSums("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("C", + pmetricutiltest.Sum("E", pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Sum("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Sum("E", pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Sum("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + ), + pmetricutiltest.Resource("B", + pmetricutiltest.Scope("C", + pmetricutiltest.Sum("E", pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Sum("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Sum("E", pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Sum("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + ), + ), + expectTo: pmetricutiltest.NewSums("AB", "CD", "E", "G"), + }, + { + name: "sum/move_one_from_each_metric", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, _ pmetric.Metric, dp any) bool { + dpname, ok := dp.(pmetric.NumberDataPoint).Attributes().Get("dpName") + return ok && dpname.AsString() == "dpG" + }, + from: pmetricutiltest.NewSums("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewSums("AB", "CD", "EF", "H"), + expectTo: pmetricutiltest.NewSums("AB", "CD", "EF", "G"), + }, + { + name: "sum/move_one_from_each_scope_in_one_resource", + moveIf: func(rl pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, m pmetric.Metric, _ any) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceB" && m.Name() == "metricE" + }, + from: pmetricutiltest.NewSums("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("C", + pmetricutiltest.Sum("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Sum("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Sum("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Sum("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + ), + pmetricutiltest.Resource("B", + pmetricutiltest.Scope("C", + pmetricutiltest.Sum("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Sum("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + ), + ), + expectTo: pmetricutiltest.NewSums("B", "CD", "E", "GH"), + }, + { + name: "sum/move_some_to_preexisting", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, _ pmetric.Metric, dp any) bool { + dpname, ok := dp.(pmetric.NumberDataPoint).Attributes().Get("dpName") + return ok && dpname.AsString() == "dpG" + }, + from: pmetricutiltest.NewSums("AB", "CD", "EF", "GH"), + to: pmetricutiltest.NewSums("1", "2", "3", "4"), + expectFrom: pmetricutiltest.NewSums("AB", "CD", "EF", "H"), + expectTo: func() pmetric.Metrics { + orig := pmetricutiltest.NewSums("1", "2", "3", "4") + extra := pmetricutiltest.NewSums("AB", "CD", "EF", "G") + extra.ResourceMetrics().MoveAndAppendTo(orig.ResourceMetrics()) + return orig + }(), + }, + + // histogram + { + name: "histogram/move_none", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, _ pmetric.Metric, _ any) bool { + return false + }, + from: pmetricutiltest.NewHistograms("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewHistograms("AB", "CD", "EF", "GH"), + expectTo: pmetric.NewMetrics(), + }, + { + name: "histogram/move_all", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, _ pmetric.Metric, _ any) bool { + return true + }, + from: pmetricutiltest.NewHistograms("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetric.NewMetrics(), + expectTo: pmetricutiltest.NewHistograms("AB", "CD", "EF", "GH"), + }, + { + name: "histogram/move_all_from_one_resource", + moveIf: func(rl pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, _ pmetric.Metric, _ any) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceB" + }, + from: pmetricutiltest.NewHistograms("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewHistograms("A", "CD", "EF", "GH"), + expectTo: pmetricutiltest.NewHistograms("B", "CD", "EF", "GH"), + }, + { + name: "histogram/move_all_from_one_scope", + moveIf: func(rl pmetric.ResourceMetrics, sl pmetric.ScopeMetrics, _ pmetric.Metric, _ any) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceB" && sl.Scope().Name() == "scopeC" + }, + from: pmetricutiltest.NewHistograms("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("C", + pmetricutiltest.Histogram("E", pmetricutiltest.HistogramDataPoint("G"), pmetricutiltest.HistogramDataPoint("H")), + pmetricutiltest.Histogram("F", pmetricutiltest.HistogramDataPoint("G"), pmetricutiltest.HistogramDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Histogram("E", pmetricutiltest.HistogramDataPoint("G"), pmetricutiltest.HistogramDataPoint("H")), + pmetricutiltest.Histogram("F", pmetricutiltest.HistogramDataPoint("G"), pmetricutiltest.HistogramDataPoint("H")), + ), + ), + pmetricutiltest.Resource("B", + pmetricutiltest.Scope("D", + pmetricutiltest.Histogram("E", pmetricutiltest.HistogramDataPoint("G"), pmetricutiltest.HistogramDataPoint("H")), + pmetricutiltest.Histogram("F", pmetricutiltest.HistogramDataPoint("G"), pmetricutiltest.HistogramDataPoint("H")), + ), + ), + ), + expectTo: pmetricutiltest.NewHistograms("B", "C", "EF", "GH"), + }, + { + name: "histogram/move_all_from_one_metric", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, m pmetric.Metric, _ any) bool { + return m.Name() == "metricE" + }, + from: pmetricutiltest.NewHistograms("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewHistograms("AB", "CD", "F", "GH"), + expectTo: pmetricutiltest.NewHistograms("AB", "CD", "E", "GH"), + }, + { + name: "histogram/move_all_from_one_scope_in_each_resource", + moveIf: func(_ pmetric.ResourceMetrics, sl pmetric.ScopeMetrics, _ pmetric.Metric, _ any) bool { + return sl.Scope().Name() == "scopeD" + }, + from: pmetricutiltest.NewHistograms("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewHistograms("AB", "C", "EF", "GH"), + expectTo: pmetricutiltest.NewHistograms("AB", "D", "EF", "GH"), + }, + { + name: "histogram/move_all_from_one_metric_in_each_scope", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, m pmetric.Metric, _ any) bool { + return m.Name() == "metricF" + }, + from: pmetricutiltest.NewHistograms("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewHistograms("AB", "CD", "E", "GH"), + expectTo: pmetricutiltest.NewHistograms("AB", "CD", "F", "GH"), + }, + { + name: "histogram/move_one", + moveIf: func(rl pmetric.ResourceMetrics, sl pmetric.ScopeMetrics, m pmetric.Metric, dp any) bool { + rname, ok1 := rl.Resource().Attributes().Get("resourceName") + dpname, ok2 := dp.(pmetric.HistogramDataPoint).Attributes().Get("dpName") + return ok1 && ok2 && rname.AsString() == "resourceA" && sl.Scope().Name() == "scopeD" && m.Name() == "metricF" && dpname.AsString() == "dpG" + }, + from: pmetricutiltest.NewHistograms("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("C", + pmetricutiltest.Histogram("E", pmetricutiltest.HistogramDataPoint("G"), pmetricutiltest.HistogramDataPoint("H")), + pmetricutiltest.Histogram("F", pmetricutiltest.HistogramDataPoint("G"), pmetricutiltest.HistogramDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Histogram("E", pmetricutiltest.HistogramDataPoint("G"), pmetricutiltest.HistogramDataPoint("H")), + pmetricutiltest.Histogram("F", pmetricutiltest.HistogramDataPoint("H")), + ), + ), + pmetricutiltest.Resource("B", + pmetricutiltest.Scope("C", + pmetricutiltest.Histogram("E", pmetricutiltest.HistogramDataPoint("G"), pmetricutiltest.HistogramDataPoint("H")), + pmetricutiltest.Histogram("F", pmetricutiltest.HistogramDataPoint("G"), pmetricutiltest.HistogramDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Histogram("E", pmetricutiltest.HistogramDataPoint("G"), pmetricutiltest.HistogramDataPoint("H")), + pmetricutiltest.Histogram("F", pmetricutiltest.HistogramDataPoint("G"), pmetricutiltest.HistogramDataPoint("H")), + ), + ), + ), + expectTo: pmetricutiltest.NewHistograms("A", "D", "F", "G"), + }, + { + name: "histogram/move_one_from_each_resource", + moveIf: func(_ pmetric.ResourceMetrics, sl pmetric.ScopeMetrics, m pmetric.Metric, dp any) bool { + dpname, ok := dp.(pmetric.HistogramDataPoint).Attributes().Get("dpName") + return ok && sl.Scope().Name() == "scopeD" && m.Name() == "metricE" && dpname.AsString() == "dpG" + }, + from: pmetricutiltest.NewHistograms("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("C", + pmetricutiltest.Histogram("E", pmetricutiltest.HistogramDataPoint("G"), pmetricutiltest.HistogramDataPoint("H")), + pmetricutiltest.Histogram("F", pmetricutiltest.HistogramDataPoint("G"), pmetricutiltest.HistogramDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Histogram("E", pmetricutiltest.HistogramDataPoint("H")), + pmetricutiltest.Histogram("F", pmetricutiltest.HistogramDataPoint("G"), pmetricutiltest.HistogramDataPoint("H")), + ), + ), + pmetricutiltest.Resource("B", + pmetricutiltest.Scope("C", + pmetricutiltest.Histogram("E", pmetricutiltest.HistogramDataPoint("G"), pmetricutiltest.HistogramDataPoint("H")), + pmetricutiltest.Histogram("F", pmetricutiltest.HistogramDataPoint("G"), pmetricutiltest.HistogramDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Histogram("E", pmetricutiltest.HistogramDataPoint("H")), + pmetricutiltest.Histogram("F", pmetricutiltest.HistogramDataPoint("G"), pmetricutiltest.HistogramDataPoint("H")), + ), + ), + ), + expectTo: pmetricutiltest.NewHistograms("AB", "D", "E", "G"), + }, + { + name: "histogram/move_one_from_each_scope", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, m pmetric.Metric, dp any) bool { + dpname, ok := dp.(pmetric.HistogramDataPoint).Attributes().Get("dpName") + return ok && m.Name() == "metricE" && dpname.AsString() == "dpG" + }, + from: pmetricutiltest.NewHistograms("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("C", + pmetricutiltest.Histogram("E", pmetricutiltest.HistogramDataPoint("H")), + pmetricutiltest.Histogram("F", pmetricutiltest.HistogramDataPoint("G"), pmetricutiltest.HistogramDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Histogram("E", pmetricutiltest.HistogramDataPoint("H")), + pmetricutiltest.Histogram("F", pmetricutiltest.HistogramDataPoint("G"), pmetricutiltest.HistogramDataPoint("H")), + ), + ), + pmetricutiltest.Resource("B", + pmetricutiltest.Scope("C", + pmetricutiltest.Histogram("E", pmetricutiltest.HistogramDataPoint("H")), + pmetricutiltest.Histogram("F", pmetricutiltest.HistogramDataPoint("G"), pmetricutiltest.HistogramDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Histogram("E", pmetricutiltest.HistogramDataPoint("H")), + pmetricutiltest.Histogram("F", pmetricutiltest.HistogramDataPoint("G"), pmetricutiltest.HistogramDataPoint("H")), + ), + ), + ), + expectTo: pmetricutiltest.NewHistograms("AB", "CD", "E", "G"), + }, + { + name: "histogram/move_one_from_each_metric", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, _ pmetric.Metric, dp any) bool { + dpname, ok := dp.(pmetric.HistogramDataPoint).Attributes().Get("dpName") + return ok && dpname.AsString() == "dpG" + }, + from: pmetricutiltest.NewHistograms("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewHistograms("AB", "CD", "EF", "H"), + expectTo: pmetricutiltest.NewHistograms("AB", "CD", "EF", "G"), + }, + { + name: "histogram/move_one_from_each_scope_in_one_resource", + moveIf: func(rl pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, m pmetric.Metric, _ any) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceB" && m.Name() == "metricE" + }, + from: pmetricutiltest.NewHistograms("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("C", + pmetricutiltest.Histogram("E", pmetricutiltest.HistogramDataPoint("G"), pmetricutiltest.HistogramDataPoint("H")), + pmetricutiltest.Histogram("F", pmetricutiltest.HistogramDataPoint("G"), pmetricutiltest.HistogramDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Histogram("E", pmetricutiltest.HistogramDataPoint("G"), pmetricutiltest.HistogramDataPoint("H")), + pmetricutiltest.Histogram("F", pmetricutiltest.HistogramDataPoint("G"), pmetricutiltest.HistogramDataPoint("H")), + ), + ), + pmetricutiltest.Resource("B", + pmetricutiltest.Scope("C", + pmetricutiltest.Histogram("F", pmetricutiltest.HistogramDataPoint("G"), pmetricutiltest.HistogramDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Histogram("F", pmetricutiltest.HistogramDataPoint("G"), pmetricutiltest.HistogramDataPoint("H")), + ), + ), + ), + expectTo: pmetricutiltest.NewHistograms("B", "CD", "E", "GH"), + }, + { + name: "histogram/move_some_to_preexisting", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, _ pmetric.Metric, dp any) bool { + dpname, ok := dp.(pmetric.HistogramDataPoint).Attributes().Get("dpName") + return ok && dpname.AsString() == "dpG" + }, + from: pmetricutiltest.NewHistograms("AB", "CD", "EF", "GH"), + to: pmetricutiltest.NewHistograms("1", "2", "3", "4"), + expectFrom: pmetricutiltest.NewHistograms("AB", "CD", "EF", "H"), + expectTo: func() pmetric.Metrics { + orig := pmetricutiltest.NewHistograms("1", "2", "3", "4") + extra := pmetricutiltest.NewHistograms("AB", "CD", "EF", "G") + extra.ResourceMetrics().MoveAndAppendTo(orig.ResourceMetrics()) + return orig + }(), + }, + + // exponential_histogram + { + name: "exponential_histogram/move_none", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, _ pmetric.Metric, _ any) bool { + return false + }, + from: pmetricutiltest.NewExponentialHistograms("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewExponentialHistograms("AB", "CD", "EF", "GH"), + expectTo: pmetric.NewMetrics(), + }, + { + name: "exponential_histogram/move_all", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, _ pmetric.Metric, _ any) bool { + return true + }, + from: pmetricutiltest.NewExponentialHistograms("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetric.NewMetrics(), + expectTo: pmetricutiltest.NewExponentialHistograms("AB", "CD", "EF", "GH"), + }, + { + name: "exponential_histogram/move_all_from_one_resource", + moveIf: func(rl pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, _ pmetric.Metric, _ any) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceB" + }, + from: pmetricutiltest.NewExponentialHistograms("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewExponentialHistograms("A", "CD", "EF", "GH"), + expectTo: pmetricutiltest.NewExponentialHistograms("B", "CD", "EF", "GH"), + }, + { + name: "exponential_histogram/move_all_from_one_scope", + moveIf: func(rl pmetric.ResourceMetrics, sl pmetric.ScopeMetrics, _ pmetric.Metric, _ any) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceB" && sl.Scope().Name() == "scopeC" + }, + from: pmetricutiltest.NewExponentialHistograms("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("C", + pmetricutiltest.ExponentialHistogram("E", pmetricutiltest.ExponentialHistogramDataPoint("G"), pmetricutiltest.ExponentialHistogramDataPoint("H")), + pmetricutiltest.ExponentialHistogram("F", pmetricutiltest.ExponentialHistogramDataPoint("G"), pmetricutiltest.ExponentialHistogramDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.ExponentialHistogram("E", pmetricutiltest.ExponentialHistogramDataPoint("G"), pmetricutiltest.ExponentialHistogramDataPoint("H")), + pmetricutiltest.ExponentialHistogram("F", pmetricutiltest.ExponentialHistogramDataPoint("G"), pmetricutiltest.ExponentialHistogramDataPoint("H")), + ), + ), + pmetricutiltest.Resource("B", + pmetricutiltest.Scope("D", + pmetricutiltest.ExponentialHistogram("E", pmetricutiltest.ExponentialHistogramDataPoint("G"), pmetricutiltest.ExponentialHistogramDataPoint("H")), + pmetricutiltest.ExponentialHistogram("F", pmetricutiltest.ExponentialHistogramDataPoint("G"), pmetricutiltest.ExponentialHistogramDataPoint("H")), + ), + ), + ), + expectTo: pmetricutiltest.NewExponentialHistograms("B", "C", "EF", "GH"), + }, + { + name: "exponential_histogram/move_all_from_one_metric", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, m pmetric.Metric, _ any) bool { + return m.Name() == "metricE" + }, + from: pmetricutiltest.NewExponentialHistograms("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewExponentialHistograms("AB", "CD", "F", "GH"), + expectTo: pmetricutiltest.NewExponentialHistograms("AB", "CD", "E", "GH"), + }, + { + name: "exponential_histogram/move_all_from_one_scope_in_each_resource", + moveIf: func(_ pmetric.ResourceMetrics, sl pmetric.ScopeMetrics, _ pmetric.Metric, _ any) bool { + return sl.Scope().Name() == "scopeD" + }, + from: pmetricutiltest.NewExponentialHistograms("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewExponentialHistograms("AB", "C", "EF", "GH"), + expectTo: pmetricutiltest.NewExponentialHistograms("AB", "D", "EF", "GH"), + }, + { + name: "exponential_histogram/move_all_from_one_metric_in_each_scope", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, m pmetric.Metric, _ any) bool { + return m.Name() == "metricF" + }, + from: pmetricutiltest.NewExponentialHistograms("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewExponentialHistograms("AB", "CD", "E", "GH"), + expectTo: pmetricutiltest.NewExponentialHistograms("AB", "CD", "F", "GH"), + }, + { + name: "exponential_histogram/move_one", + moveIf: func(rl pmetric.ResourceMetrics, sl pmetric.ScopeMetrics, m pmetric.Metric, dp any) bool { + rname, ok1 := rl.Resource().Attributes().Get("resourceName") + dpname, ok2 := dp.(pmetric.ExponentialHistogramDataPoint).Attributes().Get("dpName") + return ok1 && ok2 && rname.AsString() == "resourceA" && sl.Scope().Name() == "scopeD" && m.Name() == "metricF" && dpname.AsString() == "dpG" + }, + from: pmetricutiltest.NewExponentialHistograms("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("C", + pmetricutiltest.ExponentialHistogram("E", pmetricutiltest.ExponentialHistogramDataPoint("G"), pmetricutiltest.ExponentialHistogramDataPoint("H")), + pmetricutiltest.ExponentialHistogram("F", pmetricutiltest.ExponentialHistogramDataPoint("G"), pmetricutiltest.ExponentialHistogramDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.ExponentialHistogram("E", pmetricutiltest.ExponentialHistogramDataPoint("G"), pmetricutiltest.ExponentialHistogramDataPoint("H")), + pmetricutiltest.ExponentialHistogram("F", pmetricutiltest.ExponentialHistogramDataPoint("H")), + ), + ), + pmetricutiltest.Resource("B", + pmetricutiltest.Scope("C", + pmetricutiltest.ExponentialHistogram("E", pmetricutiltest.ExponentialHistogramDataPoint("G"), pmetricutiltest.ExponentialHistogramDataPoint("H")), + pmetricutiltest.ExponentialHistogram("F", pmetricutiltest.ExponentialHistogramDataPoint("G"), pmetricutiltest.ExponentialHistogramDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.ExponentialHistogram("E", pmetricutiltest.ExponentialHistogramDataPoint("G"), pmetricutiltest.ExponentialHistogramDataPoint("H")), + pmetricutiltest.ExponentialHistogram("F", pmetricutiltest.ExponentialHistogramDataPoint("G"), pmetricutiltest.ExponentialHistogramDataPoint("H")), + ), + ), + ), + expectTo: pmetricutiltest.NewExponentialHistograms("A", "D", "F", "G"), + }, + { + name: "exponential_histogram/move_one_from_each_resource", + moveIf: func(_ pmetric.ResourceMetrics, sl pmetric.ScopeMetrics, m pmetric.Metric, dp any) bool { + dpname, ok := dp.(pmetric.ExponentialHistogramDataPoint).Attributes().Get("dpName") + return ok && sl.Scope().Name() == "scopeD" && m.Name() == "metricE" && dpname.AsString() == "dpG" + }, + from: pmetricutiltest.NewExponentialHistograms("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("C", + pmetricutiltest.ExponentialHistogram("E", pmetricutiltest.ExponentialHistogramDataPoint("G"), pmetricutiltest.ExponentialHistogramDataPoint("H")), + pmetricutiltest.ExponentialHistogram("F", pmetricutiltest.ExponentialHistogramDataPoint("G"), pmetricutiltest.ExponentialHistogramDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.ExponentialHistogram("E", pmetricutiltest.ExponentialHistogramDataPoint("H")), + pmetricutiltest.ExponentialHistogram("F", pmetricutiltest.ExponentialHistogramDataPoint("G"), pmetricutiltest.ExponentialHistogramDataPoint("H")), + ), + ), + pmetricutiltest.Resource("B", + pmetricutiltest.Scope("C", + pmetricutiltest.ExponentialHistogram("E", pmetricutiltest.ExponentialHistogramDataPoint("G"), pmetricutiltest.ExponentialHistogramDataPoint("H")), + pmetricutiltest.ExponentialHistogram("F", pmetricutiltest.ExponentialHistogramDataPoint("G"), pmetricutiltest.ExponentialHistogramDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.ExponentialHistogram("E", pmetricutiltest.ExponentialHistogramDataPoint("H")), + pmetricutiltest.ExponentialHistogram("F", pmetricutiltest.ExponentialHistogramDataPoint("G"), pmetricutiltest.ExponentialHistogramDataPoint("H")), + ), + ), + ), + expectTo: pmetricutiltest.NewExponentialHistograms("AB", "D", "E", "G"), + }, + { + name: "exponential_histogram/move_one_from_each_scope", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, m pmetric.Metric, dp any) bool { + dpname, ok := dp.(pmetric.ExponentialHistogramDataPoint).Attributes().Get("dpName") + return ok && m.Name() == "metricE" && dpname.AsString() == "dpG" + }, + from: pmetricutiltest.NewExponentialHistograms("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("C", + pmetricutiltest.ExponentialHistogram("E", pmetricutiltest.ExponentialHistogramDataPoint("H")), + pmetricutiltest.ExponentialHistogram("F", pmetricutiltest.ExponentialHistogramDataPoint("G"), pmetricutiltest.ExponentialHistogramDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.ExponentialHistogram("E", pmetricutiltest.ExponentialHistogramDataPoint("H")), + pmetricutiltest.ExponentialHistogram("F", pmetricutiltest.ExponentialHistogramDataPoint("G"), pmetricutiltest.ExponentialHistogramDataPoint("H")), + ), + ), + pmetricutiltest.Resource("B", + pmetricutiltest.Scope("C", + pmetricutiltest.ExponentialHistogram("E", pmetricutiltest.ExponentialHistogramDataPoint("H")), + pmetricutiltest.ExponentialHistogram("F", pmetricutiltest.ExponentialHistogramDataPoint("G"), pmetricutiltest.ExponentialHistogramDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.ExponentialHistogram("E", pmetricutiltest.ExponentialHistogramDataPoint("H")), + pmetricutiltest.ExponentialHistogram("F", pmetricutiltest.ExponentialHistogramDataPoint("G"), pmetricutiltest.ExponentialHistogramDataPoint("H")), + ), + ), + ), + expectTo: pmetricutiltest.NewExponentialHistograms("AB", "CD", "E", "G"), + }, + { + name: "exponential_histogram/move_one_from_each_metric", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, _ pmetric.Metric, dp any) bool { + dpname, ok := dp.(pmetric.ExponentialHistogramDataPoint).Attributes().Get("dpName") + return ok && dpname.AsString() == "dpG" + }, + from: pmetricutiltest.NewExponentialHistograms("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewExponentialHistograms("AB", "CD", "EF", "H"), + expectTo: pmetricutiltest.NewExponentialHistograms("AB", "CD", "EF", "G"), + }, + { + name: "exponential_histogram/move_one_from_each_scope_in_one_resource", + moveIf: func(rl pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, m pmetric.Metric, _ any) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceB" && m.Name() == "metricE" + }, + from: pmetricutiltest.NewExponentialHistograms("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("C", + pmetricutiltest.ExponentialHistogram("E", pmetricutiltest.ExponentialHistogramDataPoint("G"), pmetricutiltest.ExponentialHistogramDataPoint("H")), + pmetricutiltest.ExponentialHistogram("F", pmetricutiltest.ExponentialHistogramDataPoint("G"), pmetricutiltest.ExponentialHistogramDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.ExponentialHistogram("E", pmetricutiltest.ExponentialHistogramDataPoint("G"), pmetricutiltest.ExponentialHistogramDataPoint("H")), + pmetricutiltest.ExponentialHistogram("F", pmetricutiltest.ExponentialHistogramDataPoint("G"), pmetricutiltest.ExponentialHistogramDataPoint("H")), + ), + ), + pmetricutiltest.Resource("B", + pmetricutiltest.Scope("C", + pmetricutiltest.ExponentialHistogram("F", pmetricutiltest.ExponentialHistogramDataPoint("G"), pmetricutiltest.ExponentialHistogramDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.ExponentialHistogram("F", pmetricutiltest.ExponentialHistogramDataPoint("G"), pmetricutiltest.ExponentialHistogramDataPoint("H")), + ), + ), + ), + expectTo: pmetricutiltest.NewExponentialHistograms("B", "CD", "E", "GH"), + }, + { + name: "exponential_histogram/move_some_to_preexisting", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, _ pmetric.Metric, dp any) bool { + dpname, ok := dp.(pmetric.ExponentialHistogramDataPoint).Attributes().Get("dpName") + return ok && dpname.AsString() == "dpG" + }, + from: pmetricutiltest.NewExponentialHistograms("AB", "CD", "EF", "GH"), + to: pmetricutiltest.NewExponentialHistograms("1", "2", "3", "4"), + expectFrom: pmetricutiltest.NewExponentialHistograms("AB", "CD", "EF", "H"), + expectTo: func() pmetric.Metrics { + orig := pmetricutiltest.NewExponentialHistograms("1", "2", "3", "4") + extra := pmetricutiltest.NewExponentialHistograms("AB", "CD", "EF", "G") + extra.ResourceMetrics().MoveAndAppendTo(orig.ResourceMetrics()) + return orig + }(), + }, + + // summary + { + name: "summary/move_none", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, _ pmetric.Metric, _ any) bool { + return false + }, + from: pmetricutiltest.NewSummaries("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewSummaries("AB", "CD", "EF", "GH"), + expectTo: pmetric.NewMetrics(), + }, + { + name: "summary/move_all", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, _ pmetric.Metric, _ any) bool { + return true + }, + from: pmetricutiltest.NewSummaries("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetric.NewMetrics(), + expectTo: pmetricutiltest.NewSummaries("AB", "CD", "EF", "GH"), + }, + { + name: "summary/move_all_from_one_resource", + moveIf: func(rl pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, _ pmetric.Metric, _ any) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceB" + }, + from: pmetricutiltest.NewSummaries("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewSummaries("A", "CD", "EF", "GH"), + expectTo: pmetricutiltest.NewSummaries("B", "CD", "EF", "GH"), + }, + { + name: "summary/move_all_from_one_scope", + moveIf: func(rl pmetric.ResourceMetrics, sl pmetric.ScopeMetrics, _ pmetric.Metric, _ any) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceB" && sl.Scope().Name() == "scopeC" + }, + from: pmetricutiltest.NewSummaries("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("C", + pmetricutiltest.Summary("E", pmetricutiltest.SummaryDataPoint("G"), pmetricutiltest.SummaryDataPoint("H")), + pmetricutiltest.Summary("F", pmetricutiltest.SummaryDataPoint("G"), pmetricutiltest.SummaryDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Summary("E", pmetricutiltest.SummaryDataPoint("G"), pmetricutiltest.SummaryDataPoint("H")), + pmetricutiltest.Summary("F", pmetricutiltest.SummaryDataPoint("G"), pmetricutiltest.SummaryDataPoint("H")), + ), + ), + pmetricutiltest.Resource("B", + pmetricutiltest.Scope("D", + pmetricutiltest.Summary("E", pmetricutiltest.SummaryDataPoint("G"), pmetricutiltest.SummaryDataPoint("H")), + pmetricutiltest.Summary("F", pmetricutiltest.SummaryDataPoint("G"), pmetricutiltest.SummaryDataPoint("H")), + ), + ), + ), + expectTo: pmetricutiltest.NewSummaries("B", "C", "EF", "GH"), + }, + { + name: "summary/move_all_from_one_metric", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, m pmetric.Metric, _ any) bool { + return m.Name() == "metricE" + }, + from: pmetricutiltest.NewSummaries("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewSummaries("AB", "CD", "F", "GH"), + expectTo: pmetricutiltest.NewSummaries("AB", "CD", "E", "GH"), + }, + { + name: "summary/move_all_from_one_scope_in_each_resource", + moveIf: func(_ pmetric.ResourceMetrics, sl pmetric.ScopeMetrics, _ pmetric.Metric, _ any) bool { + return sl.Scope().Name() == "scopeD" + }, + from: pmetricutiltest.NewSummaries("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewSummaries("AB", "C", "EF", "GH"), + expectTo: pmetricutiltest.NewSummaries("AB", "D", "EF", "GH"), + }, + { + name: "summary/move_all_from_one_metric_in_each_scope", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, m pmetric.Metric, _ any) bool { + return m.Name() == "metricF" + }, + from: pmetricutiltest.NewSummaries("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewSummaries("AB", "CD", "E", "GH"), + expectTo: pmetricutiltest.NewSummaries("AB", "CD", "F", "GH"), + }, + { + name: "summary/move_one", + moveIf: func(rl pmetric.ResourceMetrics, sl pmetric.ScopeMetrics, m pmetric.Metric, dp any) bool { + rname, ok1 := rl.Resource().Attributes().Get("resourceName") + dpname, ok2 := dp.(pmetric.SummaryDataPoint).Attributes().Get("dpName") + return ok1 && ok2 && rname.AsString() == "resourceA" && sl.Scope().Name() == "scopeD" && m.Name() == "metricF" && dpname.AsString() == "dpG" + }, + from: pmetricutiltest.NewSummaries("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("C", + pmetricutiltest.Summary("E", pmetricutiltest.SummaryDataPoint("G"), pmetricutiltest.SummaryDataPoint("H")), + pmetricutiltest.Summary("F", pmetricutiltest.SummaryDataPoint("G"), pmetricutiltest.SummaryDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Summary("E", pmetricutiltest.SummaryDataPoint("G"), pmetricutiltest.SummaryDataPoint("H")), + pmetricutiltest.Summary("F", pmetricutiltest.SummaryDataPoint("H")), + ), + ), + pmetricutiltest.Resource("B", + pmetricutiltest.Scope("C", + pmetricutiltest.Summary("E", pmetricutiltest.SummaryDataPoint("G"), pmetricutiltest.SummaryDataPoint("H")), + pmetricutiltest.Summary("F", pmetricutiltest.SummaryDataPoint("G"), pmetricutiltest.SummaryDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Summary("E", pmetricutiltest.SummaryDataPoint("G"), pmetricutiltest.SummaryDataPoint("H")), + pmetricutiltest.Summary("F", pmetricutiltest.SummaryDataPoint("G"), pmetricutiltest.SummaryDataPoint("H")), + ), + ), + ), + expectTo: pmetricutiltest.NewSummaries("A", "D", "F", "G"), + }, + { + name: "summary/move_one_from_each_resource", + moveIf: func(_ pmetric.ResourceMetrics, sl pmetric.ScopeMetrics, m pmetric.Metric, dp any) bool { + dpname, ok := dp.(pmetric.SummaryDataPoint).Attributes().Get("dpName") + return ok && sl.Scope().Name() == "scopeD" && m.Name() == "metricE" && dpname.AsString() == "dpG" + }, + from: pmetricutiltest.NewSummaries("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("C", + pmetricutiltest.Summary("E", pmetricutiltest.SummaryDataPoint("G"), pmetricutiltest.SummaryDataPoint("H")), + pmetricutiltest.Summary("F", pmetricutiltest.SummaryDataPoint("G"), pmetricutiltest.SummaryDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Summary("E", pmetricutiltest.SummaryDataPoint("H")), + pmetricutiltest.Summary("F", pmetricutiltest.SummaryDataPoint("G"), pmetricutiltest.SummaryDataPoint("H")), + ), + ), + pmetricutiltest.Resource("B", + pmetricutiltest.Scope("C", + pmetricutiltest.Summary("E", pmetricutiltest.SummaryDataPoint("G"), pmetricutiltest.SummaryDataPoint("H")), + pmetricutiltest.Summary("F", pmetricutiltest.SummaryDataPoint("G"), pmetricutiltest.SummaryDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Summary("E", pmetricutiltest.SummaryDataPoint("H")), + pmetricutiltest.Summary("F", pmetricutiltest.SummaryDataPoint("G"), pmetricutiltest.SummaryDataPoint("H")), + ), + ), + ), + expectTo: pmetricutiltest.NewSummaries("AB", "D", "E", "G"), + }, + { + name: "summary/move_one_from_each_scope", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, m pmetric.Metric, dp any) bool { + dpname, ok := dp.(pmetric.SummaryDataPoint).Attributes().Get("dpName") + return ok && m.Name() == "metricE" && dpname.AsString() == "dpG" + }, + from: pmetricutiltest.NewSummaries("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("C", + pmetricutiltest.Summary("E", pmetricutiltest.SummaryDataPoint("H")), + pmetricutiltest.Summary("F", pmetricutiltest.SummaryDataPoint("G"), pmetricutiltest.SummaryDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Summary("E", pmetricutiltest.SummaryDataPoint("H")), + pmetricutiltest.Summary("F", pmetricutiltest.SummaryDataPoint("G"), pmetricutiltest.SummaryDataPoint("H")), + ), + ), + pmetricutiltest.Resource("B", + pmetricutiltest.Scope("C", + pmetricutiltest.Summary("E", pmetricutiltest.SummaryDataPoint("H")), + pmetricutiltest.Summary("F", pmetricutiltest.SummaryDataPoint("G"), pmetricutiltest.SummaryDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Summary("E", pmetricutiltest.SummaryDataPoint("H")), + pmetricutiltest.Summary("F", pmetricutiltest.SummaryDataPoint("G"), pmetricutiltest.SummaryDataPoint("H")), + ), + ), + ), + expectTo: pmetricutiltest.NewSummaries("AB", "CD", "E", "G"), + }, + { + name: "summary/move_one_from_each_metric", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, _ pmetric.Metric, dp any) bool { + dpname, ok := dp.(pmetric.SummaryDataPoint).Attributes().Get("dpName") + return ok && dpname.AsString() == "dpG" + }, + from: pmetricutiltest.NewSummaries("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewSummaries("AB", "CD", "EF", "H"), + expectTo: pmetricutiltest.NewSummaries("AB", "CD", "EF", "G"), + }, + { + name: "summary/move_one_from_each_scope_in_one_resource", + moveIf: func(rl pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, m pmetric.Metric, _ any) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceB" && m.Name() == "metricE" + }, + from: pmetricutiltest.NewSummaries("AB", "CD", "EF", "GH"), + to: pmetric.NewMetrics(), + expectFrom: pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("C", + pmetricutiltest.Summary("E", pmetricutiltest.SummaryDataPoint("G"), pmetricutiltest.SummaryDataPoint("H")), + pmetricutiltest.Summary("F", pmetricutiltest.SummaryDataPoint("G"), pmetricutiltest.SummaryDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Summary("E", pmetricutiltest.SummaryDataPoint("G"), pmetricutiltest.SummaryDataPoint("H")), + pmetricutiltest.Summary("F", pmetricutiltest.SummaryDataPoint("G"), pmetricutiltest.SummaryDataPoint("H")), + ), + ), + pmetricutiltest.Resource("B", + pmetricutiltest.Scope("C", + pmetricutiltest.Summary("F", pmetricutiltest.SummaryDataPoint("G"), pmetricutiltest.SummaryDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Summary("F", pmetricutiltest.SummaryDataPoint("G"), pmetricutiltest.SummaryDataPoint("H")), + ), + ), + ), + expectTo: pmetricutiltest.NewSummaries("B", "CD", "E", "GH"), + }, + { + name: "summary/move_some_to_preexisting", + moveIf: func(_ pmetric.ResourceMetrics, _ pmetric.ScopeMetrics, _ pmetric.Metric, dp any) bool { + dpname, ok := dp.(pmetric.SummaryDataPoint).Attributes().Get("dpName") + return ok && dpname.AsString() == "dpG" + }, + from: pmetricutiltest.NewSummaries("AB", "CD", "EF", "GH"), + to: pmetricutiltest.NewSummaries("1", "2", "3", "4"), + expectFrom: pmetricutiltest.NewSummaries("AB", "CD", "EF", "H"), + expectTo: func() pmetric.Metrics { + orig := pmetricutiltest.NewSummaries("1", "2", "3", "4") + extra := pmetricutiltest.NewSummaries("AB", "CD", "EF", "G") + extra.ResourceMetrics().MoveAndAppendTo(orig.ResourceMetrics()) + return orig + }(), + }, + } + + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + pmetricutil.MoveDataPointsWithContextIf(tt.from, tt.to, tt.moveIf) + assert.NoError(t, pmetrictest.CompareMetrics(tt.expectFrom, tt.from), "from not modified as expected") + assert.NoError(t, pmetrictest.CompareMetrics(tt.expectTo, tt.to), "to not as expected") + }) + } +} diff --git a/connector/routingconnector/internal/pmetricutiltest/metrics.go b/connector/routingconnector/internal/pmetricutiltest/metrics.go new file mode 100644 index 000000000000..e041f53ecdd5 --- /dev/null +++ b/connector/routingconnector/internal/pmetricutiltest/metrics.go @@ -0,0 +1,233 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package pmetricutiltest // import "github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector/internal/pmetricutiltest" + +import "go.opentelemetry.io/collector/pdata/pmetric" + +// NewGauges returns a pmetric.Metrics with a uniform structure where resources, scopes, metrics, +// and datapoints are identical across all instances, except for one identifying field. +// +// Identifying fields: +// - Resources have an attribute called "resourceName" with a value of "resourceN". +// - Scopes have a name with a value of "scopeN". +// - Metrics have a name with a value of "metricN" and a single time series of data points. +// - DataPoints have an attribute "dpName" with a value of "dpN". +// +// Example: NewGauges("AB", "XYZ", "MN", "1234") returns: +// +// resourceA, resourceB +// each with scopeX, scopeY, scopeZ +// each with metricM, metricN +// each with dp1, dp2, dp3, dp4 +// +// Each byte in the input string is a unique ID for the corresponding element. +func NewGauges(resourceIDs, scopeIDs, metricIDs, dataPointIDs string) pmetric.Metrics { + md := pmetric.NewMetrics() + for resourceN := 0; resourceN < len(resourceIDs); resourceN++ { + rm := md.ResourceMetrics().AppendEmpty() + rm.Resource().Attributes().PutStr("resourceName", "resource"+string(resourceIDs[resourceN])) + for scopeN := 0; scopeN < len(scopeIDs); scopeN++ { + sm := rm.ScopeMetrics().AppendEmpty() + sm.Scope().SetName("scope" + string(scopeIDs[scopeN])) + for metricN := 0; metricN < len(metricIDs); metricN++ { + m := sm.Metrics().AppendEmpty() + m.SetName("metric" + string(metricIDs[metricN])) + dps := m.SetEmptyGauge() + for dataPointN := 0; dataPointN < len(dataPointIDs); dataPointN++ { + dp := dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dp"+string(dataPointIDs[dataPointN])) + } + } + } + } + return md +} + +func NewSums(resourceIDs, scopeIDs, metricIDs, dataPointIDs string) pmetric.Metrics { + md := pmetric.NewMetrics() + for resourceN := 0; resourceN < len(resourceIDs); resourceN++ { + rm := md.ResourceMetrics().AppendEmpty() + rm.Resource().Attributes().PutStr("resourceName", "resource"+string(resourceIDs[resourceN])) + for scopeN := 0; scopeN < len(scopeIDs); scopeN++ { + sm := rm.ScopeMetrics().AppendEmpty() + sm.Scope().SetName("scope" + string(scopeIDs[scopeN])) + for metricN := 0; metricN < len(metricIDs); metricN++ { + m := sm.Metrics().AppendEmpty() + m.SetName("metric" + string(metricIDs[metricN])) + dps := m.SetEmptySum() + for dataPointN := 0; dataPointN < len(dataPointIDs); dataPointN++ { + dp := dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dp"+string(dataPointIDs[dataPointN])) + } + } + } + } + return md +} + +func NewHistograms(resourceIDs, scopeIDs, metricIDs, dataPointIDs string) pmetric.Metrics { + md := pmetric.NewMetrics() + for resourceN := 0; resourceN < len(resourceIDs); resourceN++ { + rm := md.ResourceMetrics().AppendEmpty() + rm.Resource().Attributes().PutStr("resourceName", "resource"+string(resourceIDs[resourceN])) + for scopeN := 0; scopeN < len(scopeIDs); scopeN++ { + sm := rm.ScopeMetrics().AppendEmpty() + sm.Scope().SetName("scope" + string(scopeIDs[scopeN])) + for metricN := 0; metricN < len(metricIDs); metricN++ { + m := sm.Metrics().AppendEmpty() + m.SetName("metric" + string(metricIDs[metricN])) + dps := m.SetEmptyHistogram() + for dataPointN := 0; dataPointN < len(dataPointIDs); dataPointN++ { + dp := dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dp"+string(dataPointIDs[dataPointN])) + } + } + } + } + return md +} + +func NewExponentialHistograms(resourceIDs, scopeIDs, metricIDs, dataPointIDs string) pmetric.Metrics { + md := pmetric.NewMetrics() + for resourceN := 0; resourceN < len(resourceIDs); resourceN++ { + rm := md.ResourceMetrics().AppendEmpty() + rm.Resource().Attributes().PutStr("resourceName", "resource"+string(resourceIDs[resourceN])) + for scopeN := 0; scopeN < len(scopeIDs); scopeN++ { + sm := rm.ScopeMetrics().AppendEmpty() + sm.Scope().SetName("scope" + string(scopeIDs[scopeN])) + for metricN := 0; metricN < len(metricIDs); metricN++ { + m := sm.Metrics().AppendEmpty() + m.SetName("metric" + string(metricIDs[metricN])) + dps := m.SetEmptyExponentialHistogram() + for dataPointN := 0; dataPointN < len(dataPointIDs); dataPointN++ { + dp := dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dp"+string(dataPointIDs[dataPointN])) + } + } + } + } + return md +} + +func NewSummaries(resourceIDs, scopeIDs, metricIDs, dataPointIDs string) pmetric.Metrics { + md := pmetric.NewMetrics() + for resourceN := 0; resourceN < len(resourceIDs); resourceN++ { + rm := md.ResourceMetrics().AppendEmpty() + rm.Resource().Attributes().PutStr("resourceName", "resource"+string(resourceIDs[resourceN])) + for scopeN := 0; scopeN < len(scopeIDs); scopeN++ { + sm := rm.ScopeMetrics().AppendEmpty() + sm.Scope().SetName("scope" + string(scopeIDs[scopeN])) + for metricN := 0; metricN < len(metricIDs); metricN++ { + m := sm.Metrics().AppendEmpty() + m.SetName("metric" + string(metricIDs[metricN])) + dps := m.SetEmptySummary() + for dataPointN := 0; dataPointN < len(dataPointIDs); dataPointN++ { + dp := dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dp"+string(dataPointIDs[dataPointN])) + } + } + } + } + return md +} + +func NewMetricsFromOpts(resources ...pmetric.ResourceMetrics) pmetric.Metrics { + md := pmetric.NewMetrics() + for _, resource := range resources { + resource.CopyTo(md.ResourceMetrics().AppendEmpty()) + } + return md +} + +func Resource(id string, scopes ...pmetric.ScopeMetrics) pmetric.ResourceMetrics { + rm := pmetric.NewResourceMetrics() + rm.Resource().Attributes().PutStr("resourceName", "resource"+id) + for _, scope := range scopes { + scope.CopyTo(rm.ScopeMetrics().AppendEmpty()) + } + return rm +} + +func Scope(id string, metrics ...pmetric.Metric) pmetric.ScopeMetrics { + s := pmetric.NewScopeMetrics() + s.Scope().SetName("scope" + id) + for _, metric := range metrics { + metric.CopyTo(s.Metrics().AppendEmpty()) + } + return s +} + +func Gauge(id string, dps ...pmetric.NumberDataPoint) pmetric.Metric { + m := pmetric.NewMetric() + m.SetName("metric" + id) + g := m.SetEmptyGauge() + for _, dp := range dps { + dp.CopyTo(g.DataPoints().AppendEmpty()) + } + return m +} + +func Sum(id string, dps ...pmetric.NumberDataPoint) pmetric.Metric { + m := pmetric.NewMetric() + m.SetName("metric" + id) + g := m.SetEmptySum() + for _, dp := range dps { + dp.CopyTo(g.DataPoints().AppendEmpty()) + } + return m +} + +func NumberDataPoint(id string) pmetric.NumberDataPoint { + dp := pmetric.NewNumberDataPoint() + dp.Attributes().PutStr("dpName", "dp"+id) + return dp +} + +func Histogram(id string, dps ...pmetric.HistogramDataPoint) pmetric.Metric { + m := pmetric.NewMetric() + m.SetName("metric" + id) + g := m.SetEmptyHistogram() + for _, dp := range dps { + dp.CopyTo(g.DataPoints().AppendEmpty()) + } + return m +} + +func HistogramDataPoint(id string) pmetric.HistogramDataPoint { + dp := pmetric.NewHistogramDataPoint() + dp.Attributes().PutStr("dpName", "dp"+id) + return dp +} + +func ExponentialHistogram(id string, dps ...pmetric.ExponentialHistogramDataPoint) pmetric.Metric { + m := pmetric.NewMetric() + m.SetName("metric" + id) + g := m.SetEmptyExponentialHistogram() + for _, dp := range dps { + dp.CopyTo(g.DataPoints().AppendEmpty()) + } + return m +} + +func ExponentialHistogramDataPoint(id string) pmetric.ExponentialHistogramDataPoint { + dp := pmetric.NewExponentialHistogramDataPoint() + dp.Attributes().PutStr("dpName", "dp"+id) + return dp +} + +func Summary(id string, dps ...pmetric.SummaryDataPoint) pmetric.Metric { + m := pmetric.NewMetric() + m.SetName("metric" + id) + g := m.SetEmptySummary() + for _, dp := range dps { + dp.CopyTo(g.DataPoints().AppendEmpty()) + } + return m +} + +func SummaryDataPoint(id string) pmetric.SummaryDataPoint { + dp := pmetric.NewSummaryDataPoint() + dp.Attributes().PutStr("dpName", "dp"+id) + return dp +} diff --git a/connector/routingconnector/internal/pmetricutiltest/metrics_test.go b/connector/routingconnector/internal/pmetricutiltest/metrics_test.go new file mode 100644 index 000000000000..47a73b5afc37 --- /dev/null +++ b/connector/routingconnector/internal/pmetricutiltest/metrics_test.go @@ -0,0 +1,527 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package pmetricutiltest_test + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "go.opentelemetry.io/collector/pdata/pmetric" + + "github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector/internal/pmetricutiltest" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/pmetrictest" +) + +func TestNewMetrics(t *testing.T) { + t.Run("empty", func(t *testing.T) { + expected := pmetric.NewMetrics() + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewGauges("", "", "", ""))) + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewSums("", "", "", ""))) + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewHistograms("", "", "", ""))) + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewExponentialHistograms("", "", "", ""))) + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewSummaries("", "", "", ""))) + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewMetricsFromOpts())) + }) + + t.Run("simple", func(t *testing.T) { + t.Run("gauge", func(t *testing.T) { + expected := func() pmetric.Metrics { + md := pmetric.NewMetrics() + r := md.ResourceMetrics().AppendEmpty() + r.Resource().Attributes().PutStr("resourceName", "resourceA") // resourceA + s := r.ScopeMetrics().AppendEmpty() + s.Scope().SetName("scopeB") // resourceA.scopeB + m := s.Metrics().AppendEmpty() + m.SetName("metricC") // resourceA.scopeB.metricC + dps := m.SetEmptyGauge() + dp := dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dpD") // resourceA.scopeB.metricC.dpD + return md + }() + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewGauges("A", "B", "C", "D"))) + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("B", pmetricutiltest.Gauge("C", pmetricutiltest.NumberDataPoint("D"))), + ), + ))) + }) + t.Run("sum", func(t *testing.T) { + expected := func() pmetric.Metrics { + md := pmetric.NewMetrics() + r := md.ResourceMetrics().AppendEmpty() + r.Resource().Attributes().PutStr("resourceName", "resourceA") // resourceA + s := r.ScopeMetrics().AppendEmpty() + s.Scope().SetName("scopeB") // resourceA.scopeB + m := s.Metrics().AppendEmpty() + m.SetName("metricC") // resourceA.scopeB.metricC + dps := m.SetEmptySum() + dp := dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dpD") // resourceA.scopeB.metricC.dpD + return md + }() + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewSums("A", "B", "C", "D"))) + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("B", pmetricutiltest.Sum("C", pmetricutiltest.NumberDataPoint("D"))), + ), + ))) + }) + t.Run("histogram", func(t *testing.T) { + expected := func() pmetric.Metrics { + md := pmetric.NewMetrics() + r := md.ResourceMetrics().AppendEmpty() + r.Resource().Attributes().PutStr("resourceName", "resourceA") // resourceA + s := r.ScopeMetrics().AppendEmpty() + s.Scope().SetName("scopeB") // resourceA.scopeB + m := s.Metrics().AppendEmpty() + m.SetName("metricC") // resourceA.scopeB.metricC + dps := m.SetEmptyHistogram() + dp := dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dpD") // resourceA.scopeB.metricC.dpD + return md + }() + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewHistograms("A", "B", "C", "D"))) + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("B", pmetricutiltest.Histogram("C", pmetricutiltest.HistogramDataPoint("D"))), + ), + ))) + }) + t.Run("exponential_histogram", func(t *testing.T) { + expected := func() pmetric.Metrics { + md := pmetric.NewMetrics() + r := md.ResourceMetrics().AppendEmpty() + r.Resource().Attributes().PutStr("resourceName", "resourceA") // resourceA + s := r.ScopeMetrics().AppendEmpty() + s.Scope().SetName("scopeB") // resourceA.scopeB + m := s.Metrics().AppendEmpty() + m.SetName("metricC") // resourceA.scopeB.metricC + dps := m.SetEmptyExponentialHistogram() + dp := dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dpD") // resourceA.scopeB.metricC.dpD + return md + }() + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewExponentialHistograms("A", "B", "C", "D"))) + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("B", pmetricutiltest.ExponentialHistogram("C", pmetricutiltest.ExponentialHistogramDataPoint("D"))), + ), + ))) + }) + t.Run("summary", func(t *testing.T) { + expected := func() pmetric.Metrics { + md := pmetric.NewMetrics() + r := md.ResourceMetrics().AppendEmpty() + r.Resource().Attributes().PutStr("resourceName", "resourceA") // resourceA + s := r.ScopeMetrics().AppendEmpty() + s.Scope().SetName("scopeB") // resourceA.scopeB + m := s.Metrics().AppendEmpty() + m.SetName("metricC") // resourceA.scopeB.metricC + dps := m.SetEmptySummary() + dp := dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dpD") // resourceA.scopeB.metricC.dpD + return md + }() + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewSummaries("A", "B", "C", "D"))) + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("B", pmetricutiltest.Summary("C", pmetricutiltest.SummaryDataPoint("D"))), + ), + ))) + }) + }) + + t.Run("two_resources", func(t *testing.T) { + expected := func() pmetric.Metrics { + md := pmetric.NewMetrics() + r := md.ResourceMetrics().AppendEmpty() + r.Resource().Attributes().PutStr("resourceName", "resourceA") // resourceA + s := r.ScopeMetrics().AppendEmpty() + s.Scope().SetName("scopeC") // resourceA.scopeC + m := s.Metrics().AppendEmpty() + m.SetName("metricD") // resourceA.scopeC.metricD + dps := m.SetEmptyGauge() + dp := dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dpE") // resourceA.scopeC.metricD.dpE + r = md.ResourceMetrics().AppendEmpty() + r.Resource().Attributes().PutStr("resourceName", "resourceB") // resourceB + s = r.ScopeMetrics().AppendEmpty() + s.Scope().SetName("scopeC") // resourceB.scopeC + m = s.Metrics().AppendEmpty() + m.SetName("metricD") // resourceB.scopeC.metricD + dps = m.SetEmptyGauge() + dp = dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dpE") // resourceB.scopeC.metricD.dpE + return md + }() + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewGauges("AB", "C", "D", "E"))) + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("C", pmetricutiltest.Gauge("D", pmetricutiltest.NumberDataPoint("E"))), + ), + pmetricutiltest.Resource("B", + pmetricutiltest.Scope("C", pmetricutiltest.Gauge("D", pmetricutiltest.NumberDataPoint("E"))), + ), + ))) + }) + + t.Run("two_scopes", func(t *testing.T) { + expected := func() pmetric.Metrics { + md := pmetric.NewMetrics() + r := md.ResourceMetrics().AppendEmpty() + r.Resource().Attributes().PutStr("resourceName", "resourceA") // resourceA + s := r.ScopeMetrics().AppendEmpty() + s.Scope().SetName("scopeB") // resourceA.scopeB + m := s.Metrics().AppendEmpty() + m.SetName("metricD") // resourceA.scopeB.metricD + dps := m.SetEmptyGauge() + dp := dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dpE") // resourceA.scopeB.metricD.dpE + s = r.ScopeMetrics().AppendEmpty() + s.Scope().SetName("scopeC") // resourceA.scopeC + m = s.Metrics().AppendEmpty() + m.SetName("metricD") // resourceA.scopeC.metricD + dps = m.SetEmptyGauge() + dp = dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dpE") // resourceA.scopeC.metricD.dpE + return md + }() + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewGauges("A", "BC", "D", "E"))) + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("B", pmetricutiltest.Gauge("D", pmetricutiltest.NumberDataPoint("E"))), + pmetricutiltest.Scope("C", pmetricutiltest.Gauge("D", pmetricutiltest.NumberDataPoint("E"))), + ), + ))) + }) + + t.Run("two_metrics", func(t *testing.T) { + t.Run("gauges", func(t *testing.T) { + expected := func() pmetric.Metrics { + md := pmetric.NewMetrics() + r := md.ResourceMetrics().AppendEmpty() + r.Resource().Attributes().PutStr("resourceName", "resourceA") // resourceA + s := r.ScopeMetrics().AppendEmpty() + s.Scope().SetName("scopeB") // resourceA.scopeB + m := s.Metrics().AppendEmpty() + m.SetName("metricC") // resourceA.scopeB.metricC + dps := m.SetEmptyGauge() + dp := dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dpE") // resourceA.scopeB.metricC.dpE + m = s.Metrics().AppendEmpty() + m.SetName("metricD") // resourceA.scopeB.metricD + dps = m.SetEmptyGauge() + dp = dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dpE") // resourceA.scopeB.metricD.dpE + return md + }() + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewGauges("A", "B", "CD", "E"))) + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("B", + pmetricutiltest.Gauge("C", pmetricutiltest.NumberDataPoint("E")), + pmetricutiltest.Gauge("D", pmetricutiltest.NumberDataPoint("E")), + ), + ), + ))) + }) + t.Run("sums", func(t *testing.T) { + expected := func() pmetric.Metrics { + md := pmetric.NewMetrics() + r := md.ResourceMetrics().AppendEmpty() + r.Resource().Attributes().PutStr("resourceName", "resourceA") // resourceA + s := r.ScopeMetrics().AppendEmpty() + s.Scope().SetName("scopeB") // resourceA.scopeB + m := s.Metrics().AppendEmpty() + m.SetName("metricC") // resourceA.scopeB.metricC + dps := m.SetEmptySum() + dp := dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dpE") // resourceA.scopeB.metricC.dpE + m = s.Metrics().AppendEmpty() + m.SetName("metricD") // resourceA.scopeB.metricD + dps = m.SetEmptySum() + dp = dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dpE") // resourceA.scopeB.metricD.dpE + return md + }() + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewSums("A", "B", "CD", "E"))) + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("B", + pmetricutiltest.Sum("C", pmetricutiltest.NumberDataPoint("E")), + pmetricutiltest.Sum("D", pmetricutiltest.NumberDataPoint("E")), + ), + ), + ))) + }) + t.Run("histograms", func(t *testing.T) { + expected := func() pmetric.Metrics { + md := pmetric.NewMetrics() + r := md.ResourceMetrics().AppendEmpty() + r.Resource().Attributes().PutStr("resourceName", "resourceA") // resourceA + s := r.ScopeMetrics().AppendEmpty() + s.Scope().SetName("scopeB") // resourceA.scopeB + m := s.Metrics().AppendEmpty() + m.SetName("metricC") // resourceA.scopeB.metricC + dps := m.SetEmptyHistogram() + dp := dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dpE") // resourceA.scopeB.metricC.dpE + m = s.Metrics().AppendEmpty() + m.SetName("metricD") // resourceA.scopeB.metricD + dps = m.SetEmptyHistogram() + dp = dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dpE") // resourceA.scopeB.metricD.dpE + return md + }() + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewHistograms("A", "B", "CD", "E"))) + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("B", + pmetricutiltest.Histogram("C", pmetricutiltest.HistogramDataPoint("E")), + pmetricutiltest.Histogram("D", pmetricutiltest.HistogramDataPoint("E")), + ), + ), + ))) + }) + t.Run("exponential_histograms", func(t *testing.T) { + expected := func() pmetric.Metrics { + md := pmetric.NewMetrics() + r := md.ResourceMetrics().AppendEmpty() + r.Resource().Attributes().PutStr("resourceName", "resourceA") // resourceA + s := r.ScopeMetrics().AppendEmpty() + s.Scope().SetName("scopeB") // resourceA.scopeB + m := s.Metrics().AppendEmpty() + m.SetName("metricC") // resourceA.scopeB.metricC + dps := m.SetEmptyExponentialHistogram() + dp := dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dpE") // resourceA.scopeB.metricC.dpE + m = s.Metrics().AppendEmpty() + m.SetName("metricD") // resourceA.scopeB.metricD + dps = m.SetEmptyExponentialHistogram() + dp = dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dpE") // resourceA.scopeB.metricD.dpE + return md + }() + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewExponentialHistograms("A", "B", "CD", "E"))) + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("B", + pmetricutiltest.ExponentialHistogram("C", pmetricutiltest.ExponentialHistogramDataPoint("E")), + pmetricutiltest.ExponentialHistogram("D", pmetricutiltest.ExponentialHistogramDataPoint("E")), + ), + ), + ))) + }) + t.Run("summaries", func(t *testing.T) { + expected := func() pmetric.Metrics { + md := pmetric.NewMetrics() + r := md.ResourceMetrics().AppendEmpty() + r.Resource().Attributes().PutStr("resourceName", "resourceA") // resourceA + s := r.ScopeMetrics().AppendEmpty() + s.Scope().SetName("scopeB") // resourceA.scopeB + m := s.Metrics().AppendEmpty() + m.SetName("metricC") // resourceA.scopeB.metricC + dps := m.SetEmptySummary() + dp := dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dpE") // resourceA.scopeB.metricC.dpE + m = s.Metrics().AppendEmpty() + m.SetName("metricD") // resourceA.scopeB.metricD + dps = m.SetEmptySummary() + dp = dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dpE") // resourceA.scopeB.metricD.dpE + return md + }() + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewSummaries("A", "B", "CD", "E"))) + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("B", + pmetricutiltest.Summary("C", pmetricutiltest.SummaryDataPoint("E")), + pmetricutiltest.Summary("D", pmetricutiltest.SummaryDataPoint("E")), + ), + ), + ))) + }) + }) + + t.Run("two_datapoints", func(t *testing.T) { + t.Run("gauge", func(t *testing.T) { + expected := func() pmetric.Metrics { + md := pmetric.NewMetrics() + r := md.ResourceMetrics().AppendEmpty() + r.Resource().Attributes().PutStr("resourceName", "resourceA") // resourceA + s := r.ScopeMetrics().AppendEmpty() + s.Scope().SetName("scopeB") // resourceA.scopeB + m := s.Metrics().AppendEmpty() + m.SetName("metricC") // resourceA.scopeB.metricC + dps := m.SetEmptyGauge() + dp := dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dpD") // resourceA.scopeB.metricC.dpD + dp = dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dpE") // resourceA.scopeB.metricC.dpE + return md + }() + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewGauges("A", "B", "C", "DE"))) + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("B", pmetricutiltest.Gauge("C", pmetricutiltest.NumberDataPoint("D"), pmetricutiltest.NumberDataPoint("E"))), + ), + ))) + }) + t.Run("sum", func(t *testing.T) { + expected := func() pmetric.Metrics { + md := pmetric.NewMetrics() + r := md.ResourceMetrics().AppendEmpty() + r.Resource().Attributes().PutStr("resourceName", "resourceA") // resourceA + s := r.ScopeMetrics().AppendEmpty() + s.Scope().SetName("scopeB") // resourceA.scopeB + m := s.Metrics().AppendEmpty() + m.SetName("metricC") // resourceA.scopeB.metricC + dps := m.SetEmptySum() + dp := dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dpD") // resourceA.scopeB.metricC.dpD + dp = dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dpE") // resourceA.scopeB.metricC.dpE + return md + }() + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewSums("A", "B", "C", "DE"))) + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("B", pmetricutiltest.Sum("C", pmetricutiltest.NumberDataPoint("D"), pmetricutiltest.NumberDataPoint("E"))), + ), + ))) + }) + t.Run("histogram", func(t *testing.T) { + expected := func() pmetric.Metrics { + md := pmetric.NewMetrics() + r := md.ResourceMetrics().AppendEmpty() + r.Resource().Attributes().PutStr("resourceName", "resourceA") // resourceA + s := r.ScopeMetrics().AppendEmpty() + s.Scope().SetName("scopeB") // resourceA.scopeB + m := s.Metrics().AppendEmpty() + m.SetName("metricC") // resourceA.scopeB.metricC + dps := m.SetEmptyHistogram() + dp := dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dpD") // resourceA.scopeB.metricC.dpD + dp = dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dpE") // resourceA.scopeB.metricC.dpE + return md + }() + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewHistograms("A", "B", "C", "DE"))) + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("B", pmetricutiltest.Histogram("C", pmetricutiltest.HistogramDataPoint("D"), pmetricutiltest.HistogramDataPoint("E"))), + ), + ))) + }) + t.Run("exponential_histogram", func(t *testing.T) { + expected := func() pmetric.Metrics { + md := pmetric.NewMetrics() + r := md.ResourceMetrics().AppendEmpty() + r.Resource().Attributes().PutStr("resourceName", "resourceA") // resourceA + s := r.ScopeMetrics().AppendEmpty() + s.Scope().SetName("scopeB") // resourceA.scopeB + m := s.Metrics().AppendEmpty() + m.SetName("metricC") // resourceA.scopeB.metricC + dps := m.SetEmptyExponentialHistogram() + dp := dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dpD") // resourceA.scopeB.metricC.dpD + dp = dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dpE") // resourceA.scopeB.metricC.dpE + return md + }() + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewExponentialHistograms("A", "B", "C", "DE"))) + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("B", pmetricutiltest.ExponentialHistogram("C", pmetricutiltest.ExponentialHistogramDataPoint("D"), pmetricutiltest.ExponentialHistogramDataPoint("E"))), + ), + ))) + }) + t.Run("summary", func(t *testing.T) { + expected := func() pmetric.Metrics { + md := pmetric.NewMetrics() + r := md.ResourceMetrics().AppendEmpty() + r.Resource().Attributes().PutStr("resourceName", "resourceA") // resourceA + s := r.ScopeMetrics().AppendEmpty() + s.Scope().SetName("scopeB") // resourceA.scopeB + m := s.Metrics().AppendEmpty() + m.SetName("metricC") // resourceA.scopeB.metricC + dps := m.SetEmptySummary() + dp := dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dpD") // resourceA.scopeB.metricC.dpD + dp = dps.DataPoints().AppendEmpty() + dp.Attributes().PutStr("dpName", "dpE") // resourceA.scopeB.metricC.dpE + return md + }() + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewSummaries("A", "B", "C", "DE"))) + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("B", pmetricutiltest.Summary("C", pmetricutiltest.SummaryDataPoint("D"), pmetricutiltest.SummaryDataPoint("E"))), + ), + ))) + }) + }) + + t.Run("all_metric_types", func(t *testing.T) { + expected := func() pmetric.Metrics { + md := pmetric.NewMetrics() + r := md.ResourceMetrics().AppendEmpty() + r.Resource().Attributes().PutStr("resourceName", "resourceA") // resourceA + s := r.ScopeMetrics().AppendEmpty() + s.Scope().SetName("scopeB") // resourceA.scopeB + + m := s.Metrics().AppendEmpty() + m.SetName("metricC") // resourceA.scopeB.metricC + gauge := m.SetEmptyGauge() + ndp := gauge.DataPoints().AppendEmpty() + ndp.Attributes().PutStr("dpName", "dpX") // resourceA.scopeB.metricC.dpX + ndp = gauge.DataPoints().AppendEmpty() + ndp.Attributes().PutStr("dpName", "dpY") // resourceA.scopeB.metricC.dpY + + m = s.Metrics().AppendEmpty() + m.SetName("metricD") // resourceA.scopeB.metricD + sum := m.SetEmptySum() + ndp = sum.DataPoints().AppendEmpty() + ndp.Attributes().PutStr("dpName", "dpX") // resourceA.scopeB.metricD.dpX + ndp = sum.DataPoints().AppendEmpty() + ndp.Attributes().PutStr("dpName", "dpY") // resourceA.scopeB.metricD.dpY + + m = s.Metrics().AppendEmpty() + m.SetName("metricE") // resourceA.scopeB.metricE + hist := m.SetEmptyHistogram() + hdp := hist.DataPoints().AppendEmpty() + hdp.Attributes().PutStr("dpName", "dpX") // resourceA.scopeB.metricE.dpX + hdp = hist.DataPoints().AppendEmpty() + hdp.Attributes().PutStr("dpName", "dpY") // resourceA.scopeB.metricE.dpY + + m = s.Metrics().AppendEmpty() + m.SetName("metricF") // resourceA.scopeB.metricF + expHist := m.SetEmptyExponentialHistogram() + edp := expHist.DataPoints().AppendEmpty() + edp.Attributes().PutStr("dpName", "dpX") // resourceA.scopeB.metricF.dpX + edp = expHist.DataPoints().AppendEmpty() + edp.Attributes().PutStr("dpName", "dpY") // resourceA.scopeB.metricF.dpY + + m = s.Metrics().AppendEmpty() + m.SetName("metricG") // resourceA.scopeB.metricG + smry := m.SetEmptySummary() + sdp := smry.DataPoints().AppendEmpty() + sdp.Attributes().PutStr("dpName", "dpX") // resourceA.scopeB.metricG.dpX + sdp = smry.DataPoints().AppendEmpty() + sdp.Attributes().PutStr("dpName", "dpY") // resourceA.scopeB.metricG.dpY + + return md + }() + assert.NoError(t, pmetrictest.CompareMetrics(expected, pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("B", + pmetricutiltest.Gauge("C", pmetricutiltest.NumberDataPoint("X"), pmetricutiltest.NumberDataPoint("Y")), + pmetricutiltest.Sum("D", pmetricutiltest.NumberDataPoint("X"), pmetricutiltest.NumberDataPoint("Y")), + pmetricutiltest.Histogram("E", pmetricutiltest.HistogramDataPoint("X"), pmetricutiltest.HistogramDataPoint("Y")), + pmetricutiltest.ExponentialHistogram("F", pmetricutiltest.ExponentialHistogramDataPoint("X"), pmetricutiltest.ExponentialHistogramDataPoint("Y")), + pmetricutiltest.Summary("G", pmetricutiltest.SummaryDataPoint("X"), pmetricutiltest.SummaryDataPoint("Y")), + ), + ), + ))) + }) +} diff --git a/connector/routingconnector/internal/ptraceutil/traces.go b/connector/routingconnector/internal/ptraceutil/traces.go new file mode 100644 index 000000000000..e47bb7529dce --- /dev/null +++ b/connector/routingconnector/internal/ptraceutil/traces.go @@ -0,0 +1,61 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ptraceutil // import "github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector/internal/ptraceutil" + +import "go.opentelemetry.io/collector/pdata/ptrace" + +// MoveResourcesIf calls f sequentially for each ResourceSpans present in the first ptrace.Traces. +// If f returns true, the element is removed from the first ptrace.Traces and added to the second ptrace.Traces. +func MoveResourcesIf(from, to ptrace.Traces, f func(ptrace.ResourceSpans) bool) { + from.ResourceSpans().RemoveIf(func(resoruceSpans ptrace.ResourceSpans) bool { + if !f(resoruceSpans) { + return false + } + resoruceSpans.CopyTo(to.ResourceSpans().AppendEmpty()) + return true + }) +} + +// MoveSpansWithContextIf calls f sequentially for each Span present in the first ptrace.Traces. +// If f returns true, the element is removed from the first ptrace.Traces and added to the second ptrace.Traces. +// Notably, the Resource and Scope associated with the Span are created in the second ptrace.Traces only once. +// Resources or Scopes are removed from the original if they become empty. All ordering is preserved. +func MoveSpansWithContextIf(from, to ptrace.Traces, f func(ptrace.ResourceSpans, ptrace.ScopeSpans, ptrace.Span) bool) { + resourceSpansSlice := from.ResourceSpans() + for i := 0; i < resourceSpansSlice.Len(); i++ { + resourceSpans := resourceSpansSlice.At(i) + scopeSpanSlice := resourceSpans.ScopeSpans() + var resourceSpansCopy *ptrace.ResourceSpans + for j := 0; j < scopeSpanSlice.Len(); j++ { + scopeSpans := scopeSpanSlice.At(j) + spanSlice := scopeSpans.Spans() + var scopeSpansCopy *ptrace.ScopeSpans + spanSlice.RemoveIf(func(span ptrace.Span) bool { + if !f(resourceSpans, scopeSpans, span) { + return false + } + if resourceSpansCopy == nil { + rmc := to.ResourceSpans().AppendEmpty() + resourceSpansCopy = &rmc + resourceSpans.Resource().CopyTo(resourceSpansCopy.Resource()) + resourceSpansCopy.SetSchemaUrl(resourceSpans.SchemaUrl()) + } + if scopeSpansCopy == nil { + smc := resourceSpansCopy.ScopeSpans().AppendEmpty() + scopeSpansCopy = &smc + scopeSpans.Scope().CopyTo(scopeSpansCopy.Scope()) + scopeSpansCopy.SetSchemaUrl(scopeSpans.SchemaUrl()) + } + span.CopyTo(scopeSpansCopy.Spans().AppendEmpty()) + return true + }) + } + scopeSpanSlice.RemoveIf(func(sm ptrace.ScopeSpans) bool { + return sm.Spans().Len() == 0 + }) + } + resourceSpansSlice.RemoveIf(func(resourceSpans ptrace.ResourceSpans) bool { + return resourceSpans.ScopeSpans().Len() == 0 + }) +} diff --git a/connector/routingconnector/internal/ptraceutil/traces_test.go b/connector/routingconnector/internal/ptraceutil/traces_test.go new file mode 100644 index 000000000000..9baca4fda0a1 --- /dev/null +++ b/connector/routingconnector/internal/ptraceutil/traces_test.go @@ -0,0 +1,266 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ptraceutil_test + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "go.opentelemetry.io/collector/pdata/ptrace" + + "github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector/internal/ptraceutil" + "github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector/internal/ptraceutiltest" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/ptracetest" +) + +func TestMoveResourcesIf(t *testing.T) { + testCases := []struct { + name string + moveIf func(ptrace.ResourceSpans) bool + from ptrace.Traces + to ptrace.Traces + expectFrom ptrace.Traces + expectTo ptrace.Traces + }{ + { + name: "move_none", + moveIf: func(ptrace.ResourceSpans) bool { + return false + }, + from: ptraceutiltest.NewTraces("AB", "CD", "EF", "FG"), + to: ptrace.NewTraces(), + expectFrom: ptraceutiltest.NewTraces("AB", "CD", "EF", "FG"), + expectTo: ptrace.NewTraces(), + }, + { + name: "move_all", + moveIf: func(ptrace.ResourceSpans) bool { + return true + }, + from: ptraceutiltest.NewTraces("AB", "CD", "EF", "FG"), + to: ptrace.NewTraces(), + expectFrom: ptrace.NewTraces(), + expectTo: ptraceutiltest.NewTraces("AB", "CD", "EF", "FG"), + }, + { + name: "move_one", + moveIf: func(rl ptrace.ResourceSpans) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceA" + }, + from: ptraceutiltest.NewTraces("AB", "CD", "EF", "FG"), + to: ptrace.NewTraces(), + expectFrom: ptraceutiltest.NewTraces("B", "CD", "EF", "FG"), + expectTo: ptraceutiltest.NewTraces("A", "CD", "EF", "FG"), + }, + { + name: "move_to_preexisting", + moveIf: func(rl ptrace.ResourceSpans) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceB" + }, + from: ptraceutiltest.NewTraces("AB", "CD", "EF", "FG"), + to: ptraceutiltest.NewTraces("1", "2", "3", "4"), + expectFrom: ptraceutiltest.NewTraces("A", "CD", "EF", "FG"), + expectTo: func() ptrace.Traces { + move := ptraceutiltest.NewTraces("B", "CD", "EF", "FG") + moveTo := ptraceutiltest.NewTraces("1", "2", "3", "4") + move.ResourceSpans().MoveAndAppendTo(moveTo.ResourceSpans()) + return moveTo + }(), + }, + } + + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + ptraceutil.MoveResourcesIf(tt.from, tt.to, tt.moveIf) + assert.NoError(t, ptracetest.CompareTraces(tt.expectFrom, tt.from), "from not modified as expected") + assert.NoError(t, ptracetest.CompareTraces(tt.expectTo, tt.to), "to not as expected") + }) + } +} + +func TestMoveSpansWithContextIf(t *testing.T) { + testCases := []struct { + name string + moveIf func(ptrace.ResourceSpans, ptrace.ScopeSpans, ptrace.Span) bool + from ptrace.Traces + to ptrace.Traces + expectFrom ptrace.Traces + expectTo ptrace.Traces + }{ + { + name: "move_none", + moveIf: func(_ ptrace.ResourceSpans, _ ptrace.ScopeSpans, _ ptrace.Span) bool { + return false + }, + from: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + to: ptrace.NewTraces(), + expectFrom: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectTo: ptrace.NewTraces(), + }, + { + name: "move_all", + moveIf: func(_ ptrace.ResourceSpans, _ ptrace.ScopeSpans, _ ptrace.Span) bool { + return true + }, + from: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + to: ptrace.NewTraces(), + expectFrom: ptrace.NewTraces(), + expectTo: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + }, + { + name: "move_all_from_one_resource", + moveIf: func(rl ptrace.ResourceSpans, _ ptrace.ScopeSpans, _ ptrace.Span) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceB" + }, + from: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + to: ptrace.NewTraces(), + expectFrom: ptraceutiltest.NewTraces("A", "CD", "EF", "GH"), + expectTo: ptraceutiltest.NewTraces("B", "CD", "EF", "GH"), + }, + { + name: "move_all_from_one_scope", + moveIf: func(rl ptrace.ResourceSpans, sl ptrace.ScopeSpans, _ ptrace.Span) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceB" && sl.Scope().Name() == "scopeC" + }, + from: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + to: ptrace.NewTraces(), + expectFrom: ptraceutiltest.NewTracesFromOpts( + ptraceutiltest.Resource("A", + ptraceutiltest.Scope("C", + ptraceutiltest.Span("E", ptraceutiltest.SpanEvent("G"), ptraceutiltest.SpanEvent("H")), + ptraceutiltest.Span("F", ptraceutiltest.SpanEvent("G"), ptraceutiltest.SpanEvent("H")), + ), + ptraceutiltest.Scope("D", + ptraceutiltest.Span("E", ptraceutiltest.SpanEvent("G"), ptraceutiltest.SpanEvent("H")), + ptraceutiltest.Span("F", ptraceutiltest.SpanEvent("G"), ptraceutiltest.SpanEvent("H")), + ), + ), + ptraceutiltest.Resource("B", + ptraceutiltest.Scope("D", + ptraceutiltest.Span("E", ptraceutiltest.SpanEvent("G"), ptraceutiltest.SpanEvent("H")), + ptraceutiltest.Span("F", ptraceutiltest.SpanEvent("G"), ptraceutiltest.SpanEvent("H")), + ), + ), + ), + expectTo: ptraceutiltest.NewTraces("B", "C", "EF", "GH"), + }, + { + name: "move_all_from_one_scope_in_each_resource", + moveIf: func(_ ptrace.ResourceSpans, sl ptrace.ScopeSpans, _ ptrace.Span) bool { + return sl.Scope().Name() == "scopeD" + }, + from: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + to: ptrace.NewTraces(), + expectFrom: ptraceutiltest.NewTraces("AB", "C", "EF", "GH"), + expectTo: ptraceutiltest.NewTraces("AB", "D", "EF", "GH"), + }, + { + name: "move_one", + moveIf: func(rl ptrace.ResourceSpans, sl ptrace.ScopeSpans, m ptrace.Span) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceA" && sl.Scope().Name() == "scopeD" && m.Name() == "spanF" + }, + from: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + to: ptrace.NewTraces(), + expectFrom: ptraceutiltest.NewTracesFromOpts( + ptraceutiltest.Resource("A", + ptraceutiltest.Scope("C", + ptraceutiltest.Span("E", ptraceutiltest.SpanEvent("G"), ptraceutiltest.SpanEvent("H")), + ptraceutiltest.Span("F", ptraceutiltest.SpanEvent("G"), ptraceutiltest.SpanEvent("H")), + ), + ptraceutiltest.Scope("D", + ptraceutiltest.Span("E", ptraceutiltest.SpanEvent("G"), ptraceutiltest.SpanEvent("H")), + ), + ), + ptraceutiltest.Resource("B", + ptraceutiltest.Scope("C", + ptraceutiltest.Span("E", ptraceutiltest.SpanEvent("G"), ptraceutiltest.SpanEvent("H")), + ptraceutiltest.Span("F", ptraceutiltest.SpanEvent("G"), ptraceutiltest.SpanEvent("H")), + ), + ptraceutiltest.Scope("D", + ptraceutiltest.Span("E", ptraceutiltest.SpanEvent("G"), ptraceutiltest.SpanEvent("H")), + ptraceutiltest.Span("F", ptraceutiltest.SpanEvent("G"), ptraceutiltest.SpanEvent("H")), + ), + ), + ), + expectTo: ptraceutiltest.NewTraces("A", "D", "F", "GH"), + }, + { + name: "move_one_from_each_scope", + moveIf: func(_ ptrace.ResourceSpans, _ ptrace.ScopeSpans, m ptrace.Span) bool { + return m.Name() == "spanE" + }, + from: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + to: ptrace.NewTraces(), + expectFrom: ptraceutiltest.NewTraces("AB", "CD", "F", "GH"), + expectTo: ptraceutiltest.NewTraces("AB", "CD", "E", "GH"), + }, + { + name: "move_one_from_each_scope_in_one_resource", + moveIf: func(rl ptrace.ResourceSpans, _ ptrace.ScopeSpans, m ptrace.Span) bool { + rname, ok := rl.Resource().Attributes().Get("resourceName") + return ok && rname.AsString() == "resourceB" && m.Name() == "spanE" + }, + from: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + to: ptrace.NewTraces(), + expectFrom: ptraceutiltest.NewTracesFromOpts( + ptraceutiltest.Resource("A", + ptraceutiltest.Scope("C", + ptraceutiltest.Span("E", ptraceutiltest.SpanEvent("G"), ptraceutiltest.SpanEvent("H")), + ptraceutiltest.Span("F", ptraceutiltest.SpanEvent("G"), ptraceutiltest.SpanEvent("H")), + ), + ptraceutiltest.Scope("D", + ptraceutiltest.Span("E", ptraceutiltest.SpanEvent("G"), ptraceutiltest.SpanEvent("H")), + ptraceutiltest.Span("F", ptraceutiltest.SpanEvent("G"), ptraceutiltest.SpanEvent("H")), + ), + ), + ptraceutiltest.Resource("B", + ptraceutiltest.Scope("C", + ptraceutiltest.Span("F", ptraceutiltest.SpanEvent("G"), ptraceutiltest.SpanEvent("H")), + ), + ptraceutiltest.Scope("D", + ptraceutiltest.Span("F", ptraceutiltest.SpanEvent("G"), ptraceutiltest.SpanEvent("H")), + ), + ), + ), + expectTo: ptraceutiltest.NewTraces("B", "CD", "E", "GH"), + }, + { + name: "move_some_to_preexisting", + moveIf: func(_ ptrace.ResourceSpans, sl ptrace.ScopeSpans, _ ptrace.Span) bool { + return sl.Scope().Name() == "scopeD" + }, + from: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + to: ptraceutiltest.NewTraces("1", "2", "3", "4"), + expectFrom: ptraceutiltest.NewTraces("AB", "C", "EF", "GH"), + expectTo: ptraceutiltest.NewTracesFromOpts( + ptraceutiltest.Resource("1", ptraceutiltest.Scope("2", ptraceutiltest.Span("3", ptraceutiltest.SpanEvent("4")))), + ptraceutiltest.Resource("A", + ptraceutiltest.Scope("D", + ptraceutiltest.Span("E", ptraceutiltest.SpanEvent("G"), ptraceutiltest.SpanEvent("H")), + ptraceutiltest.Span("F", ptraceutiltest.SpanEvent("G"), ptraceutiltest.SpanEvent("H")), + ), + ), + ptraceutiltest.Resource("B", + ptraceutiltest.Scope("D", + ptraceutiltest.Span("E", ptraceutiltest.SpanEvent("G"), ptraceutiltest.SpanEvent("H")), + ptraceutiltest.Span("F", ptraceutiltest.SpanEvent("G"), ptraceutiltest.SpanEvent("H")), + ), + ), + ), + }, + } + + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + ptraceutil.MoveSpansWithContextIf(tt.from, tt.to, tt.moveIf) + assert.NoError(t, ptracetest.CompareTraces(tt.expectFrom, tt.from), "from not modified as expected") + assert.NoError(t, ptracetest.CompareTraces(tt.expectTo, tt.to), "to not as expected") + }) + } +} diff --git a/connector/routingconnector/internal/ptraceutiltest/traces.go b/connector/routingconnector/internal/ptraceutiltest/traces.go new file mode 100644 index 000000000000..b6d4413cbc2c --- /dev/null +++ b/connector/routingconnector/internal/ptraceutiltest/traces.go @@ -0,0 +1,85 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ptraceutiltest // import "github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector/internal/ptraceutiltest" + +import "go.opentelemetry.io/collector/pdata/ptrace" + +// TestTraces returns a ptrace.Traces with a uniform structure where resources, scopes, spans, +// and spanevents are identical across all instances, except for one identifying field. +// +// Identifying fields: +// - Resources have an attribute called "resourceName" with a value of "resourceN". +// - Scopes have a name with a value of "scopeN". +// - Spans have a name with a value of "spanN". +// - Span Events have an attribute "spanEventName" with a value of "spanEventN". +// +// Example: TestTraces("AB", "XYZ", "MN", "1234") returns: +// +// resourceA, resourceB +// each with scopeX, scopeY, scopeZ +// each with spanM, spanN +// each with spanEvent1, spanEvent2, spanEvent3, spanEvent4 +// +// Each byte in the input string is a unique ID for the corresponding element. +func NewTraces(resourceIDs, scopeIDs, spanIDs, spanEventIDs string) ptrace.Traces { + td := ptrace.NewTraces() + for resourceN := 0; resourceN < len(resourceIDs); resourceN++ { + rs := td.ResourceSpans().AppendEmpty() + rs.Resource().Attributes().PutStr("resourceName", "resource"+string(resourceIDs[resourceN])) + for scopeN := 0; scopeN < len(scopeIDs); scopeN++ { + ss := rs.ScopeSpans().AppendEmpty() + ss.Scope().SetName("scope" + string(scopeIDs[scopeN])) + for spanN := 0; spanN < len(spanIDs); spanN++ { + s := ss.Spans().AppendEmpty() + s.SetName("span" + string(spanIDs[spanN])) + for spanEventN := 0; spanEventN < len(spanEventIDs); spanEventN++ { + se := s.Events().AppendEmpty() + se.Attributes().PutStr("spanEventName", "spanEvent"+string(spanEventIDs[spanEventN])) + } + } + } + } + return td +} + +func NewTracesFromOpts(resources ...ptrace.ResourceSpans) ptrace.Traces { + md := ptrace.NewTraces() + for _, resource := range resources { + resource.CopyTo(md.ResourceSpans().AppendEmpty()) + } + return md +} + +func Resource(id string, scopes ...ptrace.ScopeSpans) ptrace.ResourceSpans { + rm := ptrace.NewResourceSpans() + rm.Resource().Attributes().PutStr("resourceName", "resource"+id) + for _, scope := range scopes { + scope.CopyTo(rm.ScopeSpans().AppendEmpty()) + } + return rm +} + +func Scope(id string, spans ...ptrace.Span) ptrace.ScopeSpans { + s := ptrace.NewScopeSpans() + s.Scope().SetName("scope" + id) + for _, span := range spans { + span.CopyTo(s.Spans().AppendEmpty()) + } + return s +} + +func Span(id string, ses ...ptrace.SpanEvent) ptrace.Span { + m := ptrace.NewSpan() + m.SetName("span" + id) + for _, se := range ses { + se.CopyTo(m.Events().AppendEmpty()) + } + return m +} + +func SpanEvent(id string) ptrace.SpanEvent { + dp := ptrace.NewSpanEvent() + dp.Attributes().PutStr("spanEventName", "spanEvent"+id) + return dp +} diff --git a/connector/routingconnector/internal/ptraceutiltest/traces_test.go b/connector/routingconnector/internal/ptraceutiltest/traces_test.go new file mode 100644 index 000000000000..0c72431638dc --- /dev/null +++ b/connector/routingconnector/internal/ptraceutiltest/traces_test.go @@ -0,0 +1,150 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ptraceutiltest_test + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "go.opentelemetry.io/collector/pdata/ptrace" + + "github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector/internal/ptraceutiltest" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/ptracetest" +) + +func TestNewTraces(t *testing.T) { + t.Run("empty", func(t *testing.T) { + expected := ptrace.NewTraces() + assert.NoError(t, ptracetest.CompareTraces(expected, ptraceutiltest.NewTraces("", "", "", ""))) + assert.NoError(t, ptracetest.CompareTraces(expected, ptraceutiltest.NewTracesFromOpts())) + }) + + t.Run("simple", func(t *testing.T) { + expected := func() ptrace.Traces { + td := ptrace.NewTraces() + rs := td.ResourceSpans().AppendEmpty() + rs.Resource().Attributes().PutStr("resourceName", "resourceA") // resourceA + ss := rs.ScopeSpans().AppendEmpty() + ss.Scope().SetName("scopeB") // resourceA.scopeB + s := ss.Spans().AppendEmpty() + s.SetName("spanC") // resourceA.scopeB.spanC + se := s.Events().AppendEmpty() + se.Attributes().PutStr("spanEventName", "spanEventD") // resourceA.scopeB.spanC.spanEventD + return td + }() + assert.NoError(t, ptracetest.CompareTraces(expected, ptraceutiltest.NewTraces("A", "B", "C", "D"))) + assert.NoError(t, ptracetest.CompareTraces(expected, ptraceutiltest.NewTracesFromOpts( + ptraceutiltest.Resource("A", ptraceutiltest.Scope("B", ptraceutiltest.Span("C", ptraceutiltest.SpanEvent("D")))), + ))) + }) + + t.Run("two_resources", func(t *testing.T) { + expected := func() ptrace.Traces { + td := ptrace.NewTraces() + rs := td.ResourceSpans().AppendEmpty() + rs.Resource().Attributes().PutStr("resourceName", "resourceA") // resourceA + ss := rs.ScopeSpans().AppendEmpty() + ss.Scope().SetName("scopeC") // resourceA.scopeC + s := ss.Spans().AppendEmpty() + s.SetName("spanD") // resourceA.scopeC.spanD + se := s.Events().AppendEmpty() + se.Attributes().PutStr("spanEventName", "spanEventE") // resourceA.scopeC.spanD.spanEventE + rs = td.ResourceSpans().AppendEmpty() + rs.Resource().Attributes().PutStr("resourceName", "resourceB") // resourceB + ss = rs.ScopeSpans().AppendEmpty() + ss.Scope().SetName("scopeC") // resourceB.scopeC + s = ss.Spans().AppendEmpty() + s.SetName("spanD") // resourceB.scopeC.spanD + se = s.Events().AppendEmpty() + se.Attributes().PutStr("spanEventName", "spanEventE") // resourceB.scopeC.spanD.spanEventE + return td + }() + assert.NoError(t, ptracetest.CompareTraces(expected, ptraceutiltest.NewTraces("AB", "C", "D", "E"))) + assert.NoError(t, ptracetest.CompareTraces(expected, ptraceutiltest.NewTracesFromOpts( + ptraceutiltest.Resource("A", ptraceutiltest.Scope("C", ptraceutiltest.Span("D", ptraceutiltest.SpanEvent("E")))), + ptraceutiltest.Resource("B", ptraceutiltest.Scope("C", ptraceutiltest.Span("D", ptraceutiltest.SpanEvent("E")))), + ))) + }) + + t.Run("two_scopes", func(t *testing.T) { + expected := func() ptrace.Traces { + td := ptrace.NewTraces() + rs := td.ResourceSpans().AppendEmpty() + rs.Resource().Attributes().PutStr("resourceName", "resourceA") // resourceA + ss := rs.ScopeSpans().AppendEmpty() + ss.Scope().SetName("scopeB") // resourceA.scopeB + s := ss.Spans().AppendEmpty() + s.SetName("spanD") // resourceA.scopeB.spanD + se := s.Events().AppendEmpty() + se.Attributes().PutStr("spanEventName", "spanEventE") // resourceA.scopeB.spanD.spanEventE + ss = rs.ScopeSpans().AppendEmpty() + ss.Scope().SetName("scopeC") // resourceA.scopeC + s = ss.Spans().AppendEmpty() + s.SetName("spanD") // resourceA.scopeC.spanD + se = s.Events().AppendEmpty() + se.Attributes().PutStr("spanEventName", "spanEventE") // resourceA.scopeC.spanD.spanEventE + return td + }() + assert.NoError(t, ptracetest.CompareTraces(expected, ptraceutiltest.NewTraces("A", "BC", "D", "E"))) + assert.NoError(t, ptracetest.CompareTraces(expected, ptraceutiltest.NewTracesFromOpts( + ptraceutiltest.Resource("A", + ptraceutiltest.Scope("B", ptraceutiltest.Span("D", ptraceutiltest.SpanEvent("E"))), + ptraceutiltest.Scope("C", ptraceutiltest.Span("D", ptraceutiltest.SpanEvent("E"))), + ), + ))) + }) + + t.Run("two_spans", func(t *testing.T) { + expected := func() ptrace.Traces { + td := ptrace.NewTraces() + rs := td.ResourceSpans().AppendEmpty() + rs.Resource().Attributes().PutStr("resourceName", "resourceA") // resourceA + ss := rs.ScopeSpans().AppendEmpty() + ss.Scope().SetName("scopeB") // resourceA.scopeB + s := ss.Spans().AppendEmpty() + s.SetName("spanC") // resourceA.scopeB.spanC + se := s.Events().AppendEmpty() + se.Attributes().PutStr("spanEventName", "spanEventE") // resourceA.scopeB.spanC.spanEventE + s = ss.Spans().AppendEmpty() + s.SetName("spanD") // resourceA.scopeB.spanD + se = s.Events().AppendEmpty() + se.Attributes().PutStr("spanEventName", "spanEventE") // resourceA.scopeB.spanD.spanEventE + return td + }() + assert.NoError(t, ptracetest.CompareTraces(expected, ptraceutiltest.NewTraces("A", "B", "CD", "E"))) + assert.NoError(t, ptracetest.CompareTraces(expected, ptraceutiltest.NewTracesFromOpts( + ptraceutiltest.Resource("A", + ptraceutiltest.Scope("B", + ptraceutiltest.Span("C", ptraceutiltest.SpanEvent("E")), + ptraceutiltest.Span("D", ptraceutiltest.SpanEvent("E")), + ), + ), + ))) + }) + + t.Run("two_spanevents", func(t *testing.T) { + expected := func() ptrace.Traces { + td := ptrace.NewTraces() + rs := td.ResourceSpans().AppendEmpty() + rs.Resource().Attributes().PutStr("resourceName", "resourceA") // resourceA + ss := rs.ScopeSpans().AppendEmpty() + ss.Scope().SetName("scopeB") // resourceA.scopeB + s := ss.Spans().AppendEmpty() + s.SetName("spanC") // resourceA.scopeB.spanC + se := s.Events().AppendEmpty() + se.Attributes().PutStr("spanEventName", "spanEventD") // resourceA.scopeB.spanC.spanEventD + se = s.Events().AppendEmpty() + se.Attributes().PutStr("spanEventName", "spanEventE") // resourceA.scopeB.spanC.spanEventE + return td + }() + assert.NoError(t, ptracetest.CompareTraces(expected, ptraceutiltest.NewTraces("A", "B", "C", "DE"))) + assert.NoError(t, ptracetest.CompareTraces(expected, ptraceutiltest.NewTracesFromOpts( + ptraceutiltest.Resource("A", + ptraceutiltest.Scope("B", + ptraceutiltest.Span("C", ptraceutiltest.SpanEvent("D"), ptraceutiltest.SpanEvent("E")), + ), + ), + ))) + }) +} diff --git a/connector/routingconnector/logs.go b/connector/routingconnector/logs.go index b5a38fcc05e3..d488ae79fc65 100644 --- a/connector/routingconnector/logs.go +++ b/connector/routingconnector/logs.go @@ -13,7 +13,9 @@ import ( "go.opentelemetry.io/collector/pdata/plog" "go.uber.org/zap" + "github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector/internal/plogutil" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottllog" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottlresource" ) @@ -27,12 +29,17 @@ type logsConnector struct { } func newLogsConnector( - set connector.CreateSettings, + set connector.Settings, config component.Config, logs consumer.Logs, ) (*logsConnector, error) { cfg := config.(*Config) + // TODO update log from warning to error in v0.116.0 + if !cfg.MatchOnce { + set.Logger.Warn("The 'match_once' field has been deprecated. Set to 'true' to suppress this warning.") + } + lr, ok := logs.(connector.LogsRouterAndConsumer) if !ok { return nil, errUnexpectedConsumer @@ -43,7 +50,6 @@ func newLogsConnector( cfg.DefaultPipelines, lr.Consumer, set.TelemetrySettings) - if err != nil { return nil, err } @@ -60,40 +66,89 @@ func (c *logsConnector) Capabilities() consumer.Capabilities { } func (c *logsConnector) ConsumeLogs(ctx context.Context, ld plog.Logs) error { + if c.config.MatchOnce { + return c.switchLogs(ctx, ld) + } + return c.matchAllLogs(ctx, ld) +} + +// switchLogs removes items from the original plog.Logs as they are matched, +// and sends them to the appropriate consumer. +func (c *logsConnector) switchLogs(ctx context.Context, ld plog.Logs) error { + groups := make(map[consumer.Logs]plog.Logs) + var errs error + for i := 0; i < len(c.router.routeSlice) && ld.ResourceLogs().Len() > 0; i++ { + route := c.router.routeSlice[i] + matchedLogs := plog.NewLogs() + switch route.statementContext { + case "request": + if route.requestCondition.matchRequest(ctx) { + groupAllLogs(groups, route.consumer, ld) + ld = plog.NewLogs() // all logs have been routed + } + case "", "resource": + plogutil.MoveResourcesIf(ld, matchedLogs, + func(rl plog.ResourceLogs) bool { + rtx := ottlresource.NewTransformContext(rl.Resource(), rl) + _, isMatch, err := route.resourceStatement.Execute(ctx, rtx) + errs = errors.Join(errs, err) + return isMatch + }, + ) + case "log": + plogutil.MoveRecordsWithContextIf(ld, matchedLogs, + func(rl plog.ResourceLogs, sl plog.ScopeLogs, lr plog.LogRecord) bool { + ltx := ottllog.NewTransformContext(lr, sl.Scope(), rl.Resource(), sl, rl) + _, isMatch, err := route.logStatement.Execute(ctx, ltx) + errs = errors.Join(errs, err) + return isMatch + }, + ) + } + if errs != nil { + if c.config.ErrorMode == ottl.PropagateError { + return errs + } + groupAllLogs(groups, c.router.defaultConsumer, matchedLogs) + } + groupAllLogs(groups, route.consumer, matchedLogs) + } + // anything left wasn't matched by any route. Send to default consumer + groupAllLogs(groups, c.router.defaultConsumer, ld) + for consumer, group := range groups { + errs = errors.Join(errs, consumer.ConsumeLogs(ctx, group)) + } + return errs +} + +func (c *logsConnector) matchAllLogs(ctx context.Context, ld plog.Logs) error { // routingEntry is used to group plog.ResourceLogs that are routed to // the same set of exporters. // This way we're not ending up with all the logs split up which would cause // higher CPU usage. groups := make(map[consumer.Logs]plog.Logs) var errs error - for i := 0; i < ld.ResourceLogs().Len(); i++ { rlogs := ld.ResourceLogs().At(i) - rtx := ottlresource.NewTransformContext(rlogs.Resource()) - + rtx := ottlresource.NewTransformContext(rlogs.Resource(), rlogs) noRoutesMatch := true for _, route := range c.router.routeSlice { - _, isMatch, err := route.statement.Execute(ctx, rtx) + _, isMatch, err := route.resourceStatement.Execute(ctx, rtx) if err != nil { if c.config.ErrorMode == ottl.PropagateError { return err } - c.group(groups, c.router.defaultConsumer, rlogs) + groupLogs(groups, c.router.defaultConsumer, rlogs) continue } if isMatch { noRoutesMatch = false - c.group(groups, route.consumer, rlogs) - if c.config.MatchOnce { - break - } + groupLogs(groups, route.consumer, rlogs) } - } - if noRoutesMatch { // no route conditions are matched, add resource logs to default exporters group - c.group(groups, c.router.defaultConsumer, rlogs) + groupLogs(groups, c.router.defaultConsumer, rlogs) } } for consumer, group := range groups { @@ -102,18 +157,28 @@ func (c *logsConnector) ConsumeLogs(ctx context.Context, ld plog.Logs) error { return errs } -func (c *logsConnector) group( +func groupAllLogs( + groups map[consumer.Logs]plog.Logs, + cons consumer.Logs, + logs plog.Logs, +) { + for i := 0; i < logs.ResourceLogs().Len(); i++ { + groupLogs(groups, cons, logs.ResourceLogs().At(i)) + } +} + +func groupLogs( groups map[consumer.Logs]plog.Logs, - consumer consumer.Logs, + cons consumer.Logs, logs plog.ResourceLogs, ) { - if consumer == nil { + if cons == nil { return } - group, ok := groups[consumer] + group, ok := groups[cons] if !ok { group = plog.NewLogs() } logs.CopyTo(group.ResourceLogs().AppendEmpty()) - groups[consumer] = group + groups[cons] = group } diff --git a/connector/routingconnector/logs_test.go b/connector/routingconnector/logs_test.go index bcd97da62ba1..3cf9ca03321a 100644 --- a/connector/routingconnector/logs_test.go +++ b/connector/routingconnector/logs_test.go @@ -9,30 +9,32 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/connector" "go.opentelemetry.io/collector/connector/connectortest" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/consumer/consumertest" "go.opentelemetry.io/collector/pdata/plog" + "go.opentelemetry.io/collector/pipeline" + + "github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector/internal/plogutiltest" ) func TestLogsRegisterConsumersForValidRoute(t *testing.T) { - logsDefault := component.NewIDWithName(component.DataTypeLogs, "default") - logs0 := component.NewIDWithName(component.DataTypeLogs, "0") - logs1 := component.NewIDWithName(component.DataTypeLogs, "1") + logsDefault := pipeline.NewIDWithName(pipeline.SignalLogs, "default") + logs0 := pipeline.NewIDWithName(pipeline.SignalLogs, "0") + logs1 := pipeline.NewIDWithName(pipeline.SignalLogs, "1") cfg := &Config{ - DefaultPipelines: []component.ID{logsDefault}, + DefaultPipelines: []pipeline.ID{logsDefault}, Table: []RoutingTableItem{ { Statement: `route() where attributes["X-Tenant"] == "acme"`, - Pipelines: []component.ID{logs0}, + Pipelines: []pipeline.ID{logs0}, }, { - Statement: `route() where attributes["X-Tenant"] == "*"`, - Pipelines: []component.ID{logs0, logs1}, + Condition: `attributes["X-Tenant"] == "*"`, + Pipelines: []pipeline.ID{logs0, logs1}, }, }, } @@ -41,14 +43,14 @@ func TestLogsRegisterConsumersForValidRoute(t *testing.T) { var defaultSink, sink0, sink1 consumertest.LogsSink - router := connector.NewLogsRouter(map[component.ID]consumer.Logs{ + router := connector.NewLogsRouter(map[pipeline.ID]consumer.Logs{ logsDefault: &defaultSink, logs0: &sink0, logs1: &sink1, }) conn, err := NewFactory().CreateLogsToLogs(context.Background(), - connectortest.NewNopCreateSettings(), cfg, router.(consumer.Logs)) + connectortest.NewNopSettings(), cfg, router.(consumer.Logs)) require.NoError(t, err) require.NotNil(t, conn) @@ -76,31 +78,31 @@ func TestLogsRegisterConsumersForValidRoute(t *testing.T) { } func TestLogsAreCorrectlySplitPerResourceAttributeWithOTTL(t *testing.T) { - logsDefault := component.NewIDWithName(component.DataTypeLogs, "default") - logs0 := component.NewIDWithName(component.DataTypeLogs, "0") - logs1 := component.NewIDWithName(component.DataTypeLogs, "1") + logsDefault := pipeline.NewIDWithName(pipeline.SignalLogs, "default") + logs0 := pipeline.NewIDWithName(pipeline.SignalLogs, "0") + logs1 := pipeline.NewIDWithName(pipeline.SignalLogs, "1") cfg := &Config{ - DefaultPipelines: []component.ID{logsDefault}, + DefaultPipelines: []pipeline.ID{logsDefault}, Table: []RoutingTableItem{ { - Statement: `route() where IsMatch(attributes["X-Tenant"], ".*acme") == true`, - Pipelines: []component.ID{logs0}, + Condition: `IsMatch(attributes["X-Tenant"], ".*acme") == true`, + Pipelines: []pipeline.ID{logs0}, }, { Statement: `route() where IsMatch(attributes["X-Tenant"], "_acme") == true`, - Pipelines: []component.ID{logs1}, + Pipelines: []pipeline.ID{logs1}, }, { Statement: `route() where attributes["X-Tenant"] == "ecorp"`, - Pipelines: []component.ID{logsDefault, logs0}, + Pipelines: []pipeline.ID{logsDefault, logs0}, }, }, } var defaultSink, sink0, sink1 consumertest.LogsSink - router := connector.NewLogsRouter(map[component.ID]consumer.Logs{ + router := connector.NewLogsRouter(map[pipeline.ID]consumer.Logs{ logsDefault: &defaultSink, logs0: &sink0, logs1: &sink1, @@ -115,7 +117,7 @@ func TestLogsAreCorrectlySplitPerResourceAttributeWithOTTL(t *testing.T) { factory := NewFactory() conn, err := factory.CreateLogsToLogs( context.Background(), - connectortest.NewNopCreateSettings(), + connectortest.NewNopSettings(), cfg, router.(consumer.Logs), ) @@ -138,8 +140,8 @@ func TestLogsAreCorrectlySplitPerResourceAttributeWithOTTL(t *testing.T) { require.NoError(t, conn.ConsumeLogs(context.Background(), l)) assert.Len(t, defaultSink.AllLogs(), 1) - assert.Len(t, sink0.AllLogs(), 0) - assert.Len(t, sink1.AllLogs(), 0) + assert.Empty(t, sink0.AllLogs()) + assert.Empty(t, sink1.AllLogs()) }) t.Run("logs matched one expression", func(t *testing.T) { @@ -153,9 +155,9 @@ func TestLogsAreCorrectlySplitPerResourceAttributeWithOTTL(t *testing.T) { require.NoError(t, conn.ConsumeLogs(context.Background(), l)) - assert.Len(t, defaultSink.AllLogs(), 0) + assert.Empty(t, defaultSink.AllLogs()) assert.Len(t, sink0.AllLogs(), 1) - assert.Len(t, sink1.AllLogs(), 0) + assert.Empty(t, sink1.AllLogs()) }) t.Run("logs matched by two expressions", func(t *testing.T) { @@ -173,12 +175,12 @@ func TestLogsAreCorrectlySplitPerResourceAttributeWithOTTL(t *testing.T) { require.NoError(t, conn.ConsumeLogs(context.Background(), l)) - assert.Len(t, defaultSink.AllLogs(), 0) + assert.Empty(t, defaultSink.AllLogs()) assert.Len(t, sink0.AllLogs(), 1) assert.Len(t, sink1.AllLogs(), 1) - assert.Equal(t, sink0.AllLogs()[0].LogRecordCount(), 2) - assert.Equal(t, sink1.AllLogs()[0].LogRecordCount(), 2) + assert.Equal(t, 2, sink0.AllLogs()[0].LogRecordCount()) + assert.Equal(t, 2, sink1.AllLogs()[0].LogRecordCount()) assert.Equal(t, sink0.AllLogs(), sink1.AllLogs()) }) @@ -206,7 +208,7 @@ func TestLogsAreCorrectlySplitPerResourceAttributeWithOTTL(t *testing.T) { rlog := defaultSink.AllLogs()[0].ResourceLogs().At(0) attr, ok := rlog.Resource().Attributes().Get("X-Tenant") assert.True(t, ok, "routing attribute must exists") - assert.Equal(t, attr.AsString(), "something-else") + assert.Equal(t, "something-else", attr.AsString()) }) t.Run("logs matched by one expression, multiple pipelines", func(t *testing.T) { @@ -222,33 +224,33 @@ func TestLogsAreCorrectlySplitPerResourceAttributeWithOTTL(t *testing.T) { assert.Len(t, defaultSink.AllLogs(), 1) assert.Len(t, sink0.AllLogs(), 1) - assert.Len(t, sink1.AllLogs(), 0) + assert.Empty(t, sink1.AllLogs()) - assert.Equal(t, defaultSink.AllLogs()[0].LogRecordCount(), 1) - assert.Equal(t, sink0.AllLogs()[0].LogRecordCount(), 1) + assert.Equal(t, 1, defaultSink.AllLogs()[0].LogRecordCount()) + assert.Equal(t, 1, sink0.AllLogs()[0].LogRecordCount()) assert.Equal(t, defaultSink.AllLogs(), sink0.AllLogs()) }) } func TestLogsAreCorrectlyMatchOnceWithOTTL(t *testing.T) { - logsDefault := component.NewIDWithName(component.DataTypeLogs, "default") - logs0 := component.NewIDWithName(component.DataTypeLogs, "0") - logs1 := component.NewIDWithName(component.DataTypeLogs, "1") + logsDefault := pipeline.NewIDWithName(pipeline.SignalLogs, "default") + logs0 := pipeline.NewIDWithName(pipeline.SignalLogs, "0") + logs1 := pipeline.NewIDWithName(pipeline.SignalLogs, "1") cfg := &Config{ - DefaultPipelines: []component.ID{logsDefault}, + DefaultPipelines: []pipeline.ID{logsDefault}, Table: []RoutingTableItem{ { Statement: `route() where IsMatch(attributes["X-Tenant"], ".*acme") == true`, - Pipelines: []component.ID{logs0}, + Pipelines: []pipeline.ID{logs0}, }, { Statement: `route() where IsMatch(attributes["X-Tenant"], "_acme") == true`, - Pipelines: []component.ID{logs1}, + Pipelines: []pipeline.ID{logs1}, }, { - Statement: `route() where attributes["X-Tenant"] == "ecorp"`, - Pipelines: []component.ID{logsDefault, logs0}, + Condition: `attributes["X-Tenant"] == "ecorp"`, + Pipelines: []pipeline.ID{logsDefault, logs0}, }, }, MatchOnce: true, @@ -256,7 +258,7 @@ func TestLogsAreCorrectlyMatchOnceWithOTTL(t *testing.T) { var defaultSink, sink0, sink1 consumertest.LogsSink - router := connector.NewLogsRouter(map[component.ID]consumer.Logs{ + router := connector.NewLogsRouter(map[pipeline.ID]consumer.Logs{ logsDefault: &defaultSink, logs0: &sink0, logs1: &sink1, @@ -271,7 +273,7 @@ func TestLogsAreCorrectlyMatchOnceWithOTTL(t *testing.T) { factory := NewFactory() conn, err := factory.CreateLogsToLogs( context.Background(), - connectortest.NewNopCreateSettings(), + connectortest.NewNopSettings(), cfg, router.(consumer.Logs), ) @@ -294,8 +296,8 @@ func TestLogsAreCorrectlyMatchOnceWithOTTL(t *testing.T) { require.NoError(t, conn.ConsumeLogs(context.Background(), l)) assert.Len(t, defaultSink.AllLogs(), 1) - assert.Len(t, sink0.AllLogs(), 0) - assert.Len(t, sink1.AllLogs(), 0) + assert.Empty(t, sink0.AllLogs()) + assert.Empty(t, sink1.AllLogs()) }) t.Run("logs matched one expression", func(t *testing.T) { @@ -309,9 +311,9 @@ func TestLogsAreCorrectlyMatchOnceWithOTTL(t *testing.T) { require.NoError(t, conn.ConsumeLogs(context.Background(), l)) - assert.Len(t, defaultSink.AllLogs(), 0) + assert.Empty(t, defaultSink.AllLogs()) assert.Len(t, sink0.AllLogs(), 1) - assert.Len(t, sink1.AllLogs(), 0) + assert.Empty(t, sink1.AllLogs()) }) t.Run("logs matched by two expressions, but sinks to one", func(t *testing.T) { @@ -329,11 +331,11 @@ func TestLogsAreCorrectlyMatchOnceWithOTTL(t *testing.T) { require.NoError(t, conn.ConsumeLogs(context.Background(), l)) - assert.Len(t, defaultSink.AllLogs(), 0) + assert.Empty(t, defaultSink.AllLogs()) assert.Len(t, sink0.AllLogs(), 1) - assert.Len(t, sink1.AllLogs(), 0) + assert.Empty(t, sink1.AllLogs()) - assert.Equal(t, sink0.AllLogs()[0].LogRecordCount(), 2) + assert.Equal(t, 2, sink0.AllLogs()[0].LogRecordCount()) }) t.Run("one log matched by multiple expressions, other matched none", func(t *testing.T) { @@ -353,12 +355,12 @@ func TestLogsAreCorrectlyMatchOnceWithOTTL(t *testing.T) { assert.Len(t, defaultSink.AllLogs(), 1) assert.Len(t, sink0.AllLogs(), 1) - assert.Len(t, sink1.AllLogs(), 0) + assert.Empty(t, sink1.AllLogs()) rlog := defaultSink.AllLogs()[0].ResourceLogs().At(0) attr, ok := rlog.Resource().Attributes().Get("X-Tenant") assert.True(t, ok, "routing attribute must exists") - assert.Equal(t, attr.AsString(), "something-else") + assert.Equal(t, "something-else", attr.AsString()) }) t.Run("logs matched by one expression, multiple pipelines", func(t *testing.T) { @@ -374,31 +376,31 @@ func TestLogsAreCorrectlyMatchOnceWithOTTL(t *testing.T) { assert.Len(t, defaultSink.AllLogs(), 1) assert.Len(t, sink0.AllLogs(), 1) - assert.Len(t, sink1.AllLogs(), 0) + assert.Empty(t, sink1.AllLogs()) - assert.Equal(t, defaultSink.AllLogs()[0].LogRecordCount(), 1) - assert.Equal(t, sink0.AllLogs()[0].LogRecordCount(), 1) + assert.Equal(t, 1, defaultSink.AllLogs()[0].LogRecordCount()) + assert.Equal(t, 1, sink0.AllLogs()[0].LogRecordCount()) assert.Equal(t, defaultSink.AllLogs(), sink0.AllLogs()) }) } func TestLogsResourceAttributeDroppedByOTTL(t *testing.T) { - logsDefault := component.NewIDWithName(component.DataTypeLogs, "default") - logsOther := component.NewIDWithName(component.DataTypeLogs, "other") + logsDefault := pipeline.NewIDWithName(pipeline.SignalLogs, "default") + logsOther := pipeline.NewIDWithName(pipeline.SignalLogs, "other") cfg := &Config{ - DefaultPipelines: []component.ID{logsDefault}, + DefaultPipelines: []pipeline.ID{logsDefault}, Table: []RoutingTableItem{ { Statement: `delete_key(attributes, "X-Tenant") where attributes["X-Tenant"] == "acme"`, - Pipelines: []component.ID{logsOther}, + Pipelines: []pipeline.ID{logsOther}, }, }, } var sink0, sink1 consumertest.LogsSink - router := connector.NewLogsRouter(map[component.ID]consumer.Logs{ + router := connector.NewLogsRouter(map[pipeline.ID]consumer.Logs{ logsDefault: &sink0, logsOther: &sink1, }) @@ -406,7 +408,7 @@ func TestLogsResourceAttributeDroppedByOTTL(t *testing.T) { factory := NewFactory() conn, err := factory.CreateLogsToLogs( context.Background(), - connectortest.NewNopCreateSettings(), + connectortest.NewNopSettings(), cfg, router.(consumer.Logs), ) @@ -433,23 +435,23 @@ func TestLogsResourceAttributeDroppedByOTTL(t *testing.T) { v, ok := attrs.Get("attr") assert.True(t, ok, "non routing attributes shouldn't be dropped") assert.Equal(t, "acme", v.Str()) - assert.Len(t, sink0.AllLogs(), 0, + assert.Empty(t, sink0.AllLogs(), "metrics should not be routed to default pipeline", ) } func TestLogsConnectorCapabilities(t *testing.T) { - logsDefault := component.NewIDWithName(component.DataTypeLogs, "default") - logsOther := component.NewIDWithName(component.DataTypeLogs, "other") + logsDefault := pipeline.NewIDWithName(pipeline.SignalLogs, "default") + logsOther := pipeline.NewIDWithName(pipeline.SignalLogs, "other") cfg := &Config{ Table: []RoutingTableItem{{ Statement: `route() where attributes["X-Tenant"] == "acme"`, - Pipelines: []component.ID{logsOther}, + Pipelines: []pipeline.ID{logsOther}, }}, } - router := connector.NewLogsRouter(map[component.ID]consumer.Logs{ + router := connector.NewLogsRouter(map[pipeline.ID]consumer.Logs{ logsDefault: consumertest.NewNop(), logsOther: consumertest.NewNop(), }) @@ -457,11 +459,481 @@ func TestLogsConnectorCapabilities(t *testing.T) { factory := NewFactory() conn, err := factory.CreateLogsToLogs( context.Background(), - connectortest.NewNopCreateSettings(), + connectortest.NewNopSettings(), cfg, router.(consumer.Logs), ) require.NoError(t, err) - assert.Equal(t, false, conn.Capabilities().MutatesData) + assert.False(t, conn.Capabilities().MutatesData) +} + +func TestLogsConnectorDetailed(t *testing.T) { + idSink0 := pipeline.NewIDWithName(pipeline.SignalLogs, "0") + idSink1 := pipeline.NewIDWithName(pipeline.SignalLogs, "1") + idSinkD := pipeline.NewIDWithName(pipeline.SignalLogs, "default") + + isAcme := `request["X-Tenant"] == "acme"` + + isResourceA := `attributes["resourceName"] == "resourceA"` + isResourceB := `attributes["resourceName"] == "resourceB"` + isResourceX := `attributes["resourceName"] == "resourceX"` + isResourceY := `attributes["resourceName"] == "resourceY"` + + isLogE := `body == "logE"` + isLogF := `body == "logF"` + isLogX := `body == "logX"` + isLogY := `body == "logY"` + + isScopeCFromLowerContext := `instrumentation_scope.name == "scopeC"` + isScopeDFromLowerContext := `instrumentation_scope.name == "scopeD"` + + isResourceBFromLowerContext := `resource.attributes["resourceName"] == "resourceB"` + + testCases := []struct { + name string + cfg *Config + ctx context.Context + input plog.Logs + expectSink0 plog.Logs + expectSink1 plog.Logs + expectSinkD plog.Logs + }{ + { + name: "request/no_request_values", + cfg: testConfig( + withRoute("request", isAcme, idSink0), + withDefault(idSinkD), + ), + ctx: context.Background(), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plog.Logs{}, + expectSink1: plog.Logs{}, + expectSinkD: plogutiltest.NewLogs("AB", "CD", "EF"), + }, + { + name: "request/match_any_value", + cfg: testConfig( + withRoute("request", isAcme, idSink0), + withDefault(idSinkD), + ), + ctx: withGRPCMetadata( + withHTTPMetadata( + context.Background(), + map[string][]string{"X-Tenant": {"acme"}}, + ), + map[string]string{"X-Tenant": "notacme"}, + ), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink1: plog.Logs{}, + expectSinkD: plog.Logs{}, + }, + { + name: "request/match_grpc_value", + cfg: testConfig( + withRoute("request", isAcme, idSink0), + withDefault(idSinkD), + ), + ctx: withGRPCMetadata(context.Background(), map[string]string{"X-Tenant": "acme"}), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink1: plog.Logs{}, + expectSinkD: plog.Logs{}, + }, + { + name: "request/match_no_grpc_value", + cfg: testConfig( + withRoute("request", isAcme, idSink0), + withDefault(idSinkD), + ), + ctx: withGRPCMetadata(context.Background(), map[string]string{"X-Tenant": "notacme"}), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plog.Logs{}, + expectSink1: plog.Logs{}, + expectSinkD: plogutiltest.NewLogs("AB", "CD", "EF"), + }, + { + name: "request/match_http_value", + cfg: testConfig( + withRoute("request", isAcme, idSink0), + withDefault(idSinkD), + ), + ctx: withHTTPMetadata(context.Background(), map[string][]string{"X-Tenant": {"acme"}}), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink1: plog.Logs{}, + expectSinkD: plog.Logs{}, + }, + { + name: "request/match_http_value2", + cfg: testConfig( + withRoute("request", isAcme, idSink0), + withDefault(idSinkD), + ), + ctx: withHTTPMetadata(context.Background(), map[string][]string{"X-Tenant": {"notacme", "acme"}}), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink1: plog.Logs{}, + expectSinkD: plog.Logs{}, + }, + { + name: "request/match_no_http_value", + cfg: testConfig( + withRoute("request", isAcme, idSink0), + withDefault(idSinkD), + ), + ctx: withHTTPMetadata(context.Background(), map[string][]string{"X-Tenant": {"notacme"}}), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plog.Logs{}, + expectSink1: plog.Logs{}, + expectSinkD: plogutiltest.NewLogs("AB", "CD", "EF"), + }, + { + name: "resource/all_match_first_only", + cfg: testConfig( + withRoute("resource", "true", idSink0), + withRoute("resource", isResourceY, idSink1), + withDefault(idSinkD), + ), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink1: plog.Logs{}, + expectSinkD: plog.Logs{}, + }, + { + name: "resource/all_match_last_only", + cfg: testConfig( + withRoute("resource", isResourceX, idSink0), + withRoute("resource", "true", idSink1), + withDefault(idSinkD), + ), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plog.Logs{}, + expectSink1: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSinkD: plog.Logs{}, + }, + { + name: "resource/all_match_only_once", + cfg: testConfig( + withRoute("resource", "true", idSink0), + withRoute("resource", isResourceA+" or "+isResourceB, idSink1), + withDefault(idSinkD), + ), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink1: plog.Logs{}, + expectSinkD: plog.Logs{}, + }, + { + name: "resource/each_matches_one", + cfg: testConfig( + withRoute("resource", isResourceA, idSink0), + withRoute("resource", isResourceB, idSink1), + withDefault(idSinkD), + ), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plogutiltest.NewLogs("A", "CD", "EF"), + expectSink1: plogutiltest.NewLogs("B", "CD", "EF"), + expectSinkD: plog.Logs{}, + }, + { + name: "resource/some_match_with_default", + cfg: testConfig( + withRoute("resource", isResourceX, idSink0), + withRoute("resource", isResourceB, idSink1), + withDefault(idSinkD), + ), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plog.Logs{}, + expectSink1: plogutiltest.NewLogs("B", "CD", "EF"), + expectSinkD: plogutiltest.NewLogs("A", "CD", "EF"), + }, + { + name: "resource/some_match_without_default", + cfg: testConfig( + withRoute("resource", isResourceX, idSink0), + withRoute("resource", isResourceB, idSink1), + ), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plog.Logs{}, + expectSink1: plogutiltest.NewLogs("B", "CD", "EF"), + expectSinkD: plog.Logs{}, + }, + { + name: "resource/match_none_with_default", + cfg: testConfig( + withRoute("resource", isResourceX, idSink0), + withRoute("resource", isResourceY, idSink1), + withDefault(idSinkD), + ), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plog.Logs{}, + expectSink1: plog.Logs{}, + expectSinkD: plogutiltest.NewLogs("AB", "CD", "EF"), + }, + { + name: "resource/match_none_without_default", + cfg: testConfig( + withRoute("resource", isResourceX, idSink0), + withRoute("resource", isResourceY, idSink1), + ), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plog.Logs{}, + expectSink1: plog.Logs{}, + expectSinkD: plog.Logs{}, + }, + { + name: "log/all_match_first_only", + cfg: testConfig( + withRoute("log", "true", idSink0), + withRoute("log", isLogY, idSink1), + withDefault(idSinkD), + ), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink1: plog.Logs{}, + expectSinkD: plog.Logs{}, + }, + { + name: "log/all_match_last_only", + cfg: testConfig( + withRoute("log", isLogX, idSink0), + withRoute("log", "true", idSink1), + withDefault(idSinkD), + ), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plog.Logs{}, + expectSink1: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSinkD: plog.Logs{}, + }, + { + name: "log/all_match_only_once", + cfg: testConfig( + withRoute("log", "true", idSink0), + withRoute("log", isLogE+" or "+isLogF, idSink1), + withDefault(idSinkD), + ), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink1: plog.Logs{}, + expectSinkD: plog.Logs{}, + }, + { + name: "log/each_matches_one", + cfg: testConfig( + withRoute("log", isLogE, idSink0), + withRoute("log", isLogF, idSink1), + withDefault(idSinkD), + ), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plogutiltest.NewLogs("AB", "CD", "E"), + expectSink1: plogutiltest.NewLogs("AB", "CD", "F"), + expectSinkD: plog.Logs{}, + }, + { + name: "log/some_match_with_default", + cfg: testConfig( + withRoute("log", isLogX, idSink0), + withRoute("log", isLogF, idSink1), + withDefault(idSinkD), + ), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plog.Logs{}, + expectSink1: plogutiltest.NewLogs("AB", "CD", "F"), + expectSinkD: plogutiltest.NewLogs("AB", "CD", "E"), + }, + { + name: "log/some_match_without_default", + cfg: testConfig( + withRoute("log", isLogX, idSink0), + withRoute("log", isLogF, idSink1), + ), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plog.Logs{}, + expectSink1: plogutiltest.NewLogs("AB", "CD", "F"), + expectSinkD: plog.Logs{}, + }, + { + name: "log/match_none_with_default", + cfg: testConfig( + withRoute("log", isLogX, idSink0), + withRoute("log", isLogY, idSink1), + withDefault(idSinkD), + ), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plog.Logs{}, + expectSink1: plog.Logs{}, + expectSinkD: plogutiltest.NewLogs("AB", "CD", "EF"), + }, + { + name: "log/match_none_without_default", + cfg: testConfig( + withRoute("log", isLogX, idSink0), + withRoute("log", isLogY, idSink1), + ), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plog.Logs{}, + expectSink1: plog.Logs{}, + expectSinkD: plog.Logs{}, + }, + { + name: "log/with_resource_condition", + cfg: testConfig( + withRoute("log", isResourceBFromLowerContext, idSink0), + withRoute("log", isLogY, idSink1), + withDefault(idSinkD), + ), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plogutiltest.NewLogs("B", "CD", "EF"), + expectSink1: plog.Logs{}, + expectSinkD: plogutiltest.NewLogs("A", "CD", "EF"), + }, + { + name: "log/with_scope_condition", + cfg: testConfig( + withRoute("log", isScopeCFromLowerContext, idSink0), + withRoute("log", isLogY, idSink1), + withDefault(idSinkD), + ), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plogutiltest.NewLogs("AB", "C", "EF"), + expectSink1: plog.Logs{}, + expectSinkD: plogutiltest.NewLogs("AB", "D", "EF"), + }, + { + name: "log/with_resource_and_scope_conditions", + cfg: testConfig( + withRoute("log", isResourceBFromLowerContext+" and "+isScopeDFromLowerContext, idSink0), + withRoute("log", isLogY, idSink1), + withDefault(idSinkD), + ), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plogutiltest.NewLogs("B", "D", "EF"), + expectSink1: plog.Logs{}, + expectSinkD: plogutiltest.NewLogsFromOpts( + plogutiltest.Resource("A", + plogutiltest.Scope("C", plogutiltest.LogRecord("E"), plogutiltest.LogRecord("F")), + plogutiltest.Scope("D", plogutiltest.LogRecord("E"), plogutiltest.LogRecord("F")), + ), + plogutiltest.Resource("B", + plogutiltest.Scope("C", plogutiltest.LogRecord("E"), plogutiltest.LogRecord("F")), + ), + ), + }, + { + name: "mixed/match_resource_then_logs", + cfg: testConfig( + withRoute("resource", isResourceA, idSink0), + withRoute("log", isLogE, idSink1), + withDefault(idSinkD), + ), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plogutiltest.NewLogs("A", "CD", "EF"), + expectSink1: plogutiltest.NewLogs("B", "CD", "E"), + expectSinkD: plogutiltest.NewLogs("B", "CD", "F"), + }, + { + name: "mixed/match_logs_then_resource", + cfg: testConfig( + withRoute("log", isLogE, idSink0), + withRoute("resource", isResourceB, idSink1), + withDefault(idSinkD), + ), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plogutiltest.NewLogs("AB", "CD", "E"), + expectSink1: plogutiltest.NewLogs("B", "CD", "F"), + expectSinkD: plogutiltest.NewLogs("A", "CD", "F"), + }, + { + name: "mixed/match_resource_then_grpc_request", + cfg: testConfig( + withRoute("resource", isResourceA, idSink0), + withRoute("request", isAcme, idSink1), + withDefault(idSinkD), + ), + ctx: withGRPCMetadata(context.Background(), map[string]string{"X-Tenant": "acme"}), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plogutiltest.NewLogs("A", "CD", "EF"), + expectSink1: plogutiltest.NewLogs("B", "CD", "EF"), + expectSinkD: plog.Logs{}, + }, + { + name: "mixed/match_logs_then_grpc_request", + cfg: testConfig( + withRoute("log", isLogF, idSink0), + withRoute("request", isAcme, idSink1), + withDefault(idSinkD), + ), + ctx: withGRPCMetadata(context.Background(), map[string]string{"X-Tenant": "acme"}), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plogutiltest.NewLogs("AB", "CD", "F"), + expectSink1: plogutiltest.NewLogs("AB", "CD", "E"), + expectSinkD: plog.Logs{}, + }, + { + name: "mixed/match_resource_then_http_request", + cfg: testConfig( + withRoute("resource", isResourceA, idSink0), + withRoute("request", isAcme, idSink1), + withDefault(idSinkD), + ), + ctx: withHTTPMetadata(context.Background(), map[string][]string{"X-Tenant": {"acme"}}), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plogutiltest.NewLogs("A", "CD", "EF"), + expectSink1: plogutiltest.NewLogs("B", "CD", "EF"), + expectSinkD: plog.Logs{}, + }, + { + name: "mixed/match_logs_then_http_request", + cfg: testConfig( + withRoute("log", isLogF, idSink0), + withRoute("request", isAcme, idSink1), + withDefault(idSinkD), + ), + ctx: withHTTPMetadata(context.Background(), map[string][]string{"X-Tenant": {"acme"}}), + input: plogutiltest.NewLogs("AB", "CD", "EF"), + expectSink0: plogutiltest.NewLogs("AB", "CD", "F"), + expectSink1: plogutiltest.NewLogs("AB", "CD", "E"), + expectSinkD: plog.Logs{}, + }, + } + + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + var sinkD, sink0, sink1 consumertest.LogsSink + router := connector.NewLogsRouter(map[pipeline.ID]consumer.Logs{ + pipeline.NewIDWithName(pipeline.SignalLogs, "0"): &sink0, + pipeline.NewIDWithName(pipeline.SignalLogs, "1"): &sink1, + pipeline.NewIDWithName(pipeline.SignalLogs, "default"): &sinkD, + }) + + conn, err := NewFactory().CreateLogsToLogs( + context.Background(), + connectortest.NewNopSettings(), + tt.cfg, + router.(consumer.Logs), + ) + require.NoError(t, err) + + ctx := context.Background() + if tt.ctx != nil { + ctx = tt.ctx + } + + require.NoError(t, conn.ConsumeLogs(ctx, tt.input)) + + assertExpected := func(sink *consumertest.LogsSink, expected plog.Logs, name string) { + if expected == (plog.Logs{}) { + assert.Empty(t, sink.AllLogs(), name) + } else { + require.Len(t, sink.AllLogs(), 1, name) + assert.Equal(t, expected, sink.AllLogs()[0], name) + } + } + assertExpected(&sink0, tt.expectSink0, "sink0") + assertExpected(&sink1, tt.expectSink1, "sink1") + assertExpected(&sinkD, tt.expectSinkD, "sinkD") + }) + } } diff --git a/connector/routingconnector/metadata.yaml b/connector/routingconnector/metadata.yaml index 0251ca2da379..831ee561ee87 100644 --- a/connector/routingconnector/metadata.yaml +++ b/connector/routingconnector/metadata.yaml @@ -1,11 +1,10 @@ type: routing -scope_name: otelcol/routing status: class: connector stability: alpha: [traces_to_traces, metrics_to_metrics, logs_to_logs] - distributions: [contrib] + distributions: [contrib, k8s] codeowners: active: [jpkrohling, mwear] diff --git a/connector/routingconnector/metrics.go b/connector/routingconnector/metrics.go index 853d88a34361..dfb45c953352 100644 --- a/connector/routingconnector/metrics.go +++ b/connector/routingconnector/metrics.go @@ -13,7 +13,10 @@ import ( "go.opentelemetry.io/collector/pdata/pmetric" "go.uber.org/zap" + "github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector/internal/pmetricutil" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottldatapoint" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottlmetric" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottlresource" ) @@ -27,12 +30,17 @@ type metricsConnector struct { } func newMetricsConnector( - set connector.CreateSettings, + set connector.Settings, config component.Config, metrics consumer.Metrics, ) (*metricsConnector, error) { cfg := config.(*Config) + // TODO update log from warning to error in v0.116.0 + if !cfg.MatchOnce { + set.Logger.Warn("The 'match_once' field has been deprecated. Set to 'true' to suppress this warning.") + } + mr, ok := metrics.(connector.MetricsRouterAndConsumer) if !ok { return nil, errUnexpectedConsumer @@ -43,7 +51,6 @@ func newMetricsConnector( cfg.DefaultPipelines, mr.Consumer, set.TelemetrySettings) - if err != nil { return nil, err } @@ -60,50 +67,116 @@ func (c *metricsConnector) Capabilities() consumer.Capabilities { } func (c *metricsConnector) ConsumeMetrics(ctx context.Context, md pmetric.Metrics) error { + if c.config.MatchOnce { + return c.switchMetrics(ctx, md) + } + return c.matchAllMetrics(ctx, md) +} + +func (c *metricsConnector) switchMetrics(ctx context.Context, md pmetric.Metrics) error { + groups := make(map[consumer.Metrics]pmetric.Metrics) + var errs error + for i := 0; i < len(c.router.routeSlice) && md.ResourceMetrics().Len() > 0; i++ { + route := c.router.routeSlice[i] + matchedMetrics := pmetric.NewMetrics() + switch route.statementContext { + case "request": + if route.requestCondition.matchRequest(ctx) { + groupAllMetrics(groups, route.consumer, md) + md = pmetric.NewMetrics() // all metrics have been routed + } + case "", "resource": + pmetricutil.MoveResourcesIf(md, matchedMetrics, + func(rs pmetric.ResourceMetrics) bool { + rtx := ottlresource.NewTransformContext(rs.Resource(), rs) + _, isMatch, err := route.resourceStatement.Execute(ctx, rtx) + errs = errors.Join(errs, err) + return isMatch + }, + ) + case "metric": + pmetricutil.MoveMetricsWithContextIf(md, matchedMetrics, + func(rm pmetric.ResourceMetrics, sm pmetric.ScopeMetrics, m pmetric.Metric) bool { + mtx := ottlmetric.NewTransformContext(m, sm.Metrics(), sm.Scope(), rm.Resource(), sm, rm) + _, isMatch, err := route.metricStatement.Execute(ctx, mtx) + errs = errors.Join(errs, err) + return isMatch + }, + ) + case "datapoint": + pmetricutil.MoveDataPointsWithContextIf(md, matchedMetrics, + func(rm pmetric.ResourceMetrics, sm pmetric.ScopeMetrics, m pmetric.Metric, dp any) bool { + dptx := ottldatapoint.NewTransformContext(dp, m, sm.Metrics(), sm.Scope(), rm.Resource(), sm, rm) + _, isMatch, err := route.dataPointStatement.Execute(ctx, dptx) + errs = errors.Join(errs, err) + return isMatch + }, + ) + } + if errs != nil { + if c.config.ErrorMode == ottl.PropagateError { + return errs + } + groupAllMetrics(groups, c.router.defaultConsumer, matchedMetrics) + } + groupAllMetrics(groups, route.consumer, matchedMetrics) + } + // anything left wasn't matched by any route. Send to default consumer + groupAllMetrics(groups, c.router.defaultConsumer, md) + for consumer, group := range groups { + errs = errors.Join(errs, consumer.ConsumeMetrics(ctx, group)) + } + return errs +} + +func (c *metricsConnector) matchAllMetrics(ctx context.Context, md pmetric.Metrics) error { // groups is used to group pmetric.ResourceMetrics that are routed to // the same set of exporters. This way we're not ending up with all the // metrics split up which would cause higher CPU usage. groups := make(map[consumer.Metrics]pmetric.Metrics) var errs error - for i := 0; i < md.ResourceMetrics().Len(); i++ { rmetrics := md.ResourceMetrics().At(i) - rtx := ottlresource.NewTransformContext(rmetrics.Resource()) + rtx := ottlresource.NewTransformContext(rmetrics.Resource(), rmetrics) noRoutesMatch := true for _, route := range c.router.routeSlice { - _, isMatch, err := route.statement.Execute(ctx, rtx) + _, isMatch, err := route.resourceStatement.Execute(ctx, rtx) if err != nil { if c.config.ErrorMode == ottl.PropagateError { return err } - c.group(groups, c.router.defaultConsumer, rmetrics) + groupMetrics(groups, c.router.defaultConsumer, rmetrics) continue } if isMatch { noRoutesMatch = false - c.group(groups, route.consumer, rmetrics) - if c.config.MatchOnce { - break - } + groupMetrics(groups, route.consumer, rmetrics) } - } - if noRoutesMatch { // no route conditions are matched, add resource metrics to default exporters group - c.group(groups, c.router.defaultConsumer, rmetrics) + groupMetrics(groups, c.router.defaultConsumer, rmetrics) } } - for consumer, group := range groups { errs = errors.Join(errs, consumer.ConsumeMetrics(ctx, group)) } return errs } -func (c *metricsConnector) group( +func groupAllMetrics( + groups map[consumer.Metrics]pmetric.Metrics, + cons consumer.Metrics, + metrics pmetric.Metrics, +) { + for i := 0; i < metrics.ResourceMetrics().Len(); i++ { + groupMetrics(groups, cons, metrics.ResourceMetrics().At(i)) + } +} + +func groupMetrics( groups map[consumer.Metrics]pmetric.Metrics, consumer consumer.Metrics, metrics pmetric.ResourceMetrics, diff --git a/connector/routingconnector/metrics_test.go b/connector/routingconnector/metrics_test.go index db2421b285d6..2f8335980940 100644 --- a/connector/routingconnector/metrics_test.go +++ b/connector/routingconnector/metrics_test.go @@ -9,30 +9,32 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/connector" "go.opentelemetry.io/collector/connector/connectortest" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/consumer/consumertest" "go.opentelemetry.io/collector/pdata/pmetric" + "go.opentelemetry.io/collector/pipeline" + + "github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector/internal/pmetricutiltest" ) func TestMetricsRegisterConsumersForValidRoute(t *testing.T) { - metricsDefault := component.NewIDWithName(component.DataTypeMetrics, "default") - metrics0 := component.NewIDWithName(component.DataTypeMetrics, "0") - metrics1 := component.NewIDWithName(component.DataTypeMetrics, "1") + metricsDefault := pipeline.NewIDWithName(pipeline.SignalMetrics, "default") + metrics0 := pipeline.NewIDWithName(pipeline.SignalMetrics, "0") + metrics1 := pipeline.NewIDWithName(pipeline.SignalMetrics, "1") cfg := &Config{ - DefaultPipelines: []component.ID{metricsDefault}, + DefaultPipelines: []pipeline.ID{metricsDefault}, Table: []RoutingTableItem{ { Statement: `route() where attributes["X-Tenant"] == "acme"`, - Pipelines: []component.ID{metrics0}, + Pipelines: []pipeline.ID{metrics0}, }, { - Statement: `route() where attributes["X-Tenant"] == "*"`, - Pipelines: []component.ID{metrics0, metrics1}, + Condition: `attributes["X-Tenant"] == "*"`, + Pipelines: []pipeline.ID{metrics0, metrics1}, }, }, } @@ -41,14 +43,14 @@ func TestMetricsRegisterConsumersForValidRoute(t *testing.T) { var defaultSink, sink0, sink1 consumertest.MetricsSink - router := connector.NewMetricsRouter(map[component.ID]consumer.Metrics{ + router := connector.NewMetricsRouter(map[pipeline.ID]consumer.Metrics{ metricsDefault: &defaultSink, metrics0: &sink0, metrics1: &sink1, }) conn, err := NewFactory().CreateMetricsToMetrics(context.Background(), - connectortest.NewNopCreateSettings(), cfg, router.(consumer.Metrics)) + connectortest.NewNopSettings(), cfg, router.(consumer.Metrics)) require.NoError(t, err) require.NotNil(t, conn) @@ -76,31 +78,31 @@ func TestMetricsRegisterConsumersForValidRoute(t *testing.T) { } func TestMetricsAreCorrectlySplitPerResourceAttributeWithOTTL(t *testing.T) { - metricsDefault := component.NewIDWithName(component.DataTypeMetrics, "default") - metrics0 := component.NewIDWithName(component.DataTypeMetrics, "0") - metrics1 := component.NewIDWithName(component.DataTypeMetrics, "1") + metricsDefault := pipeline.NewIDWithName(pipeline.SignalMetrics, "default") + metrics0 := pipeline.NewIDWithName(pipeline.SignalMetrics, "0") + metrics1 := pipeline.NewIDWithName(pipeline.SignalMetrics, "1") cfg := &Config{ - DefaultPipelines: []component.ID{metricsDefault}, + DefaultPipelines: []pipeline.ID{metricsDefault}, Table: []RoutingTableItem{ { - Statement: `route() where attributes["value"] > 2.5`, - Pipelines: []component.ID{metrics0}, + Condition: `attributes["value"] > 2.5`, + Pipelines: []pipeline.ID{metrics0}, }, { Statement: `route() where attributes["value"] > 3.0`, - Pipelines: []component.ID{metrics1}, + Pipelines: []pipeline.ID{metrics1}, }, { Statement: `route() where attributes["value"] == 1.0`, - Pipelines: []component.ID{metricsDefault, metrics0}, + Pipelines: []pipeline.ID{metricsDefault, metrics0}, }, }, } var defaultSink, sink0, sink1 consumertest.MetricsSink - router := connector.NewMetricsRouter(map[component.ID]consumer.Metrics{ + router := connector.NewMetricsRouter(map[pipeline.ID]consumer.Metrics{ metricsDefault: &defaultSink, metrics0: &sink0, metrics1: &sink1, @@ -115,7 +117,7 @@ func TestMetricsAreCorrectlySplitPerResourceAttributeWithOTTL(t *testing.T) { factory := NewFactory() conn, err := factory.CreateMetricsToMetrics( context.Background(), - connectortest.NewNopCreateSettings(), + connectortest.NewNopSettings(), cfg, router.(consumer.Metrics), ) @@ -141,8 +143,8 @@ func TestMetricsAreCorrectlySplitPerResourceAttributeWithOTTL(t *testing.T) { require.NoError(t, conn.ConsumeMetrics(context.Background(), m)) assert.Len(t, defaultSink.AllMetrics(), 1) - assert.Len(t, sink0.AllMetrics(), 0) - assert.Len(t, sink1.AllMetrics(), 0) + assert.Empty(t, sink0.AllMetrics()) + assert.Empty(t, sink1.AllMetrics()) }) t.Run("metric matched by one of two expressions", func(t *testing.T) { @@ -158,9 +160,9 @@ func TestMetricsAreCorrectlySplitPerResourceAttributeWithOTTL(t *testing.T) { require.NoError(t, conn.ConsumeMetrics(context.Background(), m)) - assert.Len(t, defaultSink.AllMetrics(), 0) + assert.Empty(t, defaultSink.AllMetrics()) assert.Len(t, sink0.AllMetrics(), 1) - assert.Len(t, sink1.AllMetrics(), 0) + assert.Empty(t, sink1.AllMetrics()) }) t.Run("metric matched by two expressions", func(t *testing.T) { @@ -182,12 +184,12 @@ func TestMetricsAreCorrectlySplitPerResourceAttributeWithOTTL(t *testing.T) { require.NoError(t, conn.ConsumeMetrics(context.Background(), m)) - assert.Len(t, defaultSink.AllMetrics(), 0) + assert.Empty(t, defaultSink.AllMetrics()) assert.Len(t, sink0.AllMetrics(), 1) assert.Len(t, sink1.AllMetrics(), 1) - assert.Equal(t, sink0.AllMetrics()[0].MetricCount(), 2) - assert.Equal(t, sink1.AllMetrics()[0].MetricCount(), 2) + assert.Equal(t, 2, sink0.AllMetrics()[0].MetricCount()) + assert.Equal(t, 2, sink1.AllMetrics()[0].MetricCount()) assert.Equal(t, sink0.AllMetrics(), sink1.AllMetrics()) }) @@ -237,33 +239,33 @@ func TestMetricsAreCorrectlySplitPerResourceAttributeWithOTTL(t *testing.T) { assert.Len(t, defaultSink.AllMetrics(), 1) assert.Len(t, sink0.AllMetrics(), 1) - assert.Len(t, sink1.AllMetrics(), 0) + assert.Empty(t, sink1.AllMetrics()) - assert.Equal(t, defaultSink.AllMetrics()[0].MetricCount(), 1) - assert.Equal(t, sink0.AllMetrics()[0].MetricCount(), 1) + assert.Equal(t, 1, defaultSink.AllMetrics()[0].MetricCount()) + assert.Equal(t, 1, sink0.AllMetrics()[0].MetricCount()) assert.Equal(t, defaultSink.AllMetrics(), sink0.AllMetrics()) }) } func TestMetricsAreCorrectlyMatchOnceWithOTTL(t *testing.T) { - metricsDefault := component.NewIDWithName(component.DataTypeMetrics, "default") - metrics0 := component.NewIDWithName(component.DataTypeMetrics, "0") - metrics1 := component.NewIDWithName(component.DataTypeMetrics, "1") + metricsDefault := pipeline.NewIDWithName(pipeline.SignalMetrics, "default") + metrics0 := pipeline.NewIDWithName(pipeline.SignalMetrics, "0") + metrics1 := pipeline.NewIDWithName(pipeline.SignalMetrics, "1") cfg := &Config{ - DefaultPipelines: []component.ID{metricsDefault}, + DefaultPipelines: []pipeline.ID{metricsDefault}, Table: []RoutingTableItem{ { Statement: `route() where attributes["value"] > 2.5`, - Pipelines: []component.ID{metrics0}, + Pipelines: []pipeline.ID{metrics0}, }, { Statement: `route() where attributes["value"] > 3.0`, - Pipelines: []component.ID{metrics1}, + Pipelines: []pipeline.ID{metrics1}, }, { - Statement: `route() where attributes["value"] == 1.0`, - Pipelines: []component.ID{metricsDefault, metrics0}, + Condition: `attributes["value"] == 1.0`, + Pipelines: []pipeline.ID{metricsDefault, metrics0}, }, }, MatchOnce: true, @@ -271,7 +273,7 @@ func TestMetricsAreCorrectlyMatchOnceWithOTTL(t *testing.T) { var defaultSink, sink0, sink1 consumertest.MetricsSink - router := connector.NewMetricsRouter(map[component.ID]consumer.Metrics{ + router := connector.NewMetricsRouter(map[pipeline.ID]consumer.Metrics{ metricsDefault: &defaultSink, metrics0: &sink0, metrics1: &sink1, @@ -286,7 +288,7 @@ func TestMetricsAreCorrectlyMatchOnceWithOTTL(t *testing.T) { factory := NewFactory() conn, err := factory.CreateMetricsToMetrics( context.Background(), - connectortest.NewNopCreateSettings(), + connectortest.NewNopSettings(), cfg, router.(consumer.Metrics), ) @@ -312,8 +314,8 @@ func TestMetricsAreCorrectlyMatchOnceWithOTTL(t *testing.T) { require.NoError(t, conn.ConsumeMetrics(context.Background(), m)) assert.Len(t, defaultSink.AllMetrics(), 1) - assert.Len(t, sink0.AllMetrics(), 0) - assert.Len(t, sink1.AllMetrics(), 0) + assert.Empty(t, sink0.AllMetrics()) + assert.Empty(t, sink1.AllMetrics()) }) t.Run("metric matched by one of two expressions", func(t *testing.T) { @@ -329,9 +331,9 @@ func TestMetricsAreCorrectlyMatchOnceWithOTTL(t *testing.T) { require.NoError(t, conn.ConsumeMetrics(context.Background(), m)) - assert.Len(t, defaultSink.AllMetrics(), 0) + assert.Empty(t, defaultSink.AllMetrics()) assert.Len(t, sink0.AllMetrics(), 1) - assert.Len(t, sink1.AllMetrics(), 0) + assert.Empty(t, sink1.AllMetrics()) }) t.Run("metric matched by two expressions, but sinks to one", func(t *testing.T) { @@ -353,11 +355,11 @@ func TestMetricsAreCorrectlyMatchOnceWithOTTL(t *testing.T) { require.NoError(t, conn.ConsumeMetrics(context.Background(), m)) - assert.Len(t, defaultSink.AllMetrics(), 0) + assert.Empty(t, defaultSink.AllMetrics()) assert.Len(t, sink0.AllMetrics(), 1) - assert.Len(t, sink1.AllMetrics(), 0) + assert.Empty(t, sink1.AllMetrics()) - assert.Equal(t, sink0.AllMetrics()[0].MetricCount(), 2) + assert.Equal(t, 2, sink0.AllMetrics()[0].MetricCount()) }) t.Run("one metric matched by 2 expressions, others matched by none", func(t *testing.T) { @@ -381,7 +383,7 @@ func TestMetricsAreCorrectlyMatchOnceWithOTTL(t *testing.T) { assert.Len(t, defaultSink.AllMetrics(), 1) assert.Len(t, sink0.AllMetrics(), 1) - assert.Len(t, sink1.AllMetrics(), 0) + assert.Empty(t, sink1.AllMetrics()) rmetric := defaultSink.AllMetrics()[0].ResourceMetrics().At(0) attr, ok := rmetric.Resource().Attributes().Get("value") @@ -404,31 +406,31 @@ func TestMetricsAreCorrectlyMatchOnceWithOTTL(t *testing.T) { assert.Len(t, defaultSink.AllMetrics(), 1) assert.Len(t, sink0.AllMetrics(), 1) - assert.Len(t, sink1.AllMetrics(), 0) + assert.Empty(t, sink1.AllMetrics()) - assert.Equal(t, defaultSink.AllMetrics()[0].MetricCount(), 1) - assert.Equal(t, sink0.AllMetrics()[0].MetricCount(), 1) + assert.Equal(t, 1, defaultSink.AllMetrics()[0].MetricCount()) + assert.Equal(t, 1, sink0.AllMetrics()[0].MetricCount()) assert.Equal(t, defaultSink.AllMetrics(), sink0.AllMetrics()) }) } func TestMetricsResourceAttributeDroppedByOTTL(t *testing.T) { - metricsDefault := component.NewIDWithName(component.DataTypeMetrics, "default") - metricsOther := component.NewIDWithName(component.DataTypeMetrics, "other") + metricsDefault := pipeline.NewIDWithName(pipeline.SignalMetrics, "default") + metricsOther := pipeline.NewIDWithName(pipeline.SignalMetrics, "other") cfg := &Config{ - DefaultPipelines: []component.ID{metricsDefault}, + DefaultPipelines: []pipeline.ID{metricsDefault}, Table: []RoutingTableItem{ { Statement: `delete_key(attributes, "X-Tenant") where attributes["X-Tenant"] == "acme"`, - Pipelines: []component.ID{metricsOther}, + Pipelines: []pipeline.ID{metricsOther}, }, }, } var sink0, sink1 consumertest.MetricsSink - router := connector.NewMetricsRouter(map[component.ID]consumer.Metrics{ + router := connector.NewMetricsRouter(map[pipeline.ID]consumer.Metrics{ metricsDefault: &sink0, metricsOther: &sink1, }) @@ -436,7 +438,7 @@ func TestMetricsResourceAttributeDroppedByOTTL(t *testing.T) { factory := NewFactory() conn, err := factory.CreateMetricsToMetrics( context.Background(), - connectortest.NewNopCreateSettings(), + connectortest.NewNopSettings(), cfg, router.(consumer.Metrics), ) @@ -463,23 +465,23 @@ func TestMetricsResourceAttributeDroppedByOTTL(t *testing.T) { v, ok := attrs.Get("attr") assert.True(t, ok, "non routing attributes shouldn't be dropped") assert.Equal(t, "acme", v.Str()) - require.Len(t, sink0.AllMetrics(), 0, + require.Empty(t, sink0.AllMetrics(), "metrics should not be routed to default pipeline", ) } func TestMetricsConnectorCapabilities(t *testing.T) { - metricsDefault := component.NewIDWithName(component.DataTypeMetrics, "default") - metricsOther := component.NewIDWithName(component.DataTypeMetrics, "other") + metricsDefault := pipeline.NewIDWithName(pipeline.SignalMetrics, "default") + metricsOther := pipeline.NewIDWithName(pipeline.SignalMetrics, "other") cfg := &Config{ Table: []RoutingTableItem{{ Statement: `route() where attributes["X-Tenant"] == "acme"`, - Pipelines: []component.ID{metricsOther}, + Pipelines: []pipeline.ID{metricsOther}, }}, } - router := connector.NewMetricsRouter(map[component.ID]consumer.Metrics{ + router := connector.NewMetricsRouter(map[pipeline.ID]consumer.Metrics{ metricsDefault: consumertest.NewNop(), metricsOther: consumertest.NewNop(), }) @@ -487,11 +489,698 @@ func TestMetricsConnectorCapabilities(t *testing.T) { factory := NewFactory() conn, err := factory.CreateMetricsToMetrics( context.Background(), - connectortest.NewNopCreateSettings(), + connectortest.NewNopSettings(), cfg, router.(consumer.Metrics), ) require.NoError(t, err) - assert.Equal(t, false, conn.Capabilities().MutatesData) + assert.False(t, conn.Capabilities().MutatesData) +} + +func TestMetricsConnectorDetailed(t *testing.T) { + idSink0 := pipeline.NewIDWithName(pipeline.SignalMetrics, "0") + idSink1 := pipeline.NewIDWithName(pipeline.SignalMetrics, "1") + idSinkD := pipeline.NewIDWithName(pipeline.SignalMetrics, "default") + + isAcme := `request["X-Tenant"] == "acme"` + + isResourceA := `attributes["resourceName"] == "resourceA"` + isResourceB := `attributes["resourceName"] == "resourceB"` + isResourceX := `attributes["resourceName"] == "resourceX"` + isResourceY := `attributes["resourceName"] == "resourceY"` + + isMetricE := `name == "metricE"` + isMetricF := `name == "metricF"` + isMetricX := `name == "metricX"` + isMetricY := `name == "metricY"` + + isDataPointG := `attributes["dpName"] == "dpG"` + isDataPointH := `attributes["dpName"] == "dpH"` + isDataPointX := `attributes["dpName"] == "dpX"` + isDataPointY := `attributes["dpName"] == "dpY"` + + isMetricFFromLowerContext := `metric.name == "metricF"` + isScopeDFromLowerContext := `instrumentation_scope.name == "scopeD"` + isResourceBFromLowerContext := `resource.attributes["resourceName"] == "resourceB"` + + testCases := []struct { + name string + cfg *Config + ctx context.Context + input pmetric.Metrics + expectSink0 pmetric.Metrics + expectSink1 pmetric.Metrics + expectSinkD pmetric.Metrics + }{ + { + name: "request/no_request_values", + cfg: testConfig( + withRoute("request", isAcme, idSink0), + withDefault(idSinkD), + ), + ctx: context.Background(), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetric.Metrics{}, + expectSink1: pmetric.Metrics{}, + expectSinkD: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + }, + { + name: "request/match_any_value", + cfg: testConfig( + withRoute("request", isAcme, idSink0), + withDefault(idSinkD), + ), + ctx: withGRPCMetadata( + withHTTPMetadata( + context.Background(), + map[string][]string{"X-Tenant": {"acme"}}, + ), + map[string]string{"X-Tenant": "notacme"}, + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink1: pmetric.Metrics{}, + expectSinkD: pmetric.Metrics{}, + }, + { + name: "request/match_grpc_value", + cfg: testConfig( + withRoute("request", isAcme, idSink0), + withDefault(idSinkD), + ), + ctx: withGRPCMetadata(context.Background(), map[string]string{"X-Tenant": "acme"}), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink1: pmetric.Metrics{}, + expectSinkD: pmetric.Metrics{}, + }, + { + name: "request/match_no_grpc_value", + cfg: testConfig( + withRoute("request", isAcme, idSink0), + withDefault(idSinkD), + ), + ctx: withGRPCMetadata(context.Background(), map[string]string{"X-Tenant": "notacme"}), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetric.Metrics{}, + expectSink1: pmetric.Metrics{}, + expectSinkD: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + }, + { + name: "request/match_http_value", + cfg: testConfig( + withRoute("request", isAcme, idSink0), + withDefault(idSinkD), + ), + ctx: withHTTPMetadata(context.Background(), map[string][]string{"X-Tenant": {"acme"}}), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink1: pmetric.Metrics{}, + expectSinkD: pmetric.Metrics{}, + }, + { + name: "request/match_http_value2", + cfg: testConfig( + withRoute("request", isAcme, idSink0), + withDefault(idSinkD), + ), + ctx: withHTTPMetadata(context.Background(), map[string][]string{"X-Tenant": {"notacme", "acme"}}), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink1: pmetric.Metrics{}, + expectSinkD: pmetric.Metrics{}, + }, + { + name: "request/match_no_http_value", + cfg: testConfig( + withRoute("request", isAcme, idSink0), + withDefault(idSinkD), + ), + ctx: withHTTPMetadata(context.Background(), map[string][]string{"X-Tenant": {"notacme"}}), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetric.Metrics{}, + expectSink1: pmetric.Metrics{}, + expectSinkD: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + }, + { + name: "resource/all_match_first_only", + cfg: testConfig( + withRoute("resource", "true", idSink0), + withRoute("resource", isResourceY, idSink1), + withDefault(idSinkD), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink1: pmetric.Metrics{}, + expectSinkD: pmetric.Metrics{}, + }, + { + name: "resource/all_match_last_only", + cfg: testConfig( + withRoute("resource", isResourceX, idSink0), + withRoute("resource", "true", idSink1), + withDefault(idSinkD), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetric.Metrics{}, + expectSink1: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSinkD: pmetric.Metrics{}, + }, + { + name: "resource/all_match_only_once", + cfg: testConfig( + withRoute("resource", "true", idSink0), + withRoute("resource", isResourceA+" or "+isResourceB, idSink1), + withDefault(idSinkD), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink1: pmetric.Metrics{}, + expectSinkD: pmetric.Metrics{}, + }, + { + name: "resource/each_matches_one", + cfg: testConfig( + withRoute("resource", isResourceA, idSink0), + withRoute("resource", isResourceB, idSink1), + withDefault(idSinkD), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("A", "CD", "EF", "GH"), + expectSink1: pmetricutiltest.NewGauges("B", "CD", "EF", "GH"), + expectSinkD: pmetric.Metrics{}, + }, + { + name: "resource/some_match_with_default", + cfg: testConfig( + withRoute("resource", isResourceX, idSink0), + withRoute("resource", isResourceB, idSink1), + withDefault(idSinkD), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetric.Metrics{}, + expectSink1: pmetricutiltest.NewGauges("B", "CD", "EF", "GH"), + expectSinkD: pmetricutiltest.NewGauges("A", "CD", "EF", "GH"), + }, + { + name: "resource/some_match_without_default", + cfg: testConfig( + withRoute("resource", isResourceX, idSink0), + withRoute("resource", isResourceB, idSink1), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetric.Metrics{}, + expectSink1: pmetricutiltest.NewGauges("B", "CD", "EF", "GH"), + expectSinkD: pmetric.Metrics{}, + }, + { + name: "resource/match_none_with_default", + cfg: testConfig( + withRoute("resource", isResourceX, idSink0), + withRoute("resource", isResourceY, idSink1), + withDefault(idSinkD), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetric.Metrics{}, + expectSink1: pmetric.Metrics{}, + expectSinkD: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + }, + { + name: "resource/match_none_without_default", + cfg: testConfig( + withRoute("resource", isResourceX, idSink0), + withRoute("resource", isResourceY, idSink1), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetric.Metrics{}, + expectSink1: pmetric.Metrics{}, + expectSinkD: pmetric.Metrics{}, + }, + { + name: "metric/all_match_first_only", + cfg: testConfig( + withRoute("metric", "true", idSink0), + withRoute("metric", isMetricY, idSink1), + withDefault(idSinkD), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink1: pmetric.Metrics{}, + expectSinkD: pmetric.Metrics{}, + }, + { + name: "metric/all_match_last_only", + cfg: testConfig( + withRoute("metric", isMetricX, idSink0), + withRoute("metric", "true", idSink1), + withDefault(idSinkD), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetric.Metrics{}, + expectSink1: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSinkD: pmetric.Metrics{}, + }, + { + name: "metric/all_match_only_once", + cfg: testConfig( + withRoute("metric", "true", idSink0), + withRoute("metric", isMetricE+" or "+isMetricF, idSink1), + withDefault(idSinkD), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink1: pmetric.Metrics{}, + expectSinkD: pmetric.Metrics{}, + }, + { + name: "metric/each_matches_one", + cfg: testConfig( + withRoute("metric", isMetricE, idSink0), + withRoute("metric", isMetricF, idSink1), + withDefault(idSinkD), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("AB", "CD", "E", "GH"), + expectSink1: pmetricutiltest.NewGauges("AB", "CD", "F", "GH"), + expectSinkD: pmetric.Metrics{}, + }, + { + name: "metric/some_match_with_default", + cfg: testConfig( + withRoute("metric", isMetricX, idSink0), + withRoute("metric", isMetricF, idSink1), + withDefault(idSinkD), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetric.Metrics{}, + expectSink1: pmetricutiltest.NewGauges("AB", "CD", "F", "GH"), + expectSinkD: pmetricutiltest.NewGauges("AB", "CD", "E", "GH"), + }, + { + name: "metric/some_match_without_default", + cfg: testConfig( + withRoute("metric", isMetricX, idSink0), + withRoute("metric", isMetricF, idSink1), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetric.Metrics{}, + expectSink1: pmetricutiltest.NewGauges("AB", "CD", "F", "GH"), + expectSinkD: pmetric.Metrics{}, + }, + { + name: "metric/match_none_with_default", + cfg: testConfig( + withRoute("metric", isMetricX, idSink0), + withRoute("metric", isMetricY, idSink1), + withDefault(idSinkD), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetric.Metrics{}, + expectSink1: pmetric.Metrics{}, + expectSinkD: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + }, + { + name: "metric/match_none_without_default", + cfg: testConfig( + withRoute("metric", isMetricX, idSink0), + withRoute("metric", isMetricY, idSink1), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetric.Metrics{}, + expectSink1: pmetric.Metrics{}, + expectSinkD: pmetric.Metrics{}, + }, + { + name: "metric/with_resource_condition", + cfg: testConfig( + withRoute("metric", isResourceBFromLowerContext, idSink0), + withRoute("metric", isMetricY, idSink1), + withDefault(idSinkD), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("B", "CD", "EF", "GH"), + expectSink1: pmetric.Metrics{}, + expectSinkD: pmetricutiltest.NewGauges("A", "CD", "EF", "GH"), + }, + { + name: "metric/with_scope_condition", + cfg: testConfig( + withRoute("metric", isScopeDFromLowerContext, idSink0), + withRoute("metric", isMetricY, idSink1), + withDefault(idSinkD), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("AB", "D", "EF", "GH"), + expectSink1: pmetric.Metrics{}, + expectSinkD: pmetricutiltest.NewGauges("AB", "C", "EF", "GH"), + }, + { + name: "metric/with_resource_and_scope_conditions", + cfg: testConfig( + withRoute("metric", isResourceBFromLowerContext+" and "+isScopeDFromLowerContext, idSink0), + withRoute("metric", isMetricY, idSink1), + withDefault(idSinkD), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("B", "D", "EF", "GH"), + expectSink1: pmetric.Metrics{}, + expectSinkD: pmetricutiltest.NewMetricsFromOpts( + pmetricutiltest.Resource("A", + pmetricutiltest.Scope("C", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + pmetricutiltest.Scope("D", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + ), + pmetricutiltest.Resource("B", + pmetricutiltest.Scope("C", + pmetricutiltest.Gauge("E", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + pmetricutiltest.Gauge("F", pmetricutiltest.NumberDataPoint("G"), pmetricutiltest.NumberDataPoint("H")), + ), + ), + ), + }, + { + name: "datapoint/all_match_first_only", + cfg: testConfig( + withRoute("datapoint", "true", idSink0), + withRoute("datapoint", isDataPointY, idSink1), + withDefault(idSinkD), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink1: pmetric.Metrics{}, + expectSinkD: pmetric.Metrics{}, + }, + { + name: "datapoint/all_match_last_only", + cfg: testConfig( + withRoute("datapoint", isDataPointX, idSink0), + withRoute("datapoint", "true", idSink1), + withDefault(idSinkD), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetric.Metrics{}, + expectSink1: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSinkD: pmetric.Metrics{}, + }, + { + name: "datapoint/all_match_only_once", + cfg: testConfig( + withRoute("datapoint", "true", idSink0), + withRoute("datapoint", isDataPointG+" or "+isDataPointH, idSink1), + withDefault(idSinkD), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink1: pmetric.Metrics{}, + expectSinkD: pmetric.Metrics{}, + }, + { + name: "datapoint/each_matches_one", + cfg: testConfig( + withRoute("datapoint", isDataPointG, idSink0), + withRoute("datapoint", isDataPointH, idSink1), + withDefault(idSinkD), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("AB", "CD", "EF", "G"), + expectSink1: pmetricutiltest.NewGauges("AB", "CD", "EF", "H"), + expectSinkD: pmetric.Metrics{}, + }, + { + name: "datapoint/some_match_with_default", + cfg: testConfig( + withRoute("datapoint", isDataPointX, idSink0), + withRoute("datapoint", isDataPointH, idSink1), + withDefault(idSinkD), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetric.Metrics{}, + expectSink1: pmetricutiltest.NewGauges("AB", "CD", "EF", "H"), + expectSinkD: pmetricutiltest.NewGauges("AB", "CD", "EF", "G"), + }, + { + name: "datapoint/some_match_without_default", + cfg: testConfig( + withRoute("datapoint", isDataPointX, idSink0), + withRoute("datapoint", isDataPointH, idSink1), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetric.Metrics{}, + expectSink1: pmetricutiltest.NewGauges("AB", "CD", "EF", "H"), + expectSinkD: pmetric.Metrics{}, + }, + { + name: "datapoint/match_none_with_default", + cfg: testConfig( + withRoute("datapoint", isDataPointX, idSink0), + withRoute("datapoint", isDataPointY, idSink1), + withDefault(idSinkD), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetric.Metrics{}, + expectSink1: pmetric.Metrics{}, + expectSinkD: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + }, + { + name: "datapoint/match_none_without_default", + cfg: testConfig( + withRoute("datapoint", isDataPointX, idSink0), + withRoute("datapoint", isDataPointY, idSink1), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetric.Metrics{}, + expectSink1: pmetric.Metrics{}, + expectSinkD: pmetric.Metrics{}, + }, + { + name: "datapoint/with_resource_condition", + cfg: testConfig( + withRoute("datapoint", isResourceBFromLowerContext, idSink0), + withRoute("datapoint", isDataPointY, idSink1), + withDefault(idSinkD), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("B", "CD", "EF", "GH"), + expectSink1: pmetric.Metrics{}, + expectSinkD: pmetricutiltest.NewGauges("A", "CD", "EF", "GH"), + }, + { + name: "datapoint/with_scope_condition", + cfg: testConfig( + withRoute("datapoint", isScopeDFromLowerContext, idSink0), + withRoute("datapoint", isDataPointY, idSink1), + withDefault(idSinkD), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("AB", "D", "EF", "GH"), + expectSink1: pmetric.Metrics{}, + expectSinkD: pmetricutiltest.NewGauges("AB", "C", "EF", "GH"), + }, + { + name: "datapoint/with_metric_condition", + cfg: testConfig( + withRoute("datapoint", isMetricFFromLowerContext, idSink0), + withRoute("datapoint", isDataPointY, idSink1), + withDefault(idSinkD), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("AB", "CD", "F", "GH"), + expectSink1: pmetric.Metrics{}, + expectSinkD: pmetricutiltest.NewGauges("AB", "CD", "E", "GH"), + }, + { + name: "mixed/match_resource_then_metrics", + cfg: testConfig( + withRoute("resource", isResourceA, idSink0), + withRoute("metric", isMetricE, idSink1), + withDefault(idSinkD), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("A", "CD", "EF", "GH"), + expectSink1: pmetricutiltest.NewGauges("B", "CD", "E", "GH"), + expectSinkD: pmetricutiltest.NewGauges("B", "CD", "F", "GH"), + }, + { + name: "mixed/match_metrics_then_resource", + cfg: testConfig( + withRoute("metric", isMetricE, idSink0), + withRoute("resource", isResourceB, idSink1), + withDefault(idSinkD), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("AB", "CD", "E", "GH"), + expectSink1: pmetricutiltest.NewGauges("B", "CD", "F", "GH"), + expectSinkD: pmetricutiltest.NewGauges("A", "CD", "F", "GH"), + }, + { + name: "mixed/match_resource_then_datapoint", + cfg: testConfig( + withRoute("resource", isResourceA, idSink0), + withRoute("datapoint", isDataPointG, idSink1), + withDefault(idSinkD), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("A", "CD", "EF", "GH"), + expectSink1: pmetricutiltest.NewGauges("B", "CD", "EF", "G"), + expectSinkD: pmetricutiltest.NewGauges("B", "CD", "EF", "H"), + }, + { + name: "mixed/match_datapoint_then_resource", + cfg: testConfig( + withRoute("datapoint", isDataPointG, idSink0), + withRoute("resource", isResourceB, idSink1), + withDefault(idSinkD), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("AB", "CD", "EF", "G"), + expectSink1: pmetricutiltest.NewGauges("B", "CD", "EF", "H"), + expectSinkD: pmetricutiltest.NewGauges("A", "CD", "EF", "H"), + }, + { + name: "mixed/match_metric_then_datapoint", + cfg: testConfig( + withRoute("metric", isMetricE, idSink0), + withRoute("datapoint", isDataPointG, idSink1), + withDefault(idSinkD), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("AB", "CD", "E", "GH"), + expectSink1: pmetricutiltest.NewGauges("AB", "CD", "F", "G"), + expectSinkD: pmetricutiltest.NewGauges("AB", "CD", "F", "H"), + }, + { + name: "mixed/match_datapoint_then_metric", + cfg: testConfig( + withRoute("datapoint", isDataPointG, idSink0), + withRoute("metric", isMetricE, idSink1), + withDefault(idSinkD), + ), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("AB", "CD", "EF", "G"), + expectSink1: pmetricutiltest.NewGauges("AB", "CD", "E", "H"), + expectSinkD: pmetricutiltest.NewGauges("AB", "CD", "F", "H"), + }, + { + name: "mixed/match_resource_then_grpc_request", + cfg: testConfig( + withRoute("resource", isResourceA, idSink0), + withRoute("request", isAcme, idSink1), + withDefault(idSinkD), + ), + ctx: withGRPCMetadata(context.Background(), map[string]string{"X-Tenant": "acme"}), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("A", "CD", "EF", "GH"), + expectSink1: pmetricutiltest.NewGauges("B", "CD", "EF", "GH"), + expectSinkD: pmetric.Metrics{}, + }, + { + name: "mixed/match_metrics_then_grpc_request", + cfg: testConfig( + withRoute("metric", isMetricF, idSink0), + withRoute("request", isAcme, idSink1), + withDefault(idSinkD), + ), + ctx: withGRPCMetadata(context.Background(), map[string]string{"X-Tenant": "acme"}), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("AB", "CD", "F", "GH"), + expectSink1: pmetricutiltest.NewGauges("AB", "CD", "E", "GH"), + expectSinkD: pmetric.Metrics{}, + }, + { + name: "mixed/match_datapoint_then_grpc_request", + cfg: testConfig( + withRoute("datapoint", isDataPointG, idSink0), + withRoute("request", isAcme, idSink1), + withDefault(idSinkD), + ), + ctx: withGRPCMetadata(context.Background(), map[string]string{"X-Tenant": "acme"}), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("AB", "CD", "EF", "G"), + expectSink1: pmetricutiltest.NewGauges("AB", "CD", "EF", "H"), + expectSinkD: pmetric.Metrics{}, + }, + { + name: "mixed/match_resource_then_http_request", + cfg: testConfig( + withRoute("resource", isResourceA, idSink0), + withRoute("request", isAcme, idSink1), + withDefault(idSinkD), + ), + ctx: withHTTPMetadata(context.Background(), map[string][]string{"X-Tenant": {"acme"}}), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("A", "CD", "EF", "GH"), + expectSink1: pmetricutiltest.NewGauges("B", "CD", "EF", "GH"), + expectSinkD: pmetric.Metrics{}, + }, + { + name: "mixed/match_metrics_then_http_request", + cfg: testConfig( + withRoute("metric", isMetricF, idSink0), + withRoute("request", isAcme, idSink1), + withDefault(idSinkD), + ), + ctx: withHTTPMetadata(context.Background(), map[string][]string{"X-Tenant": {"acme"}}), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("AB", "CD", "F", "GH"), + expectSink1: pmetricutiltest.NewGauges("AB", "CD", "E", "GH"), + expectSinkD: pmetric.Metrics{}, + }, + { + name: "mixed/match_datapoint_then_http_request", + cfg: testConfig( + withRoute("datapoint", isDataPointG, idSink0), + withRoute("request", isAcme, idSink1), + withDefault(idSinkD), + ), + ctx: withHTTPMetadata(context.Background(), map[string][]string{"X-Tenant": {"acme"}}), + input: pmetricutiltest.NewGauges("AB", "CD", "EF", "GH"), + expectSink0: pmetricutiltest.NewGauges("AB", "CD", "EF", "G"), + expectSink1: pmetricutiltest.NewGauges("AB", "CD", "EF", "H"), + expectSinkD: pmetric.Metrics{}, + }, + } + + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + var sinkD, sink0, sink1 consumertest.MetricsSink + router := connector.NewMetricsRouter(map[pipeline.ID]consumer.Metrics{ + pipeline.NewIDWithName(pipeline.SignalMetrics, "0"): &sink0, + pipeline.NewIDWithName(pipeline.SignalMetrics, "1"): &sink1, + pipeline.NewIDWithName(pipeline.SignalMetrics, "default"): &sinkD, + }) + + conn, err := NewFactory().CreateMetricsToMetrics( + context.Background(), + connectortest.NewNopSettings(), + tt.cfg, + router.(consumer.Metrics), + ) + require.NoError(t, err) + + ctx := context.Background() + if tt.ctx != nil { + ctx = tt.ctx + } + + require.NoError(t, conn.ConsumeMetrics(ctx, tt.input)) + + assertExpected := func(sink *consumertest.MetricsSink, expected pmetric.Metrics, name string) { + if expected == (pmetric.Metrics{}) { + assert.Empty(t, sink.AllMetrics(), name) + } else { + require.Len(t, sink.AllMetrics(), 1, name) + assert.Equal(t, expected, sink.AllMetrics()[0], name) + } + } + assertExpected(&sink0, tt.expectSink0, "sink0") + assertExpected(&sink1, tt.expectSink1, "sink1") + assertExpected(&sinkD, tt.expectSinkD, "sinkD") + }) + } } diff --git a/connector/routingconnector/request.go b/connector/routingconnector/request.go new file mode 100644 index 000000000000..ab7b70615025 --- /dev/null +++ b/connector/routingconnector/request.go @@ -0,0 +1,107 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package routingconnector // import "github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector" + +import ( + "context" + "errors" + "regexp" + "strings" + + "go.opentelemetry.io/collector/client" + "google.golang.org/grpc/metadata" +) + +// This file defines an extremely simple request condition grammar. The goal is to provide a similar feel to OTTL, +// but it's not clear that anything more than a simple comparison is needed. We can expand this grammar in the +// future if needed. For now, it expects the condition to be in exactly the format: +// 'request[""] ' where is either '==' or '!='. + +var ( + requestFieldRegex = regexp.MustCompile(`request\[".*"\]`) + valueFieldRegex = regexp.MustCompile(`".*"`) + comparatorRegex = regexp.MustCompile(`==|!=`) +) + +type requestCondition struct { + attributeName string + compareFunc func(string) bool +} + +func parseRequestCondition(condition string) (*requestCondition, error) { + if condition == "" { + return nil, errors.New("condition is empty") + } + + comparators := comparatorRegex.FindAllString(condition, 2) + switch { + case len(comparators) == 0: + return nil, errors.New("condition does not contain a valid comparator") + case len(comparators) > 1: + return nil, errors.New("condition contains multiple comparators") + } + + parts := strings.Split(condition, comparators[0]) + if len(parts) < 2 { + return nil, errors.New("condition does not contain a valid comparator") + } + if len(parts) > 2 { + return nil, errors.New("condition contains multiple comparators") + } + parts[0] = strings.TrimSpace(parts[0]) + parts[1] = strings.TrimSpace(parts[1]) + + if !requestFieldRegex.MatchString(parts[0]) { + return nil, errors.New(`condition must have format 'request[""] '`) + } + if !valueFieldRegex.MatchString(parts[1]) { + return nil, errors.New(`condition must have format 'request[""] ""'`) + } + valueWithoutQuotes := strings.TrimSuffix(strings.TrimPrefix(parts[1], `"`), `"`) + + compareFunc := func(value string) bool { + return value == valueWithoutQuotes + } + if comparators[0] == "!=" { + compareFunc = func(value string) bool { + return value != valueWithoutQuotes + } + } + + return &requestCondition{ + attributeName: strings.TrimSuffix(strings.TrimPrefix(parts[0], `request["`), `"]`), + compareFunc: compareFunc, + }, nil +} + +func (rc *requestCondition) matchRequest(ctx context.Context) bool { + return rc.matchGRPC(ctx) || rc.matchHTTP(ctx) +} + +func (rc *requestCondition) matchGRPC(ctx context.Context) bool { + md, ok := metadata.FromIncomingContext(ctx) + if !ok { + return false + } + values, ok := md[strings.ToLower(rc.attributeName)] + if !ok { + return false + } + for _, value := range values { + if rc.compareFunc(value) { + return true + } + } + return false +} + +func (rc *requestCondition) matchHTTP(ctx context.Context) bool { + values := client.FromContext(ctx).Metadata.Get(rc.attributeName) + for _, value := range values { + if rc.compareFunc(value) { + return true + } + } + return false +} diff --git a/connector/routingconnector/request_test.go b/connector/routingconnector/request_test.go new file mode 100644 index 000000000000..5e432c98f07c --- /dev/null +++ b/connector/routingconnector/request_test.go @@ -0,0 +1,19 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package routingconnector // import "github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector" + +import ( + "context" + + "go.opentelemetry.io/collector/client" + "google.golang.org/grpc/metadata" +) + +func withGRPCMetadata(ctx context.Context, md map[string]string) context.Context { + return metadata.NewIncomingContext(ctx, metadata.New(md)) +} + +func withHTTPMetadata(ctx context.Context, md map[string][]string) context.Context { + return client.NewContext(ctx, client.Info{Metadata: client.NewMetadata(md)}) +} diff --git a/connector/routingconnector/router.go b/connector/routingconnector/router.go index 24fc5978a0b6..665bc59fa821 100644 --- a/connector/routingconnector/router.go +++ b/connector/routingconnector/router.go @@ -9,11 +9,16 @@ import ( "strings" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/pipeline" "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector/internal/common" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottldatapoint" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottllog" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottlmetric" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottlresource" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottlspan" ) var errPipelineNotFound = errors.New("pipeline not found") @@ -21,14 +26,18 @@ var errPipelineNotFound = errors.New("pipeline not found") // consumerProvider is a function with a type parameter C (expected to be one // of consumer.Traces, consumer.Metrics, or Consumer.Logs). returns a // consumer for the given component ID(s). -type consumerProvider[C any] func(...component.ID) (C, error) +type consumerProvider[C any] func(...pipeline.ID) (C, error) // router registers consumers and default consumers for a pipeline. the type // parameter C is expected to be one of: consumer.Traces, consumer.Metrics, or // consumer.Logs. type router[C any] struct { - logger *zap.Logger - parser ottl.Parser[ottlresource.TransformContext] + logger *zap.Logger + resourceParser ottl.Parser[ottlresource.TransformContext] + spanParser ottl.Parser[ottlspan.TransformContext] + metricParser ottl.Parser[ottlmetric.TransformContext] + dataPointParser ottl.Parser[ottldatapoint.TransformContext] + logParser ottl.Parser[ottllog.TransformContext] table []RoutingTableItem routes map[string]routingItem[C] @@ -42,27 +51,21 @@ type router[C any] struct { // see router struct definition for the allowed types. func newRouter[C any]( table []RoutingTableItem, - defaultPipelineIDs []component.ID, + defaultPipelineIDs []pipeline.ID, provider consumerProvider[C], settings component.TelemetrySettings, ) (*router[C], error) { - parser, err := ottlresource.NewParser( - common.Functions[ottlresource.TransformContext](), - settings, - ) - - if err != nil { - return nil, err - } - r := &router[C]{ logger: settings.Logger, - parser: parser, table: table, routes: make(map[string]routingItem[C]), consumerProvider: provider, } + if err := r.buildParsers(table, settings); err != nil { + return nil, err + } + if err := r.registerConsumers(defaultPipelineIDs); err != nil { return nil, err } @@ -71,17 +74,101 @@ func newRouter[C any]( } type routingItem[C any] struct { - consumer C - statement *ottl.Statement[ottlresource.TransformContext] + consumer C + statementContext string + requestCondition *requestCondition + resourceStatement *ottl.Statement[ottlresource.TransformContext] + spanStatement *ottl.Statement[ottlspan.TransformContext] + metricStatement *ottl.Statement[ottlmetric.TransformContext] + dataPointStatement *ottl.Statement[ottldatapoint.TransformContext] + logStatement *ottl.Statement[ottllog.TransformContext] +} + +func (r *router[C]) buildParsers(table []RoutingTableItem, settings component.TelemetrySettings) error { + var buildResource, buildSpan, buildMetric, buildDataPoint, buildLog bool + for _, item := range table { + switch item.Context { + case "", "resource": + buildResource = true + case "span": + buildSpan = true + case "metric": + buildMetric = true + case "datapoint": + buildDataPoint = true + case "log": + buildLog = true + } + } + + var errs error + if buildResource { + parser, err := ottlresource.NewParser( + common.Functions[ottlresource.TransformContext](), + settings, + ) + if err == nil { + r.resourceParser = parser + } else { + errs = errors.Join(errs, err) + } + } + if buildSpan { + parser, err := ottlspan.NewParser( + common.Functions[ottlspan.TransformContext](), + settings, + ) + if err == nil { + r.spanParser = parser + } else { + errs = errors.Join(errs, err) + } + } + if buildMetric { + parser, err := ottlmetric.NewParser( + common.Functions[ottlmetric.TransformContext](), + settings, + ) + if err == nil { + r.metricParser = parser + } else { + errs = errors.Join(errs, err) + } + } + if buildDataPoint { + parser, err := ottldatapoint.NewParser( + common.Functions[ottldatapoint.TransformContext](), + settings, + ) + if err == nil { + r.dataPointParser = parser + } else { + errs = errors.Join(errs, err) + } + } + if buildLog { + parser, err := ottllog.NewParser( + common.Functions[ottllog.TransformContext](), + settings, + ) + if err == nil { + r.logParser = parser + } else { + errs = errors.Join(errs, err) + } + } + return errs } -func (r *router[C]) registerConsumers(defaultPipelineIDs []component.ID) error { +func (r *router[C]) registerConsumers(defaultPipelineIDs []pipeline.ID) error { // register default pipelines err := r.registerDefaultConsumer(defaultPipelineIDs) if err != nil { return err } + r.normalizeConditions() + // register pipelines for each route err = r.registerRouteConsumers() if err != nil { @@ -91,9 +178,8 @@ func (r *router[C]) registerConsumers(defaultPipelineIDs []component.ID) error { return nil } -// registerDefaultConsumer registers a consumer for the default -// pipelines configured -func (r *router[C]) registerDefaultConsumer(pipelineIDs []component.ID) error { +// registerDefaultConsumer registers a consumer for the default pipelines configured +func (r *router[C]) registerDefaultConsumer(pipelineIDs []pipeline.ID) error { if len(pipelineIDs) == 0 { return nil } @@ -108,18 +194,59 @@ func (r *router[C]) registerDefaultConsumer(pipelineIDs []component.ID) error { return nil } -// registerRouteConsumers registers a consumer for the pipelines configured -// for each route -func (r *router[C]) registerRouteConsumers() error { - for _, item := range r.table { - statement, err := r.getStatementFrom(item) - if err != nil { - return err +// convert conditions to statements +func (r *router[C]) normalizeConditions() { + for i := range r.table { + item := &r.table[i] + if item.Condition != "" { + item.Statement = fmt.Sprintf("route() where %s", item.Condition) } + } +} +// registerRouteConsumers registers a consumer for the pipelines configured for each route +func (r *router[C]) registerRouteConsumers() (err error) { + for _, item := range r.table { route, ok := r.routes[key(item)] if !ok { - route.statement = statement + route.statementContext = item.Context + switch item.Context { + case "request": + route.requestCondition, err = parseRequestCondition(item.Condition) + if err != nil { + return err + } + case "", "resource": + statement, err := r.resourceParser.ParseStatement(item.Statement) + if err != nil { + return err + } + route.resourceStatement = statement + case "span": + statement, err := r.spanParser.ParseStatement(item.Statement) + if err != nil { + return err + } + route.spanStatement = statement + case "metric": + statement, err := r.metricParser.ParseStatement(item.Statement) + if err != nil { + return err + } + route.metricStatement = statement + case "datapoint": + statement, err := r.dataPointParser.ParseStatement(item.Statement) + if err != nil { + return err + } + route.dataPointStatement = statement + case "log": + statement, err := r.logParser.ParseStatement(item.Statement) + if err != nil { + return err + } + route.logStatement = statement + } } else { pipelineNames := []string{} for _, pipeline := range item.Pipelines { @@ -143,21 +270,15 @@ func (r *router[C]) registerRouteConsumers() error { return nil } -// getStatementFrom builds a routing OTTL statement from the provided -// routing table entry configuration. If the routing table entry configuration -// does not contain a valid OTTL statement then nil is returned. -func (r *router[C]) getStatementFrom(item RoutingTableItem) (*ottl.Statement[ottlresource.TransformContext], error) { - var statement *ottl.Statement[ottlresource.TransformContext] - if item.Statement != "" { - var err error - statement, err = r.parser.ParseStatement(item.Statement) - if err != nil { - return statement, err - } - } - return statement, nil -} - func key(entry RoutingTableItem) string { - return entry.Statement + switch entry.Context { + case "", "resource": + return entry.Statement + case "request": + return "[request] " + entry.Condition + } + if entry.Context == "" || entry.Context == "resource" { + return entry.Statement + } + return "[" + entry.Context + "] " + entry.Statement } diff --git a/connector/routingconnector/testdata/config_logs.yaml b/connector/routingconnector/testdata/config/logs.yaml similarity index 100% rename from connector/routingconnector/testdata/config_logs.yaml rename to connector/routingconnector/testdata/config/logs.yaml diff --git a/connector/routingconnector/testdata/config_metrics.yaml b/connector/routingconnector/testdata/config/metrics.yaml similarity index 100% rename from connector/routingconnector/testdata/config_metrics.yaml rename to connector/routingconnector/testdata/config/metrics.yaml diff --git a/connector/routingconnector/testdata/config_traces.yaml b/connector/routingconnector/testdata/config/traces.yaml similarity index 100% rename from connector/routingconnector/testdata/config_traces.yaml rename to connector/routingconnector/testdata/config/traces.yaml diff --git a/connector/routingconnector/traces.go b/connector/routingconnector/traces.go index 1d1b4f2083b0..aadac9615264 100644 --- a/connector/routingconnector/traces.go +++ b/connector/routingconnector/traces.go @@ -13,8 +13,10 @@ import ( "go.opentelemetry.io/collector/pdata/ptrace" "go.uber.org/zap" + "github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector/internal/ptraceutil" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottlresource" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottlspan" ) type tracesConnector struct { @@ -27,12 +29,17 @@ type tracesConnector struct { } func newTracesConnector( - set connector.CreateSettings, + set connector.Settings, config component.Config, traces consumer.Traces, ) (*tracesConnector, error) { cfg := config.(*Config) + // TODO update log from warning to error in v0.116.0 + if !cfg.MatchOnce { + set.Logger.Warn("The 'match_once' field has been deprecated. Set to 'true' to suppress this warning.") + } + tr, ok := traces.(connector.TracesRouterAndConsumer) if !ok { return nil, errUnexpectedConsumer @@ -43,7 +50,6 @@ func newTracesConnector( cfg.DefaultPipelines, tr.Consumer, set.TelemetrySettings) - if err != nil { return nil, err } @@ -59,61 +65,118 @@ func (*tracesConnector) Capabilities() consumer.Capabilities { return consumer.Capabilities{MutatesData: false} } -func (c *tracesConnector) ConsumeTraces(ctx context.Context, t ptrace.Traces) error { +func (c *tracesConnector) ConsumeTraces(ctx context.Context, td ptrace.Traces) error { + if c.config.MatchOnce { + return c.switchTraces(ctx, td) + } + return c.matchAllTraces(ctx, td) +} + +func (c *tracesConnector) switchTraces(ctx context.Context, td ptrace.Traces) error { + groups := make(map[consumer.Traces]ptrace.Traces) + var errs error + for i := 0; i < len(c.router.routeSlice) && td.ResourceSpans().Len() > 0; i++ { + route := c.router.routeSlice[i] + matchedSpans := ptrace.NewTraces() + switch route.statementContext { + case "request": + if route.requestCondition.matchRequest(ctx) { + groupAllTraces(groups, route.consumer, td) + td = ptrace.NewTraces() // all traces have been routed + } + case "", "resource": + ptraceutil.MoveResourcesIf(td, matchedSpans, + func(rs ptrace.ResourceSpans) bool { + rtx := ottlresource.NewTransformContext(rs.Resource(), rs) + _, isMatch, err := route.resourceStatement.Execute(ctx, rtx) + errs = errors.Join(errs, err) + return isMatch + }, + ) + case "span": + ptraceutil.MoveSpansWithContextIf(td, matchedSpans, + func(rs ptrace.ResourceSpans, ss ptrace.ScopeSpans, s ptrace.Span) bool { + mtx := ottlspan.NewTransformContext(s, ss.Scope(), rs.Resource(), ss, rs) + _, isMatch, err := route.spanStatement.Execute(ctx, mtx) + errs = errors.Join(errs, err) + return isMatch + }, + ) + } + if errs != nil { + if c.config.ErrorMode == ottl.PropagateError { + return errs + } + groupAllTraces(groups, c.router.defaultConsumer, matchedSpans) + } + groupAllTraces(groups, route.consumer, matchedSpans) + } + // anything left wasn't matched by any route. Send to default consumer + groupAllTraces(groups, c.router.defaultConsumer, td) + for consumer, group := range groups { + errs = errors.Join(errs, consumer.ConsumeTraces(ctx, group)) + } + return errs +} + +func (c *tracesConnector) matchAllTraces(ctx context.Context, td ptrace.Traces) error { // groups is used to group ptrace.ResourceSpans that are routed to // the same set of pipelines. This way we're not ending up with all the // spans split up which would cause higher CPU usage. groups := make(map[consumer.Traces]ptrace.Traces) var errs error - for i := 0; i < t.ResourceSpans().Len(); i++ { - rspans := t.ResourceSpans().At(i) - rtx := ottlresource.NewTransformContext(rspans.Resource()) - + for i := 0; i < td.ResourceSpans().Len(); i++ { + rspans := td.ResourceSpans().At(i) + rtx := ottlresource.NewTransformContext(rspans.Resource(), rspans) noRoutesMatch := true for _, route := range c.router.routeSlice { - _, isMatch, err := route.statement.Execute(ctx, rtx) + _, isMatch, err := route.resourceStatement.Execute(ctx, rtx) if err != nil { if c.config.ErrorMode == ottl.PropagateError { return err } - c.group(groups, c.router.defaultConsumer, rspans) + groupTraces(groups, c.router.defaultConsumer, rspans) continue } if isMatch { noRoutesMatch = false - c.group(groups, route.consumer, rspans) - if c.config.MatchOnce { - break - } + groupTraces(groups, route.consumer, rspans) } - } - if noRoutesMatch { // no route conditions are matched, add resource spans to default pipelines group - c.group(groups, c.router.defaultConsumer, rspans) + groupTraces(groups, c.router.defaultConsumer, rspans) } } - for consumer, group := range groups { errs = errors.Join(errs, consumer.ConsumeTraces(ctx, group)) } return errs } -func (c *tracesConnector) group( +func groupAllTraces( + groups map[consumer.Traces]ptrace.Traces, + cons consumer.Traces, + traces ptrace.Traces, +) { + for i := 0; i < traces.ResourceSpans().Len(); i++ { + groupTraces(groups, cons, traces.ResourceSpans().At(i)) + } +} + +func groupTraces( groups map[consumer.Traces]ptrace.Traces, - consumer consumer.Traces, + cons consumer.Traces, spans ptrace.ResourceSpans, ) { - if consumer == nil { + if cons == nil { return } - group, ok := groups[consumer] + group, ok := groups[cons] if !ok { group = ptrace.NewTraces() } spans.CopyTo(group.ResourceSpans().AppendEmpty()) - groups[consumer] = group + groups[cons] = group } diff --git a/connector/routingconnector/traces_test.go b/connector/routingconnector/traces_test.go index 502997a65790..fb597e2a6968 100644 --- a/connector/routingconnector/traces_test.go +++ b/connector/routingconnector/traces_test.go @@ -9,30 +9,32 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/connector" "go.opentelemetry.io/collector/connector/connectortest" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/consumer/consumertest" "go.opentelemetry.io/collector/pdata/ptrace" + "go.opentelemetry.io/collector/pipeline" + + "github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector/internal/ptraceutiltest" ) func TestTracesRegisterConsumersForValidRoute(t *testing.T) { - tracesDefault := component.NewIDWithName(component.DataTypeTraces, "default") - traces0 := component.NewIDWithName(component.DataTypeTraces, "0") - traces1 := component.NewIDWithName(component.DataTypeTraces, "1") + tracesDefault := pipeline.NewIDWithName(pipeline.SignalTraces, "default") + traces0 := pipeline.NewIDWithName(pipeline.SignalTraces, "0") + traces1 := pipeline.NewIDWithName(pipeline.SignalTraces, "1") cfg := &Config{ - DefaultPipelines: []component.ID{tracesDefault}, + DefaultPipelines: []pipeline.ID{tracesDefault}, Table: []RoutingTableItem{ { Statement: `route() where attributes["X-Tenant"] == "acme"`, - Pipelines: []component.ID{traces0}, + Pipelines: []pipeline.ID{traces0}, }, { - Statement: `route() where attributes["X-Tenant"] == "*"`, - Pipelines: []component.ID{traces0, traces1}, + Condition: `attributes["X-Tenant"] == "*"`, + Pipelines: []pipeline.ID{traces0, traces1}, }, }, } @@ -41,14 +43,14 @@ func TestTracesRegisterConsumersForValidRoute(t *testing.T) { var defaultSink, sink0, sink1 consumertest.TracesSink - router := connector.NewTracesRouter(map[component.ID]consumer.Traces{ + router := connector.NewTracesRouter(map[pipeline.ID]consumer.Traces{ tracesDefault: &defaultSink, traces0: &sink0, traces1: &sink1, }) conn, err := NewFactory().CreateTracesToTraces(context.Background(), - connectortest.NewNopCreateSettings(), cfg, router.(consumer.Traces)) + connectortest.NewNopSettings(), cfg, router.(consumer.Traces)) require.NoError(t, err) require.NotNil(t, conn) @@ -76,24 +78,24 @@ func TestTracesRegisterConsumersForValidRoute(t *testing.T) { } func TestTracesCorrectlySplitPerResourceAttributeWithOTTL(t *testing.T) { - tracesDefault := component.NewIDWithName(component.DataTypeTraces, "default") - traces0 := component.NewIDWithName(component.DataTypeTraces, "0") - traces1 := component.NewIDWithName(component.DataTypeTraces, "1") + tracesDefault := pipeline.NewIDWithName(pipeline.SignalTraces, "default") + traces0 := pipeline.NewIDWithName(pipeline.SignalTraces, "0") + traces1 := pipeline.NewIDWithName(pipeline.SignalTraces, "1") cfg := &Config{ - DefaultPipelines: []component.ID{tracesDefault}, + DefaultPipelines: []pipeline.ID{tracesDefault}, Table: []RoutingTableItem{ { - Statement: `route() where attributes["value"] > 0 and attributes["value"] < 4`, - Pipelines: []component.ID{traces0}, + Condition: `attributes["value"] > 0 and attributes["value"] < 4`, + Pipelines: []pipeline.ID{traces0}, }, { Statement: `route() where attributes["value"] > 1 and attributes["value"] < 4`, - Pipelines: []component.ID{traces1}, + Pipelines: []pipeline.ID{traces1}, }, { Statement: `route() where attributes["value"] == 5`, - Pipelines: []component.ID{tracesDefault, traces0}, + Pipelines: []pipeline.ID{tracesDefault, traces0}, }, }, } @@ -106,7 +108,7 @@ func TestTracesCorrectlySplitPerResourceAttributeWithOTTL(t *testing.T) { sink1.Reset() } - router := connector.NewTracesRouter(map[component.ID]consumer.Traces{ + router := connector.NewTracesRouter(map[pipeline.ID]consumer.Traces{ tracesDefault: &defaultSink, traces1: &sink1, traces0: &sink0, @@ -115,7 +117,7 @@ func TestTracesCorrectlySplitPerResourceAttributeWithOTTL(t *testing.T) { factory := NewFactory() conn, err := factory.CreateTracesToTraces( context.Background(), - connectortest.NewNopCreateSettings(), + connectortest.NewNopSettings(), cfg, router.(consumer.Traces), ) @@ -139,8 +141,8 @@ func TestTracesCorrectlySplitPerResourceAttributeWithOTTL(t *testing.T) { require.NoError(t, conn.ConsumeTraces(context.Background(), tr)) assert.Len(t, defaultSink.AllTraces(), 1) - assert.Len(t, sink0.AllTraces(), 0) - assert.Len(t, sink1.AllTraces(), 0) + assert.Empty(t, sink0.AllTraces()) + assert.Empty(t, sink1.AllTraces()) }) t.Run("span matched by one of two expressions", func(t *testing.T) { @@ -154,9 +156,9 @@ func TestTracesCorrectlySplitPerResourceAttributeWithOTTL(t *testing.T) { require.NoError(t, conn.ConsumeTraces(context.Background(), tr)) - assert.Len(t, defaultSink.AllTraces(), 0) + assert.Empty(t, defaultSink.AllTraces()) assert.Len(t, sink0.AllTraces(), 1) - assert.Len(t, sink1.AllTraces(), 0) + assert.Empty(t, sink1.AllTraces()) }) t.Run("span matched by all expressions", func(t *testing.T) { @@ -175,12 +177,12 @@ func TestTracesCorrectlySplitPerResourceAttributeWithOTTL(t *testing.T) { require.NoError(t, conn.ConsumeTraces(context.Background(), tr)) - assert.Len(t, defaultSink.AllTraces(), 0) + assert.Empty(t, defaultSink.AllTraces()) assert.Len(t, sink0.AllTraces(), 1) assert.Len(t, sink1.AllTraces(), 1) - assert.Equal(t, sink0.AllTraces()[0].SpanCount(), 2) - assert.Equal(t, sink1.AllTraces()[0].SpanCount(), 2) + assert.Equal(t, 2, sink0.AllTraces()[0].SpanCount()) + assert.Equal(t, 2, sink1.AllTraces()[0].SpanCount()) assert.Equal(t, sink0.AllTraces(), sink1.AllTraces()) }) @@ -197,34 +199,34 @@ func TestTracesCorrectlySplitPerResourceAttributeWithOTTL(t *testing.T) { assert.Len(t, defaultSink.AllTraces(), 1) assert.Len(t, sink0.AllTraces(), 1) - assert.Len(t, sink1.AllTraces(), 0) + assert.Empty(t, sink1.AllTraces()) - assert.Equal(t, defaultSink.AllTraces()[0].SpanCount(), 1) - assert.Equal(t, sink0.AllTraces()[0].SpanCount(), 1) + assert.Equal(t, 1, defaultSink.AllTraces()[0].SpanCount()) + assert.Equal(t, 1, sink0.AllTraces()[0].SpanCount()) assert.Equal(t, defaultSink.AllTraces(), sink0.AllTraces()) }) } func TestTracesCorrectlyMatchOnceWithOTTL(t *testing.T) { - tracesDefault := component.NewIDWithName(component.DataTypeTraces, "default") - traces0 := component.NewIDWithName(component.DataTypeTraces, "0") - traces1 := component.NewIDWithName(component.DataTypeTraces, "1") + tracesDefault := pipeline.NewIDWithName(pipeline.SignalTraces, "default") + traces0 := pipeline.NewIDWithName(pipeline.SignalTraces, "0") + traces1 := pipeline.NewIDWithName(pipeline.SignalTraces, "1") cfg := &Config{ - DefaultPipelines: []component.ID{tracesDefault}, + DefaultPipelines: []pipeline.ID{tracesDefault}, MatchOnce: true, Table: []RoutingTableItem{ { Statement: `route() where attributes["value"] > 0 and attributes["value"] < 4`, - Pipelines: []component.ID{traces0}, + Pipelines: []pipeline.ID{traces0}, }, { Statement: `route() where attributes["value"] > 1 and attributes["value"] < 4`, - Pipelines: []component.ID{traces1}, + Pipelines: []pipeline.ID{traces1}, }, { - Statement: `route() where attributes["value"] == 5`, - Pipelines: []component.ID{tracesDefault, traces0}, + Condition: `attributes["value"] == 5`, + Pipelines: []pipeline.ID{tracesDefault, traces0}, }, }, } @@ -237,7 +239,7 @@ func TestTracesCorrectlyMatchOnceWithOTTL(t *testing.T) { sink1.Reset() } - router := connector.NewTracesRouter(map[component.ID]consumer.Traces{ + router := connector.NewTracesRouter(map[pipeline.ID]consumer.Traces{ tracesDefault: &defaultSink, traces0: &sink0, traces1: &sink1, @@ -246,7 +248,7 @@ func TestTracesCorrectlyMatchOnceWithOTTL(t *testing.T) { factory := NewFactory() conn, err := factory.CreateTracesToTraces( context.Background(), - connectortest.NewNopCreateSettings(), + connectortest.NewNopSettings(), cfg, router.(consumer.Traces), ) @@ -270,8 +272,8 @@ func TestTracesCorrectlyMatchOnceWithOTTL(t *testing.T) { require.NoError(t, conn.ConsumeTraces(context.Background(), tr)) assert.Len(t, defaultSink.AllTraces(), 1) - assert.Len(t, sink0.AllTraces(), 0) - assert.Len(t, sink1.AllTraces(), 0) + assert.Empty(t, sink0.AllTraces()) + assert.Empty(t, sink1.AllTraces()) }) t.Run("span matched by one of two expressions", func(t *testing.T) { @@ -285,9 +287,9 @@ func TestTracesCorrectlyMatchOnceWithOTTL(t *testing.T) { require.NoError(t, conn.ConsumeTraces(context.Background(), tr)) - assert.Len(t, defaultSink.AllTraces(), 0) + assert.Empty(t, defaultSink.AllTraces()) assert.Len(t, sink0.AllTraces(), 1) - assert.Len(t, sink1.AllTraces(), 0) + assert.Empty(t, sink1.AllTraces()) }) t.Run("span matched by all expressions, but sinks to one", func(t *testing.T) { @@ -306,11 +308,11 @@ func TestTracesCorrectlyMatchOnceWithOTTL(t *testing.T) { require.NoError(t, conn.ConsumeTraces(context.Background(), tr)) - assert.Len(t, defaultSink.AllTraces(), 0) + assert.Empty(t, defaultSink.AllTraces()) assert.Len(t, sink0.AllTraces(), 1) - assert.Len(t, sink1.AllTraces(), 0) + assert.Empty(t, sink1.AllTraces()) - assert.Equal(t, sink0.AllTraces()[0].SpanCount(), 2) + assert.Equal(t, 2, sink0.AllTraces()[0].SpanCount()) }) t.Run("span matched by one expression, multiple pipelines", func(t *testing.T) { @@ -326,31 +328,31 @@ func TestTracesCorrectlyMatchOnceWithOTTL(t *testing.T) { assert.Len(t, defaultSink.AllTraces(), 1) assert.Len(t, sink0.AllTraces(), 1) - assert.Len(t, sink1.AllTraces(), 0) + assert.Empty(t, sink1.AllTraces()) - assert.Equal(t, defaultSink.AllTraces()[0].SpanCount(), 1) - assert.Equal(t, sink0.AllTraces()[0].SpanCount(), 1) + assert.Equal(t, 1, defaultSink.AllTraces()[0].SpanCount()) + assert.Equal(t, 1, sink0.AllTraces()[0].SpanCount()) assert.Equal(t, defaultSink.AllTraces(), sink0.AllTraces()) }) } func TestTracesResourceAttributeDroppedByOTTL(t *testing.T) { - tracesDefault := component.NewIDWithName(component.DataTypeTraces, "default") - tracesOther := component.NewIDWithName(component.DataTypeTraces, "other") + tracesDefault := pipeline.NewIDWithName(pipeline.SignalTraces, "default") + tracesOther := pipeline.NewIDWithName(pipeline.SignalTraces, "other") cfg := &Config{ - DefaultPipelines: []component.ID{tracesDefault}, + DefaultPipelines: []pipeline.ID{tracesDefault}, Table: []RoutingTableItem{ { Statement: `delete_key(attributes, "X-Tenant") where attributes["X-Tenant"] == "acme"`, - Pipelines: []component.ID{tracesOther}, + Pipelines: []pipeline.ID{tracesOther}, }, }, } var sink0, sink1 consumertest.TracesSink - router := connector.NewTracesRouter(map[component.ID]consumer.Traces{ + router := connector.NewTracesRouter(map[pipeline.ID]consumer.Traces{ tracesDefault: &sink0, tracesOther: &sink1, }) @@ -358,7 +360,7 @@ func TestTracesResourceAttributeDroppedByOTTL(t *testing.T) { factory := NewFactory() conn, err := factory.CreateTracesToTraces( context.Background(), - connectortest.NewNopCreateSettings(), + connectortest.NewNopSettings(), cfg, router.(consumer.Traces), ) @@ -387,23 +389,23 @@ func TestTracesResourceAttributeDroppedByOTTL(t *testing.T) { v, ok := attrs.Get("attr") assert.True(t, ok, "non-routing attributes shouldn't have been dropped") assert.Equal(t, "acme", v.Str()) - require.Len(t, sink0.AllTraces(), 0, + require.Empty(t, sink0.AllTraces(), "trace should not be routed to default pipeline", ) } func TestTraceConnectorCapabilities(t *testing.T) { - tracesDefault := component.NewIDWithName(component.DataTypeTraces, "default") - tracesOther := component.NewIDWithName(component.DataTypeTraces, "0") + tracesDefault := pipeline.NewIDWithName(pipeline.SignalTraces, "default") + tracesOther := pipeline.NewIDWithName(pipeline.SignalTraces, "0") cfg := &Config{ Table: []RoutingTableItem{{ Statement: `route() where attributes["X-Tenant"] == "acme"`, - Pipelines: []component.ID{tracesOther}, + Pipelines: []pipeline.ID{tracesOther}, }}, } - router := connector.NewTracesRouter(map[component.ID]consumer.Traces{ + router := connector.NewTracesRouter(map[pipeline.ID]consumer.Traces{ tracesDefault: consumertest.NewNop(), tracesOther: consumertest.NewNop(), }) @@ -411,11 +413,491 @@ func TestTraceConnectorCapabilities(t *testing.T) { factory := NewFactory() conn, err := factory.CreateTracesToTraces( context.Background(), - connectortest.NewNopCreateSettings(), + connectortest.NewNopSettings(), cfg, router.(consumer.Traces), ) require.NoError(t, err) - assert.Equal(t, false, conn.Capabilities().MutatesData) + assert.False(t, conn.Capabilities().MutatesData) +} + +func TestTracesConnectorDetailed(t *testing.T) { + idSink0 := pipeline.NewIDWithName(pipeline.SignalTraces, "0") + idSink1 := pipeline.NewIDWithName(pipeline.SignalTraces, "1") + idSinkD := pipeline.NewIDWithName(pipeline.SignalTraces, "default") + + isAcme := `request["X-Tenant"] == "acme"` + + isResourceA := `attributes["resourceName"] == "resourceA"` + isResourceB := `attributes["resourceName"] == "resourceB"` + isResourceX := `attributes["resourceName"] == "resourceX"` + isResourceY := `attributes["resourceName"] == "resourceY"` + + isSpanE := `name == "spanE"` + isSpanF := `name == "spanF"` + isSpanX := `name == "spanX"` + isSpanY := `name == "spanY"` + + isScopeCFromLowerContext := `instrumentation_scope.name == "scopeC"` + isScopeDFromLowerContext := `instrumentation_scope.name == "scopeD"` + + isResourceBFromLowerContext := `resource.attributes["resourceName"] == "resourceB"` + + testCases := []struct { + name string + cfg *Config + ctx context.Context + input ptrace.Traces + expectSink0 ptrace.Traces + expectSink1 ptrace.Traces + expectSinkD ptrace.Traces + }{ + { + name: "request/no_request_values", + cfg: testConfig( + withRoute("request", isAcme, idSink0), + withDefault(idSinkD), + ), + ctx: context.Background(), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSink0: ptrace.Traces{}, + expectSink1: ptrace.Traces{}, + expectSinkD: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + }, + { + name: "request/match_any_value", + cfg: testConfig( + withRoute("request", isAcme, idSink0), + withDefault(idSinkD), + ), + ctx: withGRPCMetadata( + withHTTPMetadata( + context.Background(), + map[string][]string{"X-Tenant": {"acme"}}, + ), + map[string]string{"X-Tenant": "notacme"}, + ), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSink0: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSink1: ptrace.Traces{}, + expectSinkD: ptrace.Traces{}, + }, + { + name: "request/match_grpc_value", + cfg: testConfig( + withRoute("request", isAcme, idSink0), + withDefault(idSinkD), + ), + ctx: withGRPCMetadata(context.Background(), map[string]string{"X-Tenant": "acme"}), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSink0: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSink1: ptrace.Traces{}, + expectSinkD: ptrace.Traces{}, + }, + { + name: "request/match_no_grpc_value", + cfg: testConfig( + withRoute("request", isAcme, idSink0), + withDefault(idSinkD), + ), + ctx: withGRPCMetadata(context.Background(), map[string]string{"X-Tenant": "notacme"}), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSink0: ptrace.Traces{}, + expectSink1: ptrace.Traces{}, + expectSinkD: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + }, + { + name: "request/match_http_value", + cfg: testConfig( + withRoute("request", isAcme, idSink0), + withDefault(idSinkD), + ), + ctx: withHTTPMetadata(context.Background(), map[string][]string{"X-Tenant": {"acme"}}), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSink0: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSink1: ptrace.Traces{}, + expectSinkD: ptrace.Traces{}, + }, + { + name: "request/match_http_value2", + cfg: testConfig( + withRoute("request", isAcme, idSink0), + withDefault(idSinkD), + ), + ctx: withHTTPMetadata(context.Background(), map[string][]string{"X-Tenant": {"notacme", "acme"}}), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSink0: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSink1: ptrace.Traces{}, + expectSinkD: ptrace.Traces{}, + }, + { + name: "request/match_no_http_value", + cfg: testConfig( + withRoute("request", isAcme, idSink0), + withDefault(idSinkD), + ), + ctx: withHTTPMetadata(context.Background(), map[string][]string{"X-Tenant": {"notacme"}}), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSink0: ptrace.Traces{}, + expectSink1: ptrace.Traces{}, + expectSinkD: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + }, + { + name: "resource/all_match_first_only", + cfg: testConfig( + withRoute("resource", "true", idSink0), + withRoute("resource", isResourceY, idSink1), + withDefault(idSinkD), + ), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "FG"), + expectSink0: ptraceutiltest.NewTraces("AB", "CD", "EF", "FG"), + expectSink1: ptrace.Traces{}, + expectSinkD: ptrace.Traces{}, + }, + { + name: "resource/all_match_last_only", + cfg: testConfig( + withRoute("resource", isResourceX, idSink0), + withRoute("resource", "true", idSink1), + withDefault(idSinkD), + ), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "FG"), + expectSink0: ptrace.Traces{}, + expectSink1: ptraceutiltest.NewTraces("AB", "CD", "EF", "FG"), + expectSinkD: ptrace.Traces{}, + }, + { + name: "resource/all_match_only_once", + cfg: testConfig( + withRoute("resource", "true", idSink0), + withRoute("resource", isResourceA+" or "+isResourceB, idSink1), + withDefault(idSinkD), + ), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "FG"), + expectSink0: ptraceutiltest.NewTraces("AB", "CD", "EF", "FG"), + expectSink1: ptrace.Traces{}, + expectSinkD: ptrace.Traces{}, + }, + { + name: "resource/each_matches_one", + cfg: testConfig( + withRoute("resource", isResourceA, idSink0), + withRoute("resource", isResourceB, idSink1), + withDefault(idSinkD), + ), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "FG"), + expectSink0: ptraceutiltest.NewTraces("A", "CD", "EF", "FG"), + expectSink1: ptraceutiltest.NewTraces("B", "CD", "EF", "FG"), + expectSinkD: ptrace.Traces{}, + }, + { + name: "resource/some_match_with_default", + cfg: testConfig( + withRoute("resource", isResourceX, idSink0), + withRoute("resource", isResourceB, idSink1), + withDefault(idSinkD), + ), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "FG"), + expectSink0: ptrace.Traces{}, + expectSink1: ptraceutiltest.NewTraces("B", "CD", "EF", "FG"), + expectSinkD: ptraceutiltest.NewTraces("A", "CD", "EF", "FG"), + }, + { + name: "resource/some_match_without_default", + cfg: testConfig( + withRoute("resource", isResourceX, idSink0), + withRoute("resource", isResourceB, idSink1), + ), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "FG"), + expectSink0: ptrace.Traces{}, + expectSink1: ptraceutiltest.NewTraces("B", "CD", "EF", "FG"), + expectSinkD: ptrace.Traces{}, + }, + { + name: "resource/match_none_with_default", + cfg: testConfig( + withRoute("resource", isResourceX, idSink0), + withRoute("resource", isResourceY, idSink1), + withDefault(idSinkD), + ), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "FG"), + expectSink0: ptrace.Traces{}, + expectSink1: ptrace.Traces{}, + expectSinkD: ptraceutiltest.NewTraces("AB", "CD", "EF", "FG"), + }, + { + name: "resource/match_none_without_default", + cfg: testConfig( + withRoute("resource", isResourceX, idSink0), + withRoute("resource", isResourceY, idSink1), + ), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "FG"), + expectSink0: ptrace.Traces{}, + expectSink1: ptrace.Traces{}, + expectSinkD: ptrace.Traces{}, + }, + { + name: "span/all_match_first_only", + cfg: testConfig( + withRoute("span", "true", idSink0), + withRoute("span", isSpanY, idSink1), + withDefault(idSinkD), + ), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSink0: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSink1: ptrace.Traces{}, + expectSinkD: ptrace.Traces{}, + }, + { + name: "span/all_match_last_only", + cfg: testConfig( + withRoute("span", isSpanX, idSink0), + withRoute("span", "true", idSink1), + withDefault(idSinkD), + ), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSink0: ptrace.Traces{}, + expectSink1: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSinkD: ptrace.Traces{}, + }, + { + name: "span/all_match_only_once", + cfg: testConfig( + withRoute("span", "true", idSink0), + withRoute("span", isSpanE+" or "+isSpanF, idSink1), + withDefault(idSinkD), + ), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSink0: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSink1: ptrace.Traces{}, + expectSinkD: ptrace.Traces{}, + }, + { + name: "span/each_matches_one", + cfg: testConfig( + withRoute("span", isSpanE, idSink0), + withRoute("span", isSpanF, idSink1), + withDefault(idSinkD), + ), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSink0: ptraceutiltest.NewTraces("AB", "CD", "E", "GH"), + expectSink1: ptraceutiltest.NewTraces("AB", "CD", "F", "GH"), + expectSinkD: ptrace.Traces{}, + }, + { + name: "span/some_match_with_default", + cfg: testConfig( + withRoute("span", isSpanX, idSink0), + withRoute("span", isSpanF, idSink1), + withDefault(idSinkD), + ), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSink0: ptrace.Traces{}, + expectSink1: ptraceutiltest.NewTraces("AB", "CD", "F", "GH"), + expectSinkD: ptraceutiltest.NewTraces("AB", "CD", "E", "GH"), + }, + { + name: "span/some_match_without_default", + cfg: testConfig( + withRoute("span", isSpanX, idSink0), + withRoute("span", isSpanF, idSink1), + ), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSink0: ptrace.Traces{}, + expectSink1: ptraceutiltest.NewTraces("AB", "CD", "F", "GH"), + expectSinkD: ptrace.Traces{}, + }, + { + name: "span/match_none_with_default", + cfg: testConfig( + withRoute("span", isSpanX, idSink0), + withRoute("span", isSpanY, idSink1), + withDefault(idSinkD), + ), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSink0: ptrace.Traces{}, + expectSink1: ptrace.Traces{}, + expectSinkD: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + }, + { + name: "span/match_none_without_default", + cfg: testConfig( + withRoute("span", isSpanX, idSink0), + withRoute("span", isSpanY, idSink1), + ), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSink0: ptrace.Traces{}, + expectSink1: ptrace.Traces{}, + expectSinkD: ptrace.Traces{}, + }, + { + name: "span/with_resource_condition", + cfg: testConfig( + withRoute("span", isResourceBFromLowerContext, idSink0), + withRoute("span", isSpanY, idSink1), + withDefault(idSinkD), + ), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSink0: ptraceutiltest.NewTraces("B", "CD", "EF", "GH"), + expectSink1: ptrace.Traces{}, + expectSinkD: ptraceutiltest.NewTraces("A", "CD", "EF", "GH"), + }, + { + name: "span/with_scope_condition", + cfg: testConfig( + withRoute("span", isScopeCFromLowerContext, idSink0), + withRoute("span", isSpanY, idSink1), + withDefault(idSinkD), + ), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSink0: ptraceutiltest.NewTraces("AB", "C", "EF", "GH"), + expectSink1: ptrace.Traces{}, + expectSinkD: ptraceutiltest.NewTraces("AB", "D", "EF", "GH"), + }, + { + name: "span/with_resource_and_scope_conditions", + cfg: testConfig( + withRoute("span", isResourceBFromLowerContext+" and "+isScopeDFromLowerContext, idSink0), + withRoute("span", isSpanY, idSink1), + withDefault(idSinkD), + ), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSink0: ptraceutiltest.NewTraces("B", "D", "EF", "GH"), + expectSink1: ptrace.Traces{}, + expectSinkD: ptraceutiltest.NewTracesFromOpts( + ptraceutiltest.Resource("A", + ptraceutiltest.Scope("C", + ptraceutiltest.Span("E", ptraceutiltest.SpanEvent("G"), ptraceutiltest.SpanEvent("H")), + ptraceutiltest.Span("F", ptraceutiltest.SpanEvent("G"), ptraceutiltest.SpanEvent("H")), + ), + ptraceutiltest.Scope("D", + ptraceutiltest.Span("E", ptraceutiltest.SpanEvent("G"), ptraceutiltest.SpanEvent("H")), + ptraceutiltest.Span("F", ptraceutiltest.SpanEvent("G"), ptraceutiltest.SpanEvent("H")), + ), + ), + ptraceutiltest.Resource("B", + ptraceutiltest.Scope("C", + ptraceutiltest.Span("E", ptraceutiltest.SpanEvent("G"), ptraceutiltest.SpanEvent("H")), + ptraceutiltest.Span("F", ptraceutiltest.SpanEvent("G"), ptraceutiltest.SpanEvent("H")), + ), + ), + ), + }, + { + name: "mixed/match_resource_then_metrics", + cfg: testConfig( + withRoute("resource", isResourceA, idSink0), + withRoute("span", isSpanE, idSink1), + withDefault(idSinkD), + ), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSink0: ptraceutiltest.NewTraces("A", "CD", "EF", "GH"), + expectSink1: ptraceutiltest.NewTraces("B", "CD", "E", "GH"), + expectSinkD: ptraceutiltest.NewTraces("B", "CD", "F", "GH"), + }, + { + name: "mixed/match_metrics_then_resource", + cfg: testConfig( + withRoute("span", isSpanE, idSink0), + withRoute("resource", isResourceB, idSink1), + withDefault(idSinkD), + ), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSink0: ptraceutiltest.NewTraces("AB", "CD", "E", "GH"), + expectSink1: ptraceutiltest.NewTraces("B", "CD", "F", "GH"), + expectSinkD: ptraceutiltest.NewTraces("A", "CD", "F", "GH"), + }, + + { + name: "mixed/match_resource_then_grpc_request", + cfg: testConfig( + withRoute("resource", isResourceA, idSink0), + withRoute("request", isAcme, idSink1), + withDefault(idSinkD), + ), + ctx: withGRPCMetadata(context.Background(), map[string]string{"X-Tenant": "acme"}), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSink0: ptraceutiltest.NewTraces("A", "CD", "EF", "GH"), + expectSink1: ptraceutiltest.NewTraces("B", "CD", "EF", "GH"), + expectSinkD: ptrace.Traces{}, + }, + { + name: "mixed/match_metrics_then_grpc_request", + cfg: testConfig( + withRoute("span", isSpanF, idSink0), + withRoute("request", isAcme, idSink1), + withDefault(idSinkD), + ), + ctx: withGRPCMetadata(context.Background(), map[string]string{"X-Tenant": "acme"}), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSink0: ptraceutiltest.NewTraces("AB", "CD", "F", "GH"), + expectSink1: ptraceutiltest.NewTraces("AB", "CD", "E", "GH"), + expectSinkD: ptrace.Traces{}, + }, + { + name: "mixed/match_resource_then_http_request", + cfg: testConfig( + withRoute("resource", isResourceA, idSink0), + withRoute("request", isAcme, idSink1), + withDefault(idSinkD), + ), + ctx: withHTTPMetadata(context.Background(), map[string][]string{"X-Tenant": {"acme"}}), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSink0: ptraceutiltest.NewTraces("A", "CD", "EF", "GH"), + expectSink1: ptraceutiltest.NewTraces("B", "CD", "EF", "GH"), + expectSinkD: ptrace.Traces{}, + }, + { + name: "mixed/match_metrics_then_http_request", + cfg: testConfig( + withRoute("span", isSpanF, idSink0), + withRoute("request", isAcme, idSink1), + withDefault(idSinkD), + ), + ctx: withHTTPMetadata(context.Background(), map[string][]string{"X-Tenant": {"acme"}}), + input: ptraceutiltest.NewTraces("AB", "CD", "EF", "GH"), + expectSink0: ptraceutiltest.NewTraces("AB", "CD", "F", "GH"), + expectSink1: ptraceutiltest.NewTraces("AB", "CD", "E", "GH"), + expectSinkD: ptrace.Traces{}, + }, + } + + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + var sinkD, sink0, sink1 consumertest.TracesSink + router := connector.NewTracesRouter(map[pipeline.ID]consumer.Traces{ + pipeline.NewIDWithName(pipeline.SignalTraces, "0"): &sink0, + pipeline.NewIDWithName(pipeline.SignalTraces, "1"): &sink1, + pipeline.NewIDWithName(pipeline.SignalTraces, "default"): &sinkD, + }) + + conn, err := NewFactory().CreateTracesToTraces( + context.Background(), + connectortest.NewNopSettings(), + tt.cfg, + router.(consumer.Traces), + ) + require.NoError(t, err) + + ctx := context.Background() + if tt.ctx != nil { + ctx = tt.ctx + } + + require.NoError(t, conn.ConsumeTraces(ctx, tt.input)) + + assertExpected := func(sink *consumertest.TracesSink, expected ptrace.Traces, name string) { + if expected == (ptrace.Traces{}) { + assert.Empty(t, sink.AllTraces(), name) + } else { + require.Len(t, sink.AllTraces(), 1, name) + assert.Equal(t, expected, sink.AllTraces()[0], name) + } + } + assertExpected(&sink0, tt.expectSink0, "sink0") + assertExpected(&sink1, tt.expectSink1, "sink1") + assertExpected(&sinkD, tt.expectSinkD, "sinkD") + }) + } } diff --git a/connector/servicegraphconnector/README.md b/connector/servicegraphconnector/README.md index 3d089cd18394..f521cedadbd5 100644 --- a/connector/servicegraphconnector/README.md +++ b/connector/servicegraphconnector/README.md @@ -3,12 +3,13 @@ | Status | | | ------------- |-----------| -| Distributions | [contrib] | +| Distributions | [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aconnector%2Fservicegraph%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aconnector%2Fservicegraph) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aconnector%2Fservicegraph%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aconnector%2Fservicegraph) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@jpkrohling](https://www.github.com/jpkrohling), [@mapno](https://www.github.com/mapno) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@mapno](https://www.github.com/mapno), [@JaredTan95](https://www.github.com/JaredTan95) | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s ## Supported Pipeline Types @@ -18,7 +19,7 @@ [Exporter Pipeline Type]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md#exporter-pipeline-type [Receiver Pipeline Type]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md#receiver-pipeline-type -[Stability Level]: https://github.com/open-telemetry/opentelemetry-collector#stability-levels +[Stability Level]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#stability-levels ## Overview @@ -118,7 +119,6 @@ datasources: The following settings are required: -- `metrics_exporter`: the name of the exporter that this connector will write metrics to. This exporter **must** be present in a pipeline. - `latency_histogram_buckets`: the list of durations defining the latency histogram buckets. - Default: `[2ms, 4ms, 6ms, 8ms, 10ms, 50ms, 100ms, 200ms, 400ms, 800ms, 1s, 1400ms, 2s, 5s, 10s, 15s]` - `dimensions`: the list of dimensions to add together with the default dimensions defined above. @@ -136,12 +136,16 @@ The following settings can be optionally configured: - Default: `2s` - `virtual_node_peer_attributes`: the list of attributes, ordered by priority, whose presence in a client span will result in the creation of a virtual server node. An empty list disables virtual node creation. - Default: `[peer.service, db.name, db.system]` +- `virtual_node_extra_label`: adds an extra label `virtual_node` with an optional value of `client` or `server`, indicating which node is the uninstrumented one. + - Default: `false` - `metrics_flush_interval`: the interval at which metrics are flushed to the exporter. - Default: Metrics are flushed on every received batch of traces. - `database_name_attribute`: the attribute name used to identify the database name from span attributes. - Default: `db.name` -## Example configuration +## Example configurations + +### Sample with custom buckets and dimensions ```yaml receivers: @@ -173,3 +177,38 @@ service: receivers: [servicegraph] exporters: [prometheus/servicegraph] ``` + +### Sample with options for uninstrumented services identification + +```yaml +receivers: + otlp: + protocols: + grpc: + +connectors: + servicegraph: + dimensions: + - db.system + - messaging.system + virtual_node_peer_attributes: + - db.name + - db.system + - messaging.system + - peer.service + virtual_node_extra_label: true + +exporters: + prometheus/servicegraph: + endpoint: localhost:9090 + namespace: servicegraph + +service: + pipelines: + traces: + receivers: [otlp] + exporters: [servicegraph] + metrics/servicegraph: + receivers: [servicegraph] + exporters: [prometheus/servicegraph] +``` diff --git a/connector/servicegraphconnector/config.go b/connector/servicegraphconnector/config.go index 336e7f912015..847252d8dfb4 100644 --- a/connector/servicegraphconnector/config.go +++ b/connector/servicegraphconnector/config.go @@ -9,7 +9,6 @@ import ( // Config defines the configuration options for servicegraphprocessor. type Config struct { - // MetricsExporter is the name of the metrics exporter to use to ship metrics. // // Deprecated: The exporter is defined as part of the pipeline and this option is currently noop. @@ -30,13 +29,19 @@ type Config struct { // Store contains the config for the in-memory store used to find requests between services by pairing spans. Store StoreConfig `mapstructure:"store"` + // CacheLoop is the time to cleans the cache periodically. CacheLoop time.Duration `mapstructure:"cache_loop"` + // CacheLoop is the time to expire old entries from the store periodically. StoreExpirationLoop time.Duration `mapstructure:"store_expiration_loop"` + // VirtualNodePeerAttributes the list of attributes need to match, the higher the front, the higher the priority. VirtualNodePeerAttributes []string `mapstructure:"virtual_node_peer_attributes"` + // VirtualNodeExtraLabel enables the `virtual_node` label to be added to the spans. + VirtualNodeExtraLabel bool `mapstructure:"virtual_node_extra_label"` + // MetricsFlushInterval is the interval at which metrics are flushed to the exporter. // If set to 0, metrics are flushed on every received batch of traces. MetricsFlushInterval time.Duration `mapstructure:"metrics_flush_interval"` diff --git a/connector/servicegraphconnector/config_test.go b/connector/servicegraphconnector/config_test.go index 8357c09535f8..1b8ee6d12ef0 100644 --- a/connector/servicegraphconnector/config_test.go +++ b/connector/servicegraphconnector/config_test.go @@ -22,7 +22,8 @@ func TestLoadConfig(t *testing.T) { require.NoError(t, err) factories.Connectors[metadata.Type] = NewFactory() - + // https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/33594 + // nolint:staticcheck cfg, err := otelcoltest.LoadConfigAndValidate(filepath.Join("testdata", "service-graph-connector-config.yaml"), factories) // Verify @@ -42,5 +43,4 @@ func TestLoadConfig(t *testing.T) { }, cfg.Connectors[component.NewID(metadata.Type)], ) - } diff --git a/connector/servicegraphconnector/connector.go b/connector/servicegraphconnector/connector.go index d7cf7efc5b4a..3cae81614a70 100644 --- a/connector/servicegraphconnector/connector.go +++ b/connector/servicegraphconnector/connector.go @@ -8,6 +8,7 @@ import ( "errors" "fmt" "sort" + "strconv" "strings" "sync" "time" @@ -18,17 +19,21 @@ import ( "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" "go.opentelemetry.io/collector/processor" - semconv "go.opentelemetry.io/collector/semconv/v1.13.0" + semconv "go.opentelemetry.io/collector/semconv/v1.25.0" "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/connector/servicegraphconnector/internal/metadata" "github.com/open-telemetry/opentelemetry-collector-contrib/connector/servicegraphconnector/internal/store" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil" ) const ( metricKeySeparator = string(byte(0)) clientKind = "client" serverKind = "server" + virtualNodeLabel = "virtual_node" + millisecondsUnit = "ms" + secondsUnit = "s" ) var ( @@ -260,7 +265,7 @@ func (p *serviceGraphConnector) aggregateMetrics(ctx context.Context, td ptrace. // A database request will only have one span, we don't wait for the server // span but just copy details from the client span - if dbName, ok := findAttributeValue(p.config.DatabaseNameAttribute, rAttributes, span.Attributes()); ok { + if dbName, ok := pdatautil.GetAttributeValue(p.config.DatabaseNameAttribute, rAttributes, span.Attributes()); ok { e.ConnectionType = store.Database e.ServerService = dbName e.ServerLatencySec = spanDuration(span) @@ -308,7 +313,7 @@ func (p *serviceGraphConnector) aggregateMetrics(ctx context.Context, td ptrace. func (p *serviceGraphConnector) upsertDimensions(kind string, m map[string]string, resourceAttr pcommon.Map, spanAttr pcommon.Map) { for _, dim := range p.config.Dimensions { - if v, ok := findAttributeValue(dim, resourceAttr, spanAttr); ok { + if v, ok := pdatautil.GetAttributeValue(dim, resourceAttr, spanAttr); ok { m[kind+"_"+dim] = v } } @@ -316,7 +321,7 @@ func (p *serviceGraphConnector) upsertDimensions(kind string, m map[string]strin func (p *serviceGraphConnector) upsertPeerAttributes(m []string, peers map[string]string, spanAttr pcommon.Map) { for _, s := range m { - if v, ok := findAttributeValue(s, spanAttr); ok { + if v, ok := pdatautil.GetAttributeValue(s, spanAttr); ok { peers[s] = v break } @@ -349,20 +354,30 @@ func (p *serviceGraphConnector) onExpire(e *store.Edge) { e.ConnectionType = store.VirtualNode if len(e.ClientService) == 0 && e.Key.SpanIDIsEmpty() { e.ClientService = "user" + if p.config.VirtualNodeExtraLabel { + e.VirtualNodeLabel = store.ClientVirtualNode + } p.onComplete(e) } if len(e.ServerService) == 0 { e.ServerService = p.getPeerHost(p.config.VirtualNodePeerAttributes, e.Peer) + if p.config.VirtualNodeExtraLabel { + e.VirtualNodeLabel = store.ServerVirtualNode + } p.onComplete(e) } } } func (p *serviceGraphConnector) aggregateMetricsForEdge(e *store.Edge) { - metricKey := p.buildMetricKey(e.ClientService, e.ServerService, string(e.ConnectionType), e.Dimensions) + metricKey := p.buildMetricKey(e.ClientService, e.ServerService, string(e.ConnectionType), strconv.FormatBool(e.Failed), e.Dimensions) dimensions := buildDimensions(e) + if p.config.VirtualNodeExtraLabel { + dimensions = addExtraLabel(dimensions, virtualNodeLabel, string(e.VirtualNodeLabel)) + } + p.seriesMutex.Lock() defer p.seriesMutex.Unlock() p.updateSeries(metricKey, dimensions) @@ -434,6 +449,11 @@ func buildDimensions(e *store.Edge) pcommon.Map { return dims } +func addExtraLabel(dimensions pcommon.Map, label, value string) pcommon.Map { + dimensions.PutStr(label, value) + return dimensions +} + func (p *serviceGraphConnector) buildMetrics() (pmetric.Metrics, error) { m := pmetric.NewMetrics() ilm := m.ResourceMetrics().AppendEmpty().ScopeMetrics().AppendEmpty() @@ -455,44 +475,48 @@ func (p *serviceGraphConnector) buildMetrics() (pmetric.Metrics, error) { } func (p *serviceGraphConnector) collectCountMetrics(ilm pmetric.ScopeMetrics) error { - for key, c := range p.reqTotal { + if len(p.reqTotal) > 0 { mCount := ilm.Metrics().AppendEmpty() mCount.SetName("traces_service_graph_request_total") mCount.SetEmptySum().SetIsMonotonic(true) // TODO: Support other aggregation temporalities mCount.Sum().SetAggregationTemporality(pmetric.AggregationTemporalityCumulative) - dpCalls := mCount.Sum().DataPoints().AppendEmpty() - dpCalls.SetStartTimestamp(pcommon.NewTimestampFromTime(p.startTime)) - dpCalls.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) - dpCalls.SetIntValue(c) + for key, c := range p.reqTotal { + dpCalls := mCount.Sum().DataPoints().AppendEmpty() + dpCalls.SetStartTimestamp(pcommon.NewTimestampFromTime(p.startTime)) + dpCalls.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) + dpCalls.SetIntValue(c) - dimensions, ok := p.dimensionsForSeries(key) - if !ok { - return fmt.Errorf("failed to find dimensions for key %s", key) - } + dimensions, ok := p.dimensionsForSeries(key) + if !ok { + return fmt.Errorf("failed to find dimensions for key %s", key) + } - dimensions.CopyTo(dpCalls.Attributes()) + dimensions.CopyTo(dpCalls.Attributes()) + } } - for key, c := range p.reqFailedTotal { + if len(p.reqFailedTotal) > 0 { mCount := ilm.Metrics().AppendEmpty() mCount.SetName("traces_service_graph_request_failed_total") mCount.SetEmptySum().SetIsMonotonic(true) // TODO: Support other aggregation temporalities mCount.Sum().SetAggregationTemporality(pmetric.AggregationTemporalityCumulative) - dpCalls := mCount.Sum().DataPoints().AppendEmpty() - dpCalls.SetStartTimestamp(pcommon.NewTimestampFromTime(p.startTime)) - dpCalls.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) - dpCalls.SetIntValue(c) + for key, c := range p.reqFailedTotal { + dpCalls := mCount.Sum().DataPoints().AppendEmpty() + dpCalls.SetStartTimestamp(pcommon.NewTimestampFromTime(p.startTime)) + dpCalls.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) + dpCalls.SetIntValue(c) - dimensions, ok := p.dimensionsForSeries(key) - if !ok { - return fmt.Errorf("failed to find dimensions for key %s", key) - } + dimensions, ok := p.dimensionsForSeries(key) + if !ok { + return fmt.Errorf("failed to find dimensions for key %s", key) + } - dimensions.CopyTo(dpCalls.Attributes()) + dimensions.CopyTo(dpCalls.Attributes()) + } } return nil @@ -501,10 +525,10 @@ func (p *serviceGraphConnector) collectCountMetrics(ilm pmetric.ScopeMetrics) er func (p *serviceGraphConnector) collectLatencyMetrics(ilm pmetric.ScopeMetrics) error { // TODO: Remove this once legacy metric names are removed if legacyMetricNamesFeatureGate.IsEnabled() { - return p.collectServerLatencyMetrics(ilm, "traces_service_graph_request_duration_seconds") + return p.collectServerLatencyMetrics(ilm, "traces_service_graph_request_duration") } - if err := p.collectServerLatencyMetrics(ilm, "traces_service_graph_request_server_seconds"); err != nil { + if err := p.collectServerLatencyMetrics(ilm, "traces_service_graph_request_server"); err != nil { return err } @@ -512,64 +536,74 @@ func (p *serviceGraphConnector) collectLatencyMetrics(ilm pmetric.ScopeMetrics) } func (p *serviceGraphConnector) collectClientLatencyMetrics(ilm pmetric.ScopeMetrics) error { - for key := range p.reqServerDurationSecondsCount { + if len(p.reqServerDurationSecondsCount) > 0 { mDuration := ilm.Metrics().AppendEmpty() - mDuration.SetName("traces_service_graph_request_client_seconds") + mDuration.SetName("traces_service_graph_request_client") + mDuration.SetUnit(secondsUnit) + if legacyLatencyUnitMsFeatureGate.IsEnabled() { + mDuration.SetUnit(millisecondsUnit) + } // TODO: Support other aggregation temporalities mDuration.SetEmptyHistogram().SetAggregationTemporality(pmetric.AggregationTemporalityCumulative) - timestamp := pcommon.NewTimestampFromTime(time.Now()) - dpDuration := mDuration.Histogram().DataPoints().AppendEmpty() - dpDuration.SetStartTimestamp(pcommon.NewTimestampFromTime(p.startTime)) - dpDuration.SetTimestamp(timestamp) - dpDuration.ExplicitBounds().FromRaw(p.reqDurationBounds) - dpDuration.BucketCounts().FromRaw(p.reqServerDurationSecondsBucketCounts[key]) - dpDuration.SetCount(p.reqServerDurationSecondsCount[key]) - dpDuration.SetSum(p.reqServerDurationSecondsSum[key]) + for key := range p.reqServerDurationSecondsCount { + dpDuration := mDuration.Histogram().DataPoints().AppendEmpty() + dpDuration.SetStartTimestamp(pcommon.NewTimestampFromTime(p.startTime)) + dpDuration.SetTimestamp(timestamp) + dpDuration.ExplicitBounds().FromRaw(p.reqDurationBounds) + dpDuration.BucketCounts().FromRaw(p.reqClientDurationSecondsBucketCounts[key]) + dpDuration.SetCount(p.reqClientDurationSecondsCount[key]) + dpDuration.SetSum(p.reqClientDurationSecondsSum[key]) + + // TODO: Support exemplars + dimensions, ok := p.dimensionsForSeries(key) + if !ok { + return fmt.Errorf("failed to find dimensions for key %s", key) + } - // TODO: Support exemplars - dimensions, ok := p.dimensionsForSeries(key) - if !ok { - return fmt.Errorf("failed to find dimensions for key %s", key) + dimensions.CopyTo(dpDuration.Attributes()) } - - dimensions.CopyTo(dpDuration.Attributes()) } return nil } func (p *serviceGraphConnector) collectServerLatencyMetrics(ilm pmetric.ScopeMetrics, mName string) error { - for key := range p.reqServerDurationSecondsCount { + if len(p.reqServerDurationSecondsCount) > 0 { mDuration := ilm.Metrics().AppendEmpty() mDuration.SetName(mName) + mDuration.SetUnit(secondsUnit) + if legacyLatencyUnitMsFeatureGate.IsEnabled() { + mDuration.SetUnit(millisecondsUnit) + } // TODO: Support other aggregation temporalities mDuration.SetEmptyHistogram().SetAggregationTemporality(pmetric.AggregationTemporalityCumulative) - timestamp := pcommon.NewTimestampFromTime(time.Now()) - dpDuration := mDuration.Histogram().DataPoints().AppendEmpty() - dpDuration.SetStartTimestamp(pcommon.NewTimestampFromTime(p.startTime)) - dpDuration.SetTimestamp(timestamp) - dpDuration.ExplicitBounds().FromRaw(p.reqDurationBounds) - dpDuration.BucketCounts().FromRaw(p.reqClientDurationSecondsBucketCounts[key]) - dpDuration.SetCount(p.reqClientDurationSecondsCount[key]) - dpDuration.SetSum(p.reqClientDurationSecondsSum[key]) + for key := range p.reqServerDurationSecondsCount { + dpDuration := mDuration.Histogram().DataPoints().AppendEmpty() + dpDuration.SetStartTimestamp(pcommon.NewTimestampFromTime(p.startTime)) + dpDuration.SetTimestamp(timestamp) + dpDuration.ExplicitBounds().FromRaw(p.reqDurationBounds) + dpDuration.BucketCounts().FromRaw(p.reqServerDurationSecondsBucketCounts[key]) + dpDuration.SetCount(p.reqServerDurationSecondsCount[key]) + dpDuration.SetSum(p.reqServerDurationSecondsSum[key]) + + // TODO: Support exemplars + dimensions, ok := p.dimensionsForSeries(key) + if !ok { + return fmt.Errorf("failed to find dimensions for key %s", key) + } - // TODO: Support exemplars - dimensions, ok := p.dimensionsForSeries(key) - if !ok { - return fmt.Errorf("failed to find dimensions for key %s", key) + dimensions.CopyTo(dpDuration.Attributes()) } - - dimensions.CopyTo(dpDuration.Attributes()) } return nil } -func (p *serviceGraphConnector) buildMetricKey(clientName, serverName, connectionType string, edgeDimensions map[string]string) string { +func (p *serviceGraphConnector) buildMetricKey(clientName, serverName, connectionType, failed string, edgeDimensions map[string]string) string { var metricKey strings.Builder - metricKey.WriteString(clientName + metricKeySeparator + serverName + metricKeySeparator + connectionType) + metricKey.WriteString(clientName + metricKeySeparator + serverName + metricKeySeparator + connectionType + metricKeySeparator + failed) for _, dimName := range p.config.Dimensions { dim, ok := edgeDimensions[dimName] @@ -617,7 +651,6 @@ func (p *serviceGraphConnector) cacheLoop(d time.Duration) { return } } - } // cleanCache removes series that have not been updated in 15 minutes diff --git a/connector/servicegraphconnector/connector_test.go b/connector/servicegraphconnector/connector_test.go index bad33d3c2e7e..8dba2717a06f 100644 --- a/connector/servicegraphconnector/connector_test.go +++ b/connector/servicegraphconnector/connector_test.go @@ -6,6 +6,7 @@ package servicegraphconnector import ( "context" "crypto/rand" + "runtime" "sync" "testing" "time" @@ -14,19 +15,20 @@ import ( "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/component/componenttest" - "go.opentelemetry.io/collector/config/configtelemetry" "go.opentelemetry.io/collector/connector/connectortest" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/consumer/consumertest" "go.opentelemetry.io/collector/exporter" + "go.opentelemetry.io/collector/featuregate" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" - semconv "go.opentelemetry.io/collector/semconv/v1.13.0" - sdkmetric "go.opentelemetry.io/otel/sdk/metric" + semconv "go.opentelemetry.io/collector/semconv/v1.25.0" "go.opentelemetry.io/otel/sdk/metric/metricdata" - "go.opentelemetry.io/otel/sdk/metric/metricdata/metricdatatest" "go.uber.org/zap/zaptest" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/pmetrictest" ) func TestConnectorStart(t *testing.T) { @@ -34,7 +36,7 @@ func TestConnectorStart(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig().(*Config) - procCreationParams := connectortest.NewNopCreateSettings() + procCreationParams := connectortest.NewNopSettings() traceConnector, err := factory.CreateTracesToMetrics(context.Background(), procCreationParams, cfg, consumertest.NewNop()) require.NoError(t, err) @@ -62,38 +64,152 @@ func TestConnectorShutdown(t *testing.T) { } func TestConnectorConsume(t *testing.T) { - // Prepare - cfg := &Config{ - Dimensions: []string{"some-attribute", "non-existing-attribute"}, - Store: StoreConfig{MaxItems: 10}, + for _, tc := range []struct { + name string + cfg *Config + gates []*featuregate.Gate + sampleTraces ptrace.Traces + verifyMetrics func(t *testing.T, md pmetric.Metrics) + }{ + { + name: "complete traces with client and server span", + cfg: &Config{ + Dimensions: []string{"some-attribute", "non-existing-attribute"}, + Store: StoreConfig{ + MaxItems: 10, + TTL: time.Nanosecond, + }, + }, + sampleTraces: buildSampleTrace(t, "val"), + verifyMetrics: verifyHappyCaseMetricsWithDuration(2, 1), + }, + { + name: "test fix failed label not work", + cfg: &Config{ + Store: StoreConfig{ + MaxItems: 10, + TTL: time.Nanosecond, + }, + }, + sampleTraces: getGoldenTraces(t, "testdata/failed-label-not-work-simple-trace.yaml"), + verifyMetrics: func(t *testing.T, actualMetrics pmetric.Metrics) { + expectedMetrics, err := golden.ReadMetrics("testdata/failed-label-not-work-expect-metrics.yaml") + assert.NoError(t, err) + + err = pmetrictest.CompareMetrics(expectedMetrics, actualMetrics, + pmetrictest.IgnoreMetricsOrder(), + pmetrictest.IgnoreMetricDataPointsOrder(), + pmetrictest.IgnoreStartTimestamp(), + pmetrictest.IgnoreTimestamp(), + pmetrictest.IgnoreDatapointAttributesOrder(), + ) + require.NoError(t, err) + }, + }, + { + name: "incomplete traces with virtual server span", + cfg: &Config{ + Dimensions: []string{"some-attribute", "non-existing-attribute"}, + Store: StoreConfig{ + MaxItems: 10, + TTL: time.Nanosecond, + }, + }, + sampleTraces: incompleteClientTraces(), + verifyMetrics: func(t *testing.T, md pmetric.Metrics) { + v, ok := md.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics().At(0).Sum().DataPoints().At(0).Attributes().Get("server") + assert.True(t, ok) + assert.Equal(t, "AuthTokenCache", v.Str()) + }, + }, + { + name: "incomplete traces with virtual client span", + cfg: &Config{ + Dimensions: []string{"some-attribute", "non-existing-attribute"}, + Store: StoreConfig{ + MaxItems: 10, + TTL: time.Nanosecond, + }, + }, + sampleTraces: incompleteServerTraces(false), + verifyMetrics: func(t *testing.T, md pmetric.Metrics) { + v, ok := md.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics().At(0).Sum().DataPoints().At(0).Attributes().Get("client") + assert.True(t, ok) + assert.Equal(t, "user", v.Str()) + }, + }, + { + name: "incomplete traces with client span lost", + cfg: &Config{ + Dimensions: []string{"some-attribute", "non-existing-attribute"}, + Store: StoreConfig{ + MaxItems: 10, + TTL: time.Nanosecond, + }, + }, + sampleTraces: incompleteServerTraces(true), + verifyMetrics: func(t *testing.T, md pmetric.Metrics) { + assert.Equal(t, 0, md.MetricCount()) + }, + }, + { + name: "complete traces with legacy latency metrics", + cfg: &Config{ + Dimensions: []string{"some-attribute", "non-existing-attribute"}, + Store: StoreConfig{ + MaxItems: 10, + TTL: time.Nanosecond, + }, + }, + sampleTraces: buildSampleTrace(t, "val"), + gates: []*featuregate.Gate{legacyLatencyUnitMsFeatureGate}, + verifyMetrics: verifyHappyCaseLatencyMetrics(), + }, + } { + t.Run(tc.name, func(t *testing.T) { + // Set feature gates + for _, gate := range tc.gates { + require.NoError(t, featuregate.GlobalRegistry().Set(gate.ID(), true)) + } + + // Prepare + set := componenttest.NewNopTelemetrySettings() + set.Logger = zaptest.NewLogger(t) + conn, err := newConnector(set, tc.cfg, newMockMetricsExporter()) + require.NoError(t, err) + assert.NoError(t, conn.Start(context.Background(), componenttest.NewNopHost())) + + // Send spans to the connector + assert.NoError(t, conn.ConsumeTraces(context.Background(), tc.sampleTraces)) + + // Force collection + if runtime.GOOS == "windows" { + // On Windows timing doesn't tick forward quickly for the store data to expire, force a wait before expiring. + time.Sleep(time.Second) + } + conn.store.Expire() + md, err := conn.buildMetrics() + assert.NoError(t, err) + tc.verifyMetrics(t, md) + + // Shutdown the connector + assert.NoError(t, conn.Shutdown(context.Background())) + + // Unset feature gates + for _, gate := range tc.gates { + require.NoError(t, featuregate.GlobalRegistry().Set(gate.ID(), false)) + } + }) } - - set := componenttest.NewNopTelemetrySettings() - set.Logger = zaptest.NewLogger(t) - conn, err := newConnector(set, cfg, newMockMetricsExporter()) - require.NoError(t, err) - assert.NoError(t, conn.Start(context.Background(), componenttest.NewNopHost())) - - // Test & verify - td := buildSampleTrace(t, "val") - // The assertion is part of verifyHappyCaseMetrics func. - assert.NoError(t, conn.ConsumeTraces(context.Background(), td)) - - // Force collection - conn.store.Expire() - md, err := conn.buildMetrics() - assert.NoError(t, err) - verifyHappyCaseMetrics(t, md) - - // Shutdown the connector - assert.NoError(t, conn.Shutdown(context.Background())) } -func verifyHappyCaseMetrics(t *testing.T, md pmetric.Metrics) { - verifyHappyCaseMetricsWithDuration(1)(t, md) +func getGoldenTraces(t *testing.T, file string) ptrace.Traces { + td, err := golden.ReadTraces(file) + assert.NoError(t, err) + return td } -func verifyHappyCaseMetricsWithDuration(durationSum float64) func(t *testing.T, md pmetric.Metrics) { +func verifyHappyCaseMetricsWithDuration(serverDurationSum, clientDurationSum float64) func(t *testing.T, md pmetric.Metrics) { return func(t *testing.T, md pmetric.Metrics) { assert.Equal(t, 3, md.MetricCount()) @@ -110,12 +226,19 @@ func verifyHappyCaseMetricsWithDuration(durationSum float64) func(t *testing.T, verifyCount(t, mCount) mServerDuration := ms.At(1) - assert.Equal(t, "traces_service_graph_request_server_seconds", mServerDuration.Name()) - verifyDuration(t, mServerDuration, durationSum) + assert.Equal(t, "traces_service_graph_request_server", mServerDuration.Name()) + verifyDuration(t, mServerDuration, serverDurationSum, []uint64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0}) mClientDuration := ms.At(2) - assert.Equal(t, "traces_service_graph_request_client_seconds", mClientDuration.Name()) - verifyDuration(t, mClientDuration, durationSum) + assert.Equal(t, "traces_service_graph_request_client", mClientDuration.Name()) + verifyDuration(t, mClientDuration, clientDurationSum, []uint64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}) + } +} + +func verifyHappyCaseLatencyMetrics() func(t *testing.T, md pmetric.Metrics) { + return func(t *testing.T, md pmetric.Metrics) { + verifyHappyCaseMetricsWithDuration(2000, 1000)(t, md) + verifyUnit(t, md.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics().At(1).Unit(), millisecondsUnit) } } @@ -139,16 +262,16 @@ func verifyCount(t *testing.T, m pmetric.Metric) { verifyAttr(t, attributes, "client_some-attribute", "val") } -func verifyDuration(t *testing.T, m pmetric.Metric, durationSum float64) { +func verifyDuration(t *testing.T, m pmetric.Metric, durationSum float64, bs []uint64) { assert.Equal(t, pmetric.MetricTypeHistogram, m.Type()) dps := m.Histogram().DataPoints() assert.Equal(t, 1, dps.Len()) dp := dps.At(0) - assert.Equal(t, durationSum, dp.Sum()) // Duration: 1sec + assert.Equal(t, durationSum, dp.Sum()) // Duration: client is 1sec, server is 2sec assert.Equal(t, uint64(1), dp.Count()) buckets := pcommon.NewUInt64Slice() - buckets.FromRaw([]uint64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}) + buckets.FromRaw(bs) assert.Equal(t, buckets, dp.BucketCounts()) attributes := dp.Attributes() @@ -165,9 +288,16 @@ func verifyAttr(t *testing.T, attrs pcommon.Map, k, expected string) { assert.Equal(t, expected, v.AsString()) } +func verifyUnit(t *testing.T, expected, actual string) { + assert.Equal(t, expected, actual) +} + func buildSampleTrace(t *testing.T, attrValue string) ptrace.Traces { tStart := time.Date(2022, 1, 2, 3, 4, 5, 6, time.UTC) - tEnd := time.Date(2022, 1, 2, 3, 4, 6, 6, time.UTC) + // client: 1s + cEnd := time.Date(2022, 1, 2, 3, 4, 6, 6, time.UTC) + // server: 2s + sEnd := time.Date(2022, 1, 2, 3, 4, 7, 6, time.UTC) traces := ptrace.NewTraces() @@ -192,9 +322,8 @@ func buildSampleTrace(t *testing.T, attrValue string) ptrace.Traces { clientSpan.SetTraceID(traceID) clientSpan.SetKind(ptrace.SpanKindClient) clientSpan.SetStartTimestamp(pcommon.NewTimestampFromTime(tStart)) - clientSpan.SetEndTimestamp(pcommon.NewTimestampFromTime(tEnd)) + clientSpan.SetEndTimestamp(pcommon.NewTimestampFromTime(cEnd)) clientSpan.Attributes().PutStr("some-attribute", attrValue) // Attribute selected as dimension for metrics - serverSpan := scopeSpans.Spans().AppendEmpty() serverSpan.SetName("server span") serverSpan.SetSpanID(serverSpanID) @@ -202,11 +331,58 @@ func buildSampleTrace(t *testing.T, attrValue string) ptrace.Traces { serverSpan.SetParentSpanID(clientSpanID) serverSpan.SetKind(ptrace.SpanKindServer) serverSpan.SetStartTimestamp(pcommon.NewTimestampFromTime(tStart)) - serverSpan.SetEndTimestamp(pcommon.NewTimestampFromTime(tEnd)) + serverSpan.SetEndTimestamp(pcommon.NewTimestampFromTime(sEnd)) return traces } +func incompleteClientTraces() ptrace.Traces { + tStart := time.Date(2022, 1, 2, 3, 4, 5, 6, time.UTC) + tEnd := time.Date(2022, 1, 2, 3, 4, 6, 6, time.UTC) + + traces := ptrace.NewTraces() + + resourceSpans := traces.ResourceSpans().AppendEmpty() + resourceSpans.Resource().Attributes().PutStr(semconv.AttributeServiceName, "some-client-service") + + scopeSpans := resourceSpans.ScopeSpans().AppendEmpty() + anotherTraceID := pcommon.TraceID([16]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}) + anotherClientSpanID := pcommon.SpanID([8]byte{1, 2, 3, 4, 4, 3, 2, 1}) + clientSpanNoServerSpan := scopeSpans.Spans().AppendEmpty() + clientSpanNoServerSpan.SetName("client span") + clientSpanNoServerSpan.SetSpanID(anotherClientSpanID) + clientSpanNoServerSpan.SetTraceID(anotherTraceID) + clientSpanNoServerSpan.SetKind(ptrace.SpanKindClient) + clientSpanNoServerSpan.SetStartTimestamp(pcommon.NewTimestampFromTime(tStart)) + clientSpanNoServerSpan.SetEndTimestamp(pcommon.NewTimestampFromTime(tEnd)) + clientSpanNoServerSpan.Attributes().PutStr(semconv.AttributePeerService, "AuthTokenCache") // Attribute selected as dimension for metrics + + return traces +} + +func incompleteServerTraces(withParentSpan bool) ptrace.Traces { + tStart := time.Date(2022, 1, 2, 3, 4, 5, 6, time.UTC) + tEnd := time.Date(2022, 1, 2, 3, 4, 6, 6, time.UTC) + + traces := ptrace.NewTraces() + + resourceSpans := traces.ResourceSpans().AppendEmpty() + resourceSpans.Resource().Attributes().PutStr(semconv.AttributeServiceName, "some-server-service") + scopeSpans := resourceSpans.ScopeSpans().AppendEmpty() + anotherTraceID := pcommon.TraceID([16]byte{1, 2, 3, 4, 5, 6, 7, 8, 8, 7, 6, 5, 4, 3, 2, 1}) + serverSpanNoClientSpan := scopeSpans.Spans().AppendEmpty() + serverSpanNoClientSpan.SetName("server span") + serverSpanNoClientSpan.SetSpanID([8]byte{0x19, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26}) + if withParentSpan { + serverSpanNoClientSpan.SetParentSpanID([8]byte{0x27, 0x28, 0x29, 0x30, 0x31, 0x32, 0x33, 0x34}) + } + serverSpanNoClientSpan.SetTraceID(anotherTraceID) + serverSpanNoClientSpan.SetKind(ptrace.SpanKindServer) + serverSpanNoClientSpan.SetStartTimestamp(pcommon.NewTimestampFromTime(tStart)) + serverSpanNoClientSpan.SetEndTimestamp(pcommon.NewTimestampFromTime(tEnd)) + return traces +} + var _ exporter.Metrics = (*mockMetricsExporter)(nil) func newMockMetricsExporter() *mockMetricsExporter { @@ -231,6 +407,18 @@ func (m *mockMetricsExporter) ConsumeMetrics(_ context.Context, md pmetric.Metri return nil } +// GetMetrics is the race-condition-safe way to get the metrics that have been consumed by the exporter. +func (m *mockMetricsExporter) GetMetrics() []pmetric.Metrics { + m.mtx.Lock() + defer m.mtx.Unlock() + + // Create a copy of m.md to avoid returning a reference to the original slice + mdCopy := make([]pmetric.Metrics, len(m.md)) + copy(mdCopy, m.md) + + return mdCopy +} + func TestUpdateDurationMetrics(t *testing.T) { p := serviceGraphConnector{ reqTotal: make(map[string]int64), @@ -247,13 +435,12 @@ func TestUpdateDurationMetrics(t *testing.T) { Dimensions: []string{}, }, } - metricKey := p.buildMetricKey("foo", "bar", "", map[string]string{}) + metricKey := p.buildMetricKey("foo", "bar", "", "false", map[string]string{}) testCases := []struct { caseStr string duration float64 }{ - { caseStr: "index 0 latency", duration: 0, @@ -302,7 +489,7 @@ func TestStaleSeriesCleanup(t *testing.T) { p.keyToMetric[key] = metric } p.cleanCache() - assert.Equal(t, 0, len(p.keyToMetric)) + assert.Empty(t, p.keyToMetric) // ConsumeTraces with a trace with different attribute value td = buildSampleTrace(t, "second") @@ -348,8 +535,8 @@ func TestMapsAreConsistentDuringCleanup(t *testing.T) { go p.cleanCache() // Since everything is locked, nothing has happened, so both should still have length 1 - assert.Equal(t, 1, len(p.reqTotal)) - assert.Equal(t, 1, len(p.keyToMetric)) + assert.Len(t, p.reqTotal, 1) + assert.Len(t, p.keyToMetric, 1) // Now we pretend that we have stopped collecting metrics, by unlocking seriesMutex p.seriesMutex.Unlock() @@ -362,8 +549,8 @@ func TestMapsAreConsistentDuringCleanup(t *testing.T) { // for dimensions from that series. It's important that it happens this way around, // instead of deleting it from `keyToMetric`, otherwise the metrics collector will try // and fail to find dimensions for a series that is about to be removed. - assert.Equal(t, 0, len(p.reqTotal)) - assert.Equal(t, 1, len(p.keyToMetric)) + assert.Empty(t, p.reqTotal) + assert.Len(t, p.keyToMetric, 1) p.metricMutex.RUnlock() p.seriesMutex.Unlock() @@ -372,14 +559,6 @@ func TestMapsAreConsistentDuringCleanup(t *testing.T) { assert.NoError(t, p.Shutdown(context.Background())) } -func setupTelemetry(reader *sdkmetric.ManualReader) component.TelemetrySettings { - settings := componenttest.NewNopTelemetrySettings() - settings.MetricsLevel = configtelemetry.LevelNormal - - settings.MeterProvider = sdkmetric.NewMeterProvider(sdkmetric.WithReader(reader)) - return settings -} - func TestValidateOwnTelemetry(t *testing.T) { cfg := &Config{ Dimensions: []string{"some-attribute", "non-existing-attribute"}, @@ -390,10 +569,8 @@ func TestValidateOwnTelemetry(t *testing.T) { } mockMetricsExporter := newMockMetricsExporter() - - reader := sdkmetric.NewManualReader() - set := setupTelemetry(reader) - p, err := newConnector(set, cfg, mockMetricsExporter) + set := setupTestTelemetry() + p, err := newConnector(set.NewSettings().TelemetrySettings, cfg, mockMetricsExporter) require.NoError(t, err) assert.NoError(t, p.Start(context.Background(), componenttest.NewNopHost())) @@ -407,7 +584,7 @@ func TestValidateOwnTelemetry(t *testing.T) { p.keyToMetric[key] = metric } p.cleanCache() - assert.Equal(t, 0, len(p.keyToMetric)) + assert.Empty(t, p.keyToMetric) // ConsumeTraces with a trace with different attribute value td = buildSampleTrace(t, "second") @@ -415,24 +592,150 @@ func TestValidateOwnTelemetry(t *testing.T) { // Shutdown the connector assert.NoError(t, p.Shutdown(context.Background())) - - rm := metricdata.ResourceMetrics{} - assert.NoError(t, reader.Collect(context.Background(), &rm)) - require.Len(t, rm.ScopeMetrics, 1) - sm := rm.ScopeMetrics[0] - require.Len(t, sm.Metrics, 1) - got := sm.Metrics[0] - want := metricdata.Metrics{ - Name: "connector_servicegraph_total_edges", - Description: "Total number of unique edges", - Unit: "1", - Data: metricdata.Sum[int64]{ - Temporality: metricdata.CumulativeTemporality, - IsMonotonic: true, - DataPoints: []metricdata.DataPoint[int64]{ - {Value: 2}, + set.assertMetrics(t, []metricdata.Metrics{ + { + Name: "otelcol_connector_servicegraph_total_edges", + Description: "Total number of unique edges", + Unit: "1", + Data: metricdata.Sum[int64]{ + Temporality: metricdata.CumulativeTemporality, + IsMonotonic: true, + DataPoints: []metricdata.DataPoint[int64]{ + {Value: 2}, + }, }, }, + }) + require.NoError(t, set.Shutdown(context.Background())) +} + +func TestExtraDimensionsLabels(t *testing.T) { + extraDimensions := []string{"db.system", "messaging.system"} + cfg := &Config{ + Dimensions: extraDimensions, + LatencyHistogramBuckets: []time.Duration{time.Duration(0.1 * float64(time.Second)), time.Duration(1 * float64(time.Second)), time.Duration(10 * float64(time.Second))}, + Store: StoreConfig{MaxItems: 10}, } - metricdatatest.AssertEqual(t, want, got, metricdatatest.IgnoreTimestamp()) + + set := componenttest.NewNopTelemetrySettings() + set.Logger = zaptest.NewLogger(t) + conn, err := newConnector(set, cfg, newMockMetricsExporter()) + assert.NoError(t, err) + + assert.NoError(t, conn.Start(context.Background(), componenttest.NewNopHost())) + defer require.NoError(t, conn.Shutdown(context.Background())) + + td, err := golden.ReadTraces("testdata/extra-dimensions-queue-db-trace.yaml") + assert.NoError(t, err) + assert.NoError(t, conn.ConsumeTraces(context.Background(), td)) + + conn.store.Expire() + + metrics := conn.metricsConsumer.(*mockMetricsExporter).GetMetrics() + require.Len(t, metrics, 1) + + expectedMetrics, err := golden.ReadMetrics("testdata/extra-dimensions-queue-db-expected-metrics.yaml") + assert.NoError(t, err) + + err = pmetrictest.CompareMetrics(expectedMetrics, metrics[0], + pmetrictest.IgnoreStartTimestamp(), + pmetrictest.IgnoreTimestamp(), + ) + require.NoError(t, err) +} + +func TestVirtualNodeServerLabels(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("skipping test on Windows, see https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/33836") + } + + virtualNodeDimensions := []string{"peer.service", "db.system", "messaging.system"} + cfg := &Config{ + Dimensions: virtualNodeDimensions, + LatencyHistogramBuckets: []time.Duration{time.Duration(0.1 * float64(time.Second)), time.Duration(1 * float64(time.Second)), time.Duration(10 * float64(time.Second))}, + Store: StoreConfig{MaxItems: 10}, + VirtualNodePeerAttributes: virtualNodeDimensions, + VirtualNodeExtraLabel: true, + MetricsFlushInterval: time.Millisecond, + } + + set := componenttest.NewNopTelemetrySettings() + set.Logger = zaptest.NewLogger(t) + + trace := "testdata/virtual-node-label-server-trace.yaml" + expected := "testdata/virtual-node-label-server-expected-metrics.yaml" + + conn, err := newConnector(set, cfg, newMockMetricsExporter()) + assert.NoError(t, err) + assert.NoError(t, conn.Start(context.Background(), componenttest.NewNopHost())) + + td, err := golden.ReadTraces(trace) + assert.NoError(t, err) + assert.NoError(t, conn.ConsumeTraces(context.Background(), td)) + + conn.store.Expire() + assert.Eventually(t, func() bool { + return conn.store.Len() == 0 + }, 100*time.Millisecond, 2*time.Millisecond) + require.NoError(t, conn.Shutdown(context.Background())) + + metrics := conn.metricsConsumer.(*mockMetricsExporter).GetMetrics() + require.GreaterOrEqual(t, len(metrics), 1) // Unreliable sleep-based check + + expectedMetrics, err := golden.ReadMetrics(expected) + assert.NoError(t, err) + + err = pmetrictest.CompareMetrics(expectedMetrics, metrics[0], + pmetrictest.IgnoreStartTimestamp(), + pmetrictest.IgnoreTimestamp(), + ) + require.NoError(t, err) +} + +func TestVirtualNodeClientLabels(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("skipping test on Windows, see https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/33836") + } + + virtualNodeDimensions := []string{"peer.service", "db.system", "messaging.system"} + cfg := &Config{ + Dimensions: virtualNodeDimensions, + LatencyHistogramBuckets: []time.Duration{time.Duration(0.1 * float64(time.Second)), time.Duration(1 * float64(time.Second)), time.Duration(10 * float64(time.Second))}, + Store: StoreConfig{MaxItems: 10}, + VirtualNodePeerAttributes: virtualNodeDimensions, + VirtualNodeExtraLabel: true, + MetricsFlushInterval: time.Millisecond, + } + + set := componenttest.NewNopTelemetrySettings() + set.Logger = zaptest.NewLogger(t) + + trace := "testdata/virtual-node-label-client-trace.yaml" + expected := "testdata/virtual-node-label-client-expected-metrics.yaml" + + conn, err := newConnector(set, cfg, newMockMetricsExporter()) + assert.NoError(t, err) + assert.NoError(t, conn.Start(context.Background(), componenttest.NewNopHost())) + + td, err := golden.ReadTraces(trace) + assert.NoError(t, err) + assert.NoError(t, conn.ConsumeTraces(context.Background(), td)) + + conn.store.Expire() + assert.Eventually(t, func() bool { + return conn.store.Len() == 0 + }, 100*time.Millisecond, 2*time.Millisecond) + require.NoError(t, conn.Shutdown(context.Background())) + + metrics := conn.metricsConsumer.(*mockMetricsExporter).GetMetrics() + require.GreaterOrEqual(t, len(metrics), 1) // Unreliable sleep-based check + + expectedMetrics, err := golden.ReadMetrics(expected) + assert.NoError(t, err) + + err = pmetrictest.CompareMetrics(expectedMetrics, metrics[0], + pmetrictest.IgnoreStartTimestamp(), + pmetrictest.IgnoreTimestamp(), + ) + require.NoError(t, err) } diff --git a/connector/servicegraphconnector/documentation.md b/connector/servicegraphconnector/documentation.md index 94ddc6cd78df..33c8a62e16a0 100644 --- a/connector/servicegraphconnector/documentation.md +++ b/connector/servicegraphconnector/documentation.md @@ -6,7 +6,7 @@ The following telemetry is emitted by this component. -### connector_servicegraph_dropped_spans +### otelcol_connector_servicegraph_dropped_spans Number of spans dropped when trying to add edges @@ -14,7 +14,7 @@ Number of spans dropped when trying to add edges | ---- | ----------- | ---------- | --------- | | 1 | Sum | Int | true | -### connector_servicegraph_expired_edges +### otelcol_connector_servicegraph_expired_edges Number of edges that expired before finding its matching span @@ -22,7 +22,7 @@ Number of edges that expired before finding its matching span | ---- | ----------- | ---------- | --------- | | 1 | Sum | Int | true | -### connector_servicegraph_total_edges +### otelcol_connector_servicegraph_total_edges Total number of unique edges diff --git a/connector/servicegraphconnector/factory.go b/connector/servicegraphconnector/factory.go index b9481c826ccb..b9e545e0fcfb 100644 --- a/connector/servicegraphconnector/factory.go +++ b/connector/servicegraphconnector/factory.go @@ -69,6 +69,6 @@ func createDefaultConfig() component.Config { } } -func createTracesToMetricsConnector(_ context.Context, params connector.CreateSettings, cfg component.Config, nextConsumer consumer.Metrics) (connector.Traces, error) { +func createTracesToMetricsConnector(_ context.Context, params connector.Settings, cfg component.Config, nextConsumer consumer.Metrics) (connector.Traces, error) { return newConnector(params.TelemetrySettings, cfg, nextConsumer) } diff --git a/connector/servicegraphconnector/factory_test.go b/connector/servicegraphconnector/factory_test.go index f8dd64bd766d..a20e40c2aef8 100644 --- a/connector/servicegraphconnector/factory_test.go +++ b/connector/servicegraphconnector/factory_test.go @@ -38,7 +38,7 @@ func TestNewConnector(t *testing.T) { // Prepare factory := NewFactory() - creationParams := connectortest.NewNopCreateSettings() + creationParams := connectortest.NewNopSettings() cfg := factory.CreateDefaultConfig().(*Config) cfg.LatencyHistogramBuckets = tc.latencyHistogramBuckets diff --git a/connector/servicegraphconnector/generated_component_telemetry_test.go b/connector/servicegraphconnector/generated_component_telemetry_test.go index 1c3bc9fda0f6..1e5f0c9b4ccd 100644 --- a/connector/servicegraphconnector/generated_component_telemetry_test.go +++ b/connector/servicegraphconnector/generated_component_telemetry_test.go @@ -12,6 +12,8 @@ import ( "go.opentelemetry.io/otel/sdk/metric/metricdata/metricdatatest" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/config/configtelemetry" "go.opentelemetry.io/collector/connector" "go.opentelemetry.io/collector/connector/connectortest" ) @@ -21,12 +23,18 @@ type componentTestTelemetry struct { meterProvider *sdkmetric.MeterProvider } -func (tt *componentTestTelemetry) NewCreateSettings() connector.CreateSettings { - settings := connectortest.NewNopCreateSettings() - settings.MeterProvider = tt.meterProvider - settings.ID = component.NewID(component.MustNewType("servicegraph")) +func (tt *componentTestTelemetry) NewSettings() connector.Settings { + set := connectortest.NewNopSettings() + set.ID = component.NewID(component.MustNewType("servicegraph")) + set.TelemetrySettings = tt.newTelemetrySettings() + return set +} - return settings +func (tt *componentTestTelemetry) newTelemetrySettings() component.TelemetrySettings { + set := componenttest.NewNopTelemetrySettings() + set.MeterProvider = tt.meterProvider + set.MetricsLevel = configtelemetry.LevelDetailed + return set } func setupTestTelemetry() componentTestTelemetry { diff --git a/connector/servicegraphconnector/generated_component_test.go b/connector/servicegraphconnector/generated_component_test.go index 59797fed9e8e..032249cf2cde 100644 --- a/connector/servicegraphconnector/generated_component_test.go +++ b/connector/servicegraphconnector/generated_component_test.go @@ -14,6 +14,7 @@ import ( "go.opentelemetry.io/collector/connector/connectortest" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/consumer/consumertest" + "go.opentelemetry.io/collector/pipeline" ) func TestComponentFactoryType(t *testing.T) { @@ -29,13 +30,13 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set connector.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) }{ { name: "traces_to_metrics", - createFn: func(ctx context.Context, set connector.CreateSettings, cfg component.Config) (component.Component, error) { - router := connector.NewMetricsRouter(map[component.ID]consumer.Metrics{component.NewID(component.DataTypeMetrics): consumertest.NewNop()}) + createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) { + router := connector.NewMetricsRouter(map[pipeline.ID]consumer.Metrics{pipeline.NewID(pipeline.SignalMetrics): consumertest.NewNop()}) return factory.CreateTracesToMetrics(ctx, set, cfg, router) }, }, @@ -48,21 +49,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), connectortest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), connectortest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - firstConnector, err := test.createFn(context.Background(), connectortest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + firstConnector, err := tt.createFn(context.Background(), connectortest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() require.NoError(t, err) require.NoError(t, firstConnector.Start(context.Background(), host)) require.NoError(t, firstConnector.Shutdown(context.Background())) - secondConnector, err := test.createFn(context.Background(), connectortest.NewNopCreateSettings(), cfg) + secondConnector, err := tt.createFn(context.Background(), connectortest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, secondConnector.Start(context.Background(), host)) require.NoError(t, secondConnector.Shutdown(context.Background())) diff --git a/connector/servicegraphconnector/go.mod b/connector/servicegraphconnector/go.mod index fb1aa5db839c..3816f2616136 100644 --- a/connector/servicegraphconnector/go.mod +++ b/connector/servicegraphconnector/go.mod @@ -1,23 +1,30 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/connector/servicegraphconnector -go 1.21.0 +go 1.22.0 require ( - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/connector v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/featuregate v1.9.0 - go.opentelemetry.io/collector/otelcol v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/processor v0.102.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/sdk/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/connector v0.116.0 + go.opentelemetry.io/collector/connector/connectortest v0.116.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/featuregate v1.22.0 + go.opentelemetry.io/collector/otelcol/otelcoltest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/pipeline v0.116.0 + go.opentelemetry.io/collector/processor v0.116.0 + go.opentelemetry.io/collector/semconv v0.116.0 + go.opentelemetry.io/otel/metric v1.32.0 + go.opentelemetry.io/otel/sdk/metric v1.32.0 + go.opentelemetry.io/otel/trace v1.32.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) @@ -27,74 +34,92 @@ require ( github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/ebitengine/purego v0.8.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/uuid v1.6.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/client_golang v1.19.1 // indirect + github.com/prometheus/client_golang v1.20.5 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/shirou/gopsutil/v3 v3.24.4 // indirect - github.com/shoenig/go-m1cpu v0.1.6 // indirect - github.com/spf13/cobra v1.8.0 // indirect + github.com/prometheus/common v0.61.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/shirou/gopsutil/v4 v4.24.11 // indirect + github.com/spf13/cobra v1.8.1 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect - go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/pdata/testdata v0.102.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/collector/service v0.102.0 // indirect - go.opentelemetry.io/contrib/config v0.7.0 // indirect - go.opentelemetry.io/contrib/propagators/b3 v1.27.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/bridge/opencensus v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/proto/otlp v1.2.0 // indirect + go.opentelemetry.io/collector/component/componentstatus v0.116.0 // indirect + go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0 // indirect + go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0 // indirect + go.opentelemetry.io/collector/confmap/provider/httpprovider v1.22.0 // indirect + go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.22.0 // indirect + go.opentelemetry.io/collector/connector/xconnector v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0 // indirect + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 // indirect + go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/otelcol v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/testdata v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 // indirect + go.opentelemetry.io/collector/processor/processortest v0.116.0 // indirect + go.opentelemetry.io/collector/processor/xprocessor v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/collector/service v0.116.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.6.0 // indirect + go.opentelemetry.io/contrib/config v0.10.0 // indirect + go.opentelemetry.io/contrib/propagators/b3 v1.31.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.54.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 // indirect + go.opentelemetry.io/otel/log v0.8.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.7.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - gonum.org/v1/gonum v0.15.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + gonum.org/v1/gonum v0.15.1 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) @@ -103,3 +128,11 @@ retract ( v0.76.1 v0.65.0 ) + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden => ../../pkg/golden + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest => ../../pkg/pdatatest + +replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil => ../../internal/pdatautil + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../../pkg/pdatautil diff --git a/connector/servicegraphconnector/go.sum b/connector/servicegraphconnector/go.sum index 00d8361110e2..8e83b056c81b 100644 --- a/connector/servicegraphconnector/go.sum +++ b/connector/servicegraphconnector/go.sum @@ -1,63 +1,42 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= 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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/BE= +github.com/ebitengine/purego v0.8.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= @@ -66,16 +45,20 @@ 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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= @@ -87,43 +70,37 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/prometheus/common v0.61.0 h1:3gv/GThfX0cV2lpO7gkTUwZru38mxevy90Bj8YFSRQQ= +github.com/prometheus/common v0.61.0/go.mod h1:zr29OCN/2BsJRaFwG8QOBr41D6kkchKbpeNH7pAjb/s= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= -github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= -github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= -github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= -github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= -github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/shirou/gopsutil/v4 v4.24.11 h1:WaU9xqGFKvFfsUv94SXcUPD7rCkU0vr/asVdQOBZNj8= +github.com/shirou/gopsutil/v4 v4.24.11/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/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 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= @@ -132,94 +109,154 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/confignet v0.102.0 h1:+wQevJ/iBnPxL+roY7WWnAjMxB8v4M5QrS3+0iEmauw= -go.opentelemetry.io/collector/config/confignet v0.102.0/go.mod h1:pfOrCTfSZEB6H2rKtx41/3RN4dKs+X2EKQbw3MGRh0E= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0 h1:8Ne/oL6M4kMWK0P3FKV9EduQa+1UOGyVAnFHfSo4c1A= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0/go.mod h1:Xj4Ld/RriP/Bj+5oPpaYJsLNs2wWRDN2TvzX3Lbi6+M= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0 h1:o1iKqN+oM+TZqHoGdnKw1Am2BQlIGCYbxCRzU8T3jbM= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0/go.mod h1:JpCemLtL/sXQ2Rk3Bx7OPPA7Qt/9NVH91q0bR655gSo= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0 h1:SfASE6lxXjrmYj/UibcWdOiFWvRG0zt4hJgenloEhlY= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0/go.mod h1:+Ku0Fvdb5f6e9UkfqJXAV5FaUJVxxg6Ykfx7Js8y+V4= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0 h1:GwJQTXs7pYPUv/fVf+0nBgsJdlrTuY/PfwQ/TRA/sIk= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0/go.mod h1:PGE3DcRgqYWWC2cq2hYZoET1d3Q8JZyPNmgvqXPFWEU= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0 h1:zdYZLiHHtDf4Kk9WU7mW9dW6WAXtBF54I5jmTMRJtiw= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0/go.mod h1:yFsgUM0PbUJkPlbpJfOG6da+YiF0Z80tv7YcnL3qwv4= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0 h1:Y4H+GaCQl2URp9mEJMV5CYOhw+erONqNyvtFoKQfIoA= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0/go.mod h1:g1RjfVD0gHAf/mPOIs3zBoKBeuDsN+rc5x0lZtgA8tI= -go.opentelemetry.io/collector/connector v0.102.0 h1:IvAsVfYRxP0ajmKbUovF8qugkcUtHq6RuYNtjcMa63E= -go.opentelemetry.io/collector/connector v0.102.0/go.mod h1:f4M7wZ/9+XtgTE0fivBFH3WlwntaEd0qFFA0giFkdnY= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/zpagesextension v0.102.0 h1:BPq98py8nwzaV7KAsxt4ZZAF9LiSRu7ZjHNGavFNyKo= -go.opentelemetry.io/collector/extension/zpagesextension v0.102.0/go.mod h1:P86HW3x3epDS5F4yP0gAvsZiw4xxP1OupTEx2o6UqjY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/otelcol v0.102.0 h1:HuE+ok4iUjOrmYhQBSWpG5kBTVhcA24ljPL4pBERZ5E= -go.opentelemetry.io/collector/otelcol v0.102.0/go.mod h1:w8pCRu2nM/jAkLlEAS6ccKtJv5ylUQe6Ugl98zzTfyE= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/processor v0.102.0 h1:JsjTlpBRmoSYxcu3cAbKBchOmL6aNUxLa03ZkWIqZr8= -go.opentelemetry.io/collector/processor v0.102.0/go.mod h1:IaCSDcfy75uQTaOM+LgR1bMf/bUw2eFfzn20uvWYfLQ= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/collector/service v0.102.0 h1:B5nfyQZF7eB/y+yucl9G/7VsusbXixYXWingXn7VszM= -go.opentelemetry.io/collector/service v0.102.0/go.mod h1:c+0n0DfQeCjgrdplNHYwYbG/5aupTZVYU/50nMQraoc= -go.opentelemetry.io/contrib/config v0.7.0 h1:b1rK5tGTuhhPirJiMxOcyQfZs76j2VapY6ODn3b2Dbs= -go.opentelemetry.io/contrib/config v0.7.0/go.mod h1:8tdiFd8N5etOi3XzBmAoMxplEzI3TcL8dU5rM5/xcOQ= -go.opentelemetry.io/contrib/propagators/b3 v1.27.0 h1:IjgxbomVrV9za6bRi8fWCNXENs0co37SZedQilP2hm0= -go.opentelemetry.io/contrib/propagators/b3 v1.27.0/go.mod h1:Dv9obQz25lCisDvvs4dy28UPh974CxkahRDUPsY7y9E= -go.opentelemetry.io/contrib/zpages v0.52.0 h1:MPgkMy0Cp3O5EdfVXP0ss3ujhEibysTM4eszx7E7d+E= -go.opentelemetry.io/contrib/zpages v0.52.0/go.mod h1:fqG5AFdoYru3A3DnhibVuaaEfQV2WKxE7fYE1jgDRwk= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/bridge/opencensus v1.27.0 h1:ao9aGGHd+G4YfjBpGs6vbkvt5hoC67STlJA9fCnOAcs= -go.opentelemetry.io/otel/bridge/opencensus v1.27.0/go.mod h1:uRvWtAAXzyVOST0WMPX5JHGBaAvBws+2F8PcC5gMnTk= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 h1:bFgvUr3/O4PHj3VQcFEuYKvRZJX1SJDQ+11JXuSB3/w= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0/go.mod h1:xJntEd2KL6Qdg5lwp97HMLQDVeAhrYxmzFseAMDPQ8I= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 h1:CIHWikMsN3wO+wq1Tp5VGdVRTcON+DmOJSfDjXypKOc= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0/go.mod h1:TNupZ6cxqyFEpLXAZW7On+mLFL0/g0TE3unIYL91xWc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0 h1:/jlt1Y8gXWiHG9FBx6cJaIC5hYx5Fe64nC8w5Cylt/0= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0/go.mod h1:bmToOGOBZ4hA9ghphIc1PAf66VA8KOtsuy3+ScStG20= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 h1:/0YaXu3755A/cFbtXp+21lkXgI0QE5avTWA2HjU9/WE= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0/go.mod h1:m7SFxp0/7IxmJPLIY3JhOcU9CoFzDaCPL6xxQIxhA+o= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= -go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= -go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= +go.opentelemetry.io/collector v0.116.0 h1:Dscd6Nsnc7hjFQosO0SofcPQsXRfcj5N5PjQAslnmj4= +go.opentelemetry.io/collector v0.116.0/go.mod h1:Ug2hpW0SINPmJAGVEALRlux78NTZc3YXSuh5/Q/hFrA= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0 h1:AdHaQo/GSSRLJvEFLCMHo02r+u6Ed8j0/MNz7u3noug= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0/go.mod h1:InKYEGFdkwz3H2q648kT6rMCFBhPvevIW9ZbWIY5QR4= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0 h1:upFhnU8EyPp0WMR53mJIdx+UR2EGFOr+ppYKzUCY/Vg= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0/go.mod h1:FhjMWU5nf3IctX27lVZomM5SKMyRywShRsA4/rHoBe8= +go.opentelemetry.io/collector/confmap/provider/httpprovider v1.22.0 h1:jKLicfZRiA+G/sgso26aM6Dmmva4Dx9Txk2R58+R3e8= +go.opentelemetry.io/collector/confmap/provider/httpprovider v1.22.0/go.mod h1:nZhEGDufHuZAaeVyFVz15IluXwrnQRCp+U/w7j8Lx9Y= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.22.0 h1:dkiNwLxBqeNDN5fIwtvr2GoA0I2xZB2SEdQ9ceBbJVs= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.22.0/go.mod h1:P9SxKZvim1C3K1R2j3gI+Qb4/l9MffX2sY5f9ajsk7Y= +go.opentelemetry.io/collector/connector v0.116.0 h1:0Pz8RAXH1swLeA1fiyGGQWdv0Kemz4mbq+jnmd1TACE= +go.opentelemetry.io/collector/connector v0.116.0/go.mod h1:VQiZ2yW9KhZuF0yjDbvlgrAxm7+o8KQoxHxurQWLjKU= +go.opentelemetry.io/collector/connector/connectortest v0.116.0 h1:MdttvjqdZmp0ewW5IPCEtzzYmCqxrQxsjJ5m6gMVjzA= +go.opentelemetry.io/collector/connector/connectortest v0.116.0/go.mod h1:ko7aPyvAVf6SvRhWGZdPXSyk+7zPmsSCcMq0gYPMMIQ= +go.opentelemetry.io/collector/connector/xconnector v0.116.0 h1:fFJzrRco0g7HMkhnQ+ehlvicFf58vzsCLXnfuHyQM8w= +go.opentelemetry.io/collector/connector/xconnector v0.116.0/go.mod h1:m9oCk32zX6wDciYBpy+qMQkWKtOxb0gAkEUm8+trflY= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0 h1:bXDgoiDiwFfrO5S6q1Wpe0su303CW4Qxthoy4CxG6eg= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0/go.mod h1:uFZlAPxk2+s6zk1W+u22DgxxSDugWy0QaY5kQzjNy7Q= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/extension/zpagesextension v0.116.0 h1:D0VY/ESPwkREfMaqJleGVTiCYoCs3MDipU93ywaIn68= +go.opentelemetry.io/collector/extension/zpagesextension v0.116.0/go.mod h1:MqkQSYKarMrjVSyGrAes1FBcsW6HDDPj/ouvcDvSjfk= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 h1:KKFb3u8iLk4V5GYz7eVpw8QgEdob5koX6GNEbaoDQJY= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0/go.mod h1:YyWHUWeSnRmy2CF7kPHpwJ6qkVjufbLZ8PYuY0Ph0o8= +go.opentelemetry.io/collector/otelcol v0.116.0 h1:8NoPEY2uAemwNzUcMxiZuuI8w/Ff+0p1DXXk6NVEGlk= +go.opentelemetry.io/collector/otelcol v0.116.0/go.mod h1:c/EhsBdHmC44SxhWMi7pTlYB+I6GBSJNBsj9NCwXMxM= +go.opentelemetry.io/collector/otelcol/otelcoltest v0.116.0 h1:ZNg2kFLKnreaGSMfbr74k1yEbHLxG4ZbVvSIr+XleXo= +go.opentelemetry.io/collector/otelcol/otelcoltest v0.116.0/go.mod h1:TruQJSWWiDRlSYZTcLSE0GeECJZALDw8X8dvoYXUJ+A= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 h1:PFNy+Il/kqPdPL9rhG+1kG63Aauya+FhBKGXoB6ivxU= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0/go.mod h1:bVn9V4TGyeXi58/JDkeXCuKtc+V+qcOoTl8hNpV0qa8= +go.opentelemetry.io/collector/processor v0.116.0 h1:Kyu4tPzTdWNHtZjcxvI/bGNAgyv8L8Kem2r/Mk4IDAw= +go.opentelemetry.io/collector/processor v0.116.0/go.mod h1:+/Ugy48RAxlZEXmN2cw51W8t5wdHS9No+GAoP+moskk= +go.opentelemetry.io/collector/processor/processortest v0.116.0 h1:+IqNEVEE0E2MsO2g7+Y/9dz35sDuvAXRXrLts9NdXrA= +go.opentelemetry.io/collector/processor/processortest v0.116.0/go.mod h1:DLaQDBxzgeeaUO0ULMn/efos9PmHZkmYCHuxwCsiVHI= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0 h1:iin/UwuWvSLB7ZNfINFUYbZ5lxIi1NjZ2brkyyFdiRA= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0/go.mod h1:cnA43/XpKDbaOmd8buqKp/LGJ2l/OoCqbR//u5DMfn8= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/collector/service v0.116.0 h1:1rFmax3ILOlQq4bW//0VKRcG/HmN2rxrgfTybn6bisU= +go.opentelemetry.io/collector/service v0.116.0/go.mod h1:CzQzj72mWr5arag+q8uUWGRuUkenNo5Gw9oA97SFZ78= +go.opentelemetry.io/contrib/bridges/otelzap v0.6.0 h1:j8icMXyyqNf6HGuwlYhniPnVsbJIq7n+WirDu3VAJdQ= +go.opentelemetry.io/contrib/bridges/otelzap v0.6.0/go.mod h1:evIOZpl+kAlU5IsaYX2Siw+IbpacAZvXemVsgt70uvw= +go.opentelemetry.io/contrib/config v0.10.0 h1:2JknAzMaYjxrHkTnZh3eOme/Y2P5eHE2SWfhfV6Xd6c= +go.opentelemetry.io/contrib/config v0.10.0/go.mod h1:aND2M6/KfNkntI5cyvHriR/zvZgPf8j9yETdSmvpfmc= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/contrib/propagators/b3 v1.31.0 h1:PQPXYscmwbCp76QDvO4hMngF2j8Bx/OTV86laEl8uqo= +go.opentelemetry.io/contrib/propagators/b3 v1.31.0/go.mod h1:jbqfV8wDdqSDrAYxVpXQnpM0XFMq2FtDesblJ7blOwQ= +go.opentelemetry.io/contrib/zpages v0.56.0 h1:W7vP6s3juzL5KiHpr41zLNmsJ0QAZudYu8ay0zGAoko= +go.opentelemetry.io/contrib/zpages v0.56.0/go.mod h1:IxPRP4TYHw9jLeaEOSDIiA9zmyJNZNO6sbW55iMvSXs= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 h1:mMOmtYie9Fx6TSVzw4W+NTpvoaS1JWWga37oI1a/4qQ= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0/go.mod h1:yy7nDsMMBUkD+jeekJ36ur5f3jJIrmCwUrY67VFhNpA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 h1:j7ZSD+5yn+lo3sGV69nW04rRR0jhYnBwjuX3r0HvnK0= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0/go.mod h1:WXbYJTUaZXAbYd8lbgGuvih0yuCfOFC5RJoYnoLcGz8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 h1:t/Qur3vKSkUCcDVaSumWF2PKHt85pc7fRvFuoVT8qFU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0/go.mod h1:Rl61tySSdcOJWoEgYZVtmnKdA0GeKrSqkHC1t+91CH8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 h1:K0XaT3DwHAcV4nKLzcQvwAgSyisUghWoY20I7huthMk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0/go.mod h1:B5Ki776z/MBnVha1Nzwp5arlzBbE3+1jk+pGmaP5HME= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy03iVTXP6ffeN2iXrxfGsZGCjVx0/4KlizjyBwU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0/go.mod h1:TMu73/k1CP8nBUpDLc71Wj/Kf7ZS9FK5b53VapRsP9o= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 h1:lUsI2TYsQw2r1IASwoROaCnjdj2cvC2+Jbxvk6nHnWU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0/go.mod h1:2HpZxxQurfGxJlJDblybejHB6RX6pmExPNe517hREw4= +go.opentelemetry.io/otel/exporters/prometheus v0.54.0 h1:rFwzp68QMgtzu9PgP3jm9XaMICI6TsofWWPcBDKwlsU= +go.opentelemetry.io/otel/exporters/prometheus v0.54.0/go.mod h1:QyjcV9qDP6VeK5qPyKETvNjmaaEc7+gqjh4SS0ZYzDU= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 h1:TwmL3O3fRR80m8EshBrd8YydEZMcUCsZXzOUlnFohwM= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0/go.mod h1:tH98dDv5KPmPThswbXA0fr0Lwfs+OhK8HgaCo7PjRrk= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 h1:SZmDnHcgp3zwlPBS2JX2urGYe/jBKEIT6ZedHRUyCz8= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0/go.mod h1:fdWW0HtZJ7+jNpTKUR0GpMEDP69nR8YBJQxNiVCE3jk= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 h1:UGZ1QwZWY67Z6BmckTU+9Rxn04m2bD3gD6Mk0OIOCPk= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0/go.mod h1:fcwWuDuaObkkChiDlhEpSq9+X1C0omv+s5mBtToAQ64= +go.opentelemetry.io/otel/log v0.8.0 h1:egZ8vV5atrUWUbnSsHn6vB8R21G2wrKqNiDt3iWertk= +go.opentelemetry.io/otel/log v0.8.0/go.mod h1:M9qvDdUTRCopJcGRKg57+JSQ9LgLBrwwfC32epk5NX8= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/log v0.7.0 h1:dXkeI2S0MLc5g0/AwxTZv6EUEjctiH8aG14Am56NTmQ= +go.opentelemetry.io/otel/sdk/log v0.7.0/go.mod h1:oIRXpW+WD6M8BuGj5rtS0aRu/86cbDV/dAfNaZBIjYM= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -229,32 +266,19 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -262,18 +286,13 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -281,40 +300,18 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= -gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 h1:P8OJ/WCl/Xo4E4zoe4/bifHpSmmKwARqyqE4nW6J2GQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= +gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/connector/servicegraphconnector/internal/metadata/generated_status.go b/connector/servicegraphconnector/internal/metadata/generated_status.go index 96c20cba0598..3ba037b63ff9 100644 --- a/connector/servicegraphconnector/internal/metadata/generated_status.go +++ b/connector/servicegraphconnector/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("servicegraph") + Type = component.MustNewType("servicegraph") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/connector/servicegraphconnector" ) const ( diff --git a/connector/servicegraphconnector/internal/metadata/generated_telemetry.go b/connector/servicegraphconnector/internal/metadata/generated_telemetry.go index 3824bade1c10..7fd54dd4faf4 100644 --- a/connector/servicegraphconnector/internal/metadata/generated_telemetry.go +++ b/connector/servicegraphconnector/internal/metadata/generated_telemetry.go @@ -14,65 +14,66 @@ import ( ) func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/servicegraph") + return settings.MeterProvider.Meter("github.com/open-telemetry/opentelemetry-collector-contrib/connector/servicegraphconnector") } func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/servicegraph") + return settings.TracerProvider.Tracer("github.com/open-telemetry/opentelemetry-collector-contrib/connector/servicegraphconnector") } // TelemetryBuilder provides an interface for components to report telemetry // as defined in metadata and user config. type TelemetryBuilder struct { + meter metric.Meter ConnectorServicegraphDroppedSpans metric.Int64Counter ConnectorServicegraphExpiredEdges metric.Int64Counter ConnectorServicegraphTotalEdges metric.Int64Counter - level configtelemetry.Level } -// telemetryBuilderOption applies changes to default builder. -type telemetryBuilderOption func(*TelemetryBuilder) +// TelemetryBuilderOption applies changes to default builder. +type TelemetryBuilderOption interface { + apply(*TelemetryBuilder) +} -// WithLevel sets the current telemetry level for the component. -func WithLevel(lvl configtelemetry.Level) telemetryBuilderOption { - return func(builder *TelemetryBuilder) { - builder.level = lvl - } +type telemetryBuilderOptionFunc func(mb *TelemetryBuilder) + +func (tbof telemetryBuilderOptionFunc) apply(mb *TelemetryBuilder) { + tbof(mb) } // NewTelemetryBuilder provides a struct with methods to update all internal telemetry // for a component -func NewTelemetryBuilder(settings component.TelemetrySettings, options ...telemetryBuilderOption) (*TelemetryBuilder, error) { - builder := TelemetryBuilder{level: configtelemetry.LevelBasic} +func NewTelemetryBuilder(settings component.TelemetrySettings, options ...TelemetryBuilderOption) (*TelemetryBuilder, error) { + builder := TelemetryBuilder{} for _, op := range options { - op(&builder) - } - var ( - err, errs error - meter metric.Meter - ) - if builder.level >= configtelemetry.LevelBasic { - meter = Meter(settings) - } else { - meter = noop.Meter{} + op.apply(&builder) } - builder.ConnectorServicegraphDroppedSpans, err = meter.Int64Counter( - "connector_servicegraph_dropped_spans", + builder.meter = Meter(settings) + var err, errs error + builder.ConnectorServicegraphDroppedSpans, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_connector_servicegraph_dropped_spans", metric.WithDescription("Number of spans dropped when trying to add edges"), metric.WithUnit("1"), ) errs = errors.Join(errs, err) - builder.ConnectorServicegraphExpiredEdges, err = meter.Int64Counter( - "connector_servicegraph_expired_edges", + builder.ConnectorServicegraphExpiredEdges, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_connector_servicegraph_expired_edges", metric.WithDescription("Number of edges that expired before finding its matching span"), metric.WithUnit("1"), ) errs = errors.Join(errs, err) - builder.ConnectorServicegraphTotalEdges, err = meter.Int64Counter( - "connector_servicegraph_total_edges", + builder.ConnectorServicegraphTotalEdges, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_connector_servicegraph_total_edges", metric.WithDescription("Total number of unique edges"), metric.WithUnit("1"), ) errs = errors.Join(errs, err) return &builder, errs } + +func getLeveledMeter(meter metric.Meter, cfgLevel, srvLevel configtelemetry.Level) metric.Meter { + if cfgLevel <= srvLevel { + return meter + } + return noop.Meter{} +} diff --git a/connector/servicegraphconnector/internal/metadata/generated_telemetry_test.go b/connector/servicegraphconnector/internal/metadata/generated_telemetry_test.go index 036ffe13a71d..ce3ddb673243 100644 --- a/connector/servicegraphconnector/internal/metadata/generated_telemetry_test.go +++ b/connector/servicegraphconnector/internal/metadata/generated_telemetry_test.go @@ -14,6 +14,7 @@ import ( nooptrace "go.opentelemetry.io/otel/trace/noop" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" ) type mockMeter struct { @@ -49,28 +50,25 @@ func TestProviders(t *testing.T) { meter := Meter(set) if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/servicegraph", m.name) + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/connector/servicegraphconnector", m.name) } else { require.Fail(t, "returned Meter not mockMeter") } tracer := Tracer(set) if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/servicegraph", m.name) + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/connector/servicegraphconnector", m.name) } else { require.Fail(t, "returned Meter not mockTracer") } } func TestNewTelemetryBuilder(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } + set := componenttest.NewNopTelemetrySettings() applied := false - _, err := NewTelemetryBuilder(set, func(b *TelemetryBuilder) { + _, err := NewTelemetryBuilder(set, telemetryBuilderOptionFunc(func(b *TelemetryBuilder) { applied = true - }) + })) require.NoError(t, err) require.True(t, applied) } diff --git a/connector/servicegraphconnector/internal/store/edge.go b/connector/servicegraphconnector/internal/store/edge.go index 456a9b6d1f72..3bd9ed61ef08 100644 --- a/connector/servicegraphconnector/internal/store/edge.go +++ b/connector/servicegraphconnector/internal/store/edge.go @@ -18,6 +18,14 @@ const ( VirtualNode ConnectionType = "virtual_node" ) +type VirtualNodeLabel string + +const ( + UnknownVirtualNode VirtualNodeLabel = "" + ClientVirtualNode VirtualNodeLabel = "client" + ServerVirtualNode VirtualNodeLabel = "server" +) + // Edge is an Edge between two nodes in the graph type Edge struct { Key Key @@ -37,7 +45,11 @@ type Edge struct { // expiration is the time at which the Edge expires, expressed as Unix time expiration time.Time + // Peer is a map of peer attributes to be used for virtual node matching Peer map[string]string + + // VirtualNodeLabel is an optional label to be added to the spans + VirtualNodeLabel VirtualNodeLabel } func newEdge(key Key, ttl time.Duration) *Edge { diff --git a/connector/servicegraphconnector/internal/store/store.go b/connector/servicegraphconnector/internal/store/store.go index c2c4fee7a389..3c095703984d 100644 --- a/connector/servicegraphconnector/internal/store/store.go +++ b/connector/servicegraphconnector/internal/store/store.go @@ -12,9 +12,7 @@ import ( "go.opentelemetry.io/collector/pdata/pcommon" ) -var ( - ErrTooManyItems = errors.New("too many items") -) +var ErrTooManyItems = errors.New("too many items") type Callback func(e *Edge) @@ -61,8 +59,8 @@ func NewStore(ttl time.Duration, maxItems int, onComplete, onExpire Callback) *S return s } -// len is only used for testing. -func (s *Store) len() int { +// Len is only used for testing. +func (s *Store) Len() int { return s.l.Len() } diff --git a/connector/servicegraphconnector/internal/store/store_test.go b/connector/servicegraphconnector/internal/store/store_test.go index df9f9acec943..c4cb02a398c7 100644 --- a/connector/servicegraphconnector/internal/store/store_test.go +++ b/connector/servicegraphconnector/internal/store/store_test.go @@ -23,15 +23,15 @@ func TestStoreUpsertEdge(t *testing.T) { var onExpireCount int s := NewStore(time.Hour, 1, countingCallback(&onCompletedCount), countingCallback(&onExpireCount)) - assert.Equal(t, 0, s.len()) + assert.Equal(t, 0, s.Len()) // Insert first half of an edge isNew, err := s.UpsertEdge(key, func(e *Edge) { e.ClientService = clientService }) require.NoError(t, err) - require.Equal(t, true, isNew) - assert.Equal(t, 1, s.len()) + require.True(t, isNew) + assert.Equal(t, 1, s.Len()) // Nothing should be evicted as TTL is set to 1h assert.False(t, s.tryEvictHead()) @@ -44,9 +44,9 @@ func TestStoreUpsertEdge(t *testing.T) { e.ServerService = "server" }) require.NoError(t, err) - require.Equal(t, false, isNew) + require.False(t, isNew) // Edge is complete and should have been removed - assert.Equal(t, 0, s.len()) + assert.Equal(t, 0, s.Len()) assert.Equal(t, 1, onCompletedCount) assert.Equal(t, 0, onExpireCount) @@ -57,13 +57,13 @@ func TestStoreUpsertEdge(t *testing.T) { e.expiration = time.UnixMicro(0) }) require.NoError(t, err) - require.Equal(t, true, isNew) - assert.Equal(t, 1, s.len()) + require.True(t, isNew) + assert.Equal(t, 1, s.Len()) assert.Equal(t, 1, onCompletedCount) assert.Equal(t, 0, onExpireCount) assert.True(t, s.tryEvictHead()) - assert.Equal(t, 0, s.len()) + assert.Equal(t, 0, s.Len()) assert.Equal(t, 1, onCompletedCount) assert.Equal(t, 1, onExpireCount) } @@ -74,27 +74,27 @@ func TestStoreUpsertEdge_errTooManyItems(t *testing.T) { var onCallbackCounter int s := NewStore(time.Hour, 1, countingCallback(&onCallbackCounter), countingCallback(&onCallbackCounter)) - assert.Equal(t, 0, s.len()) + assert.Equal(t, 0, s.Len()) isNew, err := s.UpsertEdge(key1, func(e *Edge) { e.ClientService = clientService }) require.NoError(t, err) - require.Equal(t, true, isNew) - assert.Equal(t, 1, s.len()) + require.True(t, isNew) + assert.Equal(t, 1, s.Len()) _, err = s.UpsertEdge(key2, func(e *Edge) { e.ClientService = clientService }) require.ErrorIs(t, err, ErrTooManyItems) - assert.Equal(t, 1, s.len()) + assert.Equal(t, 1, s.Len()) isNew, err = s.UpsertEdge(key1, func(e *Edge) { e.ClientService = clientService }) require.NoError(t, err) - require.Equal(t, false, isNew) - assert.Equal(t, 1, s.len()) + require.False(t, isNew) + assert.Equal(t, 1, s.Len()) assert.Equal(t, 0, onCallbackCounter) } @@ -120,11 +120,11 @@ func TestStoreExpire(t *testing.T) { for key := range keys { isNew, err := s.UpsertEdge(key, noopCallback) require.NoError(t, err) - require.Equal(t, true, isNew) + require.True(t, isNew) } s.Expire() - assert.Equal(t, 0, s.len()) + assert.Equal(t, 0, s.Len()) assert.Equal(t, 0, onCompletedCount) assert.Equal(t, testSize, onExpireCount) } diff --git a/connector/servicegraphconnector/metadata.yaml b/connector/servicegraphconnector/metadata.yaml index 37ea711c1658..98a16f3883b3 100644 --- a/connector/servicegraphconnector/metadata.yaml +++ b/connector/servicegraphconnector/metadata.yaml @@ -1,13 +1,12 @@ type: servicegraph -scope_name: otelcol/servicegraph status: class: connector stability: alpha: [traces_to_metrics] - distributions: [contrib] + distributions: [contrib, k8s] codeowners: - active: [jpkrohling, mapno] + active: [mapno, JaredTan95] tests: config: @@ -16,21 +15,21 @@ telemetry: metrics: connector_servicegraph_dropped_spans: description: Number of spans dropped when trying to add edges - unit: 1 + unit: "1" enabled: true sum: value_type: int monotonic: true connector_servicegraph_total_edges: description: Total number of unique edges - unit: 1 + unit: "1" enabled: true sum: value_type: int monotonic: true connector_servicegraph_expired_edges: description: Number of edges that expired before finding its matching span - unit: 1 + unit: "1" enabled: true sum: value_type: int diff --git a/connector/servicegraphconnector/testdata/extra-dimensions-queue-db-expected-metrics.yaml b/connector/servicegraphconnector/testdata/extra-dimensions-queue-db-expected-metrics.yaml new file mode 100644 index 000000000000..cf030bca2ddb --- /dev/null +++ b/connector/servicegraphconnector/testdata/extra-dimensions-queue-db-expected-metrics.yaml @@ -0,0 +1,107 @@ +resourceMetrics: + - resource: {} + scopeMetrics: + - metrics: + - name: traces_service_graph_request_total + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "1" + attributes: + - key: client + value: + stringValue: foo-server + - key: client_messaging.system + value: + stringValue: kafka + - key: connection_type + value: + stringValue: "" + - key: failed + value: + boolValue: false + - key: server + value: + stringValue: bar-requester + - key: server_db.system + value: + stringValue: postgresql + startTimeUnixNano: "1000000" + timeUnixNano: "2000000" + isMonotonic: true + - histogram: + aggregationTemporality: 2 + dataPoints: + - attributes: + - key: client + value: + stringValue: foo-server + - key: client_messaging.system + value: + stringValue: kafka + - key: connection_type + value: + stringValue: "" + - key: failed + value: + boolValue: false + - key: server + value: + stringValue: bar-requester + - key: server_db.system + value: + stringValue: postgresql + bucketCounts: + - "1" + - "0" + - "0" + - "0" + count: "1" + explicitBounds: + - 0.1 + - 1 + - 10 + startTimeUnixNano: "1000000" + sum: 1e-06 + timeUnixNano: "2000000" + name: traces_service_graph_request_server + unit: s + - histogram: + aggregationTemporality: 2 + dataPoints: + - attributes: + - key: client + value: + stringValue: foo-server + - key: client_messaging.system + value: + stringValue: kafka + - key: connection_type + value: + stringValue: "" + - key: failed + value: + boolValue: false + - key: server + value: + stringValue: bar-requester + - key: server_db.system + value: + stringValue: postgresql + bucketCounts: + - "1" + - "0" + - "0" + - "0" + count: "1" + explicitBounds: + - 0.1 + - 1 + - 10 + startTimeUnixNano: "1000000" + sum: 1e-06 + timeUnixNano: "2000000" + name: traces_service_graph_request_client + unit: s + scope: + name: traces_service_graph diff --git a/connector/servicegraphconnector/testdata/extra-dimensions-queue-db-trace.yaml b/connector/servicegraphconnector/testdata/extra-dimensions-queue-db-trace.yaml new file mode 100644 index 000000000000..a4a12960c146 --- /dev/null +++ b/connector/servicegraphconnector/testdata/extra-dimensions-queue-db-trace.yaml @@ -0,0 +1,41 @@ +resourceSpans: + - resource: + attributes: + - key: service.name + value: + stringValue: foo-server + scopeSpans: + - scope: + name: foo-server + spans: + - traceId: a0000000000000000000000000000000 + spanId: a000000000000000 + name: server + kind: 3 + startTimeUnixNano: "1800000000000000000" + endTimeUnixNano: "1800000000000001000" + parentSpanId: "" + attributes: + - key: messaging.system + value: + stringValue: kafka + - resource: + attributes: + - key: service.name + value: + stringValue: bar-requester + scopeSpans: + - scope: + name: opentelemetry/instrumentation-net + spans: + - traceId: a0000000000000000000000000000000 + spanId: a000000000000001 + name: "HTTP GET /ready" + kind: 2 + startTimeUnixNano: "1800000000000000000" + endTimeUnixNano: "1800000000000001000" + parentSpanId: "a000000000000000" + attributes: + - key: db.system + value: + stringValue: postgresql diff --git a/connector/servicegraphconnector/testdata/failed-label-not-work-expect-metrics.yaml b/connector/servicegraphconnector/testdata/failed-label-not-work-expect-metrics.yaml new file mode 100644 index 000000000000..7012b3020524 --- /dev/null +++ b/connector/servicegraphconnector/testdata/failed-label-not-work-expect-metrics.yaml @@ -0,0 +1,282 @@ +resourceMetrics: + - resource: {} + scopeMetrics: + - metrics: + - name: traces_service_graph_request_total + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "2" + attributes: + - key: client + value: + stringValue: foo + - key: connection_type + value: + stringValue: "" + - key: failed + value: + boolValue: false + - key: server + value: + stringValue: bar + startTimeUnixNano: "1000000" + timeUnixNano: "2000000" + - asInt: "1" + attributes: + - key: client + value: + stringValue: foo + - key: connection_type + value: + stringValue: "" + - key: failed + value: + boolValue: true + - key: server + value: + stringValue: bar + startTimeUnixNano: "1000000" + timeUnixNano: "2000000" + isMonotonic: true + - name: traces_service_graph_request_failed_total + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "1" + attributes: + - key: client + value: + stringValue: foo + - key: connection_type + value: + stringValue: "" + - key: failed + value: + boolValue: true + - key: server + value: + stringValue: bar + startTimeUnixNano: "1000000" + timeUnixNano: "2000000" + isMonotonic: true + - histogram: + aggregationTemporality: 2 + dataPoints: + - attributes: + - key: client + value: + stringValue: foo + - key: connection_type + value: + stringValue: "" + - key: failed + value: + boolValue: false + - key: server + value: + stringValue: bar + bucketCounts: + - "0" + - "0" + - "0" + - "0" + - "0" + - "0" + - "0" + - "0" + - "0" + - "0" + - "2" + - "0" + - "0" + - "0" + - "0" + - "0" + - "0" + count: "2" + explicitBounds: + - 0.002 + - 0.004 + - 0.006 + - 0.008 + - 0.01 + - 0.05 + - 0.1 + - 0.2 + - 0.4 + - 0.8 + - 1 + - 1.4 + - 2 + - 5 + - 10 + - 15 + startTimeUnixNano: "1000000" + sum: 2 + timeUnixNano: "2000000" + - attributes: + - key: client + value: + stringValue: foo + - key: connection_type + value: + stringValue: "" + - key: failed + value: + boolValue: true + - key: server + value: + stringValue: bar + bucketCounts: + - "0" + - "0" + - "0" + - "0" + - "0" + - "0" + - "0" + - "0" + - "0" + - "0" + - "1" + - "0" + - "0" + - "0" + - "0" + - "0" + - "0" + count: "1" + explicitBounds: + - 0.002 + - 0.004 + - 0.006 + - 0.008 + - 0.01 + - 0.05 + - 0.1 + - 0.2 + - 0.4 + - 0.8 + - 1 + - 1.4 + - 2 + - 5 + - 10 + - 15 + startTimeUnixNano: "1000000" + sum: 1 + timeUnixNano: "2000000" + name: traces_service_graph_request_server + unit: s + - histogram: + aggregationTemporality: 2 + dataPoints: + - attributes: + - key: client + value: + stringValue: foo + - key: connection_type + value: + stringValue: "" + - key: failed + value: + boolValue: false + - key: server + value: + stringValue: bar + bucketCounts: + - "0" + - "0" + - "0" + - "0" + - "0" + - "0" + - "0" + - "0" + - "0" + - "0" + - "2" + - "0" + - "0" + - "0" + - "0" + - "0" + - "0" + count: "2" + explicitBounds: + - 0.002 + - 0.004 + - 0.006 + - 0.008 + - 0.01 + - 0.05 + - 0.1 + - 0.2 + - 0.4 + - 0.8 + - 1 + - 1.4 + - 2 + - 5 + - 10 + - 15 + startTimeUnixNano: "1000000" + sum: 2 + timeUnixNano: "2000000" + - attributes: + - key: client + value: + stringValue: foo + - key: connection_type + value: + stringValue: "" + - key: failed + value: + boolValue: true + - key: server + value: + stringValue: bar + bucketCounts: + - "0" + - "0" + - "0" + - "0" + - "0" + - "0" + - "0" + - "0" + - "0" + - "0" + - "1" + - "0" + - "0" + - "0" + - "0" + - "0" + - "0" + count: "1" + explicitBounds: + - 0.002 + - 0.004 + - 0.006 + - 0.008 + - 0.01 + - 0.05 + - 0.1 + - 0.2 + - 0.4 + - 0.8 + - 1 + - 1.4 + - 2 + - 5 + - 10 + - 15 + startTimeUnixNano: "1000000" + sum: 1 + timeUnixNano: "2000000" + name: traces_service_graph_request_client + unit: s + scope: + name: traces_service_graph diff --git a/connector/servicegraphconnector/testdata/failed-label-not-work-simple-trace.yaml b/connector/servicegraphconnector/testdata/failed-label-not-work-simple-trace.yaml new file mode 100644 index 000000000000..63ee176afa57 --- /dev/null +++ b/connector/servicegraphconnector/testdata/failed-label-not-work-simple-trace.yaml @@ -0,0 +1,66 @@ +resourceSpans: + - resource: + attributes: + - key: service.name + value: + stringValue: foo + scopeSpans: + - scope: {} + spans: + - endTimeUnixNano: "1641092646000000006" + kind: 3 + name: client span + parentSpanId: "" + spanId: 83c55286956529e1 + startTimeUnixNano: "1641092645000000006" + status: {} + traceId: b3a53e9c2ac533afc48b511c2f368dc1 + - endTimeUnixNano: "1641092646000000006" + kind: 3 + name: client span + parentSpanId: "" + spanId: bd57fe885dbc995d + startTimeUnixNano: "1641092645000000006" + status: {} + traceId: c6aafb2dcf4d71c81ae52e50e8f805ee + - endTimeUnixNano: "1641092646000000006" + kind: 3 + name: client span + parentSpanId: "" + spanId: 9ceb481d4fb78ea7 + startTimeUnixNano: "1641092645000000006" + status: {} + traceId: 7af657de319d6a57967bc241882ea94f + - resource: + attributes: + - key: service.name + value: + stringValue: bar + scopeSpans: + - scope: {} + spans: + - endTimeUnixNano: "1641092646000000006" + kind: 2 + name: server span + parentSpanId: 83c55286956529e1 + spanId: 4ec10b829444ffc8 + startTimeUnixNano: "1641092645000000006" + status: {} + traceId: b3a53e9c2ac533afc48b511c2f368dc1 + - endTimeUnixNano: "1641092646000000006" + kind: 2 + name: server span + parentSpanId: bd57fe885dbc995d + spanId: "" + startTimeUnixNano: "1641092645000000006" + status: + code: 2 + traceId: c6aafb2dcf4d71c81ae52e50e8f805ee + - endTimeUnixNano: "1641092646000000006" + kind: 2 + name: server span + parentSpanId: 9ceb481d4fb78ea7 + spanId: 328a31133be32867 + startTimeUnixNano: "1641092645000000006" + status: {} + traceId: 7af657de319d6a57967bc241882ea94f diff --git a/connector/servicegraphconnector/testdata/virtual-node-label-client-expected-metrics.yaml b/connector/servicegraphconnector/testdata/virtual-node-label-client-expected-metrics.yaml new file mode 100644 index 000000000000..43d39a40b5cf --- /dev/null +++ b/connector/servicegraphconnector/testdata/virtual-node-label-client-expected-metrics.yaml @@ -0,0 +1,107 @@ +resourceMetrics: + - resource: {} + scopeMetrics: + - metrics: + - name: traces_service_graph_request_total + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "1" + attributes: + - key: client + value: + stringValue: user + - key: connection_type + value: + stringValue: virtual_node + - key: failed + value: + boolValue: false + - key: server + value: + stringValue: bar-requester + - key: server_peer.service + value: + stringValue: external-platform + - key: virtual_node + value: + stringValue: client + startTimeUnixNano: "1000000" + timeUnixNano: "2000000" + isMonotonic: true + - histogram: + aggregationTemporality: 2 + dataPoints: + - attributes: + - key: client + value: + stringValue: user + - key: connection_type + value: + stringValue: virtual_node + - key: failed + value: + boolValue: false + - key: server + value: + stringValue: bar-requester + - key: server_peer.service + value: + stringValue: external-platform + - key: virtual_node + value: + stringValue: client + bucketCounts: + - "1" + - "0" + - "0" + - "0" + count: "1" + explicitBounds: + - 0.1 + - 1 + - 10 + startTimeUnixNano: "1000000" + sum: 1e-06 + timeUnixNano: "2000000" + name: traces_service_graph_request_server + unit: s + - histogram: + aggregationTemporality: 2 + dataPoints: + - attributes: + - key: client + value: + stringValue: user + - key: connection_type + value: + stringValue: virtual_node + - key: failed + value: + boolValue: false + - key: server + value: + stringValue: bar-requester + - key: server_peer.service + value: + stringValue: external-platform + - key: virtual_node + value: + stringValue: client + bucketCounts: + - "1" + - "0" + - "0" + - "0" + count: "1" + explicitBounds: + - 0.1 + - 1 + - 10 + startTimeUnixNano: "1000000" + sum: 0 + timeUnixNano: "2000000" + name: traces_service_graph_request_client + unit: s + scope: + name: traces_service_graph diff --git a/connector/servicegraphconnector/testdata/virtual-node-label-client-trace.yaml b/connector/servicegraphconnector/testdata/virtual-node-label-client-trace.yaml new file mode 100644 index 000000000000..0cf55434d55b --- /dev/null +++ b/connector/servicegraphconnector/testdata/virtual-node-label-client-trace.yaml @@ -0,0 +1,21 @@ +resourceSpans: + - resource: + attributes: + - key: service.name + value: + stringValue: bar-requester + scopeSpans: + - scope: + name: opentelemetry/instrumentation-net + spans: + - traceId: a0000000000000000000000000000001 + spanId: a000000000000001 + name: "HTTP GET /ready" + kind: 2 + startTimeUnixNano: "1800000000000000000" + endTimeUnixNano: "1800000000000001000" + parentSpanId: "" + attributes: + - key: peer.service + value: + stringValue: external-platform \ No newline at end of file diff --git a/connector/servicegraphconnector/testdata/virtual-node-label-server-expected-metrics.yaml b/connector/servicegraphconnector/testdata/virtual-node-label-server-expected-metrics.yaml new file mode 100644 index 000000000000..f3b152ff0f04 --- /dev/null +++ b/connector/servicegraphconnector/testdata/virtual-node-label-server-expected-metrics.yaml @@ -0,0 +1,98 @@ +resourceMetrics: + - resource: {} + scopeMetrics: + - metrics: + - name: traces_service_graph_request_total + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "1" + attributes: + - key: client + value: + stringValue: foo-server + - key: connection_type + value: + stringValue: virtual_node + - key: failed + value: + boolValue: false + - key: server + value: + stringValue: unknown + - key: virtual_node + value: + stringValue: server + startTimeUnixNano: "1000000" + timeUnixNano: "2000000" + isMonotonic: true + - histogram: + aggregationTemporality: 2 + dataPoints: + - attributes: + - key: client + value: + stringValue: foo-server + - key: connection_type + value: + stringValue: virtual_node + - key: failed + value: + boolValue: false + - key: server + value: + stringValue: unknown + - key: virtual_node + value: + stringValue: server + bucketCounts: + - "1" + - "0" + - "0" + - "0" + count: "1" + explicitBounds: + - 0.1 + - 1 + - 10 + startTimeUnixNano: "1000000" + sum: 0 + timeUnixNano: "2000000" + name: traces_service_graph_request_server + unit: s + - histogram: + aggregationTemporality: 2 + dataPoints: + - attributes: + - key: client + value: + stringValue: foo-server + - key: connection_type + value: + stringValue: virtual_node + - key: failed + value: + boolValue: false + - key: server + value: + stringValue: unknown + - key: virtual_node + value: + stringValue: server + bucketCounts: + - "1" + - "0" + - "0" + - "0" + count: "1" + explicitBounds: + - 0.1 + - 1 + - 10 + startTimeUnixNano: "1000000" + sum: 1e-06 + timeUnixNano: "2000000" + name: traces_service_graph_request_client + unit: s + scope: + name: traces_service_graph diff --git a/connector/servicegraphconnector/testdata/virtual-node-label-server-trace.yaml b/connector/servicegraphconnector/testdata/virtual-node-label-server-trace.yaml new file mode 100644 index 000000000000..eee5957ddc18 --- /dev/null +++ b/connector/servicegraphconnector/testdata/virtual-node-label-server-trace.yaml @@ -0,0 +1,18 @@ +resourceSpans: + - resource: + attributes: + - key: service.name + value: + stringValue: foo-server + scopeSpans: + - scope: + name: foo-server + spans: + - traceId: a0000000000000000000000000000000 + spanId: a000000000000000 + name: server + kind: 3 + startTimeUnixNano: "1800000000000000000" + endTimeUnixNano: "1800000000000001000" + parentSpanId: "" + diff --git a/connector/servicegraphconnector/util.go b/connector/servicegraphconnector/util.go index fc447e9546de..11d7ea2be9ea 100644 --- a/connector/servicegraphconnector/util.go +++ b/connector/servicegraphconnector/util.go @@ -5,18 +5,11 @@ package servicegraphconnector // import "github.com/open-telemetry/opentelemetry import ( "go.opentelemetry.io/collector/pdata/pcommon" - semconv "go.opentelemetry.io/collector/semconv/v1.9.0" -) + semconv "go.opentelemetry.io/collector/semconv/v1.25.0" -func findAttributeValue(key string, attributes ...pcommon.Map) (string, bool) { - for _, attr := range attributes { - if v, ok := attr.Get(key); ok { - return v.AsString(), true - } - } - return "", false -} + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil" +) func findServiceName(attributes pcommon.Map) (string, bool) { - return findAttributeValue(semconv.AttributeServiceName, attributes) + return pdatautil.GetAttributeValue(semconv.AttributeServiceName, attributes) } diff --git a/exporter/instanaexporter/Makefile b/connector/signaltometricsconnector/Makefile similarity index 100% rename from exporter/instanaexporter/Makefile rename to connector/signaltometricsconnector/Makefile diff --git a/connector/signaltometricsconnector/README.md b/connector/signaltometricsconnector/README.md new file mode 100644 index 000000000000..be38b041b716 --- /dev/null +++ b/connector/signaltometricsconnector/README.md @@ -0,0 +1,236 @@ +# Signal to metrics connector + +Signal to metrics connector produces metrics from all signal types (traces, +logs, or metrics). + + +| Status | | +| ------------- |-----------| +| Distributions | [] | +| Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aconnector%2Fsignaltometrics%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aconnector%2Fsignaltometrics) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aconnector%2Fsignaltometrics%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aconnector%2Fsignaltometrics) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@ChrsMark](https://www.github.com/ChrsMark), [@lahsivjar](https://www.github.com/lahsivjar) | + +[development]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#development + +## Supported Pipeline Types + +| [Exporter Pipeline Type] | [Receiver Pipeline Type] | [Stability Level] | +| ------------------------ | ------------------------ | ----------------- | +| traces | metrics | [development] | +| logs | metrics | [development] | +| metrics | metrics | [development] | + +[Exporter Pipeline Type]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md#exporter-pipeline-type +[Receiver Pipeline Type]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md#receiver-pipeline-type +[Stability Level]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#stability-levels + + +## Configuration + +The component can produce metrics from spans, datapoints (for metrics), and logs. +At least one of the metrics for one signal type MUST be specified correctly for +the component to work. + +All signal types can be configured to produce metrics with the same configuration +structure. For example, the below configuration will produce delta temporality counters +for counting number of events for each of the configured signals: + +```yaml +signaltometrics: + spans: + - name: span.count + description: Count of spans + sum: + value: Int(AbsoluteCount()) # Count of total spans represented by each span + datapoints: + - name: datapoint.count + description: Count of datapoints + sum: + value: "1" # increment by 1 for each datapoint + logs: + - name: logrecord.count + description: Count of log records + sum: + value: "1" # increment by 1 for each log record +``` + +### Metrics types + +`signaltometrics` produces a variety of metric types by utilizing [OTTL](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/pkg/ottl/README.md) +to extract the relevant data for a metric type from the incoming data. The +component can produce the following metric types for each signal types: + +- [Sum](https://opentelemetry.io/docs/specs/otel/metrics/data-model/#sums) +- [Histogram](https://opentelemetry.io/docs/specs/otel/metrics/data-model/#histogram) +- [Exponential Histogram](https://opentelemetry.io/docs/specs/otel/metrics/data-model/#exponentialhistogram) + +The component does NOT perform any stateful or time based aggregations. The metric +types are aggregated for the payload sent in each `Consume*` call. The final metric +is then sent forward in the pipeline. + +#### Sum + +Sum metrics have the following configurations: + +```yaml +sum: + value: +``` + +- [**Required**] `value` represents an OTTL expression to extract a value from the + incoming data. Only OTTL expressions that return a value are accepted. The + returned value determines the value type of the `sum` metric (`int` or `double`). + [OTTL converters](https://pkg.go.dev/github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs#readme-converters) + can be used to transform the data. + +#### Histogram + +Histogram metrics have the following configurations: + +```yaml +histogram: + buckets: []float64 + count: + value: +``` + +- [**Optional**] `buckets` represents the buckets to be used for the histogram. + If no buckets are configured then it defaults to: + + ```go + []float64{2, 4, 6, 8, 10, 50, 100, 200, 400, 800, 1000, 1400, 2000, 5000, 10_000, 15_000} + ``` + +- [**Optional**] `count` represents an OTTL expression to extract the count to be + recorded in the histogram from the incoming data. If no expression is provided + then it defaults to the count of the signal. [OTTL converters](https://pkg.go.dev/github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs#readme-converters) + can be used to transform the data. For spans, a special converter [adjusted count](#custom-ottl-functions), + is provided to help calculte the span's [adjusted count](https://opentelemetry.io/docs/specs/otel/trace/tracestate-probability-sampling-experimental/#adjusted-count). +- [**Required**] `value` represents an OTTL expression to extract the value to be + recorded in the histogram from the incoming data. [OTTL converters](https://pkg.go.dev/github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs#readme-converters) + can be used to transform the data. + +#### Exponential Histogram + +Exponential histogram metrics have the following configurations: + +```yaml +exponential_histogram: + max_size: + count: + value: +``` + +- [**Optional**] `max_size` represents the maximum number of buckets per positive + or negative number range. Defaults to `160`. +- [**Optional**] `count` represents an OTTL expression to extract the count to be + recorded in the expoential histogram from the incoming data. If no expression + is provided then it defaults to the count of the signal. [OTTL converters](https://pkg.go.dev/github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs#readme-converters) + can be used to transform the data. For spans, a special converter [adjusted count](#custom-ottl-functions), + is provided to help calculte the span's [adjusted count](https://opentelemetry.io/docs/specs/otel/trace/tracestate-probability-sampling-experimental/#adjusted-count). +- [**Required**] `value` represents an OTTL expression to extract the value to be + recorded in the exponential histogram from the incoming data. [OTTL converters](https://pkg.go.dev/github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs#readme-converters) + can be used to transform the data. + +### Attributes + +The component can produce metrics categorized by the attributes (span attributes +for traces, datapoint attributes for datapoints, or log record attributes for logs) +from the incoming data by configuring `attributes` for the configured metrics. + +If no `attributes` are configured then the metrics are produced without any attributes. + +```yaml +attributes: + - key: datapoint.foo + - key: datapoint.bar + default_value: bar +``` + +If attributes are specified then a separate metric will be generated for each unique +set of attribute values. Optionally, a `default_value` can be used to always include +the attribute with the value of the attribute defaulting to the value specified in +`default_value` if the incoming data is missing that attribute. + +### Conditions + +Conditions are an optional list of OTTL conditions that are evaluated on the incoming +data and are ORed together. For example: + +```yaml +signaltometrics: + datapoints: + - name: datapoint.bar.sum + description: Count total number of datapoints as per datapoint.bar attribute + conditions: + - resource.attributes["foo"] != nil + - resource.attributes["bar"] != nil + sum: + value: "1" +``` + +The above configuration will produce sum metrics from datapoints with either `foo` +OR `bar` resource attribute defined. + +Conditions can also be ANDed together, for example: + +```yaml +signaltometrics: + datapoints: + - name: gauge.to.exphistogram + conditions: + - metric.type == 1 AND resource.attributes["resource.foo"] != nil + exponential_histogram: + count: "1" # 1 count for each datapoint + value: Double(value_int) + value_double # handle both int and double +``` + +The above configuration produces exponential histogram from gauge metrics with resource +attributes `resource.foo` set. + +### Customizing resource attributes + +The component allows customizing the resource attributes for the produced metrics +by specifying a list of attributes that should be included in the final metrics. +If no attributes are specified for `include_resource_attributes` then no filtering +is performed i.e. all resource attributes of the incoming data is considered. + +```yaml +include_resource_attributes: + - key: resource.foo # Include resource.foo attribute if present + - key: resource.bar # Always include resource.bar attribute, default to bar + default_value: bar +``` + +With the above configuration the produced metrics would only have the couple of +resource attributes specified in the list: + +- `resource.foo` will be present for the produced metrics if the incoming data also + has the attribute defined. +- `resource.bar` will always be present because of the `default_value`. If the incoming + data does not have a resource attribute with name `resource.bar` then the configured + `default_value` of `bar` will be used. + +### Single writer + +Metrics data streams MUST obey [single-writer](https://opentelemetry.io/docs/specs/otel/metrics/data-model/#single-writer) +principle. However, since `signaltometrics` component produces metrics from all signal +types and also allows customizing the resource attributes, there is a possibility +of violating the single-writer principle. To keep the single-writer principle intact, +the component adds collector instance information as resource attributes. The following +resource attributes are added to each produced metrics: + +```yaml +signaltometrics.service.name: +signaltometrics.service.namespace: +signaltometrics.service.instance.id: +``` + +### Custom OTTL functions + +The component implements a couple of custom OTTL functions: + +1. `AdjustedCount`: a converter capable of calculating [adjusted count for a span](https://github.com/open-telemetry/oteps/blob/main/text/trace/0235-sampling-threshold-in-trace-state.md). +2. `get`: a temporary solution to parse OTTL expressions with only values. This is +only for internal usage and MUST NOT be used explicitly as it is a stopgap measure +([see this for more details](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/35621)). diff --git a/connector/signaltometricsconnector/config/config.go b/connector/signaltometricsconnector/config/config.go new file mode 100644 index 000000000000..582afd1b7a2f --- /dev/null +++ b/connector/signaltometricsconnector/config/config.go @@ -0,0 +1,279 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package config // import "github.com/open-telemetry/opentelemetry-collector-contrib/connector/signaltometricsconnector/config" + +import ( + "errors" + "fmt" + + "github.com/lightstep/go-expohisto/structure" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/confmap" + "go.opentelemetry.io/collector/pdata/pcommon" + "go.uber.org/zap" + + "github.com/open-telemetry/opentelemetry-collector-contrib/connector/signaltometricsconnector/internal/customottl" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottldatapoint" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottllog" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottlspan" +) + +const ( + // defaultExponentialHistogramMaxSize is the default maximum number + // of buckets per positive or negative number range. 160 buckets + // default supports a high-resolution histogram able to cover a + // long-tail latency distribution from 1ms to 100s with a relative + // error of less than 5%. + // Ref: https://opentelemetry.io/docs/specs/otel/metrics/sdk/#base2-exponential-bucket-histogram-aggregation + defaultExponentialHistogramMaxSize = 160 +) + +var defaultHistogramBuckets = []float64{ + 2, 4, 6, 8, 10, 50, 100, 200, 400, 800, 1000, 1400, 2000, 5000, 10_000, 15_000, +} + +var _ confmap.Unmarshaler = (*Config)(nil) + +// Config for the connector. Each configuration field describes the metrics +// to produce from a specific signal. +type Config struct { + Spans []MetricInfo `mapstructure:"spans"` + Datapoints []MetricInfo `mapstructure:"datapoints"` + Logs []MetricInfo `mapstructure:"logs"` +} + +func (c *Config) Validate() error { + if len(c.Spans) == 0 && len(c.Datapoints) == 0 && len(c.Logs) == 0 { + return fmt.Errorf("no configuration provided, at least one should be specified") + } + var multiError error // collect all errors at once + if len(c.Spans) > 0 { + parser, err := ottlspan.NewParser( + customottl.SpanFuncs(), + component.TelemetrySettings{Logger: zap.NewNop()}, + ) + if err != nil { + return fmt.Errorf("failed to create parser for OTTL spans: %w", err) + } + for _, span := range c.Spans { + if err := validateMetricInfo(span, parser); err != nil { + multiError = errors.Join(multiError, fmt.Errorf("failed to validate spans configuration: %w", err)) + } + } + } + if len(c.Datapoints) > 0 { + parser, err := ottldatapoint.NewParser( + customottl.DatapointFuncs(), + component.TelemetrySettings{Logger: zap.NewNop()}, + ) + if err != nil { + return fmt.Errorf("failed to create parser for OTTL datapoints: %w", err) + } + for _, dp := range c.Datapoints { + if err := validateMetricInfo(dp, parser); err != nil { + multiError = errors.Join(multiError, fmt.Errorf("failed to validate datapoints configuration: %w", err)) + } + } + } + if len(c.Logs) > 0 { + parser, err := ottllog.NewParser( + customottl.LogFuncs(), + component.TelemetrySettings{Logger: zap.NewNop()}, + ) + if err != nil { + return fmt.Errorf("failed to create parser for OTTL logs: %w", err) + } + for _, log := range c.Logs { + if err := validateMetricInfo(log, parser); err != nil { + multiError = errors.Join(multiError, fmt.Errorf("failed to validate logs configuration: %w", err)) + } + } + } + return multiError +} + +// Unmarshal implements the confmap.Unmarshaler interface. It allows +// unmarshaling the config with a custom logic to allow setting +// default values when/if required. +func (c *Config) Unmarshal(collectorCfg *confmap.Conf) error { + if collectorCfg == nil { + return nil + } + if err := collectorCfg.Unmarshal(c, confmap.WithIgnoreUnused()); err != nil { + return err + } + for i, info := range c.Spans { + info.ensureDefaults() + c.Spans[i] = info + } + for i, info := range c.Datapoints { + info.ensureDefaults() + c.Datapoints[i] = info + } + for i, info := range c.Logs { + info.ensureDefaults() + c.Logs[i] = info + } + return nil +} + +type Attribute struct { + Key string `mapstructure:"key"` + DefaultValue any `mapstructure:"default_value"` +} + +type Histogram struct { + Buckets []float64 `mapstructure:"buckets"` + Count string `mapstructure:"count"` + Value string `mapstructure:"value"` +} + +type ExponentialHistogram struct { + MaxSize int32 `mapstructure:"max_size"` + Count string `mapstructure:"count"` + Value string `mapstructure:"value"` +} + +type Sum struct { + Value string `mapstructure:"value"` +} + +// MetricInfo defines the structure of the metric produced by the connector. +type MetricInfo struct { + Name string `mapstructure:"name"` + Description string `mapstructure:"description"` + // Unit, if not-empty, will set the unit associated with the metric. + // See: https://github.com/open-telemetry/opentelemetry-collector/blob/b06236cc794982916cc956f20828b3e18eb33264/pdata/pmetric/generated_metric.go#L72-L81 + Unit string `mapstructure:"unit"` + // IncludeResourceAttributes is a list of resource attributes that + // needs to be included in the generated metric. If no resource + // attribute is included in the list then all attributes are included. + IncludeResourceAttributes []Attribute `mapstructure:"include_resource_attributes"` + Attributes []Attribute `mapstructure:"attributes"` + // Conditions are a set of OTTL condtions which are ORed. Data is + // processed into metrics only if the sequence evaluates to true. + Conditions []string `mapstructure:"conditions"` + Histogram *Histogram `mapstructure:"histogram"` + ExponentialHistogram *ExponentialHistogram `mapstructure:"exponential_histogram"` + Sum *Sum `mapstructure:"sum"` +} + +func (mi *MetricInfo) ensureDefaults() { + if mi.Histogram != nil { + // Add default buckets if explicit histogram is defined + if len(mi.Histogram.Buckets) == 0 { + mi.Histogram.Buckets = defaultHistogramBuckets + } + } + if mi.ExponentialHistogram != nil { + if mi.ExponentialHistogram.MaxSize == 0 { + mi.ExponentialHistogram.MaxSize = defaultExponentialHistogramMaxSize + } + } +} + +func (mi *MetricInfo) validateAttributes() error { + tmp := pcommon.NewValueEmpty() + duplicate := map[string]struct{}{} + for _, attr := range mi.Attributes { + if attr.Key == "" { + return fmt.Errorf("attribute key missing") + } + if _, ok := duplicate[attr.Key]; ok { + return fmt.Errorf("duplicate key found in attributes config: %s", attr.Key) + } + if err := tmp.FromRaw(attr.DefaultValue); err != nil { + return fmt.Errorf("invalid default value specified for attribute %s", attr.Key) + } + duplicate[attr.Key] = struct{}{} + } + return nil +} + +func (mi *MetricInfo) validateHistogram() error { + if mi.Histogram != nil { + if len(mi.Histogram.Buckets) == 0 { + return errors.New("histogram buckets missing") + } + if mi.Histogram.Value == "" { + return errors.New("value OTTL statement is required") + } + } + if mi.ExponentialHistogram != nil { + if _, err := structure.NewConfig( + structure.WithMaxSize(mi.ExponentialHistogram.MaxSize), + ).Validate(); err != nil { + return err + } + if mi.ExponentialHistogram.Value == "" { + return errors.New("value OTTL statement is required") + } + } + return nil +} + +func (mi *MetricInfo) validateSum() error { + if mi.Sum != nil { + if mi.Sum.Value == "" { + return errors.New("value must be defined for sum metrics") + } + } + return nil +} + +// validateMetricInfo is an utility method validate all supported metric +// types defined for the metric info including any ottl expressions. +func validateMetricInfo[K any](mi MetricInfo, parser ottl.Parser[K]) error { + if mi.Name == "" { + return errors.New("missing required metric name configuration") + } + if err := mi.validateAttributes(); err != nil { + return fmt.Errorf("attributes validation failed: %w", err) + } + if err := mi.validateHistogram(); err != nil { + return fmt.Errorf("histogram validation failed: %w", err) + } + if err := mi.validateSum(); err != nil { + return fmt.Errorf("sum validation failed: %w", err) + } + + // Exactly one metric should be defined + var ( + metricsDefinedCount int + statements []string + ) + if mi.Histogram != nil { + metricsDefinedCount++ + if mi.Histogram.Count != "" { + statements = append(statements, customottl.ConvertToStatement(mi.Histogram.Count)) + } + statements = append(statements, customottl.ConvertToStatement(mi.Histogram.Value)) + } + if mi.ExponentialHistogram != nil { + metricsDefinedCount++ + if mi.ExponentialHistogram.Count != "" { + statements = append(statements, customottl.ConvertToStatement(mi.ExponentialHistogram.Count)) + } + statements = append(statements, customottl.ConvertToStatement(mi.ExponentialHistogram.Value)) + } + if mi.Sum != nil { + metricsDefinedCount++ + statements = append(statements, customottl.ConvertToStatement(mi.Sum.Value)) + } + if metricsDefinedCount != 1 { + return fmt.Errorf("exactly one of the metrics must be defined, %d found", metricsDefinedCount) + } + + // validate OTTL statements, note that, here we only evalaute if statements + // are valid. Check for required statements is left to the other validations. + if _, err := parser.ParseStatements(statements); err != nil { + return fmt.Errorf("failed to parse OTTL statements: %w", err) + } + // validate OTTL conditions + if _, err := parser.ParseConditions(mi.Conditions); err != nil { + return fmt.Errorf("failed to parse OTTL conditions: %w", err) + } + return nil +} diff --git a/connector/signaltometricsconnector/config/config_test.go b/connector/signaltometricsconnector/config/config_test.go new file mode 100644 index 000000000000..202fa4f70a3b --- /dev/null +++ b/connector/signaltometricsconnector/config/config_test.go @@ -0,0 +1,207 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package config + +import ( + "fmt" + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/confmap/confmaptest" + + "github.com/open-telemetry/opentelemetry-collector-contrib/connector/signaltometricsconnector/internal/metadata" +) + +func TestConfig(t *testing.T) { + for _, tc := range []struct { + path string // relative to `testdata/configs` directory + expected *Config + errorMsgs []string // all error message are checked + }{ + { + path: "empty", + errorMsgs: []string{"no configuration provided"}, + }, + { + path: "without_name", + errorMsgs: []string{ + fullErrorForSignal(t, "spans", "missing required metric name"), + fullErrorForSignal(t, "datapoints", "missing required metric name"), + fullErrorForSignal(t, "logs", "missing required metric name"), + }, + }, + { + path: "no_key_attributes", + errorMsgs: []string{ + fullErrorForSignal(t, "spans", "attributes validation failed"), + fullErrorForSignal(t, "datapoints", "attributes validation failed"), + fullErrorForSignal(t, "logs", "attributes validation failed"), + }, + }, + { + path: "duplicate_attributes", + errorMsgs: []string{ + fullErrorForSignal(t, "spans", "attributes validation failed"), + fullErrorForSignal(t, "datapoints", "attributes validation failed"), + fullErrorForSignal(t, "logs", "attributes validation failed"), + }, + }, + { + path: "invalid_histogram", + errorMsgs: []string{ + fullErrorForSignal(t, "spans", "histogram validation failed"), + fullErrorForSignal(t, "datapoints", "histogram validation failed"), + fullErrorForSignal(t, "logs", "histogram validation failed"), + }, + }, + { + path: "invalid_exponential_histogram", + errorMsgs: []string{ + fullErrorForSignal(t, "spans", "histogram validation failed"), + fullErrorForSignal(t, "datapoints", "histogram validation failed"), + fullErrorForSignal(t, "logs", "histogram validation failed"), + }, + }, + { + path: "invalid_sum", + errorMsgs: []string{ + fullErrorForSignal(t, "spans", "sum validation failed"), + fullErrorForSignal(t, "datapoints", "sum validation failed"), + fullErrorForSignal(t, "logs", "sum validation failed"), + }, + }, + { + path: "multiple_metric", + errorMsgs: []string{ + fullErrorForSignal(t, "spans", "exactly one of the metrics must be defined"), + fullErrorForSignal(t, "datapoints", "exactly one of the metrics must be defined"), + fullErrorForSignal(t, "logs", "exactly one of the metrics must be defined"), + }, + }, + { + path: "invalid_ottl_statements", + errorMsgs: []string{ + fullErrorForSignal(t, "spans", "failed to parse OTTL statements"), + fullErrorForSignal(t, "datapoints", "failed to parse OTTL statements"), + fullErrorForSignal(t, "logs", "failed to parse OTTL statements"), + }, + }, + { + path: "invalid_ottl_conditions", + errorMsgs: []string{ + fullErrorForSignal(t, "spans", "failed to parse OTTL conditions"), + fullErrorForSignal(t, "datapoints", "failed to parse OTTL conditions"), + fullErrorForSignal(t, "logs", "failed to parse OTTL conditions"), + }, + }, + { + path: "valid_full", + expected: &Config{ + Spans: []MetricInfo{ + { + Name: "span.exp_histogram", + Description: "Exponential histogram", + Unit: "us", + IncludeResourceAttributes: []Attribute{{Key: "key.1", DefaultValue: "foo"}}, + Attributes: []Attribute{{Key: "key.2", DefaultValue: "bar"}}, + Conditions: []string{ + `attributes["some.optional.1"] != nil`, + `resource.attributes["some.optional.2"] != nil`, + }, + ExponentialHistogram: &ExponentialHistogram{ + MaxSize: 10, + Count: "1", + Value: "Microseconds(end_time - start_time)", + }, + }, + { + Name: "span.histogram", + Description: "Histogram", + Unit: "us", + IncludeResourceAttributes: []Attribute{{Key: "key.1", DefaultValue: "foo"}}, + Attributes: []Attribute{{Key: "key.2", DefaultValue: "bar"}}, + Conditions: []string{ + `attributes["some.optional.1"] != nil`, + `resource.attributes["some.optional.2"] != nil`, + }, + Histogram: &Histogram{ + Buckets: []float64{1.1, 11.1, 111.1}, + Count: "1", + Value: "Microseconds(end_time - start_time)", + }, + }, + }, + Datapoints: []MetricInfo{ + { + Name: "dp.sum", + Description: "Sum", + Unit: "ms", + IncludeResourceAttributes: []Attribute{{Key: "key.1", DefaultValue: "foo"}}, + Attributes: []Attribute{{Key: "key.2", DefaultValue: "bar"}}, + Conditions: []string{ + `attributes["some.optional.1"] != nil`, + `IsDouble(attributes["some.optional.1"])`, + }, + Sum: &Sum{ + Value: `attributes["some.optional.1"]`, + }, + }, + }, + Logs: []MetricInfo{ + { + Name: "log.sum", + Description: "Sum", + Unit: "1", + IncludeResourceAttributes: []Attribute{{Key: "key.1", DefaultValue: "foo"}}, + Attributes: []Attribute{{Key: "key.2", DefaultValue: "bar"}}, + Conditions: []string{ + `attributes["some.optional.1"] != nil`, + }, + Sum: &Sum{ + Value: "1", + }, + }, + }, + }, + }, + } { + t.Run(tc.path, func(t *testing.T) { + dir := filepath.Join("..", "testdata", "configs") + cfg := &Config{} + cm, err := confmaptest.LoadConf(filepath.Join(dir, tc.path+".yaml")) + require.NoError(t, err) + + sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "").String()) + require.NoError(t, err) + require.NoError(t, sub.Unmarshal(&cfg)) + + err = component.ValidateConfig(cfg) + if len(tc.errorMsgs) > 0 { + for _, errMsg := range tc.errorMsgs { + assert.ErrorContains(t, err, errMsg) + } + return + } + + assert.NoError(t, err) + assert.Equal(t, tc.expected, cfg) + }) + } +} + +const validationMsgFormat = "failed to validate %s configuration: %s" + +func fullErrorForSignal(t *testing.T, signal, errMsg string) string { + t.Helper() + + switch signal { + case "spans", "datapoints", "logs": + return fmt.Sprintf(validationMsgFormat, signal, errMsg) + default: + panic("unhandled signal type") + } +} diff --git a/connector/signaltometricsconnector/connector.go b/connector/signaltometricsconnector/connector.go new file mode 100644 index 000000000000..d6f5f5b8283b --- /dev/null +++ b/connector/signaltometricsconnector/connector.go @@ -0,0 +1,50 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package signaltometricsconnector // import "github.com/open-telemetry/opentelemetry-collector-contrib/connector/signaltometricsconnector" + +import ( + "context" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/connector" + "go.opentelemetry.io/collector/consumer" + "go.opentelemetry.io/collector/pdata/plog" + "go.opentelemetry.io/collector/pdata/pmetric" + "go.opentelemetry.io/collector/pdata/ptrace" + "go.uber.org/zap" +) + +type signalToMetrics struct { + next consumer.Metrics + logger *zap.Logger + + component.StartFunc + component.ShutdownFunc +} + +func newSignalToMetrics( + set connector.Settings, + next consumer.Metrics, +) *signalToMetrics { + return &signalToMetrics{ + logger: set.Logger, + next: next, + } +} + +func (sm *signalToMetrics) Capabilities() consumer.Capabilities { + return consumer.Capabilities{MutatesData: false} +} + +func (sm *signalToMetrics) ConsumeTraces(context.Context, ptrace.Traces) error { + return nil +} + +func (sm *signalToMetrics) ConsumeMetrics(context.Context, pmetric.Metrics) error { + return nil +} + +func (sm *signalToMetrics) ConsumeLogs(context.Context, plog.Logs) error { + return nil +} diff --git a/connector/signaltometricsconnector/doc.go b/connector/signaltometricsconnector/doc.go new file mode 100644 index 000000000000..f27f0cda71e8 --- /dev/null +++ b/connector/signaltometricsconnector/doc.go @@ -0,0 +1,7 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +//go:generate mdatagen metadata.yaml + +// Package signaltometricsconnector provides a stateless connector for generating metrics from raw signals. +package signaltometricsconnector // import "github.com/open-telemetry/opentelemetry-collector-contrib/connector/signaltometricsconnector" diff --git a/connector/signaltometricsconnector/factory.go b/connector/signaltometricsconnector/factory.go new file mode 100644 index 000000000000..4bf1fcb8d1a3 --- /dev/null +++ b/connector/signaltometricsconnector/factory.go @@ -0,0 +1,57 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package signaltometricsconnector // import "github.com/open-telemetry/opentelemetry-collector-contrib/connector/signaltometricsconnector" + +import ( + "context" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/connector" + "go.opentelemetry.io/collector/consumer" + + "github.com/open-telemetry/opentelemetry-collector-contrib/connector/signaltometricsconnector/config" + "github.com/open-telemetry/opentelemetry-collector-contrib/connector/signaltometricsconnector/internal/metadata" +) + +// NewFactory returns a ConnectorFactory. +func NewFactory() connector.Factory { + return connector.NewFactory( + metadata.Type, + createDefaultConfig, + connector.WithTracesToMetrics(createTracesToMetrics, metadata.TracesToMetricsStability), + connector.WithMetricsToMetrics(createMetricsToMetrics, metadata.MetricsToMetricsStability), + connector.WithLogsToMetrics(createLogsToMetrics, metadata.LogsToMetricsStability), + ) +} + +func createDefaultConfig() component.Config { + return &config.Config{} +} + +func createTracesToMetrics( + _ context.Context, + set connector.Settings, + _ component.Config, + nextConsumer consumer.Metrics, +) (connector.Traces, error) { + return newSignalToMetrics(set, nextConsumer), nil +} + +func createMetricsToMetrics( + _ context.Context, + set connector.Settings, + _ component.Config, + nextConsumer consumer.Metrics, +) (connector.Metrics, error) { + return newSignalToMetrics(set, nextConsumer), nil +} + +func createLogsToMetrics( + _ context.Context, + set connector.Settings, + _ component.Config, + nextConsumer consumer.Metrics, +) (connector.Logs, error) { + return newSignalToMetrics(set, nextConsumer), nil +} diff --git a/connector/signaltometricsconnector/factory_test.go b/connector/signaltometricsconnector/factory_test.go new file mode 100644 index 000000000000..a172f0ac1f28 --- /dev/null +++ b/connector/signaltometricsconnector/factory_test.go @@ -0,0 +1,90 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package signaltometricsconnector + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/connector/connectortest" + "go.opentelemetry.io/collector/consumer" + "go.opentelemetry.io/collector/pdata/pmetric" + + "github.com/open-telemetry/opentelemetry-collector-contrib/connector/signaltometricsconnector/internal/metadata" +) + +func TestNewFactoryWithLogs(t *testing.T) { + for _, tc := range []struct { + name string + f func(*testing.T) + }{ + { + name: "factory_type", + f: func(t *testing.T) { + factory := NewFactory() + require.EqualValues(t, metadata.Type, factory.Type()) + }, + }, + { + name: "traces_to_metrics", + f: func(t *testing.T) { + mc, err := consumer.NewMetrics(func(context.Context, pmetric.Metrics) error { + return nil + }) + require.NoError(t, err) + + factory := NewFactory() + c, err := factory.CreateTracesToMetrics( + context.Background(), + connectortest.NewNopSettings(), + factory.CreateDefaultConfig(), + mc, + ) + require.NoError(t, err) + require.NotNil(t, c) + }, + }, + { + name: "logs_to_metrics", + f: func(t *testing.T) { + mc, err := consumer.NewMetrics(func(context.Context, pmetric.Metrics) error { + return nil + }) + require.NoError(t, err) + + factory := NewFactory() + c, err := factory.CreateLogsToMetrics( + context.Background(), + connectortest.NewNopSettings(), + factory.CreateDefaultConfig(), + mc, + ) + require.NoError(t, err) + require.NotNil(t, c) + }, + }, + { + name: "metrics_to_metrics", + f: func(t *testing.T) { + mc, err := consumer.NewMetrics(func(context.Context, pmetric.Metrics) error { + return nil + }) + require.NoError(t, err) + + factory := NewFactory() + c, err := factory.CreateMetricsToMetrics( + context.Background(), + connectortest.NewNopSettings(), + factory.CreateDefaultConfig(), + mc, + ) + require.NoError(t, err) + require.NotNil(t, c) + }, + }, + } { + t.Run(tc.name, tc.f) + } +} diff --git a/connector/signaltometricsconnector/generated_component_test.go b/connector/signaltometricsconnector/generated_component_test.go new file mode 100644 index 000000000000..751f8f306fd9 --- /dev/null +++ b/connector/signaltometricsconnector/generated_component_test.go @@ -0,0 +1,88 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package signaltometricsconnector + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/confmap/confmaptest" + "go.opentelemetry.io/collector/connector" + "go.opentelemetry.io/collector/connector/connectortest" + "go.opentelemetry.io/collector/consumer" + "go.opentelemetry.io/collector/consumer/consumertest" + "go.opentelemetry.io/collector/pipeline" +) + +func TestComponentFactoryType(t *testing.T) { + require.Equal(t, "signaltometrics", NewFactory().Type().String()) +} + +func TestComponentConfigStruct(t *testing.T) { + require.NoError(t, componenttest.CheckConfigStruct(NewFactory().CreateDefaultConfig())) +} + +func TestComponentLifecycle(t *testing.T) { + factory := NewFactory() + + tests := []struct { + name string + createFn func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) + }{ + + { + name: "logs_to_metrics", + createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) { + router := connector.NewMetricsRouter(map[pipeline.ID]consumer.Metrics{pipeline.NewID(pipeline.SignalMetrics): consumertest.NewNop()}) + return factory.CreateLogsToMetrics(ctx, set, cfg, router) + }, + }, + + { + name: "metrics_to_metrics", + createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) { + router := connector.NewMetricsRouter(map[pipeline.ID]consumer.Metrics{pipeline.NewID(pipeline.SignalMetrics): consumertest.NewNop()}) + return factory.CreateMetricsToMetrics(ctx, set, cfg, router) + }, + }, + + { + name: "traces_to_metrics", + createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) { + router := connector.NewMetricsRouter(map[pipeline.ID]consumer.Metrics{pipeline.NewID(pipeline.SignalMetrics): consumertest.NewNop()}) + return factory.CreateTracesToMetrics(ctx, set, cfg, router) + }, + }, + } + + cm, err := confmaptest.LoadConf("metadata.yaml") + require.NoError(t, err) + cfg := factory.CreateDefaultConfig() + sub, err := cm.Sub("tests::config") + require.NoError(t, err) + require.NoError(t, sub.Unmarshal(&cfg)) + + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), connectortest.NewNopSettings(), cfg) + require.NoError(t, err) + err = c.Shutdown(context.Background()) + require.NoError(t, err) + }) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + firstConnector, err := tt.createFn(context.Background(), connectortest.NewNopSettings(), cfg) + require.NoError(t, err) + host := componenttest.NewNopHost() + require.NoError(t, err) + require.NoError(t, firstConnector.Start(context.Background(), host)) + require.NoError(t, firstConnector.Shutdown(context.Background())) + secondConnector, err := tt.createFn(context.Background(), connectortest.NewNopSettings(), cfg) + require.NoError(t, err) + require.NoError(t, secondConnector.Start(context.Background(), host)) + require.NoError(t, secondConnector.Shutdown(context.Background())) + }) + } +} diff --git a/connector/signaltometricsconnector/generated_package_test.go b/connector/signaltometricsconnector/generated_package_test.go new file mode 100644 index 000000000000..beb8cdc87cfa --- /dev/null +++ b/connector/signaltometricsconnector/generated_package_test.go @@ -0,0 +1,13 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package signaltometricsconnector + +import ( + "testing" + + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + goleak.VerifyTestMain(m) +} diff --git a/connector/signaltometricsconnector/go.mod b/connector/signaltometricsconnector/go.mod new file mode 100644 index 000000000000..92cdfe2aa953 --- /dev/null +++ b/connector/signaltometricsconnector/go.mod @@ -0,0 +1,86 @@ +module github.com/open-telemetry/opentelemetry-collector-contrib/connector/signaltometricsconnector + +go 1.22.0 + +require ( + github.com/lightstep/go-expohisto v1.0.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/connector v0.116.0 + go.opentelemetry.io/collector/connector/connectortest v0.116.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/pipeline v0.116.0 + go.uber.org/goleak v1.3.0 + go.uber.org/zap v1.27.0 +) + +require ( + github.com/alecthomas/participle/v2 v2.1.1 // indirect + github.com/antchfx/xmlquery v1.4.2 // indirect + github.com/antchfx/xpath v1.3.2 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/elastic/go-grok v0.3.1 // indirect + github.com/elastic/lunes v0.1.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/gobwas/glob v0.2.3 // indirect + github.com/goccy/go-json v0.10.4 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/golang-lru v0.5.4 // indirect + github.com/iancoleman/strcase v0.3.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/knadh/koanf/maps v0.1.1 // indirect + github.com/knadh/koanf/providers/confmap v0.1.0 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect + github.com/magefile/mage v1.15.0 // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/connector/xconnector v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 // indirect + go.opentelemetry.io/collector/semconv v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl => ../../pkg/ottl + +replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal => ../../internal/coreinternal + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../../pkg/pdatautil + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest => ../../pkg/pdatatest + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden => ../../pkg/golden + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling => ../../pkg/sampling diff --git a/connector/signaltometricsconnector/go.sum b/connector/signaltometricsconnector/go.sum new file mode 100644 index 000000000000..1f435a824d18 --- /dev/null +++ b/connector/signaltometricsconnector/go.sum @@ -0,0 +1,199 @@ +github.com/alecthomas/assert/v2 v2.3.0 h1:mAsH2wmvjsuvyBvAmCtm7zFsBlb8mIHx5ySLVdDZXL0= +github.com/alecthomas/assert/v2 v2.3.0/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= +github.com/alecthomas/participle/v2 v2.1.1 h1:hrjKESvSqGHzRb4yW1ciisFJ4p3MGYih6icjJvbsmV8= +github.com/alecthomas/participle/v2 v2.1.1/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= +github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= +github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= +github.com/antchfx/xmlquery v1.4.2 h1:MZKd9+wblwxfQ1zd1AdrTsqVaMjMCwow3IqkCSe00KA= +github.com/antchfx/xmlquery v1.4.2/go.mod h1:QXhvf5ldTuGqhd1SHNvvtlhhdQLks4dD0awIVhXIDTA= +github.com/antchfx/xpath v1.3.2 h1:LNjzlsSjinu3bQpw9hWMY9ocB80oLOWuQqFvO6xt51U= +github.com/antchfx/xpath v1.3.2/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/elastic/go-grok v0.3.1 h1:WEhUxe2KrwycMnlvMimJXvzRa7DoByJB4PVUIE1ZD/U= +github.com/elastic/go-grok v0.3.1/go.mod h1:n38ls8ZgOboZRgKcjMY8eFeZFMmcL9n2lP0iHhIDk64= +github.com/elastic/lunes v0.1.0 h1:amRtLPjwkWtzDF/RKzcEPMvSsSseLDLW+bnhfNSLRe4= +github.com/elastic/lunes v0.1.0/go.mod h1:xGphYIt3XdZRtyWosHQTErsQTd4OP1p9wsbVoHelrd4= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= +github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= +github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= +github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= +github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= +github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= +github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= +github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lightstep/go-expohisto v1.0.0 h1:UPtTS1rGdtehbbAF7o/dhkWLTDI73UifG8LbfQI7cA4= +github.com/lightstep/go-expohisto v1.0.0/go.mod h1:xDXD0++Mu2FOaItXtdDfksfgxfV0z1TMPa+e/EUd0cs= +github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= +github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 h1:SIKIoA4e/5Y9ZOl0DCe3eVMLPOQzJxgZpfdHHeauNTM= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6/go.mod h1:BUbeWZiieNxAuuADTBNb3/aeje6on3DhU3rpWsQSB1E= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/connector v0.116.0 h1:0Pz8RAXH1swLeA1fiyGGQWdv0Kemz4mbq+jnmd1TACE= +go.opentelemetry.io/collector/connector v0.116.0/go.mod h1:VQiZ2yW9KhZuF0yjDbvlgrAxm7+o8KQoxHxurQWLjKU= +go.opentelemetry.io/collector/connector/connectortest v0.116.0 h1:MdttvjqdZmp0ewW5IPCEtzzYmCqxrQxsjJ5m6gMVjzA= +go.opentelemetry.io/collector/connector/connectortest v0.116.0/go.mod h1:ko7aPyvAVf6SvRhWGZdPXSyk+7zPmsSCcMq0gYPMMIQ= +go.opentelemetry.io/collector/connector/xconnector v0.116.0 h1:fFJzrRco0g7HMkhnQ+ehlvicFf58vzsCLXnfuHyQM8w= +go.opentelemetry.io/collector/connector/xconnector v0.116.0/go.mod h1:m9oCk32zX6wDciYBpy+qMQkWKtOxb0gAkEUm8+trflY= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 h1:KKFb3u8iLk4V5GYz7eVpw8QgEdob5koX6GNEbaoDQJY= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0/go.mod h1:YyWHUWeSnRmy2CF7kPHpwJ6qkVjufbLZ8PYuY0Ph0o8= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 h1:PFNy+Il/kqPdPL9rhG+1kG63Aauya+FhBKGXoB6ivxU= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0/go.mod h1:bVn9V4TGyeXi58/JDkeXCuKtc+V+qcOoTl8hNpV0qa8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/connector/signaltometricsconnector/internal/customottl/adjustedcount.go b/connector/signaltometricsconnector/internal/customottl/adjustedcount.go new file mode 100644 index 000000000000..84c08441964d --- /dev/null +++ b/connector/signaltometricsconnector/internal/customottl/adjustedcount.go @@ -0,0 +1,41 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package customottl // import "github.com/open-telemetry/opentelemetry-collector-contrib/connector/signaltometricsconnector/internal/customottl" + +import ( + "context" + "fmt" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottlspan" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling" +) + +func NewAdjustedCountFactory() ottl.Factory[ottlspan.TransformContext] { + return ottl.NewFactory("AdjustedCount", nil, createAdjustedCountFunction) +} + +func createAdjustedCountFunction(_ ottl.FunctionContext, _ ottl.Arguments) (ottl.ExprFunc[ottlspan.TransformContext], error) { + return adjustedCount() +} + +func adjustedCount() (ottl.ExprFunc[ottlspan.TransformContext], error) { + return func(_ context.Context, tCtx ottlspan.TransformContext) (any, error) { + tracestate := tCtx.GetSpan().TraceState().AsRaw() + w3cTraceState, err := sampling.NewW3CTraceState(tracestate) + if err != nil { + return float64(0), fmt.Errorf("failed to parse w3c tracestate: %w", err) + } + otTraceState := w3cTraceState.OTelValue() + if otTraceState == nil { + // If otel trace state is missing, default to 1 + return float64(1), nil + } + if len(otTraceState.TValue()) == 0 { + // For non-probabilistic sampler OR always sampling threshold, default to 1 + return float64(1), nil + } + return otTraceState.AdjustedCount(), nil + }, nil +} diff --git a/connector/signaltometricsconnector/internal/customottl/adjustedcount_test.go b/connector/signaltometricsconnector/internal/customottl/adjustedcount_test.go new file mode 100644 index 000000000000..63cb778564db --- /dev/null +++ b/connector/signaltometricsconnector/internal/customottl/adjustedcount_test.go @@ -0,0 +1,51 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package customottl + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/ptrace" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottlspan" +) + +func Test_AdjustedCount(t *testing.T) { + for _, tc := range []struct { + tracestate string + want float64 + errMsg string + }{ + {tracestate: "", want: 1}, + {tracestate: "invalid=p:8;th:8", want: 1}, // otel trace state nil, default to 1 + {tracestate: "ot=notfound:8", want: 1}, // otel tvalue 0, default to 1 + {tracestate: "ot=404:0", errMsg: "failed to parse"}, // invalid syntax + {tracestate: "ot=th:0", want: 1}, // 100% sampling + {tracestate: "ot=th:8", want: 2}, // 50% sampling + {tracestate: "ot=th:c", want: 4}, // 25% sampling + } { + t.Run("tracestate/"+tc.tracestate, func(t *testing.T) { + exprFunc, err := adjustedCount() + require.NoError(t, err) + span := ptrace.NewSpan() + span.TraceState().FromRaw(tc.tracestate) + result, err := exprFunc(nil, ottlspan.NewTransformContext( + span, + pcommon.NewInstrumentationScope(), + pcommon.NewResource(), + ptrace.NewScopeSpans(), + ptrace.NewResourceSpans(), + )) + if tc.errMsg != "" { + require.ErrorContains(t, err, tc.errMsg) + return + } + require.NoError(t, err) + assert.Equal(t, tc.want, result) + }) + } +} diff --git a/connector/signaltometricsconnector/internal/customottl/funcs.go b/connector/signaltometricsconnector/internal/customottl/funcs.go new file mode 100644 index 000000000000..6e75edf7b94e --- /dev/null +++ b/connector/signaltometricsconnector/internal/customottl/funcs.go @@ -0,0 +1,34 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package customottl // import "github.com/open-telemetry/opentelemetry-collector-contrib/connector/signaltometricsconnector/internal/customottl" + +import ( + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottldatapoint" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottllog" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottlspan" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs" +) + +func SpanFuncs() map[string]ottl.Factory[ottlspan.TransformContext] { + common := commonFuncs[ottlspan.TransformContext]() + adjustedCountFactory := NewAdjustedCountFactory() + common[adjustedCountFactory.Name()] = adjustedCountFactory + return common +} + +func DatapointFuncs() map[string]ottl.Factory[ottldatapoint.TransformContext] { + return commonFuncs[ottldatapoint.TransformContext]() +} + +func LogFuncs() map[string]ottl.Factory[ottllog.TransformContext] { + return commonFuncs[ottllog.TransformContext]() +} + +func commonFuncs[K any]() map[string]ottl.Factory[K] { + getFactory := NewGetFactory[K]() + standard := ottlfuncs.StandardFuncs[K]() + standard[getFactory.Name()] = getFactory + return standard +} diff --git a/connector/signaltometricsconnector/internal/customottl/get.go b/connector/signaltometricsconnector/internal/customottl/get.go new file mode 100644 index 000000000000..811196b7ba0d --- /dev/null +++ b/connector/signaltometricsconnector/internal/customottl/get.go @@ -0,0 +1,46 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package customottl // import "github.com/open-telemetry/opentelemetry-collector-contrib/connector/signaltometricsconnector/internal/customottl" + +import ( + "context" + "fmt" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +// Get is a temporary OTTL editor to allow statements to return values. This +// will be removed after OTTL can parse data retrival expressions: +// See: https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/35621 + +type GetArguments[K any] struct { + Value ottl.Getter[K] +} + +func NewGetFactory[K any]() ottl.Factory[K] { + return ottl.NewFactory("get", &GetArguments[K]{}, createGetFunction[K]) +} + +func createGetFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { + args, ok := oArgs.(*GetArguments[K]) + + if !ok { + return nil, fmt.Errorf("GetFactory args must be of type *GetArguments[K]") + } + + return get(args.Value), nil +} + +func get[K any](value ottl.Getter[K]) ottl.ExprFunc[K] { + return func(ctx context.Context, tCtx K) (any, error) { + return value.Get(ctx, tCtx) + } +} + +// ConvertToStatement converts ottl.Value to an OTTL statement. To do +// this, it uses a custom `get` editor. This is expected to be a +// temporary measure until value parsing is allowed by the OTTL pkg. +func ConvertToStatement(s string) string { + return fmt.Sprintf("get(%s)", s) +} diff --git a/connector/signaltometricsconnector/internal/metadata/generated_status.go b/connector/signaltometricsconnector/internal/metadata/generated_status.go new file mode 100644 index 000000000000..bb48af2b993f --- /dev/null +++ b/connector/signaltometricsconnector/internal/metadata/generated_status.go @@ -0,0 +1,18 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "go.opentelemetry.io/collector/component" +) + +var ( + Type = component.MustNewType("signaltometrics") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/connector/signaltometricsconnector" +) + +const ( + TracesToMetricsStability = component.StabilityLevelDevelopment + LogsToMetricsStability = component.StabilityLevelDevelopment + MetricsToMetricsStability = component.StabilityLevelDevelopment +) diff --git a/connector/signaltometricsconnector/metadata.yaml b/connector/signaltometricsconnector/metadata.yaml new file mode 100644 index 000000000000..e677dde4d8ae --- /dev/null +++ b/connector/signaltometricsconnector/metadata.yaml @@ -0,0 +1,33 @@ +type: signaltometrics + +status: + class: connector + stability: + development: [traces_to_metrics, logs_to_metrics, metrics_to_metrics] + distributions: [] + codeowners: + active: [ChrsMark, lahsivjar] + +tests: + config: + spans: + - name: span.duration.histogram + description: "Span duration as histogram" + unit: us + histogram: + value: Microseconds(end_time - start_time) + - name: span.duration.exponential_histogram + description: "Span duration as exponential histogram" + unit: us + exponential_histogram: + value: Microseconds(end_time - start_time) + logs: + - name: logrecord.count + description: "Count of log record" + sum: + value: "1" # Count each log record as 1, has to be a string + datapoints: + - name: datapoint.count + description: "Count of datapoint" + sum: + value: Int(1) # Count each data point as 1, can also use the Int converter diff --git a/connector/signaltometricsconnector/testdata/configs/duplicate_attributes.yaml b/connector/signaltometricsconnector/testdata/configs/duplicate_attributes.yaml new file mode 100644 index 000000000000..567631081e85 --- /dev/null +++ b/connector/signaltometricsconnector/testdata/configs/duplicate_attributes.yaml @@ -0,0 +1,25 @@ +signaltometrics: + spans: + - name: span.sum + attributes: + - key: key.1 + - key: key.1 + - key: key.2 + sum: + value: "1" + datapoints: + - name: dp.sum + attributes: + - key: key.1 + - key: key.1 + - key: key.2 + sum: + value: "1" + logs: + - name: log.sum + attributes: + - key: key.1 + - key: key.1 + - key: key.2 + sum: + value: "1" diff --git a/connector/signaltometricsconnector/testdata/configs/empty.yaml b/connector/signaltometricsconnector/testdata/configs/empty.yaml new file mode 100644 index 000000000000..b00cc3dc1131 --- /dev/null +++ b/connector/signaltometricsconnector/testdata/configs/empty.yaml @@ -0,0 +1 @@ +signaltometrics: {} diff --git a/connector/signaltometricsconnector/testdata/configs/invalid_exponential_histogram.yaml b/connector/signaltometricsconnector/testdata/configs/invalid_exponential_histogram.yaml new file mode 100644 index 000000000000..fdc5fba7b1bf --- /dev/null +++ b/connector/signaltometricsconnector/testdata/configs/invalid_exponential_histogram.yaml @@ -0,0 +1,16 @@ +signaltometrics: + spans: + - name: span.sum + attributes: + - key: key.1 + exponential_histogram: {} + datapoints: + - name: dp.sum + attributes: + - key: key.1 + exponential_histogram: {} + logs: + - name: log.sum + attributes: + - key: key.1 + exponential_histogram: {} diff --git a/connector/signaltometricsconnector/testdata/configs/invalid_histogram.yaml b/connector/signaltometricsconnector/testdata/configs/invalid_histogram.yaml new file mode 100644 index 000000000000..f4dbf6feca55 --- /dev/null +++ b/connector/signaltometricsconnector/testdata/configs/invalid_histogram.yaml @@ -0,0 +1,16 @@ +signaltometrics: + spans: + - name: span.sum + attributes: + - key: key.1 + histogram: {} + datapoints: + - name: dp.sum + attributes: + - key: key.1 + histogram: {} + logs: + - name: log.sum + attributes: + - key: key.1 + histogram: {} diff --git a/connector/signaltometricsconnector/testdata/configs/invalid_ottl_conditions.yaml b/connector/signaltometricsconnector/testdata/configs/invalid_ottl_conditions.yaml new file mode 100644 index 000000000000..8963f831a39b --- /dev/null +++ b/connector/signaltometricsconnector/testdata/configs/invalid_ottl_conditions.yaml @@ -0,0 +1,25 @@ +signaltometrics: + spans: + - name: span.sum + attributes: + - key: key.1 + conditions: + - bad_condition + sum: + value: "1" + datapoints: + - name: dp.sum + attributes: + - key: key.1 + conditions: + - bad_condition + sum: + value: "1" + logs: + - name: log.sum + attributes: + - key: key.1 + conditions: + - bad_condition + sum: + value: "1" diff --git a/connector/signaltometricsconnector/testdata/configs/invalid_ottl_statements.yaml b/connector/signaltometricsconnector/testdata/configs/invalid_ottl_statements.yaml new file mode 100644 index 000000000000..9be4e452c90c --- /dev/null +++ b/connector/signaltometricsconnector/testdata/configs/invalid_ottl_statements.yaml @@ -0,0 +1,19 @@ +signaltometrics: + spans: + - name: span.sum + attributes: + - key: key.1 + sum: + value: bad_statement(1) + datapoints: + - name: dp.sum + attributes: + - key: key.1 + sum: + value: bad_statement(1) + logs: + - name: log.sum + attributes: + - key: key.1 + sum: + value: bad_statement(1) diff --git a/connector/signaltometricsconnector/testdata/configs/invalid_sum.yaml b/connector/signaltometricsconnector/testdata/configs/invalid_sum.yaml new file mode 100644 index 000000000000..391aba74d883 --- /dev/null +++ b/connector/signaltometricsconnector/testdata/configs/invalid_sum.yaml @@ -0,0 +1,16 @@ +signaltometrics: + spans: + - name: span.sum + attributes: + - key: key.1 + sum: {} + datapoints: + - name: dp.sum + attributes: + - key: key.1 + sum: {} + logs: + - name: log.sum + attributes: + - key: key.1 + sum: {} diff --git a/connector/signaltometricsconnector/testdata/configs/multiple_metric.yaml b/connector/signaltometricsconnector/testdata/configs/multiple_metric.yaml new file mode 100644 index 000000000000..a030275ba2e9 --- /dev/null +++ b/connector/signaltometricsconnector/testdata/configs/multiple_metric.yaml @@ -0,0 +1,31 @@ +signaltometrics: + spans: + - name: span.sum + attributes: + - key: key.1 + sum: + value: "1" + histogram: + value: "1" + exponential_histogram: + value: "1" + datapoints: + - name: dp.sum + attributes: + - key: key.1 + sum: + value: "1" + histogram: + value: "1" + exponential_histogram: + value: "1" + logs: + - name: log.sum + attributes: + - key: key.1 + sum: + value: "1" + histogram: + value: "1" + exponential_histogram: + value: "1" diff --git a/connector/signaltometricsconnector/testdata/configs/no_key_attributes.yaml b/connector/signaltometricsconnector/testdata/configs/no_key_attributes.yaml new file mode 100644 index 000000000000..a6522505d3ae --- /dev/null +++ b/connector/signaltometricsconnector/testdata/configs/no_key_attributes.yaml @@ -0,0 +1,19 @@ +signaltometrics: + spans: + - name: span.sum + attributes: + - default_value: key.1 + sum: + value: "1" + datapoints: + - name: dp.sum + attributes: + - default_value: key.1 + sum: + value: "1" + logs: + - name: log.sum + attributes: + - default_value: key.1 + sum: + value: "1" diff --git a/connector/signaltometricsconnector/testdata/configs/valid_full.yaml b/connector/signaltometricsconnector/testdata/configs/valid_full.yaml new file mode 100644 index 000000000000..a200ab878b11 --- /dev/null +++ b/connector/signaltometricsconnector/testdata/configs/valid_full.yaml @@ -0,0 +1,63 @@ +signaltometrics: + spans: + - name: span.exp_histogram + description: Exponential histogram + unit: us + include_resource_attributes: + - key: key.1 + default_value: foo + attributes: + - key: key.2 + default_value: bar + conditions: + - attributes["some.optional.1"] != nil + - resource.attributes["some.optional.2"] != nil + exponential_histogram: + max_size: 10 + value: Microseconds(end_time - start_time) + count: "1" + - name: span.histogram + description: Histogram + unit: us + include_resource_attributes: + - key: key.1 + default_value: foo + attributes: + - key: key.2 + default_value: bar + conditions: + - attributes["some.optional.1"] != nil + - resource.attributes["some.optional.2"] != nil + histogram: + buckets: [1.1, 11.1, 111.1] + value: Microseconds(end_time - start_time) + count: "1" + datapoints: + - name: dp.sum + description: Sum + unit: ms + include_resource_attributes: + - key: key.1 + default_value: foo + attributes: + - key: key.2 + default_value: bar + conditions: + - attributes["some.optional.1"] != nil + - IsDouble(attributes["some.optional.1"]) + sum: + value: attributes["some.optional.1"] + logs: + - name: log.sum + description: Sum + unit: "1" + include_resource_attributes: + - key: key.1 + default_value: foo + attributes: + - key: key.2 + default_value: bar + conditions: + - attributes["some.optional.1"] != nil + sum: + value: "1" diff --git a/connector/signaltometricsconnector/testdata/configs/without_name.yaml b/connector/signaltometricsconnector/testdata/configs/without_name.yaml new file mode 100644 index 000000000000..92f92ede0864 --- /dev/null +++ b/connector/signaltometricsconnector/testdata/configs/without_name.yaml @@ -0,0 +1,10 @@ +signaltometrics: + spans: + - sum: + value: "1" + datapoints: + - sum: + value: "1" + logs: + - sum: + value: "1" diff --git a/connector/signaltometricsconnector/testdata/traces/traces.yaml b/connector/signaltometricsconnector/testdata/traces/traces.yaml new file mode 100644 index 000000000000..bbf84f43b5fd --- /dev/null +++ b/connector/signaltometricsconnector/testdata/traces/traces.yaml @@ -0,0 +1,96 @@ +resourceSpans: + - resource: + attributes: + - key: resource.foo + value: + stringValue: foo + - key: resource.bar + value: + stringValue: bar + scopeSpans: + - scope: {} + spans: + - attributes: + - key: db.name + value: + stringValue: main + - key: db.system + value: + stringValue: mysql + endTimeUnixNano: "1581452772500000789" + name: db-span + parentSpanId: "" + startTimeUnixNano: "1581452772000000321" + - attributes: + - key: http.request.method + value: + stringValue: POST + - key: url.full + value: + stringValue: https://www.foo.bar/search?q=OpenTelemetry#SemConv + - key: http.response.status_code + value: + intValue: 201 + endTimeUnixNano: "1581452772900000789" + name: http-span + parentSpanId: "" + startTimeUnixNano: "1581452772000000321" + - attributes: + - key: messaging.system + value: + stringValue: kafka + - key: messaging.destination.name + value: + stringValue: TestTopic + endTimeUnixNano: "1581452772002000789" + name: msg-span + parentSpanId: "" + startTimeUnixNano: "1581452772000000321" + - attributes: + - key: db.name + value: + stringValue: main + - key: db.system + value: + stringValue: mysql + endTimeUnixNano: "1581452773000000789" + name: db-span-2 + parentSpanId: "bcff497b5a47310f" + startTimeUnixNano: "1581452772000000321" + - attributes: + - key: http.request.method + value: + stringValue: POST + - key: url.full + value: + stringValue: https://www.foo.bar/search?q=OpenTelemetry#SemConv + - key: http.response.status_code + value: + intValue: 201 + endTimeUnixNano: "1581452783000000789" + name: http-span-2 + parentSpanId: "bcff497b5a47310f" + startTimeUnixNano: "1581452772000000321" + - attributes: + - key: messaging.system + value: + stringValue: kafka + - key: messaging.destination.name + value: + stringValue: TestTopic + endTimeUnixNano: "1581452789000000789" + name: msg-span-2 + parentSpanId: "bcff497b5a47310f" + startTimeUnixNano: "1581452772000000321" + - attributes: + - key: db.name + value: + stringValue: main + - key: db.system + value: + stringValue: mysql + endTimeUnixNano: "1581452772500000804" + name: th-value-8 # represents 2 sampled spans + parentSpanId: "" + startTimeUnixNano: "1581452772000000381" + traceState: "ot=th:8" diff --git a/connector/spanmetricsconnector/README.md b/connector/spanmetricsconnector/README.md index 4f431dfcf139..c3c2fe79833e 100644 --- a/connector/spanmetricsconnector/README.md +++ b/connector/spanmetricsconnector/README.md @@ -8,7 +8,7 @@ | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@portertech](https://www.github.com/portertech), [@Frapschen](https://www.github.com/Frapschen) \| Seeking more code owners! | | Emeritus | [@albertteoh](https://www.github.com/albertteoh) | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib ## Supported Pipeline Types @@ -19,7 +19,7 @@ [Exporter Pipeline Type]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md#exporter-pipeline-type [Receiver Pipeline Type]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md#receiver-pipeline-type -[Stability Level]: https://github.com/open-telemetry/opentelemetry-collector#stability-levels +[Stability Level]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#stability-levels ## Overview @@ -58,7 +58,7 @@ across all spans: ## Span to Metrics processor to Span to metrics connector -The spanmetrics connector is a port of the [spanmetrics](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/processor/spanmetricsprocessor/v0.95.0/processor/spanmetricsprocessor/README.md) processor, but with multiple improvements +The spanmetrics connector replaces [spanmetrics](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/processor/spanmetricsprocessor/v0.95.0/processor/spanmetricsprocessor/README.md) processor with multiple improvements and breaking changes. It was done to bring the `spanmetrics` connector closer to the OpenTelemetry specification and make the component agnostic to exporters logic. The `spanmetrics` processor essentially was mixing the OTel with Prometheus conventions by using the OTel data model and @@ -111,16 +111,19 @@ The following settings can be optionally configured: cumulative temporality to avoid memory leaks and correct metric timestamp resets. - `aggregation_temporality` (default: `AGGREGATION_TEMPORALITY_CUMULATIVE`): Defines the aggregation temporality of the generated metrics. One of either `AGGREGATION_TEMPORALITY_CUMULATIVE` or `AGGREGATION_TEMPORALITY_DELTA`. -- `namespace`: Defines the namespace of the generated metrics. If `namespace` provided, generated metric name will be added `namespace.` prefix. +- `namespace` (default: `traces.span.metrics`): Defines the namespace of the generated metrics. If `namespace` provided, generated metric name will be added `namespace.` prefix. - `metrics_flush_interval` (default: `60s`): Defines the flush interval of the generated metrics. - `metrics_expiration` (default: `0`): Defines the expiration time as `time.Duration`, after which, if no new spans are received, metrics will no longer be exported. Setting to `0` means the metrics will never expire (default behavior). +- `metric_timestamp_cache_size` (default `1000`): Only relevant for delta temporality span metrics. Controls the size of the cache used to keep track of a metric's TimestampUnixNano the last time it was flushed. When a metric is evicted from the cache, its next data point will indicate a "reset" in the series. Downstream components converting from delta to cumulative, like `prometheusexporter`, may handle these resets by setting cumulative counters back to 0. - `exemplars`: Use to configure how to attach exemplars to metrics. - - `enabled` (default: `false`): enabling will add spans as Exemplars to all metrics. Exemplars are only kept for one flush interval. + - `enabled` (default: `false`): enabling will add spans as Exemplars to all metrics. Exemplars are only kept for one flush interval.rom the cache, its next data point will indicate a "reset" in the series. Downstream components converting from delta to cumulative, like `prometheusexporter`, may handle these resets by setting cumulative counters back to 0. - `events`: Use to configure the events metric. - `enabled`: (default: `false`): enabling will add the events metric. - `dimensions`: (mandatory if `enabled`) the list of the span's event attributes to add as dimensions to the events metric, which will be included _on top of_ the common and configured `dimensions` for span and resource attributes. - `resource_metrics_key_attributes`: Filter the resource attributes used to produce the resource metrics key map hash. Use this in case changing resource attributes (e.g. process id) are breaking counter metrics. +The feature gate `connector.spanmetrics.legacyMetricNames` (disabled by default) controls the connector to use legacy metric names. + ## Examples The following is a simple example usage of the `spanmetrics` connector. diff --git a/connector/spanmetricsconnector/config.go b/connector/spanmetricsconnector/config.go index c379a2c38fd9..2fb5bd9118f6 100644 --- a/connector/spanmetricsconnector/config.go +++ b/connector/spanmetricsconnector/config.go @@ -23,6 +23,8 @@ var defaultHistogramBucketsMs = []float64{ 2, 4, 6, 8, 10, 50, 100, 200, 400, 800, 1000, 1400, 2000, 5000, 10_000, 15_000, } +var defaultDeltaTimestampCacheSize = 1000 + // Dimension defines the dimension name and optional default value if the Dimension is missing from a span attribute. type Dimension struct { Name string `mapstructure:"name"` @@ -71,6 +73,9 @@ type Config struct { // Default value (0) means that the metrics will never expire. MetricsExpiration time.Duration `mapstructure:"metrics_expiration"` + // TimestampCacheSize controls the size of the cache used to keep track of delta metrics' TimestampUnixNano the last time it was flushed + TimestampCacheSize *int `mapstructure:"metric_timestamp_cache_size"` + // Namespace is the namespace of the metrics emitted by the connector. Namespace string `mapstructure:"namespace"` @@ -139,6 +144,13 @@ func (c Config) Validate() error { return fmt.Errorf("invalid metrics_expiration: %v, the duration should be positive", c.MetricsExpiration) } + if c.GetAggregationTemporality() == pmetric.AggregationTemporalityDelta && c.GetDeltaTimestampCacheSize() <= 0 { + return fmt.Errorf( + "invalid delta timestamp cache size: %v, the maximum number of the items in the cache should be positive", + c.GetDeltaTimestampCacheSize(), + ) + } + return nil } @@ -151,6 +163,13 @@ func (c Config) GetAggregationTemporality() pmetric.AggregationTemporality { return pmetric.AggregationTemporalityCumulative } +func (c Config) GetDeltaTimestampCacheSize() int { + if c.TimestampCacheSize != nil { + return *c.TimestampCacheSize + } + return defaultDeltaTimestampCacheSize +} + // validateDimensions checks duplicates for reserved dimensions and additional dimensions. func validateDimensions(dimensions []Dimension) error { labelNames := make(map[string]struct{}) diff --git a/connector/spanmetricsconnector/config_test.go b/connector/spanmetricsconnector/config_test.go index da235794f3cb..79c823f9b574 100644 --- a/connector/spanmetricsconnector/config_test.go +++ b/connector/spanmetricsconnector/config_test.go @@ -5,6 +5,7 @@ package spanmetricsconnector import ( "errors" + "net/http" "path/filepath" "testing" "time" @@ -25,12 +26,14 @@ func TestLoadConfig(t *testing.T) { cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml")) require.NoError(t, err) - defaultMethod := "GET" + defaultMethod := http.MethodGet defaultMaxPerDatapoint := 5 + customTimestampCacheSize := 123 tests := []struct { - id component.ID - expected component.Config - errorMessage string + id component.ID + expected component.Config + errorMessage string + extraAssertions func(config *Config) }{ { id: component.NewIDWithName(metadata.Type, "default"), @@ -48,6 +51,7 @@ func TestLoadConfig(t *testing.T) { {Name: "http.method", Default: &defaultMethod}, {Name: "http.status_code", Default: (*string)(nil)}, }, + Namespace: DefaultNamespace, DimensionsCacheSize: 1500, ResourceMetricsCacheSize: 1600, MetricsFlushInterval: 30 * time.Second, @@ -64,10 +68,12 @@ func TestLoadConfig(t *testing.T) { }, }, }, - }}, + }, + }, { id: component.NewIDWithName(metadata.Type, "exponential_histogram"), expected: &Config{ + Namespace: DefaultNamespace, AggregationTemporality: cumulative, DimensionsCacheSize: defaultDimensionsCacheSize, ResourceMetricsCacheSize: defaultResourceMetricsCacheSize, @@ -101,6 +107,7 @@ func TestLoadConfig(t *testing.T) { MetricsFlushInterval: 60 * time.Second, Histogram: HistogramConfig{Disable: false, Unit: defaultUnit}, Exemplars: ExemplarsConfig{Enabled: true}, + Namespace: DefaultNamespace, }, }, { @@ -112,6 +119,7 @@ func TestLoadConfig(t *testing.T) { MetricsFlushInterval: 60 * time.Second, Histogram: HistogramConfig{Disable: false, Unit: defaultUnit}, Exemplars: ExemplarsConfig{Enabled: true, MaxPerDataPoint: &defaultMaxPerDatapoint}, + Namespace: DefaultNamespace, }, }, { @@ -123,8 +131,39 @@ func TestLoadConfig(t *testing.T) { ResourceMetricsKeyAttributes: []string{"service.name", "telemetry.sdk.language", "telemetry.sdk.name"}, MetricsFlushInterval: 60 * time.Second, Histogram: HistogramConfig{Disable: false, Unit: defaultUnit}, + Namespace: DefaultNamespace, + }, + }, + { + id: component.NewIDWithName(metadata.Type, "custom_delta_timestamp_cache_size"), + expected: &Config{ + AggregationTemporality: "AGGREGATION_TEMPORALITY_DELTA", + TimestampCacheSize: &customTimestampCacheSize, + DimensionsCacheSize: defaultDimensionsCacheSize, + ResourceMetricsCacheSize: defaultResourceMetricsCacheSize, + MetricsFlushInterval: 60 * time.Second, + Histogram: HistogramConfig{Disable: false, Unit: defaultUnit}, + Namespace: DefaultNamespace, + }, + }, + { + id: component.NewIDWithName(metadata.Type, "default_delta_timestamp_cache_size"), + expected: &Config{ + AggregationTemporality: "AGGREGATION_TEMPORALITY_DELTA", + DimensionsCacheSize: defaultDimensionsCacheSize, + ResourceMetricsCacheSize: defaultResourceMetricsCacheSize, + MetricsFlushInterval: 60 * time.Second, + Histogram: HistogramConfig{Disable: false, Unit: defaultUnit}, + Namespace: DefaultNamespace, + }, + extraAssertions: func(config *Config) { + assert.Equal(t, defaultDeltaTimestampCacheSize, config.GetDeltaTimestampCacheSize()) }, }, + { + id: component.NewIDWithName(metadata.Type, "invalid_delta_timestamp_cache_size"), + errorMessage: "invalid delta timestamp cache size: 0, the maximum number of the items in the cache should be positive", + }, } for _, tt := range tests { @@ -134,7 +173,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - err = component.UnmarshalConfig(sub, cfg) + err = sub.Unmarshal(cfg) if tt.expected == nil { err = errors.Join(err, component.ValidateConfig(cfg)) @@ -143,6 +182,9 @@ func TestLoadConfig(t *testing.T) { } assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) + if tt.extraAssertions != nil { + tt.extraAssertions(cfg.(*Config)) + } }) } } diff --git a/connector/spanmetricsconnector/connector.go b/connector/spanmetricsconnector/connector.go index 3fab7d119452..3a0678dd2839 100644 --- a/connector/spanmetricsconnector/connector.go +++ b/connector/spanmetricsconnector/connector.go @@ -9,19 +9,21 @@ import ( "sync" "time" + "github.com/hashicorp/golang-lru/v2/simplelru" + "github.com/jonboulle/clockwork" "github.com/lightstep/go-expohisto/structure" - "github.com/tilinna/clock" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector/internal/cache" "github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector/internal/metrics" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/traceutil" + utilattri "github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil" ) @@ -50,7 +52,7 @@ type connectorImp struct { metricsConsumer consumer.Metrics // Additional dimensions to add to metrics. - dimensions []dimension + dimensions []utilattri.Dimension resourceMetrics *cache.Cache[resourceKey, *resourceMetrics] @@ -62,16 +64,20 @@ type connectorImp struct { // e.g. { "foo/barOK": { "serviceName": "foo", "span.name": "/bar", "status_code": "OK" }} metricKeyToDimensions *cache.Cache[metrics.Key, pcommon.Map] - ticker *clock.Ticker + clock clockwork.Clock + ticker clockwork.Ticker done chan struct{} started bool shutdownOnce sync.Once // Event dimensions to add to the events metric. - eDimensions []dimension + eDimensions []utilattri.Dimension events EventsConfig + + // Tracks the last TimestampUnixNano for delta metrics so that they represent an uninterrupted series. Unused for cumulative span metrics. + lastDeltaTimestamps *simplelru.LRU[metrics.Key, pcommon.Timestamp] } type resourceMetrics struct { @@ -85,27 +91,22 @@ type resourceMetrics struct { lastSeen time.Time } -type dimension struct { - name string - value *pcommon.Value -} - -func newDimensions(cfgDims []Dimension) []dimension { +func newDimensions(cfgDims []Dimension) []utilattri.Dimension { if len(cfgDims) == 0 { return nil } - dims := make([]dimension, len(cfgDims)) + dims := make([]utilattri.Dimension, len(cfgDims)) for i := range cfgDims { - dims[i].name = cfgDims[i].Name + dims[i].Name = cfgDims[i].Name if cfgDims[i].Default != nil { val := pcommon.NewValueStr(*cfgDims[i].Default) - dims[i].value = &val + dims[i].Value = &val } } return dims } -func newConnector(logger *zap.Logger, config component.Config, ticker *clock.Ticker) (*connectorImp, error) { +func newConnector(logger *zap.Logger, config component.Config, clock clockwork.Clock) (*connectorImp, error) { logger.Info("Building spanmetrics connector") cfg := config.(*Config) @@ -125,6 +126,16 @@ func newConnector(logger *zap.Logger, config component.Config, ticker *clock.Tic resourceMetricsKeyAttributes[attr] = s } + var lastDeltaTimestamps *simplelru.LRU[metrics.Key, pcommon.Timestamp] + if cfg.GetAggregationTemporality() == pmetric.AggregationTemporalityDelta { + lastDeltaTimestamps, err = simplelru.NewLRU[metrics.Key, pcommon.Timestamp](cfg.GetDeltaTimestampCacheSize(), func(k metrics.Key, _ pcommon.Timestamp) { + logger.Info("Evicting cached delta timestamp", zap.String("key", string(k))) + }) + if err != nil { + return nil, err + } + } + return &connectorImp{ logger: logger, config: *cfg, @@ -133,7 +144,9 @@ func newConnector(logger *zap.Logger, config component.Config, ticker *clock.Tic dimensions: newDimensions(cfg.Dimensions), keyBuf: bytes.NewBuffer(make([]byte, 0, 1024)), metricKeyToDimensions: metricKeyToDimensionsCache, - ticker: ticker, + lastDeltaTimestamps: lastDeltaTimestamps, + clock: clock, + ticker: clock.NewTicker(cfg.MetricsFlushInterval), done: make(chan struct{}), eDimensions: newDimensions(cfg.Events.Dimensions), events: cfg.Events, @@ -196,7 +209,7 @@ func (p *connectorImp) Start(ctx context.Context, _ component.Host) error { select { case <-p.done: return - case <-p.ticker.C: + case <-p.ticker.Chan(): p.exportMetrics(ctx) } } @@ -251,6 +264,7 @@ func (p *connectorImp) exportMetrics(ctx context.Context) { // buildMetrics collects the computed raw metrics data and builds OTLP metrics. func (p *connectorImp) buildMetrics() pmetric.Metrics { m := pmetric.NewMetrics() + timestamp := pcommon.NewTimestampFromTime(p.clock.Now()) p.resourceMetrics.ForEach(func(_ resourceKey, rawMetrics *resourceMetrics) { rm := m.ResourceMetrics().AppendEmpty() @@ -259,23 +273,52 @@ func (p *connectorImp) buildMetrics() pmetric.Metrics { sm := rm.ScopeMetrics().AppendEmpty() sm.Scope().SetName("spanmetricsconnector") + /** + * To represent an uninterrupted stream of metrics as per the spec, the (StartTimestamp, Timestamp)'s of successive data points should be: + * - For cumulative metrics: (T1, T2), (T1, T3), (T1, T4) ... + * - For delta metrics: (T1, T2), (T2, T3), (T3, T4) ... + */ + deltaMetricKeys := make(map[metrics.Key]bool) + startTimeGenerator := func(mk metrics.Key) pcommon.Timestamp { + startTime := rawMetrics.startTimestamp + if p.config.GetAggregationTemporality() == pmetric.AggregationTemporalityDelta { + if lastTimestamp, ok := p.lastDeltaTimestamps.Get(mk); ok { + startTime = lastTimestamp + } + // Collect lastDeltaTimestamps keys that need to be updated. Metrics can share the same key, so defer the update. + deltaMetricKeys[mk] = true + } + return startTime + } + + metricsNamespace := p.config.Namespace + if legacyMetricNamesFeatureGate.IsEnabled() && metricsNamespace == DefaultNamespace { + metricsNamespace = "" + } + sums := rawMetrics.sums metric := sm.Metrics().AppendEmpty() - metric.SetName(buildMetricName(p.config.Namespace, metricNameCalls)) - sums.BuildMetrics(metric, rawMetrics.startTimestamp, p.config.GetAggregationTemporality()) + metric.SetName(buildMetricName(metricsNamespace, metricNameCalls)) + sums.BuildMetrics(metric, startTimeGenerator, timestamp, p.config.GetAggregationTemporality()) + if !p.config.Histogram.Disable { histograms := rawMetrics.histograms metric = sm.Metrics().AppendEmpty() - metric.SetName(buildMetricName(p.config.Namespace, metricNameDuration)) + metric.SetName(buildMetricName(metricsNamespace, metricNameDuration)) metric.SetUnit(p.config.Histogram.Unit.String()) - histograms.BuildMetrics(metric, rawMetrics.startTimestamp, p.config.GetAggregationTemporality()) + histograms.BuildMetrics(metric, startTimeGenerator, timestamp, p.config.GetAggregationTemporality()) } events := rawMetrics.events if p.events.Enabled { metric = sm.Metrics().AppendEmpty() - metric.SetName(buildMetricName(p.config.Namespace, metricNameEvents)) - events.BuildMetrics(metric, rawMetrics.startTimestamp, p.config.GetAggregationTemporality()) + metric.SetName(buildMetricName(metricsNamespace, metricNameEvents)) + events.BuildMetrics(metric, startTimeGenerator, timestamp, p.config.GetAggregationTemporality()) + } + + for mk := range deltaMetricKeys { + // For delta metrics, cache the current data point's timestamp, which will be the start timestamp for the next data points in the series + p.lastDeltaTimestamps.Add(mk, timestamp) } }) @@ -297,7 +340,7 @@ func (p *connectorImp) resetState() { return } - now := time.Now() + now := p.clock.Now() p.resourceMetrics.ForEach(func(k resourceKey, m *resourceMetrics) { // Exemplars are only relevant to this batch of traces, so must be cleared within the lock if p.config.Exemplars.Enabled { @@ -315,7 +358,6 @@ func (p *connectorImp) resetState() { } } }) - } } @@ -326,6 +368,7 @@ func (p *connectorImp) resetState() { // and span metadata such as name, kind, status_code and any additional // dimensions the user has configured. func (p *connectorImp) aggregateMetrics(traces ptrace.Traces) { + startTimestamp := pcommon.NewTimestampFromTime(p.clock.Now()) for i := 0; i < traces.ResourceSpans().Len(); i++ { rspans := traces.ResourceSpans().At(i) resourceAttr := rspans.Resource().Attributes() @@ -334,7 +377,7 @@ func (p *connectorImp) aggregateMetrics(traces ptrace.Traces) { continue } - rm := p.getOrCreateResourceMetrics(resourceAttr) + rm := p.getOrCreateResourceMetrics(resourceAttr, startTimestamp) sums := rm.sums histograms := rm.histograms events := rm.events @@ -366,7 +409,6 @@ func (p *connectorImp) aggregateMetrics(traces ptrace.Traces) { h := histograms.GetOrCreate(key, attributes) p.addExemplar(span, duration, h) h.Observe(duration) - } // aggregate sums metrics s := sums.GetOrCreate(key, attributes) @@ -431,7 +473,7 @@ func (p *connectorImp) createResourceKey(attr pcommon.Map) resourceKey { return pdatautil.MapHash(m) } -func (p *connectorImp) getOrCreateResourceMetrics(attr pcommon.Map) *resourceMetrics { +func (p *connectorImp) getOrCreateResourceMetrics(attr pcommon.Map, startTimestamp pcommon.Timestamp) *resourceMetrics { key := p.createResourceKey(attr) v, ok := p.resourceMetrics.Get(key) if !ok { @@ -440,14 +482,14 @@ func (p *connectorImp) getOrCreateResourceMetrics(attr pcommon.Map) *resourceMet sums: metrics.NewSumMetrics(p.config.Exemplars.MaxPerDataPoint), events: metrics.NewSumMetrics(p.config.Exemplars.MaxPerDataPoint), attributes: attr, - startTimestamp: pcommon.NewTimestampFromTime(time.Now()), + startTimestamp: startTimestamp, } p.resourceMetrics.Add(key, v) } // If expiration is enabled, track the last seen time. if p.config.MetricsExpiration > 0 { - v.lastSeen = time.Now() + v.lastSeen = p.clock.Now() } return v @@ -463,7 +505,7 @@ func contains(elements []string, value string) bool { return false } -func (p *connectorImp) buildAttributes(serviceName string, span ptrace.Span, resourceAttrs pcommon.Map, dimensions []dimension) pcommon.Map { +func (p *connectorImp) buildAttributes(serviceName string, span ptrace.Span, resourceAttrs pcommon.Map, dimensions []utilattri.Dimension) pcommon.Map { attr := pcommon.NewMap() attr.EnsureCapacity(4 + len(dimensions)) if !contains(p.config.ExcludeDimensions, serviceNameKey) { @@ -479,8 +521,8 @@ func (p *connectorImp) buildAttributes(serviceName string, span ptrace.Span, res attr.PutStr(statusCodeKey, traceutil.StatusCodeStr(span.Status().Code())) } for _, d := range dimensions { - if v, ok := getDimensionValue(d, span.Attributes(), resourceAttrs); ok { - v.CopyTo(attr.PutEmpty(d.name)) + if v, ok := utilattri.GetDimensionValue(d, span.Attributes(), resourceAttrs); ok { + v.CopyTo(attr.PutEmpty(d.Name)) } } return attr @@ -498,7 +540,7 @@ func concatDimensionValue(dest *bytes.Buffer, value string, prefixSep bool) { // or resource/event attributes. If the dimension exists in both, the span's attributes, being the most specific, takes precedence. // // The metric key is a simple concatenation of dimension values, delimited by a null character. -func (p *connectorImp) buildKey(serviceName string, span ptrace.Span, optionalDims []dimension, resourceOrEventAttrs pcommon.Map) metrics.Key { +func (p *connectorImp) buildKey(serviceName string, span ptrace.Span, optionalDims []utilattri.Dimension, resourceOrEventAttrs pcommon.Map) metrics.Key { p.keyBuf.Reset() if !contains(p.config.ExcludeDimensions, serviceNameKey) { concatDimensionValue(p.keyBuf, serviceName, false) @@ -514,7 +556,7 @@ func (p *connectorImp) buildKey(serviceName string, span ptrace.Span, optionalDi } for _, d := range optionalDims { - if v, ok := getDimensionValue(d, span.Attributes(), resourceOrEventAttrs); ok { + if v, ok := utilattri.GetDimensionValue(d, span.Attributes(), resourceOrEventAttrs); ok { concatDimensionValue(p.keyBuf, v.AsString(), true) } } @@ -522,28 +564,6 @@ func (p *connectorImp) buildKey(serviceName string, span ptrace.Span, optionalDi return metrics.Key(p.keyBuf.String()) } -// getDimensionValue gets the dimension value for the given configured dimension. -// It searches through the span's attributes first, being the more specific; -// falling back to searching in resource attributes if it can't be found in the span. -// Finally, falls back to the configured default value if provided. -// -// The ok flag indicates if a dimension value was fetched in order to differentiate -// an empty string value from a state where no value was found. -func getDimensionValue(d dimension, spanAttr pcommon.Map, resourceAttr pcommon.Map) (v pcommon.Value, ok bool) { - // The more specific span attribute should take precedence. - if attr, exists := spanAttr.Get(d.name); exists { - return attr, true - } - if attr, exists := resourceAttr.Get(d.name); exists { - return attr, true - } - // Set the default if configured, otherwise this metric will have no value set for the dimension. - if d.value != nil { - return *d.value, true - } - return v, ok -} - // buildMetricName builds the namespace prefix for the metric name. func buildMetricName(namespace string, name string) string { if namespace != "" { diff --git a/connector/spanmetricsconnector/connector_test.go b/connector/spanmetricsconnector/connector_test.go index eae39cda1e0a..a17e7d6bf605 100644 --- a/connector/spanmetricsconnector/connector_test.go +++ b/connector/spanmetricsconnector/connector_test.go @@ -10,18 +10,19 @@ import ( "testing" "time" + "github.com/jonboulle/clockwork" "github.com/lightstep/go-expohisto/structure" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/tilinna/clock" "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/connector/connectortest" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/consumer/consumertest" + "go.opentelemetry.io/collector/featuregate" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "go.uber.org/zap" "go.uber.org/zap/zapcore" "go.uber.org/zap/zaptest" @@ -29,6 +30,7 @@ import ( "google.golang.org/grpc/metadata" "github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector/internal/metrics" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil" ) const ( @@ -76,7 +78,7 @@ type span struct { } // verifyDisabledHistogram expects that histograms are disabled. -func verifyDisabledHistogram(t testing.TB, input pmetric.Metrics) bool { +func verifyDisabledHistogram(tb testing.TB, input pmetric.Metrics) bool { for i := 0; i < input.ResourceMetrics().Len(); i++ { rm := input.ResourceMetrics().At(i) ism := rm.ScopeMetrics() @@ -85,22 +87,21 @@ func verifyDisabledHistogram(t testing.TB, input pmetric.Metrics) bool { m := ism.At(ismC).Metrics() for mC := 0; mC < m.Len(); mC++ { metric := m.At(mC) - assert.NotEqual(t, pmetric.MetricTypeExponentialHistogram, metric.Type()) - assert.NotEqual(t, pmetric.MetricTypeHistogram, metric.Type()) + assert.NotEqual(tb, pmetric.MetricTypeExponentialHistogram, metric.Type()) + assert.NotEqual(tb, pmetric.MetricTypeHistogram, metric.Type()) } } } return true } -func verifyExemplarsExist(t testing.TB, input pmetric.Metrics) bool { +func verifyExemplarsExist(tb testing.TB, input pmetric.Metrics) bool { for i := 0; i < input.ResourceMetrics().Len(); i++ { rm := input.ResourceMetrics().At(i) ism := rm.ScopeMetrics() // Checking all metrics, naming notice: ismC/mC - C here is for Counter. for ismC := 0; ismC < ism.Len(); ismC++ { - m := ism.At(ismC).Metrics() for mC := 0; mC < m.Len(); mC++ { @@ -112,7 +113,7 @@ func verifyExemplarsExist(t testing.TB, input pmetric.Metrics) bool { dps := metric.Histogram().DataPoints() for dp := 0; dp < dps.Len(); dp++ { d := dps.At(dp) - assert.True(t, d.Exemplars().Len() > 0) + assert.Positive(tb, d.Exemplars().Len()) } } } @@ -121,8 +122,8 @@ func verifyExemplarsExist(t testing.TB, input pmetric.Metrics) bool { } // verifyConsumeMetricsInputCumulative expects one accumulation of metrics, and marked as cumulative -func verifyConsumeMetricsInputCumulative(t testing.TB, input pmetric.Metrics) bool { - return verifyConsumeMetricsInput(t, input, pmetric.AggregationTemporalityCumulative, 1) +func verifyConsumeMetricsInputCumulative(tb testing.TB, input pmetric.Metrics) bool { + return verifyConsumeMetricsInput(tb, input, pmetric.AggregationTemporalityCumulative, 1) } func verifyBadMetricsOkay(_ testing.TB, _ pmetric.Metrics) bool { @@ -130,37 +131,37 @@ func verifyBadMetricsOkay(_ testing.TB, _ pmetric.Metrics) bool { } // verifyConsumeMetricsInputDelta expects one accumulation of metrics, and marked as delta -func verifyConsumeMetricsInputDelta(t testing.TB, input pmetric.Metrics) bool { - return verifyConsumeMetricsInput(t, input, pmetric.AggregationTemporalityDelta, 1) +func verifyConsumeMetricsInputDelta(tb testing.TB, input pmetric.Metrics) bool { + return verifyConsumeMetricsInput(tb, input, pmetric.AggregationTemporalityDelta, 1) } // verifyMultipleCumulativeConsumptions expects the amount of accumulations as kept track of by numCumulativeConsumptions. // numCumulativeConsumptions acts as a multiplier for the values, since the cumulative metrics are additive. -func verifyMultipleCumulativeConsumptions() func(t testing.TB, input pmetric.Metrics) bool { +func verifyMultipleCumulativeConsumptions() func(tb testing.TB, input pmetric.Metrics) bool { numCumulativeConsumptions := 0 - return func(t testing.TB, input pmetric.Metrics) bool { + return func(tb testing.TB, input pmetric.Metrics) bool { numCumulativeConsumptions++ - return verifyConsumeMetricsInput(t, input, pmetric.AggregationTemporalityCumulative, numCumulativeConsumptions) + return verifyConsumeMetricsInput(tb, input, pmetric.AggregationTemporalityCumulative, numCumulativeConsumptions) } } // verifyConsumeMetricsInput verifies the input of the ConsumeMetrics call from this connector. // This is the best point to verify the computed metrics from spans are as expected. -func verifyConsumeMetricsInput(t testing.TB, input pmetric.Metrics, expectedTemporality pmetric.AggregationTemporality, numCumulativeConsumptions int) bool { - require.Equal(t, 6, input.DataPointCount(), +func verifyConsumeMetricsInput(tb testing.TB, input pmetric.Metrics, expectedTemporality pmetric.AggregationTemporality, numCumulativeConsumptions int) bool { + require.Equal(tb, 6, input.DataPointCount(), "Should be 3 for each of call count and latency split into two resource scopes defined by: "+ "service-a: service-a (server kind) -> service-a (client kind) and "+ "service-b: service-b (service kind)", ) - require.Equal(t, 2, input.ResourceMetrics().Len()) + require.Equal(tb, 2, input.ResourceMetrics().Len()) for i := 0; i < input.ResourceMetrics().Len(); i++ { rm := input.ResourceMetrics().At(i) var numDataPoints int val, ok := rm.Resource().Attributes().Get(serviceNameKey) - require.True(t, ok) + require.True(tb, ok) serviceName := val.AsString() if serviceName == "service-a" { numDataPoints = 2 @@ -169,68 +170,68 @@ func verifyConsumeMetricsInput(t testing.TB, input pmetric.Metrics, expectedTemp } ilm := rm.ScopeMetrics() - require.Equal(t, 1, ilm.Len()) - assert.Equal(t, "spanmetricsconnector", ilm.At(0).Scope().Name()) + require.Equal(tb, 1, ilm.Len()) + assert.Equal(tb, "spanmetricsconnector", ilm.At(0).Scope().Name()) m := ilm.At(0).Metrics() - require.Equal(t, 2, m.Len(), "only sum and histogram metric types generated") + require.Equal(tb, 2, m.Len(), "only sum and histogram metric types generated") // validate calls - sum metrics metric := m.At(0) - assert.Equal(t, metricNameCalls, metric.Name()) - assert.Equal(t, expectedTemporality, metric.Sum().AggregationTemporality()) - assert.True(t, metric.Sum().IsMonotonic()) + assert.Equal(tb, metricNameCalls, metric.Name()) + assert.Equal(tb, expectedTemporality, metric.Sum().AggregationTemporality()) + assert.True(tb, metric.Sum().IsMonotonic()) seenMetricIDs := make(map[metricID]bool) callsDps := metric.Sum().DataPoints() - require.Equal(t, numDataPoints, callsDps.Len()) + require.Equal(tb, numDataPoints, callsDps.Len()) for dpi := 0; dpi < numDataPoints; dpi++ { dp := callsDps.At(dpi) - assert.Equal(t, + assert.Equal(tb, int64(numCumulativeConsumptions), dp.IntValue(), "There should only be one metric per Service/name/kind combination", ) - assert.NotZero(t, dp.StartTimestamp(), "StartTimestamp should be set") - assert.NotZero(t, dp.Timestamp(), "Timestamp should be set") - verifyMetricLabels(dp, t, seenMetricIDs) + assert.NotZero(tb, dp.StartTimestamp(), "StartTimestamp should be set") + assert.NotZero(tb, dp.Timestamp(), "Timestamp should be set") + verifyMetricLabels(tb, dp, seenMetricIDs) } // validate latency - histogram metrics metric = m.At(1) - assert.Equal(t, metricNameDuration, metric.Name()) - assert.Equal(t, defaultUnit.String(), metric.Unit()) + assert.Equal(tb, metricNameDuration, metric.Name()) + assert.Equal(tb, defaultUnit.String(), metric.Unit()) if metric.Type() == pmetric.MetricTypeExponentialHistogram { hist := metric.ExponentialHistogram() - assert.Equal(t, expectedTemporality, hist.AggregationTemporality()) - verifyExponentialHistogramDataPoints(t, hist.DataPoints(), numDataPoints, numCumulativeConsumptions) + assert.Equal(tb, expectedTemporality, hist.AggregationTemporality()) + verifyExponentialHistogramDataPoints(tb, hist.DataPoints(), numDataPoints, numCumulativeConsumptions) } else { hist := metric.Histogram() - assert.Equal(t, expectedTemporality, hist.AggregationTemporality()) - verifyExplicitHistogramDataPoints(t, hist.DataPoints(), numDataPoints, numCumulativeConsumptions) + assert.Equal(tb, expectedTemporality, hist.AggregationTemporality()) + verifyExplicitHistogramDataPoints(tb, hist.DataPoints(), numDataPoints, numCumulativeConsumptions) } } return true } -func verifyExplicitHistogramDataPoints(t testing.TB, dps pmetric.HistogramDataPointSlice, numDataPoints, numCumulativeConsumptions int) { +func verifyExplicitHistogramDataPoints(tb testing.TB, dps pmetric.HistogramDataPointSlice, numDataPoints, numCumulativeConsumptions int) { seenMetricIDs := make(map[metricID]bool) - require.Equal(t, numDataPoints, dps.Len()) + require.Equal(tb, numDataPoints, dps.Len()) for dpi := 0; dpi < numDataPoints; dpi++ { dp := dps.At(dpi) assert.Equal( - t, + tb, sampleDuration*float64(numCumulativeConsumptions), dp.Sum(), "Should be a 11ms duration measurement, multiplied by the number of stateful accumulations.") - assert.NotZero(t, dp.Timestamp(), "Timestamp should be set") + assert.NotZero(tb, dp.Timestamp(), "Timestamp should be set") // Verify bucket counts. // The bucket counts should be 1 greater than the explicit bounds as documented in: // https://github.com/open-telemetry/opentelemetry-proto/blob/main/opentelemetry/proto/metrics/v1/metrics.proto. - assert.Equal(t, dp.ExplicitBounds().Len()+1, dp.BucketCounts().Len()) + assert.Equal(tb, dp.ExplicitBounds().Len()+1, dp.BucketCounts().Len()) // Find the bucket index where the 11ms duration should belong in. var foundDurationIndex int @@ -247,31 +248,31 @@ func verifyExplicitHistogramDataPoints(t testing.TB, dps pmetric.HistogramDataPo if bi == foundDurationIndex { wantBucketCount = uint64(numCumulativeConsumptions) } - assert.Equal(t, wantBucketCount, dp.BucketCounts().At(bi)) + assert.Equal(tb, wantBucketCount, dp.BucketCounts().At(bi)) } - verifyMetricLabels(dp, t, seenMetricIDs) + verifyMetricLabels(tb, dp, seenMetricIDs) } } -func verifyExponentialHistogramDataPoints(t testing.TB, dps pmetric.ExponentialHistogramDataPointSlice, numDataPoints, numCumulativeConsumptions int) { +func verifyExponentialHistogramDataPoints(tb testing.TB, dps pmetric.ExponentialHistogramDataPointSlice, numDataPoints, numCumulativeConsumptions int) { seenMetricIDs := make(map[metricID]bool) - require.Equal(t, numDataPoints, dps.Len()) + require.Equal(tb, numDataPoints, dps.Len()) for dpi := 0; dpi < numDataPoints; dpi++ { dp := dps.At(dpi) assert.Equal( - t, + tb, sampleDuration*float64(numCumulativeConsumptions), dp.Sum(), "Should be a 11ms duration measurement, multiplied by the number of stateful accumulations.") - assert.Equal(t, uint64(numCumulativeConsumptions), dp.Count()) - assert.Equal(t, []uint64{uint64(numCumulativeConsumptions)}, dp.Positive().BucketCounts().AsRaw()) - assert.NotZero(t, dp.Timestamp(), "Timestamp should be set") + assert.Equal(tb, uint64(numCumulativeConsumptions), dp.Count()) + assert.Equal(tb, []uint64{uint64(numCumulativeConsumptions)}, dp.Positive().BucketCounts().AsRaw()) + assert.NotZero(tb, dp.Timestamp(), "Timestamp should be set") - verifyMetricLabels(dp, t, seenMetricIDs) + verifyMetricLabels(tb, dp, seenMetricIDs) } } -func verifyMetricLabels(dp metricDataPoint, t testing.TB, seenMetricIDs map[metricID]bool) { +func verifyMetricLabels(tb testing.TB, dp metricDataPoint, seenMetricIDs map[metricID]bool) { mID := metricID{} wantDimensions := map[string]pcommon.Value{ stringAttrName: pcommon.NewValueStr("stringAttrValue"), @@ -295,17 +296,17 @@ func verifyMetricLabels(dp metricDataPoint, t testing.TB, seenMetricIDs map[metr case statusCodeKey: mID.statusCode = v.Str() case notInSpanAttrName1: - assert.Fail(t, notInSpanAttrName1+" should not be in this metric") + assert.Fail(tb, notInSpanAttrName1+" should not be in this metric") default: - assert.Equal(t, wantDimensions[k], v) + assert.Equal(tb, wantDimensions[k], v) delete(wantDimensions, k) } return true }) - assert.Empty(t, wantDimensions, "Did not see all expected dimensions in metric. Missing: ", wantDimensions) + assert.Empty(tb, wantDimensions, "Did not see all expected dimensions in metric. Missing: ", wantDimensions) // Service/name/kind should be a unique metric. - assert.False(t, seenMetricIDs[mID]) + assert.False(tb, seenMetricIDs[mID]) seenMetricIDs[mID] = true } @@ -452,7 +453,7 @@ func disabledHistogramsConfig() HistogramConfig { } } -func newConnectorImp(defaultNullValue *string, histogramConfig func() HistogramConfig, exemplarsConfig func() ExemplarsConfig, eventsConfig func() EventsConfig, temporality string, expiration time.Duration, resourceMetricsKeyAttributes []string, excludedDimensions ...string) (*connectorImp, *clock.Mock, error) { +func newConnectorImp(defaultNullValue *string, histogramConfig func() HistogramConfig, exemplarsConfig func() ExemplarsConfig, eventsConfig func() EventsConfig, temporality string, expiration time.Duration, resourceMetricsKeyAttributes []string, deltaTimestampCacheSize int, clock clockwork.Clock, excludedDimensions ...string) (*connectorImp, error) { cfg := &Config{ AggregationTemporality: temporality, Histogram: histogramConfig(), @@ -477,19 +478,18 @@ func newConnectorImp(defaultNullValue *string, histogramConfig func() HistogramC // Add a resource attribute to test "process" attributes like IP, host, region, cluster, etc. {regionResourceAttrName, nil}, }, - Events: eventsConfig(), - MetricsExpiration: expiration, + Events: eventsConfig(), + MetricsExpiration: expiration, + TimestampCacheSize: &deltaTimestampCacheSize, + MetricsFlushInterval: time.Nanosecond, } - mockClock := clock.NewMock(time.Now()) - ticker := mockClock.NewTicker(time.Nanosecond) - - c, err := newConnector(zap.NewNop(), cfg, ticker) + c, err := newConnector(zap.NewNop(), cfg, clock) if err != nil { - return nil, nil, err + return nil, err } c.metricsConsumer = consumertest.NewNop() - return c, mockClock, nil + return c, nil } func stringp(str string) *string { @@ -499,7 +499,7 @@ func stringp(str string) *string { func TestBuildKeySameServiceNameCharSequence(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig().(*Config) - c, err := newConnector(zaptest.NewLogger(t), cfg, nil) + c, err := newConnector(zaptest.NewLogger(t), cfg, clockwork.NewFakeClock()) require.NoError(t, err) span0 := ptrace.NewSpan() @@ -519,7 +519,7 @@ func TestBuildKeyExcludeDimensionsAll(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig().(*Config) cfg.ExcludeDimensions = []string{"span.kind", "service.name", "span.name", "status.code"} - c, err := newConnector(zaptest.NewLogger(t), cfg, nil) + c, err := newConnector(zaptest.NewLogger(t), cfg, clockwork.NewFakeClock()) require.NoError(t, err) span0 := ptrace.NewSpan() @@ -532,7 +532,7 @@ func TestBuildKeyExcludeWrongDimensions(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig().(*Config) cfg.ExcludeDimensions = []string{"span.kind", "service.name.wrong.name", "span.name", "status.code"} - c, err := newConnector(zaptest.NewLogger(t), cfg, nil) + c, err := newConnector(zaptest.NewLogger(t), cfg, clockwork.NewFakeClock()) require.NoError(t, err) span0 := ptrace.NewSpan() @@ -544,13 +544,13 @@ func TestBuildKeyExcludeWrongDimensions(t *testing.T) { func TestBuildKeyWithDimensions(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig().(*Config) - c, err := newConnector(zaptest.NewLogger(t), cfg, nil) + c, err := newConnector(zaptest.NewLogger(t), cfg, clockwork.NewFakeClock()) require.NoError(t, err) defaultFoo := pcommon.NewValueStr("bar") for _, tc := range []struct { name string - optionalDims []dimension + optionalDims []pdatautil.Dimension resourceAttrMap map[string]any spanAttrMap map[string]any wantKey string @@ -561,22 +561,22 @@ func TestBuildKeyWithDimensions(t *testing.T) { }, { name: "neither span nor resource contains key, dim provides default", - optionalDims: []dimension{ - {name: "foo", value: &defaultFoo}, + optionalDims: []pdatautil.Dimension{ + {Name: "foo", Value: &defaultFoo}, }, wantKey: "ab\u0000c\u0000SPAN_KIND_UNSPECIFIED\u0000STATUS_CODE_UNSET\u0000bar", }, { name: "neither span nor resource contains key, dim provides no default", - optionalDims: []dimension{ - {name: "foo"}, + optionalDims: []pdatautil.Dimension{ + {Name: "foo"}, }, wantKey: "ab\u0000c\u0000SPAN_KIND_UNSPECIFIED\u0000STATUS_CODE_UNSET", }, { name: "span attribute contains dimension", - optionalDims: []dimension{ - {name: "foo"}, + optionalDims: []pdatautil.Dimension{ + {Name: "foo"}, }, spanAttrMap: map[string]any{ "foo": 99, @@ -585,8 +585,8 @@ func TestBuildKeyWithDimensions(t *testing.T) { }, { name: "resource attribute contains dimension", - optionalDims: []dimension{ - {name: "foo"}, + optionalDims: []pdatautil.Dimension{ + {Name: "foo"}, }, resourceAttrMap: map[string]any{ "foo": 99, @@ -595,8 +595,8 @@ func TestBuildKeyWithDimensions(t *testing.T) { }, { name: "both span and resource attribute contains dimension, should prefer span attribute", - optionalDims: []dimension{ - {name: "foo"}, + optionalDims: []pdatautil.Dimension{ + {Name: "foo"}, }, spanAttrMap: map[string]any{ "foo": 100, @@ -623,7 +623,7 @@ func TestStart(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig().(*Config) - createParams := connectortest.NewNopCreateSettings() + createParams := connectortest.NewNopSettings() conn, err := factory.CreateTracesToMetrics(context.Background(), createParams, cfg, consumertest.NewNop()) require.NoError(t, err) @@ -640,7 +640,7 @@ func TestConcurrentShutdown(t *testing.T) { core, observedLogs := observer.New(zapcore.InfoLevel) // Test - p, _, err := newConnectorImp(nil, explicitHistogramsConfig, disabledExemplarsConfig, disabledEventsConfig, cumulative, 0, []string{}) + p, err := newConnectorImp(nil, explicitHistogramsConfig, disabledExemplarsConfig, disabledEventsConfig, cumulative, 0, []string{}, 1000, clockwork.NewFakeClock()) require.NoError(t, err) // Override the default no-op consumer and logger for testing. p.metricsConsumer = new(consumertest.MetricsSink) @@ -658,7 +658,7 @@ func TestConcurrentShutdown(t *testing.T) { for i := 0; i < concurrency; i++ { go func() { err := p.Shutdown(ctx) - require.NoError(t, err) + assert.NoError(t, err) wg.Done() }() } @@ -685,7 +685,7 @@ func TestConnectorCapabilities(t *testing.T) { cfg := factory.CreateDefaultConfig().(*Config) // Test - c, err := newConnector(zaptest.NewLogger(t), cfg, nil) + c, err := newConnector(zaptest.NewLogger(t), cfg, clockwork.NewFakeClock()) // Override the default no-op consumer for testing. c.metricsConsumer = new(consumertest.MetricsSink) assert.NoError(t, err) @@ -693,7 +693,7 @@ func TestConnectorCapabilities(t *testing.T) { // Verify assert.NotNil(t, c) - assert.Equal(t, false, caps.MutatesData) + assert.False(t, caps.MutatesData) } type errConsumer struct { @@ -718,7 +718,8 @@ func TestConsumeMetricsErrors(t *testing.T) { logger := zap.New(core) var wg sync.WaitGroup - p, mockClock, err := newConnectorImp(nil, explicitHistogramsConfig, disabledExemplarsConfig, disabledEventsConfig, cumulative, 0, []string{}) + mockClock := clockwork.NewFakeClock() + p, err := newConnectorImp(nil, explicitHistogramsConfig, disabledExemplarsConfig, disabledEventsConfig, cumulative, 0, []string{}, 1000, mockClock) require.NoError(t, err) // Override the default no-op consumer and logger for testing. p.metricsConsumer = &errConsumer{ @@ -740,7 +741,7 @@ func TestConsumeMetricsErrors(t *testing.T) { // Trigger flush. wg.Add(1) - mockClock.Add(time.Nanosecond) + mockClock.Advance(time.Nanosecond) wg.Wait() // Allow time for log observer to sync all logs emitted. @@ -763,7 +764,7 @@ func TestConsumeTraces(t *testing.T) { aggregationTemporality string histogramConfig func() HistogramConfig exemplarConfig func() ExemplarsConfig - verifier func(t testing.TB, input pmetric.Metrics) bool + verifier func(tb testing.TB, input pmetric.Metrics) bool traces []ptrace.Traces }{ // disabling histogram @@ -883,7 +884,8 @@ func TestConsumeTraces(t *testing.T) { // Prepare mcon := &consumertest.MetricsSink{} - p, mockClock, err := newConnectorImp(stringp("defaultNullValue"), tc.histogramConfig, tc.exemplarConfig, disabledEventsConfig, tc.aggregationTemporality, 0, []string{}) + mockClock := clockwork.NewFakeClock() + p, err := newConnectorImp(stringp("defaultNullValue"), tc.histogramConfig, tc.exemplarConfig, disabledEventsConfig, tc.aggregationTemporality, 0, []string{}, 1000, mockClock) require.NoError(t, err) // Override the default no-op consumer with metrics sink for testing. p.metricsConsumer = mcon @@ -899,7 +901,7 @@ func TestConsumeTraces(t *testing.T) { assert.NoError(t, err) // Trigger flush. - mockClock.Add(time.Nanosecond) + mockClock.Advance(time.Nanosecond) require.Eventually(t, func() bool { return len(mcon.AllMetrics()) > 0 }, 1*time.Second, 10*time.Millisecond) @@ -910,7 +912,7 @@ func TestConsumeTraces(t *testing.T) { } func TestMetricKeyCache(t *testing.T) { - p, _, err := newConnectorImp(stringp("defaultNullValue"), explicitHistogramsConfig, disabledExemplarsConfig, disabledEventsConfig, cumulative, 0, []string{}) + p, err := newConnectorImp(stringp("defaultNullValue"), explicitHistogramsConfig, disabledExemplarsConfig, disabledEventsConfig, cumulative, 0, []string{}, 1000, clockwork.NewFakeClock()) require.NoError(t, err) traces := buildSampleTrace() @@ -939,7 +941,7 @@ func TestMetricKeyCache(t *testing.T) { } func TestResourceMetricsCache(t *testing.T) { - p, _, err := newConnectorImp(stringp("defaultNullValue"), explicitHistogramsConfig, disabledExemplarsConfig, disabledEventsConfig, cumulative, 0, []string{}) + p, err := newConnectorImp(stringp("defaultNullValue"), explicitHistogramsConfig, disabledExemplarsConfig, disabledEventsConfig, cumulative, 0, []string{}, 1000, clockwork.NewFakeClock()) require.NoError(t, err) // Test @@ -976,7 +978,7 @@ func TestResourceMetricsCache(t *testing.T) { } func TestResourceMetricsExpiration(t *testing.T) { - p, _, err := newConnectorImp(stringp("defaultNullValue"), explicitHistogramsConfig, disabledExemplarsConfig, disabledEventsConfig, cumulative, 1*time.Millisecond, []string{}) + p, err := newConnectorImp(stringp("defaultNullValue"), explicitHistogramsConfig, disabledExemplarsConfig, disabledEventsConfig, cumulative, 1*time.Millisecond, []string{}, 1000, clockwork.NewFakeClock()) require.NoError(t, err) // Test @@ -1001,7 +1003,7 @@ func TestResourceMetricsKeyAttributes(t *testing.T) { "service.name", } - p, _, err := newConnectorImp(stringp("defaultNullValue"), explicitHistogramsConfig, disabledExemplarsConfig, disabledEventsConfig, cumulative, 0, resourceMetricsKeyAttributes) + p, err := newConnectorImp(stringp("defaultNullValue"), explicitHistogramsConfig, disabledExemplarsConfig, disabledEventsConfig, cumulative, 0, resourceMetricsKeyAttributes, 1000, clockwork.NewFakeClock()) require.NoError(t, err) // Test @@ -1039,7 +1041,7 @@ func TestResourceMetricsKeyAttributes(t *testing.T) { func BenchmarkConnectorConsumeTraces(b *testing.B) { // Prepare - conn, _, err := newConnectorImp(stringp("defaultNullValue"), explicitHistogramsConfig, disabledExemplarsConfig, disabledEventsConfig, cumulative, 0, []string{}) + conn, err := newConnectorImp(stringp("defaultNullValue"), explicitHistogramsConfig, disabledExemplarsConfig, disabledEventsConfig, cumulative, 0, []string{}, 1000, clockwork.NewFakeClock()) require.NoError(b, err) traces := buildSampleTrace() @@ -1052,55 +1054,76 @@ func BenchmarkConnectorConsumeTraces(b *testing.B) { } func TestExcludeDimensionsConsumeTraces(t *testing.T) { - excludeDimensions := []string{"span.kind", "span.name", "totallyWrongNameDoesNotAffectAnything"} - p, _, err := newConnectorImp(stringp("defaultNullValue"), explicitHistogramsConfig, disabledExemplarsConfig, disabledEventsConfig, cumulative, 0, []string{}, excludeDimensions...) - require.NoError(t, err) - traces := buildSampleTrace() + testcases := []struct { + dsc string + featureGateEnabled bool + }{ + { + dsc: fmt.Sprintf("%s enabled", legacyMetricNamesFeatureGateID), + featureGateEnabled: true, + }, + { + dsc: fmt.Sprintf("%s disabled", legacyMetricNamesFeatureGateID), + featureGateEnabled: false, + }, + } - // Test - ctx := metadata.NewIncomingContext(context.Background(), nil) + excludeDimensions := []string{"span.kind", "span.name", "totallyWrongNameDoesNotAffectAnything"} + for _, tc := range testcases { + tc := tc + t.Run(tc.dsc, func(t *testing.T) { + // Set feature gate value + previousValue := legacyMetricNamesFeatureGate.IsEnabled() + require.NoError(t, featuregate.GlobalRegistry().Set(legacyMetricNamesFeatureGate.ID(), tc.featureGateEnabled)) + defer func() { + require.NoError(t, featuregate.GlobalRegistry().Set(legacyMetricNamesFeatureGate.ID(), previousValue)) + }() + + p, err := newConnectorImp(stringp("defaultNullValue"), explicitHistogramsConfig, disabledExemplarsConfig, disabledEventsConfig, cumulative, 0, []string{}, 1000, clockwork.NewFakeClock(), excludeDimensions...) + require.NoError(t, err) + traces := buildSampleTrace() - err = p.ConsumeTraces(ctx, traces) - require.NoError(t, err) - metrics := p.buildMetrics() + ctx := metadata.NewIncomingContext(context.Background(), nil) - for i := 0; i < metrics.ResourceMetrics().Len(); i++ { - rm := metrics.ResourceMetrics().At(i) - ism := rm.ScopeMetrics() - // Checking all metrics, naming notice: ilmC/mC - C here is for Counter. - for ilmC := 0; ilmC < ism.Len(); ilmC++ { - m := ism.At(ilmC).Metrics() - for mC := 0; mC < m.Len(); mC++ { - metric := m.At(mC) - // We check only sum and histogram metrics here, because for now only they are present in this module. + err = p.ConsumeTraces(ctx, traces) + require.NoError(t, err) + metrics := p.buildMetrics() - switch metric.Type() { - case pmetric.MetricTypeExponentialHistogram, pmetric.MetricTypeHistogram: - { - dp := metric.Histogram().DataPoints() - for dpi := 0; dpi < dp.Len(); dpi++ { - for attributeKey := range dp.At(dpi).Attributes().AsRaw() { - assert.NotContains(t, excludeDimensions, attributeKey) + for i := 0; i < metrics.ResourceMetrics().Len(); i++ { + rm := metrics.ResourceMetrics().At(i) + ism := rm.ScopeMetrics() + // Checking all metrics, naming notice: ilmC/mC - C here is for Counter. + for ilmC := 0; ilmC < ism.Len(); ilmC++ { + m := ism.At(ilmC).Metrics() + for mC := 0; mC < m.Len(); mC++ { + metric := m.At(mC) + // We check only sum and histogram metrics here, because for now only they are present in this module. + + switch metric.Type() { + case pmetric.MetricTypeExponentialHistogram, pmetric.MetricTypeHistogram: + { + dp := metric.Histogram().DataPoints() + for dpi := 0; dpi < dp.Len(); dpi++ { + for attributeKey := range dp.At(dpi).Attributes().AsRaw() { + assert.NotContains(t, excludeDimensions, attributeKey) + } + } } - - } - } - case pmetric.MetricTypeEmpty, pmetric.MetricTypeGauge, pmetric.MetricTypeSum, pmetric.MetricTypeSummary: - { - dp := metric.Sum().DataPoints() - for dpi := 0; dpi < dp.Len(); dpi++ { - for attributeKey := range dp.At(dpi).Attributes().AsRaw() { - assert.NotContains(t, excludeDimensions, attributeKey) + case pmetric.MetricTypeEmpty, pmetric.MetricTypeGauge, pmetric.MetricTypeSum, pmetric.MetricTypeSummary: + { + dp := metric.Sum().DataPoints() + for dpi := 0; dpi < dp.Len(); dpi++ { + for attributeKey := range dp.At(dpi).Attributes().AsRaw() { + assert.NotContains(t, excludeDimensions, attributeKey) + } + } } } } - } - } - } + }) } - } func TestConnectorConsumeTracesEvictedCacheKey(t *testing.T) { @@ -1183,7 +1206,8 @@ func TestConnectorConsumeTracesEvictedCacheKey(t *testing.T) { wg.Add(len(wantDataPointCounts)) // Note: default dimension key cache size is 2. - p, mockClock, err := newConnectorImp(stringp("defaultNullValue"), explicitHistogramsConfig, disabledExemplarsConfig, disabledEventsConfig, cumulative, 0, []string{}) + mockClock := clockwork.NewFakeClock() + p, err := newConnectorImp(stringp("defaultNullValue"), explicitHistogramsConfig, disabledExemplarsConfig, disabledEventsConfig, cumulative, 0, []string{}, 1000, mockClock) require.NoError(t, err) // Override the default no-op consumer with metrics sink for testing. p.metricsConsumer = mcon @@ -1202,7 +1226,7 @@ func TestConnectorConsumeTracesEvictedCacheKey(t *testing.T) { time.Sleep(time.Millisecond) // Trigger flush. - mockClock.Add(time.Nanosecond) + mockClock.Advance(time.Nanosecond) // Allow time for metrics flush to complete. time.Sleep(time.Millisecond) @@ -1268,7 +1292,8 @@ func TestConnectorConsumeTracesExpiredMetrics(t *testing.T) { mcon := &consumertest.MetricsSink{} // Creating a connector with a very short metricsTTL to ensure that the metrics are expired. - p, mockClock, err := newConnectorImp(stringp("defaultNullValue"), explicitHistogramsConfig, disabledExemplarsConfig, disabledEventsConfig, cumulative, 1*time.Nanosecond, []string{}) + mockClock := clockwork.NewFakeClock() + p, err := newConnectorImp(stringp("defaultNullValue"), explicitHistogramsConfig, disabledExemplarsConfig, disabledEventsConfig, cumulative, 1*time.Nanosecond, []string{}, 1000, mockClock) require.NoError(t, err) // Override the default no-op consumer with metrics sink for testing. p.metricsConsumer = mcon @@ -1292,7 +1317,7 @@ func TestConnectorConsumeTracesExpiredMetrics(t *testing.T) { time.Sleep(time.Millisecond) // Trigger flush. - mockClock.Add(time.Nanosecond) + mockClock.Advance(time.Nanosecond) // Allow time for metrics flush to complete. time.Sleep(time.Millisecond) @@ -1488,7 +1513,7 @@ func TestSpanMetrics_Events(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig().(*Config) cfg.Events = tt.eventsConfig - c, err := newConnector(zaptest.NewLogger(t), cfg, nil) + c, err := newConnector(zaptest.NewLogger(t), cfg, clockwork.NewFakeClock()) require.NoError(t, err) err = c.ConsumeTraces(context.Background(), buildSampleTrace()) require.NoError(t, err) @@ -1519,6 +1544,7 @@ func TestSpanMetrics_Events(t *testing.T) { }) } } + func TestExemplarsAreDiscardedAfterFlushing(t *testing.T) { tests := []struct { name string @@ -1543,7 +1569,7 @@ func TestExemplarsAreDiscardedAfterFlushing(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - p, _, err := newConnectorImp(stringp("defaultNullValue"), tt.histogramConfig, enabledExemplarsConfig, enabledEventsConfig, tt.temporality, 0, []string{}) + p, err := newConnectorImp(stringp("defaultNullValue"), tt.histogramConfig, enabledExemplarsConfig, enabledEventsConfig, tt.temporality, 0, []string{}, 1000, clockwork.NewFakeClock()) p.metricsConsumer = &consumertest.MetricsSink{} require.NoError(t, err) @@ -1613,26 +1639,26 @@ func assertDataPointsHaveExactlyOneExemplarForTrace(t *testing.T, metrics pmetri switch metric.Type() { case pmetric.MetricTypeSum: dps := metric.Sum().DataPoints() - assert.Greater(t, dps.Len(), 0) + assert.Positive(t, dps.Len()) for dpi := 0; dpi < dps.Len(); dpi++ { dp := dps.At(dpi) - assert.Equal(t, dp.Exemplars().Len(), 1) + assert.Equal(t, 1, dp.Exemplars().Len()) assert.Equal(t, dp.Exemplars().At(0).TraceID(), traceID) } case pmetric.MetricTypeHistogram: dps := metric.Histogram().DataPoints() - assert.Greater(t, dps.Len(), 0) + assert.Positive(t, dps.Len()) for dpi := 0; dpi < dps.Len(); dpi++ { dp := dps.At(dpi) - assert.Equal(t, dp.Exemplars().Len(), 1) + assert.Equal(t, 1, dp.Exemplars().Len()) assert.Equal(t, dp.Exemplars().At(0).TraceID(), traceID) } case pmetric.MetricTypeExponentialHistogram: dps := metric.ExponentialHistogram().DataPoints() - assert.Greater(t, dps.Len(), 0) + assert.Positive(t, dps.Len()) for dpi := 0; dpi < dps.Len(); dpi++ { dp := dps.At(dpi) - assert.Equal(t, dp.Exemplars().Len(), 1) + assert.Equal(t, 1, dp.Exemplars().Len()) assert.Equal(t, dp.Exemplars().At(0).TraceID(), traceID) } default: @@ -1642,3 +1668,214 @@ func assertDataPointsHaveExactlyOneExemplarForTrace(t *testing.T, metrics pmetri } } } + +func TestTimestampsForUninterruptedStream(t *testing.T) { + tests := []struct { + temporality string + verifyTimestamps func(startTime1 pcommon.Timestamp, timestamp1 pcommon.Timestamp, startTime2 pcommon.Timestamp, timestamp2 pcommon.Timestamp) + }{ + { + temporality: cumulative, + verifyTimestamps: func(startTime1 pcommon.Timestamp, timestamp1 pcommon.Timestamp, startTime2 pcommon.Timestamp, timestamp2 pcommon.Timestamp) { + // (T1, T2), (T1, T3) ... + assert.Greater(t, timestamp1, startTime1) + assert.Equal(t, startTime1, startTime2) + assert.Greater(t, timestamp2, startTime2) + }, + }, + { + temporality: delta, + verifyTimestamps: func(startTime1 pcommon.Timestamp, timestamp1 pcommon.Timestamp, startTime2 pcommon.Timestamp, timestamp2 pcommon.Timestamp) { + // (T1, T2), (T2, T3) ... + assert.Greater(t, timestamp1, startTime1) + assert.Equal(t, timestamp1, startTime2) + assert.Greater(t, timestamp2, startTime2) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.temporality, func(t *testing.T) { + mockClock := newAlwaysIncreasingClock() + p, err := newConnectorImp(stringp("defaultNullValue"), explicitHistogramsConfig, enabledExemplarsConfig, enabledEventsConfig, tt.temporality, 0, []string{}, 1000, mockClock) + require.NoError(t, err) + p.metricsConsumer = &consumertest.MetricsSink{} + + // Test + ctx := metadata.NewIncomingContext(context.Background(), nil) + + // Send first batch of spans + err = p.ConsumeTraces(ctx, buildSampleTrace()) + require.NoError(t, err) + p.exportMetrics(ctx) + metrics1 := p.metricsConsumer.(*consumertest.MetricsSink).AllMetrics()[0] + startTimestamp1, timestamp1 := verifyAndCollectCommonTimestamps(t, metrics1) + + // Send an unrelated batch of spans for a different resource + unrelatedTraces := ptrace.NewTraces() + initServiceSpans( + serviceSpans{ + serviceName: "unrelated-service", + spans: []span{ + { + name: "/ping", + kind: ptrace.SpanKindServer, + statusCode: ptrace.StatusCodeOk, + traceID: [16]byte{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10}, + spanID: [8]byte{0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18}, + }, + }, + }, unrelatedTraces.ResourceSpans().AppendEmpty()) + err = p.ConsumeTraces(ctx, unrelatedTraces) + require.NoError(t, err) + p.exportMetrics(ctx) + + // Send another set of spans that are the same as the first batch + err = p.ConsumeTraces(ctx, buildSampleTrace()) + require.NoError(t, err) + p.exportMetrics(ctx) + metrics2 := p.metricsConsumer.(*consumertest.MetricsSink).AllMetrics()[2] + startTimestamp2, timestamp2 := verifyAndCollectCommonTimestamps(t, metrics2) + + tt.verifyTimestamps(startTimestamp1, timestamp1, startTimestamp2, timestamp2) + }) + } +} + +func verifyAndCollectCommonTimestamps(t *testing.T, m pmetric.Metrics) (start pcommon.Timestamp, timestamp pcommon.Timestamp) { + // Go through all data points and collect the start timestamp and timestamp. They should be the same value for each data point + for i := 0; i < m.ResourceMetrics().Len(); i++ { + rm := m.ResourceMetrics().At(i) + + serviceName, _ := rm.Resource().Attributes().Get("service.name") + if serviceName.Str() == "unrelated-service" { + continue + } + + ism := rm.ScopeMetrics() + for ilmC := 0; ilmC < ism.Len(); ilmC++ { + m := ism.At(ilmC).Metrics() + for mC := 0; mC < m.Len(); mC++ { + metric := m.At(mC) + + switch metric.Type() { + case pmetric.MetricTypeSum: + { + dps := metric.Sum().DataPoints() + for dpi := 0; dpi < dps.Len(); dpi++ { + if int64(start) == 0 { + start = dps.At(dpi).StartTimestamp() + timestamp = dps.At(dpi).Timestamp() + } + assert.Equal(t, dps.At(dpi).StartTimestamp(), start) + assert.Equal(t, dps.At(dpi).Timestamp(), timestamp) + } + } + case pmetric.MetricTypeHistogram: + { + dps := metric.Histogram().DataPoints() + for dpi := 0; dpi < dps.Len(); dpi++ { + if int64(start) == 0 { + start = dps.At(dpi).StartTimestamp() + timestamp = dps.At(dpi).Timestamp() + } + assert.Equal(t, dps.At(dpi).StartTimestamp(), start) + assert.Equal(t, dps.At(dpi).Timestamp(), timestamp) + } + } + default: + t.Fail() + } + } + } + } + + return start, timestamp +} + +func TestDeltaTimestampCacheExpiry(t *testing.T) { + timestampCacheSize := 1 + mockClock := newAlwaysIncreasingClock() + p, err := newConnectorImp(stringp("defaultNullValue"), exponentialHistogramsConfig, enabledExemplarsConfig, enabledEventsConfig, delta, 0, []string{}, timestampCacheSize, mockClock) + require.NoError(t, err) + p.metricsConsumer = &consumertest.MetricsSink{} + + ctx := metadata.NewIncomingContext(context.Background(), nil) + + // Send a span from service A which should fill the cache + serviceATrace1 := ptrace.NewTraces() + initServiceSpans( + serviceSpans{ + serviceName: "service-a", + spans: []span{ + { + name: "/ping", + kind: ptrace.SpanKindServer, + statusCode: ptrace.StatusCodeOk, + traceID: [16]byte{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10}, + spanID: [8]byte{0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18}, + }, + }, + }, serviceATrace1.ResourceSpans().AppendEmpty()) + err = p.ConsumeTraces(ctx, serviceATrace1) + require.NoError(t, err) + p.exportMetrics(ctx) + + // Send a span from service B which should evict service A's entries + serviceBTrace1 := ptrace.NewTraces() + initServiceSpans( + serviceSpans{ + serviceName: "service-b", + spans: []span{ + { + name: "/ping", + kind: ptrace.SpanKindServer, + statusCode: ptrace.StatusCodeOk, + traceID: [16]byte{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10}, + spanID: [8]byte{0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18}, + }, + }, + }, serviceBTrace1.ResourceSpans().AppendEmpty()) + err = p.ConsumeTraces(ctx, serviceBTrace1) + require.NoError(t, err) + p.exportMetrics(ctx) + + // Send another span from Service A, then verify no error + cache was actually evicted + serviceATrace2 := ptrace.NewTraces() + initServiceSpans( + serviceSpans{ + serviceName: "service-a", + spans: []span{ + { + name: "/ping", + kind: ptrace.SpanKindServer, + statusCode: ptrace.StatusCodeOk, + traceID: [16]byte{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10}, + spanID: [8]byte{0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18}, + }, + }, + }, serviceATrace2.ResourceSpans().AppendEmpty()) + err = p.ConsumeTraces(ctx, serviceATrace2) + require.NoError(t, err) + p.exportMetrics(ctx) + + serviceATimestamp1 := p.metricsConsumer.(*consumertest.MetricsSink).AllMetrics()[0].ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics().At(0).Sum().DataPoints().At(0).Timestamp() + serviceAStartTimestamp2 := p.metricsConsumer.(*consumertest.MetricsSink).AllMetrics()[2].ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics().At(0).Sum().DataPoints().At(0).StartTimestamp() + assert.Greater(t, serviceAStartTimestamp2, serviceATimestamp1) // These would be the same if nothing was evicted from the cache +} + +// Clock where Now() always returns a greater value than the previous return value +type alwaysIncreasingClock struct { + clockwork.Clock +} + +func newAlwaysIncreasingClock() alwaysIncreasingClock { + return alwaysIncreasingClock{ + Clock: clockwork.NewFakeClock(), + } +} + +func (c alwaysIncreasingClock) Now() time.Time { + c.Clock.(clockwork.FakeClock).Advance(time.Millisecond) + return c.Clock.Now() +} diff --git a/connector/spanmetricsconnector/factory.go b/connector/spanmetricsconnector/factory.go index 60f2b554ce80..4f921ed8fe1c 100644 --- a/connector/spanmetricsconnector/factory.go +++ b/connector/spanmetricsconnector/factory.go @@ -9,14 +9,32 @@ import ( "context" "time" - "github.com/tilinna/clock" + "github.com/jonboulle/clockwork" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/connector" "go.opentelemetry.io/collector/consumer" + "go.opentelemetry.io/collector/featuregate" "github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector/internal/metadata" ) +const ( + DefaultNamespace = "traces.span.metrics" + legacyMetricNamesFeatureGateID = "connector.spanmetrics.legacyMetricNames" +) + +var legacyMetricNamesFeatureGate *featuregate.Gate + +func init() { + // TODO: Remove this feature gate when the legacy metric names are removed. + legacyMetricNamesFeatureGate = featuregate.GlobalRegistry().MustRegister( + legacyMetricNamesFeatureGateID, + featuregate.StageAlpha, // Alpha because we want it disabled by default. + featuregate.WithRegisterDescription("When enabled, connector uses legacy metric names."), + featuregate.WithRegisterReferenceURL("https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/33227"), + ) +} + // NewFactory creates a factory for the spanmetrics connector. func NewFactory() connector.Factory { return connector.NewFactory( @@ -33,18 +51,15 @@ func createDefaultConfig() component.Config { ResourceMetricsCacheSize: defaultResourceMetricsCacheSize, MetricsFlushInterval: 60 * time.Second, Histogram: HistogramConfig{Disable: false, Unit: defaultUnit}, + Namespace: DefaultNamespace, } } -func createTracesToMetricsConnector(ctx context.Context, params connector.CreateSettings, cfg component.Config, nextConsumer consumer.Metrics) (connector.Traces, error) { - c, err := newConnector(params.Logger, cfg, metricsTicker(ctx, cfg)) +func createTracesToMetricsConnector(ctx context.Context, params connector.Settings, cfg component.Config, nextConsumer consumer.Metrics) (connector.Traces, error) { + c, err := newConnector(params.Logger, cfg, clockwork.FromContext(ctx)) if err != nil { return nil, err } c.metricsConsumer = nextConsumer return c, nil } - -func metricsTicker(ctx context.Context, cfg component.Config) *clock.Ticker { - return clock.FromContext(ctx).NewTicker(cfg.(*Config).MetricsFlushInterval) -} diff --git a/connector/spanmetricsconnector/factory_test.go b/connector/spanmetricsconnector/factory_test.go index 0d8f5cfc4682..b3fc72ac489a 100644 --- a/connector/spanmetricsconnector/factory_test.go +++ b/connector/spanmetricsconnector/factory_test.go @@ -5,6 +5,7 @@ package spanmetricsconnector import ( "context" + "net/http" "testing" "time" @@ -12,17 +13,19 @@ import ( "go.opentelemetry.io/collector/connector/connectortest" "go.opentelemetry.io/collector/consumer/consumertest" "go.opentelemetry.io/collector/pdata/pcommon" + + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil" ) func TestNewConnector(t *testing.T) { - defaultMethod := "GET" + defaultMethod := http.MethodGet defaultMethodValue := pcommon.NewValueStr(defaultMethod) for _, tc := range []struct { name string durationHistogramBuckets []time.Duration dimensions []Dimension wantDurationHistogramBuckets []float64 - wantDimensions []dimension + wantDimensions []pdatautil.Dimension }{ { name: "simplest config (use defaults)", @@ -34,9 +37,9 @@ func TestNewConnector(t *testing.T) { {Name: "http.method", Default: &defaultMethod}, {Name: "http.status_code"}, }, - wantDimensions: []dimension{ - {name: "http.method", value: &defaultMethodValue}, - {"http.status_code", nil}, + wantDimensions: []pdatautil.Dimension{ + {Name: "http.method", Value: &defaultMethodValue}, + {Name: "http.status_code", Value: nil}, }, }, } { @@ -44,7 +47,7 @@ func TestNewConnector(t *testing.T) { // Prepare factory := NewFactory() - creationParams := connectortest.NewNopCreateSettings() + creationParams := connectortest.NewNopSettings() cfg := factory.CreateDefaultConfig().(*Config) cfg.Histogram.Explicit = &ExplicitHistogramConfig{ Buckets: tc.durationHistogramBuckets, diff --git a/connector/spanmetricsconnector/generated_component_test.go b/connector/spanmetricsconnector/generated_component_test.go index 2c6d6ca6dbcb..e7cc57f77531 100644 --- a/connector/spanmetricsconnector/generated_component_test.go +++ b/connector/spanmetricsconnector/generated_component_test.go @@ -14,6 +14,7 @@ import ( "go.opentelemetry.io/collector/connector/connectortest" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/consumer/consumertest" + "go.opentelemetry.io/collector/pipeline" ) func TestComponentFactoryType(t *testing.T) { @@ -29,13 +30,13 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set connector.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) }{ { name: "traces_to_metrics", - createFn: func(ctx context.Context, set connector.CreateSettings, cfg component.Config) (component.Component, error) { - router := connector.NewMetricsRouter(map[component.ID]consumer.Metrics{component.NewID(component.DataTypeMetrics): consumertest.NewNop()}) + createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) { + router := connector.NewMetricsRouter(map[pipeline.ID]consumer.Metrics{pipeline.NewID(pipeline.SignalMetrics): consumertest.NewNop()}) return factory.CreateTracesToMetrics(ctx, set, cfg, router) }, }, @@ -48,21 +49,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), connectortest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), connectortest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - firstConnector, err := test.createFn(context.Background(), connectortest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + firstConnector, err := tt.createFn(context.Background(), connectortest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() require.NoError(t, err) require.NoError(t, firstConnector.Start(context.Background(), host)) require.NoError(t, firstConnector.Shutdown(context.Background())) - secondConnector, err := test.createFn(context.Background(), connectortest.NewNopCreateSettings(), cfg) + secondConnector, err := tt.createFn(context.Background(), connectortest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, secondConnector.Start(context.Background(), host)) require.NoError(t, secondConnector.Shutdown(context.Background())) diff --git a/connector/spanmetricsconnector/go.mod b/connector/spanmetricsconnector/go.mod index 0399f49392da..1c117645d183 100644 --- a/connector/spanmetricsconnector/go.mod +++ b/connector/spanmetricsconnector/go.mod @@ -1,61 +1,66 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector -go 1.21.0 +go 1.22.0 require ( - github.com/hashicorp/golang-lru v1.0.2 + github.com/hashicorp/golang-lru/v2 v2.0.7 + github.com/jonboulle/clockwork v0.4.0 github.com/lightstep/go-expohisto v1.0.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 - github.com/stretchr/testify v1.9.0 - github.com/tilinna/clock v1.1.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/connector v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/connector v0.116.0 + go.opentelemetry.io/collector/connector/connectortest v0.116.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/featuregate v1.22.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/pipeline v0.116.0 + go.opentelemetry.io/collector/semconv v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 - google.golang.org/grpc v1.64.0 + google.golang.org/grpc v1.68.1 ) require ( - github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/connector/xconnector v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) @@ -71,3 +76,5 @@ retract ( replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest => ../../pkg/pdatatest replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden => ../../pkg/golden + +replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil => ../../internal/pdatautil diff --git a/connector/spanmetricsconnector/go.sum b/connector/spanmetricsconnector/go.sum index 96c22916c4cc..e63b2fb166f8 100644 --- a/connector/spanmetricsconnector/go.sum +++ b/connector/spanmetricsconnector/go.sum @@ -1,26 +1,30 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= -github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -29,8 +33,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -48,54 +52,60 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/tilinna/clock v1.1.0 h1:6IQQQCo6KoBxVudv6gwtY8o4eDfhHo8ojA5dP0MfhSs= -github.com/tilinna/clock v1.1.0/go.mod h1:ZsP7BcY7sEEz7ktc0IVy8Us6boDrK8VradlKRUGfOao= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/connector v0.102.0 h1:IvAsVfYRxP0ajmKbUovF8qugkcUtHq6RuYNtjcMa63E= -go.opentelemetry.io/collector/connector v0.102.0/go.mod h1:f4M7wZ/9+XtgTE0fivBFH3WlwntaEd0qFFA0giFkdnY= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/connector v0.116.0 h1:0Pz8RAXH1swLeA1fiyGGQWdv0Kemz4mbq+jnmd1TACE= +go.opentelemetry.io/collector/connector v0.116.0/go.mod h1:VQiZ2yW9KhZuF0yjDbvlgrAxm7+o8KQoxHxurQWLjKU= +go.opentelemetry.io/collector/connector/connectortest v0.116.0 h1:MdttvjqdZmp0ewW5IPCEtzzYmCqxrQxsjJ5m6gMVjzA= +go.opentelemetry.io/collector/connector/connectortest v0.116.0/go.mod h1:ko7aPyvAVf6SvRhWGZdPXSyk+7zPmsSCcMq0gYPMMIQ= +go.opentelemetry.io/collector/connector/xconnector v0.116.0 h1:fFJzrRco0g7HMkhnQ+ehlvicFf58vzsCLXnfuHyQM8w= +go.opentelemetry.io/collector/connector/xconnector v0.116.0/go.mod h1:m9oCk32zX6wDciYBpy+qMQkWKtOxb0gAkEUm8+trflY= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 h1:KKFb3u8iLk4V5GYz7eVpw8QgEdob5koX6GNEbaoDQJY= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0/go.mod h1:YyWHUWeSnRmy2CF7kPHpwJ6qkVjufbLZ8PYuY0Ph0o8= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 h1:PFNy+Il/kqPdPL9rhG+1kG63Aauya+FhBKGXoB6ivxU= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0/go.mod h1:bVn9V4TGyeXi58/JDkeXCuKtc+V+qcOoTl8hNpV0qa8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -111,20 +121,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -133,12 +143,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/connector/spanmetricsconnector/internal/cache/cache.go b/connector/spanmetricsconnector/internal/cache/cache.go index 2559d42eadf7..c59eadd3ebcc 100644 --- a/connector/spanmetricsconnector/internal/cache/cache.go +++ b/connector/spanmetricsconnector/internal/cache/cache.go @@ -4,7 +4,7 @@ package cache // import "github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector/internal/cache" import ( - "github.com/hashicorp/golang-lru/simplelru" + "github.com/hashicorp/golang-lru/v2/simplelru" ) // Cache consists of an LRU cache and the evicted items from the LRU cache. @@ -15,15 +15,15 @@ import ( // // Important: This implementation is non-thread safe. type Cache[K comparable, V any] struct { - lru simplelru.LRUCache + lru *simplelru.LRU[K, V] evictedItems map[K]V } // NewCache creates a Cache. func NewCache[K comparable, V any](size int) (*Cache[K, V], error) { evictedItems := make(map[K]V) - lruCache, err := simplelru.NewLRU(size, func(key any, value any) { - evictedItems[key.(K)] = value.(V) + lruCache, err := simplelru.NewLRU(size, func(key K, value V) { + evictedItems[key] = value }) if err != nil { return nil, err @@ -51,7 +51,7 @@ func (c *Cache[K, V]) Add(key K, value V) bool { // Get an item from the LRU cache or evicted items. func (c *Cache[K, V]) Get(key K) (V, bool) { if val, ok := c.lru.Get(key); ok { - return val.(V), ok + return val, ok } val, ok := c.evictedItems[key] @@ -85,7 +85,7 @@ func (c *Cache[K, V]) ForEach(fn func(k K, v V)) { for _, k := range c.lru.Keys() { v, ok := c.lru.Get(k) if ok { - fn(k.(K), v.(V)) + fn(k, v) } } diff --git a/connector/spanmetricsconnector/internal/cache/cache_test.go b/connector/spanmetricsconnector/internal/cache/cache_test.go index 374e8e2f9ba8..83e9b16333d1 100644 --- a/connector/spanmetricsconnector/internal/cache/cache_test.go +++ b/connector/spanmetricsconnector/internal/cache/cache_test.go @@ -127,7 +127,7 @@ func TestCache_Get(t *testing.T) { t.Parallel() c := tt.lruCache() gotValue, gotOk := c.Get(tt.key) - if !assert.Equal(t, gotValue, tt.wantValue) { + if !assert.Equal(t, tt.wantValue, gotValue) { t.Errorf("Get() gotValue = %v, want %v", gotValue, tt.wantValue) } if gotOk != tt.wantOk { diff --git a/connector/spanmetricsconnector/internal/metadata/generated_status.go b/connector/spanmetricsconnector/internal/metadata/generated_status.go index 9c4abb9e990b..389ef56ad9af 100644 --- a/connector/spanmetricsconnector/internal/metadata/generated_status.go +++ b/connector/spanmetricsconnector/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("spanmetrics") + Type = component.MustNewType("spanmetrics") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector" ) const ( diff --git a/connector/spanmetricsconnector/internal/metadata/generated_telemetry.go b/connector/spanmetricsconnector/internal/metadata/generated_telemetry.go deleted file mode 100644 index 9cdb8c172a51..000000000000 --- a/connector/spanmetricsconnector/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/spanmetrics") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/spanmetrics") -} diff --git a/connector/spanmetricsconnector/internal/metadata/generated_telemetry_test.go b/connector/spanmetricsconnector/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 5e97435f3868..000000000000 --- a/connector/spanmetricsconnector/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/spanmetrics", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/spanmetrics", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/connector/spanmetricsconnector/internal/metrics/metrics.go b/connector/spanmetricsconnector/internal/metrics/metrics.go index b9ec433c6e13..50591aec6980 100644 --- a/connector/spanmetricsconnector/internal/metrics/metrics.go +++ b/connector/spanmetricsconnector/internal/metrics/metrics.go @@ -5,7 +5,6 @@ package metrics // import "github.com/open-telemetry/opentelemetry-collector-con import ( "sort" - "time" "github.com/lightstep/go-expohisto/structure" "go.opentelemetry.io/collector/pdata/pcommon" @@ -16,7 +15,7 @@ type Key string type HistogramMetrics interface { GetOrCreate(key Key, attributes pcommon.Map) Histogram - BuildMetrics(pmetric.Metric, pcommon.Timestamp, pmetric.AggregationTemporality) + BuildMetrics(pmetric.Metric, generateStartTimestamp, pcommon.Timestamp, pmetric.AggregationTemporality) ClearExemplars() } @@ -59,6 +58,8 @@ type exponentialHistogram struct { maxExemplarCount *int } +type generateStartTimestamp = func(Key) pcommon.Timestamp + func NewExponentialHistogramMetrics(maxSize int32, maxExemplarCount *int) HistogramMetrics { return &exponentialHistogramMetrics{ metrics: make(map[Key]*exponentialHistogram), @@ -93,16 +94,16 @@ func (m *explicitHistogramMetrics) GetOrCreate(key Key, attributes pcommon.Map) func (m *explicitHistogramMetrics) BuildMetrics( metric pmetric.Metric, - start pcommon.Timestamp, + startTimestamp generateStartTimestamp, + timestamp pcommon.Timestamp, temporality pmetric.AggregationTemporality, ) { metric.SetEmptyHistogram().SetAggregationTemporality(temporality) dps := metric.Histogram().DataPoints() dps.EnsureCapacity(len(m.metrics)) - timestamp := pcommon.NewTimestampFromTime(time.Now()) - for _, h := range m.metrics { + for k, h := range m.metrics { dp := dps.AppendEmpty() - dp.SetStartTimestamp(start) + dp.SetStartTimestamp(startTimestamp(k)) dp.SetTimestamp(timestamp) dp.ExplicitBounds().FromRaw(h.bounds) dp.BucketCounts().FromRaw(h.bucketCounts) @@ -138,7 +139,6 @@ func (m *exponentialHistogramMetrics) GetOrCreate(key Key, attributes pcommon.Ma maxExemplarCount: m.maxExemplarCount, } m.metrics[key] = h - } return h @@ -146,16 +146,16 @@ func (m *exponentialHistogramMetrics) GetOrCreate(key Key, attributes pcommon.Ma func (m *exponentialHistogramMetrics) BuildMetrics( metric pmetric.Metric, - start pcommon.Timestamp, + startTimestamp generateStartTimestamp, + timestamp pcommon.Timestamp, temporality pmetric.AggregationTemporality, ) { metric.SetEmptyExponentialHistogram().SetAggregationTemporality(temporality) dps := metric.ExponentialHistogram().DataPoints() dps.EnsureCapacity(len(m.metrics)) - timestamp := pcommon.NewTimestampFromTime(time.Now()) - for _, m := range m.metrics { + for k, m := range m.metrics { dp := dps.AppendEmpty() - dp.SetStartTimestamp(start) + dp.SetStartTimestamp(startTimestamp(k)) dp.SetTimestamp(timestamp) expoHistToExponentialDataPoint(m.histogram, dp) for i := 0; i < m.exemplars.Len(); i++ { @@ -284,7 +284,8 @@ func (s *Sum) AddExemplar(traceID pcommon.TraceID, spanID pcommon.SpanID, value func (m *SumMetrics) BuildMetrics( metric pmetric.Metric, - start pcommon.Timestamp, + startTimestamp generateStartTimestamp, + timestamp pcommon.Timestamp, temporality pmetric.AggregationTemporality, ) { metric.SetEmptySum().SetIsMonotonic(true) @@ -292,10 +293,9 @@ func (m *SumMetrics) BuildMetrics( dps := metric.Sum().DataPoints() dps.EnsureCapacity(len(m.metrics)) - timestamp := pcommon.NewTimestampFromTime(time.Now()) - for _, s := range m.metrics { + for k, s := range m.metrics { dp := dps.AppendEmpty() - dp.SetStartTimestamp(start) + dp.SetStartTimestamp(startTimestamp(k)) dp.SetTimestamp(timestamp) dp.SetIntValue(int64(s.count)) for i := 0; i < s.exemplars.Len(); i++ { diff --git a/connector/spanmetricsconnector/internal/metrics/unit.go b/connector/spanmetricsconnector/internal/metrics/unit.go index b72423956ef1..14d726aaf9f4 100644 --- a/connector/spanmetricsconnector/internal/metrics/unit.go +++ b/connector/spanmetricsconnector/internal/metrics/unit.go @@ -20,8 +20,10 @@ const ( type Unit int8 -var _ encoding.TextMarshaler = (*Unit)(nil) -var _ encoding.TextUnmarshaler = (*Unit)(nil) +var ( + _ encoding.TextMarshaler = (*Unit)(nil) + _ encoding.TextUnmarshaler = (*Unit)(nil) +) func (u Unit) String() string { switch u { diff --git a/connector/spanmetricsconnector/metadata.yaml b/connector/spanmetricsconnector/metadata.yaml index 8ea19a8fe23e..85cf2ba5ae3b 100644 --- a/connector/spanmetricsconnector/metadata.yaml +++ b/connector/spanmetricsconnector/metadata.yaml @@ -1,5 +1,4 @@ type: spanmetrics -scope_name: otelcol/spanmetrics status: class: connector diff --git a/connector/spanmetricsconnector/testdata/config.yaml b/connector/spanmetricsconnector/testdata/config.yaml index 7358cd000549..2b69653e4a21 100644 --- a/connector/spanmetricsconnector/testdata/config.yaml +++ b/connector/spanmetricsconnector/testdata/config.yaml @@ -78,3 +78,14 @@ spanmetrics/resource_metrics_key_attributes: - service.name - telemetry.sdk.language - telemetry.sdk.name + +spanmetrics/custom_delta_timestamp_cache_size: + aggregation_temporality: "AGGREGATION_TEMPORALITY_DELTA" + metric_timestamp_cache_size: 123 + +spanmetrics/invalid_delta_timestamp_cache_size: + aggregation_temporality: "AGGREGATION_TEMPORALITY_DELTA" + metric_timestamp_cache_size: 0 + +spanmetrics/default_delta_timestamp_cache_size: + aggregation_temporality: "AGGREGATION_TEMPORALITY_DELTA" diff --git a/exporter/skywalkingexporter/Makefile b/connector/sumconnector/Makefile similarity index 100% rename from exporter/skywalkingexporter/Makefile rename to connector/sumconnector/Makefile diff --git a/connector/sumconnector/README.md b/connector/sumconnector/README.md new file mode 100644 index 000000000000..bcd36440040f --- /dev/null +++ b/connector/sumconnector/README.md @@ -0,0 +1,117 @@ +# Sum Connector + +| Status | | +| ------------- |-----------| +| Distributions | [] | +| Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aconnector%2Fsum%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aconnector%2Fsum) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aconnector%2Fsum%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aconnector%2Fsum) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@greatestusername](https://www.github.com/greatestusername), [@shalper2](https://www.github.com/shalper2), [@crobert-1](https://www.github.com/crobert-1) | + +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha + +## Supported Pipeline Types + +| [Exporter Pipeline Type] | [Receiver Pipeline Type] | [Stability Level] | +| ------------------------ | ------------------------ | ----------------- | +| traces | metrics | [alpha] | +| metrics | metrics | [alpha] | +| logs | metrics | [alpha] | + +[Exporter Pipeline Type]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md#exporter-pipeline-type +[Receiver Pipeline Type]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md#receiver-pipeline-type +[Stability Level]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#stability-levels + + +The `sum` connector can be used to sum attribute values from spans, span events, metrics, data points, and log records. + +## Configuration + +If you are not already familiar with connectors, you may find it helpful to first visit the [Connectors README](https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md). + +### Basic configuration + +This example configuration will sum numerical values found within the attribute `attribute.with.numerical.value` of any span telemetry routed to the connector. It will then output a metric time series with the name `my.example.metric.name` with those summed values. + +Note: Values found within an attribute will be converted into a float regardless of their original type before being summed and output as a metric value. Non-convertible strings will be dropped and not included. + +```yaml +receivers: + foo: +connectors: + sum: + spans: + my.example.metric.name: + source_attribute: attribute.with.numerical.value +exporters: + bar: + +service: + pipelines: + metrics/sum: + receivers: [sum] + exporters: [bar] + traces: + receivers: [foo] + exporters: [sum] +``` + +#### Required Settings + +The sum connector has three required configuration settings and numerous optional settings + +- Telemetry type: Nested below the `sum:` connector declaration. Declared as `logs:` in the [Basic Example](#basic-configuration). + - Can be any of `spans`, `spanevents`, `datapoints`, or `logs`. + - For metrics use `datapoints` + - For traces use `spans` or `spanevents` +- Metric name: Nested below the telemetry type; this is the metric name the sum connector will output summed values to. Declared as `my.example.metric.name` in the [Basic Example](#basic-configuration) +- `source_attribute`: A specific attribute to search for within the source telemetry being fed to the connector. This attribute is where the connector will look for numerical values to sum into the output metric value. Declared as `attribute.with.numerical.value` in the [Basic Example](#basic-configuration) + +#### Optional Settings + +- `conditions`: [OTTL syntax](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/pkg/ottl/LANGUAGE.md) can be used to provide conditions for processing incoming telemetry. Conditions are ORed together, so if any condition is met the attribute's value will be included in the resulting sum. +- `attributes`: Declaration of attributes to include. Any of these attributes found will generate a separate sum for each set of unique combination of attribute values and output as its own datapoint in the metric time series. + - `key`: (required for `attributes`) the attribute name to match against + - `default_value`: (optional for `attributes`) a default value for the attribute when no matches are found. The `default_value` value can be of type string, integer, or float. + +### Detailed Example Configuration + +This example declares that the `sum` connector is going to be ingesting `logs` and creating an output metric named `checkout.total` with numerical values found in the `source_attribute` `total.payment`. + +It provides a condition to check that the attribute `total.payment` is not `NULL`. It also checks any incoming log telemetry for values present in the attribute `payment.processor` and creates a datapoint within the metric time series for each unique value. Any logs without values in `payment.processor` will be included in a datapoint with the `default_value` of `unspecified_processor`. + +```yaml +receivers: + foo: +connectors: + sum: + logs: + checkout.total: + source_attribute: total.payment + conditions: + - attributes["total.payment"] != "NULL" + attributes: + - key: payment.processor + default_value: unspecified_processor +exporters: + bar: + +service: + pipelines: + metrics/sum: + receivers: [sum] + exporters: [bar] + logs: + receivers: [foo] + exporters: [sum] +``` + +**Note for Log to Metrics:** If your logs contain all values in their `body` rather than in attributes (E.G. JSON payload) use a transform processor in your pipeline to upsert [parsed key/value pairs](https://github.com/open-telemetry/opentelemetry-log-collection/tree/main/docs/operators) (in this case from JSON) into attributes attached to the log. +```yaml +processors: + transform/logs: + log_statements: + - context: log + statements: + - merge_maps(attributes, ParseJSON(body), "upsert") +``` + +[Connectors README]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md diff --git a/connector/sumconnector/config.go b/connector/sumconnector/config.go new file mode 100644 index 000000000000..5ca87a03a7bd --- /dev/null +++ b/connector/sumconnector/config.go @@ -0,0 +1,122 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package sumconnector // import "github.com/open-telemetry/opentelemetry-collector-contrib/connector/sumconnector" + +import ( + "errors" + "fmt" + + "go.opentelemetry.io/collector/component" + "go.uber.org/zap" + + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter/filterottl" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +// Config for the connector +type Config struct { + Spans map[string]MetricInfo `mapstructure:"spans"` + SpanEvents map[string]MetricInfo `mapstructure:"spanevents"` + Metrics map[string]MetricInfo `mapstructure:"metrics"` + DataPoints map[string]MetricInfo `mapstructure:"datapoints"` + Logs map[string]MetricInfo `mapstructure:"logs"` +} + +// MetricInfo for a data type +type MetricInfo struct { + Description string `mapstructure:"description"` + Conditions []string `mapstructure:"conditions"` + Attributes []AttributeConfig `mapstructure:"attributes"` + SourceAttribute string `mapstructure:"source_attribute"` +} + +type AttributeConfig struct { + Key string `mapstructure:"key"` + DefaultValue any `mapstructure:"default_value"` +} + +func (c *Config) Validate() (combinedErrors error) { + for name, info := range c.Spans { + if name == "" { + combinedErrors = errors.Join(combinedErrors, fmt.Errorf("spans: metric name missing")) + } + if info.SourceAttribute == "" { + combinedErrors = errors.Join(combinedErrors, fmt.Errorf("spans: metric source_attribute missing")) + } + if _, err := filterottl.NewBoolExprForSpan(info.Conditions, filterottl.StandardSpanFuncs(), ottl.PropagateError, component.TelemetrySettings{Logger: zap.NewNop()}); err != nil { + combinedErrors = errors.Join(combinedErrors, fmt.Errorf("spans condition: metric %q: %w", name, err)) + } + if err := info.validateAttributes(); err != nil { + combinedErrors = errors.Join(combinedErrors, fmt.Errorf("spans attributes: metric %q: %w", name, err)) + } + } + for name, info := range c.SpanEvents { + if name == "" { + combinedErrors = errors.Join(combinedErrors, fmt.Errorf("spanevents: metric name missing")) + } + if info.SourceAttribute == "" { + combinedErrors = errors.Join(combinedErrors, fmt.Errorf("spanevents: metric source_attribute missing")) + } + if _, err := filterottl.NewBoolExprForSpanEvent(info.Conditions, filterottl.StandardSpanEventFuncs(), ottl.PropagateError, component.TelemetrySettings{Logger: zap.NewNop()}); err != nil { + combinedErrors = errors.Join(combinedErrors, fmt.Errorf("spanevents condition: metric %q: %w", name, err)) + } + if err := info.validateAttributes(); err != nil { + combinedErrors = errors.Join(combinedErrors, fmt.Errorf("spanevents attributes: metric %q: %w", name, err)) + } + } + for name, info := range c.Metrics { + if name == "" { + combinedErrors = errors.Join(combinedErrors, fmt.Errorf("metrics: metric name missing")) + } + if info.SourceAttribute == "" { + combinedErrors = errors.Join(combinedErrors, fmt.Errorf("metrics: metric source_attribute missing")) + } + if _, err := filterottl.NewBoolExprForMetric(info.Conditions, filterottl.StandardMetricFuncs(), ottl.PropagateError, component.TelemetrySettings{Logger: zap.NewNop()}); err != nil { + combinedErrors = errors.Join(combinedErrors, fmt.Errorf("metrics condition: metric %q: %w", name, err)) + } + if len(info.Attributes) > 0 { + combinedErrors = errors.Join(combinedErrors, fmt.Errorf("metrics attributes not supported: metric %q", name)) + } + } + for name, info := range c.DataPoints { + if name == "" { + combinedErrors = errors.Join(combinedErrors, fmt.Errorf("datapoints: metric name missing")) + } + if info.SourceAttribute == "" { + combinedErrors = errors.Join(combinedErrors, fmt.Errorf("datapoints: metric source_attribute missing")) + } + if _, err := filterottl.NewBoolExprForDataPoint(info.Conditions, filterottl.StandardDataPointFuncs(), ottl.PropagateError, component.TelemetrySettings{Logger: zap.NewNop()}); err != nil { + combinedErrors = errors.Join(combinedErrors, fmt.Errorf("datapoints condition: metric %q: %w", name, err)) + } + if err := info.validateAttributes(); err != nil { + combinedErrors = errors.Join(combinedErrors, fmt.Errorf("datapoints attributes: metric %q: %w", name, err)) + } + } + for name, info := range c.Logs { + if name == "" { + combinedErrors = errors.Join(combinedErrors, fmt.Errorf("logs: metric name missing")) + } + if info.SourceAttribute == "" { + combinedErrors = errors.Join(combinedErrors, fmt.Errorf("logs: metric source_attribute missing")) + } + if _, err := filterottl.NewBoolExprForLog(info.Conditions, filterottl.StandardLogFuncs(), ottl.PropagateError, component.TelemetrySettings{Logger: zap.NewNop()}); err != nil { + combinedErrors = errors.Join(combinedErrors, fmt.Errorf("logs condition: metric %q: %w", name, err)) + } + if err := info.validateAttributes(); err != nil { + combinedErrors = errors.Join(combinedErrors, fmt.Errorf("logs attributes: metric %q: %w", name, err)) + } + } + return combinedErrors +} + +func (i *MetricInfo) validateAttributes() error { + for _, attr := range i.Attributes { + if attr.Key == "" { + return fmt.Errorf("attribute key missing") + } + } + return nil +} + +var _ component.ConfigValidator = (*Config)(nil) diff --git a/connector/sumconnector/config_test.go b/connector/sumconnector/config_test.go new file mode 100644 index 000000000000..79462d8f3099 --- /dev/null +++ b/connector/sumconnector/config_test.go @@ -0,0 +1,580 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package sumconnector + +import ( + "fmt" + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/confmap/confmaptest" + + "github.com/open-telemetry/opentelemetry-collector-contrib/connector/sumconnector/internal/metadata" +) + +func TestLoadConfig(t *testing.T) { + testCases := []struct { + name string + expect *Config + }{ + { + name: "custom_description", + expect: &Config{ + Spans: map[string]MetricInfo{ + "my.span.sum": { + Description: "My span record sum.", + SourceAttribute: "my.attribute", + }, + }, + SpanEvents: map[string]MetricInfo{ + "my.spanevent.sum": { + Description: "My spanevent sum.", + SourceAttribute: "my.attribute", + }, + }, + Metrics: map[string]MetricInfo{ + "my.metric.sum": { + Description: "My metric sum.", + SourceAttribute: "my.attribute", + }, + }, + DataPoints: map[string]MetricInfo{ + "my.datapoint.sum": { + Description: "My datapoint sum.", + SourceAttribute: "my.attribute", + }, + }, + Logs: map[string]MetricInfo{ + "my.logrecord.sum": { + Description: "My log sum.", + SourceAttribute: "my.attribute", + }, + }, + }, + }, + { + name: "custom_metric", + expect: &Config{ + Spans: map[string]MetricInfo{ + "my.span.sum": { + SourceAttribute: "my.attribute", + }, + }, + SpanEvents: map[string]MetricInfo{ + "my.spanevent.sum": { + SourceAttribute: "my.attribute", + }, + }, + Metrics: map[string]MetricInfo{ + "my.metric.sum": { + SourceAttribute: "my.attribute", + }, + }, + DataPoints: map[string]MetricInfo{ + "my.datapoint.sum": { + SourceAttribute: "my.attribute", + }, + }, + Logs: map[string]MetricInfo{ + "my.logrecord.sum": { + SourceAttribute: "my.attribute", + }, + }, + }, + }, + { + name: "condition", + expect: &Config{ + Spans: map[string]MetricInfo{ + "my.span.sum": { + SourceAttribute: "my.attribute", + Conditions: []string{`IsMatch(resource.attributes["host.name"], "pod-s")`}, + }, + }, + SpanEvents: map[string]MetricInfo{ + "my.spanevent.sum": { + SourceAttribute: "my.attribute", + Conditions: []string{`IsMatch(resource.attributes["host.name"], "pod-e")`}, + }, + }, + Metrics: map[string]MetricInfo{ + "my.metric.sum": { + SourceAttribute: "my.attribute", + Conditions: []string{`IsMatch(resource.attributes["host.name"], "pod-m")`}, + }, + }, + DataPoints: map[string]MetricInfo{ + "my.datapoint.sum": { + SourceAttribute: "my.attribute", + Conditions: []string{`IsMatch(resource.attributes["host.name"], "pod-d")`}, + }, + }, + Logs: map[string]MetricInfo{ + "my.logrecord.sum": { + SourceAttribute: "my.attribute", + Conditions: []string{`IsMatch(resource.attributes["host.name"], "pod-l")`}, + }, + }, + }, + }, + { + name: "multiple_condition", + expect: &Config{ + Spans: map[string]MetricInfo{ + "my.span.sum": { + SourceAttribute: "my.attribute", + Conditions: []string{ + `IsMatch(resource.attributes["host.name"], "pod-s")`, + `IsMatch(resource.attributes["foo"], "bar-s")`, + }, + }, + }, + SpanEvents: map[string]MetricInfo{ + "my.spanevent.sum": { + SourceAttribute: "my.attribute", + Conditions: []string{ + `IsMatch(resource.attributes["host.name"], "pod-e")`, + `IsMatch(resource.attributes["foo"], "bar-e")`, + }, + }, + }, + Metrics: map[string]MetricInfo{ + "my.metric.sum": { + SourceAttribute: "my.attribute", + Conditions: []string{ + `IsMatch(resource.attributes["host.name"], "pod-m")`, + `IsMatch(resource.attributes["foo"], "bar-m")`, + }, + }, + }, + DataPoints: map[string]MetricInfo{ + "my.datapoint.sum": { + SourceAttribute: "my.attribute", + Conditions: []string{ + `IsMatch(resource.attributes["host.name"], "pod-d")`, + `IsMatch(resource.attributes["foo"], "bar-d")`, + }, + }, + }, + Logs: map[string]MetricInfo{ + "my.logrecord.sum": { + SourceAttribute: "my.attribute", + Conditions: []string{ + `IsMatch(resource.attributes["host.name"], "pod-l")`, + `IsMatch(resource.attributes["foo"], "bar-l")`, + }, + }, + }, + }, + }, + { + name: "attribute", + expect: &Config{ + Spans: map[string]MetricInfo{ + "my.span.sum": { + SourceAttribute: "my.attribute", + Attributes: []AttributeConfig{ + {Key: "env"}, + }, + }, + }, + SpanEvents: map[string]MetricInfo{ + "my.spanevent.sum": { + SourceAttribute: "my.attribute", + Attributes: []AttributeConfig{ + {Key: "env"}, + }, + }, + }, + Metrics: map[string]MetricInfo{ + "my.metric.sum": { + SourceAttribute: "my.attribute", + }, + }, + DataPoints: map[string]MetricInfo{ + "my.datapoint.sum": { + SourceAttribute: "my.attribute", + Attributes: []AttributeConfig{ + {Key: "env"}, + }, + }, + }, + Logs: map[string]MetricInfo{ + "my.logrecord.sum": { + SourceAttribute: "my.attribute", + Attributes: []AttributeConfig{ + {Key: "env"}, + }, + }, + }, + }, + }, + { + name: "multiple_metrics", + expect: &Config{ + Spans: map[string]MetricInfo{ + "my.span.sum": { + Description: "My span sum.", + SourceAttribute: "my.attribute", + }, + "limited.span.sum": { + Description: "Limited span sum.", + SourceAttribute: "my.attribute", + Conditions: []string{`IsMatch(resource.attributes["host.name"], "pod-s")`}, + Attributes: []AttributeConfig{ + { + Key: "env", + }, + { + Key: "component", + DefaultValue: "other", + }, + }, + }, + }, + SpanEvents: map[string]MetricInfo{ + "my.spanevent.sum": { + Description: "My span event sum.", + SourceAttribute: "my.attribute", + }, + "limited.spanevent.sum": { + Description: "Limited span event sum.", + SourceAttribute: "my.attribute", + Conditions: []string{`IsMatch(resource.attributes["host.name"], "pod-e")`}, + Attributes: []AttributeConfig{ + { + Key: "env", + }, + { + Key: "component", + DefaultValue: "other", + }, + }, + }, + }, + Metrics: map[string]MetricInfo{ + "my.metric.sum": { + Description: "My metric sum.", + SourceAttribute: "my.attribute", + }, + "limited.metric.sum": { + Description: "Limited metric sum.", + SourceAttribute: "my.attribute", + Conditions: []string{`IsMatch(resource.attributes["host.name"], "pod-m")`}, + }, + }, + DataPoints: map[string]MetricInfo{ + "my.datapoint.sum": { + Description: "My data point sum.", + SourceAttribute: "my.attribute", + }, + "limited.datapoint.sum": { + Description: "Limited data point sum.", + SourceAttribute: "my.attribute", + Conditions: []string{`IsMatch(resource.attributes["host.name"], "pod-d")`}, + Attributes: []AttributeConfig{ + { + Key: "env", + }, + { + Key: "component", + DefaultValue: "other", + }, + }, + }, + }, + Logs: map[string]MetricInfo{ + "my.logrecord.sum": { + Description: "My log record sum.", + SourceAttribute: "my.attribute", + }, + "limited.logrecord.sum": { + Description: "Limited log record sum.", + SourceAttribute: "my.attribute", + Conditions: []string{`IsMatch(resource.attributes["host.name"], "pod-l")`}, + Attributes: []AttributeConfig{ + { + Key: "env", + }, + { + Key: "component", + DefaultValue: "other", + }, + }, + }, + }, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml")) + require.NoError(t, err) + + factory := NewFactory() + cfg := factory.CreateDefaultConfig() + + sub, err := cm.Sub(component.NewIDWithName(metadata.Type, tc.name).String()) + require.NoError(t, err) + require.NoError(t, sub.Unmarshal(cfg)) + + assert.Equal(t, tc.expect, cfg) + }) + } +} + +func TestConfigErrors(t *testing.T) { + testCases := []struct { + name string + input *Config + expect string + }{ + { + name: "missing_source_attribute_span", + input: &Config{ + Spans: map[string]MetricInfo{ + "span.missing.source.attribute": {}, + }, + }, + expect: "spans: metric source_attribute missing", + }, + { + name: "missing_source_attribute_spanevent", + input: &Config{ + SpanEvents: map[string]MetricInfo{ + "spanevent.missing.source.attribute": {}, + }, + }, + expect: "spanevents: metric source_attribute missing", + }, + { + name: "missing_source_attribute_metric", + input: &Config{ + Metrics: map[string]MetricInfo{ + "metric.missing.source.attribute": {}, + }, + }, + expect: "metrics: metric source_attribute missing", + }, + { + name: "missing_source_attribute_datapoint", + input: &Config{ + DataPoints: map[string]MetricInfo{ + "datapoint.missing.source.attribute": {}, + }, + }, + expect: "datapoints: metric source_attribute missing", + }, + { + name: "missing_source_attribute_log", + input: &Config{ + Logs: map[string]MetricInfo{ + "log.missing.source.attribute": {}, + }, + }, + expect: "logs: metric source_attribute missing", + }, + { + name: "missing_metric_name_span", + input: &Config{ + Spans: map[string]MetricInfo{ + "": { + SourceAttribute: "my.attribute", + }, + }, + }, + expect: "spans: metric name missing", + }, + { + name: "missing_metric_name_spanevent", + input: &Config{ + SpanEvents: map[string]MetricInfo{ + "": { + SourceAttribute: "my.attribute", + }, + }, + }, + expect: "spanevents: metric name missing", + }, + { + name: "missing_metric_name_metric", + input: &Config{ + Metrics: map[string]MetricInfo{ + "": { + SourceAttribute: "my.attribute", + }, + }, + }, + expect: "metrics: metric name missing", + }, + { + name: "missing_metric_name_datapoint", + input: &Config{ + DataPoints: map[string]MetricInfo{ + "": { + SourceAttribute: "my.attribute", + }, + }, + }, + expect: "datapoints: metric name missing", + }, + { + name: "missing_metric_name_log", + input: &Config{ + Logs: map[string]MetricInfo{ + "": { + SourceAttribute: "my.attribute", + }, + }, + }, + expect: "logs: metric name missing", + }, + { + name: "invalid_condition_span", + input: &Config{ + Spans: map[string]MetricInfo{ + "metric.name.spans": { + SourceAttribute: "my.attribute", + Conditions: []string{"invalid condition"}, + }, + }, + }, + expect: fmt.Sprintf("spans condition: metric %q: unable to parse OTTL condition", "metric.name.spans"), + }, + { + name: "invalid_condition_spanevent", + input: &Config{ + SpanEvents: map[string]MetricInfo{ + "metric.name.spanevents": { + SourceAttribute: "my.attribute", + Conditions: []string{"invalid condition"}, + }, + }, + }, + expect: fmt.Sprintf("spanevents condition: metric %q: unable to parse OTTL condition", "metric.name.spanevents"), + }, + { + name: "invalid_condition_metric", + input: &Config{ + Metrics: map[string]MetricInfo{ + "metric.name.metrics": { + SourceAttribute: "my.attribute", + Conditions: []string{"invalid condition"}, + }, + }, + }, + expect: fmt.Sprintf("metrics condition: metric %q: unable to parse OTTL condition", "metric.name.metrics"), + }, + { + name: "invalid_condition_datapoint", + input: &Config{ + DataPoints: map[string]MetricInfo{ + "metric.name.datapoints": { + SourceAttribute: "my.attribute", + Conditions: []string{"invalid condition"}, + }, + }, + }, + expect: fmt.Sprintf("datapoints condition: metric %q: unable to parse OTTL condition", "metric.name.datapoints"), + }, + { + name: "invalid_condition_log", + input: &Config{ + Logs: map[string]MetricInfo{ + "metric.name.logs": { + SourceAttribute: "my.attribute", + Conditions: []string{"invalid condition"}, + }, + }, + }, + expect: fmt.Sprintf("logs condition: metric %q: unable to parse OTTL condition", "metric.name.logs"), + }, + { + name: "multi_error_span", + input: &Config{ + Spans: map[string]MetricInfo{ + "": { + SourceAttribute: "", + Conditions: []string{"invalid condition"}, + Attributes: []AttributeConfig{ + {Key: ""}, + }, + }, + }, + }, + expect: `spans: metric name missing` + "\n" + `spans: metric source_attribute missing` + "\n" + `spans condition: metric "": unable to parse OTTL condition "invalid condition": condition has invalid syntax: 1:9: unexpected token "condition" (expected Value)` + "\n" + `spans attributes: metric "": attribute key missing`, + }, + { + name: "multi_error_spanevent", + input: &Config{ + SpanEvents: map[string]MetricInfo{ + "": { + SourceAttribute: "", + Conditions: []string{"invalid condition"}, + Attributes: []AttributeConfig{ + {Key: ""}, + }, + }, + }, + }, + expect: `spanevents: metric name missing` + "\n" + `spanevents: metric source_attribute missing` + "\n" + `spanevents condition: metric "": unable to parse OTTL condition "invalid condition": condition has invalid syntax: 1:9: unexpected token "condition" (expected Value)` + "\n" + `spanevents attributes: metric "": attribute key missing`, + }, + { + name: "multi_error_metric", + input: &Config{ + Metrics: map[string]MetricInfo{ + "": { + SourceAttribute: "", + Conditions: []string{"invalid condition"}, + Attributes: []AttributeConfig{ + {Key: ""}, + }, + }, + }, + }, + expect: `metrics: metric name missing` + "\n" + `metrics: metric source_attribute missing` + "\n" + `metrics condition: metric "": unable to parse OTTL condition "invalid condition": condition has invalid syntax: 1:9: unexpected token "condition" (expected Value)` + "\n" + `metrics attributes not supported: metric ""`, + }, + { + name: "multi_error_datapoint", + input: &Config{ + DataPoints: map[string]MetricInfo{ + "": { + SourceAttribute: "", + Conditions: []string{"invalid condition"}, + Attributes: []AttributeConfig{ + {Key: ""}, + }, + }, + }, + }, + expect: `datapoints: metric name missing` + "\n" + `datapoints: metric source_attribute missing` + "\n" + `datapoints condition: metric "": unable to parse OTTL condition "invalid condition": condition has invalid syntax: 1:9: unexpected token "condition" (expected Value)` + "\n" + `datapoints attributes: metric "": attribute key missing`, + }, + { + name: "multi_error_log", + input: &Config{ + Logs: map[string]MetricInfo{ + "": { + SourceAttribute: "", + Conditions: []string{"invalid condition"}, + Attributes: []AttributeConfig{ + {Key: ""}, + }, + }, + }, + }, + expect: `logs: metric name missing` + "\n" + `logs: metric source_attribute missing` + "\n" + `logs condition: metric "": unable to parse OTTL condition "invalid condition": condition has invalid syntax: 1:9: unexpected token "condition" (expected Value)` + "\n" + `logs attributes: metric "": attribute key missing`, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + err := tc.input.Validate() + assert.ErrorContains(t, err, tc.expect) + }) + } +} diff --git a/connector/sumconnector/connector.go b/connector/sumconnector/connector.go new file mode 100644 index 000000000000..e9800c877a44 --- /dev/null +++ b/connector/sumconnector/connector.go @@ -0,0 +1,198 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package sumconnector // import "github.com/open-telemetry/opentelemetry-collector-contrib/connector/sumconnector" + +import ( + "context" + "errors" + "fmt" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/consumer" + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/plog" + "go.opentelemetry.io/collector/pdata/pmetric" + "go.opentelemetry.io/collector/pdata/ptrace" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottldatapoint" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottllog" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottlmetric" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottlspan" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottlspanevent" +) + +// sum can sum attribute values from spans, span event, metrics, data points, or log records +// and emit the sums onto a metrics pipeline. +type sum struct { + metricsConsumer consumer.Metrics + component.StartFunc + component.ShutdownFunc + + spansMetricDefs map[string]metricDef[ottlspan.TransformContext] + spanEventsMetricDefs map[string]metricDef[ottlspanevent.TransformContext] + metricsMetricDefs map[string]metricDef[ottlmetric.TransformContext] + dataPointsMetricDefs map[string]metricDef[ottldatapoint.TransformContext] + logsMetricDefs map[string]metricDef[ottllog.TransformContext] +} + +func (c *sum) Capabilities() consumer.Capabilities { + return consumer.Capabilities{MutatesData: false} +} + +func (c *sum) ConsumeTraces(ctx context.Context, td ptrace.Traces) error { + var multiError error + sumMetrics := pmetric.NewMetrics() + sumMetrics.ResourceMetrics().EnsureCapacity(td.ResourceSpans().Len()) + for i := 0; i < td.ResourceSpans().Len(); i++ { + resourceSpan := td.ResourceSpans().At(i) + spansSummer := newSummer[ottlspan.TransformContext](c.spansMetricDefs) + spanEventsSummer := newSummer[ottlspanevent.TransformContext](c.spanEventsMetricDefs) + + for j := 0; j < resourceSpan.ScopeSpans().Len(); j++ { + scopeSpan := resourceSpan.ScopeSpans().At(j) + + for k := 0; k < scopeSpan.Spans().Len(); k++ { + span := scopeSpan.Spans().At(k) + sCtx := ottlspan.NewTransformContext(span, scopeSpan.Scope(), resourceSpan.Resource(), scopeSpan, resourceSpan) + multiError = errors.Join(multiError, spansSummer.update(ctx, span.Attributes(), sCtx)) + + for l := 0; l < span.Events().Len(); l++ { + event := span.Events().At(l) + eCtx := ottlspanevent.NewTransformContext(event, span, scopeSpan.Scope(), resourceSpan.Resource(), scopeSpan, resourceSpan) + multiError = errors.Join(multiError, spanEventsSummer.update(ctx, event.Attributes(), eCtx)) + } + } + } + + if len(spansSummer.sums)+len(spanEventsSummer.sums) == 0 { + continue // don't add an empty resource + } + + sumResource := sumMetrics.ResourceMetrics().AppendEmpty() + resourceSpan.Resource().Attributes().CopyTo(sumResource.Resource().Attributes()) + + sumResource.ScopeMetrics().EnsureCapacity(resourceSpan.ScopeSpans().Len()) + sumScope := sumResource.ScopeMetrics().AppendEmpty() + + spansSummer.appendMetricsTo(sumScope.Metrics()) + spanEventsSummer.appendMetricsTo(sumScope.Metrics()) + } + if multiError != nil { + return multiError + } + return c.metricsConsumer.ConsumeMetrics(ctx, sumMetrics) +} + +func (c *sum) ConsumeMetrics(ctx context.Context, md pmetric.Metrics) error { + var multiError error + sumMetrics := pmetric.NewMetrics() + sumMetrics.ResourceMetrics().EnsureCapacity(md.ResourceMetrics().Len()) + for i := 0; i < md.ResourceMetrics().Len(); i++ { + resourceMetric := md.ResourceMetrics().At(i) + metricsSummer := newSummer[ottlmetric.TransformContext](c.metricsMetricDefs) + dataPointsSummer := newSummer[ottldatapoint.TransformContext](c.dataPointsMetricDefs) + + for j := 0; j < resourceMetric.ScopeMetrics().Len(); j++ { + scopeMetrics := resourceMetric.ScopeMetrics().At(j) + + for k := 0; k < scopeMetrics.Metrics().Len(); k++ { + metric := scopeMetrics.Metrics().At(k) + mCtx := ottlmetric.NewTransformContext(metric, scopeMetrics.Metrics(), scopeMetrics.Scope(), resourceMetric.Resource(), scopeMetrics, resourceMetric) + multiError = errors.Join(multiError, metricsSummer.update(ctx, pcommon.NewMap(), mCtx)) + + //exhaustive:enforce + // For metric types each must be handled in exactly the same way + // Switch case required because each type calls DataPoints() differently + switch metric.Type() { + case pmetric.MetricTypeGauge: + dps := metric.Gauge().DataPoints() + for i := 0; i < dps.Len(); i++ { + dCtx := ottldatapoint.NewTransformContext(dps.At(i), metric, scopeMetrics.Metrics(), scopeMetrics.Scope(), resourceMetric.Resource(), scopeMetrics, resourceMetric) + multiError = errors.Join(multiError, dataPointsSummer.update(ctx, dps.At(i).Attributes(), dCtx)) + } + case pmetric.MetricTypeSum: + dps := metric.Sum().DataPoints() + for i := 0; i < dps.Len(); i++ { + dCtx := ottldatapoint.NewTransformContext(dps.At(i), metric, scopeMetrics.Metrics(), scopeMetrics.Scope(), resourceMetric.Resource(), scopeMetrics, resourceMetric) + multiError = errors.Join(multiError, dataPointsSummer.update(ctx, dps.At(i).Attributes(), dCtx)) + } + case pmetric.MetricTypeSummary: + dps := metric.Summary().DataPoints() + for i := 0; i < dps.Len(); i++ { + dCtx := ottldatapoint.NewTransformContext(dps.At(i), metric, scopeMetrics.Metrics(), scopeMetrics.Scope(), resourceMetric.Resource(), scopeMetrics, resourceMetric) + multiError = errors.Join(multiError, dataPointsSummer.update(ctx, dps.At(i).Attributes(), dCtx)) + } + case pmetric.MetricTypeHistogram: + dps := metric.Histogram().DataPoints() + for i := 0; i < dps.Len(); i++ { + dCtx := ottldatapoint.NewTransformContext(dps.At(i), metric, scopeMetrics.Metrics(), scopeMetrics.Scope(), resourceMetric.Resource(), scopeMetrics, resourceMetric) + multiError = errors.Join(multiError, dataPointsSummer.update(ctx, dps.At(i).Attributes(), dCtx)) + } + case pmetric.MetricTypeExponentialHistogram: + dps := metric.ExponentialHistogram().DataPoints() + for i := 0; i < dps.Len(); i++ { + dCtx := ottldatapoint.NewTransformContext(dps.At(i), metric, scopeMetrics.Metrics(), scopeMetrics.Scope(), resourceMetric.Resource(), scopeMetrics, resourceMetric) + multiError = errors.Join(multiError, dataPointsSummer.update(ctx, dps.At(i).Attributes(), dCtx)) + } + case pmetric.MetricTypeEmpty: + multiError = errors.Join(multiError, fmt.Errorf("metric %q: invalid metric type: %v", metric.Name(), metric.Type())) + } + } + } + + if len(metricsSummer.sums)+len(dataPointsSummer.sums) == 0 { + continue // don't add an empty resource + } + + sumResource := sumMetrics.ResourceMetrics().AppendEmpty() + resourceMetric.Resource().Attributes().CopyTo(sumResource.Resource().Attributes()) + + sumResource.ScopeMetrics().EnsureCapacity(resourceMetric.ScopeMetrics().Len()) + sumScope := sumResource.ScopeMetrics().AppendEmpty() + + metricsSummer.appendMetricsTo(sumScope.Metrics()) + dataPointsSummer.appendMetricsTo(sumScope.Metrics()) + } + if multiError != nil { + return multiError + } + return c.metricsConsumer.ConsumeMetrics(ctx, sumMetrics) +} + +func (c *sum) ConsumeLogs(ctx context.Context, ld plog.Logs) error { + var multiError error + sumMetrics := pmetric.NewMetrics() + sumMetrics.ResourceMetrics().EnsureCapacity(ld.ResourceLogs().Len()) + for i := 0; i < ld.ResourceLogs().Len(); i++ { + resourceLog := ld.ResourceLogs().At(i) + summer := newSummer[ottllog.TransformContext](c.logsMetricDefs) + + for j := 0; j < resourceLog.ScopeLogs().Len(); j++ { + scopeLogs := resourceLog.ScopeLogs().At(j) + + for k := 0; k < scopeLogs.LogRecords().Len(); k++ { + logRecord := scopeLogs.LogRecords().At(k) + + lCtx := ottllog.NewTransformContext(logRecord, scopeLogs.Scope(), resourceLog.Resource(), scopeLogs, resourceLog) + multiError = errors.Join(multiError, summer.update(ctx, logRecord.Attributes(), lCtx)) + } + } + + if len(summer.sums) == 0 { + continue // don't add an empty resource + } + + sumResource := sumMetrics.ResourceMetrics().AppendEmpty() + resourceLog.Resource().Attributes().CopyTo(sumResource.Resource().Attributes()) + + sumResource.ScopeMetrics().EnsureCapacity(resourceLog.ScopeLogs().Len()) + sumScope := sumResource.ScopeMetrics().AppendEmpty() + + summer.appendMetricsTo(sumScope.Metrics()) + } + if multiError != nil { + return multiError + } + return c.metricsConsumer.ConsumeMetrics(ctx, sumMetrics) +} diff --git a/connector/sumconnector/connector_test.go b/connector/sumconnector/connector_test.go new file mode 100644 index 000000000000..d37129de7c02 --- /dev/null +++ b/connector/sumconnector/connector_test.go @@ -0,0 +1,627 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package sumconnector + +import ( + "context" + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/connector/connectortest" + "go.opentelemetry.io/collector/consumer/consumertest" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/pmetrictest" +) + +// The test input file has a repetitive structure: +// - There are four resources, each with four spans, each with four span events. +// - The four resources have the following sets of attributes: +// - resource.required: foo, resource.optional: bar +// - resource.required: foo, resource.optional: notbar +// - resource.required: notfoo +// - (no attributes) +// +// - The four spans on each resource have the following sets of attributes: +// - span.required: foo, span.optional: bar +// - span.required: foo, span.optional: notbar +// - span.required: notfoo +// - (no attributes) +// +// - The four span events on each span have the following sets of attributes: +// - event.required: foo, event.optional: bar +// - event.required: foo, event.optional: notbar +// - event.required: notfoo +// - (no attributes) +func TestTracesToMetrics(t *testing.T) { + testCases := []struct { + name string + cfg *Config + }{ + { + name: "zero_conditions", + cfg: &Config{ + Spans: map[string]MetricInfo{ + "trace.span.sum": { + Description: "The sum of beep values observed in spans.", + SourceAttribute: "beep", + }, + }, + SpanEvents: map[string]MetricInfo{ + "trace.span.event.sum": { + Description: "The sum of beep values observed in span events.", + SourceAttribute: "beep", + }, + }, + }, + }, + { + name: "one_condition", + cfg: &Config{ + Spans: map[string]MetricInfo{ + "span.sum.if": { + Description: "Span sum if ...", + SourceAttribute: "beep", + Conditions: []string{ + `resource.attributes["resource.optional"] != nil`, + }, + }, + }, + SpanEvents: map[string]MetricInfo{ + "spanevent.sum.if": { + Description: "Span event sum if ...", + SourceAttribute: "beep", + Conditions: []string{ + `resource.attributes["resource.optional"] != nil`, + }, + }, + }, + }, + }, + { + name: "one_attribute", + cfg: &Config{ + Spans: map[string]MetricInfo{ + "span.sum.by_attr": { + Description: "Span sum by attribute", + SourceAttribute: "beep", + Attributes: []AttributeConfig{ + { + Key: "span.required", + }, + }, + }, + }, + SpanEvents: map[string]MetricInfo{ + "spanevent.sum.by_attr": { + Description: "Span event sum by attribute", + SourceAttribute: "beep", + Attributes: []AttributeConfig{ + { + Key: "event.required", + }, + }, + }, + }, + }, + }, + { + name: "multiple_conditions", + cfg: &Config{ + Spans: map[string]MetricInfo{ + "span.sum.if": { + Description: "Span sum if ...", + SourceAttribute: "beep", + Conditions: []string{ + `resource.attributes["resource.optional"] != nil`, + `attributes["span.optional"] != nil`, + }, + }, + }, + SpanEvents: map[string]MetricInfo{ + "spanevent.sum.if": { + Description: "Span event sum if ...", + SourceAttribute: "beep", + Conditions: []string{ + `resource.attributes["resource.optional"] != nil`, + `attributes["event.optional"] != nil`, + }, + }, + }, + }, + }, + { + name: "multiple_attributes", + cfg: &Config{ + Spans: map[string]MetricInfo{ + "span.sum.by_attr": { + Description: "Span sum by attributes", + SourceAttribute: "beep", + Attributes: []AttributeConfig{ + { + Key: "span.required", + }, + { + Key: "span.optional", + }, + }, + }, + }, + SpanEvents: map[string]MetricInfo{ + "spanevent.sum.by_attr": { + Description: "Span event sum by attributes", + SourceAttribute: "beep", + Attributes: []AttributeConfig{ + { + Key: "event.required", + }, + { + Key: "event.optional", + }, + }, + }, + }, + }, + }, + { + name: "multiple_metrics", + cfg: &Config{ + Spans: map[string]MetricInfo{ + "span.sum.all": { + Description: "All spans sum", + SourceAttribute: "beep", + }, + "span.sum.if": { + Description: "Span sum if ...", + SourceAttribute: "beep", + Conditions: []string{ + `resource.attributes["resource.optional"] != nil`, + `attributes["span.optional"] != nil`, + }, + }, + }, + SpanEvents: map[string]MetricInfo{ + "spanevent.sum.all": { + Description: "All span events sum", + SourceAttribute: "beep", + }, + "spanevent.sum.if": { + Description: "Span event sum if ...", + SourceAttribute: "beep", + Conditions: []string{ + `resource.attributes["resource.optional"] != nil`, + `attributes["event.optional"] != nil`, + }, + }, + }, + }, + }, + { + name: "condition_and_attribute", + cfg: &Config{ + Spans: map[string]MetricInfo{ + "span.sum.if.by_attr": { + Description: "Span sum if ...", + SourceAttribute: "beep", + Conditions: []string{ + `resource.attributes["resource.optional"] != nil`, + }, + Attributes: []AttributeConfig{ + { + Key: "span.required", + }, + }, + }, + }, + SpanEvents: map[string]MetricInfo{ + "spanevent.sum.if.by_attr": { + Description: "Span event sum by attribute if ...", + SourceAttribute: "beep", + Conditions: []string{ + `resource.attributes["resource.optional"] != nil`, + }, + Attributes: []AttributeConfig{ + { + Key: "event.required", + }, + }, + }, + }, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + require.NoError(t, tc.cfg.Validate()) + factory := NewFactory() + sink := &consumertest.MetricsSink{} + conn, err := factory.CreateTracesToMetrics(context.Background(), + connectortest.NewNopSettings(), tc.cfg, sink) + require.NoError(t, err) + require.NotNil(t, conn) + assert.False(t, conn.Capabilities().MutatesData) + + require.NoError(t, conn.Start(context.Background(), componenttest.NewNopHost())) + defer func() { + assert.NoError(t, conn.Shutdown(context.Background())) + }() + + testSpans, err := golden.ReadTraces(filepath.Join("testdata", "traces", "input.yaml")) + assert.NoError(t, err) + assert.NoError(t, conn.ConsumeTraces(context.Background(), testSpans)) + + allMetrics := sink.AllMetrics() + assert.Len(t, allMetrics, 1) + + expected, err := golden.ReadMetrics(filepath.Join("testdata", "traces", tc.name+".yaml")) + assert.NoError(t, err) + assert.NoError(t, pmetrictest.CompareMetrics(expected, allMetrics[0], + pmetrictest.IgnoreTimestamp(), + pmetrictest.IgnoreResourceMetricsOrder(), + pmetrictest.IgnoreMetricsOrder(), + pmetrictest.IgnoreMetricFloatPrecision(3), + pmetrictest.IgnoreMetricDataPointsOrder())) + }) + } +} + +// The test input file has a repetitive structure: +// - There are four resources, each with six metrics, each with four data points. +// - The four resources have the following sets of attributes: +// - resource.required: foo, resource.optional: bar +// - resource.required: foo, resource.optional: notbar +// - resource.required: notfoo +// - (no attributes) +// +// - The size metrics have the following sets of types: +// - int gauge, double gauge, int sum, double sum, historgram, summary +// +// - The four data points on each metric have the following sets of attributes: +// - datapoint.required: foo, datapoint.optional: bar +// - datapoint.required: foo, datapoint.optional: notbar +// - datapoint.required: notfoo +// - (no attributes) +func TestMetricsToMetrics(t *testing.T) { + testCases := []struct { + name string + cfg *Config + }{ + { + name: "one_attribute", + cfg: &Config{ + DataPoints: map[string]MetricInfo{ + "datapoint.sum.by_attr": { + Description: "Data point sum by attribute", + SourceAttribute: "beep", + Attributes: []AttributeConfig{ + { + Key: "datapoint.required", + }, + }, + }, + }, + }, + }, + { + name: "one_condition", + cfg: &Config{ + DataPoints: map[string]MetricInfo{ + "datapoint.sum.if": { + Description: "Data point sum if ...", + SourceAttribute: "beep", + Conditions: []string{ + `resource.attributes["resource.optional"] != nil`, + }, + }, + }, + }, + }, + { + name: "multiple_conditions", + cfg: &Config{ + DataPoints: map[string]MetricInfo{ + "datapoint.sum.if": { + Description: "Data point sum if ...", + SourceAttribute: "beep", + Conditions: []string{ + `resource.attributes["resource.optional"] != nil`, + `attributes["datapoint.optional"] != nil`, + }, + }, + }, + }, + }, + { + name: "multiple_metrics", + cfg: &Config{ + DataPoints: map[string]MetricInfo{ + "datapoint.sum.all": { + Description: "All data points sum", + SourceAttribute: "beep", + }, + "datapoint.sum.if": { + Description: "Data point sum if ...", + SourceAttribute: "beep", + Conditions: []string{ + `resource.attributes["resource.optional"] != nil`, + `attributes["datapoint.optional"] != nil`, + }, + }, + }, + }, + }, + { + name: "multiple_attributes", + cfg: &Config{ + DataPoints: map[string]MetricInfo{ + "datapoint.sum.by_attr": { + Description: "Data point sum by attributes", + SourceAttribute: "beep", + Attributes: []AttributeConfig{ + { + Key: "datapoint.required", + }, + { + Key: "datapoint.optional", + }, + }, + }, + }, + }, + }, + { + name: "default_attribute_value", + cfg: &Config{ + DataPoints: map[string]MetricInfo{ + "datapoint.sum.by_attr": { + Description: "Data point sum by attribute with default", + SourceAttribute: "beep", + Attributes: []AttributeConfig{ + { + Key: "datapoint.required", + }, + { + Key: "datapoint.optional", + DefaultValue: "other", + }, + }, + }, + }, + }, + }, + { + name: "condition_and_attribute", + cfg: &Config{ + DataPoints: map[string]MetricInfo{ + "datapoint.sum.if.by_attr": { + Description: "Data point sum by attribute if ...", + SourceAttribute: "beep", + Conditions: []string{ + `resource.attributes["resource.optional"] != nil`, + }, + Attributes: []AttributeConfig{ + { + Key: "datapoint.required", + }, + }, + }, + }, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + require.NoError(t, tc.cfg.Validate()) + factory := NewFactory() + sink := &consumertest.MetricsSink{} + conn, err := factory.CreateMetricsToMetrics(context.Background(), + connectortest.NewNopSettings(), tc.cfg, sink) + require.NoError(t, err) + require.NotNil(t, conn) + assert.False(t, conn.Capabilities().MutatesData) + + require.NoError(t, conn.Start(context.Background(), componenttest.NewNopHost())) + defer func() { + assert.NoError(t, conn.Shutdown(context.Background())) + }() + + testMetrics, err := golden.ReadMetrics(filepath.Join("testdata", "metrics", "input.yaml")) + assert.NoError(t, err) + assert.NoError(t, conn.ConsumeMetrics(context.Background(), testMetrics)) + + allMetrics := sink.AllMetrics() + assert.Len(t, allMetrics, 1) + + expected, err := golden.ReadMetrics(filepath.Join("testdata", "metrics", tc.name+".yaml")) + assert.NoError(t, err) + assert.NoError(t, pmetrictest.CompareMetrics(expected, allMetrics[0], + pmetrictest.IgnoreTimestamp(), + pmetrictest.IgnoreResourceMetricsOrder(), + pmetrictest.IgnoreMetricsOrder(), + pmetrictest.IgnoreMetricFloatPrecision(3), + pmetrictest.IgnoreMetricDataPointsOrder())) + }) + } +} + +// The test input file has a repetitive structure: +// - There are four resources, each with four logs. +// - The four resources have the following sets of attributes: +// - resource.required: foo, resource.optional: bar +// - resource.required: foo, resource.optional: notbar +// - resource.required: notfoo +// - (no attributes) +// +// - The four logs on each resource have the following sets of attributes: +// - log.required: foo, log.optional: bar +// - log.required: foo, log.optional: notbar +// - log.required: notfoo +// - (no attributes) +func TestLogsToMetrics(t *testing.T) { + testCases := []struct { + name string + cfg *Config + }{ + { + name: "one_attribute", + cfg: &Config{ + Logs: map[string]MetricInfo{ + "log.sum.by_attr": { + Description: "Log sum by attribute", + SourceAttribute: "beep", + Attributes: []AttributeConfig{ + { + Key: "log.required", + }, + }, + }, + }, + }, + }, + { + name: "one_condition", + cfg: &Config{ + Logs: map[string]MetricInfo{ + "sum.if": { + Description: "Sum if ...", + SourceAttribute: "beep", + Conditions: []string{ + `resource.attributes["resource.optional"] != nil`, + }, + }, + }, + }, + }, + { + name: "multiple_conditions", + cfg: &Config{ + Logs: map[string]MetricInfo{ + "sum.if": { + Description: "Sum if ...", + SourceAttribute: "beep", + Conditions: []string{ + `resource.attributes["resource.optional"] != nil`, + `attributes["log.optional"] != nil`, + }, + }, + }, + }, + }, + { + name: "multiple_metrics", + cfg: &Config{ + Logs: map[string]MetricInfo{ + "sum.all": { + Description: "All logs Sum", + SourceAttribute: "beep", + }, + "sum.if": { + Description: "Sum if ...", + SourceAttribute: "beep", + Conditions: []string{ + `resource.attributes["resource.optional"] != nil`, + }, + }, + }, + }, + }, + { + name: "multiple_attributes", + cfg: &Config{ + Logs: map[string]MetricInfo{ + "log.sum.by_attr": { + Description: "Log sum by attributes", + SourceAttribute: "beep", + Attributes: []AttributeConfig{ + { + Key: "log.required", + }, + { + Key: "log.optional", + }, + }, + }, + }, + }, + }, + { + name: "default_attribute_value", + cfg: &Config{ + Logs: map[string]MetricInfo{ + "log.sum.by_attr": { + Description: "Log sum by attribute with default", + SourceAttribute: "beep", + Attributes: []AttributeConfig{ + { + Key: "log.required", + }, + { + Key: "log.optional", + DefaultValue: "other", + }, + }, + }, + }, + }, + }, + { + name: "condition_and_attribute", + cfg: &Config{ + Logs: map[string]MetricInfo{ + "log.sum.if.by_attr": { + Description: "Log sum by attribute if ...", + SourceAttribute: "beep", + Conditions: []string{ + `resource.attributes["resource.optional"] != nil`, + }, + Attributes: []AttributeConfig{ + { + Key: "log.required", + }, + }, + }, + }, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + require.NoError(t, tc.cfg.Validate()) + factory := NewFactory() + sink := &consumertest.MetricsSink{} + conn, err := factory.CreateLogsToMetrics(context.Background(), + connectortest.NewNopSettings(), tc.cfg, sink) + require.NoError(t, err) + require.NotNil(t, conn) + assert.False(t, conn.Capabilities().MutatesData) + + require.NoError(t, conn.Start(context.Background(), componenttest.NewNopHost())) + defer func() { + assert.NoError(t, conn.Shutdown(context.Background())) + }() + + testLogs, err := golden.ReadLogs(filepath.Join("testdata", "logs", "input.yaml")) + assert.NoError(t, err) + assert.NoError(t, conn.ConsumeLogs(context.Background(), testLogs)) + + allMetrics := sink.AllMetrics() + assert.Len(t, allMetrics, 1) + + expected, err := golden.ReadMetrics(filepath.Join("testdata", "logs", tc.name+".yaml")) + assert.NoError(t, err) + assert.NoError(t, pmetrictest.CompareMetrics(expected, allMetrics[0], + pmetrictest.IgnoreTimestamp(), + pmetrictest.IgnoreResourceMetricsOrder(), + pmetrictest.IgnoreMetricsOrder(), + pmetrictest.IgnoreMetricFloatPrecision(3), + pmetrictest.IgnoreMetricDataPointsOrder())) + }) + } +} diff --git a/connector/sumconnector/factory.go b/connector/sumconnector/factory.go new file mode 100644 index 000000000000..7ebf2b263a4d --- /dev/null +++ b/connector/sumconnector/factory.go @@ -0,0 +1,167 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +//go:generate mdatagen metadata.yaml + +package sumconnector // import "github.com/open-telemetry/opentelemetry-collector-contrib/connector/sumconnector" + +import ( + "context" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/connector" + "go.opentelemetry.io/collector/consumer" + + "github.com/open-telemetry/opentelemetry-collector-contrib/connector/sumconnector/internal/metadata" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter/filterottl" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottldatapoint" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottllog" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottlmetric" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottlspan" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottlspanevent" +) + +// NewFactory returns a ConnectorFactory. +func NewFactory() connector.Factory { + return connector.NewFactory( + metadata.Type, + createDefaultConfig, + connector.WithTracesToMetrics(createTracesToMetrics, metadata.TracesToMetricsStability), + connector.WithMetricsToMetrics(createMetricsToMetrics, metadata.MetricsToMetricsStability), + connector.WithLogsToMetrics(createLogsToMetrics, metadata.LogsToMetricsStability), + ) +} + +// createDefaultConfig creates the default configuration. +func createDefaultConfig() component.Config { + return &Config{} +} + +// createTracesToMetrics creates a traces to metrics connector based on provided config. +func createTracesToMetrics( + _ context.Context, + set connector.Settings, + cfg component.Config, + nextConsumer consumer.Metrics, +) (connector.Traces, error) { + c := cfg.(*Config) + + spanMetricDefs := make(map[string]metricDef[ottlspan.TransformContext], len(c.Spans)) + for name, info := range c.Spans { + md := metricDef[ottlspan.TransformContext]{ + desc: info.Description, + attrs: info.Attributes, + sourceAttr: info.SourceAttribute, + } + if len(info.Conditions) > 0 { + // Error checked in Config.Validate() + condition, _ := filterottl.NewBoolExprForSpan(info.Conditions, filterottl.StandardSpanFuncs(), ottl.PropagateError, set.TelemetrySettings) + md.condition = condition + } + spanMetricDefs[name] = md + } + + spanEventMetricDefs := make(map[string]metricDef[ottlspanevent.TransformContext], len(c.SpanEvents)) + for name, info := range c.SpanEvents { + md := metricDef[ottlspanevent.TransformContext]{ + desc: info.Description, + attrs: info.Attributes, + sourceAttr: info.SourceAttribute, + } + if len(info.Conditions) > 0 { + // Error checked in Config.Validate() + condition, _ := filterottl.NewBoolExprForSpanEvent(info.Conditions, filterottl.StandardSpanEventFuncs(), ottl.PropagateError, set.TelemetrySettings) + md.condition = condition + } + spanEventMetricDefs[name] = md + } + + return &sum{ + metricsConsumer: nextConsumer, + spansMetricDefs: spanMetricDefs, + spanEventsMetricDefs: spanEventMetricDefs, + }, nil +} + +// createMetricsToMetrics creates a metricds to metrics connector based on provided config. +func createMetricsToMetrics( + _ context.Context, + set connector.Settings, + cfg component.Config, + nextConsumer consumer.Metrics, +) (connector.Metrics, error) { + c := cfg.(*Config) + + metricMetricDefs := make(map[string]metricDef[ottlmetric.TransformContext], len(c.Metrics)) + for name, info := range c.Metrics { + md := metricDef[ottlmetric.TransformContext]{ + desc: info.Description, + sourceAttr: info.SourceAttribute, + } + if len(info.Conditions) > 0 { + // Error checked in Config.Validate() + condition, _ := filterottl.NewBoolExprForMetric(info.Conditions, filterottl.StandardMetricFuncs(), ottl.PropagateError, set.TelemetrySettings) + md.condition = condition + } + metricMetricDefs[name] = md + } + + dataPointMetricDefs := make(map[string]metricDef[ottldatapoint.TransformContext], len(c.DataPoints)) + for name, info := range c.DataPoints { + md := metricDef[ottldatapoint.TransformContext]{ + desc: info.Description, + attrs: info.Attributes, + sourceAttr: info.SourceAttribute, + } + if len(info.Conditions) > 0 { + // Error checked in Config.Validate() + condition, _ := filterottl.NewBoolExprForDataPoint(info.Conditions, filterottl.StandardDataPointFuncs(), ottl.PropagateError, set.TelemetrySettings) + md.condition = condition + } + dataPointMetricDefs[name] = md + } + + return &sum{ + metricsConsumer: nextConsumer, + metricsMetricDefs: metricMetricDefs, + dataPointsMetricDefs: dataPointMetricDefs, + }, nil +} + +// createLogsToMetrics creates a logs to metrics connector based on provided config. +func createLogsToMetrics( + _ context.Context, + set connector.Settings, + cfg component.Config, + nextConsumer consumer.Metrics, +) (connector.Logs, error) { + c := cfg.(*Config) + + metricDefs := make(map[string]metricDef[ottllog.TransformContext], len(c.Logs)) + for name, info := range c.Logs { + md := metricDef[ottllog.TransformContext]{ + desc: info.Description, + attrs: info.Attributes, + sourceAttr: info.SourceAttribute, + } + if len(info.Conditions) > 0 { + // Error checked in Config.Validate() + condition, _ := filterottl.NewBoolExprForLog(info.Conditions, filterottl.StandardLogFuncs(), ottl.PropagateError, set.TelemetrySettings) + md.condition = condition + } + metricDefs[name] = md + } + + return &sum{ + metricsConsumer: nextConsumer, + logsMetricDefs: metricDefs, + }, nil +} + +type metricDef[K any] struct { + condition *ottl.ConditionSequence[K] + desc string + attrs []AttributeConfig + sourceAttr string +} diff --git a/connector/sumconnector/generated_component_test.go b/connector/sumconnector/generated_component_test.go new file mode 100644 index 000000000000..1b2cdafd6f3f --- /dev/null +++ b/connector/sumconnector/generated_component_test.go @@ -0,0 +1,88 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package sumconnector + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/confmap/confmaptest" + "go.opentelemetry.io/collector/connector" + "go.opentelemetry.io/collector/connector/connectortest" + "go.opentelemetry.io/collector/consumer" + "go.opentelemetry.io/collector/consumer/consumertest" + "go.opentelemetry.io/collector/pipeline" +) + +func TestComponentFactoryType(t *testing.T) { + require.Equal(t, "sum", NewFactory().Type().String()) +} + +func TestComponentConfigStruct(t *testing.T) { + require.NoError(t, componenttest.CheckConfigStruct(NewFactory().CreateDefaultConfig())) +} + +func TestComponentLifecycle(t *testing.T) { + factory := NewFactory() + + tests := []struct { + name string + createFn func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) + }{ + + { + name: "logs_to_metrics", + createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) { + router := connector.NewMetricsRouter(map[pipeline.ID]consumer.Metrics{pipeline.NewID(pipeline.SignalMetrics): consumertest.NewNop()}) + return factory.CreateLogsToMetrics(ctx, set, cfg, router) + }, + }, + + { + name: "metrics_to_metrics", + createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) { + router := connector.NewMetricsRouter(map[pipeline.ID]consumer.Metrics{pipeline.NewID(pipeline.SignalMetrics): consumertest.NewNop()}) + return factory.CreateMetricsToMetrics(ctx, set, cfg, router) + }, + }, + + { + name: "traces_to_metrics", + createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) { + router := connector.NewMetricsRouter(map[pipeline.ID]consumer.Metrics{pipeline.NewID(pipeline.SignalMetrics): consumertest.NewNop()}) + return factory.CreateTracesToMetrics(ctx, set, cfg, router) + }, + }, + } + + cm, err := confmaptest.LoadConf("metadata.yaml") + require.NoError(t, err) + cfg := factory.CreateDefaultConfig() + sub, err := cm.Sub("tests::config") + require.NoError(t, err) + require.NoError(t, sub.Unmarshal(&cfg)) + + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), connectortest.NewNopSettings(), cfg) + require.NoError(t, err) + err = c.Shutdown(context.Background()) + require.NoError(t, err) + }) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + firstConnector, err := tt.createFn(context.Background(), connectortest.NewNopSettings(), cfg) + require.NoError(t, err) + host := componenttest.NewNopHost() + require.NoError(t, err) + require.NoError(t, firstConnector.Start(context.Background(), host)) + require.NoError(t, firstConnector.Shutdown(context.Background())) + secondConnector, err := tt.createFn(context.Background(), connectortest.NewNopSettings(), cfg) + require.NoError(t, err) + require.NoError(t, secondConnector.Start(context.Background(), host)) + require.NoError(t, secondConnector.Shutdown(context.Background())) + }) + } +} diff --git a/connector/sumconnector/generated_package_test.go b/connector/sumconnector/generated_package_test.go new file mode 100644 index 000000000000..6a2e7f1b6171 --- /dev/null +++ b/connector/sumconnector/generated_package_test.go @@ -0,0 +1,13 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package sumconnector + +import ( + "testing" + + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + goleak.VerifyTestMain(m) +} diff --git a/connector/sumconnector/go.mod b/connector/sumconnector/go.mod new file mode 100644 index 000000000000..d79b74af2cd9 --- /dev/null +++ b/connector/sumconnector/go.mod @@ -0,0 +1,90 @@ +module github.com/open-telemetry/opentelemetry-collector-contrib/connector/sumconnector + +go 1.22.0 + +require ( + github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/connector v0.116.0 + go.opentelemetry.io/collector/connector/connectortest v0.116.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/pipeline v0.116.0 + go.uber.org/goleak v1.3.0 + go.uber.org/zap v1.27.0 +) + +require ( + github.com/alecthomas/participle/v2 v2.1.1 // indirect + github.com/antchfx/xmlquery v1.4.2 // indirect + github.com/antchfx/xpath v1.3.2 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/elastic/go-grok v0.3.1 // indirect + github.com/elastic/lunes v0.1.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/gobwas/glob v0.2.3 // indirect + github.com/goccy/go-json v0.10.4 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/golang-lru v0.5.4 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect + github.com/iancoleman/strcase v0.3.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/knadh/koanf/maps v0.1.1 // indirect + github.com/knadh/koanf/providers/confmap v0.1.0 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect + github.com/magefile/mage v1.15.0 // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/connector/xconnector v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 // indirect + go.opentelemetry.io/collector/semconv v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal => ../../internal/coreinternal + +replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter => ../../internal/filter + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl => ../../pkg/ottl + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden => ../../pkg/golden + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../../pkg/pdatautil + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest => ../../pkg/pdatatest diff --git a/connector/sumconnector/go.sum b/connector/sumconnector/go.sum new file mode 100644 index 000000000000..54c7414a2806 --- /dev/null +++ b/connector/sumconnector/go.sum @@ -0,0 +1,201 @@ +github.com/alecthomas/assert/v2 v2.3.0 h1:mAsH2wmvjsuvyBvAmCtm7zFsBlb8mIHx5ySLVdDZXL0= +github.com/alecthomas/assert/v2 v2.3.0/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= +github.com/alecthomas/participle/v2 v2.1.1 h1:hrjKESvSqGHzRb4yW1ciisFJ4p3MGYih6icjJvbsmV8= +github.com/alecthomas/participle/v2 v2.1.1/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= +github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= +github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= +github.com/antchfx/xmlquery v1.4.2 h1:MZKd9+wblwxfQ1zd1AdrTsqVaMjMCwow3IqkCSe00KA= +github.com/antchfx/xmlquery v1.4.2/go.mod h1:QXhvf5ldTuGqhd1SHNvvtlhhdQLks4dD0awIVhXIDTA= +github.com/antchfx/xpath v1.3.2 h1:LNjzlsSjinu3bQpw9hWMY9ocB80oLOWuQqFvO6xt51U= +github.com/antchfx/xpath v1.3.2/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/elastic/go-grok v0.3.1 h1:WEhUxe2KrwycMnlvMimJXvzRa7DoByJB4PVUIE1ZD/U= +github.com/elastic/go-grok v0.3.1/go.mod h1:n38ls8ZgOboZRgKcjMY8eFeZFMmcL9n2lP0iHhIDk64= +github.com/elastic/lunes v0.1.0 h1:amRtLPjwkWtzDF/RKzcEPMvSsSseLDLW+bnhfNSLRe4= +github.com/elastic/lunes v0.1.0/go.mod h1:xGphYIt3XdZRtyWosHQTErsQTd4OP1p9wsbVoHelrd4= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= +github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= +github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= +github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= +github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= +github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= +github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= +github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= +github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 h1:SIKIoA4e/5Y9ZOl0DCe3eVMLPOQzJxgZpfdHHeauNTM= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6/go.mod h1:BUbeWZiieNxAuuADTBNb3/aeje6on3DhU3rpWsQSB1E= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/connector v0.116.0 h1:0Pz8RAXH1swLeA1fiyGGQWdv0Kemz4mbq+jnmd1TACE= +go.opentelemetry.io/collector/connector v0.116.0/go.mod h1:VQiZ2yW9KhZuF0yjDbvlgrAxm7+o8KQoxHxurQWLjKU= +go.opentelemetry.io/collector/connector/connectortest v0.116.0 h1:MdttvjqdZmp0ewW5IPCEtzzYmCqxrQxsjJ5m6gMVjzA= +go.opentelemetry.io/collector/connector/connectortest v0.116.0/go.mod h1:ko7aPyvAVf6SvRhWGZdPXSyk+7zPmsSCcMq0gYPMMIQ= +go.opentelemetry.io/collector/connector/xconnector v0.116.0 h1:fFJzrRco0g7HMkhnQ+ehlvicFf58vzsCLXnfuHyQM8w= +go.opentelemetry.io/collector/connector/xconnector v0.116.0/go.mod h1:m9oCk32zX6wDciYBpy+qMQkWKtOxb0gAkEUm8+trflY= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 h1:KKFb3u8iLk4V5GYz7eVpw8QgEdob5koX6GNEbaoDQJY= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0/go.mod h1:YyWHUWeSnRmy2CF7kPHpwJ6qkVjufbLZ8PYuY0Ph0o8= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 h1:PFNy+Il/kqPdPL9rhG+1kG63Aauya+FhBKGXoB6ivxU= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0/go.mod h1:bVn9V4TGyeXi58/JDkeXCuKtc+V+qcOoTl8hNpV0qa8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/connector/sumconnector/internal/metadata/generated_status.go b/connector/sumconnector/internal/metadata/generated_status.go new file mode 100644 index 000000000000..5530f7f6b267 --- /dev/null +++ b/connector/sumconnector/internal/metadata/generated_status.go @@ -0,0 +1,18 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "go.opentelemetry.io/collector/component" +) + +var ( + Type = component.MustNewType("sum") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/connector/sumconnector" +) + +const ( + TracesToMetricsStability = component.StabilityLevelAlpha + MetricsToMetricsStability = component.StabilityLevelAlpha + LogsToMetricsStability = component.StabilityLevelAlpha +) diff --git a/connector/sumconnector/metadata.yaml b/connector/sumconnector/metadata.yaml new file mode 100644 index 000000000000..d7e5b0b0fd01 --- /dev/null +++ b/connector/sumconnector/metadata.yaml @@ -0,0 +1,12 @@ +type: sum + +status: + class: connector + stability: + alpha: [traces_to_metrics, metrics_to_metrics, logs_to_metrics] + distributions: [] + codeowners: + active: [greatestusername, shalper2, crobert-1] + +tests: + config: diff --git a/connector/sumconnector/sum.go b/connector/sumconnector/sum.go new file mode 100644 index 000000000000..5c89ed19e42e --- /dev/null +++ b/connector/sumconnector/sum.go @@ -0,0 +1,154 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package sumconnector // import "github.com/open-telemetry/opentelemetry-collector-contrib/connector/sumconnector" + +import ( + "context" + "errors" + "fmt" + "strconv" + "time" + + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/pmetric" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil" +) + +var noAttributes = [16]byte{} + +func newSummer[K any](metricDefs map[string]metricDef[K]) *summer[K] { + return &summer[K]{ + metricDefs: metricDefs, + sums: make(map[string]map[[16]byte]*attrSummer, len(metricDefs)), + timestamp: time.Now(), + } +} + +type summer[K any] struct { + metricDefs map[string]metricDef[K] + sums map[string]map[[16]byte]*attrSummer + timestamp time.Time +} + +type attrSummer struct { + attrs pcommon.Map + sum float64 +} + +func (c *summer[K]) update(ctx context.Context, attrs pcommon.Map, tCtx K) error { + var multiError error + for name, md := range c.metricDefs { + sourceAttribute := md.sourceAttr + sumAttrs := pcommon.NewMap() + var sumVal float64 + + // Get source attribute value + if sourceAttrVal, ok := attrs.Get(sourceAttribute); ok { + switch { + case sourceAttrVal.Str() != "": + sumVal, _ = strconv.ParseFloat(sourceAttrVal.Str(), 64) + case sourceAttrVal.Double() != 0: + sumVal = sourceAttrVal.Double() + case sourceAttrVal.Int() != 0: + sumVal = float64(sourceAttrVal.Int()) + } + } + + // Get attribute values to include otherwise use default value + for _, attr := range md.attrs { + if attrVal, ok := attrs.Get(attr.Key); ok { + switch { + case attrVal.Str() != "": + sumAttrs.PutStr(attr.Key, attrVal.Str()) + case attrVal.Double() != 0: + sumAttrs.PutStr(attr.Key, fmt.Sprintf("%v", attrVal.Double())) + case attrVal.Int() != 0: + sumAttrs.PutStr(attr.Key, fmt.Sprintf("%v", attrVal.Int())) + } + } else if attr.DefaultValue != nil { + switch v := attr.DefaultValue.(type) { + case string: + if v != "" { + sumAttrs.PutStr(attr.Key, v) + } + case int: + if v != 0 { + sumAttrs.PutInt(attr.Key, int64(v)) + } + case float64: + if v != 0 { + sumAttrs.PutDouble(attr.Key, float64(v)) + } + } + } + } + + // Missing necessary attributes + if sumAttrs.Len() != len(md.attrs) { + continue + } + + // Perform condition matching or not + if md.condition == nil { + multiError = errors.Join(multiError, c.increment(name, sumVal, sumAttrs)) + continue + } + + if match, err := md.condition.Eval(ctx, tCtx); err != nil { + multiError = errors.Join(multiError, err) + } else if match { + multiError = errors.Join(multiError, c.increment(name, sumVal, sumAttrs)) + } + } + return multiError +} + +func (c *summer[K]) increment(metricName string, sumVal float64, attrs pcommon.Map) error { + if _, ok := c.sums[metricName]; !ok { + c.sums[metricName] = make(map[[16]byte]*attrSummer) + } + + key := noAttributes + if attrs.Len() > 0 { + key = pdatautil.MapHash(attrs) + } + + if _, ok := c.sums[metricName][key]; !ok { + c.sums[metricName][key] = &attrSummer{attrs: attrs} + } + + for strings := range c.sums[metricName][key].attrs.AsRaw() { + if _, ok := c.sums[metricName][key].attrs.Get(strings); ok { + c.sums[metricName][key].sum += sumVal + } + } + + if attrs.Len() == 0 { + c.sums[metricName][key].sum += sumVal + } + + return nil +} + +func (c *summer[K]) appendMetricsTo(metricSlice pmetric.MetricSlice) { + for name, md := range c.metricDefs { + if len(c.sums[name]) == 0 { + continue + } + sumMetric := metricSlice.AppendEmpty() + sumMetric.SetName(name) + sumMetric.SetDescription(md.desc) + sum := sumMetric.SetEmptySum() + // The delta value is always positive, so a value accumulated downstream is monotonic + sum.SetIsMonotonic(true) + sum.SetAggregationTemporality(pmetric.AggregationTemporalityDelta) + for _, dpSum := range c.sums[name] { + dp := sum.DataPoints().AppendEmpty() + dpSum.attrs.CopyTo(dp.Attributes()) + dp.SetDoubleValue(dpSum.sum) + dp.SetTimestamp(pcommon.NewTimestampFromTime(c.timestamp)) + } + } +} diff --git a/connector/sumconnector/testdata/config.yaml b/connector/sumconnector/testdata/config.yaml new file mode 100644 index 000000000000..d2a2bcb1de1c --- /dev/null +++ b/connector/sumconnector/testdata/config.yaml @@ -0,0 +1,182 @@ + sum: + sum/custom_description: + spans: + my.span.sum: + description: My span record sum. + source_attribute: my.attribute + spanevents: + my.spanevent.sum: + description: My spanevent sum. + source_attribute: my.attribute + metrics: + my.metric.sum: + description: My metric sum. + source_attribute: my.attribute + datapoints: + my.datapoint.sum: + description: My datapoint sum. + source_attribute: my.attribute + logs: + my.logrecord.sum: + description: My log sum. + source_attribute: my.attribute + sum/custom_metric: + spans: + my.span.sum: + source_attribute: my.attribute + spanevents: + my.spanevent.sum: + source_attribute: my.attribute + metrics: + my.metric.sum: + source_attribute: my.attribute + datapoints: + my.datapoint.sum: + source_attribute: my.attribute + logs: + my.logrecord.sum: + source_attribute: my.attribute + sum/condition: + spans: + my.span.sum: + source_attribute: my.attribute + conditions: + - IsMatch(resource.attributes["host.name"], "pod-s") + spanevents: + my.spanevent.sum: + source_attribute: my.attribute + conditions: + - IsMatch(resource.attributes["host.name"], "pod-e") + metrics: + my.metric.sum: + source_attribute: my.attribute + conditions: + - IsMatch(resource.attributes["host.name"], "pod-m") + datapoints: + my.datapoint.sum: + source_attribute: my.attribute + conditions: + - IsMatch(resource.attributes["host.name"], "pod-d") + logs: + my.logrecord.sum: + source_attribute: my.attribute + conditions: + - IsMatch(resource.attributes["host.name"], "pod-l") + sum/multiple_condition: + spans: + my.span.sum: + source_attribute: my.attribute + conditions: + - IsMatch(resource.attributes["host.name"], "pod-s") + - IsMatch(resource.attributes["foo"], "bar-s") + spanevents: + my.spanevent.sum: + source_attribute: my.attribute + conditions: + - IsMatch(resource.attributes["host.name"], "pod-e") + - IsMatch(resource.attributes["foo"], "bar-e") + metrics: + my.metric.sum: + source_attribute: my.attribute + conditions: + - IsMatch(resource.attributes["host.name"], "pod-m") + - IsMatch(resource.attributes["foo"], "bar-m") + datapoints: + my.datapoint.sum: + source_attribute: my.attribute + conditions: + - IsMatch(resource.attributes["host.name"], "pod-d") + - IsMatch(resource.attributes["foo"], "bar-d") + logs: + my.logrecord.sum: + source_attribute: my.attribute + conditions: + - IsMatch(resource.attributes["host.name"], "pod-l") + - IsMatch(resource.attributes["foo"], "bar-l") + sum/attribute: + spans: + my.span.sum: + source_attribute: my.attribute + attributes: + - key: env + spanevents: + my.spanevent.sum: + source_attribute: my.attribute + attributes: + - key: env + metrics: + my.metric.sum: + source_attribute: my.attribute + # Metrics do not have attributes. + datapoints: + my.datapoint.sum: + source_attribute: my.attribute + attributes: + - key: env + logs: + my.logrecord.sum: + source_attribute: my.attribute + attributes: + - key: env + sum/multiple_metrics: + spans: + my.span.sum: + description: My span sum. + source_attribute: my.attribute + limited.span.sum: + description: Limited span sum. + source_attribute: my.attribute + conditions: + - IsMatch(resource.attributes["host.name"], "pod-s") + attributes: + - key: env + - key: component + default_value: other + spanevents: + my.spanevent.sum: + description: My span event sum. + source_attribute: my.attribute + limited.spanevent.sum: + description: Limited span event sum. + source_attribute: my.attribute + conditions: + - IsMatch(resource.attributes["host.name"], "pod-e") + attributes: + - key: env + - key: component + default_value: other + metrics: + my.metric.sum: + description: My metric sum. + source_attribute: my.attribute + limited.metric.sum: + description: Limited metric sum. + source_attribute: my.attribute + conditions: + - IsMatch(resource.attributes["host.name"], "pod-m") + datapoints: + my.datapoint.sum: + description: My data point sum. + source_attribute: my.attribute + limited.datapoint.sum: + description: Limited data point sum. + source_attribute: my.attribute + conditions: + - IsMatch(resource.attributes["host.name"], "pod-d") + attributes: + - key: env + - key: component + default_value: other + logs: + my.logrecord.sum: + description: My log record sum. + source_attribute: my.attribute + limited.logrecord.sum: + description: Limited log record sum. + source_attribute: my.attribute + conditions: + - IsMatch(resource.attributes["host.name"], "pod-l") + attributes: + - key: env + - key: component + default_value: other \ No newline at end of file diff --git a/connector/sumconnector/testdata/logs/condition_and_attribute.yaml b/connector/sumconnector/testdata/logs/condition_and_attribute.yaml new file mode 100644 index 000000000000..ecce8be30eee --- /dev/null +++ b/connector/sumconnector/testdata/logs/condition_and_attribute.yaml @@ -0,0 +1,57 @@ +resourceMetrics: + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: bar + scopeMetrics: + - metrics: + - description: Log sum by attribute if ... + name: log.sum.if.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "2.1" + attributes: + - key: log.required + value: + stringValue: foo + timeUnixNano: "1678390948399018000" + - asDouble: "2" + attributes: + - key: log.required + value: + stringValue: notfoo + timeUnixNano: "1678390948399018000" + isMonotonic: true + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: notbar + scopeMetrics: + - metrics: + - description: Log sum by attribute if ... + name: log.sum.if.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "4.1" + attributes: + - key: log.required + value: + stringValue: foo + timeUnixNano: "1678390948399021000" + - asDouble: "2" + attributes: + - key: log.required + value: + stringValue: notfoo + timeUnixNano: "1678390948399021000" + isMonotonic: true diff --git a/connector/sumconnector/testdata/logs/default_attribute_value.yaml b/connector/sumconnector/testdata/logs/default_attribute_value.yaml new file mode 100644 index 000000000000..e61873e8eed9 --- /dev/null +++ b/connector/sumconnector/testdata/logs/default_attribute_value.yaml @@ -0,0 +1,163 @@ +resourceMetrics: + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: bar + scopeMetrics: + - metrics: + - description: Log sum by attribute with default + name: log.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "4.2" + attributes: + - key: log.required + value: + stringValue: foo + - key: log.optional + value: + stringValue: bar + timeUnixNano: "1678390948398365000" + - asDouble: "0" + attributes: + - key: log.required + value: + stringValue: foo + - key: log.optional + value: + stringValue: notbar + timeUnixNano: "1678390948398365000" + - asDouble: "4" + attributes: + - key: log.required + value: + stringValue: notfoo + - key: log.optional + value: + stringValue: other + timeUnixNano: "1678390948398365000" + isMonotonic: true + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: notbar + scopeMetrics: + - metrics: + - description: Log sum by attribute with default + name: log.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "4.2" + attributes: + - key: log.required + value: + stringValue: foo + - key: log.optional + value: + stringValue: bar + timeUnixNano: "1678390948398368000" + - asDouble: "4" + attributes: + - key: log.required + value: + stringValue: foo + - key: log.optional + value: + stringValue: notbar + timeUnixNano: "1678390948398368000" + - asDouble: "4" + attributes: + - key: log.required + value: + stringValue: notfoo + - key: log.optional + value: + stringValue: other + timeUnixNano: "1678390948398368000" + isMonotonic: true + - resource: + attributes: + - key: resource.required + value: + stringValue: notfoo + scopeMetrics: + - metrics: + - description: Log sum by attribute with default + name: log.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "4.2" + attributes: + - key: log.required + value: + stringValue: foo + - key: log.optional + value: + stringValue: bar + timeUnixNano: "1678390948398371000" + - asDouble: "4" + attributes: + - key: log.required + value: + stringValue: foo + - key: log.optional + value: + stringValue: notbar + timeUnixNano: "1678390948398371000" + - asDouble: "4" + attributes: + - key: log.required + value: + stringValue: notfoo + - key: log.optional + value: + stringValue: other + timeUnixNano: "1678390948398371000" + isMonotonic: true + - resource: {} + scopeMetrics: + - metrics: + - description: Log sum by attribute with default + name: log.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "4.2" + attributes: + - key: log.required + value: + stringValue: foo + - key: log.optional + value: + stringValue: bar + timeUnixNano: "1678390948398373000" + - asDouble: "4" + attributes: + - key: log.required + value: + stringValue: foo + - key: log.optional + value: + stringValue: notbar + timeUnixNano: "1678390948398373000" + - asDouble: "4" + attributes: + - key: log.required + value: + stringValue: notfoo + - key: log.optional + value: + stringValue: other + timeUnixNano: "1678390948398373000" + isMonotonic: true diff --git a/connector/sumconnector/testdata/logs/input.yaml b/connector/sumconnector/testdata/logs/input.yaml new file mode 100644 index 000000000000..05044f21650c --- /dev/null +++ b/connector/sumconnector/testdata/logs/input.yaml @@ -0,0 +1,223 @@ +resourceLogs: + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: bar + scopeLogs: + - logRecords: + - attributes: + - key: log.required + value: + stringValue: foo + - key: log.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + body: + stringValue: This is a log message + spanId: "" + timeUnixNano: "1581452773000000789" + traceId: "" + - attributes: + - key: log.required + value: + stringValue: foo + - key: log.optional + value: + stringValue: notbar + - key: beep + value: + stringValue: "astring" + body: + stringValue: This is a log message + spanId: "" + timeUnixNano: "1581452773000000789" + traceId: "" + - attributes: + - key: log.required + value: + stringValue: notfoo + - key: beep + value: + doubleValue: 2 + body: + stringValue: This is a log message + spanId: "" + timeUnixNano: "1581452773000000789" + traceId: "" + - body: + stringValue: This is a log message + spanId: "" + timeUnixNano: "1581452773000000789" + traceId: "" + scope: {} + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: notbar + scopeLogs: + - logRecords: + - attributes: + - key: log.required + value: + stringValue: foo + - key: log.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + body: + stringValue: This is a log message + spanId: "" + timeUnixNano: "1581452773000000789" + traceId: "" + - attributes: + - key: log.required + value: + stringValue: foo + - key: log.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + body: + stringValue: This is a log message + spanId: "" + timeUnixNano: "1581452773000000789" + traceId: "" + - attributes: + - key: log.required + value: + stringValue: notfoo + - key: beep + value: + doubleValue: 2 + body: + stringValue: This is a log message + spanId: "" + timeUnixNano: "1581452773000000789" + traceId: "" + - body: + stringValue: This is a log message + spanId: "" + timeUnixNano: "1581452773000000789" + traceId: "" + scope: {} + - resource: + attributes: + - key: resource.required + value: + stringValue: notfoo + scopeLogs: + - logRecords: + - attributes: + - key: log.required + value: + stringValue: foo + - key: log.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + body: + stringValue: This is a log message + spanId: "" + timeUnixNano: "1581452773000000789" + traceId: "" + - attributes: + - key: log.required + value: + stringValue: foo + - key: log.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + body: + stringValue: This is a log message + spanId: "" + timeUnixNano: "1581452773000000789" + traceId: "" + - attributes: + - key: log.required + value: + stringValue: notfoo + - key: beep + value: + doubleValue: 2 + body: + stringValue: This is a log message + spanId: "" + timeUnixNano: "1581452773000000789" + traceId: "" + - body: + stringValue: This is a log message + spanId: "" + timeUnixNano: "1581452773000000789" + traceId: "" + scope: {} + - resource: {} + scopeLogs: + - logRecords: + - attributes: + - key: log.required + value: + stringValue: foo + - key: log.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + body: + stringValue: This is a log message + spanId: "" + timeUnixNano: "1581452773000000789" + traceId: "" + - attributes: + - key: log.required + value: + stringValue: foo + - key: log.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + body: + stringValue: This is a log message + spanId: "" + timeUnixNano: "1581452773000000789" + traceId: "" + - attributes: + - key: log.required + value: + stringValue: notfoo + - key: beep + value: + doubleValue: 2 + body: + stringValue: This is a log message + spanId: "" + timeUnixNano: "1581452773000000789" + traceId: "" + - body: + stringValue: This is a log message + spanId: "" + timeUnixNano: "1581452773000000789" + traceId: "" + scope: {} diff --git a/connector/sumconnector/testdata/logs/multiple_attributes.yaml b/connector/sumconnector/testdata/logs/multiple_attributes.yaml new file mode 100644 index 000000000000..175bf2d7f55a --- /dev/null +++ b/connector/sumconnector/testdata/logs/multiple_attributes.yaml @@ -0,0 +1,127 @@ +resourceMetrics: + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: bar + scopeMetrics: + - metrics: + - description: Log sum by attributes + name: log.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "4.2" + attributes: + - key: log.required + value: + stringValue: foo + - key: log.optional + value: + stringValue: bar + timeUnixNano: "1678390948397879000" + - asDouble: "0" + attributes: + - key: log.required + value: + stringValue: foo + - key: log.optional + value: + stringValue: notbar + timeUnixNano: "1678390948397879000" + isMonotonic: true + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: notbar + scopeMetrics: + - metrics: + - description: Log sum by attributes + name: log.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "4.2" + attributes: + - key: log.required + value: + stringValue: foo + - key: log.optional + value: + stringValue: bar + timeUnixNano: "1678390948397882000" + - asDouble: "4" + attributes: + - key: log.required + value: + stringValue: foo + - key: log.optional + value: + stringValue: notbar + timeUnixNano: "1678390948397882000" + isMonotonic: true + - resource: + attributes: + - key: resource.required + value: + stringValue: notfoo + scopeMetrics: + - metrics: + - description: Log sum by attributes + name: log.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "4.2" + attributes: + - key: log.required + value: + stringValue: foo + - key: log.optional + value: + stringValue: bar + timeUnixNano: "1678390948397884000" + - asDouble: "4" + attributes: + - key: log.required + value: + stringValue: foo + - key: log.optional + value: + stringValue: notbar + timeUnixNano: "1678390948397884000" + isMonotonic: true + - resource: {} + scopeMetrics: + - metrics: + - description: Log sum by attributes + name: log.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "4.2" + attributes: + - key: log.required + value: + stringValue: foo + - key: log.optional + value: + stringValue: bar + timeUnixNano: "1678390948397886000" + - asDouble: "4" + attributes: + - key: log.required + value: + stringValue: foo + - key: log.optional + value: + stringValue: notbar + timeUnixNano: "1678390948397886000" + isMonotonic: true diff --git a/connector/sumconnector/testdata/logs/multiple_conditions.yaml b/connector/sumconnector/testdata/logs/multiple_conditions.yaml new file mode 100644 index 000000000000..c4725a2bf72b --- /dev/null +++ b/connector/sumconnector/testdata/logs/multiple_conditions.yaml @@ -0,0 +1,63 @@ +resourceMetrics: + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: bar + scopeMetrics: + - metrics: + - description: Sum if ... + name: sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "4.1" + timeUnixNano: "1678390948395853000" + isMonotonic: true + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: notbar + scopeMetrics: + - metrics: + - description: Sum if ... + name: sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "6.1" + timeUnixNano: "1678390948395856000" + isMonotonic: true + - resource: + attributes: + - key: resource.required + value: + stringValue: notfoo + scopeMetrics: + - metrics: + - description: Sum if ... + name: sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "4.1" + timeUnixNano: "1678390948395858000" + isMonotonic: true + - resource: {} + scopeMetrics: + - metrics: + - description: Sum if ... + name: sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "4.1" + timeUnixNano: "1678390948395859000" + isMonotonic: true diff --git a/connector/sumconnector/testdata/logs/multiple_metrics.yaml b/connector/sumconnector/testdata/logs/multiple_metrics.yaml new file mode 100644 index 000000000000..a4f951a7a452 --- /dev/null +++ b/connector/sumconnector/testdata/logs/multiple_metrics.yaml @@ -0,0 +1,79 @@ +resourceMetrics: + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: bar + scopeMetrics: + - metrics: + - description: All logs Sum + name: sum.all + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "4.1" + timeUnixNano: "1678390948396984000" + isMonotonic: true + - description: Sum if ... + name: sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "4.1" + timeUnixNano: "1678390948396984000" + isMonotonic: true + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: notbar + scopeMetrics: + - metrics: + - description: All logs Sum + name: sum.all + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "6.1" + timeUnixNano: "1678390948396988000" + isMonotonic: true + - description: Sum if ... + name: sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "6.1" + timeUnixNano: "1678390948396988000" + isMonotonic: true + - resource: + attributes: + - key: resource.required + value: + stringValue: notfoo + scopeMetrics: + - metrics: + - description: All logs Sum + name: sum.all + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "6.1" + timeUnixNano: "1678390948396990000" + isMonotonic: true + - resource: {} + scopeMetrics: + - metrics: + - description: All logs Sum + name: sum.all + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "6.1" + timeUnixNano: "1678390948396992000" + isMonotonic: true diff --git a/connector/sumconnector/testdata/logs/one_attribute.yaml b/connector/sumconnector/testdata/logs/one_attribute.yaml new file mode 100644 index 000000000000..40aebf83ebda --- /dev/null +++ b/connector/sumconnector/testdata/logs/one_attribute.yaml @@ -0,0 +1,103 @@ +resourceMetrics: + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: bar + scopeMetrics: + - metrics: + - description: Log sum by attribute + name: log.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "2.1" + attributes: + - key: log.required + value: + stringValue: foo + timeUnixNano: "1678390948397419000" + - asDouble: "2" + attributes: + - key: log.required + value: + stringValue: notfoo + timeUnixNano: "1678390948397419000" + isMonotonic: true + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: notbar + scopeMetrics: + - metrics: + - description: Log sum by attribute + name: log.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "4.1" + attributes: + - key: log.required + value: + stringValue: foo + timeUnixNano: "1678390948397423000" + - asDouble: "2" + attributes: + - key: log.required + value: + stringValue: notfoo + timeUnixNano: "1678390948397423000" + isMonotonic: true + - resource: + attributes: + - key: resource.required + value: + stringValue: notfoo + scopeMetrics: + - metrics: + - description: Log sum by attribute + name: log.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "4.1" + attributes: + - key: log.required + value: + stringValue: foo + timeUnixNano: "1678390948397425000" + - asDouble: "2" + attributes: + - key: log.required + value: + stringValue: notfoo + timeUnixNano: "1678390948397425000" + isMonotonic: true + - resource: {} + scopeMetrics: + - metrics: + - description: Log sum by attribute + name: log.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "4.1" + attributes: + - key: log.required + value: + stringValue: foo + timeUnixNano: "1678390948397427000" + - asDouble: "2" + attributes: + - key: log.required + value: + stringValue: notfoo + timeUnixNano: "1678390948397427000" + isMonotonic: true diff --git a/connector/sumconnector/testdata/logs/one_condition.yaml b/connector/sumconnector/testdata/logs/one_condition.yaml new file mode 100644 index 000000000000..dd26fb4d630f --- /dev/null +++ b/connector/sumconnector/testdata/logs/one_condition.yaml @@ -0,0 +1,37 @@ +resourceMetrics: + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: bar + scopeMetrics: + - metrics: + - description: Sum if ... + name: sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "4.1" + timeUnixNano: "1678390948395244000" + isMonotonic: true + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: notbar + scopeMetrics: + - metrics: + - description: Sum if ... + name: sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "6.1" + timeUnixNano: "1678390948395279000" + isMonotonic: true diff --git a/connector/sumconnector/testdata/metrics/condition_and_attribute.yaml b/connector/sumconnector/testdata/metrics/condition_and_attribute.yaml new file mode 100644 index 000000000000..414827d5557f --- /dev/null +++ b/connector/sumconnector/testdata/metrics/condition_and_attribute.yaml @@ -0,0 +1,57 @@ +resourceMetrics: + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: bar + scopeMetrics: + - metrics: + - description: Data point sum by attribute if ... + name: datapoint.sum.if.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "22.5" + attributes: + - key: datapoint.required + value: + stringValue: foo + timeUnixNano: "1678391923823222000" + - asDouble: "6" + attributes: + - key: datapoint.required + value: + stringValue: notfoo + timeUnixNano: "1678391923823222000" + isMonotonic: true + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: notbar + scopeMetrics: + - metrics: + - description: Data point sum by attribute if ... + name: datapoint.sum.if.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "6" + attributes: + - key: datapoint.required + value: + stringValue: notfoo + timeUnixNano: "1678391923823233000" + - asDouble: "24.6" + attributes: + - key: datapoint.required + value: + stringValue: foo + timeUnixNano: "1678391923823233000" + isMonotonic: true diff --git a/connector/sumconnector/testdata/metrics/default_attribute_value.yaml b/connector/sumconnector/testdata/metrics/default_attribute_value.yaml new file mode 100644 index 000000000000..d0ccb3f7b790 --- /dev/null +++ b/connector/sumconnector/testdata/metrics/default_attribute_value.yaml @@ -0,0 +1,163 @@ +resourceMetrics: + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: bar + scopeMetrics: + - metrics: + - description: Data point sum by attribute with default + name: datapoint.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "24" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + timeUnixNano: "1678391923822404000" + - asDouble: "12" + attributes: + - key: datapoint.required + value: + stringValue: notfoo + - key: datapoint.optional + value: + stringValue: other + timeUnixNano: "1678391923822404000" + - asDouble: "21" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + timeUnixNano: "1678391923822404000" + isMonotonic: true + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: notbar + scopeMetrics: + - metrics: + - description: Data point sum by attribute with default + name: datapoint.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "25.2" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + timeUnixNano: "1678391923822416000" + - asDouble: "24" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + timeUnixNano: "1678391923822416000" + - asDouble: "12" + attributes: + - key: datapoint.required + value: + stringValue: notfoo + - key: datapoint.optional + value: + stringValue: other + timeUnixNano: "1678391923822416000" + isMonotonic: true + - resource: + attributes: + - key: resource.required + value: + stringValue: notfoo + scopeMetrics: + - metrics: + - description: Data point sum by attribute with default + name: datapoint.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "25.2" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + timeUnixNano: "1678391923822426000" + - asDouble: "24" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + timeUnixNano: "1678391923822426000" + - asDouble: "12" + attributes: + - key: datapoint.required + value: + stringValue: notfoo + - key: datapoint.optional + value: + stringValue: other + timeUnixNano: "1678391923822426000" + isMonotonic: true + - resource: {} + scopeMetrics: + - metrics: + - description: Data point sum by attribute with default + name: datapoint.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "24" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + timeUnixNano: "1678391923822435000" + - asDouble: "12" + attributes: + - key: datapoint.required + value: + stringValue: notfoo + - key: datapoint.optional + value: + stringValue: other + timeUnixNano: "1678391923822435000" + - asDouble: "25.2" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + timeUnixNano: "1678391923822435000" + isMonotonic: true diff --git a/connector/sumconnector/testdata/metrics/input.yaml b/connector/sumconnector/testdata/metrics/input.yaml new file mode 100644 index 000000000000..8a04ab206c3f --- /dev/null +++ b/connector/sumconnector/testdata/metrics/input.yaml @@ -0,0 +1,1390 @@ +resourceMetrics: + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: bar + scopeMetrics: + - metrics: + - gauge: + dataPoints: + - asInt: "123" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + - key: beep + value: + stringValue: "astring" + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asInt: "456" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asInt: "789" + attributes: + - key: datapoint.required + value: + stringValue: notfoo + - key: beep + value: + intValue: 1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asInt: "0" + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + name: gauge-int + unit: "1" + - gauge: + dataPoints: + - asDouble: 1.23 + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asDouble: 4.56 + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asDouble: 7.89 + attributes: + - key: datapoint.required + value: + stringValue: notfoo + - key: beep + value: + intValue: 1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asDouble: 0 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + name: gauge-double + unit: "1" + - name: counter-int + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "123" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asInt: "456" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asInt: "789" + attributes: + - key: datapoint.required + value: + stringValue: notfoo + - key: beep + value: + intValue: 1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asInt: "0" + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + isMonotonic: true + unit: "1" + - name: counter-double + sum: + aggregationTemporality: 2 + dataPoints: + - asDouble: 1.23 + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asDouble: 4.56 + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asDouble: 4.56 + attributes: + - key: datapoint.required + value: + stringValue: notfoo + - key: beep + value: + intValue: 1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asDouble: 0 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + isMonotonic: true + unit: "1" + - histogram: + aggregationTemporality: 2 + dataPoints: + - attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + count: "1" + startTimeUnixNano: "1581452772000000321" + sum: 15 + timeUnixNano: "1581452773000000789" + - attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + count: "2" + startTimeUnixNano: "1581452772000000321" + sum: 30 + timeUnixNano: "1581452773000000789" + - attributes: + - key: datapoint.required + value: + stringValue: notfoo + - key: beep + value: + intValue: 1 + count: "3" + startTimeUnixNano: "1581452772000000321" + sum: 45 + timeUnixNano: "1581452773000000789" + - startTimeUnixNano: "1581452772000000321" + sum: 0 + timeUnixNano: "1581452773000000789" + name: double-histogram + unit: "1" + - name: double-summary + summary: + dataPoints: + - attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + count: "1" + startTimeUnixNano: "1581452772000000321" + sum: 15 + timeUnixNano: "1581452773000000789" + - attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + count: "2" + startTimeUnixNano: "1581452772000000321" + sum: 30 + timeUnixNano: "1581452773000000789" + - attributes: + - key: datapoint.required + value: + stringValue: notfoo + - key: beep + value: + intValue: 1 + count: "3" + startTimeUnixNano: "1581452772000000321" + sum: 45 + timeUnixNano: "1581452773000000789" + - startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + unit: "1" + scope: {} + + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: notbar + scopeMetrics: + - metrics: + - gauge: + dataPoints: + - asInt: "123" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asInt: "456" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asInt: "789" + attributes: + - key: datapoint.required + value: + stringValue: notfoo + - key: beep + value: + intValue: 1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asInt: "0" + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + name: gauge-int + unit: "1" + - gauge: + dataPoints: + - asDouble: 1.23 + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asDouble: 4.56 + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asDouble: 7.89 + attributes: + - key: datapoint.required + value: + stringValue: notfoo + - key: beep + value: + intValue: 1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asDouble: 0 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + name: gauge-double + unit: "1" + - name: counter-int + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "123" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asInt: "456" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asInt: "789" + attributes: + - key: datapoint.required + value: + stringValue: notfoo + - key: beep + value: + intValue: 1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asInt: "0" + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + isMonotonic: true + unit: "1" + - name: counter-double + sum: + aggregationTemporality: 2 + dataPoints: + - asDouble: 1.23 + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asDouble: 4.56 + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asDouble: 4.56 + attributes: + - key: datapoint.required + value: + stringValue: notfoo + - key: beep + value: + intValue: 1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asDouble: 0 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + isMonotonic: true + unit: "1" + - histogram: + aggregationTemporality: 2 + dataPoints: + - attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + count: "1" + startTimeUnixNano: "1581452772000000321" + sum: 15 + timeUnixNano: "1581452773000000789" + - attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + count: "2" + startTimeUnixNano: "1581452772000000321" + sum: 30 + timeUnixNano: "1581452773000000789" + - attributes: + - key: datapoint.required + value: + stringValue: notfoo + - key: beep + value: + intValue: 1 + count: "3" + startTimeUnixNano: "1581452772000000321" + sum: 45 + timeUnixNano: "1581452773000000789" + - startTimeUnixNano: "1581452772000000321" + sum: 0 + timeUnixNano: "1581452773000000789" + name: double-histogram + unit: "1" + - name: double-summary + summary: + dataPoints: + - attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + count: "1" + startTimeUnixNano: "1581452772000000321" + sum: 15 + timeUnixNano: "1581452773000000789" + - attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + count: "2" + startTimeUnixNano: "1581452772000000321" + sum: 30 + timeUnixNano: "1581452773000000789" + - attributes: + - key: datapoint.required + value: + stringValue: notfoo + - key: beep + value: + intValue: 1 + count: "3" + startTimeUnixNano: "1581452772000000321" + sum: 45 + timeUnixNano: "1581452773000000789" + - startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + unit: "1" + scope: {} + + - resource: + attributes: + - key: resource.int + value: + intValue: 1 + - key: resource.optional_int + value: + intValue: 2 + scopeMetrics: + - metrics: + - gauge: + dataPoints: + - asInt: "123" + attributes: + - key: datapoint.int + value: + intValue: 1 + - key: datapoint.optional_int + value: + intValue: 2 + - key: beep + value: + doubleValue: 2.1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asInt: "456" + attributes: + - key: datapoint.int + value: + intValue: 1 + - key: datapoint.optional_int + value: + intValue: 4 + - key: beep + value: + doubleValue: 2 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asInt: "789" + attributes: + - key: datapoint.int + value: + intValue: 10 + - key: beep + value: + intValue: 1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asInt: "0" + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + name: gauge-int + unit: "1" + - gauge: + dataPoints: + - asDouble: 1.23 + attributes: + - key: datapoint.int + value: + intValue: 1 + - key: datapoint.optional_int + value: + intValue: 2 + - key: beep + value: + doubleValue: 2.1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asDouble: 4.56 + attributes: + - key: datapoint.int + value: + intValue: 1 + - key: datapoint.optional_int + value: + intValue: 4 + - key: beep + value: + doubleValue: 2 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asDouble: 7.89 + attributes: + - key: datapoint.int + value: + intValue: 10 + - key: beep + value: + intValue: 1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asDouble: 0 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + name: gauge-double + unit: "1" + - name: counter-int + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "123" + attributes: + - key: datapoint.int + value: + intValue: 1 + - key: datapoint.optional_int + value: + intValue: 2 + - key: beep + value: + doubleValue: 2.1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asInt: "456" + attributes: + - key: datapoint.int + value: + intValue: 1 + - key: datapoint.optional_int + value: + intValue: 4 + - key: beep + value: + doubleValue: 2 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asInt: "789" + attributes: + - key: datapoint.int + value: + intValue: 10 + - key: beep + value: + intValue: 1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asInt: "0" + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + isMonotonic: true + unit: "1" + - name: counter-double + sum: + aggregationTemporality: 2 + dataPoints: + - asDouble: 1.23 + attributes: + - key: datapoint.int + value: + intValue: 1 + - key: datapoint.optional_int + value: + intValue: 2 + - key: beep + value: + doubleValue: 2.1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asDouble: 4.56 + attributes: + - key: datapoint.int + value: + intValue: 1 + - key: datapoint.optional_int + value: + intValue: 4 + - key: beep + value: + doubleValue: 2 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asDouble: 4.56 + attributes: + - key: datapoint.int + value: + intValue: 10 + - key: beep + value: + intValue: 1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asDouble: 0 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + isMonotonic: true + unit: "1" + - histogram: + aggregationTemporality: 2 + dataPoints: + - attributes: + - key: datapoint.int + value: + intValue: 1 + - key: datapoint.optional_int + value: + intValue: 2 + - key: beep + value: + doubleValue: 2.1 + count: "1" + startTimeUnixNano: "1581452772000000321" + sum: 15 + timeUnixNano: "1581452773000000789" + - attributes: + - key: datapoint.int + value: + intValue: 1 + - key: datapoint.optional_int + value: + intValue: 4 + - key: beep + value: + doubleValue: 2 + count: "2" + startTimeUnixNano: "1581452772000000321" + sum: 30 + timeUnixNano: "1581452773000000789" + - attributes: + - key: datapoint.int + value: + intValue: 10 + - key: beep + value: + intValue: 1 + count: "3" + startTimeUnixNano: "1581452772000000321" + sum: 45 + timeUnixNano: "1581452773000000789" + - startTimeUnixNano: "1581452772000000321" + sum: 0 + timeUnixNano: "1581452773000000789" + name: double-histogram + unit: "1" + - name: double-summary + summary: + dataPoints: + - attributes: + - key: datapoint.int + value: + intValue: 1 + - key: datapoint.optional_int + value: + intValue: 2 + - key: beep + value: + doubleValue: 2.1 + count: "1" + startTimeUnixNano: "1581452772000000321" + sum: 15 + timeUnixNano: "1581452773000000789" + - attributes: + - key: datapoint.int + value: + intValue: 10 + - key: datapoint.optional_int + value: + intValue: 4 + - key: beep + value: + doubleValue: 2 + count: "2" + startTimeUnixNano: "1581452772000000321" + sum: 30 + timeUnixNano: "1581452773000000789" + - attributes: + - key: datapoint.int + value: + intValue: 10 + - key: beep + value: + intValue: 1 + count: "3" + startTimeUnixNano: "1581452772000000321" + sum: 45 + timeUnixNano: "1581452773000000789" + - startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + unit: "1" + scope: {} + + - resource: + attributes: + - key: resource.required + value: + stringValue: notfoo + scopeMetrics: + - metrics: + - gauge: + dataPoints: + - asInt: "123" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asInt: "456" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asInt: "789" + attributes: + - key: datapoint.required + value: + stringValue: notfoo + - key: beep + value: + intValue: 1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asInt: "0" + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + name: gauge-int + unit: "1" + - gauge: + dataPoints: + - asDouble: 1.23 + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asDouble: 4.56 + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asDouble: 7.89 + attributes: + - key: datapoint.required + value: + stringValue: notfoo + - key: beep + value: + intValue: 1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asDouble: 0 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + name: gauge-double + unit: "1" + - name: counter-int + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "123" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asInt: "456" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asInt: "789" + attributes: + - key: datapoint.required + value: + stringValue: notfoo + - key: beep + value: + intValue: 1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asInt: "0" + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + isMonotonic: true + unit: "1" + - name: counter-double + sum: + aggregationTemporality: 2 + dataPoints: + - asDouble: 1.23 + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asDouble: 4.56 + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asDouble: 4.56 + attributes: + - key: datapoint.required + value: + stringValue: notfoo + - key: beep + value: + intValue: 1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asDouble: 0 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + isMonotonic: true + unit: "1" + - histogram: + aggregationTemporality: 2 + dataPoints: + - attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + count: "1" + startTimeUnixNano: "1581452772000000321" + sum: 15 + timeUnixNano: "1581452773000000789" + - attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + count: "2" + startTimeUnixNano: "1581452772000000321" + sum: 30 + timeUnixNano: "1581452773000000789" + - attributes: + - key: datapoint.required + value: + stringValue: notfoo + - key: beep + value: + intValue: 1 + count: "3" + startTimeUnixNano: "1581452772000000321" + sum: 45 + timeUnixNano: "1581452773000000789" + - startTimeUnixNano: "1581452772000000321" + sum: 0 + timeUnixNano: "1581452773000000789" + name: double-histogram + unit: "1" + - name: double-summary + summary: + dataPoints: + - attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + count: "1" + startTimeUnixNano: "1581452772000000321" + sum: 15 + timeUnixNano: "1581452773000000789" + - attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + count: "2" + startTimeUnixNano: "1581452772000000321" + sum: 30 + timeUnixNano: "1581452773000000789" + - attributes: + - key: datapoint.required + value: + stringValue: notfoo + - key: beep + value: + intValue: 1 + count: "3" + startTimeUnixNano: "1581452772000000321" + sum: 45 + timeUnixNano: "1581452773000000789" + - startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + unit: "1" + scope: {} + + - resource: {} + scopeMetrics: + - metrics: + - gauge: + dataPoints: + - asInt: "123" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asInt: "456" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asInt: "789" + attributes: + - key: datapoint.required + value: + stringValue: notfoo + - key: beep + value: + intValue: 1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asInt: "0" + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + name: gauge-int + unit: "1" + - gauge: + dataPoints: + - asDouble: 1.23 + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asDouble: 4.56 + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asDouble: 7.89 + attributes: + - key: datapoint.required + value: + stringValue: notfoo + - key: beep + value: + intValue: 1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asDouble: 0 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + name: gauge-double + unit: "1" + - name: counter-int + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "123" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asInt: "456" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asInt: "789" + attributes: + - key: datapoint.required + value: + stringValue: notfoo + - key: beep + value: + intValue: 1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asInt: "0" + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + isMonotonic: true + unit: "1" + - name: counter-double + sum: + aggregationTemporality: 2 + dataPoints: + - asDouble: 1.23 + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asDouble: 4.56 + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asDouble: 4.56 + attributes: + - key: datapoint.required + value: + stringValue: notfoo + - key: beep + value: + intValue: 1 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + - asDouble: 0 + startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + isMonotonic: true + unit: "1" + - histogram: + aggregationTemporality: 2 + dataPoints: + - attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + count: "1" + startTimeUnixNano: "1581452772000000321" + sum: 15 + timeUnixNano: "1581452773000000789" + - attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + count: "2" + startTimeUnixNano: "1581452772000000321" + sum: 30 + timeUnixNano: "1581452773000000789" + - attributes: + - key: datapoint.required + value: + stringValue: notfoo + - key: beep + value: + intValue: 1 + count: "3" + startTimeUnixNano: "1581452772000000321" + sum: 45 + timeUnixNano: "1581452773000000789" + - startTimeUnixNano: "1581452772000000321" + sum: 0 + timeUnixNano: "1581452773000000789" + name: double-histogram + unit: "1" + - name: double-summary + summary: + dataPoints: + - attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + count: "1" + startTimeUnixNano: "1581452772000000321" + sum: 15 + timeUnixNano: "1581452773000000789" + - attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + count: "2" + startTimeUnixNano: "1581452772000000321" + sum: 30 + timeUnixNano: "1581452773000000789" + - attributes: + - key: datapoint.required + value: + stringValue: notfoo + - key: beep + value: + intValue: 1 + count: "3" + startTimeUnixNano: "1581452772000000321" + sum: 45 + timeUnixNano: "1581452773000000789" + - startTimeUnixNano: "1581452772000000321" + timeUnixNano: "1581452773000000789" + unit: "1" + scope: {} diff --git a/connector/sumconnector/testdata/metrics/multiple_attributes.yaml b/connector/sumconnector/testdata/metrics/multiple_attributes.yaml new file mode 100644 index 000000000000..5d598f2add3e --- /dev/null +++ b/connector/sumconnector/testdata/metrics/multiple_attributes.yaml @@ -0,0 +1,127 @@ +resourceMetrics: + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: bar + scopeMetrics: + - metrics: + - description: Data point sum by attributes + name: datapoint.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "21" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + timeUnixNano: "1678391923821783000" + - asDouble: "24" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + timeUnixNano: "1678391923821783000" + isMonotonic: true + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: notbar + scopeMetrics: + - metrics: + - description: Data point sum by attributes + name: datapoint.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "25.2" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + timeUnixNano: "1678391923821792000" + - asDouble: "24" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + timeUnixNano: "1678391923821792000" + isMonotonic: true + - resource: + attributes: + - key: resource.required + value: + stringValue: notfoo + scopeMetrics: + - metrics: + - description: Data point sum by attributes + name: datapoint.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "25.2" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + timeUnixNano: "1678391923821800000" + - asDouble: "24" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + timeUnixNano: "1678391923821800000" + isMonotonic: true + - resource: {} + scopeMetrics: + - metrics: + - description: Data point sum by attributes + name: datapoint.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "25.2" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: bar + timeUnixNano: "1678391923821807000" + - asDouble: "24" + attributes: + - key: datapoint.required + value: + stringValue: foo + - key: datapoint.optional + value: + stringValue: notbar + timeUnixNano: "1678391923821807000" + isMonotonic: true diff --git a/connector/sumconnector/testdata/metrics/multiple_conditions.yaml b/connector/sumconnector/testdata/metrics/multiple_conditions.yaml new file mode 100644 index 000000000000..b95fee6578a9 --- /dev/null +++ b/connector/sumconnector/testdata/metrics/multiple_conditions.yaml @@ -0,0 +1,63 @@ +resourceMetrics: + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: bar + scopeMetrics: + - metrics: + - description: Data point sum if ... + name: datapoint.sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "28.5" + timeUnixNano: "1678391923819487000" + isMonotonic: true + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: notbar + scopeMetrics: + - metrics: + - description: Data point sum if ... + name: datapoint.sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "30.6" + timeUnixNano: "1678391923819499000" + isMonotonic: true + - resource: + attributes: + - key: resource.required + value: + stringValue: notfoo + scopeMetrics: + - metrics: + - description: Data point sum if ... + name: datapoint.sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "24.6" + timeUnixNano: "1678391923819510000" + isMonotonic: true + - resource: {} + scopeMetrics: + - metrics: + - description: Data point sum if ... + name: datapoint.sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "24.6" + timeUnixNano: "1678391923819529000" + isMonotonic: true diff --git a/connector/sumconnector/testdata/metrics/multiple_metrics.yaml b/connector/sumconnector/testdata/metrics/multiple_metrics.yaml new file mode 100644 index 000000000000..47982780fb20 --- /dev/null +++ b/connector/sumconnector/testdata/metrics/multiple_metrics.yaml @@ -0,0 +1,113 @@ +resourceMetrics: + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: bar + scopeMetrics: + - metrics: + - description: All data points sum + name: datapoint.sum.all + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "28.5" + timeUnixNano: "1678391923820453000" + isMonotonic: true + - description: Data point sum if ... + name: datapoint.sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "28.5" + timeUnixNano: "1678391923820453000" + isMonotonic: true + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: notbar + scopeMetrics: + - metrics: + - description: All data points sum + name: datapoint.sum.all + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "30.6" + timeUnixNano: "1678391923820468000" + isMonotonic: true + - description: Data point sum if ... + name: datapoint.sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "30.6" + timeUnixNano: "1678391923820468000" + isMonotonic: true + - resource: + attributes: + - key: resource.required + value: + stringValue: notfoo + scopeMetrics: + - metrics: + - description: All data points sum + name: datapoint.sum.all + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "30.6" + timeUnixNano: "1678391923820480000" + isMonotonic: true + - description: Data point sum if ... + name: datapoint.sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "24.6" + timeUnixNano: "1678391923820480000" + isMonotonic: true + - resource: {} + scopeMetrics: + - metrics: + - description: All data points sum + name: datapoint.sum.all + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "30.6" + timeUnixNano: "1678391923820491000" + isMonotonic: true + - description: Data point sum if ... + name: datapoint.sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "24.6" + timeUnixNano: "1678391923820491000" + isMonotonic: true + - resource: + attributes: + - key: resource.int + value: + intValue: 1 + - key: resource.optional_int + value: + intValue: 2 + scopeMetrics: + - metrics: + - description: All data points sum + name: datapoint.sum.all + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "30.6" + timeUnixNano: "1678391923820480000" + isMonotonic: true diff --git a/connector/sumconnector/testdata/metrics/one_attribute.yaml b/connector/sumconnector/testdata/metrics/one_attribute.yaml new file mode 100644 index 000000000000..2dac193abaf2 --- /dev/null +++ b/connector/sumconnector/testdata/metrics/one_attribute.yaml @@ -0,0 +1,103 @@ +resourceMetrics: + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: bar + scopeMetrics: + - metrics: + - description: Data point sum by attribute + name: datapoint.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "22.5" + attributes: + - key: datapoint.required + value: + stringValue: foo + timeUnixNano: "1678391923821179000" + - asDouble: "6" + attributes: + - key: datapoint.required + value: + stringValue: notfoo + timeUnixNano: "1678391923821179000" + isMonotonic: true + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: notbar + scopeMetrics: + - metrics: + - description: Data point sum by attribute + name: datapoint.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "24.6" + attributes: + - key: datapoint.required + value: + stringValue: foo + timeUnixNano: "1678391923821189000" + - asDouble: "6" + attributes: + - key: datapoint.required + value: + stringValue: notfoo + timeUnixNano: "1678391923821189000" + isMonotonic: true + - resource: + attributes: + - key: resource.required + value: + stringValue: notfoo + scopeMetrics: + - metrics: + - description: Data point sum by attribute + name: datapoint.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "24.6" + attributes: + - key: datapoint.required + value: + stringValue: foo + timeUnixNano: "1678391923821196000" + - asDouble: "6" + attributes: + - key: datapoint.required + value: + stringValue: notfoo + timeUnixNano: "1678391923821196000" + isMonotonic: true + - resource: {} + scopeMetrics: + - metrics: + - description: Data point sum by attribute + name: datapoint.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "24.6" + attributes: + - key: datapoint.required + value: + stringValue: foo + timeUnixNano: "1678391923821203000" + - asDouble: "6" + attributes: + - key: datapoint.required + value: + stringValue: notfoo + timeUnixNano: "1678391923821203000" + isMonotonic: true diff --git a/connector/sumconnector/testdata/metrics/one_condition.yaml b/connector/sumconnector/testdata/metrics/one_condition.yaml new file mode 100644 index 000000000000..c4953f43827a --- /dev/null +++ b/connector/sumconnector/testdata/metrics/one_condition.yaml @@ -0,0 +1,37 @@ +resourceMetrics: + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: bar + scopeMetrics: + - metrics: + - description: Data point sum if ... + name: datapoint.sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "28.5" + timeUnixNano: "1678391923818482000" + isMonotonic: true + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: notbar + scopeMetrics: + - metrics: + - description: Data point sum if ... + name: datapoint.sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "30.6" + timeUnixNano: "1678391923818549000" + isMonotonic: true diff --git a/connector/sumconnector/testdata/traces/condition_and_attribute.yaml b/connector/sumconnector/testdata/traces/condition_and_attribute.yaml new file mode 100644 index 000000000000..1c26091ef995 --- /dev/null +++ b/connector/sumconnector/testdata/traces/condition_and_attribute.yaml @@ -0,0 +1,95 @@ +resourceMetrics: + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: bar + scopeMetrics: + - metrics: + - description: Span sum if ... + name: span.sum.if.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "5.1" + attributes: + - key: span.required + value: + stringValue: foo + timeUnixNano: "1678392127929005000" + - asDouble: "3.1" + attributes: + - key: span.required + value: + stringValue: notfoo + timeUnixNano: "1678392127929005000" + isMonotonic: true + - description: Span event sum by attribute if ... + name: spanevent.sum.if.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "15.6" + attributes: + - key: event.required + value: + stringValue: foo + timeUnixNano: "1678392127929006000" + - asDouble: "8.3" + attributes: + - key: event.required + value: + stringValue: notfoo + timeUnixNano: "1678392127929006000" + isMonotonic: true + + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: notbar + scopeMetrics: + - metrics: + - description: Span sum if ... + name: span.sum.if.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "5.1" + attributes: + - key: span.required + value: + stringValue: foo + timeUnixNano: "1678392127929018000" + - asDouble: "3.1" + attributes: + - key: span.required + value: + stringValue: notfoo + timeUnixNano: "1678392127929018000" + isMonotonic: true + - description: Span event sum by attribute if ... + name: spanevent.sum.if.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "15.2" + attributes: + - key: event.required + value: + stringValue: foo + timeUnixNano: "1678392127929018000" + - asDouble: "8.1" + attributes: + - key: event.required + value: + stringValue: notfoo + timeUnixNano: "1678392127929018000" + isMonotonic: true + diff --git a/connector/sumconnector/testdata/traces/input.yaml b/connector/sumconnector/testdata/traces/input.yaml new file mode 100644 index 000000000000..b6d74c2a11ac --- /dev/null +++ b/connector/sumconnector/testdata/traces/input.yaml @@ -0,0 +1,852 @@ +resourceSpans: + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: bar + scopeSpans: + - scope: {} + spans: + - name: span-with-attrs-foo-bar + parentSpanId: "" + spanId: "" + startTimeUnixNano: "1581452772000000321" + status: {} + traceId: "" + attributes: + - key: span.required + value: + stringValue: foo + - key: span.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + endTimeUnixNano: "1581452773000000789" + events: + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + name: event-with-attrs-foo-bar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2.1 + name: event-with-attrs-foo-notbar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: notfoo + - key: beep + value: + doubleValue: 2.1 + name: event-with-attr-notfoo + timeUnixNano: "1581452773000000123" + - name: event-with-no-attrs + timeUnixNano: "1581452773000000123" + + - name: span-with-attrs-foo-notbar + parentSpanId: "" + spanId: "" + startTimeUnixNano: "1581452772000000321" + status: {} + traceId: "" + attributes: + - key: span.required + value: + stringValue: foo + - key: span.optional + value: + stringValue: notbar + - key: beep + value: + intValue: 3 + endTimeUnixNano: "1581452773000000789" + events: + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: bar + - key: beep + value: + intValue: 2 + name: event-with-attrs-foo-bar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: notbar + - key: beep + value: + stringValue: "3" + name: event-with-attrs-foo-notbar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: notfoo + - key: beep + value: + stringValue: "2" + name: event-with-attr-notfoo + timeUnixNano: "1581452773000000123" + - name: event-with-no-attrs + timeUnixNano: "1581452773000000123" + + - name: span-with-attr-notfoo + parentSpanId: "" + spanId: "" + startTimeUnixNano: "1581452772000000321" + status: {} + traceId: "" + attributes: + - key: span.required + value: + stringValue: notfoo + - key: beep + value: + doubleValue: 3.1 + endTimeUnixNano: "1581452773000000789" + events: + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + name: event-with-attrs-foo-bar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2.1 + name: event-with-attrs-foo-notbar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: notfoo + - key: beep + value: + doubleValue: 2.1 + name: event-with-attr-notfoo + timeUnixNano: "1581452773000000123" + - name: event-with-no-attrs + timeUnixNano: "1581452773000000123" + + - name: span-with-no-attrs + parentSpanId: "" + spanId: "" + startTimeUnixNano: "1581452772000000321" + status: {} + traceId: "" + attributes: + endTimeUnixNano: "1581452773000000789" + events: + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 1.1 + name: event-with-attrs-foo-bar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 1.1 + name: event-with-attrs-foo-notbar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: notfoo + - key: beep + value: + doubleValue: 2.1 + name: event-with-attr-notfoo + timeUnixNano: "1581452773000000123" + - name: event-with-no-attrs + timeUnixNano: "1581452773000000123" + + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: notbar + scopeSpans: + - scope: {} + spans: + - name: span-with-attrs-foo-bar + parentSpanId: "" + spanId: "" + startTimeUnixNano: "1581452772000000321" + status: {} + traceId: "" + attributes: + - key: span.required + value: + stringValue: foo + - key: span.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + endTimeUnixNano: "1581452773000000789" + events: + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + name: event-with-attrs-foo-bar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2.1 + name: event-with-attrs-foo-notbar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: notfoo + - key: beep + value: + doubleValue: 2.1 + name: event-with-attr-notfoo + timeUnixNano: "1581452773000000123" + - name: event-with-no-attrs + timeUnixNano: "1581452773000000123" + + - name: span-with-attrs-foo-notbar + parentSpanId: "" + spanId: "" + startTimeUnixNano: "1581452772000000321" + status: {} + traceId: "" + attributes: + - key: span.required + value: + stringValue: foo + - key: span.optional + value: + stringValue: notbar + - key: beep + value: + intValue: 3 + endTimeUnixNano: "1581452773000000789" + events: + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: bar + - key: beep + value: + intValue: 2 + name: event-with-attrs-foo-bar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: notbar + - key: beep + value: + stringValue: "3" + name: event-with-attrs-foo-notbar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: notfoo + - key: beep + value: + doubleValue: 2 + name: event-with-attr-notfoo + timeUnixNano: "1581452773000000123" + - name: event-with-no-attrs + timeUnixNano: "1581452773000000123" + + - name: span-with-attr-notfoo + parentSpanId: "" + spanId: "" + startTimeUnixNano: "1581452772000000321" + status: {} + traceId: "" + attributes: + - key: span.required + value: + stringValue: notfoo + - key: beep + value: + doubleValue: 3.1 + endTimeUnixNano: "1581452773000000789" + events: + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2 + name: event-with-attrs-foo-bar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + name: event-with-attrs-foo-notbar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: notfoo + - key: beep + value: + doubleValue: 2 + name: event-with-attr-notfoo + timeUnixNano: "1581452773000000123" + - name: event-with-no-attrs + timeUnixNano: "1581452773000000123" + + - name: span-with-no-attrs + parentSpanId: "" + spanId: "" + startTimeUnixNano: "1581452772000000321" + status: {} + traceId: "" + attributes: + endTimeUnixNano: "1581452773000000789" + events: + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 1 + name: event-with-attrs-foo-bar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 1 + name: event-with-attrs-foo-notbar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: notfoo + - key: beep + value: + doubleValue: 2 + name: event-with-attr-notfoo + timeUnixNano: "1581452773000000123" + - name: event-with-no-attrs + timeUnixNano: "1581452773000000123" + + - resource: + attributes: + - key: resource.required + value: + stringValue: notfoo + scopeSpans: + - scope: {} + spans: + - name: span-with-attrs-foo-bar + parentSpanId: "" + spanId: "" + startTimeUnixNano: "1581452772000000321" + status: {} + traceId: "" + attributes: + - key: span.required + value: + stringValue: foo + - key: span.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + endTimeUnixNano: "1581452773000000789" + events: + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2 + name: event-with-attrs-foo-bar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + name: event-with-attrs-foo-notbar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: notfoo + - key: beep + value: + doubleValue: 2 + name: event-with-attr-notfoo + timeUnixNano: "1581452773000000123" + - name: event-with-no-attrs + timeUnixNano: "1581452773000000123" + + - name: span-with-attrs-foo-notbar + parentSpanId: "" + spanId: "" + startTimeUnixNano: "1581452772000000321" + status: {} + traceId: "" + attributes: + - key: span.required + value: + stringValue: foo + - key: span.optional + value: + stringValue: notbar + - key: beep + value: + intValue: 3 + endTimeUnixNano: "1581452773000000789" + events: + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: bar + - key: beep + value: + intValue: 2 + name: event-with-attrs-foo-bar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: notbar + - key: beep + value: + stringValue: "3" + name: event-with-attrs-foo-notbar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: notfoo + - key: beep + value: + doubleValue: 2 + name: event-with-attr-notfoo + timeUnixNano: "1581452773000000123" + - name: event-with-no-attrs + timeUnixNano: "1581452773000000123" + + - name: span-with-attr-notfoo + parentSpanId: "" + spanId: "" + startTimeUnixNano: "1581452772000000321" + status: {} + traceId: "" + attributes: + - key: span.required + value: + stringValue: notfoo + - key: beep + value: + doubleValue: 3.1 + endTimeUnixNano: "1581452773000000789" + events: + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2 + name: event-with-attrs-foo-bar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + name: event-with-attrs-foo-notbar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: notfoo + - key: beep + value: + doubleValue: 2 + name: event-with-attr-notfoo + timeUnixNano: "1581452773000000123" + - name: event-with-no-attrs + timeUnixNano: "1581452773000000123" + + - name: span-with-no-attrs + parentSpanId: "" + spanId: "" + startTimeUnixNano: "1581452772000000321" + status: {} + traceId: "" + attributes: + endTimeUnixNano: "1581452773000000789" + events: + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 1 + name: event-with-attrs-foo-bar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 1 + name: event-with-attrs-foo-notbar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: notfoo + - key: beep + value: + doubleValue: 2 + name: event-with-attr-notfoo + timeUnixNano: "1581452773000000123" + - name: event-with-no-attrs + timeUnixNano: "1581452773000000123" + + - resource: {} + scopeSpans: + - scope: {} + spans: + - name: span-with-attrs-foo-bar + parentSpanId: "" + spanId: "" + startTimeUnixNano: "1581452772000000321" + status: {} + traceId: "" + attributes: + - key: span.required + value: + stringValue: foo + - key: span.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2.1 + endTimeUnixNano: "1581452773000000789" + events: + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2 + name: event-with-attrs-foo-bar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + name: event-with-attrs-foo-notbar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: notfoo + - key: beep + value: + doubleValue: 2 + name: event-with-attr-notfoo + timeUnixNano: "1581452773000000123" + - name: event-with-no-attrs + timeUnixNano: "1581452773000000123" + + - name: span-with-attrs-foo-notbar + parentSpanId: "" + spanId: "" + startTimeUnixNano: "1581452772000000321" + status: {} + traceId: "" + attributes: + - key: span.required + value: + stringValue: foo + - key: span.optional + value: + stringValue: notbar + - key: beep + value: + intValue: 3 + endTimeUnixNano: "1581452773000000789" + events: + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: bar + - key: beep + value: + intValue: 2 + name: event-with-attrs-foo-bar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: notbar + - key: beep + value: + stringValue: "3" + name: event-with-attrs-foo-notbar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: notfoo + - key: beep + value: + doubleValue: 2 + name: event-with-attr-notfoo + timeUnixNano: "1581452773000000123" + - name: event-with-no-attrs + timeUnixNano: "1581452773000000123" + + - name: span-with-attr-notfoo + parentSpanId: "" + spanId: "" + startTimeUnixNano: "1581452772000000321" + status: {} + traceId: "" + attributes: + - key: span.required + value: + stringValue: notfoo + - key: beep + value: + doubleValue: 3.1 + endTimeUnixNano: "1581452773000000789" + events: + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 2 + name: event-with-attrs-foo-bar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 2 + name: event-with-attrs-foo-notbar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: notfoo + - key: beep + value: + doubleValue: 2 + name: event-with-attr-notfoo + timeUnixNano: "1581452773000000123" + - name: event-with-no-attrs + timeUnixNano: "1581452773000000123" + + - name: span-with-no-attrs + parentSpanId: "" + spanId: "" + startTimeUnixNano: "1581452772000000321" + status: {} + traceId: "" + attributes: + endTimeUnixNano: "1581452773000000789" + events: + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: bar + - key: beep + value: + doubleValue: 1 + name: event-with-attrs-foo-bar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: notbar + - key: beep + value: + doubleValue: 1 + name: event-with-attrs-foo-notbar + timeUnixNano: "1581452773000000123" + - attributes: + - key: event.required + value: + stringValue: notfoo + - key: beep + value: + doubleValue: 2 + name: event-with-attr-notfoo + timeUnixNano: "1581452773000000123" + - name: event-with-no-attrs + timeUnixNano: "1581452773000000123" + + diff --git a/connector/sumconnector/testdata/traces/multiple_attributes.yaml b/connector/sumconnector/testdata/traces/multiple_attributes.yaml new file mode 100644 index 000000000000..7407a91f2eb5 --- /dev/null +++ b/connector/sumconnector/testdata/traces/multiple_attributes.yaml @@ -0,0 +1,227 @@ +resourceMetrics: + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: bar + scopeMetrics: + - metrics: + - description: Span sum by attributes + name: span.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "6" + attributes: + - key: span.required + value: + stringValue: foo + - key: span.optional + value: + stringValue: notbar + timeUnixNano: "1678392127926637000" + - asDouble: "4.2" + attributes: + - key: span.required + value: + stringValue: foo + - key: span.optional + value: + stringValue: bar + timeUnixNano: "1678392127926637000" + isMonotonic: true + - description: Span event sum by attributes + name: spanevent.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "14.6" + attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: bar + timeUnixNano: "1678392127926637000" + - asDouble: "16.6" + attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: notbar + timeUnixNano: "1678392127926637000" + isMonotonic: true + + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: notbar + scopeMetrics: + - metrics: + - description: Span sum by attributes + name: span.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "4.2" + attributes: + - key: span.required + value: + stringValue: foo + - key: span.optional + value: + stringValue: bar + timeUnixNano: "1678392127926647000" + - asDouble: "6" + attributes: + - key: span.required + value: + stringValue: foo + - key: span.optional + value: + stringValue: notbar + timeUnixNano: "1678392127926647000" + isMonotonic: true + - description: Span event sum by attributes + name: spanevent.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "14.2" + attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: bar + timeUnixNano: "1678392127926647000" + - asDouble: "16.2" + attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: notbar + timeUnixNano: "1678392127926647000" + isMonotonic: true + + - resource: + attributes: + - key: resource.required + value: + stringValue: notfoo + scopeMetrics: + - metrics: + - description: Span sum by attributes + name: span.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "4.2" + attributes: + - key: span.required + value: + stringValue: foo + - key: span.optional + value: + stringValue: bar + timeUnixNano: "1678392127926654000" + - asDouble: "6" + attributes: + - key: span.required + value: + stringValue: foo + - key: span.optional + value: + stringValue: notbar + timeUnixNano: "1678392127926654000" + isMonotonic: true + - description: Span event sum by attributes + name: spanevent.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "14" + attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: bar + timeUnixNano: "1678392127926654000" + - asDouble: "16" + attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: notbar + timeUnixNano: "1678392127926654000" + isMonotonic: true + + - resource: {} + scopeMetrics: + - metrics: + - description: Span sum by attributes + name: span.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "4.2" + attributes: + - key: span.required + value: + stringValue: foo + - key: span.optional + value: + stringValue: bar + timeUnixNano: "1678392127926661000" + - asDouble: "6" + attributes: + - key: span.required + value: + stringValue: foo + - key: span.optional + value: + stringValue: notbar + timeUnixNano: "1678392127926661000" + isMonotonic: true + - description: Span event sum by attributes + name: spanevent.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "14" + attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: bar + timeUnixNano: "1678392127926661000" + - asDouble: "16" + attributes: + - key: event.required + value: + stringValue: foo + - key: event.optional + value: + stringValue: notbar + timeUnixNano: "1678392127926661000" + isMonotonic: true + diff --git a/connector/sumconnector/testdata/traces/multiple_conditions.yaml b/connector/sumconnector/testdata/traces/multiple_conditions.yaml new file mode 100644 index 000000000000..eea3335df200 --- /dev/null +++ b/connector/sumconnector/testdata/traces/multiple_conditions.yaml @@ -0,0 +1,99 @@ +resourceMetrics: + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: bar + scopeMetrics: + - metrics: + - description: Span sum if ... + name: span.sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "8.2" + timeUnixNano: "1678392127923826000" + isMonotonic: true + - description: Span event sum if ... + name: spanevent.sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "23.9" + timeUnixNano: "1678392127923826000" + isMonotonic: true + + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: notbar + scopeMetrics: + - metrics: + - description: Span sum if ... + name: span.sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "8.2" + timeUnixNano: "1678392127923836000" + isMonotonic: true + - description: Span event sum if ... + name: spanevent.sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "23.3" + timeUnixNano: "1678392127923836000" + isMonotonic: true + + - resource: + attributes: + - key: resource.required + value: + stringValue: notfoo + scopeMetrics: + - metrics: + - description: Span sum if ... + name: span.sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "5.1" + timeUnixNano: "1678392127923843000" + isMonotonic: true + - description: Span event sum if ... + name: spanevent.sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "15" + timeUnixNano: "1678392127923843000" + isMonotonic: true + + - resource: {} + scopeMetrics: + - metrics: + - description: Span sum if ... + name: span.sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "5.1" + timeUnixNano: "1678392127923849000" + isMonotonic: true + - description: Span event sum if ... + name: spanevent.sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "15" + timeUnixNano: "1678392127923849000" + isMonotonic: true + diff --git a/connector/sumconnector/testdata/traces/multiple_metrics.yaml b/connector/sumconnector/testdata/traces/multiple_metrics.yaml new file mode 100644 index 000000000000..c19731ff7fac --- /dev/null +++ b/connector/sumconnector/testdata/traces/multiple_metrics.yaml @@ -0,0 +1,163 @@ +resourceMetrics: + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: bar + scopeMetrics: + - metrics: + - description: All spans sum + name: span.sum.all + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "8.2" + timeUnixNano: "1678392127924753000" + isMonotonic: true + - description: Span sum if ... + name: span.sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "8.2" + timeUnixNano: "1678392127924753000" + isMonotonic: true + - description: All span events sum + name: spanevent.sum.all + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "23.9" + timeUnixNano: "1678392127924753000" + isMonotonic: true + - description: Span event sum if ... + name: spanevent.sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "23.9" + timeUnixNano: "1678392127924753000" + isMonotonic: true + + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: notbar + scopeMetrics: + - metrics: + - description: All spans sum + name: span.sum.all + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "8.2" + timeUnixNano: "1678392127924764000" + isMonotonic: true + - description: Span sum if ... + name: span.sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "8.2" + timeUnixNano: "1678392127924764000" + isMonotonic: true + - description: All span events sum + name: spanevent.sum.all + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "23.3" + timeUnixNano: "1678392127924764000" + isMonotonic: true + - description: Span event sum if ... + name: spanevent.sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "23.3" + timeUnixNano: "1678392127924764000" + isMonotonic: true + + - resource: + attributes: + - key: resource.required + value: + stringValue: notfoo + scopeMetrics: + - metrics: + - description: All spans sum + name: span.sum.all + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "8.2" + timeUnixNano: "1678392127924772000" + isMonotonic: true + - description: Span sum if ... + name: span.sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "5.1" + timeUnixNano: "1678392127924772000" + isMonotonic: true + - description: All span events sum + name: spanevent.sum.all + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "23" + timeUnixNano: "1678392127924772000" + isMonotonic: true + - description: Span event sum if ... + name: spanevent.sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "15" + timeUnixNano: "1678392127924772000" + isMonotonic: true + + - resource: {} + scopeMetrics: + - metrics: + - description: All spans sum + name: span.sum.all + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "8.2" + timeUnixNano: "1678392127924780000" + isMonotonic: true + - description: Span sum if ... + name: span.sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "5.1" + timeUnixNano: "1678392127924780000" + isMonotonic: true + - description: All span events sum + name: spanevent.sum.all + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "23" + timeUnixNano: "1678392127924780000" + isMonotonic: true + - description: Span event sum if ... + name: spanevent.sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "15" + timeUnixNano: "1678392127924780000" + isMonotonic: true + diff --git a/connector/sumconnector/testdata/traces/one_attribute.yaml b/connector/sumconnector/testdata/traces/one_attribute.yaml new file mode 100644 index 000000000000..466f1558822e --- /dev/null +++ b/connector/sumconnector/testdata/traces/one_attribute.yaml @@ -0,0 +1,182 @@ +resourceMetrics: + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: bar + scopeMetrics: + - metrics: + - description: Span sum by attribute + name: span.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "5.1" + attributes: + - key: span.required + value: + stringValue: foo + timeUnixNano: "1678392127925459000" + - asDouble: "3.1" + attributes: + - key: span.required + value: + stringValue: notfoo + timeUnixNano: "1678392127925459000" + isMonotonic: true + - description: Span event sum by attribute + name: spanevent.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "15.6" + attributes: + - key: event.required + value: + stringValue: foo + timeUnixNano: "1678392127925459000" + - asDouble: "8.3" + attributes: + - key: event.required + value: + stringValue: notfoo + timeUnixNano: "1678392127925459000" + isMonotonic: true + + + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: notbar + scopeMetrics: + - metrics: + - description: Span sum by attribute + name: span.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "5.1" + attributes: + - key: span.required + value: + stringValue: foo + timeUnixNano: "1678392127925459000" + - asDouble: "3.1" + attributes: + - key: span.required + value: + stringValue: notfoo + timeUnixNano: "1678392127925459000" + isMonotonic: true + - description: Span event sum by attribute + name: spanevent.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "15.2" + attributes: + - key: event.required + value: + stringValue: foo + timeUnixNano: "1678392127925459000" + - asDouble: "8.1" + attributes: + - key: event.required + value: + stringValue: notfoo + timeUnixNano: "1678392127925459000" + isMonotonic: true + + + - resource: + attributes: + - key: resource.required + value: + stringValue: notfoo + scopeMetrics: + - metrics: + - description: Span sum by attribute + name: span.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "5.1" + attributes: + - key: span.required + value: + stringValue: foo + timeUnixNano: "1678392127925459000" + - asDouble: "3.1" + attributes: + - key: span.required + value: + stringValue: notfoo + timeUnixNano: "1678392127925459000" + isMonotonic: true + - description: Span event sum by attribute + name: spanevent.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "15" + attributes: + - key: event.required + value: + stringValue: foo + timeUnixNano: "1678392127925459000" + - asDouble: "8" + attributes: + - key: event.required + value: + stringValue: notfoo + timeUnixNano: "1678392127925459000" + isMonotonic: true + + + - resource: {} + scopeMetrics: + - metrics: + - description: Span sum by attribute + name: span.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "5.1" + attributes: + - key: span.required + value: + stringValue: foo + timeUnixNano: "1678392127925459000" + - asDouble: "3.1" + attributes: + - key: span.required + value: + stringValue: notfoo + timeUnixNano: "1678392127925459000" + isMonotonic: true + - description: Span event sum by attribute + name: spanevent.sum.by_attr + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "15" + attributes: + - key: event.required + value: + stringValue: foo + timeUnixNano: "1678392127925459000" + - asDouble: "8" + attributes: + - key: event.required + value: + stringValue: notfoo + timeUnixNano: "1678392127925459000" + isMonotonic: true + diff --git a/connector/sumconnector/testdata/traces/one_condition.yaml b/connector/sumconnector/testdata/traces/one_condition.yaml new file mode 100644 index 000000000000..9c95a0555a85 --- /dev/null +++ b/connector/sumconnector/testdata/traces/one_condition.yaml @@ -0,0 +1,55 @@ +resourceMetrics: + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: bar + scopeMetrics: + - metrics: + - description: Span sum if ... + name: span.sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "8.2" + timeUnixNano: "1678392127922309000" + isMonotonic: true + - description: Span event sum if ... + name: spanevent.sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "23.900000" + timeUnixNano: "1678392127922310000" + isMonotonic: true + + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: notbar + scopeMetrics: + - metrics: + - description: Span sum if ... + name: span.sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "8.2" + timeUnixNano: "1678392127922363000" + isMonotonic: true + - description: Span event sum if ... + name: spanevent.sum.if + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "23.3" + timeUnixNano: "1678392127922364000" + isMonotonic: true + diff --git a/connector/sumconnector/testdata/traces/zero_conditions.yaml b/connector/sumconnector/testdata/traces/zero_conditions.yaml new file mode 100644 index 000000000000..1c287e188dff --- /dev/null +++ b/connector/sumconnector/testdata/traces/zero_conditions.yaml @@ -0,0 +1,99 @@ +resourceMetrics: + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: bar + scopeMetrics: + - metrics: + - description: The sum of beep values observed in spans. + name: trace.span.sum + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "8.2" + timeUnixNano: "1678392127920605000" + isMonotonic: true + - description: The sum of beep values observed in span events. + name: trace.span.event.sum + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "23.9" + timeUnixNano: "1678392127920605000" + isMonotonic: true + + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + - key: resource.optional + value: + stringValue: notbar + scopeMetrics: + - metrics: + - description: The sum of beep values observed in spans. + name: trace.span.sum + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "8.2" + timeUnixNano: "1678392127920632000" + isMonotonic: true + - description: The sum of beep values observed in span events. + name: trace.span.event.sum + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "23.3" + timeUnixNano: "1678392127920632000" + isMonotonic: true + + - resource: + attributes: + - key: resource.required + value: + stringValue: notfoo + scopeMetrics: + - metrics: + - description: The sum of beep values observed in spans. + name: trace.span.sum + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "8.2" + timeUnixNano: "1678392127920635000" + isMonotonic: true + - description: The sum of beep values observed in span events. + name: trace.span.event.sum + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "23" + timeUnixNano: "1678392127920635000" + isMonotonic: true + + - resource: {} + scopeMetrics: + - metrics: + - description: The sum of beep values observed in spans. + name: trace.span.sum + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "8.2" + timeUnixNano: "1678392127920638000" + isMonotonic: true + - description: The sum of beep values observed in span events. + name: trace.span.event.sum + sum: + aggregationTemporality: 1 + dataPoints: + - asDouble: "23" + timeUnixNano: "1678392127920638000" + isMonotonic: true + diff --git a/distributions.yaml b/distributions.yaml index 1ec93c7d9e36..2a6e9670c7ce 100644 --- a/distributions.yaml +++ b/distributions.yaml @@ -5,4 +5,6 @@ - name: core url: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol - name: contrib - url: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib \ No newline at end of file + url: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib + - name: k8s + url: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s \ No newline at end of file diff --git a/examples/couchbase/docker-compose.yaml b/examples/couchbase/docker-compose.yaml index 91ef13ffe3c6..c1e89d27a726 100644 --- a/examples/couchbase/docker-compose.yaml +++ b/examples/couchbase/docker-compose.yaml @@ -10,14 +10,14 @@ services: cpus: "0.50" memory: 1512M opentelemetry-collector-contrib: - image: otel/opentelemetry-collector-contrib:0.101.0 + image: otel/opentelemetry-collector-contrib:0.115.1 command: ["--config=/etc/otel-collector-config.yml"] volumes: - ./otel-collector-config.yaml:/etc/otel-collector-config.yml depends_on: - couchbase prometheus: - image: prom/prometheus:v2.52.0 + image: prom/prometheus:v3.0.1 volumes: - ./prometheus-config.yaml:/etc/prometheus/prometheus.yml ports: diff --git a/examples/demo/client/Dockerfile b/examples/demo/client/Dockerfile index 9b2e723cc31d..59512cfb454d 100644 --- a/examples/demo/client/Dockerfile +++ b/examples/demo/client/Dockerfile @@ -1,10 +1,10 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 -FROM golang:1.22 as build +FROM golang:1.23 as build WORKDIR /app/ COPY . . RUN go env -w GOPROXY=direct RUN CGO_ENABLED=0 go build -o main main.go -FROM alpine:3.20 +FROM alpine:3.21 COPY --from=build /app/main /app/main CMD ["/app/main"] diff --git a/examples/demo/client/go.mod b/examples/demo/client/go.mod index 2b53253a49d2..40fdcce25b0d 100644 --- a/examples/demo/client/go.mod +++ b/examples/demo/client/go.mod @@ -1,33 +1,34 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/examples/demo/client -go 1.21.0 +go 1.22.0 require ( - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 - go.opentelemetry.io/otel v1.27.0 - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/sdk v1.27.0 - go.opentelemetry.io/otel/sdk/metric v1.27.0 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 + go.opentelemetry.io/otel v1.32.0 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 + go.opentelemetry.io/otel/metric v1.32.0 + go.opentelemetry.io/otel/sdk v1.32.0 + go.opentelemetry.io/otel/sdk/metric v1.32.0 ) require ( github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect - go.opentelemetry.io/otel/trace v1.27.0 // indirect - go.opentelemetry.io/proto/otlp v1.2.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect + golang.org/x/net v0.30.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.20.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/grpc v1.67.1 // indirect + google.golang.org/protobuf v1.35.1 // indirect ) retract ( diff --git a/examples/demo/client/go.sum b/examples/demo/client/go.sum index ed6cb5e70b41..50782e2aae72 100644 --- a/examples/demo/client/go.sum +++ b/examples/demo/client/go.sum @@ -5,53 +5,55 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 h1:bFgvUr3/O4PHj3VQcFEuYKvRZJX1SJDQ+11JXuSB3/w= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0/go.mod h1:xJntEd2KL6Qdg5lwp97HMLQDVeAhrYxmzFseAMDPQ8I= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= -go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= -go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 h1:j7ZSD+5yn+lo3sGV69nW04rRR0jhYnBwjuX3r0HvnK0= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0/go.mod h1:WXbYJTUaZXAbYd8lbgGuvih0yuCfOFC5RJoYnoLcGz8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 h1:IJFEoHiytixx8cMiVAO+GmHR6Frwu+u5Ur8njpFO6Ac= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0/go.mod h1:3rHrKNtLIoS0oZwkY2vxi+oJcwFRWdtUyRII+so45p8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 h1:9kV11HXBHZAvuPUZxmMWrH8hZn/6UnHX4K0mu36vNsU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0/go.mod h1:JyA0FHXe22E1NeNiHmVp7kFHglnexDQ7uRWDiiJ1hKQ= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 h1:P8OJ/WCl/Xo4E4zoe4/bifHpSmmKwARqyqE4nW6J2GQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291 h1:AgADTJarZTBqgjiUzRgfaBchgYB3/WFTC80GPwsMcRI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= +google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= +google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/examples/demo/client/main.go b/examples/demo/client/main.go index 35304293da7b..ae3f311e8434 100644 --- a/examples/demo/client/main.go +++ b/examples/demo/client/main.go @@ -174,7 +174,6 @@ func main() { } func makeRequest(ctx context.Context) { - demoServerAddr, ok := os.LookupEnv("DEMO_SERVER_ENDPOINT") if !ok { demoServerAddr = "http://0.0.0.0:7080/hello" @@ -186,7 +185,7 @@ func makeRequest(ctx context.Context) { } // Make sure we pass the context to the request to avoid broken traces. - req, err := http.NewRequestWithContext(ctx, "GET", demoServerAddr, nil) + req, err := http.NewRequestWithContext(ctx, http.MethodGet, demoServerAddr, nil) if err != nil { handleErr(err, "failed to http request") } diff --git a/examples/demo/otel-collector-config.yaml b/examples/demo/otel-collector-config.yaml index f6499d54cd79..205a47e97c4a 100644 --- a/examples/demo/otel-collector-config.yaml +++ b/examples/demo/otel-collector-config.yaml @@ -2,6 +2,7 @@ receivers: otlp: protocols: grpc: + endpoint: 0.0.0.0:4317 exporters: prometheus: diff --git a/examples/demo/server/Dockerfile b/examples/demo/server/Dockerfile index 9b2e723cc31d..59512cfb454d 100644 --- a/examples/demo/server/Dockerfile +++ b/examples/demo/server/Dockerfile @@ -1,10 +1,10 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 -FROM golang:1.22 as build +FROM golang:1.23 as build WORKDIR /app/ COPY . . RUN go env -w GOPROXY=direct RUN CGO_ENABLED=0 go build -o main main.go -FROM alpine:3.20 +FROM alpine:3.21 COPY --from=build /app/main /app/main CMD ["/app/main"] diff --git a/examples/demo/server/go.mod b/examples/demo/server/go.mod index 6a1038ae55c0..b8b7ee622fb3 100644 --- a/examples/demo/server/go.mod +++ b/examples/demo/server/go.mod @@ -1,33 +1,34 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/examples/demo/server -go 1.21.0 +go 1.22.0 require ( - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 - go.opentelemetry.io/otel v1.27.0 - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/sdk v1.27.0 - go.opentelemetry.io/otel/sdk/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 + go.opentelemetry.io/otel v1.32.0 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 + go.opentelemetry.io/otel/metric v1.32.0 + go.opentelemetry.io/otel/sdk v1.32.0 + go.opentelemetry.io/otel/sdk/metric v1.32.0 + go.opentelemetry.io/otel/trace v1.32.0 ) require ( github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect - go.opentelemetry.io/proto/otlp v1.2.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect + golang.org/x/net v0.30.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.20.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/grpc v1.67.1 // indirect + google.golang.org/protobuf v1.35.1 // indirect ) retract ( diff --git a/examples/demo/server/go.sum b/examples/demo/server/go.sum index ed6cb5e70b41..50782e2aae72 100644 --- a/examples/demo/server/go.sum +++ b/examples/demo/server/go.sum @@ -5,53 +5,55 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 h1:bFgvUr3/O4PHj3VQcFEuYKvRZJX1SJDQ+11JXuSB3/w= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0/go.mod h1:xJntEd2KL6Qdg5lwp97HMLQDVeAhrYxmzFseAMDPQ8I= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= -go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= -go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 h1:j7ZSD+5yn+lo3sGV69nW04rRR0jhYnBwjuX3r0HvnK0= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0/go.mod h1:WXbYJTUaZXAbYd8lbgGuvih0yuCfOFC5RJoYnoLcGz8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 h1:IJFEoHiytixx8cMiVAO+GmHR6Frwu+u5Ur8njpFO6Ac= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0/go.mod h1:3rHrKNtLIoS0oZwkY2vxi+oJcwFRWdtUyRII+so45p8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 h1:9kV11HXBHZAvuPUZxmMWrH8hZn/6UnHX4K0mu36vNsU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0/go.mod h1:JyA0FHXe22E1NeNiHmVp7kFHglnexDQ7uRWDiiJ1hKQ= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 h1:P8OJ/WCl/Xo4E4zoe4/bifHpSmmKwARqyqE4nW6J2GQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291 h1:AgADTJarZTBqgjiUzRgfaBchgYB3/WFTC80GPwsMcRI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= +google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= +google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/examples/demo/server/main.go b/examples/demo/server/main.go index c345f152e406..74fb81e7d1a0 100644 --- a/examples/demo/server/main.go +++ b/examples/demo/server/main.go @@ -152,7 +152,6 @@ func main() { http.Error(w, "write operation failed.", http.StatusInternalServerError) return } - }) mux := http.NewServeMux() diff --git a/examples/kubernetes/README.md b/examples/kubernetes/README.md index dec70d63c596..5ec5db489d94 100644 --- a/examples/kubernetes/README.md +++ b/examples/kubernetes/README.md @@ -47,12 +47,13 @@ Following table shows result of example run: Test |Result|Duration|CPU Avg%|CPU Max%|RAM Avg MiB|RAM Max MiB|Sent Items|Received Items| ----------------------------------------|------|-------:|-------:|-------:|----------:|----------:|---------:|-------------:| -Log10kDPS/OTLP |PASS | 15s| 15.2| 15.7| 69| 73| 149900| 149900| -Log10kDPS/filelog |PASS | 15s| 16.5| 18.0| 61| 74| 150000| 150000| -Log10kDPS/kubernetes_containers |PASS | 15s| 42.3| 44.0| 66| 80| 150000| 150000| -Log10kDPS/k8s_CRI-Containerd |PASS | 15s| 36.7| 38.0| 64| 78| 150000| 150000| -Log10kDPS/k8s_CRI-Containerd_no_attr_ops|PASS | 15s| 28.9| 29.7| 64| 77| 150000| 150000| -Log10kDPS/CRI-Containerd |PASS | 15s| 19.0| 21.0| 63| 77| 150000| 150000| +Log10kDPS/OTLP |PASS | 15s| 10.4| 11.0| 68| 94| 150100| 150100| +Log10kDPS/filelog |PASS | 15s| 7.8| 8.7| 65| 93| 150100| 150100| +Log10kDPS/kubernetes_containers |PASS | 15s| 18.3| 19.7| 67| 96| 150100| 150100| +Log10kDPS/kubernetes_containers_parser |PASS | 15s| 18.2| 19.0| 66| 95| 150100| 150100| +Log10kDPS/k8s_CRI-Containerd |PASS | 15s| 15.4| 16.3| 66| 95| 150100| 150100| +Log10kDPS/k8s_CRI-Containerd_no_attr_ops|PASS | 15s| 15.1| 16.3| 66| 95| 150100| 150100| +Log10kDPS/CRI-Containerd |PASS | 15s| 11.1| 13.0| 65| 93| 150100| 150100| ## ToDo diff --git a/examples/kubernetes/otel-collector.yaml b/examples/kubernetes/otel-collector.yaml index 528a327c7040..2822265906d7 100644 --- a/examples/kubernetes/otel-collector.yaml +++ b/examples/kubernetes/otel-collector.yaml @@ -91,7 +91,6 @@ data: - k8s.pod.name - k8s.pod.uid - k8s.deployment.name - - k8s.cluster.name - k8s.namespace.name - k8s.node.name - k8s.pod.start_time @@ -106,11 +105,12 @@ data: from: pod # Pod association using resource attributes and connection pod_association: - - from: resource_attribute - name: k8s.pod.uid - - from: resource_attribute - name: k8s.pod.ip - - from: connection + - sources: + - from: resource_attribute + name: k8s.pod.uid + - from: resource_attribute + name: k8s.pod.ip + - from: connection exporters: debug: diff --git a/examples/nomad/otel-collector.nomad b/examples/nomad/otel-collector.nomad index e833f19a0628..55f7019c7e75 100644 --- a/examples/nomad/otel-collector.nomad +++ b/examples/nomad/otel-collector.nomad @@ -85,7 +85,9 @@ receivers: otlp: protocols: grpc: + endpoint: 0.0.0.0:4317 http: + endpoint: 0.0.0.0:4318 processors: batch: diff --git a/examples/secure-tracing/docker-compose.yaml b/examples/secure-tracing/docker-compose.yaml index 4e598d1bb098..e45ce0ae790a 100644 --- a/examples/secure-tracing/docker-compose.yaml +++ b/examples/secure-tracing/docker-compose.yaml @@ -12,7 +12,7 @@ services: - ./certs/ca.crt:/etc/ca.crt - ./envoy-config.yaml:/etc/envoy-config.yaml otel-collector: - image: otel/opentelemetry-collector:0.101.0 + image: otel/opentelemetry-collector:0.115.1 command: ["--config=/etc/otel-collector-config.yaml"] volumes: - ./certs/otel-collector.crt:/etc/otel-collector.crt diff --git a/exporter/alertmanagerexporter/README.md b/exporter/alertmanagerexporter/README.md index 3ef900df2304..d7f5248a95ac 100644 --- a/exporter/alertmanagerexporter/README.md +++ b/exporter/alertmanagerexporter/README.md @@ -5,9 +5,9 @@ | Stability | [development]: traces | | Distributions | [] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Falertmanager%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Falertmanager) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Falertmanager%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Falertmanager) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@jpkrohling](https://www.github.com/jpkrohling), [@sokoide](https://www.github.com/sokoide), [@mcube8](https://www.github.com/mcube8) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@sokoide](https://www.github.com/sokoide), [@mcube8](https://www.github.com/mcube8) | -[development]: https://github.com/open-telemetry/opentelemetry-collector#development +[development]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#development Exports OTEL Events (SpanEvent in Tracing added by AddEvent API) as Alerts to [Alertmanager](https://prometheus.io/docs/alerting/latest/alertmanager/) back-end to notify Errors or Change events. diff --git a/exporter/alertmanagerexporter/alertmanager_exporter.go b/exporter/alertmanagerexporter/alertmanager_exporter.go index ad66c7d54886..58a8ba393c73 100644 --- a/exporter/alertmanagerexporter/alertmanager_exporter.go +++ b/exporter/alertmanagerexporter/alertmanager_exporter.go @@ -67,7 +67,6 @@ func (s *alertmanagerExporter) convertEventSliceToArray(eventSlice ptrace.SpanEv } func (s *alertmanagerExporter) extractEvents(td ptrace.Traces) []*alertmanagerEvent { - // Stitch parent trace ID and span ID rss := td.ResourceSpans() var events []*alertmanagerEvent @@ -107,7 +106,6 @@ func createAnnotations(event *alertmanagerEvent) model.LabelSet { } func (s *alertmanagerExporter) convertEventsToAlertPayload(events []*alertmanagerEvent) []model.Alert { - payload := make([]model.Alert, len(events)) for i, event := range events { @@ -126,13 +124,12 @@ func (s *alertmanagerExporter) convertEventsToAlertPayload(events []*alertmanage } func (s *alertmanagerExporter) postAlert(ctx context.Context, payload []model.Alert) error { - msg, err := json.Marshal(payload) if err != nil { return fmt.Errorf("error marshaling alert to JSON: %w", err) } - req, err := http.NewRequestWithContext(ctx, "POST", s.endpoint, bytes.NewBuffer(msg)) + req, err := http.NewRequestWithContext(ctx, http.MethodPost, s.endpoint, bytes.NewBuffer(msg)) if err != nil { return fmt.Errorf("error creating HTTP request: %w", err) } @@ -162,7 +159,6 @@ func (s *alertmanagerExporter) postAlert(ctx context.Context, payload []model.Al } func (s *alertmanagerExporter) pushTraces(ctx context.Context, td ptrace.Traces) error { - events := s.extractEvents(td) if len(events) == 0 { @@ -171,7 +167,6 @@ func (s *alertmanagerExporter) pushTraces(ctx context.Context, td ptrace.Traces) alert := s.convertEventsToAlertPayload(events) err := s.postAlert(ctx, alert) - if err != nil { return err } @@ -180,7 +175,6 @@ func (s *alertmanagerExporter) pushTraces(ctx context.Context, td ptrace.Traces) } func (s *alertmanagerExporter) start(ctx context.Context, host component.Host) error { - client, err := s.config.ClientConfig.ToClient(ctx, host, s.settings) if err != nil { return fmt.Errorf("failed to create HTTP Client: %w", err) @@ -190,7 +184,6 @@ func (s *alertmanagerExporter) start(ctx context.Context, host component.Host) e } func (s *alertmanagerExporter) shutdown(context.Context) error { - if s.client != nil { s.client.CloseIdleConnections() } @@ -198,7 +191,6 @@ func (s *alertmanagerExporter) shutdown(context.Context) error { } func newAlertManagerExporter(cfg *Config, set component.TelemetrySettings) *alertmanagerExporter { - return &alertmanagerExporter{ config: cfg, settings: set, @@ -210,13 +202,12 @@ func newAlertManagerExporter(cfg *Config, set component.TelemetrySettings) *aler } } -func newTracesExporter(ctx context.Context, cfg component.Config, set exporter.CreateSettings) (exporter.Traces, error) { - +func newTracesExporter(ctx context.Context, cfg component.Config, set exporter.Settings) (exporter.Traces, error) { config := cfg.(*Config) s := newAlertManagerExporter(config, set.TelemetrySettings) - return exporterhelper.NewTracesExporter( + return exporterhelper.NewTraces( ctx, set, cfg, diff --git a/exporter/alertmanagerexporter/alertmanager_exporter_test.go b/exporter/alertmanagerexporter/alertmanager_exporter_test.go index 29ceafbbeb8d..991d14c04432 100644 --- a/exporter/alertmanagerexporter/alertmanager_exporter_test.go +++ b/exporter/alertmanagerexporter/alertmanager_exporter_test.go @@ -22,7 +22,7 @@ import ( "go.opentelemetry.io/collector/exporter/exportertest" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/testutil" ) @@ -41,7 +41,7 @@ func createTracesAndSpan() (ptrace.Traces, ptrace.Span) { attrs.PutInt("attr2", 40) attrs.PutDouble("attr3", 3.14) - // add a span + // add a span spans := rs.ScopeSpans().AppendEmpty().Spans() spans.EnsureCapacity(1) span := spans.AppendEmpty() @@ -77,7 +77,7 @@ func TestAlertManagerExporterExtractEvents(t *testing.T) { t.Run(tt.name, func(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig().(*Config) - set := exportertest.NewNopCreateSettings() + set := exportertest.NewNopSettings() am := newAlertManagerExporter(cfg, set.TelemetrySettings) require.NotNil(t, am) @@ -101,7 +101,7 @@ func TestAlertManagerExporterExtractEvents(t *testing.T) { // test - events got := am.extractEvents(traces) - assert.Equal(t, tt.events, len(got)) + assert.Len(t, got, tt.events) }) } } @@ -109,7 +109,7 @@ func TestAlertManagerExporterExtractEvents(t *testing.T) { func TestAlertManagerExporterEventNameAttributes(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig().(*Config) - set := exportertest.NewNopCreateSettings() + set := exportertest.NewNopSettings() am := newAlertManagerExporter(cfg, set.TelemetrySettings) require.NotNil(t, am) @@ -133,16 +133,16 @@ func TestAlertManagerExporterEventNameAttributes(t *testing.T) { got := am.extractEvents(traces) // test - result length - assert.Equal(t, 1, len(got)) + assert.Len(t, got, 1) // test - count of attributes assert.Equal(t, 3, got[0].spanEvent.Attributes().Len()) attr, b := got[0].spanEvent.Attributes().Get("attr1") - assert.Equal(t, true, b) + assert.True(t, b) assert.Equal(t, "unittest-event", got[0].spanEvent.Name()) assert.Equal(t, "unittest-baz", attr.AsString()) attr, b = got[0].spanEvent.Attributes().Get("attr3") - assert.Equal(t, true, b) + assert.True(t, b) assert.Equal(t, 5.14, attr.Double()) } @@ -150,7 +150,7 @@ func TestAlertManagerExporterSeverity(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig().(*Config) cfg.SeverityAttribute = "foo" - set := exportertest.NewNopCreateSettings() + set := exportertest.NewNopSettings() am := newAlertManagerExporter(cfg, set.TelemetrySettings) require.NotNil(t, am) @@ -190,13 +190,12 @@ func TestAlertManagerExporterSeverity(t *testing.T) { ls = model.LabelSet{"event_name": "unittest-event", "severity": "info"} assert.Equal(t, ls, alerts[1].Labels) - } func TestAlertManagerExporterNoDefaultSeverity(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig().(*Config) - set := exportertest.NewNopCreateSettings() + set := exportertest.NewNopSettings() am := newAlertManagerExporter(cfg, set.TelemetrySettings) require.NotNil(t, am) @@ -221,13 +220,12 @@ func TestAlertManagerExporterNoDefaultSeverity(t *testing.T) { ls := model.LabelSet{"event_name": "unittest-event", "severity": "info"} assert.Equal(t, ls, alerts[0].Labels) - } func TestAlertManagerExporterAlertPayload(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig().(*Config) - set := exportertest.NewNopCreateSettings() + set := exportertest.NewNopSettings() am := newAlertManagerExporter(cfg, set.TelemetrySettings) require.NotNil(t, am) @@ -267,13 +265,12 @@ func TestAlertManagerExporterAlertPayload(t *testing.T) { assert.Equal(t, expect.Labels, got[0].Labels) assert.Equal(t, expect.Annotations, got[0].Annotations) assert.Equal(t, expect.GeneratorURL, got[0].GeneratorURL) - } func TestAlertManagerTracesExporterNoErrors(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig().(*Config) - lte, err := newTracesExporter(context.Background(), cfg, exportertest.NewNopCreateSettings()) + lte, err := newTracesExporter(context.Background(), cfg, exportertest.NewNopSettings()) fmt.Println(lte) require.NotNil(t, lte) assert.NoError(t, err) @@ -320,7 +317,7 @@ func TestAlertManagerPostAlert(t *testing.T) { }) cfg.Endpoint = mock.mockserver.URL - set := exportertest.NewNopCreateSettings() + set := exportertest.NewNopSettings() am := newAlertManagerExporter(cfg, set.TelemetrySettings) err := am.start(context.Background(), componenttest.NewNopHost()) @@ -328,9 +325,7 @@ func TestAlertManagerPostAlert(t *testing.T) { err = am.postAlert(context.Background(), alerts) assert.NoError(t, err) - if mock.fooCalledSuccessfully == false { - t.Errorf("mock server wasn't called") - } + assert.True(t, mock.fooCalledSuccessfully, "mock server wasn't called") } func TestClientConfig(t *testing.T) { @@ -397,7 +392,7 @@ func TestClientConfig(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - set := exportertest.NewNopCreateSettings() + set := exportertest.NewNopSettings() am := newAlertManagerExporter(tt.config, set.TelemetrySettings) exp, err := newTracesExporter(context.Background(), tt.config, set) diff --git a/exporter/alertmanagerexporter/config.go b/exporter/alertmanagerexporter/config.go index 3948dc360137..2e0e84fdd00f 100644 --- a/exporter/alertmanagerexporter/config.go +++ b/exporter/alertmanagerexporter/config.go @@ -14,9 +14,9 @@ import ( // Config defines configuration for alertmanager exporter. type Config struct { - exporterhelper.TimeoutSettings `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. - exporterhelper.QueueSettings `mapstructure:"sending_queue"` - BackoffConfig configretry.BackOffConfig `mapstructure:"retry_on_failure"` + TimeoutSettings exporterhelper.TimeoutConfig `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` + BackoffConfig configretry.BackOffConfig `mapstructure:"retry_on_failure"` confighttp.ClientConfig `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. GeneratorURL string `mapstructure:"generator_url"` @@ -28,7 +28,6 @@ var _ component.Config = (*Config)(nil) // Validate checks if the exporter configuration is valid func (cfg *Config) Validate() error { - if cfg.ClientConfig.Endpoint == "" { return errors.New("endpoint must be non-empty") } diff --git a/exporter/alertmanagerexporter/config_test.go b/exporter/alertmanagerexporter/config_test.go index a31c66fca227..0766c02704b6 100644 --- a/exporter/alertmanagerexporter/config_test.go +++ b/exporter/alertmanagerexporter/config_test.go @@ -35,7 +35,6 @@ func TestLoadConfig(t *testing.T) { id component.ID expected component.Config }{ - { id: component.NewIDWithName(metadata.Type, ""), expected: defaultCfg, @@ -46,7 +45,7 @@ func TestLoadConfig(t *testing.T) { GeneratorURL: "opentelemetry-collector", DefaultSeverity: "info", SeverityAttribute: "foo", - TimeoutSettings: exporterhelper.TimeoutSettings{ + TimeoutSettings: exporterhelper.TimeoutConfig{ Timeout: 10 * time.Second, }, BackoffConfig: configretry.BackOffConfig{ @@ -57,27 +56,29 @@ func TestLoadConfig(t *testing.T) { RandomizationFactor: backoff.DefaultRandomizationFactor, Multiplier: backoff.DefaultMultiplier, }, - QueueSettings: exporterhelper.QueueSettings{ + QueueSettings: exporterhelper.QueueConfig{ Enabled: true, NumConsumers: 2, QueueSize: 10, }, - ClientConfig: confighttp.ClientConfig{ - Headers: map[string]configopaque.String{ + ClientConfig: func() confighttp.ClientConfig { + client := confighttp.NewDefaultClientConfig() + client.Headers = map[string]configopaque.String{ "can you have a . here?": "F0000000-0000-0000-0000-000000000000", "header1": "234", "another": "somevalue", - }, - Endpoint: "a.new.alertmanager.target:9093", - TLSSetting: configtls.ClientConfig{ + } + client.Endpoint = "a.new.alertmanager.target:9093" + client.TLSSetting = configtls.ClientConfig{ Config: configtls.Config{ CAFile: "/var/lib/mycert.pem", }, - }, - ReadBufferSize: 0, - WriteBufferSize: 524288, - Timeout: time.Second * 10, - }, + } + client.ReadBufferSize = 0 + client.WriteBufferSize = 524288 + client.Timeout = time.Second * 10 + return client + }(), }, }, } @@ -89,7 +90,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) diff --git a/exporter/alertmanagerexporter/factory.go b/exporter/alertmanagerexporter/factory.go index 12155d32d6a0..4a0675e477b2 100644 --- a/exporter/alertmanagerexporter/factory.go +++ b/exporter/alertmanagerexporter/factory.go @@ -10,7 +10,6 @@ import ( "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/config/confighttp" - "go.opentelemetry.io/collector/config/configopaque" "go.opentelemetry.io/collector/config/configretry" "go.opentelemetry.io/collector/exporter" "go.opentelemetry.io/collector/exporter/exporterhelper" @@ -27,22 +26,22 @@ func NewFactory() exporter.Factory { } func createDefaultConfig() component.Config { + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Endpoint = "http://localhost:9093" + clientConfig.Timeout = 30 * time.Second + clientConfig.WriteBufferSize = 512 * 1024 + return &Config{ GeneratorURL: "opentelemetry-collector", DefaultSeverity: "info", - TimeoutSettings: exporterhelper.NewDefaultTimeoutSettings(), + TimeoutSettings: exporterhelper.NewDefaultTimeoutConfig(), BackoffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), - ClientConfig: confighttp.ClientConfig{ - Endpoint: "http://localhost:9093", - Timeout: 30 * time.Second, - Headers: map[string]configopaque.String{}, - WriteBufferSize: 512 * 1024, - }, + QueueSettings: exporterhelper.NewDefaultQueueConfig(), + ClientConfig: clientConfig, } } -func createTracesExporter(ctx context.Context, set exporter.CreateSettings, config component.Config) (exporter.Traces, error) { +func createTracesExporter(ctx context.Context, set exporter.Settings, config component.Config) (exporter.Traces, error) { cfg := config.(*Config) if cfg.Endpoint == "" { diff --git a/exporter/alertmanagerexporter/factory_test.go b/exporter/alertmanagerexporter/factory_test.go index 9735a1707a6f..d2ae4eedacd4 100644 --- a/exporter/alertmanagerexporter/factory_test.go +++ b/exporter/alertmanagerexporter/factory_test.go @@ -19,11 +19,11 @@ func TestCreateDefaultConfig(t *testing.T) { assert.NoError(t, componenttest.CheckConfigStruct(cfg)) } -func TestCreateTracesExporter(t *testing.T) { +func TestCreateTraces(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() - te, err := factory.CreateTracesExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + te, err := factory.CreateTraces(context.Background(), exportertest.NewNopSettings(), cfg) assert.NoError(t, err) assert.NotNil(t, te) } diff --git a/exporter/alertmanagerexporter/generated_component_test.go b/exporter/alertmanagerexporter/generated_component_test.go index 2265900372e9..02546f60ac93 100644 --- a/exporter/alertmanagerexporter/generated_component_test.go +++ b/exporter/alertmanagerexporter/generated_component_test.go @@ -32,13 +32,13 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -50,21 +50,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(exporter.Logs) require.True(t, ok) diff --git a/exporter/alertmanagerexporter/go.mod b/exporter/alertmanagerexporter/go.mod index ca5273825aef..17183f512c0e 100644 --- a/exporter/alertmanagerexporter/go.mod +++ b/exporter/alertmanagerexporter/go.mod @@ -1,76 +1,83 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/alertmanagerexporter -go 1.21.0 +go 1.22.0 require ( github.com/cenkalti/backoff/v4 v4.3.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 - github.com/prometheus/common v0.53.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/confighttp v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/collector/config/configtls v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.116.0 + github.com/prometheus/common v0.61.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/confighttp v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/config/configtls v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/semconv v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/rs/cors v1.10.1 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + github.com/rs/cors v1.11.1 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/alertmanagerexporter/go.sum b/exporter/alertmanagerexporter/go.sum index 3faaee5330e9..090d9fd9f15c 100644 --- a/exporter/alertmanagerexporter/go.sum +++ b/exporter/alertmanagerexporter/go.sum @@ -1,25 +1,23 @@ -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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= @@ -33,14 +31,14 @@ 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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -54,80 +52,102 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/prometheus/common v0.61.0 h1:3gv/GThfX0cV2lpO7gkTUwZru38mxevy90Bj8YFSRQQ= +github.com/prometheus/common v0.61.0/go.mod h1:zr29OCN/2BsJRaFwG8QOBr41D6kkchKbpeNH7pAjb/s= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -143,20 +163,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -165,12 +185,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/exporter/alertmanagerexporter/internal/metadata/generated_status.go b/exporter/alertmanagerexporter/internal/metadata/generated_status.go index 22658f7c6cd4..69870efe9da9 100644 --- a/exporter/alertmanagerexporter/internal/metadata/generated_status.go +++ b/exporter/alertmanagerexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("alertmanager") + Type = component.MustNewType("alertmanager") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/alertmanagerexporter" ) const ( diff --git a/exporter/alertmanagerexporter/internal/metadata/generated_telemetry.go b/exporter/alertmanagerexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index bd16fed0de4e..000000000000 --- a/exporter/alertmanagerexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/alertmanager") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/alertmanager") -} diff --git a/exporter/alertmanagerexporter/internal/metadata/generated_telemetry_test.go b/exporter/alertmanagerexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index ef067a5f24d3..000000000000 --- a/exporter/alertmanagerexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/alertmanager", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/alertmanager", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/alertmanagerexporter/metadata.yaml b/exporter/alertmanagerexporter/metadata.yaml index 3be5f22d58a7..344808e4bcb9 100644 --- a/exporter/alertmanagerexporter/metadata.yaml +++ b/exporter/alertmanagerexporter/metadata.yaml @@ -1,5 +1,4 @@ type: alertmanager -scope_name: otelcol/alertmanager status: class: exporter @@ -7,7 +6,7 @@ status: development: [traces] distributions: [] codeowners: - active: [jpkrohling, sokoide, mcube8] + active: [sokoide, mcube8] tests: config: diff --git a/exporter/alertmanagerexporter/testdata/config.yaml b/exporter/alertmanagerexporter/testdata/config.yaml index f95d5c2954b5..25e5d0f23ae4 100644 --- a/exporter/alertmanagerexporter/testdata/config.yaml +++ b/exporter/alertmanagerexporter/testdata/config.yaml @@ -18,5 +18,5 @@ alertmanager/2: max_elapsed_time: 10m headers: "can you have a . here?": "F0000000-0000-0000-0000-000000000000" - header1: 234 - another: "somevalue" \ No newline at end of file + header1: "234" + another: "somevalue" diff --git a/exporter/alibabacloudlogserviceexporter/README.md b/exporter/alibabacloudlogserviceexporter/README.md index d1c7389b2567..73b963381dd6 100644 --- a/exporter/alibabacloudlogserviceexporter/README.md +++ b/exporter/alibabacloudlogserviceexporter/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Falibabacloudlogservice%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Falibabacloudlogservice) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Falibabacloudlogservice%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Falibabacloudlogservice) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@shabicheng](https://www.github.com/shabicheng), [@kongluoxing](https://www.github.com/kongluoxing), [@qiansheng91](https://www.github.com/qiansheng91) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib diff --git a/exporter/alibabacloudlogserviceexporter/config_test.go b/exporter/alibabacloudlogserviceexporter/config_test.go index 84efa3bad5a5..3af84173c7dd 100644 --- a/exporter/alibabacloudlogserviceexporter/config_test.go +++ b/exporter/alibabacloudlogserviceexporter/config_test.go @@ -29,7 +29,6 @@ func TestLoadConfig(t *testing.T) { id component.ID expected component.Config }{ - { id: component.NewIDWithName(metadata.Type, ""), expected: defaultCfg, @@ -53,7 +52,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) diff --git a/exporter/alibabacloudlogserviceexporter/factory.go b/exporter/alibabacloudlogserviceexporter/factory.go index 5b73f894d74f..9894ed4c0a99 100644 --- a/exporter/alibabacloudlogserviceexporter/factory.go +++ b/exporter/alibabacloudlogserviceexporter/factory.go @@ -31,7 +31,7 @@ func createDefaultConfig() component.Config { func createTracesExporter( _ context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exporter.Traces, error) { return newTracesExporter(set, cfg) @@ -39,7 +39,7 @@ func createTracesExporter( func createMetricsExporter( _ context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exp exporter.Metrics, err error) { return newMetricsExporter(set, cfg) @@ -47,7 +47,7 @@ func createMetricsExporter( func createLogsExporter( _ context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exp exporter.Logs, err error) { return newLogsExporter(set, cfg) diff --git a/exporter/alibabacloudlogserviceexporter/generated_component_test.go b/exporter/alibabacloudlogserviceexporter/generated_component_test.go index 0ede361c0eca..bebf1ec666a8 100644 --- a/exporter/alibabacloudlogserviceexporter/generated_component_test.go +++ b/exporter/alibabacloudlogserviceexporter/generated_component_test.go @@ -32,27 +32,27 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, { name: "metrics", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg) }, }, { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -64,21 +64,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(exporter.Logs) require.True(t, ok) diff --git a/exporter/alibabacloudlogserviceexporter/go.mod b/exporter/alibabacloudlogserviceexporter/go.mod index 0043d95b98bb..4daed86145ed 100644 --- a/exporter/alibabacloudlogserviceexporter/go.mod +++ b/exporter/alibabacloudlogserviceexporter/go.mod @@ -1,42 +1,42 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/alibabacloudlogserviceexporter -go 1.21.0 +go 1.22.0 require ( - github.com/aliyun/aliyun-log-go-sdk v0.1.75 + github.com/aliyun/aliyun-log-go-sdk v0.1.83 github.com/gogo/protobuf v1.3.2 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/pdata/testdata v0.102.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/pdata/testdata v0.116.0 + go.opentelemetry.io/collector/semconv v0.116.0 go.uber.org/zap v1.27.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff v2.2.1+incompatible // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-kit/kit v0.10.0 // indirect + github.com/go-kit/kit v0.12.0 // indirect + github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.5.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/compress v1.17.9 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect @@ -44,28 +44,35 @@ require ( github.com/pierrec/lz4 v2.6.0+incompatible // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configretry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/consumer v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + go.opentelemetry.io/collector/config/configretry v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/consumer v1.22.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/alibabacloudlogserviceexporter/go.sum b/exporter/alibabacloudlogserviceexporter/go.sum index 9d5ce89a0ccd..5259d7675222 100644 --- a/exporter/alibabacloudlogserviceexporter/go.sum +++ b/exporter/alibabacloudlogserviceexporter/go.sum @@ -1,17 +1,5 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Netflix/go-env v0.0.0-20220526054621-78278af1949d h1:wvStE9wLpws31NiWUx+38wny1msZ/tm+eL5xmm4Y7So= github.com/Netflix/go-env v0.0.0-20220526054621-78278af1949d/go.mod h1:9XMFaCeRyW7fC9XJOWQ+NdAv8VLG7ys7l3x4ozEGLUQ= -github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= -github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4 h1:iC9YFYKDGEy3n/FtqJnOkZsene9olVspKmkX5A2YBEo= github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4/go.mod h1:sCavSAvdzOjul4cEqeVtvlSaSScfNsTQ+46HwlTL1hc= github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.4 h1:7Q2FEyqxeZeIkwYMwRC3uphxV4i7O2eV4ETe21d6lS4= @@ -32,496 +20,198 @@ github.com/alibabacloud-go/tea-utils/v2 v2.0.1 h1:K6kwgo+UiYx+/kr6CO0PN5ACZDzE3n github.com/alibabacloud-go/tea-utils/v2 v2.0.1/go.mod h1:U5MTY10WwlquGPS34DOeomUGBB0gXbLueiq5Trwu0C4= github.com/alibabacloud-go/tea-xml v1.1.2 h1:oLxa7JUXm2EDFzMg+7oRsYc+kutgCVwm+bZlhhmvW5M= github.com/alibabacloud-go/tea-xml v1.1.2/go.mod h1:Rq08vgCcCAjHyRi/M7xlHKUykZCEtyBy9+DPF6GgEu8= -github.com/aliyun/aliyun-log-go-sdk v0.1.75 h1:asM0c8NViqoCx6ULqaldE4YnyRq42rU1eqP6/ditzSg= -github.com/aliyun/aliyun-log-go-sdk v0.1.75/go.mod h1:dcQd3FhFu8UI1H48L+YW49ATTWgzGqWz/S/7Bm07gpY= +github.com/aliyun/aliyun-log-go-sdk v0.1.83 h1:xdFXXsvhO5BedlO9EUSf/HJDHSCp6kQrwL4EKDnT/Zg= +github.com/aliyun/aliyun-log-go-sdk v0.1.83/go.mod h1:qNjBnTjQl8UeHhGmoZ7iredr2xyVBD1Ueu3JgOALR5U= github.com/aliyun/credentials-go v1.1.2 h1:qU1vwGIBb3UJ8BwunHDRFtAhS6jnQLnde/yk0+Ih2GY= github.com/aliyun/credentials-go v1.1.2/go.mod h1:ozcZaMR5kLM7pwtCMEpVmQ242suV6qTJya2bDq4X1Tw= -github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= -github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= -github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -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/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/clbanning/mxj v1.8.4 h1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I= github.com/clbanning/mxj/v2 v2.5.5 h1:oT81vUeEiQQ/DcHbzSytRngP6Ky9O+L+0Bw0zSJag9E= github.com/clbanning/mxj/v2 v2.5.5/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= -github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 h1:F1EaeKL/ta07PY/k9Os/UFtwERei2/XzGemhpGnBKNg= -github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= -github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.10.2 h1:19ARM85nVi4xH7xPXuc5eM/udya5ieh7b/Sv+d844Tk= github.com/frankban/quicktest v1.10.2/go.mod h1:K+q6oSqb0W0Ininfk863uOk1lMy69l/P6txr3mVT54s= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.10.0 h1:dXFJfIHVvUcpSgDOV+Ne6t7jXri8Tfv2uOLHUZ2XNuo= -github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= +github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= -github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= -github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= -github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= -github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4 v2.6.0+incompatible h1:Ix9yFKn1nSPBLFl/yZknTp8TU5G4Ps0JDmguYK6iH1A= github.com/pierrec/lz4 v2.6.0+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tjfoc/gmsm v1.3.2 h1:7JVkAn5bvUJ7HtU08iW6UiD+UTmJTIToHCfeFzkcCxM= github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/ini.v1 v1.56.0 h1:DPMeDvGTM54DXbPkVIZsp19fp/I2K7zwA/itHYHKo8Y= gopkg.in/ini.v1 v1.56.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/exporter/alibabacloudlogserviceexporter/internal/metadata/generated_status.go b/exporter/alibabacloudlogserviceexporter/internal/metadata/generated_status.go index a556da9540ea..aa1f547d9e31 100644 --- a/exporter/alibabacloudlogserviceexporter/internal/metadata/generated_status.go +++ b/exporter/alibabacloudlogserviceexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("alibabacloud_logservice") + Type = component.MustNewType("alibabacloud_logservice") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/alibabacloudlogserviceexporter" ) const ( diff --git a/exporter/alibabacloudlogserviceexporter/internal/metadata/generated_telemetry.go b/exporter/alibabacloudlogserviceexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index eb28a0ba7cb3..000000000000 --- a/exporter/alibabacloudlogserviceexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/alibabacloudlogservice") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/alibabacloudlogservice") -} diff --git a/exporter/alibabacloudlogserviceexporter/internal/metadata/generated_telemetry_test.go b/exporter/alibabacloudlogserviceexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 8892715cef27..000000000000 --- a/exporter/alibabacloudlogserviceexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/alibabacloudlogservice", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/alibabacloudlogservice", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/alibabacloudlogserviceexporter/logs_exporter.go b/exporter/alibabacloudlogserviceexporter/logs_exporter.go index ce426d14bd36..33eaf37e5230 100644 --- a/exporter/alibabacloudlogserviceexporter/logs_exporter.go +++ b/exporter/alibabacloudlogserviceexporter/logs_exporter.go @@ -14,8 +14,7 @@ import ( ) // newLogsExporter return a new LogService logs exporter. -func newLogsExporter(set exporter.CreateSettings, cfg component.Config) (exporter.Logs, error) { - +func newLogsExporter(set exporter.Settings, cfg component.Config) (exporter.Logs, error) { l := &logServiceLogsSender{ logger: set.Logger, } @@ -25,7 +24,7 @@ func newLogsExporter(set exporter.CreateSettings, cfg component.Config) (exporte return nil, err } - return exporterhelper.NewLogsExporter( + return exporterhelper.NewLogs( context.TODO(), set, cfg, @@ -39,7 +38,8 @@ type logServiceLogsSender struct { func (s *logServiceLogsSender) pushLogsData( _ context.Context, - md plog.Logs) error { + md plog.Logs, +) error { var err error slsLogs := logDataToLogService(md) if len(slsLogs) > 0 { diff --git a/exporter/alibabacloudlogserviceexporter/logs_exporter_test.go b/exporter/alibabacloudlogserviceexporter/logs_exporter_test.go index 8b66d05c86bf..21a00312622b 100644 --- a/exporter/alibabacloudlogserviceexporter/logs_exporter_test.go +++ b/exporter/alibabacloudlogserviceexporter/logs_exporter_test.go @@ -40,7 +40,7 @@ func createSimpleLogData(numberOfLogs int) plog.Logs { } func TestNewLogsExporter(t *testing.T) { - got, err := newLogsExporter(exportertest.NewNopCreateSettings(), &Config{ + got, err := newLogsExporter(exportertest.NewNopSettings(), &Config{ Endpoint: "us-west-1.log.aliyuncs.com", Project: "demo-project", Logstore: "demo-logstore", @@ -55,7 +55,7 @@ func TestNewLogsExporter(t *testing.T) { } func TestSTSTokenExporter(t *testing.T) { - got, err := newLogsExporter(exportertest.NewNopCreateSettings(), &Config{ + got, err := newLogsExporter(exportertest.NewNopSettings(), &Config{ Endpoint: "us-west-1.log.aliyuncs.com", Project: "demo-project", Logstore: "demo-logstore", @@ -66,7 +66,7 @@ func TestSTSTokenExporter(t *testing.T) { } func TestNewFailsWithEmptyLogsExporterName(t *testing.T) { - got, err := newLogsExporter(exportertest.NewNopCreateSettings(), &Config{}) + got, err := newLogsExporter(exportertest.NewNopSettings(), &Config{}) assert.Error(t, err) require.Nil(t, got) } diff --git a/exporter/alibabacloudlogserviceexporter/logsdata_to_logservice.go b/exporter/alibabacloudlogserviceexporter/logsdata_to_logservice.go index 29b11ca37457..5fc5058bfc19 100644 --- a/exporter/alibabacloudlogserviceexporter/logsdata_to_logservice.go +++ b/exporter/alibabacloudlogserviceexporter/logsdata_to_logservice.go @@ -115,7 +115,8 @@ func instrumentationScopeToLogContents(instrumentationScope pcommon.Instrumentat func mapLogRecordToLogService(lr plog.LogRecord, resourceContents, - instrumentationLibraryContents []*sls.LogContent) *sls.Log { + instrumentationLibraryContents []*sls.LogContent, +) *sls.Log { if lr.Body().Type() == pcommon.ValueTypeEmpty { return nil } diff --git a/exporter/alibabacloudlogserviceexporter/logsdata_to_logservice_test.go b/exporter/alibabacloudlogserviceexporter/logsdata_to_logservice_test.go index 6e8172bc30b6..9a1b4ab37d40 100644 --- a/exporter/alibabacloudlogserviceexporter/logsdata_to_logservice_test.go +++ b/exporter/alibabacloudlogserviceexporter/logsdata_to_logservice_test.go @@ -75,7 +75,7 @@ func TestLogsDataToLogService(t *testing.T) { totalLogCount := 10 validLogCount := totalLogCount - 1 gotLogs := logDataToLogService(createLogData(10)) - assert.Equal(t, len(gotLogs), 9) + assert.Len(t, gotLogs, 9) gotLogPairs := make([][]logKeyValuePair, 0, len(gotLogs)) @@ -88,7 +88,6 @@ func TestLogsDataToLogService(t *testing.T) { }) } gotLogPairs = append(gotLogPairs, pairs) - } wantLogs := make([][]logKeyValuePair, 0, validLogCount) @@ -98,7 +97,6 @@ func TestLogsDataToLogService(t *testing.T) { return } for j := 0; j < validLogCount; j++ { - sort.Sort(logKeyValuePairs(gotLogPairs[j])) sort.Sort(logKeyValuePairs(wantLogs[j])) assert.Equal(t, wantLogs[j], gotLogPairs[j]) diff --git a/exporter/alibabacloudlogserviceexporter/metadata.yaml b/exporter/alibabacloudlogserviceexporter/metadata.yaml index d473dbb82ea2..de159cd15ede 100644 --- a/exporter/alibabacloudlogserviceexporter/metadata.yaml +++ b/exporter/alibabacloudlogserviceexporter/metadata.yaml @@ -1,5 +1,4 @@ type: alibabacloud_logservice -scope_name: otelcol/alibabacloudlogservice status: class: exporter diff --git a/exporter/alibabacloudlogserviceexporter/metrics_exporter.go b/exporter/alibabacloudlogserviceexporter/metrics_exporter.go index 4381aeabf1ec..cf1dbb241c59 100644 --- a/exporter/alibabacloudlogserviceexporter/metrics_exporter.go +++ b/exporter/alibabacloudlogserviceexporter/metrics_exporter.go @@ -14,8 +14,7 @@ import ( ) // newMetricsExporter return a new LogSerice metrics exporter. -func newMetricsExporter(set exporter.CreateSettings, cfg component.Config) (exporter.Metrics, error) { - +func newMetricsExporter(set exporter.Settings, cfg component.Config) (exporter.Metrics, error) { l := &logServiceMetricsSender{ logger: set.Logger, } @@ -25,7 +24,7 @@ func newMetricsExporter(set exporter.CreateSettings, cfg component.Config) (expo return nil, err } - return exporterhelper.NewMetricsExporter( + return exporterhelper.NewMetrics( context.TODO(), set, cfg, diff --git a/exporter/alibabacloudlogserviceexporter/metrics_exporter_test.go b/exporter/alibabacloudlogserviceexporter/metrics_exporter_test.go index a3fc451a0fba..118999e444a9 100644 --- a/exporter/alibabacloudlogserviceexporter/metrics_exporter_test.go +++ b/exporter/alibabacloudlogserviceexporter/metrics_exporter_test.go @@ -14,7 +14,7 @@ import ( ) func TestNewMetricsExporter(t *testing.T) { - got, err := newMetricsExporter(exportertest.NewNopCreateSettings(), &Config{ + got, err := newMetricsExporter(exportertest.NewNopSettings(), &Config{ Endpoint: "us-west-1.log.aliyuncs.com", Project: "demo-project", Logstore: "demo-logstore", @@ -28,7 +28,7 @@ func TestNewMetricsExporter(t *testing.T) { } func TestNewFailsWithEmptyMetricsExporterName(t *testing.T) { - got, err := newMetricsExporter(exportertest.NewNopCreateSettings(), &Config{}) + got, err := newMetricsExporter(exportertest.NewNopSettings(), &Config{}) assert.Error(t, err) require.Nil(t, got) } diff --git a/exporter/alibabacloudlogserviceexporter/metricsdata_to_logservice.go b/exporter/alibabacloudlogserviceexporter/metricsdata_to_logservice.go index a9b06e755012..c01e83447400 100644 --- a/exporter/alibabacloudlogserviceexporter/metricsdata_to_logservice.go +++ b/exporter/alibabacloudlogserviceexporter/metricsdata_to_logservice.go @@ -113,7 +113,8 @@ func newMetricLogFromRaw( name string, labels KeyValues, nsec int64, - value float64) *sls.Log { + value float64, +) *sls.Log { labels.Sort() return &sls.Log{ Time: proto.Uint32(uint32(nsec / 1e9)), @@ -227,7 +228,6 @@ func doubleHistogramMetricsToLogs(name string, data pmetric.HistogramDataPointSl float64(bucket), )) } - } return logs } @@ -289,7 +289,6 @@ func metricsDataToLogServiceData( _ *zap.Logger, md pmetric.Metrics, ) (logs []*sls.Log) { - resMetrics := md.ResourceMetrics() for i := 0; i < resMetrics.Len(); i++ { resMetricSlice := resMetrics.At(i) diff --git a/exporter/alibabacloudlogserviceexporter/metricsdata_to_logservice_test.go b/exporter/alibabacloudlogserviceexporter/metricsdata_to_logservice_test.go index 400cd5736949..67e211517307 100644 --- a/exporter/alibabacloudlogserviceexporter/metricsdata_to_logservice_test.go +++ b/exporter/alibabacloudlogserviceexporter/metricsdata_to_logservice_test.go @@ -112,7 +112,6 @@ func TestMetricDataToLogService(t *testing.T) { }) } gotLogPairs = append(gotLogPairs, pairs) - } wantLogs := make([][]logKeyValuePair, 0, len(gotLogs)) @@ -130,12 +129,12 @@ func TestMetricDataToLogService(t *testing.T) { } func TestMetricCornerCases(t *testing.T) { - assert.Equal(t, min(1, 2), 1) - assert.Equal(t, min(2, 1), 1) - assert.Equal(t, min(1, 1), 1) + assert.Equal(t, 1, min(1, 2)) + assert.Equal(t, 1, min(2, 1)) + assert.Equal(t, 1, min(1, 1)) var label KeyValues label.Append("a", "b") - assert.Equal(t, label.String(), "a#$#b") + assert.Equal(t, "a#$#b", label.String()) } func TestMetricLabelSanitize(t *testing.T) { @@ -144,7 +143,7 @@ func TestMetricLabelSanitize(t *testing.T) { label.Append("0test", "key_0test") label.Append("test_normal", "test_normal") label.Append("0test", "key_0test") - assert.Equal(t, label.String(), "key_test#$#key_test|key_0test#$#key_0test|test_normal#$#test_normal|key_0test#$#key_0test") + assert.Equal(t, "key_test#$#key_test|key_0test#$#key_0test|test_normal#$#test_normal|key_0test#$#key_0test", label.String()) label.Sort() - assert.Equal(t, label.String(), "key_0test#$#key_0test|key_0test#$#key_0test|key_test#$#key_test|test_normal#$#test_normal") + assert.Equal(t, "key_0test#$#key_0test|key_0test#$#key_0test|key_test#$#key_test|test_normal#$#test_normal", label.String()) } diff --git a/exporter/alibabacloudlogserviceexporter/trace_exporter.go b/exporter/alibabacloudlogserviceexporter/trace_exporter.go index 972e83bc1cd6..cfc685561ac7 100644 --- a/exporter/alibabacloudlogserviceexporter/trace_exporter.go +++ b/exporter/alibabacloudlogserviceexporter/trace_exporter.go @@ -14,8 +14,7 @@ import ( ) // newTracesExporter return a new LogSerice trace exporter. -func newTracesExporter(set exporter.CreateSettings, cfg component.Config) (exporter.Traces, error) { - +func newTracesExporter(set exporter.Settings, cfg component.Config) (exporter.Traces, error) { l := &logServiceTraceSender{ logger: set.Logger, } @@ -25,7 +24,7 @@ func newTracesExporter(set exporter.CreateSettings, cfg component.Config) (expor return nil, err } - return exporterhelper.NewTracesExporter( + return exporterhelper.NewTraces( context.TODO(), set, cfg, diff --git a/exporter/alibabacloudlogserviceexporter/trace_exporter_test.go b/exporter/alibabacloudlogserviceexporter/trace_exporter_test.go index 830e557a804e..a5ccd511a124 100644 --- a/exporter/alibabacloudlogserviceexporter/trace_exporter_test.go +++ b/exporter/alibabacloudlogserviceexporter/trace_exporter_test.go @@ -14,8 +14,7 @@ import ( ) func TestNewTracesExporter(t *testing.T) { - - got, err := newTracesExporter(exportertest.NewNopCreateSettings(), &Config{ + got, err := newTracesExporter(exportertest.NewNopSettings(), &Config{ Endpoint: "cn-hangzhou.log.aliyuncs.com", Project: "demo-project", Logstore: "demo-logstore", @@ -31,12 +30,11 @@ func TestNewTracesExporter(t *testing.T) { // This will put trace data to send buffer and return success. err = got.ConsumeTraces(context.Background(), traces) assert.NoError(t, err) - assert.Nil(t, got.Shutdown(context.Background())) + assert.NoError(t, got.Shutdown(context.Background())) } func TestNewFailsWithEmptyTracesExporterName(t *testing.T) { - - got, err := newTracesExporter(exportertest.NewNopCreateSettings(), &Config{}) + got, err := newTracesExporter(exportertest.NewNopSettings(), &Config{}) assert.Error(t, err) require.Nil(t, got) } diff --git a/exporter/alibabacloudlogserviceexporter/tracedata_to_logservice.go b/exporter/alibabacloudlogserviceexporter/tracedata_to_logservice.go index df843aa099b0..f30f62a99b95 100644 --- a/exporter/alibabacloudlogserviceexporter/tracedata_to_logservice.go +++ b/exporter/alibabacloudlogserviceexporter/tracedata_to_logservice.go @@ -188,7 +188,6 @@ func eventsToString(events ptrace.SpanEventSlice) string { } eventArrayBytes, _ := json.Marshal(&eventArray) return string(eventArrayBytes) - } func spanLinksToString(spanLinkSlice ptrace.SpanLinkSlice) string { diff --git a/exporter/alibabacloudlogserviceexporter/tracedata_to_logservice_test.go b/exporter/alibabacloudlogserviceexporter/tracedata_to_logservice_test.go index 88d005199739..3731480f8c93 100644 --- a/exporter/alibabacloudlogserviceexporter/tracedata_to_logservice_test.go +++ b/exporter/alibabacloudlogserviceexporter/tracedata_to_logservice_test.go @@ -6,6 +6,7 @@ package alibabacloudlogserviceexporter import ( "encoding/json" "fmt" + "net/http" "os" "sort" "testing" @@ -30,7 +31,7 @@ func (kv logKeyValuePairs) Less(i, j int) bool { return kv[i].Key < kv[j].Key } func TestTraceDataToLogService(t *testing.T) { gotLogs := traceDataToLogServiceData(constructSpanData()) - assert.Equal(t, len(gotLogs), 2) + assert.Len(t, gotLogs, 2) gotLogPairs := make([][]logKeyValuePair, 0, len(gotLogs)) @@ -43,7 +44,6 @@ func TestTraceDataToLogService(t *testing.T) { }) } gotLogPairs = append(gotLogPairs, pairs) - } wantLogs := make([][]logKeyValuePair, 0, len(gotLogs)) @@ -98,7 +98,7 @@ func fillResource(resource pcommon.Resource) { func fillHTTPClientSpan(span ptrace.Span) { attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "GET" + attributes[conventions.AttributeHTTPMethod] = http.MethodGet attributes[conventions.AttributeHTTPURL] = "https://api.example.com/users/junit" attributes[conventions.AttributeHTTPStatusCode] = 200 endTime := time.Unix(12300, 123456789) @@ -130,7 +130,7 @@ func fillHTTPClientSpan(span ptrace.Span) { func fillHTTPServerSpan(span ptrace.Span) { attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "GET" + attributes[conventions.AttributeHTTPMethod] = http.MethodGet attributes[conventions.AttributeHTTPURL] = "https://api.example.com/users/junit" attributes[conventions.AttributeHTTPClientIP] = "192.168.15.32" attributes[conventions.AttributeHTTPStatusCode] = 200 @@ -176,16 +176,16 @@ func newSegmentID() pcommon.SpanID { } func TestSpanKindToShortString(t *testing.T) { - assert.Equal(t, spanKindToShortString(ptrace.SpanKindConsumer), "consumer") - assert.Equal(t, spanKindToShortString(ptrace.SpanKindProducer), "producer") - assert.Equal(t, spanKindToShortString(ptrace.SpanKindClient), "client") - assert.Equal(t, spanKindToShortString(ptrace.SpanKindServer), "server") - assert.Equal(t, spanKindToShortString(ptrace.SpanKindInternal), "internal") - assert.Equal(t, spanKindToShortString(ptrace.SpanKindUnspecified), "") + assert.Equal(t, "consumer", spanKindToShortString(ptrace.SpanKindConsumer)) + assert.Equal(t, "producer", spanKindToShortString(ptrace.SpanKindProducer)) + assert.Equal(t, "client", spanKindToShortString(ptrace.SpanKindClient)) + assert.Equal(t, "server", spanKindToShortString(ptrace.SpanKindServer)) + assert.Equal(t, "internal", spanKindToShortString(ptrace.SpanKindInternal)) + assert.Equal(t, "", spanKindToShortString(ptrace.SpanKindUnspecified)) } func TestStatusCodeToShortString(t *testing.T) { - assert.Equal(t, statusCodeToShortString(ptrace.StatusCodeOk), "OK") - assert.Equal(t, statusCodeToShortString(ptrace.StatusCodeError), "ERROR") - assert.Equal(t, statusCodeToShortString(ptrace.StatusCodeUnset), "UNSET") + assert.Equal(t, "OK", statusCodeToShortString(ptrace.StatusCodeOk)) + assert.Equal(t, "ERROR", statusCodeToShortString(ptrace.StatusCodeError)) + assert.Equal(t, "UNSET", statusCodeToShortString(ptrace.StatusCodeUnset)) } diff --git a/exporter/awscloudwatchlogsexporter/README.md b/exporter/awscloudwatchlogsexporter/README.md index 9ec172840d4d..ce91aa63bd8d 100644 --- a/exporter/awscloudwatchlogsexporter/README.md +++ b/exporter/awscloudwatchlogsexporter/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fawscloudwatchlogs%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fawscloudwatchlogs) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fawscloudwatchlogs%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fawscloudwatchlogs) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@boostchicken](https://www.github.com/boostchicken), [@bryan-aguilar](https://www.github.com/bryan-aguilar), [@rapphil](https://www.github.com/rapphil) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib diff --git a/exporter/awscloudwatchlogsexporter/config.go b/exporter/awscloudwatchlogsexporter/config.go index 9432d20758de..24cce8c0f9bd 100644 --- a/exporter/awscloudwatchlogsexporter/config.go +++ b/exporter/awscloudwatchlogsexporter/config.go @@ -43,7 +43,7 @@ type Config struct { Tags map[string]*string `mapstructure:"tags"` // Queue settings frm the exporterhelper - exporterhelper.QueueSettings `mapstructure:"sending_queue"` + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` logger *zap.Logger @@ -73,7 +73,6 @@ func (config *Config) Validate() error { return retErr } return cwlogs.ValidateTagsInput(config.Tags) - } // TODO(jbd): Add ARN role to config. diff --git a/exporter/awscloudwatchlogsexporter/config_test.go b/exporter/awscloudwatchlogsexporter/config_test.go index bff0dd70c3af..284ff7530c00 100644 --- a/exporter/awscloudwatchlogsexporter/config_test.go +++ b/exporter/awscloudwatchlogsexporter/config_test.go @@ -43,10 +43,10 @@ func TestLoadConfig(t *testing.T) { LogStreamName: "testing", Endpoint: "", AWSSessionSettings: awsutil.CreateDefaultSessionConfig(), - QueueSettings: exporterhelper.QueueSettings{ + QueueSettings: exporterhelper.QueueConfig{ Enabled: true, NumConsumers: 1, - QueueSize: exporterhelper.NewDefaultQueueSettings().QueueSize, + QueueSize: exporterhelper.NewDefaultQueueConfig().QueueSize, }, }, }, @@ -64,7 +64,7 @@ func TestLoadConfig(t *testing.T) { AWSSessionSettings: awsutil.CreateDefaultSessionConfig(), LogGroupName: "test-2", LogStreamName: "testing", - QueueSettings: exporterhelper.QueueSettings{ + QueueSettings: exporterhelper.QueueConfig{ Enabled: true, NumConsumers: 1, QueueSize: 2, @@ -96,7 +96,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - err = component.UnmarshalConfig(sub, cfg) + err = sub.Unmarshal(cfg) if tt.expected == nil { err = multierr.Append(err, component.ValidateConfig(cfg)) @@ -118,14 +118,13 @@ func TestRetentionValidateCorrect(t *testing.T) { Endpoint: "", LogRetention: 365, AWSSessionSettings: awsutil.CreateDefaultSessionConfig(), - QueueSettings: exporterhelper.QueueSettings{ + QueueSettings: exporterhelper.QueueConfig{ Enabled: true, NumConsumers: 1, - QueueSize: exporterhelper.NewDefaultQueueSettings().QueueSize, + QueueSize: exporterhelper.NewDefaultQueueConfig().QueueSize, }, } assert.NoError(t, component.ValidateConfig(cfg)) - } func TestRetentionValidateWrong(t *testing.T) { @@ -137,13 +136,12 @@ func TestRetentionValidateWrong(t *testing.T) { Endpoint: "", LogRetention: 366, AWSSessionSettings: awsutil.CreateDefaultSessionConfig(), - QueueSettings: exporterhelper.QueueSettings{ + QueueSettings: exporterhelper.QueueConfig{ Enabled: true, - QueueSize: exporterhelper.NewDefaultQueueSettings().QueueSize, + QueueSize: exporterhelper.NewDefaultQueueConfig().QueueSize, }, } assert.Error(t, component.ValidateConfig(wrongcfg)) - } func TestValidateTags(t *testing.T) { @@ -221,10 +219,10 @@ func TestValidateTags(t *testing.T) { Endpoint: "", Tags: tt.tags, AWSSessionSettings: awsutil.CreateDefaultSessionConfig(), - QueueSettings: exporterhelper.QueueSettings{ + QueueSettings: exporterhelper.QueueConfig{ Enabled: true, NumConsumers: 1, - QueueSize: exporterhelper.NewDefaultQueueSettings().QueueSize, + QueueSize: exporterhelper.NewDefaultQueueConfig().QueueSize, }, } if tt.errorMessage != "" { diff --git a/exporter/awscloudwatchlogsexporter/exporter.go b/exporter/awscloudwatchlogsexporter/exporter.go index b382f24014cb..9aa14be1e3de 100644 --- a/exporter/awscloudwatchlogsexporter/exporter.go +++ b/exporter/awscloudwatchlogsexporter/exporter.go @@ -47,7 +47,7 @@ type emfMetadata struct { LogStreamName string `json:"log_stream_name,omitempty"` } -func newCwLogsPusher(expConfig *Config, params exp.CreateSettings) (*cwlExporter, error) { +func newCwLogsPusher(expConfig *Config, params exp.Settings) (*cwlExporter, error) { if expConfig == nil { return nil, errors.New("awscloudwatchlogs exporter config is nil") } @@ -63,7 +63,6 @@ func newCwLogsPusher(expConfig *Config, params exp.CreateSettings) (*cwlExporter // create CWLogs client with aws session config svcStructuredLog := cwlogs.NewClient(params.Logger, awsConfig, params.BuildInfo, expConfig.LogGroupName, expConfig.LogRetention, expConfig.Tags, session, metadata.Type.String()) collectorIdentifier, err := uuid.NewRandom() - if err != nil { return nil, err } @@ -82,13 +81,13 @@ func newCwLogsPusher(expConfig *Config, params exp.CreateSettings) (*cwlExporter return logsExporter, nil } -func newCwLogsExporter(config component.Config, params exp.CreateSettings) (exp.Logs, error) { +func newCwLogsExporter(config component.Config, params exp.Settings) (exp.Logs, error) { expConfig := config.(*Config) logsPusher, err := newCwLogsPusher(expConfig, params) if err != nil { return nil, err } - return exporterhelper.NewLogsExporter( + return exporterhelper.NewLogs( context.TODO(), params, config, @@ -105,13 +104,11 @@ func (e *cwlExporter) consumeLogs(_ context.Context, ld plog.Logs) error { var errs error err := pushLogsToCWLogs(e.logger, ld, e.Config, pusher) - if err != nil { errs = errors.Join(errs, fmt.Errorf("Error pushing logs: %w", err)) } err = pusher.ForceFlush() - if err != nil { errs = errors.Join(errs, fmt.Errorf("Error flushing logs: %w", err)) } diff --git a/exporter/awscloudwatchlogsexporter/exporter_test.go b/exporter/awscloudwatchlogsexporter/exporter_test.go index 2adf294a498a..160821e1a484 100644 --- a/exporter/awscloudwatchlogsexporter/exporter_test.go +++ b/exporter/awscloudwatchlogsexporter/exporter_test.go @@ -342,7 +342,7 @@ func TestConsumeLogs(t *testing.T) { expCfg.LogGroupName = "testGroup" expCfg.LogStreamName = "testStream" expCfg.MaxRetries = 0 - exp, err := newCwLogsPusher(expCfg, exportertest.NewNopCreateSettings()) + exp, err := newCwLogsPusher(expCfg, exportertest.NewNopSettings()) testcases := []struct { id string @@ -417,7 +417,7 @@ func TestNewExporterWithoutRegionErr(t *testing.T) { factory := NewFactory() expCfg := factory.CreateDefaultConfig().(*Config) expCfg.MaxRetries = 0 - exp, err := newCwLogsExporter(expCfg, exportertest.NewNopCreateSettings()) + exp, err := newCwLogsExporter(expCfg, exportertest.NewNopSettings()) assert.Nil(t, exp) assert.Error(t, err) } diff --git a/exporter/awscloudwatchlogsexporter/factory.go b/exporter/awscloudwatchlogsexporter/factory.go index f91ef82bafe2..cd94beef1a5f 100644 --- a/exporter/awscloudwatchlogsexporter/factory.go +++ b/exporter/awscloudwatchlogsexporter/factory.go @@ -28,7 +28,7 @@ func NewFactory() exporter.Factory { } func createDefaultConfig() component.Config { - queueSettings := exporterhelper.NewDefaultQueueSettings() + queueSettings := exporterhelper.NewDefaultQueueConfig() // For backwards compatibilitiy, we default to 1 consumer queueSettings.NumConsumers = 1 @@ -39,11 +39,10 @@ func createDefaultConfig() component.Config { } } -func createLogsExporter(_ context.Context, params exporter.CreateSettings, config component.Config) (exporter.Logs, error) { +func createLogsExporter(_ context.Context, params exporter.Settings, config component.Config) (exporter.Logs, error) { expConfig, ok := config.(*Config) if !ok { return nil, errors.New("invalid configuration type; can't cast to awscloudwatchlogsexporter.Config") } return newCwLogsExporter(expConfig, params) - } diff --git a/exporter/awscloudwatchlogsexporter/factory_test.go b/exporter/awscloudwatchlogsexporter/factory_test.go index df45d3957395..bc13854a6ab4 100644 --- a/exporter/awscloudwatchlogsexporter/factory_test.go +++ b/exporter/awscloudwatchlogsexporter/factory_test.go @@ -17,10 +17,10 @@ func TestDefaultConfig_exporterSettings(t *testing.T) { want := &Config{ BackOffConfig: configretry.NewDefaultBackOffConfig(), AWSSessionSettings: awsutil.CreateDefaultSessionConfig(), - QueueSettings: exporterhelper.QueueSettings{ + QueueSettings: exporterhelper.QueueConfig{ Enabled: true, NumConsumers: 1, - QueueSize: exporterhelper.NewDefaultQueueSettings().QueueSize, + QueueSize: exporterhelper.NewDefaultQueueConfig().QueueSize, }, } assert.Equal(t, want, createDefaultConfig()) diff --git a/exporter/awscloudwatchlogsexporter/generated_component_test.go b/exporter/awscloudwatchlogsexporter/generated_component_test.go index c5f53fdbb3ac..ab9b996eea55 100644 --- a/exporter/awscloudwatchlogsexporter/generated_component_test.go +++ b/exporter/awscloudwatchlogsexporter/generated_component_test.go @@ -32,13 +32,13 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, } @@ -50,21 +50,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(exporter.Logs) require.True(t, ok) diff --git a/exporter/awscloudwatchlogsexporter/generated_package_test.go b/exporter/awscloudwatchlogsexporter/generated_package_test.go index e2e429261a4c..aee3765c32cb 100644 --- a/exporter/awscloudwatchlogsexporter/generated_package_test.go +++ b/exporter/awscloudwatchlogsexporter/generated_package_test.go @@ -9,5 +9,5 @@ import ( ) func TestMain(m *testing.M) { - goleak.VerifyTestMain(m, goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start")) + goleak.VerifyTestMain(m, goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), goleak.IgnoreTopFunction("net/http.(*persistConn).writeLoop"), goleak.IgnoreTopFunction("internal/poll.runtime_pollWait")) } diff --git a/exporter/awscloudwatchlogsexporter/go.mod b/exporter/awscloudwatchlogsexporter/go.mod index 5130a863255c..3a0c02c10413 100644 --- a/exporter/awscloudwatchlogsexporter/go.mod +++ b/exporter/awscloudwatchlogsexporter/go.mod @@ -1,64 +1,70 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awscloudwatchlogsexporter -go 1.21.0 +go 1.22.0 require ( - github.com/aws/aws-sdk-go v1.53.11 + github.com/aws/aws-sdk-go v1.55.5 github.com/cenkalti/backoff/v4 v4.3.0 github.com/google/uuid v1.6.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutil v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/cwlogs v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutil v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/cwlogs v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 go.uber.org/goleak v1.3.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect github.com/stretchr/objx v0.5.2 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.20.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/awscloudwatchlogsexporter/go.sum b/exporter/awscloudwatchlogsexporter/go.sum index 60c986591e3a..229ed626b1ea 100644 --- a/exporter/awscloudwatchlogsexporter/go.sum +++ b/exporter/awscloudwatchlogsexporter/go.sum @@ -1,28 +1,28 @@ -github.com/aws/aws-sdk-go v1.53.11 h1:KcmduYvX15rRqt4ZU/7jKkmDxU/G87LJ9MUI0yQJh00= -github.com/aws/aws-sdk-go v1.53.11/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= -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/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= +github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= @@ -35,8 +35,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -52,58 +52,72 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -119,20 +133,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -141,12 +155,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/exporter/awscloudwatchlogsexporter/internal/metadata/generated_status.go b/exporter/awscloudwatchlogsexporter/internal/metadata/generated_status.go index 93e8c75eb2b1..6ea08d6d5c79 100644 --- a/exporter/awscloudwatchlogsexporter/internal/metadata/generated_status.go +++ b/exporter/awscloudwatchlogsexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("awscloudwatchlogs") + Type = component.MustNewType("awscloudwatchlogs") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awscloudwatchlogsexporter" ) const ( diff --git a/exporter/awscloudwatchlogsexporter/internal/metadata/generated_telemetry.go b/exporter/awscloudwatchlogsexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index 5e9b7bbe2382..000000000000 --- a/exporter/awscloudwatchlogsexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/awscloudwatchlogs") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/awscloudwatchlogs") -} diff --git a/exporter/awscloudwatchlogsexporter/internal/metadata/generated_telemetry_test.go b/exporter/awscloudwatchlogsexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index cc764ce58b09..000000000000 --- a/exporter/awscloudwatchlogsexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/awscloudwatchlogs", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/awscloudwatchlogs", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/awscloudwatchlogsexporter/metadata.yaml b/exporter/awscloudwatchlogsexporter/metadata.yaml index 9a86f2927c42..8f5bc90e5d7f 100644 --- a/exporter/awscloudwatchlogsexporter/metadata.yaml +++ b/exporter/awscloudwatchlogsexporter/metadata.yaml @@ -1,5 +1,4 @@ type: awscloudwatchlogs -scope_name: otelcol/awscloudwatchlogs status: class: exporter @@ -23,3 +22,5 @@ tests: top: # See https://github.com/census-instrumentation/opencensus-go/issues/1191 for more information. - "go.opencensus.io/stats/view.(*worker).start" + - "net/http.(*persistConn).writeLoop" + - "internal/poll.runtime_pollWait" diff --git a/exporter/awsemfexporter/README.md b/exporter/awsemfexporter/README.md index 9dc35146e314..6eb5d1dd4ebf 100644 --- a/exporter/awsemfexporter/README.md +++ b/exporter/awsemfexporter/README.md @@ -6,9 +6,10 @@ | Stability | [beta]: metrics | | Distributions | [contrib] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fawsemf%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fawsemf) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fawsemf%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fawsemf) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@Aneurysm9](https://www.github.com/Aneurysm9), [@shaochengwang](https://www.github.com/shaochengwang), [@mxiamxia](https://www.github.com/mxiamxia), [@bryan-aguilar](https://www.github.com/bryan-aguilar) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@Aneurysm9](https://www.github.com/Aneurysm9), [@mxiamxia](https://www.github.com/mxiamxia), [@bryan-aguilar](https://www.github.com/bryan-aguilar) | +| Emeritus | [@shaochengwang](https://www.github.com/shaochengwang) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib @@ -43,7 +44,7 @@ The following exporter configuration parameters are supported. | `resource_to_telemetry_conversion` | "resource_to_telemetry_conversion" is the option for converting resource attributes to telemetry attributes. It has only one config onption- `enabled`. For metrics, if `enabled=true`, all the resource attributes will be converted to metric labels by default. See `Resource Attributes to Metric Labels` section below for examples. | `enabled=false` | | `output_destination` | "output_destination" is an option to specify the EMFExporter output. Currently, two options are available. "cloudwatch" or "stdout" | `cloudwatch` | | `detailed_metrics` | Retain detailed datapoint values in exported metrics (e.g instead of exporting a quantile as a statistical value, preserve the quantile's population) | `false` | -| `parse_json_encoded_attr_values` | List of attribute keys whose corresponding values are JSON-encoded strings and will be converted to JSON structures in emf logs. For example, the attribute string value "{\\"x\\":5,\\"y\\":6}" will be converted to a json object: ```{"x": 5, "y": 6}``` | [ ] | +| `parse_json_encoded_attr_values` | List of attribute keys whose corresponding values are JSON-encoded strings and will be converted to JSON structures in emf logs. For example, the attribute string value "{\\"x\\":5,\\"y\\":6}" will be converted to a json object: ```{"x": 5, "y": 6}``` | [ ] | | [`metric_declarations`](#metric_declaration) | List of rules for filtering exported metrics and their dimensions. | [ ] | | [`metric_descriptors`](#metric_descriptor) | List of rules for inserting or updating metric descriptors. | [ ] | | `retain_initial_value_of_delta_metric` | This option specifies how the first value of a metric is handled. AWS EMF expects metric values to only contain deltas to the previous value. In the default case the first received value is therefor not sent to AWS but only used as a baseline for follow up changes to this metric. This is fine for high throughput metrics with stable labels (e.g. `requests{code=200}`). In this case it does not matter if the first value of this metric is discarded. However when your metric describes infrequent events or events with high label cardinality, then the exporter in default configuration would still drop the first occurrence of this metric. With this configuration value set to `true` the first value of all metrics will instead be send to AWS. | false | @@ -84,6 +85,14 @@ This exporter follows default credential resolution for the Follow the [guidelines](https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html) for the credential configuration. +## Metric Attributes +By setting attributes on your metrics you can change how individual metrics are sent to CloudWatch. Attributes can be set in code or using components like the [Attribute Processor](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/attributesprocessor). + +The AWS EMF Exporter will interpret the following metric attributes to change how it publishes metrics to CloudWatch: + +| Attribute Name | Description | Default | +| :---------------- | :--------------------------------------------------------------------- | ------- | +| `aws.emf.storage_resolution` | This attribute should be set to an integer value of `1` or `60`. When sending the metric value to CloudWatch use the specified storage resolution value. CloudWatch currently supports a storage resolution of `1` or `60` to indicate 1 second or 60 second resolution. | `aws.emf.storage_resolution = 60` | ## Configuration Examples diff --git a/exporter/awsemfexporter/config.go b/exporter/awsemfexporter/config.go index 9a93c558bf21..7495277e1c2a 100644 --- a/exporter/awsemfexporter/config.go +++ b/exporter/awsemfexporter/config.go @@ -4,6 +4,8 @@ package awsemfexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsemfexporter" import ( + "strings" + "go.opentelemetry.io/collector/component" "go.uber.org/zap" @@ -12,11 +14,9 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry" ) -var ( - // eMFSupportedUnits contains the unit collection supported by CloudWatch backend service. - // https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_MetricDatum.html - eMFSupportedUnits = newEMFSupportedUnits() -) +// eMFSupportedUnits contains the unit collection supported by CloudWatch backend service. +// https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_MetricDatum.html +var eMFSupportedUnits = newEMFSupportedUnits() // Config defines configuration for AWS EMF exporter. type Config struct { @@ -134,16 +134,29 @@ func (config *Config) Validate() error { } return cwlogs.ValidateTagsInput(config.Tags) +} + +func (config *Config) isAppSignalsEnabled() bool { + if config.LogGroupName == "" || config.Namespace == "" { + return false + } + + if config.Namespace == appSignalsMetricNamespace && strings.HasPrefix(config.LogGroupName, appSignalsLogGroupNamePrefix) { + return true + } + return false } func newEMFSupportedUnits() map[string]any { unitIndexer := map[string]any{} - for _, unit := range []string{"Seconds", "Microseconds", "Milliseconds", "Bytes", "Kilobytes", "Megabytes", + for _, unit := range []string{ + "Seconds", "Microseconds", "Milliseconds", "Bytes", "Kilobytes", "Megabytes", "Gigabytes", "Terabytes", "Bits", "Kilobits", "Megabits", "Gigabits", "Terabits", "Percent", "Count", "Bytes/Second", "Kilobytes/Second", "Megabytes/Second", "Gigabytes/Second", "Terabytes/Second", "Bits/Second", "Kilobits/Second", - "Megabits/Second", "Gigabits/Second", "Terabits/Second", "Count/Second", "None"} { + "Megabits/Second", "Gigabits/Second", "Terabits/Second", "Count/Second", "None", + } { unitIndexer[unit] = nil } return unitIndexer diff --git a/exporter/awsemfexporter/config_test.go b/exporter/awsemfexporter/config_test.go index 21d664f23d85..0bd93d6dfc27 100644 --- a/exporter/awsemfexporter/config_test.go +++ b/exporter/awsemfexporter/config_test.go @@ -113,7 +113,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) @@ -140,7 +140,7 @@ func TestConfigValidate(t *testing.T) { } assert.NoError(t, component.ValidateConfig(cfg)) - assert.Equal(t, 2, len(cfg.MetricDescriptors)) + assert.Len(t, cfg.MetricDescriptors, 2) assert.Equal(t, []MetricDescriptor{ {Unit: "Count", MetricName: "apiserver_total", Overwrite: true}, {Unit: "Megabytes", MetricName: "memory_usage"}, @@ -159,7 +159,6 @@ func TestRetentionValidateCorrect(t *testing.T) { logger: zap.NewNop(), } assert.NoError(t, component.ValidateConfig(cfg)) - } func TestRetentionValidateWrong(t *testing.T) { @@ -174,7 +173,6 @@ func TestRetentionValidateWrong(t *testing.T) { logger: zap.NewNop(), } assert.Error(t, component.ValidateConfig(wrongcfg)) - } func TestValidateTags(t *testing.T) { @@ -267,6 +265,60 @@ func TestNoDimensionRollupFeatureGate(t *testing.T) { require.NoError(t, err) cfg := createDefaultConfig() - assert.Equal(t, cfg.(*Config).DimensionRollupOption, "NoDimensionRollup") + assert.Equal(t, "NoDimensionRollup", cfg.(*Config).DimensionRollupOption) _ = featuregate.GlobalRegistry().Set("awsemf.nodimrollupdefault", false) } + +func TestIsApplicationSignalsEnabled(t *testing.T) { + tests := []struct { + name string + metricNameSpace string + logGroupName string + expectedResult bool + }{ + { + "validApplicationSignalsEMF", + "ApplicationSignals", + "/aws/application-signals/data", + true, + }, + { + "invalidApplicationSignalsLogsGroup", + "ApplicationSignals", + "/nonaws/application-signals/eks", + false, + }, + { + "invalidApplicationSignalsMetricNamespace", + "NonApplicationSignals", + "/aws/application-signals/data", + false, + }, + { + "invalidApplicationSignalsEMF", + "NonApplicationSignals", + "/nonaws/application-signals/eks", + false, + }, + { + "defaultConfig", + "", + "", + false, + }, + } + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + factory := NewFactory() + cfg := factory.CreateDefaultConfig().(*Config) + if len(tc.metricNameSpace) > 0 { + cfg.Namespace = tc.metricNameSpace + } + if len(tc.logGroupName) > 0 { + cfg.LogGroupName = tc.logGroupName + } + + assert.Equal(t, tc.expectedResult, cfg.isAppSignalsEnabled()) + }) + } +} diff --git a/exporter/awsemfexporter/datapoint.go b/exporter/awsemfexporter/datapoint.go index 1104a9e59e41..001d83ab2b78 100644 --- a/exporter/awsemfexporter/datapoint.go +++ b/exporter/awsemfexporter/datapoint.go @@ -334,7 +334,6 @@ func (dps summaryDataPointSlice) CalculateDeltaDatapoints(i int, instrumentation quantile := values.At(i) cLabels["quantile"] = strconv.FormatFloat(quantile.Quantile(), 'g', -1, 64) datapoints = append(datapoints, dataPoint{name: dps.metricName, value: quantile.Value(), labels: cLabels, timestampMs: timestampMs}) - } } else { metricVal := &cWMetricStats{Count: count, Sum: sum} diff --git a/exporter/awsemfexporter/datapoint_test.go b/exporter/awsemfexporter/datapoint_test.go index 597f1d4b091c..911ecc48e24e 100644 --- a/exporter/awsemfexporter/datapoint_test.go +++ b/exporter/awsemfexporter/datapoint_test.go @@ -333,6 +333,7 @@ func generateOtelTestMetrics(generatedOtelMetrics ...pmetric.Metrics) pmetric.Me } return finalOtelMetrics } + func generateDeltaMetricMetadata(adjustToDelta bool, metricName string, retainInitialValueForDelta bool) deltaMetricMetadata { return deltaMetricMetadata{ adjustToDelta: adjustToDelta, @@ -355,7 +356,6 @@ func shutdownEmfCalculators(c *emfCalculators) error { var errs error errs = multierr.Append(errs, c.delta.Shutdown()) return multierr.Append(errs, c.summary.Shutdown()) - } func TestIsStaleNaNInf_NumberDataPointSlice(t *testing.T) { @@ -398,7 +398,6 @@ func TestIsStaleNaNInf_NumberDataPointSlice(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - // Given the number datapoint (including Sum and Gauge OTEL metric type) with data type as int or double numberDPS := pmetric.NewNumberDataPointSlice() @@ -425,7 +424,6 @@ func TestCalculateDeltaDatapoints_NumberDataPointSlice(t *testing.T) { emfCalcs := setupEmfCalculators() defer require.NoError(t, shutdownEmfCalculators(emfCalcs)) for _, retainInitialValueOfDeltaMetric := range []bool{true, false} { - testCases := []struct { name string adjustToDelta bool @@ -511,7 +509,6 @@ func TestCalculateDeltaDatapoints_NumberDataPointSlice(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - // Given the number datapoint (including Sum and Gauge OTEL metric type) with data type as int or double numberDPS := pmetric.NewNumberDataPointSlice() numberDP := numberDPS.AppendEmpty() @@ -579,7 +576,6 @@ func TestCalculateDeltaDatapoints_HistogramDataPointSlice(t *testing.T) { histogramDP.SetSum(17.13) histogramDP.Attributes().PutStr("label1", "value1") return histogramDPS - }(), expectedDatapoint: dataPoint{ name: "foo", @@ -620,14 +616,11 @@ func TestCalculateDeltaDatapoints_HistogramDataPointSlice(t *testing.T) { assert.True(t, retained) assert.Equal(t, 1, histogramDatapointSlice.Len()) assert.Equal(t, tc.expectedDatapoint, dps[0]) - }) } - } func TestIsStaleNaNInf_HistogramDataPointSlice(t *testing.T) { - testCases := []struct { name string histogramDPS pmetric.HistogramDataPointSlice @@ -791,7 +784,6 @@ func TestIsStaleNaNInf_HistogramDataPointSlice(t *testing.T) { tc.boolAssertFunc(t, isStaleNanInf) }) } - } func TestCalculateDeltaDatapoints_ExponentialHistogramDataPointSlice(t *testing.T) { @@ -829,7 +821,6 @@ func TestCalculateDeltaDatapoints_ExponentialHistogramDataPointSlice(t *testing. histogramDP.SetSum(17.13) histogramDP.Attributes().PutStr("label1", "value1") return histogramDPS - }(), expectedDatapoint: dataPoint{ name: "foo", @@ -892,11 +883,9 @@ func TestCalculateDeltaDatapoints_ExponentialHistogramDataPointSlice(t *testing. assert.Equal(t, tc.expectedDatapoint, dps[0]) }) } - } func TestIsStaleNaNInf_ExponentialHistogramDataPointSlice(t *testing.T) { - testCases := []struct { name string histogramDPS pmetric.ExponentialHistogramDataPointSlice @@ -1089,7 +1078,6 @@ func TestIsStaleNaNInf_ExponentialHistogramDataPointSlice(t *testing.T) { tc.boolAssertFunc(t, isStaleNaNInf) }) } - } func TestCalculateDeltaDatapoints_SummaryDataPointSlice(t *testing.T) { @@ -1170,7 +1158,6 @@ func TestCalculateDeltaDatapoints_SummaryDataPointSlice(t *testing.T) { assert.Equal(t, tc.expectedDatapoint[i].labels, dp.labels) assert.InDelta(t, tc.expectedDatapoint[i].value, dp.value, 0.002) } - } }) } @@ -1366,7 +1353,6 @@ func TestIsStaleNaNInf_SummaryDataPointSlice(t *testing.T) { tc.expectedBoolAssert(t, isStaleNaNInf) }) } - } func TestCreateLabels(t *testing.T) { @@ -1455,7 +1441,6 @@ func TestGetDataPoints(t *testing.T) { metadata := generateTestMetricMetadata("namespace", time.Now().UnixNano()/int64(time.Millisecond), "log-group", "log-stream", "cloudwatch-otel", metric.Type()) t.Run(tc.name, func(t *testing.T) { - if tc.isPrometheusMetrics { metadata.receiver = prometheusReceiver } else { diff --git a/exporter/awsemfexporter/emf_exporter.go b/exporter/awsemfexporter/emf_exporter.go index adeaa48b6354..34b9eaf76856 100644 --- a/exporter/awsemfexporter/emf_exporter.go +++ b/exporter/awsemfexporter/emf_exporter.go @@ -27,6 +27,10 @@ const ( // OutputDestination Options outputDestinationCloudWatch = "cloudwatch" outputDestinationStdout = "stdout" + + // AppSignals EMF config + appSignalsMetricNamespace = "ApplicationSignals" + appSignalsLogGroupNamePrefix = "/aws/application-signals/" ) type emfExporter struct { @@ -42,7 +46,7 @@ type emfExporter struct { } // newEmfExporter creates a new exporter using exporterhelper -func newEmfExporter(config *Config, set exporter.CreateSettings) (*emfExporter, error) { +func newEmfExporter(config *Config, set exporter.Settings) (*emfExporter, error) { if config == nil { return nil, errors.New("emf exporter config is nil") } @@ -55,10 +59,23 @@ func newEmfExporter(config *Config, set exporter.CreateSettings) (*emfExporter, return nil, err } + var userAgentExtras []string + if config.isAppSignalsEnabled() { + userAgentExtras = append(userAgentExtras, "AppSignals") + } + // create CWLogs client with aws session config - svcStructuredLog := cwlogs.NewClient(set.Logger, awsConfig, set.BuildInfo, config.LogGroupName, config.LogRetention, config.Tags, session, metadata.Type.String()) + svcStructuredLog := cwlogs.NewClient(set.Logger, + awsConfig, + set.BuildInfo, + config.LogGroupName, + config.LogRetention, + config.Tags, + session, + metadata.Type.String(), + cwlogs.WithUserAgentExtras(userAgentExtras...), + ) collectorIdentifier, err := uuid.NewRandom() - if err != nil { return nil, err } @@ -118,7 +135,6 @@ func (emf *emfExporter) pushMetricsData(_ context.Context, md pmetric.Metrics) e fmt.Println(*putLogEvent.InputLogEvent.Message) } } else if strings.EqualFold(outputDestination, outputDestinationCloudWatch) { - emfPusher := emf.getPusher(putLogEvent.StreamKey) if emfPusher != nil { returnError := emfPusher.AddLogEntry(putLogEvent) @@ -149,7 +165,6 @@ func (emf *emfExporter) pushMetricsData(_ context.Context, md pmetric.Metrics) e } func (emf *emfExporter) getPusher(key cwlogs.StreamKey) cwlogs.Pusher { - var ok bool if _, ok = emf.pusherMap[key]; !ok { emf.pusherMap[key] = cwlogs.NewPusher(key, emf.retryCnt, *emf.svcStructuredLog, emf.config.logger) diff --git a/exporter/awsemfexporter/emf_exporter_test.go b/exporter/awsemfexporter/emf_exporter_test.go index 6e9c90f1cc25..a031d3d2b160 100644 --- a/exporter/awsemfexporter/emf_exporter_test.go +++ b/exporter/awsemfexporter/emf_exporter_test.go @@ -53,7 +53,7 @@ func TestConsumeMetrics(t *testing.T) { expCfg := factory.CreateDefaultConfig().(*Config) expCfg.Region = "us-west-2" expCfg.MaxRetries = 0 - exp, err := newEmfExporter(expCfg, exportertest.NewNopCreateSettings()) + exp, err := newEmfExporter(expCfg, exportertest.NewNopSettings()) assert.NoError(t, err) assert.NotNil(t, exp) @@ -94,7 +94,7 @@ func TestConsumeMetricsWithNaNValues(t *testing.T) { expCfg.Region = "us-west-2" expCfg.MaxRetries = 0 expCfg.OutputDestination = "stdout" - exp, err := newEmfExporter(expCfg, exportertest.NewNopCreateSettings()) + exp, err := newEmfExporter(expCfg, exportertest.NewNopSettings()) assert.NoError(t, err) assert.NotNil(t, exp) md := tc.generateFunc(tc.testName) @@ -102,7 +102,6 @@ func TestConsumeMetricsWithNaNValues(t *testing.T) { require.NoError(t, exp.shutdown(ctx)) }) } - } func TestConsumeMetricsWithInfValues(t *testing.T) { @@ -134,7 +133,7 @@ func TestConsumeMetricsWithInfValues(t *testing.T) { expCfg.Region = "us-west-2" expCfg.MaxRetries = 0 expCfg.OutputDestination = "stdout" - exp, err := newEmfExporter(expCfg, exportertest.NewNopCreateSettings()) + exp, err := newEmfExporter(expCfg, exportertest.NewNopSettings()) assert.NoError(t, err) assert.NotNil(t, exp) md := tc.generateFunc(tc.testName) @@ -142,7 +141,6 @@ func TestConsumeMetricsWithInfValues(t *testing.T) { require.NoError(t, exp.shutdown(ctx)) }) } - } func TestConsumeMetricsWithOutputDestination(t *testing.T) { @@ -153,7 +151,7 @@ func TestConsumeMetricsWithOutputDestination(t *testing.T) { expCfg.Region = "us-west-2" expCfg.MaxRetries = 0 expCfg.OutputDestination = "stdout" - exp, err := newEmfExporter(expCfg, exportertest.NewNopCreateSettings()) + exp, err := newEmfExporter(expCfg, exportertest.NewNopSettings()) assert.NoError(t, err) assert.NotNil(t, exp) @@ -174,7 +172,7 @@ func TestConsumeMetricsWithLogGroupStreamConfig(t *testing.T) { expCfg.MaxRetries = defaultRetryCount expCfg.LogGroupName = "test-logGroupName" expCfg.LogStreamName = "test-logStreamName" - exp, err := newEmfExporter(expCfg, exportertest.NewNopCreateSettings()) + exp, err := newEmfExporter(expCfg, exportertest.NewNopSettings()) assert.NoError(t, err) assert.NotNil(t, exp) @@ -201,7 +199,7 @@ func TestConsumeMetricsWithLogGroupStreamValidPlaceholder(t *testing.T) { expCfg.MaxRetries = defaultRetryCount expCfg.LogGroupName = "/aws/ecs/containerinsights/{ClusterName}/performance" expCfg.LogStreamName = "{TaskId}" - exp, err := newEmfExporter(expCfg, exportertest.NewNopCreateSettings()) + exp, err := newEmfExporter(expCfg, exportertest.NewNopSettings()) assert.NoError(t, err) assert.NotNil(t, exp) @@ -232,7 +230,7 @@ func TestConsumeMetricsWithOnlyLogStreamPlaceholder(t *testing.T) { expCfg.MaxRetries = defaultRetryCount expCfg.LogGroupName = "test-logGroupName" expCfg.LogStreamName = "{TaskId}" - exp, err := newEmfExporter(expCfg, exportertest.NewNopCreateSettings()) + exp, err := newEmfExporter(expCfg, exportertest.NewNopSettings()) assert.NoError(t, err) assert.NotNil(t, exp) @@ -263,7 +261,7 @@ func TestConsumeMetricsWithWrongPlaceholder(t *testing.T) { expCfg.MaxRetries = defaultRetryCount expCfg.LogGroupName = "test-logGroupName" expCfg.LogStreamName = "{WrongKey}" - exp, err := newEmfExporter(expCfg, exportertest.NewNopCreateSettings()) + exp, err := newEmfExporter(expCfg, exportertest.NewNopSettings()) assert.NoError(t, err) assert.NotNil(t, exp) @@ -294,7 +292,7 @@ func TestPushMetricsDataWithErr(t *testing.T) { expCfg.MaxRetries = 0 expCfg.LogGroupName = "test-logGroupName" expCfg.LogStreamName = "test-logStreamName" - exp, err := newEmfExporter(expCfg, exportertest.NewNopCreateSettings()) + exp, err := newEmfExporter(expCfg, exportertest.NewNopSettings()) assert.NoError(t, err) assert.NotNil(t, exp) @@ -314,22 +312,22 @@ func TestPushMetricsDataWithErr(t *testing.T) { metricNames: []string{"metric_1", "metric_2"}, metricValues: [][]float64{{100}, {4}}, }) - assert.NotNil(t, exp.pushMetricsData(ctx, md)) - assert.NotNil(t, exp.pushMetricsData(ctx, md)) - assert.Nil(t, exp.pushMetricsData(ctx, md)) - assert.Nil(t, exp.shutdown(ctx)) + assert.Error(t, exp.pushMetricsData(ctx, md)) + assert.Error(t, exp.pushMetricsData(ctx, md)) + assert.NoError(t, exp.pushMetricsData(ctx, md)) + assert.NoError(t, exp.shutdown(ctx)) } func TestNewExporterWithoutConfig(t *testing.T) { factory := NewFactory() expCfg := factory.CreateDefaultConfig().(*Config) - settings := exportertest.NewNopCreateSettings() + settings := exportertest.NewNopSettings() t.Setenv("AWS_STS_REGIONAL_ENDPOINTS", "fake") exp, err := newEmfExporter(expCfg, settings) assert.Error(t, err) assert.Nil(t, exp) - assert.Equal(t, settings.Logger, expCfg.logger) + assert.Equal(t, expCfg.logger, settings.Logger) } func TestNewExporterWithMetricDeclarations(t *testing.T) { @@ -360,7 +358,7 @@ func TestNewExporterWithMetricDeclarations(t *testing.T) { expCfg.MetricDeclarations = mds obs, logs := observer.New(zap.WarnLevel) - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() params.Logger = zap.New(obs) exp, err := newEmfExporter(expCfg, params) @@ -370,9 +368,9 @@ func TestNewExporterWithMetricDeclarations(t *testing.T) { assert.NoError(t, err) // Invalid metric declaration should be filtered out - assert.Equal(t, 3, len(exp.config.MetricDeclarations)) + assert.Len(t, exp.config.MetricDeclarations, 3) // Invalid dimensions (> 10 dims) should be filtered out - assert.Equal(t, 1, len(exp.config.MetricDeclarations[2].Dimensions)) + assert.Len(t, exp.config.MetricDeclarations[2].Dimensions, 1) // Test output warning logs expectedLogs := []observer.LoggedEntry{ @@ -396,7 +394,7 @@ func TestNewExporterWithMetricDeclarations(t *testing.T) { } func TestNewExporterWithoutSession(t *testing.T) { - exp, err := newEmfExporter(nil, exportertest.NewNopCreateSettings()) + exp, err := newEmfExporter(nil, exportertest.NewNopSettings()) assert.Error(t, err) assert.Nil(t, exp) } @@ -415,11 +413,11 @@ func TestWrapErrorIfBadRequest(t *testing.T) { func TestNewEmfExporterWithoutConfig(t *testing.T) { factory := NewFactory() expCfg := factory.CreateDefaultConfig().(*Config) - settings := exportertest.NewNopCreateSettings() + settings := exportertest.NewNopSettings() t.Setenv("AWS_STS_REGIONAL_ENDPOINTS", "fake") exp, err := newEmfExporter(expCfg, settings) assert.Error(t, err) assert.Nil(t, exp) - assert.Equal(t, settings.Logger, expCfg.logger) + assert.Equal(t, expCfg.logger, settings.Logger) } diff --git a/exporter/awsemfexporter/factory.go b/exporter/awsemfexporter/factory.go index d0cf78a5dd2d..5f159b4b9f57 100644 --- a/exporter/awsemfexporter/factory.go +++ b/exporter/awsemfexporter/factory.go @@ -52,7 +52,7 @@ func createDefaultConfig() component.Config { } // createMetricsExporter creates a metrics exporter based on this config. -func createMetricsExporter(ctx context.Context, params exporter.CreateSettings, config component.Config) (exporter.Metrics, error) { +func createMetricsExporter(ctx context.Context, params exporter.Settings, config component.Config) (exporter.Metrics, error) { expCfg := config.(*Config) emfExp, err := newEmfExporter(expCfg, params) @@ -60,7 +60,7 @@ func createMetricsExporter(ctx context.Context, params exporter.CreateSettings, return nil, err } - exporter, err := exporterhelper.NewMetricsExporter( + exporter, err := exporterhelper.NewMetrics( ctx, params, config, diff --git a/exporter/awsemfexporter/factory_test.go b/exporter/awsemfexporter/factory_test.go index d1b71fec7f84..891ac4266bcc 100644 --- a/exporter/awsemfexporter/factory_test.go +++ b/exporter/awsemfexporter/factory_test.go @@ -26,7 +26,7 @@ func TestCreateDefaultConfig(t *testing.T) { assert.NotNil(t, cfg.(*Config).logger) } -func TestCreateTracesExporter(t *testing.T) { +func TestCreateTraces(t *testing.T) { cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml")) require.NoError(t, err) factory := NewFactory() @@ -34,15 +34,15 @@ func TestCreateTracesExporter(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "1").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) ctx := context.Background() - exporter, err := factory.CreateTracesExporter(ctx, exportertest.NewNopCreateSettings(), cfg) + exporter, err := factory.CreateTraces(ctx, exportertest.NewNopSettings(), cfg) assert.Error(t, err) assert.Nil(t, exporter) } -func TestCreateMetricsExporter(t *testing.T) { +func TestCreateMetrics(t *testing.T) { cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml")) require.NoError(t, err) factory := NewFactory() @@ -50,10 +50,10 @@ func TestCreateMetricsExporter(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "1").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) ctx := context.Background() - exporter, err := factory.CreateMetricsExporter(ctx, exportertest.NewNopCreateSettings(), cfg) + exporter, err := factory.CreateMetrics(ctx, exportertest.NewNopSettings(), cfg) assert.NoError(t, err) assert.NotNil(t, exporter) } diff --git a/exporter/awsemfexporter/generated_component_test.go b/exporter/awsemfexporter/generated_component_test.go index d5d844a7f033..de32738b4316 100644 --- a/exporter/awsemfexporter/generated_component_test.go +++ b/exporter/awsemfexporter/generated_component_test.go @@ -32,13 +32,13 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "metrics", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg) }, }, } @@ -50,21 +50,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(exporter.Logs) require.True(t, ok) diff --git a/exporter/awsemfexporter/go.mod b/exporter/awsemfexporter/go.mod index 0fbb5e3c9dee..b7275ec2c07b 100644 --- a/exporter/awsemfexporter/go.mod +++ b/exporter/awsemfexporter/go.mod @@ -1,70 +1,74 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsemfexporter -go 1.21.0 +go 1.22.0 require ( - github.com/aws/aws-sdk-go v1.53.11 + github.com/aws/aws-sdk-go v1.55.5 github.com/google/uuid v1.6.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutil v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/cwlogs v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/metrics v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/featuregate v1.9.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutil v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/cwlogs v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/metrics v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/featuregate v1.22.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/semconv v0.116.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 ) require ( - github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect github.com/stretchr/objx v0.5.2 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configretry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + go.opentelemetry.io/collector/config/configretry v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/consumer v1.22.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/awsemfexporter/go.sum b/exporter/awsemfexporter/go.sum index 8cb4c456847c..8b86b4d82554 100644 --- a/exporter/awsemfexporter/go.sum +++ b/exporter/awsemfexporter/go.sum @@ -1,23 +1,21 @@ -github.com/aws/aws-sdk-go v1.53.11 h1:KcmduYvX15rRqt4ZU/7jKkmDxU/G87LJ9MUI0yQJh00= -github.com/aws/aws-sdk-go v1.53.11/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= -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/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= +github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -37,8 +35,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -54,62 +52,74 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -127,20 +137,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -149,12 +159,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/exporter/awsemfexporter/grouped_metric.go b/exporter/awsemfexporter/grouped_metric.go index dd3426cdc2e9..5ba39b93f787 100644 --- a/exporter/awsemfexporter/grouped_metric.go +++ b/exporter/awsemfexporter/grouped_metric.go @@ -36,7 +36,6 @@ func addToGroupedMetric( config *Config, calculators *emfCalculators, ) error { - dps := getDataPoints(pmd, metadata, config.logger) if dps == nil || dps.Len() == 0 { return nil @@ -107,7 +106,6 @@ func addToGroupedMetric( } } } - } return nil } @@ -194,6 +192,11 @@ func translateUnit(metric pmetric.Metric, descriptor map[string]MetricDescriptor } } switch unit { + case "1": + unit = "" + case "ns": + // CloudWatch doesn't support Nanoseconds + unit = "" case "ms": unit = "Milliseconds" case "s": @@ -202,7 +205,7 @@ func translateUnit(metric pmetric.Metric, descriptor map[string]MetricDescriptor unit = "Microseconds" case "By": unit = "Bytes" - case "Bi": + case "bit": unit = "Bits" } return unit diff --git a/exporter/awsemfexporter/grouped_metric_test.go b/exporter/awsemfexporter/grouped_metric_test.go index 47bee6e50fea..8688cfaaca03 100644 --- a/exporter/awsemfexporter/grouped_metric_test.go +++ b/exporter/awsemfexporter/grouped_metric_test.go @@ -116,11 +116,11 @@ func TestAddToGroupedMetric(t *testing.T) { assert.NoError(t, err) } - assert.Equal(t, 1, len(groupedMetrics)) + assert.Len(t, groupedMetrics, 1) for _, v := range groupedMetrics { assert.Equal(t, len(tc.expectedMetricInfo), len(v.metrics)) assert.Equal(t, tc.expectedMetricInfo, v.metrics) - assert.Equal(t, 2, len(v.labels)) + assert.Len(t, v.labels, 2) assert.Equal(t, generateTestMetricMetadata(namespace, timestamp, logGroup, logStreamName, instrumentationLibName, tc.expectedMetricType), v.metadata) assert.Equal(t, tc.expectedLabels, v.labels) } @@ -158,7 +158,7 @@ func TestAddToGroupedMetric(t *testing.T) { assert.NoError(t, err) } - assert.Equal(t, 4, len(groupedMetrics)) + assert.Len(t, groupedMetrics, 4) for _, group := range groupedMetrics { for metricName, metricInfo := range group.metrics { switch metricName { @@ -230,7 +230,7 @@ func TestAddToGroupedMetric(t *testing.T) { assert.NoError(t, err) } - assert.Equal(t, 4, len(groupedMetrics)) + assert.Len(t, groupedMetrics, 4) for _, group := range groupedMetrics { for metricName, metricInfo := range group.metrics { switch metricName { @@ -348,7 +348,7 @@ func TestAddToGroupedMetric(t *testing.T) { ) assert.NoError(t, err) } - assert.Equal(t, 1, len(groupedMetrics)) + assert.Len(t, groupedMetrics, 1) labels := map[string]string{ oTellibDimensionKey: instrumentationLibName, @@ -389,7 +389,7 @@ func TestAddToGroupedMetric(t *testing.T) { emfCalcs, ) assert.NoError(t, err) - assert.Equal(t, 0, len(groupedMetrics)) + assert.Empty(t, groupedMetrics) // Test output warning logs expectedLogs := []observer.LoggedEntry{ @@ -405,7 +405,6 @@ func TestAddToGroupedMetric(t *testing.T) { assert.Equal(t, 1, logs.Len()) assert.Equal(t, expectedLogs, logs.AllUntimed()) }) - } func TestAddKubernetesWrapper(t *testing.T) { @@ -435,7 +434,7 @@ func TestAddKubernetesWrapper(t *testing.T) { jsonBytes, _ := json.Marshal(expectedCreatedObj) addKubernetesWrapper(inputs) - assert.Equal(t, string(jsonBytes), inputs["kubernetes"], "The created and expected objects should be the same") + assert.JSONEq(t, string(jsonBytes), inputs["kubernetes"], "The created and expected objects should be the same") }) } @@ -462,7 +461,7 @@ func BenchmarkAddToGroupedMetric(b *testing.B) { for i := 0; i < numMetrics; i++ { metadata := generateTestMetricMetadata("namespace", int64(1596151098037), "log-group", "log-stream", "cloudwatch-otel", metrics.At(i).Type()) err := addToGroupedMetric(metrics.At(i), groupedMetrics, metadata, true, nil, testCfg, emfCalcs) - assert.Nil(b, err) + assert.NoError(b, err) } } } @@ -489,10 +488,12 @@ func TestTranslateUnit(t *testing.T) { translateUnitCases := map[string]string{ "Count": "Count", "ms": "Milliseconds", + "ns": "", + "1": "", "s": "Seconds", "us": "Microseconds", "By": "Bytes", - "Bi": "Bits", + "bit": "Bits", } for input, output := range translateUnitCases { t.Run(input, func(_ *testing.T) { diff --git a/exporter/awsemfexporter/internal/metadata/generated_status.go b/exporter/awsemfexporter/internal/metadata/generated_status.go index 8b4abca7c235..63cdd1598310 100644 --- a/exporter/awsemfexporter/internal/metadata/generated_status.go +++ b/exporter/awsemfexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("awsemf") + Type = component.MustNewType("awsemf") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsemfexporter" ) const ( diff --git a/exporter/awsemfexporter/internal/metadata/generated_telemetry.go b/exporter/awsemfexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index c08973934847..000000000000 --- a/exporter/awsemfexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/awsemf") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/awsemf") -} diff --git a/exporter/awsemfexporter/internal/metadata/generated_telemetry_test.go b/exporter/awsemfexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 534349556f8b..000000000000 --- a/exporter/awsemfexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/awsemf", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/awsemf", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/awsemfexporter/metadata.yaml b/exporter/awsemfexporter/metadata.yaml index e1eefcb96229..78a4139e8fbb 100644 --- a/exporter/awsemfexporter/metadata.yaml +++ b/exporter/awsemfexporter/metadata.yaml @@ -1,5 +1,4 @@ type: awsemf -scope_name: otelcol/awsemf status: class: exporter @@ -7,7 +6,8 @@ status: beta: [metrics] distributions: [contrib] codeowners: - active: [Aneurysm9, shaochengwang, mxiamxia, bryan-aguilar] + active: [Aneurysm9, mxiamxia, bryan-aguilar] + emeritus: [shaochengwang] tests: config: diff --git a/exporter/awsemfexporter/metric_declaration_test.go b/exporter/awsemfexporter/metric_declaration_test.go index 00706b006a33..b50996465344 100644 --- a/exporter/awsemfexporter/metric_declaration_test.go +++ b/exporter/awsemfexporter/metric_declaration_test.go @@ -226,7 +226,7 @@ func TestMetricDeclarationInit(t *testing.T) { } err := m.init(logger) assert.NoError(t, err) - assert.Equal(t, 3, len(m.metricRegexList)) + assert.Len(t, m.metricRegexList, 3) }) t.Run("with dimensions", func(t *testing.T) { @@ -239,8 +239,8 @@ func TestMetricDeclarationInit(t *testing.T) { } err := m.init(logger) assert.NoError(t, err) - assert.Equal(t, 3, len(m.metricRegexList)) - assert.Equal(t, 2, len(m.Dimensions)) + assert.Len(t, m.metricRegexList, 3) + assert.Len(t, m.Dimensions, 2) }) // Test removal of dimension sets with more than 10 elements @@ -256,8 +256,8 @@ func TestMetricDeclarationInit(t *testing.T) { obsLogger := zap.New(obs) err := m.init(obsLogger) assert.NoError(t, err) - assert.Equal(t, 3, len(m.metricRegexList)) - assert.Equal(t, 1, len(m.Dimensions)) + assert.Len(t, m.metricRegexList, 3) + assert.Len(t, m.Dimensions, 1) // Check logged warning message expectedLogs := []observer.LoggedEntry{{ Entry: zapcore.Entry{Level: zap.WarnLevel, Message: "Dropped dimension set: > 10 dimensions specified."}, @@ -281,7 +281,7 @@ func TestMetricDeclarationInit(t *testing.T) { obsLogger := zap.New(obs) err := m.init(obsLogger) assert.NoError(t, err) - assert.Equal(t, 1, len(m.Dimensions)) + assert.Len(t, m.Dimensions, 1) assert.Equal(t, []string{"a", "b", "c"}, m.Dimensions[0]) // Check logged warning message expectedLogs := []observer.LoggedEntry{ @@ -324,7 +324,7 @@ func TestMetricDeclarationInit(t *testing.T) { } err := m.init(logger) assert.NoError(t, err) - assert.Equal(t, 2, len(m.LabelMatchers)) + assert.Len(t, m.LabelMatchers, 2) assert.Equal(t, ";", m.LabelMatchers[0].Separator) assert.Equal(t, ".+", m.LabelMatchers[0].Regex) assert.NotNil(t, m.LabelMatchers[0].compiledRegex) diff --git a/exporter/awsemfexporter/metric_translator.go b/exporter/awsemfexporter/metric_translator.go index 26aba7bd368e..b5d9330503ce 100644 --- a/exporter/awsemfexporter/metric_translator.go +++ b/exporter/awsemfexporter/metric_translator.go @@ -7,6 +7,7 @@ import ( "encoding/json" "fmt" "reflect" + "strconv" "time" "go.opentelemetry.io/collector/pdata/pmetric" @@ -29,6 +30,9 @@ const ( prometheusReceiver = "prometheus" attributeReceiver = "receiver" fieldPrometheusMetricType = "prom_metric_type" + + // metric attributes for AWS EMF, not to be treated as metric labels + emfStorageResolutionAttribute = "aws.emf.storage_resolution" ) var fieldPrometheusTypes = map[pmetric.MetricType]string{ @@ -45,10 +49,16 @@ type cWMetrics struct { fields map[string]any } +type cWMetricInfo struct { + Name string + Unit string + StorageResolution int +} + type cWMeasurement struct { Namespace string Dimensions [][]string - Metrics []map[string]string + Metrics []cWMetricInfo } type cWMetricStats struct { @@ -156,7 +166,7 @@ func (mt metricTranslator) translateOTelToGroupedMetric(rm pmetric.ResourceMetri // translateGroupedMetricToCWMetric converts Grouped Metric format to CloudWatch Metric format. func translateGroupedMetricToCWMetric(groupedMetric *groupedMetric, config *Config) *cWMetrics { - labels := groupedMetric.labels + labels := filterAWSEMFAttributes(groupedMetric.labels) fieldsLength := len(labels) + len(groupedMetric.metrics) isPrometheusMetric := groupedMetric.metadata.receiver == prometheusReceiver @@ -198,7 +208,7 @@ func translateGroupedMetricToCWMetric(groupedMetric *groupedMetric, config *Conf // groupedMetricToCWMeasurement creates a single CW Measurement from a grouped metric. func groupedMetricToCWMeasurement(groupedMetric *groupedMetric, config *Config) cWMeasurement { - labels := groupedMetric.labels + labels := filterAWSEMFAttributes(groupedMetric.labels) dimensionRollupOption := config.DimensionRollupOption // Create a dimension set containing list of label names @@ -208,6 +218,7 @@ func groupedMetricToCWMeasurement(groupedMetric *groupedMetric, config *Config) dimSet[idx] = labelName idx++ } + dimensions := [][]string{dimSet} // Apply single/zero dimension rollup to labels @@ -228,14 +239,20 @@ func groupedMetricToCWMeasurement(groupedMetric *groupedMetric, config *Config) // Add on rolled-up dimensions dimensions = append(dimensions, rollupDimensionArray...) - metrics := make([]map[string]string, len(groupedMetric.metrics)) + metrics := make([]cWMetricInfo, len(groupedMetric.metrics)) idx = 0 for metricName, metricInfo := range groupedMetric.metrics { - metrics[idx] = map[string]string{ - "Name": metricName, + metrics[idx] = cWMetricInfo{ + Name: metricName, + StorageResolution: 60, } if metricInfo.unit != "" { - metrics[idx]["Unit"] = metricInfo.unit + metrics[idx].Unit = metricInfo.unit + } + if storRes, ok := groupedMetric.labels[emfStorageResolutionAttribute]; ok { + if storResInt, err := strconv.Atoi(storRes); err == nil { + metrics[idx].StorageResolution = storResInt + } } idx++ } @@ -250,7 +267,7 @@ func groupedMetricToCWMeasurement(groupedMetric *groupedMetric, config *Config) // groupedMetricToCWMeasurementsWithFilters filters the grouped metric using the given list of metric // declarations and returns the corresponding list of CW Measurements. func groupedMetricToCWMeasurementsWithFilters(groupedMetric *groupedMetric, config *Config) (cWMeasurements []cWMeasurement) { - labels := groupedMetric.labels + labels := filterAWSEMFAttributes(groupedMetric.labels) // Filter metric declarations by labels metricDeclarations := make([]*MetricDeclaration, 0, len(config.MetricDeclarations)) @@ -278,7 +295,7 @@ func groupedMetricToCWMeasurementsWithFilters(groupedMetric *groupedMetric, conf // Group metrics by matched metric declarations type metricDeclarationGroup struct { metricDeclIdxList []int - metrics []map[string]string + metrics []cWMetricInfo } metricDeclGroups := make(map[string]*metricDeclarationGroup) @@ -299,11 +316,17 @@ func groupedMetricToCWMeasurementsWithFilters(groupedMetric *groupedMetric, conf continue } - metric := map[string]string{ - "Name": metricName, + metric := cWMetricInfo{ + Name: metricName, + StorageResolution: 60, } if metricInfo.unit != "" { - metric["Unit"] = metricInfo.unit + metric.Unit = metricInfo.unit + } + if storRes, ok := groupedMetric.labels[emfStorageResolutionAttribute]; ok { + if storResInt, err := strconv.Atoi(storRes); err == nil { + metric.StorageResolution = storResInt + } } metricDeclKey := fmt.Sprint(metricDeclIdx) if group, ok := metricDeclGroups[metricDeclKey]; ok { @@ -311,7 +334,7 @@ func groupedMetricToCWMeasurementsWithFilters(groupedMetric *groupedMetric, conf } else { metricDeclGroups[metricDeclKey] = &metricDeclarationGroup{ metricDeclIdxList: metricDeclIdx, - metrics: []map[string]string{metric}, + metrics: []cWMetricInfo{metric}, } } } @@ -406,7 +429,6 @@ func translateCWMetricToEMF(cWMetric *cWMetrics, config *Config) (*cwlogs.Event, "CloudWatchMetrics": cWMetric.measurements, "Timestamp": cWMetric.timestampMs, } - } } @@ -450,7 +472,6 @@ func translateCWMetricToEMF(cWMetric *cWMetrics, config *Config) (*cwlogs.Event, func translateGroupedMetricToEmf(groupedMetric *groupedMetric, config *Config, defaultLogStream string) (*cwlogs.Event, error) { cWMetric := translateGroupedMetricToCWMetric(groupedMetric, config) event, err := translateCWMetricToEMF(cWMetric, config) - if err != nil { return nil, err } @@ -467,3 +488,14 @@ func translateGroupedMetricToEmf(groupedMetric *groupedMetric, config *Config, d return event, nil } + +func filterAWSEMFAttributes(labels map[string]string) map[string]string { + // remove any labels that are attributes specific to AWS EMF Exporter + filteredLabels := make(map[string]string) + for labelName := range labels { + if labelName != emfStorageResolutionAttribute { + filteredLabels[labelName] = labels[labelName] + } + } + return filteredLabels +} diff --git a/exporter/awsemfexporter/metric_translator_test.go b/exporter/awsemfexporter/metric_translator_test.go index 1ac411048e6d..3a8f9268624c 100644 --- a/exporter/awsemfexporter/metric_translator_test.go +++ b/exporter/awsemfexporter/metric_translator_test.go @@ -14,7 +14,7 @@ import ( "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "go.uber.org/zap" "go.uber.org/zap/zapcore" "go.uber.org/zap/zaptest/observer" @@ -163,11 +163,11 @@ func normalizeDimensionality(dims [][]string) [][]string { } // hashMetricSlice hashes a metrics slice for equality checking. -func hashMetricSlice(metricSlice []map[string]string) []string { +func hashMetricSlice(metricSlice []cWMetricInfo) []string { // Convert to string for easier sorting stringified := make([]string, len(metricSlice)) for i, v := range metricSlice { - stringified[i] = v["Name"] + "," + v["Unit"] + stringified[i] = fmt.Sprint(v.Name) + "," + fmt.Sprint(v.Unit) + "," + fmt.Sprint(v.StorageResolution) } // Sort across metrics for equality checking sort.Strings(stringified) @@ -347,26 +347,25 @@ func TestTranslateOtToGroupedMetric(t *testing.T) { for _, tc := range testCases { t.Run(tc.testName, func(t *testing.T) { - groupedMetrics := make(map[any]*groupedMetric) err := translator.translateOTelToGroupedMetric(tc.metric, groupedMetrics, config) assert.NoError(t, err) assert.NotNil(t, groupedMetrics) - assert.Equal(t, 3, len(groupedMetrics)) + assert.Len(t, groupedMetrics, 3) for _, v := range groupedMetrics { assert.Equal(t, tc.expectedNamespace, v.metadata.namespace) switch { case v.metadata.metricDataType == pmetric.MetricTypeSum: - assert.Equal(t, 2, len(v.metrics)) + assert.Len(t, v.metrics, 2) assert.Equal(t, tc.counterLabels, v.labels) assert.Equal(t, counterSumMetrics, v.metrics) case v.metadata.metricDataType == pmetric.MetricTypeGauge: - assert.Equal(t, 2, len(v.metrics)) + assert.Len(t, v.metrics, 2) assert.Equal(t, tc.counterLabels, v.labels) assert.Equal(t, counterGaugeMetrics, v.metrics) case v.metadata.metricDataType == pmetric.MetricTypeHistogram: - assert.Equal(t, 1, len(v.metrics)) + assert.Len(t, v.metrics, 1) assert.Equal(t, tc.timerLabels, v.labels) assert.Equal(t, timerMetrics, v.metrics) default: @@ -383,7 +382,7 @@ func TestTranslateOtToGroupedMetric(t *testing.T) { groupedMetrics := make(map[any]*groupedMetric) err := translator.translateOTelToGroupedMetric(rm, groupedMetrics, config) assert.NoError(t, err) - assert.Equal(t, 0, len(groupedMetrics)) + assert.Empty(t, groupedMetrics) }) } @@ -398,24 +397,26 @@ func TestTranslateCWMetricToEMF(t *testing.T) { measurements: []cWMeasurement{{ Namespace: "test-emf", Dimensions: [][]string{{oTellibDimensionKey}, {oTellibDimensionKey, "spanName"}}, - Metrics: []map[string]string{{ - "Name": "spanCounter", - "Unit": "Count", + Metrics: []cWMetricInfo{{ + Name: "spanCounter", + Unit: "Count", + StorageResolution: 1, }}, }}, - expectedEMFLogEvent: "{\"OTelLib\":\"cloudwatch-otel\",\"Sources\":[\"cadvisor\",\"pod\",\"calculated\"],\"Version\":\"1\",\"_aws\":{\"CloudWatchMetrics\":[{\"Namespace\":\"test-emf\",\"Dimensions\":[[\"OTelLib\"],[\"OTelLib\",\"spanName\"]],\"Metrics\":[{\"Name\":\"spanCounter\",\"Unit\":\"Count\"}]}],\"Timestamp\":1596151098037},\"kubernetes\":{\"container_name\":\"cloudwatch-agent\",\"docker\":{\"container_id\":\"fc1b0a4c3faaa1808e187486a3a90cbea883dccaf2e2c46d4069d663b032a1ca\"},\"host\":\"ip-192-168-58-245.ec2.internal\",\"labels\":{\"controller-revision-hash\":\"5bdbf497dc\",\"name\":\"cloudwatch-agent\",\"pod-template-generation\":\"1\"},\"namespace_name\":\"amazon-cloudwatch\",\"pod_id\":\"e23f3413-af2e-4a98-89e0-5df2251e7f05\",\"pod_name\":\"cloudwatch-agent-26bl6\",\"pod_owners\":[{\"owner_kind\":\"DaemonSet\",\"owner_name\":\"cloudwatch-agent\"}]},\"spanCounter\":0,\"spanName\":\"test\"}", + expectedEMFLogEvent: "{\"OTelLib\":\"cloudwatch-otel\",\"Sources\":[\"cadvisor\",\"pod\",\"calculated\"],\"Version\":\"1\",\"_aws\":{\"CloudWatchMetrics\":[{\"Namespace\":\"test-emf\",\"Dimensions\":[[\"OTelLib\"],[\"OTelLib\",\"spanName\"]],\"Metrics\":[{\"Name\":\"spanCounter\",\"Unit\":\"Count\",\"StorageResolution\":1}]}],\"Timestamp\":1596151098037},\"kubernetes\":{\"container_name\":\"cloudwatch-agent\",\"docker\":{\"container_id\":\"fc1b0a4c3faaa1808e187486a3a90cbea883dccaf2e2c46d4069d663b032a1ca\"},\"host\":\"ip-192-168-58-245.ec2.internal\",\"labels\":{\"controller-revision-hash\":\"5bdbf497dc\",\"name\":\"cloudwatch-agent\",\"pod-template-generation\":\"1\"},\"namespace_name\":\"amazon-cloudwatch\",\"pod_id\":\"e23f3413-af2e-4a98-89e0-5df2251e7f05\",\"pod_name\":\"cloudwatch-agent-26bl6\",\"pod_owners\":[{\"owner_kind\":\"DaemonSet\",\"owner_name\":\"cloudwatch-agent\"}]},\"spanCounter\":0,\"spanName\":\"test\"}", }, "WithMeasurementAndEMFV0": { emfVersion: "0", measurements: []cWMeasurement{{ Namespace: "test-emf", Dimensions: [][]string{{oTellibDimensionKey}, {oTellibDimensionKey, "spanName"}}, - Metrics: []map[string]string{{ - "Name": "spanCounter", - "Unit": "Count", + Metrics: []cWMetricInfo{{ + Name: "spanCounter", + Unit: "Count", + StorageResolution: 60, }}, }}, - expectedEMFLogEvent: "{\"CloudWatchMetrics\":[{\"Namespace\":\"test-emf\",\"Dimensions\":[[\"OTelLib\"],[\"OTelLib\",\"spanName\"]],\"Metrics\":[{\"Name\":\"spanCounter\",\"Unit\":\"Count\"}]}],\"OTelLib\":\"cloudwatch-otel\",\"Sources\":[\"cadvisor\",\"pod\",\"calculated\"],\"Timestamp\":\"1596151098037\",\"Version\":\"0\",\"kubernetes\":{\"container_name\":\"cloudwatch-agent\",\"docker\":{\"container_id\":\"fc1b0a4c3faaa1808e187486a3a90cbea883dccaf2e2c46d4069d663b032a1ca\"},\"host\":\"ip-192-168-58-245.ec2.internal\",\"labels\":{\"controller-revision-hash\":\"5bdbf497dc\",\"name\":\"cloudwatch-agent\",\"pod-template-generation\":\"1\"},\"namespace_name\":\"amazon-cloudwatch\",\"pod_id\":\"e23f3413-af2e-4a98-89e0-5df2251e7f05\",\"pod_name\":\"cloudwatch-agent-26bl6\",\"pod_owners\":[{\"owner_kind\":\"DaemonSet\",\"owner_name\":\"cloudwatch-agent\"}]},\"spanCounter\":0,\"spanName\":\"test\"}", + expectedEMFLogEvent: "{\"CloudWatchMetrics\":[{\"Namespace\":\"test-emf\",\"Dimensions\":[[\"OTelLib\"],[\"OTelLib\",\"spanName\"]],\"Metrics\":[{\"Name\":\"spanCounter\",\"Unit\":\"Count\",\"StorageResolution\":60}]}],\"OTelLib\":\"cloudwatch-otel\",\"Sources\":[\"cadvisor\",\"pod\",\"calculated\"],\"Timestamp\":\"1596151098037\",\"Version\":\"0\",\"kubernetes\":{\"container_name\":\"cloudwatch-agent\",\"docker\":{\"container_id\":\"fc1b0a4c3faaa1808e187486a3a90cbea883dccaf2e2c46d4069d663b032a1ca\"},\"host\":\"ip-192-168-58-245.ec2.internal\",\"labels\":{\"controller-revision-hash\":\"5bdbf497dc\",\"name\":\"cloudwatch-agent\",\"pod-template-generation\":\"1\"},\"namespace_name\":\"amazon-cloudwatch\",\"pod_id\":\"e23f3413-af2e-4a98-89e0-5df2251e7f05\",\"pod_name\":\"cloudwatch-agent-26bl6\",\"pod_owners\":[{\"owner_kind\":\"DaemonSet\",\"owner_name\":\"cloudwatch-agent\"}]},\"spanCounter\":0,\"spanName\":\"test\"}", }, "WithNoMeasurementAndEMFV1": { emfVersion: "1", @@ -432,7 +433,6 @@ func TestTranslateCWMetricToEMF(t *testing.T) { for name, tc := range testCases { t.Run(name, func(_ *testing.T) { config := &Config{ - // include valid json string, a non-existing key, and keys whose value are not json/string ParseJSONEncodedAttributeValues: []string{"kubernetes", "Sources", "NonExistingAttributeKey", "spanName", "spanCounter"}, Version: tc.emfVersion, @@ -459,7 +459,6 @@ func TestTranslateCWMetricToEMF(t *testing.T) { assert.Equal(t, tc.expectedEMFLogEvent, *emfLogEvent.InputLogEvent.Message) }) } - } func TestTranslateGroupedMetricToCWMetric(t *testing.T) { @@ -496,10 +495,11 @@ func TestTranslateGroupedMetricToCWMetric(t *testing.T) { { Namespace: namespace, Dimensions: [][]string{{"label1"}}, - Metrics: []map[string]string{ + Metrics: []cWMetricInfo{ { - "Name": "metric1", - "Unit": "Count", + Name: "metric1", + Unit: "Count", + StorageResolution: 60, }, }, }, @@ -541,10 +541,11 @@ func TestTranslateGroupedMetricToCWMetric(t *testing.T) { { Namespace: namespace, Dimensions: [][]string{{"label1"}}, - Metrics: []map[string]string{ + Metrics: []cWMetricInfo{ { - "Name": "metric1", - "Unit": "Count", + Name: "metric1", + Unit: "Count", + StorageResolution: 60, }, }, }, @@ -590,18 +591,21 @@ func TestTranslateGroupedMetricToCWMetric(t *testing.T) { { Namespace: namespace, Dimensions: [][]string{{"label1", "label2"}}, - Metrics: []map[string]string{ + Metrics: []cWMetricInfo{ { - "Name": "metric1", - "Unit": "Count", + Name: "metric1", + Unit: "Count", + StorageResolution: 60, }, { - "Name": "metric2", - "Unit": "Count", + Name: "metric2", + Unit: "Count", + StorageResolution: 60, }, { - "Name": "metric3", - "Unit": "Seconds", + Name: "metric3", + Unit: "Seconds", + StorageResolution: 60, }, }, }, @@ -665,20 +669,22 @@ func TestTranslateGroupedMetricToCWMetric(t *testing.T) { { Namespace: namespace, Dimensions: [][]string{{"label1"}}, - Metrics: []map[string]string{ + Metrics: []cWMetricInfo{ { - "Name": "metric1", - "Unit": "Count", + Name: "metric1", + Unit: "Count", + StorageResolution: 60, }, }, }, { Namespace: namespace, Dimensions: [][]string{{"label1", "label2"}}, - Metrics: []map[string]string{ + Metrics: []cWMetricInfo{ { - "Name": "metric2", - "Unit": "Count", + Name: "metric2", + Unit: "Count", + StorageResolution: 60, }, }, }, @@ -749,10 +755,11 @@ func TestTranslateGroupedMetricToCWMetric(t *testing.T) { { Namespace: namespace, Dimensions: [][]string{{"label1"}}, - Metrics: []map[string]string{ + Metrics: []cWMetricInfo{ { - "Name": "metric1", - "Unit": "Count", + Name: "metric1", + Unit: "Count", + StorageResolution: 60, }, }, }, @@ -819,10 +826,11 @@ func TestGroupedMetricToCWMeasurement(t *testing.T) { cWMeasurement{ Namespace: namespace, Dimensions: [][]string{{"label1"}}, - Metrics: []map[string]string{ + Metrics: []cWMetricInfo{ { - "Name": "metric1", - "Unit": "Count", + Name: "metric1", + Unit: "Count", + StorageResolution: 60, }, }, }, @@ -859,18 +867,21 @@ func TestGroupedMetricToCWMeasurement(t *testing.T) { cWMeasurement{ Namespace: namespace, Dimensions: [][]string{{"label1", "label2"}}, - Metrics: []map[string]string{ + Metrics: []cWMetricInfo{ { - "Name": "metric1", - "Unit": "Count", + Name: "metric1", + Unit: "Count", + StorageResolution: 60, }, { - "Name": "metric2", - "Unit": "Count", + Name: "metric2", + Unit: "Count", + StorageResolution: 60, }, { - "Name": "metric3", - "Unit": "Seconds", + Name: "metric3", + Unit: "Seconds", + StorageResolution: 60, }, }, }, @@ -898,10 +909,11 @@ func TestGroupedMetricToCWMeasurement(t *testing.T) { cWMeasurement{ Namespace: namespace, Dimensions: [][]string{{"label1"}}, - Metrics: []map[string]string{ + Metrics: []cWMetricInfo{ { - "Name": "metric1", - "Unit": "Count", + Name: "metric1", + Unit: "Count", + StorageResolution: 60, }, }, }, @@ -943,18 +955,21 @@ func TestGroupedMetricToCWMeasurement(t *testing.T) { {"label2"}, {}, }, - Metrics: []map[string]string{ + Metrics: []cWMetricInfo{ { - "Name": "metric1", - "Unit": "Count", + Name: "metric1", + Unit: "Count", + StorageResolution: 60, }, { - "Name": "metric2", - "Unit": "Count", + Name: "metric2", + Unit: "Count", + StorageResolution: 60, }, { - "Name": "metric3", - "Unit": "Seconds", + Name: "metric3", + Unit: "Seconds", + StorageResolution: 60, }, }, }, @@ -1186,18 +1201,21 @@ func TestGroupedMetricToCWMeasurementsWithFilters(t *testing.T) { { Namespace: namespace, Dimensions: [][]string{{"a"}, {"a", "c"}}, - Metrics: []map[string]string{ + Metrics: []cWMetricInfo{ { - "Name": "metric1", - "Unit": "Count", + Name: "metric1", + Unit: "Count", + StorageResolution: 60, }, { - "Name": "metric2", - "Unit": "Count", + Name: "metric2", + Unit: "Count", + StorageResolution: 60, }, { - "Name": "metric3", - "Unit": "Seconds", + Name: "metric3", + Unit: "Seconds", + StorageResolution: 60, }, }, }, @@ -1223,30 +1241,33 @@ func TestGroupedMetricToCWMeasurementsWithFilters(t *testing.T) { { Namespace: namespace, Dimensions: [][]string{{"a"}, {"b"}, {"a", "c"}}, - Metrics: []map[string]string{ + Metrics: []cWMetricInfo{ { - "Name": "metric1", - "Unit": "Count", + Name: "metric1", + Unit: "Count", + StorageResolution: 60, }, }, }, { Namespace: namespace, Dimensions: [][]string{{"a"}, {"b"}}, - Metrics: []map[string]string{ + Metrics: []cWMetricInfo{ { - "Name": "metric2", - "Unit": "Count", + Name: "metric2", + Unit: "Count", + StorageResolution: 60, }, }, }, { Namespace: namespace, Dimensions: [][]string{{"a"}}, - Metrics: []map[string]string{ + Metrics: []cWMetricInfo{ { - "Name": "metric3", - "Unit": "Seconds", + Name: "metric3", + Unit: "Seconds", + StorageResolution: 60, }, }, }, @@ -1268,24 +1289,27 @@ func TestGroupedMetricToCWMeasurementsWithFilters(t *testing.T) { { Namespace: namespace, Dimensions: [][]string{{"a"}, {"b"}}, - Metrics: []map[string]string{ + Metrics: []cWMetricInfo{ { - "Name": "metric1", - "Unit": "Count", + Name: "metric1", + Unit: "Count", + StorageResolution: 60, }, { - "Name": "metric2", - "Unit": "Count", + Name: "metric2", + Unit: "Count", + StorageResolution: 60, }, }, }, { Namespace: namespace, Dimensions: [][]string{{"a"}}, - Metrics: []map[string]string{ + Metrics: []cWMetricInfo{ { - "Name": "metric3", - "Unit": "Seconds", + Name: "metric3", + Unit: "Seconds", + StorageResolution: 60, }, }, }, @@ -1307,14 +1331,16 @@ func TestGroupedMetricToCWMeasurementsWithFilters(t *testing.T) { { Namespace: namespace, Dimensions: [][]string{{"a"}, {"b"}}, - Metrics: []map[string]string{ + Metrics: []cWMetricInfo{ { - "Name": "metric1", - "Unit": "Count", + Name: "metric1", + Unit: "Count", + StorageResolution: 60, }, { - "Name": "metric2", - "Unit": "Count", + Name: "metric2", + Unit: "Count", + StorageResolution: 60, }, }, }, @@ -1337,18 +1363,21 @@ func TestGroupedMetricToCWMeasurementsWithFilters(t *testing.T) { Dimensions: [][]string{{}}, MetricNameSelectors: []string{"metric(1|3)"}, }, - }, []cWMeasurement{ + }, + []cWMeasurement{ { Namespace: namespace, Dimensions: [][]string{{}}, - Metrics: []map[string]string{ + Metrics: []cWMetricInfo{ { - "Name": "metric1", - "Unit": "Count", + Name: "metric1", + Unit: "Count", + StorageResolution: 60, }, { - "Name": "metric3", - "Unit": "Seconds", + Name: "metric3", + Unit: "Seconds", + StorageResolution: 60, }, }, }, @@ -1382,18 +1411,21 @@ func TestGroupedMetricToCWMeasurementsWithFilters(t *testing.T) { { Namespace: namespace, Dimensions: [][]string{{"b"}}, - Metrics: []map[string]string{ + Metrics: []cWMetricInfo{ { - "Name": "metric1", - "Unit": "Count", + Name: "metric1", + Unit: "Count", + StorageResolution: 60, }, { - "Name": "metric2", - "Unit": "Count", + Name: "metric2", + Unit: "Count", + StorageResolution: 60, }, { - "Name": "metric3", - "Unit": "Seconds", + Name: "metric3", + Unit: "Seconds", + StorageResolution: 60, }, }, }, @@ -1493,7 +1525,7 @@ func TestGroupedMetricToCWMeasurementsWithFilters(t *testing.T) { // Have to perform this hacky equality check because the metric names might not // be in the right order due to map iteration assert.Equal(t, expectedLog.Entry, log.Entry) - assert.Equal(t, 2, len(log.Context)) + assert.Len(t, log.Context, 2) assert.Equal(t, expectedLog.Context[0], log.Context[0]) isMatch := false possibleOrders := []zapcore.Field{ @@ -1557,7 +1589,7 @@ func TestGroupedMetricToCWMeasurementsWithFilters(t *testing.T) { seen := make([]bool, 3) for _, log := range logs.AllUntimed() { assert.Equal(t, expectedEntry, log.Entry) - assert.Equal(t, 1, len(log.Context)) + assert.Len(t, log.Context, 1) hasMatch := false for i, expectedCtx := range expectedContexts { if !seen[i] && log.Context[0].Equals(expectedCtx) { @@ -1957,9 +1989,9 @@ func TestGroupedMetricToCWMeasurementsWithFilters(t *testing.T) { cWMeasurements := groupedMetricToCWMeasurementsWithFilters(groupedMetric, config) if len(tc.expectedDims) == 0 { - assert.Equal(t, 0, len(cWMeasurements)) + assert.Empty(t, cWMeasurements) } else { - assert.Equal(t, 1, len(cWMeasurements)) + assert.Len(t, cWMeasurements, 1) dims := cWMeasurements[0].Dimensions assertDimsEqual(t, tc.expectedDims, dims) } @@ -1984,7 +2016,7 @@ func BenchmarkTranslateOtToGroupedMetricWithInstrLibrary(b *testing.B) { for n := 0; n < b.N; n++ { groupedMetric := make(map[any]*groupedMetric) err := translator.translateOTelToGroupedMetric(rm, groupedMetric, config) - assert.Nil(b, err) + assert.NoError(b, err) } } @@ -2007,7 +2039,7 @@ func BenchmarkTranslateOtToGroupedMetricWithoutConfigReplacePattern(b *testing.B for n := 0; n < b.N; n++ { groupedMetrics := make(map[any]*groupedMetric) err := translator.translateOTelToGroupedMetric(rm, groupedMetrics, config) - assert.Nil(b, err) + assert.NoError(b, err) } } @@ -2030,7 +2062,7 @@ func BenchmarkTranslateOtToGroupedMetricWithConfigReplaceWithResource(b *testing for n := 0; n < b.N; n++ { groupedMetrics := make(map[any]*groupedMetric) err := translator.translateOTelToGroupedMetric(rm, groupedMetrics, config) - assert.Nil(b, err) + assert.NoError(b, err) } } @@ -2053,7 +2085,7 @@ func BenchmarkTranslateOtToGroupedMetricWithConfigReplaceWithLabel(b *testing.B) for n := 0; n < b.N; n++ { groupedMetrics := make(map[any]*groupedMetric) err := translator.translateOTelToGroupedMetric(rm, groupedMetrics, config) - assert.Nil(b, err) + assert.NoError(b, err) } } @@ -2071,7 +2103,7 @@ func BenchmarkTranslateOtToGroupedMetricWithoutInstrLibrary(b *testing.B) { for n := 0; n < b.N; n++ { groupedMetrics := make(map[any]*groupedMetric) err := translator.translateOTelToGroupedMetric(rm, groupedMetrics, config) - assert.Nil(b, err) + assert.NoError(b, err) } } @@ -2140,7 +2172,7 @@ func BenchmarkTranslateGroupedMetricToCWMetricWithFiltering(b *testing.B) { } logger := zap.NewNop() err := m.init(logger) - assert.Nil(b, err) + assert.NoError(b, err) config := &Config{ MetricDeclarations: []*MetricDeclaration{m}, DimensionRollupOption: zeroAndSingleDimensionRollup, @@ -2156,9 +2188,9 @@ func BenchmarkTranslateCWMetricToEMF(b *testing.B) { cwMeasurement := cWMeasurement{ Namespace: "test-emf", Dimensions: [][]string{{oTellibDimensionKey}, {oTellibDimensionKey, "spanName"}}, - Metrics: []map[string]string{{ - "Name": "spanCounter", - "Unit": "Count", + Metrics: []cWMetricInfo{{ + Name: "spanCounter", + Unit: "Count", }}, } timestamp := int64(1596151098037) @@ -2196,123 +2228,121 @@ type logGroupStreamTest struct { outLogStreamName string } -var ( - logGroupStreamTestCases = []logGroupStreamTest{ - { - name: "log_group_stream_expect_same", - inputMetrics: generateTestMetrics(testMetric{ - metricNames: []string{"metric_1", "metric_2"}, - metricValues: [][]float64{{100}, {4}}, - }), - inLogGroupName: "test-log-group", - inLogStreamName: "test-log-stream", - outLogGroupName: "test-log-group", - outLogStreamName: "test-log-stream", - }, - { - name: "log_group_pattern_from_resource", - inputMetrics: generateTestMetrics(testMetric{ - metricNames: []string{"metric_1", "metric_2"}, - metricValues: [][]float64{{100}, {4}}, - resourceAttributeMap: map[string]any{ - "ClusterName": "test-cluster", - "PodName": "test-pod", - }, - }), - inLogGroupName: "test-log-group-{ClusterName}", - inLogStreamName: "test-log-stream", - outLogGroupName: "test-log-group-test-cluster", - outLogStreamName: "test-log-stream", - }, - { - name: "log_stream_pattern_from_resource", - inputMetrics: generateTestMetrics(testMetric{ - metricNames: []string{"metric_1", "metric_2"}, - metricValues: [][]float64{{100}, {4}}, - resourceAttributeMap: map[string]any{ - "ClusterName": "test-cluster", - "PodName": "test-pod", - }, - }), - inLogGroupName: "test-log-group", - inLogStreamName: "test-log-stream-{PodName}", - outLogGroupName: "test-log-group", - outLogStreamName: "test-log-stream-test-pod", - }, - { - name: "log_group_pattern_from_label", - inputMetrics: generateTestMetrics(testMetric{ - metricNames: []string{"metric_1", "metric_2"}, - metricValues: [][]float64{{100}, {4}}, - attributeMap: map[string]any{ - "ClusterName": "test-cluster", - "PodName": "test-pod", - }, - }), - inLogGroupName: "test-log-group-{ClusterName}", - inLogStreamName: "test-log-stream", - outLogGroupName: "test-log-group-test-cluster", - outLogStreamName: "test-log-stream", - }, - { - name: "log_stream_pattern_from_label", - inputMetrics: generateTestMetrics(testMetric{ - metricNames: []string{"metric_1", "metric_2"}, - metricValues: [][]float64{{100}, {4}}, - attributeMap: map[string]any{ - "ClusterName": "test-cluster", - "PodName": "test-pod", - }, - }), - inLogGroupName: "test-log-group", - inLogStreamName: "test-log-stream-{PodName}", - outLogGroupName: "test-log-group", - outLogStreamName: "test-log-stream-test-pod", - }, - { - name: "config_pattern_from_both_attributes", - inputMetrics: generateTestMetrics(testMetric{ - metricNames: []string{"metric_1", "metric_2"}, - metricValues: [][]float64{{100}, {4}}, - resourceAttributeMap: map[string]any{ - "ClusterName": "test-cluster", - }, - attributeMap: map[string]any{ - "PodName": "test-pod", - }, - }), - inLogGroupName: "test-log-group-{ClusterName}", - inLogStreamName: "test-log-stream-{PodName}", - outLogGroupName: "test-log-group-test-cluster", - outLogStreamName: "test-log-stream-test-pod", - }, - { - name: "config_pattern_missing_from_both_attributes", - inputMetrics: generateTestMetrics(testMetric{ - metricNames: []string{"metric_1", "metric_2"}, - metricValues: [][]float64{{100}, {4}}, - }), - inLogGroupName: "test-log-group-{ClusterName}", - inLogStreamName: "test-log-stream-{PodName}", - outLogGroupName: "test-log-group-undefined", - outLogStreamName: "test-log-stream-undefined", - }, - { - name: "config_pattern_group_missing_stream_present", - inputMetrics: generateTestMetrics(testMetric{ - metricNames: []string{"metric_1", "metric_2"}, - metricValues: [][]float64{{100}, {4}}, - attributeMap: map[string]any{ - "PodName": "test-pod", - }, - }), - inLogGroupName: "test-log-group-{ClusterName}", - inLogStreamName: "test-log-stream-{PodName}", - outLogGroupName: "test-log-group-undefined", - outLogStreamName: "test-log-stream-test-pod", - }, - } -) +var logGroupStreamTestCases = []logGroupStreamTest{ + { + name: "log_group_stream_expect_same", + inputMetrics: generateTestMetrics(testMetric{ + metricNames: []string{"metric_1", "metric_2"}, + metricValues: [][]float64{{100}, {4}}, + }), + inLogGroupName: "test-log-group", + inLogStreamName: "test-log-stream", + outLogGroupName: "test-log-group", + outLogStreamName: "test-log-stream", + }, + { + name: "log_group_pattern_from_resource", + inputMetrics: generateTestMetrics(testMetric{ + metricNames: []string{"metric_1", "metric_2"}, + metricValues: [][]float64{{100}, {4}}, + resourceAttributeMap: map[string]any{ + "ClusterName": "test-cluster", + "PodName": "test-pod", + }, + }), + inLogGroupName: "test-log-group-{ClusterName}", + inLogStreamName: "test-log-stream", + outLogGroupName: "test-log-group-test-cluster", + outLogStreamName: "test-log-stream", + }, + { + name: "log_stream_pattern_from_resource", + inputMetrics: generateTestMetrics(testMetric{ + metricNames: []string{"metric_1", "metric_2"}, + metricValues: [][]float64{{100}, {4}}, + resourceAttributeMap: map[string]any{ + "ClusterName": "test-cluster", + "PodName": "test-pod", + }, + }), + inLogGroupName: "test-log-group", + inLogStreamName: "test-log-stream-{PodName}", + outLogGroupName: "test-log-group", + outLogStreamName: "test-log-stream-test-pod", + }, + { + name: "log_group_pattern_from_label", + inputMetrics: generateTestMetrics(testMetric{ + metricNames: []string{"metric_1", "metric_2"}, + metricValues: [][]float64{{100}, {4}}, + attributeMap: map[string]any{ + "ClusterName": "test-cluster", + "PodName": "test-pod", + }, + }), + inLogGroupName: "test-log-group-{ClusterName}", + inLogStreamName: "test-log-stream", + outLogGroupName: "test-log-group-test-cluster", + outLogStreamName: "test-log-stream", + }, + { + name: "log_stream_pattern_from_label", + inputMetrics: generateTestMetrics(testMetric{ + metricNames: []string{"metric_1", "metric_2"}, + metricValues: [][]float64{{100}, {4}}, + attributeMap: map[string]any{ + "ClusterName": "test-cluster", + "PodName": "test-pod", + }, + }), + inLogGroupName: "test-log-group", + inLogStreamName: "test-log-stream-{PodName}", + outLogGroupName: "test-log-group", + outLogStreamName: "test-log-stream-test-pod", + }, + { + name: "config_pattern_from_both_attributes", + inputMetrics: generateTestMetrics(testMetric{ + metricNames: []string{"metric_1", "metric_2"}, + metricValues: [][]float64{{100}, {4}}, + resourceAttributeMap: map[string]any{ + "ClusterName": "test-cluster", + }, + attributeMap: map[string]any{ + "PodName": "test-pod", + }, + }), + inLogGroupName: "test-log-group-{ClusterName}", + inLogStreamName: "test-log-stream-{PodName}", + outLogGroupName: "test-log-group-test-cluster", + outLogStreamName: "test-log-stream-test-pod", + }, + { + name: "config_pattern_missing_from_both_attributes", + inputMetrics: generateTestMetrics(testMetric{ + metricNames: []string{"metric_1", "metric_2"}, + metricValues: [][]float64{{100}, {4}}, + }), + inLogGroupName: "test-log-group-{ClusterName}", + inLogStreamName: "test-log-stream-{PodName}", + outLogGroupName: "test-log-group-undefined", + outLogStreamName: "test-log-stream-undefined", + }, + { + name: "config_pattern_group_missing_stream_present", + inputMetrics: generateTestMetrics(testMetric{ + metricNames: []string{"metric_1", "metric_2"}, + metricValues: [][]float64{{100}, {4}}, + attributeMap: map[string]any{ + "PodName": "test-pod", + }, + }), + inLogGroupName: "test-log-group-{ClusterName}", + inLogStreamName: "test-log-stream-{PodName}", + outLogGroupName: "test-log-group-undefined", + outLogStreamName: "test-log-stream-test-pod", + }, +} func TestTranslateOtToGroupedMetricForLogGroupAndStream(t *testing.T) { for _, test := range logGroupStreamTestCases { @@ -2335,7 +2365,7 @@ func TestTranslateOtToGroupedMetricForLogGroupAndStream(t *testing.T) { assert.NoError(t, err) assert.NotNil(t, groupedMetrics) - assert.Equal(t, 1, len(groupedMetrics)) + assert.Len(t, groupedMetrics, 1) for _, actual := range groupedMetrics { assert.Equal(t, test.outLogGroupName, actual.metadata.logGroup) @@ -2366,7 +2396,7 @@ func TestTranslateOtToGroupedMetricForInitialDeltaValue(t *testing.T) { assert.NoError(t, err) assert.NotNil(t, groupedMetrics) - assert.Equal(t, 1, len(groupedMetrics)) + assert.Len(t, groupedMetrics, 1) for _, actual := range groupedMetrics { assert.True(t, actual.metadata.retainInitialValueForDelta) diff --git a/exporter/awsemfexporter/util.go b/exporter/awsemfexporter/util.go index 30e5e755f9b8..0c92c9be9545 100644 --- a/exporter/awsemfexporter/util.go +++ b/exporter/awsemfexporter/util.go @@ -11,7 +11,7 @@ import ( "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "go.uber.org/zap" ) diff --git a/exporter/awsemfexporter/util_test.go b/exporter/awsemfexporter/util_test.go index 8c3dc9d62aee..ddbd34043ad8 100644 --- a/exporter/awsemfexporter/util_test.go +++ b/exporter/awsemfexporter/util_test.go @@ -9,7 +9,7 @@ import ( "github.com/stretchr/testify/assert" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/occonventions" @@ -341,5 +341,4 @@ func TestGetLogInfo(t *testing.T) { }) } } - } diff --git a/exporter/awskinesisexporter/README.md b/exporter/awskinesisexporter/README.md index a6e873e2e7d9..64edd9fc41ea 100644 --- a/exporter/awskinesisexporter/README.md +++ b/exporter/awskinesisexporter/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fawskinesis%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fawskinesis) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fawskinesis%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fawskinesis) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@Aneurysm9](https://www.github.com/Aneurysm9), [@MovieStoreGuy](https://www.github.com/MovieStoreGuy) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib diff --git a/exporter/awskinesisexporter/config.go b/exporter/awskinesisexporter/config.go index b4aded26792a..6fa643d29a93 100644 --- a/exporter/awskinesisexporter/config.go +++ b/exporter/awskinesisexporter/config.go @@ -26,9 +26,9 @@ type Encoding struct { // Config contains the main configuration options for the awskinesis exporter type Config struct { - exporterhelper.TimeoutSettings `mapstructure:",squash"` - exporterhelper.QueueSettings `mapstructure:"sending_queue"` - configretry.BackOffConfig `mapstructure:"retry_on_failure"` + TimeoutSettings exporterhelper.TimeoutConfig `mapstructure:",squash"` + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` + configretry.BackOffConfig `mapstructure:"retry_on_failure"` Encoding `mapstructure:"encoding"` AWS AWSConfig `mapstructure:"aws"` diff --git a/exporter/awskinesisexporter/config_test.go b/exporter/awskinesisexporter/config_test.go index bc5d78ece97b..344fa304046e 100644 --- a/exporter/awskinesisexporter/config_test.go +++ b/exporter/awskinesisexporter/config_test.go @@ -34,9 +34,9 @@ func TestLoadConfig(t *testing.T) { { id: component.NewIDWithName(metadata.Type, "default"), expected: &Config{ - QueueSettings: exporterhelper.NewDefaultQueueSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), BackOffConfig: configretry.NewDefaultBackOffConfig(), - TimeoutSettings: exporterhelper.NewDefaultTimeoutSettings(), + TimeoutSettings: exporterhelper.NewDefaultTimeoutConfig(), Encoding: Encoding{ Name: "otlp", Compression: "none", @@ -59,8 +59,8 @@ func TestLoadConfig(t *testing.T) { RandomizationFactor: backoff.DefaultRandomizationFactor, Multiplier: backoff.DefaultMultiplier, }, - TimeoutSettings: exporterhelper.NewDefaultTimeoutSettings(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), + TimeoutSettings: exporterhelper.NewDefaultTimeoutConfig(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), Encoding: Encoding{ Name: "otlp-proto", Compression: "none", @@ -84,7 +84,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) diff --git a/exporter/awskinesisexporter/exporter.go b/exporter/awskinesisexporter/exporter.go index acf83d831176..762afb09fa57 100644 --- a/exporter/awskinesisexporter/exporter.go +++ b/exporter/awskinesisexporter/exporter.go @@ -95,7 +95,6 @@ func createExporter(ctx context.Context, c component.Config, log *zap.Logger, op batch.WithMaxRecordsPerBatch(conf.MaxRecordsPerBatch), batch.WithCompressionType(conf.Compression), ) - if err != nil { return nil, err } diff --git a/exporter/awskinesisexporter/exporter_test.go b/exporter/awskinesisexporter/exporter_test.go index 59d2f5fe4084..ffab5b0c58c3 100644 --- a/exporter/awskinesisexporter/exporter_test.go +++ b/exporter/awskinesisexporter/exporter_test.go @@ -35,7 +35,7 @@ func TestCreatingExporter(t *testing.T) { }), validateNew: func(tb testing.TB) func(conf aws.Config, opts ...func(*kinesis.Options)) *kinesis.Client { return func(conf aws.Config, opts ...func(*kinesis.Options)) *kinesis.Client { - assert.Equal(tb, conf.Region, "us-west-2", "Must match the expected region") + assert.Equal(tb, "us-west-2", conf.Region, "Must match the expected region") k := kinesis.NewFromConfig(conf, opts...) return k } @@ -50,7 +50,7 @@ func TestCreatingExporter(t *testing.T) { }), validateNew: func(tb testing.TB) func(conf aws.Config, opts ...func(*kinesis.Options)) *kinesis.Client { return func(conf aws.Config, opts ...func(*kinesis.Options)) *kinesis.Client { - assert.Equal(tb, conf.Region, "us-east-1", "Must match the expected region") + assert.Equal(tb, "us-east-1", conf.Region, "Must match the expected region") k := kinesis.NewFromConfig(conf, opts...) return k } diff --git a/exporter/awskinesisexporter/factory.go b/exporter/awskinesisexporter/factory.go index d4d0a4c48dc2..d083f961c060 100644 --- a/exporter/awskinesisexporter/factory.go +++ b/exporter/awskinesisexporter/factory.go @@ -35,9 +35,9 @@ func NewFactory() exporter.Factory { func createDefaultConfig() component.Config { return &Config{ - TimeoutSettings: exporterhelper.NewDefaultTimeoutSettings(), + TimeoutSettings: exporterhelper.NewDefaultTimeoutConfig(), BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), Encoding: Encoding{ Name: defaultEncoding, Compression: defaultCompression, @@ -50,13 +50,13 @@ func createDefaultConfig() component.Config { } } -func newTracesExporter(ctx context.Context, params exporter.CreateSettings, conf component.Config) (exporter.Traces, error) { +func newTracesExporter(ctx context.Context, params exporter.Settings, conf component.Config) (exporter.Traces, error) { exp, err := createExporter(ctx, conf, params.Logger) if err != nil { return nil, err } c := conf.(*Config) - return exporterhelper.NewTracesExporter( + return exporterhelper.NewTraces( ctx, params, conf, @@ -68,13 +68,13 @@ func newTracesExporter(ctx context.Context, params exporter.CreateSettings, conf ) } -func newMetricsExporter(ctx context.Context, params exporter.CreateSettings, conf component.Config) (exporter.Metrics, error) { +func newMetricsExporter(ctx context.Context, params exporter.Settings, conf component.Config) (exporter.Metrics, error) { exp, err := createExporter(ctx, conf, params.Logger) if err != nil { return nil, err } c := conf.(*Config) - return exporterhelper.NewMetricsExporter( + return exporterhelper.NewMetrics( ctx, params, c, @@ -86,13 +86,13 @@ func newMetricsExporter(ctx context.Context, params exporter.CreateSettings, con ) } -func newLogsExporter(ctx context.Context, params exporter.CreateSettings, conf component.Config) (exporter.Logs, error) { +func newLogsExporter(ctx context.Context, params exporter.Settings, conf component.Config) (exporter.Logs, error) { exp, err := createExporter(ctx, conf, params.Logger) if err != nil { return nil, err } c := conf.(*Config) - return exporterhelper.NewLogsExporter( + return exporterhelper.NewLogs( ctx, params, c, diff --git a/exporter/awskinesisexporter/generated_component_test.go b/exporter/awskinesisexporter/generated_component_test.go index d149aa952571..facbeaf82ae8 100644 --- a/exporter/awskinesisexporter/generated_component_test.go +++ b/exporter/awskinesisexporter/generated_component_test.go @@ -32,27 +32,27 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, { name: "metrics", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg) }, }, { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -64,9 +64,9 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) diff --git a/exporter/awskinesisexporter/go.mod b/exporter/awskinesisexporter/go.mod index 502e87c5a0af..891534cf4a53 100644 --- a/exporter/awskinesisexporter/go.mod +++ b/exporter/awskinesisexporter/go.mod @@ -1,82 +1,87 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awskinesisexporter -go 1.21.0 +go 1.22.0 require ( - github.com/aws/aws-sdk-go-v2 v1.27.0 - github.com/aws/aws-sdk-go-v2/config v1.27.16 - github.com/aws/aws-sdk-go-v2/credentials v1.17.16 - github.com/aws/aws-sdk-go-v2/service/kinesis v1.27.8 - github.com/aws/aws-sdk-go-v2/service/sts v1.28.10 + github.com/aws/aws-sdk-go-v2 v1.32.6 + github.com/aws/aws-sdk-go-v2/config v1.28.6 + github.com/aws/aws-sdk-go-v2/credentials v1.17.47 + github.com/aws/aws-sdk-go-v2/service/kinesis v1.32.7 + github.com/aws/aws-sdk-go-v2/service/sts v1.33.2 github.com/cenkalti/backoff/v4 v4.3.0 github.com/gogo/protobuf v1.3.2 github.com/google/uuid v1.6.0 - github.com/jaegertracing/jaeger v1.57.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/jaegertracing/jaeger v1.62.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 go.uber.org/goleak v1.3.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 ) require ( - github.com/apache/thrift v0.20.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.20.9 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.3 // indirect - github.com/aws/smithy-go v1.20.2 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/apache/thrift v0.21.0 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.24.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6 // indirect + github.com/aws/smithy-go v1.22.1 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 // indirect github.com/openzipkin/zipkin-go v0.4.3 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/collector/semconv v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/consumer v1.22.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/collector/semconv v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + golang.org/x/net v0.30.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/awskinesisexporter/go.sum b/exporter/awskinesisexporter/go.sum index fc082a6eb257..0b6605b082ec 100644 --- a/exporter/awskinesisexporter/go.sum +++ b/exporter/awskinesisexporter/go.sum @@ -1,61 +1,61 @@ -github.com/apache/thrift v0.20.0 h1:631+KvYbsBZxmuJjYwhezVsrfc/TbqtZV4QcxOX1fOI= -github.com/apache/thrift v0.20.0/go.mod h1:hOk1BQqcp2OLzGsyVXdfMk7YFlMxK3aoEVhjD06QhB8= -github.com/aws/aws-sdk-go-v2 v1.27.0 h1:7bZWKoXhzI+mMR/HjdMx8ZCC5+6fY0lS5tr0bbgiLlo= -github.com/aws/aws-sdk-go-v2 v1.27.0/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 h1:x6xsQXGSmW6frevwDA+vi/wqhp1ct18mVXYN08/93to= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2/go.mod h1:lPprDr1e6cJdyYeGXnRaJoP4Md+cDBvi2eOj00BlGmg= -github.com/aws/aws-sdk-go-v2/config v1.27.16 h1:knpCuH7laFVGYTNd99Ns5t+8PuRjDn4HnnZK48csipM= -github.com/aws/aws-sdk-go-v2/config v1.27.16/go.mod h1:vutqgRhDUktwSge3hrC3nkuirzkJ4E/mLj5GvI0BQas= -github.com/aws/aws-sdk-go-v2/credentials v1.17.16 h1:7d2QxY83uYl0l58ceyiSpxg9bSbStqBC6BeEeHEchwo= -github.com/aws/aws-sdk-go-v2/credentials v1.17.16/go.mod h1:Ae6li/6Yc6eMzysRL2BXlPYvnrLLBg3D11/AmOjw50k= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3 h1:dQLK4TjtnlRGb0czOht2CevZ5l6RSyRWAnKeGd7VAFE= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3/go.mod h1:TL79f2P6+8Q7dTsILpiVST+AL9lkF6PPGI167Ny0Cjw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7 h1:lf/8VTF2cM+N4SLzaYJERKEWAXq8MOMpZfU6wEPWsPk= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7/go.mod h1:4SjkU7QiqK2M9oozyMzfZ/23LmUY+h3oFqhdeP5OMiI= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7 h1:4OYVp0705xu8yjdyoWix0r9wPIRXnIzzOoUpQVHIJ/g= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7/go.mod h1:vd7ESTEvI76T2Na050gODNmNU7+OyKrIKroYTu4ABiI= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2/go.mod h1:5CsjAbs3NlGQyZNFACh+zztPDI7fU6eW9QsxjfnuBKg= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9 h1:Wx0rlZoEJR7JwlSZcHnEa7CNjrSIyVxMFWGAaXy4fJY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9/go.mod h1:aVMHdE0aHO3v+f/iw01fmXV/5DbfQ3Bi9nN7nd9bE9Y= -github.com/aws/aws-sdk-go-v2/service/kinesis v1.27.8 h1:U1X1JiulWfr3lyIpdx0YCVANbF2UoMVhfv3DiDKBKwc= -github.com/aws/aws-sdk-go-v2/service/kinesis v1.27.8/go.mod h1:YxRRhvHMl4YR2OZR3369QQUc2iLqTc3KUCv9ayD8758= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.9 h1:aD7AGQhvPuAxlSUfo0CWU7s6FpkbyykMhGYMvlqTjVs= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.9/go.mod h1:c1qtZUWtygI6ZdvKppzCSXsDOq5I4luJPZ0Ud3juFCA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.3 h1:Pav5q3cA260Zqez42T9UhIlsd9QeypszRPwC9LdSSsQ= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.3/go.mod h1:9lmoVDVLz/yUZwLaQ676TK02fhCu4+PgRSmMaKR1ozk= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.10 h1:69tpbPED7jKPyzMcrwSvhWcJ9bPnZsZs18NT40JwM0g= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.10/go.mod h1:0Aqn1MnEuitqfsCNyKsdKLhDUOr4txD/g19EfiUqgws= -github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= -github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= -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/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE= +github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw= +github.com/aws/aws-sdk-go-v2 v1.32.6 h1:7BokKRgRPuGmKkFMhEg/jSul+tB9VvXhcViILtfG8b4= +github.com/aws/aws-sdk-go-v2 v1.32.6/go.mod h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 h1:lL7IfaFzngfx0ZwUGOZdsFFnQ5uLvR0hWqqhyE7Q9M8= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7/go.mod h1:QraP0UcVlQJsmHfioCrveWOC1nbiWUl3ej08h4mXWoc= +github.com/aws/aws-sdk-go-v2/config v1.28.6 h1:D89IKtGrs/I3QXOLNTH93NJYtDhm8SYa9Q5CsPShmyo= +github.com/aws/aws-sdk-go-v2/config v1.28.6/go.mod h1:GDzxJ5wyyFSCoLkS+UhGB0dArhb9mI+Co4dHtoTxbko= +github.com/aws/aws-sdk-go-v2/credentials v1.17.47 h1:48bA+3/fCdi2yAwVt+3COvmatZ6jUDNkDTIsqDiMUdw= +github.com/aws/aws-sdk-go-v2/credentials v1.17.47/go.mod h1:+KdckOejLW3Ks3b0E3b5rHsr2f9yuORBum0WPnE5o5w= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21 h1:AmoU1pziydclFT/xRV+xXE/Vb8fttJCLRPv8oAkprc0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21/go.mod h1:AjUdLYe4Tgs6kpH4Bv7uMZo7pottoyHMn4eTcIcneaY= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25 h1:s/fF4+yDQDoElYhfIVvSNyeCydfbuTKzhxSXDXCPasU= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25/go.mod h1:IgPfDv5jqFIzQSNbUEMoitNooSMXjRSDkhXv8jiROvU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25 h1:ZntTCl5EsYnhN/IygQEUugpdwbhdkom9uHcbCftiGgA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25/go.mod h1:DBdPrgeocww+CSl1C8cEV8PN1mHMBhuCDLpXezyvWkE= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6 h1:50+XsN70RS7dwJ2CkVNXzj7U2L1HKP8nqTd3XWEXBN4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6/go.mod h1:WqgLmwY7so32kG01zD8CPTJWVWM+TzJoOVHwTg4aPug= +github.com/aws/aws-sdk-go-v2/service/kinesis v1.32.7 h1:QTtbqxI+i2gaWjcTwJZtm8/xEl9kiQXXbOatGabNuXA= +github.com/aws/aws-sdk-go-v2/service/kinesis v1.32.7/go.mod h1:5aKZaOb2yfdeAOvfam0/6HoUXg01pN172bn7MqpM35c= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.7 h1:rLnYAfXQ3YAccocshIH5mzNNwZBkBo+bP6EhIxak6Hw= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.7/go.mod h1:ZHtuQJ6t9A/+YDuxOLnbryAmITtr8UysSny3qcyvJTc= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6 h1:JnhTZR3PiYDNKlXy50/pNeix9aGMo6lLpXwJ1mw8MD4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6/go.mod h1:URronUEGfXZN1VpdktPSD1EkAL9mfrV+2F4sjH38qOY= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.2 h1:s4074ZO1Hk8qv65GqNXqDjmkf4HSQqJukaLuuW0TpDA= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.2/go.mod h1:mVggCnIWoM09jP71Wh+ea7+5gAp53q+49wDFs1SW5z8= +github.com/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro= +github.com/aws/smithy-go v1.22.1/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/jaegertracing/jaeger v1.57.0 h1:3wDtUUPs6NRYH7+d+y8MilDkLHdpPrVlQ2wbcsA62bs= -github.com/jaegertracing/jaeger v1.57.0/go.mod h1:p/1fxIU9hKHl7qEhKC72p2ZYVhvvZvNB73y6V7YyuTs= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/jaegertracing/jaeger v1.62.0 h1:YoaJ2e8oVz5sqGGlVAKSUCED8DzJ1q7PojBmZFNKoJA= +github.com/jaegertracing/jaeger v1.62.0/go.mod h1:jhEIHazwyb+a6xlRBi+p96BAvTYTSmGkghcwdQfV7FM= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= @@ -68,8 +68,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -88,58 +88,73 @@ github.com/openzipkin/zipkin-go v0.4.3/go.mod h1:M9wCJZFWCo2RiY+o1eBCEMe0Dp2S5LD github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector v0.111.0 h1:D3LJTYrrK2ac94E2PXPSbVkArqxbklbCLsE4MAJQdRo= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -155,20 +170,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -177,12 +192,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/exporter/awskinesisexporter/internal/batch/batch.go b/exporter/awskinesisexporter/internal/batch/batch.go index 8da239ac3a44..2c3d716f991a 100644 --- a/exporter/awskinesisexporter/internal/batch/batch.go +++ b/exporter/awskinesisexporter/internal/batch/batch.go @@ -76,7 +76,6 @@ func New(opts ...Option) *Batch { } func (b *Batch) AddRecord(raw []byte, key string) error { - compressor, err := compress.NewCompressor(b.compressionType) if err != nil { return err diff --git a/exporter/awskinesisexporter/internal/batch/encode_jaeger.go b/exporter/awskinesisexporter/internal/batch/encode_jaeger.go index 42131ee0ea3d..50f4662a0575 100644 --- a/exporter/awskinesisexporter/internal/batch/encode_jaeger.go +++ b/exporter/awskinesisexporter/internal/batch/encode_jaeger.go @@ -6,7 +6,6 @@ package batch // import "github.com/open-telemetry/opentelemetry-collector-contr import ( "github.com/gogo/protobuf/proto" "github.com/jaegertracing/jaeger/model" - "go.opentelemetry.io/collector/consumer/consumererror" "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" @@ -30,10 +29,7 @@ type jaegerEncoder struct { var _ Encoder = (*jaegerEncoder)(nil) func (je jaegerEncoder) Traces(td ptrace.Traces) (*Batch, error) { - traces, err := jaeger.ProtoFromTraces(td) - if err != nil { - return nil, consumererror.NewTraces(err, td) - } + traces := jaeger.ProtoFromTraces(td) bt := New(je.batchOptions...) diff --git a/exporter/awskinesisexporter/internal/compress/compresser.go b/exporter/awskinesisexporter/internal/compress/compresser.go index 766274e86bb9..f0de7a766d13 100644 --- a/exporter/awskinesisexporter/internal/compress/compresser.go +++ b/exporter/awskinesisexporter/internal/compress/compresser.go @@ -33,7 +33,6 @@ func flateCompressor(in []byte) ([]byte, error) { w, _ := flate.NewWriter(&buf, flate.BestSpeed) _, err := w.Write(in) - if err != nil { return nil, err } @@ -56,14 +55,12 @@ func gzipCompressor(in []byte) ([]byte, error) { w, _ := gzip.NewWriterLevel(&buf, gzip.BestSpeed) _, err := w.Write(in) - if err != nil { return nil, err } err = w.Flush() if err != nil { - return nil, err } @@ -80,7 +77,6 @@ func zlibCompressor(in []byte) ([]byte, error) { w, _ := zlib.NewWriterLevel(&buf, zlib.BestSpeed) _, err := w.Write(in) - if err != nil { return nil, err } diff --git a/exporter/awskinesisexporter/internal/compress/compresser_test.go b/exporter/awskinesisexporter/internal/compress/compresser_test.go index 3ac82cf7330c..082427bb6133 100644 --- a/exporter/awskinesisexporter/internal/compress/compresser_test.go +++ b/exporter/awskinesisexporter/internal/compress/compresser_test.go @@ -143,7 +143,6 @@ func benchmarkCompressor(b *testing.B, format string, length int) { // current implementation creates a new context on each compression request // this is a test to check no exceptions are raised for executing concurrent compressions func TestCompressorConcurrent(t *testing.T) { - timeout := time.After(15 * time.Second) done := make(chan bool) go func() { @@ -157,7 +156,6 @@ func TestCompressorConcurrent(t *testing.T) { t.Fatal("Test didn't finish in time") case <-done: } - } func concurrentCompressFunc(t *testing.T) { @@ -174,7 +172,6 @@ func concurrentCompressFunc(t *testing.T) { // any single format would do it here, since each exporter can be set to use only one at a time // and the concurrent issue that was present in the past was independent of the format compressFunc, err := compress.NewCompressor("gzip") - if err != nil { errCh <- err return @@ -250,7 +247,6 @@ func decompressZlib(input []byte) ([]byte, error) { } func decompressFlate(input []byte) ([]byte, error) { - r := flate.NewReader(bytes.NewReader(input)) defer r.Close() diff --git a/exporter/awskinesisexporter/internal/metadata/generated_status.go b/exporter/awskinesisexporter/internal/metadata/generated_status.go index 0a459d86cc7e..f46a20d1c533 100644 --- a/exporter/awskinesisexporter/internal/metadata/generated_status.go +++ b/exporter/awskinesisexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("awskinesis") + Type = component.MustNewType("awskinesis") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awskinesisexporter" ) const ( diff --git a/exporter/awskinesisexporter/internal/metadata/generated_telemetry.go b/exporter/awskinesisexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index 7885b1fcc59c..000000000000 --- a/exporter/awskinesisexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/awskinesis") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/awskinesis") -} diff --git a/exporter/awskinesisexporter/internal/metadata/generated_telemetry_test.go b/exporter/awskinesisexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 135eead50068..000000000000 --- a/exporter/awskinesisexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/awskinesis", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/awskinesis", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/awskinesisexporter/internal/producer/batcher.go b/exporter/awskinesisexporter/internal/producer/batcher.go index 2b68e725608b..8e18dc933284 100644 --- a/exporter/awskinesisexporter/internal/producer/batcher.go +++ b/exporter/awskinesisexporter/internal/producer/batcher.go @@ -23,9 +23,7 @@ type batcher struct { log *zap.Logger } -var ( - _ Batcher = (*batcher)(nil) -) +var _ Batcher = (*batcher)(nil) var ( permanentErrResourceNotFound = new(*types.ResourceNotFoundException) @@ -52,7 +50,6 @@ func (b *batcher) Put(ctx context.Context, bt *batch.Batch) error { StreamName: b.stream, Records: records, }) - if err != nil { if errors.As(err, permanentErrResourceNotFound) || errors.As(err, permanentErrInvalidArgument) { err = consumererror.NewPermanent(err) diff --git a/exporter/awskinesisexporter/internal/producer/interface.go b/exporter/awskinesisexporter/internal/producer/interface.go index 0726e7f71cbb..3a3b40f20318 100644 --- a/exporter/awskinesisexporter/internal/producer/interface.go +++ b/exporter/awskinesisexporter/internal/producer/interface.go @@ -29,6 +29,4 @@ type Kinesis interface { PutRecords(ctx context.Context, params *kinesis.PutRecordsInput, optFns ...func(*kinesis.Options)) (*kinesis.PutRecordsOutput, error) } -var ( - _ Kinesis = (*kinesis.Client)(nil) -) +var _ Kinesis = (*kinesis.Client)(nil) diff --git a/exporter/awskinesisexporter/metadata.yaml b/exporter/awskinesisexporter/metadata.yaml index 2efe3f753cf1..f889f6635c7e 100644 --- a/exporter/awskinesisexporter/metadata.yaml +++ b/exporter/awskinesisexporter/metadata.yaml @@ -1,5 +1,4 @@ type: awskinesis -scope_name: otelcol/awskinesis status: class: exporter diff --git a/exporter/awss3exporter/README.md b/exporter/awss3exporter/README.md index ba2f1b8cbf92..1a9dbc44c9ee 100644 --- a/exporter/awss3exporter/README.md +++ b/exporter/awss3exporter/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fawss3%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fawss3) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fawss3%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fawss3) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@atoulme](https://www.github.com/atoulme), [@pdelewski](https://www.github.com/pdelewski) | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib @@ -30,7 +30,7 @@ The following exporter configuration parameters are supported. | `marshaler` | marshaler used to produce output data | `otlp_json` | | `encoding` | Encoding extension to use to marshal data. Overrides the `marshaler` configuration option if set. | | | `encoding_file_extension` | file format extension suffix when using the `encoding` configuration option. May be left empty for no suffix to be appended. | | -| `endpoint` | overrides the endpoint used by the exporter instead of constructing it from `region` and `s3_bucket` | | +| `endpoint` | (REST API endpoint) overrides the endpoint used by the exporter instead of constructing it from `region` and `s3_bucket` | | | `s3_force_path_style` | [set this to `true` to force the request to use path-style addressing](http://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html) | false | | `disable_ssl` | set this to `true` to disable SSL when sending requests | false | | `compression` | should the file be compressed | none | diff --git a/exporter/awss3exporter/body_marshaler_test.go b/exporter/awss3exporter/body_marshaler_test.go index 0363e20722a2..0c4846a14b14 100644 --- a/exporter/awss3exporter/body_marshaler_test.go +++ b/exporter/awss3exporter/body_marshaler_test.go @@ -71,7 +71,7 @@ func TestBodyMarshalerWithMapType(t *testing.T) { m.PutDouble("foobardouble", 0.006) m.PutInt("foobarint", 1) - var expect = `{"bar":"bar","foo":"foo","foobar":false,"foobardouble":0.006,"foobarint":1}` + expect := `{"bar":"bar","foo":"foo","foobar":false,"foobardouble":0.006,"foobarint":1}` marshaler := &bodyMarshaler{} require.NotNil(t, marshaler) diff --git a/exporter/awss3exporter/config.go b/exporter/awss3exporter/config.go index 276d73f357b1..4514d2bb7643 100644 --- a/exporter/awss3exporter/config.go +++ b/exporter/awss3exporter/config.go @@ -14,16 +14,28 @@ import ( // S3UploaderConfig contains aws s3 uploader related config to controls things // like bucket, prefix, batching, connections, retries, etc. type S3UploaderConfig struct { - Region string `mapstructure:"region"` - S3Bucket string `mapstructure:"s3_bucket"` - S3Prefix string `mapstructure:"s3_prefix"` - S3Partition string `mapstructure:"s3_partition"` - FilePrefix string `mapstructure:"file_prefix"` - Endpoint string `mapstructure:"endpoint"` - RoleArn string `mapstructure:"role_arn"` - S3ForcePathStyle bool `mapstructure:"s3_force_path_style"` - DisableSSL bool `mapstructure:"disable_ssl"` - Compression configcompression.Type `mapstructure:"compression"` + Region string `mapstructure:"region"` + // S3Bucket is the bucket name to be uploaded to. + S3Bucket string `mapstructure:"s3_bucket"` + // S3Prefix is the key (directory) prefix to written to inside the bucket + S3Prefix string `mapstructure:"s3_prefix"` + // S3Partition is used to provide the rollup on how data is written. + // Valid values are: [hour,minute] + S3Partition string `mapstructure:"s3_partition"` + // FilePrefix is the filename prefix used for the file to avoid any potential collisions. + FilePrefix string `mapstructure:"file_prefix"` + // Endpoint is the URL used for communicated with S3. + Endpoint string `mapstructure:"endpoint"` + // RoleArn is the role policy to use when interacting with S3 + RoleArn string `mapstructure:"role_arn"` + // S3ForcePathStyle sets the value for force path style. + S3ForcePathStyle bool `mapstructure:"s3_force_path_style"` + // DisableSLL forces communication to happen via HTTP instead of HTTPS. + DisableSSL bool `mapstructure:"disable_ssl"` + // Compression sets the algorithm used to process the payload + // before uploading to S3. + // Valid values are: `gzip` or no value set. + Compression configcompression.Type `mapstructure:"compression"` } type MarshalerType string @@ -50,8 +62,8 @@ func (c *Config) Validate() error { if c.S3Uploader.Region == "" { errs = multierr.Append(errs, errors.New("region is required")) } - if c.S3Uploader.S3Bucket == "" { - errs = multierr.Append(errs, errors.New("bucket is required")) + if c.S3Uploader.S3Bucket == "" && c.S3Uploader.Endpoint == "" { + errs = multierr.Append(errs, errors.New("bucket or endpoint is required")) } compression := c.S3Uploader.Compression if compression.IsCompressed() { diff --git a/exporter/awss3exporter/config_test.go b/exporter/awss3exporter/config_test.go index 8638aa27076b..cd08539581c5 100644 --- a/exporter/awss3exporter/config_test.go +++ b/exporter/awss3exporter/config_test.go @@ -23,6 +23,8 @@ func TestLoadConfig(t *testing.T) { factory := NewFactory() factories.Exporters[metadata.Type] = factory + // https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/33594 + // nolint:staticcheck cfg, err := otelcoltest.LoadConfigAndValidate(filepath.Join("testdata", "default.yaml"), factories) require.NoError(t, err) @@ -30,17 +32,16 @@ func TestLoadConfig(t *testing.T) { e := cfg.Exporters[component.MustNewID("awss3")].(*Config) encoding := component.MustNewIDWithName("foo", "bar") - assert.Equal(t, e, - &Config{ - Encoding: &encoding, - EncodingFileExtension: "baz", - S3Uploader: S3UploaderConfig{ - Region: "us-east-1", - S3Bucket: "foo", - S3Partition: "minute", - }, - MarshalerName: "otlp_json", + assert.Equal(t, &Config{ + Encoding: &encoding, + EncodingFileExtension: "baz", + S3Uploader: S3UploaderConfig{ + Region: "us-east-1", + S3Bucket: "foo", + S3Partition: "minute", }, + MarshalerName: "otlp_json", + }, e, ) } @@ -50,6 +51,8 @@ func TestConfig(t *testing.T) { factory := NewFactory() factories.Exporters[factory.Type()] = factory + // https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/33594 + // nolint:staticcheck cfg, err := otelcoltest.LoadConfigAndValidate( filepath.Join("testdata", "config.yaml"), factories) @@ -58,17 +61,16 @@ func TestConfig(t *testing.T) { e := cfg.Exporters[component.MustNewID("awss3")].(*Config) - assert.Equal(t, e, - &Config{ - S3Uploader: S3UploaderConfig{ - Region: "us-east-1", - S3Bucket: "foo", - S3Prefix: "bar", - S3Partition: "minute", - Endpoint: "http://endpoint.com", - }, - MarshalerName: "otlp_json", + assert.Equal(t, &Config{ + S3Uploader: S3UploaderConfig{ + Region: "us-east-1", + S3Bucket: "foo", + S3Prefix: "bar", + S3Partition: "minute", + Endpoint: "http://endpoint.com", }, + MarshalerName: "otlp_json", + }, e, ) } @@ -78,6 +80,8 @@ func TestConfigForS3CompatibleSystems(t *testing.T) { factory := NewFactory() factories.Exporters[factory.Type()] = factory + // https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/33594 + // nolint:staticcheck cfg, err := otelcoltest.LoadConfigAndValidate( filepath.Join("testdata", "config-s3-compatible-systems.yaml"), factories) @@ -86,19 +90,18 @@ func TestConfigForS3CompatibleSystems(t *testing.T) { e := cfg.Exporters[component.MustNewID("awss3")].(*Config) - assert.Equal(t, e, - &Config{ - S3Uploader: S3UploaderConfig{ - Region: "us-east-1", - S3Bucket: "foo", - S3Prefix: "bar", - S3Partition: "minute", - Endpoint: "alternative-s3-system.example.com", - S3ForcePathStyle: true, - DisableSSL: true, - }, - MarshalerName: "otlp_json", + assert.Equal(t, &Config{ + S3Uploader: S3UploaderConfig{ + Region: "us-east-1", + S3Bucket: "foo", + S3Prefix: "bar", + S3Partition: "minute", + Endpoint: "alternative-s3-system.example.com", + S3ForcePathStyle: true, + DisableSSL: true, }, + MarshalerName: "otlp_json", + }, e, ) } @@ -109,12 +112,24 @@ func TestConfig_Validate(t *testing.T) { errExpected error }{ { - name: "valid", + // endpoint overrides region and bucket name. + name: "valid with endpoint and region", + config: func() *Config { + c := createDefaultConfig().(*Config) + c.S3Uploader.Endpoint = "http://example.com" + c.S3Uploader.Region = "foo" + return c + }(), + errExpected: nil, + }, + { + // Endpoint will be built from bucket and region. + // https://docs.aws.amazon.com/AmazonS3/latest/userguide/VirtualHosting.html + name: "valid with S3Bucket and region", config: func() *Config { c := createDefaultConfig().(*Config) c.S3Uploader.Region = "foo" c.S3Uploader.S3Bucket = "bar" - c.S3Uploader.Endpoint = "http://example.com" return c }(), errExpected: nil, @@ -124,32 +139,43 @@ func TestConfig_Validate(t *testing.T) { config: func() *Config { c := createDefaultConfig().(*Config) c.S3Uploader.Region = "" + c.S3Uploader.S3Bucket = "" + c.S3Uploader.Endpoint = "" return c }(), errExpected: multierr.Append(errors.New("region is required"), - errors.New("bucket is required")), + errors.New("bucket or endpoint is required")), }, { - name: "endpoint and region", + name: "region only", config: func() *Config { c := createDefaultConfig().(*Config) - c.S3Uploader.Endpoint = "http://example.com" c.S3Uploader.Region = "foo" + c.S3Uploader.S3Bucket = "" return c }(), - errExpected: errors.New("bucket is required"), + errExpected: errors.New("bucket or endpoint is required"), }, { - name: "endpoint and bucket", + name: "bucket only", config: func() *Config { c := createDefaultConfig().(*Config) - c.S3Uploader.Endpoint = "http://example.com" c.S3Uploader.S3Bucket = "foo" c.S3Uploader.Region = "" return c }(), errExpected: errors.New("region is required"), }, + { + name: "endpoint only", + config: func() *Config { + c := createDefaultConfig().(*Config) + c.S3Uploader.Endpoint = "http://example.com" + c.S3Uploader.Region = "" + return c + }(), + errExpected: errors.New("region is required"), + }, } for _, tt := range tests { @@ -166,6 +192,8 @@ func TestMarshallerName(t *testing.T) { factory := NewFactory() factories.Exporters[factory.Type()] = factory + // https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/33594 + // nolint:staticcheck cfg, err := otelcoltest.LoadConfigAndValidate( filepath.Join("testdata", "marshaler.yaml"), factories) @@ -174,30 +202,27 @@ func TestMarshallerName(t *testing.T) { e := cfg.Exporters[component.MustNewID("awss3")].(*Config) - assert.Equal(t, e, - &Config{ - S3Uploader: S3UploaderConfig{ - Region: "us-east-1", - S3Bucket: "foo", - S3Partition: "minute", - }, - MarshalerName: "sumo_ic", + assert.Equal(t, &Config{ + S3Uploader: S3UploaderConfig{ + Region: "us-east-1", + S3Bucket: "foo", + S3Partition: "minute", }, + MarshalerName: "sumo_ic", + }, e, ) e = cfg.Exporters[component.MustNewIDWithName("awss3", "proto")].(*Config) - assert.Equal(t, e, - &Config{ - S3Uploader: S3UploaderConfig{ - Region: "us-east-1", - S3Bucket: "bar", - S3Partition: "minute", - }, - MarshalerName: "otlp_proto", + assert.Equal(t, &Config{ + S3Uploader: S3UploaderConfig{ + Region: "us-east-1", + S3Bucket: "bar", + S3Partition: "minute", }, + MarshalerName: "otlp_proto", + }, e, ) - } func TestCompressionName(t *testing.T) { @@ -206,6 +231,8 @@ func TestCompressionName(t *testing.T) { factory := NewFactory() factories.Exporters[factory.Type()] = factory + // https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/33594 + // nolint:staticcheck cfg, err := otelcoltest.LoadConfigAndValidate( filepath.Join("testdata", "compression.yaml"), factories) @@ -214,30 +241,27 @@ func TestCompressionName(t *testing.T) { e := cfg.Exporters[component.MustNewID("awss3")].(*Config) - assert.Equal(t, e, - &Config{ - S3Uploader: S3UploaderConfig{ - Region: "us-east-1", - S3Bucket: "foo", - S3Partition: "minute", - Compression: "gzip", - }, - MarshalerName: "otlp_json", + assert.Equal(t, &Config{ + S3Uploader: S3UploaderConfig{ + Region: "us-east-1", + S3Bucket: "foo", + S3Partition: "minute", + Compression: "gzip", }, + MarshalerName: "otlp_json", + }, e, ) e = cfg.Exporters[component.MustNewIDWithName("awss3", "proto")].(*Config) - assert.Equal(t, e, - &Config{ - S3Uploader: S3UploaderConfig{ - Region: "us-east-1", - S3Bucket: "bar", - S3Partition: "minute", - Compression: "none", - }, - MarshalerName: "otlp_proto", + assert.Equal(t, &Config{ + S3Uploader: S3UploaderConfig{ + Region: "us-east-1", + S3Bucket: "bar", + S3Partition: "minute", + Compression: "none", }, + MarshalerName: "otlp_proto", + }, e, ) - } diff --git a/exporter/awss3exporter/data_writer.go b/exporter/awss3exporter/data_writer.go deleted file mode 100644 index cd27edd98daf..000000000000 --- a/exporter/awss3exporter/data_writer.go +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package awss3exporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awss3exporter" - -import "context" - -type dataWriter interface { - writeBuffer(ctx context.Context, buf []byte, config *Config, metadata string, format string) error -} diff --git a/exporter/awss3exporter/exporter.go b/exporter/awss3exporter/exporter.go index f4524ee40be0..1642e532801d 100644 --- a/exporter/awss3exporter/exporter.go +++ b/exporter/awss3exporter/exporter.go @@ -14,28 +14,32 @@ import ( "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" "go.uber.org/zap" + + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awss3exporter/internal/upload" ) type s3Exporter struct { config *Config - dataWriter dataWriter + signalType string + uploader upload.Manager logger *zap.Logger marshaler marshaler } -func newS3Exporter(config *Config, - params exporter.CreateSettings) *s3Exporter { - +func newS3Exporter( + config *Config, + signalType string, + params exporter.Settings, +) *s3Exporter { s3Exporter := &s3Exporter{ config: config, - dataWriter: &s3Writer{}, + signalType: signalType, logger: params.Logger, } return s3Exporter } -func (e *s3Exporter) start(_ context.Context, host component.Host) error { - +func (e *s3Exporter) start(ctx context.Context, host component.Host) error { var m marshaler var err error if e.config.Encoding != nil { @@ -49,6 +53,12 @@ func (e *s3Exporter) start(_ context.Context, host component.Host) error { } e.marshaler = m + + up, err := newUploadManager(ctx, e.config, e.signalType, m.format()) + if err != nil { + return err + } + e.uploader = up return nil } @@ -58,22 +68,20 @@ func (e *s3Exporter) Capabilities() consumer.Capabilities { func (e *s3Exporter) ConsumeMetrics(ctx context.Context, md pmetric.Metrics) error { buf, err := e.marshaler.MarshalMetrics(md) - if err != nil { return err } - return e.dataWriter.writeBuffer(ctx, buf, e.config, "metrics", e.marshaler.format()) + return e.uploader.Upload(ctx, buf) } func (e *s3Exporter) ConsumeLogs(ctx context.Context, logs plog.Logs) error { buf, err := e.marshaler.MarshalLogs(logs) - if err != nil { return err } - return e.dataWriter.writeBuffer(ctx, buf, e.config, "logs", e.marshaler.format()) + return e.uploader.Upload(ctx, buf) } func (e *s3Exporter) ConsumeTraces(ctx context.Context, traces ptrace.Traces) error { @@ -82,5 +90,5 @@ func (e *s3Exporter) ConsumeTraces(ctx context.Context, traces ptrace.Traces) er return err } - return e.dataWriter.writeBuffer(ctx, buf, e.config, "traces", e.marshaler.format()) + return e.uploader.Upload(ctx, buf) } diff --git a/exporter/awss3exporter/exporter_test.go b/exporter/awss3exporter/exporter_test.go index 8c06efb5acf4..814f9a280b2f 100644 --- a/exporter/awss3exporter/exporter_test.go +++ b/exporter/awss3exporter/exporter_test.go @@ -18,7 +18,7 @@ type TestWriter struct { t *testing.T } -func (testWriter *TestWriter) writeBuffer(_ context.Context, buf []byte, _ *Config, _ string, _ string) error { +func (testWriter *TestWriter) Upload(_ context.Context, buf []byte) error { assert.Equal(testWriter.t, testLogs, buf) return nil } @@ -33,10 +33,10 @@ func getTestLogs(tb testing.TB) plog.Logs { func getLogExporter(t *testing.T) *s3Exporter { marshaler, _ := newMarshaler("otlp_json", zap.NewNop()) exporter := &s3Exporter{ - config: createDefaultConfig().(*Config), - dataWriter: &TestWriter{t}, - logger: zap.NewNop(), - marshaler: marshaler, + config: createDefaultConfig().(*Config), + uploader: &TestWriter{t}, + logger: zap.NewNop(), + marshaler: marshaler, } return exporter } diff --git a/exporter/awss3exporter/factory.go b/exporter/awss3exporter/factory.go index 12c1ead83d1a..da343d63ba0a 100644 --- a/exporter/awss3exporter/factory.go +++ b/exporter/awss3exporter/factory.go @@ -36,44 +36,44 @@ func createDefaultConfig() component.Config { } func createLogsExporter(ctx context.Context, - params exporter.CreateSettings, - config component.Config) (exporter.Logs, error) { + params exporter.Settings, + config component.Config, +) (exporter.Logs, error) { + s3Exporter := newS3Exporter(config.(*Config), "logs", params) - s3Exporter := newS3Exporter(config.(*Config), params) - - return exporterhelper.NewLogsExporter(ctx, params, + return exporterhelper.NewLogs(ctx, params, config, s3Exporter.ConsumeLogs, exporterhelper.WithStart(s3Exporter.start)) } func createMetricsExporter(ctx context.Context, - params exporter.CreateSettings, - config component.Config) (exporter.Metrics, error) { - - s3Exporter := newS3Exporter(config.(*Config), params) + params exporter.Settings, + config component.Config, +) (exporter.Metrics, error) { + s3Exporter := newS3Exporter(config.(*Config), "metrics", params) if config.(*Config).MarshalerName == SumoIC { return nil, fmt.Errorf("metrics are not supported by sumo_ic output format") } - return exporterhelper.NewMetricsExporter(ctx, params, + return exporterhelper.NewMetrics(ctx, params, config, s3Exporter.ConsumeMetrics, exporterhelper.WithStart(s3Exporter.start)) } func createTracesExporter(ctx context.Context, - params exporter.CreateSettings, - config component.Config) (exporter.Traces, error) { - - s3Exporter := newS3Exporter(config.(*Config), params) + params exporter.Settings, + config component.Config, +) (exporter.Traces, error) { + s3Exporter := newS3Exporter(config.(*Config), "traces", params) if config.(*Config).MarshalerName == SumoIC { return nil, fmt.Errorf("traces are not supported by sumo_ic output format") } - return exporterhelper.NewTracesExporter(ctx, + return exporterhelper.NewTraces(ctx, params, config, s3Exporter.ConsumeTraces, diff --git a/exporter/awss3exporter/factory_test.go b/exporter/awss3exporter/factory_test.go index c8fc0ec1faea..b8f221fd6824 100644 --- a/exporter/awss3exporter/factory_test.go +++ b/exporter/awss3exporter/factory_test.go @@ -19,31 +19,31 @@ func TestCreateDefaultConfig(t *testing.T) { assert.NoError(t, componenttest.CheckConfigStruct(cfg)) } -func TestCreateMetricsExporter(t *testing.T) { +func TestCreateMetrics(t *testing.T) { cfg := createDefaultConfig() exp, err := createMetricsExporter( context.Background(), - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg) assert.NoError(t, err) require.NotNil(t, exp) } -func TestCreateTracesExporter(t *testing.T) { +func TestCreateTraces(t *testing.T) { cfg := createDefaultConfig() exp, err := createTracesExporter( context.Background(), - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg) assert.NoError(t, err) require.NotNil(t, exp) } -func TestCreateLogsExporter(t *testing.T) { +func TestCreateLogs(t *testing.T) { cfg := createDefaultConfig() exp, err := createLogsExporter( context.Background(), - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg) assert.NoError(t, err) require.NotNil(t, exp) @@ -54,14 +54,14 @@ func TestUnsupportedMarshalerOptions(t *testing.T) { cfg.(*Config).MarshalerName = SumoIC exp, err := createMetricsExporter( context.Background(), - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg) assert.Error(t, err) require.Nil(t, exp) exp2, err := createTracesExporter( context.Background(), - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg) assert.Error(t, err) require.Nil(t, exp2) diff --git a/exporter/awss3exporter/generated_component_test.go b/exporter/awss3exporter/generated_component_test.go index 817e1d297172..ee4ba1212973 100644 --- a/exporter/awss3exporter/generated_component_test.go +++ b/exporter/awss3exporter/generated_component_test.go @@ -32,27 +32,27 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, { name: "metrics", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg) }, }, { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -64,21 +64,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(exporter.Logs) require.True(t, ok) diff --git a/exporter/awss3exporter/generated_package_test.go b/exporter/awss3exporter/generated_package_test.go index 9aae1bf83b6d..ff834e53d2f5 100644 --- a/exporter/awss3exporter/generated_package_test.go +++ b/exporter/awss3exporter/generated_package_test.go @@ -9,5 +9,5 @@ import ( ) func TestMain(m *testing.M) { - goleak.VerifyTestMain(m) + goleak.VerifyTestMain(m, goleak.IgnoreTopFunction("net/http.(*persistConn).writeLoop"), goleak.IgnoreTopFunction("internal/poll.runtime_pollWait")) } diff --git a/exporter/awss3exporter/go.mod b/exporter/awss3exporter/go.mod index 5e00b9df6dc2..3a5a1220fb6c 100644 --- a/exporter/awss3exporter/go.mod +++ b/exporter/awss3exporter/go.mod @@ -1,104 +1,144 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awss3exporter -go 1.21.0 +go 1.22.0 require ( - github.com/aws/aws-sdk-go v1.53.11 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configcompression v1.9.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/otelcol v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/aws/aws-sdk-go-v2 v1.32.6 + github.com/aws/aws-sdk-go-v2/config v1.28.6 + github.com/aws/aws-sdk-go-v2/credentials v1.17.47 + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.43 + github.com/aws/aws-sdk-go-v2/service/s3 v1.71.0 + github.com/aws/aws-sdk-go-v2/service/sts v1.33.2 + github.com/stretchr/testify v1.10.0 + github.com/tilinna/clock v1.1.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configcompression v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/otelcol/otelcoltest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 go.uber.org/goleak v1.3.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 ) require ( + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.25 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.6 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.6 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.24.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6 // indirect + github.com/aws/smithy-go v1.22.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/ebitengine/purego v0.8.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/uuid v1.6.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/client_golang v1.19.1 // indirect + github.com/prometheus/client_golang v1.20.5 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/shirou/gopsutil/v3 v3.24.4 // indirect - github.com/shoenig/go-m1cpu v0.1.6 // indirect - github.com/spf13/cobra v1.8.0 // indirect + github.com/prometheus/common v0.61.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/shirou/gopsutil/v4 v4.24.11 // indirect + github.com/spf13/cobra v1.8.1 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect - go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configretry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0 // indirect - go.opentelemetry.io/collector/connector v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/pdata/testdata v0.102.0 // indirect - go.opentelemetry.io/collector/processor v0.102.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/collector/semconv v0.102.0 // indirect - go.opentelemetry.io/collector/service v0.102.0 // indirect - go.opentelemetry.io/contrib/config v0.7.0 // indirect - go.opentelemetry.io/contrib/propagators/b3 v1.27.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/bridge/opencensus v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - go.opentelemetry.io/proto/otlp v1.2.0 // indirect + go.opentelemetry.io/collector/component/componentstatus v0.116.0 // indirect + go.opentelemetry.io/collector/config/configretry v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0 // indirect + go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0 // indirect + go.opentelemetry.io/collector/confmap/provider/httpprovider v1.22.0 // indirect + go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.22.0 // indirect + go.opentelemetry.io/collector/connector v0.116.0 // indirect + go.opentelemetry.io/collector/connector/connectortest v0.116.0 // indirect + go.opentelemetry.io/collector/connector/xconnector v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0 // indirect + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/otelcol v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/testdata v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 // indirect + go.opentelemetry.io/collector/processor v0.116.0 // indirect + go.opentelemetry.io/collector/processor/processortest v0.116.0 // indirect + go.opentelemetry.io/collector/processor/xprocessor v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/collector/semconv v0.116.0 // indirect + go.opentelemetry.io/collector/service v0.116.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.6.0 // indirect + go.opentelemetry.io/contrib/config v0.10.0 // indirect + go.opentelemetry.io/contrib/propagators/b3 v1.31.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.54.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 // indirect + go.opentelemetry.io/otel/log v0.8.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.7.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - gonum.org/v1/gonum v0.15.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + gonum.org/v1/gonum v0.15.1 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/awss3exporter/go.sum b/exporter/awss3exporter/go.sum index c4c1ee9f700d..360b9e81d372 100644 --- a/exporter/awss3exporter/go.sum +++ b/exporter/awss3exporter/go.sum @@ -1,87 +1,102 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/aws/aws-sdk-go v1.53.11 h1:KcmduYvX15rRqt4ZU/7jKkmDxU/G87LJ9MUI0yQJh00= -github.com/aws/aws-sdk-go v1.53.11/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go-v2 v1.32.6 h1:7BokKRgRPuGmKkFMhEg/jSul+tB9VvXhcViILtfG8b4= +github.com/aws/aws-sdk-go-v2 v1.32.6/go.mod h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 h1:lL7IfaFzngfx0ZwUGOZdsFFnQ5uLvR0hWqqhyE7Q9M8= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7/go.mod h1:QraP0UcVlQJsmHfioCrveWOC1nbiWUl3ej08h4mXWoc= +github.com/aws/aws-sdk-go-v2/config v1.28.6 h1:D89IKtGrs/I3QXOLNTH93NJYtDhm8SYa9Q5CsPShmyo= +github.com/aws/aws-sdk-go-v2/config v1.28.6/go.mod h1:GDzxJ5wyyFSCoLkS+UhGB0dArhb9mI+Co4dHtoTxbko= +github.com/aws/aws-sdk-go-v2/credentials v1.17.47 h1:48bA+3/fCdi2yAwVt+3COvmatZ6jUDNkDTIsqDiMUdw= +github.com/aws/aws-sdk-go-v2/credentials v1.17.47/go.mod h1:+KdckOejLW3Ks3b0E3b5rHsr2f9yuORBum0WPnE5o5w= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21 h1:AmoU1pziydclFT/xRV+xXE/Vb8fttJCLRPv8oAkprc0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21/go.mod h1:AjUdLYe4Tgs6kpH4Bv7uMZo7pottoyHMn4eTcIcneaY= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.43 h1:iLdpkYZ4cXIQMO7ud+cqMWR1xK5ESbt1rvN77tRi1BY= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.43/go.mod h1:OgbsKPAswXDd5kxnR4vZov69p3oYjbvUyIRBAAV0y9o= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25 h1:s/fF4+yDQDoElYhfIVvSNyeCydfbuTKzhxSXDXCPasU= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25/go.mod h1:IgPfDv5jqFIzQSNbUEMoitNooSMXjRSDkhXv8jiROvU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25 h1:ZntTCl5EsYnhN/IygQEUugpdwbhdkom9uHcbCftiGgA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25/go.mod h1:DBdPrgeocww+CSl1C8cEV8PN1mHMBhuCDLpXezyvWkE= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.25 h1:r67ps7oHCYnflpgDy2LZU0MAQtQbYIOqNNnqGO6xQkE= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.25/go.mod h1:GrGY+Q4fIokYLtjCVB/aFfCVL6hhGUFl8inD18fDalE= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.6 h1:HCpPsWqmYQieU7SS6E9HXfdAMSud0pteVXieJmcpIRI= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.6/go.mod h1:ngUiVRCco++u+soRRVBIvBZxSMMvOVMXA4PJ36JLfSw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6 h1:50+XsN70RS7dwJ2CkVNXzj7U2L1HKP8nqTd3XWEXBN4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6/go.mod h1:WqgLmwY7so32kG01zD8CPTJWVWM+TzJoOVHwTg4aPug= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.6 h1:BbGDtTi0T1DYlmjBiCr/le3wzhA37O8QTC5/Ab8+EXk= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.6/go.mod h1:hLMJt7Q8ePgViKupeymbqI0la+t9/iYFBjxQCFwuAwI= +github.com/aws/aws-sdk-go-v2/service/s3 v1.71.0 h1:nyuzXooUNJexRT0Oy0UQY6AhOzxPxhtt4DcBIHyCnmw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.71.0/go.mod h1:sT/iQz8JK3u/5gZkT+Hmr7GzVZehUMkRZpOaAwYXeGY= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.7 h1:rLnYAfXQ3YAccocshIH5mzNNwZBkBo+bP6EhIxak6Hw= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.7/go.mod h1:ZHtuQJ6t9A/+YDuxOLnbryAmITtr8UysSny3qcyvJTc= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6 h1:JnhTZR3PiYDNKlXy50/pNeix9aGMo6lLpXwJ1mw8MD4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6/go.mod h1:URronUEGfXZN1VpdktPSD1EkAL9mfrV+2F4sjH38qOY= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.2 h1:s4074ZO1Hk8qv65GqNXqDjmkf4HSQqJukaLuuW0TpDA= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.2/go.mod h1:mVggCnIWoM09jP71Wh+ea7+5gAp53q+49wDFs1SW5z8= +github.com/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro= +github.com/aws/smithy-go v1.22.1/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= 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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/BE= +github.com/ebitengine/purego v0.8.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= @@ -93,43 +108,39 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/prometheus/common v0.61.0 h1:3gv/GThfX0cV2lpO7gkTUwZru38mxevy90Bj8YFSRQQ= +github.com/prometheus/common v0.61.0/go.mod h1:zr29OCN/2BsJRaFwG8QOBr41D6kkchKbpeNH7pAjb/s= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= -github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= -github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= -github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= -github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= -github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/shirou/gopsutil/v4 v4.24.11 h1:WaU9xqGFKvFfsUv94SXcUPD7rCkU0vr/asVdQOBZNj8= +github.com/shirou/gopsutil/v4 v4.24.11/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/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 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tilinna/clock v1.1.0 h1:6IQQQCo6KoBxVudv6gwtY8o4eDfhHo8ojA5dP0MfhSs= +github.com/tilinna/clock v1.1.0/go.mod h1:ZsP7BcY7sEEz7ktc0IVy8Us6boDrK8VradlKRUGfOao= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= @@ -138,96 +149,154 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/confignet v0.102.0 h1:+wQevJ/iBnPxL+roY7WWnAjMxB8v4M5QrS3+0iEmauw= -go.opentelemetry.io/collector/config/confignet v0.102.0/go.mod h1:pfOrCTfSZEB6H2rKtx41/3RN4dKs+X2EKQbw3MGRh0E= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0 h1:8Ne/oL6M4kMWK0P3FKV9EduQa+1UOGyVAnFHfSo4c1A= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0/go.mod h1:Xj4Ld/RriP/Bj+5oPpaYJsLNs2wWRDN2TvzX3Lbi6+M= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0 h1:o1iKqN+oM+TZqHoGdnKw1Am2BQlIGCYbxCRzU8T3jbM= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0/go.mod h1:JpCemLtL/sXQ2Rk3Bx7OPPA7Qt/9NVH91q0bR655gSo= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0 h1:SfASE6lxXjrmYj/UibcWdOiFWvRG0zt4hJgenloEhlY= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0/go.mod h1:+Ku0Fvdb5f6e9UkfqJXAV5FaUJVxxg6Ykfx7Js8y+V4= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0 h1:GwJQTXs7pYPUv/fVf+0nBgsJdlrTuY/PfwQ/TRA/sIk= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0/go.mod h1:PGE3DcRgqYWWC2cq2hYZoET1d3Q8JZyPNmgvqXPFWEU= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0 h1:zdYZLiHHtDf4Kk9WU7mW9dW6WAXtBF54I5jmTMRJtiw= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0/go.mod h1:yFsgUM0PbUJkPlbpJfOG6da+YiF0Z80tv7YcnL3qwv4= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0 h1:Y4H+GaCQl2URp9mEJMV5CYOhw+erONqNyvtFoKQfIoA= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0/go.mod h1:g1RjfVD0gHAf/mPOIs3zBoKBeuDsN+rc5x0lZtgA8tI= -go.opentelemetry.io/collector/connector v0.102.0 h1:IvAsVfYRxP0ajmKbUovF8qugkcUtHq6RuYNtjcMa63E= -go.opentelemetry.io/collector/connector v0.102.0/go.mod h1:f4M7wZ/9+XtgTE0fivBFH3WlwntaEd0qFFA0giFkdnY= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/zpagesextension v0.102.0 h1:BPq98py8nwzaV7KAsxt4ZZAF9LiSRu7ZjHNGavFNyKo= -go.opentelemetry.io/collector/extension/zpagesextension v0.102.0/go.mod h1:P86HW3x3epDS5F4yP0gAvsZiw4xxP1OupTEx2o6UqjY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/otelcol v0.102.0 h1:HuE+ok4iUjOrmYhQBSWpG5kBTVhcA24ljPL4pBERZ5E= -go.opentelemetry.io/collector/otelcol v0.102.0/go.mod h1:w8pCRu2nM/jAkLlEAS6ccKtJv5ylUQe6Ugl98zzTfyE= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/processor v0.102.0 h1:JsjTlpBRmoSYxcu3cAbKBchOmL6aNUxLa03ZkWIqZr8= -go.opentelemetry.io/collector/processor v0.102.0/go.mod h1:IaCSDcfy75uQTaOM+LgR1bMf/bUw2eFfzn20uvWYfLQ= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/collector/service v0.102.0 h1:B5nfyQZF7eB/y+yucl9G/7VsusbXixYXWingXn7VszM= -go.opentelemetry.io/collector/service v0.102.0/go.mod h1:c+0n0DfQeCjgrdplNHYwYbG/5aupTZVYU/50nMQraoc= -go.opentelemetry.io/contrib/config v0.7.0 h1:b1rK5tGTuhhPirJiMxOcyQfZs76j2VapY6ODn3b2Dbs= -go.opentelemetry.io/contrib/config v0.7.0/go.mod h1:8tdiFd8N5etOi3XzBmAoMxplEzI3TcL8dU5rM5/xcOQ= -go.opentelemetry.io/contrib/propagators/b3 v1.27.0 h1:IjgxbomVrV9za6bRi8fWCNXENs0co37SZedQilP2hm0= -go.opentelemetry.io/contrib/propagators/b3 v1.27.0/go.mod h1:Dv9obQz25lCisDvvs4dy28UPh974CxkahRDUPsY7y9E= -go.opentelemetry.io/contrib/zpages v0.52.0 h1:MPgkMy0Cp3O5EdfVXP0ss3ujhEibysTM4eszx7E7d+E= -go.opentelemetry.io/contrib/zpages v0.52.0/go.mod h1:fqG5AFdoYru3A3DnhibVuaaEfQV2WKxE7fYE1jgDRwk= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/bridge/opencensus v1.27.0 h1:ao9aGGHd+G4YfjBpGs6vbkvt5hoC67STlJA9fCnOAcs= -go.opentelemetry.io/otel/bridge/opencensus v1.27.0/go.mod h1:uRvWtAAXzyVOST0WMPX5JHGBaAvBws+2F8PcC5gMnTk= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 h1:bFgvUr3/O4PHj3VQcFEuYKvRZJX1SJDQ+11JXuSB3/w= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0/go.mod h1:xJntEd2KL6Qdg5lwp97HMLQDVeAhrYxmzFseAMDPQ8I= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 h1:CIHWikMsN3wO+wq1Tp5VGdVRTcON+DmOJSfDjXypKOc= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0/go.mod h1:TNupZ6cxqyFEpLXAZW7On+mLFL0/g0TE3unIYL91xWc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0 h1:/jlt1Y8gXWiHG9FBx6cJaIC5hYx5Fe64nC8w5Cylt/0= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0/go.mod h1:bmToOGOBZ4hA9ghphIc1PAf66VA8KOtsuy3+ScStG20= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 h1:/0YaXu3755A/cFbtXp+21lkXgI0QE5avTWA2HjU9/WE= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0/go.mod h1:m7SFxp0/7IxmJPLIY3JhOcU9CoFzDaCPL6xxQIxhA+o= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= -go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= -go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= +go.opentelemetry.io/collector v0.116.0 h1:Dscd6Nsnc7hjFQosO0SofcPQsXRfcj5N5PjQAslnmj4= +go.opentelemetry.io/collector v0.116.0/go.mod h1:Ug2hpW0SINPmJAGVEALRlux78NTZc3YXSuh5/Q/hFrA= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0 h1:AdHaQo/GSSRLJvEFLCMHo02r+u6Ed8j0/MNz7u3noug= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0/go.mod h1:InKYEGFdkwz3H2q648kT6rMCFBhPvevIW9ZbWIY5QR4= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0 h1:upFhnU8EyPp0WMR53mJIdx+UR2EGFOr+ppYKzUCY/Vg= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0/go.mod h1:FhjMWU5nf3IctX27lVZomM5SKMyRywShRsA4/rHoBe8= +go.opentelemetry.io/collector/confmap/provider/httpprovider v1.22.0 h1:jKLicfZRiA+G/sgso26aM6Dmmva4Dx9Txk2R58+R3e8= +go.opentelemetry.io/collector/confmap/provider/httpprovider v1.22.0/go.mod h1:nZhEGDufHuZAaeVyFVz15IluXwrnQRCp+U/w7j8Lx9Y= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.22.0 h1:dkiNwLxBqeNDN5fIwtvr2GoA0I2xZB2SEdQ9ceBbJVs= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.22.0/go.mod h1:P9SxKZvim1C3K1R2j3gI+Qb4/l9MffX2sY5f9ajsk7Y= +go.opentelemetry.io/collector/connector v0.116.0 h1:0Pz8RAXH1swLeA1fiyGGQWdv0Kemz4mbq+jnmd1TACE= +go.opentelemetry.io/collector/connector v0.116.0/go.mod h1:VQiZ2yW9KhZuF0yjDbvlgrAxm7+o8KQoxHxurQWLjKU= +go.opentelemetry.io/collector/connector/connectortest v0.116.0 h1:MdttvjqdZmp0ewW5IPCEtzzYmCqxrQxsjJ5m6gMVjzA= +go.opentelemetry.io/collector/connector/connectortest v0.116.0/go.mod h1:ko7aPyvAVf6SvRhWGZdPXSyk+7zPmsSCcMq0gYPMMIQ= +go.opentelemetry.io/collector/connector/xconnector v0.116.0 h1:fFJzrRco0g7HMkhnQ+ehlvicFf58vzsCLXnfuHyQM8w= +go.opentelemetry.io/collector/connector/xconnector v0.116.0/go.mod h1:m9oCk32zX6wDciYBpy+qMQkWKtOxb0gAkEUm8+trflY= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0 h1:bXDgoiDiwFfrO5S6q1Wpe0su303CW4Qxthoy4CxG6eg= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0/go.mod h1:uFZlAPxk2+s6zk1W+u22DgxxSDugWy0QaY5kQzjNy7Q= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/extension/zpagesextension v0.116.0 h1:D0VY/ESPwkREfMaqJleGVTiCYoCs3MDipU93ywaIn68= +go.opentelemetry.io/collector/extension/zpagesextension v0.116.0/go.mod h1:MqkQSYKarMrjVSyGrAes1FBcsW6HDDPj/ouvcDvSjfk= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 h1:KKFb3u8iLk4V5GYz7eVpw8QgEdob5koX6GNEbaoDQJY= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0/go.mod h1:YyWHUWeSnRmy2CF7kPHpwJ6qkVjufbLZ8PYuY0Ph0o8= +go.opentelemetry.io/collector/otelcol v0.116.0 h1:8NoPEY2uAemwNzUcMxiZuuI8w/Ff+0p1DXXk6NVEGlk= +go.opentelemetry.io/collector/otelcol v0.116.0/go.mod h1:c/EhsBdHmC44SxhWMi7pTlYB+I6GBSJNBsj9NCwXMxM= +go.opentelemetry.io/collector/otelcol/otelcoltest v0.116.0 h1:ZNg2kFLKnreaGSMfbr74k1yEbHLxG4ZbVvSIr+XleXo= +go.opentelemetry.io/collector/otelcol/otelcoltest v0.116.0/go.mod h1:TruQJSWWiDRlSYZTcLSE0GeECJZALDw8X8dvoYXUJ+A= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 h1:PFNy+Il/kqPdPL9rhG+1kG63Aauya+FhBKGXoB6ivxU= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0/go.mod h1:bVn9V4TGyeXi58/JDkeXCuKtc+V+qcOoTl8hNpV0qa8= +go.opentelemetry.io/collector/processor v0.116.0 h1:Kyu4tPzTdWNHtZjcxvI/bGNAgyv8L8Kem2r/Mk4IDAw= +go.opentelemetry.io/collector/processor v0.116.0/go.mod h1:+/Ugy48RAxlZEXmN2cw51W8t5wdHS9No+GAoP+moskk= +go.opentelemetry.io/collector/processor/processortest v0.116.0 h1:+IqNEVEE0E2MsO2g7+Y/9dz35sDuvAXRXrLts9NdXrA= +go.opentelemetry.io/collector/processor/processortest v0.116.0/go.mod h1:DLaQDBxzgeeaUO0ULMn/efos9PmHZkmYCHuxwCsiVHI= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0 h1:iin/UwuWvSLB7ZNfINFUYbZ5lxIi1NjZ2brkyyFdiRA= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0/go.mod h1:cnA43/XpKDbaOmd8buqKp/LGJ2l/OoCqbR//u5DMfn8= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/collector/service v0.116.0 h1:1rFmax3ILOlQq4bW//0VKRcG/HmN2rxrgfTybn6bisU= +go.opentelemetry.io/collector/service v0.116.0/go.mod h1:CzQzj72mWr5arag+q8uUWGRuUkenNo5Gw9oA97SFZ78= +go.opentelemetry.io/contrib/bridges/otelzap v0.6.0 h1:j8icMXyyqNf6HGuwlYhniPnVsbJIq7n+WirDu3VAJdQ= +go.opentelemetry.io/contrib/bridges/otelzap v0.6.0/go.mod h1:evIOZpl+kAlU5IsaYX2Siw+IbpacAZvXemVsgt70uvw= +go.opentelemetry.io/contrib/config v0.10.0 h1:2JknAzMaYjxrHkTnZh3eOme/Y2P5eHE2SWfhfV6Xd6c= +go.opentelemetry.io/contrib/config v0.10.0/go.mod h1:aND2M6/KfNkntI5cyvHriR/zvZgPf8j9yETdSmvpfmc= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/contrib/propagators/b3 v1.31.0 h1:PQPXYscmwbCp76QDvO4hMngF2j8Bx/OTV86laEl8uqo= +go.opentelemetry.io/contrib/propagators/b3 v1.31.0/go.mod h1:jbqfV8wDdqSDrAYxVpXQnpM0XFMq2FtDesblJ7blOwQ= +go.opentelemetry.io/contrib/zpages v0.56.0 h1:W7vP6s3juzL5KiHpr41zLNmsJ0QAZudYu8ay0zGAoko= +go.opentelemetry.io/contrib/zpages v0.56.0/go.mod h1:IxPRP4TYHw9jLeaEOSDIiA9zmyJNZNO6sbW55iMvSXs= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 h1:mMOmtYie9Fx6TSVzw4W+NTpvoaS1JWWga37oI1a/4qQ= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0/go.mod h1:yy7nDsMMBUkD+jeekJ36ur5f3jJIrmCwUrY67VFhNpA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 h1:j7ZSD+5yn+lo3sGV69nW04rRR0jhYnBwjuX3r0HvnK0= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0/go.mod h1:WXbYJTUaZXAbYd8lbgGuvih0yuCfOFC5RJoYnoLcGz8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 h1:t/Qur3vKSkUCcDVaSumWF2PKHt85pc7fRvFuoVT8qFU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0/go.mod h1:Rl61tySSdcOJWoEgYZVtmnKdA0GeKrSqkHC1t+91CH8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 h1:K0XaT3DwHAcV4nKLzcQvwAgSyisUghWoY20I7huthMk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0/go.mod h1:B5Ki776z/MBnVha1Nzwp5arlzBbE3+1jk+pGmaP5HME= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy03iVTXP6ffeN2iXrxfGsZGCjVx0/4KlizjyBwU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0/go.mod h1:TMu73/k1CP8nBUpDLc71Wj/Kf7ZS9FK5b53VapRsP9o= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 h1:lUsI2TYsQw2r1IASwoROaCnjdj2cvC2+Jbxvk6nHnWU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0/go.mod h1:2HpZxxQurfGxJlJDblybejHB6RX6pmExPNe517hREw4= +go.opentelemetry.io/otel/exporters/prometheus v0.54.0 h1:rFwzp68QMgtzu9PgP3jm9XaMICI6TsofWWPcBDKwlsU= +go.opentelemetry.io/otel/exporters/prometheus v0.54.0/go.mod h1:QyjcV9qDP6VeK5qPyKETvNjmaaEc7+gqjh4SS0ZYzDU= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 h1:TwmL3O3fRR80m8EshBrd8YydEZMcUCsZXzOUlnFohwM= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0/go.mod h1:tH98dDv5KPmPThswbXA0fr0Lwfs+OhK8HgaCo7PjRrk= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 h1:SZmDnHcgp3zwlPBS2JX2urGYe/jBKEIT6ZedHRUyCz8= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0/go.mod h1:fdWW0HtZJ7+jNpTKUR0GpMEDP69nR8YBJQxNiVCE3jk= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 h1:UGZ1QwZWY67Z6BmckTU+9Rxn04m2bD3gD6Mk0OIOCPk= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0/go.mod h1:fcwWuDuaObkkChiDlhEpSq9+X1C0omv+s5mBtToAQ64= +go.opentelemetry.io/otel/log v0.8.0 h1:egZ8vV5atrUWUbnSsHn6vB8R21G2wrKqNiDt3iWertk= +go.opentelemetry.io/otel/log v0.8.0/go.mod h1:M9qvDdUTRCopJcGRKg57+JSQ9LgLBrwwfC32epk5NX8= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/log v0.7.0 h1:dXkeI2S0MLc5g0/AwxTZv6EUEjctiH8aG14Am56NTmQ= +go.opentelemetry.io/otel/sdk/log v0.7.0/go.mod h1:oIRXpW+WD6M8BuGj5rtS0aRu/86cbDV/dAfNaZBIjYM= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -237,32 +306,19 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -270,18 +326,13 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -289,43 +340,18 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= -gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 h1:P8OJ/WCl/Xo4E4zoe4/bifHpSmmKwARqyqE4nW6J2GQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= +gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/exporter/awss3exporter/internal/metadata/generated_status.go b/exporter/awss3exporter/internal/metadata/generated_status.go index 7d8badeaae06..3420c10ba95a 100644 --- a/exporter/awss3exporter/internal/metadata/generated_status.go +++ b/exporter/awss3exporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("awss3") + Type = component.MustNewType("awss3") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awss3exporter" ) const ( diff --git a/exporter/awss3exporter/internal/metadata/generated_telemetry.go b/exporter/awss3exporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index c86cf35310a6..000000000000 --- a/exporter/awss3exporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/awss3") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/awss3") -} diff --git a/exporter/awss3exporter/internal/metadata/generated_telemetry_test.go b/exporter/awss3exporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 7acaff5acadb..000000000000 --- a/exporter/awss3exporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/awss3", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/awss3", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/awss3exporter/internal/upload/partition.go b/exporter/awss3exporter/internal/upload/partition.go new file mode 100644 index 000000000000..86bdab5c6511 --- /dev/null +++ b/exporter/awss3exporter/internal/upload/partition.go @@ -0,0 +1,91 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package upload // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awss3exporter/internal/upload" + +import ( + "fmt" + "math/rand/v2" + "strconv" + "time" + + "go.opentelemetry.io/collector/config/configcompression" +) + +var compressionFileExtensions = map[configcompression.Type]string{ + configcompression.TypeGzip: ".gz", +} + +type PartitionKeyBuilder struct { + // PartitionPrefix defines the S3 directory (key) + // prefix used to write the file + PartitionPrefix string + // PartitionTruncation is used to truncate values into + // different time buckets. + // Currently hourly or minutely is supported + PartitionTruncation string + // FilePrefix is used to define the prefix of the file written + // to the directory in S3. + FilePrefix string + // FileFormat defines what encoding was used to write + // the content to s3 + FileFormat string + // Metadata provides additional details regarding the file + // Expected to be one of "metrics", "traces", or "logs" + Metadata string + // Compression defines algorithm used on the + // body before uploaded. + Compression configcompression.Type + // UniqueKeyFunc allows for overwritting the default behavior of + // generating a new unique string to avoid collosions on file upload + // across many different instances. + // + // TODO: Expose the ability to config additional UniqueKeyField via config + UniqueKeyFunc func() string +} + +func (pki *PartitionKeyBuilder) Build(ts time.Time) string { + return pki.bucketKeyPrefix(ts) + "/" + pki.fileName() +} + +func (pki *PartitionKeyBuilder) bucketKeyPrefix(ts time.Time) string { + key := fmt.Sprintf("year=%d/month=%02d/day=%02d/hour=%02d", ts.Year(), ts.Month(), ts.Day(), ts.Hour()) + + switch pki.PartitionTruncation { + case "minute": + key += "/" + fmt.Sprintf("minute=%02d", ts.Minute()) + default: + // Nothing to do, key defaults to hourly + } + + return pki.PartitionPrefix + "/" + key +} + +func (pki *PartitionKeyBuilder) fileName() string { + var suffix string + + if pki.FileFormat != "" { + suffix = "." + pki.FileFormat + } + + if ext, ok := compressionFileExtensions[pki.Compression]; ok { + suffix += ext + } + + return pki.FilePrefix + pki.Metadata + "_" + pki.uniqueKey() + suffix +} + +func (pki *PartitionKeyBuilder) uniqueKey() string { + if pki.UniqueKeyFunc != nil { + return pki.UniqueKeyFunc() + } + + // This follows the original "uniqueness" algorithm + // to avoid collosions on file uploads across different nodes. + const ( + uniqueValues = 999999999 + minOffset = 100000000 + ) + + return strconv.Itoa(minOffset + rand.IntN(uniqueValues-minOffset)) +} diff --git a/exporter/awss3exporter/internal/upload/partition_test.go b/exporter/awss3exporter/internal/upload/partition_test.go new file mode 100644 index 000000000000..293fa58aa8c2 --- /dev/null +++ b/exporter/awss3exporter/internal/upload/partition_test.go @@ -0,0 +1,186 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package upload + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" + "go.opentelemetry.io/collector/config/configcompression" +) + +func TestPartitionKeyInputsNewPartitionKey(t *testing.T) { + t.Parallel() + + for _, tc := range []struct { + name string + inputs *PartitionKeyBuilder + expect string + }{ + { + name: "empty values", + inputs: &PartitionKeyBuilder{ + UniqueKeyFunc: func() string { + return "fixed" + }, + }, + expect: "/year=2024/month=01/day=24/hour=06/_fixed", + }, + { + name: "no compression set", + inputs: &PartitionKeyBuilder{ + PartitionPrefix: "/telemetry", + PartitionTruncation: "minute", + FilePrefix: "signal-output-", + Metadata: "service-01_pod2", + FileFormat: "metrics", + UniqueKeyFunc: func() string { + return "fixed" + }, + }, + expect: "/telemetry/year=2024/month=01/day=24/hour=06/minute=40/signal-output-service-01_pod2_fixed.metrics", + }, + { + name: "gzip compression set", + inputs: &PartitionKeyBuilder{ + PartitionPrefix: "/telemetry", + PartitionTruncation: "minute", + FilePrefix: "signal-output-", + Metadata: "service-01_pod2", + FileFormat: "metrics", + Compression: configcompression.TypeGzip, + UniqueKeyFunc: func() string { + return "fixed" + }, + }, + expect: "/telemetry/year=2024/month=01/day=24/hour=06/minute=40/signal-output-service-01_pod2_fixed.metrics.gz", + }, + } { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + ts := time.Date(2024, 0o1, 24, 6, 40, 20, 0, time.Local) + + assert.Equal(t, tc.expect, tc.inputs.Build(ts), "Must match the expected value") + }) + } +} + +func TestPartitionKeyInputsBucketPrefix(t *testing.T) { + t.Parallel() + + for _, tc := range []struct { + name string + inputs *PartitionKeyBuilder + expect string + }{ + { + name: "no values provided", + inputs: &PartitionKeyBuilder{}, + expect: "/year=2024/month=01/day=24/hour=06", + }, + { + name: "parition by minutes", + inputs: &PartitionKeyBuilder{ + PartitionTruncation: "minute", + }, + expect: "/year=2024/month=01/day=24/hour=06/minute=40", + }, + { + name: "unknown partition trunction value", + inputs: &PartitionKeyBuilder{ + PartitionTruncation: "weekly", + }, + expect: "/year=2024/month=01/day=24/hour=06", + }, + } { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + ts := time.Date(2024, 0o1, 24, 6, 40, 20, 0, time.Local) + + assert.Equal(t, tc.expect, tc.inputs.bucketKeyPrefix(ts), "Must match the expected partition key") + }) + } +} + +func TestPartitionKeyInputsFilename(t *testing.T) { + t.Parallel() + + for _, tc := range []struct { + name string + inputs *PartitionKeyBuilder + expect string + }{ + { + name: "no values provided", + inputs: &PartitionKeyBuilder{ + UniqueKeyFunc: func() string { + return "buzz" + }, + }, + expect: "_buzz", + }, + { + name: "no compression provided", + inputs: &PartitionKeyBuilder{ + FilePrefix: "collector-capture-", + FileFormat: "metrics", + Metadata: "service-01_pod1", + UniqueKeyFunc: func() string { + return "buzz" + }, + }, + expect: "collector-capture-service-01_pod1_buzz.metrics", + }, + { + name: "valid compression set", + inputs: &PartitionKeyBuilder{ + FilePrefix: "collector-capture-", + FileFormat: "metrics", + Metadata: "service-01_pod1", + Compression: configcompression.TypeGzip, + UniqueKeyFunc: func() string { + return "buzz" + }, + }, + expect: "collector-capture-service-01_pod1_buzz.metrics.gz", + }, + { + name: "invalid compression set", + inputs: &PartitionKeyBuilder{ + FilePrefix: "collector-capture-", + FileFormat: "metrics", + Metadata: "service-01_pod1", + Compression: configcompression.Type("foo"), + UniqueKeyFunc: func() string { + return "buzz" + }, + }, + expect: "collector-capture-service-01_pod1_buzz.metrics", + }, + } { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + assert.Equal(t, tc.expect, tc.inputs.fileName(), "Must match the expected value") + }) + } +} + +func TestPartitionKeyInputsUniqueKey(t *testing.T) { + t.Parallel() + + // This test to is to help validate that a unique key + // is not repeated + + seen := make(map[string]struct{}) + for i := 0; i < 500; i++ { + uv := (&PartitionKeyBuilder{}).uniqueKey() + _, ok := seen[uv] + assert.False(t, ok, "Must not have repeated parition key %q", uv) + seen[uv] = struct{}{} + } +} diff --git a/exporter/awss3exporter/internal/upload/writer.go b/exporter/awss3exporter/internal/upload/writer.go new file mode 100644 index 000000000000..282b1e96b881 --- /dev/null +++ b/exporter/awss3exporter/internal/upload/writer.go @@ -0,0 +1,82 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package upload // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awss3exporter/internal/upload" + +import ( + "bytes" + "compress/gzip" + "context" + + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/feature/s3/manager" + "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/tilinna/clock" + "go.opentelemetry.io/collector/config/configcompression" +) + +type Manager interface { + Upload(ctx context.Context, data []byte) error +} + +type s3manager struct { + bucket string + builder *PartitionKeyBuilder + uploader *manager.Uploader +} + +var _ Manager = (*s3manager)(nil) + +func NewS3Manager(bucket string, builder *PartitionKeyBuilder, service *s3.Client) Manager { + return &s3manager{ + bucket: bucket, + builder: builder, + uploader: manager.NewUploader(service), + } +} + +func (sw *s3manager) Upload(ctx context.Context, data []byte) error { + if len(data) == 0 { + return nil + } + + content, err := sw.contentBuffer(data) + if err != nil { + return err + } + + encoding := "" + if sw.builder.Compression.IsCompressed() { + encoding = string(sw.builder.Compression) + } + + now := clock.Now(ctx) + + _, err = sw.uploader.Upload(ctx, &s3.PutObjectInput{ + Bucket: aws.String(sw.bucket), + Key: aws.String(sw.builder.Build(now)), + Body: content, + ContentEncoding: aws.String(encoding), + }) + + return err +} + +func (sw *s3manager) contentBuffer(raw []byte) (*bytes.Buffer, error) { + //nolint: gocritic // Leaving this as a switch statemenet to make it easier to add more later compressions + switch sw.builder.Compression { + case configcompression.TypeGzip: + content := bytes.NewBuffer(nil) + + zipper := gzip.NewWriter(content) + if _, err := zipper.Write(raw); err != nil { + return nil, err + } + if err := zipper.Close(); err != nil { + return nil, err + } + + return content, nil + } + return bytes.NewBuffer(raw), nil +} diff --git a/exporter/awss3exporter/internal/upload/writer_test.go b/exporter/awss3exporter/internal/upload/writer_test.go new file mode 100644 index 000000000000..cb722933aa81 --- /dev/null +++ b/exporter/awss3exporter/internal/upload/writer_test.go @@ -0,0 +1,159 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package upload + +import ( + "compress/gzip" + "context" + "io" + "net/http" + "net/http/httptest" + "testing" + "time" + + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/stretchr/testify/assert" + "github.com/tilinna/clock" + "go.opentelemetry.io/collector/config/configcompression" +) + +func TestNewS3Manager(t *testing.T) { + t.Parallel() + + sm := NewS3Manager( + "my-bucket", + &PartitionKeyBuilder{}, + s3.New(s3.Options{}), + ) + + assert.NotNil(t, sm, "Must have a valid client returned") +} + +func TestS3ManagerUpload(t *testing.T) { + t.Parallel() + + for _, tc := range []struct { + name string + handler func(t *testing.T) http.Handler + compression configcompression.Type + data []byte + errVal string + }{ + { + name: "successful upload", + handler: func(t *testing.T) http.Handler { + return http.HandlerFunc(func(_ http.ResponseWriter, r *http.Request) { + _, _ = io.Copy(io.Discard, r.Body) + _ = r.Body.Close() + + assert.Equal( + t, + "/my-bucket/telemetry/year=2024/month=01/day=10/hour=10/minute=30/signal-data-noop_random.metrics", + r.URL.Path, + "Must match the expected path", + ) + }) + }, + compression: configcompression.Type(""), + data: []byte("hello world"), + errVal: "", + }, + { + name: "successful compression upload", + handler: func(t *testing.T) http.Handler { + return http.HandlerFunc(func(_ http.ResponseWriter, r *http.Request) { + assert.Equal( + t, + "/my-bucket/telemetry/year=2024/month=01/day=10/hour=10/minute=30/signal-data-noop_random.metrics.gz", + r.URL.Path, + "Must match the expected path", + ) + + gr, err := gzip.NewReader(r.Body) + if !assert.NoError(t, err, "Must not error creating gzip reader") { + return + } + + data, err := io.ReadAll(gr) + assert.Equal(t, []byte("hello world"), data, "Must match the expected data") + assert.NoError(t, err, "Must not error reading data from reader") + + _ = gr.Close() + _ = r.Body.Close() + }) + }, + compression: configcompression.TypeGzip, + data: []byte("hello world"), + errVal: "", + }, + { + name: "no data upload", + handler: func(t *testing.T) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + _, _ = io.Copy(io.Discard, r.Body) + _ = r.Body.Close() + + assert.Fail(t, "Must not call handler when no data is provided") + w.WriteHeader(http.StatusBadRequest) + }) + }, + data: nil, + errVal: "", + }, + { + name: "failed upload", + handler: func(_ *testing.T) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + _, _ = io.Copy(io.Discard, r.Body) + _ = r.Body.Close() + + http.Error(w, "Invalid ARN provided", http.StatusUnauthorized) + }) + }, + data: []byte("good payload"), + errVal: "operation error S3: PutObject, https response error StatusCode: 401, RequestID: , HostID: , api error Unauthorized: Unauthorized", + }, + } { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + s := httptest.NewServer(tc.handler(t)) + t.Cleanup(s.Close) + + sm := NewS3Manager( + "my-bucket", + &PartitionKeyBuilder{ + PartitionPrefix: "telemetry", + PartitionTruncation: "minute", + FilePrefix: "signal-data-", + Metadata: "noop", + FileFormat: "metrics", + Compression: tc.compression, + UniqueKeyFunc: func() string { + return "random" + }, + }, + s3.New(s3.Options{ + BaseEndpoint: aws.String(s.URL), + Region: "local", + }), + ) + + // Using a mocked virtual clock to fix the timestamp used + // to reduce the potential of flakey tests + mc := clock.NewMock(time.Date(2024, 0o1, 10, 10, 30, 40, 100, time.Local)) + + err := sm.Upload( + clock.Context(context.Background(), mc), + tc.data, + ) + if tc.errVal != "" { + assert.EqualError(t, err, tc.errVal, "Must match the expected error") + } else { + assert.NoError(t, err, "Must not have return an error") + } + }) + } +} diff --git a/exporter/awss3exporter/marshaler.go b/exporter/awss3exporter/marshaler.go index 57ac6455d823..006cdf45c526 100644 --- a/exporter/awss3exporter/marshaler.go +++ b/exporter/awss3exporter/marshaler.go @@ -21,9 +21,7 @@ type marshaler interface { format() string } -var ( - ErrUnknownMarshaler = errors.New("unknown marshaler") -) +var ErrUnknownMarshaler = errors.New("unknown marshaler") func newMarshalerFromEncoding(encoding *component.ID, fileFormat string, host component.Host, logger *zap.Logger) (marshaler, error) { marshaler := &s3Marshaler{logger: logger} diff --git a/exporter/awss3exporter/marshaler_test.go b/exporter/awss3exporter/marshaler_test.go index 9a56d83d1f6f..c6aaefe51806 100644 --- a/exporter/awss3exporter/marshaler_test.go +++ b/exporter/awss3exporter/marshaler_test.go @@ -19,19 +19,19 @@ func TestMarshaler(t *testing.T) { m, err := newMarshaler("otlp_json", zap.NewNop()) assert.NoError(t, err) require.NotNil(t, m) - assert.Equal(t, m.format(), "json") + assert.Equal(t, "json", m.format()) } { m, err := newMarshaler("otlp_proto", zap.NewNop()) assert.NoError(t, err) require.NotNil(t, m) - assert.Equal(t, m.format(), "binpb") + assert.Equal(t, "binpb", m.format()) } { m, err := newMarshaler("sumo_ic", zap.NewNop()) assert.NoError(t, err) require.NotNil(t, m) - assert.Equal(t, m.format(), "json.gz") + assert.Equal(t, "json.gz", m.format()) } { m, err := newMarshaler("unknown", zap.NewNop()) @@ -42,7 +42,7 @@ func TestMarshaler(t *testing.T) { m, err := newMarshaler("body", zap.NewNop()) assert.NoError(t, err) require.NotNil(t, m) - assert.Equal(t, m.format(), "txt") + assert.Equal(t, "txt", m.format()) } } @@ -50,30 +50,13 @@ type hostWithExtensions struct { encoding encodingExtension } -func (h hostWithExtensions) Start(context.Context, component.Host) error { - panic("unsupported") -} - -func (h hostWithExtensions) Shutdown(context.Context) error { - panic("unsupported") -} - -func (h hostWithExtensions) GetFactory(component.Kind, component.Type) component.Factory { - panic("unsupported") -} - func (h hostWithExtensions) GetExtensions() map[component.ID]component.Component { return map[component.ID]component.Component{ component.MustNewID("foo"): h.encoding, } } -func (h hostWithExtensions) GetExporters() map[component.DataType]map[component.ID]component.Component { - panic("unsupported") -} - -type encodingExtension struct { -} +type encodingExtension struct{} func (e encodingExtension) Start(_ context.Context, _ component.Host) error { panic("unsupported") diff --git a/exporter/awss3exporter/metadata.yaml b/exporter/awss3exporter/metadata.yaml index 9e41b330e1f7..58bbdaed0730 100644 --- a/exporter/awss3exporter/metadata.yaml +++ b/exporter/awss3exporter/metadata.yaml @@ -1,5 +1,4 @@ type: awss3 -scope_name: otelcol/awss3 status: class: exporter @@ -11,3 +10,8 @@ status: tests: expect_consumer_error: true + goleak: + ignore: + top: + - "net/http.(*persistConn).writeLoop" + - "internal/poll.runtime_pollWait" diff --git a/exporter/awss3exporter/s3_writer.go b/exporter/awss3exporter/s3_writer.go index 38376c45605d..e85e755f3ff9 100644 --- a/exporter/awss3exporter/s3_writer.go +++ b/exporter/awss3exporter/s3_writer.go @@ -4,131 +4,71 @@ package awss3exporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awss3exporter" import ( - "bytes" - "compress/gzip" "context" - "fmt" - "math/rand" - "strconv" - "time" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/credentials/stscreds" - "github.com/aws/aws-sdk-go/aws/session" - "github.com/aws/aws-sdk-go/service/s3/s3manager" - "go.opentelemetry.io/collector/config/configcompression" -) - -type s3Writer struct { -} - -// generate the s3 time key based on partition configuration -func getTimeKey(time time.Time, partition string) string { - var timeKey string - year, month, day := time.Date() - hour, minute, _ := time.Clock() - - if partition == "hour" { - timeKey = fmt.Sprintf("year=%d/month=%02d/day=%02d/hour=%02d", year, month, day, hour) - } else { - timeKey = fmt.Sprintf("year=%d/month=%02d/day=%02d/hour=%02d/minute=%02d", year, month, day, hour, minute) - } - return timeKey -} + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/credentials/stscreds" + "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/aws/aws-sdk-go-v2/service/sts" -func randomInRange(low, hi int) int { - return low + rand.Intn(hi-low) -} - -func getS3Key(time time.Time, keyPrefix string, partition string, filePrefix string, metadata string, fileFormat string, compression configcompression.Type) string { - timeKey := getTimeKey(time, partition) - randomID := randomInRange(100000000, 999999999) - suffix := "" - if fileFormat != "" { - suffix = "." + fileFormat - } - - s3Key := keyPrefix + "/" + timeKey + "/" + filePrefix + metadata + "_" + strconv.Itoa(randomID) + suffix - - // add ".gz" extension to files if compression is enabled - if compression == configcompression.TypeGzip { - s3Key += ".gz" - } + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awss3exporter/internal/upload" +) - return s3Key -} +func newUploadManager( + ctx context.Context, + conf *Config, + metadata string, + format string, +) (upload.Manager, error) { + configOpts := []func(*config.LoadOptions) error{} -func getSessionConfig(config *Config) *aws.Config { - sessionConfig := &aws.Config{ - Region: aws.String(config.S3Uploader.Region), - S3ForcePathStyle: &config.S3Uploader.S3ForcePathStyle, - DisableSSL: &config.S3Uploader.DisableSSL, + if region := conf.S3Uploader.Region; region != "" { + configOpts = append(configOpts, config.WithRegion(region)) } - endpoint := config.S3Uploader.Endpoint - if endpoint != "" { - sessionConfig.Endpoint = aws.String(endpoint) + cfg, err := config.LoadDefaultConfig(ctx, configOpts...) + if err != nil { + return nil, err } - return sessionConfig -} - -func getSession(config *Config, sessionConfig *aws.Config) (*session.Session, error) { - sess, err := session.NewSession(sessionConfig) - - if config.S3Uploader.RoleArn != "" { - credentials := stscreds.NewCredentials(sess, config.S3Uploader.RoleArn) - sess.Config.Credentials = credentials + s3Opts := []func(*s3.Options){ + func(o *s3.Options) { + o.EndpointOptions = s3.EndpointResolverOptions{ + DisableHTTPS: conf.S3Uploader.DisableSSL, + } + o.UsePathStyle = conf.S3Uploader.S3ForcePathStyle + }, } - return sess, err -} - -func (s3writer *s3Writer) writeBuffer(_ context.Context, buf []byte, config *Config, metadata string, format string) error { - now := time.Now() - key := getS3Key(now, - config.S3Uploader.S3Prefix, config.S3Uploader.S3Partition, - config.S3Uploader.FilePrefix, metadata, format, config.S3Uploader.Compression) - - encoding := "" - var reader *bytes.Reader - if config.S3Uploader.Compression == configcompression.TypeGzip { - // set s3 uploader content encoding to "gzip" - encoding = "gzip" - var gzipContents bytes.Buffer - - // create a gzip from data - gzipWriter := gzip.NewWriter(&gzipContents) - _, err := gzipWriter.Write(buf) - if err != nil { - return err - } - gzipWriter.Close() - - reader = bytes.NewReader(gzipContents.Bytes()) - } else { - // create a reader from data in memory - reader = bytes.NewReader(buf) + if conf.S3Uploader.Endpoint != "" { + s3Opts = append(s3Opts, func(o *s3.Options) { + o.BaseEndpoint = aws.String((conf.S3Uploader.Endpoint)) + }) } - sessionConfig := getSessionConfig(config) - sess, err := getSession(config, sessionConfig) - - if err != nil { - return err + if arn := conf.S3Uploader.RoleArn; arn != "" { + s3Opts = append(s3Opts, func(o *s3.Options) { + o.Credentials = stscreds.NewAssumeRoleProvider(sts.NewFromConfig(cfg), arn) + }) } - uploader := s3manager.NewUploader(sess) - - _, err = uploader.Upload(&s3manager.UploadInput{ - Bucket: aws.String(config.S3Uploader.S3Bucket), - Key: aws.String(key), - Body: reader, - ContentEncoding: &encoding, - }) - if err != nil { - return err + if endpoint := conf.S3Uploader.Endpoint; endpoint != "" { + s3Opts = append(s3Opts, func(o *s3.Options) { + o.BaseEndpoint = aws.String(endpoint) + }) } - return nil + return upload.NewS3Manager( + conf.S3Uploader.S3Bucket, + &upload.PartitionKeyBuilder{ + PartitionPrefix: conf.S3Uploader.S3Prefix, + PartitionTruncation: conf.S3Uploader.S3Partition, + FilePrefix: conf.S3Uploader.FilePrefix, + Metadata: metadata, + FileFormat: format, + Compression: conf.S3Uploader.Compression, + }, + s3.NewFromConfig(cfg, s3Opts...), + ), nil } diff --git a/exporter/awss3exporter/s3_writer_test.go b/exporter/awss3exporter/s3_writer_test.go index 6df1998b07d5..945790562097 100644 --- a/exporter/awss3exporter/s3_writer_test.go +++ b/exporter/awss3exporter/s3_writer_test.go @@ -4,145 +4,57 @@ package awss3exporter import ( - "regexp" + "context" "testing" - "time" - "github.com/aws/aws-sdk-go/aws" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/config/configcompression" ) -func TestS3TimeKey(t *testing.T) { - const layout = "2006-01-02" - - tm, err := time.Parse(layout, "2022-06-05") - timeKey := getTimeKey(tm, "hour") - - assert.NoError(t, err) - require.NotNil(t, tm) - assert.Equal(t, "year=2022/month=06/day=05/hour=00", timeKey) - - timeKey = getTimeKey(tm, "minute") - assert.Equal(t, "year=2022/month=06/day=05/hour=00/minute=00", timeKey) -} - -func TestS3Key(t *testing.T) { - const layout = "2006-01-02" - - tm, err := time.Parse(layout, "2022-06-05") - - assert.NoError(t, err) - require.NotNil(t, tm) - - re := regexp.MustCompile(`keyprefix/year=2022/month=06/day=05/hour=00/minute=00/fileprefixlogs_([0-9]+).json`) - s3Key := getS3Key(tm, "keyprefix", "minute", "fileprefix", "logs", "json", "") - matched := re.MatchString(s3Key) - assert.Equal(t, true, matched) -} - -func TestS3KeyEmptyFileFormat(t *testing.T) { - const layout = "2006-01-02" - - tm, err := time.Parse(layout, "2022-06-05") - - assert.NoError(t, err) - require.NotNil(t, tm) - - re := regexp.MustCompile(`keyprefix/year=2022/month=06/day=05/hour=00/minute=00/fileprefixlogs_([0-9]+)`) - s3Key := getS3Key(tm, "keyprefix", "minute", "fileprefix", "logs", "", "") - matched := re.MatchString(s3Key) - assert.Equal(t, true, matched) -} - -func TestS3KeyOfCompressedFile(t *testing.T) { - const layout = "2006-01-02" - - tm, err := time.Parse(layout, "2022-06-05") - - assert.NoError(t, err) - require.NotNil(t, tm) - - re := regexp.MustCompile(`keyprefix/year=2022/month=06/day=05/hour=00/minute=00/fileprefixlogs_([0-9]+).json.gz`) - s3Key := getS3Key(tm, "keyprefix", "minute", "fileprefix", "logs", "json", "gzip") - matched := re.MatchString(s3Key) - assert.Equal(t, true, matched) -} - -func TestS3KeyOfCompressedFileEmptyFileFormat(t *testing.T) { - const layout = "2006-01-02" - - tm, err := time.Parse(layout, "2022-06-05") - - assert.NoError(t, err) - require.NotNil(t, tm) - - re := regexp.MustCompile(`keyprefix/year=2022/month=06/day=05/hour=00/minute=00/fileprefixlogs_([0-9]+).gz`) - s3Key := getS3Key(tm, "keyprefix", "minute", "fileprefix", "logs", "", "gzip") - matched := re.MatchString(s3Key) - assert.Equal(t, true, matched) -} - -func TestGetSessionConfigWithEndpoint(t *testing.T) { - const endpoint = "https://endpoint.com" - const region = "region" - config := &Config{ - S3Uploader: S3UploaderConfig{ - Region: region, - Endpoint: endpoint, - }, - } - sessionConfig := getSessionConfig(config) - assert.Equal(t, sessionConfig.Endpoint, aws.String(endpoint)) - assert.Equal(t, sessionConfig.Region, aws.String(region)) -} - -func TestGetSessionConfigNoEndpoint(t *testing.T) { - const region = "region" - config := &Config{ - S3Uploader: S3UploaderConfig{ - Region: region, - }, - } - sessionConfig := getSessionConfig(config) - assert.Empty(t, sessionConfig.Endpoint) - assert.Equal(t, sessionConfig.Region, aws.String(region)) -} - -func TestGetSessionConfigWithRoleArn(t *testing.T) { - const region = "region" - const roleArn = "arn:aws:iam::12345:role/s3-exportation-role" - config := &Config{ - S3Uploader: S3UploaderConfig{ - Region: region, - RoleArn: roleArn, +func TestNewUploadManager(t *testing.T) { + t.Parallel() + + for _, tc := range []struct { + name string + conf *Config + errVal string + }{ + { + name: "valid configuration", + conf: &Config{ + S3Uploader: S3UploaderConfig{ + Region: "local", + S3Bucket: "my-awesome-bucket", + S3Prefix: "opentelemetry", + S3Partition: "hour", + FilePrefix: "ingested-data-", + Endpoint: "localhost", + RoleArn: "arn:aws:iam::123456789012:my-awesome-user", + S3ForcePathStyle: true, + DisableSSL: true, + Compression: configcompression.TypeGzip, + }, + }, + errVal: "", }, + } { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + sm, err := newUploadManager( + context.Background(), + tc.conf, + "metrics", + "otlp", + ) + + if tc.errVal != "" { + assert.Nil(t, sm, "Must not have a valid s3 upload manager") + assert.EqualError(t, err, tc.errVal, "Must match the expected error") + } else { + assert.NotNil(t, sm, "Must have a valid manager") + assert.NoError(t, err, "Must not error when creating client") + } + }) } - - sessionConfig := getSessionConfig(config) - sess, err := getSession(config, sessionConfig) - - creds, _ := sess.Config.Credentials.Get() - - assert.NoError(t, err) - assert.Equal(t, sessionConfig.Region, aws.String(region)) - assert.Equal(t, creds.ProviderName, "AssumeRoleProvider") -} - -func TestGetSessionConfigWithoutRoleArn(t *testing.T) { - const region = "region" - config := &Config{ - S3Uploader: S3UploaderConfig{ - Region: region, - }, - } - - sessionConfig := getSessionConfig(config) - sess, err := getSession(config, sessionConfig) - - creds, _ := sess.Config.Credentials.Get() - - assert.NoError(t, err) - assert.Equal(t, sessionConfig.Region, aws.String(region)) - assert.NotEqual(t, creds.ProviderName, "AssumeRoleProvider") } diff --git a/exporter/awsxrayexporter/README.md b/exporter/awsxrayexporter/README.md index 03faa6f6e123..8c35cf89fce5 100644 --- a/exporter/awsxrayexporter/README.md +++ b/exporter/awsxrayexporter/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fawsxray%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fawsxray) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fawsxray%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fawsxray) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@wangzlei](https://www.github.com/wangzlei), [@srprash](https://www.github.com/srprash) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib @@ -43,6 +43,7 @@ defined in the OpenTelemetry Semantic Conventions. | `aws.request_id` | AWS-generated unique identifier for the request. | No | | `aws.queue_url` | For operations on an Amazon SQS queue, the queue's URL. | No | | `aws.table_name` | For operations on a DynamoDB table, the name of the table. | No | +| `aws.xray.annotations` | The attribute is a slice(list) attribute that contains each of the string keys. If found on the span, the `awsxrayexporter` will use them in addition to the `indexed_attributes` configuration field when categorizing which attributes to index. This can be configured with `"aws.xray.annotations"=["key1", "key2"]` (Java example: `span.setAttribute(stringArrayKey("aws.xray.annotations"), List.of("key1", "key2"))`) | No | Any of these values supplied are used to populate the `aws` object in addition to any relevant data supplied by the Span Resource object. X-Ray uses this data to generate inferred segments for the remote APIs. @@ -87,8 +88,11 @@ following values that are evaluated in this order: In the case of multiple values are defined, the value with higher precedence will be used to set the `cloudwatch_logs` AWS Property. `aws.log.group.arns` and `aws.log.group.names` are slice resource attributes that can be set programmatically. -Alternatively those resource attributes can be set using the [`OTEL_RESOURCE_ATTRIBUTES` environment variable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/sdk.md#specifying-resource-information-via-an-environment-variable). In this case only a single log group/log group arn can -be provided as a string rather than a slice. +Alternatively those resource attributes can be set using the [`OTEL_RESOURCE_ATTRIBUTES` environment variable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/sdk.md#specifying-resource-information-via-an-environment-variable). To set multiple log group names /log group arns, you can use `&` +to separate them. For example, 3 log groups `log-group1`, `log-group2`, and `log-group3` are set in the following command: +``` +export OTEL_RESOURCE_ATTRIBUTES="aws.log.group.names=log-group1&log-group2&log-group3" +``` ## AWS Credential Configuration diff --git a/exporter/awsxrayexporter/awsxray.go b/exporter/awsxrayexporter/awsxray.go index f82bbb34bd1b..dc01d1d8f921 100644 --- a/exporter/awsxrayexporter/awsxray.go +++ b/exporter/awsxrayexporter/awsxray.go @@ -30,7 +30,7 @@ const ( // request and then posts the request to the configured region's X-Ray endpoint. func newTracesExporter( cfg *Config, - set exporter.CreateSettings, + set exporter.Settings, cn awsutil.ConnAttr, registry telemetry.Registry, ) (exporter.Traces, error) { @@ -48,7 +48,7 @@ func newTracesExporter( opts = append(opts, telemetry.WithLogger(set.Logger)) sender = registry.Register(set.ID, cfg.TelemetryConfig, xrayClient, opts...) } - return exporterhelper.NewTracesExporter( + return exporterhelper.NewTraces( context.TODO(), set, cfg, diff --git a/exporter/awsxrayexporter/awsxray_test.go b/exporter/awsxrayexporter/awsxray_test.go index e4ff6828f794..63794246febb 100644 --- a/exporter/awsxrayexporter/awsxray_test.go +++ b/exporter/awsxrayexporter/awsxray_test.go @@ -8,6 +8,7 @@ import ( "crypto/rand" "encoding/binary" "fmt" + "net/http" "testing" "time" @@ -18,7 +19,7 @@ import ( "go.opentelemetry.io/collector/exporter/exportertest" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.12.0" "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutil" @@ -69,7 +70,7 @@ func TestTelemetryEnabled(t *testing.T) { registry := telemetry.NewRegistry() sink := telemetrytest.NewSenderSink() // preload the sender that the exporter will use - set := exportertest.NewNopCreateSettings() + set := exportertest.NewNopSettings() sender, loaded := registry.LoadOrStore(set.ID, sink) require.False(t, loaded) require.NotNil(t, sender) @@ -104,21 +105,21 @@ func BenchmarkForTracesExporter(b *testing.B) { } } -func initializeTracesExporter(t testing.TB, exporterConfig *Config, registry telemetry.Registry) exporter.Traces { - t.Helper() +func initializeTracesExporter(tb testing.TB, exporterConfig *Config, registry telemetry.Registry) exporter.Traces { + tb.Helper() mconn := new(awsutil.Conn) - traceExporter, err := newTracesExporter(exporterConfig, exportertest.NewNopCreateSettings(), mconn, registry) + traceExporter, err := newTracesExporter(exporterConfig, exportertest.NewNopSettings(), mconn, registry) if err != nil { panic(err) } return traceExporter } -func generateConfig(t testing.TB) *Config { - t.Setenv("AWS_ACCESS_KEY_ID", "AKIASSWVJUY4PZXXXXXX") - t.Setenv("AWS_SECRET_ACCESS_KEY", "XYrudg2H87u+ADAAq19Wqx3D41a09RsTXXXXXXXX") - t.Setenv("AWS_DEFAULT_REGION", "us-east-1") - t.Setenv("AWS_REGION", "us-east-1") +func generateConfig(tb testing.TB) *Config { + tb.Setenv("AWS_ACCESS_KEY_ID", "AKIASSWVJUY4PZXXXXXX") + tb.Setenv("AWS_SECRET_ACCESS_KEY", "XYrudg2H87u+ADAAq19Wqx3D41a09RsTXXXXXXXX") + tb.Setenv("AWS_DEFAULT_REGION", "us-east-1") + tb.Setenv("AWS_REGION", "us-east-1") factory := NewFactory() exporterConfig := factory.CreateDefaultConfig().(*Config) exporterConfig.Region = "us-east-1" @@ -184,7 +185,7 @@ func constructResource() pcommon.Resource { func constructHTTPClientSpan(traceID pcommon.TraceID) ptrace.Span { attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "GET" + attributes[conventions.AttributeHTTPMethod] = http.MethodGet attributes[conventions.AttributeHTTPURL] = "https://api.example.com/users/junit" attributes[conventions.AttributeHTTPStatusCode] = 200 endTime := time.Now().Round(time.Second) @@ -211,7 +212,7 @@ func constructHTTPClientSpan(traceID pcommon.TraceID) ptrace.Span { func constructHTTPServerSpan(traceID pcommon.TraceID) ptrace.Span { attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "GET" + attributes[conventions.AttributeHTTPMethod] = http.MethodGet attributes[conventions.AttributeHTTPURL] = "https://api.example.com/users/junit" attributes[conventions.AttributeHTTPClientIP] = "192.168.15.32" attributes[conventions.AttributeHTTPStatusCode] = 200 diff --git a/exporter/awsxrayexporter/config_test.go b/exporter/awsxrayexporter/config_test.go index d4e232de4451..ce11f651eee5 100644 --- a/exporter/awsxrayexporter/config_test.go +++ b/exporter/awsxrayexporter/config_test.go @@ -60,7 +60,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) diff --git a/exporter/awsxrayexporter/factory.go b/exporter/awsxrayexporter/factory.go index 60343357f1e9..c88d87ad2f75 100644 --- a/exporter/awsxrayexporter/factory.go +++ b/exporter/awsxrayexporter/factory.go @@ -38,7 +38,7 @@ func createDefaultConfig() component.Config { func createTracesExporter( _ context.Context, - params exporter.CreateSettings, + params exporter.Settings, cfg component.Config, ) (exporter.Traces, error) { eCfg := cfg.(*Config) diff --git a/exporter/awsxrayexporter/factory_test.go b/exporter/awsxrayexporter/factory_test.go index 35763d0afaef..20977e5750ac 100644 --- a/exporter/awsxrayexporter/factory_test.go +++ b/exporter/awsxrayexporter/factory_test.go @@ -23,7 +23,7 @@ import ( func TestCreateDefaultConfig(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() - assert.Equal(t, cfg, &Config{ + assert.Equal(t, &Config{ AWSSessionSettings: awsutil.AWSSessionSettings{ NumberOfWorkers: 8, Endpoint: "", @@ -37,7 +37,7 @@ func TestCreateDefaultConfig(t *testing.T) { RoleARN: "", }, skipTimestampValidation: true, - }, "failed to create default config") + }, cfg, "failed to create default config") assert.NoError(t, componenttest.CheckConfigStruct(cfg)) } @@ -48,7 +48,7 @@ func TestCreateDefaultConfigWithSkipTimestampValidation(t *testing.T) { assert.NoError(t, err) cfg := factory.CreateDefaultConfig() - assert.Equal(t, cfg, &Config{ + assert.Equal(t, &Config{ AWSSessionSettings: awsutil.AWSSessionSettings{ NumberOfWorkers: 8, Endpoint: "", @@ -62,14 +62,14 @@ func TestCreateDefaultConfigWithSkipTimestampValidation(t *testing.T) { RoleARN: "", }, skipTimestampValidation: true, - }, "failed to create default config") + }, cfg, "failed to create default config") assert.NoError(t, componenttest.CheckConfigStruct(cfg)) err = featuregate.GlobalRegistry().Set("exporter.awsxray.skiptimestampvalidation", false) assert.NoError(t, err) } -func TestCreateTracesExporter(t *testing.T) { +func TestCreateTraces(t *testing.T) { cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml")) require.NoError(t, err) factory := NewFactory() @@ -77,15 +77,15 @@ func TestCreateTracesExporter(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "customname").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) ctx := context.Background() - exporter, err := factory.CreateTracesExporter(ctx, exportertest.NewNopCreateSettings(), cfg) + exporter, err := factory.CreateTraces(ctx, exportertest.NewNopSettings(), cfg) assert.NoError(t, err) assert.NotNil(t, exporter) } -func TestCreateMetricsExporter(t *testing.T) { +func TestCreateMetrics(t *testing.T) { cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml")) require.NoError(t, err) factory := NewFactory() @@ -93,10 +93,10 @@ func TestCreateMetricsExporter(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "customname").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) ctx := context.Background() - exporter, err := factory.CreateMetricsExporter(ctx, exportertest.NewNopCreateSettings(), cfg) + exporter, err := factory.CreateMetrics(ctx, exportertest.NewNopSettings(), cfg) assert.Error(t, err) assert.Nil(t, exporter) } diff --git a/exporter/awsxrayexporter/generated_component_test.go b/exporter/awsxrayexporter/generated_component_test.go index a0a27d7021f8..dfe5c0c2c2d6 100644 --- a/exporter/awsxrayexporter/generated_component_test.go +++ b/exporter/awsxrayexporter/generated_component_test.go @@ -32,13 +32,13 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -50,21 +50,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(exporter.Logs) require.True(t, ok) diff --git a/exporter/awsxrayexporter/go.mod b/exporter/awsxrayexporter/go.mod index 394f9c47284c..12c9dc5a5742 100644 --- a/exporter/awsxrayexporter/go.mod +++ b/exporter/awsxrayexporter/go.mod @@ -1,34 +1,32 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsxrayexporter -go 1.21.0 +go 1.22.0 require ( - github.com/aws/aws-sdk-go v1.53.11 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutil v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/xray v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/featuregate v1.9.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/aws/aws-sdk-go v1.55.5 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutil v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/xray v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/featuregate v1.22.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/semconv v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect @@ -36,32 +34,38 @@ require ( github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configretry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + go.opentelemetry.io/collector/config/configretry v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/consumer v1.22.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/awsxrayexporter/go.sum b/exporter/awsxrayexporter/go.sum index 9a3a08166a03..c5c3a4d63505 100644 --- a/exporter/awsxrayexporter/go.sum +++ b/exporter/awsxrayexporter/go.sum @@ -1,23 +1,21 @@ -github.com/aws/aws-sdk-go v1.53.11 h1:KcmduYvX15rRqt4ZU/7jKkmDxU/G87LJ9MUI0yQJh00= -github.com/aws/aws-sdk-go v1.53.11/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= -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/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= +github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -37,8 +35,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -54,62 +52,74 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -125,20 +135,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -147,12 +157,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/exporter/awsxrayexporter/internal/metadata/generated_status.go b/exporter/awsxrayexporter/internal/metadata/generated_status.go index e5d7462d5677..42e56f965aa3 100644 --- a/exporter/awsxrayexporter/internal/metadata/generated_status.go +++ b/exporter/awsxrayexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("awsxray") + Type = component.MustNewType("awsxray") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsxrayexporter" ) const ( diff --git a/exporter/awsxrayexporter/internal/metadata/generated_telemetry.go b/exporter/awsxrayexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index 4052418953ac..000000000000 --- a/exporter/awsxrayexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/awsxray") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/awsxray") -} diff --git a/exporter/awsxrayexporter/internal/metadata/generated_telemetry_test.go b/exporter/awsxrayexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index fa30fe5ac209..000000000000 --- a/exporter/awsxrayexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/awsxray", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/awsxray", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/awsxrayexporter/internal/translator/aws.go b/exporter/awsxrayexporter/internal/translator/aws.go index dd3c55a855cc..20002ce3fc0d 100644 --- a/exporter/awsxrayexporter/internal/translator/aws.go +++ b/exporter/awsxrayexporter/internal/translator/aws.go @@ -9,7 +9,7 @@ import ( "github.com/aws/aws-sdk-go/aws" "go.opentelemetry.io/collector/pdata/pcommon" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.12.0" awsxray "github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/xray" ) @@ -230,7 +230,7 @@ func makeAws(attributes map[string]pcommon.Value, resource pcommon.Resource, log case logGroups != (pcommon.Slice{}) && logGroups.Len() > 0: cwl = getLogGroupMetadata(logGroups, false) case logGroupNames != nil: - var configSlice = pcommon.NewSlice() + configSlice := pcommon.NewSlice() configSlice.EnsureCapacity(len(logGroupNames)) for _, s := range logGroupNames { @@ -272,16 +272,35 @@ func makeAws(attributes map[string]pcommon.Value, resource pcommon.Resource, log return filtered, awsData } +func getLogGroupNamesOrArns(logGroupNamesOrArns string) []string { + // Split the input string by '&' + items := strings.Split(logGroupNamesOrArns, "&") + + // Filter out empty strings + var result []string + for _, item := range items { + if item != "" { + result = append(result, item) + } + } + + return result +} + // Normalize value to slice. -// 1. String values are converted to a slice of size 1 so that we can also handle resource +// 1. String values are converted to a slice so that we can also handle resource // attributes that are set using the OTEL_RESOURCE_ATTRIBUTES +// (multiple log group names or arns are separate by & like this "log-group1&log-group2&log-group3") // 2. Slices are kept as they are // 3. Other types will result in a empty slice so that we avoid panic. func normalizeToSlice(v pcommon.Value) pcommon.Slice { switch v.Type() { case pcommon.ValueTypeStr: s := pcommon.NewSlice() - s.AppendEmpty().SetStr(v.Str()) + logGroupNamesOrArns := getLogGroupNamesOrArns(v.Str()) + for _, logGroupOrArn := range logGroupNamesOrArns { + s.AppendEmpty().SetStr(logGroupOrArn) + } return s case pcommon.ValueTypeSlice: return v.Slice() diff --git a/exporter/awsxrayexporter/internal/translator/aws_test.go b/exporter/awsxrayexporter/internal/translator/aws_test.go index 3c67b65cba4a..85b8a47e2f99 100644 --- a/exporter/awsxrayexporter/internal/translator/aws_test.go +++ b/exporter/awsxrayexporter/internal/translator/aws_test.go @@ -9,7 +9,7 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/stretchr/testify/assert" "go.opentelemetry.io/collector/pdata/pcommon" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.12.0" awsxray "github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/xray" ) @@ -409,7 +409,7 @@ func TestLogGroups(t *testing.T) { assert.NotNil(t, filtered) assert.NotNil(t, awsData) - assert.Equal(t, 2, len(awsData.CWLogs)) + assert.Len(t, awsData.CWLogs, 2) assert.Contains(t, awsData.CWLogs, cwl1) assert.Contains(t, awsData.CWLogs, cwl2) } @@ -437,7 +437,7 @@ func TestLogGroupsFromArns(t *testing.T) { assert.NotNil(t, filtered) assert.NotNil(t, awsData) - assert.Equal(t, 2, len(awsData.CWLogs)) + assert.Len(t, awsData.CWLogs, 2) assert.Contains(t, awsData.CWLogs, cwl1) assert.Contains(t, awsData.CWLogs, cwl2) } @@ -456,10 +456,65 @@ func TestLogGroupsFromStringResourceAttribute(t *testing.T) { assert.NotNil(t, filtered) assert.NotNil(t, awsData) - assert.Equal(t, 1, len(awsData.CWLogs)) + assert.Len(t, awsData.CWLogs, 1) assert.Contains(t, awsData.CWLogs, cwl1) } +func TestLogGroupsWithAmpersandFromStringResourceAttribute(t *testing.T) { + cwl1 := awsxray.LogGroupMetadata{ + LogGroup: awsxray.String("group1"), + } + cwl2 := awsxray.LogGroupMetadata{ + LogGroup: awsxray.String("group2"), + } + + attributes := make(map[string]pcommon.Value) + resource := pcommon.NewResource() + + // normal cases + resource.Attributes().PutStr(conventions.AttributeAWSLogGroupNames, "group1&group2") + filtered, awsData := makeAws(attributes, resource, nil) + assert.NotNil(t, filtered) + assert.NotNil(t, awsData) + assert.Len(t, awsData.CWLogs, 2) + assert.Contains(t, awsData.CWLogs, cwl1) + assert.Contains(t, awsData.CWLogs, cwl2) + + // with extra & at end + resource.Attributes().PutStr(conventions.AttributeAWSLogGroupNames, "group1&group2&") + filtered, awsData = makeAws(attributes, resource, nil) + assert.NotNil(t, filtered) + assert.NotNil(t, awsData) + assert.Len(t, awsData.CWLogs, 2) + assert.Contains(t, awsData.CWLogs, cwl1) + assert.Contains(t, awsData.CWLogs, cwl2) + + // with extra & in the middle + resource.Attributes().PutStr(conventions.AttributeAWSLogGroupNames, "group1&&group2") + filtered, awsData = makeAws(attributes, resource, nil) + assert.NotNil(t, filtered) + assert.NotNil(t, awsData) + assert.Len(t, awsData.CWLogs, 2) + assert.Contains(t, awsData.CWLogs, cwl1) + assert.Contains(t, awsData.CWLogs, cwl2) + + // with extra & at the beginning + resource.Attributes().PutStr(conventions.AttributeAWSLogGroupNames, "&group1&group2") + filtered, awsData = makeAws(attributes, resource, nil) + assert.NotNil(t, filtered) + assert.NotNil(t, awsData) + assert.Len(t, awsData.CWLogs, 2) + assert.Contains(t, awsData.CWLogs, cwl1) + assert.Contains(t, awsData.CWLogs, cwl2) + + // with only & + resource.Attributes().PutStr(conventions.AttributeAWSLogGroupNames, "&") + filtered, awsData = makeAws(attributes, resource, nil) + assert.NotNil(t, filtered) + assert.NotNil(t, awsData) + assert.Empty(t, awsData.CWLogs) +} + func TestLogGroupsInvalidType(t *testing.T) { attributes := make(map[string]pcommon.Value) resource := pcommon.NewResource() @@ -469,7 +524,7 @@ func TestLogGroupsInvalidType(t *testing.T) { assert.NotNil(t, filtered) assert.NotNil(t, awsData) - assert.Equal(t, 0, len(awsData.CWLogs)) + assert.Empty(t, awsData.CWLogs) } // Simulate Log groups arns being set using OTEL_RESOURCE_ATTRIBUTES @@ -489,8 +544,34 @@ func TestLogGroupsArnsFromStringResourceAttributes(t *testing.T) { assert.NotNil(t, filtered) assert.NotNil(t, awsData) - assert.Equal(t, 1, len(awsData.CWLogs)) + assert.Len(t, awsData.CWLogs, 1) + assert.Contains(t, awsData.CWLogs, cwl1) +} + +func TestLogGroupsArnsWithAmpersandFromStringResourceAttributes(t *testing.T) { + group1 := "arn:aws:logs:us-east-1:123456789123:log-group:group1" + group2 := "arn:aws:logs:us-east-1:123456789123:log-group:group2" + + cwl1 := awsxray.LogGroupMetadata{ + LogGroup: awsxray.String("group1"), + Arn: awsxray.String(group1), + } + cwl2 := awsxray.LogGroupMetadata{ + LogGroup: awsxray.String("group2"), + Arn: awsxray.String(group2), + } + + attributes := make(map[string]pcommon.Value) + resource := pcommon.NewResource() + resource.Attributes().PutStr(conventions.AttributeAWSLogGroupARNs, "arn:aws:logs:us-east-1:123456789123:log-group:group1&arn:aws:logs:us-east-1:123456789123:log-group:group2") + + filtered, awsData := makeAws(attributes, resource, nil) + + assert.NotNil(t, filtered) + assert.NotNil(t, awsData) + assert.Len(t, awsData.CWLogs, 2) assert.Contains(t, awsData.CWLogs, cwl1) + assert.Contains(t, awsData.CWLogs, cwl2) } func TestLogGroupsFromConfig(t *testing.T) { @@ -508,7 +589,7 @@ func TestLogGroupsFromConfig(t *testing.T) { assert.NotNil(t, filtered) assert.NotNil(t, awsData) - assert.Equal(t, 2, len(awsData.CWLogs)) + assert.Len(t, awsData.CWLogs, 2) assert.Contains(t, awsData.CWLogs, cwl1) assert.Contains(t, awsData.CWLogs, cwl2) } diff --git a/exporter/awsxrayexporter/internal/translator/cause.go b/exporter/awsxrayexporter/internal/translator/cause.go index 36edb287c3b0..35acc84d4064 100644 --- a/exporter/awsxrayexporter/internal/translator/cause.go +++ b/exporter/awsxrayexporter/internal/translator/cause.go @@ -14,21 +14,24 @@ import ( "github.com/aws/aws-sdk-go/aws" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.12.0" awsxray "github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/xray" ) // ExceptionEventName the name of the exception event. // TODO: Remove this when collector defines this semantic convention. -const ExceptionEventName = "exception" -const AwsIndividualHTTPEventName = "HTTP request failure" -const AwsIndividualHTTPErrorEventType = "aws.http.error.event" -const AwsIndividualHTTPErrorCodeAttr = "http.response.status_code" -const AwsIndividualHTTPErrorMsgAttr = "aws.http.error_message" +const ( + ExceptionEventName = "exception" + AwsIndividualHTTPEventName = "HTTP request failure" + AwsIndividualHTTPErrorEventType = "aws.http.error.event" + AwsIndividualHTTPErrorCodeAttr = "http.response.status_code" + AwsIndividualHTTPErrorMsgAttr = "aws.http.error_message" +) func makeCause(span ptrace.Span, attributes map[string]pcommon.Value, resource pcommon.Resource) (isError, isFault, isThrottle bool, - filtered map[string]pcommon.Value, cause *awsxray.CauseData) { + filtered map[string]pcommon.Value, cause *awsxray.CauseData, +) { status := span.Status() filtered = attributes @@ -112,7 +115,9 @@ func makeCause(span ptrace.Span, attributes map[string]pcommon.Value, resource p cause = &awsxray.CauseData{ Type: awsxray.CauseTypeObject, CauseObject: awsxray.CauseObject{ - Exceptions: exceptions}} + Exceptions: exceptions, + }, + } case status.Code() != ptrace.StatusCodeError: cause = nil diff --git a/exporter/awsxrayexporter/internal/translator/cause_test.go b/exporter/awsxrayexporter/internal/translator/cause_test.go index eabe8147369a..65759105dcaa 100644 --- a/exporter/awsxrayexporter/internal/translator/cause_test.go +++ b/exporter/awsxrayexporter/internal/translator/cause_test.go @@ -4,6 +4,7 @@ package translator import ( + "net/http" "strings" "testing" "time" @@ -12,7 +13,7 @@ import ( "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.12.0" ) func TestCauseWithExceptions(t *testing.T) { @@ -81,7 +82,7 @@ func TestMakeCauseAwsSdkSpan(t *testing.T) { assert.False(t, isThrottle) assert.NotNil(t, cause) - assert.Equal(t, 1, len(cause.CauseObject.Exceptions)) + assert.Len(t, cause.CauseObject.Exceptions, 1) exception := cause.CauseObject.Exceptions[0] assert.Equal(t, AwsIndividualHTTPErrorEventType, *exception.Type) assert.True(t, *exception.Remote) @@ -93,7 +94,7 @@ func TestMakeCauseAwsSdkSpan(t *testing.T) { } func TestCauseExceptionWithoutError(t *testing.T) { - var nonErrorStatusCodes = []ptrace.StatusCode{ptrace.StatusCodeUnset, ptrace.StatusCodeOk} + nonErrorStatusCodes := []ptrace.StatusCode{ptrace.StatusCodeUnset, ptrace.StatusCodeOk} for _, element := range nonErrorStatusCodes { ExceptionWithoutErrorHelper(t, element) @@ -103,7 +104,7 @@ func TestCauseExceptionWithoutError(t *testing.T) { func ExceptionWithoutErrorHelper(t *testing.T, statusCode ptrace.StatusCode) { errorMsg := "this is a test" - var exceptionStack = `java.lang.IllegalStateException: state is not legal + exceptionStack := `java.lang.IllegalStateException: state is not legal at io.opentelemetry.sdk.trace.RecordEventsReadableSpanTest.recordException(RecordEventsReadableSpanTest.java:626) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) @@ -139,7 +140,7 @@ Caused by: java.lang.IllegalArgumentException: bad argument` } func TestEventWithoutExceptionWithoutError(t *testing.T) { - var nonErrorStatusCodes = []ptrace.StatusCode{ptrace.StatusCodeUnset, ptrace.StatusCodeOk} + nonErrorStatusCodes := []ptrace.StatusCode{ptrace.StatusCodeUnset, ptrace.StatusCodeOk} for _, element := range nonErrorStatusCodes { EventWithoutExceptionWithoutErrorHelper(t, element) @@ -174,7 +175,7 @@ func EventWithoutExceptionWithoutErrorHelper(t *testing.T, statusCode ptrace.Sta func TestCauseWithStatusMessage(t *testing.T) { errorMsg := "this is a test" attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "POST" + attributes[conventions.AttributeHTTPMethod] = http.MethodPost attributes[conventions.AttributeHTTPURL] = "https://api.example.com/widgets" attributes[conventions.AttributeHTTPStatusCode] = 500 span := constructExceptionServerSpan(attributes, ptrace.StatusCodeError) @@ -193,13 +194,13 @@ func TestCauseWithStatusMessage(t *testing.T) { require.NoError(t, w.Encode(cause)) jsonStr := w.String() testWriters.release(w) - assert.True(t, strings.Contains(jsonStr, errorMsg)) + assert.Contains(t, jsonStr, errorMsg) } func TestCauseWithHttpStatusMessage(t *testing.T) { errorMsg := "this is a test" attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "POST" + attributes[conventions.AttributeHTTPMethod] = http.MethodPost attributes[conventions.AttributeHTTPURL] = "https://api.example.com/widgets" attributes[conventions.AttributeHTTPStatusCode] = 500 attributes["http.status_text"] = errorMsg @@ -218,13 +219,13 @@ func TestCauseWithHttpStatusMessage(t *testing.T) { require.NoError(t, w.Encode(cause)) jsonStr := w.String() testWriters.release(w) - assert.True(t, strings.Contains(jsonStr, errorMsg)) + assert.Contains(t, jsonStr, errorMsg) } func TestCauseWithZeroStatusMessageAndFaultHttpCode(t *testing.T) { errorMsg := "this is a test" attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "POST" + attributes[conventions.AttributeHTTPMethod] = http.MethodPost attributes[conventions.AttributeHTTPURL] = "https://api.example.com/widgets" attributes[conventions.AttributeHTTPStatusCode] = 500 attributes["http.status_text"] = errorMsg @@ -248,7 +249,7 @@ func TestCauseWithZeroStatusMessageAndFaultHttpCode(t *testing.T) { func TestNonHttpUnsetCodeSpan(t *testing.T) { errorMsg := "this is a test" attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "POST" + attributes[conventions.AttributeHTTPMethod] = http.MethodPost attributes[conventions.AttributeHTTPURL] = "https://api.example.com/widgets" attributes["http.status_text"] = errorMsg @@ -271,7 +272,7 @@ func TestNonHttpUnsetCodeSpan(t *testing.T) { func TestNonHttpOkCodeSpan(t *testing.T) { errorMsg := "this is a test" attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "POST" + attributes[conventions.AttributeHTTPMethod] = http.MethodPost attributes[conventions.AttributeHTTPURL] = "https://api.example.com/widgets" attributes["http.status_text"] = errorMsg @@ -294,7 +295,7 @@ func TestNonHttpOkCodeSpan(t *testing.T) { func TestNonHttpErrCodeSpan(t *testing.T) { errorMsg := "this is a test" attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "POST" + attributes[conventions.AttributeHTTPMethod] = http.MethodPost attributes[conventions.AttributeHTTPURL] = "https://api.example.com/widgets" attributes["http.status_text"] = errorMsg @@ -317,7 +318,7 @@ func TestNonHttpErrCodeSpan(t *testing.T) { func TestCauseWithZeroStatusMessageAndFaultErrorCode(t *testing.T) { errorMsg := "this is a test" attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "POST" + attributes[conventions.AttributeHTTPMethod] = http.MethodPost attributes[conventions.AttributeHTTPURL] = "https://api.example.com/widgets" attributes[conventions.AttributeHTTPStatusCode] = 400 attributes["http.status_text"] = errorMsg @@ -341,7 +342,7 @@ func TestCauseWithZeroStatusMessageAndFaultErrorCode(t *testing.T) { func TestCauseWithClientErrorMessage(t *testing.T) { errorMsg := "this is a test" attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "POST" + attributes[conventions.AttributeHTTPMethod] = http.MethodPost attributes[conventions.AttributeHTTPURL] = "https://api.example.com/widgets" attributes[conventions.AttributeHTTPStatusCode] = 499 attributes["http.status_text"] = errorMsg @@ -362,7 +363,7 @@ func TestCauseWithClientErrorMessage(t *testing.T) { func TestCauseWithThrottled(t *testing.T) { errorMsg := "this is a test" attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "POST" + attributes[conventions.AttributeHTTPMethod] = http.MethodPost attributes[conventions.AttributeHTTPURL] = "https://api.example.com/widgets" attributes[conventions.AttributeHTTPStatusCode] = 429 attributes["http.status_text"] = errorMsg diff --git a/exporter/awsxrayexporter/internal/translator/http.go b/exporter/awsxrayexporter/internal/translator/http.go index f1f135dafe62..b83ccb105b77 100644 --- a/exporter/awsxrayexporter/internal/translator/http.go +++ b/exporter/awsxrayexporter/internal/translator/http.go @@ -10,7 +10,7 @@ import ( "github.com/aws/aws-sdk-go/aws" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.12.0" awsxray "github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/xray" ) @@ -92,6 +92,7 @@ func makeHTTP(span ptrace.Span) (map[string]pcommon.Value, *awsxray.HTTPData) { hasHTTPRequestURLAttributes = true case conventions.AttributeNetPeerName: urlParts[key] = value.Str() + hasHTTPRequestURLAttributes = true case conventions.AttributeNetPeerPort: urlParts[key] = value.Str() if len(urlParts[key]) == 0 { diff --git a/exporter/awsxrayexporter/internal/translator/http_test.go b/exporter/awsxrayexporter/internal/translator/http_test.go index 0c5ff1b9983f..4361c33e967e 100644 --- a/exporter/awsxrayexporter/internal/translator/http_test.go +++ b/exporter/awsxrayexporter/internal/translator/http_test.go @@ -4,7 +4,7 @@ package translator import ( - "strings" + "net/http" "testing" "time" @@ -13,12 +13,12 @@ import ( "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.12.0" ) func TestClientSpanWithURLAttribute(t *testing.T) { attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "GET" + attributes[conventions.AttributeHTTPMethod] = http.MethodGet attributes[conventions.AttributeHTTPURL] = "https://api.example.com/users/junit" attributes[conventions.AttributeHTTPStatusCode] = 200 span := constructHTTPClientSpan(attributes) @@ -31,12 +31,12 @@ func TestClientSpanWithURLAttribute(t *testing.T) { require.NoError(t, w.Encode(httpData)) jsonStr := w.String() testWriters.release(w) - assert.True(t, strings.Contains(jsonStr, "https://api.example.com/users/junit")) + assert.Contains(t, jsonStr, "https://api.example.com/users/junit") } func TestClientSpanWithURLAttributeStable(t *testing.T) { attributes := make(map[string]any) - attributes[AttributeHTTPRequestMethod] = "GET" + attributes[AttributeHTTPRequestMethod] = http.MethodGet attributes[AttributeURLFull] = "https://api.example.com/users/junit" attributes[AttributeHTTPResponseStatusCode] = 200 span := constructHTTPClientSpan(attributes) @@ -49,12 +49,12 @@ func TestClientSpanWithURLAttributeStable(t *testing.T) { require.NoError(t, w.Encode(httpData)) jsonStr := w.String() testWriters.release(w) - assert.True(t, strings.Contains(jsonStr, "https://api.example.com/users/junit")) + assert.Contains(t, jsonStr, "https://api.example.com/users/junit") } func TestClientSpanWithSchemeHostTargetAttributes(t *testing.T) { attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "GET" + attributes[conventions.AttributeHTTPMethod] = http.MethodGet attributes[conventions.AttributeHTTPScheme] = "https" attributes[conventions.AttributeHTTPHost] = "api.example.com" attributes[conventions.AttributeHTTPTarget] = "/users/junit" @@ -70,12 +70,12 @@ func TestClientSpanWithSchemeHostTargetAttributes(t *testing.T) { require.NoError(t, w.Encode(httpData)) jsonStr := w.String() testWriters.release(w) - assert.True(t, strings.Contains(jsonStr, "https://api.example.com/users/junit")) + assert.Contains(t, jsonStr, "https://api.example.com/users/junit") } func TestClientSpanWithPeerAttributes(t *testing.T) { attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "GET" + attributes[conventions.AttributeHTTPMethod] = http.MethodGet attributes[conventions.AttributeHTTPScheme] = "http" attributes[conventions.AttributeNetPeerName] = "kb234.example.com" attributes[conventions.AttributeNetPeerPort] = 8080 @@ -88,6 +88,7 @@ func TestClientSpanWithPeerAttributes(t *testing.T) { assert.NotNil(t, httpData) assert.NotNil(t, filtered) + assert.NotNil(t, httpData.Request.URL) assert.Equal(t, "10.8.17.36", *httpData.Request.ClientIP) @@ -95,12 +96,12 @@ func TestClientSpanWithPeerAttributes(t *testing.T) { require.NoError(t, w.Encode(httpData)) jsonStr := w.String() testWriters.release(w) - assert.True(t, strings.Contains(jsonStr, "http://kb234.example.com:8080/users/junit")) + assert.Contains(t, jsonStr, "http://kb234.example.com:8080/users/junit") } func TestClientSpanWithPeerAttributesStable(t *testing.T) { attributes := make(map[string]any) - attributes[AttributeHTTPRequestMethod] = "GET" + attributes[AttributeHTTPRequestMethod] = http.MethodGet attributes[AttributeURLScheme] = "http" attributes[conventions.AttributeNetPeerName] = "kb234.example.com" attributes[conventions.AttributeNetPeerPort] = 8080 @@ -120,7 +121,7 @@ func TestClientSpanWithPeerAttributesStable(t *testing.T) { require.NoError(t, w.Encode(httpData)) jsonStr := w.String() testWriters.release(w) - assert.True(t, strings.Contains(jsonStr, "http://kb234.example.com:8080/users/junit")) + assert.Contains(t, jsonStr, "http://kb234.example.com:8080/users/junit") } func TestClientSpanWithHttpPeerAttributes(t *testing.T) { @@ -154,7 +155,7 @@ func TestClientSpanWithHttpPeerAttributesStable(t *testing.T) { func TestClientSpanWithPeerIp4Attributes(t *testing.T) { attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "GET" + attributes[conventions.AttributeHTTPMethod] = http.MethodGet attributes[conventions.AttributeHTTPScheme] = "http" attributes[conventions.AttributeNetPeerIP] = "10.8.17.36" attributes[conventions.AttributeNetPeerPort] = "8080" @@ -168,12 +169,12 @@ func TestClientSpanWithPeerIp4Attributes(t *testing.T) { require.NoError(t, w.Encode(httpData)) jsonStr := w.String() testWriters.release(w) - assert.True(t, strings.Contains(jsonStr, "http://10.8.17.36:8080/users/junit")) + assert.Contains(t, jsonStr, "http://10.8.17.36:8080/users/junit") } func TestClientSpanWithPeerIp6Attributes(t *testing.T) { attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "GET" + attributes[conventions.AttributeHTTPMethod] = http.MethodGet attributes[conventions.AttributeHTTPScheme] = "https" attributes[conventions.AttributeNetPeerIP] = "2001:db8:85a3::8a2e:370:7334" attributes[conventions.AttributeNetPeerPort] = "443" @@ -187,12 +188,12 @@ func TestClientSpanWithPeerIp6Attributes(t *testing.T) { require.NoError(t, w.Encode(httpData)) jsonStr := w.String() testWriters.release(w) - assert.True(t, strings.Contains(jsonStr, "https://2001:db8:85a3::8a2e:370:7334/users/junit")) + assert.Contains(t, jsonStr, "https://2001:db8:85a3::8a2e:370:7334/users/junit") } func TestServerSpanWithURLAttribute(t *testing.T) { attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "GET" + attributes[conventions.AttributeHTTPMethod] = http.MethodGet attributes[conventions.AttributeHTTPURL] = "https://api.example.com/users/junit" attributes[conventions.AttributeHTTPClientIP] = "192.168.15.32" attributes[conventions.AttributeHTTPUserAgent] = "PostmanRuntime/7.21.0" @@ -207,12 +208,12 @@ func TestServerSpanWithURLAttribute(t *testing.T) { require.NoError(t, w.Encode(httpData)) jsonStr := w.String() testWriters.release(w) - assert.True(t, strings.Contains(jsonStr, "https://api.example.com/users/junit")) + assert.Contains(t, jsonStr, "https://api.example.com/users/junit") } func TestServerSpanWithURLAttributeStable(t *testing.T) { attributes := make(map[string]any) - attributes[AttributeHTTPRequestMethod] = "GET" + attributes[AttributeHTTPRequestMethod] = http.MethodGet attributes[AttributeURLFull] = "https://api.example.com/users/junit" attributes[AttributeClientAddress] = "192.168.15.32" attributes[AttributeUserAgentOriginal] = "PostmanRuntime/7.21.0" @@ -227,12 +228,12 @@ func TestServerSpanWithURLAttributeStable(t *testing.T) { require.NoError(t, w.Encode(httpData)) jsonStr := w.String() testWriters.release(w) - assert.True(t, strings.Contains(jsonStr, "https://api.example.com/users/junit")) + assert.Contains(t, jsonStr, "https://api.example.com/users/junit") } func TestServerSpanWithSchemeHostTargetAttributes(t *testing.T) { attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "GET" + attributes[conventions.AttributeHTTPMethod] = http.MethodGet attributes[conventions.AttributeHTTPScheme] = "https" attributes[conventions.AttributeHTTPHost] = "api.example.com" attributes[conventions.AttributeHTTPTarget] = "/users/junit" @@ -248,12 +249,12 @@ func TestServerSpanWithSchemeHostTargetAttributes(t *testing.T) { require.NoError(t, w.Encode(httpData)) jsonStr := w.String() testWriters.release(w) - assert.True(t, strings.Contains(jsonStr, "https://api.example.com/users/junit")) + assert.Contains(t, jsonStr, "https://api.example.com/users/junit") } func TestServerSpanWithSchemeHostTargetAttributesStable(t *testing.T) { attributes := make(map[string]any) - attributes[AttributeHTTPRequestMethod] = "GET" + attributes[AttributeHTTPRequestMethod] = http.MethodGet attributes[AttributeURLScheme] = "https" attributes[AttributeServerAddress] = "api.example.com" attributes[AttributeURLPath] = "/users/junit" @@ -269,12 +270,12 @@ func TestServerSpanWithSchemeHostTargetAttributesStable(t *testing.T) { require.NoError(t, w.Encode(httpData)) jsonStr := w.String() testWriters.release(w) - assert.True(t, strings.Contains(jsonStr, "https://api.example.com/users/junit")) + assert.Contains(t, jsonStr, "https://api.example.com/users/junit") } func TestServerSpanWithSchemeServernamePortTargetAttributes(t *testing.T) { attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "GET" + attributes[conventions.AttributeHTTPMethod] = http.MethodGet attributes[conventions.AttributeHTTPScheme] = "https" attributes[conventions.AttributeHTTPServerName] = "api.example.com" attributes[conventions.AttributeNetHostPort] = 443 @@ -291,12 +292,12 @@ func TestServerSpanWithSchemeServernamePortTargetAttributes(t *testing.T) { require.NoError(t, w.Encode(httpData)) jsonStr := w.String() testWriters.release(w) - assert.True(t, strings.Contains(jsonStr, "https://api.example.com/users/junit")) + assert.Contains(t, jsonStr, "https://api.example.com/users/junit") } func TestServerSpanWithSchemeServernamePortTargetAttributesStable(t *testing.T) { attributes := make(map[string]any) - attributes[AttributeHTTPRequestMethod] = "GET" + attributes[AttributeHTTPRequestMethod] = http.MethodGet attributes[AttributeURLScheme] = "https" attributes[AttributeServerAddress] = "api.example.com" attributes[AttributeServerPort] = 443 @@ -313,12 +314,12 @@ func TestServerSpanWithSchemeServernamePortTargetAttributesStable(t *testing.T) require.NoError(t, w.Encode(httpData)) jsonStr := w.String() testWriters.release(w) - assert.True(t, strings.Contains(jsonStr, "https://api.example.com/users/junit")) + assert.Contains(t, jsonStr, "https://api.example.com/users/junit") } func TestServerSpanWithSchemeNamePortTargetAttributes(t *testing.T) { attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "GET" + attributes[conventions.AttributeHTTPMethod] = http.MethodGet attributes[conventions.AttributeHTTPScheme] = "http" attributes[conventions.AttributeHostName] = "kb234.example.com" attributes[conventions.AttributeNetHostPort] = 8080 @@ -337,12 +338,12 @@ func TestServerSpanWithSchemeNamePortTargetAttributes(t *testing.T) { require.NoError(t, w.Encode(httpData)) jsonStr := w.String() testWriters.release(w) - assert.True(t, strings.Contains(jsonStr, "http://kb234.example.com:8080/users/junit")) + assert.Contains(t, jsonStr, "http://kb234.example.com:8080/users/junit") } func TestServerSpanWithSchemeNamePortTargetAttributesStable(t *testing.T) { attributes := make(map[string]any) - attributes[AttributeHTTPRequestMethod] = "GET" + attributes[AttributeHTTPRequestMethod] = http.MethodGet attributes[AttributeURLScheme] = "http" attributes[AttributeServerAddress] = "kb234.example.com" attributes[AttributeServerPort] = 8080 @@ -361,12 +362,12 @@ func TestServerSpanWithSchemeNamePortTargetAttributesStable(t *testing.T) { require.NoError(t, w.Encode(httpData)) jsonStr := w.String() testWriters.release(w) - assert.True(t, strings.Contains(jsonStr, "http://kb234.example.com:8080/users/junit")) + assert.Contains(t, jsonStr, "http://kb234.example.com:8080/users/junit") } func TestSpanWithNotEnoughHTTPRequestURLAttributes(t *testing.T) { attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "GET" + attributes[conventions.AttributeHTTPMethod] = http.MethodGet attributes[conventions.AttributeHTTPScheme] = "http" attributes[conventions.AttributeHTTPClientIP] = "192.168.15.32" attributes[conventions.AttributeHTTPUserAgent] = "PostmanRuntime/7.21.0" @@ -382,7 +383,7 @@ func TestSpanWithNotEnoughHTTPRequestURLAttributes(t *testing.T) { assert.Nil(t, httpData.Request.URL) assert.Equal(t, "192.168.15.32", *httpData.Request.ClientIP) - assert.Equal(t, "GET", *httpData.Request.Method) + assert.Equal(t, http.MethodGet, *httpData.Request.Method) assert.Equal(t, "PostmanRuntime/7.21.0", *httpData.Request.UserAgent) contentLength := *httpData.Response.ContentLength.(*int64) assert.Equal(t, int64(12452), contentLength) @@ -392,7 +393,7 @@ func TestSpanWithNotEnoughHTTPRequestURLAttributes(t *testing.T) { func TestSpanWithNotEnoughHTTPRequestURLAttributesStable(t *testing.T) { attributes := make(map[string]any) - attributes[AttributeHTTPRequestMethod] = "GET" + attributes[AttributeHTTPRequestMethod] = http.MethodGet attributes[AttributeURLScheme] = "http" attributes[AttributeClientAddress] = "192.168.15.32" attributes[AttributeUserAgentOriginal] = "PostmanRuntime/7.21.0" @@ -407,7 +408,7 @@ func TestSpanWithNotEnoughHTTPRequestURLAttributesStable(t *testing.T) { assert.Nil(t, httpData.Request.URL) assert.Equal(t, "192.168.15.32", *httpData.Request.ClientIP) - assert.Equal(t, "GET", *httpData.Request.Method) + assert.Equal(t, http.MethodGet, *httpData.Request.Method) assert.Equal(t, "PostmanRuntime/7.21.0", *httpData.Request.UserAgent) contentLength := *httpData.Response.ContentLength.(*int64) assert.Equal(t, int64(12452), contentLength) @@ -417,8 +418,8 @@ func TestSpanWithNotEnoughHTTPRequestURLAttributesStable(t *testing.T) { func TestSpanWithNotEnoughHTTPRequestURLAttributesDuplicated(t *testing.T) { attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "GET" - attributes[AttributeHTTPRequestMethod] = "GET" + attributes[conventions.AttributeHTTPMethod] = http.MethodGet + attributes[AttributeHTTPRequestMethod] = http.MethodGet attributes[conventions.AttributeHTTPScheme] = "http" attributes[AttributeURLScheme] = "http" attributes[conventions.AttributeHTTPClientIP] = "192.168.15.32" @@ -440,7 +441,7 @@ func TestSpanWithNotEnoughHTTPRequestURLAttributesDuplicated(t *testing.T) { assert.Nil(t, httpData.Request.URL) assert.Equal(t, "192.168.15.32", *httpData.Request.ClientIP) - assert.Equal(t, "GET", *httpData.Request.Method) + assert.Equal(t, http.MethodGet, *httpData.Request.Method) assert.Equal(t, "PostmanRuntime/7.21.0", *httpData.Request.UserAgent) contentLength := *httpData.Response.ContentLength.(*int64) assert.Equal(t, int64(12452), contentLength) @@ -458,6 +459,7 @@ func TestSpanWithClientAddrWithoutNetworkPeerAddr(t *testing.T) { assert.Equal(t, aws.Bool(true), httpData.Request.XForwardedFor) } + func TestSpanWithClientAddrAndNetworkPeerAddr(t *testing.T) { attributes := make(map[string]any) attributes[AttributeURLFull] = "https://api.example.com/users/junit" diff --git a/exporter/awsxrayexporter/internal/translator/segment.go b/exporter/awsxrayexporter/internal/translator/segment.go index 9460f1ce5c67..849416bcd2ef 100644 --- a/exporter/awsxrayexporter/internal/translator/segment.go +++ b/exporter/awsxrayexporter/internal/translator/segment.go @@ -18,7 +18,7 @@ import ( "go.opentelemetry.io/collector/featuregate" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.8.0" + conventions "go.opentelemetry.io/collector/semconv/v1.12.0" awsxray "github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/xray" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/traceutil" @@ -46,21 +46,17 @@ const ( k8sRemoteNamespace = "K8s.RemoteNamespace" ) -var ( - // reInvalidSpanCharacters defines the invalid letters in a span name as per - // Allowed characters for X-Ray Segment Name: - // Unicode letters, numbers, and whitespace, and the following symbols: _, ., :, /, %, &, #, =, +, \, -, @ - // Doc: https://docs.aws.amazon.com/xray/latest/devguide/xray-api-segmentdocuments.html - reInvalidSpanCharacters = regexp.MustCompile(`[^ 0-9\p{L}N_.:/%&#=+\-@]`) -) - -var ( - remoteXrayExporterDotConverter = featuregate.GlobalRegistry().MustRegister( - "exporter.xray.allowDot", - featuregate.StageBeta, - featuregate.WithRegisterDescription("X-Ray Exporter will no longer convert . to _ in annotation keys when this feature gate is enabled. "), - featuregate.WithRegisterFromVersion("v0.97.0"), - ) +// reInvalidSpanCharacters defines the invalid letters in a span name as per +// Allowed characters for X-Ray Segment Name: +// Unicode letters, numbers, and whitespace, and the following symbols: _, ., :, /, %, &, #, =, +, \, -, @ +// Doc: https://docs.aws.amazon.com/xray/latest/devguide/xray-api-segmentdocuments.html +var reInvalidSpanCharacters = regexp.MustCompile(`[^ 0-9\p{L}N_.:/%&#=+\-@]`) + +var remoteXrayExporterDotConverter = featuregate.GlobalRegistry().MustRegister( + "exporter.xray.allowDot", + featuregate.StageBeta, + featuregate.WithRegisterDescription("X-Ray Exporter will no longer convert . to _ in annotation keys when this feature gate is enabled. "), + featuregate.WithRegisterFromVersion("v0.97.0"), ) const ( @@ -90,9 +86,7 @@ var removeAnnotationsFromServiceSegment = []string{ k8sRemoteNamespace, } -var ( - writers = newWriterPool(2048) -) +var writers = newWriterPool(2048) // MakeSegmentDocuments converts spans to json documents func MakeSegmentDocuments(span ptrace.Span, resource pcommon.Resource, indexedAttrs []string, indexAllAttrs bool, logGroupNames []string, skipTimestampValidation bool) ([]string, error) { @@ -143,13 +137,12 @@ func addNamespaceToSubsegmentWithRemoteService(span ptrace.Span, segment *awsxra } func MakeDependencySubsegmentForLocalRootDependencySpan(span ptrace.Span, resource pcommon.Resource, indexedAttrs []string, indexAllAttrs bool, logGroupNames []string, skipTimestampValidation bool, serviceSegmentID pcommon.SpanID) (*awsxray.Segment, error) { - var dependencySpan = ptrace.NewSpan() + dependencySpan := ptrace.NewSpan() span.CopyTo(dependencySpan) dependencySpan.SetParentSpanID(serviceSegmentID) dependencySubsegment, err := MakeSegment(dependencySpan, resource, indexedAttrs, indexAllAttrs, logGroupNames, skipTimestampValidation) - if err != nil { return nil, err } @@ -187,7 +180,6 @@ func MakeServiceSegmentForLocalRootDependencySpan(span ptrace.Span, resource pco } serviceSegment, err := MakeSegment(serviceSpan, resource, indexedAttrs, indexAllAttrs, logGroupNames, skipTimestampValidation) - if err != nil { return nil, err } @@ -234,7 +226,6 @@ func MakeServiceSegmentForLocalRootDependencySpan(span ptrace.Span, resource pco func MakeServiceSegmentForLocalRootSpanWithoutDependency(span ptrace.Span, resource pcommon.Resource, indexedAttrs []string, indexAllAttrs bool, logGroupNames []string, skipTimestampValidation bool) ([]*awsxray.Segment, error) { segment, err := MakeSegment(span, resource, indexedAttrs, indexAllAttrs, logGroupNames, skipTimestampValidation) - if err != nil { return nil, err } @@ -247,7 +238,6 @@ func MakeServiceSegmentForLocalRootSpanWithoutDependency(span ptrace.Span, resou func MakeNonLocalRootSegment(span ptrace.Span, resource pcommon.Resource, indexedAttrs []string, indexAllAttrs bool, logGroupNames []string, skipTimestampValidation bool) ([]*awsxray.Segment, error) { segment, err := MakeSegment(span, resource, indexedAttrs, indexAllAttrs, logGroupNames, skipTimestampValidation) - if err != nil { return nil, err } @@ -259,7 +249,7 @@ func MakeNonLocalRootSegment(span ptrace.Span, resource pcommon.Resource, indexe func MakeServiceSegmentAndDependencySubsegment(span ptrace.Span, resource pcommon.Resource, indexedAttrs []string, indexAllAttrs bool, logGroupNames []string, skipTimestampValidation bool) ([]*awsxray.Segment, error) { // If it is a local root span and a dependency span, we need to make a segment and subsegment representing the local service and remote service, respectively. - var serviceSegmentID = newSegmentID() + serviceSegmentID := newSegmentID() var segments []*awsxray.Segment // Make Dependency Subsegment @@ -296,7 +286,6 @@ func MakeSegmentsFromSpan(span ptrace.Span, resource pcommon.Resource, indexedAt // MakeSegmentDocumentString will be deprecated in the future func MakeSegmentDocumentString(span ptrace.Span, resource pcommon.Resource, indexedAttrs []string, indexAllAttrs bool, logGroupNames []string, skipTimestampValidation bool) (string, error) { segment, err := MakeSegment(span, resource, indexedAttrs, indexAllAttrs, logGroupNames, skipTimestampValidation) - if err != nil { return "", err } @@ -612,7 +601,8 @@ func addSpecialAttributes(attributes map[string]pcommon.Value, indexedAttrs []st } func makeXRayAttributes(attributes map[string]pcommon.Value, resource pcommon.Resource, storeResource bool, indexedAttrs []string, indexAllAttrs bool) ( - string, map[string]any, map[string]map[string]any) { + string, map[string]any, map[string]map[string]any, +) { var ( annotations = map[string]any{} metadata = map[string]map[string]any{} @@ -770,8 +760,12 @@ func fixAnnotationKey(key string) string { } func trimAwsSdkPrefix(name string, span ptrace.Span) string { - if isAwsSdkSpan(span) && strings.HasPrefix(name, "AWS.SDK.") { - return strings.TrimPrefix(name, "AWS.SDK.") + if isAwsSdkSpan(span) { + if strings.HasPrefix(name, "AWS.SDK.") { + return strings.TrimPrefix(name, "AWS.SDK.") + } else if strings.HasPrefix(name, "AWS::") { + return strings.TrimPrefix(name, "AWS::") + } } return name } diff --git a/exporter/awsxrayexporter/internal/translator/segment_test.go b/exporter/awsxrayexporter/internal/translator/segment_test.go index 8426e2e976ac..1b057c9ad899 100644 --- a/exporter/awsxrayexporter/internal/translator/segment_test.go +++ b/exporter/awsxrayexporter/internal/translator/segment_test.go @@ -7,7 +7,7 @@ import ( "crypto/rand" "encoding/binary" "fmt" - "strings" + "net/http" "testing" "time" @@ -16,7 +16,7 @@ import ( "go.opentelemetry.io/collector/featuregate" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.8.0" + conventions "go.opentelemetry.io/collector/semconv/v1.12.0" awsxray "github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/xray" ) @@ -30,16 +30,14 @@ const ( resourceArrayKey = "array.key" ) -var ( - testWriters = newWriterPool(2048) -) +var testWriters = newWriterPool(2048) func TestClientSpanWithRpcAwsSdkClientAttributes(t *testing.T) { spanName := "AmazonDynamoDB.getItem" parentSpanID := newSegmentID() user := "testingT" attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "POST" + attributes[conventions.AttributeHTTPMethod] = http.MethodPost attributes[conventions.AttributeHTTPScheme] = "https" attributes[conventions.AttributeHTTPHost] = "dynamodb.us-east-1.amazonaws.com" attributes[conventions.AttributeHTTPTarget] = "/" @@ -61,10 +59,10 @@ func TestClientSpanWithRpcAwsSdkClientAttributes(t *testing.T) { assert.NotNil(t, jsonStr) assert.NoError(t, err) - assert.True(t, strings.Contains(jsonStr, "DynamoDB")) - assert.True(t, strings.Contains(jsonStr, "GetItem")) - assert.False(t, strings.Contains(jsonStr, user)) - assert.False(t, strings.Contains(jsonStr, "user")) + assert.Contains(t, jsonStr, "DynamoDB") + assert.Contains(t, jsonStr, "GetItem") + assert.NotContains(t, jsonStr, user) + assert.NotContains(t, jsonStr, "user") } func TestClientSpanWithLegacyAwsSdkClientAttributes(t *testing.T) { @@ -72,7 +70,7 @@ func TestClientSpanWithLegacyAwsSdkClientAttributes(t *testing.T) { parentSpanID := newSegmentID() user := "testingT" attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "POST" + attributes[conventions.AttributeHTTPMethod] = http.MethodPost attributes[conventions.AttributeHTTPScheme] = "https" attributes[conventions.AttributeHTTPHost] = "dynamodb.us-east-1.amazonaws.com" attributes[conventions.AttributeHTTPTarget] = "/" @@ -94,17 +92,17 @@ func TestClientSpanWithLegacyAwsSdkClientAttributes(t *testing.T) { assert.NotNil(t, jsonStr) assert.NoError(t, err) - assert.True(t, strings.Contains(jsonStr, "DynamoDB")) - assert.True(t, strings.Contains(jsonStr, "GetItem")) - assert.False(t, strings.Contains(jsonStr, user)) - assert.False(t, strings.Contains(jsonStr, "user")) + assert.Contains(t, jsonStr, "DynamoDB") + assert.Contains(t, jsonStr, "GetItem") + assert.NotContains(t, jsonStr, user) + assert.NotContains(t, jsonStr, "user") } func TestClientSpanWithPeerService(t *testing.T) { spanName := "AmazonDynamoDB.getItem" parentSpanID := newSegmentID() attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "POST" + attributes[conventions.AttributeHTTPMethod] = http.MethodPost attributes[conventions.AttributeHTTPScheme] = "https" attributes[conventions.AttributeHTTPHost] = "dynamodb.us-east-1.amazonaws.com" attributes[conventions.AttributeHTTPTarget] = "/" @@ -127,7 +125,7 @@ func TestServerSpanWithInternalServerError(t *testing.T) { userAgent := "PostmanRuntime/7.21.0" enduser := "go.tester@example.com" attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "POST" + attributes[conventions.AttributeHTTPMethod] = http.MethodPost attributes[conventions.AttributeHTTPURL] = "https://api.example.org/api/locations" attributes[conventions.AttributeHTTPTarget] = "/api/locations" attributes[conventions.AttributeHTTPStatusCode] = 500 @@ -154,7 +152,7 @@ func TestServerSpanWithThrottle(t *testing.T) { userAgent := "PostmanRuntime/7.21.0" enduser := "go.tester@example.com" attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "POST" + attributes[conventions.AttributeHTTPMethod] = http.MethodPost attributes[conventions.AttributeHTTPURL] = "https://api.example.org/api/locations" attributes[conventions.AttributeHTTPTarget] = "/api/locations" attributes[conventions.AttributeHTTPStatusCode] = 429 @@ -240,7 +238,7 @@ func TestClientSpanWithDbComponent(t *testing.T) { assert.NotNil(t, segment.Service) assert.NotNil(t, segment.AWS) assert.NotNil(t, segment.Metadata) - assert.Equal(t, 0, len(segment.Annotations)) + assert.Empty(t, segment.Annotations) assert.Equal(t, enterpriseAppID, segment.Metadata["default"]["enterprise.app.id"]) assert.Nil(t, segment.Cause) assert.Nil(t, segment.HTTP) @@ -253,15 +251,15 @@ func TestClientSpanWithDbComponent(t *testing.T) { require.NoError(t, w.Encode(segment)) jsonStr := w.String() testWriters.release(w) - assert.True(t, strings.Contains(jsonStr, spanName)) - assert.True(t, strings.Contains(jsonStr, enterpriseAppID)) + assert.Contains(t, jsonStr, spanName) + assert.Contains(t, jsonStr, enterpriseAppID) } func TestClientSpanWithHttpHost(t *testing.T) { spanName := "GET /" parentSpanID := newSegmentID() attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "GET" + attributes[conventions.AttributeHTTPMethod] = http.MethodGet attributes[conventions.AttributeHTTPScheme] = "https" attributes[conventions.AttributeNetPeerIP] = "2607:f8b0:4000:80c::2004" attributes[conventions.AttributeNetPeerPort] = "9443" @@ -281,7 +279,7 @@ func TestClientSpanWithoutHttpHost(t *testing.T) { spanName := "GET /" parentSpanID := newSegmentID() attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "GET" + attributes[conventions.AttributeHTTPMethod] = http.MethodGet attributes[conventions.AttributeHTTPScheme] = "https" attributes[conventions.AttributeNetPeerIP] = "2607:f8b0:4000:80c::2004" attributes[conventions.AttributeNetPeerPort] = "9443" @@ -300,7 +298,7 @@ func TestClientSpanWithRpcHost(t *testing.T) { spanName := "GET /com.foo.AnimalService/GetCats" parentSpanID := newSegmentID() attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "GET" + attributes[conventions.AttributeHTTPMethod] = http.MethodGet attributes[conventions.AttributeHTTPScheme] = "https" attributes[conventions.AttributeNetPeerIP] = "2607:f8b0:4000:80c::2004" attributes[conventions.AttributeNetPeerPort] = "9443" @@ -319,7 +317,7 @@ func TestClientSpanWithRpcHost(t *testing.T) { func TestSpanWithInvalidTraceId(t *testing.T) { spanName := "platformapi.widgets.searchWidgets" attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "GET" + attributes[conventions.AttributeHTTPMethod] = http.MethodGet attributes[conventions.AttributeHTTPScheme] = "ipv6" attributes[conventions.AttributeNetPeerIP] = "2607:f8b0:4000:80c::2004" attributes[conventions.AttributeNetPeerPort] = "9443" @@ -354,7 +352,7 @@ func TestSpanWithInvalidTraceIdWithoutTimestampValidation(t *testing.T) { parentSpanID := newSegmentID() user := "testingT" attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "POST" + attributes[conventions.AttributeHTTPMethod] = http.MethodPost attributes[conventions.AttributeHTTPScheme] = "https" attributes[conventions.AttributeHTTPHost] = "payment.amazonaws.com" attributes[conventions.AttributeHTTPTarget] = "/" @@ -376,9 +374,9 @@ func TestSpanWithInvalidTraceIdWithoutTimestampValidation(t *testing.T) { require.NoError(t, err) assert.NotNil(t, jsonStr) - assert.True(t, strings.Contains(jsonStr, "ProducerService")) - assert.False(t, strings.Contains(jsonStr, user)) - assert.False(t, strings.Contains(jsonStr, "user")) + assert.Contains(t, jsonStr, "ProducerService") + assert.NotContains(t, jsonStr, user) + assert.NotContains(t, jsonStr, "user") } func TestSpanWithExpiredTraceIdWithoutTimestampValidation(t *testing.T) { @@ -409,7 +407,7 @@ func TestFixSegmentName(t *testing.T) { func TestFixAnnotationKey(t *testing.T) { err := featuregate.GlobalRegistry().Set("exporter.xray.allowDot", false) - assert.Nil(t, err) + assert.NoError(t, err) validKey := "Key_1" fixedKey := fixAnnotationKey(validKey) @@ -424,7 +422,7 @@ func TestFixAnnotationKey(t *testing.T) { func TestFixAnnotationKeyWithAllowDot(t *testing.T) { err := featuregate.GlobalRegistry().Set("exporter.xray.allowDot", true) - assert.Nil(t, err) + assert.NoError(t, err) validKey := "Key_1" fixedKey := fixAnnotationKey(validKey) @@ -467,7 +465,7 @@ func TestSpanWithAttributesDefaultNotIndexed(t *testing.T) { segment, _ := MakeSegment(span, resource, nil, false, nil, false) assert.NotNil(t, segment) - assert.Equal(t, 0, len(segment.Annotations)) + assert.Empty(t, segment.Annotations) assert.Equal(t, "val1", segment.Metadata["default"]["attr1@1"]) assert.Equal(t, "val2", segment.Metadata["default"]["attr2@2"]) assert.Equal(t, "string", segment.Metadata["default"]["otel.resource.string.key"]) @@ -494,7 +492,7 @@ func TestSpanWithResourceNotStoredIfSubsegment(t *testing.T) { segment, _ := MakeSegment(span, resource, nil, false, nil, false) assert.NotNil(t, segment) - assert.Equal(t, 0, len(segment.Annotations)) + assert.Empty(t, segment.Annotations) assert.Equal(t, "val1", segment.Metadata["default"]["attr1@1"]) assert.Equal(t, "val2", segment.Metadata["default"]["attr2@2"]) assert.Nil(t, segment.Metadata["default"]["otel.resource.string.key"]) @@ -517,7 +515,7 @@ func TestSpanWithAttributesPartlyIndexed(t *testing.T) { segment, _ := MakeSegment(span, resource, []string{"attr1@1", "not_exist"}, false, nil, false) assert.NotNil(t, segment) - assert.Equal(t, 1, len(segment.Annotations)) + assert.Len(t, segment.Annotations, 1) assert.Equal(t, "val1", segment.Annotations["attr1_1"]) assert.Equal(t, "val2", segment.Metadata["default"]["attr2@2"]) } @@ -535,7 +533,7 @@ func TestSpanWithAnnotationsAttribute(t *testing.T) { segment, _ := MakeSegment(span, resource, nil, false, nil, false) assert.NotNil(t, segment) - assert.Equal(t, 1, len(segment.Annotations)) + assert.Len(t, segment.Annotations, 1) assert.Equal(t, "val2", segment.Annotations["attr2_2"]) assert.Equal(t, "val1", segment.Metadata["default"]["attr1@1"]) } @@ -570,8 +568,8 @@ func TestSpanWithAttributesSegmentMetadata(t *testing.T) { segment, _ := MakeSegment(span, resource, nil, false, nil, false) assert.NotNil(t, segment) - assert.Equal(t, 0, len(segment.Annotations)) - assert.Equal(t, 2, len(segment.Metadata)) + assert.Empty(t, segment.Annotations) + assert.Len(t, segment.Metadata, 2) assert.Equal(t, "val1", segment.Metadata["default"]["attr1@1"]) assert.Equal(t, "custom_value", segment.Metadata["default"]["custom_key"]) assert.Equal(t, "retain-value", segment.Metadata["default"][awsxray.AWSXraySegmentMetadataAttributePrefix+"non-xray-sdk"]) @@ -585,7 +583,7 @@ func TestSpanWithAttributesSegmentMetadata(t *testing.T) { func TestResourceAttributesCanBeIndexed(t *testing.T) { err := featuregate.GlobalRegistry().Set("exporter.xray.allowDot", false) - assert.Nil(t, err) + assert.NoError(t, err) spanName := "/api/locations" parentSpanID := newSegmentID() @@ -602,7 +600,7 @@ func TestResourceAttributesCanBeIndexed(t *testing.T) { }, false, nil, false) assert.NotNil(t, segment) - assert.Equal(t, 4, len(segment.Annotations)) + assert.Len(t, segment.Annotations, 4) assert.Equal(t, "string", segment.Annotations["otel_resource_string_key"]) assert.Equal(t, int64(10), segment.Annotations["otel_resource_int_key"]) assert.Equal(t, 5.0, segment.Annotations["otel_resource_double_key"]) @@ -618,7 +616,7 @@ func TestResourceAttributesCanBeIndexed(t *testing.T) { func TestResourceAttributesCanBeIndexedWithAllowDot(t *testing.T) { err := featuregate.GlobalRegistry().Set("exporter.xray.allowDot", true) - assert.Nil(t, err) + assert.NoError(t, err) spanName := "/api/locations" parentSpanID := newSegmentID() @@ -635,7 +633,7 @@ func TestResourceAttributesCanBeIndexedWithAllowDot(t *testing.T) { }, false, nil, false) assert.NotNil(t, segment) - assert.Equal(t, 4, len(segment.Annotations)) + assert.Len(t, segment.Annotations, 4) assert.Equal(t, "string", segment.Annotations["otel.resource.string.key"]) assert.Equal(t, int64(10), segment.Annotations["otel.resource.int.key"]) assert.Equal(t, 5.0, segment.Annotations["otel.resource.double.key"]) @@ -672,7 +670,7 @@ func TestResourceAttributesNotIndexedIfSubsegment(t *testing.T) { func TestSpanWithSpecialAttributesAsListed(t *testing.T) { err := featuregate.GlobalRegistry().Set("exporter.xray.allowDot", false) - assert.Nil(t, err) + assert.NoError(t, err) spanName := "/api/locations" parentSpanID := newSegmentID() @@ -685,14 +683,14 @@ func TestSpanWithSpecialAttributesAsListed(t *testing.T) { segment, _ := MakeSegment(span, resource, []string{awsxray.AWSOperationAttribute, conventions.AttributeRPCMethod}, false, nil, false) assert.NotNil(t, segment) - assert.Equal(t, 2, len(segment.Annotations)) + assert.Len(t, segment.Annotations, 2) assert.Equal(t, "aws_operation_val", segment.Annotations["aws_operation"]) assert.Equal(t, "rpc_method_val", segment.Annotations["rpc_method"]) } func TestSpanWithSpecialAttributesAsListedWithAllowDot(t *testing.T) { err := featuregate.GlobalRegistry().Set("exporter.xray.allowDot", true) - assert.Nil(t, err) + assert.NoError(t, err) spanName := "/api/locations" parentSpanID := newSegmentID() @@ -705,14 +703,14 @@ func TestSpanWithSpecialAttributesAsListedWithAllowDot(t *testing.T) { segment, _ := MakeSegment(span, resource, []string{awsxray.AWSOperationAttribute, conventions.AttributeRPCMethod}, false, nil, false) assert.NotNil(t, segment) - assert.Equal(t, 2, len(segment.Annotations)) + assert.Len(t, segment.Annotations, 2) assert.Equal(t, "aws_operation_val", segment.Annotations[awsxray.AWSOperationAttribute]) assert.Equal(t, "rpc_method_val", segment.Annotations[conventions.AttributeRPCMethod]) } func TestSpanWithSpecialAttributesAsListedAndIndexAll(t *testing.T) { err := featuregate.GlobalRegistry().Set("exporter.xray.allowDot", false) - assert.Nil(t, err) + assert.NoError(t, err) spanName := "/api/locations" parentSpanID := newSegmentID() @@ -731,7 +729,7 @@ func TestSpanWithSpecialAttributesAsListedAndIndexAll(t *testing.T) { func TestSpanWithSpecialAttributesAsListedAndIndexAllWithAllowDot(t *testing.T) { err := featuregate.GlobalRegistry().Set("exporter.xray.allowDot", true) - assert.Nil(t, err) + assert.NoError(t, err) spanName := "/api/locations" parentSpanID := newSegmentID() @@ -1070,7 +1068,7 @@ func TestClientSpanWithAwsRemoteServiceName(t *testing.T) { parentSpanID := newSegmentID() user := "testingT" attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "POST" + attributes[conventions.AttributeHTTPMethod] = http.MethodPost attributes[conventions.AttributeHTTPScheme] = "https" attributes[conventions.AttributeHTTPHost] = "payment.amazonaws.com" attributes[conventions.AttributeHTTPTarget] = "/" @@ -1088,18 +1086,18 @@ func TestClientSpanWithAwsRemoteServiceName(t *testing.T) { assert.NotNil(t, jsonStr) assert.NoError(t, err) - assert.True(t, strings.Contains(jsonStr, "PaymentService")) - assert.False(t, strings.Contains(jsonStr, user)) - assert.False(t, strings.Contains(jsonStr, "user")) + assert.Contains(t, jsonStr, "PaymentService") + assert.NotContains(t, jsonStr, user) + assert.NotContains(t, jsonStr, "user") } -func TestAwsSdkSpanWithAwsRemoteServiceName(t *testing.T) { +func TestAwsSdkSpanWithDeprecatedAwsRemoteServiceName(t *testing.T) { spanName := "DynamoDB.PutItem" parentSpanID := newSegmentID() user := "testingT" attributes := make(map[string]any) attributes[conventions.AttributeRPCSystem] = "aws-api" - attributes[conventions.AttributeHTTPMethod] = "POST" + attributes[conventions.AttributeHTTPMethod] = http.MethodPost attributes[conventions.AttributeHTTPScheme] = "https" attributes[conventions.AttributeRPCService] = "DynamoDb" attributes[awsRemoteService] = "AWS.SDK.DynamoDb" @@ -1115,10 +1113,38 @@ func TestAwsSdkSpanWithAwsRemoteServiceName(t *testing.T) { assert.NotNil(t, jsonStr) assert.NoError(t, err) - assert.True(t, strings.Contains(jsonStr, "DynamoDb")) - assert.False(t, strings.Contains(jsonStr, "DynamoDb.PutItem")) - assert.False(t, strings.Contains(jsonStr, user)) - assert.False(t, strings.Contains(jsonStr, "user")) + assert.Contains(t, jsonStr, "DynamoDb") + assert.NotContains(t, jsonStr, "DynamoDb.PutItem") + assert.NotContains(t, jsonStr, user) + assert.NotContains(t, jsonStr, "user") +} + +func TestAwsSdkSpanWithAwsRemoteServiceName(t *testing.T) { + spanName := "DynamoDB.PutItem" + parentSpanID := newSegmentID() + user := "testingT" + attributes := make(map[string]any) + attributes[conventions.AttributeRPCSystem] = "aws-api" + attributes[conventions.AttributeHTTPMethod] = http.MethodPost + attributes[conventions.AttributeHTTPScheme] = "https" + attributes[conventions.AttributeRPCService] = "DynamoDb" + attributes[awsRemoteService] = "AWS::DynamoDB" + + resource := constructDefaultResource() + span := constructClientSpan(parentSpanID, spanName, 0, "OK", attributes) + + segment, _ := MakeSegment(span, resource, nil, false, nil, false) + assert.Equal(t, "DynamoDB", *segment.Name) + assert.Equal(t, "subsegment", *segment.Type) + + jsonStr, err := MakeSegmentDocumentString(span, resource, nil, false, nil, false) + + assert.NotNil(t, jsonStr) + assert.NoError(t, err) + assert.Contains(t, jsonStr, "DynamoDb") + assert.NotContains(t, jsonStr, "DynamoDb.PutItem") + assert.NotContains(t, jsonStr, user) + assert.NotContains(t, jsonStr, "user") } func TestProducerSpanWithAwsRemoteServiceName(t *testing.T) { @@ -1126,7 +1152,7 @@ func TestProducerSpanWithAwsRemoteServiceName(t *testing.T) { parentSpanID := newSegmentID() user := "testingT" attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "POST" + attributes[conventions.AttributeHTTPMethod] = http.MethodPost attributes[conventions.AttributeHTTPScheme] = "https" attributes[conventions.AttributeHTTPHost] = "payment.amazonaws.com" attributes[conventions.AttributeHTTPTarget] = "/" @@ -1144,9 +1170,9 @@ func TestProducerSpanWithAwsRemoteServiceName(t *testing.T) { assert.NotNil(t, jsonStr) assert.NoError(t, err) - assert.True(t, strings.Contains(jsonStr, "ProducerService")) - assert.False(t, strings.Contains(jsonStr, user)) - assert.False(t, strings.Contains(jsonStr, "user")) + assert.Contains(t, jsonStr, "ProducerService") + assert.NotContains(t, jsonStr, user) + assert.NotContains(t, jsonStr, "user") } func TestConsumerSpanWithAwsRemoteServiceName(t *testing.T) { @@ -1163,9 +1189,9 @@ func TestConsumerSpanWithAwsRemoteServiceName(t *testing.T) { assert.NotNil(t, jsonStr) assert.NoError(t, err) - assert.True(t, strings.Contains(jsonStr, "ConsumerService")) - assert.False(t, strings.Contains(jsonStr, user)) - assert.False(t, strings.Contains(jsonStr, "user")) + assert.Contains(t, jsonStr, "ConsumerService") + assert.NotContains(t, jsonStr, user) + assert.NotContains(t, jsonStr, "user") } func TestServerSpanWithAwsLocalServiceName(t *testing.T) { @@ -1173,7 +1199,7 @@ func TestServerSpanWithAwsLocalServiceName(t *testing.T) { parentSpanID := newSegmentID() user := "testingT" attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "POST" + attributes[conventions.AttributeHTTPMethod] = http.MethodPost attributes[conventions.AttributeHTTPScheme] = "https" attributes[conventions.AttributeHTTPHost] = "payment.amazonaws.com" attributes[conventions.AttributeHTTPTarget] = "/" @@ -1191,9 +1217,9 @@ func TestServerSpanWithAwsLocalServiceName(t *testing.T) { assert.NotNil(t, jsonStr) assert.NoError(t, err) - assert.True(t, strings.Contains(jsonStr, "PaymentLocalService")) - assert.False(t, strings.Contains(jsonStr, user)) - assert.False(t, strings.Contains(jsonStr, "user")) + assert.Contains(t, jsonStr, "PaymentLocalService") + assert.NotContains(t, jsonStr, user) + assert.NotContains(t, jsonStr, "user") } func validateLocalRootDependencySubsegment(t *testing.T, segment *awsxray.Segment, span ptrace.Span, parentID string) { @@ -1206,13 +1232,13 @@ func validateLocalRootDependencySubsegment(t *testing.T, segment *awsxray.Segmen assert.Equal(t, parentID, *segment.ParentID) assert.Equal(t, expectedTraceID, *segment.TraceID) assert.NotNil(t, segment.HTTP) - assert.Equal(t, "POST", *segment.HTTP.Request.Method) - assert.Equal(t, 2, len(segment.Annotations)) + assert.Equal(t, http.MethodPost, *segment.HTTP.Request.Method) + assert.Len(t, segment.Annotations, 2) assert.Nil(t, segment.Annotations[awsRemoteService]) assert.Nil(t, segment.Annotations[remoteTarget]) assert.Equal(t, "myAnnotationValue", segment.Annotations["myAnnotationKey"]) - assert.Equal(t, 8, len(segment.Metadata["default"])) + assert.Len(t, segment.Metadata["default"], 8) assert.Equal(t, "receive", segment.Metadata["default"][conventions.AttributeMessagingOperation]) assert.Equal(t, "LOCAL_ROOT", segment.Metadata["default"][awsSpanKind]) assert.Equal(t, "myRemoteOperation", segment.Metadata["default"][awsRemoteOperation]) @@ -1224,7 +1250,7 @@ func validateLocalRootDependencySubsegment(t *testing.T, segment *awsxray.Segmen assert.Equal(t, "MySDK", *segment.AWS.XRay.SDK) assert.Equal(t, "1.20.0", *segment.AWS.XRay.SDKVersion) - assert.Equal(t, true, *segment.AWS.XRay.AutoInstrumentation) + assert.True(t, *segment.AWS.XRay.AutoInstrumentation) assert.Equal(t, "UpdateItem", *segment.AWS.Operation) assert.Equal(t, "AWSAccountAttribute", *segment.AWS.AccountID) @@ -1244,13 +1270,13 @@ func validateLocalRootServiceSegment(t *testing.T, segment *awsxray.Segment, spa assert.Equal(t, "myLocalService", *segment.Name) assert.Equal(t, expectedTraceID, *segment.TraceID) assert.Nil(t, segment.HTTP) - assert.Equal(t, 1, len(segment.Annotations)) + assert.Len(t, segment.Annotations, 1) assert.Equal(t, "myAnnotationValue", segment.Annotations["myAnnotationKey"]) - assert.Equal(t, 1, len(segment.Metadata["default"])) + assert.Len(t, segment.Metadata["default"], 1) assert.Equal(t, "service.name=myTest", segment.Metadata["default"]["otel.resource.attributes"]) assert.Equal(t, "MySDK", *segment.AWS.XRay.SDK) assert.Equal(t, "1.20.0", *segment.AWS.XRay.SDKVersion) - assert.Equal(t, true, *segment.AWS.XRay.AutoInstrumentation) + assert.True(t, *segment.AWS.XRay.AutoInstrumentation) assert.Nil(t, segment.AWS.Operation) assert.Nil(t, segment.AWS.AccountID) assert.Nil(t, segment.AWS.RemoteRegion) @@ -1265,7 +1291,7 @@ func validateLocalRootServiceSegment(t *testing.T, segment *awsxray.Segment, spa func getBasicAttributes() map[string]any { attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "POST" + attributes[conventions.AttributeHTTPMethod] = http.MethodPost attributes[conventions.AttributeMessagingOperation] = "receive" attributes["otel.resource.attributes"] = "service.name=myTest" @@ -1308,7 +1334,7 @@ func addSpanLink(span ptrace.Span) { func TestLocalRootConsumer(t *testing.T) { err := featuregate.GlobalRegistry().Set("exporter.xray.allowDot", false) - assert.Nil(t, err) + assert.NoError(t, err) spanName := "destination operation" resource := getBasicResource() @@ -1323,14 +1349,14 @@ func TestLocalRootConsumer(t *testing.T) { segments, err := MakeSegmentsFromSpan(span, resource, []string{awsRemoteService, "myAnnotationKey"}, false, nil, false) assert.NotNil(t, segments) - assert.Equal(t, 2, len(segments)) - assert.Nil(t, err) + assert.Len(t, segments, 2) + assert.NoError(t, err) validateLocalRootDependencySubsegment(t, segments[0], span, *segments[1].ID) assert.Nil(t, segments[0].Links) validateLocalRootServiceSegment(t, segments[1], span) - assert.Equal(t, 1, len(segments[1].Links)) + assert.Len(t, segments[1].Links, 1) // Checks these values are the same for both assert.Equal(t, segments[0].StartTime, segments[1].StartTime) @@ -1354,8 +1380,8 @@ func TestNonLocalRootConsumerProcess(t *testing.T) { segments, err := MakeSegmentsFromSpan(span, resource, []string{awsRemoteService, "myAnnotationKey"}, false, nil, false) assert.NotNil(t, segments) - assert.Equal(t, 1, len(segments)) - assert.Nil(t, err) + assert.Len(t, segments, 1) + assert.NoError(t, err) tempTraceID := span.TraceID() expectedTraceID := "1-" + fmt.Sprintf("%x", tempTraceID[0:4]) + "-" + fmt.Sprintf("%x", tempTraceID[4:16]) @@ -1365,20 +1391,20 @@ func TestNonLocalRootConsumerProcess(t *testing.T) { assert.Equal(t, "destination operation", *segments[0].Name) assert.NotEqual(t, parentSpanID.String(), *segments[0].ID) assert.Equal(t, span.SpanID().String(), *segments[0].ID) - assert.Equal(t, 1, len(segments[0].Links)) + assert.Len(t, segments[0].Links, 1) assert.Equal(t, expectedTraceID, *segments[0].TraceID) assert.NotNil(t, segments[0].HTTP) - assert.Equal(t, "POST", *segments[0].HTTP.Request.Method) - assert.Equal(t, 1, len(segments[0].Annotations)) + assert.Equal(t, http.MethodPost, *segments[0].HTTP.Request.Method) + assert.Len(t, segments[0].Annotations, 1) assert.Equal(t, "myAnnotationValue", segments[0].Annotations["myAnnotationKey"]) - assert.Equal(t, 7, len(segments[0].Metadata["default"])) + assert.Len(t, segments[0].Metadata["default"], 7) assert.Equal(t, "Consumer", segments[0].Metadata["default"][awsSpanKind]) assert.Equal(t, "myLocalService", segments[0].Metadata["default"][awsLocalService]) assert.Equal(t, "receive", segments[0].Metadata["default"][conventions.AttributeMessagingOperation]) assert.Equal(t, "service.name=myTest", segments[0].Metadata["default"]["otel.resource.attributes"]) assert.Equal(t, "MySDK", *segments[0].AWS.XRay.SDK) assert.Equal(t, "1.20.0", *segments[0].AWS.XRay.SDKVersion) - assert.Equal(t, true, *segments[0].AWS.XRay.AutoInstrumentation) + assert.True(t, *segments[0].AWS.XRay.AutoInstrumentation) assert.Equal(t, "UpdateItem", *segments[0].AWS.Operation) assert.Nil(t, segments[0].Namespace) } @@ -1400,8 +1426,8 @@ func TestLocalRootConsumerAWSNamespace(t *testing.T) { segments, err := MakeSegmentsFromSpan(span, resource, []string{awsRemoteService, "myAnnotationKey"}, false, nil, false) assert.NotNil(t, segments) - assert.Equal(t, 2, len(segments)) - assert.Nil(t, err) + assert.Len(t, segments, 2) + assert.NoError(t, err) // Ensure that AWS namespace is not overwritten to remote assert.Equal(t, "aws", *segments[0].Namespace) @@ -1409,7 +1435,7 @@ func TestLocalRootConsumerAWSNamespace(t *testing.T) { func TestLocalRootClient(t *testing.T) { err := featuregate.GlobalRegistry().Set("exporter.xray.allowDot", false) - assert.Nil(t, err) + assert.NoError(t, err) spanName := "SQS Get" resource := getBasicResource() @@ -1426,11 +1452,11 @@ func TestLocalRootClient(t *testing.T) { segments, err := MakeSegmentsFromSpan(span, resource, []string{awsRemoteService, "myAnnotationKey"}, false, nil, false) assert.NotNil(t, segments) - assert.Equal(t, 2, len(segments)) - assert.Nil(t, err) + assert.Len(t, segments, 2) + assert.NoError(t, err) validateLocalRootDependencySubsegment(t, segments[0], span, *segments[1].ID) - assert.Equal(t, 1, len(segments[0].Links)) + assert.Len(t, segments[0].Links, 1) validateLocalRootServiceSegment(t, segments[1], span) assert.Nil(t, segments[1].Links) @@ -1449,7 +1475,7 @@ func TestLocalRootClientAwsServiceMetrics(t *testing.T) { attributes := getBasicAttributes() attributes[awsSpanKind] = "LOCAL_ROOT" attributes[conventions.AttributeRPCSystem] = "aws-api" - attributes[conventions.AttributeHTTPMethod] = "POST" + attributes[conventions.AttributeHTTPMethod] = http.MethodPost attributes[conventions.AttributeHTTPScheme] = "https" attributes[conventions.AttributeRPCService] = "SQS" attributes[awsRemoteService] = "AWS.SDK.SQS" @@ -1463,8 +1489,8 @@ func TestLocalRootClientAwsServiceMetrics(t *testing.T) { segments, err := MakeSegmentsFromSpan(span, resource, []string{awsRemoteService, "myAnnotationKey"}, false, nil, false) assert.NotNil(t, segments) - assert.Equal(t, 2, len(segments)) - assert.Nil(t, err) + assert.Len(t, segments, 2) + assert.NoError(t, err) subsegment := segments[0] @@ -1487,11 +1513,11 @@ func TestLocalRootProducer(t *testing.T) { segments, err := MakeSegmentsFromSpan(span, resource, []string{awsRemoteService, "myAnnotationKey"}, false, nil, false) assert.NotNil(t, segments) - assert.Equal(t, 2, len(segments)) - assert.Nil(t, err) + assert.Len(t, segments, 2) + assert.NoError(t, err) validateLocalRootDependencySubsegment(t, segments[0], span, *segments[1].ID) - assert.Equal(t, 1, len(segments[0].Links)) + assert.Len(t, segments[0].Links, 1) validateLocalRootServiceSegment(t, segments[1], span) assert.Nil(t, segments[1].Links) @@ -1509,20 +1535,20 @@ func validateLocalRootWithoutDependency(t *testing.T, segment *awsxray.Segment, assert.Nil(t, segment.Type) assert.Equal(t, "myLocalService", *segment.Name) assert.Equal(t, span.ParentSpanID().String(), *segment.ParentID) - assert.Equal(t, 1, len(segment.Links)) + assert.Len(t, segment.Links, 1) assert.Equal(t, expectedTraceID, *segment.TraceID) - assert.Equal(t, "POST", *segment.HTTP.Request.Method) - assert.Equal(t, 2, len(segment.Annotations)) + assert.Equal(t, http.MethodPost, *segment.HTTP.Request.Method) + assert.Len(t, segment.Annotations, 2) assert.Equal(t, "myRemoteService", segment.Annotations["aws_remote_service"]) assert.Equal(t, "myAnnotationValue", segment.Annotations["myAnnotationKey"]) - var numberOfMetadataKeys = 8 + numberOfMetadataKeys := 8 if span.Kind() == ptrace.SpanKindServer { numberOfMetadataKeys = 30 } - assert.Equal(t, numberOfMetadataKeys, len(segment.Metadata["default"])) + assert.Len(t, segment.Metadata["default"], numberOfMetadataKeys) assert.Equal(t, "receive", segment.Metadata["default"][conventions.AttributeMessagingOperation]) assert.Equal(t, "LOCAL_ROOT", segment.Metadata["default"][awsSpanKind]) assert.Equal(t, "myRemoteOperation", segment.Metadata["default"][awsRemoteOperation]) @@ -1535,7 +1561,7 @@ func validateLocalRootWithoutDependency(t *testing.T, segment *awsxray.Segment, assert.Equal(t, "service.name=myTest", segment.Metadata["default"]["otel.resource.attributes"]) assert.Equal(t, "MySDK", *segment.AWS.XRay.SDK) assert.Equal(t, "1.20.0", *segment.AWS.XRay.SDKVersion) - assert.Equal(t, true, *segment.AWS.XRay.AutoInstrumentation) + assert.True(t, *segment.AWS.XRay.AutoInstrumentation) assert.Equal(t, "UpdateItem", *segment.AWS.Operation) assert.Equal(t, "AWSAccountAttribute", *segment.AWS.AccountID) @@ -1549,7 +1575,7 @@ func validateLocalRootWithoutDependency(t *testing.T, segment *awsxray.Segment, func TestLocalRootServer(t *testing.T) { err := featuregate.GlobalRegistry().Set("exporter.xray.allowDot", false) - assert.Nil(t, err) + assert.NoError(t, err) spanName := "MyService" resource := getBasicResource() @@ -1564,15 +1590,15 @@ func TestLocalRootServer(t *testing.T) { segments, err := MakeSegmentsFromSpan(span, resource, []string{awsRemoteService, "myAnnotationKey"}, false, nil, false) assert.NotNil(t, segments) - assert.Equal(t, 1, len(segments)) - assert.Nil(t, err) + assert.Len(t, segments, 1) + assert.NoError(t, err) validateLocalRootWithoutDependency(t, segments[0], span) } func TestLocalRootInternal(t *testing.T) { err := featuregate.GlobalRegistry().Set("exporter.xray.allowDot", false) - assert.Nil(t, err) + assert.NoError(t, err) spanName := "MyInternalService" resource := getBasicResource() @@ -1587,8 +1613,8 @@ func TestLocalRootInternal(t *testing.T) { segments, err := MakeSegmentsFromSpan(span, resource, []string{awsRemoteService, "myAnnotationKey"}, false, nil, false) assert.NotNil(t, segments) - assert.Equal(t, 1, len(segments)) - assert.Nil(t, err) + assert.Len(t, segments, 1) + assert.NoError(t, err) validateLocalRootWithoutDependency(t, segments[0], span) } @@ -1608,8 +1634,8 @@ func TestNotLocalRootInternal(t *testing.T) { segments, err := MakeSegmentsFromSpan(span, resource, []string{awsRemoteService, "myAnnotationKey"}, false, nil, false) assert.NotNil(t, segments) - assert.Equal(t, 1, len(segments)) - assert.Nil(t, err) + assert.Len(t, segments, 1) + assert.NoError(t, err) // Validate segment assert.Equal(t, "subsegment", *segments[0].Type) @@ -1632,8 +1658,8 @@ func TestNotLocalRootConsumer(t *testing.T) { segments, err := MakeSegmentsFromSpan(span, resource, []string{awsRemoteService, "myAnnotationKey"}, false, nil, false) assert.NotNil(t, segments) - assert.Equal(t, 1, len(segments)) - assert.Nil(t, err) + assert.Len(t, segments, 1) + assert.NoError(t, err) // Validate segment assert.Equal(t, "subsegment", *segments[0].Type) @@ -1656,8 +1682,8 @@ func TestNotLocalRootClient(t *testing.T) { segments, err := MakeSegmentsFromSpan(span, resource, []string{awsRemoteService, "myAnnotationKey"}, false, nil, false) assert.NotNil(t, segments) - assert.Equal(t, 1, len(segments)) - assert.Nil(t, err) + assert.Len(t, segments, 1) + assert.NoError(t, err) // Validate segment assert.Equal(t, "subsegment", *segments[0].Type) @@ -1680,8 +1706,8 @@ func TestNotLocalRootProducer(t *testing.T) { segments, err := MakeSegmentsFromSpan(span, resource, []string{awsRemoteService, "myAnnotationKey"}, false, nil, false) assert.NotNil(t, segments) - assert.Equal(t, 1, len(segments)) - assert.Nil(t, err) + assert.Len(t, segments, 1) + assert.NoError(t, err) // Validate segment assert.Equal(t, "subsegment", *segments[0].Type) @@ -1706,8 +1732,8 @@ func TestNotLocalRootServer(t *testing.T) { segments, err := MakeSegmentsFromSpan(span, resource, []string{awsRemoteService, "myAnnotationKey"}, false, nil, false) assert.NotNil(t, segments) - assert.Equal(t, 1, len(segments)) - assert.Nil(t, err) + assert.Len(t, segments, 1) + assert.NoError(t, err) // Validate segment assert.Nil(t, segments[0].Type) diff --git a/exporter/awsxrayexporter/internal/translator/service.go b/exporter/awsxrayexporter/internal/translator/service.go index e6d32cb961c5..4977980825a5 100644 --- a/exporter/awsxrayexporter/internal/translator/service.go +++ b/exporter/awsxrayexporter/internal/translator/service.go @@ -5,7 +5,7 @@ package translator // import "github.com/open-telemetry/opentelemetry-collector- import ( "go.opentelemetry.io/collector/pdata/pcommon" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.12.0" awsxray "github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/xray" ) diff --git a/exporter/awsxrayexporter/internal/translator/service_test.go b/exporter/awsxrayexporter/internal/translator/service_test.go index 5898d97545c1..81745b031aba 100644 --- a/exporter/awsxrayexporter/internal/translator/service_test.go +++ b/exporter/awsxrayexporter/internal/translator/service_test.go @@ -4,13 +4,12 @@ package translator import ( - "strings" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/pdata/pcommon" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.12.0" ) func TestServiceFromResource(t *testing.T) { @@ -23,7 +22,7 @@ func TestServiceFromResource(t *testing.T) { require.NoError(t, w.Encode(service)) jsonStr := w.String() testWriters.release(w) - assert.True(t, strings.Contains(jsonStr, "semver:1.1.4")) + assert.Contains(t, jsonStr, "semver:1.1.4") } func TestServiceFromResourceWithNoServiceVersion(t *testing.T) { @@ -36,7 +35,7 @@ func TestServiceFromResourceWithNoServiceVersion(t *testing.T) { require.NoError(t, w.Encode(service)) jsonStr := w.String() testWriters.release(w) - assert.True(t, strings.Contains(jsonStr, "v1")) + assert.Contains(t, jsonStr, "v1") } func TestServiceFromNullResource(t *testing.T) { diff --git a/exporter/awsxrayexporter/internal/translator/span_links.go b/exporter/awsxrayexporter/internal/translator/span_links.go index 7a262b2fa5b1..c7b3df473423 100644 --- a/exporter/awsxrayexporter/internal/translator/span_links.go +++ b/exporter/awsxrayexporter/internal/translator/span_links.go @@ -15,11 +15,10 @@ func makeSpanLinks(links ptrace.SpanLinkSlice, skipTimestampValidation bool) ([] for i := 0; i < links.Len(); i++ { var spanLinkData awsxray.SpanLinkData - var link = links.At(i) + link := links.At(i) - var spanID = link.SpanID().String() + spanID := link.SpanID().String() traceID, err := convertToAmazonTraceID(link.TraceID(), skipTimestampValidation) - if err != nil { return nil, err } diff --git a/exporter/awsxrayexporter/internal/translator/span_links_test.go b/exporter/awsxrayexporter/internal/translator/span_links_test.go index f299bd4f01f9..5347c8c15525 100644 --- a/exporter/awsxrayexporter/internal/translator/span_links_test.go +++ b/exporter/awsxrayexporter/internal/translator/span_links_test.go @@ -5,7 +5,6 @@ package translator // import "github.com/open-telemetry/opentelemetry-collector- import ( "encoding/binary" - "strings" "testing" "time" @@ -20,7 +19,7 @@ func TestSpanLinkSimple(t *testing.T) { resource := constructDefaultResource() span := constructServerSpan(parentSpanID, spanName, ptrace.StatusCodeOk, "OK", attributes) - var traceID = newTraceID() + traceID := newTraceID() spanLink := span.Links().AppendEmpty() spanLink.SetTraceID(traceID) @@ -28,19 +27,19 @@ func TestSpanLinkSimple(t *testing.T) { segment, _ := MakeSegment(span, resource, nil, false, nil, false) - var convertedTraceID, _ = convertToAmazonTraceID(traceID, false) + convertedTraceID, _ := convertToAmazonTraceID(traceID, false) - assert.Equal(t, 1, len(segment.Links)) + assert.Len(t, segment.Links, 1) assert.Equal(t, spanLink.SpanID().String(), *segment.Links[0].SpanID) assert.Equal(t, convertedTraceID, *segment.Links[0].TraceID) - assert.Equal(t, 0, len(segment.Links[0].Attributes)) + assert.Empty(t, segment.Links[0].Attributes) jsonStr, _ := MakeSegmentDocumentString(span, resource, nil, false, nil, false) - assert.True(t, strings.Contains(jsonStr, "links")) - assert.False(t, strings.Contains(jsonStr, "attributes")) - assert.True(t, strings.Contains(jsonStr, convertedTraceID)) - assert.True(t, strings.Contains(jsonStr, spanLink.SpanID().String())) + assert.Contains(t, jsonStr, "links") + assert.NotContains(t, jsonStr, "attributes") + assert.Contains(t, jsonStr, convertedTraceID) + assert.Contains(t, jsonStr, spanLink.SpanID().String()) } func TestSpanLinkEmpty(t *testing.T) { @@ -52,11 +51,11 @@ func TestSpanLinkEmpty(t *testing.T) { segment, _ := MakeSegment(span, resource, nil, false, nil, false) - assert.Equal(t, 0, len(segment.Links)) + assert.Empty(t, segment.Links) jsonStr, _ := MakeSegmentDocumentString(span, resource, nil, false, nil, false) - assert.False(t, strings.Contains(jsonStr, "links")) + assert.NotContains(t, jsonStr, "links") } func TestOldSpanLinkError(t *testing.T) { @@ -69,7 +68,7 @@ func TestOldSpanLinkError(t *testing.T) { const maxAge = 60 * 60 * 24 * 30 ExpiredEpoch := time.Now().Unix() - maxAge - 1 - var traceID = newTraceID() + traceID := newTraceID() binary.BigEndian.PutUint32(traceID[0:4], uint32(ExpiredEpoch)) spanLink := span.Links().AppendEmpty() @@ -78,11 +77,11 @@ func TestOldSpanLinkError(t *testing.T) { _, error1 := MakeSegment(span, resource, nil, false, nil, false) - assert.NotNil(t, error1) + assert.Error(t, error1) _, error2 := MakeSegmentDocumentString(span, resource, nil, false, nil, false) - assert.NotNil(t, error2) + assert.Error(t, error2) } func TestTwoSpanLinks(t *testing.T) { @@ -92,14 +91,14 @@ func TestTwoSpanLinks(t *testing.T) { resource := constructDefaultResource() span := constructServerSpan(parentSpanID, spanName, ptrace.StatusCodeOk, "OK", attributes) - var traceID1 = newTraceID() + traceID1 := newTraceID() spanLink1 := span.Links().AppendEmpty() spanLink1.SetTraceID(traceID1) spanLink1.SetSpanID(newSegmentID()) spanLink1.Attributes().PutStr("myKey1", "ABC") - var traceID2 = newTraceID() + traceID2 := newTraceID() spanLink2 := span.Links().AppendEmpty() spanLink2.SetTraceID(traceID2) @@ -108,31 +107,31 @@ func TestTwoSpanLinks(t *testing.T) { segment, _ := MakeSegment(span, resource, nil, false, nil, false) - var convertedTraceID1, _ = convertToAmazonTraceID(traceID1, false) - var convertedTraceID2, _ = convertToAmazonTraceID(traceID2, false) + convertedTraceID1, _ := convertToAmazonTraceID(traceID1, false) + convertedTraceID2, _ := convertToAmazonTraceID(traceID2, false) - assert.Equal(t, 2, len(segment.Links)) + assert.Len(t, segment.Links, 2) assert.Equal(t, spanLink1.SpanID().String(), *segment.Links[0].SpanID) assert.Equal(t, convertedTraceID1, *segment.Links[0].TraceID) - assert.Equal(t, 1, len(segment.Links[0].Attributes)) + assert.Len(t, segment.Links[0].Attributes, 1) assert.Equal(t, "ABC", segment.Links[0].Attributes["myKey1"]) assert.Equal(t, spanLink2.SpanID().String(), *segment.Links[1].SpanID) assert.Equal(t, convertedTraceID2, *segment.Links[1].TraceID) - assert.Equal(t, 1, len(segment.Links[0].Attributes)) + assert.Len(t, segment.Links[0].Attributes, 1) assert.Equal(t, int64(1234), segment.Links[1].Attributes["myKey2"]) jsonStr, _ := MakeSegmentDocumentString(span, resource, nil, false, nil, false) - assert.True(t, strings.Contains(jsonStr, "attributes")) - assert.True(t, strings.Contains(jsonStr, "links")) - assert.True(t, strings.Contains(jsonStr, "myKey1")) - assert.True(t, strings.Contains(jsonStr, "myKey2")) - assert.True(t, strings.Contains(jsonStr, "ABC")) - assert.True(t, strings.Contains(jsonStr, "1234")) - assert.True(t, strings.Contains(jsonStr, convertedTraceID1)) - assert.True(t, strings.Contains(jsonStr, convertedTraceID2)) + assert.Contains(t, jsonStr, "attributes") + assert.Contains(t, jsonStr, "links") + assert.Contains(t, jsonStr, "myKey1") + assert.Contains(t, jsonStr, "myKey2") + assert.Contains(t, jsonStr, "ABC") + assert.Contains(t, jsonStr, "1234") + assert.Contains(t, jsonStr, convertedTraceID1) + assert.Contains(t, jsonStr, convertedTraceID2) } func TestSpanLinkComplexAttributes(t *testing.T) { @@ -150,30 +149,30 @@ func TestSpanLinkComplexAttributes(t *testing.T) { spanLink.Attributes().PutInt("myKey3", 112233) spanLink.Attributes().PutDouble("myKey4", 3.1415) - var slice1 = spanLink.Attributes().PutEmptySlice("myKey5") + slice1 := spanLink.Attributes().PutEmptySlice("myKey5") slice1.AppendEmpty().SetStr("apple") slice1.AppendEmpty().SetStr("pear") slice1.AppendEmpty().SetStr("banana") - var slice2 = spanLink.Attributes().PutEmptySlice("myKey6") + slice2 := spanLink.Attributes().PutEmptySlice("myKey6") slice2.AppendEmpty().SetBool(true) slice2.AppendEmpty().SetBool(false) slice2.AppendEmpty().SetBool(false) slice2.AppendEmpty().SetBool(true) - var slice3 = spanLink.Attributes().PutEmptySlice("myKey7") + slice3 := spanLink.Attributes().PutEmptySlice("myKey7") slice3.AppendEmpty().SetInt(1234) slice3.AppendEmpty().SetInt(5678) slice3.AppendEmpty().SetInt(9012) - var slice4 = spanLink.Attributes().PutEmptySlice("myKey8") + slice4 := spanLink.Attributes().PutEmptySlice("myKey8") slice4.AppendEmpty().SetDouble(2.718) slice4.AppendEmpty().SetDouble(1.618) segment, _ := MakeSegment(span, resource, nil, false, nil, false) - assert.Equal(t, 1, len(segment.Links)) - assert.Equal(t, 8, len(segment.Links[0].Attributes)) + assert.Len(t, segment.Links, 1) + assert.Len(t, segment.Links[0].Attributes, 8) assert.Equal(t, "myValue", segment.Links[0].Attributes["myKey1"]) assert.Equal(t, true, segment.Links[0].Attributes["myKey2"]) @@ -198,34 +197,34 @@ func TestSpanLinkComplexAttributes(t *testing.T) { jsonStr, _ := MakeSegmentDocumentString(span, resource, nil, false, nil, false) - assert.True(t, strings.Contains(jsonStr, "links")) + assert.Contains(t, jsonStr, "links") - assert.True(t, strings.Contains(jsonStr, "myKey1")) - assert.True(t, strings.Contains(jsonStr, "myValue")) + assert.Contains(t, jsonStr, "myKey1") + assert.Contains(t, jsonStr, "myValue") - assert.True(t, strings.Contains(jsonStr, "myKey2")) - assert.True(t, strings.Contains(jsonStr, "true")) + assert.Contains(t, jsonStr, "myKey2") + assert.Contains(t, jsonStr, "true") - assert.True(t, strings.Contains(jsonStr, "myKey3")) - assert.True(t, strings.Contains(jsonStr, "112233")) + assert.Contains(t, jsonStr, "myKey3") + assert.Contains(t, jsonStr, "112233") - assert.True(t, strings.Contains(jsonStr, "myKey4")) - assert.True(t, strings.Contains(jsonStr, "3.1415")) + assert.Contains(t, jsonStr, "myKey4") + assert.Contains(t, jsonStr, "3.1415") - assert.True(t, strings.Contains(jsonStr, "myKey5")) - assert.True(t, strings.Contains(jsonStr, "apple")) - assert.True(t, strings.Contains(jsonStr, "pear")) - assert.True(t, strings.Contains(jsonStr, "banana")) + assert.Contains(t, jsonStr, "myKey5") + assert.Contains(t, jsonStr, "apple") + assert.Contains(t, jsonStr, "pear") + assert.Contains(t, jsonStr, "banana") - assert.True(t, strings.Contains(jsonStr, "myKey6")) - assert.True(t, strings.Contains(jsonStr, "false")) + assert.Contains(t, jsonStr, "myKey6") + assert.Contains(t, jsonStr, "false") - assert.True(t, strings.Contains(jsonStr, "myKey7")) - assert.True(t, strings.Contains(jsonStr, "1234")) - assert.True(t, strings.Contains(jsonStr, "5678")) - assert.True(t, strings.Contains(jsonStr, "9012")) + assert.Contains(t, jsonStr, "myKey7") + assert.Contains(t, jsonStr, "1234") + assert.Contains(t, jsonStr, "5678") + assert.Contains(t, jsonStr, "9012") - assert.True(t, strings.Contains(jsonStr, "myKey8")) - assert.True(t, strings.Contains(jsonStr, "2.718")) - assert.True(t, strings.Contains(jsonStr, "1.618")) + assert.Contains(t, jsonStr, "myKey8") + assert.Contains(t, jsonStr, "2.718") + assert.Contains(t, jsonStr, "1.618") } diff --git a/exporter/awsxrayexporter/internal/translator/sql.go b/exporter/awsxrayexporter/internal/translator/sql.go index 89e9e4876bb9..a69d2525f8c5 100644 --- a/exporter/awsxrayexporter/internal/translator/sql.go +++ b/exporter/awsxrayexporter/internal/translator/sql.go @@ -6,7 +6,7 @@ package translator // import "github.com/open-telemetry/opentelemetry-collector- import ( "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.12.0" awsxray "github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/xray" ) diff --git a/exporter/awsxrayexporter/internal/translator/sql_test.go b/exporter/awsxrayexporter/internal/translator/sql_test.go index d3af6a2faa0f..cba2222b64d7 100644 --- a/exporter/awsxrayexporter/internal/translator/sql_test.go +++ b/exporter/awsxrayexporter/internal/translator/sql_test.go @@ -4,7 +4,6 @@ package translator import ( - "strings" "testing" "time" @@ -12,7 +11,7 @@ import ( "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.12.0" ) func TestClientSpanWithStatementAttribute(t *testing.T) { @@ -35,7 +34,7 @@ func TestClientSpanWithStatementAttribute(t *testing.T) { require.NoError(t, w.Encode(sqlData)) jsonStr := w.String() testWriters.release(w) - assert.True(t, strings.Contains(jsonStr, "mysql://db.example.com:3306/customers")) + assert.Contains(t, jsonStr, "mysql://db.example.com:3306/customers") } func TestClientSpanWithNonSQLDatabase(t *testing.T) { diff --git a/exporter/awsxrayexporter/internal/translator/writer_pool_test.go b/exporter/awsxrayexporter/internal/translator/writer_pool_test.go index f7d9728d389e..baea9cff3b08 100644 --- a/exporter/awsxrayexporter/internal/translator/writer_pool_test.go +++ b/exporter/awsxrayexporter/internal/translator/writer_pool_test.go @@ -6,13 +6,14 @@ package translator import ( "bytes" "encoding/json" + "net/http" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.12.0" "go.uber.org/zap" ) @@ -59,14 +60,14 @@ func BenchmarkWithPool(b *testing.B) { w := wp.borrow() segment, _ := MakeSegment(span, pcommon.NewResource(), nil, false, nil, false) err := w.Encode(*segment) - assert.Nil(b, err) + assert.NoError(b, err) logger.Info(w.String()) } } func constructWriterPoolSpan() ptrace.Span { attributes := make(map[string]any) - attributes[conventions.AttributeHTTPMethod] = "GET" + attributes[conventions.AttributeHTTPMethod] = http.MethodGet attributes[conventions.AttributeHTTPURL] = "https://api.example.com/users/junit" attributes[conventions.AttributeHTTPClientIP] = "192.168.15.32" attributes[conventions.AttributeHTTPStatusCode] = 200 diff --git a/exporter/awsxrayexporter/metadata.yaml b/exporter/awsxrayexporter/metadata.yaml index 5a630856f07a..eef753961cc9 100644 --- a/exporter/awsxrayexporter/metadata.yaml +++ b/exporter/awsxrayexporter/metadata.yaml @@ -1,5 +1,4 @@ type: awsxray -scope_name: otelcol/awsxray status: class: exporter diff --git a/exporter/azuredataexplorerexporter/README.md b/exporter/azuredataexplorerexporter/README.md index b0024e90d34a..6257b43e0f83 100644 --- a/exporter/azuredataexplorerexporter/README.md +++ b/exporter/azuredataexplorerexporter/README.md @@ -6,9 +6,10 @@ | Stability | [beta]: traces, metrics, logs | | Distributions | [contrib] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fazuredataexplorer%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fazuredataexplorer) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fazuredataexplorer%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fazuredataexplorer) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@asaharn](https://www.github.com/asaharn), [@ag-ramachandran](https://www.github.com/ag-ramachandran) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@ag-ramachandran](https://www.github.com/ag-ramachandran) | +| Emeritus | [@asaharn](https://www.github.com/asaharn) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib @@ -22,9 +23,16 @@ This exporter sends metrics, logs and trace data to The following settings are required: - `cluster_uri` (no default): The cluster name of the provisioned ADX cluster to ingest the data. -- `application_id` (no default): The client id to connect to the cluster and ingest data. -- `application_key` (no default): The cluster secret corresponding to the client id. -- `tenant_id` (no default): The tenant id where the application_id is referenced from. + +One authentication method is required: +- Service principal: + - `application_id` (no default): The client id to connect to the cluster and ingest data. + - `application_key` (no default): The cluster secret corresponding to the client id. + - `tenant_id` (no default): The tenant id where the application_id is referenced from. +- Managed identity: + - `managed_identity_id` (no default): The managed identity id to authenticate with. Set to "system" for system-assigned managed identity. Set the MI client Id (GUID) for user-assigned managed identity. +- Default authentication: + - `use_azure_auth` (default: false): Set to true to use the Azure [default authentication](https://learn.microsoft.com/en-us/azure/developer/go/azure-sdk-authentication?tabs=bash#2-authenticate-with-azure). The following settings can be optionally configured and have default values: > Note that the database tables are expected to be created upfront before the exporter is in operation , the definition of these are in the section [Database and Table definition scripts](#database-and-table-definition-scripts) diff --git a/exporter/azuredataexplorerexporter/adx_exporter.go b/exporter/azuredataexplorerexporter/adx_exporter.go index b9b8ada24dae..b1b76b34e056 100644 --- a/exporter/azuredataexplorerexporter/adx_exporter.go +++ b/exporter/azuredataexplorerexporter/adx_exporter.go @@ -12,6 +12,7 @@ import ( "github.com/Azure/azure-kusto-go/kusto" kustoerrors "github.com/Azure/azure-kusto-go/kusto/data/errors" "github.com/Azure/azure-kusto-go/kusto/ingest" + "github.com/Azure/azure-kusto-go/kusto/ingest/ingestoptions" jsoniter "github.com/json-iterator/go" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" @@ -60,7 +61,6 @@ func (e *adxDataProducer) metricsDataPusher(ctx context.Context, metrics pmetric } func (e *adxDataProducer) ingestData(b []string) error { - ingestReader := strings.NewReader(strings.Join(b, nextline)) if _, err := e.ingestor.FromReader(context.Background(), ingestReader, e.ingestOptions...); err != nil { @@ -127,7 +127,6 @@ func (e *adxDataProducer) tracesDataPusher(_ context.Context, traceData ptrace.T } func (e *adxDataProducer) Close(context.Context) error { - var err error err = e.ingestor.Close() @@ -151,7 +150,6 @@ func newExporter(config *Config, logger *zap.Logger, telemetryDataType int, vers return nil, err } metricClient, err := buildAdxClient(config, version) - if err != nil { return nil, err } @@ -160,6 +158,7 @@ func newExporter(config *Config, logger *zap.Logger, telemetryDataType int, vers var ingestOptions []ingest.FileOption ingestOptions = append(ingestOptions, ingest.FileFormat(ingest.JSON)) + ingestOptions = append(ingestOptions, ingest.CompressionType(ingestoptions.GZIP)) // Expect that this mapping is already existent if refOption := getMappingRef(config, telemetryDataType); refOption != nil { ingestOptions = append(ingestOptions, refOption) @@ -216,6 +215,8 @@ func createKcsb(config *Config, version string) *kusto.ConnectionStringBuilder { isSystemManagedIdentity := strings.EqualFold(strings.TrimSpace(config.ManagedIdentityID), "SYSTEM") // If the user has managed identity done, use it. For System managed identity use the MI as system switch { + case config.UseAzureAuth: + kcsb = kusto.NewConnectionStringBuilder(config.ClusterURI).WithDefaultAzureCredential() case !isManagedIdentity: kcsb = kusto.NewConnectionStringBuilder(config.ClusterURI).WithAadAppKey(config.ApplicationID, string(config.ApplicationKey), config.TenantID) case isManagedIdentity && isSystemManagedIdentity: diff --git a/exporter/azuredataexplorerexporter/adx_exporter_test.go b/exporter/azuredataexplorerexporter/adx_exporter_test.go index 857ab8902ebb..7bd1313347fb 100644 --- a/exporter/azuredataexplorerexporter/adx_exporter_test.go +++ b/exporter/azuredataexplorerexporter/adx_exporter_test.go @@ -25,7 +25,8 @@ import ( func TestNewExporter(t *testing.T) { logger := zaptest.NewLogger(t) - c := Config{ClusterURI: "https://CLUSTER.kusto.windows.net", + c := Config{ + ClusterURI: "https://CLUSTER.kusto.windows.net", ApplicationID: "unknown", ApplicationKey: "unknown", TenantID: "unknown", @@ -168,7 +169,7 @@ func TestIngestedDataRecordCount(t *testing.T) { recordstoingest := genRand.Intn(20) err := adxDataProducer.metricsDataPusher(context.Background(), createMetricsData(recordstoingest)) ingestedrecordsactual := ingestor.Records() - assert.Equal(t, recordstoingest, len(ingestedrecordsactual), "Number of metrics created should match number of records ingested") + assert.Len(t, ingestedrecordsactual, recordstoingest, "Number of metrics created should match number of records ingested") assert.NoError(t, err) } @@ -178,6 +179,7 @@ func TestCreateKcsb(t *testing.T) { name string // name of the test config Config // config for the test isMsi bool // is MSI enabled + isAzureAuth bool // is azure authentication enabled applicationID string // application id managedIdentityID string // managed identity id }{ @@ -216,6 +218,15 @@ func TestCreateKcsb(t *testing.T) { managedIdentityID: "636d798f-b005-41c9-9809-81a5e5a12b2e", applicationID: "", }, + { + name: "azure auth", + config: Config{ + ClusterURI: "https://CLUSTER.kusto.windows.net", + Database: "tests", + UseAzureAuth: true, + }, + isAzureAuth: true, + }, } for i := range tests { tt := tests[i] @@ -229,6 +240,8 @@ func TestCreateKcsb(t *testing.T) { wantManagedID := tt.managedIdentityID assert.Equal(t, wantManagedID, gotKcsb.ManagedServiceIdentity) assert.Equal(t, "https://CLUSTER.kusto.windows.net", gotKcsb.DataSource) + wantIsAzure := tt.isAzureAuth + assert.Equal(t, wantIsAzure, gotKcsb.DefaultAuth) }) } } @@ -298,7 +311,6 @@ func createLogsData() plog.Logs { log.SetSeverityNumber(plog.SeverityNumberDebug) log.SetSeverityText("DEBUG") return logs - } func createTracesData() ptrace.Traces { diff --git a/exporter/azuredataexplorerexporter/config.go b/exporter/azuredataexplorerexporter/config.go index e6d92cbbaf5d..e90100b65122 100644 --- a/exporter/azuredataexplorerexporter/config.go +++ b/exporter/azuredataexplorerexporter/config.go @@ -16,22 +16,23 @@ import ( // Config defines configuration for Azure Data Explorer Exporter type Config struct { - exporterhelper.TimeoutSettings `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. - exporterhelper.QueueSettings `mapstructure:"sending_queue"` - configretry.BackOffConfig `mapstructure:"retry_on_failure"` - ClusterURI string `mapstructure:"cluster_uri"` - ApplicationID string `mapstructure:"application_id"` - ApplicationKey configopaque.String `mapstructure:"application_key"` - TenantID string `mapstructure:"tenant_id"` - ManagedIdentityID string `mapstructure:"managed_identity_id"` - Database string `mapstructure:"db_name"` - MetricTable string `mapstructure:"metrics_table_name"` - LogTable string `mapstructure:"logs_table_name"` - TraceTable string `mapstructure:"traces_table_name"` - MetricTableMapping string `mapstructure:"metrics_table_json_mapping"` - LogTableMapping string `mapstructure:"logs_table_json_mapping"` - TraceTableMapping string `mapstructure:"traces_table_json_mapping"` - IngestionType string `mapstructure:"ingestion_type"` + TimeoutSettings exporterhelper.TimeoutConfig `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` + configretry.BackOffConfig `mapstructure:"retry_on_failure"` + ClusterURI string `mapstructure:"cluster_uri"` + ApplicationID string `mapstructure:"application_id"` + ApplicationKey configopaque.String `mapstructure:"application_key"` + TenantID string `mapstructure:"tenant_id"` + ManagedIdentityID string `mapstructure:"managed_identity_id"` + UseAzureAuth bool `mapstructure:"use_azure_auth"` + Database string `mapstructure:"db_name"` + MetricTable string `mapstructure:"metrics_table_name"` + LogTable string `mapstructure:"logs_table_name"` + TraceTable string `mapstructure:"traces_table_name"` + MetricTableMapping string `mapstructure:"metrics_table_json_mapping"` + LogTableMapping string `mapstructure:"logs_table_json_mapping"` + TraceTableMapping string `mapstructure:"traces_table_json_mapping"` + IngestionType string `mapstructure:"ingestion_type"` } // Validate checks if the exporter configuration is valid @@ -46,9 +47,23 @@ func (adxCfg *Config) Validate() error { if isClusterURIEmpty { return errors.New(`clusterURI config is mandatory`) } - // Parameters for AD App Auth or Managed Identity Auth are mandatory - if isAppAuthEmpty && isManagedAuthEmpty { - return errors.New(`either ["application_id" , "application_key" , "tenant_id"] or ["managed_identity_id"] are needed for auth`) + // Parameters for AD App Auth or Managed Identity Auth or Default Auth are mandatory + authMethods := 0 + + if !isAppAuthEmpty { + authMethods++ + } + + if !isManagedAuthEmpty { + authMethods++ + } + + if adxCfg.UseAzureAuth { + authMethods++ + } + + if authMethods != 1 { + return errors.New(`either ["application_id" , "application_key" , "tenant_id"] or ["managed_identity_id"] or ["use_azure_auth"] must be provided for auth`) } if !(adxCfg.IngestionType == managedIngestType || adxCfg.IngestionType == queuedIngestTest || isEmpty(adxCfg.IngestionType)) { diff --git a/exporter/azuredataexplorerexporter/config_test.go b/exporter/azuredataexplorerexporter/config_test.go index 2c6667c3db61..d124e01fc163 100644 --- a/exporter/azuredataexplorerexporter/config_test.go +++ b/exporter/azuredataexplorerexporter/config_test.go @@ -45,7 +45,7 @@ func TestLoadConfig(t *testing.T) { }, { id: component.NewIDWithName(metadata.Type, "2"), - errorMessage: `either ["application_id" , "application_key" , "tenant_id"] or ["managed_identity_id"] are needed for auth`, + errorMessage: `either ["application_id" , "application_key" , "tenant_id"] or ["managed_identity_id"] or ["use_azure_auth"] must be provided for auth`, }, { id: component.NewIDWithName(metadata.Type, "3"), @@ -95,7 +95,7 @@ func TestLoadConfig(t *testing.T) { LogTable: "OTELLogs", TraceTable: "OTELTraces", IngestionType: managedIngestType, - TimeoutSettings: exporterhelper.TimeoutSettings{ + TimeoutSettings: exporterhelper.TimeoutConfig{ Timeout: 10 * time.Second, }, BackOffConfig: configretry.BackOffConfig{ @@ -104,13 +104,25 @@ func TestLoadConfig(t *testing.T) { MaxInterval: 60 * time.Second, MaxElapsedTime: 10 * time.Minute, }, - QueueSettings: exporterhelper.QueueSettings{ + QueueSettings: exporterhelper.QueueConfig{ Enabled: true, NumConsumers: 2, QueueSize: 10, }, }, }, + { + id: component.NewIDWithName(metadata.Type, "9"), + expected: &Config{ + ClusterURI: "https://CLUSTER.kusto.windows.net", + Database: "oteldb", + MetricTable: "OTELMetrics", + LogTable: "OTELLogs", + TraceTable: "OTELTraces", + UseAzureAuth: true, + IngestionType: queuedIngestTest, + }, + }, } for _, tt := range tests { @@ -120,7 +132,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) if tt.expected == nil { assert.EqualError(t, component.ValidateConfig(cfg), tt.errorMessage) diff --git a/exporter/azuredataexplorerexporter/e2e_test.go b/exporter/azuredataexplorerexporter/e2e_test.go index 7d8ebb729e14..9de5207315c5 100644 --- a/exporter/azuredataexplorerexporter/e2e_test.go +++ b/exporter/azuredataexplorerexporter/e2e_test.go @@ -53,7 +53,7 @@ const ( ) // E2E tests while sending the trace data through the exporter -func TestCreateTracesExporterE2E(t *testing.T) { +func TestCreateTracesE2E(t *testing.T) { t.Parallel() config, isValid := getConfig() if !isValid { @@ -61,7 +61,7 @@ func TestCreateTracesExporterE2E(t *testing.T) { } // Create an exporter f := NewFactory() - exp, err := f.CreateTracesExporter(context.Background(), exportertest.NewNopCreateSettings(), config) + exp, err := f.CreateTraces(context.Background(), exportertest.NewNopSettings(), config) require.NoError(t, err) err = exp.Start(context.Background(), componenttest.NewNopHost()) require.NoError(t, err) @@ -116,7 +116,7 @@ func TestCreateTracesExporterE2E(t *testing.T) { } // E2E tests while sending the logs data through the exporter -func TestCreateLogsExporterE2E(t *testing.T) { +func TestCreateLogsE2E(t *testing.T) { t.Parallel() config, isValid := getConfig() if !isValid { @@ -124,7 +124,7 @@ func TestCreateLogsExporterE2E(t *testing.T) { } // Create an exporter f := NewFactory() - exp, err := f.CreateLogsExporter(context.Background(), exportertest.NewNopCreateSettings(), config) + exp, err := f.CreateLogs(context.Background(), exportertest.NewNopSettings(), config) require.NoError(t, err) err = exp.Start(context.Background(), componenttest.NewNopHost()) require.NoError(t, err) @@ -177,7 +177,7 @@ func TestCreateLogsExporterE2E(t *testing.T) { } // E2E tests while sending the metrics data through the exporter -func TestCreateMetricsExporterE2E(t *testing.T) { +func TestCreateMetricsE2E(t *testing.T) { t.Parallel() config, isValid := getConfig() if !isValid { @@ -185,7 +185,7 @@ func TestCreateMetricsExporterE2E(t *testing.T) { } // Create an exporter f := NewFactory() - exp, err := f.CreateMetricsExporter(context.Background(), exportertest.NewNopCreateSettings(), config) + exp, err := f.CreateMetrics(context.Background(), exportertest.NewNopSettings(), config) require.NoError(t, err) err = exp.Start(context.Background(), componenttest.NewNopHost()) require.NoError(t, err) diff --git a/exporter/azuredataexplorerexporter/factory.go b/exporter/azuredataexplorerexporter/factory.go index e2a4ee4ac6b0..4e45ff99c941 100644 --- a/exporter/azuredataexplorerexporter/factory.go +++ b/exporter/azuredataexplorerexporter/factory.go @@ -52,7 +52,7 @@ func createDefaultConfig() component.Config { func createMetricsExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, config component.Config, ) (exporter.Metrics, error) { if config == nil { @@ -64,12 +64,11 @@ func createMetricsExporter( // call the common exporter function in baseexporter. This ensures that the client and the ingest // are initialized and the metrics struct are available for operations adp, err := newExporter(adxCfg, set.Logger, metricsType, version) - if err != nil { return nil, err } - exporter, err := exporterhelper.NewMetricsExporter( + exporter, err := exporterhelper.NewMetrics( ctx, set, adxCfg, @@ -78,7 +77,6 @@ func createMetricsExporter( exporterhelper.WithRetry(adxCfg.BackOffConfig), exporterhelper.WithQueue(adxCfg.QueueSettings), exporterhelper.WithShutdown(adp.Close)) - if err != nil { return nil, err } @@ -87,7 +85,7 @@ func createMetricsExporter( func createTracesExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, config component.Config, ) (exporter.Traces, error) { adxCfg := config.(*Config) @@ -96,12 +94,11 @@ func createTracesExporter( // call the common exporter function in baseexporter. This ensures that the client and the ingest // are initialized and the metrics struct are available for operations adp, err := newExporter(adxCfg, set.Logger, tracesType, version) - if err != nil { return nil, err } - exporter, err := exporterhelper.NewTracesExporter( + exporter, err := exporterhelper.NewTraces( ctx, set, adxCfg, @@ -110,7 +107,6 @@ func createTracesExporter( exporterhelper.WithRetry(adxCfg.BackOffConfig), exporterhelper.WithQueue(adxCfg.QueueSettings), exporterhelper.WithShutdown(adp.Close)) - if err != nil { return nil, err } @@ -119,7 +115,7 @@ func createTracesExporter( func createLogsExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, config component.Config, ) (exp exporter.Logs, err error) { adxCfg := config.(*Config) @@ -128,12 +124,11 @@ func createLogsExporter( // call the common exporter function in baseexporter. This ensures that the client and the ingest // are initialized and the metrics struct are available for operations adp, err := newExporter(adxCfg, set.Logger, logsType, version) - if err != nil { return nil, err } - exporter, err := exporterhelper.NewLogsExporter( + exporter, err := exporterhelper.NewLogs( ctx, set, adxCfg, @@ -142,7 +137,6 @@ func createLogsExporter( exporterhelper.WithRetry(adxCfg.BackOffConfig), exporterhelper.WithQueue(adxCfg.QueueSettings), exporterhelper.WithShutdown(adp.Close)) - if err != nil { return nil, err } diff --git a/exporter/azuredataexplorerexporter/factory_test.go b/exporter/azuredataexplorerexporter/factory_test.go index 3ab968ce0a86..c2487d11040c 100644 --- a/exporter/azuredataexplorerexporter/factory_test.go +++ b/exporter/azuredataexplorerexporter/factory_test.go @@ -25,7 +25,7 @@ import ( // Given a new factory and no-op exporter , the NewMetric exporter should work. // We could add additional failing tests if the config is wrong (using Validate) , but that is already done on config -func TestCreateMetricsExporter(t *testing.T) { +func TestCreateMetrics(t *testing.T) { cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml")) require.NoError(t, err) factory := NewFactory() @@ -33,10 +33,10 @@ func TestCreateMetricsExporter(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) - params := exportertest.NewNopCreateSettings() - exporter, err := factory.CreateMetricsExporter(context.Background(), params, cfg) + params := exportertest.NewNopSettings() + exporter, err := factory.CreateMetrics(context.Background(), params, cfg) assert.NotNil(t, exporter) assert.NoError(t, err) @@ -50,12 +50,12 @@ func TestCreateMetricsExporter(t *testing.T) { dp.SetDoubleValue(42.42) err = exporter.ConsumeMetrics(context.Background(), testMetrics) assert.Error(t, err) - assert.Nil(t, exporter.Shutdown(context.Background())) + assert.NoError(t, exporter.Shutdown(context.Background())) } // Given a new factory and no-op exporter , the NewMetric exporter should work. // We could add additional failing tests if the config is wrong (using Validate) , but that is already done on config -func TestCreateMetricsExporterWhenIngestEmpty(t *testing.T) { +func TestCreateMetricsWhenIngestEmpty(t *testing.T) { cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml")) require.NoError(t, err) factory := NewFactory() @@ -63,11 +63,11 @@ func TestCreateMetricsExporterWhenIngestEmpty(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "2").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() // Load the #3 which has empty. This - assert.Panics(t, func() { _, _ = factory.CreateMetricsExporter(context.Background(), params, cfg) }) + assert.Panics(t, func() { _, _ = factory.CreateMetrics(context.Background(), params, cfg) }) } func TestCreateDefaultConfig(t *testing.T) { @@ -80,7 +80,7 @@ func TestCreateDefaultConfig(t *testing.T) { // Given a new factory and no-op exporter , the LogExporter exporter should work. // We could add additional failing tests if the config is wrong (using Validate) , but that is already done on config -func TestCreateLogsExporter(t *testing.T) { +func TestCreateLogs(t *testing.T) { cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml")) require.NoError(t, err) factory := NewFactory() @@ -88,10 +88,10 @@ func TestCreateLogsExporter(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) - params := exportertest.NewNopCreateSettings() - exporter, err := factory.CreateLogsExporter(context.Background(), params, cfg) + params := exportertest.NewNopSettings() + exporter, err := factory.CreateLogs(context.Background(), params, cfg) // Load the #3 which has empty. This assert.NotNil(t, exporter) assert.NoError(t, err) @@ -105,12 +105,12 @@ func TestCreateLogsExporter(t *testing.T) { // This will fail with auth failure err = exporter.ConsumeLogs(context.Background(), testLogs) assert.Error(t, err) - assert.Nil(t, exporter.Shutdown(context.Background())) + assert.NoError(t, exporter.Shutdown(context.Background())) } // Given a new factory and no-op exporter , the NewLogs exporter should work. // We could add additional failing tests if the config is wrong (using Validate) , but that is already done on config -func TestCreateLogsExporterWhenIngestEmpty(t *testing.T) { +func TestCreateLogsWhenIngestEmpty(t *testing.T) { cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml")) require.NoError(t, err) factory := NewFactory() @@ -118,17 +118,17 @@ func TestCreateLogsExporterWhenIngestEmpty(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "2").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() // Load the #3 which has empty - // exporter, err := factory.CreateLogsExporter(context.Background(), params, cfg) - assert.Panics(t, func() { _, _ = factory.CreateLogsExporter(context.Background(), params, cfg) }) + // exporter, err := factory.CreateLogs(context.Background(), params, cfg) + assert.Panics(t, func() { _, _ = factory.CreateLogs(context.Background(), params, cfg) }) } // Given a new factory and no-op exporter , the LogExporter exporter should work. // We could add additional failing tests if the config is wrong (using Validate) , but that is already done on config -func TestCreateTracesExporter(t *testing.T) { +func TestCreateTraces(t *testing.T) { cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml")) require.NoError(t, err) factory := NewFactory() @@ -136,10 +136,10 @@ func TestCreateTracesExporter(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) - params := exportertest.NewNopCreateSettings() - exporter, err := factory.CreateTracesExporter(context.Background(), params, cfg) + params := exportertest.NewNopSettings() + exporter, err := factory.CreateTraces(context.Background(), params, cfg) assert.NotNil(t, exporter) assert.NoError(t, err) @@ -150,12 +150,12 @@ func TestCreateTracesExporter(t *testing.T) { ss.Spans().AppendEmpty() err = exporter.ConsumeTraces(context.Background(), testTraces) assert.Error(t, err) - assert.Nil(t, exporter.Shutdown(context.Background())) + assert.NoError(t, exporter.Shutdown(context.Background())) } // Given a new factory and no-op exporter , the NewLogs exporter should work. // We could add additional failing tests if the config is wrong (using Validate) , but that is already done on config -func TestCreateTracesExporterWhenIngestEmpty(t *testing.T) { +func TestCreateTracesWhenIngestEmpty(t *testing.T) { cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml")) require.NoError(t, err) factory := NewFactory() @@ -163,9 +163,9 @@ func TestCreateTracesExporterWhenIngestEmpty(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "2").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() // Load the #3 which has empty - assert.Panics(t, func() { _, _ = factory.CreateTracesExporter(context.Background(), params, cfg) }) + assert.Panics(t, func() { _, _ = factory.CreateTraces(context.Background(), params, cfg) }) } diff --git a/exporter/azuredataexplorerexporter/generated_component_test.go b/exporter/azuredataexplorerexporter/generated_component_test.go index cef3644f21f1..cf00e12f68b8 100644 --- a/exporter/azuredataexplorerexporter/generated_component_test.go +++ b/exporter/azuredataexplorerexporter/generated_component_test.go @@ -32,27 +32,27 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, { name: "metrics", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg) }, }, { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -64,9 +64,9 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) diff --git a/exporter/azuredataexplorerexporter/generated_package_test.go b/exporter/azuredataexplorerexporter/generated_package_test.go index 2c8adff977c9..d41fc1bed09f 100644 --- a/exporter/azuredataexplorerexporter/generated_package_test.go +++ b/exporter/azuredataexplorerexporter/generated_package_test.go @@ -9,5 +9,5 @@ import ( ) func TestMain(m *testing.M) { - goleak.VerifyTestMain(m, goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start")) + goleak.VerifyTestMain(m) } diff --git a/exporter/azuredataexplorerexporter/go.mod b/exporter/azuredataexplorerexporter/go.mod index 7fc3613efb40..7ac050019250 100644 --- a/exporter/azuredataexplorerexporter/go.mod +++ b/exporter/azuredataexplorerexporter/go.mod @@ -1,21 +1,21 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/azuredataexplorerexporter -go 1.21.0 +go 1.22.0 require ( - github.com/Azure/azure-kusto-go v0.15.2 + github.com/Azure/azure-kusto-go v0.16.1 github.com/google/uuid v1.6.0 github.com/json-iterator/go v1.1.12 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) @@ -23,9 +23,9 @@ require ( require ( github.com/Azure/azure-pipeline-go v0.2.3 // indirect github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.0 // indirect github.com/Azure/azure-storage-queue-go v0.0.0-20230531184854-c06a8eff66fe // indirect github.com/Azure/go-autorest v14.2.0+incompatible // indirect @@ -34,53 +34,58 @@ require ( github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect github.com/Azure/go-autorest/logger v0.2.1 // indirect github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0 // indirect - github.com/beorn7/perks v1.0.1 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gofrs/uuid v4.4.0+incompatible // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang-jwt/jwt/v5 v5.0.0 // indirect + github.com/golang-jwt/jwt/v4 v4.5.1 // indirect + github.com/golang-jwt/jwt/v5 v5.2.1 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/mattn/go-ieproxy v0.0.11 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect + github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect github.com/samber/lo v1.38.1 // indirect github.com/shopspring/decimal v1.3.1 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/consumer v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/consumer v1.22.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.23.0 // indirect + golang.org/x/crypto v0.31.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/azuredataexplorerexporter/go.sum b/exporter/azuredataexplorerexporter/go.sum index 54b427a1069e..19e744e12d64 100644 --- a/exporter/azuredataexplorerexporter/go.sum +++ b/exporter/azuredataexplorerexporter/go.sum @@ -1,16 +1,16 @@ -github.com/Azure/azure-kusto-go v0.15.2 h1:OlABJilic9TythSgWW6i8Fd0SgNTg0t9jBu6WVsaixM= -github.com/Azure/azure-kusto-go v0.15.2/go.mod h1:9F2zvXH8B6eWzgI1S4k1ZXAIufnBZ1bv1cW1kB1n3D0= +github.com/Azure/azure-kusto-go v0.16.1 h1:vCBWcQghmC1qIErUUgVNWHxGhZVStu1U/hki6iBA14k= +github.com/Azure/azure-kusto-go v0.16.1/go.mod h1:9F2zvXH8B6eWzgI1S4k1ZXAIufnBZ1bv1cW1kB1n3D0= github.com/Azure/azure-pipeline-go v0.1.8/go.mod h1:XA1kFWRVhSK+KNFiOhfv83Fv8L9achrP7OxIzeTn1Yg= github.com/Azure/azure-pipeline-go v0.2.3 h1:7U9HBg1JFK3jHl5qmo4CTZKFTVgMwdFHMVtCdfBE21U= github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU= github.com/Azure/azure-sdk-for-go v68.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2 h1:t5+QXLCK9SVi0PPdaY0PrFvYUo24KwA0QwxnaHRSVd4= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1 h1:LNHhpdK7hzUcx/k1LIcuh5k7k1LGIWLQfCjaneSj7Fc= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1/go.mod h1:uE9zaUfEQT/nbQjVi2IblCG9iaLtZsuYZ8ne+PuQ02M= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqbjDYsgN+RzP4q16yV5eM= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0 h1:U2rTu3Ef+7w9FHKIAXM6ZyqF3UOWJZ12zIm8zECAFfg= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0 h1:jBQA3cKT4L2rWMpgE7Yt3Hwh2aUj8KXjIGLxjHeYNNo= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0/go.mod h1:4OG6tQ9EOP/MT0NMjDlRzWoVFxfu9rN9B2X+tlSVktg= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0 h1:Ma67P/GGprNwsslzEH6+Kb8nybI8jpDTm4Wmzu2ReK8= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.0 h1:gggzg0SUMs6SQbEw+3LoSsYf9YMjkupeAnHMX8O9mmY= @@ -35,40 +35,41 @@ github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+Z github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0 h1:hVeq+yCyUi+MsoO/CU95yqCIcdzra5ovzk8Q2BBpV2M= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= -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/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE= -github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo= +github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -77,8 +78,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -97,22 +98,14 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM= github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= @@ -124,49 +117,71 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= github.com/tj/assert v0.0.3/go.mod h1:Ne6X72Q+TB1AteidzQncjw9PabbMp4PBMZ1k+vd1Pvk= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -179,8 +194,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -195,8 +210,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -208,12 +223,12 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -223,8 +238,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -234,12 +249,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/exporter/azuredataexplorerexporter/internal/metadata/generated_status.go b/exporter/azuredataexplorerexporter/internal/metadata/generated_status.go index e0da4f2a0c61..5271db3967fe 100644 --- a/exporter/azuredataexplorerexporter/internal/metadata/generated_status.go +++ b/exporter/azuredataexplorerexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("azuredataexplorer") + Type = component.MustNewType("azuredataexplorer") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/azuredataexplorerexporter" ) const ( diff --git a/exporter/azuredataexplorerexporter/internal/metadata/generated_telemetry.go b/exporter/azuredataexplorerexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index f314198e463b..000000000000 --- a/exporter/azuredataexplorerexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/azuredataexplorer") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/azuredataexplorer") -} diff --git a/exporter/azuredataexplorerexporter/internal/metadata/generated_telemetry_test.go b/exporter/azuredataexplorerexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index b16232425a5a..000000000000 --- a/exporter/azuredataexplorerexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/azuredataexplorer", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/azuredataexplorer", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/azuredataexplorerexporter/logsdata_to_adx.go b/exporter/azuredataexplorerexporter/logsdata_to_adx.go index 8256495dc985..25dacdc88bba 100644 --- a/exporter/azuredataexplorerexporter/logsdata_to_adx.go +++ b/exporter/azuredataexplorerexporter/logsdata_to_adx.go @@ -27,7 +27,6 @@ type AdxLog struct { // Convert the plog to the type ADXLog, this matches the scheme in the Log table in the database func mapToAdxLog(resource pcommon.Resource, scope pcommon.InstrumentationScope, logData plog.LogRecord, _ *zap.Logger) *AdxLog { - logAttrib := logData.Attributes().AsRaw() clonedLogAttrib := cloneMap(logAttrib) copyMap(clonedLogAttrib, getScopeMap(scope)) diff --git a/exporter/azuredataexplorerexporter/metadata.yaml b/exporter/azuredataexplorerexporter/metadata.yaml index 80c49eda72c2..9f3a63b508bd 100644 --- a/exporter/azuredataexplorerexporter/metadata.yaml +++ b/exporter/azuredataexplorerexporter/metadata.yaml @@ -1,5 +1,4 @@ type: azuredataexplorer -scope_name: otelcol/azuredataexplorer status: class: exporter @@ -7,7 +6,8 @@ status: beta: [traces, metrics, logs] distributions: [contrib] codeowners: - active: [asaharn, ag-ramachandran] + active: [ag-ramachandran] + emeritus: [asaharn] # TODO: Update the exporter to pass the tests tests: @@ -17,8 +17,3 @@ tests: application_key: "xx-xx-xx-xx" tenant_id: "21ff9e36-fbaa-43c8-98ba-00431ea10bc3" skip_lifecycle: true - goleak: - ignore: - top: - # See https://github.com/census-instrumentation/opencensus-go/issues/1191 for more information. - - "go.opencensus.io/stats/view.(*worker).start" \ No newline at end of file diff --git a/exporter/azuredataexplorerexporter/metricsdata_to_adx.go b/exporter/azuredataexplorerexporter/metricsdata_to_adx.go index a21897f393b0..a80fc1342d56 100644 --- a/exporter/azuredataexplorerexporter/metricsdata_to_adx.go +++ b/exporter/azuredataexplorerexporter/metricsdata_to_adx.go @@ -133,8 +133,7 @@ func mapToAdxMetric(res pcommon.Resource, md pmetric.Metric, scopeattrs map[stri value := uint64(0) // now create buckets for each bound. for bi := 0; bi < bounds.Len(); bi++ { - customMap := - copyMap(map[string]any{"le": float64ToDimValue(bounds.At(bi))}, dataPoint.Attributes().AsRaw()) + customMap := copyMap(map[string]any{"le": float64ToDimValue(bounds.At(bi))}, dataPoint.Attributes().AsRaw()) value += counts.At(bi) vMap := pcommon.NewMap() @@ -151,10 +150,9 @@ func mapToAdxMetric(res pcommon.Resource, md pmetric.Metric, scopeattrs map[stri // add an upper bound for +Inf { // Add the LE field for the bucket's bound - customMap := - copyMap(map[string]any{ - "le": float64ToDimValue(math.Inf(1)), - }, dataPoint.Attributes().AsRaw()) + customMap := copyMap(map[string]any{ + "le": float64ToDimValue(math.Inf(1)), + }, dataPoint.Attributes().AsRaw()) vMap := pcommon.NewMap() //nolint:errcheck vMap.FromRaw(customMap) @@ -183,7 +181,6 @@ func mapToAdxMetric(res pcommon.Resource, md pmetric.Metric, scopeattrs map[stri } return metricValue }, "", "", pmetric.MetricTypeSum) - } return adxMetrics case pmetric.MetricTypeSummary: @@ -208,7 +205,6 @@ func mapToAdxMetric(res pcommon.Resource, md pmetric.Metric, scopeattrs map[stri fmt.Sprintf("%s_%s", md.Name(), countsuffix), fmt.Sprintf("%s%s", md.Description(), countdescription), pmetric.MetricTypeSummary)) - } // now create values for each quantile. for bi := 0; bi < dataPoint.QuantileValues().Len(); bi++ { diff --git a/exporter/azuredataexplorerexporter/metricsdata_to_adx_test.go b/exporter/azuredataexplorerexporter/metricsdata_to_adx_test.go index 5afa9781713e..99089b23f2d5 100644 --- a/exporter/azuredataexplorerexporter/metricsdata_to_adx_test.go +++ b/exporter/azuredataexplorerexporter/metricsdata_to_adx_test.go @@ -23,13 +23,17 @@ const ( ) // The timestamps used for the tests -var tsUnix = time.Unix(time.Now().Unix(), time.Now().UnixNano()) -var ts = pcommon.NewTimestampFromTime(tsUnix) -var tstr = ts.AsTime().Format(time.RFC3339Nano) +var ( + tsUnix = time.Unix(time.Now().Unix(), time.Now().UnixNano()) + ts = pcommon.NewTimestampFromTime(tsUnix) + tstr = ts.AsTime().Format(time.RFC3339Nano) +) // the histogram values and distribution for the tests -var distributionBounds = []float64{1, 2, 4} -var distributionCounts = []uint64{4, 2, 3, 5} +var ( + distributionBounds = []float64{1, 2, 4} + distributionCounts = []uint64{4, 2, 3, 5} +) func Test_rawMetricsToAdxMetrics(t *testing.T) { t.Parallel() @@ -156,7 +160,7 @@ func Test_rawMetricsToAdxMetrics(t *testing.T) { // Metric assertions assert.Equal(t, expectedMetric.MetricName, actualMetrics[i].MetricName) assert.Equal(t, expectedMetric.MetricType, actualMetrics[i].MetricType) - assert.Equal(t, expectedMetric.MetricValue, actualMetrics[i].MetricValue, fmt.Sprintf("Mismatch for value for test %s", tt.name)) + assert.Equalf(t, expectedMetric.MetricValue, actualMetrics[i].MetricValue, "Mismatch for value for test %s", tt.name) assert.Equal(t, expectedMetric.MetricDescription, actualMetrics[i].MetricDescription) assert.Equal(t, expectedMetric.MetricUnit, actualMetrics[i].MetricUnit) assert.Equal(t, expectedMetric.MetricAttributes, actualMetrics[i].MetricAttributes) @@ -169,7 +173,6 @@ func Test_rawMetricsToAdxMetrics(t *testing.T) { } }) } - } func Test_mapToAdxMetric(t *testing.T) { @@ -556,7 +559,7 @@ func Test_mapToAdxMetric(t *testing.T) { // Metric assertions assert.Equal(t, expectedMetric.MetricName, actualMetrics[i].MetricName) assert.Equal(t, expectedMetric.MetricType, actualMetrics[i].MetricType) - assert.Equal(t, expectedMetric.MetricValue, actualMetrics[i].MetricValue, fmt.Sprintf("Mismatch for value for test %s", tt.name)) + assert.Equalf(t, expectedMetric.MetricValue, actualMetrics[i].MetricValue, "Mismatch for value for test %s", tt.name) assert.Equal(t, expectedMetric.MetricDescription, actualMetrics[i].MetricDescription) assert.Equal(t, expectedMetric.MetricUnit, actualMetrics[i].MetricUnit) assert.Equal(t, expectedMetric.MetricAttributes, actualMetrics[i].MetricAttributes) diff --git a/exporter/azuredataexplorerexporter/testdata/config.yaml b/exporter/azuredataexplorerexporter/testdata/config.yaml index 0fdf9fbe0a13..33ca1d14793d 100644 --- a/exporter/azuredataexplorerexporter/testdata/config.yaml +++ b/exporter/azuredataexplorerexporter/testdata/config.yaml @@ -145,4 +145,9 @@ azuredataexplorer/8: enabled: true initial_interval: 10s max_interval: 60s - max_elapsed_time: 10m \ No newline at end of file + max_elapsed_time: 10m +azuredataexplorer/9: + # Kusto cluster uri + cluster_uri: "https://CLUSTER.kusto.windows.net" + # weather to use the default azure auth + use_azure_auth: true diff --git a/exporter/azuredataexplorerexporter/tracesdata_to_adx.go b/exporter/azuredataexplorerexporter/tracesdata_to_adx.go index 7f72f5e8742d..8875198342c8 100644 --- a/exporter/azuredataexplorerexporter/tracesdata_to_adx.go +++ b/exporter/azuredataexplorerexporter/tracesdata_to_adx.go @@ -47,7 +47,6 @@ type Status struct { } func mapToAdxTrace(resource pcommon.Resource, scope pcommon.InstrumentationScope, spanData ptrace.Span) *AdxTrace { - traceAttrib := spanData.Attributes().AsRaw() clonedTraceAttrib := cloneMap(traceAttrib) copyMap(clonedTraceAttrib, getScopeMap(scope)) diff --git a/exporter/azuredataexplorerexporter/tracesdata_to_adx_test.go b/exporter/azuredataexplorerexporter/tracesdata_to_adx_test.go index 9b5a9e119c07..9a570c544eab 100644 --- a/exporter/azuredataexplorerexporter/tracesdata_to_adx_test.go +++ b/exporter/azuredataexplorerexporter/tracesdata_to_adx_test.go @@ -61,10 +61,10 @@ func Test_mapToAdxTrace(t *testing.T) { Events: getEmptyEvents(), Links: getEmptyLinks(), }, - }, { + }, + { name: "No data", spanDatafn: func() ptrace.Span { - span := ptrace.NewSpan() return span }, @@ -80,7 +80,8 @@ func Test_mapToAdxTrace(t *testing.T) { Events: getEmptyEvents(), Links: getEmptyLinks(), }, - }, { + }, + { name: "with_events_links", spanDatafn: func() ptrace.Span { span := ptrace.NewSpan() @@ -192,15 +193,12 @@ func Test_mapToAdxTrace(t *testing.T) { got := mapToAdxTrace(tt.resourceFn(), tt.insScopeFn(), tt.spanDatafn()) require.NotNil(t, got) assert.Equal(t, want, got) - }) } - } func getEmptyEvents() []*Event { return []*Event{} - } func getEmptyLinks() []*Link { diff --git a/exporter/azuremonitorexporter/README.md b/exporter/azuremonitorexporter/README.md index 54bbea0df5f7..27c5bc1993bf 100644 --- a/exporter/azuremonitorexporter/README.md +++ b/exporter/azuremonitorexporter/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fazuremonitor%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fazuremonitor) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fazuremonitor%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fazuremonitor) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@pcwiese](https://www.github.com/pcwiese) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib diff --git a/exporter/azuremonitorexporter/channels.go b/exporter/azuremonitorexporter/channels.go index 9c50d03c48ee..5b30e94fc11c 100644 --- a/exporter/azuremonitorexporter/channels.go +++ b/exporter/azuremonitorexporter/channels.go @@ -7,4 +7,5 @@ import "github.com/microsoft/ApplicationInsights-Go/appinsights/contracts" type transportChannel interface { Send(*contracts.Envelope) + Flush() } diff --git a/exporter/azuremonitorexporter/config.go b/exporter/azuremonitorexporter/config.go index a4be0f3cfcb2..59430fc02bda 100644 --- a/exporter/azuremonitorexporter/config.go +++ b/exporter/azuremonitorexporter/config.go @@ -12,11 +12,11 @@ import ( // Config defines configuration for Azure Monitor type Config struct { - exporterhelper.QueueSettings `mapstructure:"sending_queue"` - Endpoint string `mapstructure:"endpoint"` - ConnectionString configopaque.String `mapstructure:"connection_string"` - InstrumentationKey configopaque.String `mapstructure:"instrumentation_key"` - MaxBatchSize int `mapstructure:"maxbatchsize"` - MaxBatchInterval time.Duration `mapstructure:"maxbatchinterval"` - SpanEventsEnabled bool `mapstructure:"spaneventsenabled"` + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` + Endpoint string `mapstructure:"endpoint"` + ConnectionString configopaque.String `mapstructure:"connection_string"` + InstrumentationKey configopaque.String `mapstructure:"instrumentation_key"` + MaxBatchSize int `mapstructure:"maxbatchsize"` + MaxBatchInterval time.Duration `mapstructure:"maxbatchinterval"` + SpanEventsEnabled bool `mapstructure:"spaneventsenabled"` } diff --git a/exporter/azuremonitorexporter/config_test.go b/exporter/azuremonitorexporter/config_test.go index ba1e41f7fefb..6172b23a1b7e 100644 --- a/exporter/azuremonitorexporter/config_test.go +++ b/exporter/azuremonitorexporter/config_test.go @@ -29,7 +29,6 @@ func TestLoadConfig(t *testing.T) { id component.ID expected component.Config }{ - { id: component.NewIDWithName(metadata.Type, ""), expected: createDefaultConfig(), @@ -37,13 +36,13 @@ func TestLoadConfig(t *testing.T) { { id: component.NewIDWithName(metadata.Type, "2"), expected: &Config{ - Endpoint: defaultEndpoint, + Endpoint: "https://dc.services.visualstudio.com/v2/track", ConnectionString: "InstrumentationKey=00000000-0000-0000-0000-000000000000;IngestionEndpoint=https://ingestion.azuremonitor.com/", InstrumentationKey: "00000000-0000-0000-0000-000000000000", MaxBatchSize: 100, MaxBatchInterval: 10 * time.Second, SpanEventsEnabled: false, - QueueSettings: exporterhelper.QueueSettings{ + QueueSettings: exporterhelper.QueueConfig{ QueueSize: 1000, Enabled: true, NumConsumers: 10, @@ -60,7 +59,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) diff --git a/exporter/azuremonitorexporter/connection_string_parser.go b/exporter/azuremonitorexporter/connection_string_parser.go index 064f09c8a6f6..c403ae83911f 100644 --- a/exporter/azuremonitorexporter/connection_string_parser.go +++ b/exporter/azuremonitorexporter/connection_string_parser.go @@ -44,7 +44,11 @@ func parseConnectionString(exporterConfig *Config) (*ConnectionVars, error) { } if connectionString == "" { connectionVars.InstrumentationKey = instrumentationKey - connectionVars.IngestionURL = getIngestionURL(DefaultIngestionEndpoint) + if exporterConfig.Endpoint == "" { + connectionVars.IngestionURL = getIngestionURL(DefaultIngestionEndpoint) + } else { + connectionVars.IngestionURL = getIngestionURL(exporterConfig.Endpoint) + } return connectionVars, nil } diff --git a/exporter/azuremonitorexporter/contracts_utils.go b/exporter/azuremonitorexporter/contracts_utils.go index 188f04e13794..9b80287f22da 100644 --- a/exporter/azuremonitorexporter/contracts_utils.go +++ b/exporter/azuremonitorexporter/contracts_utils.go @@ -6,7 +6,7 @@ package azuremonitorexporter // import "github.com/open-telemetry/opentelemetry- import ( "github.com/microsoft/ApplicationInsights-Go/appinsights/contracts" "go.opentelemetry.io/collector/pdata/pcommon" // Applies resource attributes values to data properties - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" ) const ( diff --git a/exporter/azuremonitorexporter/conventions.go b/exporter/azuremonitorexporter/conventions.go index 21a2bc923448..3e4ce211e7a4 100644 --- a/exporter/azuremonitorexporter/conventions.go +++ b/exporter/azuremonitorexporter/conventions.go @@ -7,7 +7,7 @@ import ( "strconv" "go.opentelemetry.io/collector/pdata/pcommon" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.7.0" ) /* @@ -22,7 +22,7 @@ const ( // NetworkAttributes is the set of known network attributes type NetworkAttributes struct { - // see https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/span-general.md#general-network-connection-attributes + // see https://github.com/open-telemetry/semantic-conventions/blob/main/docs/attributes-registry/network.md#network-attributes NetTransport string NetPeerIP string NetPeerPort int64 diff --git a/exporter/azuremonitorexporter/conventions_test.go b/exporter/azuremonitorexporter/conventions_test.go index 58486ddbbec6..50fd3ecc4a97 100644 --- a/exporter/azuremonitorexporter/conventions_test.go +++ b/exporter/azuremonitorexporter/conventions_test.go @@ -8,7 +8,7 @@ import ( "github.com/stretchr/testify/assert" "go.opentelemetry.io/collector/pdata/pcommon" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.7.0" ) func TestHTTPAttributeMapping(t *testing.T) { diff --git a/exporter/azuremonitorexporter/factory.go b/exporter/azuremonitorexporter/factory.go index 66c5213b1ac2..d2904b2a9e98 100644 --- a/exporter/azuremonitorexporter/factory.go +++ b/exporter/azuremonitorexporter/factory.go @@ -20,13 +20,7 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/azuremonitorexporter/internal/metadata" ) -const ( - defaultEndpoint = "https://dc.services.visualstudio.com/v2/track" -) - -var ( - errUnexpectedConfigurationType = errors.New("failed to cast configuration to Azure Monitor Config") -) +var errUnexpectedConfigurationType = errors.New("failed to cast configuration to Azure Monitor Config") // NewFactory returns a factory for Azure Monitor exporter. func NewFactory() exporter.Factory { @@ -46,17 +40,16 @@ type factory struct { func createDefaultConfig() component.Config { return &Config{ - Endpoint: defaultEndpoint, MaxBatchSize: 1024, MaxBatchInterval: 10 * time.Second, SpanEventsEnabled: false, - QueueSettings: exporterhelper.NewDefaultQueueSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), } } func (f *factory) createTracesExporter( _ context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exporter.Traces, error) { exporterConfig, ok := cfg.(*Config) @@ -75,7 +68,7 @@ func (f *factory) createTracesExporter( func (f *factory) createLogsExporter( _ context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exporter.Logs, error) { exporterConfig, ok := cfg.(*Config) @@ -94,7 +87,7 @@ func (f *factory) createLogsExporter( func (f *factory) createMetricsExporter( _ context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exporter.Metrics, error) { exporterConfig, ok := cfg.(*Config) @@ -114,7 +107,6 @@ func (f *factory) createMetricsExporter( // Configures the transport channel. // This method is not thread-safe func (f *factory) getTransportChannel(exporterConfig *Config, logger *zap.Logger) (transportChannel, error) { - // The default transport channel uses the default send mechanism from the AppInsights telemetry client. // This default channel handles batching, appropriate retries, and is backed by memory. if f.tChannel == nil { diff --git a/exporter/azuremonitorexporter/factory_test.go b/exporter/azuremonitorexporter/factory_test.go index 9572b67168f9..c0875782bd14 100644 --- a/exporter/azuremonitorexporter/factory_test.go +++ b/exporter/azuremonitorexporter/factory_test.go @@ -12,14 +12,13 @@ import ( ) // An inappropriate config -type badConfig struct { -} +type badConfig struct{} -func TestCreateTracesExporterUsingSpecificTransportChannel(t *testing.T) { +func TestCreateTracesUsingSpecificTransportChannel(t *testing.T) { // mock transport channel creation f := factory{tChannel: &mockTransportChannel{}} ctx := context.Background() - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() config := createDefaultConfig().(*Config) config.ConnectionString = "InstrumentationKey=test-key;IngestionEndpoint=https://test-endpoint/" exporter, err := f.createTracesExporter(ctx, params, config) @@ -27,25 +26,25 @@ func TestCreateTracesExporterUsingSpecificTransportChannel(t *testing.T) { assert.NoError(t, err) } -func TestCreateTracesExporterUsingDefaultTransportChannel(t *testing.T) { +func TestCreateTracesUsingDefaultTransportChannel(t *testing.T) { // We get the default transport channel creation, if we don't specify one during f creation f := factory{} assert.Nil(t, f.tChannel) ctx := context.Background() config := createDefaultConfig().(*Config) config.ConnectionString = "InstrumentationKey=test-key;IngestionEndpoint=https://test-endpoint/" - exporter, err := f.createTracesExporter(ctx, exportertest.NewNopCreateSettings(), config) + exporter, err := f.createTracesExporter(ctx, exportertest.NewNopSettings(), config) assert.NotNil(t, exporter) assert.NoError(t, err) assert.NotNil(t, f.tChannel) } -func TestCreateTracesExporterUsingBadConfig(t *testing.T) { +func TestCreateTracesUsingBadConfig(t *testing.T) { // We get the default transport channel creation, if we don't specify one during factory creation f := factory{} assert.Nil(t, f.tChannel) ctx := context.Background() - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() badConfig := &badConfig{} diff --git a/exporter/azuremonitorexporter/generated_component_test.go b/exporter/azuremonitorexporter/generated_component_test.go index f1961477c174..749831d1766b 100644 --- a/exporter/azuremonitorexporter/generated_component_test.go +++ b/exporter/azuremonitorexporter/generated_component_test.go @@ -32,27 +32,27 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, { name: "metrics", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg) }, }, { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -64,21 +64,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(exporter.Logs) require.True(t, ok) diff --git a/exporter/azuremonitorexporter/go.mod b/exporter/azuremonitorexporter/go.mod index 96343bdc4a05..7032cca992d1 100644 --- a/exporter/azuremonitorexporter/go.mod +++ b/exporter/azuremonitorexporter/go.mod @@ -1,65 +1,71 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/azuremonitorexporter -go 1.21.0 +go 1.22.0 require ( github.com/microsoft/ApplicationInsights-Go v0.4.4 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/semconv v0.116.0 go.uber.org/zap v1.27.0 - golang.org/x/net v0.25.0 + golang.org/x/net v0.31.0 ) require ( code.cloudfoundry.org/clock v0.0.0-20180518195852-02e53af36e6c // indirect - github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gofrs/uuid v4.0.0+incompatible // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect github.com/stretchr/objx v0.5.2 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configretry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/config/configretry v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/consumer v1.22.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/azuremonitorexporter/go.sum b/exporter/azuremonitorexporter/go.sum index b08e12d9cf79..b8157888b775 100644 --- a/exporter/azuremonitorexporter/go.sum +++ b/exporter/azuremonitorexporter/go.sum @@ -1,33 +1,33 @@ code.cloudfoundry.org/clock v0.0.0-20180518195852-02e53af36e6c h1:5eeuG0BHx1+DHeT3AP+ISKZ2ht1UjGhm581ljqYpVeQ= code.cloudfoundry.org/clock v0.0.0-20180518195852-02e53af36e6c/go.mod h1:QD9Lzhd/ux6eNQVUDVRJX/RKTigpewimNYBi7ivZKY8= -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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= @@ -37,8 +37,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -62,63 +62,77 @@ github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tedsuo/ifrit v0.0.0-20180802180643-bea94bb476cc/go.mod h1:eyZnKCc955uh98WQvzOm0dgAeLnf2O0Rz0LPoC5ze+0= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -135,8 +149,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -145,12 +159,12 @@ golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -159,12 +173,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/exporter/azuremonitorexporter/internal/metadata/generated_status.go b/exporter/azuremonitorexporter/internal/metadata/generated_status.go index 81526cabcd9e..8ad9cfbf6f1f 100644 --- a/exporter/azuremonitorexporter/internal/metadata/generated_status.go +++ b/exporter/azuremonitorexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("azuremonitor") + Type = component.MustNewType("azuremonitor") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/azuremonitorexporter" ) const ( diff --git a/exporter/azuremonitorexporter/internal/metadata/generated_telemetry.go b/exporter/azuremonitorexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index af55527da0d0..000000000000 --- a/exporter/azuremonitorexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/azuremonitor") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/azuremonitor") -} diff --git a/exporter/azuremonitorexporter/internal/metadata/generated_telemetry_test.go b/exporter/azuremonitorexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index b24fcdd7accc..000000000000 --- a/exporter/azuremonitorexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/azuremonitor", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/azuremonitor", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/azuremonitorexporter/logexporter.go b/exporter/azuremonitorexporter/logexporter.go index 901c09d595f4..1eacc80261b0 100644 --- a/exporter/azuremonitorexporter/logexporter.go +++ b/exporter/azuremonitorexporter/logexporter.go @@ -35,19 +35,20 @@ func (exporter *logExporter) onLogData(_ context.Context, logData plog.Logs) err } } } - + // Flush the transport channel to force the telemetry to be sent + exporter.transportChannel.Flush() return nil } // Returns a new instance of the log exporter -func newLogsExporter(config *Config, transportChannel transportChannel, set exporter.CreateSettings) (exporter.Logs, error) { +func newLogsExporter(config *Config, transportChannel transportChannel, set exporter.Settings) (exporter.Logs, error) { exporter := &logExporter{ config: config, transportChannel: transportChannel, logger: set.Logger, } - return exporterhelper.NewLogsExporter( + return exporterhelper.NewLogs( context.TODO(), set, config, diff --git a/exporter/azuremonitorexporter/logexporter_test.go b/exporter/azuremonitorexporter/logexporter_test.go index e13cc9c7260c..e6ade92105c9 100644 --- a/exporter/azuremonitorexporter/logexporter_test.go +++ b/exporter/azuremonitorexporter/logexporter_test.go @@ -17,7 +17,7 @@ import ( "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "go.uber.org/zap" ) diff --git a/exporter/azuremonitorexporter/metadata.yaml b/exporter/azuremonitorexporter/metadata.yaml index 30a917d028e2..59b27b1d7469 100644 --- a/exporter/azuremonitorexporter/metadata.yaml +++ b/exporter/azuremonitorexporter/metadata.yaml @@ -1,5 +1,4 @@ type: azuremonitor -scope_name: otelcol/azuremonitor status: class: exporter diff --git a/exporter/azuremonitorexporter/metric_to_envelopes.go b/exporter/azuremonitorexporter/metric_to_envelopes.go index 1ac92edd91d2..95f405ce69ca 100644 --- a/exporter/azuremonitorexporter/metric_to_envelopes.go +++ b/exporter/azuremonitorexporter/metric_to_envelopes.go @@ -33,9 +33,7 @@ func (packer *metricPacker) MetricToEnvelopes(metric pmetric.Metric, resource pc mtd := packer.getMetricTimedData(metric) if mtd != nil { - for _, timedDataPoint := range mtd.getTimedDataPoints() { - envelope := contracts.NewEnvelope() envelope.Tags = make(map[string]string) envelope.Time = toTime(timedDataPoint.timestamp).Format(time.RFC3339Nano) @@ -67,7 +65,6 @@ func (packer *metricPacker) MetricToEnvelopes(metric pmetric.Metric, resource pc packer.logger.Debug("Metric is packed", zap.String("name", dataPoint.Name), zap.Any("value", dataPoint.Value)) envelopes = append(envelopes, envelope) - } } @@ -172,7 +169,6 @@ func (m histogramMetric) getTimedDataPoints() []*timedMetricDataPoint { timestamp: histogramDataPoint.Timestamp(), attributes: histogramDataPoint.Attributes(), } - } return timedDataPoints } @@ -237,7 +233,6 @@ func (m summaryMetric) getTimedDataPoints() []*timedMetricDataPoint { timestamp: summaryDataPoint.Timestamp(), attributes: summaryDataPoint.Attributes(), } - } return timedDataPoints } diff --git a/exporter/azuremonitorexporter/metricexporter.go b/exporter/azuremonitorexporter/metricexporter.go index 94d9148ceb2c..b0b3bbd2bd1a 100644 --- a/exporter/azuremonitorexporter/metricexporter.go +++ b/exporter/azuremonitorexporter/metricexporter.go @@ -37,11 +37,13 @@ func (exporter *metricExporter) onMetricData(_ context.Context, metricData pmetr } } + // Flush the transport channel to force the telemetry to be sent + exporter.transportChannel.Flush() return nil } // Returns a new instance of the metric exporter -func newMetricsExporter(config *Config, transportChannel transportChannel, set exporter.CreateSettings) (exporter.Metrics, error) { +func newMetricsExporter(config *Config, transportChannel transportChannel, set exporter.Settings) (exporter.Metrics, error) { exporter := &metricExporter{ config: config, transportChannel: transportChannel, @@ -49,7 +51,7 @@ func newMetricsExporter(config *Config, transportChannel transportChannel, set e packer: newMetricPacker(set.Logger), } - return exporterhelper.NewMetricsExporter( + return exporterhelper.NewMetrics( context.TODO(), set, config, diff --git a/exporter/azuremonitorexporter/metricexporter_test.go b/exporter/azuremonitorexporter/metricexporter_test.go index 1fc84bd49f33..b0acb856de3c 100644 --- a/exporter/azuremonitorexporter/metricexporter_test.go +++ b/exporter/azuremonitorexporter/metricexporter_test.go @@ -35,104 +35,104 @@ func TestDoubleGaugeEnvelopes(t *testing.T) { gaugeMetric := getDoubleTestGaugeMetric() dataPoint := getDataPoint(t, gaugeMetric) - assert.Equal(t, dataPoint.Name, "Gauge") - assert.Equal(t, dataPoint.Value, float64(1)) - assert.Equal(t, dataPoint.Count, 1) - assert.Equal(t, dataPoint.Kind, contracts.Measurement) + assert.Equal(t, "Gauge", dataPoint.Name) + assert.Equal(t, float64(1), dataPoint.Value) + assert.Equal(t, 1, dataPoint.Count) + assert.Equal(t, contracts.Measurement, dataPoint.Kind) } func TestIntGaugeEnvelopes(t *testing.T) { gaugeMetric := getIntTestGaugeMetric() dataPoint := getDataPoint(t, gaugeMetric) - assert.Equal(t, dataPoint.Name, "Gauge") - assert.Equal(t, dataPoint.Value, float64(1)) - assert.Equal(t, dataPoint.Count, 1) - assert.Equal(t, dataPoint.Kind, contracts.Measurement) + assert.Equal(t, "Gauge", dataPoint.Name) + assert.Equal(t, float64(1), dataPoint.Value) + assert.Equal(t, 1, dataPoint.Count) + assert.Equal(t, contracts.Measurement, dataPoint.Kind) } func TestDoubleSumEnvelopes(t *testing.T) { sumMetric := getDoubleTestSumMetric() dataPoint := getDataPoint(t, sumMetric) - assert.Equal(t, dataPoint.Name, "Sum") - assert.Equal(t, dataPoint.Value, float64(2)) - assert.Equal(t, dataPoint.Count, 1) - assert.Equal(t, dataPoint.Kind, contracts.Measurement) + assert.Equal(t, "Sum", dataPoint.Name) + assert.Equal(t, float64(2), dataPoint.Value) + assert.Equal(t, 1, dataPoint.Count) + assert.Equal(t, contracts.Measurement, dataPoint.Kind) } func TestIntSumEnvelopes(t *testing.T) { sumMetric := getIntTestSumMetric() dataPoint := getDataPoint(t, sumMetric) - assert.Equal(t, dataPoint.Name, "Sum") - assert.Equal(t, dataPoint.Value, float64(2)) - assert.Equal(t, dataPoint.Count, 1) - assert.Equal(t, dataPoint.Kind, contracts.Measurement) + assert.Equal(t, "Sum", dataPoint.Name) + assert.Equal(t, float64(2), dataPoint.Value) + assert.Equal(t, 1, dataPoint.Count) + assert.Equal(t, contracts.Measurement, dataPoint.Kind) } func TestHistogramEnvelopes(t *testing.T) { histogramMetric := getTestHistogramMetric() dataPoint := getDataPoint(t, histogramMetric) - assert.Equal(t, dataPoint.Name, "Histogram") - assert.Equal(t, dataPoint.Value, float64(3)) - assert.Equal(t, dataPoint.Count, 3) - assert.Equal(t, dataPoint.Min, float64(0)) - assert.Equal(t, dataPoint.Max, float64(2)) - assert.Equal(t, dataPoint.Kind, contracts.Aggregation) + assert.Equal(t, "Histogram", dataPoint.Name) + assert.Equal(t, float64(3), dataPoint.Value) + assert.Equal(t, 3, dataPoint.Count) + assert.Equal(t, float64(0), dataPoint.Min) + assert.Equal(t, float64(2), dataPoint.Max) + assert.Equal(t, contracts.Aggregation, dataPoint.Kind) } func TestExponentialHistogramEnvelopes(t *testing.T) { exponentialHistogramMetric := getTestExponentialHistogramMetric() dataPoint := getDataPoint(t, exponentialHistogramMetric) - assert.Equal(t, dataPoint.Name, "ExponentialHistogram") - assert.Equal(t, dataPoint.Value, float64(4)) - assert.Equal(t, dataPoint.Count, 4) - assert.Equal(t, dataPoint.Min, float64(1)) - assert.Equal(t, dataPoint.Max, float64(3)) - assert.Equal(t, dataPoint.Kind, contracts.Aggregation) + assert.Equal(t, "ExponentialHistogram", dataPoint.Name) + assert.Equal(t, float64(4), dataPoint.Value) + assert.Equal(t, 4, dataPoint.Count) + assert.Equal(t, float64(1), dataPoint.Min) + assert.Equal(t, float64(3), dataPoint.Max) + assert.Equal(t, contracts.Aggregation, dataPoint.Kind) } func TestSummaryEnvelopes(t *testing.T) { summaryMetric := getTestSummaryMetric() dataPoint := getDataPoint(t, summaryMetric) - assert.Equal(t, dataPoint.Name, "Summary") - assert.Equal(t, dataPoint.Value, float64(5)) - assert.Equal(t, dataPoint.Count, 5) - assert.Equal(t, dataPoint.Kind, contracts.Aggregation) + assert.Equal(t, "Summary", dataPoint.Name) + assert.Equal(t, float64(5), dataPoint.Value) + assert.Equal(t, 5, dataPoint.Count) + assert.Equal(t, contracts.Aggregation, dataPoint.Kind) } -func getDataPoint(t testing.TB, metric pmetric.Metric) *contracts.DataPoint { +func getDataPoint(tb testing.TB, metric pmetric.Metric) *contracts.DataPoint { var envelopes []*contracts.Envelope = getMetricPacker().MetricToEnvelopes(metric, getResource(), getScope()) - require.Equal(t, len(envelopes), 1) + require.Len(tb, envelopes, 1) envelope := envelopes[0] - require.NotNil(t, envelope) + require.NotNil(tb, envelope) - assert.NotNil(t, envelope.Tags) - assert.Contains(t, envelope.Tags[contracts.InternalSdkVersion], "otelc-") - assert.NotNil(t, envelope.Time) + assert.NotNil(tb, envelope.Tags) + assert.Contains(tb, envelope.Tags[contracts.InternalSdkVersion], "otelc-") + assert.NotNil(tb, envelope.Time) - require.NotNil(t, envelope.Data) + require.NotNil(tb, envelope.Data) envelopeData := envelope.Data.(*contracts.Data) - assert.Equal(t, envelopeData.BaseType, "MetricData") + assert.Equal(tb, "MetricData", envelopeData.BaseType) - require.NotNil(t, envelopeData.BaseData) + require.NotNil(tb, envelopeData.BaseData) metricData := envelopeData.BaseData.(*contracts.MetricData) - require.Equal(t, len(metricData.Metrics), 1) + require.Len(tb, metricData.Metrics, 1) dataPoint := metricData.Metrics[0] - require.NotNil(t, dataPoint) + require.NotNil(tb, dataPoint) actualProperties := metricData.Properties - require.Equal(t, "10", actualProperties["int_attribute"]) - require.Equal(t, "str_value", actualProperties["str_attribute"]) - require.Equal(t, "true", actualProperties["bool_attribute"]) - require.Equal(t, "1.2", actualProperties["double_attribute"]) + require.Equal(tb, "10", actualProperties["int_attribute"]) + require.Equal(tb, "str_value", actualProperties["str_attribute"]) + require.Equal(tb, "true", actualProperties["bool_attribute"]) + require.Equal(tb, "1.2", actualProperties["double_attribute"]) return dataPoint } diff --git a/exporter/azuremonitorexporter/mock_transportChannel.go b/exporter/azuremonitorexporter/mock_transportChannel.go index 269eb4ac65f6..1d34e3a03a52 100644 --- a/exporter/azuremonitorexporter/mock_transportChannel.go +++ b/exporter/azuremonitorexporter/mock_transportChannel.go @@ -19,3 +19,7 @@ type mockTransportChannel struct { func (_m *mockTransportChannel) Send(_a0 *contracts.Envelope) { _m.Called(_a0) } + +func (_m *mockTransportChannel) Flush() { + _m.Called() +} diff --git a/exporter/azuremonitorexporter/time_utils_test.go b/exporter/azuremonitorexporter/time_utils_test.go index 1034ae9f17a3..78807c89a276 100644 --- a/exporter/azuremonitorexporter/time_utils_test.go +++ b/exporter/azuremonitorexporter/time_utils_test.go @@ -17,7 +17,7 @@ func TestToTime(t *testing.T) { output := toTime(input) assert.NotNil(t, output) - expected := time.Date(1970, 01, 01, 00, 01, 00, 1, time.UTC) + expected := time.Date(1970, 0o1, 0o1, 0o0, 0o1, 0o0, 1, time.UTC) assert.Equal(t, "1970-01-01T00:01:00.000000001Z", expected.Format(time.RFC3339Nano)) } diff --git a/exporter/azuremonitorexporter/trace_to_envelope.go b/exporter/azuremonitorexporter/trace_to_envelope.go index dc091ab227ca..7839aa373502 100644 --- a/exporter/azuremonitorexporter/trace_to_envelope.go +++ b/exporter/azuremonitorexporter/trace_to_envelope.go @@ -15,7 +15,7 @@ import ( "github.com/microsoft/ApplicationInsights-Go/appinsights/contracts" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.12.0" "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/traceutil" @@ -47,8 +47,8 @@ func spanToEnvelopes( instrumentationScope pcommon.InstrumentationScope, span ptrace.Span, spanEventsEnabled bool, - logger *zap.Logger) ([]*contracts.Envelope, error) { - + logger *zap.Logger, +) ([]*contracts.Envelope, error) { spanKind := span.Kind() // According to the SpanKind documentation, we can assume it to be INTERNAL @@ -551,8 +551,8 @@ func fillRemoteDependencyDataMessaging(span ptrace.Span, data *contracts.RemoteD func copyAndMapAttributes( attributeMap pcommon.Map, properties map[string]string, - mappingFunc func(k string, v pcommon.Value)) { - + mappingFunc func(k string, v pcommon.Value), +) { attributeMap.Range(func(k string, v pcommon.Value) bool { setAttributeValueAsProperty(k, v, properties) if mappingFunc != nil { @@ -565,16 +565,16 @@ func copyAndMapAttributes( // Copies all attributes to either properties or measurements without any kind of mapping to a known set of attributes func copyAttributesWithoutMapping( attributeMap pcommon.Map, - properties map[string]string) { - + properties map[string]string, +) { copyAndMapAttributes(attributeMap, properties, nil) } // Attribute extraction logic for HTTP Span attributes func copyAndExtractHTTPAttributes( attributeMap pcommon.Map, - properties map[string]string) *HTTPAttributes { - + properties map[string]string, +) *HTTPAttributes { attrs := &HTTPAttributes{} copyAndMapAttributes( attributeMap, @@ -587,8 +587,8 @@ func copyAndExtractHTTPAttributes( // Attribute extraction logic for RPC Span attributes func copyAndExtractRPCAttributes( attributeMap pcommon.Map, - properties map[string]string) *RPCAttributes { - + properties map[string]string, +) *RPCAttributes { attrs := &RPCAttributes{} copyAndMapAttributes( attributeMap, @@ -601,8 +601,8 @@ func copyAndExtractRPCAttributes( // Attribute extraction logic for Database Span attributes func copyAndExtractDatabaseAttributes( attributeMap pcommon.Map, - properties map[string]string) *DatabaseAttributes { - + properties map[string]string, +) *DatabaseAttributes { attrs := &DatabaseAttributes{} copyAndMapAttributes( attributeMap, @@ -615,8 +615,8 @@ func copyAndExtractDatabaseAttributes( // Attribute extraction logic for Messaging Span attributes func copyAndExtractMessagingAttributes( attributeMap pcommon.Map, - properties map[string]string) *MessagingAttributes { - + properties map[string]string, +) *MessagingAttributes { attrs := &MessagingAttributes{} copyAndMapAttributes( attributeMap, @@ -629,8 +629,8 @@ func copyAndExtractMessagingAttributes( // Attribute extraction logic for Span event exception attributes func copyAndExtractExceptionAttributes( attributeMap pcommon.Map, - properties map[string]string) *ExceptionAttributes { - + properties map[string]string, +) *ExceptionAttributes { attrs := &ExceptionAttributes{} copyAndMapAttributes( attributeMap, @@ -704,8 +704,8 @@ func writeFormattedPeerAddressFromNetworkAttributes(networkAttributes *NetworkAt func setAttributeValueAsProperty( key string, attributeValue pcommon.Value, - properties map[string]string) { - + properties map[string]string, +) { switch attributeValue.Type() { case pcommon.ValueTypeBool: properties[key] = strconv.FormatBool(attributeValue.Bool()) diff --git a/exporter/azuremonitorexporter/trace_to_envelope_test.go b/exporter/azuremonitorexporter/trace_to_envelope_test.go index f5bc60e401cb..2390e71e48d4 100644 --- a/exporter/azuremonitorexporter/trace_to_envelope_test.go +++ b/exporter/azuremonitorexporter/trace_to_envelope_test.go @@ -5,6 +5,7 @@ package azuremonitorexporter import ( "fmt" + "net/http" "strconv" "testing" "time" @@ -13,7 +14,7 @@ import ( "github.com/stretchr/testify/assert" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.12.0" "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/traceutil" @@ -29,7 +30,7 @@ const ( defaultServiceInstance = "112345" defaultScopeName = "myinstrumentationlib" defaultScopeVersion = "1.0" - defaultHTTPMethod = "GET" + defaultHTTPMethod = http.MethodGet defaultHTTPServerSpanName = "/bar" defaultHTTPClientSpanName = defaultHTTPMethod defaultHTTPStatusCode = 200 @@ -105,7 +106,7 @@ var ( // - a specific SpanStatus as opposed to none // - an error http.status_code // - http.route is specified which should replace Span name as part of the RequestData name -// - no http.client_ip or net.peer.ip specified which causes data.Source to be empty +// - no http.client_ip or net.peer.ip specified which causes data.Source to be empty // - adds a few different types of attributes func TestHTTPServerSpanToRequestDataAttributeSet1(t *testing.T) { span := getDefaultHTTPServerSpan() @@ -512,7 +513,7 @@ func TestSpanWithEventsToEnvelopes(t *testing.T) { envelopes, _ := spanToEnvelopes(defaultResource, defaultInstrumentationLibrary, span, true, zap.NewNop()) assert.NotNil(t, envelopes) - assert.Equal(t, 3, len(envelopes)) + assert.Len(t, envelopes, 3) validateEnvelope := func(spanEvent ptrace.SpanEvent, envelope *contracts.Envelope, targetEnvelopeName string) { assert.Equal(t, targetEnvelopeName, envelope.Name) @@ -565,8 +566,8 @@ func commonEnvelopeValidations( t *testing.T, span ptrace.Span, envelope *contracts.Envelope, - expectedEnvelopeName string) { - + expectedEnvelopeName string, +) { assert.NotNil(t, envelope) assert.Equal(t, expectedEnvelopeName, envelope.Name) assert.Equal(t, toTime(span.StartTimestamp()).Format(time.RFC3339Nano), envelope.Time) @@ -587,8 +588,8 @@ func commonEnvelopeValidations( func commonRequestDataValidations( t *testing.T, span ptrace.Span, - data *contracts.RequestData) { - + data *contracts.RequestData, +) { assertAttributesCopiedToProperties(t, span.Attributes(), data.Properties) assert.Equal(t, defaultSpanIDAsHex, data.Id) assert.Equal(t, defaultSpanDuration, data.Duration) @@ -601,8 +602,8 @@ func commonRequestDataValidations( func defaultHTTPRequestDataValidations( t *testing.T, span ptrace.Span, - data *contracts.RequestData) { - + data *contracts.RequestData, +) { commonRequestDataValidations(t, span, data) assert.Equal(t, defaultHTTPStatusCodeAsString, data.ResponseCode) @@ -614,8 +615,8 @@ func defaultHTTPRequestDataValidations( func commonRemoteDependencyDataValidations( t *testing.T, span ptrace.Span, - data *contracts.RemoteDependencyData) { - + data *contracts.RemoteDependencyData, +) { assertAttributesCopiedToProperties(t, span.Attributes(), data.Properties) assert.Equal(t, defaultSpanIDAsHex, data.Id) assert.Equal(t, defaultSpanDuration, data.Duration) @@ -625,8 +626,8 @@ func commonRemoteDependencyDataValidations( func defaultHTTPRemoteDependencyDataValidations( t *testing.T, span ptrace.Span, - data *contracts.RemoteDependencyData) { - + data *contracts.RemoteDependencyData, +) { commonRemoteDependencyDataValidations(t, span, data) assert.Equal(t, defaultHTTPStatusCodeAsString, data.ResultCode) @@ -639,8 +640,8 @@ func defaultRPCRequestDataValidations( t *testing.T, span ptrace.Span, data *contracts.RequestData, - expectedDataSource string) { - + expectedDataSource string, +) { commonRequestDataValidations(t, span, data) assert.Equal(t, defaultRPCStatusCodeAsString, data.ResponseCode) @@ -654,8 +655,8 @@ func defaultRPCRemoteDependencyDataValidations( t *testing.T, span ptrace.Span, data *contracts.RemoteDependencyData, - expectedDataTarget string) { - + expectedDataTarget string, +) { commonRemoteDependencyDataValidations(t, span, data) assert.Equal(t, defaultRPCStatusCodeAsString, data.ResultCode) @@ -671,8 +672,8 @@ func defaultRPCRemoteDependencyDataValidations( func defaultDatabaseRemoteDependencyDataValidations( t *testing.T, span ptrace.Span, - data *contracts.RemoteDependencyData) { - + data *contracts.RemoteDependencyData, +) { commonRemoteDependencyDataValidations(t, span, data) assert.Equal(t, defaultDatabaseStatusCodeAsString, data.ResultCode) @@ -684,8 +685,8 @@ func defaultDatabaseRemoteDependencyDataValidations( func defaultMessagingRequestDataValidations( t *testing.T, span ptrace.Span, - data *contracts.RequestData) { - + data *contracts.RequestData, +) { commonRequestDataValidations(t, span, data) assert.Equal(t, defaultMessagingStatusCodeAsString, data.ResponseCode) @@ -696,8 +697,8 @@ func defaultMessagingRequestDataValidations( func defaultMessagingRemoteDependencyDataValidations( t *testing.T, span ptrace.Span, - data *contracts.RemoteDependencyData) { - + data *contracts.RemoteDependencyData, +) { commonRemoteDependencyDataValidations(t, span, data) assert.Equal(t, defaultMessagingStatusCodeAsString, data.ResultCode) @@ -709,8 +710,8 @@ func defaultMessagingRemoteDependencyDataValidations( func defaultInternalRemoteDependencyDataValidations( t *testing.T, span ptrace.Span, - data *contracts.RemoteDependencyData) { - + data *contracts.RemoteDependencyData, +) { assertAttributesCopiedToProperties(t, span.Attributes(), data.Properties) assert.Equal(t, "InProc", data.Type) } @@ -719,8 +720,8 @@ func defaultInternalRemoteDependencyDataValidations( func assertAttributesCopiedToProperties( t *testing.T, attributeMap pcommon.Map, - properties map[string]string) { - + properties map[string]string, +) { attributeMap.Range(func(k string, v pcommon.Value) bool { p, exists := properties[k] assert.True(t, exists) diff --git a/exporter/azuremonitorexporter/traceexporter.go b/exporter/azuremonitorexporter/traceexporter.go index f5f5e19c6126..66326d2f540b 100644 --- a/exporter/azuremonitorexporter/traceexporter.go +++ b/exporter/azuremonitorexporter/traceexporter.go @@ -30,8 +30,8 @@ type traceVisitor struct { func (v *traceVisitor) visit( resource pcommon.Resource, scope pcommon.InstrumentationScope, - span ptrace.Span) (ok bool) { - + span ptrace.Span, +) (ok bool) { envelopes, err := spanToEnvelopes(resource, scope, span, v.exporter.config.SpanEventsEnabled, v.exporter.logger) if err != nil { // record the error and short-circuit @@ -46,6 +46,8 @@ func (v *traceVisitor) visit( v.exporter.transportChannel.Send(envelope) } + // Flush the transport channel to force the telemetry to be sent + v.exporter.transportChannel.Flush() v.processed++ return true @@ -63,14 +65,14 @@ func (exporter *traceExporter) onTraceData(_ context.Context, traceData ptrace.T } // Returns a new instance of the trace exporter -func newTracesExporter(config *Config, transportChannel transportChannel, set exporter.CreateSettings) (exporter.Traces, error) { +func newTracesExporter(config *Config, transportChannel transportChannel, set exporter.Settings) (exporter.Traces, error) { exporter := &traceExporter{ config: config, transportChannel: transportChannel, logger: set.Logger, } - return exporterhelper.NewTracesExporter( + return exporterhelper.NewTraces( context.TODO(), set, config, diff --git a/exporter/azuremonitorexporter/traceexporter_test.go b/exporter/azuremonitorexporter/traceexporter_test.go index aa0ae5aedab2..d58a2dc9fd52 100644 --- a/exporter/azuremonitorexporter/traceexporter_test.go +++ b/exporter/azuremonitorexporter/traceexporter_test.go @@ -10,14 +10,12 @@ import ( "github.com/stretchr/testify/mock" "go.opentelemetry.io/collector/consumer/consumererror" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "go.uber.org/zap" "golang.org/x/net/context" ) -var ( - defaultConfig = createDefaultConfig().(*Config) -) +var defaultConfig = createDefaultConfig().(*Config) // Tests the export onTraceData callback with no Spans func TestExporterTraceDataCallbackNoSpans(t *testing.T) { @@ -118,6 +116,7 @@ func TestExporterTraceDataCallbackSingleSpanNoEnvelope(t *testing.T) { func getMockTransportChannel() *mockTransportChannel { transportChannelMock := mockTransportChannel{} transportChannelMock.On("Send", mock.Anything) + transportChannelMock.On("Flush", mock.Anything) return &transportChannelMock } diff --git a/exporter/carbonexporter/README.md b/exporter/carbonexporter/README.md index 17d5dbc1236b..8c37bebf218c 100644 --- a/exporter/carbonexporter/README.md +++ b/exporter/carbonexporter/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fcarbon%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fcarbon) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fcarbon%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fcarbon) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@aboguszewski-sumo](https://www.github.com/aboguszewski-sumo) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib diff --git a/exporter/carbonexporter/config.go b/exporter/carbonexporter/config.go index de3d0f75e08d..007763a4b168 100644 --- a/exporter/carbonexporter/config.go +++ b/exporter/carbonexporter/config.go @@ -25,9 +25,9 @@ type Config struct { // Timeout is the maximum duration allowed to connecting and sending the // data to the Carbon/Graphite backend. The default value is 5s. - exporterhelper.TimeoutSettings `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. - QueueConfig exporterhelper.QueueSettings `mapstructure:"sending_queue"` - RetryConfig configretry.BackOffConfig `mapstructure:"retry_on_failure"` + TimeoutSettings exporterhelper.TimeoutConfig `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. + QueueConfig exporterhelper.QueueConfig `mapstructure:"sending_queue"` + RetryConfig configretry.BackOffConfig `mapstructure:"retry_on_failure"` // ResourceToTelemetrySettings defines configuration for converting resource attributes to metric labels. ResourceToTelemetryConfig resourcetotelemetry.Settings `mapstructure:"resource_to_telemetry_conversion"` @@ -41,7 +41,7 @@ func (cfg *Config) Validate() error { } // Negative timeouts are not acceptable, since all sends will fail. - if cfg.Timeout < 0 { + if cfg.TimeoutSettings.Timeout < 0 { return errors.New("'timeout' must be non-negative") } diff --git a/exporter/carbonexporter/config_test.go b/exporter/carbonexporter/config_test.go index 767908147d08..795f0622d702 100644 --- a/exporter/carbonexporter/config_test.go +++ b/exporter/carbonexporter/config_test.go @@ -31,7 +31,6 @@ func TestLoadConfig(t *testing.T) { expected component.Config errorMessage string }{ - { id: component.NewIDWithName(metadata.Type, ""), expected: createDefaultConfig(), @@ -43,7 +42,7 @@ func TestLoadConfig(t *testing.T) { Endpoint: "localhost:8080", }, MaxIdleConns: 15, - TimeoutSettings: exporterhelper.TimeoutSettings{ + TimeoutSettings: exporterhelper.TimeoutConfig{ Timeout: 10 * time.Second, }, RetryConfig: configretry.BackOffConfig{ @@ -54,7 +53,7 @@ func TestLoadConfig(t *testing.T) { MaxInterval: 1 * time.Minute, MaxElapsedTime: 10 * time.Minute, }, - QueueConfig: exporterhelper.QueueSettings{ + QueueConfig: exporterhelper.QueueConfig{ Enabled: true, NumConsumers: 2, QueueSize: 10, @@ -73,7 +72,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) @@ -104,7 +103,7 @@ func TestValidateConfig(t *testing.T) { name: "invalid_timeout", config: &Config{ TCPAddrConfig: confignet.TCPAddrConfig{Endpoint: defaultEndpoint}, - TimeoutSettings: exporterhelper.TimeoutSettings{ + TimeoutSettings: exporterhelper.TimeoutConfig{ Timeout: -5 * time.Second, }, }, diff --git a/exporter/carbonexporter/exporter.go b/exporter/carbonexporter/exporter.go index a0c6610ba746..d39d708c43db 100644 --- a/exporter/carbonexporter/exporter.go +++ b/exporter/carbonexporter/exporter.go @@ -19,13 +19,13 @@ import ( ) // newCarbonExporter returns a new Carbon exporter. -func newCarbonExporter(ctx context.Context, cfg *Config, set exporter.CreateSettings) (exporter.Metrics, error) { +func newCarbonExporter(ctx context.Context, cfg *Config, set exporter.Settings) (exporter.Metrics, error) { sender := carbonSender{ - writeTimeout: cfg.Timeout, - conns: newConnPool(cfg.TCPAddrConfig, cfg.Timeout, cfg.MaxIdleConns), + writeTimeout: cfg.TimeoutSettings.Timeout, + conns: newConnPool(cfg.TCPAddrConfig, cfg.TimeoutSettings.Timeout, cfg.MaxIdleConns), } - exp, err := exporterhelper.NewMetricsExporter( + exp, err := exporterhelper.NewMetrics( ctx, set, cfg, diff --git a/exporter/carbonexporter/exporter_test.go b/exporter/carbonexporter/exporter_test.go index 5af6e35befae..eeeddb1e5a8f 100644 --- a/exporter/carbonexporter/exporter_test.go +++ b/exporter/carbonexporter/exporter_test.go @@ -24,7 +24,7 @@ import ( "go.opentelemetry.io/collector/exporter/exportertest" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" - conventions "go.opentelemetry.io/collector/semconv/v1.9.0" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/testutil" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry" @@ -32,7 +32,7 @@ import ( func TestNewWithDefaultConfig(t *testing.T) { cfg := createDefaultConfig().(*Config) - got, err := newCarbonExporter(context.Background(), cfg, exportertest.NewNopCreateSettings()) + got, err := newCarbonExporter(context.Background(), cfg, exportertest.NewNopSettings()) assert.NotNil(t, got) assert.NoError(t, err) } @@ -42,9 +42,9 @@ func TestConsumeMetricsNoServer(t *testing.T) { context.Background(), &Config{ TCPAddrConfig: confignet.TCPAddrConfig{Endpoint: testutil.GetAvailableLocalAddress(t)}, - TimeoutSettings: exporterhelper.TimeoutSettings{Timeout: 5 * time.Second}, + TimeoutSettings: exporterhelper.TimeoutConfig{Timeout: 5 * time.Second}, }, - exportertest.NewNopCreateSettings()) + exportertest.NewNopSettings()) require.NoError(t, err) require.NoError(t, exp.Start(context.Background(), componenttest.NewNopHost())) require.Error(t, exp.ConsumeMetrics(context.Background(), generateSmallBatch())) @@ -62,10 +62,10 @@ func TestConsumeMetricsWithResourceToTelemetry(t *testing.T) { context.Background(), &Config{ TCPAddrConfig: confignet.TCPAddrConfig{Endpoint: addr}, - TimeoutSettings: exporterhelper.TimeoutSettings{Timeout: 5 * time.Second}, + TimeoutSettings: exporterhelper.TimeoutConfig{Timeout: 5 * time.Second}, ResourceToTelemetryConfig: resourcetotelemetry.Settings{Enabled: true}, }, - exportertest.NewNopCreateSettings()) + exportertest.NewNopSettings()) require.NoError(t, err) require.NoError(t, exp.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, exp.ConsumeMetrics(context.Background(), generateSmallBatch())) @@ -128,9 +128,9 @@ func TestConsumeMetrics(t *testing.T) { &Config{ TCPAddrConfig: confignet.TCPAddrConfig{Endpoint: addr}, MaxIdleConns: tt.numProducers, - TimeoutSettings: exporterhelper.TimeoutSettings{Timeout: 5 * time.Second}, + TimeoutSettings: exporterhelper.TimeoutConfig{Timeout: 5 * time.Second}, }, - exportertest.NewNopCreateSettings()) + exportertest.NewNopSettings()) require.NoError(t, err) require.NoError(t, exp.Start(context.Background(), componenttest.NewNopHost())) @@ -142,7 +142,7 @@ func TestConsumeMetrics(t *testing.T) { defer writersWG.Done() <-startCh for j := 0; j < tt.writesPerProducer; j++ { - require.NoError(t, exp.ConsumeMetrics(context.Background(), tt.md)) + assert.NoError(t, exp.ConsumeMetrics(context.Background(), tt.md)) } }() } @@ -247,7 +247,6 @@ func TestConnPoolWithIdleMaxConnections(t *testing.T) { if i != 0 { assert.NotSame(t, conn, conns[i-1]) } - } for _, conn := range conns { cp.put(conn) @@ -332,10 +331,10 @@ func (cs *carbonServer) start(t *testing.T, numExpectedReq int) { // Close is expected to cause error. return } - require.NoError(t, err) + assert.NoError(t, err) go func(conn net.Conn) { defer func() { - require.NoError(t, conn.Close()) + assert.NoError(t, conn.Close()) }() reader := bufio.NewReader(conn) @@ -344,7 +343,7 @@ func (cs *carbonServer) start(t *testing.T, numExpectedReq int) { if errors.Is(err, io.EOF) { return } - require.NoError(t, err) + assert.NoError(t, err) if cs.expectedContainsValue != "" { assert.Contains(t, string(buf), cs.expectedContainsValue) diff --git a/exporter/carbonexporter/factory.go b/exporter/carbonexporter/factory.go index 687d5dd6d707..5622d8627482 100644 --- a/exporter/carbonexporter/factory.go +++ b/exporter/carbonexporter/factory.go @@ -34,19 +34,18 @@ func createDefaultConfig() component.Config { Endpoint: defaultEndpoint, }, MaxIdleConns: 100, - TimeoutSettings: exporterhelper.NewDefaultTimeoutSettings(), - QueueConfig: exporterhelper.NewDefaultQueueSettings(), + TimeoutSettings: exporterhelper.NewDefaultTimeoutConfig(), + QueueConfig: exporterhelper.NewDefaultQueueConfig(), RetryConfig: configretry.NewDefaultBackOffConfig(), } } func createMetricsExporter( ctx context.Context, - params exporter.CreateSettings, + params exporter.Settings, config component.Config, ) (exporter.Metrics, error) { exp, err := newCarbonExporter(ctx, config.(*Config), params) - if err != nil { return nil, err } diff --git a/exporter/carbonexporter/factory_test.go b/exporter/carbonexporter/factory_test.go index 36fb0d185ed1..a64034e84399 100644 --- a/exporter/carbonexporter/factory_test.go +++ b/exporter/carbonexporter/factory_test.go @@ -19,9 +19,9 @@ func TestCreateDefaultConfig(t *testing.T) { assert.NoError(t, componenttest.CheckConfigStruct(cfg)) } -func TestCreateMetricsExporter(t *testing.T) { +func TestCreateMetrics(t *testing.T) { cfg := createDefaultConfig() - _, err := createMetricsExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + _, err := createMetricsExporter(context.Background(), exportertest.NewNopSettings(), cfg) assert.NoError(t, err) } @@ -29,9 +29,9 @@ func TestCreateInstanceViaFactory(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() - exp, err := factory.CreateMetricsExporter( + exp, err := factory.CreateMetrics( context.Background(), - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg) assert.NoError(t, err) assert.NotNil(t, exp) @@ -39,9 +39,9 @@ func TestCreateInstanceViaFactory(t *testing.T) { // Set values that don't have a valid default. // expCfg := cfg.(*Config) - exp, err = factory.CreateMetricsExporter( + exp, err = factory.CreateMetrics( context.Background(), - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg) assert.NoError(t, err) require.NotNil(t, exp) diff --git a/exporter/carbonexporter/generated_component_test.go b/exporter/carbonexporter/generated_component_test.go index ec577671ce65..5bb0838bc335 100644 --- a/exporter/carbonexporter/generated_component_test.go +++ b/exporter/carbonexporter/generated_component_test.go @@ -32,13 +32,13 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "metrics", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg) }, }, } @@ -50,21 +50,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(exporter.Logs) require.True(t, ok) diff --git a/exporter/carbonexporter/go.mod b/exporter/carbonexporter/go.mod index 3f3fdfb62ed4..2ae6142a4de9 100644 --- a/exporter/carbonexporter/go.mod +++ b/exporter/carbonexporter/go.mod @@ -1,65 +1,69 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/carbonexporter -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/confignet v0.102.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/confignet v1.22.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/semconv v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/multierr v1.11.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/consumer v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/consumer v1.22.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/carbonexporter/go.sum b/exporter/carbonexporter/go.sum index 906bfd459e0c..f90629c95941 100644 --- a/exporter/carbonexporter/go.sum +++ b/exporter/carbonexporter/go.sum @@ -1,21 +1,19 @@ -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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -31,8 +29,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -48,62 +46,74 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/confignet v0.102.0 h1:+wQevJ/iBnPxL+roY7WWnAjMxB8v4M5QrS3+0iEmauw= -go.opentelemetry.io/collector/config/confignet v0.102.0/go.mod h1:pfOrCTfSZEB6H2rKtx41/3RN4dKs+X2EKQbw3MGRh0E= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/confignet v1.22.0 h1:SBEMHJZWD8J4qgFw1O+BEkXW9AWldDi6Fz5YeDeoU58= +go.opentelemetry.io/collector/config/confignet v1.22.0/go.mod h1:ZppUH1hgUJOubawEsxsQ9MzEYFytqo2GnVSS7d4CVxc= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -119,20 +129,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -141,12 +151,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/exporter/carbonexporter/internal/metadata/generated_status.go b/exporter/carbonexporter/internal/metadata/generated_status.go index 8b9d83f0df31..3c1ad835e6c7 100644 --- a/exporter/carbonexporter/internal/metadata/generated_status.go +++ b/exporter/carbonexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("carbon") + Type = component.MustNewType("carbon") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/carbonexporter" ) const ( diff --git a/exporter/carbonexporter/internal/metadata/generated_telemetry.go b/exporter/carbonexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index 5229f083c5f8..000000000000 --- a/exporter/carbonexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/carbon") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/carbon") -} diff --git a/exporter/carbonexporter/internal/metadata/generated_telemetry_test.go b/exporter/carbonexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index a99d25ed15a5..000000000000 --- a/exporter/carbonexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/carbon", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/carbon", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/carbonexporter/metadata.yaml b/exporter/carbonexporter/metadata.yaml index 095bd468b687..72671f29e7f7 100644 --- a/exporter/carbonexporter/metadata.yaml +++ b/exporter/carbonexporter/metadata.yaml @@ -1,5 +1,4 @@ type: carbon -scope_name: otelcol/carbon status: class: exporter diff --git a/exporter/cassandraexporter/README.md b/exporter/cassandraexporter/README.md index 3795554f2874..98b5b9584f34 100644 --- a/exporter/cassandraexporter/README.md +++ b/exporter/cassandraexporter/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fcassandra%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fcassandra) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fcassandra%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fcassandra) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@atoulme](https://www.github.com/atoulme), [@emreyalvac](https://www.github.com/emreyalvac) | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib diff --git a/exporter/cassandraexporter/config_test.go b/exporter/cassandraexporter/config_test.go index 3459addb7548..a00d6d21e7af 100644 --- a/exporter/cassandraexporter/config_test.go +++ b/exporter/cassandraexporter/config_test.go @@ -15,8 +15,10 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/cassandraexporter/internal/metadata" ) -const defaultDSN = "127.0.0.1" -const defaultPort = 9042 +const ( + defaultDSN = "127.0.0.1" + defaultPort = 9042 +) func TestLoadConfig(t *testing.T) { t.Parallel() @@ -32,7 +34,6 @@ func TestLoadConfig(t *testing.T) { id component.ID expected component.Config }{ - { id: component.NewIDWithName(metadata.Type, ""), expected: defaultCfg, @@ -46,7 +47,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) diff --git a/exporter/cassandraexporter/exporter_logs.go b/exporter/cassandraexporter/exporter_logs.go index dd4b97ae98b6..b9c2b66032c0 100644 --- a/exporter/cassandraexporter/exporter_logs.go +++ b/exporter/cassandraexporter/exporter_logs.go @@ -25,7 +25,6 @@ type logsExporter struct { } func newLogsExporter(logger *zap.Logger, cfg *Config) *logsExporter { - return &logsExporter{logger: logger, cfg: cfg} } diff --git a/exporter/cassandraexporter/factory.go b/exporter/cassandraexporter/factory.go index 1ecee18dd7f7..4a5fe7eee7eb 100644 --- a/exporter/cassandraexporter/factory.go +++ b/exporter/cassandraexporter/factory.go @@ -40,16 +40,16 @@ func createDefaultConfig() component.Config { } } -func createTracesExporter(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (exporter.Traces, error) { +func createTracesExporter(ctx context.Context, set exporter.Settings, cfg component.Config) (exporter.Traces, error) { c := cfg.(*Config) exp := newTracesExporter(set.Logger, c) - return exporterhelper.NewTracesExporter(ctx, set, cfg, exp.pushTraceData, exporterhelper.WithShutdown(exp.Shutdown), exporterhelper.WithStart(exp.Start)) + return exporterhelper.NewTraces(ctx, set, cfg, exp.pushTraceData, exporterhelper.WithShutdown(exp.Shutdown), exporterhelper.WithStart(exp.Start)) } -func createLogsExporter(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (exporter.Logs, error) { +func createLogsExporter(ctx context.Context, set exporter.Settings, cfg component.Config) (exporter.Logs, error) { c := cfg.(*Config) exp := newLogsExporter(set.Logger, c) - return exporterhelper.NewLogsExporter(ctx, set, cfg, exp.pushLogsData, exporterhelper.WithShutdown(exp.Shutdown), exporterhelper.WithStart(exp.Start)) + return exporterhelper.NewLogs(ctx, set, cfg, exp.pushLogsData, exporterhelper.WithShutdown(exp.Shutdown), exporterhelper.WithStart(exp.Start)) } diff --git a/exporter/cassandraexporter/generated_component_test.go b/exporter/cassandraexporter/generated_component_test.go index c8e665a3055b..02f126072861 100644 --- a/exporter/cassandraexporter/generated_component_test.go +++ b/exporter/cassandraexporter/generated_component_test.go @@ -32,20 +32,20 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -57,9 +57,9 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) diff --git a/exporter/cassandraexporter/go.mod b/exporter/cassandraexporter/go.mod index 2abf833689f0..d85bc8433f76 100644 --- a/exporter/cassandraexporter/go.mod +++ b/exporter/cassandraexporter/go.mod @@ -1,64 +1,70 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/cassandraexporter -go 1.21.0 +go 1.22.0 require ( - github.com/gocql/gocql v1.6.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/gocql/gocql v1.7.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect + github.com/hashicorp/go-version v1.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configretry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/consumer v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + go.opentelemetry.io/collector/config/configretry v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/consumer v1.22.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/cassandraexporter/go.sum b/exporter/cassandraexporter/go.sum index 174d69627e2a..de6e4ba31bd3 100644 --- a/exporter/cassandraexporter/go.sum +++ b/exporter/cassandraexporter/go.sum @@ -1,27 +1,25 @@ -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/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/gocql/gocql v1.6.0 h1:IdFdOTbnpbd0pDhl4REKQDM+Q0SzKXQ1Yh+YZZ8T/qU= -github.com/gocql/gocql v1.6.0/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gocql/gocql v1.7.0 h1:O+7U7/1gSN7QTEAaMEsJc1Oq2QHXvCWoF3DFK9HDHus= +github.com/gocql/gocql v1.7.0/go.mod h1:vnlvXyFZeLBF0Wy+RS8hrOdbn0UWsWtdg07XJnFxZ+4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -32,6 +30,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -40,8 +40,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -60,58 +60,72 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -127,20 +141,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -149,12 +163,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/exporter/cassandraexporter/internal/metadata/generated_status.go b/exporter/cassandraexporter/internal/metadata/generated_status.go index bc23711b7620..462bd94e919b 100644 --- a/exporter/cassandraexporter/internal/metadata/generated_status.go +++ b/exporter/cassandraexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("cassandra") + Type = component.MustNewType("cassandra") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/cassandraexporter" ) const ( diff --git a/exporter/cassandraexporter/internal/metadata/generated_telemetry.go b/exporter/cassandraexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index 821c1bcb44d9..000000000000 --- a/exporter/cassandraexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/cassandra") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/cassandra") -} diff --git a/exporter/cassandraexporter/internal/metadata/generated_telemetry_test.go b/exporter/cassandraexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 514739d7fb20..000000000000 --- a/exporter/cassandraexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/cassandra", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/cassandra", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/cassandraexporter/metadata.yaml b/exporter/cassandraexporter/metadata.yaml index 945c04a21e3d..fe1aadab9901 100644 --- a/exporter/cassandraexporter/metadata.yaml +++ b/exporter/cassandraexporter/metadata.yaml @@ -1,5 +1,4 @@ type: cassandra -scope_name: otelcol/cassandra status: class: exporter diff --git a/exporter/clickhouseexporter/README.md b/exporter/clickhouseexporter/README.md index c6d4928be6ab..aa8d8ea9808d 100644 --- a/exporter/clickhouseexporter/README.md +++ b/exporter/clickhouseexporter/README.md @@ -3,12 +3,14 @@ | Status | | | ------------- |-----------| -| Stability | [alpha]: traces, metrics, logs | +| Stability | [alpha]: metrics | +| | [beta]: traces, logs | | Distributions | [contrib] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fclickhouse%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fclickhouse) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fclickhouse%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fclickhouse) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@hanjm](https://www.github.com/hanjm), [@dmitryax](https://www.github.com/dmitryax), [@Frapschen](https://www.github.com/Frapschen), [@SpencerTorres](https://www.github.com/SpencerTorres) | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib @@ -29,21 +31,23 @@ as [ClickHouse document says:](https://clickhouse.com/docs/en/introduction/perfo > We recommend inserting data in packets of at least 1000 rows, or no more than a single request per second. When > inserting to a MergeTree table from a tab-separated dump, the insertion speed can be from 50 to 200 MB/s. -## User Cases +## Visualization Tools -1. Use [Grafana Clickhouse datasource](https://grafana.com/grafana/plugins/grafana-clickhouse-datasource/) or - [vertamedia-clickhouse-datasource](https://grafana.com/grafana/plugins/vertamedia-clickhouse-datasource/) to make - dashboard. - Support time-series graph, table and logs. +#### Official ClickHouse Plugin for Grafana -2. Analyze logs via powerful clickhouse SQL. +The official [ClickHouse Datasource for Grafana](https://grafana.com/grafana/plugins/grafana-clickhouse-datasource/) contains features that integrate directly with this exporter. +You can view associated [logs](https://clickhouse.com/docs/en/integrations/grafana/query-builder#logs) and [traces](https://clickhouse.com/docs/en/integrations/grafana/query-builder#traces), as well as visualize other queries such as tables and time series graphs. Learn how to configure the OpenTelemetry integration [here](https://clickhouse.com/docs/en/integrations/grafana/config#opentelemetry). + +#### Altinity's ClickHouse Plugin for Grafana + +If the official plugin doesn't meet your needs, you can try the [Altinity plugin for ClickHouse](https://grafana.com/grafana/plugins/vertamedia-clickhouse-datasource/), which also supports a wide range of features. ### Logs - Get log severity count time series. -```clickhouse -SELECT toDateTime(toStartOfInterval(Timestamp, INTERVAL 60 second)) as time, SeverityText, count() as count +```sql +SELECT toDateTime(toStartOfInterval(TimestampTime, INTERVAL 60 second)) as time, SeverityText, count() as count FROM otel_logs WHERE time >= NOW() - INTERVAL 1 HOUR GROUP BY SeverityText, time @@ -52,70 +56,70 @@ ORDER BY time; - Find any log. -```clickhouse +```sql SELECT Timestamp as log_time, Body FROM otel_logs -WHERE Timestamp >= NOW() - INTERVAL 1 HOUR +WHERE TimestampTime >= NOW() - INTERVAL 1 HOUR Limit 100; ``` - Find log with specific service. -```clickhouse +```sql SELECT Timestamp as log_time, Body FROM otel_logs WHERE ServiceName = 'clickhouse-exporter' - AND Timestamp >= NOW() - INTERVAL 1 HOUR + AND TimestampTime >= NOW() - INTERVAL 1 HOUR Limit 100; ``` - Find log with specific attribute. -```clickhouse +```sql SELECT Timestamp as log_time, Body FROM otel_logs WHERE LogAttributes['container_name'] = '/example_flog_1' - AND Timestamp >= NOW() - INTERVAL 1 HOUR + AND TimestampTime >= NOW() - INTERVAL 1 HOUR Limit 100; ``` - Find log with body contain string token. -```clickhouse +```sql SELECT Timestamp as log_time, Body FROM otel_logs WHERE hasToken(Body, 'http') - AND Timestamp >= NOW() - INTERVAL 1 HOUR + AND TimestampTime >= NOW() - INTERVAL 1 HOUR Limit 100; ``` - Find log with body contain string. -```clickhouse +```sql SELECT Timestamp as log_time, Body FROM otel_logs WHERE Body like '%http%' - AND Timestamp >= NOW() - INTERVAL 1 HOUR + AND TimestampTime >= NOW() - INTERVAL 1 HOUR Limit 100; ``` - Find log with body regexp match string. -```clickhouse +```sql SELECT Timestamp as log_time, Body FROM otel_logs WHERE match(Body, 'http') - AND Timestamp >= NOW() - INTERVAL 1 HOUR + AND TimestampTime >= NOW() - INTERVAL 1 HOUR Limit 100; ``` - Find log with body json extract. -```clickhouse +```sql SELECT Timestamp as log_time, Body FROM otel_logs WHERE JSONExtractFloat(Body, 'bytes') > 1000 - AND Timestamp >= NOW() - INTERVAL 1 HOUR + AND TimestampTime >= NOW() - INTERVAL 1 HOUR Limit 100; ``` @@ -123,8 +127,8 @@ Limit 100; - Find spans with specific attribute. -```clickhouse -SELECT Timestamp as log_time, +```sql +SELECT Timestamp, TraceId, SpanId, ParentSpanId, @@ -147,12 +151,12 @@ Limit 100; - Find traces with traceID (using time primary index and TraceID skip index). -```clickhouse +```sql WITH '391dae938234560b16bb63f51501cb6f' as trace_id, (SELECT min(Start) FROM otel_traces_trace_id_ts WHERE TraceId = trace_id) as start, (SELECT max(End) + 1 FROM otel_traces_trace_id_ts WHERE TraceId = trace_id) as end -SELECT Timestamp as log_time, +SELECT Timestamp, TraceId, SpanId, ParentSpanId, @@ -175,8 +179,8 @@ Limit 100; - Find spans is error. -```clickhouse -SELECT Timestamp as log_time, +```sql +SELECT Timestamp, TraceId, SpanId, ParentSpanId, @@ -192,15 +196,15 @@ SELECT Timestamp as log_time, toString(Links.TraceId) FROM otel_traces WHERE ServiceName = 'clickhouse-exporter' - AND StatusCode = 'STATUS_CODE_ERROR' + AND StatusCode = 'Error' AND Timestamp >= NOW() - INTERVAL 1 HOUR Limit 100; ``` - Find slow spans. -```clickhouse -SELECT Timestamp as log_time, +```sql +SELECT Timestamp, TraceId, SpanId, ParentSpanId, @@ -240,15 +244,15 @@ Prometheus(or someone else uses OpenMetrics protocol), you also need to know the between Prometheus(OpenMetrics) and OTLP Metrics. - Find a sum metrics with name -```clickhouse +```sql select TimeUnix,MetricName,Attributes,Value from otel_metrics_sum -where MetricName='calls_total' limit 100 +where MetricName='calls' limit 100 ``` - Find a sum metrics with name, attribute. -```clickhouse +```sql select TimeUnix,MetricName,Attributes,Value from otel_metrics_sum -where MetricName='calls_total' and Attributes['service_name']='featureflagservice' +where MetricName='calls' and Attributes['service_name']='featureflagservice' limit 100 ``` @@ -279,17 +283,28 @@ Connection options: - `username` (default = ): The authentication username. - `password` (default = ): The authentication password. -- `connection_params` (default = {}). Params is the extra connection parameters with map format. -- `ttl_days` (default = 0): **Deprecated: Use 'ttl' instead.** The data time-to-live in days, 0 means no ttl. - `ttl` (default = 0): The data time-to-live example 30m, 48h. Also, 0 means no ttl. -- `database` (default = otel): The database name. +- `database` (default = default): The database name. Overrides the database defined in `endpoint` when this setting is not equal to `default`. +- `connection_params` (default = {}). Params is the extra connection parameters with map format. Query parameters provided in `endpoint` will be individually overwritten if present in this map. - `create_schema` (default = true): When set to true, will run DDL to create the database and tables. (See [schema management](#schema-management)) +- `compress` (default = lz4): Controls the compression algorithm. Valid options: `none` (disabled), `zstd`, `lz4` (default), `gzip`, `deflate`, `br`, `true` (lz4). Ignored if `compress` is set in the `endpoint` or `connection_params`. +- `async_insert` (default = true): Enables [async inserts](https://clickhouse.com/docs/en/optimize/asynchronous-inserts). Ignored if async inserts are configured in the `endpoint` or `connection_params`. Async inserts may still be overridden server-side. ClickHouse tables: - `logs_table_name` (default = otel_logs): The table name for logs. - `traces_table_name` (default = otel_traces): The table name for traces. -- `metrics_table_name` (default = otel_metrics): The table name for metrics. +- `metrics_tables` + - `gauge` + - `name` (default = "otel_metrics_gauge") + - `sum` + - `name` (default = "otel_metrics_sum") + - `summary` + - `name` (default = "otel_metrics_summary") + - `histogram` + - `name` (default = "otel_metrics_histogram") + - `exponential_histogram` + - `name` (default = "otel_metrics_exp_histogram") Cluster definition: @@ -308,6 +323,8 @@ Processing: - `timeout` (default = 5s): The timeout for every attempt to send data to the backend. - `sending_queue` + - `enabled` (default = true) + - `num_consumers` (default = 10): Number of consumers that dequeue batches; ignored if `enabled` is `false` - `queue_size` (default = 1000): Maximum number of batches kept in memory before dropping data. - `retry_on_failure` - `enabled` (default = true) @@ -350,14 +367,26 @@ processors: send_batch_size: 100000 exporters: clickhouse: - endpoint: tcp://127.0.0.1:9000?dial_timeout=10s&compress=lz4 + endpoint: tcp://127.0.0.1:9000?dial_timeout=10s database: otel + async_insert: true ttl: 72h + compress: lz4 create_schema: true logs_table_name: otel_logs traces_table_name: otel_traces - metrics_table_name: otel_metrics timeout: 5s + metrics_tables: + gauge: + name: "otel_metrics_gauge" + sum: + name: "otel_metrics_sum" + summary: + name: "otel_metrics_summary" + histogram: + name: "otel_metrics_histogram" + exponential_histogram: + name: "otel_metrics_exp_histogram" retry_on_failure: enabled: true initial_interval: 5s diff --git a/exporter/clickhouseexporter/config.go b/exporter/clickhouseexporter/config.go index 06eb80aae4a0..05ddf2e09903 100644 --- a/exporter/clickhouseexporter/config.go +++ b/exporter/clickhouseexporter/config.go @@ -14,13 +14,15 @@ import ( "go.opentelemetry.io/collector/config/configopaque" "go.opentelemetry.io/collector/config/configretry" "go.opentelemetry.io/collector/exporter/exporterhelper" + + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/clickhouseexporter/internal" ) // Config defines configuration for Elastic exporter. type Config struct { - exporterhelper.TimeoutSettings `mapstructure:",squash"` - configretry.BackOffConfig `mapstructure:"retry_on_failure"` - exporterhelper.QueueSettings `mapstructure:"sending_queue"` + TimeoutSettings exporterhelper.TimeoutConfig `mapstructure:",squash"` + configretry.BackOffConfig `mapstructure:"retry_on_failure"` + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` // Endpoint is the clickhouse endpoint. Endpoint string `mapstructure:"endpoint"` @@ -37,10 +39,11 @@ type Config struct { // TracesTableName is the table name for traces. default is `otel_traces`. TracesTableName string `mapstructure:"traces_table_name"` // MetricsTableName is the table name for metrics. default is `otel_metrics`. + // + // Deprecated: MetricsTableName exists for historical compatibility + // and should not be used. To set the metrics tables name, + // use the MetricsTables parameter instead. MetricsTableName string `mapstructure:"metrics_table_name"` - // TTLDays is The data time-to-live in days, 0 means no ttl. - // Deprecated: Use 'ttl' instead - TTLDays uint `mapstructure:"ttl_days"` // TTL is The data time-to-live example 30m, 48h. 0 means no ttl. TTL time.Duration `mapstructure:"ttl"` // TableEngine is the table engine to use. default is `MergeTree()`. @@ -48,7 +51,28 @@ type Config struct { // ClusterName if set will append `ON CLUSTER` with the provided name when creating tables. ClusterName string `mapstructure:"cluster_name"` // CreateSchema if set to true will run the DDL for creating the database and tables. default is true. - CreateSchema *bool `mapstructure:"create_schema"` + CreateSchema bool `mapstructure:"create_schema"` + // Compress controls the compression algorithm. Valid options: `none` (disabled), `zstd`, `lz4` (default), `gzip`, `deflate`, `br`, `true` (lz4). + Compress string `mapstructure:"compress"` + // AsyncInsert if true will enable async inserts. Default is `true`. + // Ignored if async inserts are configured in the `endpoint` or `connection_params`. + // Async inserts may still be overridden server-side. + AsyncInsert bool `mapstructure:"async_insert"` + // MetricsTables defines the table names for metric types. + MetricsTables MetricTablesConfig `mapstructure:"metrics_tables"` +} + +type MetricTablesConfig struct { + // Gauge is the table name for gauge metric type. default is `otel_metrics_gauge`. + Gauge internal.MetricTypeConfig `mapstructure:"gauge"` + // Sum is the table name for sum metric type. default is `otel_metrics_sum`. + Sum internal.MetricTypeConfig `mapstructure:"sum"` + // Summary is the table name for summary metric type. default is `otel_metrics_summary`. + Summary internal.MetricTypeConfig `mapstructure:"summary"` + // Histogram is the table name for histogram metric type. default is `otel_metrics_histogram`. + Histogram internal.MetricTypeConfig `mapstructure:"histogram"` + // ExponentialHistogram is the table name for exponential histogram metric type. default is `otel_metrics_exponential_histogram`. + ExponentialHistogram internal.MetricTypeConfig `mapstructure:"exponential_histogram"` } // TableEngine defines the ENGINE string value when creating the table. @@ -57,13 +81,20 @@ type TableEngine struct { Params string `mapstructure:"params"` } -const defaultDatabase = "default" -const defaultTableEngineName = "MergeTree" +const ( + defaultDatabase = "default" + defaultTableEngineName = "MergeTree" + defaultMetricTableName = "otel_metrics" + defaultGaugeSuffix = "_gauge" + defaultSumSuffix = "_sum" + defaultSummarySuffix = "_summary" + defaultHistogramSuffix = "_histogram" + defaultExpHistogramSuffix = "_exponential_histogram" +) var ( errConfigNoEndpoint = errors.New("endpoint must be specified") errConfigInvalidEndpoint = errors.New("endpoint must be url format") - errConfigTTL = errors.New("both 'ttl_days' and 'ttl' can not be provided. 'ttl_days' is deprecated, use 'ttl' instead") ) // Validate the ClickHouse server configuration. @@ -71,14 +102,12 @@ func (cfg *Config) Validate() (err error) { if cfg.Endpoint == "" { err = errors.Join(err, errConfigNoEndpoint) } - dsn, e := cfg.buildDSN(cfg.Database) + dsn, e := cfg.buildDSN() if e != nil { err = errors.Join(err, e) } - if cfg.TTL > 0 && cfg.TTLDays > 0 { - err = errors.Join(err, errConfigTTL) - } + cfg.buildMetricTableNames() // Validate DSN with clickhouse driver. // Last chance to catch invalid config. @@ -89,7 +118,7 @@ func (cfg *Config) Validate() (err error) { return err } -func (cfg *Config) buildDSN(database string) (string, error) { +func (cfg *Config) buildDSN() (string, error) { dsnURL, err := url.Parse(cfg.Endpoint) if err != nil { return "", fmt.Errorf("%w: %s", errConfigInvalidEndpoint, err.Error()) @@ -107,19 +136,20 @@ func (cfg *Config) buildDSN(database string) (string, error) { queryParams.Set("secure", "true") } - // Override database if specified in config. - if cfg.Database != "" { - dsnURL.Path = cfg.Database + // Use async_insert from config if not specified in DSN. + if !queryParams.Has("async_insert") { + queryParams.Set("async_insert", fmt.Sprintf("%t", cfg.AsyncInsert)) } - // Override database if specified in database param. - if database != "" { - dsnURL.Path = database + if !queryParams.Has("compress") && (cfg.Compress == "" || cfg.Compress == "true") { + queryParams.Set("compress", "lz4") + } else if !queryParams.Has("compress") { + queryParams.Set("compress", cfg.Compress) } - // Use default database if not specified in any other place. - if database == "" && cfg.Database == "" && dsnURL.Path == "" { - dsnURL.Path = defaultDatabase + // Use database from config if not specified in path, or if config is not default. + if dsnURL.Path == "" || cfg.Database != defaultDatabase { + dsnURL.Path = cfg.Database } // Override username and password if specified in config. @@ -132,8 +162,8 @@ func (cfg *Config) buildDSN(database string) (string, error) { return dsnURL.String(), nil } -func (cfg *Config) buildDB(database string) (*sql.DB, error) { - dsn, err := cfg.buildDSN(database) +func (cfg *Config) buildDB() (*sql.DB, error) { + dsn, err := cfg.buildDSN() if err != nil { return nil, err } @@ -149,17 +179,45 @@ func (cfg *Config) buildDB(database string) (*sql.DB, error) { return conn, nil } -// ShouldCreateSchema returns true if the exporter should run the DDL for creating database/tables. -func (cfg *Config) ShouldCreateSchema() bool { - if cfg.CreateSchema == nil { - return true // default to true +// shouldCreateSchema returns true if the exporter should run the DDL for creating database/tables. +func (cfg *Config) shouldCreateSchema() bool { + return cfg.CreateSchema +} + +func (cfg *Config) buildMetricTableNames() { + tableName := defaultMetricTableName + + if len(cfg.MetricsTableName) != 0 && !cfg.areMetricTableNamesSet() { + tableName = cfg.MetricsTableName + } + + if len(cfg.MetricsTables.Gauge.Name) == 0 { + cfg.MetricsTables.Gauge.Name = tableName + defaultGaugeSuffix + } + if len(cfg.MetricsTables.Sum.Name) == 0 { + cfg.MetricsTables.Sum.Name = tableName + defaultSumSuffix } + if len(cfg.MetricsTables.Summary.Name) == 0 { + cfg.MetricsTables.Summary.Name = tableName + defaultSummarySuffix + } + if len(cfg.MetricsTables.Histogram.Name) == 0 { + cfg.MetricsTables.Histogram.Name = tableName + defaultHistogramSuffix + } + if len(cfg.MetricsTables.ExponentialHistogram.Name) == 0 { + cfg.MetricsTables.ExponentialHistogram.Name = tableName + defaultExpHistogramSuffix + } +} - return *cfg.CreateSchema +func (cfg *Config) areMetricTableNamesSet() bool { + return len(cfg.MetricsTables.Gauge.Name) != 0 || + len(cfg.MetricsTables.Sum.Name) != 0 || + len(cfg.MetricsTables.Summary.Name) != 0 || + len(cfg.MetricsTables.Histogram.Name) != 0 || + len(cfg.MetricsTables.ExponentialHistogram.Name) != 0 } -// TableEngineString generates the ENGINE string. -func (cfg *Config) TableEngineString() string { +// tableEngineString generates the ENGINE string. +func (cfg *Config) tableEngineString() string { engine := cfg.TableEngine.Name params := cfg.TableEngine.Params @@ -171,8 +229,8 @@ func (cfg *Config) TableEngineString() string { return fmt.Sprintf("%s(%s)", engine, params) } -// ClusterString generates the ON CLUSTER string. Returns empty string if not set. -func (cfg *Config) ClusterString() string { +// clusterString generates the ON CLUSTER string. Returns empty string if not set. +func (cfg *Config) clusterString() string { if cfg.ClusterName == "" { return "" } diff --git a/exporter/clickhouseexporter/config_test.go b/exporter/clickhouseexporter/config_test.go index d5d8f95cb67d..b3167ed52fc7 100644 --- a/exporter/clickhouseexporter/config_test.go +++ b/exporter/clickhouseexporter/config_test.go @@ -19,6 +19,7 @@ import ( "go.opentelemetry.io/collector/confmap/confmaptest" "go.opentelemetry.io/collector/exporter/exporterhelper" + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/clickhouseexporter/internal" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/clickhouseexporter/internal/metadata" ) @@ -33,14 +34,12 @@ func TestLoadConfig(t *testing.T) { defaultCfg := createDefaultConfig() defaultCfg.(*Config).Endpoint = defaultEndpoint - createSchema := true storageID := component.MustNewIDWithName("file_storage", "clickhouse") tests := []struct { id component.ID expected component.Config }{ - { id: component.NewIDWithName(metadata.Type, ""), expected: defaultCfg, @@ -48,16 +47,15 @@ func TestLoadConfig(t *testing.T) { { id: component.NewIDWithName(metadata.Type, "full"), expected: &Config{ - Endpoint: defaultEndpoint, - Database: "otel", - Username: "foo", - Password: "bar", - TTL: 72 * time.Hour, - LogsTableName: "otel_logs", - TracesTableName: "otel_traces", - MetricsTableName: "otel_metrics", - CreateSchema: &createSchema, - TimeoutSettings: exporterhelper.TimeoutSettings{ + Endpoint: defaultEndpoint, + Database: "otel", + Username: "foo", + Password: "bar", + TTL: 72 * time.Hour, + LogsTableName: "otel_logs", + TracesTableName: "otel_traces", + CreateSchema: true, + TimeoutSettings: exporterhelper.TimeoutConfig{ Timeout: 5 * time.Second, }, BackOffConfig: configretry.BackOffConfig{ @@ -68,13 +66,21 @@ func TestLoadConfig(t *testing.T) { RandomizationFactor: backoff.DefaultRandomizationFactor, Multiplier: backoff.DefaultMultiplier, }, + MetricsTables: MetricTablesConfig{ + Gauge: internal.MetricTypeConfig{Name: "otel_metrics_custom_gauge"}, + Sum: internal.MetricTypeConfig{Name: "otel_metrics_custom_sum"}, + Summary: internal.MetricTypeConfig{Name: "otel_metrics_custom_summary"}, + Histogram: internal.MetricTypeConfig{Name: "otel_metrics_custom_histogram"}, + ExponentialHistogram: internal.MetricTypeConfig{Name: "otel_metrics_custom_exp_histogram"}, + }, ConnectionParams: map[string]string{}, - QueueSettings: exporterhelper.QueueSettings{ + QueueSettings: exporterhelper.QueueConfig{ Enabled: true, - NumConsumers: 1, + NumConsumers: 10, QueueSize: 100, StorageID: &storageID, }, + AsyncInsert: true, }, }, } @@ -86,7 +92,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) @@ -102,26 +108,168 @@ func withDefaultConfig(fns ...func(*Config)) *Config { return cfg } +func TestBuildMetricMetricTableNames(t *testing.T) { + tests := []struct { + name string + cfg Config + want Config + }{ + { + name: "nothing set", + cfg: Config{}, + want: Config{ + MetricsTables: MetricTablesConfig{ + Gauge: internal.MetricTypeConfig{Name: "otel_metrics_gauge"}, + Sum: internal.MetricTypeConfig{Name: "otel_metrics_sum"}, + Summary: internal.MetricTypeConfig{Name: "otel_metrics_summary"}, + Histogram: internal.MetricTypeConfig{Name: "otel_metrics_histogram"}, + ExponentialHistogram: internal.MetricTypeConfig{Name: "otel_metrics_exponential_histogram"}, + }, + }, + }, + { + name: "only metric_table_name set", + cfg: Config{ + MetricsTableName: "table_name", + }, + want: Config{ + MetricsTableName: "table_name", + MetricsTables: MetricTablesConfig{ + Gauge: internal.MetricTypeConfig{Name: "table_name_gauge"}, + Sum: internal.MetricTypeConfig{Name: "table_name_sum"}, + Summary: internal.MetricTypeConfig{Name: "table_name_summary"}, + Histogram: internal.MetricTypeConfig{Name: "table_name_histogram"}, + ExponentialHistogram: internal.MetricTypeConfig{Name: "table_name_exponential_histogram"}, + }, + }, + }, + { + name: "only metric_tables set fully", + cfg: Config{ + MetricsTables: MetricTablesConfig{ + Gauge: internal.MetricTypeConfig{Name: "table_name_gauge"}, + Sum: internal.MetricTypeConfig{Name: "table_name_sum"}, + Summary: internal.MetricTypeConfig{Name: "table_name_summary"}, + Histogram: internal.MetricTypeConfig{Name: "table_name_histogram"}, + ExponentialHistogram: internal.MetricTypeConfig{Name: "table_name_exponential_histogram"}, + }, + }, + want: Config{ + MetricsTables: MetricTablesConfig{ + Gauge: internal.MetricTypeConfig{Name: "table_name_gauge"}, + Sum: internal.MetricTypeConfig{Name: "table_name_sum"}, + Summary: internal.MetricTypeConfig{Name: "table_name_summary"}, + Histogram: internal.MetricTypeConfig{Name: "table_name_histogram"}, + ExponentialHistogram: internal.MetricTypeConfig{Name: "table_name_exponential_histogram"}, + }, + }, + }, + { + name: "only metric_tables set partially", + cfg: Config{ + MetricsTables: MetricTablesConfig{ + Summary: internal.MetricTypeConfig{Name: "table_name_summary"}, + Histogram: internal.MetricTypeConfig{Name: "table_name_histogram"}, + ExponentialHistogram: internal.MetricTypeConfig{Name: "table_name_exp_histogram"}, + }, + }, + want: Config{ + MetricsTables: MetricTablesConfig{ + Gauge: internal.MetricTypeConfig{Name: "otel_metrics_gauge"}, + Sum: internal.MetricTypeConfig{Name: "otel_metrics_sum"}, + Summary: internal.MetricTypeConfig{Name: "table_name_summary"}, + Histogram: internal.MetricTypeConfig{Name: "table_name_histogram"}, + ExponentialHistogram: internal.MetricTypeConfig{Name: "table_name_exp_histogram"}, + }, + }, + }, + { + name: "only metric_tables set partially with metric_table_name", + cfg: Config{ + MetricsTableName: "custom_name", + MetricsTables: MetricTablesConfig{ + Summary: internal.MetricTypeConfig{Name: "table_name_summary"}, + Histogram: internal.MetricTypeConfig{Name: "table_name_histogram"}, + ExponentialHistogram: internal.MetricTypeConfig{Name: "table_name_exp_histogram"}, + }, + }, + want: Config{ + MetricsTableName: "custom_name", + MetricsTables: MetricTablesConfig{ + Gauge: internal.MetricTypeConfig{Name: "otel_metrics_gauge"}, + Sum: internal.MetricTypeConfig{Name: "otel_metrics_sum"}, + Summary: internal.MetricTypeConfig{Name: "table_name_summary"}, + Histogram: internal.MetricTypeConfig{Name: "table_name_histogram"}, + ExponentialHistogram: internal.MetricTypeConfig{Name: "table_name_exp_histogram"}, + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tt.cfg.buildMetricTableNames() + require.Equal(t, tt.want, tt.cfg) + }) + } +} + +func TestAreMetricTableNamesSet(t *testing.T) { + cfg := Config{} + require.False(t, cfg.areMetricTableNamesSet()) + + cfg = Config{ + MetricsTables: MetricTablesConfig{ + Gauge: internal.MetricTypeConfig{Name: "gauge"}, + }, + } + require.True(t, cfg.areMetricTableNamesSet()) +} + func TestConfig_buildDSN(t *testing.T) { type fields struct { Endpoint string Username string Password string Database string + Compress string ConnectionParams map[string]string + AsyncInsert *bool } - type args struct { - database string + mergeConfigWithFields := func(cfg *Config, fields fields) { + if fields.Endpoint != "" { + cfg.Endpoint = fields.Endpoint + } + if fields.Username != "" { + cfg.Username = fields.Username + } + if fields.Password != "" { + cfg.Password = configopaque.String(fields.Password) + } + if fields.Database != "" { + cfg.Database = fields.Database + } + if fields.ConnectionParams != nil { + cfg.ConnectionParams = fields.ConnectionParams + } + if fields.Compress != "" { + cfg.Compress = fields.Compress + } + if fields.AsyncInsert != nil { + cfg.AsyncInsert = *fields.AsyncInsert + } } + type ChOptions struct { Secure bool DialTimeout time.Duration Compress clickhouse.CompressionMethod } + + configTrue := true + configFalse := false tests := []struct { name string fields fields - args args want string wantChOptions ChOptions wantErr error @@ -131,22 +279,20 @@ func TestConfig_buildDSN(t *testing.T) { fields: fields{ Endpoint: defaultEndpoint, }, - args: args{}, wantChOptions: ChOptions{ Secure: false, }, - want: "clickhouse://127.0.0.1:9000/default", + want: "clickhouse://127.0.0.1:9000/default?async_insert=true&compress=lz4", }, { name: "Support tcp scheme", fields: fields{ Endpoint: "tcp://127.0.0.1:9000", }, - args: args{}, wantChOptions: ChOptions{ Secure: false, }, - want: "tcp://127.0.0.1:9000/default", + want: "tcp://127.0.0.1:9000/default?async_insert=true&compress=lz4", }, { name: "prefers database name from config over from DSN", @@ -156,13 +302,10 @@ func TestConfig_buildDSN(t *testing.T) { Password: "bar", Database: "otel", }, - args: args{ - database: "otel", - }, wantChOptions: ChOptions{ Secure: false, }, - want: "clickhouse://foo:bar@127.0.0.1:9000/otel", + want: "clickhouse://foo:bar@127.0.0.1:9000/otel?async_insert=true&compress=lz4", }, { name: "use database name from DSN if not set in config", @@ -170,15 +313,11 @@ func TestConfig_buildDSN(t *testing.T) { Endpoint: "clickhouse://foo:bar@127.0.0.1:9000/otel", Username: "foo", Password: "bar", - Database: "", - }, - args: args{ - database: "", }, wantChOptions: ChOptions{ Secure: false, }, - want: "clickhouse://foo:bar@127.0.0.1:9000/otel", + want: "clickhouse://foo:bar@127.0.0.1:9000/otel?async_insert=true&compress=lz4", }, { name: "invalid config", @@ -198,32 +337,29 @@ func TestConfig_buildDSN(t *testing.T) { wantChOptions: ChOptions{ Secure: true, }, - args: args{}, - want: "https://127.0.0.1:9000/default?secure=true", + want: "https://127.0.0.1:9000/default?async_insert=true&compress=lz4&secure=true", }, { name: "Preserve query parameters", fields: fields{ - Endpoint: "clickhouse://127.0.0.1:9000?secure=true&foo=bar", + Endpoint: "clickhouse://127.0.0.1:9000?secure=true&compress=lz4&foo=bar", }, wantChOptions: ChOptions{ Secure: true, }, - args: args{}, - want: "clickhouse://127.0.0.1:9000/default?foo=bar&secure=true", + want: "clickhouse://127.0.0.1:9000/default?async_insert=true&compress=lz4&foo=bar&secure=true", }, { name: "Parse clickhouse settings", fields: fields{ - Endpoint: "https://127.0.0.1:9000?secure=true&dial_timeout=30s&compress=lz4", + Endpoint: "https://127.0.0.1:9000?secure=true&dial_timeout=30s&compress=br", }, wantChOptions: ChOptions{ Secure: true, DialTimeout: 30 * time.Second, - Compress: clickhouse.CompressionLZ4, + Compress: clickhouse.CompressionBrotli, }, - args: args{}, - want: "https://127.0.0.1:9000/default?compress=lz4&dial_timeout=30s&secure=true", + want: "https://127.0.0.1:9000/default?async_insert=true&compress=br&dial_timeout=30s&secure=true", }, { name: "Should respect connection parameters", @@ -234,45 +370,141 @@ func TestConfig_buildDSN(t *testing.T) { wantChOptions: ChOptions{ Secure: true, }, - args: args{}, - want: "clickhouse://127.0.0.1:9000/default?foo=bar&secure=true", + want: "clickhouse://127.0.0.1:9000/default?async_insert=true&compress=lz4&foo=bar&secure=true", }, { - name: "support replace database in DSN to default database", + name: "support replace database in DSN with config to override database", fields: fields{ Endpoint: "tcp://127.0.0.1:9000/otel", + Database: "override", }, - args: args{ - database: defaultDatabase, + want: "tcp://127.0.0.1:9000/override?async_insert=true&compress=lz4", + }, + { + name: "when config option is missing, preserve async_insert false in DSN", + fields: fields{ + Endpoint: "tcp://127.0.0.1:9000?async_insert=false", + }, + want: "tcp://127.0.0.1:9000/default?async_insert=false&compress=lz4", + }, + { + name: "when config option is missing, preserve async_insert true in DSN", + fields: fields{ + Endpoint: "tcp://127.0.0.1:9000?async_insert=true", }, - want: "tcp://127.0.0.1:9000/default", + want: "tcp://127.0.0.1:9000/default?async_insert=true&compress=lz4", + }, + { + name: "ignore config option when async_insert is present in connection params as false", + fields: fields{ + Endpoint: "tcp://127.0.0.1:9000?async_insert=false", + ConnectionParams: map[string]string{"async_insert": "false"}, + AsyncInsert: &configTrue, + }, + + want: "tcp://127.0.0.1:9000/default?async_insert=false&compress=lz4", + }, + { + name: "ignore config option when async_insert is present in connection params as true", + fields: fields{ + Endpoint: "tcp://127.0.0.1:9000?async_insert=false", + ConnectionParams: map[string]string{"async_insert": "true"}, + AsyncInsert: &configFalse, + }, + + want: "tcp://127.0.0.1:9000/default?async_insert=true&compress=lz4", + }, + { + name: "ignore config option when async_insert is present in DSN as false", + fields: fields{ + Endpoint: "tcp://127.0.0.1:9000?async_insert=false", + AsyncInsert: &configTrue, + }, + + want: "tcp://127.0.0.1:9000/default?async_insert=false&compress=lz4", + }, + { + name: "use async_insert true config option when it is not present in DSN", + fields: fields{ + Endpoint: "tcp://127.0.0.1:9000", + AsyncInsert: &configTrue, + }, + + want: "tcp://127.0.0.1:9000/default?async_insert=true&compress=lz4", + }, + { + name: "use async_insert false config option when it is not present in DSN", + fields: fields{ + Endpoint: "tcp://127.0.0.1:9000", + AsyncInsert: &configFalse, + }, + + want: "tcp://127.0.0.1:9000/default?async_insert=false&compress=lz4", + }, + { + name: "set async_insert to true when not present in config or DSN", + fields: fields{ + Endpoint: "tcp://127.0.0.1:9000", + }, + + want: "tcp://127.0.0.1:9000/default?async_insert=true&compress=lz4", + }, + { + name: "connection_params takes priority over endpoint and async_insert option.", + fields: fields{ + Endpoint: "tcp://127.0.0.1:9000?async_insert=false", + ConnectionParams: map[string]string{"async_insert": "true"}, + AsyncInsert: &configFalse, + }, + + want: "tcp://127.0.0.1:9000/default?async_insert=true&compress=lz4", + }, + { + name: "use compress br config option when it is not present in DSN", + fields: fields{ + Endpoint: "tcp://127.0.0.1:9000", + Compress: "br", + }, + + want: "tcp://127.0.0.1:9000/default?async_insert=true&compress=br", + }, + { + name: "set compress to lz4 when not present in config or DSN", + fields: fields{ + Endpoint: "tcp://127.0.0.1:9000", + }, + + want: "tcp://127.0.0.1:9000/default?async_insert=true&compress=lz4", + }, + { + name: "connection_params takes priority over endpoint and compress option.", + fields: fields{ + Endpoint: "tcp://127.0.0.1:9000?compress=none", + ConnectionParams: map[string]string{"compress": "br"}, + Compress: "lz4", + }, + want: "tcp://127.0.0.1:9000/default?async_insert=true&compress=br", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - cfg := &Config{ - Endpoint: tt.fields.Endpoint, - Username: tt.fields.Username, - Password: configopaque.String(tt.fields.Password), - Database: tt.fields.Database, - ConnectionParams: tt.fields.ConnectionParams, - } - got, err := cfg.buildDSN(tt.args.database) + cfg := createDefaultConfig().(*Config) + mergeConfigWithFields(cfg, tt.fields) + dsn, err := cfg.buildDSN() if tt.wantErr != nil { - assert.ErrorIs(t, err, tt.wantErr, "buildDSN(%v)", tt.args.database) + assert.ErrorIs(t, err, tt.wantErr, "buildDSN()") } else { // Validate DSN - opts, err := clickhouse.ParseDSN(got) + opts, err := clickhouse.ParseDSN(dsn) assert.NoError(t, err) assert.Equalf(t, tt.wantChOptions.Secure, opts.TLS != nil, "TLSConfig is not nil") assert.Equalf(t, tt.wantChOptions.DialTimeout, opts.DialTimeout, "DialTimeout is not nil") if tt.wantChOptions.Compress != 0 { assert.Equalf(t, tt.wantChOptions.Compress, opts.Compression.Method, "Compress is not nil") } - assert.Equalf(t, tt.want, got, "buildDSN(%v)", tt.args.database) + assert.Equalf(t, tt.want, dsn, "buildDSN()") } - }) } } @@ -280,14 +512,11 @@ func TestConfig_buildDSN(t *testing.T) { func TestShouldCreateSchema(t *testing.T) { t.Parallel() - createSchemaTrue := true - createSchemaFalse := false - caseDefault := createDefaultConfig().(*Config) caseCreateSchemaTrue := createDefaultConfig().(*Config) - caseCreateSchemaTrue.CreateSchema = &createSchemaTrue + caseCreateSchemaTrue.CreateSchema = true caseCreateSchemaFalse := createDefaultConfig().(*Config) - caseCreateSchemaFalse.CreateSchema = &createSchemaFalse + caseCreateSchemaFalse.CreateSchema = false tests := []struct { name string @@ -314,7 +543,7 @@ func TestShouldCreateSchema(t *testing.T) { for _, tt := range tests { t.Run(fmt.Sprintf("ShouldCreateSchema case %s", tt.name), func(t *testing.T) { assert.NoError(t, component.ValidateConfig(tt)) - assert.Equal(t, tt.expected, tt.input.ShouldCreateSchema()) + assert.Equal(t, tt.expected, tt.input.shouldCreateSchema()) }) } } @@ -353,10 +582,10 @@ func TestTableEngineConfigParsing(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) - assert.Equal(t, tt.expected, cfg.(*Config).TableEngineString()) + assert.Equal(t, tt.expected, cfg.(*Config).tableEngineString()) }) } } @@ -389,7 +618,7 @@ func TestClusterString(t *testing.T) { cfg.(*Config).ClusterName = tt.input assert.NoError(t, component.ValidateConfig(cfg)) - assert.Equal(t, tt.expected, cfg.(*Config).ClusterString()) + assert.Equal(t, tt.expected, cfg.(*Config).clusterString()) }) } } diff --git a/exporter/clickhouseexporter/example/default_ddl/histogram_metrics.sql b/exporter/clickhouseexporter/example/default_ddl/histogram_metrics.sql index 2bb789ea05be..055374d6bdc9 100644 --- a/exporter/clickhouseexporter/example/default_ddl/histogram_metrics.sql +++ b/exporter/clickhouseexporter/example/default_ddl/histogram_metrics.sql @@ -29,6 +29,7 @@ CREATE TABLE IF NOT EXISTS otel_metrics_histogram ( Flags UInt32 CODEC(ZSTD(1)), Min Float64 CODEC(ZSTD(1)), Max Float64 CODEC(ZSTD(1)), + AggregationTemporality Int32 CODEC(ZSTD(1)), INDEX idx_res_attr_key mapKeys(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, INDEX idx_res_attr_value mapValues(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, INDEX idx_scope_attr_key mapKeys(ScopeAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, diff --git a/exporter/clickhouseexporter/example/default_ddl/logs.sql b/exporter/clickhouseexporter/example/default_ddl/logs.sql index e98d65defd73..94687073f808 100644 --- a/exporter/clickhouseexporter/example/default_ddl/logs.sql +++ b/exporter/clickhouseexporter/example/default_ddl/logs.sql @@ -1,21 +1,23 @@ -- Default Logs table DDL CREATE TABLE IF NOT EXISTS otel_logs ( - Timestamp DateTime64(9) CODEC(Delta, ZSTD(1)), + Timestamp DateTime64(9) CODEC(Delta(8), ZSTD(1)), + TimestampTime DateTime DEFAULT toDateTime(Timestamp), TraceId String CODEC(ZSTD(1)), SpanId String CODEC(ZSTD(1)), - TraceFlags UInt32 CODEC(ZSTD(1)), + TraceFlags UInt8, SeverityText LowCardinality(String) CODEC(ZSTD(1)), - SeverityNumber Int32 CODEC(ZSTD(1)), + SeverityNumber UInt8, ServiceName LowCardinality(String) CODEC(ZSTD(1)), Body String CODEC(ZSTD(1)), - ResourceSchemaUrl String CODEC(ZSTD(1)), + ResourceSchemaUrl LowCardinality(String) CODEC(ZSTD(1)), ResourceAttributes Map(LowCardinality(String), String) CODEC(ZSTD(1)), - ScopeSchemaUrl String CODEC(ZSTD(1)), + ScopeSchemaUrl LowCardinality(String) CODEC(ZSTD(1)), ScopeName String CODEC(ZSTD(1)), - ScopeVersion String CODEC(ZSTD(1)), + ScopeVersion LowCardinality(String) CODEC(ZSTD(1)), ScopeAttributes Map(LowCardinality(String), String) CODEC(ZSTD(1)), LogAttributes Map(LowCardinality(String), String) CODEC(ZSTD(1)), + INDEX idx_trace_id TraceId TYPE bloom_filter(0.001) GRANULARITY 1, INDEX idx_res_attr_key mapKeys(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, INDEX idx_res_attr_value mapValues(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, @@ -23,9 +25,10 @@ CREATE TABLE IF NOT EXISTS otel_logs ( INDEX idx_scope_attr_value mapValues(ScopeAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, INDEX idx_log_attr_key mapKeys(LogAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, INDEX idx_log_attr_value mapValues(LogAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, - INDEX idx_body Body TYPE tokenbf_v1(32768, 3, 0) GRANULARITY 1 + INDEX idx_body Body TYPE tokenbf_v1(32768, 3, 0) GRANULARITY 8 ) ENGINE = MergeTree() -TTL toDateTime("Timestamp") + toIntervalDay(180) -PARTITION BY toDate(Timestamp) -ORDER BY (ServiceName, SeverityText, toUnixTimestamp(Timestamp), TraceId) -SETTINGS index_granularity=8192, ttl_only_drop_parts = 1; +PARTITION BY toDate(TimestampTime) +PRIMARY KEY (ServiceName, TimestampTime) +ORDER BY (ServiceName, TimestampTime, Timestamp) +TTL TimestampTime + toIntervalDay(180) +SETTINGS index_granularity = 8192, ttl_only_drop_parts = 1; diff --git a/exporter/clickhouseexporter/example/default_ddl/sum_metrics.sql b/exporter/clickhouseexporter/example/default_ddl/sum_metrics.sql index 8cc401961684..c0f47f173dd7 100644 --- a/exporter/clickhouseexporter/example/default_ddl/sum_metrics.sql +++ b/exporter/clickhouseexporter/example/default_ddl/sum_metrics.sql @@ -24,7 +24,7 @@ CREATE TABLE IF NOT EXISTS otel_metrics_sum ( SpanId String, TraceId String ) CODEC(ZSTD(1)), - AggTemp Int32 CODEC(ZSTD(1)), + AggregationTemporality Int32 CODEC(ZSTD(1)), IsMonotonic Boolean CODEC(Delta, ZSTD(1)), INDEX idx_res_attr_key mapKeys(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, INDEX idx_res_attr_value mapValues(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, diff --git a/exporter/clickhouseexporter/example/default_ddl/traces.sql b/exporter/clickhouseexporter/example/default_ddl/traces.sql index a9ecb397bad0..bc4896fcb8db 100644 --- a/exporter/clickhouseexporter/example/default_ddl/traces.sql +++ b/exporter/clickhouseexporter/example/default_ddl/traces.sql @@ -1,40 +1,63 @@ -- Default Trace table DDL CREATE TABLE IF NOT EXISTS otel_traces ( - Timestamp DateTime64(9) CODEC(Delta, ZSTD(1)), - TraceId String CODEC(ZSTD(1)), - SpanId String CODEC(ZSTD(1)), - ParentSpanId String CODEC(ZSTD(1)), - TraceState String CODEC(ZSTD(1)), - SpanName LowCardinality(String) CODEC(ZSTD(1)), - SpanKind LowCardinality(String) CODEC(ZSTD(1)), - ServiceName LowCardinality(String) CODEC(ZSTD(1)), - ResourceAttributes Map(LowCardinality(String), String) CODEC(ZSTD(1)), - ScopeName String CODEC(ZSTD(1)), - ScopeVersion String CODEC(ZSTD(1)), - SpanAttributes Map(LowCardinality(String), String) CODEC(ZSTD(1)), - Duration Int64 CODEC(ZSTD(1)), - StatusCode LowCardinality(String) CODEC(ZSTD(1)), - StatusMessage String CODEC(ZSTD(1)), - Events Nested ( - Timestamp DateTime64(9), - Name LowCardinality(String), - Attributes Map(LowCardinality(String), String) - ) CODEC(ZSTD(1)), - Links Nested ( - TraceId String, - SpanId String, - TraceState String, - Attributes Map(LowCardinality(String), String) - ) CODEC(ZSTD(1)), - INDEX idx_trace_id TraceId TYPE bloom_filter(0.001) GRANULARITY 1, - INDEX idx_res_attr_key mapKeys(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, - INDEX idx_res_attr_value mapValues(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, - INDEX idx_span_attr_key mapKeys(SpanAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, - INDEX idx_span_attr_value mapValues(SpanAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, - INDEX idx_duration Duration TYPE minmax GRANULARITY 1 + Timestamp DateTime64(9) CODEC(Delta, ZSTD(1)), + TraceId String CODEC(ZSTD(1)), + SpanId String CODEC(ZSTD(1)), + ParentSpanId String CODEC(ZSTD(1)), + TraceState String CODEC(ZSTD(1)), + SpanName LowCardinality(String) CODEC(ZSTD(1)), + SpanKind LowCardinality(String) CODEC(ZSTD(1)), + ServiceName LowCardinality(String) CODEC(ZSTD(1)), + ResourceAttributes Map(LowCardinality(String), String) CODEC(ZSTD(1)), + ScopeName String CODEC(ZSTD(1)), + ScopeVersion String CODEC(ZSTD(1)), + SpanAttributes Map(LowCardinality(String), String) CODEC(ZSTD(1)), + Duration UInt64 CODEC(ZSTD(1)), + StatusCode LowCardinality(String) CODEC(ZSTD(1)), + StatusMessage String CODEC(ZSTD(1)), + Events Nested ( + Timestamp DateTime64(9), + Name LowCardinality(String), + Attributes Map(LowCardinality(String), String) + ) CODEC(ZSTD(1)), + Links Nested ( + TraceId String, + SpanId String, + TraceState String, + Attributes Map(LowCardinality(String), String) + ) CODEC(ZSTD(1)), + INDEX idx_trace_id TraceId TYPE bloom_filter(0.001) GRANULARITY 1, + INDEX idx_res_attr_key mapKeys(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_res_attr_value mapValues(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_span_attr_key mapKeys(SpanAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_span_attr_value mapValues(SpanAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_duration Duration TYPE minmax GRANULARITY 1 ) ENGINE = MergeTree() -TTL toDateTime("Timestamp") + toIntervalDay(180) PARTITION BY toDate(Timestamp) -ORDER BY (ServiceName, SpanName, toUnixTimestamp(Timestamp), TraceId) +ORDER BY (ServiceName, SpanName, toDateTime(Timestamp)) +TTL toDate(Timestamp) + toIntervalDay(180) +SETTINGS index_granularity=8192, ttl_only_drop_parts = 1; + + +CREATE TABLE IF NOT EXISTS otel_traces_trace_id_ts ( + TraceId String CODEC(ZSTD(1)), + Start DateTime CODEC(Delta, ZSTD(1)), + End DateTime CODEC(Delta, ZSTD(1)), + INDEX idx_trace_id TraceId TYPE bloom_filter(0.01) GRANULARITY 1 +) ENGINE = MergeTree() +PARTITION BY toDate(Start) +ORDER BY (TraceId, Start) +TTL toDate(Start) + toIntervalDay(180) SETTINGS index_granularity=8192, ttl_only_drop_parts = 1; + + +CREATE MATERIALIZED VIEW IF NOT EXISTS otel_traces_trace_id_ts_mv +TO otel_traces_trace_id_ts +AS SELECT + TraceId, + min(Timestamp) as Start, + max(Timestamp) as End +FROM otel_traces +WHERE TraceId != '' +GROUP BY TraceId; diff --git a/exporter/clickhouseexporter/example/otel-collector-config.yml b/exporter/clickhouseexporter/example/otel-collector-config.yml index e6c13dd5d7b3..535490d19f7b 100644 --- a/exporter/clickhouseexporter/example/otel-collector-config.yml +++ b/exporter/clickhouseexporter/example/otel-collector-config.yml @@ -41,8 +41,6 @@ extensions: health_check: pprof: zpages: - memory_ballast: - size_mib: 1000 service: extensions: [ pprof, zpages, health_check ] diff --git a/exporter/clickhouseexporter/exporter_logs.go b/exporter/clickhouseexporter/exporter_logs.go index b466931a20a0..f57fbf97ee42 100644 --- a/exporter/clickhouseexporter/exporter_logs.go +++ b/exporter/clickhouseexporter/exporter_logs.go @@ -11,11 +11,11 @@ import ( _ "github.com/ClickHouse/clickhouse-go/v2" // For register database driver. "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" - conventions "go.opentelemetry.io/collector/semconv/v1.18.0" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "go.uber.org/zap" + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/clickhouseexporter/internal" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/traceutil" ) @@ -42,7 +42,7 @@ func newLogsExporter(logger *zap.Logger, cfg *Config) (*logsExporter, error) { } func (e *logsExporter) start(ctx context.Context, _ component.Host) error { - if !e.cfg.ShouldCreateSchema() { + if !e.cfg.shouldCreateSchema() { return nil } @@ -71,26 +71,35 @@ func (e *logsExporter) pushLogsData(ctx context.Context, ld plog.Logs) error { defer func() { _ = statement.Close() }() - var serviceName string + for i := 0; i < ld.ResourceLogs().Len(); i++ { logs := ld.ResourceLogs().At(i) res := logs.Resource() resURL := logs.SchemaUrl() - resAttr := attributesToMap(res.Attributes()) + resAttr := internal.AttributesToMap(res.Attributes()) + var serviceName string if v, ok := res.Attributes().Get(conventions.AttributeServiceName); ok { serviceName = v.Str() } + for j := 0; j < logs.ScopeLogs().Len(); j++ { rs := logs.ScopeLogs().At(j).LogRecords() scopeURL := logs.ScopeLogs().At(j).SchemaUrl() scopeName := logs.ScopeLogs().At(j).Scope().Name() scopeVersion := logs.ScopeLogs().At(j).Scope().Version() - scopeAttr := attributesToMap(logs.ScopeLogs().At(j).Scope().Attributes()) + scopeAttr := internal.AttributesToMap(logs.ScopeLogs().At(j).Scope().Attributes()) + for k := 0; k < rs.Len(); k++ { r := rs.At(k) - logAttr := attributesToMap(r.Attributes()) + + timestamp := r.Timestamp() + if timestamp == 0 { + timestamp = r.ObservedTimestamp() + } + + logAttr := internal.AttributesToMap(r.Attributes()) _, err = statement.ExecContext(ctx, - r.Timestamp().AsTime(), + timestamp.AsTime(), traceutil.TraceIDToHexOrEmptyString(r.TraceID()), traceutil.SpanIDToHexOrEmptyString(r.SpanID()), uint32(r.Flags()), @@ -120,47 +129,41 @@ func (e *logsExporter) pushLogsData(ctx context.Context, ld plog.Logs) error { return err } -func attributesToMap(attributes pcommon.Map) map[string]string { - m := make(map[string]string, attributes.Len()) - attributes.Range(func(k string, v pcommon.Value) bool { - m[k] = v.AsString() - return true - }) - return m -} - const ( // language=ClickHouse SQL createLogsTableSQL = ` CREATE TABLE IF NOT EXISTS %s %s ( - Timestamp DateTime64(9) CODEC(Delta, ZSTD(1)), - TraceId String CODEC(ZSTD(1)), - SpanId String CODEC(ZSTD(1)), - TraceFlags UInt32 CODEC(ZSTD(1)), - SeverityText LowCardinality(String) CODEC(ZSTD(1)), - SeverityNumber Int32 CODEC(ZSTD(1)), - ServiceName LowCardinality(String) CODEC(ZSTD(1)), - Body String CODEC(ZSTD(1)), - ResourceSchemaUrl String CODEC(ZSTD(1)), - ResourceAttributes Map(LowCardinality(String), String) CODEC(ZSTD(1)), - ScopeSchemaUrl String CODEC(ZSTD(1)), - ScopeName String CODEC(ZSTD(1)), - ScopeVersion String CODEC(ZSTD(1)), - ScopeAttributes Map(LowCardinality(String), String) CODEC(ZSTD(1)), - LogAttributes Map(LowCardinality(String), String) CODEC(ZSTD(1)), - INDEX idx_trace_id TraceId TYPE bloom_filter(0.001) GRANULARITY 1, - INDEX idx_res_attr_key mapKeys(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, - INDEX idx_res_attr_value mapValues(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, - INDEX idx_scope_attr_key mapKeys(ScopeAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, - INDEX idx_scope_attr_value mapValues(ScopeAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, - INDEX idx_log_attr_key mapKeys(LogAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, - INDEX idx_log_attr_value mapValues(LogAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, - INDEX idx_body Body TYPE tokenbf_v1(32768, 3, 0) GRANULARITY 1 + Timestamp DateTime64(9) CODEC(Delta(8), ZSTD(1)), + TimestampTime DateTime DEFAULT toDateTime(Timestamp), + TraceId String CODEC(ZSTD(1)), + SpanId String CODEC(ZSTD(1)), + TraceFlags UInt8, + SeverityText LowCardinality(String) CODEC(ZSTD(1)), + SeverityNumber UInt8, + ServiceName LowCardinality(String) CODEC(ZSTD(1)), + Body String CODEC(ZSTD(1)), + ResourceSchemaUrl LowCardinality(String) CODEC(ZSTD(1)), + ResourceAttributes Map(LowCardinality(String), String) CODEC(ZSTD(1)), + ScopeSchemaUrl LowCardinality(String) CODEC(ZSTD(1)), + ScopeName String CODEC(ZSTD(1)), + ScopeVersion LowCardinality(String) CODEC(ZSTD(1)), + ScopeAttributes Map(LowCardinality(String), String) CODEC(ZSTD(1)), + LogAttributes Map(LowCardinality(String), String) CODEC(ZSTD(1)), + + INDEX idx_trace_id TraceId TYPE bloom_filter(0.001) GRANULARITY 1, + INDEX idx_res_attr_key mapKeys(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_res_attr_value mapValues(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_scope_attr_key mapKeys(ScopeAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_scope_attr_value mapValues(ScopeAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_log_attr_key mapKeys(LogAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_log_attr_value mapValues(LogAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_body Body TYPE tokenbf_v1(32768, 3, 0) GRANULARITY 8 ) ENGINE = %s +PARTITION BY toDate(TimestampTime) +PRIMARY KEY (ServiceName, TimestampTime) +ORDER BY (ServiceName, TimestampTime, Timestamp) %s -PARTITION BY toDate(Timestamp) -ORDER BY (ServiceName, SeverityText, toUnixTimestamp(Timestamp), TraceId) -SETTINGS index_granularity=8192, ttl_only_drop_parts = 1; +SETTINGS index_granularity = 8192, ttl_only_drop_parts = 1; ` // language=ClickHouse SQL insertLogsSQLTemplate = `INSERT INTO %s ( @@ -202,7 +205,7 @@ var driverName = "clickhouse" // for testing // newClickhouseClient create a clickhouse client. func newClickhouseClient(cfg *Config) (*sql.DB, error) { - db, err := cfg.buildDB(cfg.Database) + db, err := cfg.buildDB() if err != nil { return nil, err } @@ -215,17 +218,17 @@ func createDatabase(ctx context.Context, cfg *Config) error { return nil } - db, err := cfg.buildDB(defaultDatabase) + db, err := cfg.buildDB() if err != nil { return err } defer func() { _ = db.Close() }() - query := fmt.Sprintf("CREATE DATABASE IF NOT EXISTS %s %s", cfg.Database, cfg.ClusterString()) + query := fmt.Sprintf("CREATE DATABASE IF NOT EXISTS %s %s", cfg.Database, cfg.clusterString()) _, err = db.ExecContext(ctx, query) if err != nil { - return fmt.Errorf("create database:%w", err) + return fmt.Errorf("create database: %w", err) } return nil } @@ -238,8 +241,8 @@ func createLogsTable(ctx context.Context, cfg *Config, db *sql.DB) error { } func renderCreateLogsTableSQL(cfg *Config) string { - ttlExpr := generateTTLExpr(cfg.TTLDays, cfg.TTL, "Timestamp") - return fmt.Sprintf(createLogsTableSQL, cfg.LogsTableName, cfg.ClusterString(), cfg.TableEngineString(), ttlExpr) + ttlExpr := generateTTLExpr(cfg.TTL, "TimestampTime") + return fmt.Sprintf(createLogsTableSQL, cfg.LogsTableName, cfg.clusterString(), cfg.tableEngineString(), ttlExpr) } func renderInsertLogsSQL(cfg *Config) string { diff --git a/exporter/clickhouseexporter/exporter_logs_test.go b/exporter/clickhouseexporter/exporter_logs_test.go index aa3ff11acded..39e798dfd003 100644 --- a/exporter/clickhouseexporter/exporter_logs_test.go +++ b/exporter/clickhouseexporter/exporter_logs_test.go @@ -12,10 +12,11 @@ import ( "testing" "time" + "github.com/ClickHouse/clickhouse-go/v2/lib/column/orderedmap" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" - conventions "go.opentelemetry.io/collector/semconv/v1.18.0" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "go.uber.org/zap" "go.uber.org/zap/zaptest" ) @@ -31,17 +32,13 @@ func TestLogsExporter_New(t *testing.T) { _ = func(want error) validate { return func(t *testing.T, exporter *logsExporter, err error) { require.Nil(t, exporter) - require.Error(t, err) - if !errors.Is(err, want) { - t.Fatalf("Expected error '%v', but got '%v'", want, err) - } + require.ErrorIs(t, err, want, "Expected error '%v', but got '%v'", want, err) } } failWithMsg := func(msg string) validate { return func(t *testing.T, _ *logsExporter, err error) { - require.Error(t, err) - require.Contains(t, err.Error(), msg) + require.ErrorContains(t, err, msg) } } @@ -57,7 +54,6 @@ func TestLogsExporter_New(t *testing.T) { for name, test := range tests { t.Run(name, func(t *testing.T) { - var err error exporter, err := newLogsExporter(zap.NewNop(), test.config) err = errors.Join(err, err) @@ -95,9 +91,9 @@ func TestExporter_pushLogsData(t *testing.T) { initClickhouseTestServer(t, func(query string, values []driver.Value) error { if strings.HasPrefix(query, "INSERT") { require.Equal(t, "https://opentelemetry.io/schemas/1.4.0", values[8]) - require.Equal(t, map[string]string{ + require.Equal(t, orderedmap.FromMap(map[string]string{ "service.name": "test-service", - }, values[9]) + }), values[9]) } return nil }) @@ -110,15 +106,42 @@ func TestExporter_pushLogsData(t *testing.T) { require.Equal(t, "https://opentelemetry.io/schemas/1.7.0", values[10]) require.Equal(t, "io.opentelemetry.contrib.clickhouse", values[11]) require.Equal(t, "1.0.0", values[12]) - require.Equal(t, map[string]string{ + require.Equal(t, orderedmap.FromMap(map[string]string{ "lib": "clickhouse", - }, values[13]) + }), values[13]) } return nil }) exporter := newTestLogsExporter(t, defaultEndpoint) mustPushLogsData(t, exporter, simpleLogs(1)) }) + t.Run("test with only observed timestamp", func(t *testing.T) { + initClickhouseTestServer(t, func(query string, values []driver.Value) error { + if strings.HasPrefix(query, "INSERT") { + require.NotEqual(t, "0", values[0]) + } + return nil + }) + + exporter := newTestLogsExporter(t, defaultEndpoint) + mustPushLogsData(t, exporter, simpleLogsWithNoTimestamp(1)) + }) + t.Run("test with 2 log records with different service.name", func(t *testing.T) { + initClickhouseTestServer(t, func(query string, values []driver.Value) error { + if strings.HasPrefix(query, "INSERT") { + body, _ := values[7].(string) + if body == "empty ServiceName" { + require.Equal(t, "", values[6]) + } else { + require.Equal(t, "test-service", values[6]) + } + } + return nil + }) + + exporter := newTestLogsExporter(t, defaultEndpoint) + mustPushLogsData(t, exporter, multipleLogsWithDifferentServiceName(1)) + }) } func TestLogsClusterConfig(t *testing.T) { @@ -181,6 +204,55 @@ func simpleLogs(count int) plog.Logs { return logs } +func simpleLogsWithNoTimestamp(count int) plog.Logs { + logs := plog.NewLogs() + rl := logs.ResourceLogs().AppendEmpty() + rl.SetSchemaUrl("https://opentelemetry.io/schemas/1.4.0") + rl.Resource().Attributes().PutStr("service.name", "test-service") + sl := rl.ScopeLogs().AppendEmpty() + sl.SetSchemaUrl("https://opentelemetry.io/schemas/1.7.0") + sl.Scope().SetName("io.opentelemetry.contrib.clickhouse") + sl.Scope().SetVersion("1.0.0") + sl.Scope().Attributes().PutStr("lib", "clickhouse") + timestamp := time.Unix(1703498029, 0) + for i := 0; i < count; i++ { + r := sl.LogRecords().AppendEmpty() + r.SetObservedTimestamp(pcommon.NewTimestampFromTime(timestamp)) + r.SetSeverityNumber(plog.SeverityNumberError2) + r.SetSeverityText("error") + r.Body().SetStr("error message") + r.Attributes().PutStr(conventions.AttributeServiceNamespace, "default") + r.SetFlags(plog.DefaultLogRecordFlags) + r.SetTraceID([16]byte{1, 2, 3, byte(i)}) + r.SetSpanID([8]byte{1, 2, 3, byte(i)}) + } + return logs +} + +func multipleLogsWithDifferentServiceName(count int) plog.Logs { + logs := simpleLogs(count) + rl := logs.ResourceLogs().AppendEmpty() + rl.SetSchemaUrl("https://opentelemetry.io/schemas/1.4.0") + sl := rl.ScopeLogs().AppendEmpty() + sl.SetSchemaUrl("https://opentelemetry.io/schemas/1.7.0") + sl.Scope().SetName("io.opentelemetry.contrib.clickhouse") + sl.Scope().SetVersion("1.0.0") + sl.Scope().Attributes().PutStr("lib", "clickhouse") + timestamp := time.Unix(1703498029, 0) + for i := 0; i < count; i++ { + r := sl.LogRecords().AppendEmpty() + r.SetObservedTimestamp(pcommon.NewTimestampFromTime(timestamp)) + r.SetSeverityNumber(plog.SeverityNumberError2) + r.SetSeverityText("error") + r.Body().SetStr("empty ServiceName") + r.Attributes().PutStr(conventions.AttributeServiceNamespace, "default") + r.SetFlags(plog.DefaultLogRecordFlags) + r.SetTraceID([16]byte{1, 2, 3, byte(i)}) + r.SetSpanID([8]byte{1, 2, 3, byte(i)}) + } + return logs +} + func mustPushLogsData(t *testing.T, exporter *logsExporter, ld plog.Logs) { err := exporter.pushLogsData(context.TODO(), ld) require.NoError(t, err) @@ -249,8 +321,7 @@ func (t *testClickhouseDriverStmt) Query(_ []driver.Value) (driver.Rows, error) return nil, nil } -type testClickhouseDriverTx struct { -} +type testClickhouseDriverTx struct{} func (*testClickhouseDriverTx) Commit() error { return nil diff --git a/exporter/clickhouseexporter/exporter_metrics.go b/exporter/clickhouseexporter/exporter_metrics.go index 0f0dbc02537f..be5696a01855 100644 --- a/exporter/clickhouseexporter/exporter_metrics.go +++ b/exporter/clickhouseexporter/exporter_metrics.go @@ -19,8 +19,9 @@ import ( type metricsExporter struct { client *sql.DB - logger *zap.Logger - cfg *Config + logger *zap.Logger + cfg *Config + tablesConfig internal.MetricTablesConfigMapper } func newMetricsExporter(logger *zap.Logger, cfg *Config) (*metricsExporter, error) { @@ -29,17 +30,20 @@ func newMetricsExporter(logger *zap.Logger, cfg *Config) (*metricsExporter, erro return nil, err } + tablesConfig := generateMetricTablesConfigMapper(cfg) + return &metricsExporter{ - client: client, - logger: logger, - cfg: cfg, + client: client, + logger: logger, + cfg: cfg, + tablesConfig: tablesConfig, }, nil } func (e *metricsExporter) start(ctx context.Context, _ component.Host) error { internal.SetLogger(e.logger) - if !e.cfg.ShouldCreateSchema() { + if !e.cfg.shouldCreateSchema() { return nil } @@ -47,8 +51,18 @@ func (e *metricsExporter) start(ctx context.Context, _ component.Host) error { return err } - ttlExpr := generateTTLExpr(e.cfg.TTLDays, e.cfg.TTL, "TimeUnix") - return internal.NewMetricsTable(ctx, e.cfg.MetricsTableName, e.cfg.ClusterString(), e.cfg.TableEngineString(), ttlExpr, e.client) + ttlExpr := generateTTLExpr(e.cfg.TTL, "toDateTime(TimeUnix)") + return internal.NewMetricsTable(ctx, e.tablesConfig, e.cfg.clusterString(), e.cfg.tableEngineString(), ttlExpr, e.client) +} + +func generateMetricTablesConfigMapper(cfg *Config) internal.MetricTablesConfigMapper { + return internal.MetricTablesConfigMapper{ + pmetric.MetricTypeGauge: cfg.MetricsTables.Gauge, + pmetric.MetricTypeSum: cfg.MetricsTables.Sum, + pmetric.MetricTypeSummary: cfg.MetricsTables.Summary, + pmetric.MetricTypeHistogram: cfg.MetricsTables.Histogram, + pmetric.MetricTypeExponentialHistogram: cfg.MetricsTables.ExponentialHistogram, + } } // shutdown will shut down the exporter. @@ -60,10 +74,10 @@ func (e *metricsExporter) shutdown(_ context.Context) error { } func (e *metricsExporter) pushMetricsData(ctx context.Context, md pmetric.Metrics) error { - metricsMap := internal.NewMetricsModel(e.cfg.MetricsTableName) + metricsMap := internal.NewMetricsModel(e.tablesConfig) for i := 0; i < md.ResourceMetrics().Len(); i++ { metrics := md.ResourceMetrics().At(i) - resAttr := attributesToMap(metrics.Resource().Attributes()) + resAttr := metrics.Resource().Attributes() for j := 0; j < metrics.ScopeMetrics().Len(); j++ { rs := metrics.ScopeMetrics().At(j).Metrics() scopeInstr := metrics.ScopeMetrics().At(j).Scope() diff --git a/exporter/clickhouseexporter/exporter_metrics_test.go b/exporter/clickhouseexporter/exporter_metrics_test.go index 5a705c3b6862..2000303cab67 100644 --- a/exporter/clickhouseexporter/exporter_metrics_test.go +++ b/exporter/clickhouseexporter/exporter_metrics_test.go @@ -17,6 +17,8 @@ import ( "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" "go.uber.org/zap/zaptest" + + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/clickhouseexporter/internal" ) func TestMetricsClusterConfig(t *testing.T) { @@ -33,6 +35,26 @@ func TestMetricsTableEngineConfig(t *testing.T) { }) } +func Test_generateMetricMetricTableNames(t *testing.T) { + cfg := Config{ + MetricsTables: MetricTablesConfig{ + Gauge: internal.MetricTypeConfig{Name: "otel_metrics_custom_gauge"}, + Sum: internal.MetricTypeConfig{Name: "otel_metrics_custom_sum"}, + Summary: internal.MetricTypeConfig{Name: "otel_metrics_custom_summary"}, + Histogram: internal.MetricTypeConfig{Name: "otel_metrics_custom_histogram"}, + ExponentialHistogram: internal.MetricTypeConfig{Name: "otel_metrics_custom_exp_histogram"}, + }, + } + + require.Equal(t, internal.MetricTablesConfigMapper{ + pmetric.MetricTypeGauge: cfg.MetricsTables.Gauge, + pmetric.MetricTypeSum: cfg.MetricsTables.Sum, + pmetric.MetricTypeSummary: cfg.MetricsTables.Summary, + pmetric.MetricTypeHistogram: cfg.MetricsTables.Histogram, + pmetric.MetricTypeExponentialHistogram: cfg.MetricsTables.ExponentialHistogram, + }, generateMetricTablesConfigMapper(&cfg)) +} + func TestExporter_pushMetricsData(t *testing.T) { t.Parallel() t.Run("push success", func(t *testing.T) { diff --git a/exporter/clickhouseexporter/exporter_sql_test.go b/exporter/clickhouseexporter/exporter_sql_test.go index 17f52d4ba8be..b2c3942b7542 100644 --- a/exporter/clickhouseexporter/exporter_sql_test.go +++ b/exporter/clickhouseexporter/exporter_sql_test.go @@ -13,18 +13,20 @@ import ( "github.com/stretchr/testify/require" ) -type clusterTestCompletion func(t *testing.T, dsn string, clusterTest clusterTestConfig, fns ...func(*Config)) -type clusterTestConfig struct { - name string - cluster string - shouldPass bool -} +type ( + clusterTestCompletion func(t *testing.T, dsn string, clusterTest clusterTestConfig, fns ...func(*Config)) + clusterTestConfig struct { + name string + cluster string + shouldPass bool + } +) func (test clusterTestConfig) verifyConfig(t *testing.T, cfg *Config) { if test.cluster == "" { - require.Empty(t, cfg.ClusterString()) + require.Empty(t, cfg.clusterString()) } else { - require.NotEmpty(t, cfg.ClusterString()) + require.NotEmpty(t, cfg.clusterString()) } } @@ -86,14 +88,16 @@ func testClusterConfig(t *testing.T, completion clusterTestCompletion) { } } -type tableEngineTestCompletion func(t *testing.T, dsn string, engineTest tableEngineTestConfig, fns ...func(*Config)) -type tableEngineTestConfig struct { - name string - engineName string - engineParams string - expectedTableName string - shouldPass bool -} +type ( + tableEngineTestCompletion func(t *testing.T, dsn string, engineTest tableEngineTestConfig, fns ...func(*Config)) + tableEngineTestConfig struct { + name string + engineName string + engineParams string + expectedTableName string + shouldPass bool + } +) func (engineTest tableEngineTestConfig) verifyConfig(t *testing.T, te TableEngine) { if engineTest.engineName == "" { diff --git a/exporter/clickhouseexporter/exporter_traces.go b/exporter/clickhouseexporter/exporter_traces.go index acbb7b8fa1c1..39a706c60afd 100644 --- a/exporter/clickhouseexporter/exporter_traces.go +++ b/exporter/clickhouseexporter/exporter_traces.go @@ -11,11 +11,13 @@ import ( "time" _ "github.com/ClickHouse/clickhouse-go/v2" // For register database driver. + "github.com/ClickHouse/clickhouse-go/v2/lib/column" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.18.0" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "go.uber.org/zap" + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/clickhouseexporter/internal" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/traceutil" ) @@ -42,7 +44,7 @@ func newTracesExporter(logger *zap.Logger, cfg *Config) (*tracesExporter, error) } func (e *tracesExporter) start(ctx context.Context, _ component.Host) error { - if !e.cfg.ShouldCreateSchema() { + if !e.cfg.shouldCreateSchema() { return nil } @@ -74,18 +76,15 @@ func (e *tracesExporter) pushTraceData(ctx context.Context, td ptrace.Traces) er for i := 0; i < td.ResourceSpans().Len(); i++ { spans := td.ResourceSpans().At(i) res := spans.Resource() - resAttr := attributesToMap(res.Attributes()) - var serviceName string - if v, ok := res.Attributes().Get(conventions.AttributeServiceName); ok { - serviceName = v.Str() - } + resAttr := internal.AttributesToMap(res.Attributes()) + serviceName, _ := res.Attributes().Get(conventions.AttributeServiceName) for j := 0; j < spans.ScopeSpans().Len(); j++ { rs := spans.ScopeSpans().At(j).Spans() scopeName := spans.ScopeSpans().At(j).Scope().Name() scopeVersion := spans.ScopeSpans().At(j).Scope().Version() for k := 0; k < rs.Len(); k++ { r := rs.At(k) - spanAttr := attributesToMap(r.Attributes()) + spanAttr := internal.AttributesToMap(r.Attributes()) status := r.Status() eventTimes, eventNames, eventAttrs := convertEvents(r.Events()) linksTraceIDs, linksSpanIDs, linksTraceStates, linksAttrs := convertLinks(r.Links()) @@ -96,14 +95,14 @@ func (e *tracesExporter) pushTraceData(ctx context.Context, td ptrace.Traces) er traceutil.SpanIDToHexOrEmptyString(r.ParentSpanID()), r.TraceState().AsRaw(), r.Name(), - traceutil.SpanKindStr(r.Kind()), - serviceName, + r.Kind().String(), + serviceName.AsString(), resAttr, scopeName, scopeVersion, spanAttr, r.EndTimestamp().AsTime().Sub(r.StartTimestamp().AsTime()).Nanoseconds(), - traceutil.StatusCodeStr(status.Code()), + status.Code().String(), status.Message(), eventTimes, eventNames, @@ -127,78 +126,67 @@ func (e *tracesExporter) pushTraceData(ctx context.Context, td ptrace.Traces) er return err } -func convertEvents(events ptrace.SpanEventSlice) ([]time.Time, []string, []map[string]string) { - var ( - times []time.Time - names []string - attrs []map[string]string - ) +func convertEvents(events ptrace.SpanEventSlice) (times []time.Time, names []string, attrs []column.IterableOrderedMap) { for i := 0; i < events.Len(); i++ { event := events.At(i) times = append(times, event.Timestamp().AsTime()) names = append(names, event.Name()) - attrs = append(attrs, attributesToMap(event.Attributes())) + attrs = append(attrs, internal.AttributesToMap(event.Attributes())) } - return times, names, attrs + return } -func convertLinks(links ptrace.SpanLinkSlice) ([]string, []string, []string, []map[string]string) { - var ( - traceIDs []string - spanIDs []string - states []string - attrs []map[string]string - ) +func convertLinks(links ptrace.SpanLinkSlice) (traceIDs []string, spanIDs []string, states []string, attrs []column.IterableOrderedMap) { for i := 0; i < links.Len(); i++ { link := links.At(i) traceIDs = append(traceIDs, traceutil.TraceIDToHexOrEmptyString(link.TraceID())) spanIDs = append(spanIDs, traceutil.SpanIDToHexOrEmptyString(link.SpanID())) states = append(states, link.TraceState().AsRaw()) - attrs = append(attrs, attributesToMap(link.Attributes())) + attrs = append(attrs, internal.AttributesToMap(link.Attributes())) } - return traceIDs, spanIDs, states, attrs + return } const ( // language=ClickHouse SQL createTracesTableSQL = ` CREATE TABLE IF NOT EXISTS %s %s ( - Timestamp DateTime64(9) CODEC(Delta, ZSTD(1)), - TraceId String CODEC(ZSTD(1)), - SpanId String CODEC(ZSTD(1)), - ParentSpanId String CODEC(ZSTD(1)), - TraceState String CODEC(ZSTD(1)), - SpanName LowCardinality(String) CODEC(ZSTD(1)), - SpanKind LowCardinality(String) CODEC(ZSTD(1)), - ServiceName LowCardinality(String) CODEC(ZSTD(1)), - ResourceAttributes Map(LowCardinality(String), String) CODEC(ZSTD(1)), - ScopeName String CODEC(ZSTD(1)), - ScopeVersion String CODEC(ZSTD(1)), - SpanAttributes Map(LowCardinality(String), String) CODEC(ZSTD(1)), - Duration Int64 CODEC(ZSTD(1)), - StatusCode LowCardinality(String) CODEC(ZSTD(1)), - StatusMessage String CODEC(ZSTD(1)), - Events Nested ( - Timestamp DateTime64(9), - Name LowCardinality(String), - Attributes Map(LowCardinality(String), String) - ) CODEC(ZSTD(1)), - Links Nested ( - TraceId String, - SpanId String, - TraceState String, - Attributes Map(LowCardinality(String), String) - ) CODEC(ZSTD(1)), - INDEX idx_trace_id TraceId TYPE bloom_filter(0.001) GRANULARITY 1, - INDEX idx_res_attr_key mapKeys(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, - INDEX idx_res_attr_value mapValues(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, - INDEX idx_span_attr_key mapKeys(SpanAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, - INDEX idx_span_attr_value mapValues(SpanAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, - INDEX idx_duration Duration TYPE minmax GRANULARITY 1 + Timestamp DateTime64(9) CODEC(Delta, ZSTD(1)), + TraceId String CODEC(ZSTD(1)), + SpanId String CODEC(ZSTD(1)), + ParentSpanId String CODEC(ZSTD(1)), + TraceState String CODEC(ZSTD(1)), + SpanName LowCardinality(String) CODEC(ZSTD(1)), + SpanKind LowCardinality(String) CODEC(ZSTD(1)), + ServiceName LowCardinality(String) CODEC(ZSTD(1)), + ResourceAttributes Map(LowCardinality(String), String) CODEC(ZSTD(1)), + ScopeName String CODEC(ZSTD(1)), + ScopeVersion String CODEC(ZSTD(1)), + SpanAttributes Map(LowCardinality(String), String) CODEC(ZSTD(1)), + Duration UInt64 CODEC(ZSTD(1)), + StatusCode LowCardinality(String) CODEC(ZSTD(1)), + StatusMessage String CODEC(ZSTD(1)), + Events Nested ( + Timestamp DateTime64(9), + Name LowCardinality(String), + Attributes Map(LowCardinality(String), String) + ) CODEC(ZSTD(1)), + Links Nested ( + TraceId String, + SpanId String, + TraceState String, + Attributes Map(LowCardinality(String), String) + ) CODEC(ZSTD(1)), + INDEX idx_trace_id TraceId TYPE bloom_filter(0.001) GRANULARITY 1, + INDEX idx_res_attr_key mapKeys(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_res_attr_value mapValues(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_span_attr_key mapKeys(SpanAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_span_attr_value mapValues(SpanAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_duration Duration TYPE minmax GRANULARITY 1 ) ENGINE = %s -%s PARTITION BY toDate(Timestamp) -ORDER BY (ServiceName, SpanName, toUnixTimestamp(Timestamp), TraceId) +ORDER BY (ServiceName, SpanName, toDateTime(Timestamp)) +%s SETTINGS index_granularity=8192, ttl_only_drop_parts = 1; ` // language=ClickHouse SQL @@ -253,26 +241,27 @@ SETTINGS index_granularity=8192, ttl_only_drop_parts = 1; const ( createTraceIDTsTableSQL = ` -create table IF NOT EXISTS %s_trace_id_ts %s ( +CREATE TABLE IF NOT EXISTS %s_trace_id_ts %s ( TraceId String CODEC(ZSTD(1)), - Start DateTime64(9) CODEC(Delta, ZSTD(1)), - End DateTime64(9) CODEC(Delta, ZSTD(1)), + Start DateTime CODEC(Delta, ZSTD(1)), + End DateTime CODEC(Delta, ZSTD(1)), INDEX idx_trace_id TraceId TYPE bloom_filter(0.01) GRANULARITY 1 ) ENGINE = %s +PARTITION BY toDate(Start) +ORDER BY (TraceId, Start) %s -ORDER BY (TraceId, toUnixTimestamp(Start)) -SETTINGS index_granularity=8192; +SETTINGS index_granularity=8192, ttl_only_drop_parts = 1; ` createTraceIDTsMaterializedViewSQL = ` CREATE MATERIALIZED VIEW IF NOT EXISTS %s_trace_id_ts_mv %s TO %s.%s_trace_id_ts AS SELECT -TraceId, -min(Timestamp) as Start, -max(Timestamp) as End + TraceId, + min(Timestamp) as Start, + max(Timestamp) as End FROM %s.%s -WHERE TraceId!='' +WHERE TraceId != '' GROUP BY TraceId; ` ) @@ -282,10 +271,10 @@ func createTracesTable(ctx context.Context, cfg *Config, db *sql.DB) error { return fmt.Errorf("exec create traces table sql: %w", err) } if _, err := db.ExecContext(ctx, renderCreateTraceIDTsTableSQL(cfg)); err != nil { - return fmt.Errorf("exec create traceIDTs table sql: %w", err) + return fmt.Errorf("exec create traceID timestamp table sql: %w", err) } if _, err := db.ExecContext(ctx, renderTraceIDTsMaterializedViewSQL(cfg)); err != nil { - return fmt.Errorf("exec create traceIDTs view sql: %w", err) + return fmt.Errorf("exec create traceID timestamp view sql: %w", err) } return nil } @@ -295,16 +284,16 @@ func renderInsertTracesSQL(cfg *Config) string { } func renderCreateTracesTableSQL(cfg *Config) string { - ttlExpr := generateTTLExpr(cfg.TTLDays, cfg.TTL, "Timestamp") - return fmt.Sprintf(createTracesTableSQL, cfg.TracesTableName, cfg.ClusterString(), cfg.TableEngineString(), ttlExpr) + ttlExpr := generateTTLExpr(cfg.TTL, "toDate(Timestamp)") + return fmt.Sprintf(createTracesTableSQL, cfg.TracesTableName, cfg.clusterString(), cfg.tableEngineString(), ttlExpr) } func renderCreateTraceIDTsTableSQL(cfg *Config) string { - ttlExpr := generateTTLExpr(cfg.TTLDays, cfg.TTL, "Start") - return fmt.Sprintf(createTraceIDTsTableSQL, cfg.TracesTableName, cfg.ClusterString(), cfg.TableEngineString(), ttlExpr) + ttlExpr := generateTTLExpr(cfg.TTL, "toDate(Start)") + return fmt.Sprintf(createTraceIDTsTableSQL, cfg.TracesTableName, cfg.clusterString(), cfg.tableEngineString(), ttlExpr) } func renderTraceIDTsMaterializedViewSQL(cfg *Config) string { return fmt.Sprintf(createTraceIDTsMaterializedViewSQL, cfg.TracesTableName, - cfg.ClusterString(), cfg.Database, cfg.TracesTableName, cfg.Database, cfg.TracesTableName) + cfg.clusterString(), cfg.Database, cfg.TracesTableName, cfg.Database, cfg.TracesTableName) } diff --git a/exporter/clickhouseexporter/exporter_traces_test.go b/exporter/clickhouseexporter/exporter_traces_test.go index 11391d86e430..dfa76956b2d1 100644 --- a/exporter/clickhouseexporter/exporter_traces_test.go +++ b/exporter/clickhouseexporter/exporter_traces_test.go @@ -13,7 +13,7 @@ import ( "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.18.0" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "go.uber.org/zap/zaptest" ) diff --git a/exporter/clickhouseexporter/factory.go b/exporter/clickhouseexporter/factory.go index 9f9a4fed421c..4c545d5a9fb8 100644 --- a/exporter/clickhouseexporter/factory.go +++ b/exporter/clickhouseexporter/factory.go @@ -15,6 +15,7 @@ import ( "go.opentelemetry.io/collector/exporter" "go.opentelemetry.io/collector/exporter/exporterhelper" + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/clickhouseexporter/internal" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/clickhouseexporter/internal/metadata" ) @@ -30,21 +31,24 @@ func NewFactory() exporter.Factory { } func createDefaultConfig() component.Config { - queueSettings := exporterhelper.NewDefaultQueueSettings() - queueSettings.NumConsumers = 1 - defaultCreateSchema := true - return &Config{ - TimeoutSettings: exporterhelper.NewDefaultTimeoutSettings(), - QueueSettings: queueSettings, + TimeoutSettings: exporterhelper.NewDefaultTimeoutConfig(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), BackOffConfig: configretry.NewDefaultBackOffConfig(), ConnectionParams: map[string]string{}, Database: defaultDatabase, LogsTableName: "otel_logs", TracesTableName: "otel_traces", - MetricsTableName: "otel_metrics", TTL: 0, - CreateSchema: &defaultCreateSchema, + CreateSchema: true, + AsyncInsert: true, + MetricsTables: MetricTablesConfig{ + Gauge: internal.MetricTypeConfig{Name: defaultMetricTableName + defaultGaugeSuffix}, + Sum: internal.MetricTypeConfig{Name: defaultMetricTableName + defaultSumSuffix}, + Summary: internal.MetricTypeConfig{Name: defaultMetricTableName + defaultSummarySuffix}, + Histogram: internal.MetricTypeConfig{Name: defaultMetricTableName + defaultHistogramSuffix}, + ExponentialHistogram: internal.MetricTypeConfig{Name: defaultMetricTableName + defaultExpHistogramSuffix}, + }, } } @@ -52,7 +56,7 @@ func createDefaultConfig() component.Config { // Logs are directly inserted into ClickHouse. func createLogsExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exporter.Logs, error) { c := cfg.(*Config) @@ -61,7 +65,7 @@ func createLogsExporter( return nil, fmt.Errorf("cannot configure clickhouse logs exporter: %w", err) } - return exporterhelper.NewLogsExporter( + return exporterhelper.NewLogs( ctx, set, cfg, @@ -78,7 +82,7 @@ func createLogsExporter( // Traces are directly inserted into ClickHouse. func createTracesExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exporter.Traces, error) { c := cfg.(*Config) @@ -87,7 +91,7 @@ func createTracesExporter( return nil, fmt.Errorf("cannot configure clickhouse traces exporter: %w", err) } - return exporterhelper.NewTracesExporter( + return exporterhelper.NewTraces( ctx, set, cfg, @@ -102,7 +106,7 @@ func createTracesExporter( func createMetricExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exporter.Metrics, error) { c := cfg.(*Config) @@ -111,7 +115,7 @@ func createMetricExporter( return nil, fmt.Errorf("cannot configure clickhouse metrics exporter: %w", err) } - return exporterhelper.NewMetricsExporter( + return exporterhelper.NewMetrics( ctx, set, cfg, @@ -124,21 +128,17 @@ func createMetricExporter( ) } -func generateTTLExpr(ttlDays uint, ttl time.Duration, timeField string) string { - if ttlDays > 0 { - return fmt.Sprintf(`TTL toDateTime(%s) + toIntervalDay(%d)`, timeField, ttlDays) - } - +func generateTTLExpr(ttl time.Duration, timeField string) string { if ttl > 0 { switch { case ttl%(24*time.Hour) == 0: - return fmt.Sprintf(`TTL toDateTime(%s) + toIntervalDay(%d)`, timeField, ttl/(24*time.Hour)) + return fmt.Sprintf(`TTL %s + toIntervalDay(%d)`, timeField, ttl/(24*time.Hour)) case ttl%(time.Hour) == 0: - return fmt.Sprintf(`TTL toDateTime(%s) + toIntervalHour(%d)`, timeField, ttl/time.Hour) + return fmt.Sprintf(`TTL %s + toIntervalHour(%d)`, timeField, ttl/time.Hour) case ttl%(time.Minute) == 0: - return fmt.Sprintf(`TTL toDateTime(%s) + toIntervalMinute(%d)`, timeField, ttl/time.Minute) + return fmt.Sprintf(`TTL %s + toIntervalMinute(%d)`, timeField, ttl/time.Minute) default: - return fmt.Sprintf(`TTL toDateTime(%s) + toIntervalSecond(%d)`, timeField, ttl/time.Second) + return fmt.Sprintf(`TTL %s + toIntervalSecond(%d)`, timeField, ttl/time.Second) } } return "" diff --git a/exporter/clickhouseexporter/factory_test.go b/exporter/clickhouseexporter/factory_test.go index 20db973d596e..cd74d0301614 100644 --- a/exporter/clickhouseexporter/factory_test.go +++ b/exporter/clickhouseexporter/factory_test.go @@ -20,39 +20,39 @@ func TestCreateDefaultConfig(t *testing.T) { assert.NoError(t, componenttest.CheckConfigStruct(cfg)) } -func TestFactory_CreateLogsExporter(t *testing.T) { +func TestFactory_CreateLogs(t *testing.T) { factory := NewFactory() cfg := withDefaultConfig(func(cfg *Config) { cfg.Endpoint = defaultEndpoint }) - params := exportertest.NewNopCreateSettings() - exporter, err := factory.CreateLogsExporter(context.Background(), params, cfg) + params := exportertest.NewNopSettings() + exporter, err := factory.CreateLogs(context.Background(), params, cfg) require.NoError(t, err) require.NotNil(t, exporter) require.NoError(t, exporter.Shutdown(context.TODO())) } -func TestFactory_CreateTracesExporter(t *testing.T) { +func TestFactory_CreateTraces(t *testing.T) { factory := NewFactory() cfg := withDefaultConfig(func(cfg *Config) { cfg.Endpoint = defaultEndpoint }) - params := exportertest.NewNopCreateSettings() - exporter, err := factory.CreateTracesExporter(context.Background(), params, cfg) + params := exportertest.NewNopSettings() + exporter, err := factory.CreateTraces(context.Background(), params, cfg) require.NoError(t, err) require.NotNil(t, exporter) require.NoError(t, exporter.Shutdown(context.TODO())) } -func TestFactory_CreateMetricsExporter(t *testing.T) { +func TestFactory_CreateMetrics(t *testing.T) { factory := NewFactory() cfg := withDefaultConfig(func(cfg *Config) { cfg.Endpoint = defaultEndpoint }) - params := exportertest.NewNopCreateSettings() - exporter, err := factory.CreateMetricsExporter(context.Background(), params, cfg) + params := exportertest.NewNopSettings() + exporter, err := factory.CreateMetrics(context.Background(), params, cfg) require.NoError(t, err) require.NotNil(t, exporter) diff --git a/exporter/clickhouseexporter/generated_component_test.go b/exporter/clickhouseexporter/generated_component_test.go index 08a91f9dfde4..1ef500f83329 100644 --- a/exporter/clickhouseexporter/generated_component_test.go +++ b/exporter/clickhouseexporter/generated_component_test.go @@ -32,27 +32,27 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, { name: "metrics", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg) }, }, { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -64,9 +64,9 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) diff --git a/exporter/clickhouseexporter/go.mod b/exporter/clickhouseexporter/go.mod index d8942f890d11..0f124f7a79be 100644 --- a/exporter/clickhouseexporter/go.mod +++ b/exporter/clickhouseexporter/go.mod @@ -1,23 +1,23 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/clickhouseexporter -go 1.21.0 +go 1.22.0 require ( - github.com/ClickHouse/clickhouse-go/v2 v2.23.0 + github.com/ClickHouse/clickhouse-go/v2 v2.30.0 github.com/cenkalti/backoff/v4 v4.3.0 github.com/jmoiron/sqlx v1.4.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 - github.com/stretchr/testify v1.9.0 - github.com/testcontainers/testcontainers-go v0.31.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/stretchr/testify v1.10.0 + github.com/testcontainers/testcontainers-go v0.34.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/semconv v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) @@ -26,40 +26,40 @@ require ( dario.cat/mergo v1.0.0 // indirect github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect github.com/ClickHouse/ch-go v0.61.5 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/Microsoft/hcsshim v0.11.4 // indirect - github.com/andybalholm/brotli v1.1.0 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/containerd/containerd v1.7.15 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/andybalholm/brotli v1.1.1 // indirect github.com/containerd/log v0.1.0 // indirect - github.com/cpuguy83/dockercfg v0.3.1 // indirect + github.com/containerd/platforms v0.2.1 // indirect + github.com/cpuguy83/dockercfg v0.3.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/distribution/reference v0.5.0 // indirect - github.com/docker/docker v25.0.5+incompatible // indirect + github.com/distribution/reference v0.6.0 // indirect + github.com/docker/docker v27.3.1+incompatible // indirect github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/go-faster/city v1.0.1 // indirect github.com/go-faster/errors v0.7.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.7 // indirect + github.com/klauspost/compress v1.17.9 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/patternmatcher v0.6.0 // indirect github.com/moby/sys/sequential v0.5.0 // indirect github.com/moby/sys/user v0.1.0 // indirect + github.com/moby/sys/userns v0.1.0 // indirect github.com/moby/term v0.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect @@ -71,38 +71,45 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect github.com/segmentio/asm v1.2.0 // indirect - github.com/shirou/gopsutil/v3 v3.24.4 // indirect + github.com/shirou/gopsutil/v3 v3.24.5 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect - github.com/shopspring/decimal v1.3.1 // indirect + github.com/shopspring/decimal v1.4.0 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/consumer v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/consumer v1.22.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.23.0 // indirect - golang.org/x/mod v0.16.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - golang.org/x/tools v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/net v0.30.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/clickhouseexporter/go.sum b/exporter/clickhouseexporter/go.sum index b4c30d93df37..ba2d21c55854 100644 --- a/exporter/clickhouseexporter/go.sum +++ b/exporter/clickhouseexporter/go.sum @@ -8,35 +8,29 @@ github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOEl github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/ClickHouse/ch-go v0.61.5 h1:zwR8QbYI0tsMiEcze/uIMK+Tz1D3XZXLdNrlaOpeEI4= github.com/ClickHouse/ch-go v0.61.5/go.mod h1:s1LJW/F/LcFs5HJnuogFMta50kKDO0lf9zzfrbl0RQg= -github.com/ClickHouse/clickhouse-go/v2 v2.23.0 h1:srmRrkS0BR8gEut87u8jpcZ7geOob6nGj9ifrb+aKmg= -github.com/ClickHouse/clickhouse-go/v2 v2.23.0/go.mod h1:tBhdF3f3RdP7sS59+oBAtTyhWpy0024ZxDMhgxra0QE= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= -github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w= -github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= -github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= -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/ClickHouse/clickhouse-go/v2 v2.30.0 h1:AG4D/hW39qa58+JHQIFOSnxyL46H6h2lrmGGk17dhFo= +github.com/ClickHouse/clickhouse-go/v2 v2.30.0/go.mod h1:i9ZQAojcayW3RsdCb3YR+n+wC2h65eJsZCscZ1Z1wyo= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= +github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/containerd/containerd v1.7.15 h1:afEHXdil9iAm03BmhjzKyXnnEBtjaLJefdU7DV0IFes= -github.com/containerd/containerd v1.7.15/go.mod h1:ISzRRTMF8EXNpJlTzyr2XMhN+j9K302C21/+cr3kUnY= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= -github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= +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/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= -github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= -github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/docker v27.3.1+incompatible h1:KttF0XoteNTicmUtBO0L2tP+J7FGRFTjaEF4k6WdhfI= +github.com/docker/docker v27.3.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -48,24 +42,25 @@ github.com/go-faster/city v1.0.1/go.mod h1:jKcUJId49qdW3L1qKHH/3wPeUstCVpVSXTM6v github.com/go-faster/errors v0.7.1 h1:MkJTnDoEdi9pDabt1dpWf7AA8/BaSYZqibYyhZ20AYg= github.com/go-faster/errors v0.7.1/go.mod h1:5ySTjWFiphBs07IKuiL69nxdfd5+fzh1u7FPGZP2quo= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -73,6 +68,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -80,14 +77,14 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= -github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -107,12 +104,16 @@ github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa1 github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -138,42 +139,30 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= -github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= -github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= +github.com/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI= +github.com/shirou/gopsutil/v3 v3.24.5/go.mod h1:bsoOS1aStSs9ErQ1WWfxllSeS1K5D+U30r2NfcubMVk= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= -github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= -github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= +github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/testcontainers/testcontainers-go v0.31.0 h1:W0VwIhcEVhRflwL9as3dhY6jXjVCA27AkmbnZ+UTh3U= -github.com/testcontainers/testcontainers-go v0.31.0/go.mod h1:D2lAoA0zUFiSY+eAflqK5mcUx/A5hrrORaEQrd0SefI= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/testcontainers/testcontainers-go v0.34.0 h1:5fbgF0vIN5u+nD3IWabQwRybuB4GY8G2HHgCkbMzMHo= +github.com/testcontainers/testcontainers-go v0.34.0/go.mod h1:6P/kMkQe8yqPHfPWNulFGdFHTD8HB2vLq/231xY2iPQ= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= @@ -182,58 +171,82 @@ github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9f github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= +github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= +github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= -go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= -go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 h1:lsInsfvhVIfOI6qHVyysXMNDnjO9Npvl7tlDPJFBVd4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0/go.mod h1:KQsVNh4OjgjTG0G6EiNi1jVpnaeeKsKMRwbLN+f1+8M= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 h1:j9+03ymgYhPKmeXGk5Zu+cIZOlVzd9Zv7QIiyItjFBU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0/go.mod h1:Y5+XiUG4Emn1hTfciPzGPJaSI+RpDts6BnCIir0SLqk= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -244,25 +257,21 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= -golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -275,41 +284,37 @@ golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= -golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 h1:Z0hjGZePRE0ZBWotvtrwxFNrNE9CUAGtplaDK5NNI/g= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 h1:P8OJ/WCl/Xo4E4zoe4/bifHpSmmKwARqyqE4nW6J2GQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= @@ -317,5 +322,5 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= -gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= diff --git a/exporter/clickhouseexporter/integration_test.go b/exporter/clickhouseexporter/integration_test.go index c36f3d109806..74ecd52dde6b 100644 --- a/exporter/clickhouseexporter/integration_test.go +++ b/exporter/clickhouseexporter/integration_test.go @@ -95,6 +95,7 @@ func verifyExportLog(t *testing.T, logExporter *logsExporter) { type log struct { Timestamp string `db:"Timestamp"` + TimestampTime string `db:"TimestampTime"` TraceID string `db:"TraceId"` SpanID string `db:"SpanId"` TraceFlags uint32 `db:"TraceFlags"` @@ -115,6 +116,7 @@ func verifyExportLog(t *testing.T, logExporter *logsExporter) { expectLog := log{ Timestamp: "2023-12-25T09:53:49Z", + TimestampTime: "2023-12-25T09:53:49Z", TraceID: "01020300000000000000000000000000", SpanID: "0102030000000000", SeverityText: "error", @@ -179,7 +181,7 @@ func verifyExporterTrace(t *testing.T, traceExporter *tracesExporter) { ParentSpanID: "0102040000000000", TraceState: "trace state", SpanName: "call db", - SpanKind: "SPAN_KIND_INTERNAL", + SpanKind: "Internal", ServiceName: "test-service", ResourceAttributes: map[string]string{ "service.name": "test-service", @@ -190,7 +192,7 @@ func verifyExporterTrace(t *testing.T, traceExporter *tracesExporter) { "service.name": "v", }, Duration: 60000000000, - StatusCode: "STATUS_CODE_ERROR", + StatusCode: "Error", StatusMessage: "error", EventsTimestamp: []time.Time{ time.Unix(1703498029, 0).UTC(), @@ -328,7 +330,7 @@ func verifySumMetric(t *testing.T, db *sqlx.DB) { ExemplarsValue []float64 `db:"Exemplars.Value"` ExemplarsSpanID []string `db:"Exemplars.SpanId"` ExemplarsTraceID []string `db:"Exemplars.TraceId"` - AggTemp int32 `db:"AggTemp"` + AggregationTemporality int32 `db:"AggregationTemporality"` IsMonotonic bool `db:"IsMonotonic"` } @@ -376,7 +378,7 @@ func verifySumMetric(t *testing.T, db *sqlx.DB) { } func verifyHistogramMetric(t *testing.T, db *sqlx.DB) { - type sum struct { + type histogram struct { ResourceAttributes map[string]string `db:"ResourceAttributes"` ResourceSchemaURL string `db:"ResourceSchemaUrl"` ScopeName string `db:"ScopeName"` @@ -400,14 +402,15 @@ func verifyHistogramMetric(t *testing.T, db *sqlx.DB) { ExemplarsValue []float64 `db:"Exemplars.Value"` ExemplarsSpanID []string `db:"Exemplars.SpanId"` ExemplarsTraceID []string `db:"Exemplars.TraceId"` + AggregationTemporality int32 `db:"AggregationTemporality"` Flags uint32 `db:"Flags"` Min float64 `db:"Min"` Max float64 `db:"Max"` } - var actualSum sum + var actualHistogram histogram - expectSum := sum{ + expectHistogram := histogram{ ResourceAttributes: map[string]string{ "service.name": "demo 1", "Resource Attributes 1": "value1", @@ -449,13 +452,13 @@ func verifyHistogramMetric(t *testing.T, db *sqlx.DB) { ExemplarsValue: []float64{55.22}, } - err := db.Get(&actualSum, "select * from default.otel_metrics_histogram") + err := db.Get(&actualHistogram, "select * from default.otel_metrics_histogram") require.NoError(t, err) - require.Equal(t, expectSum, actualSum) + require.Equal(t, expectHistogram, actualHistogram) } func verifyExphistogramMetric(t *testing.T, db *sqlx.DB) { - type sum struct { + type expHistogram struct { ResourceAttributes map[string]string `db:"ResourceAttributes"` ResourceSchemaURL string `db:"ResourceSchemaUrl"` ScopeName string `db:"ScopeName"` @@ -483,14 +486,15 @@ func verifyExphistogramMetric(t *testing.T, db *sqlx.DB) { ExemplarsValue []float64 `db:"Exemplars.Value"` ExemplarsSpanID []string `db:"Exemplars.SpanId"` ExemplarsTraceID []string `db:"Exemplars.TraceId"` + AggregationTemporality int32 `db:"AggregationTemporality"` Flags uint32 `db:"Flags"` Min float64 `db:"Min"` Max float64 `db:"Max"` } - var actualSum sum + var actualExpHistogram expHistogram - expectSum := sum{ + expectExpHistogram := expHistogram{ ResourceAttributes: map[string]string{ "service.name": "demo 1", "Resource Attributes 1": "value1", @@ -536,13 +540,13 @@ func verifyExphistogramMetric(t *testing.T, db *sqlx.DB) { ExemplarsValue: []float64{54}, } - err := db.Get(&actualSum, "select * from default.otel_metrics_exponential_histogram") + err := db.Get(&actualExpHistogram, "select * from default.otel_metrics_exponential_histogram") require.NoError(t, err) - require.Equal(t, expectSum, actualSum) + require.Equal(t, expectExpHistogram, actualExpHistogram) } func verifySummaryMetric(t *testing.T, db *sqlx.DB) { - type sum struct { + type summary struct { ResourceAttributes map[string]string `db:"ResourceAttributes"` ResourceSchemaURL string `db:"ResourceSchemaUrl"` ScopeName string `db:"ScopeName"` @@ -564,9 +568,9 @@ func verifySummaryMetric(t *testing.T, db *sqlx.DB) { Flags uint32 `db:"Flags"` } - var actualSum sum + var actualSummary summary - expectSum := sum{ + expectSummary := summary{ ResourceAttributes: map[string]string{ "service.name": "demo 1", "Resource Attributes 1": "value1", @@ -596,9 +600,9 @@ func verifySummaryMetric(t *testing.T, db *sqlx.DB) { Flags: 0, } - err := db.Get(&actualSum, "select * from default.otel_metrics_summary") + err := db.Get(&actualSummary, "select * from default.otel_metrics_summary") require.NoError(t, err) - require.Equal(t, expectSum, actualSum) + require.Equal(t, expectSummary, actualSummary) } func randPort() string { diff --git a/exporter/clickhouseexporter/internal/exponential_histogram_metrics.go b/exporter/clickhouseexporter/internal/exponential_histogram_metrics.go index f6212e4e0886..064e12a2b234 100644 --- a/exporter/clickhouseexporter/internal/exponential_histogram_metrics.go +++ b/exporter/clickhouseexporter/internal/exponential_histogram_metrics.go @@ -11,14 +11,14 @@ import ( "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" - conventions "go.opentelemetry.io/collector/semconv/v1.18.0" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "go.uber.org/zap" ) const ( // language=ClickHouse SQL createExpHistogramTableSQL = ` -CREATE TABLE IF NOT EXISTS %s_exponential_histogram %s ( +CREATE TABLE IF NOT EXISTS %s %s ( ResourceAttributes Map(LowCardinality(String), String) CODEC(ZSTD(1)), ResourceSchemaUrl String CODEC(ZSTD(1)), ScopeName String CODEC(ZSTD(1)), @@ -51,6 +51,7 @@ CREATE TABLE IF NOT EXISTS %s_exponential_histogram %s ( Flags UInt32 CODEC(ZSTD(1)), Min Float64 CODEC(ZSTD(1)), Max Float64 CODEC(ZSTD(1)), + AggregationTemporality Int32 CODEC(ZSTD(1)), INDEX idx_res_attr_key mapKeys(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, INDEX idx_res_attr_value mapValues(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, INDEX idx_scope_attr_key mapKeys(ScopeAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, @@ -64,7 +65,7 @@ ORDER BY (ServiceName, MetricName, Attributes, toUnixTimestamp64Nano(TimeUnix)) SETTINGS index_granularity=8192, ttl_only_drop_parts = 1; ` // language=ClickHouse SQL - insertExpHistogramTableSQL = `INSERT INTO %s_exponential_histogram ( + insertExpHistogramTableSQL = `INSERT INTO %s ( ResourceAttributes, ResourceSchemaUrl, ScopeName, @@ -94,7 +95,8 @@ SETTINGS index_granularity=8192, ttl_only_drop_parts = 1; Exemplars.TraceId, Flags, Min, - Max) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)` + Max, + AggregationTemporality) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)` ) type expHistogramModel struct { @@ -128,28 +130,24 @@ func (e *expHistogramMetrics) insert(ctx context.Context, db *sql.DB) error { }() for _, model := range e.expHistogramModels { - var serviceName string - if v, ok := model.metadata.ResAttr[conventions.AttributeServiceName]; ok { - serviceName = v - } + serviceName, _ := model.metadata.ResAttr.Get(conventions.AttributeServiceName) for i := 0; i < model.expHistogram.DataPoints().Len(); i++ { dp := model.expHistogram.DataPoints().At(i) - attrs, times, values, traceIDs, spanIDs := convertExemplars(dp.Exemplars()) _, err = statement.ExecContext(ctx, - model.metadata.ResAttr, + AttributesToMap(model.metadata.ResAttr), model.metadata.ResURL, model.metadata.ScopeInstr.Name(), model.metadata.ScopeInstr.Version(), - attributesToMap(model.metadata.ScopeInstr.Attributes()), + AttributesToMap(model.metadata.ScopeInstr.Attributes()), model.metadata.ScopeInstr.DroppedAttributesCount(), model.metadata.ScopeURL, - serviceName, + serviceName.AsString(), model.metricName, model.metricDescription, model.metricUnit, - attributesToMap(dp.Attributes()), + AttributesToMap(dp.Attributes()), dp.StartTimestamp().AsTime(), dp.Timestamp().AsTime(), dp.Count(), @@ -168,6 +166,7 @@ func (e *expHistogramMetrics) insert(ctx context.Context, db *sql.DB) error { uint32(dp.Flags()), dp.Min(), dp.Max(), + int32(model.expHistogram.AggregationTemporality()), ) if err != nil { return fmt.Errorf("ExecContext:%w", err) @@ -188,7 +187,7 @@ func (e *expHistogramMetrics) insert(ctx context.Context, db *sql.DB) error { return nil } -func (e *expHistogramMetrics) Add(resAttr map[string]string, resURL string, scopeInstr pcommon.InstrumentationScope, scopeURL string, metrics any, name string, description string, unit string) error { +func (e *expHistogramMetrics) Add(resAttr pcommon.Map, resURL string, scopeInstr pcommon.InstrumentationScope, scopeURL string, metrics any, name string, description string, unit string) error { expHistogram, ok := metrics.(pmetric.ExponentialHistogram) if !ok { return fmt.Errorf("metrics param is not type of ExponentialHistogram") diff --git a/exporter/clickhouseexporter/internal/gauge_metrics.go b/exporter/clickhouseexporter/internal/gauge_metrics.go index a45121ccaa95..e2fbfe2dc365 100644 --- a/exporter/clickhouseexporter/internal/gauge_metrics.go +++ b/exporter/clickhouseexporter/internal/gauge_metrics.go @@ -11,14 +11,14 @@ import ( "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" - conventions "go.opentelemetry.io/collector/semconv/v1.18.0" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "go.uber.org/zap" ) const ( // language=ClickHouse SQL createGaugeTableSQL = ` -CREATE TABLE IF NOT EXISTS %s_gauge %s ( +CREATE TABLE IF NOT EXISTS %s %s ( ResourceAttributes Map(LowCardinality(String), String) CODEC(ZSTD(1)), ResourceSchemaUrl String CODEC(ZSTD(1)), ScopeName String CODEC(ZSTD(1)), @@ -55,7 +55,7 @@ ORDER BY (ServiceName, MetricName, Attributes, toUnixTimestamp64Nano(TimeUnix)) SETTINGS index_granularity=8192, ttl_only_drop_parts = 1; ` // language=ClickHouse SQL - insertGaugeTableSQL = `INSERT INTO %s_gauge ( + insertGaugeTableSQL = `INSERT INTO %s ( ResourceAttributes, ResourceSchemaUrl, ScopeName, @@ -109,27 +109,24 @@ func (g *gaugeMetrics) insert(ctx context.Context, db *sql.DB) error { }() for _, model := range g.gaugeModels { - var serviceName string - if v, ok := model.metadata.ResAttr[conventions.AttributeServiceName]; ok { - serviceName = v - } + serviceName, _ := model.metadata.ResAttr.Get(conventions.AttributeServiceName) for i := 0; i < model.gauge.DataPoints().Len(); i++ { dp := model.gauge.DataPoints().At(i) attrs, times, values, traceIDs, spanIDs := convertExemplars(dp.Exemplars()) _, err = statement.ExecContext(ctx, - model.metadata.ResAttr, + AttributesToMap(model.metadata.ResAttr), model.metadata.ResURL, model.metadata.ScopeInstr.Name(), model.metadata.ScopeInstr.Version(), - attributesToMap(model.metadata.ScopeInstr.Attributes()), + AttributesToMap(model.metadata.ScopeInstr.Attributes()), model.metadata.ScopeInstr.DroppedAttributesCount(), model.metadata.ScopeURL, - serviceName, + serviceName.AsString(), model.metricName, model.metricDescription, model.metricUnit, - attributesToMap(dp.Attributes()), + AttributesToMap(dp.Attributes()), dp.StartTimestamp().AsTime(), dp.Timestamp().AsTime(), getValue(dp.IntValue(), dp.DoubleValue(), dp.ValueType()), @@ -155,7 +152,7 @@ func (g *gaugeMetrics) insert(ctx context.Context, db *sql.DB) error { return nil } -func (g *gaugeMetrics) Add(resAttr map[string]string, resURL string, scopeInstr pcommon.InstrumentationScope, scopeURL string, metrics any, name string, description string, unit string) error { +func (g *gaugeMetrics) Add(resAttr pcommon.Map, resURL string, scopeInstr pcommon.InstrumentationScope, scopeURL string, metrics any, name string, description string, unit string) error { gauge, ok := metrics.(pmetric.Gauge) if !ok { return fmt.Errorf("metrics param is not type of Gauge") diff --git a/exporter/clickhouseexporter/internal/histogram_metrics.go b/exporter/clickhouseexporter/internal/histogram_metrics.go index 905b571e5c9a..f3374b655ba2 100644 --- a/exporter/clickhouseexporter/internal/histogram_metrics.go +++ b/exporter/clickhouseexporter/internal/histogram_metrics.go @@ -11,14 +11,14 @@ import ( "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" - conventions "go.opentelemetry.io/collector/semconv/v1.18.0" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "go.uber.org/zap" ) const ( // language=ClickHouse SQL createHistogramTableSQL = ` -CREATE TABLE IF NOT EXISTS %s_histogram %s ( +CREATE TABLE IF NOT EXISTS %s %s ( ResourceAttributes Map(LowCardinality(String), String) CODEC(ZSTD(1)), ResourceSchemaUrl String CODEC(ZSTD(1)), ScopeName String CODEC(ZSTD(1)), @@ -47,6 +47,7 @@ CREATE TABLE IF NOT EXISTS %s_histogram %s ( Flags UInt32 CODEC(ZSTD(1)), Min Float64 CODEC(ZSTD(1)), Max Float64 CODEC(ZSTD(1)), + AggregationTemporality Int32 CODEC(ZSTD(1)), INDEX idx_res_attr_key mapKeys(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, INDEX idx_res_attr_value mapValues(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, INDEX idx_scope_attr_key mapKeys(ScopeAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, @@ -60,7 +61,7 @@ ORDER BY (ServiceName, MetricName, Attributes, toUnixTimestamp64Nano(TimeUnix)) SETTINGS index_granularity=8192, ttl_only_drop_parts = 1; ` // language=ClickHouse SQL - insertHistogramTableSQL = `INSERT INTO %s_histogram ( + insertHistogramTableSQL = `INSERT INTO %s ( ResourceAttributes, ResourceSchemaUrl, ScopeName, @@ -86,7 +87,8 @@ SETTINGS index_granularity=8192, ttl_only_drop_parts = 1; Exemplars.TraceId, Flags, Min, - Max) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)` + Max, + AggregationTemporality) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)` ) type histogramModel struct { @@ -119,27 +121,24 @@ func (h *histogramMetrics) insert(ctx context.Context, db *sql.DB) error { }() for _, model := range h.histogramModel { - var serviceName string - if v, ok := model.metadata.ResAttr[conventions.AttributeServiceName]; ok { - serviceName = v - } + serviceName, _ := model.metadata.ResAttr.Get(conventions.AttributeServiceName) for i := 0; i < model.histogram.DataPoints().Len(); i++ { dp := model.histogram.DataPoints().At(i) attrs, times, values, traceIDs, spanIDs := convertExemplars(dp.Exemplars()) _, err = statement.ExecContext(ctx, - model.metadata.ResAttr, + AttributesToMap(model.metadata.ResAttr), model.metadata.ResURL, model.metadata.ScopeInstr.Name(), model.metadata.ScopeInstr.Version(), - attributesToMap(model.metadata.ScopeInstr.Attributes()), + AttributesToMap(model.metadata.ScopeInstr.Attributes()), model.metadata.ScopeInstr.DroppedAttributesCount(), model.metadata.ScopeURL, - serviceName, + serviceName.AsString(), model.metricName, model.metricDescription, model.metricUnit, - attributesToMap(dp.Attributes()), + AttributesToMap(dp.Attributes()), dp.StartTimestamp().AsTime(), dp.Timestamp().AsTime(), dp.Count(), @@ -154,6 +153,7 @@ func (h *histogramMetrics) insert(ctx context.Context, db *sql.DB) error { uint32(dp.Flags()), dp.Min(), dp.Max(), + int32(model.histogram.AggregationTemporality()), ) if err != nil { return fmt.Errorf("ExecContext:%w", err) @@ -174,7 +174,7 @@ func (h *histogramMetrics) insert(ctx context.Context, db *sql.DB) error { return nil } -func (h *histogramMetrics) Add(resAttr map[string]string, resURL string, scopeInstr pcommon.InstrumentationScope, scopeURL string, metrics any, name string, description string, unit string) error { +func (h *histogramMetrics) Add(resAttr pcommon.Map, resURL string, scopeInstr pcommon.InstrumentationScope, scopeURL string, metrics any, name string, description string, unit string) error { histogram, ok := metrics.(pmetric.Histogram) if !ok { return fmt.Errorf("metrics param is not type of Histogram") diff --git a/exporter/clickhouseexporter/internal/metadata/generated_status.go b/exporter/clickhouseexporter/internal/metadata/generated_status.go index 6c17061cc0a9..dd45173861de 100644 --- a/exporter/clickhouseexporter/internal/metadata/generated_status.go +++ b/exporter/clickhouseexporter/internal/metadata/generated_status.go @@ -7,11 +7,12 @@ import ( ) var ( - Type = component.MustNewType("clickhouse") + Type = component.MustNewType("clickhouse") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/clickhouseexporter" ) const ( - TracesStability = component.StabilityLevelAlpha MetricsStability = component.StabilityLevelAlpha - LogsStability = component.StabilityLevelAlpha + TracesStability = component.StabilityLevelBeta + LogsStability = component.StabilityLevelBeta ) diff --git a/exporter/clickhouseexporter/internal/metadata/generated_telemetry.go b/exporter/clickhouseexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index b462fdd5caef..000000000000 --- a/exporter/clickhouseexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/clickhouse") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/clickhouse") -} diff --git a/exporter/clickhouseexporter/internal/metadata/generated_telemetry_test.go b/exporter/clickhouseexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index d56dc0362d0c..000000000000 --- a/exporter/clickhouseexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/clickhouse", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/clickhouse", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/clickhouseexporter/internal/metrics_model.go b/exporter/clickhouseexporter/internal/metrics_model.go index b4a1e6a3ab71..a412051800c0 100644 --- a/exporter/clickhouseexporter/internal/metrics_model.go +++ b/exporter/clickhouseexporter/internal/metrics_model.go @@ -13,33 +13,41 @@ import ( "sync" "github.com/ClickHouse/clickhouse-go/v2" + "github.com/ClickHouse/clickhouse-go/v2/lib/column" + "github.com/ClickHouse/clickhouse-go/v2/lib/column/orderedmap" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" "go.uber.org/zap" ) -var supportedMetricTypes = map[string]struct{}{ - createGaugeTableSQL: {}, - createSumTableSQL: {}, - createHistogramTableSQL: {}, - createExpHistogramTableSQL: {}, - createSummaryTableSQL: {}, +var supportedMetricTypes = map[pmetric.MetricType]string{ + pmetric.MetricTypeGauge: createGaugeTableSQL, + pmetric.MetricTypeSum: createSumTableSQL, + pmetric.MetricTypeHistogram: createHistogramTableSQL, + pmetric.MetricTypeExponentialHistogram: createExpHistogramTableSQL, + pmetric.MetricTypeSummary: createSummaryTableSQL, } var logger *zap.Logger +type MetricTablesConfigMapper map[pmetric.MetricType]MetricTypeConfig + +type MetricTypeConfig struct { + Name string `mapstructure:"name"` +} + // MetricsModel is used to group metric data and insert into clickhouse // any type of metrics need implement it. type MetricsModel interface { // Add used to bind MetricsMetaData to a specific metric then put them into a slice - Add(resAttr map[string]string, resURL string, scopeInstr pcommon.InstrumentationScope, scopeURL string, metrics any, name string, description string, unit string) error + Add(resAttr pcommon.Map, resURL string, scopeInstr pcommon.InstrumentationScope, scopeURL string, metrics any, name string, description string, unit string) error // insert is used to insert metric data to clickhouse insert(ctx context.Context, db *sql.DB) error } -// MetricsMetaData contain specific metric data +// MetricsMetaData contain specific metric data type MetricsMetaData struct { - ResAttr map[string]string + ResAttr pcommon.Map ResURL string ScopeURL string ScopeInstr pcommon.InstrumentationScope @@ -51,9 +59,9 @@ func SetLogger(l *zap.Logger) { } // NewMetricsTable create metric tables with an expiry time to storage metric telemetry data -func NewMetricsTable(ctx context.Context, tableName, cluster, engine, ttlExpr string, db *sql.DB) error { - for table := range supportedMetricTypes { - query := fmt.Sprintf(table, tableName, cluster, engine, ttlExpr) +func NewMetricsTable(ctx context.Context, tablesConfig MetricTablesConfigMapper, cluster, engine, ttlExpr string, db *sql.DB) error { + for key, queryTemplate := range supportedMetricTypes { + query := fmt.Sprintf(queryTemplate, tablesConfig[key].Name, cluster, engine, ttlExpr) if _, err := db.ExecContext(ctx, query); err != nil { return fmt.Errorf("exec create metrics table sql: %w", err) } @@ -62,22 +70,22 @@ func NewMetricsTable(ctx context.Context, tableName, cluster, engine, ttlExpr st } // NewMetricsModel create a model for contain different metric data -func NewMetricsModel(tableName string) map[pmetric.MetricType]MetricsModel { +func NewMetricsModel(tablesConfig MetricTablesConfigMapper) map[pmetric.MetricType]MetricsModel { return map[pmetric.MetricType]MetricsModel{ pmetric.MetricTypeGauge: &gaugeMetrics{ - insertSQL: fmt.Sprintf(insertGaugeTableSQL, tableName), + insertSQL: fmt.Sprintf(insertGaugeTableSQL, tablesConfig[pmetric.MetricTypeGauge].Name), }, pmetric.MetricTypeSum: &sumMetrics{ - insertSQL: fmt.Sprintf(insertSumTableSQL, tableName), + insertSQL: fmt.Sprintf(insertSumTableSQL, tablesConfig[pmetric.MetricTypeSum].Name), }, pmetric.MetricTypeHistogram: &histogramMetrics{ - insertSQL: fmt.Sprintf(insertHistogramTableSQL, tableName), + insertSQL: fmt.Sprintf(insertHistogramTableSQL, tablesConfig[pmetric.MetricTypeHistogram].Name), }, pmetric.MetricTypeExponentialHistogram: &expHistogramMetrics{ - insertSQL: fmt.Sprintf(insertExpHistogramTableSQL, tableName), + insertSQL: fmt.Sprintf(insertExpHistogramTableSQL, tablesConfig[pmetric.MetricTypeExponentialHistogram].Name), }, pmetric.MetricTypeSummary: &summaryMetrics{ - insertSQL: fmt.Sprintf(insertSummaryTableSQL, tableName), + insertSQL: fmt.Sprintf(insertSummaryTableSQL, tablesConfig[pmetric.MetricTypeSummary].Name), }, } } @@ -112,7 +120,7 @@ func convertExemplars(exemplars pmetric.ExemplarSlice) (clickhouse.ArraySet, cli ) for i := 0; i < exemplars.Len(); i++ { exemplar := exemplars.At(i) - attrs = append(attrs, attributesToMap(exemplar.FilteredAttributes())) + attrs = append(attrs, AttributesToMap(exemplar.FilteredAttributes())) times = append(times, exemplar.Timestamp().AsTime()) values = append(values, getValue(exemplar.IntValue(), exemplar.DoubleValue(), exemplar.ValueType())) @@ -159,13 +167,12 @@ func getValue(intValue int64, floatValue float64, dataType any) float64 { } } -func attributesToMap(attributes pcommon.Map) map[string]string { - m := make(map[string]string, attributes.Len()) - attributes.Range(func(k string, v pcommon.Value) bool { - m[k] = v.AsString() - return true - }) - return m +func AttributesToMap(attributes pcommon.Map) column.IterableOrderedMap { + return orderedmap.CollectN(func(yield func(string, string) bool) { + attributes.Range(func(k string, v pcommon.Value) bool { + return yield(k, v.AsString()) + }) + }, attributes.Len()) } func convertSliceToArraySet[T any](slice []T) clickhouse.ArraySet { diff --git a/exporter/clickhouseexporter/internal/metrics_model_test.go b/exporter/clickhouseexporter/internal/metrics_model_test.go index 83d983bb8987..6b0c53b800c0 100644 --- a/exporter/clickhouseexporter/internal/metrics_model_test.go +++ b/exporter/clickhouseexporter/internal/metrics_model_test.go @@ -8,6 +8,7 @@ import ( "time" "github.com/ClickHouse/clickhouse-go/v2" + "github.com/ClickHouse/clickhouse-go/v2/lib/column/orderedmap" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" @@ -20,15 +21,15 @@ func Test_attributesToMap(t *testing.T) { attributes.PutBool("bool", true) attributes.PutInt("int", 0) attributes.PutDouble("double", 0.0) - result := attributesToMap(attributes) + result := AttributesToMap(attributes) require.Equal( t, - map[string]string{ + orderedmap.FromMap(map[string]string{ "key": "value", "bool": "true", "int": "0", "double": "0", - }, + }), result, ) } @@ -50,7 +51,6 @@ func Test_convertExemplars(t *testing.T) { require.Equal(t, expectValues, values) require.Equal(t, expectTraceIDs, traceIDs) require.Equal(t, expectSpanIDs, spanIDs) - }) t.Run("one exemplar with only FilteredAttributes", func(t *testing.T) { exemplars := pmetric.NewExemplarSlice() @@ -59,7 +59,7 @@ func Test_convertExemplars(t *testing.T) { exemplar.FilteredAttributes().PutStr("key2", "value2") attrs, times, values, traceIDs, spanIDs := convertExemplars(exemplars) - require.Equal(t, clickhouse.ArraySet{map[string]string{"key1": "value1", "key2": "value2"}}, attrs) + require.Equal(t, clickhouse.ArraySet{orderedmap.FromMap(map[string]string{"key1": "value1", "key2": "value2"})}, attrs) require.Equal(t, clickhouse.ArraySet{time.Date(1970, time.January, 1, 0, 0, 0, 0, time.UTC)}, times) require.Equal(t, clickhouse.ArraySet{0.0}, values) require.Equal(t, clickhouse.ArraySet{"00000000000000000000000000000000"}, traceIDs) @@ -71,7 +71,7 @@ func Test_convertExemplars(t *testing.T) { exemplar.SetTimestamp(pcommon.NewTimestampFromTime(time.Unix(1672218930, 0))) attrs, times, values, traceIDs, spanIDs := convertExemplars(exemplars) - require.Equal(t, clickhouse.ArraySet{map[string]string{}}, attrs) + require.Equal(t, clickhouse.ArraySet{orderedmap.FromMap(map[string]string{})}, attrs) require.Equal(t, clickhouse.ArraySet{time.Unix(1672218930, 0).UTC()}, times) require.Equal(t, clickhouse.ArraySet{0.0}, values) require.Equal(t, clickhouse.ArraySet{"00000000000000000000000000000000"}, traceIDs) @@ -83,7 +83,7 @@ func Test_convertExemplars(t *testing.T) { exemplar.SetDoubleValue(15.0) attrs, times, values, traceIDs, spanIDs := convertExemplars(exemplars) - require.Equal(t, clickhouse.ArraySet{map[string]string{}}, attrs) + require.Equal(t, clickhouse.ArraySet{orderedmap.FromMap(map[string]string{})}, attrs) require.Equal(t, clickhouse.ArraySet{time.Date(1970, time.January, 1, 0, 0, 0, 0, time.UTC)}, times) require.Equal(t, clickhouse.ArraySet{15.0}, values) require.Equal(t, clickhouse.ArraySet{"00000000000000000000000000000000"}, traceIDs) @@ -95,7 +95,7 @@ func Test_convertExemplars(t *testing.T) { exemplar.SetIntValue(20) attrs, times, values, traceIDs, spanIDs := convertExemplars(exemplars) - require.Equal(t, clickhouse.ArraySet{map[string]string{}}, attrs) + require.Equal(t, clickhouse.ArraySet{orderedmap.FromMap(map[string]string{})}, attrs) require.Equal(t, clickhouse.ArraySet{time.Date(1970, time.January, 1, 0, 0, 0, 0, time.UTC)}, times) require.Equal(t, clickhouse.ArraySet{20.0}, values) require.Equal(t, clickhouse.ArraySet{"00000000000000000000000000000000"}, traceIDs) @@ -107,7 +107,7 @@ func Test_convertExemplars(t *testing.T) { exemplar.SetSpanID([8]byte{1, 2, 3, 4}) attrs, times, values, traceIDs, spanIDs := convertExemplars(exemplars) - require.Equal(t, clickhouse.ArraySet{map[string]string{}}, attrs) + require.Equal(t, clickhouse.ArraySet{orderedmap.FromMap(map[string]string{})}, attrs) require.Equal(t, clickhouse.ArraySet{time.Date(1970, time.January, 1, 0, 0, 0, 0, time.UTC)}, times) require.Equal(t, clickhouse.ArraySet{0.0}, values) require.Equal(t, clickhouse.ArraySet{"00000000000000000000000000000000"}, traceIDs) @@ -119,7 +119,7 @@ func Test_convertExemplars(t *testing.T) { exemplar.SetTraceID([16]byte{1, 2, 3, 4}) attrs, times, values, traceIDs, spanIDs := convertExemplars(exemplars) - require.Equal(t, clickhouse.ArraySet{map[string]string{}}, attrs) + require.Equal(t, clickhouse.ArraySet{orderedmap.FromMap(map[string]string{})}, attrs) require.Equal(t, clickhouse.ArraySet{time.Date(1970, time.January, 1, 0, 0, 0, 0, time.UTC)}, times) require.Equal(t, clickhouse.ArraySet{0.0}, values) require.Equal(t, clickhouse.ArraySet{"01020304000000000000000000000000"}, traceIDs) @@ -146,7 +146,7 @@ func Test_convertExemplars(t *testing.T) { exemplar.SetTraceID([16]byte{1, 2, 3, 5}) attrs, times, values, traceIDs, spanIDs := convertExemplars(exemplars) - require.Equal(t, clickhouse.ArraySet{map[string]string{"key1": "value1", "key2": "value2"}, map[string]string{"key3": "value3", "key4": "value4"}}, attrs) + require.Equal(t, clickhouse.ArraySet{orderedmap.FromMap(map[string]string{"key1": "value1", "key2": "value2"}), orderedmap.FromMap(map[string]string{"key3": "value3", "key4": "value4"})}, attrs) require.Equal(t, clickhouse.ArraySet{time.Unix(1672218930, 0).UTC(), time.Unix(1672219930, 0).UTC()}, times) require.Equal(t, clickhouse.ArraySet{20.0, 16.0}, values) require.Equal(t, clickhouse.ArraySet{"01020304000000000000000000000000", "01020305000000000000000000000000"}, traceIDs) @@ -200,7 +200,6 @@ func Test_convertValueAtQuantile(t *testing.T) { require.Equal(t, clickhouse.ArraySet{1.0, 2.0}, quantiles) require.Equal(t, clickhouse.ArraySet{1.0, 2.0}, values) }) - } func Test_getValue(t *testing.T) { diff --git a/exporter/clickhouseexporter/internal/sum_metrics.go b/exporter/clickhouseexporter/internal/sum_metrics.go index 3276dae3a23a..89455f8e3048 100644 --- a/exporter/clickhouseexporter/internal/sum_metrics.go +++ b/exporter/clickhouseexporter/internal/sum_metrics.go @@ -11,14 +11,14 @@ import ( "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" - conventions "go.opentelemetry.io/collector/semconv/v1.18.0" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "go.uber.org/zap" ) const ( // language=ClickHouse SQL createSumTableSQL = ` -CREATE TABLE IF NOT EXISTS %s_sum %s ( +CREATE TABLE IF NOT EXISTS %s %s ( ResourceAttributes Map(LowCardinality(String), String) CODEC(ZSTD(1)), ResourceSchemaUrl String CODEC(ZSTD(1)), ScopeName String CODEC(ZSTD(1)), @@ -42,7 +42,7 @@ CREATE TABLE IF NOT EXISTS %s_sum %s ( SpanId String, TraceId String ) CODEC(ZSTD(1)), - AggTemp Int32 CODEC(ZSTD(1)), + AggregationTemporality Int32 CODEC(ZSTD(1)), IsMonotonic Boolean CODEC(Delta, ZSTD(1)), INDEX idx_res_attr_key mapKeys(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, INDEX idx_res_attr_value mapValues(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, @@ -57,7 +57,7 @@ ORDER BY (ServiceName, MetricName, Attributes, toUnixTimestamp64Nano(TimeUnix)) SETTINGS index_granularity=8192, ttl_only_drop_parts = 1; ` // language=ClickHouse SQL - insertSumTableSQL = `INSERT INTO %s_sum ( + insertSumTableSQL = `INSERT INTO %s ( ResourceAttributes, ResourceSchemaUrl, ScopeName, @@ -79,7 +79,7 @@ SETTINGS index_granularity=8192, ttl_only_drop_parts = 1; Exemplars.Value, Exemplars.SpanId, Exemplars.TraceId, - AggTemp, + AggregationTemporality, IsMonotonic) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)` ) @@ -113,27 +113,24 @@ func (s *sumMetrics) insert(ctx context.Context, db *sql.DB) error { }() for _, model := range s.sumModel { - var serviceName string - if v, ok := model.metadata.ResAttr[conventions.AttributeServiceName]; ok { - serviceName = v - } + serviceName, _ := model.metadata.ResAttr.Get(conventions.AttributeServiceName) for i := 0; i < model.sum.DataPoints().Len(); i++ { dp := model.sum.DataPoints().At(i) attrs, times, values, traceIDs, spanIDs := convertExemplars(dp.Exemplars()) _, err = statement.ExecContext(ctx, - model.metadata.ResAttr, + AttributesToMap(model.metadata.ResAttr), model.metadata.ResURL, model.metadata.ScopeInstr.Name(), model.metadata.ScopeInstr.Version(), - attributesToMap(model.metadata.ScopeInstr.Attributes()), + AttributesToMap(model.metadata.ScopeInstr.Attributes()), model.metadata.ScopeInstr.DroppedAttributesCount(), model.metadata.ScopeURL, - serviceName, + serviceName.AsString(), model.metricName, model.metricDescription, model.metricUnit, - attributesToMap(dp.Attributes()), + AttributesToMap(dp.Attributes()), dp.StartTimestamp().AsTime(), dp.Timestamp().AsTime(), getValue(dp.IntValue(), dp.DoubleValue(), dp.ValueType()), @@ -165,7 +162,7 @@ func (s *sumMetrics) insert(ctx context.Context, db *sql.DB) error { return nil } -func (s *sumMetrics) Add(resAttr map[string]string, resURL string, scopeInstr pcommon.InstrumentationScope, scopeURL string, metrics any, name string, description string, unit string) error { +func (s *sumMetrics) Add(resAttr pcommon.Map, resURL string, scopeInstr pcommon.InstrumentationScope, scopeURL string, metrics any, name string, description string, unit string) error { sum, ok := metrics.(pmetric.Sum) if !ok { return fmt.Errorf("metrics param is not type of Sum") diff --git a/exporter/clickhouseexporter/internal/summary_metrics.go b/exporter/clickhouseexporter/internal/summary_metrics.go index 5f3ca7beab8e..d98197c12b2e 100644 --- a/exporter/clickhouseexporter/internal/summary_metrics.go +++ b/exporter/clickhouseexporter/internal/summary_metrics.go @@ -11,14 +11,14 @@ import ( "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" - conventions "go.opentelemetry.io/collector/semconv/v1.18.0" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "go.uber.org/zap" ) const ( // language=ClickHouse SQL createSummaryTableSQL = ` -CREATE TABLE IF NOT EXISTS %s_summary %s ( +CREATE TABLE IF NOT EXISTS %s %s ( ResourceAttributes Map(LowCardinality(String), String) CODEC(ZSTD(1)), ResourceSchemaUrl String CODEC(ZSTD(1)), ScopeName String CODEC(ZSTD(1)), @@ -53,7 +53,7 @@ ORDER BY (ServiceName, MetricName, Attributes, toUnixTimestamp64Nano(TimeUnix)) SETTINGS index_granularity=8192, ttl_only_drop_parts = 1; ` // language=ClickHouse SQL - insertSummaryTableSQL = `INSERT INTO %s_summary ( + insertSummaryTableSQL = `INSERT INTO %s ( ResourceAttributes, ResourceSchemaUrl, ScopeName, @@ -103,28 +103,25 @@ func (s *summaryMetrics) insert(ctx context.Context, db *sql.DB) error { _ = statement.Close() }() for _, model := range s.summaryModel { - var serviceName string - if v, ok := model.metadata.ResAttr[conventions.AttributeServiceName]; ok { - serviceName = v - } + serviceName, _ := model.metadata.ResAttr.Get(conventions.AttributeServiceName) for i := 0; i < model.summary.DataPoints().Len(); i++ { dp := model.summary.DataPoints().At(i) quantiles, values := convertValueAtQuantile(dp.QuantileValues()) _, err = statement.ExecContext(ctx, - model.metadata.ResAttr, + AttributesToMap(model.metadata.ResAttr), model.metadata.ResURL, model.metadata.ScopeInstr.Name(), model.metadata.ScopeInstr.Version(), - attributesToMap(model.metadata.ScopeInstr.Attributes()), + AttributesToMap(model.metadata.ScopeInstr.Attributes()), model.metadata.ScopeInstr.DroppedAttributesCount(), model.metadata.ScopeURL, - serviceName, + serviceName.AsString(), model.metricName, model.metricDescription, model.metricUnit, - attributesToMap(dp.Attributes()), + AttributesToMap(dp.Attributes()), dp.StartTimestamp().AsTime(), dp.Timestamp().AsTime(), dp.Count(), @@ -153,7 +150,7 @@ func (s *summaryMetrics) insert(ctx context.Context, db *sql.DB) error { return nil } -func (s *summaryMetrics) Add(resAttr map[string]string, resURL string, scopeInstr pcommon.InstrumentationScope, scopeURL string, metrics any, name string, description string, unit string) error { +func (s *summaryMetrics) Add(resAttr pcommon.Map, resURL string, scopeInstr pcommon.InstrumentationScope, scopeURL string, metrics any, name string, description string, unit string) error { summary, ok := metrics.(pmetric.Summary) if !ok { return fmt.Errorf("metrics param is not type of Summary") diff --git a/exporter/clickhouseexporter/metadata.yaml b/exporter/clickhouseexporter/metadata.yaml index 51646315c0e9..b26a30c072f4 100644 --- a/exporter/clickhouseexporter/metadata.yaml +++ b/exporter/clickhouseexporter/metadata.yaml @@ -1,10 +1,10 @@ type: clickhouse -scope_name: otelcol/clickhouse status: class: exporter stability: - alpha: [traces, metrics, logs] + alpha: [metrics] + beta: [traces, logs] distributions: [contrib] codeowners: active: [hanjm, dmitryax, Frapschen, SpencerTorres] diff --git a/exporter/clickhouseexporter/testdata/config.yaml b/exporter/clickhouseexporter/testdata/config.yaml index 1531e4578782..9eb443cde3da 100644 --- a/exporter/clickhouseexporter/testdata/config.yaml +++ b/exporter/clickhouseexporter/testdata/config.yaml @@ -17,6 +17,17 @@ clickhouse/full: sending_queue: queue_size: 100 storage: file_storage/clickhouse + metrics_tables: + gauge: + name: "otel_metrics_custom_gauge" + sum: + name: "otel_metrics_custom_sum" + summary: + name: "otel_metrics_custom_summary" + histogram: + name: "otel_metrics_custom_histogram" + exponential_histogram: + name: "otel_metrics_custom_exp_histogram" clickhouse/invalid-endpoint: endpoint: 127.0.0.1:9000 diff --git a/exporter/coralogixexporter/README.md b/exporter/coralogixexporter/README.md index ab06651aee06..5b9f1e3139e4 100644 --- a/exporter/coralogixexporter/README.md +++ b/exporter/coralogixexporter/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fcoralogix%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fcoralogix) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fcoralogix%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fcoralogix) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@povilasv](https://www.github.com/povilasv), [@matej-g](https://www.github.com/matej-g) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib @@ -86,14 +86,15 @@ exporters: Depending on your region, you might need to use a different domain. Here are the available domains: -| Region | Domain | -|---------|---------------------------------| -| USA1 | `coralogix.us` | -| USA2 | `cx498.coralogix.com` | -| APAC1 | `coralogix.in` | -| APAC2 | `coralogixsg.com` | -| EUROPE1 | `coralogix.com` | -| EUROPE2 | `eu2.coralogix.com` | +| Region | Domain | +|---------|-------------------------| +| USA1 | `coralogix.us` | +| USA2 | `cx498.coralogix.com` | +| APAC1 | `coralogix.in` | +| APAC2 | `coralogixsg.com` | +| APAC3 | `ap3.coralogix.com` | +| EUROPE1 | `coralogix.com` | +| EUROPE2 | `eu2.coralogix.com` | Additionally, Coralogix supports AWS PrivateLink, which provides private connectivity between virtual private clouds (VPCs), supported AWS services, and your on-premises networks without exposing your traffic to the public internet. @@ -231,7 +232,7 @@ exporters: ### Exporting to multiple teams based on attributes You can export the signals based on your business logic (attributes) to different Coralogix teams. To achieve this, you'll need to use the [`filter`](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/filterprocessor/README.md) processor and setup one pipeline per team. You can setup your `filter` processors as following (example with metrics): -``` +```yaml processors: filter/teamA: metrics: @@ -246,7 +247,7 @@ processors: This configuration ensures separate processor per each team. Any data points without an attribute for a particular team will be dropped from exporting. Secondly, set up an individual exporter per each team: -``` +```yaml exporters: coralogix/teamA: metrics: @@ -263,7 +264,7 @@ exporters: ``` Finally, join each processor and exporter (and any other components you wish) in the pipelines. Here is an example with a Prometheus receiver: -``` +```yaml service: pipelines: metrics/1: @@ -276,6 +277,44 @@ service: exporters: [coralogix/teamB] ``` +### Custom application and subsystem name + +You can pass custom application and subsystem name via the following resource attributes: + +- `cx.subsystem.name` +- `cx.application.name` +For example: + +```yaml +receivers: + filelog/nginx: + include: + - '/tmp/tmp.log' + include_file_path: true + include_file_name: false + start_at: end + resource: + cx.subsystem.name: nginx + filelog/access-log: + include: + - '/tmp/access.log' + include_file_path: true + include_file_name: false + resource: + cx.subsystem.name: access-log +exporters: + coralogix: + domain: 'coralogix.com' + private_key: "XXX" + application_name: 'app_name' + timeout: 30s +service: + pipelines: + logs: + receivers: [filelog/nginx, filelog/access-log] + exporters: [coralogix] +``` + ### Need help? Our world-class customer success team is available 24/7 to walk you through the setup for this exporter and answer any questions that may come up. diff --git a/exporter/coralogixexporter/config.go b/exporter/coralogixexporter/config.go index d37da458fea6..df679be3c5d0 100644 --- a/exporter/coralogixexporter/config.go +++ b/exporter/coralogixexporter/config.go @@ -20,9 +20,9 @@ const ( // Config defines by Coralogix. type Config struct { - exporterhelper.QueueSettings `mapstructure:"sending_queue"` - configretry.BackOffConfig `mapstructure:"retry_on_failure"` - exporterhelper.TimeoutSettings `mapstructure:",squash"` + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` + configretry.BackOffConfig `mapstructure:"retry_on_failure"` + TimeoutSettings exporterhelper.TimeoutConfig `mapstructure:",squash"` // Coralogix domain Domain string `mapstructure:"domain"` @@ -63,6 +63,7 @@ func isEmpty(endpoint string) bool { } return false } + func (c *Config) Validate() error { // validate that at least one endpoint is set up correctly if isEmpty(c.Domain) && @@ -113,6 +114,18 @@ func (c *Config) getMetadataFromResource(res pcommon.Resource) (appName, subsyst subsystem = c.SubSystem } + if appName == "" { + attr, ok := res.Attributes().Get(cxAppNameAttrName) + if ok && attr.AsString() != "" { + appName = attr.AsString() + } + } + if subsystem == "" { + attr, ok := res.Attributes().Get(cxSubsystemNameAttrName) + if ok && attr.AsString() != "" { + subsystem = attr.AsString() + } + } return appName, subsystem } diff --git a/exporter/coralogixexporter/config_test.go b/exporter/coralogixexporter/config_test.go index 139f88aa1022..fe6bf96e79a5 100644 --- a/exporter/coralogixexporter/config_test.go +++ b/exporter/coralogixexporter/config_test.go @@ -38,13 +38,13 @@ func TestLoadConfig(t *testing.T) { { id: component.NewIDWithName(metadata.Type, ""), expected: &Config{ - QueueSettings: exporterhelper.NewDefaultQueueSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), BackOffConfig: configretry.NewDefaultBackOffConfig(), PrivateKey: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", AppName: "APP_NAME", // Deprecated: [v0.47.0] SubSystem will remove in the next version SubSystem: "SUBSYSTEM_NAME", - TimeoutSettings: exporterhelper.NewDefaultTimeoutSettings(), + TimeoutSettings: exporterhelper.NewDefaultTimeoutConfig(), DomainSettings: configgrpc.ClientConfig{ Compression: configcompression.TypeGzip, }, @@ -93,13 +93,13 @@ func TestLoadConfig(t *testing.T) { { id: component.NewIDWithName(metadata.Type, "all"), expected: &Config{ - QueueSettings: exporterhelper.NewDefaultQueueSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), BackOffConfig: configretry.NewDefaultBackOffConfig(), PrivateKey: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", AppName: "APP_NAME", // Deprecated: [v0.47.0] SubSystem will remove in the next version SubSystem: "SUBSYSTEM_NAME", - TimeoutSettings: exporterhelper.NewDefaultTimeoutSettings(), + TimeoutSettings: exporterhelper.NewDefaultTimeoutConfig(), DomainSettings: configgrpc.ClientConfig{ Compression: configcompression.TypeGzip, }, @@ -156,7 +156,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) @@ -172,9 +172,9 @@ func TestTraceExporter(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() te, err := newTracesExporter(cfg, params) assert.NoError(t, err) assert.NotNil(t, te, "failed to create trace exporter") @@ -190,10 +190,10 @@ func TestMetricsExporter(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "metrics").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) require.NoError(t, component.ValidateConfig(cfg)) - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() me, err := newMetricsExporter(cfg, params) require.NoError(t, err) @@ -210,10 +210,10 @@ func TestLogsExporter(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "logs").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) require.NoError(t, component.ValidateConfig(cfg)) - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() le, err := newLogsExporter(cfg, params) require.NoError(t, err) @@ -230,9 +230,9 @@ func TestDomainWithAllExporters(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "domain").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() te, err := newTracesExporter(cfg, params) assert.NoError(t, err) assert.NotNil(t, te, "failed to create trace exporter") @@ -260,9 +260,9 @@ func TestEndpoindsAndDomainWithAllExporters(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "domain_endoints").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() te, err := newTracesExporter(cfg, params) assert.NoError(t, err) assert.NotNil(t, te, "failed to create trace exporter") @@ -293,6 +293,10 @@ func TestGetMetadataFromResource(t *testing.T) { r2.Attributes().PutStr("k8s.node.name", "node-test") r2.Attributes().PutStr("k8s.namespace.name", "namespace-test") + r3 := pcommon.NewResource() + r3.Attributes().PutStr("cx.application.name", "application") + r3.Attributes().PutStr("cx.subsystem.name", "subsystem") + c := &Config{ AppNameAttributes: []string{"k8s.container.name", "k8s.deployment.name", "k8s.node.name"}, SubSystemAttributes: []string{"k8s.namespace.name", "k8s.node.name"}, @@ -305,4 +309,8 @@ func TestGetMetadataFromResource(t *testing.T) { appName, subSystemName = c.getMetadataFromResource(r2) assert.Equal(t, "node-test", appName) assert.Equal(t, "namespace-test", subSystemName) + + appName, subSystemName = c.getMetadataFromResource(r3) + assert.Equal(t, "application", appName) + assert.Equal(t, "subsystem", subSystemName) } diff --git a/exporter/coralogixexporter/factory.go b/exporter/coralogixexporter/factory.go index 961d93b91ba8..5c3692f3ae89 100644 --- a/exporter/coralogixexporter/factory.go +++ b/exporter/coralogixexporter/factory.go @@ -32,9 +32,9 @@ func NewFactory() exporter.Factory { func createDefaultConfig() component.Config { return &Config{ - QueueSettings: exporterhelper.NewDefaultQueueSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), BackOffConfig: configretry.NewDefaultBackOffConfig(), - TimeoutSettings: exporterhelper.NewDefaultTimeoutSettings(), + TimeoutSettings: exporterhelper.NewDefaultTimeoutConfig(), DomainSettings: configgrpc.ClientConfig{ Compression: configcompression.TypeGzip, }, @@ -61,7 +61,7 @@ func createDefaultConfig() component.Config { } } -func createTraceExporter(ctx context.Context, set exporter.CreateSettings, config component.Config) (exporter.Traces, error) { +func createTraceExporter(ctx context.Context, set exporter.Settings, config component.Config) (exporter.Traces, error) { cfg := config.(*Config) exporter, err := newTracesExporter(cfg, set) @@ -69,7 +69,7 @@ func createTraceExporter(ctx context.Context, set exporter.CreateSettings, confi return nil, err } - return exporterhelper.NewTracesExporter( + return exporterhelper.NewTraces( ctx, set, config, @@ -85,7 +85,7 @@ func createTraceExporter(ctx context.Context, set exporter.CreateSettings, confi func createMetricsExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exporter.Metrics, error) { oce, err := newMetricsExporter(cfg, set) @@ -93,7 +93,7 @@ func createMetricsExporter( return nil, err } oCfg := cfg.(*Config) - return exporterhelper.NewMetricsExporter( + return exporterhelper.NewMetrics( ctx, set, cfg, @@ -109,7 +109,7 @@ func createMetricsExporter( func createLogsExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exporter.Logs, error) { oce, err := newLogsExporter(cfg, set) @@ -117,7 +117,7 @@ func createLogsExporter( return nil, err } oCfg := cfg.(*Config) - return exporterhelper.NewLogsExporter( + return exporterhelper.NewLogs( ctx, set, cfg, diff --git a/exporter/coralogixexporter/factory_test.go b/exporter/coralogixexporter/factory_test.go index 3b1858315f2c..ae44034638ea 100644 --- a/exporter/coralogixexporter/factory_test.go +++ b/exporter/coralogixexporter/factory_test.go @@ -30,56 +30,56 @@ func TestCreateDefaultConfig(t *testing.T) { ocfg, ok := factory.CreateDefaultConfig().(*Config) assert.True(t, ok) assert.Equal(t, ocfg.BackOffConfig, configretry.NewDefaultBackOffConfig()) - assert.Equal(t, ocfg.QueueSettings, exporterhelper.NewDefaultQueueSettings()) - assert.Equal(t, ocfg.TimeoutSettings, exporterhelper.NewDefaultTimeoutSettings()) + assert.Equal(t, ocfg.QueueSettings, exporterhelper.NewDefaultQueueConfig()) + assert.Equal(t, ocfg.TimeoutSettings, exporterhelper.NewDefaultTimeoutConfig()) } -func TestCreateMetricsExporter(t *testing.T) { +func TestCreateMetrics(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig().(*Config) cfg.Metrics.Endpoint = testutil.GetAvailableLocalAddress(t) - set := exportertest.NewNopCreateSettings() - oexp, err := factory.CreateMetricsExporter(context.Background(), set, cfg) + set := exportertest.NewNopSettings() + oexp, err := factory.CreateMetrics(context.Background(), set, cfg) require.NoError(t, err) require.NotNil(t, oexp) require.NoError(t, oexp.Shutdown(context.Background())) } -func TestCreateMetricsExporterWithDomain(t *testing.T) { +func TestCreateMetricsWithDomain(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig().(*Config) cfg.Domain = "localhost" - set := exportertest.NewNopCreateSettings() - oexp, err := factory.CreateMetricsExporter(context.Background(), set, cfg) + set := exportertest.NewNopSettings() + oexp, err := factory.CreateMetrics(context.Background(), set, cfg) require.NoError(t, err) require.NotNil(t, oexp) } -func TestCreateLogsExporter(t *testing.T) { +func TestCreateLogs(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig().(*Config) cfg.Logs.Endpoint = testutil.GetAvailableLocalAddress(t) - set := exportertest.NewNopCreateSettings() - oexp, err := factory.CreateLogsExporter(context.Background(), set, cfg) + set := exportertest.NewNopSettings() + oexp, err := factory.CreateLogs(context.Background(), set, cfg) require.NoError(t, err) require.NotNil(t, oexp) require.NoError(t, oexp.Shutdown(context.Background())) } -func TestCreateLogsExporterWithDomain(t *testing.T) { +func TestCreateLogsWithDomain(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig().(*Config) cfg.Domain = "localhost" - set := exportertest.NewNopCreateSettings() - oexp, err := factory.CreateLogsExporter(context.Background(), set, cfg) + set := exportertest.NewNopSettings() + oexp, err := factory.CreateLogs(context.Background(), set, cfg) require.NoError(t, err) require.NotNil(t, oexp) } -func TestCreateTracesExporter(t *testing.T) { +func TestCreateTraces(t *testing.T) { endpoint := testutil.GetAvailableLocalAddress(t) tests := []struct { name string @@ -197,8 +197,8 @@ func TestCreateTracesExporter(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { factory := NewFactory() - set := exportertest.NewNopCreateSettings() - consumer, err := factory.CreateTracesExporter(context.Background(), set, tt.config) + set := exportertest.NewNopSettings() + consumer, err := factory.CreateTraces(context.Background(), set, tt.config) if tt.mustFailOnCreate { assert.Error(t, err) return @@ -215,21 +215,21 @@ func TestCreateTracesExporter(t *testing.T) { if err != nil { // Since the endpoint of OTLP exporter doesn't actually exist, // exporter may already stop because it cannot connect. - assert.Equal(t, err.Error(), "rpc error: code = Canceled desc = grpc: the client connection is closing") + assert.Equal(t, "rpc error: code = Canceled desc = grpc: the client connection is closing", err.Error()) } }) } } -func TestCreateLogsExporterWithDomainAndEndpoint(t *testing.T) { +func TestCreateLogsWithDomainAndEndpoint(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig().(*Config) cfg.Domain = " bad domain" cfg.Logs.Endpoint = testutil.GetAvailableLocalAddress(t) - set := exportertest.NewNopCreateSettings() - consumer, err := factory.CreateLogsExporter(context.Background(), set, cfg) + set := exportertest.NewNopSettings() + consumer, err := factory.CreateLogs(context.Background(), set, cfg) require.NoError(t, err) require.NotNil(t, consumer) @@ -240,7 +240,6 @@ func TestCreateLogsExporterWithDomainAndEndpoint(t *testing.T) { if err != nil { // Since the endpoint of OTLP exporter doesn't actually exist, // exporter may already stop because it cannot connect. - assert.Equal(t, err.Error(), "rpc error: code = Canceled desc = grpc: the client connection is closing") + assert.Equal(t, "rpc error: code = Canceled desc = grpc: the client connection is closing", err.Error()) } - } diff --git a/exporter/coralogixexporter/generated_component_test.go b/exporter/coralogixexporter/generated_component_test.go index 2a9363fb334b..aa6e56bf46b2 100644 --- a/exporter/coralogixexporter/generated_component_test.go +++ b/exporter/coralogixexporter/generated_component_test.go @@ -32,27 +32,27 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, { name: "metrics", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg) }, }, { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -64,21 +64,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(exporter.Logs) require.True(t, ok) diff --git a/exporter/coralogixexporter/go.mod b/exporter/coralogixexporter/go.mod index ae83abbb2ac3..74b9d8a85eec 100644 --- a/exporter/coralogixexporter/go.mod +++ b/exporter/coralogixexporter/go.mod @@ -1,75 +1,79 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/coralogixexporter -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configcompression v1.9.0 - go.opentelemetry.io/collector/config/configgrpc v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/collector/config/configtls v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configcompression v1.22.0 + go.opentelemetry.io/collector/config/configgrpc v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/config/configtls v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 go.uber.org/goleak v1.3.0 - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 - google.golang.org/grpc v1.64.0 + google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 + google.golang.org/grpc v1.68.1 ) require ( - github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.2 // indirect + github.com/klauspost/compress v1.17.9 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/mostynb/go-grpc-compression v1.2.2 // indirect + github.com/mostynb/go-grpc-compression v1.2.3 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/confignet v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/confignet v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.30.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.19.0 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/coralogixexporter/go.sum b/exporter/coralogixexporter/go.sum index 14ecb3efcf82..97c5d30c6e7b 100644 --- a/exporter/coralogixexporter/go.sum +++ b/exporter/coralogixexporter/go.sum @@ -1,23 +1,21 @@ -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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= @@ -31,14 +29,14 @@ 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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4= -github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -52,80 +50,96 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mostynb/go-grpc-compression v1.2.2 h1:XaDbnRvt2+1vgr0b/l0qh4mJAfIxE0bKXtz2Znl3GGI= -github.com/mostynb/go-grpc-compression v1.2.2/go.mod h1:GOCr2KBxXcblCuczg3YdLQlcin1/NfyDA348ckuCH6w= +github.com/mostynb/go-grpc-compression v1.2.3 h1:42/BKWMy0KEJGSdWvzqIyOZ95YcR9mLPqKctH7Uo//I= +github.com/mostynb/go-grpc-compression v1.2.3/go.mod h1:AghIxF3P57umzqM9yz795+y1Vjs47Km/Y2FE6ouQ7Lg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/configgrpc v0.102.0 h1:cQi5HwpkHvrZJUxZjoGXkWpAuK+gEyp/1Zjn0BrkvmQ= -go.opentelemetry.io/collector/config/configgrpc v0.102.0/go.mod h1:ASpBXzDWLiDGlG8iRFovU5R4LhAefoC4ajm+qIdslOw= -go.opentelemetry.io/collector/config/confignet v0.102.0 h1:+wQevJ/iBnPxL+roY7WWnAjMxB8v4M5QrS3+0iEmauw= -go.opentelemetry.io/collector/config/confignet v0.102.0/go.mod h1:pfOrCTfSZEB6H2rKtx41/3RN4dKs+X2EKQbw3MGRh0E= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 h1:vS1Ao/R55RNV4O7TA2Qopok8yN+X0LIP6RVWLFkprck= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0/go.mod h1:BMsdeOxN04K0L5FNUBfjFdvwWGNe/rkmSwH4Aelu/X0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/configgrpc v0.116.0 h1:O8Y1X9wDH5dDdqDJ9kqoaMrxEauaDSJBg9aNC6QgB7g= +go.opentelemetry.io/collector/config/configgrpc v0.116.0/go.mod h1:RPrSQrr6xhIaAK2DdcECi142NjSo0npQfVQB3nommSo= +go.opentelemetry.io/collector/config/confignet v1.22.0 h1:SBEMHJZWD8J4qgFw1O+BEkXW9AWldDi6Fz5YeDeoU58= +go.opentelemetry.io/collector/config/confignet v1.22.0/go.mod h1:ZppUH1hgUJOubawEsxsQ9MzEYFytqo2GnVSS7d4CVxc= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 h1:yMkBS9yViCc7U7yeLzJPM2XizlfdVvBRSmsQDWu6qc0= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0/go.mod h1:n8MR6/liuGB5EmTETUBeU5ZgqMOlqKRxUaqPQBOANZ8= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -141,20 +155,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -163,12 +177,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 h1:QCqS/PdaHTSWGvupk2F/ehwHtGc0/GYkT+3GAcR1CCc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/exporter/coralogixexporter/internal/metadata/generated_status.go b/exporter/coralogixexporter/internal/metadata/generated_status.go index 49ac9331090e..da8fc2aefc95 100644 --- a/exporter/coralogixexporter/internal/metadata/generated_status.go +++ b/exporter/coralogixexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("coralogix") + Type = component.MustNewType("coralogix") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/coralogixexporter" ) const ( diff --git a/exporter/coralogixexporter/internal/metadata/generated_telemetry.go b/exporter/coralogixexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index 7ce017041f76..000000000000 --- a/exporter/coralogixexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/coralogix") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/coralogix") -} diff --git a/exporter/coralogixexporter/internal/metadata/generated_telemetry_test.go b/exporter/coralogixexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index c4e1264af71b..000000000000 --- a/exporter/coralogixexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/coralogix", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/coralogix", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/coralogixexporter/logs_client.go b/exporter/coralogixexporter/logs_client.go index 7504168d6bdd..99c66c200255 100644 --- a/exporter/coralogixexporter/logs_client.go +++ b/exporter/coralogixexporter/logs_client.go @@ -10,6 +10,7 @@ import ( "runtime" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configgrpc" "go.opentelemetry.io/collector/config/configopaque" exp "go.opentelemetry.io/collector/exporter" "go.opentelemetry.io/collector/pdata/plog" @@ -18,7 +19,7 @@ import ( "google.golang.org/grpc/metadata" ) -func newLogsExporter(cfg component.Config, set exp.CreateSettings) (*logsExporter, error) { +func newLogsExporter(cfg component.Config, set exp.Settings) (*logsExporter, error) { oCfg := cfg.(*Config) if isEmpty(oCfg.Domain) && isEmpty(oCfg.Logs.Endpoint) { @@ -47,12 +48,12 @@ type logsExporter struct { func (e *logsExporter) start(ctx context.Context, host component.Host) (err error) { switch { case !isEmpty(e.config.Logs.Endpoint): - if e.clientConn, err = e.config.Logs.ToClientConn(ctx, host, e.settings, grpc.WithUserAgent(e.userAgent)); err != nil { + if e.clientConn, err = e.config.Logs.ToClientConn(ctx, host, e.settings, configgrpc.WithGrpcDialOption(grpc.WithUserAgent(e.userAgent))); err != nil { return err } case !isEmpty(e.config.Domain): - if e.clientConn, err = e.config.getDomainGrpcSettings().ToClientConn(ctx, host, e.settings, grpc.WithUserAgent(e.userAgent)); err != nil { + if e.clientConn, err = e.config.getDomainGrpcSettings().ToClientConn(ctx, host, e.settings, configgrpc.WithGrpcDialOption(grpc.WithUserAgent(e.userAgent))); err != nil { return err } } @@ -78,7 +79,6 @@ func (e *logsExporter) shutdown(context.Context) error { } func (e *logsExporter) pushLogs(ctx context.Context, ld plog.Logs) error { - rss := ld.ResourceLogs() for i := 0; i < rss.Len(); i++ { resourceLog := rss.At(i) diff --git a/exporter/coralogixexporter/metadata.yaml b/exporter/coralogixexporter/metadata.yaml index 0ab4c2ccd759..3a71eaa14949 100644 --- a/exporter/coralogixexporter/metadata.yaml +++ b/exporter/coralogixexporter/metadata.yaml @@ -1,5 +1,4 @@ type: coralogix -scope_name: otelcol/coralogix status: class: exporter diff --git a/exporter/coralogixexporter/metrics_client.go b/exporter/coralogixexporter/metrics_client.go index 2d52b8d8544b..64aa5d6ba88f 100644 --- a/exporter/coralogixexporter/metrics_client.go +++ b/exporter/coralogixexporter/metrics_client.go @@ -11,6 +11,7 @@ import ( "time" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configgrpc" "go.opentelemetry.io/collector/config/configopaque" "go.opentelemetry.io/collector/consumer/consumererror" "go.opentelemetry.io/collector/exporter" @@ -24,7 +25,7 @@ import ( "google.golang.org/grpc/status" ) -func newMetricsExporter(cfg component.Config, set exporter.CreateSettings) (*metricsExporter, error) { +func newMetricsExporter(cfg component.Config, set exporter.Settings) (*metricsExporter, error) { oCfg := cfg.(*Config) if isEmpty(oCfg.Domain) && isEmpty(oCfg.Metrics.Endpoint) { @@ -51,14 +52,13 @@ type metricsExporter struct { } func (e *metricsExporter) start(ctx context.Context, host component.Host) (err error) { - switch { case !isEmpty(e.config.Metrics.Endpoint): - if e.clientConn, err = e.config.Metrics.ToClientConn(ctx, host, e.settings, grpc.WithUserAgent(e.userAgent)); err != nil { + if e.clientConn, err = e.config.Metrics.ToClientConn(ctx, host, e.settings, configgrpc.WithGrpcDialOption(grpc.WithUserAgent(e.userAgent))); err != nil { return err } case !isEmpty(e.config.Domain): - if e.clientConn, err = e.config.getDomainGrpcSettings().ToClientConn(ctx, host, e.settings, grpc.WithUserAgent(e.userAgent)); err != nil { + if e.clientConn, err = e.config.getDomainGrpcSettings().ToClientConn(ctx, host, e.settings, configgrpc.WithGrpcDialOption(grpc.WithUserAgent(e.userAgent))); err != nil { return err } } @@ -77,7 +77,6 @@ func (e *metricsExporter) start(ctx context.Context, host component.Host) (err e } func (e *metricsExporter) pushMetrics(ctx context.Context, md pmetric.Metrics) error { - rss := md.ResourceMetrics() for i := 0; i < rss.Len(); i++ { resourceMetric := rss.At(i) diff --git a/exporter/coralogixexporter/traces_client.go b/exporter/coralogixexporter/traces_client.go index 736c10857a03..2b5665624687 100644 --- a/exporter/coralogixexporter/traces_client.go +++ b/exporter/coralogixexporter/traces_client.go @@ -10,6 +10,7 @@ import ( "runtime" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configgrpc" "go.opentelemetry.io/collector/config/configopaque" "go.opentelemetry.io/collector/exporter" "go.opentelemetry.io/collector/pdata/ptrace" @@ -32,7 +33,7 @@ type tracesExporter struct { userAgent string } -func newTracesExporter(cfg component.Config, set exporter.CreateSettings) (*tracesExporter, error) { +func newTracesExporter(cfg component.Config, set exporter.Settings) (*tracesExporter, error) { oCfg, ok := cfg.(*Config) if !ok { return nil, fmt.Errorf("invalid config exporter, expect type: %T, got: %T", &Config{}, cfg) @@ -48,14 +49,13 @@ func newTracesExporter(cfg component.Config, set exporter.CreateSettings) (*trac } func (e *tracesExporter) start(ctx context.Context, host component.Host) (err error) { - switch { case !isEmpty(e.config.Traces.Endpoint): - if e.clientConn, err = e.config.Traces.ToClientConn(ctx, host, e.settings, grpc.WithUserAgent(e.userAgent)); err != nil { + if e.clientConn, err = e.config.Traces.ToClientConn(ctx, host, e.settings, configgrpc.WithGrpcDialOption(grpc.WithUserAgent(e.userAgent))); err != nil { return err } case !isEmpty(e.config.Domain): - if e.clientConn, err = e.config.getDomainGrpcSettings().ToClientConn(ctx, host, e.settings, grpc.WithUserAgent(e.userAgent)); err != nil { + if e.clientConn, err = e.config.getDomainGrpcSettings().ToClientConn(ctx, host, e.settings, configgrpc.WithGrpcDialOption(grpc.WithUserAgent(e.userAgent))); err != nil { return err } } @@ -74,14 +74,12 @@ func (e *tracesExporter) start(ctx context.Context, host component.Host) (err er } func (e *tracesExporter) pushTraces(ctx context.Context, td ptrace.Traces) error { - rss := td.ResourceSpans() for i := 0; i < rss.Len(); i++ { resourceSpan := rss.At(i) appName, subsystem := e.config.getMetadataFromResource(resourceSpan.Resource()) resourceSpan.Resource().Attributes().PutStr(cxAppNameAttrName, appName) resourceSpan.Resource().Attributes().PutStr(cxSubsystemNameAttrName, subsystem) - } _, err := e.traceExporter.Export(e.enhanceContext(ctx), ptraceotlp.NewExportRequestFromTraces(td), e.callOptions...) @@ -91,6 +89,7 @@ func (e *tracesExporter) pushTraces(ctx context.Context, td ptrace.Traces) error return nil } + func (e *tracesExporter) shutdown(context.Context) error { if e.clientConn == nil { return nil diff --git a/exporter/datadogexporter/README.md b/exporter/datadogexporter/README.md index 5265fecd8f13..73524f795985 100644 --- a/exporter/datadogexporter/README.md +++ b/exporter/datadogexporter/README.md @@ -3,15 +3,13 @@ | Status | | | ------------- |-----------| -| Stability | [alpha]: logs | -| | [beta]: traces, metrics | +| Stability | [beta]: traces, metrics, logs | | Distributions | [contrib] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fdatadog%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fdatadog) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fdatadog%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fdatadog) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@mx-psi](https://www.github.com/mx-psi), [@dineshg13](https://www.github.com/dineshg13), [@liustanley](https://www.github.com/liustanley), [@songy23](https://www.github.com/songy23), [@mackjmr](https://www.github.com/mackjmr), [@ankitpatel96](https://www.github.com/ankitpatel96) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@mx-psi](https://www.github.com/mx-psi), [@dineshg13](https://www.github.com/dineshg13), [@liustanley](https://www.github.com/liustanley), [@songy23](https://www.github.com/songy23), [@mackjmr](https://www.github.com/mackjmr), [@ankitpatel96](https://www.github.com/ankitpatel96), [@jade-guiton-dd](https://www.github.com/jade-guiton-dd) | | Emeritus | [@gbbr](https://www.github.com/gbbr) | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib @@ -20,7 +18,7 @@ > The Datadog Exporter now skips APM stats computation by default. It is recommended to only use the [Datadog Connector](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/connector/datadogconnector) in order to compute APM stats. > To temporarily revert to the previous behavior, disable the `exporter.datadogexporter.DisableAPMStats` feature gate. Example: `otelcol --config=config.yaml --feature-gates=-exporter.datadogexporter.DisableAPMStats` -Visit the [official documentation](https://docs.datadoghq.com/tracing/trace_collection/open_standards/otel_collector_datadog_exporter/) for usage instructions. +Find the full configs of Datadog exporter and their usage in [collector.yaml](./examples/collector.yaml). More example configs can be found in the [official documentation](https://docs.datadoghq.com/opentelemetry/collector_exporter/configuration/). ## FAQs @@ -62,7 +60,9 @@ Note that we are currently migrating the Datadog metrics exporter to use the met ### Remap OTel’s service.name attribute to service for logs -For Datadog Exporter versions 0.83.0 and later, the `service` field of OTel logs is populated as [OTel semantic convention](https://opentelemetry.io/docs/specs/semconv/resource/#service) `service.name`. However, `service.name` is not one of the default [service attributes](https://docs.datadoghq.com/logs/log_configuration/pipelines/?tab=service#service-attribute) in Datadog’s log preprocessing. +**NOTE** this workaround is only needed when feature gate `exporter.datadogexporter.UseLogsAgentExporter` is disabled. This feature gate is enabled by default starting v0.108.0. + +For Datadog Exporter versions 0.83.0 - v0.107.0, the `service` field of OTel logs is populated as [OTel semantic convention](https://opentelemetry.io/docs/specs/semconv/resource/#service) `service.name`. However, `service.name` is not one of the default [service attributes](https://docs.datadoghq.com/logs/log_configuration/pipelines/?tab=service#service-attribute) in Datadog’s log preprocessing. To get the service field correctly populated in your logs, you can specify service.name to be the source of a log’s service by setting a [log service remapper processor](https://docs.datadoghq.com/logs/log_configuration/pipelines/?tab=service#service-attribute). @@ -70,3 +70,17 @@ To get the service field correctly populated in your logs, you can specify servi [alpha]:https://github.com/open-telemetry/opentelemetry-collector#alpha [contrib]:https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib [AWS]:https://aws-otel.github.io/docs/partners/datadog + +### How to add custom log source + +In order to add a custom source to your OTLP logs, set resource attribute `datadog.log.source`. This feature requires `exporter.datadogexporter.UseLogsAgentExporter` feature flag to be enabled (now enabled by default). + +Example: +``` +processors: + transform/logs: + log_statements: + - context: resource + statements: + - set(attributes["datadog.log.source"], "otel") +``` diff --git a/exporter/datadogexporter/agent_components.go b/exporter/datadogexporter/agent_components.go index 7d81c193d06d..2025422d95c5 100644 --- a/exporter/datadogexporter/agent_components.go +++ b/exporter/datadogexporter/agent_components.go @@ -4,6 +4,7 @@ package datadogexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter" import ( + "runtime" "strings" coreconfig "github.com/DataDog/datadog-agent/comp/core/config" @@ -35,6 +36,7 @@ func newConfigComponent(set component.TelemetrySettings, cfg *Config) coreconfig pkgconfig.Set("logs_config.auditor_ttl", pkgconfigsetup.DefaultAuditorTTL, pkgconfigmodel.SourceDefault) pkgconfig.Set("logs_config.batch_max_content_size", pkgconfigsetup.DefaultBatchMaxContentSize, pkgconfigmodel.SourceDefault) pkgconfig.Set("logs_config.batch_max_size", pkgconfigsetup.DefaultBatchMaxSize, pkgconfigmodel.SourceDefault) + pkgconfig.Set("logs_config.force_use_http", true, pkgconfigmodel.SourceDefault) pkgconfig.Set("logs_config.input_chan_size", pkgconfigsetup.DefaultInputChanSize, pkgconfigmodel.SourceDefault) pkgconfig.Set("logs_config.max_message_size_bytes", pkgconfigsetup.DefaultMaxMessageSizeBytes, pkgconfigmodel.SourceDefault) pkgconfig.Set("logs_config.run_path", "/opt/datadog-agent/run", pkgconfigmodel.SourceDefault) @@ -45,6 +47,8 @@ func newConfigComponent(set component.TelemetrySettings, cfg *Config) coreconfig pkgconfig.Set("logs_config.stop_grace_period", 30, pkgconfigmodel.SourceDefault) pkgconfig.Set("logs_config.use_v2_api", true, pkgconfigmodel.SourceDefault) pkgconfig.SetKnown("logs_config.dev_mode_no_ssl") - + // add logs config pipelines config value, see https://github.com/DataDog/datadog-agent/pull/31190 + logsPipelines := min(4, runtime.GOMAXPROCS(0)) + pkgconfig.Set("logs_config.pipelines", logsPipelines, pkgconfigmodel.SourceDefault) return pkgconfig } diff --git a/exporter/datadogexporter/config.go b/exporter/datadogexporter/config.go index 631af88b4d67..9409f86428da 100644 --- a/exporter/datadogexporter/config.go +++ b/exporter/datadogexporter/config.go @@ -5,668 +5,158 @@ package datadogexporter // import "github.com/open-telemetry/opentelemetry-colle import ( "encoding" - "errors" - "fmt" - "regexp" - "strings" "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/config/confighttp" - "go.opentelemetry.io/collector/config/confignet" - "go.opentelemetry.io/collector/config/configopaque" - "go.opentelemetry.io/collector/config/configretry" "go.opentelemetry.io/collector/confmap" - "go.opentelemetry.io/collector/exporter/exporterhelper" - "go.uber.org/zap" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/hostmetadata/valid" -) - -var ( - errUnsetAPIKey = errors.New("api.key is not set") - errNoMetadata = errors.New("only_metadata can't be enabled when host_metadata::enabled = false or host_metadata::hostname_source != first_resource") - errEmptyEndpoint = errors.New("endpoint cannot be empty") + datadogconfig "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/datadog/config" ) const ( + // Deprecated: [v0.110.0] Use `datadogconfig.TypeStr` instead. // DefaultSite is the default site of the Datadog intake to send data to - DefaultSite = "datadoghq.com" + DefaultSite = datadogconfig.DefaultSite ) +// Deprecated: [v0.110.0] Use `datadogconfig.TypeStr` instead. // APIConfig defines the API configuration options -type APIConfig struct { - // Key is the Datadog API key to associate your Agent's data with your organization. - // Create a new API key here: https://app.datadoghq.com/account/settings - Key configopaque.String `mapstructure:"key"` - - // Site is the site of the Datadog intake to send data to. - // The default value is "datadoghq.com". - Site string `mapstructure:"site"` - - // FailOnInvalidKey states whether to exit at startup on invalid API key. - // The default value is false. - FailOnInvalidKey bool `mapstructure:"fail_on_invalid_key"` -} +type APIConfig = datadogconfig.APIConfig +// Deprecated: [v0.110.0] Use `datadogconfig.MetricsConfig` instead. // MetricsConfig defines the metrics exporter specific configuration options -type MetricsConfig struct { - // DeltaTTL defines the time that previous points of a cumulative monotonic - // metric are kept in memory to calculate deltas - DeltaTTL int64 `mapstructure:"delta_ttl"` - - // TCPAddr.Endpoint is the host of the Datadog intake server to send metrics to. - // If unset, the value is obtained from the Site. - confignet.TCPAddrConfig `mapstructure:",squash"` +type MetricsConfig = datadogconfig.MetricsConfig - ExporterConfig MetricsExporterConfig `mapstructure:",squash"` - - // HistConfig defines the export of OTLP Histograms. - HistConfig HistogramConfig `mapstructure:"histograms"` - - // SumConfig defines the export of OTLP Sums. - SumConfig SumConfig `mapstructure:"sums"` - - // SummaryConfig defines the export for OTLP Summaries. - SummaryConfig SummaryConfig `mapstructure:"summaries"` -} - -type HistogramMode string +// Deprecated: [v0.110.0] Use `datadogconfig.HistogramMode` instead. +// HistogramMode is the export mode for OTLP Histogram metrics. +type HistogramMode = datadogconfig.HistogramMode const ( // HistogramModeNoBuckets reports no bucket histogram metrics. .sum and .count metrics will still be sent // if `send_count_sum_metrics` is enabled. - HistogramModeNoBuckets HistogramMode = "nobuckets" + HistogramModeNoBuckets HistogramMode = datadogconfig.HistogramModeNoBuckets // HistogramModeCounters reports histograms as Datadog counts, one metric per bucket. - HistogramModeCounters HistogramMode = "counters" + HistogramModeCounters HistogramMode = datadogconfig.HistogramModeCounters // HistogramModeDistributions reports histograms as Datadog distributions (recommended). - HistogramModeDistributions HistogramMode = "distributions" + HistogramModeDistributions HistogramMode = datadogconfig.HistogramModeDistributions ) var _ encoding.TextUnmarshaler = (*HistogramMode)(nil) -func (hm *HistogramMode) UnmarshalText(in []byte) error { - switch mode := HistogramMode(in); mode { - case HistogramModeCounters, HistogramModeDistributions, HistogramModeNoBuckets: - *hm = mode - return nil - default: - return fmt.Errorf("invalid histogram mode %q", mode) - } -} - +// Deprecated: [v0.110.0] Use `datadogconfig.HistogramConfig` instead. // HistogramConfig customizes export of OTLP Histograms. -type HistogramConfig struct { - // Mode for exporting histograms. Valid values are 'distributions', 'counters' or 'nobuckets'. - // - 'distributions' sends histograms as Datadog distributions (recommended). - // - 'counters' sends histograms as Datadog counts, one metric per bucket. - // - 'nobuckets' sends no bucket histogram metrics. Aggregation metrics will still be sent - // if `send_aggregation_metrics` is enabled. - // - // The current default is 'distributions'. - Mode HistogramMode `mapstructure:"mode"` - - // SendCountSum states if the export should send .sum and .count metrics for histograms. - // The default is false. - // Deprecated: [v0.75.0] Use `send_aggregation_metrics` (HistogramConfig.SendAggregations) instead. - SendCountSum bool `mapstructure:"send_count_sum_metrics"` - - // SendAggregations states if the exporter should send .sum, .count, .min and .max metrics for histograms. - // The default is false. - SendAggregations bool `mapstructure:"send_aggregation_metrics"` -} - -func (c *HistogramConfig) validate() error { - if c.Mode == HistogramModeNoBuckets && !c.SendAggregations { - return fmt.Errorf("'nobuckets' mode and `send_aggregation_metrics` set to false will send no histogram metrics") - } - return nil -} +type HistogramConfig = datadogconfig.HistogramConfig +// Deprecated: [v0.110.0] Use `datadogconfig.CumulativeMonotonicMode` instead. // CumulativeMonotonicSumMode is the export mode for OTLP Sum metrics. -type CumulativeMonotonicSumMode string +type CumulativeMonotonicSumMode = datadogconfig.CumulativeMonotonicSumMode const ( + // Deprecated: [v0.110.0] Use `datadogconfig.CumulativeMonotonicSumMode` instead. // CumulativeMonotonicSumModeToDelta calculates delta for // cumulative monotonic sum metrics in the client side and reports // them as Datadog counts. - CumulativeMonotonicSumModeToDelta CumulativeMonotonicSumMode = "to_delta" + CumulativeMonotonicSumModeToDelta CumulativeMonotonicSumMode = datadogconfig.CumulativeMonotonicSumModeToDelta + // Deprecated: [v0.110.0] Use `datadogconfig.CumulativeMonotonicSumMode` instead. // CumulativeMonotonicSumModeRawValue reports the raw value for // cumulative monotonic sum metrics as a Datadog gauge. - CumulativeMonotonicSumModeRawValue CumulativeMonotonicSumMode = "raw_value" + CumulativeMonotonicSumModeRawValue CumulativeMonotonicSumMode = datadogconfig.CumulativeMonotonicSumModeRawValue ) var _ encoding.TextUnmarshaler = (*CumulativeMonotonicSumMode)(nil) -// UnmarshalText implements the encoding.TextUnmarshaler interface. -func (sm *CumulativeMonotonicSumMode) UnmarshalText(in []byte) error { - switch mode := CumulativeMonotonicSumMode(in); mode { - case CumulativeMonotonicSumModeToDelta, - CumulativeMonotonicSumModeRawValue: - *sm = mode - return nil - default: - return fmt.Errorf("invalid cumulative monotonic sum mode %q", mode) - } -} - +// Deprecated: [v0.110.0] Use `datadogconfig.InitialValueMode` instead. // InitialValueMode defines what the exporter should do with the initial value // of a time series when transforming from cumulative to delta. -type InitialValueMode string +type InitialValueMode = datadogconfig.InitialValueMode const ( // InitialValueModeAuto reports the initial value if its start timestamp // is set and it happens after the process was started. - InitialValueModeAuto InitialValueMode = "auto" + InitialValueModeAuto InitialValueMode = datadogconfig.InitialValueModeAuto // InitialValueModeDrop always drops the initial value. - InitialValueModeDrop InitialValueMode = "drop" + InitialValueModeDrop InitialValueMode = datadogconfig.InitialValueModeDrop // InitialValueModeKeep always reports the initial value. - InitialValueModeKeep InitialValueMode = "keep" + InitialValueModeKeep InitialValueMode = datadogconfig.InitialValueModeKeep ) var _ encoding.TextUnmarshaler = (*InitialValueMode)(nil) -// UnmarshalText implements the encoding.TextUnmarshaler interface. -func (iv *InitialValueMode) UnmarshalText(in []byte) error { - switch mode := InitialValueMode(in); mode { - case InitialValueModeAuto, - InitialValueModeDrop, - InitialValueModeKeep: - *iv = mode - return nil - default: - return fmt.Errorf("invalid initial value mode %q", mode) - } -} - +// Deprecated: [v0.110.0] Use `datadogconfig.SumConfig` instead. // SumConfig customizes export of OTLP Sums. -type SumConfig struct { - // CumulativeMonotonicMode is the mode for exporting OTLP Cumulative Monotonic Sums. - // Valid values are 'to_delta' or 'raw_value'. - // - 'to_delta' calculates delta for cumulative monotonic sums and sends it as a Datadog count. - // - 'raw_value' sends the raw value of cumulative monotonic sums as Datadog gauges. - // - // The default is 'to_delta'. - // See https://docs.datadoghq.com/metrics/otlp/?tab=sum#mapping for details and examples. - CumulativeMonotonicMode CumulativeMonotonicSumMode `mapstructure:"cumulative_monotonic_mode"` - - // InitialCumulativeMonotonicMode defines the behavior of the exporter when receiving the first value - // of a cumulative monotonic sum. - InitialCumulativeMonotonicMode InitialValueMode `mapstructure:"initial_cumulative_monotonic_value"` -} +type SumConfig = datadogconfig.SumConfig +// Deprecated: [v0.110.0] Use `datadogconfig.SummaryMode` instead. // SummaryMode is the export mode for OTLP Summary metrics. -type SummaryMode string +type SummaryMode = datadogconfig.SummaryMode const ( // SummaryModeNoQuantiles sends no `.quantile` metrics. `.sum` and `.count` metrics will still be sent. - SummaryModeNoQuantiles SummaryMode = "noquantiles" + SummaryModeNoQuantiles SummaryMode = datadogconfig.SummaryModeNoQuantiles // SummaryModeGauges sends `.quantile` metrics as gauges tagged by the quantile. - SummaryModeGauges SummaryMode = "gauges" + SummaryModeGauges SummaryMode = datadogconfig.SummaryModeGauges ) var _ encoding.TextUnmarshaler = (*SummaryMode)(nil) -// UnmarshalText implements the encoding.TextUnmarshaler interface. -func (sm *SummaryMode) UnmarshalText(in []byte) error { - switch mode := SummaryMode(in); mode { - case SummaryModeNoQuantiles, - SummaryModeGauges: - *sm = mode - return nil - default: - return fmt.Errorf("invalid summary mode %q", mode) - } -} - +// Deprecated: [v0.110.0] Use `datadogconfig.SummaryMode` instead. // SummaryConfig customizes export of OTLP Summaries. -type SummaryConfig struct { - // Mode is the the mode for exporting OTLP Summaries. - // Valid values are 'noquantiles' or 'gauges'. - // - 'noquantiles' sends no `.quantile` metrics. `.sum` and `.count` metrics will still be sent. - // - 'gauges' sends `.quantile` metrics as gauges tagged by the quantile. - // - // The default is 'gauges'. - // See https://docs.datadoghq.com/metrics/otlp/?tab=summary#mapping for details and examples. - Mode SummaryMode `mapstructure:"mode"` -} +type SummaryConfig = datadogconfig.SummaryConfig +// Deprecated: [v0.110.0] Use `datadogconfig.MetricsExporterConfig` instead. // MetricsExporterConfig provides options for a user to customize the behavior of the // metrics exporter -type MetricsExporterConfig struct { - // ResourceAttributesAsTags, if set to true, will use the exporterhelper feature to transform all - // resource attributes into metric labels, which are then converted into tags - ResourceAttributesAsTags bool `mapstructure:"resource_attributes_as_tags"` - - // InstrumentationScopeMetadataAsTags, if set to true, adds the name and version of the - // instrumentation scope that created a metric to the metric tags - InstrumentationScopeMetadataAsTags bool `mapstructure:"instrumentation_scope_metadata_as_tags"` -} +type MetricsExporterConfig = datadogconfig.MetricsExporterConfig +// Deprecated: [v0.110.0] Use `datadogconfig.TracesExporterConfig` instead. // TracesConfig defines the traces exporter specific configuration options -type TracesConfig struct { - // TCPAddr.Endpoint is the host of the Datadog intake server to send traces to. - // If unset, the value is obtained from the Site. - confignet.TCPAddrConfig `mapstructure:",squash"` - - // ignored resources - // A blacklist of regular expressions can be provided to disable certain traces based on their resource name - // all entries must be surrounded by double quotes and separated by commas. - // ignore_resources: ["(GET|POST) /healthcheck"] - IgnoreResources []string `mapstructure:"ignore_resources"` - - // SpanNameRemappings is the map of datadog span names and preferred name to map to. This can be used to - // automatically map Datadog Span Operation Names to an updated value. All entries should be key/value pairs. - // span_name_remappings: - // io.opentelemetry.javaagent.spring.client: spring.client - // instrumentation:express.server: express - // go.opentelemetry.io_contrib_instrumentation_net_http_otelhttp.client: http.client - SpanNameRemappings map[string]string `mapstructure:"span_name_remappings"` - - // If set to true the OpenTelemetry span name will used in the Datadog resource name. - // If set to false the resource name will be filled with the instrumentation library name + span kind. - // The default value is `false`. - SpanNameAsResourceName bool `mapstructure:"span_name_as_resource_name"` - - // If set to true, enables an additional stats computation check on spans to see they have an eligible `span.kind` (server, consumer, client, producer). - // If enabled, a span with an eligible `span.kind` will have stats computed. If disabled, only top-level and measured spans will have stats computed. - // NOTE: For stats computed from OTel traces, only top-level spans are considered when this option is off. - // If you are sending OTel traces and want stats on non-top-level spans, this flag will need to be enabled. - // If you are sending OTel traces and do not want stats computed by span kind, you need to disable this flag and disable `compute_top_level_by_span_kind`. - ComputeStatsBySpanKind bool `mapstructure:"compute_stats_by_span_kind"` - - // If set to true, root spans and spans with a server or consumer `span.kind` will be marked as top-level. - // Additionally, spans with a client or producer `span.kind` will have stats computed. - // Enabling this config option may increase the number of spans that generate trace metrics, and may change which spans appear as top-level in Datadog. - // ComputeTopLevelBySpanKind needs to be enabled in both the Datadog connector and Datadog exporter configs if both components are being used. - // The default value is `false`. - ComputeTopLevelBySpanKind bool `mapstructure:"compute_top_level_by_span_kind"` - - // If set to true, enables `peer.service` aggregation in the exporter. If disabled, aggregated trace stats will not include `peer.service` as a dimension. - // For the best experience with `peer.service`, it is recommended to also enable `compute_stats_by_span_kind`. - // If enabling both causes the datadog exporter to consume too many resources, try disabling `compute_stats_by_span_kind` first. - // If the overhead remains high, it will be due to a high cardinality of `peer.service` values from the traces. You may need to check your instrumentation. - // Deprecated: Please use PeerTagsAggregation instead - PeerServiceAggregation bool `mapstructure:"peer_service_aggregation"` - - // If set to true, enables aggregation of peer related tags (e.g., `peer.service`, `db.instance`, etc.) in the datadog exporter. - // If disabled, aggregated trace stats will not include these tags as dimensions on trace metrics. - // For the best experience with peer tags, Datadog also recommends enabling `compute_stats_by_span_kind`. - // If you are using an OTel tracer, it's best to have both enabled because client/producer spans with relevant peer tags - // may not be marked by the datadog exporter as top-level spans. - // If enabling both causes the datadog exporter to consume too many resources, try disabling `compute_stats_by_span_kind` first. - // A high cardinality of peer tags or APM resources can also contribute to higher CPU and memory consumption. - // You can check for the cardinality of these fields by making trace search queries in the Datadog UI. - // The default list of peer tags can be found in https://github.com/DataDog/datadog-agent/blob/main/pkg/trace/stats/concentrator.go. - PeerTagsAggregation bool `mapstructure:"peer_tags_aggregation"` - - // [BETA] Optional list of supplementary peer tags that go beyond the defaults. The Datadog backend validates all tags - // and will drop ones that are unapproved. The default set of peer tags can be found at - // https://github.com/DataDog/datadog-agent/blob/505170c4ac8c3cbff1a61cf5f84b28d835c91058/pkg/trace/stats/concentrator.go#L55. - PeerTags []string `mapstructure:"peer_tags"` - - // TraceBuffer specifies the number of Datadog Agent TracerPayloads to buffer before dropping. - // The default value is 0, meaning the Datadog Agent TracerPayloads are unbuffered. - TraceBuffer int `mapstructure:"trace_buffer"` - - // flushInterval defines the interval in seconds at which the writer flushes traces - // to the intake; used in tests. - flushInterval float64 -} +type TracesConfig = datadogconfig.TracesExporterConfig +// Deprecated: [v0.110.0] Use `datadogconfig.LogsConfig` instead. // LogsConfig defines logs exporter specific configuration -type LogsConfig struct { - // TCPAddr.Endpoint is the host of the Datadog intake server to send logs to. - // If unset, the value is obtained from the Site. - confignet.TCPAddrConfig `mapstructure:",squash"` - - // DumpPayloads report whether payloads should be dumped when logging level is debug. - // Note: this config option does not apply when enabling the `exporter.datadogexporter.UseLogsAgentExporter` feature flag. - DumpPayloads bool `mapstructure:"dump_payloads"` - - // UseCompression enables the logs agent to compress logs before sending them. - // Note: this config option does not apply unless enabling the `exporter.datadogexporter.UseLogsAgentExporter` feature flag. - UseCompression bool `mapstructure:"use_compression"` - - // CompressionLevel accepts values from 0 (no compression) to 9 (maximum compression but higher resource usage). - // Only takes effect if UseCompression is set to true. - // Note: this config option does not apply unless enabling the `exporter.datadogexporter.UseLogsAgentExporter` feature flag. - CompressionLevel int `mapstructure:"compression_level"` - - // BatchWait represents the maximum time the logs agent waits to fill each batch of logs before sending. - // Note: this config option does not apply unless enabling the `exporter.datadogexporter.UseLogsAgentExporter` feature flag. - BatchWait int `mapstructure:"batch_wait"` -} +type LogsConfig = datadogconfig.LogsConfig +// Deprecated: [v0.110.0] Use `datadogconfig.TagsConfig` instead. // TagsConfig defines the tag-related configuration // It is embedded in the configuration -type TagsConfig struct { - // Hostname is the fallback hostname used for payloads without hostname-identifying attributes. - // This option will NOT change the hostname applied to your metrics, traces and logs if they already have hostname-identifying attributes. - // If unset, the hostname will be determined automatically. See https://docs.datadoghq.com/opentelemetry/schema_semantics/hostname/?tab=datadogexporter#fallback-hostname-logic for details. - // - // Prefer using the `datadog.host.name` resource attribute over using this setting. - // See https://docs.datadoghq.com/opentelemetry/schema_semantics/hostname/?tab=datadogexporter#general-hostname-semantic-conventions for details. - Hostname string `mapstructure:"hostname"` -} +type TagsConfig = datadogconfig.TagsConfig +// Deprecated: [v0.110.0] Use `datadogconfig.HostnameSource` instead. // HostnameSource is the source for the hostname of host metadata. -type HostnameSource string +type HostnameSource = datadogconfig.HostnameSource const ( + // Deprecated: [v0.110.0] Use `datadogconfig.HostnameSource` instead. // HostnameSourceFirstResource picks the host metadata hostname from the resource // attributes on the first OTLP payload that gets to the exporter. If it is lacking any // hostname-like attributes, it will fallback to 'config_or_system' behavior (see below). // // Do not use this hostname source if receiving data from multiple hosts. - HostnameSourceFirstResource HostnameSource = "first_resource" + HostnameSourceFirstResource HostnameSource = datadogconfig.HostnameSourceFirstResource + // Deprecated: [v0.110.0] Use `datadogconfig.HostnameSource` instead. // HostnameSourceConfigOrSystem picks the host metadata hostname from the 'hostname' setting, // and if this is empty, from available system APIs and cloud provider endpoints. - HostnameSourceConfigOrSystem HostnameSource = "config_or_system" + HostnameSourceConfigOrSystem HostnameSource = datadogconfig.HostnameSourceConfigOrSystem ) var _ encoding.TextUnmarshaler = (*HostnameSource)(nil) -// UnmarshalText implements the encoding.TextUnmarshaler interface. -func (sm *HostnameSource) UnmarshalText(in []byte) error { - switch mode := HostnameSource(in); mode { - case HostnameSourceFirstResource, - HostnameSourceConfigOrSystem: - *sm = mode - return nil - default: - return fmt.Errorf("invalid host metadata hostname source %q", mode) - } -} - +// Deprecated: [v0.110.0] Use `datadogconfig.HostMetadataConfig` instead. // HostMetadataConfig defines the host metadata related configuration. // Host metadata is the information used for populating the infrastructure list, // the host map and providing host tags functionality. // // The exporter will send host metadata for a single host, whose name is chosen // according to `host_metadata::hostname_source`. -type HostMetadataConfig struct { - // Enabled enables the host metadata functionality. - Enabled bool `mapstructure:"enabled"` - - // HostnameSource is the source for the hostname of host metadata. - // This hostname is used for identifying the infrastructure list, host map and host tag information related to the host where the Datadog exporter is running. - // Changing this setting will not change the host used to tag your metrics, traces and logs in any way. - // For remote hosts, see https://docs.datadoghq.com/opentelemetry/schema_semantics/host_metadata/. - // - // Valid values are 'first_resource' and 'config_or_system': - // - 'first_resource' picks the host metadata hostname from the resource - // attributes on the first OTLP payload that gets to the exporter. - // If the first payload lacks hostname-like attributes, it will fallback to 'config_or_system'. - // **Do not use this hostname source if receiving data from multiple hosts**. - // - 'config_or_system' picks the host metadata hostname from the 'hostname' setting, - // If this is empty it will use available system APIs and cloud provider endpoints. - // - // The default is 'config_or_system'. - HostnameSource HostnameSource `mapstructure:"hostname_source"` - - // Tags is a list of host tags. - // These tags will be attached to telemetry signals that have the host metadata hostname. - // To attach tags to telemetry signals regardless of the host, use a processor instead. - Tags []string `mapstructure:"tags"` -} +type HostMetadataConfig = datadogconfig.HostMetadataConfig +// Deprecated: [v0.110.0] Use `datadogconfig.Config` instead. // Config defines configuration for the Datadog exporter. -type Config struct { - confighttp.ClientConfig `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. - exporterhelper.QueueSettings `mapstructure:"sending_queue"` - configretry.BackOffConfig `mapstructure:"retry_on_failure"` - - TagsConfig `mapstructure:",squash"` - - // API defines the Datadog API configuration. - API APIConfig `mapstructure:"api"` - - // Metrics defines the Metrics exporter specific configuration - Metrics MetricsConfig `mapstructure:"metrics"` - - // Traces defines the Traces exporter specific configuration - Traces TracesConfig `mapstructure:"traces"` - - // Logs defines the Logs exporter specific configuration - Logs LogsConfig `mapstructure:"logs"` - - // HostMetadata defines the host metadata specific configuration - HostMetadata HostMetadataConfig `mapstructure:"host_metadata"` - - // OnlyMetadata defines whether to only send metadata - // This is useful for agent-collector setups, so that - // metadata about a host is sent to the backend even - // when telemetry data is reported via a different host. - // - // This flag is incompatible with disabling host metadata, - // `use_resource_metadata`, or `host_metadata::hostname_source != first_resource` - OnlyMetadata bool `mapstructure:"only_metadata"` - - // Non-fatal warnings found during configuration loading. - warnings []error -} - -// logWarnings logs warning messages that were generated on unmarshaling. -func (c *Config) logWarnings(logger *zap.Logger) { - for _, err := range c.warnings { - logger.Warn(fmt.Sprintf("%v", err)) - } -} +type Config = datadogconfig.Config var _ component.Config = (*Config)(nil) -// Validate the configuration for errors. This is required by component.Config. -func (c *Config) Validate() error { - if err := validateClientConfig(c.ClientConfig); err != nil { - return err - } - - if c.OnlyMetadata && (!c.HostMetadata.Enabled || c.HostMetadata.HostnameSource != HostnameSourceFirstResource) { - return errNoMetadata - } - - if err := valid.Hostname(c.Hostname); c.Hostname != "" && err != nil { - return fmt.Errorf("hostname field is invalid: %w", err) - } - - if c.API.Key == "" { - return errUnsetAPIKey - } - - if c.Traces.IgnoreResources != nil { - for _, entry := range c.Traces.IgnoreResources { - _, err := regexp.Compile(entry) - if err != nil { - return fmt.Errorf("'%s' is not valid resource filter regular expression", entry) - } - } - } - - if c.Traces.SpanNameRemappings != nil { - for key, value := range c.Traces.SpanNameRemappings { - if value == "" { - return fmt.Errorf("'%s' is not valid value for span name remapping", value) - } - if key == "" { - return fmt.Errorf("'%s' is not valid key for span name remapping", key) - } - } - } - - err := c.Metrics.HistConfig.validate() - if err != nil { - return err - } - - return nil -} - -func validateClientConfig(cfg confighttp.ClientConfig) error { - var unsupported []string - if cfg.Auth != nil { - unsupported = append(unsupported, "auth") - } - if cfg.Endpoint != "" { - unsupported = append(unsupported, "endpoint") - } - if cfg.Compression != "" { - unsupported = append(unsupported, "compression") - } - if cfg.ProxyURL != "" { - unsupported = append(unsupported, "proxy_url") - } - if cfg.Headers != nil { - unsupported = append(unsupported, "headers") - } - if cfg.HTTP2ReadIdleTimeout != 0 { - unsupported = append(unsupported, "http2_read_idle_timeout") - } - if cfg.HTTP2PingTimeout != 0 { - unsupported = append(unsupported, "http2_ping_timeout") - } - - if len(unsupported) > 0 { - return fmt.Errorf("these confighttp client configs are currently not respected by Datadog exporter: %s", strings.Join(unsupported, ", ")) - } - return nil -} - -var _ error = (*renameError)(nil) - -// renameError is an error related to a renamed setting. -type renameError struct { - // oldName of the configuration option. - oldName string - // newName of the configuration option. - newName string - // issueNumber on opentelemetry-collector-contrib for tracking - issueNumber uint -} - -// List of settings that have been removed, but for which we keep a custom error. -var removedSettings = []renameError{ - { - oldName: "metrics::send_monotonic_counter", - newName: "metrics::sums::cumulative_monotonic_mode", - issueNumber: 8489, - }, - { - oldName: "tags", - newName: "host_metadata::tags", - issueNumber: 9099, - }, - { - oldName: "send_metadata", - newName: "host_metadata::enabled", - issueNumber: 9099, - }, - { - oldName: "use_resource_metadata", - newName: "host_metadata::hostname_source", - issueNumber: 9099, - }, - { - oldName: "metrics::report_quantiles", - newName: "metrics::summaries::mode", - issueNumber: 8845, - }, - { - oldName: "metrics::instrumentation_library_metadata_as_tags", - newName: "metrics::instrumentation_scope_as_tags", - issueNumber: 11135, - }, -} - -// Error implements the error interface. -func (e renameError) Error() string { - return fmt.Sprintf( - "%q was removed in favor of %q. See https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/%d", - e.oldName, - e.newName, - e.issueNumber, - ) -} - -func handleRemovedSettings(configMap *confmap.Conf) error { - var errs []error - for _, removedErr := range removedSettings { - if configMap.IsSet(removedErr.oldName) { - errs = append(errs, removedErr) - } - } - - return errors.Join(errs...) -} - var _ confmap.Unmarshaler = (*Config)(nil) - -// Unmarshal a configuration map into the configuration struct. -func (c *Config) Unmarshal(configMap *confmap.Conf) error { - if err := handleRemovedSettings(configMap); err != nil { - return err - } - - err := configMap.Unmarshal(c) - if err != nil { - return err - } - - // Add deprecation warnings for deprecated settings. - renamingWarnings, err := handleRenamedSettings(configMap, c) - if err != nil { - return err - } - c.warnings = append(c.warnings, renamingWarnings...) - - c.API.Key = configopaque.String(strings.TrimSpace(string(c.API.Key))) - - // If an endpoint is not explicitly set, override it based on the site. - if !configMap.IsSet("metrics::endpoint") { - c.Metrics.TCPAddrConfig.Endpoint = fmt.Sprintf("https://api.%s", c.API.Site) - } - if !configMap.IsSet("traces::endpoint") { - c.Traces.TCPAddrConfig.Endpoint = fmt.Sprintf("https://trace.agent.%s", c.API.Site) - } - if !configMap.IsSet("logs::endpoint") { - c.Logs.TCPAddrConfig.Endpoint = fmt.Sprintf("https://http-intake.logs.%s", c.API.Site) - } - - // Return an error if an endpoint is explicitly set to "" - if c.Metrics.TCPAddrConfig.Endpoint == "" || c.Traces.TCPAddrConfig.Endpoint == "" || c.Logs.TCPAddrConfig.Endpoint == "" { - return errEmptyEndpoint - } - - const ( - initialValueSetting = "metrics::sums::initial_cumulative_monotonic_value" - cumulMonoMode = "metrics::sums::cumulative_monotonic_mode" - ) - if configMap.IsSet(initialValueSetting) && c.Metrics.SumConfig.CumulativeMonotonicMode != CumulativeMonotonicSumModeToDelta { - return fmt.Errorf("%q can only be configured when %q is set to %q", - initialValueSetting, cumulMonoMode, CumulativeMonotonicSumModeToDelta) - } - - logsExporterSettings := []struct { - setting string - valid bool - }{ - {setting: "logs::dump_payloads", valid: !isLogsAgentExporterEnabled()}, - {setting: "logs::use_compression", valid: isLogsAgentExporterEnabled()}, - {setting: "logs::compression_level", valid: isLogsAgentExporterEnabled()}, - {setting: "logs::batch_wait", valid: isLogsAgentExporterEnabled()}, - } - for _, logsExporterSetting := range logsExporterSettings { - if configMap.IsSet(logsExporterSetting.setting) && !logsExporterSetting.valid { - enabledText := "enabled" - if !isLogsAgentExporterEnabled() { - enabledText = "disabled" - } - return fmt.Errorf("%v is not valid when the exporter.datadogexporter.UseLogsAgentExporter feature gate is %v", logsExporterSetting.setting, enabledText) - } - } - - return nil -} diff --git a/exporter/datadogexporter/config_test.go b/exporter/datadogexporter/config_test.go index 62d244f7ca03..d9dd1f42f9e1 100644 --- a/exporter/datadogexporter/config_test.go +++ b/exporter/datadogexporter/config_test.go @@ -8,172 +8,10 @@ import ( "time" "github.com/stretchr/testify/assert" - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/config/configauth" - "go.opentelemetry.io/collector/config/confighttp" - "go.opentelemetry.io/collector/config/configopaque" - "go.opentelemetry.io/collector/config/configtls" "go.opentelemetry.io/collector/confmap" -) - -func TestValidate(t *testing.T) { - idleConnTimeout := 30 * time.Second - maxIdleConn := 300 - maxIdleConnPerHost := 150 - maxConnPerHost := 250 - ty, err := component.NewType("ty") - assert.NoError(t, err) - auth := configauth.Authentication{AuthenticatorID: component.NewID(ty)} - - tests := []struct { - name string - cfg *Config - err string - }{ - { - name: "no api::key", - cfg: &Config{}, - err: errUnsetAPIKey.Error(), - }, - { - name: "invalid hostname", - cfg: &Config{ - API: APIConfig{Key: "notnull"}, - TagsConfig: TagsConfig{Hostname: "invalid_host"}, - }, - err: "hostname field is invalid: 'invalid_host' is not RFC1123 compliant", - }, - { - name: "no metadata", - cfg: &Config{ - API: APIConfig{Key: "notnull"}, - OnlyMetadata: true, - HostMetadata: HostMetadataConfig{Enabled: false}, - }, - err: errNoMetadata.Error(), - }, - { - name: "span name remapping valid", - cfg: &Config{ - API: APIConfig{Key: "notnull"}, - Traces: TracesConfig{SpanNameRemappings: map[string]string{"old.opentelemetryspan.name": "updated.name"}}, - }, - }, - { - name: "span name remapping empty val", - cfg: &Config{ - API: APIConfig{Key: "notnull"}, - Traces: TracesConfig{SpanNameRemappings: map[string]string{"oldname": ""}}, - }, - err: "'' is not valid value for span name remapping", - }, - { - name: "span name remapping empty key", - cfg: &Config{ - API: APIConfig{Key: "notnull"}, - Traces: TracesConfig{SpanNameRemappings: map[string]string{"": "newname"}}, - }, - err: "'' is not valid key for span name remapping", - }, - { - name: "ignore resources valid", - cfg: &Config{ - API: APIConfig{Key: "notnull"}, - Traces: TracesConfig{IgnoreResources: []string{"[123]"}}, - }, - }, - { - name: "ignore resources missing bracket", - cfg: &Config{ - API: APIConfig{Key: "notnull"}, - Traces: TracesConfig{IgnoreResources: []string{"[123"}}, - }, - err: "'[123' is not valid resource filter regular expression", - }, - { - name: "invalid histogram settings", - cfg: &Config{ - API: APIConfig{Key: "notnull"}, - Metrics: MetricsConfig{ - HistConfig: HistogramConfig{ - Mode: HistogramModeNoBuckets, - SendAggregations: false, - }, - }, - }, - err: "'nobuckets' mode and `send_aggregation_metrics` set to false will send no histogram metrics", - }, - { - name: "TLS settings are valid", - cfg: &Config{ - API: APIConfig{Key: "notnull"}, - ClientConfig: confighttp.ClientConfig{ - TLSSetting: configtls.ClientConfig{ - InsecureSkipVerify: true, - }, - }, - }, - }, - { - name: "With trace_buffer", - cfg: &Config{ - API: APIConfig{Key: "notnull"}, - Traces: TracesConfig{TraceBuffer: 10}, - }, - }, - { - name: "With peer_tags", - cfg: &Config{ - API: APIConfig{Key: "notnull"}, - Traces: TracesConfig{PeerTags: []string{"tag1", "tag2"}}, - }, - }, - { - name: "With confighttp client configs", - cfg: &Config{ - API: APIConfig{Key: "notnull"}, - ClientConfig: confighttp.ClientConfig{ - ReadBufferSize: 100, - WriteBufferSize: 200, - Timeout: 10 * time.Second, - IdleConnTimeout: &idleConnTimeout, - MaxIdleConns: &maxIdleConn, - MaxIdleConnsPerHost: &maxIdleConnPerHost, - MaxConnsPerHost: &maxConnPerHost, - DisableKeepAlives: true, - TLSSetting: configtls.ClientConfig{InsecureSkipVerify: true}, - }, - }, - }, - { - name: "unsupported confighttp client configs", - cfg: &Config{ - API: APIConfig{Key: "notnull"}, - ClientConfig: confighttp.ClientConfig{ - Endpoint: "endpoint", - Compression: "gzip", - ProxyURL: "proxy", - Auth: &auth, - Headers: map[string]configopaque.String{"key": "val"}, - HTTP2ReadIdleTimeout: 250, - HTTP2PingTimeout: 200, - }, - }, - err: "these confighttp client configs are currently not respected by Datadog exporter: auth, endpoint, compression, proxy_url, headers, http2_read_idle_timeout, http2_ping_timeout", - }, - } - for _, testInstance := range tests { - t.Run(testInstance.name, func(t *testing.T) { - err := testInstance.cfg.Validate() - if testInstance.err != "" { - assert.EqualError(t, err, testInstance.err) - } else { - assert.NoError(t, err) - } - }) - } -} + datadogconfig "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/datadog/config" +) func TestUnmarshal(t *testing.T) { cfgWithHTTPConfigs := NewFactory().CreateDefaultConfig().(*Config) @@ -190,13 +28,13 @@ func TestUnmarshal(t *testing.T) { cfgWithHTTPConfigs.IdleConnTimeout = &idleConnTimeout cfgWithHTTPConfigs.DisableKeepAlives = true cfgWithHTTPConfigs.TLSSetting.InsecureSkipVerify = true - cfgWithHTTPConfigs.warnings = nil tests := []struct { name string configMap *confmap.Conf cfg *Config err string + field string }{ { name: "invalid cumulative monotonic mode", @@ -207,7 +45,8 @@ func TestUnmarshal(t *testing.T) { }, }, }), - err: "1 error(s) decoding:\n\n* error decoding 'metrics.sums.cumulative_monotonic_mode': invalid cumulative monotonic sum mode \"invalid_mode\"", + err: "invalid cumulative monotonic sum mode \"invalid_mode\"", + field: "metrics.sums.cumulative_monotonic_mode", }, { name: "invalid host metadata hostname source", @@ -216,7 +55,8 @@ func TestUnmarshal(t *testing.T) { "hostname_source": "invalid_source", }, }), - err: "1 error(s) decoding:\n\n* error decoding 'host_metadata.hostname_source': invalid host metadata hostname source \"invalid_source\"", + err: "invalid host metadata hostname source \"invalid_source\"", + field: "host_metadata.hostname_source", }, { name: "invalid summary mode", @@ -227,7 +67,8 @@ func TestUnmarshal(t *testing.T) { }, }, }), - err: "1 error(s) decoding:\n\n* error decoding 'metrics.summaries.mode': invalid summary mode \"invalid_mode\"", + err: "invalid summary mode \"invalid_mode\"", + field: "metrics.summaries.mode", }, { name: "metrics::send_monotonic_counter custom error", @@ -284,7 +125,7 @@ func TestUnmarshal(t *testing.T) { "endpoint": "", }, }), - err: errEmptyEndpoint.Error(), + err: datadogconfig.ErrEmptyEndpoint.Error(), }, { name: "Empty trace endpoint", @@ -293,7 +134,7 @@ func TestUnmarshal(t *testing.T) { "endpoint": "", }, }), - err: errEmptyEndpoint.Error(), + err: datadogconfig.ErrEmptyEndpoint.Error(), }, { name: "Empty log endpoint", @@ -302,7 +143,7 @@ func TestUnmarshal(t *testing.T) { "endpoint": "", }, }), - err: errEmptyEndpoint.Error(), + err: datadogconfig.ErrEmptyEndpoint.Error(), }, { name: "invalid initial cumulative monotonic value mode", @@ -313,7 +154,8 @@ func TestUnmarshal(t *testing.T) { }, }, }), - err: "1 error(s) decoding:\n\n* error decoding 'metrics.sums.initial_cumulative_monotonic_value': invalid initial value mode \"invalid_mode\"", + err: "invalid initial value mode \"invalid_mode\"", + field: "metrics.sums.initial_cumulative_monotonic_value", }, { name: "initial cumulative monotonic value mode set with raw_value", @@ -350,7 +192,10 @@ func TestUnmarshal(t *testing.T) { cfg := f.CreateDefaultConfig().(*Config) err := cfg.Unmarshal(testInstance.configMap) if err != nil || testInstance.err != "" { - assert.EqualError(t, err, testInstance.err) + assert.ErrorContains(t, err, testInstance.err) + if testInstance.field != "" { + assert.ErrorContains(t, err, testInstance.field) + } } else { assert.Equal(t, testInstance.cfg, cfg) } diff --git a/exporter/datadogexporter/examples/collector.yaml b/exporter/datadogexporter/examples/collector.yaml index 594c1083cdf1..711d8b22eda5 100644 --- a/exporter/datadogexporter/examples/collector.yaml +++ b/exporter/datadogexporter/examples/collector.yaml @@ -449,6 +449,11 @@ exporters: # # tags: ["team:infra", ":"] + ## @param reporter_period - duration - optional - default: 30m + ## The period at which the host metadata reporter sends host metadata to Datadog. + ## The default is 30 minutes. + # reporter_period: 30m + ## @param logs - custom object - optional ## Logs exporter specific configuration. # @@ -457,14 +462,15 @@ exporters: ## If set to true, payloads will be dumped when logging level is set to debug. Please note that ## This may result in an escaping loop if a filelog receiver is watching the collector log output. ## See: https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/16380 - ## Note: this config option does not apply when enabling `exporter.datadogexporter.UseLogsAgentExporter` feature flag. + ## Note: this config option does not apply when the `exporter.datadogexporter.UseLogsAgentExporter` feature flag is enabled (now enabled by default). + ## Deprecated since v0.107.0: This config option is not supported in the Datadog Agent logs pipeline. # # dump_payloads: false ## @param use_compression - boolean - optional - default: true ## This parameter is available when sending logs with HTTPS. If enabled, the logs agent ## compresses logs before sending them. - ## Note: this config option does not apply unless enabling the `exporter.datadogexporter.UseLogsAgentExporter` feature flag. + ## Note: this config option does not apply when the `exporter.datadogexporter.UseLogsAgentExporter` feature flag is disabled. # # use_compression: true @@ -472,13 +478,13 @@ exporters: ## The compression_level parameter accepts values from 0 (no compression) ## to 9 (maximum compression but higher resource usage). Only takes effect if ## `use_compression` is set to `true`. - ## Note: this config option does not apply unless enabling the `exporter.datadogexporter.UseLogsAgentExporter` feature flag. + ## Note: this config option does not apply when the `exporter.datadogexporter.UseLogsAgentExporter` feature flag is disabled. # # compression_level: 6 ## @param batch_wait - integer - optional - default: 5 ## The maximum time the logs agent waits to fill each batch of logs before sending. - ## Note: this config option does not apply unless enabling the `exporter.datadogexporter.UseLogsAgentExporter` feature flag. + ## Note: this config option does not apply when the `exporter.datadogexporter.UseLogsAgentExporter` feature flag is disabled. # # batch_wait: 5 diff --git a/exporter/datadogexporter/examples/k8s-chart/configmap.yaml b/exporter/datadogexporter/examples/k8s-chart/configmap.yaml index 94379cedffe6..a601ee7b87ab 100644 --- a/exporter/datadogexporter/examples/k8s-chart/configmap.yaml +++ b/exporter/datadogexporter/examples/k8s-chart/configmap.yaml @@ -56,7 +56,7 @@ data: exporters: datadog: api: - key: + key: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" # Change this to your Datadog API key site: datadoghq.com # Change this to your site if not using the default processors: resourcedetection: @@ -133,7 +133,7 @@ data: encoding: "json" initial_fields: # Add the service field to every log line. It can be used for filtering in Datadog. - - service: "otel-collector" + service: "otel-collector" pipelines: metrics: receivers: [hostmetrics, otlp] diff --git a/exporter/datadogexporter/examples/logs.yaml b/exporter/datadogexporter/examples/logs.yaml index 15d9ba66c001..dd01899ea064 100644 --- a/exporter/datadogexporter/examples/logs.yaml +++ b/exporter/datadogexporter/examples/logs.yaml @@ -20,6 +20,12 @@ processors: send_batch_max_size: 1000 send_batch_size: 100 timeout: 10s + transform: + log_statements: + - context: log + statements: + # Set the ddtags attribute in order to add custom Datadog tags on your logs. + - set(attributes["ddtags"], "first_custom:tag, second_custom:tag") exporters: datadog: @@ -32,5 +38,5 @@ service: pipelines: logs: receivers: [filelog] - processors: [batch] + processors: [transform, batch] exporters: [datadog] diff --git a/exporter/datadogexporter/examples_test.go b/exporter/datadogexporter/examples_test.go index 0da3f50a693d..bcfb3ebc7f8b 100644 --- a/exporter/datadogexporter/examples_test.go +++ b/exporter/datadogexporter/examples_test.go @@ -53,8 +53,10 @@ func TestExamples(t *testing.T) { continue } t.Run(filepath.Base(f.Name()), func(t *testing.T) { - t.Setenv("DD_API_KEY", "testvalue") + t.Setenv("DD_API_KEY", "aaaaaaaaa") name := filepath.Join(folder, f.Name()) + // https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/33594 + // nolint:staticcheck _, err := otelcoltest.LoadConfigAndValidate(name, factories) require.NoError(t, err, "All yaml config must validate. Please ensure that all necessary component factories are added in newTestComponents()") }) @@ -72,7 +74,7 @@ func TestExamples(t *testing.T) { require.NoError(t, err) err = yaml.Unmarshal(slurp, &out) require.NoError(t, err) - require.Equal(t, out.Kind, "ConfigMap") + require.Equal(t, "ConfigMap", out.Kind) require.NotEmpty(t, out.Data.YAML) data := []byte(out.Data.YAML) @@ -80,10 +82,11 @@ func TestExamples(t *testing.T) { require.NoError(t, err) n, err := f.Write(data) require.NoError(t, err) - require.Equal(t, n, len(data)) + require.Len(t, data, n) require.NoError(t, f.Close()) defer os.RemoveAll(f.Name()) - + // https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/33594 + // nolint:staticcheck _, err = otelcoltest.LoadConfigAndValidate(f.Name(), factories) require.NoError(t, err, "All yaml config must validate. Please ensure that all necessary component factories are added in newTestComponents()") }) diff --git a/exporter/datadogexporter/factory.go b/exporter/datadogexporter/factory.go index 816d73cb669d..5726d889d403 100644 --- a/exporter/datadogexporter/factory.go +++ b/exporter/datadogexporter/factory.go @@ -22,7 +22,6 @@ import ( "github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes/source" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/config/confighttp" - "go.opentelemetry.io/collector/config/confignet" "go.opentelemetry.io/collector/config/configretry" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/exporter" @@ -37,12 +36,13 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/hostmetadata" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/metadata" + datadogconfig "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/datadog/config" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry" ) var logsAgentExporterFeatureGate = featuregate.GlobalRegistry().MustRegister( "exporter.datadogexporter.UseLogsAgentExporter", - featuregate.StageAlpha, + featuregate.StageBeta, featuregate.WithRegisterDescription("When enabled, datadogexporter uses the Datadog agent logs pipeline for exporting logs."), featuregate.WithRegisterFromVersion("v0.100.0"), ) @@ -79,8 +79,6 @@ func enableZorkianMetricExport() error { return featuregate.GlobalRegistry().Set(metricExportNativeClientFeatureGate.ID(), false) } -const metadataReporterPeriod = 30 * time.Minute - func consumeResource(metadataReporter *inframetadata.Reporter, res pcommon.Resource, logger *zap.Logger) { if err := metadataReporter.ConsumeResource(res); err != nil { logger.Warn("failed to consume resource for host metadata", zap.Error(err), zap.Any("resource", res)) @@ -106,9 +104,9 @@ type factory struct { registry *featuregate.Registry } -func (f *factory) SourceProvider(set component.TelemetrySettings, configHostname string) (source.Provider, error) { +func (f *factory) SourceProvider(set component.TelemetrySettings, configHostname string, timeout time.Duration) (source.Provider, error) { f.onceProvider.Do(func() { - f.sourceProvider, f.providerErr = hostmetadata.GetSourceProvider(set, configHostname) + f.sourceProvider, f.providerErr = hostmetadata.GetSourceProvider(set, configHostname, timeout) }) return f.sourceProvider, f.providerErr } @@ -121,10 +119,10 @@ func (f *factory) AttributesTranslator(set component.TelemetrySettings) (*attrib } // Reporter builds and returns an *inframetadata.Reporter. -func (f *factory) Reporter(params exporter.CreateSettings, pcfg hostmetadata.PusherConfig) (*inframetadata.Reporter, error) { +func (f *factory) Reporter(params exporter.Settings, pcfg hostmetadata.PusherConfig) (*inframetadata.Reporter, error) { f.onceReporter.Do(func() { pusher := hostmetadata.NewPusher(params, pcfg) - f.reporter, f.reporterErr = inframetadata.NewReporter(params.Logger, pusher, metadataReporterPeriod) + f.reporter, f.reporterErr = inframetadata.NewReporter(params.Logger, pusher, pcfg.ReporterPeriod) if f.reporterErr == nil { go func() { if err := f.reporter.Run(context.Background()); err != nil { @@ -148,7 +146,7 @@ func (f *factory) StopReporter() { }) } -func (f *factory) TraceAgent(ctx context.Context, wg *sync.WaitGroup, params exporter.CreateSettings, cfg *Config, sourceProvider source.Provider, attrsTranslator *attributes.Translator) (*agent.Agent, error) { +func (f *factory) TraceAgent(ctx context.Context, wg *sync.WaitGroup, params exporter.Settings, cfg *Config, sourceProvider source.Provider, attrsTranslator *attributes.Translator) (*agent.Agent, error) { agnt, err := newTraceAgent(ctx, params, cfg, sourceProvider, metricsclient.InitializeMetricClient(params.MeterProvider, metricsclient.ExporterSourceTag), attrsTranslator) if err != nil { return nil, err @@ -178,66 +176,14 @@ func NewFactory() exporter.Factory { } func defaultClientConfig() confighttp.ClientConfig { - // do not use NewDefaultClientConfig for backwards-compatibility - return confighttp.ClientConfig{ - Timeout: 15 * time.Second, - } + client := confighttp.NewDefaultClientConfig() + client.Timeout = 15 * time.Second + return client } // createDefaultConfig creates the default exporter configuration func (f *factory) createDefaultConfig() component.Config { - return &Config{ - ClientConfig: defaultClientConfig(), - BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), - - API: APIConfig{ - Site: "datadoghq.com", - }, - - Metrics: MetricsConfig{ - TCPAddrConfig: confignet.TCPAddrConfig{ - Endpoint: "https://api.datadoghq.com", - }, - DeltaTTL: 3600, - ExporterConfig: MetricsExporterConfig{ - ResourceAttributesAsTags: false, - InstrumentationScopeMetadataAsTags: false, - }, - HistConfig: HistogramConfig{ - Mode: "distributions", - SendAggregations: false, - }, - SumConfig: SumConfig{ - CumulativeMonotonicMode: CumulativeMonotonicSumModeToDelta, - InitialCumulativeMonotonicMode: InitialValueModeAuto, - }, - SummaryConfig: SummaryConfig{ - Mode: SummaryModeGauges, - }, - }, - - Traces: TracesConfig{ - TCPAddrConfig: confignet.TCPAddrConfig{ - Endpoint: "https://trace.agent.datadoghq.com", - }, - IgnoreResources: []string{}, - }, - - Logs: LogsConfig{ - TCPAddrConfig: confignet.TCPAddrConfig{ - Endpoint: "https://http-intake.logs.datadoghq.com", - }, - UseCompression: true, - CompressionLevel: 6, - BatchWait: 5, - }, - - HostMetadata: HostMetadataConfig{ - Enabled: true, - HostnameSource: HostnameSourceConfigOrSystem, - }, - } + return datadogconfig.CreateDefaultConfig() } // checkAndCastConfig checks the configuration type and its warnings, and casts it to @@ -247,11 +193,11 @@ func checkAndCastConfig(c component.Config, logger *zap.Logger) *Config { if !ok { panic("programming error: config structure is not of type *datadogexporter.Config") } - cfg.logWarnings(logger) + cfg.LogWarnings(logger) return cfg } -func (f *factory) consumeStatsPayload(ctx context.Context, wg *sync.WaitGroup, statsIn <-chan []byte, statsToAgent chan<- *pb.StatsPayload, tracerVersion string, agentVersion string, logger *zap.Logger) { +func (f *factory) consumeStatsPayload(ctx context.Context, wg *sync.WaitGroup, statsIn <-chan []byte, statsWriter *writer.DatadogStatsWriter, tracerVersion string, agentVersion string, logger *zap.Logger) { for i := 0; i < runtime.NumCPU(); i++ { wg.Add(1) go func() { @@ -275,7 +221,7 @@ func (f *factory) consumeStatsPayload(ctx context.Context, wg *sync.WaitGroup, s } // The DD Connector doesn't set the agent version, so we'll set it here sp.AgentVersion = agentVersion - statsToAgent <- sp + statsWriter.Write(sp) } } }() @@ -285,11 +231,11 @@ func (f *factory) consumeStatsPayload(ctx context.Context, wg *sync.WaitGroup, s // createMetricsExporter creates a metrics exporter based on this config. func (f *factory) createMetricsExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, c component.Config, ) (exporter.Metrics, error) { cfg := checkAndCastConfig(c, set.TelemetrySettings.Logger) - hostProvider, err := f.SourceProvider(set.TelemetrySettings, cfg.Hostname) + hostProvider, err := f.SourceProvider(set.TelemetrySettings, cfg.Hostname, cfg.HostMetadata.GetSourceTimeout()) if err != nil { return nil, fmt.Errorf("failed to build hostname provider: %w", err) } @@ -313,22 +259,25 @@ func (f *factory) createMetricsExporter( cancel() return nil, err } - statsToAgent := make(chan *pb.StatsPayload) metricsClient := metricsclient.InitializeMetricClient(set.MeterProvider, metricsclient.ExporterSourceTag) timingReporter := timing.New(metricsClient) - statsWriter := writer.NewStatsWriter(acfg, statsToAgent, telemetry.NewNoopCollector(), metricsClient, timingReporter) + statsWriter := writer.NewStatsWriter(acfg, telemetry.NewNoopCollector(), metricsClient, timingReporter) set.Logger.Debug("Starting Datadog Trace-Agent StatsWriter") go statsWriter.Run() statsIn := make(chan []byte, 1000) statsv := set.BuildInfo.Command + set.BuildInfo.Version - f.consumeStatsPayload(ctx, &wg, statsIn, statsToAgent, statsv, acfg.AgentVersion, set.Logger) + f.consumeStatsPayload(ctx, &wg, statsIn, statsWriter, statsv, acfg.AgentVersion, set.Logger) pcfg := newMetadataConfigfromConfig(cfg) - metadataReporter, err := f.Reporter(set, pcfg) - if err != nil { - cancel() - return nil, fmt.Errorf("failed to build host metadata reporter: %w", err) + // Don't start a `Reporter` if host metadata is disabled. + var metadataReporter *inframetadata.Reporter + if cfg.HostMetadata.Enabled { + metadataReporter, err = f.Reporter(set, pcfg) + if err != nil { + cancel() + return nil, fmt.Errorf("failed to build host metadata reporter: %w", err) + } } if cfg.OnlyMetadata { @@ -359,13 +308,13 @@ func (f *factory) createMetricsExporter( pushMetricsFn = exp.PushMetricsDataScrubbed } - exporter, err := exporterhelper.NewMetricsExporter( + exporter, err := exporterhelper.NewMetrics( ctx, set, cfg, pushMetricsFn, // explicitly disable since we rely on http.Client timeout logic. - exporterhelper.WithTimeout(exporterhelper.TimeoutSettings{Timeout: 0 * time.Second}), + exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0 * time.Second}), // We use our own custom mechanism for retries, since we hit several endpoints. exporterhelper.WithRetry(configretry.BackOffConfig{Enabled: false}), // The metrics remapping code mutates data @@ -379,9 +328,6 @@ func (f *factory) createMetricsExporter( if statsIn != nil { close(statsIn) } - if statsToAgent != nil { - close(statsToAgent) - } return nil }), ) @@ -395,7 +341,7 @@ func (f *factory) createMetricsExporter( // createTracesExporter creates a trace exporter based on this config. func (f *factory) createTracesExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, c component.Config, ) (exporter.Traces, error) { cfg := checkAndCastConfig(c, set.TelemetrySettings.Logger) @@ -413,7 +359,7 @@ func (f *factory) createTracesExporter( wg sync.WaitGroup // waits for agent to exit ) - hostProvider, err := f.SourceProvider(set.TelemetrySettings, cfg.Hostname) + hostProvider, err := f.SourceProvider(set.TelemetrySettings, cfg.Hostname, cfg.HostMetadata.GetSourceTimeout()) if err != nil { return nil, fmt.Errorf("failed to build hostname provider: %w", err) } @@ -433,10 +379,14 @@ func (f *factory) createTracesExporter( } pcfg := newMetadataConfigfromConfig(cfg) - metadataReporter, err := f.Reporter(set, pcfg) - if err != nil { - cancel() - return nil, fmt.Errorf("failed to build host metadata reporter: %w", err) + // Don't start a `Reporter` if host metadata is disabled. + var metadataReporter *inframetadata.Reporter + if cfg.HostMetadata.Enabled { + metadataReporter, err = f.Reporter(set, pcfg) + if err != nil { + cancel() + return nil, fmt.Errorf("failed to build host metadata reporter: %w", err) + } } if cfg.OnlyMetadata { @@ -476,13 +426,13 @@ func (f *factory) createTracesExporter( } } - return exporterhelper.NewTracesExporter( + return exporterhelper.NewTraces( ctx, set, cfg, pusher, // explicitly disable since we rely on http.Client timeout logic. - exporterhelper.WithTimeout(exporterhelper.TimeoutSettings{Timeout: 0 * time.Second}), + exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0 * time.Second}), // We don't do retries on traces because of deduping concerns on APM Events. exporterhelper.WithRetry(configretry.BackOffConfig{Enabled: false}), exporterhelper.WithQueue(cfg.QueueSettings), @@ -493,14 +443,27 @@ func (f *factory) createTracesExporter( // createLogsExporter creates a logs exporter based on the config. func (f *factory) createLogsExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, c component.Config, ) (exporter.Logs, error) { cfg := checkAndCastConfig(c, set.TelemetrySettings.Logger) + if cfg.Logs.DumpPayloads && isLogsAgentExporterEnabled() { + set.Logger.Warn("logs::dump_payloads is not valid when the exporter.datadogexporter.UseLogsAgentExporter feature gate is enabled") + } + if cfg.Logs.UseCompression && !isLogsAgentExporterEnabled() { + set.Logger.Warn("logs::use_compression is not valid when the exporter.datadogexporter.UseLogsAgentExporter feature gate is disabled") + } + if cfg.Logs.CompressionLevel != 0 && !isLogsAgentExporterEnabled() { + set.Logger.Warn("logs::compression_level is not valid when the exporter.datadogexporter.UseLogsAgentExporter feature gate is disabled") + } + if cfg.Logs.BatchWait != 0 && !isLogsAgentExporterEnabled() { + set.Logger.Warn("logs::batch_wait is not valid when the exporter.datadogexporter.UseLogsAgentExporter feature gate is disabled") + } + var pusher consumer.ConsumeLogsFunc var logsAgent logsagentpipeline.LogsAgent - hostProvider, err := f.SourceProvider(set.TelemetrySettings, cfg.Hostname) + hostProvider, err := f.SourceProvider(set.TelemetrySettings, cfg.Hostname, cfg.HostMetadata.GetSourceTimeout()) if err != nil { return nil, fmt.Errorf("failed to build hostname provider: %w", err) } @@ -508,10 +471,14 @@ func (f *factory) createLogsExporter( // cancel() runs on shutdown pcfg := newMetadataConfigfromConfig(cfg) - metadataReporter, err := f.Reporter(set, pcfg) - if err != nil { - cancel() - return nil, fmt.Errorf("failed to build host metadata reporter: %w", err) + // Don't start a `Reporter` if host metadata is disabled. + var metadataReporter *inframetadata.Reporter + if cfg.HostMetadata.Enabled { + metadataReporter, err = f.Reporter(set, pcfg) + if err != nil { + cancel() + return nil, fmt.Errorf("failed to build host metadata reporter: %w", err) + } } attributesTranslator, err := f.AttributesTranslator(set.TelemetrySettings) @@ -550,13 +517,13 @@ func (f *factory) createLogsExporter( } pusher = exp.consumeLogs } - return exporterhelper.NewLogsExporter( + return exporterhelper.NewLogs( ctx, set, cfg, pusher, // explicitly disable since we rely on http.Client timeout logic. - exporterhelper.WithTimeout(exporterhelper.TimeoutSettings{Timeout: 0 * time.Second}), + exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0 * time.Second}), exporterhelper.WithRetry(cfg.BackOffConfig), exporterhelper.WithQueue(cfg.QueueSettings), exporterhelper.WithShutdown(func(context.Context) error { diff --git a/exporter/datadogexporter/factory_test.go b/exporter/datadogexporter/factory_test.go index ea0b612b4b14..f13ed2fa4fe0 100644 --- a/exporter/datadogexporter/factory_test.go +++ b/exporter/datadogexporter/factory_test.go @@ -10,12 +10,12 @@ import ( "testing" "time" + "github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil" "github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata" "github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata/payload" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/config/confignet" "go.opentelemetry.io/collector/config/configretry" "go.opentelemetry.io/collector/confmap/confmaptest" @@ -27,7 +27,6 @@ import ( "go.uber.org/zap/zaptest" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/metadata" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/testutil" ) var _ inframetadata.Pusher = (*testPusher)(nil) @@ -66,411 +65,6 @@ func (p *testPusher) Payloads() []payload.HostMetadata { return p.payloads } -// Test that the factory creates the default configuration -func TestCreateDefaultConfig(t *testing.T) { - factory := NewFactory() - cfg := factory.CreateDefaultConfig() - - assert.Equal(t, &Config{ - ClientConfig: defaultClientConfig(), - BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), - - API: APIConfig{ - Site: "datadoghq.com", - }, - - Metrics: MetricsConfig{ - TCPAddrConfig: confignet.TCPAddrConfig{ - Endpoint: "https://api.datadoghq.com", - }, - DeltaTTL: 3600, - HistConfig: HistogramConfig{ - Mode: "distributions", - SendAggregations: false, - }, - SumConfig: SumConfig{ - CumulativeMonotonicMode: CumulativeMonotonicSumModeToDelta, - InitialCumulativeMonotonicMode: InitialValueModeAuto, - }, - SummaryConfig: SummaryConfig{ - Mode: SummaryModeGauges, - }, - }, - - Traces: TracesConfig{ - TCPAddrConfig: confignet.TCPAddrConfig{ - Endpoint: "https://trace.agent.datadoghq.com", - }, - IgnoreResources: []string{}, - }, - Logs: LogsConfig{ - TCPAddrConfig: confignet.TCPAddrConfig{ - Endpoint: "https://http-intake.logs.datadoghq.com", - }, - UseCompression: true, - CompressionLevel: 6, - BatchWait: 5, - }, - - HostMetadata: HostMetadataConfig{ - Enabled: true, - HostnameSource: HostnameSourceConfigOrSystem, - }, - OnlyMetadata: false, - }, cfg, "failed to create default config") - - assert.NoError(t, componenttest.CheckConfigStruct(cfg)) -} - -// Test that the factory creates the default configuration -func TestCreateDefaultConfigLogsAgent(t *testing.T) { - err := featuregate.GlobalRegistry().Set("exporter.datadogexporter.UseLogsAgentExporter", true) - assert.NoError(t, err) - factory := NewFactory() - cfg := factory.CreateDefaultConfig() - - assert.Equal(t, &Config{ - ClientConfig: defaultClientConfig(), - BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), - - API: APIConfig{ - Site: "datadoghq.com", - }, - - Metrics: MetricsConfig{ - TCPAddrConfig: confignet.TCPAddrConfig{ - Endpoint: "https://api.datadoghq.com", - }, - DeltaTTL: 3600, - HistConfig: HistogramConfig{ - Mode: "distributions", - SendAggregations: false, - }, - SumConfig: SumConfig{ - CumulativeMonotonicMode: CumulativeMonotonicSumModeToDelta, - InitialCumulativeMonotonicMode: InitialValueModeAuto, - }, - SummaryConfig: SummaryConfig{ - Mode: SummaryModeGauges, - }, - }, - - Traces: TracesConfig{ - TCPAddrConfig: confignet.TCPAddrConfig{ - Endpoint: "https://trace.agent.datadoghq.com", - }, - IgnoreResources: []string{}, - }, - Logs: LogsConfig{ - TCPAddrConfig: confignet.TCPAddrConfig{ - Endpoint: "https://http-intake.logs.datadoghq.com", - }, - UseCompression: true, - CompressionLevel: 6, - BatchWait: 5, - }, - - HostMetadata: HostMetadataConfig{ - Enabled: true, - HostnameSource: HostnameSourceConfigOrSystem, - }, - OnlyMetadata: false, - }, cfg, "failed to create default config") - - assert.NoError(t, componenttest.CheckConfigStruct(cfg)) - err = featuregate.GlobalRegistry().Set("exporter.datadogexporter.UseLogsAgentExporter", false) - assert.NoError(t, err) -} - -func TestLoadConfig(t *testing.T) { - t.Parallel() - - cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml")) - require.NoError(t, err) - - tests := []struct { - id component.ID - expected component.Config - }{ - { - id: component.NewIDWithName(metadata.Type, "default"), - expected: &Config{ - ClientConfig: defaultClientConfig(), - BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), - API: APIConfig{ - Key: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - Site: "datadoghq.com", - FailOnInvalidKey: false, - }, - - Metrics: MetricsConfig{ - TCPAddrConfig: confignet.TCPAddrConfig{ - Endpoint: "https://api.datadoghq.com", - }, - DeltaTTL: 3600, - HistConfig: HistogramConfig{ - Mode: "distributions", - SendAggregations: false, - }, - SumConfig: SumConfig{ - CumulativeMonotonicMode: CumulativeMonotonicSumModeToDelta, - InitialCumulativeMonotonicMode: InitialValueModeAuto, - }, - SummaryConfig: SummaryConfig{ - Mode: SummaryModeGauges, - }, - }, - - Traces: TracesConfig{ - TCPAddrConfig: confignet.TCPAddrConfig{ - Endpoint: "https://trace.agent.datadoghq.com", - }, - IgnoreResources: []string{}, - }, - Logs: LogsConfig{ - TCPAddrConfig: confignet.TCPAddrConfig{ - Endpoint: "https://http-intake.logs.datadoghq.com", - }, - UseCompression: true, - CompressionLevel: 6, - BatchWait: 5, - }, - HostMetadata: HostMetadataConfig{ - Enabled: true, - HostnameSource: HostnameSourceConfigOrSystem, - }, - OnlyMetadata: false, - }, - }, - { - id: component.NewIDWithName(metadata.Type, "api"), - expected: &Config{ - ClientConfig: defaultClientConfig(), - BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), - TagsConfig: TagsConfig{ - Hostname: "customhostname", - }, - API: APIConfig{ - Key: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - Site: "datadoghq.eu", - FailOnInvalidKey: true, - }, - Metrics: MetricsConfig{ - TCPAddrConfig: confignet.TCPAddrConfig{ - Endpoint: "https://api.datadoghq.eu", - }, - DeltaTTL: 3600, - HistConfig: HistogramConfig{ - Mode: "distributions", - SendAggregations: false, - }, - SumConfig: SumConfig{ - CumulativeMonotonicMode: CumulativeMonotonicSumModeToDelta, - InitialCumulativeMonotonicMode: InitialValueModeAuto, - }, - SummaryConfig: SummaryConfig{ - Mode: SummaryModeGauges, - }, - }, - Traces: TracesConfig{ - TCPAddrConfig: confignet.TCPAddrConfig{ - Endpoint: "https://trace.agent.datadoghq.eu", - }, - SpanNameRemappings: map[string]string{ - "old_name1": "new_name1", - "old_name2": "new_name2", - }, - SpanNameAsResourceName: true, - IgnoreResources: []string{}, - TraceBuffer: 10, - }, - Logs: LogsConfig{ - TCPAddrConfig: confignet.TCPAddrConfig{ - Endpoint: "https://http-intake.logs.datadoghq.eu", - }, - UseCompression: true, - CompressionLevel: 6, - BatchWait: 5, - }, - OnlyMetadata: false, - HostMetadata: HostMetadataConfig{ - Enabled: true, - HostnameSource: HostnameSourceConfigOrSystem, - }, - }, - }, - { - id: component.NewIDWithName(metadata.Type, "api2"), - expected: &Config{ - ClientConfig: defaultClientConfig(), - BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), - TagsConfig: TagsConfig{ - Hostname: "customhostname", - }, - API: APIConfig{ - Key: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - Site: "datadoghq.eu", - FailOnInvalidKey: false, - }, - Metrics: MetricsConfig{ - TCPAddrConfig: confignet.TCPAddrConfig{ - Endpoint: "https://api.datadoghq.test", - }, - DeltaTTL: 3600, - HistConfig: HistogramConfig{ - Mode: "distributions", - SendAggregations: false, - }, - SumConfig: SumConfig{ - CumulativeMonotonicMode: CumulativeMonotonicSumModeToDelta, - InitialCumulativeMonotonicMode: InitialValueModeAuto, - }, - SummaryConfig: SummaryConfig{ - Mode: SummaryModeGauges, - }, - }, - Traces: TracesConfig{ - TCPAddrConfig: confignet.TCPAddrConfig{ - Endpoint: "https://trace.agent.datadoghq.test", - }, - SpanNameRemappings: map[string]string{ - "old_name3": "new_name3", - "old_name4": "new_name4", - }, - IgnoreResources: []string{}, - }, - Logs: LogsConfig{ - TCPAddrConfig: confignet.TCPAddrConfig{ - Endpoint: "https://http-intake.logs.datadoghq.test", - }, - UseCompression: true, - CompressionLevel: 6, - BatchWait: 5, - }, - HostMetadata: HostMetadataConfig{ - Enabled: true, - HostnameSource: HostnameSourceConfigOrSystem, - Tags: []string{"example:tag"}, - }, - }, - }, - } - - for _, tt := range tests { - t.Run(tt.id.String(), func(t *testing.T) { - factory := NewFactory() - cfg := factory.CreateDefaultConfig() - - sub, err := cm.Sub(tt.id.String()) - require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) - - assert.NoError(t, component.ValidateConfig(cfg)) - assert.Equal(t, tt.expected, cfg) - }) - } -} - -func TestOverrideEndpoints(t *testing.T) { - tests := []struct { - componentID string - expectedSite string - expectedMetricsEndpoint string - expectedTracesEndpoint string - expectedLogsEndpoint string - }{ - { - componentID: "nositeandnoendpoints", - expectedSite: "datadoghq.com", - expectedMetricsEndpoint: "https://api.datadoghq.com", - expectedTracesEndpoint: "https://trace.agent.datadoghq.com", - expectedLogsEndpoint: "https://http-intake.logs.datadoghq.com", - }, - { - componentID: "nositeandmetricsendpoint", - expectedSite: "datadoghq.com", - expectedMetricsEndpoint: "metricsendpoint:1234", - expectedTracesEndpoint: "https://trace.agent.datadoghq.com", - expectedLogsEndpoint: "https://http-intake.logs.datadoghq.com", - }, - { - componentID: "nositeandtracesendpoint", - expectedSite: "datadoghq.com", - expectedMetricsEndpoint: "https://api.datadoghq.com", - expectedTracesEndpoint: "tracesendpoint:1234", - expectedLogsEndpoint: "https://http-intake.logs.datadoghq.com", - }, - { - componentID: "nositeandlogsendpoint", - expectedSite: "datadoghq.com", - expectedMetricsEndpoint: "https://api.datadoghq.com", - expectedTracesEndpoint: "https://trace.agent.datadoghq.com", - expectedLogsEndpoint: "logsendpoint:1234", - }, - { - componentID: "nositeandallendpoints", - expectedSite: "datadoghq.com", - expectedMetricsEndpoint: "metricsendpoint:1234", - expectedTracesEndpoint: "tracesendpoint:1234", - expectedLogsEndpoint: "logsendpoint:1234", - }, - - { - componentID: "siteandnoendpoints", - expectedSite: "datadoghq.eu", - expectedMetricsEndpoint: "https://api.datadoghq.eu", - expectedTracesEndpoint: "https://trace.agent.datadoghq.eu", - expectedLogsEndpoint: "https://http-intake.logs.datadoghq.eu", - }, - { - componentID: "siteandmetricsendpoint", - expectedSite: "datadoghq.eu", - expectedMetricsEndpoint: "metricsendpoint:1234", - expectedTracesEndpoint: "https://trace.agent.datadoghq.eu", - expectedLogsEndpoint: "https://http-intake.logs.datadoghq.eu", - }, - { - componentID: "siteandtracesendpoint", - expectedSite: "datadoghq.eu", - expectedMetricsEndpoint: "https://api.datadoghq.eu", - expectedTracesEndpoint: "tracesendpoint:1234", - expectedLogsEndpoint: "https://http-intake.logs.datadoghq.eu", - }, - { - componentID: "siteandallendpoints", - expectedSite: "datadoghq.eu", - expectedMetricsEndpoint: "metricsendpoint:1234", - expectedTracesEndpoint: "tracesendpoint:1234", - expectedLogsEndpoint: "logsendpoint:1234", - }, - } - - cm, err := confmaptest.LoadConf(filepath.Join("testdata", "unmarshal.yaml")) - require.NoError(t, err) - factory := NewFactory() - - for _, testInstance := range tests { - t.Run(testInstance.componentID, func(t *testing.T) { - cfg := factory.CreateDefaultConfig() - sub, err := cm.Sub(component.NewIDWithName(metadata.Type, testInstance.componentID).String()) - require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) - - componentCfg, ok := cfg.(*Config) - require.True(t, ok, "component.Config is not a Datadog exporter config (wrong ID?)") - assert.Equal(t, testInstance.expectedSite, componentCfg.API.Site) - assert.Equal(t, testInstance.expectedMetricsEndpoint, componentCfg.Metrics.Endpoint) - assert.Equal(t, testInstance.expectedTracesEndpoint, componentCfg.Traces.Endpoint) - assert.Equal(t, testInstance.expectedLogsEndpoint, componentCfg.Logs.Endpoint) - }) - } -} - func TestCreateAPIMetricsExporter(t *testing.T) { server := testutil.DatadogServerMock() defer server.Close() @@ -482,16 +76,16 @@ func TestCreateAPIMetricsExporter(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "api").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) c := cfg.(*Config) c.Metrics.TCPAddrConfig.Endpoint = server.URL c.HostMetadata.Enabled = false ctx := context.Background() - exp, err := factory.CreateMetricsExporter( + exp, err := factory.CreateMetrics( ctx, - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg, ) @@ -500,6 +94,8 @@ func TestCreateAPIMetricsExporter(t *testing.T) { } func TestCreateAPIExporterFailOnInvalidKey_Zorkian(t *testing.T) { + featuregateErr := featuregate.GlobalRegistry().Set("exporter.datadogexporter.UseLogsAgentExporter", false) + assert.NoError(t, featuregateErr) server := testutil.DatadogServerMock(testutil.ValidateAPIKeyEndpointInvalid) defer server.Close() @@ -515,7 +111,7 @@ func TestCreateAPIExporterFailOnInvalidKey_Zorkian(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "api").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) // Use the mock server for API key validation c := cfg.(*Config) @@ -526,25 +122,25 @@ func TestCreateAPIExporterFailOnInvalidKey_Zorkian(t *testing.T) { c.API.FailOnInvalidKey = true ctx := context.Background() // metrics exporter - mexp, err := factory.CreateMetricsExporter( + mexp, err := factory.CreateMetrics( ctx, - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg, ) assert.EqualError(t, err, "API Key validation failed") assert.Nil(t, mexp) - texp, err := factory.CreateTracesExporter( + texp, err := factory.CreateTraces( ctx, - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg, ) assert.EqualError(t, err, "API Key validation failed") assert.Nil(t, texp) - lexp, err := factory.CreateLogsExporter( + lexp, err := factory.CreateLogs( ctx, - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg, ) assert.EqualError(t, err, "API Key validation failed") @@ -553,33 +149,37 @@ func TestCreateAPIExporterFailOnInvalidKey_Zorkian(t *testing.T) { t.Run("false", func(t *testing.T) { c.API.FailOnInvalidKey = false ctx := context.Background() - exp, err := factory.CreateMetricsExporter( + exp, err := factory.CreateMetrics( ctx, - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg, ) assert.NoError(t, err) assert.NotNil(t, exp) - texp, err := factory.CreateTracesExporter( + texp, err := factory.CreateTraces( ctx, - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg, ) assert.NoError(t, err) assert.NotNil(t, texp) - lexp, err := factory.CreateLogsExporter( + lexp, err := factory.CreateLogs( ctx, - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg, ) assert.NoError(t, err) assert.NotNil(t, lexp) }) + featuregateErr = featuregate.GlobalRegistry().Set("exporter.datadogexporter.UseLogsAgentExporter", true) + assert.NoError(t, featuregateErr) } func TestCreateAPIExporterFailOnInvalidKey(t *testing.T) { + featuregateErr := featuregate.GlobalRegistry().Set("exporter.datadogexporter.UseLogsAgentExporter", false) + assert.NoError(t, featuregateErr) server := testutil.DatadogServerMock(testutil.ValidateAPIKeyEndpointInvalid) defer server.Close() @@ -595,7 +195,7 @@ func TestCreateAPIExporterFailOnInvalidKey(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "api").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) // Use the mock server for API key validation c := cfg.(*Config) @@ -606,25 +206,25 @@ func TestCreateAPIExporterFailOnInvalidKey(t *testing.T) { c.API.FailOnInvalidKey = true ctx := context.Background() // metrics exporter - mexp, err := factory.CreateMetricsExporter( + mexp, err := factory.CreateMetrics( ctx, - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg, ) assert.EqualError(t, err, "API Key validation failed") assert.Nil(t, mexp) - texp, err := factory.CreateTracesExporter( + texp, err := factory.CreateTraces( ctx, - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg, ) assert.EqualError(t, err, "API Key validation failed") assert.Nil(t, texp) - lexp, err := factory.CreateLogsExporter( + lexp, err := factory.CreateLogs( ctx, - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg, ) assert.EqualError(t, err, "API Key validation failed") @@ -633,30 +233,32 @@ func TestCreateAPIExporterFailOnInvalidKey(t *testing.T) { t.Run("false", func(t *testing.T) { c.API.FailOnInvalidKey = false ctx := context.Background() - exp, err := factory.CreateMetricsExporter( + exp, err := factory.CreateMetrics( ctx, - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg, ) assert.NoError(t, err) assert.NotNil(t, exp) - texp, err := factory.CreateTracesExporter( + texp, err := factory.CreateTraces( ctx, - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg, ) assert.NoError(t, err) assert.NotNil(t, texp) - lexp, err := factory.CreateLogsExporter( + lexp, err := factory.CreateLogs( ctx, - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg, ) assert.NoError(t, err) assert.NotNil(t, lexp) }) + featuregateErr = featuregate.GlobalRegistry().Set("exporter.datadogexporter.UseLogsAgentExporter", true) + assert.NoError(t, featuregateErr) } func TestCreateAPILogsExporter(t *testing.T) { @@ -670,16 +272,16 @@ func TestCreateAPILogsExporter(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "api").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) c := cfg.(*Config) c.Metrics.TCPAddrConfig.Endpoint = server.URL c.HostMetadata.Enabled = false ctx := context.Background() - exp, err := factory.CreateLogsExporter( + exp, err := factory.CreateLogs( ctx, - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg, ) @@ -696,9 +298,9 @@ func TestOnlyMetadata(t *testing.T) { cfg := &Config{ ClientConfig: defaultClientConfig(), BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), - API: APIConfig{Key: "notnull"}, + API: APIConfig{Key: "aaaaaaa"}, Metrics: MetricsConfig{TCPAddrConfig: confignet.TCPAddrConfig{Endpoint: server.URL}}, Traces: TracesConfig{TCPAddrConfig: confignet.TCPAddrConfig{Endpoint: server.URL}}, OnlyMetadata: true, @@ -706,20 +308,22 @@ func TestOnlyMetadata(t *testing.T) { HostMetadata: HostMetadataConfig{ Enabled: true, HostnameSource: HostnameSourceFirstResource, + ReporterPeriod: 30 * time.Minute, }, } + cfg.HostMetadata.SetSourceTimeout(50 * time.Millisecond) - expTraces, err := factory.CreateTracesExporter( + expTraces, err := factory.CreateTraces( ctx, - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg, ) assert.NoError(t, err) assert.NotNil(t, expTraces) - expMetrics, err := factory.CreateMetricsExporter( + expMetrics, err := factory.CreateMetrics( ctx, - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg, ) assert.NoError(t, err) @@ -737,7 +341,7 @@ func TestOnlyMetadata(t *testing.T) { require.NoError(t, err) recvMetadata := <-server.MetadataChan - assert.Equal(t, recvMetadata.InternalHostname, "custom-hostname") + assert.Equal(t, "custom-hostname", recvMetadata.InternalHostname) } func TestStopExporters(t *testing.T) { @@ -751,23 +355,23 @@ func TestStopExporters(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "api").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) c := cfg.(*Config) c.Metrics.TCPAddrConfig.Endpoint = server.URL c.HostMetadata.Enabled = false ctx := context.Background() - expTraces, err := factory.CreateTracesExporter( + expTraces, err := factory.CreateTraces( ctx, - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg, ) assert.NoError(t, err) assert.NotNil(t, expTraces) - expMetrics, err := factory.CreateMetricsExporter( + expMetrics, err := factory.CreateMetrics( ctx, - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg, ) assert.NoError(t, err) diff --git a/exporter/datadogexporter/generated_component_test.go b/exporter/datadogexporter/generated_component_test.go index 9dc6527ccb9f..1c7ba7cb8d22 100644 --- a/exporter/datadogexporter/generated_component_test.go +++ b/exporter/datadogexporter/generated_component_test.go @@ -32,27 +32,27 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, { name: "metrics", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg) }, }, { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -64,21 +64,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(exporter.Logs) require.True(t, ok) diff --git a/exporter/datadogexporter/go.mod b/exporter/datadogexporter/go.mod index 6694767cd644..5ac10d0a723f 100644 --- a/exporter/datadogexporter/go.mod +++ b/exporter/datadogexporter/go.mod @@ -1,182 +1,208 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter -go 1.21.0 +go 1.22.0 require ( - github.com/DataDog/agent-payload/v5 v5.0.119 - github.com/DataDog/datadog-agent/comp/core/config v0.54.0-rc.5 - github.com/DataDog/datadog-agent/comp/core/hostname/hostnameinterface v0.54.0-rc.5 - github.com/DataDog/datadog-agent/comp/core/log v0.54.0-rc.5 - github.com/DataDog/datadog-agent/comp/logs/agent/config v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline v0.54.0-rc.5 - github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline/logsagentpipelineimpl v0.54.0-rc.5 - github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/exporter/logsagentexporter v0.54.0-rc.5 - github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/metricsclient v0.0.0-20240525065430-d0b647bcb646 - github.com/DataDog/datadog-agent/pkg/config/model v0.54.0-rc.5 - github.com/DataDog/datadog-agent/pkg/config/setup v0.54.0-rc.5 - github.com/DataDog/datadog-agent/pkg/logs/auditor v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/client v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/diagnostic v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/pipeline v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/sds v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/status/statusinterface v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/proto v0.54.0-rc.5 - github.com/DataDog/datadog-agent/pkg/status/health v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/trace v0.54.0-rc.5 - github.com/DataDog/datadog-agent/pkg/util/startstop v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-api-client-go/v2 v2.26.0 + github.com/DataDog/agent-payload/v5 v5.0.137 + github.com/DataDog/datadog-agent/comp/core/config v0.59.0 + github.com/DataDog/datadog-agent/comp/core/hostname/hostnameinterface v0.59.0 + github.com/DataDog/datadog-agent/comp/core/log v0.56.2 + github.com/DataDog/datadog-agent/comp/logs/agent/config v0.59.0 + github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline v0.59.0 + github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline/logsagentpipelineimpl v0.59.0 + github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/exporter/logsagentexporter v0.62.0-devel.0.20241213165407-f95df913d2b7 + github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/metricsclient v0.59.0 + github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.57.0-devel.0.20240718200853-81bf3b2e412d + github.com/DataDog/datadog-agent/comp/trace/compression/impl-gzip v0.59.0 + github.com/DataDog/datadog-agent/pkg/config/model v0.59.0 + github.com/DataDog/datadog-agent/pkg/config/setup v0.59.0 + github.com/DataDog/datadog-agent/pkg/logs/auditor v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/client v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/diagnostic v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/pipeline v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/sds v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/sources v0.59.0 + github.com/DataDog/datadog-agent/pkg/logs/status/statusinterface v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.59.0 + github.com/DataDog/datadog-agent/pkg/status/health v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.59.0 + github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.59.0 + github.com/DataDog/datadog-agent/pkg/util/startstop v0.59.0 // indirect + github.com/DataDog/datadog-api-client-go/v2 v2.33.0 github.com/DataDog/datadog-go/v5 v5.5.0 github.com/DataDog/gohai v0.0.0-20230524154621-4316413895ee - github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata v0.16.1 - github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.16.1 - github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/logs v0.16.1 - github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics v0.16.1 - github.com/DataDog/opentelemetry-mapping-go/pkg/quantile v0.16.1 - github.com/DataDog/sketches-go v1.4.5 - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.23.0 - github.com/aws/aws-sdk-go v1.53.11 + github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata v0.22.0 + github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.22.0 + github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/logs v0.22.0 + github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics v0.22.0 + github.com/DataDog/opentelemetry-mapping-go/pkg/quantile v0.22.0 + github.com/DataDog/sketches-go v1.4.6 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 + github.com/aws/aws-sdk-go v1.55.5 github.com/cenkalti/backoff/v4 v4.3.0 github.com/google/go-cmp v0.6.0 - github.com/open-telemetry/opentelemetry-collector-contrib/connector/datadogconnector v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/ecsutil v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/dockerstatsreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configauth v0.102.0 - go.opentelemetry.io/collector/config/configcompression v1.9.0 - go.opentelemetry.io/collector/config/confighttp v0.102.0 - go.opentelemetry.io/collector/config/confignet v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/collector/config/configtls v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/connector v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/featuregate v1.9.0 - go.opentelemetry.io/collector/otelcol v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/processor v0.102.0 - go.opentelemetry.io/collector/processor/batchprocessor v0.102.0 - go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.102.0 - go.opentelemetry.io/collector/receiver v0.102.0 - go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/connector/datadogconnector v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/ecsutil v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/dockerstatsreceiver v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 + go.opentelemetry.io/collector/config/confighttp v0.116.0 + go.opentelemetry.io/collector/config/confignet v1.22.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 // indirect + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/config/configtls v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/connector v0.116.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/featuregate v1.22.0 + go.opentelemetry.io/collector/otelcol v0.116.0 + go.opentelemetry.io/collector/otelcol/otelcoltest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/processor v0.116.0 + go.opentelemetry.io/collector/processor/batchprocessor v0.116.0 + go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.116.0 + go.opentelemetry.io/collector/receiver v0.116.0 + go.opentelemetry.io/collector/receiver/otlpreceiver v0.116.0 + go.opentelemetry.io/collector/semconv v0.116.0 + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 - google.golang.org/protobuf v1.34.1 + google.golang.org/protobuf v1.35.2 gopkg.in/yaml.v2 v2.4.0 gopkg.in/zorkian/go-datadog-api.v2 v2.30.0 - k8s.io/apimachinery v0.29.3 - k8s.io/client-go v0.29.3 + k8s.io/apimachinery v0.31.3 + k8s.io/client-go v0.31.3 ) require ( - cloud.google.com/go/compute/metadata v0.3.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.10.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 // indirect - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.5.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/datadog v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 +) + +require ( + cloud.google.com/go/auth v0.7.0 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.2 // indirect + cloud.google.com/go/compute/metadata v0.5.2 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 // indirect - github.com/Code-Hex/go-generics-cache v1.3.1 // indirect - github.com/DataDog/datadog-agent/comp/core/secrets v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/core/telemetry v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/def v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/statsprocessor v0.0.0-20240525065430-d0b647bcb646 // indirect - github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/config/env v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/config/utils v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/message v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/metrics v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/processor v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/sender v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/sources v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/status/utils v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/obfuscate v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/telemetry v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/backoff v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/cgroups v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/executable v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/filesystem v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/fxutil v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/http v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/log v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/optional v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/pointer v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/scrubber v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/statstracker v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/system v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/system/socket v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/winutil v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/version v0.54.0-rc.5 // indirect - github.com/DataDog/dd-sensitive-data-scanner/sds-go/go v0.0.0-20240419161837-f1b2f553edfe // indirect - github.com/DataDog/go-sqllexer v0.0.9 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect + github.com/Code-Hex/go-generics-cache v1.5.1 // indirect + github.com/DataDog/datadog-agent/comp/core/flare/builder v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/core/flare/types v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/core/log/def v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/core/secrets v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/core/telemetry v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/def v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/statsprocessor v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/trace/compression/def v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/config/env v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/config/mock v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/config/nodetreemodel v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/config/structure v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/config/teeconfig v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/config/utils v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/message v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/metrics v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/processor v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/sender v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/status/utils v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/telemetry v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/backoff v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/cgroups v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/executable v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/filesystem v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/fxutil v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/http v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.59.1 // indirect + github.com/DataDog/datadog-agent/pkg/util/optional v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/pointer v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.59.1 // indirect + github.com/DataDog/datadog-agent/pkg/util/statstracker v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/system v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/system/socket v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/winutil v0.59.1 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.59.1 // indirect + github.com/DataDog/dd-sensitive-data-scanner/sds-go/go v0.0.0-20240816154533-f7f9beb53a42 // indirect + github.com/DataDog/go-sqllexer v0.0.15 // indirect github.com/DataDog/go-tuf v1.1.0-0.5.2 // indirect - github.com/DataDog/viper v1.13.3 // indirect - github.com/DataDog/zstd v1.5.2 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/DataDog/viper v1.14.0 // indirect + github.com/DataDog/zstd v1.5.6 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/Showmax/go-fqdn v1.0.0 // indirect github.com/alecthomas/participle/v2 v2.1.1 // indirect - github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 // indirect + github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 // indirect + github.com/antchfx/xmlquery v1.4.2 // indirect + github.com/antchfx/xpath v1.3.2 // indirect github.com/armon/go-metrics v0.4.1 // indirect github.com/benbjohnson/clock v1.3.5 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bmatcuk/doublestar/v4 v4.6.1 // indirect + github.com/bmatcuk/doublestar/v4 v4.7.1 // indirect github.com/briandowns/spinner v1.23.0 // indirect github.com/cenkalti/backoff v2.2.1+incompatible // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect - github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50 // indirect + github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 // indirect github.com/containerd/cgroups/v3 v3.0.3 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dennwc/varint v1.0.0 // indirect - github.com/digitalocean/godo v1.109.0 // indirect - github.com/distribution/reference v0.5.0 // indirect - github.com/docker/docker v25.0.5+incompatible // indirect + github.com/digitalocean/godo v1.118.0 // indirect + github.com/distribution/reference v0.6.0 // indirect + github.com/docker/docker v27.4.0+incompatible // indirect github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.1 // indirect + github.com/elastic/go-grok v0.3.1 // indirect + github.com/elastic/lunes v0.1.0 // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect - github.com/envoyproxy/go-control-plane v0.12.0 // indirect - github.com/envoyproxy/protoc-gen-validate v1.0.4 // indirect + github.com/envoyproxy/go-control-plane v0.13.0 // indirect + github.com/envoyproxy/protoc-gen-validate v1.1.0 // indirect github.com/expr-lang/expr v1.16.9 // indirect - github.com/fatih/color v1.16.0 // indirect + github.com/fatih/color v1.18.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/fxamacker/cbor/v2 v2.7.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-openapi/jsonpointer v0.20.2 // indirect github.com/go-openapi/jsonreference v0.20.4 // indirect github.com/go-openapi/swag v0.22.9 // indirect - github.com/go-resty/resty/v2 v2.12.0 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-resty/resty/v2 v2.13.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/go-zookeeper/zk v1.0.3 // indirect github.com/gobwas/glob v0.2.3 // indirect - github.com/goccy/go-json v0.10.2 // indirect + github.com/goccy/go-json v0.10.4 // indirect github.com/godbus/dbus/v5 v5.0.6 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v5 v5.2.0 // indirect + github.com/golang-jwt/jwt/v5 v5.2.1 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/mock v1.6.0 // indirect github.com/golang/protobuf v1.5.4 // indirect @@ -187,174 +213,207 @@ require ( github.com/google/s2a-go v0.1.7 // indirect github.com/google/uuid v1.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.2 // indirect - github.com/gophercloud/gophercloud v1.8.0 // indirect + github.com/googleapis/gax-go/v2 v2.12.5 // indirect + github.com/gophercloud/gophercloud v1.13.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect - github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect - github.com/hashicorp/consul/api v1.28.3 // indirect + github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 // indirect + github.com/hashicorp/consul/api v1.30.0 // indirect github.com/hashicorp/cronexpr v1.1.2 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-hclog v1.5.0 // indirect + github.com/hashicorp/go-hclog v1.6.3 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-retryablehttp v0.7.4 // indirect + github.com/hashicorp/go-retryablehttp v0.7.7 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hashicorp/nomad/api v0.0.0-20240306004928-3e7191ccb702 // indirect + github.com/hashicorp/hcl v1.0.1-vault-5 // indirect + github.com/hashicorp/nomad/api v0.0.0-20240717122358-3d93bd3778f3 // indirect github.com/hashicorp/serf v0.10.1 // indirect github.com/hectane/go-acl v0.0.0-20190604041725-da78bae5fc95 // indirect - github.com/hetznercloud/hcloud-go/v2 v2.6.0 // indirect + github.com/hetznercloud/hcloud-go/v2 v2.10.2 // indirect github.com/iancoleman/strcase v0.3.0 // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/ionos-cloud/sdk-go/v6 v6.1.11 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/jonboulle/clockwork v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/jpillora/backoff v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect github.com/karrick/godirwalk v1.17.0 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b // indirect github.com/kylelemons/godebug v1.1.0 // indirect - github.com/leodido/go-syslog/v4 v4.1.0 // indirect + github.com/leodido/go-syslog/v4 v4.2.0 // indirect github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b // indirect - github.com/leoluk/perflib_exporter v0.2.1 // indirect - github.com/linode/linodego v1.33.0 // indirect + github.com/linode/linodego v1.37.0 // indirect github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c // indirect + github.com/magefile/mage v1.15.0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/miekg/dns v1.1.58 // indirect + github.com/miekg/dns v1.1.61 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect - github.com/mostynb/go-grpc-compression v1.2.2 // indirect + github.com/mostynb/go-grpc-compression v1.2.3 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/docker v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.102.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/docker v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.116.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect github.com/opencontainers/runtime-spec v1.1.0-rc.3 // indirect github.com/openshift/api v3.9.0+incompatible // indirect github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142 // indirect github.com/outcaste-io/ristretto v0.2.1 // indirect - github.com/ovh/go-ovh v1.4.3 // indirect + github.com/ovh/go-ovh v1.6.0 // indirect github.com/patrickmn/go-cache v2.1.0+incompatible // indirect - github.com/pelletier/go-toml v1.2.0 // indirect - github.com/philhofer/fwd v1.1.2 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c // indirect - github.com/prometheus/client_golang v1.19.1 // indirect + github.com/prometheus-community/windows_exporter v0.27.2 // indirect + github.com/prometheus/client_golang v1.20.5 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect + github.com/prometheus/common v0.61.0 // indirect github.com/prometheus/common/sigv4 v0.1.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e // indirect - github.com/rs/cors v1.10.1 // indirect - github.com/scaleway/scaleway-sdk-go v1.0.0-beta.25 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/prometheus/prometheus v0.54.1 // indirect + github.com/rs/cors v1.11.1 // indirect + github.com/scaleway/scaleway-sdk-go v1.0.0-beta.29 // indirect github.com/secure-systems-lab/go-securesystemslib v0.7.0 // indirect - github.com/shirou/gopsutil/v3 v3.24.4 // indirect + github.com/shirou/gopsutil/v3 v3.24.5 // indirect + github.com/shirou/gopsutil/v4 v4.24.11 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect - github.com/spf13/afero v1.10.0 // indirect - github.com/spf13/cast v1.5.1 // indirect - github.com/spf13/cobra v1.8.0 // indirect - github.com/spf13/jwalterweatherman v1.0.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.7.0 // indirect + github.com/spf13/cobra v1.8.1 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stormcat24/protodep v0.1.8 // indirect github.com/stretchr/objx v0.5.2 // indirect - github.com/tinylib/msgp v1.1.9 // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect + github.com/tinylib/msgp v1.2.4 // indirect + github.com/tklauser/go-sysconf v0.3.14 // indirect + github.com/tklauser/numcpus v0.8.0 // indirect + github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 // indirect github.com/valyala/fastjson v1.6.4 // indirect github.com/vultr/govultr/v2 v2.17.2 // indirect + github.com/x448/float16 v0.8.4 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect github.com/zorkian/go-datadog-api v2.30.0+incompatible // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configgrpc v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/filter v0.102.0 // indirect - go.opentelemetry.io/collector/pdata/testdata v0.102.0 // indirect - go.opentelemetry.io/collector/service v0.102.0 // indirect - go.opentelemetry.io/contrib/config v0.7.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/contrib/propagators/b3 v1.27.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/bridge/opencensus v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - go.opentelemetry.io/proto/otlp v1.2.0 // indirect - go.uber.org/dig v1.17.0 // indirect - go.uber.org/fx v1.18.2 // indirect + go.opentelemetry.io/collector v0.116.0 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/component/componentstatus v0.116.0 // indirect + go.opentelemetry.io/collector/config/configgrpc v0.116.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0 // indirect + go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0 // indirect + go.opentelemetry.io/collector/confmap/provider/httpprovider v1.22.0 // indirect + go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.22.0 // indirect + go.opentelemetry.io/collector/connector/connectortest v0.116.0 // indirect + go.opentelemetry.io/collector/connector/xconnector v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0 // indirect + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 // indirect + go.opentelemetry.io/collector/filter v0.116.0 // indirect + go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/internal/memorylimiter v0.116.0 // indirect + go.opentelemetry.io/collector/internal/sharedcomponent v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/testdata v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 // indirect + go.opentelemetry.io/collector/processor/processorhelper/xprocessorhelper v0.116.0 // indirect + go.opentelemetry.io/collector/processor/processortest v0.116.0 // indirect + go.opentelemetry.io/collector/processor/xprocessor v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/collector/scraper v0.116.0 // indirect + go.opentelemetry.io/collector/service v0.116.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.6.0 // indirect + go.opentelemetry.io/contrib/config v0.10.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/contrib/propagators/b3 v1.31.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.54.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 // indirect + go.opentelemetry.io/otel/log v0.8.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.7.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect + go.uber.org/dig v1.18.0 // indirect + go.uber.org/fx v1.22.2 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.23.0 // indirect - golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/mod v0.17.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/oauth2 v0.20.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/term v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.21.0 // indirect - gonum.org/v1/gonum v0.15.0 // indirect - google.golang.org/api v0.169.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/exp v0.0.0-20241210194714-1829a127f884 // indirect + golang.org/x/mod v0.22.0 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/oauth2 v0.24.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect + golang.org/x/time v0.6.0 // indirect + golang.org/x/tools v0.28.0 // indirect + gonum.org/v1/gonum v0.15.1 // indirect + google.golang.org/api v0.188.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/grpc v1.68.1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.29.3 // indirect - k8s.io/klog/v2 v2.120.1 // indirect - k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect - k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + k8s.io/api v0.31.3 // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect + k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig => ../../internal/k8sconfig @@ -397,9 +456,6 @@ exclude github.com/DataDog/agent-payload/v5 v5.0.59 // openshift removed all tags from their repo, use the pseudoversion from the release-3.9 branch HEAD replace github.com/openshift/api v3.9.0+incompatible => github.com/openshift/api v0.0.0-20180801171038-322a19404e37 -// It appears that the v0.2.0 tag was modified. Replacing with v0.2.1 -replace github.com/outcaste-io/ristretto v0.2.0 => github.com/outcaste-io/ristretto v0.2.1 - replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest => ../../pkg/pdatatest replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8stest => ../../internal/k8stest @@ -429,3 +485,9 @@ replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/stor replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor => ../../processor/transformprocessor replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling => ../../pkg/sampling + +replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil => ../../internal/pdatautil + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata => ../../pkg/experimentalmetricmetadata + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/datadog => ../../pkg/datadog diff --git a/exporter/datadogexporter/go.sum b/exporter/datadogexporter/go.sum index c2fef52874a9..0c22a13634d0 100644 --- a/exporter/datadogexporter/go.sum +++ b/exporter/datadogexporter/go.sum @@ -3,7 +3,6 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= @@ -14,17 +13,18 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go/auth v0.7.0 h1:kf/x9B3WTbBUHkC+1VS8wwwli9TzhSt0vSTVBmMR8Ts= +cloud.google.com/go/auth v0.7.0/go.mod h1:D+WqdrpcjmiCgWrXmLLxOVq1GACoE36chW6KXoEvuIw= +cloud.google.com/go/auth/oauth2adapt v0.2.2 h1:+TTV8aXpjeChS9M+aTtN/TjdQnzJvmzKFt//oWu7HX4= +cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= -cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo= +cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= @@ -36,18 +36,17 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.10.0 h1:n1DH8TPV4qqPTje2RcUBYwtrTWlabVp4n46+74X2pn4= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.10.0/go.mod h1:HDcZnuGbiyppErN6lB+idp4CKhjbc8gwjto6OPpyggM= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1 h1:sO0/P7g68FrryJzljemN+6GTssUXdANk6aJ7T1ZxnsQ= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1/go.mod h1:h8hyGFDsU5HMivxiS2iYFZsgDbU9OnnJ163x5UGVKYo= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 h1:LqbJ/WzJUwBf8UiaSzgX7aMclParm9/5Vgp+TY51uBQ= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2/go.mod h1:yInRyqWXAuaPrgI7p70+lDDgh3mlBohis29jGMISnmc= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.5.0 h1:MxA59PGoCFb+vCwRQi3PhQEwHj4+r2dhuv9HG+vM7iM= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.5.0/go.mod h1:uYt4CfhkJA9o0FN7jfE5minm/i4nUE4MjGUJkzB6Zs8= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0 h1:GJHeeA2N7xrG3q30L2UXDyuWRzDM900/65j70wcM4Ww= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0/go.mod h1:l38EPgmsp71HHLq9j7De57JcKOWPyhrsW1Awm1JS6K0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0 h1:LkHbJbgF3YyvC53aqYGR+wWQDn2Rdp9AQdGndf9QvY4= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0/go.mod h1:QyiQdW4f4/BIfB8ZutZ2s+28RAgfa/pT+zS++ZHyM1I= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0 h1:PTFGRSlMKCQelWwxUyYVEUqseBJVemLyqWJjvMyt0do= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0/go.mod h1:LRr2FzBTQlONPPa5HREE5+RjSCTXl7BwOvYOaWTqCaI= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 h1:bXwSugBiSbgtz7rOtbfGf+woewp4f06orW9OP5BjHLA= @@ -63,170 +62,188 @@ github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSY github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 h1:DzHpqpoJVaCgOUdVHxE8QB52S6NiVdDQvGlny1qvPqA= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Code-Hex/go-generics-cache v1.3.1 h1:i8rLwyhoyhaerr7JpjtYjJZUcCbWOdiYO3fZXLiEC4g= -github.com/Code-Hex/go-generics-cache v1.3.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4= -github.com/DataDog/agent-payload/v5 v5.0.119 h1:PgeA41P3BE4z+b0j61B6yXnZDw7tB7bxl5EIHyGVG14= -github.com/DataDog/agent-payload/v5 v5.0.119/go.mod h1:FgVQKmVdqdmZTbxIptqJC/l+xEzdiXsaAOs/vGAvWzs= -github.com/DataDog/datadog-agent/cmd/agent/common/path v0.54.0-rc.5 h1:nLwtiYCoD+yb4HfhcJ3hmD9pczYLveOJexH5OHVQWsk= -github.com/DataDog/datadog-agent/cmd/agent/common/path v0.54.0-rc.5/go.mod h1:wJQkyIKR2epsYERgVRrO55fgda+oS5ZyBy2neJFXXGM= -github.com/DataDog/datadog-agent/comp/core/config v0.54.0-rc.5 h1:DKefO1N2aGtsUWRxyziQh3cHS3LuqdFjd+QmHR/qLNk= -github.com/DataDog/datadog-agent/comp/core/config v0.54.0-rc.5/go.mod h1:nDpszL8YD58OU/w2uFtN6oHv0cDDZrRNufYgBDtleVw= -github.com/DataDog/datadog-agent/comp/core/flare/types v0.54.0-rc.5 h1:GTYjjIV8YupcNqcNgcAnrNkbofcb6w7JFVdtfv9On9Q= -github.com/DataDog/datadog-agent/comp/core/flare/types v0.54.0-rc.5/go.mod h1:aChd0OV9bB534m+H4IPglCAs441s/1R+Tau5USeSM+Q= -github.com/DataDog/datadog-agent/comp/core/hostname/hostnameinterface v0.54.0-rc.5 h1:yz7efcj2vC0N0bcRwVItXXsFUl4JFgEzsqe3lDhdu7s= -github.com/DataDog/datadog-agent/comp/core/hostname/hostnameinterface v0.54.0-rc.5/go.mod h1:GhQb1d4Z4Z/E/WnUpmtSKADJSwziEIz0jwU0/MvNTic= -github.com/DataDog/datadog-agent/comp/core/log v0.54.0-rc.5 h1:2tvd3K+Bat8hT2jJBpIAfH/8J9k7v+s+IQcoyVVQitU= -github.com/DataDog/datadog-agent/comp/core/log v0.54.0-rc.5/go.mod h1:mtMxZiwg13b4bHgDf8xE6FHgTcadzI5Cc0lx2MSY1mE= -github.com/DataDog/datadog-agent/comp/core/secrets v0.54.0-rc.5 h1:hhkI7EtQwvhrKXO+oNo7V2ZhlSJ2Pt3uj9rOUeVrlSs= -github.com/DataDog/datadog-agent/comp/core/secrets v0.54.0-rc.5/go.mod h1:Bx0rH0jqLkDzQCBeDsgKGmcehYoQjuO6fE8aGjiQe2A= -github.com/DataDog/datadog-agent/comp/core/telemetry v0.54.0-rc.5 h1:v8WyP8srS/5EfD7OKZCm1aRPT56AXaQ2QqQRO2+fwUM= -github.com/DataDog/datadog-agent/comp/core/telemetry v0.54.0-rc.5/go.mod h1:ZpND0xZO2YVm7FNbPOrVoRMbPFhVRbZC40Vb5xsgyQc= -github.com/DataDog/datadog-agent/comp/def v0.54.0-rc.5 h1:pVYCT2SztEIcF03BdbrDgPfT7C/Pc2earv9YB4/2lU0= -github.com/DataDog/datadog-agent/comp/def v0.54.0-rc.5/go.mod h1:ts1c7j9tfa/BaoBH/gdQPt1LTeLeSh0b7IHMqm7ylDE= -github.com/DataDog/datadog-agent/comp/logs/agent/config v0.54.0-rc.5 h1:V4zdArRqhlZWT0tWj8mJE/pDRcAs4IkBC7Y5N+Gjr7U= -github.com/DataDog/datadog-agent/comp/logs/agent/config v0.54.0-rc.5/go.mod h1:88zmScug+KuG8EEuyaf3CAw5idi7XFMDTq66u6UPW4A= -github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline v0.54.0-rc.5 h1:FAZQ6viOK9CiU8x7aW2PJMlI4nq3bmNnOT642ASUxxc= -github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline v0.54.0-rc.5/go.mod h1:c+WZvnTktqP8inoph1/wvxvfLx9rV/cKoR/zvoEpu6E= -github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline/logsagentpipelineimpl v0.54.0-rc.5 h1:dtJiztozoBiltjE0382hAMtDeEfRnEov186xGZ4TGB0= -github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline/logsagentpipelineimpl v0.54.0-rc.5/go.mod h1:yMYGvbt3AAXiXoadUxEbxWl6C3/Ub2t8dn2UG7Y54SM= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/exporter/logsagentexporter v0.54.0-rc.5 h1:5HcA9XYLdI0Z81o5p7SppdVCYjKoshv9GBrqZfeLvC4= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/exporter/logsagentexporter v0.54.0-rc.5/go.mod h1:R2jDIkQpwYzy4AturN73oJB2X32jtivHW9TvdeN7BAQ= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/metricsclient v0.0.0-20240525065430-d0b647bcb646 h1:KeIeWDAjzQxL6/ruBQmFlT/FRstEz11z/UT3LH+8sAA= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/metricsclient v0.0.0-20240525065430-d0b647bcb646/go.mod h1:TIf/0Kb3DAYAtYbhhxmZ72etu+IKSqy66mcIGBuioik= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/statsprocessor v0.0.0-20240525065430-d0b647bcb646 h1:dyGnQr1QVLhwLdKzCTMsDsnYYUOkOXU4JWT2HuS1LJ4= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/statsprocessor v0.0.0-20240525065430-d0b647bcb646/go.mod h1:m7gt1CfJ/8FgnidFPk2lENaxO9m0mOnWWJQylgJkMzw= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.54.0-rc.5 h1:GuGbndVAnhNa6JOtDsDEWXmZFJB0fp4iCnJ3OO1JSks= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.54.0-rc.5/go.mod h1:6ydg+CWz9UlcBkV4pptOdQXTLNc/8YkTqta6VJFGg1M= -github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.54.0-rc.5 h1:YEvetFgYjf3oZsliKn0ddrz1t4ZvOzzlvOxJ100szlI= -github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.54.0-rc.5/go.mod h1:Mpe5lBwTlmLsu1WwIx8uRbj+Bi8+9gW8rWDfXPRwQVQ= -github.com/DataDog/datadog-agent/pkg/config/env v0.54.0-rc.5 h1:D4e5j805YtqmdhSeCXax020Nht6arNUvuvX4AKDMfu8= -github.com/DataDog/datadog-agent/pkg/config/env v0.54.0-rc.5/go.mod h1:9FPuluS8k4LEpfvlz7KQ6iHmqyTVfvuKxhwZkEUeoI4= -github.com/DataDog/datadog-agent/pkg/config/logs v0.54.0-rc.5 h1:xJ6u0OftjMYixmaDlb5yba3T72kyo/rpI7iuOYiAgJE= -github.com/DataDog/datadog-agent/pkg/config/logs v0.54.0-rc.5/go.mod h1:uo77w0taiJfXk3RV4N71t3WmoHhu6wJ782YmGeV6Ynk= -github.com/DataDog/datadog-agent/pkg/config/model v0.54.0-rc.5 h1:6HhxZQzS2edPF9ZevjWtstu6y17lj4a4fsRiTJ3ObHI= -github.com/DataDog/datadog-agent/pkg/config/model v0.54.0-rc.5/go.mod h1:X6U3mq0dErErZUIQx3GMmrO0jdp7aGN656iSDUW8sfw= -github.com/DataDog/datadog-agent/pkg/config/setup v0.54.0-rc.5 h1:+kl+DEK320zyWZBoFzTofgwN0AzUKpJByf8KdJ7WpJQ= -github.com/DataDog/datadog-agent/pkg/config/setup v0.54.0-rc.5/go.mod h1:2qnUs+85QVGqdK4DOpEaox6MKbfKFo3v2MXl9W8zP9Y= -github.com/DataDog/datadog-agent/pkg/config/utils v0.54.0-rc.5 h1:FQmC8qbWoaH4GFzuSuGFtJCR3kleh6xBmQXISiE8/Ho= -github.com/DataDog/datadog-agent/pkg/config/utils v0.54.0-rc.5/go.mod h1:pWPWng1HBqWccXoYJXfmWgpr+pujCpe4XYtGbiH4IOU= -github.com/DataDog/datadog-agent/pkg/logs/auditor v0.54.0-rc.5 h1:dQIi1vw2MaBmrT0kQv0qE5csFecCzaoPGY8m8KTEiqA= -github.com/DataDog/datadog-agent/pkg/logs/auditor v0.54.0-rc.5/go.mod h1:7w1fYTvDKwfk2J08P3vKEieeULSFASfZ0IgCjEoIF2E= -github.com/DataDog/datadog-agent/pkg/logs/client v0.54.0-rc.5 h1:YMYTquLk0uzYxvyRR1ew1QBf5dMtz3b/uBuwQzVODs4= -github.com/DataDog/datadog-agent/pkg/logs/client v0.54.0-rc.5/go.mod h1:YZbEwh9sPrDqxj02BHUHN6ljR+wohaN5QkkTdNZBLxY= -github.com/DataDog/datadog-agent/pkg/logs/diagnostic v0.54.0-rc.5 h1:klt8iysuxBuycyDu6lE51oCcAzZLJpvA7HiAKyQv9GM= -github.com/DataDog/datadog-agent/pkg/logs/diagnostic v0.54.0-rc.5/go.mod h1:93tXt/40ar1666Kk83CDOsb35xhAhQiPSqEH24zZ164= -github.com/DataDog/datadog-agent/pkg/logs/message v0.54.0-rc.5 h1:tX7zHQ6bmLJTfcRTcGY+91VXCZPEY2/OxKlVg/P4Tec= -github.com/DataDog/datadog-agent/pkg/logs/message v0.54.0-rc.5/go.mod h1:SGUmU3Fz/AtmdJvfos5EokpT4CN9YVi50DbYYZX0q4w= -github.com/DataDog/datadog-agent/pkg/logs/metrics v0.54.0-rc.5 h1:tzzzy68wHmQLIrpbJbmo9ZYqm8pHTlWvjUYnQUMBsUU= -github.com/DataDog/datadog-agent/pkg/logs/metrics v0.54.0-rc.5/go.mod h1:vcMlIQfRoHkafZFAHtHrkmeCSQzGpXtE2iyLkaObnUk= -github.com/DataDog/datadog-agent/pkg/logs/pipeline v0.54.0-rc.5 h1:yJ3W4/CQwlEifXz1FDCehvoVvGwaH4LXuJ6A/TbRMdc= -github.com/DataDog/datadog-agent/pkg/logs/pipeline v0.54.0-rc.5/go.mod h1:WsysKMxzTLQHn75WAUwHHw/SyhGQr+m8fYE3iMYl2gA= -github.com/DataDog/datadog-agent/pkg/logs/processor v0.54.0-rc.5 h1:RqKUVfSHrw5D8nRMIhOaAKQThk7pHRbyDVo2CylYtAY= -github.com/DataDog/datadog-agent/pkg/logs/processor v0.54.0-rc.5/go.mod h1:LwAwQKHHSsOC0sspi58vpN2h4tFEI1ZNtU69OUVFBxc= -github.com/DataDog/datadog-agent/pkg/logs/sds v0.54.0-rc.5 h1:u8dgzzSluJx7WMk3J834CxCP7FCo+z0PU9d1vj7K1HU= -github.com/DataDog/datadog-agent/pkg/logs/sds v0.54.0-rc.5/go.mod h1:+octueIX19RzWrarAkKNIAtFTfETavn6Ku4s217EcSY= -github.com/DataDog/datadog-agent/pkg/logs/sender v0.54.0-rc.5 h1:n5UMZvF+5L3XekeS5bkR0adwcOsogIT9uEtq2vHMhtU= -github.com/DataDog/datadog-agent/pkg/logs/sender v0.54.0-rc.5/go.mod h1:dj51DKlSkf10tqsdfuE4NMZaD2PSzau3G8Le8UmXerA= -github.com/DataDog/datadog-agent/pkg/logs/sources v0.54.0-rc.5 h1:wpvvYERlZsBmdoVMIYFxd2XlvSjBh5en06WkKgWRYk4= -github.com/DataDog/datadog-agent/pkg/logs/sources v0.54.0-rc.5/go.mod h1:bBzxEwKqZRKlkizVUViWjGNkjjF58njl+YiZNLxD/ZI= -github.com/DataDog/datadog-agent/pkg/logs/status/statusinterface v0.54.0-rc.5 h1:KuPBZTbwVJqDMa9ATfg0YWpGl3CxgGJcJZzSmsGVNdI= -github.com/DataDog/datadog-agent/pkg/logs/status/statusinterface v0.54.0-rc.5/go.mod h1:xsyGZLKEr6dZaJlC9QWuyYVXqMnHRwZzn641O3bfB98= -github.com/DataDog/datadog-agent/pkg/logs/status/utils v0.54.0-rc.5 h1:GAai92l2sX1rOQqGzPzE0IGMzS442xTLrHF/EwTywnw= -github.com/DataDog/datadog-agent/pkg/logs/status/utils v0.54.0-rc.5/go.mod h1:TsFFZ6y2/brcnkXLZhfp0k2xrewdyqhXnjxVpkOWIvE= -github.com/DataDog/datadog-agent/pkg/logs/util/testutils v0.54.0-rc.5 h1:9mAiLISlZcol07wCndWd5ErjItibOClx+N2Oyo3lG+A= -github.com/DataDog/datadog-agent/pkg/logs/util/testutils v0.54.0-rc.5/go.mod h1:J5lpbKKJzxPE2i5dsBYJnxbHlFvzPkfxNlhh2p3s18s= -github.com/DataDog/datadog-agent/pkg/obfuscate v0.54.0-rc.5 h1:qZg/3r8lLIgwzpHkqNBdnDKCdHexSxjgkb6FbPBaMnY= -github.com/DataDog/datadog-agent/pkg/obfuscate v0.54.0-rc.5/go.mod h1:4/9D8y6pQo5a/Tg8GAQN8SaRIRWxxyl5QHzPRuu8D0k= -github.com/DataDog/datadog-agent/pkg/proto v0.54.0-rc.5 h1:0HdqgTFchLs6ElI9cVrfjsT/gOF8A7PiY/VI2JMDFJc= -github.com/DataDog/datadog-agent/pkg/proto v0.54.0-rc.5/go.mod h1:gHkSUTn6H6UEZQHY3XWBIGNjfI3Tdi0IxlrxIFBWDwU= -github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.54.0-rc.5 h1:wM6w1HtUOxrn/sgMW00jx+0p4rNzPv+NhPqmIpboyV0= -github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.54.0-rc.5/go.mod h1:3yFk56PJ57yS1GqI9HAsS4PSlAeGCC9RQA7jxKzYj6g= -github.com/DataDog/datadog-agent/pkg/status/health v0.54.0-rc.5 h1:WgoyD4RkoGI3JDy+79SyiPc0AJGyCO5c2toOfxWwW1E= -github.com/DataDog/datadog-agent/pkg/status/health v0.54.0-rc.5/go.mod h1:sNLVlyEtkYal/+kTj+mTp239DdwVuYBYOnpS90RKk5E= -github.com/DataDog/datadog-agent/pkg/telemetry v0.54.0-rc.5 h1:iXZEgoYil4VaadjDsK+GbCkY7rBQyjsnlNJwXr6BwCY= -github.com/DataDog/datadog-agent/pkg/telemetry v0.54.0-rc.5/go.mod h1:4GCwM87F7u9HzugAODVTwS05MFMKC+NoJu6E4Zd/8pY= -github.com/DataDog/datadog-agent/pkg/trace v0.54.0-rc.5 h1:il5yFFe5CubI+bSfHolKr0077dQw0R+U5B9/iwW8aBg= -github.com/DataDog/datadog-agent/pkg/trace v0.54.0-rc.5/go.mod h1:63uSQX6TVeJzl1cFbIp8MkXlF4kUMJs8iUfGhrSgUHY= -github.com/DataDog/datadog-agent/pkg/util/backoff v0.54.0-rc.5 h1:eq+OaYTZ0rzQt1SpC2Tl+szJjUTX2nOC4N0glSzuWQ0= -github.com/DataDog/datadog-agent/pkg/util/backoff v0.54.0-rc.5/go.mod h1:HcSwqoxWLfevi1vuDZuFeRHfSuHGakTN6/u42WbxQHE= -github.com/DataDog/datadog-agent/pkg/util/cgroups v0.54.0-rc.5 h1:z5NnMMxKxO+cExUt0QCCSF7E+wX8LdD3nuL9LlDpR3Y= -github.com/DataDog/datadog-agent/pkg/util/cgroups v0.54.0-rc.5/go.mod h1:40rjMMqmvglVjktjWVUIk3o5W2zAtek0JU4FCsf7bsM= -github.com/DataDog/datadog-agent/pkg/util/executable v0.54.0-rc.5 h1:kxGwRdBPbiEx9mplVMA/rdLKMWcaKJMqO1pIyg56sLk= -github.com/DataDog/datadog-agent/pkg/util/executable v0.54.0-rc.5/go.mod h1:hUJvBzOKfasYzSvlar10ZkrB8I1CR8PhtyGxmlMv/cU= -github.com/DataDog/datadog-agent/pkg/util/filesystem v0.54.0-rc.5 h1:2A1/eg6zwNlUOjdAgaSgXR8eFR0HYLyqpvqLjlxKEP4= -github.com/DataDog/datadog-agent/pkg/util/filesystem v0.54.0-rc.5/go.mod h1:DfBDL+EjOiLI+HYR2N5zw1an1q7oCJQT6lY4oTCZxZ4= -github.com/DataDog/datadog-agent/pkg/util/fxutil v0.54.0-rc.5 h1:Fv7vJj/7qoEIV+ppI257ncx8IVQkDrUyjKSyeE56oTs= -github.com/DataDog/datadog-agent/pkg/util/fxutil v0.54.0-rc.5/go.mod h1:xqWrlGtjVu2ZMoCW9e3R7f13/Qg0IQBzO5AX7J1dC9I= -github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.54.0-rc.5 h1:1buVvWK8DXUveIpZMDc7Rn59mCDWZkQ9OGHjQRKdcas= -github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.54.0-rc.5/go.mod h1:FqMWIncd1TJJdlUYyiQQGJHWe+ZDKAjJSSPlrUBvHHk= -github.com/DataDog/datadog-agent/pkg/util/http v0.54.0-rc.5 h1:81sBly4SXW5Bvt3DHiUuuLpQnEUjhgdVDK69bk0g+58= -github.com/DataDog/datadog-agent/pkg/util/http v0.54.0-rc.5/go.mod h1:hZRz30Xaqm+UiR/KjO6gAo1Qa7v+tsxVqqaWgUkBjxE= -github.com/DataDog/datadog-agent/pkg/util/log v0.54.0-rc.5 h1:BcA7+MK04/HRCFlX5Pn/sQzZu/gF4qA3DOF880Jy/oo= -github.com/DataDog/datadog-agent/pkg/util/log v0.54.0-rc.5/go.mod h1:MFVWM0DMaxEXhCnHLWnh6axtwubmKRn7C+w2xiL+atI= -github.com/DataDog/datadog-agent/pkg/util/optional v0.54.0-rc.5 h1:3+7PwCbvtkOf63fPOzzMGVxNzlaZofPAg6ExPKn72hc= -github.com/DataDog/datadog-agent/pkg/util/optional v0.54.0-rc.5/go.mod h1:wa1JIWnzo9EvOBwzDOeff8HeqgOq9JQANRb99/nKg3A= -github.com/DataDog/datadog-agent/pkg/util/pointer v0.54.0-rc.5 h1:3zfbAoA9HSCJ/RsR/kP2MzntIvoI4szoReu4j3gpJrY= -github.com/DataDog/datadog-agent/pkg/util/pointer v0.54.0-rc.5/go.mod h1:ahpEhdpkifOLy0/XLHas+SseEmMQnwMgV1CMVkSuXL0= -github.com/DataDog/datadog-agent/pkg/util/scrubber v0.54.0-rc.5 h1:Sob3M0CylnKxZ9FX8Ewjka5VRFYZUQLN2J0kyOGYnMM= -github.com/DataDog/datadog-agent/pkg/util/scrubber v0.54.0-rc.5/go.mod h1:8ASCNWHQtcmUedxL+WjbCPSIcGIM8LeVzil7JCzx0js= -github.com/DataDog/datadog-agent/pkg/util/startstop v0.54.0-rc.5 h1:wo+LiNCZ9RQNNuYzCavbgjARHO3OmcqpFw4Mo6J5R+s= -github.com/DataDog/datadog-agent/pkg/util/startstop v0.54.0-rc.5/go.mod h1:F9ysDtw4BnbZIuKdwOdiHranjG9QMv2o7PMVreIhFzI= -github.com/DataDog/datadog-agent/pkg/util/statstracker v0.54.0-rc.5 h1:hU+Zvh4IL/HOEAjDzyIhYMQa4ibbX+dM4p5wWWpZ34U= -github.com/DataDog/datadog-agent/pkg/util/statstracker v0.54.0-rc.5/go.mod h1:KkiJi2f4mcxAJA00ArYw4zTfs0oWMU1bNXqKhymRVZg= -github.com/DataDog/datadog-agent/pkg/util/system v0.54.0-rc.5 h1:b7GZ1xAbkCtw5/hHwkRJoRiheAd9e+T2slJlD34lXbE= -github.com/DataDog/datadog-agent/pkg/util/system v0.54.0-rc.5/go.mod h1:gIg9d09X6uFqDFo7Dd48OCOCAtTLTWIE44+f/e35C3c= -github.com/DataDog/datadog-agent/pkg/util/system/socket v0.54.0-rc.5 h1:alEMYfYHYju+poG90phbdrpg4RYEyK/oFLAi8MM++HU= -github.com/DataDog/datadog-agent/pkg/util/system/socket v0.54.0-rc.5/go.mod h1:RKqan/bns7z9tqZBWSkshY1e6VisZJaU0b/XQcIDyAQ= -github.com/DataDog/datadog-agent/pkg/util/testutil v0.54.0-rc.5 h1:+nmZ4SFAHoskytj/q8+ewx7UtvbKGdDzcbPU0rhxIzU= -github.com/DataDog/datadog-agent/pkg/util/testutil v0.54.0-rc.5/go.mod h1:AyiUcueiQeqBXn60wbVOo3dPYRDNg0Gsfh/GkhatyxE= -github.com/DataDog/datadog-agent/pkg/util/winutil v0.54.0-rc.5 h1:0eWM/VJT1YPFf+nE5u0QdX1CiCiH2LWuvr4cCJ+nC3M= -github.com/DataDog/datadog-agent/pkg/util/winutil v0.54.0-rc.5/go.mod h1:m/wWejBoF6cuPzogMq2sgm86vvsnR1bAkw+Fgxq4vns= -github.com/DataDog/datadog-agent/pkg/version v0.54.0-rc.5 h1:aQEEvgBxk6Vk6ePMldw3fQUYTrl0AaYfUbrT1Ko6bjE= -github.com/DataDog/datadog-agent/pkg/version v0.54.0-rc.5/go.mod h1:EHeMJExE74SMdRoRCEuLOxbRgjfQwCVngMqFBiz1VN8= -github.com/DataDog/datadog-api-client-go/v2 v2.26.0 h1:bZr0hu+hx8L91+yU5EGw8wK3FlCVEIashpx+cylWsf0= -github.com/DataDog/datadog-api-client-go/v2 v2.26.0/go.mod h1:QKOu6vscsh87fMY1lHfLEmNSunyXImj8BUaUWJXOehc= +github.com/Code-Hex/go-generics-cache v1.5.1 h1:6vhZGc5M7Y/YD8cIUcY8kcuQLB4cHR7U+0KMqAA0KcU= +github.com/Code-Hex/go-generics-cache v1.5.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4= +github.com/DataDog/agent-payload/v5 v5.0.137 h1:nV02RrYj6AwlQBGIEv6yG23CuxGtG0YWoFZAVE6vwxY= +github.com/DataDog/agent-payload/v5 v5.0.137/go.mod h1:lxh9lb5xYrBXjblpIWYUi4deJqVbkIfkjwesi5nskDc= +github.com/DataDog/datadog-agent/cmd/agent/common/path v0.59.0 h1:PolEv4Se/H2jBCKdiOPNELEG5OuXWKrqpsxZMUQ4g14= +github.com/DataDog/datadog-agent/cmd/agent/common/path v0.59.0/go.mod h1:ve34W4f7PGC5zbot0HB+W3xkNZN7obINz89o8N/biP8= +github.com/DataDog/datadog-agent/comp/api/api/def v0.59.0 h1:zfXuUtnet+GWssR+Zi4lns5iIqlYQWiKXtKWb+6dJ+g= +github.com/DataDog/datadog-agent/comp/api/api/def v0.59.0/go.mod h1:gsXkdySqo/hjJmw/b4W9VYiGcRTJaq0uOVwMFAukl4U= +github.com/DataDog/datadog-agent/comp/core/config v0.59.0 h1:SxZsc9E6+d+Gb5fCfo/HnvRi8qTrTcLFE0//lX9+pM8= +github.com/DataDog/datadog-agent/comp/core/config v0.59.0/go.mod h1:2vRyHTEIHey2fsN9JO8z8bj7SSpC5VewuZsHJAA9k6I= +github.com/DataDog/datadog-agent/comp/core/flare/builder v0.59.0 h1:qpvXvXK+Az2dKgzx3pPaAvS/tsrl1QXI4FndDtcjgvY= +github.com/DataDog/datadog-agent/comp/core/flare/builder v0.59.0/go.mod h1:cg7JgU501CDIZNiyEfnwbBbk9nOsUy2nsKADIAdRnmk= +github.com/DataDog/datadog-agent/comp/core/flare/types v0.59.0 h1:Kz5NUsZFT4pTUh4P/A2bBiBTNkfT80ZfHig8LOuHBiY= +github.com/DataDog/datadog-agent/comp/core/flare/types v0.59.0/go.mod h1:n32X+eH1UMvlfZOwu70t6ySopwbN1yBfaVcpNgaCkG4= +github.com/DataDog/datadog-agent/comp/core/hostname/hostnameinterface v0.59.0 h1:m939bF+E/+nPZ1jGU1J9ZVeI3fCk8nbAjl9H9MMz2A0= +github.com/DataDog/datadog-agent/comp/core/hostname/hostnameinterface v0.59.0/go.mod h1:jjiRtHmQcGwHmP4l4T49t4i2fU2NM097LEG6VaI8CIk= +github.com/DataDog/datadog-agent/comp/core/log v0.56.2 h1:qvBT+FfjKGqimyEvmsNHCZKbTfBJAdUZSVy2IZQ8HS4= +github.com/DataDog/datadog-agent/comp/core/log v0.56.2/go.mod h1:ivJ/RMZjTNkoPPNDX+v/nnBwABLCiMv1vQA5tk/HCR4= +github.com/DataDog/datadog-agent/comp/core/log/def v0.59.0 h1:4je3YuTFhqmw0a0oksSsVPglNT4b37gosaRv9T/TLYQ= +github.com/DataDog/datadog-agent/comp/core/log/def v0.59.0/go.mod h1:uFF83DUAQYoQKKdddr6ptnCPiRik/lr9y+B2JxgLWRs= +github.com/DataDog/datadog-agent/comp/core/log/mock v0.59.0 h1:ndq+1XRChjuYIgfLuRuGQ5trGtq/Qpa/vnTG/6r9bKs= +github.com/DataDog/datadog-agent/comp/core/log/mock v0.59.0/go.mod h1:Ii6q5lgyvXKRmt8Puaan94V5iOiX4xOd+1OU7ZX8Lo4= +github.com/DataDog/datadog-agent/comp/core/secrets v0.59.0 h1:RS7z5/VuZtPc2NLdFRerDubYtZgWbgf1dOZpdhclgb8= +github.com/DataDog/datadog-agent/comp/core/secrets v0.59.0/go.mod h1:hKbelRO2zUJbU4KI1NumVvBIYq45RtQ3JC2LJvJU/y8= +github.com/DataDog/datadog-agent/comp/core/telemetry v0.59.0 h1:ApJD+u0a5anQZkmCw3y2ljhMC56BcjlT6klAZaoXLYk= +github.com/DataDog/datadog-agent/comp/core/telemetry v0.59.0/go.mod h1:mNPruKhnFUe7xiFMnPIMweb7O1HkTh0C78Llhd+Y9xA= +github.com/DataDog/datadog-agent/comp/def v0.59.0 h1:AO1oQ4/ZqYtzklm7glhYqQLyr4me4qg34sf4HRzyMcQ= +github.com/DataDog/datadog-agent/comp/def v0.59.0/go.mod h1:2xorAm6FmIl275/ayDZSUg53Hz4oQ/X8ELyp7I1N3fM= +github.com/DataDog/datadog-agent/comp/logs/agent/config v0.59.0 h1:olhlCNtCG5BKHsRJrwR4i7XZkeMbTRKz4OFayLrvD6o= +github.com/DataDog/datadog-agent/comp/logs/agent/config v0.59.0/go.mod h1:QrNGc1TWXhNagr1/nVSiUI+n8SFczoS8vpZdKtASxnQ= +github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline v0.59.0 h1:kM1pYOA1EmlT47b8Buxvlm6EVykG9T72gUuQL+Uur8s= +github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline v0.59.0/go.mod h1:2SrdlZ37IBATRjnPhNs4qBqaZCZ7HkEb4DNWXn/DsXY= +github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline/logsagentpipelineimpl v0.59.0 h1:SJhZCcJDZEEHzR2p9dGQ56jIy08ZfqajiBIBgLShtzU= +github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline/logsagentpipelineimpl v0.59.0/go.mod h1:uyfsYUV6L7W4duN9rlFrEN+r3REPPwCSE4Nj8WjDhDE= +github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/exporter/logsagentexporter v0.62.0-devel.0.20241213165407-f95df913d2b7 h1:SsisBoKdz1hfQQpfOa1XuVMksKRHOgZ84LRuadAS2LU= +github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/exporter/logsagentexporter v0.62.0-devel.0.20241213165407-f95df913d2b7/go.mod h1:Zt7cD4W15XoFigBKDbLeOjho0IyP2Qo8c41QWy/kgRM= +github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/metricsclient v0.59.0 h1:LyhDLcabmvRZk2ehGlZYXuW2MpA7RoR87C6jQ7gUQ24= +github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/metricsclient v0.59.0/go.mod h1:tG+1FklWteENGZb3gE/13Sn80YfMEI6APmZxY8nSQHo= +github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/statsprocessor v0.59.0 h1:3eTrUZGpI5EjzIINZhilZXRUd6ND7W98bUUe4UF+arE= +github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/statsprocessor v0.59.0/go.mod h1:Dp1J09BVqtGHR3yj82q4mCVNq5qkhDs/cTI5/DlvJxk= +github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.57.0-devel.0.20240718200853-81bf3b2e412d h1:wdjJ+/tBYiFLwno+lBPP66rm5jIf6ycGPRr21ogBBzE= +github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.57.0-devel.0.20240718200853-81bf3b2e412d/go.mod h1:CHa8CY2k0/wZkx/4KPi/WU/0m5YCfWZI1SAs1imElMA= +github.com/DataDog/datadog-agent/comp/trace/compression/def v0.59.0 h1:u/IbNqKfYodJIprc/rkpcwLz/5OFox95ujemwR9AHuo= +github.com/DataDog/datadog-agent/comp/trace/compression/def v0.59.0/go.mod h1:samFXdP0HVSwD223LPLzcPKUjRQ6/uwr/1wMPo2HhRg= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-gzip v0.59.0 h1:Z/fqQiBYwTTt27IIBdX6oivtIxfqm0o0gNqA1zoATm4= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-gzip v0.59.0/go.mod h1:x1xzklye6fB16nIh4HrvbOYN/WP4OJNJpvZylelI3tI= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-zstd v0.59.0 h1:m9wM1fLNndxJWVXwZegwQ2wAp6CK0uFqF/sh/5Rw1PY= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-zstd v0.59.0/go.mod h1:t1BtP+u27pjTeOX/5otD7klkUIHB0Mh4ToeeeHs+oRY= +github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.59.0 h1:Etckua/+tAA9nA6Ssbgx+sKDIdgiobVFuhRvQWDAGHQ= +github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.59.0/go.mod h1:s9QBNtoBURzy/0FeBInQ7kawNj04OnBNUo8xYr26z3E= +github.com/DataDog/datadog-agent/pkg/config/env v0.59.0 h1:8oHEWArrc7dYJunz5ZtLzSVsGkW4JUk+v/QLgcUuvRI= +github.com/DataDog/datadog-agent/pkg/config/env v0.59.0/go.mod h1:8DoSDz72MFB3o09Tn90OUnUiQ60kDvObWh9xmaG+4cI= +github.com/DataDog/datadog-agent/pkg/config/mock v0.59.0 h1:bg/anB+tp85oaFKvdMrbaYO0idWbErtm8i4rp4dra5k= +github.com/DataDog/datadog-agent/pkg/config/mock v0.59.0/go.mod h1:xVhwIc1BVvXN7UUM+604EOyoSRIF9B84Vn6Xn5n3GXE= +github.com/DataDog/datadog-agent/pkg/config/model v0.59.0 h1:8x6VWgK/mrG++vU1QkbfVI3YBWy2AyQHgOVyFYwX4lE= +github.com/DataDog/datadog-agent/pkg/config/model v0.59.0/go.mod h1:+IfFsWw9OM26lwDmTfy6RVF5LhEmFC8LgO4OGajyuvk= +github.com/DataDog/datadog-agent/pkg/config/nodetreemodel v0.59.0 h1:8MTR7i4xNFoVp0gyzHghn2s7AZcuu25GJDQvTGwtGC8= +github.com/DataDog/datadog-agent/pkg/config/nodetreemodel v0.59.0/go.mod h1:aYSdawfzI8vX0YlS19KKxpLR8oG1Rqp2rH+wFPv4MFs= +github.com/DataDog/datadog-agent/pkg/config/setup v0.59.0 h1:6cNxX6N7HIZqGVSKD4Fzh30Ldky8ckaQnd7B4bXzErg= +github.com/DataDog/datadog-agent/pkg/config/setup v0.59.0/go.mod h1:JEO3nqqPJn1lh8tSabgRqXHOth2l++ZYEfzRRYGUji0= +github.com/DataDog/datadog-agent/pkg/config/structure v0.59.0 h1:U7+yV+Ul/Cmvt7HKuf6TXkwq9/RhaaWNOX+xReUgqwQ= +github.com/DataDog/datadog-agent/pkg/config/structure v0.59.0/go.mod h1:rdbxYVSC1Xjh8RODr06j8Mbku7dXnRr3SWxi5wsl9pA= +github.com/DataDog/datadog-agent/pkg/config/teeconfig v0.59.0 h1:8iCSoIKcNqiX/QEmWbjRcH5za/Aj06QtIfT8JNJZXDU= +github.com/DataDog/datadog-agent/pkg/config/teeconfig v0.59.0/go.mod h1:oi5YMuCZKA98ACJz5cx/lXM+pZ4HAUgc5bSP73M4G3w= +github.com/DataDog/datadog-agent/pkg/config/utils v0.59.0 h1:ZA4WUpcb23Ts/BQ2fEDodGd45QtQFuJ0xSrvxME8JBQ= +github.com/DataDog/datadog-agent/pkg/config/utils v0.59.0/go.mod h1:n8JbD8n9omhs/MWZij6yA6RgHAOYx54BXMTRR2v+32A= +github.com/DataDog/datadog-agent/pkg/logs/auditor v0.59.0 h1:5PDZmH8KW0PYSfywoNlHkjoTNSYefq4N6X55CBqiCeU= +github.com/DataDog/datadog-agent/pkg/logs/auditor v0.59.0/go.mod h1:mcWSkLVkuJmhqr4GkwHbhuELNxn46VNg487xL33LAQQ= +github.com/DataDog/datadog-agent/pkg/logs/client v0.59.0 h1:GC6gjPzImitUI26X9X23G4WuDyv/+KKjYHLoxmIllJ8= +github.com/DataDog/datadog-agent/pkg/logs/client v0.59.0/go.mod h1:EE6EkO4YH+hQlhQAPrcTxT3Ye72fOFwQxqyQsOFr2fk= +github.com/DataDog/datadog-agent/pkg/logs/diagnostic v0.59.0 h1:a/2kYMMKo9um9Dla5QExkvors05CFgyfrPkxClZz8L0= +github.com/DataDog/datadog-agent/pkg/logs/diagnostic v0.59.0/go.mod h1:Mc9HEEgXpsQEZKEtb7I42Yg5ShZyNXxJShdVslkhW2g= +github.com/DataDog/datadog-agent/pkg/logs/message v0.59.0 h1:hv2fiwwX53r4tdzv0YHbBDoGBLJcKrA4ErqC01XnCrY= +github.com/DataDog/datadog-agent/pkg/logs/message v0.59.0/go.mod h1:RS8UIJB31rymy8W5va8I1EFkd4hbSAbHUWPZYzfwH+M= +github.com/DataDog/datadog-agent/pkg/logs/metrics v0.59.0 h1:mQzAZGQaYlnQVyralxBs2KxYAm8Gb8IL45eimmX0Zr4= +github.com/DataDog/datadog-agent/pkg/logs/metrics v0.59.0/go.mod h1:liRnSv3VpZpv/rHGiYYBCBlkx2Sy98rw2/5hu9g1T/E= +github.com/DataDog/datadog-agent/pkg/logs/pipeline v0.59.0 h1:3i0bNOq5IwPKKYpKl2zgkwOecvfxl2/mFZ5M4q8un7U= +github.com/DataDog/datadog-agent/pkg/logs/pipeline v0.59.0/go.mod h1:xVtael5+vGMu08nvdlnqB7IhbwjTYCLHuXMjVodVFM8= +github.com/DataDog/datadog-agent/pkg/logs/processor v0.59.0 h1:F71SRQbj2bqLHAw8+R/fqMQCTiDjusD36u13/yK55Bo= +github.com/DataDog/datadog-agent/pkg/logs/processor v0.59.0/go.mod h1:XuBR8eeLrxNOI5ex2BlH67P4lmOZIs5p9Vnse/71zVY= +github.com/DataDog/datadog-agent/pkg/logs/sds v0.59.0 h1:CPxkTGZuir7z6ZnEXovdUNQE0nAHmXAtBLvFMppxHvs= +github.com/DataDog/datadog-agent/pkg/logs/sds v0.59.0/go.mod h1:MOhCsu2zQMIwT2NBQYWjXzHgNYCKZwPJu08TKlBa1IU= +github.com/DataDog/datadog-agent/pkg/logs/sender v0.59.0 h1:fd2pUQXyxV8Zvw2axC0/IzBRwaEWeOYuItvo3NnS0eY= +github.com/DataDog/datadog-agent/pkg/logs/sender v0.59.0/go.mod h1:iVtgk6B4bl7HggNx5TECj4LIj8PYmoDIf1Hn1lL61cA= +github.com/DataDog/datadog-agent/pkg/logs/sources v0.59.0 h1:odwHx0k2Hod6wrsnt/P5dI2deVCwVaMNKSSxpsOvHR8= +github.com/DataDog/datadog-agent/pkg/logs/sources v0.59.0/go.mod h1:t95T+iw+/9VP40ymxXrrLIMJ+MiFJm0vIZml3KpwuyI= +github.com/DataDog/datadog-agent/pkg/logs/status/statusinterface v0.59.0 h1:th5J71WmJpXVcY+yR5YalOzrLjoYEDn/HT+allWEInQ= +github.com/DataDog/datadog-agent/pkg/logs/status/statusinterface v0.59.0/go.mod h1:PaduNrh0GJ3UEKG30VMu0M6hi7KuYf3VviLdIG9xV9k= +github.com/DataDog/datadog-agent/pkg/logs/status/utils v0.59.0 h1:BvvXnKJjZfLUcwcTnj8gWoJAlFfTd8q5Rh39SV97VFM= +github.com/DataDog/datadog-agent/pkg/logs/status/utils v0.59.0/go.mod h1:p2NTG+cIhVGlKELJfRteGCec37ICptIpeB2x/MsRkbw= +github.com/DataDog/datadog-agent/pkg/logs/util/testutils v0.59.0 h1:Lx1CcCOi+Wgvjxzj8pEz1HtxWuZpjIkHyrBXidzU9Hw= +github.com/DataDog/datadog-agent/pkg/logs/util/testutils v0.59.0/go.mod h1:+uqKrMsDA16MMC98rqDkp7Jn8cpYLI/JPAVcno8MEmE= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.59.0 h1:uX6/XoKMS7KYXe+R+vwgw+eRdmn16xfa9PDF5dxgumE= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.59.0/go.mod h1:ATVw8kr3U1Eqz3qBz9kS6WFDKji9XyoAsHKSlj3hPTM= +github.com/DataDog/datadog-agent/pkg/proto v0.59.0 h1:hHgSABsmMpA3IatWlnYRAKlfqBACsWyqsLCEcUA8BCs= +github.com/DataDog/datadog-agent/pkg/proto v0.59.0/go.mod h1:weaq7HP9vUa7YAMcvMs7bhT7pmHk3sq7XRBQOcaSUak= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.59.0 h1:9C8TVNz0IiNoD6tuEKPY/vMIUjB7kN0OaLyImhatWjg= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.59.0/go.mod h1:c4th0IFaP0Q1ofRa0GcPB9hJWN+cmUoEfOI1Ub0O50A= +github.com/DataDog/datadog-agent/pkg/status/health v0.59.0 h1:gDeDYddUBwkzeNRxeRceIB46YvxB/2+KoCFcN4qvVag= +github.com/DataDog/datadog-agent/pkg/status/health v0.59.0/go.mod h1:EkC/SgFR03BKwBitVV4dIuP+ofwPlUCkVi5K5k1Dh2Y= +github.com/DataDog/datadog-agent/pkg/telemetry v0.59.0 h1:4WEY5NILyM/WFXwzgvgdju1rfO4cru2SXJyU1JLgFyc= +github.com/DataDog/datadog-agent/pkg/telemetry v0.59.0/go.mod h1:DmEXCX0hBizZpdpbS64o9sPj47iiUzh9F7uGUazF+ZA= +github.com/DataDog/datadog-agent/pkg/trace v0.59.0 h1:LHfmBEfidWE6R5onNLIFnX3jc4MRBwdqJ6XLQxvBAG0= +github.com/DataDog/datadog-agent/pkg/trace v0.59.0/go.mod h1:6XfyUYonzDI1qy9tZBUgMgGYJarHDxIZtfs6PNRbf/w= +github.com/DataDog/datadog-agent/pkg/util/backoff v0.59.0 h1:EaTwOrTRpMEdomryGVMfHyN0wEsKkaL3/Tw9qRt9SSY= +github.com/DataDog/datadog-agent/pkg/util/backoff v0.59.0/go.mod h1:2RMfdYkKyeh8hXs6WgaamkkEyK35Xo55C4rFG4dO1k8= +github.com/DataDog/datadog-agent/pkg/util/cgroups v0.59.0 h1:uV3oUyl0uQN8anXZXQiw+hbQ8UNNtSkrnDCDklhAjeI= +github.com/DataDog/datadog-agent/pkg/util/cgroups v0.59.0/go.mod h1:+51MjREuUnHTYSnI9zBqv2aVOF4dlhDwQiCMeZyY7Z0= +github.com/DataDog/datadog-agent/pkg/util/executable v0.59.0 h1:24sLjJ4p4Co/82weJsqkNxWZjG8zdS7yeJBGVOqjHxM= +github.com/DataDog/datadog-agent/pkg/util/executable v0.59.0/go.mod h1:mSSn2OzsdgoUnPyBmF8rEDU+ee1RFp+H6LFsJSteN9o= +github.com/DataDog/datadog-agent/pkg/util/filesystem v0.59.0 h1:VV/SYXyZirAaUxMsWUpmZYcX9AIgbGadElznJZXPCig= +github.com/DataDog/datadog-agent/pkg/util/filesystem v0.59.0/go.mod h1:1Oy0TNkovXuDB0Uu8OzszIuDezYSPg8qFCEyx02ipc4= +github.com/DataDog/datadog-agent/pkg/util/fxutil v0.59.0 h1:b4sUQuXnE+M+1ToTViNGelw8yfaXRuhOqBSczdQ8wEM= +github.com/DataDog/datadog-agent/pkg/util/fxutil v0.59.0/go.mod h1:vl91pbe6A2L9kqNEmSDrS8vlj4cADSBq3Z3YRQ1rpKY= +github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.59.0 h1:8qlROMBQixtDVQwjvttGSM8hTmN3tnFQugOyh614ACc= +github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.59.0/go.mod h1:4EPWYAplHgdaLZsP/NuLEfh21NuvF+JdVtwttTqQlUY= +github.com/DataDog/datadog-agent/pkg/util/http v0.59.0 h1:6Dshh+6K5NGV2TdHsZeeDRsBrgvQ0rJw8OhMWonMFu4= +github.com/DataDog/datadog-agent/pkg/util/http v0.59.0/go.mod h1:Cf5xtpWzHGn7rvEAM4fdw1OUABXLbA/Bqf3dCt/0qtM= +github.com/DataDog/datadog-agent/pkg/util/log v0.59.1 h1:3Zc0tI5XAKMGqdSbseneXGOVtzp017yPm/L4wzsCPDw= +github.com/DataDog/datadog-agent/pkg/util/log v0.59.1/go.mod h1:nW37eZ8+OsEGA/YhtOgiI2vFaXausm3dfjXUVh++heQ= +github.com/DataDog/datadog-agent/pkg/util/log/setup v0.59.0 h1:1gQ81041dHofvio6mn0EnmAG8hYR52VOlCjONIvpkks= +github.com/DataDog/datadog-agent/pkg/util/log/setup v0.59.0/go.mod h1:9aftpZaZs8Z7EWHGQO3+biYHVRxN/V4WELSK6P5c0DY= +github.com/DataDog/datadog-agent/pkg/util/optional v0.59.0 h1:IOZeoApM4NI6dw+Sdo4PalVU1Z6uoY3vuKdl5Jm6g2M= +github.com/DataDog/datadog-agent/pkg/util/optional v0.59.0/go.mod h1:xWT/KJdJg2/0pZyAKZ6XmIiE5sM+AyUo4qvKuPHQ17U= +github.com/DataDog/datadog-agent/pkg/util/pointer v0.59.0 h1:K/3aHtAsvlAIbw0/3ah66f1glnpdLNm69XSYXdcnDtw= +github.com/DataDog/datadog-agent/pkg/util/pointer v0.59.0/go.mod h1:t1DlnUEMltkvwPLc7zCtP1u5cBDu+30daR2VhQO5bvA= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.59.1 h1:UnRouTSYwGa5gib1QX4LUNk16+G1vmK3wn8qr9F0Hp4= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.59.1/go.mod h1:krOxbYZc4KKE7bdEDu10lLSQBjdeSFS/XDSclsaSf1Y= +github.com/DataDog/datadog-agent/pkg/util/startstop v0.59.0 h1:zPO6AX/UcbMCuGjnrK0cuDgULbOyzZFYvuxf/qbZjGg= +github.com/DataDog/datadog-agent/pkg/util/startstop v0.59.0/go.mod h1:IkqOyNbrg9hXqCMyL+g+Ldhz4q6VVOPqbHQxS4lLiRs= +github.com/DataDog/datadog-agent/pkg/util/statstracker v0.59.0 h1:CYY4C03mcJCqB04DKttAbNPrQouJLSL94m/KLaURv3Y= +github.com/DataDog/datadog-agent/pkg/util/statstracker v0.59.0/go.mod h1:Et2HSDjQvMhgs9ZdH7T5I4q04g5Fj23EtmeIaen/9/M= +github.com/DataDog/datadog-agent/pkg/util/system v0.59.0 h1:9fpWOSJyuBHdpzQkUYFoyC57Bv+umHeMMSQmwmm900k= +github.com/DataDog/datadog-agent/pkg/util/system v0.59.0/go.mod h1:rdBzS773XYudLd/IH2mUzz3+kJ2N2PcFWEdRGEGYlP0= +github.com/DataDog/datadog-agent/pkg/util/system/socket v0.59.0 h1:8l2FgdcIUNPyI4J+w5OaY3k2byB11HqZ/mcg2AcJSSI= +github.com/DataDog/datadog-agent/pkg/util/system/socket v0.59.0/go.mod h1:C63BEsAoSlfoB4WadEMO1guB+dvfl95zQaMLw394zNM= +github.com/DataDog/datadog-agent/pkg/util/testutil v0.59.0 h1:f6EtElJXr8UN6FftNEeqIyT2jzvAtldQI+eb7qaYvrA= +github.com/DataDog/datadog-agent/pkg/util/testutil v0.59.0/go.mod h1:m/uWLdpGEi3x/5gybZFeYNEnIdKhGtWW8kFZuM+GSFA= +github.com/DataDog/datadog-agent/pkg/util/winutil v0.59.1 h1:EE1+1pWfb5bxprz0+I+ERnCm6Pm2fI46+Sop3CfISps= +github.com/DataDog/datadog-agent/pkg/util/winutil v0.59.1/go.mod h1:CezVaH66o/kyTtOYLYBjy/CTqwkM9HzPpDFppfRu6bE= +github.com/DataDog/datadog-agent/pkg/version v0.59.1 h1:6C39A9t2Noe3Ndk0yH7d0ys5t+KRewLvMLWN/A0OStY= +github.com/DataDog/datadog-agent/pkg/version v0.59.1/go.mod h1:rcA7LtIB5WLpxsems/bWO1iXkyGEgHHje7vJ0b20ZpU= +github.com/DataDog/datadog-api-client-go/v2 v2.33.0 h1:OI6kDnJeQmkjfGzxmP0XUQUxMD4tp6oAPXnnJ4VpgUM= +github.com/DataDog/datadog-api-client-go/v2 v2.33.0/go.mod h1:d3tOEgUd2kfsr9uuHQdY+nXrWp4uikgTgVCPdKNK30U= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/datadog-go/v5 v5.5.0 h1:G5KHeB8pWBNXT4Jtw0zAkhdxEAWSpWH00geHI6LDrKU= github.com/DataDog/datadog-go/v5 v5.5.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= -github.com/DataDog/dd-sensitive-data-scanner/sds-go/go v0.0.0-20240419161837-f1b2f553edfe h1:efzxujZ7VHWFxjmWjcJyUEpPrN8qdiZPYb+dBw547Wo= -github.com/DataDog/dd-sensitive-data-scanner/sds-go/go v0.0.0-20240419161837-f1b2f553edfe/go.mod h1:TX7CTOQ3LbQjfAi4SwqUoR5gY1zfUk7VRBDTuArjaDc= -github.com/DataDog/go-sqllexer v0.0.9 h1:Cx2Cu1S0hfj4coCCA8hzjM9+UNFRkcu1avIV//RU5Qw= -github.com/DataDog/go-sqllexer v0.0.9/go.mod h1:nB4Ea2YNsqMwtbWMc4Fm/oP98IIrSPapqwOwPioMspY= +github.com/DataDog/dd-sensitive-data-scanner/sds-go/go v0.0.0-20240816154533-f7f9beb53a42 h1:RoH7VLzTnxHEugRPIgnGlxwDFszFGI7b3WZZUtWuPRM= +github.com/DataDog/dd-sensitive-data-scanner/sds-go/go v0.0.0-20240816154533-f7f9beb53a42/go.mod h1:TX7CTOQ3LbQjfAi4SwqUoR5gY1zfUk7VRBDTuArjaDc= +github.com/DataDog/go-sqllexer v0.0.15 h1:rUUu52dP8EQhJLnUw0MIAxZp0BQx2fOTuMztr3vtHUU= +github.com/DataDog/go-sqllexer v0.0.15/go.mod h1:KwkYhpFEVIq+BfobkTC1vfqm4gTi65skV/DpDBXtexc= github.com/DataDog/go-tuf v1.1.0-0.5.2 h1:4CagiIekonLSfL8GMHRHcHudo1fQnxELS9g4tiAupQ4= github.com/DataDog/go-tuf v1.1.0-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= github.com/DataDog/gohai v0.0.0-20230524154621-4316413895ee h1:tXibLZk3G6HncIFJKaNItsdzcrk4YqILNDZlXPTNt4k= github.com/DataDog/gohai v0.0.0-20230524154621-4316413895ee/go.mod h1:nTot/Iy0kW16bXgXr6blEc8gFeAS7vTqYlhAxh+dbc0= -github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata v0.16.1 h1:WD5hPS/KfDaYcWxa636972pQ8iOBN9MC/6Is5aSNZc8= -github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata v0.16.1/go.mod h1:P/l++2cDCeeq21KSmCEdXdMH9/WMdXP7uA/vjnxhtz8= -github.com/DataDog/opentelemetry-mapping-go/pkg/internal/sketchtest v0.16.0 h1:VJT1Jjlz/ca999FEqaAS+He7S4eB14a+PJjczgRdgAY= -github.com/DataDog/opentelemetry-mapping-go/pkg/internal/sketchtest v0.16.0/go.mod h1:66XlN7QpQKqIvw8e2UbCXV5X8wGnEw851nT9BjJ75dY= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.16.1 h1:ZI8u3CgdMXpDplrf9/gIr13+/g/tUzUcBMk2ZhXgzLE= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.16.1/go.mod h1:dvIWN9pA2zWNTw5rhDWZgzZnhcfpH++d+8d1SWW6xkY= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/logs v0.16.1 h1:px2+7svK86oeCGd+sT1x/9f0pqIJdApGFnWI0AOPXwA= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/logs v0.16.1/go.mod h1:+LijQ2LdlocAQ4WB+7KsoIGe90bfogkRslubd9swVow= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics v0.16.1 h1:Qm3M3A7/tkYG8JYeF9Mxp3oNEz23EQzvnV0MZR8mJKQ= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics v0.16.1/go.mod h1:HPwVoMccTFfyV94bE29ffwAYnsPykAH7Iso8/5ucLSs= -github.com/DataDog/opentelemetry-mapping-go/pkg/quantile v0.16.1 h1:sQoxh5RytdEFYFLGw3JUwFFhS/A1InFFVldpWAS/Z3g= -github.com/DataDog/opentelemetry-mapping-go/pkg/quantile v0.16.1/go.mod h1:6eYyd+lJYH+uRuZqhyW/u+9ykaXBWetDGj44+txz6jU= -github.com/DataDog/sketches-go v1.4.5 h1:ki7VfeNz7IcNafq7yI/j5U/YCkO3LJiMDtXz9OMQbyE= -github.com/DataDog/sketches-go v1.4.5/go.mod h1:7Y8GN8Jf66DLyDhc94zuWA3uHEt/7ttt8jHOBWWrSOg= -github.com/DataDog/viper v1.13.3 h1:0++798wZLEenL1JbF8dMmwFl6WMlAVxLtzVuws/LlVc= -github.com/DataDog/viper v1.13.3/go.mod h1:wDdUVJ2SHaMaPrCZrlRCObwkubsX8j5sme3LaR/SGTc= -github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= -github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.23.0 h1:yRhWveg9NbJcJYoJL4FoSauT2dxnt4N9MIAJ7tvU/mQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.23.0/go.mod h1:p2puVVSKjQ84Qb1gzw2XHLs34WQyHTYFZLaVxypAFYs= +github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata v0.22.0 h1:r1Dx2cRHCBWkVluSZA41i4eoI/nOGbcrrZdkqWjoFCc= +github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata v0.22.0/go.mod h1:+/dkO8ZiMa8rfm4SmtTF6qPUdBbBcvsWWKaO4xPKAIk= +github.com/DataDog/opentelemetry-mapping-go/pkg/internal/sketchtest v0.22.0 h1:cXcKVEU1D0HlguR7GunnvuI70TghkarCa9DApqzMY94= +github.com/DataDog/opentelemetry-mapping-go/pkg/internal/sketchtest v0.22.0/go.mod h1:ES00EXfyEKgUkjd93tAXCxJA6i0seeOhZoS5Cj2qzzg= +github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.22.0 h1:yfk2cF8Bx98fSFpGrehEHh1FRqewfxcCTAbUDt5r3F8= +github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.22.0/go.mod h1:9qzpnBSxSOnKzbF/uHket3SSlQihQHix/ZRC2nZUUYQ= +github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/logs v0.22.0 h1:Zqj8YUZ/ualUhM8GDCQX6xKnUJKEiG0eYdFGWmIDG30= +github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/logs v0.22.0/go.mod h1:lpr4q6g2TB0BHeLHaz/XleKm8YXQjuxiQEb9Q9HXXE0= +github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics v0.22.0 h1:w9+ngZDYUMLW+GSRA8x1DvVbuMR+cwlGb8VLwZfgBGs= +github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics v0.22.0/go.mod h1:UsfqLgiD6Sjhpjkg+YzAd+TdKUZ2m6ZZ8t+tEkLNTMA= +github.com/DataDog/opentelemetry-mapping-go/pkg/quantile v0.22.0 h1:63SzQz9Ab8XJj8fQKQz6UZNBhOm8rucwzbDfwTVF6dQ= +github.com/DataDog/opentelemetry-mapping-go/pkg/quantile v0.22.0/go.mod h1:E/PY/aQ6S/N5hBPHXZRGmovs5b1BSi4RHGNcB4yP/Z0= +github.com/DataDog/sketches-go v1.4.6 h1:acd5fb+QdUzGrosfNLwrIhqyrbMORpvBy7mE+vHlT3I= +github.com/DataDog/sketches-go v1.4.6/go.mod h1:7Y8GN8Jf66DLyDhc94zuWA3uHEt/7ttt8jHOBWWrSOg= +github.com/DataDog/viper v1.14.0 h1:dIjTe/uJiah+QFqFZ+MXeqgmUvWhg37l37ZxFWxr3is= +github.com/DataDog/viper v1.14.0/go.mod h1:wDdUVJ2SHaMaPrCZrlRCObwkubsX8j5sme3LaR/SGTc= +github.com/DataDog/zstd v1.5.6 h1:LbEglqepa/ipmmQJUDnSsfvA8e8IStVcGaFWDuxvGOY= +github.com/DataDog/zstd v1.5.6/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 h1:3c8yed4lgqTt+oTQ+JNMDo+F4xprBf+O/il4ZC0nRLw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0/go.mod h1:obipzmGjfSjam60XLwGfqUkJsfiheAl+TUjG+4yzyPM= github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= -github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= @@ -244,8 +261,12 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 h1:ez/4by2iGztzR4L0zgAOR8lTQK9VlyBVVd7G4omaOQs= -github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 h1:t3eaIm0rUkzbrIewtiFmMK5RXHej2XnoXNhxVsAYUfg= +github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= +github.com/antchfx/xmlquery v1.4.2 h1:MZKd9+wblwxfQ1zd1AdrTsqVaMjMCwow3IqkCSe00KA= +github.com/antchfx/xmlquery v1.4.2/go.mod h1:QXhvf5ldTuGqhd1SHNvvtlhhdQLks4dD0awIVhXIDTA= +github.com/antchfx/xpath v1.3.2 h1:LNjzlsSjinu3bQpw9hWMY9ocB80oLOWuQqFvO6xt51U= +github.com/antchfx/xpath v1.3.2/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= 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= @@ -256,8 +277,8 @@ github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.53.11 h1:KcmduYvX15rRqt4ZU/7jKkmDxU/G87LJ9MUI0yQJh00= -github.com/aws/aws-sdk-go v1.53.11/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= +github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 h1:6df1vn4bBlDDo4tARvBm7l6KA9iVMnE3NWizDeWSrps= github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3/go.mod h1:CIWtjkly68+yqLPbvwwR/fjNJA/idrtULjZWh2v1ys0= github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= @@ -267,8 +288,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/bmatcuk/doublestar/v4 v4.6.1 h1:FH9SifrbvJhnlQpztAx++wlkk70QBf0iBWDwNy7PA4I= -github.com/bmatcuk/doublestar/v4 v4.6.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= +github.com/bmatcuk/doublestar/v4 v4.7.1 h1:fdDeAqgT47acgwd9bd9HxJRDmc9UAmPpc+2m0CXv75Q= +github.com/bmatcuk/doublestar/v4 v4.7.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= github.com/briandowns/spinner v1.23.0 h1:alDF2guRWqa/FOZZYWjlMIx2L6H0wyewPxo/CH4Pt2A= github.com/briandowns/spinner v1.23.0/go.mod h1:rPG4gmXeN3wQV/TsAY4w8lPdIM6RX3yqeBQJSrbXjuE= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= @@ -290,16 +311,14 @@ github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6D github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50 h1:DBmgJDC9dTfkVyGgipamEh2BpGYxScCH1TOF1LL1cXc= -github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50/go.mod h1:5e1+Vvlzido69INQaVO6d87Qn543Xr6nooe9Kz7oBFM= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/containerd/cgroups/v3 v3.0.3 h1:S5ByHZ/h9PMe5IOQoN7E+nMc2UcLEM/V48DGDJ9kip0= github.com/containerd/cgroups/v3 v3.0.3/go.mod h1:8HBe7V3aWGLFPd/k03swSIsGjZhHI2WzJmticMgVuz0= -github.com/containerd/containerd v1.7.15 h1:afEHXdil9iAm03BmhjzKyXnnEBtjaLJefdU7DV0IFes= -github.com/containerd/containerd v1.7.15/go.mod h1:ISzRRTMF8EXNpJlTzyr2XMhN+j9K302C21/+cr3kUnY= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -310,9 +329,9 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7 github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= -github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +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/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -325,14 +344,14 @@ github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUn github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/digitalocean/godo v1.109.0 h1:4W97RJLJSUQ3veRZDNbp1Ol3Rbn6Lmt9bKGvfqYI5SU= -github.com/digitalocean/godo v1.109.0/go.mod h1:R6EmmWI8CT1+fCtjWY9UCB+L5uufuZH13wk3YhxycCs= -github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= -github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/digitalocean/godo v1.118.0 h1:lkzGFQmACrVCp7UqH1sAi4JK/PWwlc5aaxubgorKmC4= +github.com/digitalocean/godo v1.118.0/go.mod h1:Vk0vpCot2HOAJwc5WE8wljZGtJ3ZtWIc8MQ8rF38sdo= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docker/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= -github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v27.4.0+incompatible h1:I9z7sQ5qyzO0BfAb9IMOawRkAGxhYsidKiTMcm0DU+A= +github.com/docker/docker v27.4.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -341,6 +360,12 @@ github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/BE= +github.com/ebitengine/purego v0.8.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/elastic/go-grok v0.3.1 h1:WEhUxe2KrwycMnlvMimJXvzRa7DoByJB4PVUIE1ZD/U= +github.com/elastic/go-grok v0.3.1/go.mod h1:n38ls8ZgOboZRgKcjMY8eFeZFMmcL9n2lP0iHhIDk64= +github.com/elastic/lunes v0.1.0 h1:amRtLPjwkWtzDF/RKzcEPMvSsSseLDLW+bnhfNSLRe4= +github.com/elastic/lunes v0.1.0/go.mod h1:xGphYIt3XdZRtyWosHQTErsQTd4OP1p9wsbVoHelrd4= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= @@ -349,31 +374,29 @@ github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRr github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.12.0 h1:4X+VP1GHd1Mhj6IB5mMeGbLCleqxjletLK6K0rbxyZI= -github.com/envoyproxy/go-control-plane v0.12.0/go.mod h1:ZBTaoJ23lqITozF0M6G4/IragXCQKCnYbmlmtHvwRG0= +github.com/envoyproxy/go-control-plane v0.13.0 h1:HzkeUz1Knt+3bK+8LG1bxOO/jzWZmdxpwC51i202les= +github.com/envoyproxy/go-control-plane v0.13.0/go.mod h1:GRaKG3dwvFoTg4nj7aXdZnvMg4d7nvT/wl9WgVXn3Q8= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= -github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= +github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM= +github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/expr-lang/expr v1.16.9 h1:WUAzmR0JNI9JCiF0/ewwHB1gmcGw5wW7nWt8gc6PpCI= github.com/expr-lang/expr v1.16.9/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= -github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= -github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -392,12 +415,13 @@ github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7 github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= @@ -412,19 +436,19 @@ github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.22.9 h1:XX2DssF+mQKM2DHsbgZK74y/zj4mo9I99+89xUmuZCE= github.com/go-openapi/swag v0.22.9/go.mod h1:3/OXnFfnMAwBD099SwYRk7GD3xOrr1iL7d/XNLXVVwE= -github.com/go-resty/resty/v2 v2.12.0 h1:rsVL8P90LFvkUYq/V5BTVe203WfRIU4gvcf+yfzJzGA= -github.com/go-resty/resty/v2 v2.12.0/go.mod h1:o0yGPrkS3lOe1+eFajk6kBW8ScXzwU3hD69/gt2yB/0= +github.com/go-resty/resty/v2 v2.13.1 h1:x+LHXBI2nMB1vqndymf26quycC4aggYJ7DECYbiz03g= +github.com/go-resty/resty/v2 v2.13.1/go.mod h1:GznXlLxkq6Nh4sU59rPmUw3VtgpO3aS96ORAI6Q7d+0= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg= github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= +github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.6 h1:mkgN1ofwASrYnJ5W6U/BxG15eXXXjirgZc7CLqkcaro= github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -433,8 +457,8 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw= -github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -498,7 +522,6 @@ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -506,11 +529,8 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7 h1:y3N7Bm7Y9/CtpiVkw/ZWj6lSlDF3F74SfKwfTCer72Q= -github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/pprof v0.0.0-20240711041743-f6c9dda6c6da h1:xRmpO92tb8y+Z85iUOMOicpCfaYcv7o3Cg3wKrIpg8g= +github.com/google/pprof v0.0.0-20240711041743-f6c9dda6c6da/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= @@ -522,33 +542,30 @@ github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfF github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.12.2 h1:mhN09QQW1jEWeMF74zGR81R30z4VJzjZsfkUhuHF+DA= -github.com/googleapis/gax-go/v2 v2.12.2/go.mod h1:61M8vcyyXR2kqKFxKrfA22jaA8JGF7Dc8App1U3H6jc= +github.com/googleapis/gax-go/v2 v2.12.5 h1:8gw9KZK8TiVKB6q3zHY3SBzLnrGp6HQjyfYBYGmXdxA= +github.com/googleapis/gax-go/v2 v2.12.5/go.mod h1:BUDKcWo+RaKq5SC9vVYL0wLADa3VcfswbOMMRmB9H3E= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gophercloud/gophercloud v1.8.0 h1:TM3Jawprb2NrdOnvcHhWJalmKmAmOGgfZElM/3oBYCk= -github.com/gophercloud/gophercloud v1.8.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= +github.com/gophercloud/gophercloud v1.13.0 h1:8iY9d1DAbzMW6Vok1AxbbK5ZaUjzMp0tdyt4fX9IeJ0= +github.com/gophercloud/gophercloud v1.13.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= -github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc h1:GN2Lv3MGO7AS6PrRoT6yV5+wkrOpcszoIsO4+4ds248= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= 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-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.13.0/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= -github.com/hashicorp/consul/api v1.28.3 h1:IE06LST/knnCQ+cxcvzyXRF/DetkgGhJoaOFd4l9xkk= -github.com/hashicorp/consul/api v1.28.3/go.mod h1:7AGcUFu28HkgOKD/GmsIGIFzRTmN0L02AE9Thsr2OhU= -github.com/hashicorp/consul/proto-public v0.6.1 h1:+uzH3olCrksXYWAYHKqK782CtK9scfqH+Unlw3UHhCg= -github.com/hashicorp/consul/proto-public v0.6.1/go.mod h1:cXXbOg74KBNGajC+o8RlA502Esf0R9prcoJgiOX/2Tg= -github.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU= -github.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= +github.com/hashicorp/consul/api v1.30.0 h1:ArHVMMILb1nQv8vZSGIwwQd2gtc+oSQZ6CalyiyH2XQ= +github.com/hashicorp/consul/api v1.30.0/go.mod h1:B2uGchvaXVW2JhFoS8nqTxMD5PBykr4ebY4JWHTTeLM= +github.com/hashicorp/consul/sdk v0.16.1 h1:V8TxTnImoPD5cj0U9Spl0TUxcytjcbbJeADFF07KdHg= +github.com/hashicorp/consul/sdk v0.16.1/go.mod h1:fSXvwxB2hmh1FMZCNl6PwX0Q/1wdWtHJcZ7Ea5tns0s= github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -557,9 +574,8 @@ github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brv github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= -github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -571,8 +587,8 @@ github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+ github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-retryablehttp v0.7.4 h1:ZQgVdpTdAL7WpMIwLzCfbalOcSUdkDZnpUv3/+BxzFA= -github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= +github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= +github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= @@ -587,31 +603,32 @@ github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKe github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/hcl v1.0.1-vault-5 h1:kI3hhbbyzr4dldA8UdTb7ZlVVlI2DACdCfz31RPDgJM= +github.com/hashicorp/hcl v1.0.1-vault-5/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= -github.com/hashicorp/nomad/api v0.0.0-20240306004928-3e7191ccb702 h1:fI1LXuBaS1d9z1kmb++Og6YD8uMRwadXorCwE+xgOFA= -github.com/hashicorp/nomad/api v0.0.0-20240306004928-3e7191ccb702/go.mod h1:z71gkJdrkAt/Rl6C7Q79VE7AwJ5lUF+M+fzFTyIHYB0= +github.com/hashicorp/nomad/api v0.0.0-20240717122358-3d93bd3778f3 h1:fgVfQ4AC1avVOnu2cfms8VAiD8lUq3vWI8mTocOXN/w= +github.com/hashicorp/nomad/api v0.0.0-20240717122358-3d93bd3778f3/go.mod h1:svtxn6QnrQ69P23VvIWMR34tg3vmwLz4UdUzm1dSCgE= github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/hectane/go-acl v0.0.0-20190604041725-da78bae5fc95 h1:S4qyfL2sEm5Budr4KVMyEniCy+PbS55651I/a+Kn/NQ= github.com/hectane/go-acl v0.0.0-20190604041725-da78bae5fc95/go.mod h1:QiyDdbZLaJ/mZP4Zwc9g2QsfaEA4o7XvvgZegSci5/E= -github.com/hetznercloud/hcloud-go/v2 v2.6.0 h1:RJOA2hHZ7rD1pScA4O1NF6qhkHyUdbbxjHgFNot8928= -github.com/hetznercloud/hcloud-go/v2 v2.6.0/go.mod h1:4J1cSE57+g0WS93IiHLV7ubTHItcp+awzeBp5bM9mfA= +github.com/hetznercloud/hcloud-go/v2 v2.10.2 h1:9gyTUPhfNbfbS40Spgij5mV5k37bOZgt8iHKCbfGs5I= +github.com/hetznercloud/hcloud-go/v2 v2.10.2/go.mod h1:xQ+8KhIS62W0D78Dpi57jsufWh844gUw1az5OUvaeq8= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= @@ -626,6 +643,8 @@ github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHW github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= @@ -649,19 +668,18 @@ github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvW github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -674,19 +692,19 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leodido/go-syslog/v4 v4.1.0 h1:Wsl194qyWXr7V6DrGWC3xmxA9Ra6XgWO+toNt2fmCaI= -github.com/leodido/go-syslog/v4 v4.1.0/go.mod h1:eJ8rUfDN5OS6dOkCOBYlg2a+hbAg6pJa99QXXgMrd98= +github.com/leodido/go-syslog/v4 v4.2.0 h1:A7vpbYxsO4e2E8udaurkLlxP5LDpDbmPMsGnuhb7jVk= +github.com/leodido/go-syslog/v4 v4.2.0/go.mod h1:eJ8rUfDN5OS6dOkCOBYlg2a+hbAg6pJa99QXXgMrd98= github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b h1:11UHH39z1RhZ5dc4y4r/4koJo6IYFgTRMe/LlwRTEw0= github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b/go.mod h1:WZxr2/6a/Ar9bMDc2rN/LJrE/hF6bXE4LPyDSIxwAfg= -github.com/leoluk/perflib_exporter v0.2.1 h1:/3/ut1k/jFt5p4ypjLZKDHDqlXAK6ERZPVWtwdI389I= -github.com/leoluk/perflib_exporter v0.2.1/go.mod h1:MinSWm88jguXFFrGsP56PtleUb4Qtm4tNRH/wXNXRTI= github.com/lightstep/go-expohisto v1.0.0 h1:UPtTS1rGdtehbbAF7o/dhkWLTDI73UifG8LbfQI7cA4= github.com/lightstep/go-expohisto v1.0.0/go.mod h1:xDXD0++Mu2FOaItXtdDfksfgxfV0z1TMPa+e/EUd0cs= -github.com/linode/linodego v1.33.0 h1:cX2FYry7r6CA1ujBMsdqiM4VhvIQtnWsOuVblzfBhCw= -github.com/linode/linodego v1.33.0/go.mod h1:dSJJgIwqZCF5wnpuC6w5cyIbRtcexAm7uVvuJopGB40= +github.com/linode/linodego v1.37.0 h1:B/2Spzv9jYXzKA+p+GD8fVCNJ7Wuw6P91ZDD9eCkkso= +github.com/linode/linodego v1.37.0/go.mod h1:L7GXKFD3PoN2xSEtFc04wIXP5WK65O10jYQx0PQISWQ= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c h1:VtwQ41oftZwlMnOEbMWQtSEUgU64U4s+GHk7hZK+jtY= github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE= +github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= +github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= @@ -715,8 +733,8 @@ github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04 github.com/maxatome/go-testdeep v1.12.0/go.mod h1:lPZc/HAcJMP92l7yI6TRz1aZN5URwUBUAfUNvrclaNM= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.58 h1:ca2Hdkz+cDg/7eNF6V56jjzuZ4aCAE+DbVkILdQWG/4= -github.com/miekg/dns v1.1.58/go.mod h1:Ypv+3b/KadlvW9vJfXOTf300O4UqaHFzFCuHz+rPkBY= +github.com/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs= +github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= @@ -724,14 +742,14 @@ github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= -github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4= -github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c h1:cqn374mizHuIWj+OSJCajGr/phAmuMug9qIX3l9CflE= github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= @@ -739,6 +757,8 @@ github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5 github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -752,8 +772,8 @@ github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9 github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mostynb/go-grpc-compression v1.2.2 h1:XaDbnRvt2+1vgr0b/l0qh4mJAfIxE0bKXtz2Znl3GGI= -github.com/mostynb/go-grpc-compression v1.2.2/go.mod h1:GOCr2KBxXcblCuczg3YdLQlcin1/NfyDA348ckuCH6w= +github.com/mostynb/go-grpc-compression v1.2.3 h1:42/BKWMy0KEJGSdWvzqIyOZ95YcR9mLPqKctH7Uo//I= +github.com/mostynb/go-grpc-compression v1.2.3/go.mod h1:AghIxF3P57umzqM9yz795+y1Vjs47Km/Y2FE6ouQ7Lg= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= @@ -768,12 +788,12 @@ github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= -github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= +github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= +github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg= -github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= @@ -789,25 +809,29 @@ github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142/go.mod h1:fjS8 github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/outcaste-io/ristretto v0.2.1 h1:KCItuNIGJZcursqHr3ghO7fc5ddZLEHspL9UR0cQM64= github.com/outcaste-io/ristretto v0.2.1/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= -github.com/ovh/go-ovh v1.4.3 h1:Gs3V823zwTFpzgGLZNI6ILS4rmxZgJwJCz54Er9LwD0= -github.com/ovh/go-ovh v1.4.3/go.mod h1:AkPXVtgwB6xlKblMjRKJJmjRp+ogrE7fz2lVgcQY8SY= +github.com/ovh/go-ovh v1.6.0 h1:ixLOwxQdzYDx296sXcgS35TOPEahJkpjMGtzPadCjQI= +github.com/ovh/go-ovh v1.6.0/go.mod h1:cTVDnl94z4tl8pP1uZ/8jlVxntjSIf09bNcQ5TJSC7c= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= -github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= -github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= +github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c h1:dAMKvw0MlJT1GshSTtih8C2gDs04w8dReiOGXrGLNoY= +github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -816,6 +840,8 @@ github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSg github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c h1:NRoLoZvkBTKvR5gQLgA3e0hqjkY9u1wm+iOL45VN/qI= github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus-community/windows_exporter v0.27.2 h1:/tdRTouPMVsC4qt8+s9NOPEm7L/9qdDxmasiETlx+Wk= +github.com/prometheus-community/windows_exporter v0.27.2/go.mod h1:8+T6hfv71nvgVIzguouXkIGoa15ni+uXHHULBOA2bZo= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= @@ -823,8 +849,8 @@ github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3O github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= +github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -838,9 +864,8 @@ github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8b github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.31.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= +github.com/prometheus/common v0.61.0 h1:3gv/GThfX0cV2lpO7gkTUwZru38mxevy90Bj8YFSRQQ= +github.com/prometheus/common v0.61.0/go.mod h1:zr29OCN/2BsJRaFwG8QOBr41D6kkchKbpeNH7pAjb/s= github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -849,32 +874,33 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e h1:UmqAuY2OyDoog8+l5FybViJE5B2r+UxVGCUwFTsY5AA= -github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e/go.mod h1:+0ld+ozir7zWFcHA2vVpWAKxXakIioEjPPNOqH+J3ZA= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/prometheus/prometheus v0.54.1 h1:vKuwQNjnYN2/mDoWfHXDhAsz/68q/dQDb+YbcEqU7MQ= +github.com/prometheus/prometheus v0.54.1/go.mod h1:xlLByHhk2g3ycakQGrMaU8K7OySZx98BzeCR99991NY= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= 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/scaleway/scaleway-sdk-go v1.0.0-beta.25 h1:/8rfZAdFfafRXOgz+ZpMZZWZ5pYggCY9t7e/BvjaBHM= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.25/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.29 h1:BkTk4gynLjguayxrYxZoMZjBnAOh7ntQvUkOFmkMqPU= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.29/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/secure-systems-lab/go-securesystemslib v0.7.0 h1:OwvJ5jQf9LnIAS83waAjPbcMsODrTQUpJ02eNLUoxBg= github.com/secure-systems-lab/go-securesystemslib v0.7.0/go.mod h1:/2gYnlnHVQ6xeGtfIqFy7Do03K4cdCY0A/GlJLDKLHI= github.com/shirou/gopsutil/v3 v3.22.12/go.mod h1:Xd7P1kwZcp5VW52+9XsirIKd/BROzbb2wdX3Kqlz9uI= -github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= -github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= +github.com/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI= +github.com/shirou/gopsutil/v3 v3.24.5/go.mod h1:bsoOS1aStSs9ErQ1WWfxllSeS1K5D+U30r2NfcubMVk= +github.com/shirou/gopsutil/v4 v4.24.11 h1:WaU9xqGFKvFfsUv94SXcUPD7rCkU0vr/asVdQOBZNj8= +github.com/shirou/gopsutil/v4 v4.24.11/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= -github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= github.com/shoenig/test v1.7.1 h1:UJcjSAI3aUKx52kfcfhblgyhZceouhvvs3OYdWgn+PY= github.com/shoenig/test v1.7.1/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= @@ -889,15 +915,16 @@ github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4k github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= -github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= -github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= -github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= +github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w= +github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -915,7 +942,6 @@ github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -924,11 +950,12 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= 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 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/testcontainers/testcontainers-go v0.31.0 h1:W0VwIhcEVhRflwL9as3dhY6jXjVCA27AkmbnZ+UTh3U= -github.com/testcontainers/testcontainers-go v0.31.0/go.mod h1:D2lAoA0zUFiSY+eAflqK5mcUx/A5hrrORaEQrd0SefI= +github.com/testcontainers/testcontainers-go v0.34.0 h1:5fbgF0vIN5u+nD3IWabQwRybuB4GY8G2HHgCkbMzMHo= +github.com/testcontainers/testcontainers-go v0.34.0/go.mod h1:6P/kMkQe8yqPHfPWNulFGdFHTD8HB2vLq/231xY2iPQ= github.com/tidwall/gjson v1.10.2 h1:APbLGOM0rrEkd8WBw9C24nllro4ajFuJu0Sc9hRz8Bo= github.com/tidwall/gjson v1.10.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= @@ -937,19 +964,21 @@ github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/tinylru v1.1.0 h1:XY6IUfzVTU9rpwdhKUF6nQdChgCdGjkMfLzbWyiau6I= github.com/tidwall/tinylru v1.1.0/go.mod h1:3+bX+TJ2baOLMWTnlyNWHh4QMnFyARg2TLTQ6OFbzw8= -github.com/tidwall/wal v1.1.7 h1:emc1TRjIVsdKKSnpwGBAcsAGg0767SvUk8+ygx7Bb+4= -github.com/tidwall/wal v1.1.7/go.mod h1:r6lR1j27W9EPalgHiB7zLJDYu3mzW5BQP5KrzBpYY/E= -github.com/tinylib/msgp v1.1.9 h1:SHf3yoO2sGA0veCJeCBYLHuttAVFHGm2RHgNodW7wQU= -github.com/tinylib/msgp v1.1.9/go.mod h1:BCXGB54lDD8qUEPmiG0cQQUANC4IUQyB2ItS2UDlO/k= +github.com/tidwall/wal v1.1.8 h1:2qDSGdAdjaY3PEvHRva+9UFqgk+ef7cOiW1Qn5JH1y0= +github.com/tidwall/wal v1.1.8/go.mod h1:r6lR1j27W9EPalgHiB7zLJDYu3mzW5BQP5KrzBpYY/E= +github.com/tinylib/msgp v1.2.4 h1:yLFeUGostXXSGW5vxfT5dXG/qzkn4schv2I7at5+hVU= +github.com/tinylib/msgp v1.2.4/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU= +github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY= github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY= +github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20200122045848-3419fae592fc/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 h1:SIKIoA4e/5Y9ZOl0DCe3eVMLPOQzJxgZpfdHHeauNTM= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6/go.mod h1:BUbeWZiieNxAuuADTBNb3/aeje6on3DhU3rpWsQSB1E= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= @@ -961,6 +990,8 @@ github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vb github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= github.com/vultr/govultr/v2 v2.17.2 h1:gej/rwr91Puc/tgh+j33p/BLR16UrIPnSr+AIwYWZQs= github.com/vultr/govultr/v2 v2.17.2/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -980,134 +1011,197 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/configgrpc v0.102.0 h1:cQi5HwpkHvrZJUxZjoGXkWpAuK+gEyp/1Zjn0BrkvmQ= -go.opentelemetry.io/collector/config/configgrpc v0.102.0/go.mod h1:ASpBXzDWLiDGlG8iRFovU5R4LhAefoC4ajm+qIdslOw= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/confignet v0.102.0 h1:+wQevJ/iBnPxL+roY7WWnAjMxB8v4M5QrS3+0iEmauw= -go.opentelemetry.io/collector/config/confignet v0.102.0/go.mod h1:pfOrCTfSZEB6H2rKtx41/3RN4dKs+X2EKQbw3MGRh0E= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0 h1:8Ne/oL6M4kMWK0P3FKV9EduQa+1UOGyVAnFHfSo4c1A= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0/go.mod h1:Xj4Ld/RriP/Bj+5oPpaYJsLNs2wWRDN2TvzX3Lbi6+M= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0 h1:o1iKqN+oM+TZqHoGdnKw1Am2BQlIGCYbxCRzU8T3jbM= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0/go.mod h1:JpCemLtL/sXQ2Rk3Bx7OPPA7Qt/9NVH91q0bR655gSo= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0 h1:SfASE6lxXjrmYj/UibcWdOiFWvRG0zt4hJgenloEhlY= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0/go.mod h1:+Ku0Fvdb5f6e9UkfqJXAV5FaUJVxxg6Ykfx7Js8y+V4= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0 h1:GwJQTXs7pYPUv/fVf+0nBgsJdlrTuY/PfwQ/TRA/sIk= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0/go.mod h1:PGE3DcRgqYWWC2cq2hYZoET1d3Q8JZyPNmgvqXPFWEU= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0 h1:zdYZLiHHtDf4Kk9WU7mW9dW6WAXtBF54I5jmTMRJtiw= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0/go.mod h1:yFsgUM0PbUJkPlbpJfOG6da+YiF0Z80tv7YcnL3qwv4= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0 h1:Y4H+GaCQl2URp9mEJMV5CYOhw+erONqNyvtFoKQfIoA= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0/go.mod h1:g1RjfVD0gHAf/mPOIs3zBoKBeuDsN+rc5x0lZtgA8tI= -go.opentelemetry.io/collector/connector v0.102.0 h1:IvAsVfYRxP0ajmKbUovF8qugkcUtHq6RuYNtjcMa63E= -go.opentelemetry.io/collector/connector v0.102.0/go.mod h1:f4M7wZ/9+XtgTE0fivBFH3WlwntaEd0qFFA0giFkdnY= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/exporter/debugexporter v0.102.0 h1:b8z8EHdb3Q4f1A/lr6zP9aVv+7HTsouV0XCR8zb+R4w= -go.opentelemetry.io/collector/exporter/debugexporter v0.102.0/go.mod h1:fuFR9OIDtNe/ZGUp1YwrO2t0jy1/AIi4P93e+OoMCWA= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/extension/zpagesextension v0.102.0 h1:BPq98py8nwzaV7KAsxt4ZZAF9LiSRu7ZjHNGavFNyKo= -go.opentelemetry.io/collector/extension/zpagesextension v0.102.0/go.mod h1:P86HW3x3epDS5F4yP0gAvsZiw4xxP1OupTEx2o6UqjY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/filter v0.102.0 h1:2K4Q/l4b+tglMAQmxpscuCr/juyozyPx17Q6Dfm2FwU= -go.opentelemetry.io/collector/filter v0.102.0/go.mod h1:zDVjFCeeVct7hYwejzx+aRC1dbHaPsvv/Ob1SvCiQjE= -go.opentelemetry.io/collector/otelcol v0.102.0 h1:HuE+ok4iUjOrmYhQBSWpG5kBTVhcA24ljPL4pBERZ5E= -go.opentelemetry.io/collector/otelcol v0.102.0/go.mod h1:w8pCRu2nM/jAkLlEAS6ccKtJv5ylUQe6Ugl98zzTfyE= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/processor v0.102.0 h1:JsjTlpBRmoSYxcu3cAbKBchOmL6aNUxLa03ZkWIqZr8= -go.opentelemetry.io/collector/processor v0.102.0/go.mod h1:IaCSDcfy75uQTaOM+LgR1bMf/bUw2eFfzn20uvWYfLQ= -go.opentelemetry.io/collector/processor/batchprocessor v0.102.0 h1:lJSIMwip+Po5jOF/4dpx6c/3N45KJTr/UZoT086T4mI= -go.opentelemetry.io/collector/processor/batchprocessor v0.102.0/go.mod h1:e71Y6SnrCjD19dPjxWWi/kXa5tb0J8rC+9xl/72mLo4= -go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.102.0 h1:osoITPX0RITC8gJkyaNC6rqSKFl9wCeOqagjdNZUL70= -go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.102.0/go.mod h1:2OVM2IJOWVdxkOOt0WCyQSMv2T19OSKNIy1KCqHGXyY= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0 h1:eLc+AK0IQDDysrMt3SLwKaOFIjEwdO8ipwSck3+TUXE= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0/go.mod h1:p9yeFJktNrpwV9ATvaWeZwCMvVkVWnrfbJ4RHI/RS/I= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/collector/service v0.102.0 h1:B5nfyQZF7eB/y+yucl9G/7VsusbXixYXWingXn7VszM= -go.opentelemetry.io/collector/service v0.102.0/go.mod h1:c+0n0DfQeCjgrdplNHYwYbG/5aupTZVYU/50nMQraoc= -go.opentelemetry.io/contrib/config v0.7.0 h1:b1rK5tGTuhhPirJiMxOcyQfZs76j2VapY6ODn3b2Dbs= -go.opentelemetry.io/contrib/config v0.7.0/go.mod h1:8tdiFd8N5etOi3XzBmAoMxplEzI3TcL8dU5rM5/xcOQ= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 h1:vS1Ao/R55RNV4O7TA2Qopok8yN+X0LIP6RVWLFkprck= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0/go.mod h1:BMsdeOxN04K0L5FNUBfjFdvwWGNe/rkmSwH4Aelu/X0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/contrib/propagators/b3 v1.27.0 h1:IjgxbomVrV9za6bRi8fWCNXENs0co37SZedQilP2hm0= -go.opentelemetry.io/contrib/propagators/b3 v1.27.0/go.mod h1:Dv9obQz25lCisDvvs4dy28UPh974CxkahRDUPsY7y9E= -go.opentelemetry.io/contrib/zpages v0.52.0 h1:MPgkMy0Cp3O5EdfVXP0ss3ujhEibysTM4eszx7E7d+E= -go.opentelemetry.io/contrib/zpages v0.52.0/go.mod h1:fqG5AFdoYru3A3DnhibVuaaEfQV2WKxE7fYE1jgDRwk= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/bridge/opencensus v1.27.0 h1:ao9aGGHd+G4YfjBpGs6vbkvt5hoC67STlJA9fCnOAcs= -go.opentelemetry.io/otel/bridge/opencensus v1.27.0/go.mod h1:uRvWtAAXzyVOST0WMPX5JHGBaAvBws+2F8PcC5gMnTk= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 h1:bFgvUr3/O4PHj3VQcFEuYKvRZJX1SJDQ+11JXuSB3/w= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0/go.mod h1:xJntEd2KL6Qdg5lwp97HMLQDVeAhrYxmzFseAMDPQ8I= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 h1:CIHWikMsN3wO+wq1Tp5VGdVRTcON+DmOJSfDjXypKOc= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0/go.mod h1:TNupZ6cxqyFEpLXAZW7On+mLFL0/g0TE3unIYL91xWc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0 h1:/jlt1Y8gXWiHG9FBx6cJaIC5hYx5Fe64nC8w5Cylt/0= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0/go.mod h1:bmToOGOBZ4hA9ghphIc1PAf66VA8KOtsuy3+ScStG20= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 h1:/0YaXu3755A/cFbtXp+21lkXgI0QE5avTWA2HjU9/WE= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0/go.mod h1:m7SFxp0/7IxmJPLIY3JhOcU9CoFzDaCPL6xxQIxhA+o= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= -go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= -go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= +go.opentelemetry.io/collector v0.116.0 h1:Dscd6Nsnc7hjFQosO0SofcPQsXRfcj5N5PjQAslnmj4= +go.opentelemetry.io/collector v0.116.0/go.mod h1:Ug2hpW0SINPmJAGVEALRlux78NTZc3YXSuh5/Q/hFrA= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/configgrpc v0.116.0 h1:O8Y1X9wDH5dDdqDJ9kqoaMrxEauaDSJBg9aNC6QgB7g= +go.opentelemetry.io/collector/config/configgrpc v0.116.0/go.mod h1:RPrSQrr6xhIaAK2DdcECi142NjSo0npQfVQB3nommSo= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/confignet v1.22.0 h1:SBEMHJZWD8J4qgFw1O+BEkXW9AWldDi6Fz5YeDeoU58= +go.opentelemetry.io/collector/config/confignet v1.22.0/go.mod h1:ZppUH1hgUJOubawEsxsQ9MzEYFytqo2GnVSS7d4CVxc= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0 h1:AdHaQo/GSSRLJvEFLCMHo02r+u6Ed8j0/MNz7u3noug= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0/go.mod h1:InKYEGFdkwz3H2q648kT6rMCFBhPvevIW9ZbWIY5QR4= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0 h1:upFhnU8EyPp0WMR53mJIdx+UR2EGFOr+ppYKzUCY/Vg= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0/go.mod h1:FhjMWU5nf3IctX27lVZomM5SKMyRywShRsA4/rHoBe8= +go.opentelemetry.io/collector/confmap/provider/httpprovider v1.22.0 h1:jKLicfZRiA+G/sgso26aM6Dmmva4Dx9Txk2R58+R3e8= +go.opentelemetry.io/collector/confmap/provider/httpprovider v1.22.0/go.mod h1:nZhEGDufHuZAaeVyFVz15IluXwrnQRCp+U/w7j8Lx9Y= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.22.0 h1:dkiNwLxBqeNDN5fIwtvr2GoA0I2xZB2SEdQ9ceBbJVs= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.22.0/go.mod h1:P9SxKZvim1C3K1R2j3gI+Qb4/l9MffX2sY5f9ajsk7Y= +go.opentelemetry.io/collector/connector v0.116.0 h1:0Pz8RAXH1swLeA1fiyGGQWdv0Kemz4mbq+jnmd1TACE= +go.opentelemetry.io/collector/connector v0.116.0/go.mod h1:VQiZ2yW9KhZuF0yjDbvlgrAxm7+o8KQoxHxurQWLjKU= +go.opentelemetry.io/collector/connector/connectortest v0.116.0 h1:MdttvjqdZmp0ewW5IPCEtzzYmCqxrQxsjJ5m6gMVjzA= +go.opentelemetry.io/collector/connector/connectortest v0.116.0/go.mod h1:ko7aPyvAVf6SvRhWGZdPXSyk+7zPmsSCcMq0gYPMMIQ= +go.opentelemetry.io/collector/connector/xconnector v0.116.0 h1:fFJzrRco0g7HMkhnQ+ehlvicFf58vzsCLXnfuHyQM8w= +go.opentelemetry.io/collector/connector/xconnector v0.116.0/go.mod h1:m9oCk32zX6wDciYBpy+qMQkWKtOxb0gAkEUm8+trflY= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.116.0 h1:sSPDz4Qu7H86SrxtE6sQHDuWjFkTWHdKyGdsxhjZzcw= +go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.116.0/go.mod h1:0K7jbkCWtydn1IA3JwAUJeLVL79tJTxWoXR2gYTnCk0= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/debugexporter v0.116.0 h1:NCVGIkaA0eSDZPg0/NdWt7ivUmVukPVEixBDTulMa08= +go.opentelemetry.io/collector/exporter/debugexporter v0.116.0/go.mod h1:QZL/MKrgErI7O64ams2lmsQduLOkw/SLmtvS7W+iQNo= +go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.116.0 h1:BzMvZf9RKRcQPFjGnQSEWvfI5Er9kXfzyZ/4GHkUTa4= +go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.116.0/go.mod h1:RCbA3MNnZPTy2mViwQxMlnrq5moJ1XgetNQx2XHIpaI= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0 h1:bXDgoiDiwFfrO5S6q1Wpe0su303CW4Qxthoy4CxG6eg= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0/go.mod h1:uFZlAPxk2+s6zk1W+u22DgxxSDugWy0QaY5kQzjNy7Q= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/extension/zpagesextension v0.116.0 h1:D0VY/ESPwkREfMaqJleGVTiCYoCs3MDipU93ywaIn68= +go.opentelemetry.io/collector/extension/zpagesextension v0.116.0/go.mod h1:MqkQSYKarMrjVSyGrAes1FBcsW6HDDPj/ouvcDvSjfk= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/filter v0.116.0 h1:pvN3W2JIEHxWbCLlUS1HxrRo3ZQrN4BiWyLvPFyKfvQ= +go.opentelemetry.io/collector/filter v0.116.0/go.mod h1:GoLxnSI6uE6QzmGOaiz0mkgirbQpj2A2Nb18bTKv5gI= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 h1:KKFb3u8iLk4V5GYz7eVpw8QgEdob5koX6GNEbaoDQJY= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0/go.mod h1:YyWHUWeSnRmy2CF7kPHpwJ6qkVjufbLZ8PYuY0Ph0o8= +go.opentelemetry.io/collector/internal/memorylimiter v0.116.0 h1:xLt/2jPHvaWQiNle66DsTz3kRbWoQ93AEMfSeKyCdN0= +go.opentelemetry.io/collector/internal/memorylimiter v0.116.0/go.mod h1:12KU4unWjF3nxrpOuuTi4TGK3KaD+kzmgA2Vd86MhWU= +go.opentelemetry.io/collector/internal/sharedcomponent v0.116.0 h1:5QhpnwgogQhBrcsOjk1Yhkugopj043XlSDB1lpHKCGo= +go.opentelemetry.io/collector/internal/sharedcomponent v0.116.0/go.mod h1:wMQM1Sqbj6J6jNVBb5hawkCfmqrLJ0hAeDKkalUfrEY= +go.opentelemetry.io/collector/otelcol v0.116.0 h1:8NoPEY2uAemwNzUcMxiZuuI8w/Ff+0p1DXXk6NVEGlk= +go.opentelemetry.io/collector/otelcol v0.116.0/go.mod h1:c/EhsBdHmC44SxhWMi7pTlYB+I6GBSJNBsj9NCwXMxM= +go.opentelemetry.io/collector/otelcol/otelcoltest v0.116.0 h1:ZNg2kFLKnreaGSMfbr74k1yEbHLxG4ZbVvSIr+XleXo= +go.opentelemetry.io/collector/otelcol/otelcoltest v0.116.0/go.mod h1:TruQJSWWiDRlSYZTcLSE0GeECJZALDw8X8dvoYXUJ+A= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/pipeline/pipelineprofiles v0.116.0 h1:vRdnwIU40bYtxntVOmxg4Bhrh9QVKtx5wwlxK21rc1s= +go.opentelemetry.io/collector/pipeline/pipelineprofiles v0.116.0/go.mod h1:KxDMUOfbVy8lzZ85CZEG3gCJEYMyWiBKdN+HWUwQWTM= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 h1:PFNy+Il/kqPdPL9rhG+1kG63Aauya+FhBKGXoB6ivxU= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0/go.mod h1:bVn9V4TGyeXi58/JDkeXCuKtc+V+qcOoTl8hNpV0qa8= +go.opentelemetry.io/collector/processor v0.116.0 h1:Kyu4tPzTdWNHtZjcxvI/bGNAgyv8L8Kem2r/Mk4IDAw= +go.opentelemetry.io/collector/processor v0.116.0/go.mod h1:+/Ugy48RAxlZEXmN2cw51W8t5wdHS9No+GAoP+moskk= +go.opentelemetry.io/collector/processor/batchprocessor v0.116.0 h1:jZMC+jlay3xCBBjcL85oT8nMFB5B3zvvwS6lW6xVGAc= +go.opentelemetry.io/collector/processor/batchprocessor v0.116.0/go.mod h1:KmLVhDjnatsZm5xQkgRLl12lwvHohmk3djJXfu8m33c= +go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.116.0 h1:7YwVMfpr0igtILydBFDXJsEGskI/4FIKPqc0hGIjJIE= +go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.116.0/go.mod h1:nMEGCezCKUedDmxTLNL9cpFUhG2ku8ThNn7t/wfKWI0= +go.opentelemetry.io/collector/processor/processorhelper/xprocessorhelper v0.116.0 h1:1tIEJSN3HeCY602B5h2b1K6ocNn/HMNC2E+u7o3ceZA= +go.opentelemetry.io/collector/processor/processorhelper/xprocessorhelper v0.116.0/go.mod h1:r8oKp+HrgZDp4L6RiNYoEk3x+LMrt9lEiCW6WiaYuJM= +go.opentelemetry.io/collector/processor/processortest v0.116.0 h1:+IqNEVEE0E2MsO2g7+Y/9dz35sDuvAXRXrLts9NdXrA= +go.opentelemetry.io/collector/processor/processortest v0.116.0/go.mod h1:DLaQDBxzgeeaUO0ULMn/efos9PmHZkmYCHuxwCsiVHI= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0 h1:iin/UwuWvSLB7ZNfINFUYbZ5lxIi1NjZ2brkyyFdiRA= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0/go.mod h1:cnA43/XpKDbaOmd8buqKp/LGJ2l/OoCqbR//u5DMfn8= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.116.0 h1:81u+wJsQp9VfrAdVpVvcV31YAs8qsZp/UnMmG9YCJ0A= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.116.0/go.mod h1:JXIwjUyh3Q+gNvr7YE937se4/E4UJ/oz5z9xbJeVl3M= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/scraper v0.116.0 h1:Gdg3v/QUZobHcAAewOlwlaE4XlkRQl3FFut906XuCiw= +go.opentelemetry.io/collector/scraper v0.116.0/go.mod h1:G4SmTIPG8RbxVhTF3zj4EFJx+1tceZbZxhS6mtXOeg0= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/collector/service v0.116.0 h1:1rFmax3ILOlQq4bW//0VKRcG/HmN2rxrgfTybn6bisU= +go.opentelemetry.io/collector/service v0.116.0/go.mod h1:CzQzj72mWr5arag+q8uUWGRuUkenNo5Gw9oA97SFZ78= +go.opentelemetry.io/contrib/bridges/otelzap v0.6.0 h1:j8icMXyyqNf6HGuwlYhniPnVsbJIq7n+WirDu3VAJdQ= +go.opentelemetry.io/contrib/bridges/otelzap v0.6.0/go.mod h1:evIOZpl+kAlU5IsaYX2Siw+IbpacAZvXemVsgt70uvw= +go.opentelemetry.io/contrib/config v0.10.0 h1:2JknAzMaYjxrHkTnZh3eOme/Y2P5eHE2SWfhfV6Xd6c= +go.opentelemetry.io/contrib/config v0.10.0/go.mod h1:aND2M6/KfNkntI5cyvHriR/zvZgPf8j9yETdSmvpfmc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 h1:yMkBS9yViCc7U7yeLzJPM2XizlfdVvBRSmsQDWu6qc0= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0/go.mod h1:n8MR6/liuGB5EmTETUBeU5ZgqMOlqKRxUaqPQBOANZ8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/contrib/propagators/b3 v1.31.0 h1:PQPXYscmwbCp76QDvO4hMngF2j8Bx/OTV86laEl8uqo= +go.opentelemetry.io/contrib/propagators/b3 v1.31.0/go.mod h1:jbqfV8wDdqSDrAYxVpXQnpM0XFMq2FtDesblJ7blOwQ= +go.opentelemetry.io/contrib/zpages v0.56.0 h1:W7vP6s3juzL5KiHpr41zLNmsJ0QAZudYu8ay0zGAoko= +go.opentelemetry.io/contrib/zpages v0.56.0/go.mod h1:IxPRP4TYHw9jLeaEOSDIiA9zmyJNZNO6sbW55iMvSXs= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 h1:mMOmtYie9Fx6TSVzw4W+NTpvoaS1JWWga37oI1a/4qQ= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0/go.mod h1:yy7nDsMMBUkD+jeekJ36ur5f3jJIrmCwUrY67VFhNpA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 h1:j7ZSD+5yn+lo3sGV69nW04rRR0jhYnBwjuX3r0HvnK0= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0/go.mod h1:WXbYJTUaZXAbYd8lbgGuvih0yuCfOFC5RJoYnoLcGz8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 h1:t/Qur3vKSkUCcDVaSumWF2PKHt85pc7fRvFuoVT8qFU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0/go.mod h1:Rl61tySSdcOJWoEgYZVtmnKdA0GeKrSqkHC1t+91CH8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 h1:K0XaT3DwHAcV4nKLzcQvwAgSyisUghWoY20I7huthMk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0/go.mod h1:B5Ki776z/MBnVha1Nzwp5arlzBbE3+1jk+pGmaP5HME= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy03iVTXP6ffeN2iXrxfGsZGCjVx0/4KlizjyBwU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0/go.mod h1:TMu73/k1CP8nBUpDLc71Wj/Kf7ZS9FK5b53VapRsP9o= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 h1:lUsI2TYsQw2r1IASwoROaCnjdj2cvC2+Jbxvk6nHnWU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0/go.mod h1:2HpZxxQurfGxJlJDblybejHB6RX6pmExPNe517hREw4= +go.opentelemetry.io/otel/exporters/prometheus v0.54.0 h1:rFwzp68QMgtzu9PgP3jm9XaMICI6TsofWWPcBDKwlsU= +go.opentelemetry.io/otel/exporters/prometheus v0.54.0/go.mod h1:QyjcV9qDP6VeK5qPyKETvNjmaaEc7+gqjh4SS0ZYzDU= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 h1:TwmL3O3fRR80m8EshBrd8YydEZMcUCsZXzOUlnFohwM= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0/go.mod h1:tH98dDv5KPmPThswbXA0fr0Lwfs+OhK8HgaCo7PjRrk= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 h1:SZmDnHcgp3zwlPBS2JX2urGYe/jBKEIT6ZedHRUyCz8= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0/go.mod h1:fdWW0HtZJ7+jNpTKUR0GpMEDP69nR8YBJQxNiVCE3jk= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 h1:UGZ1QwZWY67Z6BmckTU+9Rxn04m2bD3gD6Mk0OIOCPk= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0/go.mod h1:fcwWuDuaObkkChiDlhEpSq9+X1C0omv+s5mBtToAQ64= +go.opentelemetry.io/otel/log v0.8.0 h1:egZ8vV5atrUWUbnSsHn6vB8R21G2wrKqNiDt3iWertk= +go.opentelemetry.io/otel/log v0.8.0/go.mod h1:M9qvDdUTRCopJcGRKg57+JSQ9LgLBrwwfC32epk5NX8= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/log v0.7.0 h1:dXkeI2S0MLc5g0/AwxTZv6EUEjctiH8aG14Am56NTmQ= +go.opentelemetry.io/otel/sdk/log v0.7.0/go.mod h1:oIRXpW+WD6M8BuGj5rtS0aRu/86cbDV/dAfNaZBIjYM= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/dig v1.17.0 h1:5Chju+tUvcC+N7N6EV08BJz41UZuO3BmHcN4A287ZLI= -go.uber.org/dig v1.17.0/go.mod h1:rTxpf7l5I0eBTlE6/9RL+lDybC7WFwY2QH55ZSjy1mU= -go.uber.org/fx v1.18.2 h1:bUNI6oShr+OVFQeU8cDNbnN7VFsu+SsjHzUF51V/GAU= -go.uber.org/fx v1.18.2/go.mod h1:g0V1KMQ66zIRk8bLu3Ea5Jt2w/cHlOIp4wdRsgh0JaY= +go.uber.org/dig v1.18.0 h1:imUL1UiY0Mg4bqbFfsRQO5G4CGRBec/ZujWTvSVp3pw= +go.uber.org/dig v1.18.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= +go.uber.org/fx v1.22.2 h1:iPW+OPxv0G8w75OemJ1RAnTUrF55zOJlXlo1TbJ0Buw= +go.uber.org/fx v1.22.2/go.mod h1:o/D9n+2mLP6v1EG+qsdT1O8wKopYAsqZasju97SDFCU= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= @@ -1129,14 +1223,12 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1147,8 +1239,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= +golang.org/x/exp v0.0.0-20241210194714-1829a127f884 h1:Y/Mj/94zIQQGHVSv1tTtQBDaQaJe62U9bkDZKKyhPCU= +golang.org/x/exp v0.0.0-20241210194714-1829a127f884/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1161,7 +1253,6 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -1171,13 +1262,11 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1213,10 +1302,7 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= @@ -1225,23 +1311,20 @@ golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= -golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1255,8 +1338,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1299,19 +1382,15 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1330,12 +1409,10 @@ golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -1343,9 +1420,9 @@ golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuX golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1357,14 +1434,16 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= +golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1414,25 +1493,19 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= -golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8= +golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= -gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= +gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= +gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1449,18 +1522,14 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.169.0 h1:QwWPy71FgMWqJN/l6jVlFHUa29a7dcUy02I8o799nPY= -google.golang.org/api v0.169.0/go.mod h1:gpNOiMA2tZ4mf5R9Iwf4rK/Dcz0fbdIgWYWVoxmsyLg= +google.golang.org/api v0.188.0 h1:51y8fJ/b1AaaBRJr4yWm96fPcuxSo0JcegXE3DaHQHw= +google.golang.org/api v0.188.0/go.mod h1:VR0d+2SIiWOYG3r/jdm7adPW9hI2aRv9ETOSCQ9Beag= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -1493,17 +1562,10 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 h1:P8OJ/WCl/Xo4E4zoe4/bifHpSmmKwARqyqE4nW6J2GQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1518,12 +1580,9 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1535,8 +1594,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1545,6 +1604,8 @@ gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= +gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= @@ -1578,28 +1639,28 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.21.1/go.mod h1:FstGROTmsSHBarKc8bylzXih8BLNYTiS3TZcsoEDg2s= -k8s.io/api v0.29.3 h1:2ORfZ7+bGC3YJqGpV0KSDDEVf8hdGQ6A03/50vj8pmw= -k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80= +k8s.io/api v0.31.3 h1:umzm5o8lFbdN/hIXbrK9oRpOproJO62CV1zqxXrLgk8= +k8s.io/api v0.31.3/go.mod h1:UJrkIp9pnMOI9K2nlL6vwpxRzzEX5sWgn8kGQe92kCE= k8s.io/apimachinery v0.21.1/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY= -k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= -k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= +k8s.io/apimachinery v0.31.3 h1:6l0WhcYgasZ/wk9ktLq5vLaoXJJr5ts6lkaQzgeYPq4= +k8s.io/apimachinery v0.31.3/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= k8s.io/client-go v0.21.1/go.mod h1:/kEw4RgW+3xnBGzvp9IWxKSNA+lXn3A7AuH3gdOAzLs= -k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg= -k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= +k8s.io/client-go v0.31.3 h1:CAlZuM+PH2cm+86LOBemaJI/lQ5linJ6UFxKX/SoG+4= +k8s.io/client-go v0.31.3/go.mod h1:2CgjPUTpv3fE5dNygAr2NcM8nhHzXvxB8KL5gYc3kJs= k8s.io/code-generator v0.21.1/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= -k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= 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= @@ -1610,5 +1671,5 @@ sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/exporter/datadogexporter/hostmetadata.go b/exporter/datadogexporter/hostmetadata.go index 1338bed2fb54..ead1696a4498 100644 --- a/exporter/datadogexporter/hostmetadata.go +++ b/exporter/datadogexporter/hostmetadata.go @@ -18,5 +18,6 @@ func newMetadataConfigfromConfig(cfg *Config) hostmetadata.PusherConfig { InsecureSkipVerify: cfg.TLSSetting.InsecureSkipVerify, ClientConfig: cfg.ClientConfig, RetrySettings: cfg.BackOffConfig, + ReporterPeriod: cfg.HostMetadata.ReporterPeriod, } } diff --git a/exporter/datadogexporter/integrationtest/go.mod b/exporter/datadogexporter/integrationtest/go.mod index c1d765429bc5..e2735a3e9070 100644 --- a/exporter/datadogexporter/integrationtest/go.mod +++ b/exporter/datadogexporter/integrationtest/go.mod @@ -1,104 +1,133 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/integrationtest -go 1.21.0 +go 1.22.0 require ( - github.com/DataDog/datadog-agent/pkg/proto v0.54.0-rc.5 - github.com/open-telemetry/opentelemetry-collector-contrib/connector/datadogconnector v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.102.0 - github.com/stretchr/testify v1.9.0 - github.com/tinylib/msgp v1.1.9 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0 - go.opentelemetry.io/collector/connector v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/exporter/debugexporter v0.102.0 - go.opentelemetry.io/collector/otelcol v0.102.0 - go.opentelemetry.io/collector/processor v0.102.0 - go.opentelemetry.io/collector/processor/batchprocessor v0.102.0 - go.opentelemetry.io/collector/receiver v0.102.0 - go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0 - go.opentelemetry.io/otel v1.27.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 - go.opentelemetry.io/otel/sdk v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 - google.golang.org/protobuf v1.34.1 + github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.57.0-devel.0.20240718200853-81bf3b2e412d + github.com/DataDog/datadog-agent/pkg/proto v0.59.0 + github.com/open-telemetry/opentelemetry-collector-contrib/connector/datadogconnector v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.116.0 + github.com/stretchr/testify v1.10.0 + github.com/tinylib/msgp v1.2.5 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0 + go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0 + go.opentelemetry.io/collector/connector v0.116.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/debugexporter v0.116.0 + go.opentelemetry.io/collector/featuregate v1.22.0 + go.opentelemetry.io/collector/otelcol v0.116.0 + go.opentelemetry.io/collector/otelcol/otelcoltest v0.116.0 + go.opentelemetry.io/collector/processor v0.116.0 + go.opentelemetry.io/collector/processor/batchprocessor v0.116.0 + go.opentelemetry.io/collector/receiver v0.116.0 + go.opentelemetry.io/collector/receiver/otlpreceiver v0.116.0 + go.opentelemetry.io/otel v1.32.0 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 + go.opentelemetry.io/otel/sdk v1.32.0 + go.opentelemetry.io/otel/sdk/log v0.8.0 + go.opentelemetry.io/otel/trace v1.32.0 + google.golang.org/protobuf v1.35.2 ) require ( - cloud.google.com/go/compute/metadata v0.3.0 // indirect - github.com/DataDog/agent-payload/v5 v5.0.119 // indirect - github.com/DataDog/datadog-agent/comp/core/config v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/core/hostname/hostnameinterface v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/core/log v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/core/secrets v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/core/telemetry v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/def v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/logs/agent/config v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline/logsagentpipelineimpl v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/exporter/logsagentexporter v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/metricsclient v0.0.0-20240525065430-d0b647bcb646 // indirect - github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/statsprocessor v0.0.0-20240525065430-d0b647bcb646 // indirect - github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/config/env v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/config/model v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/config/setup v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/config/utils v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/auditor v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/client v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/diagnostic v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/message v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/metrics v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/pipeline v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/processor v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/sds v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/sender v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/sources v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/status/statusinterface v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/status/utils v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/obfuscate v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/status/health v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/telemetry v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/trace v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/backoff v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/cgroups v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/executable v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/filesystem v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/fxutil v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/http v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/log v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/optional v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/pointer v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/scrubber v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/startstop v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/statstracker v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/system v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/system/socket v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/winutil v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/version v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-api-client-go/v2 v2.26.0 // indirect + cloud.google.com/go/auth v0.7.0 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.2 // indirect + cloud.google.com/go/compute/metadata v0.5.2 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect + github.com/Code-Hex/go-generics-cache v1.5.1 // indirect + github.com/DataDog/agent-payload/v5 v5.0.137 // indirect + github.com/DataDog/datadog-agent/comp/core/config v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/core/flare/builder v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/core/flare/types v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/core/hostname/hostnameinterface v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/core/log v0.56.2 // indirect + github.com/DataDog/datadog-agent/comp/core/log/def v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/core/secrets v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/core/telemetry v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/def v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/logs/agent/config v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline/logsagentpipelineimpl v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/exporter/logsagentexporter v0.62.0-devel.0.20241213165407-f95df913d2b7 // indirect + github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/metricsclient v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/statsprocessor v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/trace/compression/def v0.59.0 // indirect + github.com/DataDog/datadog-agent/comp/trace/compression/impl-gzip v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/config/env v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/config/mock v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/config/model v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/config/nodetreemodel v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/config/setup v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/config/structure v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/config/teeconfig v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/config/utils v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/auditor v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/client v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/diagnostic v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/message v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/metrics v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/pipeline v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/processor v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/sds v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/sender v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/sources v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/status/statusinterface v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/logs/status/utils v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/status/health v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/telemetry v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/backoff v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/cgroups v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/executable v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/filesystem v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/fxutil v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/http v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.59.1 // indirect + github.com/DataDog/datadog-agent/pkg/util/optional v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/pointer v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.59.1 // indirect + github.com/DataDog/datadog-agent/pkg/util/startstop v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/statstracker v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/system v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/system/socket v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/winutil v0.59.1 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.59.1 // indirect + github.com/DataDog/datadog-api-client-go/v2 v2.33.0 // indirect github.com/DataDog/datadog-go/v5 v5.5.0 // indirect - github.com/DataDog/dd-sensitive-data-scanner/sds-go/go v0.0.0-20240419161837-f1b2f553edfe // indirect - github.com/DataDog/go-sqllexer v0.0.9 // indirect + github.com/DataDog/dd-sensitive-data-scanner/sds-go/go v0.0.0-20240816154533-f7f9beb53a42 // indirect + github.com/DataDog/go-sqllexer v0.0.15 // indirect github.com/DataDog/go-tuf v1.1.0-0.5.2 // indirect github.com/DataDog/gohai v0.0.0-20230524154621-4316413895ee // indirect - github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata v0.16.1 // indirect - github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.16.1 // indirect - github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/logs v0.16.1 // indirect - github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics v0.16.1 // indirect - github.com/DataDog/opentelemetry-mapping-go/pkg/quantile v0.16.1 // indirect - github.com/DataDog/sketches-go v1.4.5 // indirect - github.com/DataDog/viper v1.13.3 // indirect - github.com/DataDog/zstd v1.5.2 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.23.0 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata v0.22.0 // indirect + github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.22.0 // indirect + github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/logs v0.22.0 // indirect + github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics v0.22.0 // indirect + github.com/DataDog/opentelemetry-mapping-go/pkg/quantile v0.22.0 // indirect + github.com/DataDog/sketches-go v1.4.6 // indirect + github.com/DataDog/viper v1.14.0 // indirect + github.com/DataDog/zstd v1.5.6 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/alecthomas/participle/v2 v2.1.1 // indirect - github.com/aws/aws-sdk-go v1.53.11 // indirect + github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 // indirect + github.com/antchfx/xmlquery v1.4.2 // indirect + github.com/antchfx/xpath v1.3.2 // indirect + github.com/armon/go-metrics v0.4.1 // indirect + github.com/aws/aws-sdk-go v1.55.5 // indirect github.com/benbjohnson/clock v1.3.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/briandowns/spinner v1.23.0 // indirect @@ -106,174 +135,261 @@ require ( github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 // indirect github.com/containerd/cgroups/v3 v3.0.3 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dennwc/varint v1.0.0 // indirect + github.com/digitalocean/godo v1.118.0 // indirect + github.com/distribution/reference v0.6.0 // indirect + github.com/docker/docker v27.4.0+incompatible // indirect + github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.1 // indirect + github.com/elastic/go-grok v0.3.1 // indirect + github.com/elastic/lunes v0.1.0 // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect - github.com/fatih/color v1.16.0 // indirect + github.com/envoyproxy/go-control-plane v0.13.0 // indirect + github.com/envoyproxy/protoc-gen-validate v1.1.0 // indirect + github.com/fatih/color v1.18.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/go-kit/log v0.2.1 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-openapi/jsonpointer v0.20.2 // indirect github.com/go-openapi/jsonreference v0.20.4 // indirect github.com/go-openapi/swag v0.22.9 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-resty/resty/v2 v2.13.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/go-zookeeper/zk v1.0.3 // indirect github.com/gobwas/glob v0.2.3 // indirect - github.com/goccy/go-json v0.10.2 // indirect + github.com/goccy/go-json v0.10.4 // indirect github.com/godbus/dbus/v5 v5.0.6 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-jwt/jwt/v5 v5.2.1 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/mock v1.6.0 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.6.0 // indirect + github.com/google/go-querystring v1.1.0 // indirect github.com/google/gofuzz v1.2.0 // indirect + github.com/google/s2a-go v0.1.7 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect + github.com/googleapis/gax-go/v2 v2.12.5 // indirect + github.com/gophercloud/gophercloud v1.13.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 // indirect + github.com/hashicorp/consul/api v1.30.0 // indirect + github.com/hashicorp/cronexpr v1.1.2 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-hclog v1.6.3 // indirect + github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-retryablehttp v0.7.7 // indirect + github.com/hashicorp/go-rootcerts v1.0.2 // indirect github.com/hashicorp/go-version v1.7.0 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect + github.com/hashicorp/hcl v1.0.1-vault-5 // indirect + github.com/hashicorp/nomad/api v0.0.0-20240717122358-3d93bd3778f3 // indirect + github.com/hashicorp/serf v0.10.1 // indirect github.com/hectane/go-acl v0.0.0-20190604041725-da78bae5fc95 // indirect + github.com/hetznercloud/hcloud-go/v2 v2.10.2 // indirect github.com/iancoleman/strcase v0.3.0 // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/ionos-cloud/sdk-go/v6 v6.1.11 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect + github.com/jpillora/backoff v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect github.com/karrick/godirwalk v1.17.0 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect + github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b // indirect + github.com/kylelemons/godebug v1.1.0 // indirect + github.com/linode/linodego v1.37.0 // indirect github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c // indirect + github.com/magefile/mage v1.15.0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect + github.com/miekg/dns v1.1.61 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect - github.com/mostynb/go-grpc-compression v1.2.2 // indirect + github.com/mostynb/go-grpc-compression v1.2.3 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/ecsutil v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.102.0 // indirect + github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/ecsutil v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/datadog v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.116.0 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.1.0 // indirect github.com/opencontainers/runtime-spec v1.1.0-rc.3 // indirect github.com/openshift/api v3.9.0+incompatible // indirect github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142 // indirect github.com/outcaste-io/ristretto v0.2.1 // indirect + github.com/ovh/go-ovh v1.6.0 // indirect github.com/patrickmn/go-cache v2.1.0+incompatible // indirect - github.com/pelletier/go-toml v1.2.0 // indirect - github.com/philhofer/fwd v1.1.2 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect + github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c // indirect - github.com/prometheus/client_golang v1.19.1 // indirect + github.com/prometheus/client_golang v1.20.5 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/rs/cors v1.10.1 // indirect + github.com/prometheus/common v0.61.0 // indirect + github.com/prometheus/common/sigv4 v0.1.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/prometheus/prometheus v0.54.1 // indirect + github.com/rs/cors v1.11.1 // indirect + github.com/scaleway/scaleway-sdk-go v1.0.0-beta.29 // indirect github.com/secure-systems-lab/go-securesystemslib v0.7.0 // indirect - github.com/shirou/gopsutil/v3 v3.24.4 // indirect + github.com/shirou/gopsutil/v3 v3.24.5 // indirect + github.com/shirou/gopsutil/v4 v4.24.11 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect - github.com/spf13/afero v1.10.0 // indirect - github.com/spf13/cast v1.5.1 // indirect - github.com/spf13/cobra v1.8.0 // indirect - github.com/spf13/jwalterweatherman v1.0.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.7.0 // indirect + github.com/spf13/cobra v1.8.1 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stormcat24/protodep v0.1.8 // indirect github.com/stretchr/objx v0.5.2 // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect + github.com/tklauser/go-sysconf v0.3.14 // indirect + github.com/tklauser/numcpus v0.8.0 // indirect + github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 // indirect + github.com/vultr/govultr/v2 v2.17.2 // indirect + github.com/x448/float16 v0.8.4 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/configgrpc v0.102.0 // indirect - go.opentelemetry.io/collector/config/confighttp v0.102.0 // indirect - go.opentelemetry.io/collector/config/confignet v0.102.0 // indirect - go.opentelemetry.io/collector/config/configopaque v1.9.0 // indirect - go.opentelemetry.io/collector/config/configretry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0 // indirect - go.opentelemetry.io/collector/consumer v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/collector/pdata/testdata v0.102.0 // indirect - go.opentelemetry.io/collector/semconv v0.102.0 // indirect - go.opentelemetry.io/collector/service v0.102.0 // indirect - go.opentelemetry.io/contrib/config v0.7.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/contrib/propagators/b3 v1.27.0 // indirect - go.opentelemetry.io/otel/bridge/opencensus v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 // indirect - go.opentelemetry.io/otel/metric v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - go.opentelemetry.io/proto/otlp v1.2.0 // indirect + go.opentelemetry.io/collector v0.116.0 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/component/componentstatus v0.116.0 // indirect + go.opentelemetry.io/collector/component/componenttest v0.116.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/configgrpc v0.116.0 // indirect + go.opentelemetry.io/collector/config/confighttp v0.116.0 // indirect + go.opentelemetry.io/collector/config/confignet v1.22.0 // indirect + go.opentelemetry.io/collector/config/configopaque v1.22.0 // indirect + go.opentelemetry.io/collector/config/configretry v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/configtls v1.22.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/confmap/provider/httpprovider v1.22.0 // indirect + go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.22.0 // indirect + go.opentelemetry.io/collector/connector/connectortest v0.116.0 // indirect + go.opentelemetry.io/collector/connector/xconnector v0.116.0 // indirect + go.opentelemetry.io/collector/consumer v1.22.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0 // indirect + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 // indirect + go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/internal/sharedcomponent v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/testdata v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 // indirect + go.opentelemetry.io/collector/processor/processortest v0.116.0 // indirect + go.opentelemetry.io/collector/processor/xprocessor v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/collector/semconv v0.116.0 // indirect + go.opentelemetry.io/collector/service v0.116.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.6.0 // indirect + go.opentelemetry.io/contrib/config v0.10.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/contrib/propagators/b3 v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.54.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 // indirect + go.opentelemetry.io/otel/log v0.8.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/atomic v1.11.0 // indirect - go.uber.org/dig v1.17.0 // indirect - go.uber.org/fx v1.18.2 // indirect + go.uber.org/dig v1.18.0 // indirect + go.uber.org/fx v1.22.2 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/mod v0.17.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/oauth2 v0.20.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/term v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.21.0 // indirect - gonum.org/v1/gonum v0.15.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/exp v0.0.0-20241210194714-1829a127f884 // indirect + golang.org/x/mod v0.22.0 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/oauth2 v0.24.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect + golang.org/x/time v0.6.0 // indirect + golang.org/x/tools v0.28.0 // indirect + gonum.org/v1/gonum v0.15.1 // indirect + google.golang.org/api v0.188.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/grpc v1.68.1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gopkg.in/zorkian/go-datadog-api.v2 v2.30.0 // indirect - k8s.io/api v0.29.3 // indirect - k8s.io/apimachinery v0.29.3 // indirect - k8s.io/client-go v0.29.3 // indirect - k8s.io/klog/v2 v2.120.1 // indirect - k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect - k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + k8s.io/api v0.31.3 // indirect + k8s.io/apimachinery v0.31.3 // indirect + k8s.io/client-go v0.31.3 // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect + k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig => ../../../internal/k8sconfig @@ -318,9 +434,6 @@ exclude github.com/DataDog/agent-payload/v5 v5.0.59 // openshift removed all tags from their repo, use the pseudoversion from the release-3.9 branch HEAD replace github.com/openshift/api v3.9.0+incompatible => github.com/openshift/api v0.0.0-20180801171038-322a19404e37 -// It appears that the v0.2.0 tag was modified. Replacing with v0.2.1 -replace github.com/outcaste-io/ristretto v0.2.0 => github.com/outcaste-io/ristretto v0.2.1 - replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest => ../../../pkg/pdatatest replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8stest => ../../../internal/k8stest @@ -344,3 +457,9 @@ replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prome replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor => ../../../processor/transformprocessor replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling => ../../../pkg/sampling + +replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil => ../../../internal/pdatautil + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata => ../../../pkg/experimentalmetricmetadata + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/datadog => ../../../pkg/datadog/ diff --git a/exporter/datadogexporter/integrationtest/go.sum b/exporter/datadogexporter/integrationtest/go.sum index 7bd132ea35e7..206c395f5630 100644 --- a/exporter/datadogexporter/integrationtest/go.sum +++ b/exporter/datadogexporter/integrationtest/go.sum @@ -3,7 +3,6 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= @@ -14,17 +13,18 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go/auth v0.7.0 h1:kf/x9B3WTbBUHkC+1VS8wwwli9TzhSt0vSTVBmMR8Ts= +cloud.google.com/go/auth v0.7.0/go.mod h1:D+WqdrpcjmiCgWrXmLLxOVq1GACoE36chW6KXoEvuIw= +cloud.google.com/go/auth/oauth2adapt v0.2.2 h1:+TTV8aXpjeChS9M+aTtN/TjdQnzJvmzKFt//oWu7HX4= +cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= -cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo= +cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= @@ -36,18 +36,23 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.10.0 h1:n1DH8TPV4qqPTje2RcUBYwtrTWlabVp4n46+74X2pn4= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.10.0/go.mod h1:HDcZnuGbiyppErN6lB+idp4CKhjbc8gwjto6OPpyggM= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1 h1:sO0/P7g68FrryJzljemN+6GTssUXdANk6aJ7T1ZxnsQ= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1/go.mod h1:h8hyGFDsU5HMivxiS2iYFZsgDbU9OnnJ163x5UGVKYo= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 h1:LqbJ/WzJUwBf8UiaSzgX7aMclParm9/5Vgp+TY51uBQ= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2/go.mod h1:yInRyqWXAuaPrgI7p70+lDDgh3mlBohis29jGMISnmc= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.5.0 h1:MxA59PGoCFb+vCwRQi3PhQEwHj4+r2dhuv9HG+vM7iM= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.5.0/go.mod h1:uYt4CfhkJA9o0FN7jfE5minm/i4nUE4MjGUJkzB6Zs8= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0 h1:GJHeeA2N7xrG3q30L2UXDyuWRzDM900/65j70wcM4Ww= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0/go.mod h1:l38EPgmsp71HHLq9j7De57JcKOWPyhrsW1Awm1JS6K0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0 h1:LkHbJbgF3YyvC53aqYGR+wWQDn2Rdp9AQdGndf9QvY4= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0/go.mod h1:QyiQdW4f4/BIfB8ZutZ2s+28RAgfa/pT+zS++ZHyM1I= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0 h1:PTFGRSlMKCQelWwxUyYVEUqseBJVemLyqWJjvMyt0do= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0/go.mod h1:LRr2FzBTQlONPPa5HREE5+RjSCTXl7BwOvYOaWTqCaI= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 h1:bXwSugBiSbgtz7rOtbfGf+woewp4f06orW9OP5BjHLA= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0/go.mod h1:Y/HgrePTmGy9HjdSGTqZNa+apUpTVIEVKXJyARP2lrk= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.1.1 h1:7CBQ+Ei8SP2c6ydQTGCCrS35bDxgTMfoP2miAwK++OU= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.1.1/go.mod h1:c/wcGeGx5FUPbM/JltUYHZcKmigwyVLJlDq+4HdtXaw= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= @@ -55,167 +60,188 @@ github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSY github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 h1:DzHpqpoJVaCgOUdVHxE8QB52S6NiVdDQvGlny1qvPqA= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Code-Hex/go-generics-cache v1.3.1 h1:i8rLwyhoyhaerr7JpjtYjJZUcCbWOdiYO3fZXLiEC4g= -github.com/Code-Hex/go-generics-cache v1.3.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4= -github.com/DataDog/agent-payload/v5 v5.0.119 h1:PgeA41P3BE4z+b0j61B6yXnZDw7tB7bxl5EIHyGVG14= -github.com/DataDog/agent-payload/v5 v5.0.119/go.mod h1:FgVQKmVdqdmZTbxIptqJC/l+xEzdiXsaAOs/vGAvWzs= -github.com/DataDog/datadog-agent/cmd/agent/common/path v0.54.0-rc.5 h1:nLwtiYCoD+yb4HfhcJ3hmD9pczYLveOJexH5OHVQWsk= -github.com/DataDog/datadog-agent/cmd/agent/common/path v0.54.0-rc.5/go.mod h1:wJQkyIKR2epsYERgVRrO55fgda+oS5ZyBy2neJFXXGM= -github.com/DataDog/datadog-agent/comp/core/config v0.54.0-rc.5 h1:DKefO1N2aGtsUWRxyziQh3cHS3LuqdFjd+QmHR/qLNk= -github.com/DataDog/datadog-agent/comp/core/config v0.54.0-rc.5/go.mod h1:nDpszL8YD58OU/w2uFtN6oHv0cDDZrRNufYgBDtleVw= -github.com/DataDog/datadog-agent/comp/core/flare/types v0.54.0-rc.5 h1:GTYjjIV8YupcNqcNgcAnrNkbofcb6w7JFVdtfv9On9Q= -github.com/DataDog/datadog-agent/comp/core/flare/types v0.54.0-rc.5/go.mod h1:aChd0OV9bB534m+H4IPglCAs441s/1R+Tau5USeSM+Q= -github.com/DataDog/datadog-agent/comp/core/hostname/hostnameinterface v0.54.0-rc.5 h1:yz7efcj2vC0N0bcRwVItXXsFUl4JFgEzsqe3lDhdu7s= -github.com/DataDog/datadog-agent/comp/core/hostname/hostnameinterface v0.54.0-rc.5/go.mod h1:GhQb1d4Z4Z/E/WnUpmtSKADJSwziEIz0jwU0/MvNTic= -github.com/DataDog/datadog-agent/comp/core/log v0.54.0-rc.5 h1:2tvd3K+Bat8hT2jJBpIAfH/8J9k7v+s+IQcoyVVQitU= -github.com/DataDog/datadog-agent/comp/core/log v0.54.0-rc.5/go.mod h1:mtMxZiwg13b4bHgDf8xE6FHgTcadzI5Cc0lx2MSY1mE= -github.com/DataDog/datadog-agent/comp/core/secrets v0.54.0-rc.5 h1:hhkI7EtQwvhrKXO+oNo7V2ZhlSJ2Pt3uj9rOUeVrlSs= -github.com/DataDog/datadog-agent/comp/core/secrets v0.54.0-rc.5/go.mod h1:Bx0rH0jqLkDzQCBeDsgKGmcehYoQjuO6fE8aGjiQe2A= -github.com/DataDog/datadog-agent/comp/core/telemetry v0.54.0-rc.5 h1:v8WyP8srS/5EfD7OKZCm1aRPT56AXaQ2QqQRO2+fwUM= -github.com/DataDog/datadog-agent/comp/core/telemetry v0.54.0-rc.5/go.mod h1:ZpND0xZO2YVm7FNbPOrVoRMbPFhVRbZC40Vb5xsgyQc= -github.com/DataDog/datadog-agent/comp/def v0.54.0-rc.5 h1:pVYCT2SztEIcF03BdbrDgPfT7C/Pc2earv9YB4/2lU0= -github.com/DataDog/datadog-agent/comp/def v0.54.0-rc.5/go.mod h1:ts1c7j9tfa/BaoBH/gdQPt1LTeLeSh0b7IHMqm7ylDE= -github.com/DataDog/datadog-agent/comp/logs/agent/config v0.54.0-rc.5 h1:V4zdArRqhlZWT0tWj8mJE/pDRcAs4IkBC7Y5N+Gjr7U= -github.com/DataDog/datadog-agent/comp/logs/agent/config v0.54.0-rc.5/go.mod h1:88zmScug+KuG8EEuyaf3CAw5idi7XFMDTq66u6UPW4A= -github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline v0.54.0-rc.5 h1:FAZQ6viOK9CiU8x7aW2PJMlI4nq3bmNnOT642ASUxxc= -github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline v0.54.0-rc.5/go.mod h1:c+WZvnTktqP8inoph1/wvxvfLx9rV/cKoR/zvoEpu6E= -github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline/logsagentpipelineimpl v0.54.0-rc.5 h1:dtJiztozoBiltjE0382hAMtDeEfRnEov186xGZ4TGB0= -github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline/logsagentpipelineimpl v0.54.0-rc.5/go.mod h1:yMYGvbt3AAXiXoadUxEbxWl6C3/Ub2t8dn2UG7Y54SM= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/exporter/logsagentexporter v0.54.0-rc.5 h1:5HcA9XYLdI0Z81o5p7SppdVCYjKoshv9GBrqZfeLvC4= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/exporter/logsagentexporter v0.54.0-rc.5/go.mod h1:R2jDIkQpwYzy4AturN73oJB2X32jtivHW9TvdeN7BAQ= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/metricsclient v0.0.0-20240525065430-d0b647bcb646 h1:KeIeWDAjzQxL6/ruBQmFlT/FRstEz11z/UT3LH+8sAA= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/metricsclient v0.0.0-20240525065430-d0b647bcb646/go.mod h1:TIf/0Kb3DAYAtYbhhxmZ72etu+IKSqy66mcIGBuioik= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/statsprocessor v0.0.0-20240525065430-d0b647bcb646 h1:dyGnQr1QVLhwLdKzCTMsDsnYYUOkOXU4JWT2HuS1LJ4= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/statsprocessor v0.0.0-20240525065430-d0b647bcb646/go.mod h1:m7gt1CfJ/8FgnidFPk2lENaxO9m0mOnWWJQylgJkMzw= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.54.0-rc.5 h1:GuGbndVAnhNa6JOtDsDEWXmZFJB0fp4iCnJ3OO1JSks= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.54.0-rc.5/go.mod h1:6ydg+CWz9UlcBkV4pptOdQXTLNc/8YkTqta6VJFGg1M= -github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.54.0-rc.5 h1:YEvetFgYjf3oZsliKn0ddrz1t4ZvOzzlvOxJ100szlI= -github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.54.0-rc.5/go.mod h1:Mpe5lBwTlmLsu1WwIx8uRbj+Bi8+9gW8rWDfXPRwQVQ= -github.com/DataDog/datadog-agent/pkg/config/env v0.54.0-rc.5 h1:D4e5j805YtqmdhSeCXax020Nht6arNUvuvX4AKDMfu8= -github.com/DataDog/datadog-agent/pkg/config/env v0.54.0-rc.5/go.mod h1:9FPuluS8k4LEpfvlz7KQ6iHmqyTVfvuKxhwZkEUeoI4= -github.com/DataDog/datadog-agent/pkg/config/logs v0.54.0-rc.5 h1:xJ6u0OftjMYixmaDlb5yba3T72kyo/rpI7iuOYiAgJE= -github.com/DataDog/datadog-agent/pkg/config/logs v0.54.0-rc.5/go.mod h1:uo77w0taiJfXk3RV4N71t3WmoHhu6wJ782YmGeV6Ynk= -github.com/DataDog/datadog-agent/pkg/config/model v0.54.0-rc.5 h1:6HhxZQzS2edPF9ZevjWtstu6y17lj4a4fsRiTJ3ObHI= -github.com/DataDog/datadog-agent/pkg/config/model v0.54.0-rc.5/go.mod h1:X6U3mq0dErErZUIQx3GMmrO0jdp7aGN656iSDUW8sfw= -github.com/DataDog/datadog-agent/pkg/config/setup v0.54.0-rc.5 h1:+kl+DEK320zyWZBoFzTofgwN0AzUKpJByf8KdJ7WpJQ= -github.com/DataDog/datadog-agent/pkg/config/setup v0.54.0-rc.5/go.mod h1:2qnUs+85QVGqdK4DOpEaox6MKbfKFo3v2MXl9W8zP9Y= -github.com/DataDog/datadog-agent/pkg/config/utils v0.54.0-rc.5 h1:FQmC8qbWoaH4GFzuSuGFtJCR3kleh6xBmQXISiE8/Ho= -github.com/DataDog/datadog-agent/pkg/config/utils v0.54.0-rc.5/go.mod h1:pWPWng1HBqWccXoYJXfmWgpr+pujCpe4XYtGbiH4IOU= -github.com/DataDog/datadog-agent/pkg/logs/auditor v0.54.0-rc.5 h1:dQIi1vw2MaBmrT0kQv0qE5csFecCzaoPGY8m8KTEiqA= -github.com/DataDog/datadog-agent/pkg/logs/auditor v0.54.0-rc.5/go.mod h1:7w1fYTvDKwfk2J08P3vKEieeULSFASfZ0IgCjEoIF2E= -github.com/DataDog/datadog-agent/pkg/logs/client v0.54.0-rc.5 h1:YMYTquLk0uzYxvyRR1ew1QBf5dMtz3b/uBuwQzVODs4= -github.com/DataDog/datadog-agent/pkg/logs/client v0.54.0-rc.5/go.mod h1:YZbEwh9sPrDqxj02BHUHN6ljR+wohaN5QkkTdNZBLxY= -github.com/DataDog/datadog-agent/pkg/logs/diagnostic v0.54.0-rc.5 h1:klt8iysuxBuycyDu6lE51oCcAzZLJpvA7HiAKyQv9GM= -github.com/DataDog/datadog-agent/pkg/logs/diagnostic v0.54.0-rc.5/go.mod h1:93tXt/40ar1666Kk83CDOsb35xhAhQiPSqEH24zZ164= -github.com/DataDog/datadog-agent/pkg/logs/message v0.54.0-rc.5 h1:tX7zHQ6bmLJTfcRTcGY+91VXCZPEY2/OxKlVg/P4Tec= -github.com/DataDog/datadog-agent/pkg/logs/message v0.54.0-rc.5/go.mod h1:SGUmU3Fz/AtmdJvfos5EokpT4CN9YVi50DbYYZX0q4w= -github.com/DataDog/datadog-agent/pkg/logs/metrics v0.54.0-rc.5 h1:tzzzy68wHmQLIrpbJbmo9ZYqm8pHTlWvjUYnQUMBsUU= -github.com/DataDog/datadog-agent/pkg/logs/metrics v0.54.0-rc.5/go.mod h1:vcMlIQfRoHkafZFAHtHrkmeCSQzGpXtE2iyLkaObnUk= -github.com/DataDog/datadog-agent/pkg/logs/pipeline v0.54.0-rc.5 h1:yJ3W4/CQwlEifXz1FDCehvoVvGwaH4LXuJ6A/TbRMdc= -github.com/DataDog/datadog-agent/pkg/logs/pipeline v0.54.0-rc.5/go.mod h1:WsysKMxzTLQHn75WAUwHHw/SyhGQr+m8fYE3iMYl2gA= -github.com/DataDog/datadog-agent/pkg/logs/processor v0.54.0-rc.5 h1:RqKUVfSHrw5D8nRMIhOaAKQThk7pHRbyDVo2CylYtAY= -github.com/DataDog/datadog-agent/pkg/logs/processor v0.54.0-rc.5/go.mod h1:LwAwQKHHSsOC0sspi58vpN2h4tFEI1ZNtU69OUVFBxc= -github.com/DataDog/datadog-agent/pkg/logs/sds v0.54.0-rc.5 h1:u8dgzzSluJx7WMk3J834CxCP7FCo+z0PU9d1vj7K1HU= -github.com/DataDog/datadog-agent/pkg/logs/sds v0.54.0-rc.5/go.mod h1:+octueIX19RzWrarAkKNIAtFTfETavn6Ku4s217EcSY= -github.com/DataDog/datadog-agent/pkg/logs/sender v0.54.0-rc.5 h1:n5UMZvF+5L3XekeS5bkR0adwcOsogIT9uEtq2vHMhtU= -github.com/DataDog/datadog-agent/pkg/logs/sender v0.54.0-rc.5/go.mod h1:dj51DKlSkf10tqsdfuE4NMZaD2PSzau3G8Le8UmXerA= -github.com/DataDog/datadog-agent/pkg/logs/sources v0.54.0-rc.5 h1:wpvvYERlZsBmdoVMIYFxd2XlvSjBh5en06WkKgWRYk4= -github.com/DataDog/datadog-agent/pkg/logs/sources v0.54.0-rc.5/go.mod h1:bBzxEwKqZRKlkizVUViWjGNkjjF58njl+YiZNLxD/ZI= -github.com/DataDog/datadog-agent/pkg/logs/status/statusinterface v0.54.0-rc.5 h1:KuPBZTbwVJqDMa9ATfg0YWpGl3CxgGJcJZzSmsGVNdI= -github.com/DataDog/datadog-agent/pkg/logs/status/statusinterface v0.54.0-rc.5/go.mod h1:xsyGZLKEr6dZaJlC9QWuyYVXqMnHRwZzn641O3bfB98= -github.com/DataDog/datadog-agent/pkg/logs/status/utils v0.54.0-rc.5 h1:GAai92l2sX1rOQqGzPzE0IGMzS442xTLrHF/EwTywnw= -github.com/DataDog/datadog-agent/pkg/logs/status/utils v0.54.0-rc.5/go.mod h1:TsFFZ6y2/brcnkXLZhfp0k2xrewdyqhXnjxVpkOWIvE= -github.com/DataDog/datadog-agent/pkg/logs/util/testutils v0.54.0-rc.5 h1:9mAiLISlZcol07wCndWd5ErjItibOClx+N2Oyo3lG+A= -github.com/DataDog/datadog-agent/pkg/logs/util/testutils v0.54.0-rc.5/go.mod h1:J5lpbKKJzxPE2i5dsBYJnxbHlFvzPkfxNlhh2p3s18s= -github.com/DataDog/datadog-agent/pkg/obfuscate v0.54.0-rc.5 h1:qZg/3r8lLIgwzpHkqNBdnDKCdHexSxjgkb6FbPBaMnY= -github.com/DataDog/datadog-agent/pkg/obfuscate v0.54.0-rc.5/go.mod h1:4/9D8y6pQo5a/Tg8GAQN8SaRIRWxxyl5QHzPRuu8D0k= -github.com/DataDog/datadog-agent/pkg/proto v0.54.0-rc.5 h1:0HdqgTFchLs6ElI9cVrfjsT/gOF8A7PiY/VI2JMDFJc= -github.com/DataDog/datadog-agent/pkg/proto v0.54.0-rc.5/go.mod h1:gHkSUTn6H6UEZQHY3XWBIGNjfI3Tdi0IxlrxIFBWDwU= -github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.54.0-rc.5 h1:wM6w1HtUOxrn/sgMW00jx+0p4rNzPv+NhPqmIpboyV0= -github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.54.0-rc.5/go.mod h1:3yFk56PJ57yS1GqI9HAsS4PSlAeGCC9RQA7jxKzYj6g= -github.com/DataDog/datadog-agent/pkg/status/health v0.54.0-rc.5 h1:WgoyD4RkoGI3JDy+79SyiPc0AJGyCO5c2toOfxWwW1E= -github.com/DataDog/datadog-agent/pkg/status/health v0.54.0-rc.5/go.mod h1:sNLVlyEtkYal/+kTj+mTp239DdwVuYBYOnpS90RKk5E= -github.com/DataDog/datadog-agent/pkg/telemetry v0.54.0-rc.5 h1:iXZEgoYil4VaadjDsK+GbCkY7rBQyjsnlNJwXr6BwCY= -github.com/DataDog/datadog-agent/pkg/telemetry v0.54.0-rc.5/go.mod h1:4GCwM87F7u9HzugAODVTwS05MFMKC+NoJu6E4Zd/8pY= -github.com/DataDog/datadog-agent/pkg/trace v0.54.0-rc.5 h1:il5yFFe5CubI+bSfHolKr0077dQw0R+U5B9/iwW8aBg= -github.com/DataDog/datadog-agent/pkg/trace v0.54.0-rc.5/go.mod h1:63uSQX6TVeJzl1cFbIp8MkXlF4kUMJs8iUfGhrSgUHY= -github.com/DataDog/datadog-agent/pkg/util/backoff v0.54.0-rc.5 h1:eq+OaYTZ0rzQt1SpC2Tl+szJjUTX2nOC4N0glSzuWQ0= -github.com/DataDog/datadog-agent/pkg/util/backoff v0.54.0-rc.5/go.mod h1:HcSwqoxWLfevi1vuDZuFeRHfSuHGakTN6/u42WbxQHE= -github.com/DataDog/datadog-agent/pkg/util/cgroups v0.54.0-rc.5 h1:z5NnMMxKxO+cExUt0QCCSF7E+wX8LdD3nuL9LlDpR3Y= -github.com/DataDog/datadog-agent/pkg/util/cgroups v0.54.0-rc.5/go.mod h1:40rjMMqmvglVjktjWVUIk3o5W2zAtek0JU4FCsf7bsM= -github.com/DataDog/datadog-agent/pkg/util/executable v0.54.0-rc.5 h1:kxGwRdBPbiEx9mplVMA/rdLKMWcaKJMqO1pIyg56sLk= -github.com/DataDog/datadog-agent/pkg/util/executable v0.54.0-rc.5/go.mod h1:hUJvBzOKfasYzSvlar10ZkrB8I1CR8PhtyGxmlMv/cU= -github.com/DataDog/datadog-agent/pkg/util/filesystem v0.54.0-rc.5 h1:2A1/eg6zwNlUOjdAgaSgXR8eFR0HYLyqpvqLjlxKEP4= -github.com/DataDog/datadog-agent/pkg/util/filesystem v0.54.0-rc.5/go.mod h1:DfBDL+EjOiLI+HYR2N5zw1an1q7oCJQT6lY4oTCZxZ4= -github.com/DataDog/datadog-agent/pkg/util/fxutil v0.54.0-rc.5 h1:Fv7vJj/7qoEIV+ppI257ncx8IVQkDrUyjKSyeE56oTs= -github.com/DataDog/datadog-agent/pkg/util/fxutil v0.54.0-rc.5/go.mod h1:xqWrlGtjVu2ZMoCW9e3R7f13/Qg0IQBzO5AX7J1dC9I= -github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.54.0-rc.5 h1:1buVvWK8DXUveIpZMDc7Rn59mCDWZkQ9OGHjQRKdcas= -github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.54.0-rc.5/go.mod h1:FqMWIncd1TJJdlUYyiQQGJHWe+ZDKAjJSSPlrUBvHHk= -github.com/DataDog/datadog-agent/pkg/util/http v0.54.0-rc.5 h1:81sBly4SXW5Bvt3DHiUuuLpQnEUjhgdVDK69bk0g+58= -github.com/DataDog/datadog-agent/pkg/util/http v0.54.0-rc.5/go.mod h1:hZRz30Xaqm+UiR/KjO6gAo1Qa7v+tsxVqqaWgUkBjxE= -github.com/DataDog/datadog-agent/pkg/util/log v0.54.0-rc.5 h1:BcA7+MK04/HRCFlX5Pn/sQzZu/gF4qA3DOF880Jy/oo= -github.com/DataDog/datadog-agent/pkg/util/log v0.54.0-rc.5/go.mod h1:MFVWM0DMaxEXhCnHLWnh6axtwubmKRn7C+w2xiL+atI= -github.com/DataDog/datadog-agent/pkg/util/optional v0.54.0-rc.5 h1:3+7PwCbvtkOf63fPOzzMGVxNzlaZofPAg6ExPKn72hc= -github.com/DataDog/datadog-agent/pkg/util/optional v0.54.0-rc.5/go.mod h1:wa1JIWnzo9EvOBwzDOeff8HeqgOq9JQANRb99/nKg3A= -github.com/DataDog/datadog-agent/pkg/util/pointer v0.54.0-rc.5 h1:3zfbAoA9HSCJ/RsR/kP2MzntIvoI4szoReu4j3gpJrY= -github.com/DataDog/datadog-agent/pkg/util/pointer v0.54.0-rc.5/go.mod h1:ahpEhdpkifOLy0/XLHas+SseEmMQnwMgV1CMVkSuXL0= -github.com/DataDog/datadog-agent/pkg/util/scrubber v0.54.0-rc.5 h1:Sob3M0CylnKxZ9FX8Ewjka5VRFYZUQLN2J0kyOGYnMM= -github.com/DataDog/datadog-agent/pkg/util/scrubber v0.54.0-rc.5/go.mod h1:8ASCNWHQtcmUedxL+WjbCPSIcGIM8LeVzil7JCzx0js= -github.com/DataDog/datadog-agent/pkg/util/startstop v0.54.0-rc.5 h1:wo+LiNCZ9RQNNuYzCavbgjARHO3OmcqpFw4Mo6J5R+s= -github.com/DataDog/datadog-agent/pkg/util/startstop v0.54.0-rc.5/go.mod h1:F9ysDtw4BnbZIuKdwOdiHranjG9QMv2o7PMVreIhFzI= -github.com/DataDog/datadog-agent/pkg/util/statstracker v0.54.0-rc.5 h1:hU+Zvh4IL/HOEAjDzyIhYMQa4ibbX+dM4p5wWWpZ34U= -github.com/DataDog/datadog-agent/pkg/util/statstracker v0.54.0-rc.5/go.mod h1:KkiJi2f4mcxAJA00ArYw4zTfs0oWMU1bNXqKhymRVZg= -github.com/DataDog/datadog-agent/pkg/util/system v0.54.0-rc.5 h1:b7GZ1xAbkCtw5/hHwkRJoRiheAd9e+T2slJlD34lXbE= -github.com/DataDog/datadog-agent/pkg/util/system v0.54.0-rc.5/go.mod h1:gIg9d09X6uFqDFo7Dd48OCOCAtTLTWIE44+f/e35C3c= -github.com/DataDog/datadog-agent/pkg/util/system/socket v0.54.0-rc.5 h1:alEMYfYHYju+poG90phbdrpg4RYEyK/oFLAi8MM++HU= -github.com/DataDog/datadog-agent/pkg/util/system/socket v0.54.0-rc.5/go.mod h1:RKqan/bns7z9tqZBWSkshY1e6VisZJaU0b/XQcIDyAQ= -github.com/DataDog/datadog-agent/pkg/util/testutil v0.54.0-rc.5 h1:+nmZ4SFAHoskytj/q8+ewx7UtvbKGdDzcbPU0rhxIzU= -github.com/DataDog/datadog-agent/pkg/util/testutil v0.54.0-rc.5/go.mod h1:AyiUcueiQeqBXn60wbVOo3dPYRDNg0Gsfh/GkhatyxE= -github.com/DataDog/datadog-agent/pkg/util/winutil v0.54.0-rc.5 h1:0eWM/VJT1YPFf+nE5u0QdX1CiCiH2LWuvr4cCJ+nC3M= -github.com/DataDog/datadog-agent/pkg/util/winutil v0.54.0-rc.5/go.mod h1:m/wWejBoF6cuPzogMq2sgm86vvsnR1bAkw+Fgxq4vns= -github.com/DataDog/datadog-agent/pkg/version v0.54.0-rc.5 h1:aQEEvgBxk6Vk6ePMldw3fQUYTrl0AaYfUbrT1Ko6bjE= -github.com/DataDog/datadog-agent/pkg/version v0.54.0-rc.5/go.mod h1:EHeMJExE74SMdRoRCEuLOxbRgjfQwCVngMqFBiz1VN8= -github.com/DataDog/datadog-api-client-go/v2 v2.26.0 h1:bZr0hu+hx8L91+yU5EGw8wK3FlCVEIashpx+cylWsf0= -github.com/DataDog/datadog-api-client-go/v2 v2.26.0/go.mod h1:QKOu6vscsh87fMY1lHfLEmNSunyXImj8BUaUWJXOehc= +github.com/Code-Hex/go-generics-cache v1.5.1 h1:6vhZGc5M7Y/YD8cIUcY8kcuQLB4cHR7U+0KMqAA0KcU= +github.com/Code-Hex/go-generics-cache v1.5.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4= +github.com/DataDog/agent-payload/v5 v5.0.137 h1:nV02RrYj6AwlQBGIEv6yG23CuxGtG0YWoFZAVE6vwxY= +github.com/DataDog/agent-payload/v5 v5.0.137/go.mod h1:lxh9lb5xYrBXjblpIWYUi4deJqVbkIfkjwesi5nskDc= +github.com/DataDog/datadog-agent/cmd/agent/common/path v0.59.0 h1:PolEv4Se/H2jBCKdiOPNELEG5OuXWKrqpsxZMUQ4g14= +github.com/DataDog/datadog-agent/cmd/agent/common/path v0.59.0/go.mod h1:ve34W4f7PGC5zbot0HB+W3xkNZN7obINz89o8N/biP8= +github.com/DataDog/datadog-agent/comp/api/api/def v0.59.0 h1:zfXuUtnet+GWssR+Zi4lns5iIqlYQWiKXtKWb+6dJ+g= +github.com/DataDog/datadog-agent/comp/api/api/def v0.59.0/go.mod h1:gsXkdySqo/hjJmw/b4W9VYiGcRTJaq0uOVwMFAukl4U= +github.com/DataDog/datadog-agent/comp/core/config v0.59.0 h1:SxZsc9E6+d+Gb5fCfo/HnvRi8qTrTcLFE0//lX9+pM8= +github.com/DataDog/datadog-agent/comp/core/config v0.59.0/go.mod h1:2vRyHTEIHey2fsN9JO8z8bj7SSpC5VewuZsHJAA9k6I= +github.com/DataDog/datadog-agent/comp/core/flare/builder v0.59.0 h1:qpvXvXK+Az2dKgzx3pPaAvS/tsrl1QXI4FndDtcjgvY= +github.com/DataDog/datadog-agent/comp/core/flare/builder v0.59.0/go.mod h1:cg7JgU501CDIZNiyEfnwbBbk9nOsUy2nsKADIAdRnmk= +github.com/DataDog/datadog-agent/comp/core/flare/types v0.59.0 h1:Kz5NUsZFT4pTUh4P/A2bBiBTNkfT80ZfHig8LOuHBiY= +github.com/DataDog/datadog-agent/comp/core/flare/types v0.59.0/go.mod h1:n32X+eH1UMvlfZOwu70t6ySopwbN1yBfaVcpNgaCkG4= +github.com/DataDog/datadog-agent/comp/core/hostname/hostnameinterface v0.59.0 h1:m939bF+E/+nPZ1jGU1J9ZVeI3fCk8nbAjl9H9MMz2A0= +github.com/DataDog/datadog-agent/comp/core/hostname/hostnameinterface v0.59.0/go.mod h1:jjiRtHmQcGwHmP4l4T49t4i2fU2NM097LEG6VaI8CIk= +github.com/DataDog/datadog-agent/comp/core/log v0.56.2 h1:qvBT+FfjKGqimyEvmsNHCZKbTfBJAdUZSVy2IZQ8HS4= +github.com/DataDog/datadog-agent/comp/core/log v0.56.2/go.mod h1:ivJ/RMZjTNkoPPNDX+v/nnBwABLCiMv1vQA5tk/HCR4= +github.com/DataDog/datadog-agent/comp/core/log/def v0.59.0 h1:4je3YuTFhqmw0a0oksSsVPglNT4b37gosaRv9T/TLYQ= +github.com/DataDog/datadog-agent/comp/core/log/def v0.59.0/go.mod h1:uFF83DUAQYoQKKdddr6ptnCPiRik/lr9y+B2JxgLWRs= +github.com/DataDog/datadog-agent/comp/core/log/mock v0.59.0 h1:ndq+1XRChjuYIgfLuRuGQ5trGtq/Qpa/vnTG/6r9bKs= +github.com/DataDog/datadog-agent/comp/core/log/mock v0.59.0/go.mod h1:Ii6q5lgyvXKRmt8Puaan94V5iOiX4xOd+1OU7ZX8Lo4= +github.com/DataDog/datadog-agent/comp/core/secrets v0.59.0 h1:RS7z5/VuZtPc2NLdFRerDubYtZgWbgf1dOZpdhclgb8= +github.com/DataDog/datadog-agent/comp/core/secrets v0.59.0/go.mod h1:hKbelRO2zUJbU4KI1NumVvBIYq45RtQ3JC2LJvJU/y8= +github.com/DataDog/datadog-agent/comp/core/telemetry v0.59.0 h1:ApJD+u0a5anQZkmCw3y2ljhMC56BcjlT6klAZaoXLYk= +github.com/DataDog/datadog-agent/comp/core/telemetry v0.59.0/go.mod h1:mNPruKhnFUe7xiFMnPIMweb7O1HkTh0C78Llhd+Y9xA= +github.com/DataDog/datadog-agent/comp/def v0.59.0 h1:AO1oQ4/ZqYtzklm7glhYqQLyr4me4qg34sf4HRzyMcQ= +github.com/DataDog/datadog-agent/comp/def v0.59.0/go.mod h1:2xorAm6FmIl275/ayDZSUg53Hz4oQ/X8ELyp7I1N3fM= +github.com/DataDog/datadog-agent/comp/logs/agent/config v0.59.0 h1:olhlCNtCG5BKHsRJrwR4i7XZkeMbTRKz4OFayLrvD6o= +github.com/DataDog/datadog-agent/comp/logs/agent/config v0.59.0/go.mod h1:QrNGc1TWXhNagr1/nVSiUI+n8SFczoS8vpZdKtASxnQ= +github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline v0.59.0 h1:kM1pYOA1EmlT47b8Buxvlm6EVykG9T72gUuQL+Uur8s= +github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline v0.59.0/go.mod h1:2SrdlZ37IBATRjnPhNs4qBqaZCZ7HkEb4DNWXn/DsXY= +github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline/logsagentpipelineimpl v0.59.0 h1:SJhZCcJDZEEHzR2p9dGQ56jIy08ZfqajiBIBgLShtzU= +github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline/logsagentpipelineimpl v0.59.0/go.mod h1:uyfsYUV6L7W4duN9rlFrEN+r3REPPwCSE4Nj8WjDhDE= +github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/exporter/logsagentexporter v0.62.0-devel.0.20241213165407-f95df913d2b7 h1:SsisBoKdz1hfQQpfOa1XuVMksKRHOgZ84LRuadAS2LU= +github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/exporter/logsagentexporter v0.62.0-devel.0.20241213165407-f95df913d2b7/go.mod h1:Zt7cD4W15XoFigBKDbLeOjho0IyP2Qo8c41QWy/kgRM= +github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/metricsclient v0.59.0 h1:LyhDLcabmvRZk2ehGlZYXuW2MpA7RoR87C6jQ7gUQ24= +github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/metricsclient v0.59.0/go.mod h1:tG+1FklWteENGZb3gE/13Sn80YfMEI6APmZxY8nSQHo= +github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/statsprocessor v0.59.0 h1:3eTrUZGpI5EjzIINZhilZXRUd6ND7W98bUUe4UF+arE= +github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/statsprocessor v0.59.0/go.mod h1:Dp1J09BVqtGHR3yj82q4mCVNq5qkhDs/cTI5/DlvJxk= +github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.57.0-devel.0.20240718200853-81bf3b2e412d h1:wdjJ+/tBYiFLwno+lBPP66rm5jIf6ycGPRr21ogBBzE= +github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.57.0-devel.0.20240718200853-81bf3b2e412d/go.mod h1:CHa8CY2k0/wZkx/4KPi/WU/0m5YCfWZI1SAs1imElMA= +github.com/DataDog/datadog-agent/comp/trace/compression/def v0.59.0 h1:u/IbNqKfYodJIprc/rkpcwLz/5OFox95ujemwR9AHuo= +github.com/DataDog/datadog-agent/comp/trace/compression/def v0.59.0/go.mod h1:samFXdP0HVSwD223LPLzcPKUjRQ6/uwr/1wMPo2HhRg= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-gzip v0.59.0 h1:Z/fqQiBYwTTt27IIBdX6oivtIxfqm0o0gNqA1zoATm4= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-gzip v0.59.0/go.mod h1:x1xzklye6fB16nIh4HrvbOYN/WP4OJNJpvZylelI3tI= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-zstd v0.59.0 h1:m9wM1fLNndxJWVXwZegwQ2wAp6CK0uFqF/sh/5Rw1PY= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-zstd v0.59.0/go.mod h1:t1BtP+u27pjTeOX/5otD7klkUIHB0Mh4ToeeeHs+oRY= +github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.59.0 h1:Etckua/+tAA9nA6Ssbgx+sKDIdgiobVFuhRvQWDAGHQ= +github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.59.0/go.mod h1:s9QBNtoBURzy/0FeBInQ7kawNj04OnBNUo8xYr26z3E= +github.com/DataDog/datadog-agent/pkg/config/env v0.59.0 h1:8oHEWArrc7dYJunz5ZtLzSVsGkW4JUk+v/QLgcUuvRI= +github.com/DataDog/datadog-agent/pkg/config/env v0.59.0/go.mod h1:8DoSDz72MFB3o09Tn90OUnUiQ60kDvObWh9xmaG+4cI= +github.com/DataDog/datadog-agent/pkg/config/mock v0.59.0 h1:bg/anB+tp85oaFKvdMrbaYO0idWbErtm8i4rp4dra5k= +github.com/DataDog/datadog-agent/pkg/config/mock v0.59.0/go.mod h1:xVhwIc1BVvXN7UUM+604EOyoSRIF9B84Vn6Xn5n3GXE= +github.com/DataDog/datadog-agent/pkg/config/model v0.59.0 h1:8x6VWgK/mrG++vU1QkbfVI3YBWy2AyQHgOVyFYwX4lE= +github.com/DataDog/datadog-agent/pkg/config/model v0.59.0/go.mod h1:+IfFsWw9OM26lwDmTfy6RVF5LhEmFC8LgO4OGajyuvk= +github.com/DataDog/datadog-agent/pkg/config/nodetreemodel v0.59.0 h1:8MTR7i4xNFoVp0gyzHghn2s7AZcuu25GJDQvTGwtGC8= +github.com/DataDog/datadog-agent/pkg/config/nodetreemodel v0.59.0/go.mod h1:aYSdawfzI8vX0YlS19KKxpLR8oG1Rqp2rH+wFPv4MFs= +github.com/DataDog/datadog-agent/pkg/config/setup v0.59.0 h1:6cNxX6N7HIZqGVSKD4Fzh30Ldky8ckaQnd7B4bXzErg= +github.com/DataDog/datadog-agent/pkg/config/setup v0.59.0/go.mod h1:JEO3nqqPJn1lh8tSabgRqXHOth2l++ZYEfzRRYGUji0= +github.com/DataDog/datadog-agent/pkg/config/structure v0.59.0 h1:U7+yV+Ul/Cmvt7HKuf6TXkwq9/RhaaWNOX+xReUgqwQ= +github.com/DataDog/datadog-agent/pkg/config/structure v0.59.0/go.mod h1:rdbxYVSC1Xjh8RODr06j8Mbku7dXnRr3SWxi5wsl9pA= +github.com/DataDog/datadog-agent/pkg/config/teeconfig v0.59.0 h1:8iCSoIKcNqiX/QEmWbjRcH5za/Aj06QtIfT8JNJZXDU= +github.com/DataDog/datadog-agent/pkg/config/teeconfig v0.59.0/go.mod h1:oi5YMuCZKA98ACJz5cx/lXM+pZ4HAUgc5bSP73M4G3w= +github.com/DataDog/datadog-agent/pkg/config/utils v0.59.0 h1:ZA4WUpcb23Ts/BQ2fEDodGd45QtQFuJ0xSrvxME8JBQ= +github.com/DataDog/datadog-agent/pkg/config/utils v0.59.0/go.mod h1:n8JbD8n9omhs/MWZij6yA6RgHAOYx54BXMTRR2v+32A= +github.com/DataDog/datadog-agent/pkg/logs/auditor v0.59.0 h1:5PDZmH8KW0PYSfywoNlHkjoTNSYefq4N6X55CBqiCeU= +github.com/DataDog/datadog-agent/pkg/logs/auditor v0.59.0/go.mod h1:mcWSkLVkuJmhqr4GkwHbhuELNxn46VNg487xL33LAQQ= +github.com/DataDog/datadog-agent/pkg/logs/client v0.59.0 h1:GC6gjPzImitUI26X9X23G4WuDyv/+KKjYHLoxmIllJ8= +github.com/DataDog/datadog-agent/pkg/logs/client v0.59.0/go.mod h1:EE6EkO4YH+hQlhQAPrcTxT3Ye72fOFwQxqyQsOFr2fk= +github.com/DataDog/datadog-agent/pkg/logs/diagnostic v0.59.0 h1:a/2kYMMKo9um9Dla5QExkvors05CFgyfrPkxClZz8L0= +github.com/DataDog/datadog-agent/pkg/logs/diagnostic v0.59.0/go.mod h1:Mc9HEEgXpsQEZKEtb7I42Yg5ShZyNXxJShdVslkhW2g= +github.com/DataDog/datadog-agent/pkg/logs/message v0.59.0 h1:hv2fiwwX53r4tdzv0YHbBDoGBLJcKrA4ErqC01XnCrY= +github.com/DataDog/datadog-agent/pkg/logs/message v0.59.0/go.mod h1:RS8UIJB31rymy8W5va8I1EFkd4hbSAbHUWPZYzfwH+M= +github.com/DataDog/datadog-agent/pkg/logs/metrics v0.59.0 h1:mQzAZGQaYlnQVyralxBs2KxYAm8Gb8IL45eimmX0Zr4= +github.com/DataDog/datadog-agent/pkg/logs/metrics v0.59.0/go.mod h1:liRnSv3VpZpv/rHGiYYBCBlkx2Sy98rw2/5hu9g1T/E= +github.com/DataDog/datadog-agent/pkg/logs/pipeline v0.59.0 h1:3i0bNOq5IwPKKYpKl2zgkwOecvfxl2/mFZ5M4q8un7U= +github.com/DataDog/datadog-agent/pkg/logs/pipeline v0.59.0/go.mod h1:xVtael5+vGMu08nvdlnqB7IhbwjTYCLHuXMjVodVFM8= +github.com/DataDog/datadog-agent/pkg/logs/processor v0.59.0 h1:F71SRQbj2bqLHAw8+R/fqMQCTiDjusD36u13/yK55Bo= +github.com/DataDog/datadog-agent/pkg/logs/processor v0.59.0/go.mod h1:XuBR8eeLrxNOI5ex2BlH67P4lmOZIs5p9Vnse/71zVY= +github.com/DataDog/datadog-agent/pkg/logs/sds v0.59.0 h1:CPxkTGZuir7z6ZnEXovdUNQE0nAHmXAtBLvFMppxHvs= +github.com/DataDog/datadog-agent/pkg/logs/sds v0.59.0/go.mod h1:MOhCsu2zQMIwT2NBQYWjXzHgNYCKZwPJu08TKlBa1IU= +github.com/DataDog/datadog-agent/pkg/logs/sender v0.59.0 h1:fd2pUQXyxV8Zvw2axC0/IzBRwaEWeOYuItvo3NnS0eY= +github.com/DataDog/datadog-agent/pkg/logs/sender v0.59.0/go.mod h1:iVtgk6B4bl7HggNx5TECj4LIj8PYmoDIf1Hn1lL61cA= +github.com/DataDog/datadog-agent/pkg/logs/sources v0.59.0 h1:odwHx0k2Hod6wrsnt/P5dI2deVCwVaMNKSSxpsOvHR8= +github.com/DataDog/datadog-agent/pkg/logs/sources v0.59.0/go.mod h1:t95T+iw+/9VP40ymxXrrLIMJ+MiFJm0vIZml3KpwuyI= +github.com/DataDog/datadog-agent/pkg/logs/status/statusinterface v0.59.0 h1:th5J71WmJpXVcY+yR5YalOzrLjoYEDn/HT+allWEInQ= +github.com/DataDog/datadog-agent/pkg/logs/status/statusinterface v0.59.0/go.mod h1:PaduNrh0GJ3UEKG30VMu0M6hi7KuYf3VviLdIG9xV9k= +github.com/DataDog/datadog-agent/pkg/logs/status/utils v0.59.0 h1:BvvXnKJjZfLUcwcTnj8gWoJAlFfTd8q5Rh39SV97VFM= +github.com/DataDog/datadog-agent/pkg/logs/status/utils v0.59.0/go.mod h1:p2NTG+cIhVGlKELJfRteGCec37ICptIpeB2x/MsRkbw= +github.com/DataDog/datadog-agent/pkg/logs/util/testutils v0.59.0 h1:Lx1CcCOi+Wgvjxzj8pEz1HtxWuZpjIkHyrBXidzU9Hw= +github.com/DataDog/datadog-agent/pkg/logs/util/testutils v0.59.0/go.mod h1:+uqKrMsDA16MMC98rqDkp7Jn8cpYLI/JPAVcno8MEmE= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.59.0 h1:uX6/XoKMS7KYXe+R+vwgw+eRdmn16xfa9PDF5dxgumE= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.59.0/go.mod h1:ATVw8kr3U1Eqz3qBz9kS6WFDKji9XyoAsHKSlj3hPTM= +github.com/DataDog/datadog-agent/pkg/proto v0.59.0 h1:hHgSABsmMpA3IatWlnYRAKlfqBACsWyqsLCEcUA8BCs= +github.com/DataDog/datadog-agent/pkg/proto v0.59.0/go.mod h1:weaq7HP9vUa7YAMcvMs7bhT7pmHk3sq7XRBQOcaSUak= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.59.0 h1:9C8TVNz0IiNoD6tuEKPY/vMIUjB7kN0OaLyImhatWjg= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.59.0/go.mod h1:c4th0IFaP0Q1ofRa0GcPB9hJWN+cmUoEfOI1Ub0O50A= +github.com/DataDog/datadog-agent/pkg/status/health v0.59.0 h1:gDeDYddUBwkzeNRxeRceIB46YvxB/2+KoCFcN4qvVag= +github.com/DataDog/datadog-agent/pkg/status/health v0.59.0/go.mod h1:EkC/SgFR03BKwBitVV4dIuP+ofwPlUCkVi5K5k1Dh2Y= +github.com/DataDog/datadog-agent/pkg/telemetry v0.59.0 h1:4WEY5NILyM/WFXwzgvgdju1rfO4cru2SXJyU1JLgFyc= +github.com/DataDog/datadog-agent/pkg/telemetry v0.59.0/go.mod h1:DmEXCX0hBizZpdpbS64o9sPj47iiUzh9F7uGUazF+ZA= +github.com/DataDog/datadog-agent/pkg/trace v0.59.0 h1:LHfmBEfidWE6R5onNLIFnX3jc4MRBwdqJ6XLQxvBAG0= +github.com/DataDog/datadog-agent/pkg/trace v0.59.0/go.mod h1:6XfyUYonzDI1qy9tZBUgMgGYJarHDxIZtfs6PNRbf/w= +github.com/DataDog/datadog-agent/pkg/util/backoff v0.59.0 h1:EaTwOrTRpMEdomryGVMfHyN0wEsKkaL3/Tw9qRt9SSY= +github.com/DataDog/datadog-agent/pkg/util/backoff v0.59.0/go.mod h1:2RMfdYkKyeh8hXs6WgaamkkEyK35Xo55C4rFG4dO1k8= +github.com/DataDog/datadog-agent/pkg/util/cgroups v0.59.0 h1:uV3oUyl0uQN8anXZXQiw+hbQ8UNNtSkrnDCDklhAjeI= +github.com/DataDog/datadog-agent/pkg/util/cgroups v0.59.0/go.mod h1:+51MjREuUnHTYSnI9zBqv2aVOF4dlhDwQiCMeZyY7Z0= +github.com/DataDog/datadog-agent/pkg/util/executable v0.59.0 h1:24sLjJ4p4Co/82weJsqkNxWZjG8zdS7yeJBGVOqjHxM= +github.com/DataDog/datadog-agent/pkg/util/executable v0.59.0/go.mod h1:mSSn2OzsdgoUnPyBmF8rEDU+ee1RFp+H6LFsJSteN9o= +github.com/DataDog/datadog-agent/pkg/util/filesystem v0.59.0 h1:VV/SYXyZirAaUxMsWUpmZYcX9AIgbGadElznJZXPCig= +github.com/DataDog/datadog-agent/pkg/util/filesystem v0.59.0/go.mod h1:1Oy0TNkovXuDB0Uu8OzszIuDezYSPg8qFCEyx02ipc4= +github.com/DataDog/datadog-agent/pkg/util/fxutil v0.59.0 h1:b4sUQuXnE+M+1ToTViNGelw8yfaXRuhOqBSczdQ8wEM= +github.com/DataDog/datadog-agent/pkg/util/fxutil v0.59.0/go.mod h1:vl91pbe6A2L9kqNEmSDrS8vlj4cADSBq3Z3YRQ1rpKY= +github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.59.0 h1:8qlROMBQixtDVQwjvttGSM8hTmN3tnFQugOyh614ACc= +github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.59.0/go.mod h1:4EPWYAplHgdaLZsP/NuLEfh21NuvF+JdVtwttTqQlUY= +github.com/DataDog/datadog-agent/pkg/util/http v0.59.0 h1:6Dshh+6K5NGV2TdHsZeeDRsBrgvQ0rJw8OhMWonMFu4= +github.com/DataDog/datadog-agent/pkg/util/http v0.59.0/go.mod h1:Cf5xtpWzHGn7rvEAM4fdw1OUABXLbA/Bqf3dCt/0qtM= +github.com/DataDog/datadog-agent/pkg/util/log v0.59.1 h1:3Zc0tI5XAKMGqdSbseneXGOVtzp017yPm/L4wzsCPDw= +github.com/DataDog/datadog-agent/pkg/util/log v0.59.1/go.mod h1:nW37eZ8+OsEGA/YhtOgiI2vFaXausm3dfjXUVh++heQ= +github.com/DataDog/datadog-agent/pkg/util/log/setup v0.59.0 h1:1gQ81041dHofvio6mn0EnmAG8hYR52VOlCjONIvpkks= +github.com/DataDog/datadog-agent/pkg/util/log/setup v0.59.0/go.mod h1:9aftpZaZs8Z7EWHGQO3+biYHVRxN/V4WELSK6P5c0DY= +github.com/DataDog/datadog-agent/pkg/util/optional v0.59.0 h1:IOZeoApM4NI6dw+Sdo4PalVU1Z6uoY3vuKdl5Jm6g2M= +github.com/DataDog/datadog-agent/pkg/util/optional v0.59.0/go.mod h1:xWT/KJdJg2/0pZyAKZ6XmIiE5sM+AyUo4qvKuPHQ17U= +github.com/DataDog/datadog-agent/pkg/util/pointer v0.59.0 h1:K/3aHtAsvlAIbw0/3ah66f1glnpdLNm69XSYXdcnDtw= +github.com/DataDog/datadog-agent/pkg/util/pointer v0.59.0/go.mod h1:t1DlnUEMltkvwPLc7zCtP1u5cBDu+30daR2VhQO5bvA= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.59.1 h1:UnRouTSYwGa5gib1QX4LUNk16+G1vmK3wn8qr9F0Hp4= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.59.1/go.mod h1:krOxbYZc4KKE7bdEDu10lLSQBjdeSFS/XDSclsaSf1Y= +github.com/DataDog/datadog-agent/pkg/util/startstop v0.59.0 h1:zPO6AX/UcbMCuGjnrK0cuDgULbOyzZFYvuxf/qbZjGg= +github.com/DataDog/datadog-agent/pkg/util/startstop v0.59.0/go.mod h1:IkqOyNbrg9hXqCMyL+g+Ldhz4q6VVOPqbHQxS4lLiRs= +github.com/DataDog/datadog-agent/pkg/util/statstracker v0.59.0 h1:CYY4C03mcJCqB04DKttAbNPrQouJLSL94m/KLaURv3Y= +github.com/DataDog/datadog-agent/pkg/util/statstracker v0.59.0/go.mod h1:Et2HSDjQvMhgs9ZdH7T5I4q04g5Fj23EtmeIaen/9/M= +github.com/DataDog/datadog-agent/pkg/util/system v0.59.0 h1:9fpWOSJyuBHdpzQkUYFoyC57Bv+umHeMMSQmwmm900k= +github.com/DataDog/datadog-agent/pkg/util/system v0.59.0/go.mod h1:rdBzS773XYudLd/IH2mUzz3+kJ2N2PcFWEdRGEGYlP0= +github.com/DataDog/datadog-agent/pkg/util/system/socket v0.59.0 h1:8l2FgdcIUNPyI4J+w5OaY3k2byB11HqZ/mcg2AcJSSI= +github.com/DataDog/datadog-agent/pkg/util/system/socket v0.59.0/go.mod h1:C63BEsAoSlfoB4WadEMO1guB+dvfl95zQaMLw394zNM= +github.com/DataDog/datadog-agent/pkg/util/testutil v0.59.0 h1:f6EtElJXr8UN6FftNEeqIyT2jzvAtldQI+eb7qaYvrA= +github.com/DataDog/datadog-agent/pkg/util/testutil v0.59.0/go.mod h1:m/uWLdpGEi3x/5gybZFeYNEnIdKhGtWW8kFZuM+GSFA= +github.com/DataDog/datadog-agent/pkg/util/winutil v0.59.1 h1:EE1+1pWfb5bxprz0+I+ERnCm6Pm2fI46+Sop3CfISps= +github.com/DataDog/datadog-agent/pkg/util/winutil v0.59.1/go.mod h1:CezVaH66o/kyTtOYLYBjy/CTqwkM9HzPpDFppfRu6bE= +github.com/DataDog/datadog-agent/pkg/version v0.59.1 h1:6C39A9t2Noe3Ndk0yH7d0ys5t+KRewLvMLWN/A0OStY= +github.com/DataDog/datadog-agent/pkg/version v0.59.1/go.mod h1:rcA7LtIB5WLpxsems/bWO1iXkyGEgHHje7vJ0b20ZpU= +github.com/DataDog/datadog-api-client-go/v2 v2.33.0 h1:OI6kDnJeQmkjfGzxmP0XUQUxMD4tp6oAPXnnJ4VpgUM= +github.com/DataDog/datadog-api-client-go/v2 v2.33.0/go.mod h1:d3tOEgUd2kfsr9uuHQdY+nXrWp4uikgTgVCPdKNK30U= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/datadog-go/v5 v5.5.0 h1:G5KHeB8pWBNXT4Jtw0zAkhdxEAWSpWH00geHI6LDrKU= github.com/DataDog/datadog-go/v5 v5.5.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= -github.com/DataDog/dd-sensitive-data-scanner/sds-go/go v0.0.0-20240419161837-f1b2f553edfe h1:efzxujZ7VHWFxjmWjcJyUEpPrN8qdiZPYb+dBw547Wo= -github.com/DataDog/dd-sensitive-data-scanner/sds-go/go v0.0.0-20240419161837-f1b2f553edfe/go.mod h1:TX7CTOQ3LbQjfAi4SwqUoR5gY1zfUk7VRBDTuArjaDc= -github.com/DataDog/go-sqllexer v0.0.9 h1:Cx2Cu1S0hfj4coCCA8hzjM9+UNFRkcu1avIV//RU5Qw= -github.com/DataDog/go-sqllexer v0.0.9/go.mod h1:nB4Ea2YNsqMwtbWMc4Fm/oP98IIrSPapqwOwPioMspY= +github.com/DataDog/dd-sensitive-data-scanner/sds-go/go v0.0.0-20240816154533-f7f9beb53a42 h1:RoH7VLzTnxHEugRPIgnGlxwDFszFGI7b3WZZUtWuPRM= +github.com/DataDog/dd-sensitive-data-scanner/sds-go/go v0.0.0-20240816154533-f7f9beb53a42/go.mod h1:TX7CTOQ3LbQjfAi4SwqUoR5gY1zfUk7VRBDTuArjaDc= +github.com/DataDog/go-sqllexer v0.0.15 h1:rUUu52dP8EQhJLnUw0MIAxZp0BQx2fOTuMztr3vtHUU= +github.com/DataDog/go-sqllexer v0.0.15/go.mod h1:KwkYhpFEVIq+BfobkTC1vfqm4gTi65skV/DpDBXtexc= github.com/DataDog/go-tuf v1.1.0-0.5.2 h1:4CagiIekonLSfL8GMHRHcHudo1fQnxELS9g4tiAupQ4= github.com/DataDog/go-tuf v1.1.0-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= github.com/DataDog/gohai v0.0.0-20230524154621-4316413895ee h1:tXibLZk3G6HncIFJKaNItsdzcrk4YqILNDZlXPTNt4k= github.com/DataDog/gohai v0.0.0-20230524154621-4316413895ee/go.mod h1:nTot/Iy0kW16bXgXr6blEc8gFeAS7vTqYlhAxh+dbc0= -github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata v0.16.1 h1:WD5hPS/KfDaYcWxa636972pQ8iOBN9MC/6Is5aSNZc8= -github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata v0.16.1/go.mod h1:P/l++2cDCeeq21KSmCEdXdMH9/WMdXP7uA/vjnxhtz8= -github.com/DataDog/opentelemetry-mapping-go/pkg/internal/sketchtest v0.16.0 h1:VJT1Jjlz/ca999FEqaAS+He7S4eB14a+PJjczgRdgAY= -github.com/DataDog/opentelemetry-mapping-go/pkg/internal/sketchtest v0.16.0/go.mod h1:66XlN7QpQKqIvw8e2UbCXV5X8wGnEw851nT9BjJ75dY= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.16.1 h1:ZI8u3CgdMXpDplrf9/gIr13+/g/tUzUcBMk2ZhXgzLE= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.16.1/go.mod h1:dvIWN9pA2zWNTw5rhDWZgzZnhcfpH++d+8d1SWW6xkY= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/logs v0.16.1 h1:px2+7svK86oeCGd+sT1x/9f0pqIJdApGFnWI0AOPXwA= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/logs v0.16.1/go.mod h1:+LijQ2LdlocAQ4WB+7KsoIGe90bfogkRslubd9swVow= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics v0.16.1 h1:Qm3M3A7/tkYG8JYeF9Mxp3oNEz23EQzvnV0MZR8mJKQ= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics v0.16.1/go.mod h1:HPwVoMccTFfyV94bE29ffwAYnsPykAH7Iso8/5ucLSs= -github.com/DataDog/opentelemetry-mapping-go/pkg/quantile v0.16.1 h1:sQoxh5RytdEFYFLGw3JUwFFhS/A1InFFVldpWAS/Z3g= -github.com/DataDog/opentelemetry-mapping-go/pkg/quantile v0.16.1/go.mod h1:6eYyd+lJYH+uRuZqhyW/u+9ykaXBWetDGj44+txz6jU= -github.com/DataDog/sketches-go v1.4.5 h1:ki7VfeNz7IcNafq7yI/j5U/YCkO3LJiMDtXz9OMQbyE= -github.com/DataDog/sketches-go v1.4.5/go.mod h1:7Y8GN8Jf66DLyDhc94zuWA3uHEt/7ttt8jHOBWWrSOg= -github.com/DataDog/viper v1.13.3 h1:0++798wZLEenL1JbF8dMmwFl6WMlAVxLtzVuws/LlVc= -github.com/DataDog/viper v1.13.3/go.mod h1:wDdUVJ2SHaMaPrCZrlRCObwkubsX8j5sme3LaR/SGTc= -github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= -github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.23.0 h1:yRhWveg9NbJcJYoJL4FoSauT2dxnt4N9MIAJ7tvU/mQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.23.0/go.mod h1:p2puVVSKjQ84Qb1gzw2XHLs34WQyHTYFZLaVxypAFYs= +github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata v0.22.0 h1:r1Dx2cRHCBWkVluSZA41i4eoI/nOGbcrrZdkqWjoFCc= +github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata v0.22.0/go.mod h1:+/dkO8ZiMa8rfm4SmtTF6qPUdBbBcvsWWKaO4xPKAIk= +github.com/DataDog/opentelemetry-mapping-go/pkg/internal/sketchtest v0.22.0 h1:cXcKVEU1D0HlguR7GunnvuI70TghkarCa9DApqzMY94= +github.com/DataDog/opentelemetry-mapping-go/pkg/internal/sketchtest v0.22.0/go.mod h1:ES00EXfyEKgUkjd93tAXCxJA6i0seeOhZoS5Cj2qzzg= +github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.22.0 h1:yfk2cF8Bx98fSFpGrehEHh1FRqewfxcCTAbUDt5r3F8= +github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.22.0/go.mod h1:9qzpnBSxSOnKzbF/uHket3SSlQihQHix/ZRC2nZUUYQ= +github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/logs v0.22.0 h1:Zqj8YUZ/ualUhM8GDCQX6xKnUJKEiG0eYdFGWmIDG30= +github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/logs v0.22.0/go.mod h1:lpr4q6g2TB0BHeLHaz/XleKm8YXQjuxiQEb9Q9HXXE0= +github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics v0.22.0 h1:w9+ngZDYUMLW+GSRA8x1DvVbuMR+cwlGb8VLwZfgBGs= +github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics v0.22.0/go.mod h1:UsfqLgiD6Sjhpjkg+YzAd+TdKUZ2m6ZZ8t+tEkLNTMA= +github.com/DataDog/opentelemetry-mapping-go/pkg/quantile v0.22.0 h1:63SzQz9Ab8XJj8fQKQz6UZNBhOm8rucwzbDfwTVF6dQ= +github.com/DataDog/opentelemetry-mapping-go/pkg/quantile v0.22.0/go.mod h1:E/PY/aQ6S/N5hBPHXZRGmovs5b1BSi4RHGNcB4yP/Z0= +github.com/DataDog/sketches-go v1.4.6 h1:acd5fb+QdUzGrosfNLwrIhqyrbMORpvBy7mE+vHlT3I= +github.com/DataDog/sketches-go v1.4.6/go.mod h1:7Y8GN8Jf66DLyDhc94zuWA3uHEt/7ttt8jHOBWWrSOg= +github.com/DataDog/viper v1.14.0 h1:dIjTe/uJiah+QFqFZ+MXeqgmUvWhg37l37ZxFWxr3is= +github.com/DataDog/viper v1.14.0/go.mod h1:wDdUVJ2SHaMaPrCZrlRCObwkubsX8j5sme3LaR/SGTc= +github.com/DataDog/zstd v1.5.6 h1:LbEglqepa/ipmmQJUDnSsfvA8e8IStVcGaFWDuxvGOY= +github.com/DataDog/zstd v1.5.6/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 h1:3c8yed4lgqTt+oTQ+JNMDo+F4xprBf+O/il4ZC0nRLw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0/go.mod h1:obipzmGjfSjam60XLwGfqUkJsfiheAl+TUjG+4yzyPM= github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= @@ -232,23 +258,36 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 h1:ez/4by2iGztzR4L0zgAOR8lTQK9VlyBVVd7G4omaOQs= -github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 h1:t3eaIm0rUkzbrIewtiFmMK5RXHej2XnoXNhxVsAYUfg= +github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= +github.com/antchfx/xmlquery v1.4.2 h1:MZKd9+wblwxfQ1zd1AdrTsqVaMjMCwow3IqkCSe00KA= +github.com/antchfx/xmlquery v1.4.2/go.mod h1:QXhvf5ldTuGqhd1SHNvvtlhhdQLks4dD0awIVhXIDTA= +github.com/antchfx/xpath v1.3.2 h1:LNjzlsSjinu3bQpw9hWMY9ocB80oLOWuQqFvO6xt51U= +github.com/antchfx/xpath v1.3.2/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= +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= github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aws/aws-sdk-go v1.53.11 h1:KcmduYvX15rRqt4ZU/7jKkmDxU/G87LJ9MUI0yQJh00= -github.com/aws/aws-sdk-go v1.53.11/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= +github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 h1:6df1vn4bBlDDo4tARvBm7l6KA9iVMnE3NWizDeWSrps= +github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3/go.mod h1:CIWtjkly68+yqLPbvwwR/fjNJA/idrtULjZWh2v1ys0= github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= 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/bmatcuk/doublestar/v4 v4.6.1 h1:FH9SifrbvJhnlQpztAx++wlkk70QBf0iBWDwNy7PA4I= -github.com/bmatcuk/doublestar/v4 v4.6.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bmatcuk/doublestar/v4 v4.7.1 h1:fdDeAqgT47acgwd9bd9HxJRDmc9UAmPpc+2m0CXv75Q= +github.com/bmatcuk/doublestar/v4 v4.7.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= github.com/briandowns/spinner v1.23.0 h1:alDF2guRWqa/FOZZYWjlMIx2L6H0wyewPxo/CH4Pt2A= github.com/briandowns/spinner v1.23.0/go.mod h1:rPG4gmXeN3wQV/TsAY4w8lPdIM6RX3yqeBQJSrbXjuE= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= @@ -266,14 +305,16 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/cihub/seelog v0.0.0-20151216151435-d2c6e5aa9fbf/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50 h1:DBmgJDC9dTfkVyGgipamEh2BpGYxScCH1TOF1LL1cXc= -github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50/go.mod h1:5e1+Vvlzido69INQaVO6d87Qn543Xr6nooe9Kz7oBFM= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/containerd/cgroups/v3 v3.0.3 h1:S5ByHZ/h9PMe5IOQoN7E+nMc2UcLEM/V48DGDJ9kip0= github.com/containerd/cgroups/v3 v3.0.3/go.mod h1:8HBe7V3aWGLFPd/k03swSIsGjZhHI2WzJmticMgVuz0= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -284,7 +325,7 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7 github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -297,12 +338,14 @@ github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUn github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/digitalocean/godo v1.109.0 h1:4W97RJLJSUQ3veRZDNbp1Ol3Rbn6Lmt9bKGvfqYI5SU= -github.com/digitalocean/godo v1.109.0/go.mod h1:R6EmmWI8CT1+fCtjWY9UCB+L5uufuZH13wk3YhxycCs= -github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= -github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= -github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/digitalocean/godo v1.118.0 h1:lkzGFQmACrVCp7UqH1sAi4JK/PWwlc5aaxubgorKmC4= +github.com/digitalocean/godo v1.118.0/go.mod h1:Vk0vpCot2HOAJwc5WE8wljZGtJ3ZtWIc8MQ8rF38sdo= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/docker/docker v27.4.0+incompatible h1:I9z7sQ5qyzO0BfAb9IMOawRkAGxhYsidKiTMcm0DU+A= +github.com/docker/docker v27.4.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -311,6 +354,12 @@ github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/BE= +github.com/ebitengine/purego v0.8.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/elastic/go-grok v0.3.1 h1:WEhUxe2KrwycMnlvMimJXvzRa7DoByJB4PVUIE1ZD/U= +github.com/elastic/go-grok v0.3.1/go.mod h1:n38ls8ZgOboZRgKcjMY8eFeZFMmcL9n2lP0iHhIDk64= +github.com/elastic/lunes v0.1.0 h1:amRtLPjwkWtzDF/RKzcEPMvSsSseLDLW+bnhfNSLRe4= +github.com/elastic/lunes v0.1.0/go.mod h1:xGphYIt3XdZRtyWosHQTErsQTd4OP1p9wsbVoHelrd4= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= @@ -319,48 +368,54 @@ github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRr github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.12.0 h1:4X+VP1GHd1Mhj6IB5mMeGbLCleqxjletLK6K0rbxyZI= -github.com/envoyproxy/go-control-plane v0.12.0/go.mod h1:ZBTaoJ23lqITozF0M6G4/IragXCQKCnYbmlmtHvwRG0= +github.com/envoyproxy/go-control-plane v0.13.0 h1:HzkeUz1Knt+3bK+8LG1bxOO/jzWZmdxpwC51i202les= +github.com/envoyproxy/go-control-plane v0.13.0/go.mod h1:GRaKG3dwvFoTg4nj7aXdZnvMg4d7nvT/wl9WgVXn3Q8= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= -github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= +github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM= +github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/expr-lang/expr v1.16.9 h1:WUAzmR0JNI9JCiF0/ewwHB1gmcGw5wW7nWt8gc6PpCI= github.com/expr-lang/expr v1.16.9/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= -github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= -github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= -github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= @@ -375,19 +430,19 @@ github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.22.9 h1:XX2DssF+mQKM2DHsbgZK74y/zj4mo9I99+89xUmuZCE= github.com/go-openapi/swag v0.22.9/go.mod h1:3/OXnFfnMAwBD099SwYRk7GD3xOrr1iL7d/XNLXVVwE= -github.com/go-resty/resty/v2 v2.12.0 h1:rsVL8P90LFvkUYq/V5BTVe203WfRIU4gvcf+yfzJzGA= -github.com/go-resty/resty/v2 v2.12.0/go.mod h1:o0yGPrkS3lOe1+eFajk6kBW8ScXzwU3hD69/gt2yB/0= +github.com/go-resty/resty/v2 v2.13.1 h1:x+LHXBI2nMB1vqndymf26quycC4aggYJ7DECYbiz03g= +github.com/go-resty/resty/v2 v2.13.1/go.mod h1:GznXlLxkq6Nh4sU59rPmUw3VtgpO3aS96ORAI6Q7d+0= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg= github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= +github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.6 h1:mkgN1ofwASrYnJ5W6U/BxG15eXXXjirgZc7CLqkcaro= github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -396,8 +451,8 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw= -github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -434,6 +489,8 @@ github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -446,6 +503,7 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= @@ -458,7 +516,6 @@ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -466,11 +523,8 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7 h1:y3N7Bm7Y9/CtpiVkw/ZWj6lSlDF3F74SfKwfTCer72Q= -github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/pprof v0.0.0-20240711041743-f6c9dda6c6da h1:xRmpO92tb8y+Z85iUOMOicpCfaYcv7o3Cg3wKrIpg8g= +github.com/google/pprof v0.0.0-20240711041743-f6c9dda6c6da/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= @@ -482,71 +536,93 @@ github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfF github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.12.2 h1:mhN09QQW1jEWeMF74zGR81R30z4VJzjZsfkUhuHF+DA= -github.com/googleapis/gax-go/v2 v2.12.2/go.mod h1:61M8vcyyXR2kqKFxKrfA22jaA8JGF7Dc8App1U3H6jc= +github.com/googleapis/gax-go/v2 v2.12.5 h1:8gw9KZK8TiVKB6q3zHY3SBzLnrGp6HQjyfYBYGmXdxA= +github.com/googleapis/gax-go/v2 v2.12.5/go.mod h1:BUDKcWo+RaKq5SC9vVYL0wLADa3VcfswbOMMRmB9H3E= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gophercloud/gophercloud v1.8.0 h1:TM3Jawprb2NrdOnvcHhWJalmKmAmOGgfZElM/3oBYCk= -github.com/gophercloud/gophercloud v1.8.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= +github.com/gophercloud/gophercloud v1.13.0 h1:8iY9d1DAbzMW6Vok1AxbbK5ZaUjzMp0tdyt4fX9IeJ0= +github.com/gophercloud/gophercloud v1.13.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= -github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc h1:GN2Lv3MGO7AS6PrRoT6yV5+wkrOpcszoIsO4+4ds248= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= 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-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.13.0/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= -github.com/hashicorp/consul/api v1.28.3 h1:IE06LST/knnCQ+cxcvzyXRF/DetkgGhJoaOFd4l9xkk= -github.com/hashicorp/consul/api v1.28.3/go.mod h1:7AGcUFu28HkgOKD/GmsIGIFzRTmN0L02AE9Thsr2OhU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= +github.com/hashicorp/consul/api v1.30.0 h1:ArHVMMILb1nQv8vZSGIwwQd2gtc+oSQZ6CalyiyH2XQ= +github.com/hashicorp/consul/api v1.30.0/go.mod h1:B2uGchvaXVW2JhFoS8nqTxMD5PBykr4ebY4JWHTTeLM= +github.com/hashicorp/consul/sdk v0.16.1 h1:V8TxTnImoPD5cj0U9Spl0TUxcytjcbbJeADFF07KdHg= +github.com/hashicorp/consul/sdk v0.16.1/go.mod h1:fSXvwxB2hmh1FMZCNl6PwX0Q/1wdWtHJcZ7Ea5tns0s= github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= -github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= +github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.7.4 h1:ZQgVdpTdAL7WpMIwLzCfbalOcSUdkDZnpUv3/+BxzFA= -github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= +github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/nomad/api v0.0.0-20240306004928-3e7191ccb702 h1:fI1LXuBaS1d9z1kmb++Og6YD8uMRwadXorCwE+xgOFA= -github.com/hashicorp/nomad/api v0.0.0-20240306004928-3e7191ccb702/go.mod h1:z71gkJdrkAt/Rl6C7Q79VE7AwJ5lUF+M+fzFTyIHYB0= +github.com/hashicorp/hcl v1.0.1-vault-5 h1:kI3hhbbyzr4dldA8UdTb7ZlVVlI2DACdCfz31RPDgJM= +github.com/hashicorp/hcl v1.0.1-vault-5/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= +github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= +github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= +github.com/hashicorp/nomad/api v0.0.0-20240717122358-3d93bd3778f3 h1:fgVfQ4AC1avVOnu2cfms8VAiD8lUq3vWI8mTocOXN/w= +github.com/hashicorp/nomad/api v0.0.0-20240717122358-3d93bd3778f3/go.mod h1:svtxn6QnrQ69P23VvIWMR34tg3vmwLz4UdUzm1dSCgE= github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/hectane/go-acl v0.0.0-20190604041725-da78bae5fc95 h1:S4qyfL2sEm5Budr4KVMyEniCy+PbS55651I/a+Kn/NQ= github.com/hectane/go-acl v0.0.0-20190604041725-da78bae5fc95/go.mod h1:QiyDdbZLaJ/mZP4Zwc9g2QsfaEA4o7XvvgZegSci5/E= -github.com/hetznercloud/hcloud-go/v2 v2.6.0 h1:RJOA2hHZ7rD1pScA4O1NF6qhkHyUdbbxjHgFNot8928= -github.com/hetznercloud/hcloud-go/v2 v2.6.0/go.mod h1:4J1cSE57+g0WS93IiHLV7ubTHItcp+awzeBp5bM9mfA= +github.com/hetznercloud/hcloud-go/v2 v2.10.2 h1:9gyTUPhfNbfbS40Spgij5mV5k37bOZgt8iHKCbfGs5I= +github.com/hetznercloud/hcloud-go/v2 v2.10.2/go.mod h1:xQ+8KhIS62W0D78Dpi57jsufWh844gUw1az5OUvaeq8= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= @@ -554,11 +630,15 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/ionos-cloud/sdk-go/v6 v6.1.11 h1:J/uRN4UWO3wCyGOeDdMKv8LWRzKu6UIkLEaes38Kzh8= github.com/ionos-cloud/sdk-go/v6 v6.1.11/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= +github.com/jarcoal/httpmock v1.3.1 h1:iUx3whfZWVf3jT01hQTO/Eo5sAYtB2/rqaUuOtpInww= +github.com/jarcoal/httpmock v1.3.1/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= @@ -566,12 +646,14 @@ github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= 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/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= github.com/karrick/godirwalk v1.17.0 h1:b4kY7nqDdioR/6qnbHQyDvmA17u5G1cZ6J+CZXwSWoI= @@ -580,18 +662,18 @@ github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvW github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -604,19 +686,19 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leodido/go-syslog/v4 v4.1.0 h1:Wsl194qyWXr7V6DrGWC3xmxA9Ra6XgWO+toNt2fmCaI= -github.com/leodido/go-syslog/v4 v4.1.0/go.mod h1:eJ8rUfDN5OS6dOkCOBYlg2a+hbAg6pJa99QXXgMrd98= +github.com/leodido/go-syslog/v4 v4.2.0 h1:A7vpbYxsO4e2E8udaurkLlxP5LDpDbmPMsGnuhb7jVk= +github.com/leodido/go-syslog/v4 v4.2.0/go.mod h1:eJ8rUfDN5OS6dOkCOBYlg2a+hbAg6pJa99QXXgMrd98= github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b h1:11UHH39z1RhZ5dc4y4r/4koJo6IYFgTRMe/LlwRTEw0= github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b/go.mod h1:WZxr2/6a/Ar9bMDc2rN/LJrE/hF6bXE4LPyDSIxwAfg= -github.com/leoluk/perflib_exporter v0.2.1 h1:/3/ut1k/jFt5p4ypjLZKDHDqlXAK6ERZPVWtwdI389I= -github.com/leoluk/perflib_exporter v0.2.1/go.mod h1:MinSWm88jguXFFrGsP56PtleUb4Qtm4tNRH/wXNXRTI= github.com/lightstep/go-expohisto v1.0.0 h1:UPtTS1rGdtehbbAF7o/dhkWLTDI73UifG8LbfQI7cA4= github.com/lightstep/go-expohisto v1.0.0/go.mod h1:xDXD0++Mu2FOaItXtdDfksfgxfV0z1TMPa+e/EUd0cs= -github.com/linode/linodego v1.33.0 h1:cX2FYry7r6CA1ujBMsdqiM4VhvIQtnWsOuVblzfBhCw= -github.com/linode/linodego v1.33.0/go.mod h1:dSJJgIwqZCF5wnpuC6w5cyIbRtcexAm7uVvuJopGB40= +github.com/linode/linodego v1.37.0 h1:B/2Spzv9jYXzKA+p+GD8fVCNJ7Wuw6P91ZDD9eCkkso= +github.com/linode/linodego v1.37.0/go.mod h1:L7GXKFD3PoN2xSEtFc04wIXP5WK65O10jYQx0PQISWQ= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c h1:VtwQ41oftZwlMnOEbMWQtSEUgU64U4s+GHk7hZK+jtY= github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE= +github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= +github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= @@ -625,26 +707,46 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/miekg/dns v1.1.58 h1:ca2Hdkz+cDg/7eNF6V56jjzuZ4aCAE+DbVkILdQWG/4= -github.com/miekg/dns v1.1.58/go.mod h1:Ypv+3b/KadlvW9vJfXOTf300O4UqaHFzFCuHz+rPkBY= +github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04nTH68g= +github.com/maxatome/go-testdeep v1.12.0/go.mod h1:lPZc/HAcJMP92l7yI6TRz1aZN5URwUBUAfUNvrclaNM= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs= +github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4= -github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= +github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c h1:cqn374mizHuIWj+OSJCajGr/phAmuMug9qIX3l9CflE= github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -654,8 +756,10 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/mostynb/go-grpc-compression v1.2.2 h1:XaDbnRvt2+1vgr0b/l0qh4mJAfIxE0bKXtz2Znl3GGI= -github.com/mostynb/go-grpc-compression v1.2.2/go.mod h1:GOCr2KBxXcblCuczg3YdLQlcin1/NfyDA348ckuCH6w= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mostynb/go-grpc-compression v1.2.3 h1:42/BKWMy0KEJGSdWvzqIyOZ95YcR9mLPqKctH7Uo//I= +github.com/mostynb/go-grpc-compression v1.2.3/go.mod h1:AghIxF3P57umzqM9yz795+y1Vjs47Km/Y2FE6ouQ7Lg= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= @@ -664,17 +768,18 @@ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= -github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= +github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= +github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg= -github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= @@ -690,34 +795,48 @@ github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142/go.mod h1:fjS8 github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/outcaste-io/ristretto v0.2.1 h1:KCItuNIGJZcursqHr3ghO7fc5ddZLEHspL9UR0cQM64= github.com/outcaste-io/ristretto v0.2.1/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= -github.com/ovh/go-ovh v1.4.3 h1:Gs3V823zwTFpzgGLZNI6ILS4rmxZgJwJCz54Er9LwD0= -github.com/ovh/go-ovh v1.4.3/go.mod h1:AkPXVtgwB6xlKblMjRKJJmjRp+ogrE7fz2lVgcQY8SY= +github.com/ovh/go-ovh v1.6.0 h1:ixLOwxQdzYDx296sXcgS35TOPEahJkpjMGtzPadCjQI= +github.com/ovh/go-ovh v1.6.0/go.mod h1:cTVDnl94z4tl8pP1uZ/8jlVxntjSIf09bNcQ5TJSC7c= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= -github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= -github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= +github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c h1:dAMKvw0MlJT1GshSTtih8C2gDs04w8dReiOGXrGLNoY= +github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c h1:NRoLoZvkBTKvR5gQLgA3e0hqjkY9u1wm+iOL45VN/qI= github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus-community/windows_exporter v0.27.2 h1:/tdRTouPMVsC4qt8+s9NOPEm7L/9qdDxmasiETlx+Wk= +github.com/prometheus-community/windows_exporter v0.27.2/go.mod h1:8+T6hfv71nvgVIzguouXkIGoa15ni+uXHHULBOA2bZo= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -728,56 +847,70 @@ github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7q github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.61.0 h1:3gv/GThfX0cV2lpO7gkTUwZru38mxevy90Bj8YFSRQQ= +github.com/prometheus/common v0.61.0/go.mod h1:zr29OCN/2BsJRaFwG8QOBr41D6kkchKbpeNH7pAjb/s= github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e h1:UmqAuY2OyDoog8+l5FybViJE5B2r+UxVGCUwFTsY5AA= -github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e/go.mod h1:+0ld+ozir7zWFcHA2vVpWAKxXakIioEjPPNOqH+J3ZA= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/prometheus/prometheus v0.54.1 h1:vKuwQNjnYN2/mDoWfHXDhAsz/68q/dQDb+YbcEqU7MQ= +github.com/prometheus/prometheus v0.54.1/go.mod h1:xlLByHhk2g3ycakQGrMaU8K7OySZx98BzeCR99991NY= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.25 h1:/8rfZAdFfafRXOgz+ZpMZZWZ5pYggCY9t7e/BvjaBHM= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.25/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.29 h1:BkTk4gynLjguayxrYxZoMZjBnAOh7ntQvUkOFmkMqPU= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.29/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/secure-systems-lab/go-securesystemslib v0.7.0 h1:OwvJ5jQf9LnIAS83waAjPbcMsODrTQUpJ02eNLUoxBg= github.com/secure-systems-lab/go-securesystemslib v0.7.0/go.mod h1:/2gYnlnHVQ6xeGtfIqFy7Do03K4cdCY0A/GlJLDKLHI= github.com/shirou/gopsutil/v3 v3.22.12/go.mod h1:Xd7P1kwZcp5VW52+9XsirIKd/BROzbb2wdX3Kqlz9uI= -github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= -github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= +github.com/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI= +github.com/shirou/gopsutil/v3 v3.24.5/go.mod h1:bsoOS1aStSs9ErQ1WWfxllSeS1K5D+U30r2NfcubMVk= +github.com/shirou/gopsutil/v4 v4.24.11 h1:WaU9xqGFKvFfsUv94SXcUPD7rCkU0vr/asVdQOBZNj8= +github.com/shirou/gopsutil/v4 v4.24.11/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= -github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= -github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= +github.com/shoenig/test v1.7.1 h1:UJcjSAI3aUKx52kfcfhblgyhZceouhvvs3OYdWgn+PY= +github.com/shoenig/test v1.7.1/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= -github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= -github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= -github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= +github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w= +github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -795,27 +928,41 @@ github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= 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 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tinylib/msgp v1.1.9 h1:SHf3yoO2sGA0veCJeCBYLHuttAVFHGm2RHgNodW7wQU= -github.com/tinylib/msgp v1.1.9/go.mod h1:BCXGB54lDD8qUEPmiG0cQQUANC4IUQyB2ItS2UDlO/k= +github.com/tidwall/gjson v1.10.2 h1:APbLGOM0rrEkd8WBw9C24nllro4ajFuJu0Sc9hRz8Bo= +github.com/tidwall/gjson v1.10.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/tinylru v1.1.0 h1:XY6IUfzVTU9rpwdhKUF6nQdChgCdGjkMfLzbWyiau6I= +github.com/tidwall/tinylru v1.1.0/go.mod h1:3+bX+TJ2baOLMWTnlyNWHh4QMnFyARg2TLTQ6OFbzw8= +github.com/tidwall/wal v1.1.8 h1:2qDSGdAdjaY3PEvHRva+9UFqgk+ef7cOiW1Qn5JH1y0= +github.com/tidwall/wal v1.1.8/go.mod h1:r6lR1j27W9EPalgHiB7zLJDYu3mzW5BQP5KrzBpYY/E= +github.com/tinylib/msgp v1.2.5 h1:WeQg1whrXRFiZusidTQqzETkRpGjFjcIhW6uqWH09po= +github.com/tinylib/msgp v1.2.5/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU= +github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY= github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY= +github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20200122045848-3419fae592fc/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 h1:SIKIoA4e/5Y9ZOl0DCe3eVMLPOQzJxgZpfdHHeauNTM= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6/go.mod h1:BUbeWZiieNxAuuADTBNb3/aeje6on3DhU3rpWsQSB1E= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= @@ -827,6 +974,8 @@ github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vb github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= github.com/vultr/govultr/v2 v2.17.2 h1:gej/rwr91Puc/tgh+j33p/BLR16UrIPnSr+AIwYWZQs= github.com/vultr/govultr/v2 v2.17.2/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -834,6 +983,7 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= @@ -845,134 +995,197 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/configgrpc v0.102.0 h1:cQi5HwpkHvrZJUxZjoGXkWpAuK+gEyp/1Zjn0BrkvmQ= -go.opentelemetry.io/collector/config/configgrpc v0.102.0/go.mod h1:ASpBXzDWLiDGlG8iRFovU5R4LhAefoC4ajm+qIdslOw= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/confignet v0.102.0 h1:+wQevJ/iBnPxL+roY7WWnAjMxB8v4M5QrS3+0iEmauw= -go.opentelemetry.io/collector/config/confignet v0.102.0/go.mod h1:pfOrCTfSZEB6H2rKtx41/3RN4dKs+X2EKQbw3MGRh0E= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0 h1:8Ne/oL6M4kMWK0P3FKV9EduQa+1UOGyVAnFHfSo4c1A= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0/go.mod h1:Xj4Ld/RriP/Bj+5oPpaYJsLNs2wWRDN2TvzX3Lbi6+M= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0 h1:o1iKqN+oM+TZqHoGdnKw1Am2BQlIGCYbxCRzU8T3jbM= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0/go.mod h1:JpCemLtL/sXQ2Rk3Bx7OPPA7Qt/9NVH91q0bR655gSo= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0 h1:SfASE6lxXjrmYj/UibcWdOiFWvRG0zt4hJgenloEhlY= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0/go.mod h1:+Ku0Fvdb5f6e9UkfqJXAV5FaUJVxxg6Ykfx7Js8y+V4= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0 h1:GwJQTXs7pYPUv/fVf+0nBgsJdlrTuY/PfwQ/TRA/sIk= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0/go.mod h1:PGE3DcRgqYWWC2cq2hYZoET1d3Q8JZyPNmgvqXPFWEU= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0 h1:zdYZLiHHtDf4Kk9WU7mW9dW6WAXtBF54I5jmTMRJtiw= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0/go.mod h1:yFsgUM0PbUJkPlbpJfOG6da+YiF0Z80tv7YcnL3qwv4= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0 h1:Y4H+GaCQl2URp9mEJMV5CYOhw+erONqNyvtFoKQfIoA= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0/go.mod h1:g1RjfVD0gHAf/mPOIs3zBoKBeuDsN+rc5x0lZtgA8tI= -go.opentelemetry.io/collector/connector v0.102.0 h1:IvAsVfYRxP0ajmKbUovF8qugkcUtHq6RuYNtjcMa63E= -go.opentelemetry.io/collector/connector v0.102.0/go.mod h1:f4M7wZ/9+XtgTE0fivBFH3WlwntaEd0qFFA0giFkdnY= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/exporter/debugexporter v0.102.0 h1:b8z8EHdb3Q4f1A/lr6zP9aVv+7HTsouV0XCR8zb+R4w= -go.opentelemetry.io/collector/exporter/debugexporter v0.102.0/go.mod h1:fuFR9OIDtNe/ZGUp1YwrO2t0jy1/AIi4P93e+OoMCWA= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/extension/zpagesextension v0.102.0 h1:BPq98py8nwzaV7KAsxt4ZZAF9LiSRu7ZjHNGavFNyKo= -go.opentelemetry.io/collector/extension/zpagesextension v0.102.0/go.mod h1:P86HW3x3epDS5F4yP0gAvsZiw4xxP1OupTEx2o6UqjY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/filter v0.102.0 h1:2K4Q/l4b+tglMAQmxpscuCr/juyozyPx17Q6Dfm2FwU= -go.opentelemetry.io/collector/filter v0.102.0/go.mod h1:zDVjFCeeVct7hYwejzx+aRC1dbHaPsvv/Ob1SvCiQjE= -go.opentelemetry.io/collector/otelcol v0.102.0 h1:HuE+ok4iUjOrmYhQBSWpG5kBTVhcA24ljPL4pBERZ5E= -go.opentelemetry.io/collector/otelcol v0.102.0/go.mod h1:w8pCRu2nM/jAkLlEAS6ccKtJv5ylUQe6Ugl98zzTfyE= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/processor v0.102.0 h1:JsjTlpBRmoSYxcu3cAbKBchOmL6aNUxLa03ZkWIqZr8= -go.opentelemetry.io/collector/processor v0.102.0/go.mod h1:IaCSDcfy75uQTaOM+LgR1bMf/bUw2eFfzn20uvWYfLQ= -go.opentelemetry.io/collector/processor/batchprocessor v0.102.0 h1:lJSIMwip+Po5jOF/4dpx6c/3N45KJTr/UZoT086T4mI= -go.opentelemetry.io/collector/processor/batchprocessor v0.102.0/go.mod h1:e71Y6SnrCjD19dPjxWWi/kXa5tb0J8rC+9xl/72mLo4= -go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.102.0 h1:osoITPX0RITC8gJkyaNC6rqSKFl9wCeOqagjdNZUL70= -go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.102.0/go.mod h1:2OVM2IJOWVdxkOOt0WCyQSMv2T19OSKNIy1KCqHGXyY= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0 h1:eLc+AK0IQDDysrMt3SLwKaOFIjEwdO8ipwSck3+TUXE= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0/go.mod h1:p9yeFJktNrpwV9ATvaWeZwCMvVkVWnrfbJ4RHI/RS/I= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/collector/service v0.102.0 h1:B5nfyQZF7eB/y+yucl9G/7VsusbXixYXWingXn7VszM= -go.opentelemetry.io/collector/service v0.102.0/go.mod h1:c+0n0DfQeCjgrdplNHYwYbG/5aupTZVYU/50nMQraoc= -go.opentelemetry.io/contrib/config v0.7.0 h1:b1rK5tGTuhhPirJiMxOcyQfZs76j2VapY6ODn3b2Dbs= -go.opentelemetry.io/contrib/config v0.7.0/go.mod h1:8tdiFd8N5etOi3XzBmAoMxplEzI3TcL8dU5rM5/xcOQ= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 h1:vS1Ao/R55RNV4O7TA2Qopok8yN+X0LIP6RVWLFkprck= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0/go.mod h1:BMsdeOxN04K0L5FNUBfjFdvwWGNe/rkmSwH4Aelu/X0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/contrib/propagators/b3 v1.27.0 h1:IjgxbomVrV9za6bRi8fWCNXENs0co37SZedQilP2hm0= -go.opentelemetry.io/contrib/propagators/b3 v1.27.0/go.mod h1:Dv9obQz25lCisDvvs4dy28UPh974CxkahRDUPsY7y9E= -go.opentelemetry.io/contrib/zpages v0.52.0 h1:MPgkMy0Cp3O5EdfVXP0ss3ujhEibysTM4eszx7E7d+E= -go.opentelemetry.io/contrib/zpages v0.52.0/go.mod h1:fqG5AFdoYru3A3DnhibVuaaEfQV2WKxE7fYE1jgDRwk= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/bridge/opencensus v1.27.0 h1:ao9aGGHd+G4YfjBpGs6vbkvt5hoC67STlJA9fCnOAcs= -go.opentelemetry.io/otel/bridge/opencensus v1.27.0/go.mod h1:uRvWtAAXzyVOST0WMPX5JHGBaAvBws+2F8PcC5gMnTk= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 h1:bFgvUr3/O4PHj3VQcFEuYKvRZJX1SJDQ+11JXuSB3/w= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0/go.mod h1:xJntEd2KL6Qdg5lwp97HMLQDVeAhrYxmzFseAMDPQ8I= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 h1:CIHWikMsN3wO+wq1Tp5VGdVRTcON+DmOJSfDjXypKOc= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0/go.mod h1:TNupZ6cxqyFEpLXAZW7On+mLFL0/g0TE3unIYL91xWc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0 h1:/jlt1Y8gXWiHG9FBx6cJaIC5hYx5Fe64nC8w5Cylt/0= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0/go.mod h1:bmToOGOBZ4hA9ghphIc1PAf66VA8KOtsuy3+ScStG20= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 h1:/0YaXu3755A/cFbtXp+21lkXgI0QE5avTWA2HjU9/WE= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0/go.mod h1:m7SFxp0/7IxmJPLIY3JhOcU9CoFzDaCPL6xxQIxhA+o= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= -go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= -go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= +go.opentelemetry.io/collector v0.116.0 h1:Dscd6Nsnc7hjFQosO0SofcPQsXRfcj5N5PjQAslnmj4= +go.opentelemetry.io/collector v0.116.0/go.mod h1:Ug2hpW0SINPmJAGVEALRlux78NTZc3YXSuh5/Q/hFrA= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/configgrpc v0.116.0 h1:O8Y1X9wDH5dDdqDJ9kqoaMrxEauaDSJBg9aNC6QgB7g= +go.opentelemetry.io/collector/config/configgrpc v0.116.0/go.mod h1:RPrSQrr6xhIaAK2DdcECi142NjSo0npQfVQB3nommSo= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/confignet v1.22.0 h1:SBEMHJZWD8J4qgFw1O+BEkXW9AWldDi6Fz5YeDeoU58= +go.opentelemetry.io/collector/config/confignet v1.22.0/go.mod h1:ZppUH1hgUJOubawEsxsQ9MzEYFytqo2GnVSS7d4CVxc= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0 h1:AdHaQo/GSSRLJvEFLCMHo02r+u6Ed8j0/MNz7u3noug= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0/go.mod h1:InKYEGFdkwz3H2q648kT6rMCFBhPvevIW9ZbWIY5QR4= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0 h1:upFhnU8EyPp0WMR53mJIdx+UR2EGFOr+ppYKzUCY/Vg= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0/go.mod h1:FhjMWU5nf3IctX27lVZomM5SKMyRywShRsA4/rHoBe8= +go.opentelemetry.io/collector/confmap/provider/httpprovider v1.22.0 h1:jKLicfZRiA+G/sgso26aM6Dmmva4Dx9Txk2R58+R3e8= +go.opentelemetry.io/collector/confmap/provider/httpprovider v1.22.0/go.mod h1:nZhEGDufHuZAaeVyFVz15IluXwrnQRCp+U/w7j8Lx9Y= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.22.0 h1:dkiNwLxBqeNDN5fIwtvr2GoA0I2xZB2SEdQ9ceBbJVs= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.22.0/go.mod h1:P9SxKZvim1C3K1R2j3gI+Qb4/l9MffX2sY5f9ajsk7Y= +go.opentelemetry.io/collector/connector v0.116.0 h1:0Pz8RAXH1swLeA1fiyGGQWdv0Kemz4mbq+jnmd1TACE= +go.opentelemetry.io/collector/connector v0.116.0/go.mod h1:VQiZ2yW9KhZuF0yjDbvlgrAxm7+o8KQoxHxurQWLjKU= +go.opentelemetry.io/collector/connector/connectortest v0.116.0 h1:MdttvjqdZmp0ewW5IPCEtzzYmCqxrQxsjJ5m6gMVjzA= +go.opentelemetry.io/collector/connector/connectortest v0.116.0/go.mod h1:ko7aPyvAVf6SvRhWGZdPXSyk+7zPmsSCcMq0gYPMMIQ= +go.opentelemetry.io/collector/connector/xconnector v0.116.0 h1:fFJzrRco0g7HMkhnQ+ehlvicFf58vzsCLXnfuHyQM8w= +go.opentelemetry.io/collector/connector/xconnector v0.116.0/go.mod h1:m9oCk32zX6wDciYBpy+qMQkWKtOxb0gAkEUm8+trflY= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.116.0 h1:sSPDz4Qu7H86SrxtE6sQHDuWjFkTWHdKyGdsxhjZzcw= +go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.116.0/go.mod h1:0K7jbkCWtydn1IA3JwAUJeLVL79tJTxWoXR2gYTnCk0= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/debugexporter v0.116.0 h1:NCVGIkaA0eSDZPg0/NdWt7ivUmVukPVEixBDTulMa08= +go.opentelemetry.io/collector/exporter/debugexporter v0.116.0/go.mod h1:QZL/MKrgErI7O64ams2lmsQduLOkw/SLmtvS7W+iQNo= +go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.116.0 h1:BzMvZf9RKRcQPFjGnQSEWvfI5Er9kXfzyZ/4GHkUTa4= +go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.116.0/go.mod h1:RCbA3MNnZPTy2mViwQxMlnrq5moJ1XgetNQx2XHIpaI= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0 h1:bXDgoiDiwFfrO5S6q1Wpe0su303CW4Qxthoy4CxG6eg= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0/go.mod h1:uFZlAPxk2+s6zk1W+u22DgxxSDugWy0QaY5kQzjNy7Q= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/extension/zpagesextension v0.116.0 h1:D0VY/ESPwkREfMaqJleGVTiCYoCs3MDipU93ywaIn68= +go.opentelemetry.io/collector/extension/zpagesextension v0.116.0/go.mod h1:MqkQSYKarMrjVSyGrAes1FBcsW6HDDPj/ouvcDvSjfk= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/filter v0.116.0 h1:pvN3W2JIEHxWbCLlUS1HxrRo3ZQrN4BiWyLvPFyKfvQ= +go.opentelemetry.io/collector/filter v0.116.0/go.mod h1:GoLxnSI6uE6QzmGOaiz0mkgirbQpj2A2Nb18bTKv5gI= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 h1:KKFb3u8iLk4V5GYz7eVpw8QgEdob5koX6GNEbaoDQJY= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0/go.mod h1:YyWHUWeSnRmy2CF7kPHpwJ6qkVjufbLZ8PYuY0Ph0o8= +go.opentelemetry.io/collector/internal/memorylimiter v0.116.0 h1:xLt/2jPHvaWQiNle66DsTz3kRbWoQ93AEMfSeKyCdN0= +go.opentelemetry.io/collector/internal/memorylimiter v0.116.0/go.mod h1:12KU4unWjF3nxrpOuuTi4TGK3KaD+kzmgA2Vd86MhWU= +go.opentelemetry.io/collector/internal/sharedcomponent v0.116.0 h1:5QhpnwgogQhBrcsOjk1Yhkugopj043XlSDB1lpHKCGo= +go.opentelemetry.io/collector/internal/sharedcomponent v0.116.0/go.mod h1:wMQM1Sqbj6J6jNVBb5hawkCfmqrLJ0hAeDKkalUfrEY= +go.opentelemetry.io/collector/otelcol v0.116.0 h1:8NoPEY2uAemwNzUcMxiZuuI8w/Ff+0p1DXXk6NVEGlk= +go.opentelemetry.io/collector/otelcol v0.116.0/go.mod h1:c/EhsBdHmC44SxhWMi7pTlYB+I6GBSJNBsj9NCwXMxM= +go.opentelemetry.io/collector/otelcol/otelcoltest v0.116.0 h1:ZNg2kFLKnreaGSMfbr74k1yEbHLxG4ZbVvSIr+XleXo= +go.opentelemetry.io/collector/otelcol/otelcoltest v0.116.0/go.mod h1:TruQJSWWiDRlSYZTcLSE0GeECJZALDw8X8dvoYXUJ+A= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 h1:PFNy+Il/kqPdPL9rhG+1kG63Aauya+FhBKGXoB6ivxU= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0/go.mod h1:bVn9V4TGyeXi58/JDkeXCuKtc+V+qcOoTl8hNpV0qa8= +go.opentelemetry.io/collector/processor v0.116.0 h1:Kyu4tPzTdWNHtZjcxvI/bGNAgyv8L8Kem2r/Mk4IDAw= +go.opentelemetry.io/collector/processor v0.116.0/go.mod h1:+/Ugy48RAxlZEXmN2cw51W8t5wdHS9No+GAoP+moskk= +go.opentelemetry.io/collector/processor/batchprocessor v0.116.0 h1:jZMC+jlay3xCBBjcL85oT8nMFB5B3zvvwS6lW6xVGAc= +go.opentelemetry.io/collector/processor/batchprocessor v0.116.0/go.mod h1:KmLVhDjnatsZm5xQkgRLl12lwvHohmk3djJXfu8m33c= +go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.116.0 h1:7YwVMfpr0igtILydBFDXJsEGskI/4FIKPqc0hGIjJIE= +go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.116.0/go.mod h1:nMEGCezCKUedDmxTLNL9cpFUhG2ku8ThNn7t/wfKWI0= +go.opentelemetry.io/collector/processor/processorhelper/xprocessorhelper v0.116.0 h1:1tIEJSN3HeCY602B5h2b1K6ocNn/HMNC2E+u7o3ceZA= +go.opentelemetry.io/collector/processor/processorhelper/xprocessorhelper v0.116.0/go.mod h1:r8oKp+HrgZDp4L6RiNYoEk3x+LMrt9lEiCW6WiaYuJM= +go.opentelemetry.io/collector/processor/processortest v0.116.0 h1:+IqNEVEE0E2MsO2g7+Y/9dz35sDuvAXRXrLts9NdXrA= +go.opentelemetry.io/collector/processor/processortest v0.116.0/go.mod h1:DLaQDBxzgeeaUO0ULMn/efos9PmHZkmYCHuxwCsiVHI= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0 h1:iin/UwuWvSLB7ZNfINFUYbZ5lxIi1NjZ2brkyyFdiRA= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0/go.mod h1:cnA43/XpKDbaOmd8buqKp/LGJ2l/OoCqbR//u5DMfn8= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.116.0 h1:81u+wJsQp9VfrAdVpVvcV31YAs8qsZp/UnMmG9YCJ0A= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.116.0/go.mod h1:JXIwjUyh3Q+gNvr7YE937se4/E4UJ/oz5z9xbJeVl3M= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/scraper v0.116.0 h1:Gdg3v/QUZobHcAAewOlwlaE4XlkRQl3FFut906XuCiw= +go.opentelemetry.io/collector/scraper v0.116.0/go.mod h1:G4SmTIPG8RbxVhTF3zj4EFJx+1tceZbZxhS6mtXOeg0= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/collector/service v0.116.0 h1:1rFmax3ILOlQq4bW//0VKRcG/HmN2rxrgfTybn6bisU= +go.opentelemetry.io/collector/service v0.116.0/go.mod h1:CzQzj72mWr5arag+q8uUWGRuUkenNo5Gw9oA97SFZ78= +go.opentelemetry.io/contrib/bridges/otelzap v0.6.0 h1:j8icMXyyqNf6HGuwlYhniPnVsbJIq7n+WirDu3VAJdQ= +go.opentelemetry.io/contrib/bridges/otelzap v0.6.0/go.mod h1:evIOZpl+kAlU5IsaYX2Siw+IbpacAZvXemVsgt70uvw= +go.opentelemetry.io/contrib/config v0.10.0 h1:2JknAzMaYjxrHkTnZh3eOme/Y2P5eHE2SWfhfV6Xd6c= +go.opentelemetry.io/contrib/config v0.10.0/go.mod h1:aND2M6/KfNkntI5cyvHriR/zvZgPf8j9yETdSmvpfmc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 h1:yMkBS9yViCc7U7yeLzJPM2XizlfdVvBRSmsQDWu6qc0= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0/go.mod h1:n8MR6/liuGB5EmTETUBeU5ZgqMOlqKRxUaqPQBOANZ8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/contrib/propagators/b3 v1.31.0 h1:PQPXYscmwbCp76QDvO4hMngF2j8Bx/OTV86laEl8uqo= +go.opentelemetry.io/contrib/propagators/b3 v1.31.0/go.mod h1:jbqfV8wDdqSDrAYxVpXQnpM0XFMq2FtDesblJ7blOwQ= +go.opentelemetry.io/contrib/zpages v0.56.0 h1:W7vP6s3juzL5KiHpr41zLNmsJ0QAZudYu8ay0zGAoko= +go.opentelemetry.io/contrib/zpages v0.56.0/go.mod h1:IxPRP4TYHw9jLeaEOSDIiA9zmyJNZNO6sbW55iMvSXs= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0 h1:WzNab7hOOLzdDF/EoWCt4glhrbMPVMOO5JYTmpz36Ls= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0/go.mod h1:hKvJwTzJdp90Vh7p6q/9PAOd55dI6WA6sWj62a/JvSs= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 h1:mMOmtYie9Fx6TSVzw4W+NTpvoaS1JWWga37oI1a/4qQ= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0/go.mod h1:yy7nDsMMBUkD+jeekJ36ur5f3jJIrmCwUrY67VFhNpA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 h1:j7ZSD+5yn+lo3sGV69nW04rRR0jhYnBwjuX3r0HvnK0= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0/go.mod h1:WXbYJTUaZXAbYd8lbgGuvih0yuCfOFC5RJoYnoLcGz8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 h1:t/Qur3vKSkUCcDVaSumWF2PKHt85pc7fRvFuoVT8qFU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0/go.mod h1:Rl61tySSdcOJWoEgYZVtmnKdA0GeKrSqkHC1t+91CH8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 h1:IJFEoHiytixx8cMiVAO+GmHR6Frwu+u5Ur8njpFO6Ac= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0/go.mod h1:3rHrKNtLIoS0oZwkY2vxi+oJcwFRWdtUyRII+so45p8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 h1:9kV11HXBHZAvuPUZxmMWrH8hZn/6UnHX4K0mu36vNsU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0/go.mod h1:JyA0FHXe22E1NeNiHmVp7kFHglnexDQ7uRWDiiJ1hKQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 h1:lUsI2TYsQw2r1IASwoROaCnjdj2cvC2+Jbxvk6nHnWU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0/go.mod h1:2HpZxxQurfGxJlJDblybejHB6RX6pmExPNe517hREw4= +go.opentelemetry.io/otel/exporters/prometheus v0.54.0 h1:rFwzp68QMgtzu9PgP3jm9XaMICI6TsofWWPcBDKwlsU= +go.opentelemetry.io/otel/exporters/prometheus v0.54.0/go.mod h1:QyjcV9qDP6VeK5qPyKETvNjmaaEc7+gqjh4SS0ZYzDU= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 h1:TwmL3O3fRR80m8EshBrd8YydEZMcUCsZXzOUlnFohwM= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0/go.mod h1:tH98dDv5KPmPThswbXA0fr0Lwfs+OhK8HgaCo7PjRrk= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 h1:SZmDnHcgp3zwlPBS2JX2urGYe/jBKEIT6ZedHRUyCz8= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0/go.mod h1:fdWW0HtZJ7+jNpTKUR0GpMEDP69nR8YBJQxNiVCE3jk= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 h1:UGZ1QwZWY67Z6BmckTU+9Rxn04m2bD3gD6Mk0OIOCPk= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0/go.mod h1:fcwWuDuaObkkChiDlhEpSq9+X1C0omv+s5mBtToAQ64= +go.opentelemetry.io/otel/log v0.8.0 h1:egZ8vV5atrUWUbnSsHn6vB8R21G2wrKqNiDt3iWertk= +go.opentelemetry.io/otel/log v0.8.0/go.mod h1:M9qvDdUTRCopJcGRKg57+JSQ9LgLBrwwfC32epk5NX8= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/log v0.8.0 h1:zg7GUYXqxk1jnGF/dTdLPrK06xJdrXgqgFLnI4Crxvs= +go.opentelemetry.io/otel/sdk/log v0.8.0/go.mod h1:50iXr0UVwQrYS45KbruFrEt4LvAdCaWWgIrsN3ZQggo= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/dig v1.17.0 h1:5Chju+tUvcC+N7N6EV08BJz41UZuO3BmHcN4A287ZLI= -go.uber.org/dig v1.17.0/go.mod h1:rTxpf7l5I0eBTlE6/9RL+lDybC7WFwY2QH55ZSjy1mU= -go.uber.org/fx v1.18.2 h1:bUNI6oShr+OVFQeU8cDNbnN7VFsu+SsjHzUF51V/GAU= -go.uber.org/fx v1.18.2/go.mod h1:g0V1KMQ66zIRk8bLu3Ea5Jt2w/cHlOIp4wdRsgh0JaY= +go.uber.org/dig v1.18.0 h1:imUL1UiY0Mg4bqbFfsRQO5G4CGRBec/ZujWTvSVp3pw= +go.uber.org/dig v1.18.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= +go.uber.org/fx v1.22.2 h1:iPW+OPxv0G8w75OemJ1RAnTUrF55zOJlXlo1TbJ0Buw= +go.uber.org/fx v1.22.2/go.mod h1:o/D9n+2mLP6v1EG+qsdT1O8wKopYAsqZasju97SDFCU= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= @@ -989,14 +1202,17 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1007,8 +1223,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= +golang.org/x/exp v0.0.0-20241210194714-1829a127f884 h1:Y/Mj/94zIQQGHVSv1tTtQBDaQaJe62U9bkDZKKyhPCU= +golang.org/x/exp v0.0.0-20241210194714-1829a127f884/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1021,7 +1237,6 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -1031,11 +1246,11 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1054,6 +1269,7 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1070,27 +1286,29 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= -golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1102,14 +1320,18 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1121,11 +1343,15 @@ golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/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= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1137,37 +1363,50 @@ golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1176,14 +1415,19 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= +golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1201,6 +1445,7 @@ golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/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-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1232,23 +1477,19 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= -golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8= +golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= -gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= +gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= +gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1265,18 +1506,14 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.169.0 h1:QwWPy71FgMWqJN/l6jVlFHUa29a7dcUy02I8o799nPY= -google.golang.org/api v0.169.0/go.mod h1:gpNOiMA2tZ4mf5R9Iwf4rK/Dcz0fbdIgWYWVoxmsyLg= +google.golang.org/api v0.188.0 h1:51y8fJ/b1AaaBRJr4yWm96fPcuxSo0JcegXE3DaHQHw= +google.golang.org/api v0.188.0/go.mod h1:VR0d+2SIiWOYG3r/jdm7adPW9hI2aRv9ETOSCQ9Beag= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -1309,17 +1546,10 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 h1:P8OJ/WCl/Xo4E4zoe4/bifHpSmmKwARqyqE4nW6J2GQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1334,12 +1564,9 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1350,8 +1577,9 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1360,6 +1588,8 @@ gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= +gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= @@ -1375,6 +1605,7 @@ gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -1382,6 +1613,8 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/zorkian/go-datadog-api.v2 v2.30.0 h1:umQdVO0Ytx+kYadhuJNjFtDgIsIEBnKrOTvNuu8ClKI= gopkg.in/zorkian/go-datadog-api.v2 v2.30.0/go.mod h1:kx0CSMRpzEZfx/nFH62GLU4stZjparh/BRpM89t4XCQ= +gotest.tools/v3 v3.2.0 h1:I0DwBVMGAx26dttAj1BtJLAkVGncrkkUXfJLC4Flt/I= +gotest.tools/v3 v3.2.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1390,28 +1623,28 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.21.1/go.mod h1:FstGROTmsSHBarKc8bylzXih8BLNYTiS3TZcsoEDg2s= -k8s.io/api v0.29.3 h1:2ORfZ7+bGC3YJqGpV0KSDDEVf8hdGQ6A03/50vj8pmw= -k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80= +k8s.io/api v0.31.3 h1:umzm5o8lFbdN/hIXbrK9oRpOproJO62CV1zqxXrLgk8= +k8s.io/api v0.31.3/go.mod h1:UJrkIp9pnMOI9K2nlL6vwpxRzzEX5sWgn8kGQe92kCE= k8s.io/apimachinery v0.21.1/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY= -k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= -k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= +k8s.io/apimachinery v0.31.3 h1:6l0WhcYgasZ/wk9ktLq5vLaoXJJr5ts6lkaQzgeYPq4= +k8s.io/apimachinery v0.31.3/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= k8s.io/client-go v0.21.1/go.mod h1:/kEw4RgW+3xnBGzvp9IWxKSNA+lXn3A7AuH3gdOAzLs= -k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg= -k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= +k8s.io/client-go v0.31.3 h1:CAlZuM+PH2cm+86LOBemaJI/lQ5linJ6UFxKX/SoG+4= +k8s.io/client-go v0.31.3/go.mod h1:2CgjPUTpv3fE5dNygAr2NcM8nhHzXvxB8KL5gYc3kJs= k8s.io/code-generator v0.21.1/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= -k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= 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= @@ -1422,5 +1655,5 @@ sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/exporter/datadogexporter/integrationtest/integration_test.go b/exporter/datadogexporter/integrationtest/integration_test.go index 7e7fce4b610c..ef586f5423b6 100644 --- a/exporter/datadogexporter/integrationtest/integration_test.go +++ b/exporter/datadogexporter/integrationtest/integration_test.go @@ -7,23 +7,28 @@ import ( "bytes" "compress/gzip" "context" + "encoding/json" "fmt" "io" - "os" + "net/http" "strings" + "sync" "testing" "time" + "github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil" pb "github.com/DataDog/datadog-agent/pkg/proto/pbgo/trace" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/tinylib/msgp/msgp" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/confmap" + "go.opentelemetry.io/collector/confmap/provider/envprovider" "go.opentelemetry.io/collector/confmap/provider/fileprovider" "go.opentelemetry.io/collector/connector" "go.opentelemetry.io/collector/exporter" "go.opentelemetry.io/collector/exporter/debugexporter" + "go.opentelemetry.io/collector/featuregate" "go.opentelemetry.io/collector/otelcol" "go.opentelemetry.io/collector/otelcol/otelcoltest" "go.opentelemetry.io/collector/processor" @@ -32,7 +37,9 @@ import ( "go.opentelemetry.io/collector/receiver/otlpreceiver" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" + "go.opentelemetry.io/otel/sdk/log" "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" apitrace "go.opentelemetry.io/otel/trace" @@ -40,144 +47,60 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/connector/datadogconnector" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/testutil" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor" + "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver" ) -const collectorConfig = ` -receivers: - otlp: - protocols: - http: - endpoint: "localhost:4318" - grpc: - endpoint: "localhost:4317" - -processors: - batch: - send_batch_size: 10 - timeout: 5s - tail_sampling: - decision_wait: 1s - policies: [ - { - name: sample_flag, - type: boolean_attribute, - boolean_attribute: { key: sampled, value: true }, - } - ] - -connectors: - datadog/connector: - traces: - compute_stats_by_span_kind: true - peer_tags_aggregation: true - peer_tags: ["extra_peer_tag"] - -exporters: - debug: - verbosity: detailed - datadog: - api: - key: "key" - tls: - insecure_skip_verify: true - host_metadata: - enabled: false - traces: - endpoint: %q - trace_buffer: 10 - metrics: - endpoint: %q - -service: - telemetry: - metrics: - level: none - pipelines: - traces: - receivers: [otlp] - processors: [batch] - exporters: [datadog/connector] - traces/2: # this pipeline uses sampling - receivers: [datadog/connector] - processors: [tail_sampling, batch] - exporters: [datadog, debug] - metrics: - receivers: [datadog/connector] - processors: [batch] - exporters: [datadog, debug]` - -const collectorConfigComputeTopLevelBySpanKind = ` -receivers: - otlp: - protocols: - http: - endpoint: "localhost:4318" - grpc: - endpoint: "localhost:4317" - -processors: - batch: - send_batch_size: 10 - timeout: 5s - -connectors: - datadog/connector: - traces: - compute_top_level_by_span_kind: true - -exporters: - debug: - verbosity: detailed - datadog: - api: - key: "key" - tls: - insecure_skip_verify: true - host_metadata: - enabled: false - traces: - endpoint: %q - trace_buffer: 10 - compute_top_level_by_span_kind: true - metrics: - endpoint: %q - -service: - telemetry: - metrics: - level: none - pipelines: - traces: - receivers: [otlp] - processors: [batch] - exporters: [datadog/connector] - traces/2: - receivers: [datadog/connector] - processors: [batch] - exporters: [datadog, debug] - metrics: - receivers: [datadog/connector] - processors: [batch] - exporters: [datadog, debug]` - -func TestIntegration(t *testing.T) { +// seriesSlice represents an unmarshalled series payload +type seriesSlice struct { + Series []series +} + +// series represents a metric series map +type series struct { + Metric string + Points []point +} + +// point represents a series metric datapoint +type point struct { + Timestamp int + Value float64 +} + +func TestIntegration_NativeOTelAPMStatsIngest(t *testing.T) { + previousVal := datadogconnector.NativeIngestFeatureGate.IsEnabled() + err := featuregate.GlobalRegistry().Set(datadogconnector.NativeIngestFeatureGate.ID(), true) + require.NoError(t, err) + defer func() { + err = featuregate.GlobalRegistry().Set(datadogconnector.NativeIngestFeatureGate.ID(), previousVal) + require.NoError(t, err) + }() + + testIntegration(t) +} + +func TestIntegration_LegacyOTelAPMStatsIngest(t *testing.T) { + testIntegration(t) +} + +func testIntegration(t *testing.T) { // 1. Set up mock Datadog server // See also https://github.com/DataDog/datadog-agent/blob/49c16e0d4deab396626238fa1d572b684475a53f/cmd/trace-agent/test/backend.go apmstatsRec := &testutil.HTTPRequestRecorderWithChan{Pattern: testutil.APMStatsEndpoint, ReqChan: make(chan []byte)} tracesRec := &testutil.HTTPRequestRecorderWithChan{Pattern: testutil.TraceEndpoint, ReqChan: make(chan []byte)} server := testutil.DatadogServerMock(apmstatsRec.HandlerFunc, tracesRec.HandlerFunc) defer server.Close() + t.Setenv("SERVER_URL", server.URL) // 2. Start in-process collector factories := getIntegrationTestComponents(t) - app, confFilePath := getIntegrationTestCollector(t, collectorConfig, server.URL, factories) + app := getIntegrationTestCollector(t, "integration_test_config.yaml", factories) go func() { assert.NoError(t, app.Run(context.Background())) }() defer app.Shutdown() - defer os.Remove(confFilePath) + waitForReadiness(app) // 3. Generate and send traces @@ -235,6 +158,7 @@ func getIntegrationTestComponents(t *testing.T) otelcol.Factories { factories.Receivers, err = receiver.MakeFactoryMap( []receiver.Factory{ otlpreceiver.NewFactory(), + prometheusreceiver.NewFactory(), }..., ) require.NoError(t, err) @@ -261,22 +185,18 @@ func getIntegrationTestComponents(t *testing.T) otelcol.Factories { return factories } -func getIntegrationTestCollector(t *testing.T, cfgStr string, url string, factories otelcol.Factories) (*otelcol.Collector, string) { - cfg := fmt.Sprintf(cfgStr, url, url) - - confFile, err := os.CreateTemp(os.TempDir(), "conf-") - require.NoError(t, err) - _, err = confFile.Write([]byte(cfg)) - require.NoError(t, err) - _, err = otelcoltest.LoadConfigAndValidate(confFile.Name(), factories) +func getIntegrationTestCollector(t *testing.T, cfgFile string, factories otelcol.Factories) *otelcol.Collector { + // https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/33594 + // nolint:staticcheck + _, err := otelcoltest.LoadConfigAndValidate(cfgFile, factories) require.NoError(t, err, "All yaml config must be valid.") appSettings := otelcol.CollectorSettings{ Factories: func() (otelcol.Factories, error) { return factories, nil }, ConfigProviderSettings: otelcol.ConfigProviderSettings{ ResolverSettings: confmap.ResolverSettings{ - URIs: []string{confFile.Name()}, - ProviderFactories: []confmap.ProviderFactory{fileprovider.NewFactory()}, + URIs: []string{cfgFile}, + ProviderFactories: []confmap.ProviderFactory{fileprovider.NewFactory(), envprovider.NewFactory()}, }, }, BuildInfo: component.BuildInfo{ @@ -288,7 +208,7 @@ func getIntegrationTestCollector(t *testing.T, cfgStr string, url string, factor app, err := otelcol.NewCollector(appSettings) require.NoError(t, err) - return app, confFile.Name() + return app } func waitForReadiness(app *otelcol.Collector) { @@ -363,15 +283,16 @@ func TestIntegrationComputeTopLevelBySpanKind(t *testing.T) { tracesRec := &testutil.HTTPRequestRecorderWithChan{Pattern: testutil.TraceEndpoint, ReqChan: make(chan []byte)} server := testutil.DatadogServerMock(apmstatsRec.HandlerFunc, tracesRec.HandlerFunc) defer server.Close() + t.Setenv("SERVER_URL", server.URL) // 2. Start in-process collector factories := getIntegrationTestComponents(t) - app, confFilePath := getIntegrationTestCollector(t, collectorConfigComputeTopLevelBySpanKind, server.URL, factories) + app := getIntegrationTestCollector(t, "integration_test_toplevel_config.yaml", factories) go func() { assert.NoError(t, app.Run(context.Background())) }() defer app.Shutdown() - defer os.Remove(confFilePath) + waitForReadiness(app) // 3. Generate and send traces @@ -517,3 +438,92 @@ func sendTracesComputeTopLevelBySpanKind(t *testing.T) { } time.Sleep(1 * time.Second) } + +func TestIntegrationLogs(t *testing.T) { + // 1. Set up mock Datadog server + // See also https://github.com/DataDog/datadog-agent/blob/49c16e0d4deab396626238fa1d572b684475a53f/cmd/trace-agent/test/backend.go + seriesRec := &testutil.HTTPRequestRecorderWithChan{Pattern: testutil.MetricV2Endpoint, ReqChan: make(chan []byte)} + doneChannel := make(chan bool) + var connectivityCheck sync.Once + var logsData testutil.JSONLogs + server := testutil.DatadogLogServerMock(seriesRec.HandlerFunc, func() (string, http.HandlerFunc) { + return "/api/v2/logs", func(w http.ResponseWriter, r *http.Request) { + doneConnectivityCheck := false + connectivityCheck.Do(func() { + // The logs agent performs a connectivity check upon initialization. + // This function mocks a successful response for the first request received. + w.WriteHeader(http.StatusAccepted) + doneConnectivityCheck = true + }) + if !doneConnectivityCheck { + jsonLogs := testutil.ProcessLogsAgentRequest(w, r) + logsData = append(logsData, jsonLogs...) + doneChannel <- true + } + } + }) + defer server.Close() + t.Setenv("SERVER_URL", server.URL) + + // 2. Start in-process collector + factories := getIntegrationTestComponents(t) + app := getIntegrationTestCollector(t, "integration_test_logs_config.yaml", factories) + go func() { + assert.NoError(t, app.Run(context.Background())) + }() + defer app.Shutdown() + + waitForReadiness(app) + + // 3. Generate and send logs + sendLogs(t, 5) + + // 4. Validate logs and metrics from the mock server + // Wait until `doneChannel` is closed and prometheus metrics are received. + var metricMap seriesSlice + for len(metricMap.Series) < 4 { + select { + case <-doneChannel: + assert.Len(t, logsData, 5) + case metricsBytes := <-seriesRec.ReqChan: + var smap seriesSlice + gz := getGzipReader(t, metricsBytes) + dec := json.NewDecoder(gz) + assert.NoError(t, dec.Decode(&smap)) + for _, s := range smap.Series { + if s.Metric == "otelcol_receiver_accepted_log_records" || s.Metric == "otelcol_exporter_sent_log_records" { + metricMap.Series = append(metricMap.Series, s) + } + } + case <-time.After(60 * time.Second): + t.Fail() + } + } + + // 5. Validate mock server received expected otelcol metric values + numAcceptedLogRecords := 0 + numSentLogRecords := 0 + assert.Len(t, metricMap.Series, 4) + for _, s := range metricMap.Series { + if s.Metric == "otelcol_receiver_accepted_log_records" { + numAcceptedLogRecords++ + assert.Len(t, s.Points, 1) + assert.Equal(t, 5.0, s.Points[0].Value) + } + if s.Metric == "otelcol_exporter_sent_log_records" { + numSentLogRecords++ + assert.Len(t, s.Points, 1) + assert.Equal(t, 5.0, s.Points[0].Value) + } + } + assert.Equal(t, 2, numAcceptedLogRecords) + assert.Equal(t, 2, numSentLogRecords) +} + +func sendLogs(t *testing.T, numLogs int) { + ctx := context.Background() + logExporter, err := otlploggrpc.New(ctx, otlploggrpc.WithInsecure()) + assert.NoError(t, err) + lr := make([]log.Record, numLogs) + assert.NoError(t, logExporter.Export(ctx, lr)) +} diff --git a/exporter/datadogexporter/integrationtest/integration_test_config.yaml b/exporter/datadogexporter/integrationtest/integration_test_config.yaml new file mode 100644 index 000000000000..c32bf27da49e --- /dev/null +++ b/exporter/datadogexporter/integrationtest/integration_test_config.yaml @@ -0,0 +1,56 @@ + +receivers: + otlp: + protocols: + http: + endpoint: "localhost:4318" + grpc: + endpoint: "localhost:4317" + +processors: + tail_sampling: + decision_wait: 1s + policies: [ + { + name: sample_flag, + type: boolean_attribute, + boolean_attribute: { key: sampled, value: true }, + } + ] + +connectors: + datadog/connector: + traces: + peer_tags: ["extra_peer_tag"] + +exporters: + debug: + verbosity: detailed + datadog: + api: + key: "aaa" + tls: + insecure_skip_verify: true + host_metadata: + enabled: false + traces: + endpoint: ${env:SERVER_URL} + trace_buffer: 10 + metrics: + endpoint: ${env:SERVER_URL} + +service: + telemetry: + metrics: + level: none + pipelines: + traces: + receivers: [otlp] + exporters: [datadog/connector] + traces/2: # this pipeline uses sampling + receivers: [datadog/connector] + processors: [tail_sampling] + exporters: [datadog, debug] + metrics: + receivers: [datadog/connector] + exporters: [datadog, debug] \ No newline at end of file diff --git a/exporter/datadogexporter/integrationtest/integration_test_internal_metrics_config.yaml b/exporter/datadogexporter/integrationtest/integration_test_internal_metrics_config.yaml new file mode 100644 index 000000000000..9100aecf8cad --- /dev/null +++ b/exporter/datadogexporter/integrationtest/integration_test_internal_metrics_config.yaml @@ -0,0 +1,43 @@ + +receivers: + otlp: + protocols: + http: + endpoint: "localhost:4318" + grpc: + endpoint: "localhost:4317" + prometheus: + config: + scrape_configs: + - job_name: 'otelcol' + scrape_interval: 1s + static_configs: + - targets: [ 'localhost:8888' ] + +exporters: + datadog: + api: + key: "aaa" + tls: + insecure_skip_verify: true + host_metadata: + enabled: false + traces: + endpoint: ${env:SERVER_URL} + metrics: + endpoint: ${env:SERVER_URL} + sums: + cumulative_monotonic_mode: raw_value + +service: + telemetry: + metrics: + level: basic + address: "localhost:8888" + pipelines: + traces: + receivers: [otlp] + exporters: [datadog] + metrics: + receivers: [prometheus] + exporters: [datadog] \ No newline at end of file diff --git a/exporter/datadogexporter/integrationtest/integration_test_logs_config.yaml b/exporter/datadogexporter/integrationtest/integration_test_logs_config.yaml new file mode 100644 index 000000000000..f02d45dafc16 --- /dev/null +++ b/exporter/datadogexporter/integrationtest/integration_test_logs_config.yaml @@ -0,0 +1,47 @@ + +receivers: + otlp: + protocols: + http: + endpoint: "localhost:4318" + grpc: + endpoint: "localhost:4317" + prometheus: + config: + scrape_configs: + - job_name: 'otelcol' + scrape_interval: 1s + static_configs: + - targets: [ 'localhost:8888' ] + metric_relabel_configs: + - source_labels: [ __name__ ] + regex: "(otelcol_receiver_accepted_log_records|otelcol_exporter_sent_log_records)" + action: keep + +exporters: + datadog: + api: + key: "aaa" + tls: + insecure_skip_verify: true + host_metadata: + enabled: false + logs: + endpoint: ${env:SERVER_URL} + metrics: + endpoint: ${env:SERVER_URL} + sums: + cumulative_monotonic_mode: raw_value + +service: + telemetry: + metrics: + level: basic + address: "localhost:8888" + pipelines: + logs: + receivers: [otlp] + exporters: [datadog] + metrics: + receivers: [prometheus] + exporters: [datadog] \ No newline at end of file diff --git a/exporter/datadogexporter/integrationtest/integration_test_toplevel_config.yaml b/exporter/datadogexporter/integrationtest/integration_test_toplevel_config.yaml new file mode 100644 index 000000000000..e542b95d3626 --- /dev/null +++ b/exporter/datadogexporter/integrationtest/integration_test_toplevel_config.yaml @@ -0,0 +1,45 @@ + +receivers: + otlp: + protocols: + http: + endpoint: "localhost:4318" + grpc: + endpoint: "localhost:4317" + +connectors: + datadog/connector: + traces: + compute_top_level_by_span_kind: true + +exporters: + debug: + verbosity: detailed + datadog: + api: + key: "aaa" + tls: + insecure_skip_verify: true + host_metadata: + enabled: false + traces: + endpoint: ${env:SERVER_URL} + trace_buffer: 10 + compute_top_level_by_span_kind: true + metrics: + endpoint: ${env:SERVER_URL} + +service: + telemetry: + metrics: + level: none + pipelines: + traces: + receivers: [otlp] + exporters: [datadog/connector] + traces/2: + receivers: [datadog/connector] + exporters: [datadog, debug] + metrics: + receivers: [datadog/connector] + exporters: [datadog, debug] \ No newline at end of file diff --git a/exporter/datadogexporter/integrationtest/no_race_integration_test.go b/exporter/datadogexporter/integrationtest/no_race_integration_test.go new file mode 100644 index 000000000000..a42262337550 --- /dev/null +++ b/exporter/datadogexporter/integrationtest/no_race_integration_test.go @@ -0,0 +1,98 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +//go:build !race + +package integrationtest // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/integrationtest" + +import ( + "context" + "encoding/json" + "runtime" + "testing" + "time" + + "github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil" + "github.com/stretchr/testify/assert" +) + +func TestIntegrationInternalMetrics(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("flaky test on windows https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/34836") + } + + // 1. Set up mock Datadog server + seriesRec := &testutil.HTTPRequestRecorderWithChan{Pattern: testutil.MetricV2Endpoint, ReqChan: make(chan []byte, 100)} + tracesRec := &testutil.HTTPRequestRecorderWithChan{Pattern: testutil.TraceEndpoint, ReqChan: make(chan []byte, 100)} + server := testutil.DatadogServerMock(seriesRec.HandlerFunc, tracesRec.HandlerFunc) + defer server.Close() + t.Setenv("SERVER_URL", server.URL) + + // 2. Start in-process collector + factories := getIntegrationTestComponents(t) + app := getIntegrationTestCollector(t, "integration_test_internal_metrics_config.yaml", factories) + go func() { + assert.NoError(t, app.Run(context.Background())) + }() + defer app.Shutdown() + + waitForReadiness(app) + + // 3. Generate and send traces + sendTraces(t) + + // 4. Validate Datadog trace agent & OTel internal metrics are sent to the mock server + expectedMetrics := map[string]struct{}{ + // Datadog internal metrics on trace and stats writers + "otelcol_datadog_otlp_translator_resources_missing_source": {}, + "otelcol_datadog_trace_agent_stats_writer_bytes": {}, + "otelcol_datadog_trace_agent_stats_writer_retries": {}, + "otelcol_datadog_trace_agent_stats_writer_stats_buckets": {}, + "otelcol_datadog_trace_agent_stats_writer_stats_entries": {}, + "otelcol_datadog_trace_agent_stats_writer_payloads": {}, + "otelcol_datadog_trace_agent_stats_writer_client_payloads": {}, + "otelcol_datadog_trace_agent_stats_writer_errors": {}, + "otelcol_datadog_trace_agent_stats_writer_splits": {}, + "otelcol_datadog_trace_agent_trace_writer_bytes": {}, + "otelcol_datadog_trace_agent_trace_writer_retries": {}, + "otelcol_datadog_trace_agent_trace_writer_spans": {}, + "otelcol_datadog_trace_agent_trace_writer_traces": {}, + "otelcol_datadog_trace_agent_trace_writer_payloads": {}, + "otelcol_datadog_trace_agent_trace_writer_errors": {}, + "otelcol_datadog_trace_agent_trace_writer_events": {}, + + // OTel collector internal metrics + "otelcol_process_memory_rss": {}, + "otelcol_process_runtime_total_sys_memory_bytes": {}, + "otelcol_process_uptime": {}, + "otelcol_process_cpu_seconds": {}, + "otelcol_process_runtime_heap_alloc_bytes": {}, + "otelcol_process_runtime_total_alloc_bytes": {}, + "otelcol_receiver_accepted_metric_points": {}, + "otelcol_receiver_accepted_spans": {}, + "otelcol_exporter_queue_capacity": {}, + "otelcol_exporter_queue_size": {}, + "otelcol_exporter_sent_spans": {}, + "otelcol_exporter_sent_metric_points": {}, + } + + metricMap := make(map[string]series) + for len(metricMap) < len(expectedMetrics) { + select { + case <-tracesRec.ReqChan: + // Drain the channel, no need to look into the traces + case metricsBytes := <-seriesRec.ReqChan: + var metrics seriesSlice + gz := getGzipReader(t, metricsBytes) + dec := json.NewDecoder(gz) + assert.NoError(t, dec.Decode(&metrics)) + for _, s := range metrics.Series { + if _, ok := expectedMetrics[s.Metric]; ok { + metricMap[s.Metric] = s + } + } + case <-time.After(60 * time.Second): + t.Fail() + } + } +} diff --git a/exporter/datadogexporter/internal/clientutil/api.go b/exporter/datadogexporter/internal/clientutil/api.go index 60bbaeb36dec..33e71a700c0e 100644 --- a/exporter/datadogexporter/internal/clientutil/api.go +++ b/exporter/datadogexporter/internal/clientutil/api.go @@ -6,6 +6,7 @@ package clientutil // import "github.com/open-telemetry/opentelemetry-collector- import ( "context" "errors" + "net/http" "github.com/DataDog/datadog-api-client-go/v2/api/datadog" "github.com/DataDog/datadog-api-client-go/v2/api/datadogV1" @@ -45,6 +46,9 @@ func ValidateAPIKey(ctx context.Context, apiKey string, logger *zap.Logger, apiC return nil } if err != nil { + if httpresp != nil && httpresp.StatusCode == http.StatusForbidden { + return WrapError(ErrInvalidAPI, httpresp) + } logger.Warn("Error while validating API key", zap.Error(err)) return nil } diff --git a/exporter/datadogexporter/internal/clientutil/error_converter.go b/exporter/datadogexporter/internal/clientutil/error_converter.go index b4b2417ce170..638c4d993c28 100644 --- a/exporter/datadogexporter/internal/clientutil/error_converter.go +++ b/exporter/datadogexporter/internal/clientutil/error_converter.go @@ -18,5 +18,5 @@ func WrapError(err error, resp *http.Response) error { } func isNonRetriable(resp *http.Response) bool { - return resp.StatusCode == 400 || resp.StatusCode == 404 || resp.StatusCode == 413 || resp.StatusCode == 403 + return resp.StatusCode == http.StatusBadRequest || resp.StatusCode == http.StatusNotFound || resp.StatusCode == http.StatusRequestEntityTooLarge || resp.StatusCode == http.StatusForbidden } diff --git a/exporter/datadogexporter/internal/clientutil/error_converter_test.go b/exporter/datadogexporter/internal/clientutil/error_converter_test.go index 656ec60e2e6c..d699762d3a4c 100644 --- a/exporter/datadogexporter/internal/clientutil/error_converter_test.go +++ b/exporter/datadogexporter/internal/clientutil/error_converter_test.go @@ -13,9 +13,9 @@ import ( ) func TestWrapError(t *testing.T) { - respOK := http.Response{StatusCode: 200} - respRetriable := http.Response{StatusCode: 402} - respNonRetriable := http.Response{StatusCode: 404} + respOK := http.Response{StatusCode: http.StatusOK} + respRetriable := http.Response{StatusCode: http.StatusPaymentRequired} + respNonRetriable := http.Response{StatusCode: http.StatusNotFound} err := fmt.Errorf("Test error") assert.False(t, consumererror.IsPermanent(WrapError(err, &respOK))) assert.False(t, consumererror.IsPermanent(WrapError(err, &respRetriable))) diff --git a/exporter/datadogexporter/internal/clientutil/http.go b/exporter/datadogexporter/internal/clientutil/http.go index 4b69ebdef6e3..adec653d0687 100644 --- a/exporter/datadogexporter/internal/clientutil/http.go +++ b/exporter/datadogexporter/internal/clientutil/http.go @@ -8,6 +8,7 @@ import ( "fmt" "net" "net/http" + "net/url" "time" "go.opentelemetry.io/collector/component" @@ -29,8 +30,14 @@ var ( // NewHTTPClient returns a http.Client configured with a subset of the confighttp.ClientConfig options. func NewHTTPClient(hcs confighttp.ClientConfig) *http.Client { + // If the ProxyURL field in the configuration is set, the HTTP client will use the proxy. + // Otherwise, the HTTP client will use the system's proxy settings. + httpProxy := http.ProxyFromEnvironment + if parsedProxyURL, err := url.Parse(hcs.ProxyURL); err == nil && parsedProxyURL.Scheme != "" { + httpProxy = http.ProxyURL(parsedProxyURL) + } transport := http.Transport{ - Proxy: http.ProxyFromEnvironment, + Proxy: httpProxy, // Default values consistent with https://github.com/DataDog/datadog-agent/blob/f9ae7f4b842f83b23b2dfe3f15d31f9e6b12e857/pkg/util/http/transport.go#L91-L106 DialContext: (&net.Dialer{ Timeout: 30 * time.Second, diff --git a/exporter/datadogexporter/internal/clientutil/http_test.go b/exporter/datadogexporter/internal/clientutil/http_test.go index db2eea93cb50..1327b85279c4 100644 --- a/exporter/datadogexporter/internal/clientutil/http_test.go +++ b/exporter/datadogexporter/internal/clientutil/http_test.go @@ -6,6 +6,7 @@ package clientutil // import "github.com/open-telemetry/opentelemetry-collector- import ( "crypto/tls" "net/http" + "net/url" "testing" "time" @@ -18,12 +19,10 @@ import ( "go.opentelemetry.io/collector/config/configtls" ) -var ( - buildInfo = component.BuildInfo{ - Command: "otelcontribcol", - Version: "1.0", - } -) +var buildInfo = component.BuildInfo{ + Command: "otelcontribcol", + Version: "1.0", +} func TestNewHTTPClient(t *testing.T) { hcsEmpty := confighttp.ClientConfig{} @@ -60,10 +59,10 @@ func TestNewHTTPClient(t *testing.T) { MaxConnsPerHost: &maxConnPerHost, DisableKeepAlives: true, TLSSetting: configtls.ClientConfig{InsecureSkipVerify: true}, + ProxyURL: "proxy", // The rest are ignored Endpoint: "endpoint", - ProxyURL: "proxy", Compression: configcompression.TypeSnappy, HTTP2ReadIdleTimeout: 15 * time.Second, HTTP2PingTimeout: 20 * time.Second, @@ -90,11 +89,76 @@ func TestNewHTTPClient(t *testing.T) { t.Errorf("Mismatched transports -want +got %s", diff) } assert.Equal(t, 10*time.Second, client2.Timeout) + + // Checking that the client config can receive ProxyUrl and + // it will be passed to the http client. + hcsForC3 := confighttp.ClientConfig{ + ReadBufferSize: 100, + WriteBufferSize: 200, + Timeout: 10 * time.Second, + IdleConnTimeout: &idleConnTimeout, + MaxIdleConns: &maxIdleConn, + MaxIdleConnsPerHost: &maxIdleConnPerHost, + MaxConnsPerHost: &maxConnPerHost, + DisableKeepAlives: true, + TLSSetting: configtls.ClientConfig{InsecureSkipVerify: true}, + ProxyURL: "http://datadog-proxy.myorganization.com:3128", + + // The rest are ignored + Endpoint: "endpoint", + Compression: configcompression.TypeSnappy, + HTTP2ReadIdleTimeout: 15 * time.Second, + HTTP2PingTimeout: 20 * time.Second, + } + ddURL, _ := url.Parse("https://datadoghq.com") + parsedProxy, _ := url.Parse("http://datadog-proxy.myorganization.com:3128") + client3 := NewHTTPClient(hcsForC3) + tr3 := client3.Transport.(*http.Transport) + url3, _ := tr3.Proxy(&http.Request{ + URL: ddURL, + }) + assert.Equal(t, url3, parsedProxy) + + // Checking that the client config can receive ProxyUrl to override the + // environment variable. + t.Setenv("HTTPS_PROXY", "http://datadog-proxy-from-env.myorganization.com:3128") + client4 := NewHTTPClient(hcsForC3) + tr4 := client4.Transport.(*http.Transport) + url4, _ := tr4.Proxy(&http.Request{ + URL: ddURL, + }) + assert.Equal(t, url4, parsedProxy) + + // Checking that in the absence of ProxyUrl in the client config, the + // environment variable is used for the http proxy. + hcsForC5 := confighttp.ClientConfig{ + ReadBufferSize: 100, + WriteBufferSize: 200, + Timeout: 10 * time.Second, + IdleConnTimeout: &idleConnTimeout, + MaxIdleConns: &maxIdleConn, + MaxIdleConnsPerHost: &maxIdleConnPerHost, + MaxConnsPerHost: &maxConnPerHost, + DisableKeepAlives: true, + TLSSetting: configtls.ClientConfig{InsecureSkipVerify: true}, + + // The rest are ignored + Endpoint: "endpoint", + Compression: configcompression.TypeSnappy, + HTTP2ReadIdleTimeout: 15 * time.Second, + HTTP2PingTimeout: 20 * time.Second, + } + parsedEnvProxy, _ := url.Parse("http://datadog-proxy-from-env.myorganization.com:3128") + client5 := NewHTTPClient(hcsForC5) + tr5 := client5.Transport.(*http.Transport) + url5, _ := tr5.Proxy(&http.Request{ + URL: ddURL, + }) + assert.Equal(t, url5, parsedEnvProxy) } func TestUserAgent(t *testing.T) { - - assert.Equal(t, UserAgent(buildInfo), "otelcontribcol/1.0") + assert.Equal(t, "otelcontribcol/1.0", UserAgent(buildInfo)) } func TestDDHeaders(t *testing.T) { @@ -102,6 +166,5 @@ func TestDDHeaders(t *testing.T) { apiKey := "apikey" SetDDHeaders(header, buildInfo, apiKey) assert.Equal(t, header.Get("DD-Api-Key"), apiKey) - assert.Equal(t, header.Get("USer-Agent"), "otelcontribcol/1.0") - + assert.Equal(t, "otelcontribcol/1.0", header.Get("USer-Agent")) } diff --git a/exporter/datadogexporter/internal/clientutil/retrier_test.go b/exporter/datadogexporter/internal/clientutil/retrier_test.go index a52ec759d56b..0c76b7a03004 100644 --- a/exporter/datadogexporter/internal/clientutil/retrier_test.go +++ b/exporter/datadogexporter/internal/clientutil/retrier_test.go @@ -26,7 +26,7 @@ func TestDoWithRetries(t *testing.T) { retryNum, err := retrier.DoWithRetries(ctx, func(context.Context) error { return nil }) require.NoError(t, err) - assert.Equal(t, retryNum, int64(0)) + assert.Equal(t, int64(0), retryNum) retrier = NewRetrier(zap.NewNop(), configretry.BackOffConfig{ @@ -39,18 +39,18 @@ func TestDoWithRetries(t *testing.T) { ) retryNum, err = retrier.DoWithRetries(ctx, func(context.Context) error { return errors.New("action failed") }) require.Error(t, err) - assert.Greater(t, retryNum, int64(0)) + assert.Positive(t, retryNum) } func TestNoRetriesOnPermanentError(t *testing.T) { scrubber := scrub.NewScrubber() retrier := NewRetrier(zap.NewNop(), configretry.NewDefaultBackOffConfig(), scrubber) ctx := context.Background() - respNonRetriable := http.Response{StatusCode: 404} + respNonRetriable := http.Response{StatusCode: http.StatusNotFound} retryNum, err := retrier.DoWithRetries(ctx, func(context.Context) error { return WrapError(fmt.Errorf("test"), &respNonRetriable) }) require.Error(t, err) - assert.Equal(t, retryNum, int64(0)) + assert.Equal(t, int64(0), retryNum) } diff --git a/exporter/datadogexporter/internal/hostmetadata/config.go b/exporter/datadogexporter/internal/hostmetadata/config.go index d5c4a3e34160..ad99d4f5bc18 100644 --- a/exporter/datadogexporter/internal/hostmetadata/config.go +++ b/exporter/datadogexporter/internal/hostmetadata/config.go @@ -4,6 +4,8 @@ package hostmetadata // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/hostmetadata" import ( + "time" + "go.opentelemetry.io/collector/config/confighttp" "go.opentelemetry.io/collector/config/configretry" ) @@ -26,4 +28,6 @@ type PusherConfig struct { ClientConfig confighttp.ClientConfig // RetrySettings of exporter. RetrySettings configretry.BackOffConfig + // ReporterPeriod is the period of the reporter goroutine. + ReporterPeriod time.Duration } diff --git a/exporter/datadogexporter/internal/hostmetadata/host.go b/exporter/datadogexporter/internal/hostmetadata/host.go index 8818bc99d656..99f267afc39c 100644 --- a/exporter/datadogexporter/internal/hostmetadata/host.go +++ b/exporter/datadogexporter/internal/hostmetadata/host.go @@ -5,6 +5,7 @@ package hostmetadata // import "github.com/open-telemetry/opentelemetry-collecto import ( "fmt" + "time" "github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes/source" "go.opentelemetry.io/collector/component" @@ -27,7 +28,7 @@ var _ = featuregate.GlobalRegistry().MustRegister( featuregate.WithRegisterToVersion("0.75.0"), ) -func GetSourceProvider(set component.TelemetrySettings, configHostname string) (source.Provider, error) { +func GetSourceProvider(set component.TelemetrySettings, configHostname string, timeout time.Duration) (source.Provider, error) { ecs, err := ecs.NewProvider(set) if err != nil { return nil, fmt.Errorf("failed to build ECS Fargate provider: %w", err) @@ -69,8 +70,8 @@ func GetSourceProvider(set component.TelemetrySettings, configHostname string) ( "system": system.NewProvider(set.Logger), }, []string{"config", "azure", "ecs", "ec2", "gcp", "kubernetes", "system"}, + timeout, ) - if err != nil { return nil, err } diff --git a/exporter/datadogexporter/internal/hostmetadata/host_test.go b/exporter/datadogexporter/internal/hostmetadata/host_test.go index 0ee989751839..f58b2fbea4b7 100644 --- a/exporter/datadogexporter/internal/hostmetadata/host_test.go +++ b/exporter/datadogexporter/internal/hostmetadata/host_test.go @@ -6,6 +6,7 @@ package hostmetadata import ( "context" "testing" + "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -13,9 +14,9 @@ import ( ) func TestHost(t *testing.T) { - p, err := GetSourceProvider(componenttest.NewNopTelemetrySettings(), "test-host") + p, err := GetSourceProvider(componenttest.NewNopTelemetrySettings(), "test-host", 31*time.Second) require.NoError(t, err) src, err := p.Source(context.Background()) require.NoError(t, err) - assert.Equal(t, src.Identifier, "test-host") + assert.Equal(t, "test-host", src.Identifier) } diff --git a/exporter/datadogexporter/internal/hostmetadata/internal/azure/provider.go b/exporter/datadogexporter/internal/hostmetadata/internal/azure/provider.go index bf66f14273ad..e6decc49f9be 100644 --- a/exporter/datadogexporter/internal/hostmetadata/internal/azure/provider.go +++ b/exporter/datadogexporter/internal/hostmetadata/internal/azure/provider.go @@ -15,8 +15,10 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders/azure" ) -var _ source.Provider = (*Provider)(nil) -var _ provider.ClusterNameProvider = (*Provider)(nil) +var ( + _ source.Provider = (*Provider)(nil) + _ provider.ClusterNameProvider = (*Provider)(nil) +) type Provider struct { detector azure.Provider diff --git a/exporter/datadogexporter/internal/hostmetadata/internal/ec2/ec2.go b/exporter/datadogexporter/internal/hostmetadata/internal/ec2/ec2.go index 0b53df8fc78b..ef20a5382106 100644 --- a/exporter/datadogexporter/internal/hostmetadata/internal/ec2/ec2.go +++ b/exporter/datadogexporter/internal/hostmetadata/internal/ec2/ec2.go @@ -21,9 +21,7 @@ import ( ec2provider "github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders/aws/ec2" ) -var ( - defaultPrefixes = [3]string{"ip-", "domu", "ec2amaz-"} -) +var defaultPrefixes = [3]string{"ip-", "domu", "ec2amaz-"} type HostInfo struct { InstanceID string @@ -43,7 +41,7 @@ func isDefaultHostname(hostname string) bool { } // GetHostInfo gets the hostname info from EC2 metadata -func GetHostInfo(logger *zap.Logger) (hostInfo *HostInfo) { +func GetHostInfo(ctx context.Context, logger *zap.Logger) (hostInfo *HostInfo) { sess, err := session.NewSession() hostInfo = &HostInfo{} @@ -54,18 +52,18 @@ func GetHostInfo(logger *zap.Logger) (hostInfo *HostInfo) { meta := ec2metadata.New(sess) - if !meta.Available() { + if !meta.AvailableWithContext(ctx) { logger.Debug("EC2 Metadata not available") return } - if idDoc, err := meta.GetInstanceIdentityDocument(); err == nil { + if idDoc, err := meta.GetInstanceIdentityDocumentWithContext(ctx); err == nil { hostInfo.InstanceID = idDoc.InstanceID } else { logger.Warn("Failed to get EC2 instance id document", zap.Error(err)) } - if ec2Hostname, err := meta.GetMetadata("hostname"); err == nil { + if ec2Hostname, err := meta.GetMetadataWithContext(ctx, "hostname"); err == nil { hostInfo.EC2Hostname = ec2Hostname } else { logger.Warn("Failed to get EC2 hostname", zap.Error(err)) @@ -82,8 +80,10 @@ func (hi *HostInfo) GetHostname(_ *zap.Logger) string { return hi.EC2Hostname } -var _ source.Provider = (*Provider)(nil) -var _ provider.ClusterNameProvider = (*Provider)(nil) +var ( + _ source.Provider = (*Provider)(nil) + _ provider.ClusterNameProvider = (*Provider)(nil) +) type Provider struct { once sync.Once @@ -104,12 +104,12 @@ func NewProvider(logger *zap.Logger) (*Provider, error) { }, nil } -func (p *Provider) fillHostInfo() { - p.once.Do(func() { p.hostInfo = *GetHostInfo(p.logger) }) +func (p *Provider) fillHostInfo(ctx context.Context) { + p.once.Do(func() { p.hostInfo = *GetHostInfo(ctx, p.logger) }) } -func (p *Provider) Source(_ context.Context) (source.Source, error) { - p.fillHostInfo() +func (p *Provider) Source(ctx context.Context) (source.Source, error) { + p.fillHostInfo(ctx) if p.hostInfo.InstanceID == "" { return source.Source{}, fmt.Errorf("instance ID is unavailable") } @@ -175,6 +175,6 @@ func (p *Provider) ClusterName(ctx context.Context) (string, error) { } func (p *Provider) HostInfo() *HostInfo { - p.fillHostInfo() + p.fillHostInfo(context.Background()) return &p.hostInfo } diff --git a/exporter/datadogexporter/internal/hostmetadata/internal/gcp/provider.go b/exporter/datadogexporter/internal/hostmetadata/internal/gcp/provider.go index 5951494a804a..eeb7fb7c046b 100644 --- a/exporter/datadogexporter/internal/hostmetadata/internal/gcp/provider.go +++ b/exporter/datadogexporter/internal/hostmetadata/internal/gcp/provider.go @@ -15,8 +15,10 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/hostmetadata/provider" ) -var _ source.Provider = (*Provider)(nil) -var _ provider.ClusterNameProvider = (*Provider)(nil) +var ( + _ source.Provider = (*Provider)(nil) + _ provider.ClusterNameProvider = (*Provider)(nil) +) var _ gcpDetector = gcp.NewDetector() diff --git a/exporter/datadogexporter/internal/hostmetadata/internal/k8s/nodename.go b/exporter/datadogexporter/internal/hostmetadata/internal/k8s/nodename.go index 70c919da2de6..2431b2a9c3f7 100644 --- a/exporter/datadogexporter/internal/hostmetadata/internal/k8s/nodename.go +++ b/exporter/datadogexporter/internal/hostmetadata/internal/k8s/nodename.go @@ -70,7 +70,6 @@ func newNodeNameProvider() nodeNameProvider { client, err := k8sconfig.MakeClient(k8sconfig.APIConfig{ AuthType: k8sconfig.AuthTypeServiceAccount, }) - if err != nil { return &nodeNameUnavailable{err: err} } diff --git a/exporter/datadogexporter/internal/hostmetadata/internal/k8s/provider_test.go b/exporter/datadogexporter/internal/hostmetadata/internal/k8s/provider_test.go index cda386036f59..2f168604b1c3 100644 --- a/exporter/datadogexporter/internal/hostmetadata/internal/k8s/provider_test.go +++ b/exporter/datadogexporter/internal/hostmetadata/internal/k8s/provider_test.go @@ -15,16 +15,20 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/hostmetadata/provider" ) -var _ provider.ClusterNameProvider = (*StringProvider)(nil) -var _ nodeNameProvider = (*StringProvider)(nil) +var ( + _ provider.ClusterNameProvider = (*StringProvider)(nil) + _ nodeNameProvider = (*StringProvider)(nil) +) type StringProvider string func (p StringProvider) ClusterName(context.Context) (string, error) { return string(p), nil } func (p StringProvider) NodeName(context.Context) (string, error) { return string(p), nil } -var _ provider.ClusterNameProvider = (*ErrorProvider)(nil) -var _ nodeNameProvider = (*ErrorProvider)(nil) +var ( + _ provider.ClusterNameProvider = (*ErrorProvider)(nil) + _ nodeNameProvider = (*ErrorProvider)(nil) +) type ErrorProvider string diff --git a/exporter/datadogexporter/internal/hostmetadata/internal/system/host.go b/exporter/datadogexporter/internal/hostmetadata/internal/system/host.go index faed83a74864..7dbbaf649fa5 100644 --- a/exporter/datadogexporter/internal/hostmetadata/internal/system/host.go +++ b/exporter/datadogexporter/internal/hostmetadata/internal/system/host.go @@ -9,10 +9,9 @@ import ( "os" "sync" + "github.com/DataDog/datadog-agent/pkg/util/hostname/validate" "github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes/source" "go.uber.org/zap" - - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/hostmetadata/valid" ) type HostInfo struct { @@ -44,7 +43,7 @@ func (hi *HostInfo) GetHostname(logger *zap.Logger) string { if hi.FQDN == "" { // Don't report failure since FQDN was just not available return hi.OS - } else if err := valid.Hostname(hi.FQDN); err != nil { + } else if err := validate.ValidHostname(hi.FQDN); err != nil { logger.Info("FQDN is not valid", zap.Error(err)) return hi.OS } diff --git a/exporter/datadogexporter/internal/hostmetadata/internal/system/host_test.go b/exporter/datadogexporter/internal/hostmetadata/internal/system/host_test.go index 9939324eb5d4..cbd81317dab9 100644 --- a/exporter/datadogexporter/internal/hostmetadata/internal/system/host_test.go +++ b/exporter/datadogexporter/internal/hostmetadata/internal/system/host_test.go @@ -30,17 +30,16 @@ func TestGetHostname(t *testing.T) { FQDN: "fqdn", OS: "os", } - assert.Equal(t, hostInfoAll.GetHostname(logger), "fqdn") + assert.Equal(t, "fqdn", hostInfoAll.GetHostname(logger)) hostInfoInvalid := &HostInfo{ FQDN: "fqdn_invalid", OS: "os", } - assert.Equal(t, hostInfoInvalid.GetHostname(logger), "os") + assert.Equal(t, "os", hostInfoInvalid.GetHostname(logger)) hostInfoMissingFQDN := &HostInfo{ OS: "os", } - assert.Equal(t, hostInfoMissingFQDN.GetHostname(logger), "os") - + assert.Equal(t, "os", hostInfoMissingFQDN.GetHostname(logger)) } diff --git a/exporter/datadogexporter/internal/hostmetadata/internal/system/package_test.go b/exporter/datadogexporter/internal/hostmetadata/internal/system/package_test.go index 641255b7bf5e..35c0ab8ee91a 100644 --- a/exporter/datadogexporter/internal/hostmetadata/internal/system/package_test.go +++ b/exporter/datadogexporter/internal/hostmetadata/internal/system/package_test.go @@ -10,5 +10,9 @@ import ( ) func TestMain(m *testing.M) { - goleak.VerifyTestMain(m) + // We have to ignore seelog because of upstream issue + // https://github.com/cihub/seelog/issues/182 + goleak.VerifyTestMain(m, + goleak.IgnoreAnyFunction("github.com/cihub/seelog.(*asyncLoopLogger).processQueue"), + ) } diff --git a/exporter/datadogexporter/internal/hostmetadata/metadata.go b/exporter/datadogexporter/internal/hostmetadata/metadata.go index 93b868198ede..1fcfe2806e2f 100644 --- a/exporter/datadogexporter/internal/hostmetadata/metadata.go +++ b/exporter/datadogexporter/internal/hostmetadata/metadata.go @@ -1,7 +1,7 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -// Package metadata is responsible for collecting host metadata from different providers +// Package hostmetadata is responsible for collecting host metadata from different providers // such as EC2, ECS, AWS, etc and pushing it to Datadog. package hostmetadata // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/hostmetadata" @@ -59,7 +59,7 @@ func metadataFromAttributes(attrs pcommon.Map) payload.HostMetadata { return hm } -func fillHostMetadata(params exporter.CreateSettings, pcfg PusherConfig, p source.Provider, hm *payload.HostMetadata) { +func fillHostMetadata(params exporter.Settings, pcfg PusherConfig, p source.Provider, hm *payload.HostMetadata) { // Could not get hostname from attributes if hm.InternalHostname == "" { if src, err := p.Source(context.TODO()); err == nil && src.Kind == source.HostnameKind { @@ -77,7 +77,7 @@ func fillHostMetadata(params exporter.CreateSettings, pcfg PusherConfig, p sourc hm.Processes = gohai.NewProcessesPayload(hm.Meta.Hostname, params.Logger) // EC2 data was not set from attributes if hm.Meta.EC2Hostname == "" { - ec2HostInfo := ec2.GetHostInfo(params.Logger) + ec2HostInfo := ec2.GetHostInfo(context.Background(), params.Logger) hm.Meta.EC2Hostname = ec2HostInfo.EC2Hostname hm.Meta.InstanceID = ec2HostInfo.InstanceID } @@ -151,14 +151,14 @@ func (p *pusher) Push(_ context.Context, hm payload.HostMetadata) error { var _ inframetadata.Pusher = (*pusher)(nil) type pusher struct { - params exporter.CreateSettings + params exporter.Settings pcfg PusherConfig retrier *clientutil.Retrier httpClient *http.Client } // NewPusher creates a new inframetadata.Pusher that pushes metadata payloads -func NewPusher(params exporter.CreateSettings, pcfg PusherConfig) inframetadata.Pusher { +func NewPusher(params exporter.Settings, pcfg PusherConfig) inframetadata.Pusher { return &pusher{ params: params, pcfg: pcfg, @@ -169,7 +169,7 @@ func NewPusher(params exporter.CreateSettings, pcfg PusherConfig) inframetadata. // RunPusher to push host metadata payloads from the host where the Collector is running periodically to Datadog intake. // This function is blocking and it is meant to be run on a goroutine. -func RunPusher(ctx context.Context, params exporter.CreateSettings, pcfg PusherConfig, p source.Provider, attrs pcommon.Map, reporter *inframetadata.Reporter) { +func RunPusher(ctx context.Context, params exporter.Settings, pcfg PusherConfig, p source.Provider, attrs pcommon.Map, reporter *inframetadata.Reporter) { // Push metadata every 30 minutes ticker := time.NewTicker(30 * time.Minute) defer ticker.Stop() diff --git a/exporter/datadogexporter/internal/hostmetadata/metadata_test.go b/exporter/datadogexporter/internal/hostmetadata/metadata_test.go index 2d7f6afd5b94..24b30b85db1d 100644 --- a/exporter/datadogexporter/internal/hostmetadata/metadata_test.go +++ b/exporter/datadogexporter/internal/hostmetadata/metadata_test.go @@ -14,6 +14,7 @@ import ( "testing" "time" + "github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil" "github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata" "github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata/payload" "github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes" @@ -27,8 +28,6 @@ import ( "go.opentelemetry.io/collector/pdata/pcommon" conventions "go.opentelemetry.io/collector/semconv/v1.6.1" "go.uber.org/zap" - - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/testutil" ) var ( @@ -51,14 +50,14 @@ var ( Version: "1.0", } - mockExporterCreateSettings = exporter.CreateSettings{ + mockExporterCreateSettings = exporter.Settings{ TelemetrySettings: componenttest.NewNopTelemetrySettings(), BuildInfo: mockBuildInfo, } ) func TestFillHostMetadata(t *testing.T) { - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() params.BuildInfo = mockBuildInfo pcfg := PusherConfig{ @@ -66,16 +65,16 @@ func TestFillHostMetadata(t *testing.T) { ConfigTags: []string{"key1:tag1", "key2:tag2", "env:prod"}, } - hostProvider, err := GetSourceProvider(componenttest.NewNopTelemetrySettings(), "hostname") + hostProvider, err := GetSourceProvider(componenttest.NewNopTelemetrySettings(), "hostname", 31*time.Second) require.NoError(t, err) metadata := payload.NewEmpty() fillHostMetadata(params, pcfg, hostProvider, &metadata) - assert.Equal(t, metadata.InternalHostname, "hostname") - assert.Equal(t, metadata.Flavor, "otelcontribcol") - assert.Equal(t, metadata.Version, "1.0") - assert.Equal(t, metadata.Meta.Hostname, "hostname") + assert.Equal(t, "hostname", metadata.InternalHostname) + assert.Equal(t, "otelcontribcol", metadata.Flavor) + assert.Equal(t, "1.0", metadata.Version) + assert.Equal(t, "hostname", metadata.Meta.Hostname) assert.ElementsMatch(t, metadata.Tags.OTel, []string{"key1:tag1", "key2:tag2", "env:prod"}) metadataWithVals := payload.HostMetadata{ @@ -85,10 +84,10 @@ func TestFillHostMetadata(t *testing.T) { } fillHostMetadata(params, pcfg, hostProvider, &metadataWithVals) - assert.Equal(t, metadataWithVals.InternalHostname, "my-custom-hostname") - assert.Equal(t, metadataWithVals.Flavor, "otelcontribcol") - assert.Equal(t, metadataWithVals.Version, "1.0") - assert.Equal(t, metadataWithVals.Meta.Hostname, "my-custom-hostname") + assert.Equal(t, "my-custom-hostname", metadataWithVals.InternalHostname) + assert.Equal(t, "otelcontribcol", metadataWithVals.Flavor) + assert.Equal(t, "1.0", metadataWithVals.Version) + assert.Equal(t, "my-custom-hostname", metadataWithVals.Meta.Hostname) assert.ElementsMatch(t, metadataWithVals.Tags.OTel, []string{"key1:tag1", "key2:tag2", "env:prod"}) } @@ -188,16 +187,16 @@ func TestPushMetadata(t *testing.T) { handler := http.NewServeMux() handler.HandleFunc("/intake", func(_ http.ResponseWriter, r *http.Request) { - assert.Equal(t, r.Header.Get("DD-Api-Key"), "apikey") - assert.Equal(t, r.Header.Get("User-Agent"), "otelcontribcol/1.0") + assert.Equal(t, "apikey", r.Header.Get("DD-Api-Key")) + assert.Equal(t, "otelcontribcol/1.0", r.Header.Get("User-Agent")) reader, err := gzip.NewReader(r.Body) - require.NoError(t, err) + assert.NoError(t, err) body, err := io.ReadAll(reader) - require.NoError(t, err) + assert.NoError(t, err) var recvMetadata payload.HostMetadata err = json.Unmarshal(body, &recvMetadata) - require.NoError(t, err) + assert.NoError(t, err) assert.Equal(t, mockMetadata, recvMetadata) }) @@ -231,10 +230,10 @@ func TestPusher(t *testing.T) { APIKey: "apikey", UseResourceMetadata: true, } - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() params.BuildInfo = mockBuildInfo - hostProvider, err := GetSourceProvider(componenttest.NewNopTelemetrySettings(), "source-hostname") + hostProvider, err := GetSourceProvider(componenttest.NewNopTelemetrySettings(), "source-hostname", 31*time.Second) require.NoError(t, err) attrs := testutil.NewAttributeMap(map[string]string{ @@ -254,7 +253,7 @@ func TestPusher(t *testing.T) { go RunPusher(ctx, params, pcfg, hostProvider, attrs, reporter) recvMetadata := <-server.MetadataChan - assert.Equal(t, recvMetadata.InternalHostname, "datadog-hostname") + assert.Equal(t, "datadog-hostname", recvMetadata.InternalHostname) assert.Equal(t, recvMetadata.Version, mockBuildInfo.Version) assert.Equal(t, recvMetadata.Flavor, mockBuildInfo.Command) require.NotNil(t, recvMetadata.Meta) diff --git a/exporter/datadogexporter/internal/hostmetadata/provider/provider.go b/exporter/datadogexporter/internal/hostmetadata/provider/provider.go index c713309cb9bd..20838742f52f 100644 --- a/exporter/datadogexporter/internal/hostmetadata/provider/provider.go +++ b/exporter/datadogexporter/internal/hostmetadata/provider/provider.go @@ -8,6 +8,7 @@ import ( "context" "fmt" "sync" + "time" "github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes/source" "go.uber.org/zap" @@ -19,6 +20,7 @@ type chainProvider struct { logger *zap.Logger providers map[string]source.Provider priorityList []string + timeout time.Duration } func (p *chainProvider) Source(ctx context.Context) (source.Source, error) { @@ -32,6 +34,16 @@ func (p *chainProvider) Source(ctx context.Context) (source.Source, error) { ctx, cancel := context.WithCancel(ctx) defer cancel() + // Make a different context for our provider calls, to differentiate between a provider timing out and the entire + // context being cancelled + var childCtx context.Context + if p.timeout != 0 { + childCtx, cancel = context.WithTimeout(ctx, p.timeout) + } else { + childCtx, cancel = context.WithCancel(ctx) + } + defer cancel() + // Run all providers in parallel replies := make([]chan reply, len(p.priorityList)) for i, source := range p.priorityList { @@ -39,7 +51,7 @@ func (p *chainProvider) Source(ctx context.Context) (source.Source, error) { replies[i] = make(chan reply) p.logger.Debug("Trying out source provider", zap.String("provider", source)) go func(i int) { - src, err := provider.Source(ctx) + src, err := provider.Source(childCtx) replies[i] <- reply{src: src, err: err} }(i) } @@ -65,14 +77,14 @@ func (p *chainProvider) Source(ctx context.Context) (source.Source, error) { } // Chain providers into a single provider that returns the first available hostname. -func Chain(logger *zap.Logger, providers map[string]source.Provider, priorityList []string) (source.Provider, error) { +func Chain(logger *zap.Logger, providers map[string]source.Provider, priorityList []string, timeout time.Duration) (source.Provider, error) { for _, source := range priorityList { if _, ok := providers[source]; !ok { return nil, fmt.Errorf("%q source is not available in providers", source) } } - return &chainProvider{logger: logger, providers: providers, priorityList: priorityList}, nil + return &chainProvider{logger: logger, providers: providers, priorityList: priorityList, timeout: timeout}, nil } var _ source.Provider = (*configProvider)(nil) diff --git a/exporter/datadogexporter/internal/hostmetadata/provider/provider_test.go b/exporter/datadogexporter/internal/hostmetadata/provider/provider_test.go index 7e5fdf1afdc9..d3390801fc8a 100644 --- a/exporter/datadogexporter/internal/hostmetadata/provider/provider_test.go +++ b/exporter/datadogexporter/internal/hostmetadata/provider/provider_test.go @@ -6,6 +6,7 @@ package provider // import "github.com/open-telemetry/opentelemetry-collector-co import ( "context" "errors" + "fmt" "testing" "time" @@ -38,8 +39,12 @@ type delayedProvider struct { } func (p *delayedProvider) Source(ctx context.Context) (source.Source, error) { - time.Sleep(p.delay) - return p.provider.Source(ctx) + select { + case <-ctx.Done(): + return source.Source{}, fmt.Errorf("no source provider was available") + case <-time.After(p.delay): + return p.provider.Source(ctx) + } } func withDelay(provider source.Provider, delay time.Duration) source.Provider { @@ -56,6 +61,7 @@ func TestChain(t *testing.T) { hostname string queryErr string + timeout time.Duration }{ { name: "missing provider in priority list", @@ -78,6 +84,18 @@ func TestChain(t *testing.T) { queryErr: "no source provider was available", }, + { + name: "all providers timeout", + providers: map[string]source.Provider{ + "p1": withDelay(HostProvider("p1SourceName"), 100*time.Millisecond), + "p2": withDelay(HostProvider("p2SourceName"), 100*time.Millisecond), + "p3": withDelay(HostProvider("p3SourceName"), 100*time.Millisecond), + }, + priorityList: []string{"p1", "p2", "p3"}, + + queryErr: "no source provider was available", + timeout: 10 * time.Millisecond, + }, { name: "no providers fail", providers: map[string]source.Provider{ @@ -111,11 +129,23 @@ func TestChain(t *testing.T) { hostname: "p2SourceName", }, + { + name: "p2 times out", + providers: map[string]source.Provider{ + "p1": ErrorSourceProvider("p1Err"), + "p2": withDelay(HostProvider("p2SourceName"), 50*time.Millisecond), + "p3": HostProvider("p3SourceName"), + }, + priorityList: []string{"p1", "p2", "p3"}, + + hostname: "p3SourceName", + timeout: 10 * time.Millisecond, + }, } for _, testInstance := range tests { t.Run(testInstance.name, func(t *testing.T) { - provider, err := Chain(zaptest.NewLogger(t), testInstance.providers, testInstance.priorityList) + provider, err := Chain(zaptest.NewLogger(t), testInstance.providers, testInstance.priorityList, testInstance.timeout) if err != nil || testInstance.buildErr != "" { assert.EqualError(t, err, testInstance.buildErr) return diff --git a/exporter/datadogexporter/internal/hostmetadata/valid/package_test.go b/exporter/datadogexporter/internal/hostmetadata/valid/package_test.go deleted file mode 100644 index af34af695cd4..000000000000 --- a/exporter/datadogexporter/internal/hostmetadata/valid/package_test.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package valid - -import ( - "testing" - - "go.uber.org/goleak" -) - -func TestMain(m *testing.M) { - goleak.VerifyTestMain(m) -} diff --git a/exporter/datadogexporter/internal/hostmetadata/valid/valid.go b/exporter/datadogexporter/internal/hostmetadata/valid/valid.go deleted file mode 100644 index 46dffff5d246..000000000000 --- a/exporter/datadogexporter/internal/hostmetadata/valid/valid.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -// This file includes software developed at Datadog (https://www.datadoghq.com/) -// for the Datadog Agent (https://github.com/DataDog/datadog-agent) - -// Package valid contains functions that validate hostnames -package valid // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/hostmetadata/valid" - -import ( - "fmt" - "regexp" - "strings" -) - -var ( - validHostnameRfc1123 = regexp.MustCompile(`^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$`) - localhostIdentifiers = [...]string{ - "localhost", - "localhost.localdomain", - "localhost6.localdomain6", - "ip6-localhost", - } -) - -// Hostname determines whether the passed string is a valid hostname. -// In case it's not, the returned error contains the details of the failure. -func Hostname(hostname string) error { - const maxLength = 255 - - switch { - case hostname == "": - return fmt.Errorf("hostname is empty") - case isLocal(hostname): - return fmt.Errorf("'%s' is a local hostname", hostname) - case len(hostname) > maxLength: - return fmt.Errorf("name exceeded the maximum length of %d characters", maxLength) - case !validHostnameRfc1123.MatchString(hostname): - return fmt.Errorf("'%s' is not RFC1123 compliant", hostname) - } - return nil -} - -// check whether the name is in the list of local hostnames -func isLocal(name string) bool { - name = strings.ToLower(name) - for _, val := range localhostIdentifiers { - if val == name { - return true - } - } - return false -} diff --git a/exporter/datadogexporter/internal/hostmetadata/valid/valid_test.go b/exporter/datadogexporter/internal/hostmetadata/valid/valid_test.go deleted file mode 100644 index e313e570b837..000000000000 --- a/exporter/datadogexporter/internal/hostmetadata/valid/valid_test.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package valid - -import ( - "strings" - "testing" - - "github.com/stretchr/testify/require" -) - -func TestHostname(t *testing.T) { - // Empty - require.Error(t, Hostname("")) - - // Local - require.Error(t, Hostname("localhost")) - - // Max length exceeded - require.Error(t, Hostname(strings.Repeat("a", 256))) - - // non RFC1123 compliant - require.Error(t, Hostname("***")) - require.Error(t, Hostname("invalid_hostname")) - - require.NoError(t, Hostname("valid-hostname")) -} diff --git a/exporter/datadogexporter/internal/logs/package_test.go b/exporter/datadogexporter/internal/logs/package_test.go index 1158f120b289..2f65e8b75977 100644 --- a/exporter/datadogexporter/internal/logs/package_test.go +++ b/exporter/datadogexporter/internal/logs/package_test.go @@ -10,5 +10,9 @@ import ( ) func TestMain(m *testing.M) { - goleak.VerifyTestMain(m) + // We have to ignore seelog because of upstream issue + // https://github.com/cihub/seelog/issues/182 + goleak.VerifyTestMain(m, + goleak.IgnoreAnyFunction("github.com/cihub/seelog.(*asyncLoopLogger).processQueue"), + ) } diff --git a/exporter/datadogexporter/internal/logs/sender_test.go b/exporter/datadogexporter/internal/logs/sender_test.go index cb74c4abf785..b13fe0c4bd61 100644 --- a/exporter/datadogexporter/internal/logs/sender_test.go +++ b/exporter/datadogexporter/internal/logs/sender_test.go @@ -9,14 +9,14 @@ import ( "testing" "time" + "github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil" "github.com/DataDog/datadog-api-client-go/v2/api/datadog" "github.com/DataDog/datadog-api-client-go/v2/api/datadogV2" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/config/confighttp" "go.opentelemetry.io/collector/config/configtls" "go.uber.org/zap/zaptest" - - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/testutil" ) func TestSubmitLogs(t *testing.T) { @@ -193,10 +193,8 @@ func TestSubmitLogs(t *testing.T) { }) defer server.Close() s := NewSender(server.URL, logger, confighttp.ClientConfig{Timeout: time.Second * 10, TLSSetting: configtls.ClientConfig{InsecureSkipVerify: true}}, true, "") - if err := s.SubmitLogs(context.Background(), tt.payload); err != nil { - t.Fatal(err) - } - assert.True(t, calls == tt.numRequests) + require.NoError(t, s.SubmitLogs(context.Background(), tt.payload)) + assert.Equal(t, calls, tt.numRequests) }) } } diff --git a/exporter/datadogexporter/internal/metadata/generated_status.go b/exporter/datadogexporter/internal/metadata/generated_status.go index 8b68b19b684e..f746a701d788 100644 --- a/exporter/datadogexporter/internal/metadata/generated_status.go +++ b/exporter/datadogexporter/internal/metadata/generated_status.go @@ -7,11 +7,12 @@ import ( ) var ( - Type = component.MustNewType("datadog") + Type = component.MustNewType("datadog") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter" ) const ( - LogsStability = component.StabilityLevelAlpha TracesStability = component.StabilityLevelBeta MetricsStability = component.StabilityLevelBeta + LogsStability = component.StabilityLevelBeta ) diff --git a/exporter/datadogexporter/internal/metadata/generated_telemetry.go b/exporter/datadogexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index 6f07d78230d4..000000000000 --- a/exporter/datadogexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/datadog") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/datadog") -} diff --git a/exporter/datadogexporter/internal/metadata/generated_telemetry_test.go b/exporter/datadogexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 58fb984fcc04..000000000000 --- a/exporter/datadogexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/datadog", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/datadog", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/datadogexporter/internal/metrics/consumer.go b/exporter/datadogexporter/internal/metrics/consumer.go index ae00f7237034..2d43e604ea5d 100644 --- a/exporter/datadogexporter/internal/metrics/consumer.go +++ b/exporter/datadogexporter/internal/metrics/consumer.go @@ -15,9 +15,11 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/metrics/sketches" ) -var _ metrics.Consumer = (*Consumer)(nil) -var _ metrics.HostConsumer = (*Consumer)(nil) -var _ metrics.TagsConsumer = (*Consumer)(nil) +var ( + _ metrics.Consumer = (*Consumer)(nil) + _ metrics.HostConsumer = (*Consumer)(nil) + _ metrics.TagsConsumer = (*Consumer)(nil) +) // Consumer implements metrics.Consumer. It records consumed metrics, sketches and // APM stats payloads. It provides them to the caller using the All method. diff --git a/exporter/datadogexporter/internal/metrics/consumer_deprecated.go b/exporter/datadogexporter/internal/metrics/consumer_deprecated.go index c47c2acda3a6..0b71f2c98d88 100644 --- a/exporter/datadogexporter/internal/metrics/consumer_deprecated.go +++ b/exporter/datadogexporter/internal/metrics/consumer_deprecated.go @@ -14,9 +14,11 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/metrics/sketches" ) -var _ metrics.Consumer = (*ZorkianConsumer)(nil) -var _ metrics.HostConsumer = (*ZorkianConsumer)(nil) -var _ metrics.TagsConsumer = (*ZorkianConsumer)(nil) +var ( + _ metrics.Consumer = (*ZorkianConsumer)(nil) + _ metrics.HostConsumer = (*ZorkianConsumer)(nil) + _ metrics.TagsConsumer = (*ZorkianConsumer)(nil) +) // ZorkianConsumer implements metrics.Consumer. It records consumed metrics, sketches and // APM stats payloads. It provides them to the caller using the All method. diff --git a/exporter/datadogexporter/internal/metrics/consumer_deprecated_test.go b/exporter/datadogexporter/internal/metrics/consumer_deprecated_test.go index 40bd52186c23..19f218a5485d 100644 --- a/exporter/datadogexporter/internal/metrics/consumer_deprecated_test.go +++ b/exporter/datadogexporter/internal/metrics/consumer_deprecated_test.go @@ -7,14 +7,13 @@ import ( "context" "testing" + "github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil" "github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes" "github.com/stretchr/testify/assert" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/pdata/pmetric" conventions "go.opentelemetry.io/collector/semconv/v1.6.1" "go.uber.org/zap" - - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/testutil" ) func TestZorkianRunningMetrics(t *testing.T) { @@ -54,7 +53,6 @@ func TestZorkianRunningMetrics(t *testing.T) { runningHostnames, []string{"fallbackHostname", "resource-hostname-1", "resource-hostname-2"}, ) - } func TestZorkianTagsMetrics(t *testing.T) { diff --git a/exporter/datadogexporter/internal/metrics/consumer_test.go b/exporter/datadogexporter/internal/metrics/consumer_test.go index 79a201accef6..ea61fc9938e9 100644 --- a/exporter/datadogexporter/internal/metrics/consumer_test.go +++ b/exporter/datadogexporter/internal/metrics/consumer_test.go @@ -7,6 +7,7 @@ import ( "context" "testing" + "github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil" "github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes" "github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes/source" "github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics" @@ -17,8 +18,6 @@ import ( "go.opentelemetry.io/collector/pdata/pmetric" conventions "go.opentelemetry.io/collector/semconv/v1.6.1" "go.uber.org/zap" - - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/testutil" ) type testProvider string diff --git a/exporter/datadogexporter/internal/metrics/series_deprecated_test.go b/exporter/datadogexporter/internal/metrics/series_deprecated_test.go index 6ec075f680d9..b8778bbe9b35 100644 --- a/exporter/datadogexporter/internal/metrics/series_deprecated_test.go +++ b/exporter/datadogexporter/internal/metrics/series_deprecated_test.go @@ -38,7 +38,6 @@ func TestNewZorkianType(t *testing.T) { count := NewZorkianCount(name, ts, value, tags) assert.Equal(t, count.GetType(), string(Count)) - } func TestDefaultZorkianMetrics(t *testing.T) { @@ -51,7 +50,7 @@ func TestDefaultZorkianMetrics(t *testing.T) { assert.Equal(t, "otel.datadog_exporter.metrics.running", *ms[0].Metric) // Assert metrics list length (should be 1) - assert.Equal(t, 1, len(ms)) + assert.Len(t, ms, 1) // Assert timestamp assert.Equal(t, 2.0, *ms[0].Points[0][0]) // Assert value (should always be 1.0) diff --git a/exporter/datadogexporter/internal/metrics/series_test.go b/exporter/datadogexporter/internal/metrics/series_test.go index d49210f3ea49..7df7e9b258d1 100644 --- a/exporter/datadogexporter/internal/metrics/series_test.go +++ b/exporter/datadogexporter/internal/metrics/series_test.go @@ -35,10 +35,10 @@ func TestNewType(t *testing.T) { tags := []string{"tag:value"} gauge := NewGauge(name, ts, value, tags) - assert.Equal(t, gauge.GetType(), datadogV2.METRICINTAKETYPE_GAUGE) + assert.Equal(t, datadogV2.METRICINTAKETYPE_GAUGE, gauge.GetType()) count := NewCount(name, ts, value, tags) - assert.Equal(t, count.GetType(), datadogV2.METRICINTAKETYPE_COUNT) + assert.Equal(t, datadogV2.METRICINTAKETYPE_COUNT, count.GetType()) } func TestDefaultMetrics(t *testing.T) { @@ -51,7 +51,7 @@ func TestDefaultMetrics(t *testing.T) { assert.Equal(t, "otel.datadog_exporter.metrics.running", ms[0].Metric) // Assert metrics list length (should be 1) - assert.Equal(t, 1, len(ms)) + assert.Len(t, ms, 1) // Assert timestamp assert.Equal(t, int64(2), *ms[0].Points[0].Timestamp) // Assert value (should always be 1.0) @@ -73,7 +73,7 @@ func TestDefaultMetricsWithRuntimeMetrics(t *testing.T) { assert.Equal(t, "otel.datadog_exporter.runtime_metrics.running", ms[0].Metric) // Assert metrics list length (should be 1) - assert.Equal(t, 1, len(ms)) + assert.Len(t, ms, 1) // Assert timestamp assert.Equal(t, int64(2), *ms[0].Points[0].Timestamp) // Assert value (should always be 1.0) diff --git a/exporter/datadogexporter/internal/metrics/sketches/sketches_test.go b/exporter/datadogexporter/internal/metrics/sketches/sketches_test.go index f5d9fbabe60c..1735636a5004 100644 --- a/exporter/datadogexporter/internal/metrics/sketches/sketches_test.go +++ b/exporter/datadogexporter/internal/metrics/sketches/sketches_test.go @@ -74,14 +74,10 @@ func TestSketchSeriesListMarshal(t *testing.T) { } b, err := sl.Marshal() - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) pl := new(gogen.SketchPayload) - if err := pl.Unmarshal(b); err != nil { - t.Fatal(err) - } + require.NoError(t, pl.Unmarshal(b)) require.Len(t, pl.Sketches, len(sl)) @@ -92,11 +88,10 @@ func TestSketchSeriesListMarshal(t *testing.T) { assert.Equal(t, in.Host, pb.Host) assert.Equal(t, in.Name, pb.Metric) assert.Equal(t, in.Tags, pb.Tags) - assert.Len(t, pb.Distributions, 0) + assert.Empty(t, pb.Distributions) require.Len(t, pb.Dogsketches, len(in.Points)) for j, pointPb := range pb.Dogsketches { - check(t, in.Points[j], pointPb) } } diff --git a/exporter/datadogexporter/internal/testutil/logs.go b/exporter/datadogexporter/internal/testutil/logs.go deleted file mode 100644 index 9059a59cffeb..000000000000 --- a/exporter/datadogexporter/internal/testutil/logs.go +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package testutil // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/testutil" - -import ( - "compress/gzip" - "encoding/json" - "io" - "log" - "net/http" - "net/http/httptest" -) - -// JSONLogs is the type for the array of processed JSON log data from each request -type JSONLogs []JSONLog - -// JSONLog is the type for the processed JSON log data from a single log -type JSONLog map[string]any - -// HasDDTag returns true if every log has the given ddtags -func (jsonLogs *JSONLogs) HasDDTag(ddtags string) bool { - for _, logData := range *jsonLogs { - if ddtags != logData["ddtags"] { - return false - } - } - return true -} - -type DatadogLogsServer struct { - *httptest.Server - // LogsData is the array of json requests sent to datadog backend - LogsData JSONLogs -} - -// DatadogLogServerMock mocks a Datadog Logs Intake backend server -func DatadogLogServerMock(overwriteHandlerFuncs ...OverwriteHandleFunc) *DatadogLogsServer { - mux := http.NewServeMux() - - server := &DatadogLogsServer{} - handlers := map[string]http.HandlerFunc{ - // logs backend doesn't have validate endpoint - // but adding one here for ease of testing - "/api/v1/validate": validateAPIKeyEndpoint, - "/": server.logsEndpoint, - } - for _, f := range overwriteHandlerFuncs { - p, hf := f() - handlers[p] = hf - } - for pattern, handler := range handlers { - mux.HandleFunc(pattern, handler) - } - server.Server = httptest.NewServer(mux) - return server -} - -func (s *DatadogLogsServer) logsEndpoint(w http.ResponseWriter, r *http.Request) { - jsonLogs := processLogsRequest(w, r) - s.LogsData = append(s.LogsData, jsonLogs...) -} - -func processLogsRequest(w http.ResponseWriter, r *http.Request) JSONLogs { - // we can reuse same response object for logs as well - req, err := gUnzipData(r.Body) - handleError(w, err, http.StatusBadRequest) - var jsonLogs JSONLogs - err = json.Unmarshal(req, &jsonLogs) - handleError(w, err, http.StatusBadRequest) - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusAccepted) - _, err = w.Write([]byte(`{"status":"ok"}`)) - handleError(w, err, 0) - return jsonLogs -} - -func gUnzipData(rg io.Reader) ([]byte, error) { - r, err := gzip.NewReader(rg) - if err != nil { - return nil, err - } - return io.ReadAll(r) -} - -// handleError logs the given error and writes the given status code if one is provided -// A statusCode of 0 represents no status code to write -func handleError(w http.ResponseWriter, err error, statusCode int) { - if err != nil { - if statusCode != 0 { - w.WriteHeader(statusCode) - } - log.Fatalln(err) - } -} - -// MockLogsEndpoint returns the processed JSON log data for each endpoint call -func MockLogsEndpoint(w http.ResponseWriter, r *http.Request) JSONLogs { - return processLogsRequest(w, r) -} - -func ProcessLogsAgentRequest(w http.ResponseWriter, r *http.Request) JSONLogs { - // we can reuse same response object for logs as well - req, err := gUnzipData(r.Body) - handleError(w, err, http.StatusBadRequest) - var jsonLogs JSONLogs - err = json.Unmarshal(req, &jsonLogs) - handleError(w, err, http.StatusBadRequest) - - // unmarshal nested message JSON - for i := range jsonLogs { - messageJSON := jsonLogs[i]["message"].(string) - var message JSONLog - err = json.Unmarshal([]byte(messageJSON), &message) - handleError(w, err, http.StatusBadRequest) - jsonLogs[i]["message"] = message - // delete dynamic keys that can't be tested - delete(jsonLogs[i], "hostname") // hostname of host running tests - delete(jsonLogs[i], "timestamp") // ingestion timestamp - } - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusAccepted) - _, err = w.Write([]byte(`{"status":"ok"}`)) - handleError(w, err, 0) - return jsonLogs -} diff --git a/exporter/datadogexporter/internal/testutil/logs_test.go b/exporter/datadogexporter/internal/testutil/logs_test.go deleted file mode 100644 index 304d0e0e6007..000000000000 --- a/exporter/datadogexporter/internal/testutil/logs_test.go +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package testutil // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/testutil" - -import ( - "bytes" - "compress/gzip" - "encoding/json" - "io" - "net/http" - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestDatadogLogsServer(t *testing.T) { - server := DatadogLogServerMock() - values := JSONLogs{ - { - "company": "datadog", - "component": "logs", - }, - } - jsonBytes, err := json.Marshal(values) - if err != nil { - t.Fatal(err) - return - } - var buf = bytes.NewBuffer([]byte{}) - w := gzip.NewWriter(buf) - _, _ = w.Write(jsonBytes) - _ = w.Close() - resp, err := http.Post(server.URL, "application/json", buf) - if err != nil { - t.Fatal(err) - return - } - assert.Equal(t, 202, resp.StatusCode) - body, err := io.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - return - } - assert.Equal(t, []byte(`{"status":"ok"}`), body) - assert.Equal(t, values, server.LogsData) - -} diff --git a/exporter/datadogexporter/internal/testutil/test_utils.go b/exporter/datadogexporter/internal/testutil/test_utils.go deleted file mode 100644 index 83ee8fa872fc..000000000000 --- a/exporter/datadogexporter/internal/testutil/test_utils.go +++ /dev/null @@ -1,367 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -// Package testutil contains the test util functions -package testutil // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/testutil" - -import ( - "compress/gzip" - "context" - "encoding/json" - "io" - "log" - "net/http" - "net/http/httptest" - - pb "github.com/DataDog/datadog-agent/pkg/proto/pbgo/trace" - "github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata/payload" - "github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes/source" - "github.com/DataDog/sketches-go/ddsketch" - "go.opentelemetry.io/collector/pdata/pcommon" - "go.opentelemetry.io/collector/pdata/pmetric" - "go.opentelemetry.io/collector/pdata/ptrace" - "google.golang.org/protobuf/proto" -) - -var ( - testAttributes = map[string]string{"datadog.host.name": "custom-hostname"} - // TestMetrics metrics for tests. - TestMetrics = newMetricsWithAttributeMap(testAttributes) - // TestTraces traces for tests. - TestTraces = newTracesWithAttributeMap(testAttributes) -) - -type DatadogServer struct { - *httptest.Server - MetadataChan chan payload.HostMetadata -} - -/* #nosec G101 -- This is a false positive, these are API endpoints rather than credentials */ -const ( - ValidateAPIKeyEndpoint = "/api/v1/validate" // nolint G101 - MetricV1Endpoint = "/api/v1/series" - MetricV2Endpoint = "/api/v2/series" - SketchesMetricEndpoint = "/api/beta/sketches" - MetadataEndpoint = "/intake" - TraceEndpoint = "/api/v0.2/traces" - APMStatsEndpoint = "/api/v0.2/stats" -) - -// DatadogServerMock mocks a Datadog backend server -func DatadogServerMock(overwriteHandlerFuncs ...OverwriteHandleFunc) *DatadogServer { - metadataChan := make(chan payload.HostMetadata) - mux := http.NewServeMux() - - handlers := map[string]http.HandlerFunc{ - ValidateAPIKeyEndpoint: validateAPIKeyEndpoint, - MetricV1Endpoint: metricsEndpoint, - MetricV2Endpoint: metricsV2Endpoint, - MetadataEndpoint: newMetadataEndpoint(metadataChan), - "/": func(_ http.ResponseWriter, _ *http.Request) {}, - } - for _, f := range overwriteHandlerFuncs { - p, hf := f() - handlers[p] = hf - } - for pattern, handler := range handlers { - mux.HandleFunc(pattern, handler) - } - - srv := httptest.NewServer(mux) - - return &DatadogServer{ - srv, - metadataChan, - } -} - -// OverwriteHandleFuncs allows to overwrite the default handler functions -type OverwriteHandleFunc func() (string, http.HandlerFunc) - -// HTTPRequestRecorder records a HTTP request. -type HTTPRequestRecorder struct { - Pattern string - Header http.Header - ByteBody []byte -} - -func (rec *HTTPRequestRecorder) HandlerFunc() (string, http.HandlerFunc) { - return rec.Pattern, func(_ http.ResponseWriter, r *http.Request) { - rec.Header = r.Header - rec.ByteBody, _ = io.ReadAll(r.Body) - } -} - -// HTTPRequestRecorderWithChan puts all incoming HTTP request bytes to the given channel. -type HTTPRequestRecorderWithChan struct { - Pattern string - ReqChan chan []byte -} - -func (rec *HTTPRequestRecorderWithChan) HandlerFunc() (string, http.HandlerFunc) { - return rec.Pattern, func(_ http.ResponseWriter, r *http.Request) { - bytesBody, _ := io.ReadAll(r.Body) - rec.ReqChan <- bytesBody - } -} - -// ValidateAPIKeyEndpointInvalid returns a handler function that returns an invalid API key response -func ValidateAPIKeyEndpointInvalid() (string, http.HandlerFunc) { - return "/api/v1/validate", validateAPIKeyEndpointInvalid -} - -type validateAPIKeyResponse struct { - Valid bool `json:"valid"` -} - -func validateAPIKeyEndpoint(w http.ResponseWriter, _ *http.Request) { - res := validateAPIKeyResponse{Valid: true} - resJSON, _ := json.Marshal(res) - - w.Header().Set("Content-Type", "application/json") - _, err := w.Write(resJSON) - if err != nil { - log.Fatalln(err) - } -} - -func validateAPIKeyEndpointInvalid(w http.ResponseWriter, _ *http.Request) { - res := validateAPIKeyResponse{Valid: false} - resJSON, _ := json.Marshal(res) - - w.Header().Set("Content-Type", "application/json") - _, err := w.Write(resJSON) - if err != nil { - log.Fatalln(err) - } -} - -type metricsResponse struct { - Status string `json:"status"` -} - -func metricsEndpoint(w http.ResponseWriter, _ *http.Request) { - res := metricsResponse{Status: "ok"} - resJSON, _ := json.Marshal(res) - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusAccepted) - _, err := w.Write(resJSON) - if err != nil { - log.Fatalln(err) - } -} - -func metricsV2Endpoint(w http.ResponseWriter, _ *http.Request) { - res := metricsResponse{Status: "ok"} - resJSON, _ := json.Marshal(res) - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusAccepted) - _, err := w.Write(resJSON) - if err != nil { - log.Fatalln(err) - } -} - -func newMetadataEndpoint(c chan payload.HostMetadata) func(http.ResponseWriter, *http.Request) { - return func(w http.ResponseWriter, r *http.Request) { - reader, err := gzip.NewReader(r.Body) - if err != nil { - http.Error(w, err.Error(), 500) - return - } - - body, err := io.ReadAll(reader) - if err != nil { - http.Error(w, err.Error(), 500) - return - } - - var recvMetadata payload.HostMetadata - if err = json.Unmarshal(body, &recvMetadata); err != nil { - http.Error(w, err.Error(), 400) - return - } - - c <- recvMetadata - } -} - -func fillAttributeMap(attrs pcommon.Map, mp map[string]string) { - attrs.EnsureCapacity(len(mp)) - for k, v := range mp { - attrs.PutStr(k, v) - } -} - -// NewAttributeMap creates a new attribute map (string only) -// from a Go map -func NewAttributeMap(mp map[string]string) pcommon.Map { - attrs := pcommon.NewMap() - fillAttributeMap(attrs, mp) - return attrs -} - -// TestGauge holds the definition of a basic gauge. -type TestGauge struct { - Name string - DataPoints []DataPoint -} - -// DataPoint specifies a DoubleVal data point and its attributes. -type DataPoint struct { - Value float64 - Attributes map[string]string -} - -// NewGaugeMetrics creates a set of pmetric.Metrics containing all the specified -// test gauges. -func NewGaugeMetrics(tgs []TestGauge) pmetric.Metrics { - metrics := pmetric.NewMetrics() - all := metrics.ResourceMetrics().AppendEmpty().ScopeMetrics().AppendEmpty().Metrics() - for _, tg := range tgs { - m := all.AppendEmpty() - m.SetName(tg.Name) - g := m.SetEmptyGauge() - for _, dp := range tg.DataPoints { - d := g.DataPoints().AppendEmpty() - d.SetDoubleValue(dp.Value) - fillAttributeMap(d.Attributes(), dp.Attributes) - } - } - return metrics -} - -func newMetricsWithAttributeMap(mp map[string]string) pmetric.Metrics { - md := pmetric.NewMetrics() - fillAttributeMap(md.ResourceMetrics().AppendEmpty().Resource().Attributes(), mp) - return md -} - -func newTracesWithAttributeMap(mp map[string]string) ptrace.Traces { - traces := ptrace.NewTraces() - resourceSpans := traces.ResourceSpans() - rs := resourceSpans.AppendEmpty() - fillAttributeMap(rs.Resource().Attributes(), mp) - rs.ScopeSpans().AppendEmpty().Spans().AppendEmpty() - return traces -} - -type MockSourceProvider struct { - Src source.Source -} - -func (s *MockSourceProvider) Source(_ context.Context) (source.Source, error) { - return s.Src, nil -} - -type MockStatsProcessor struct { - In []*pb.ClientStatsPayload -} - -func (s *MockStatsProcessor) ProcessStats(in *pb.ClientStatsPayload, _, _ string) { - s.In = append(s.In, in) -} - -// StatsPayloads contains a couple of *pb.ClientStatsPayloads used for testing. -var StatsPayloads = []*pb.ClientStatsPayload{ - { - Hostname: "host", - Env: "prod", - Version: "v1.2", - Lang: "go", - TracerVersion: "v44", - RuntimeID: "123jkl", - Sequence: 2, - AgentAggregation: "blah", - Service: "mysql", - ContainerID: "abcdef123456", - Tags: []string{"a:b", "c:d"}, - Stats: []*pb.ClientStatsBucket{ - { - Start: 10, - Duration: 1, - Stats: []*pb.ClientGroupedStats{ - { - Service: "kafka", - Name: "queue.add", - Resource: "append", - HTTPStatusCode: 220, - Type: "queue", - Hits: 15, - Errors: 3, - Duration: 143, - OkSummary: testSketchBytes(1, 2, 3), - ErrorSummary: testSketchBytes(4, 5, 6), - TopLevelHits: 5, - }, - }, - }, - }, - }, - { - Hostname: "host2", - Env: "prod2", - Version: "v1.22", - Lang: "go2", - TracerVersion: "v442", - RuntimeID: "123jkl2", - Sequence: 22, - AgentAggregation: "blah2", - Service: "mysql2", - ContainerID: "abcdef1234562", - Tags: []string{"a:b2", "c:d2"}, - Stats: []*pb.ClientStatsBucket{ - { - Start: 102, - Duration: 12, - Stats: []*pb.ClientGroupedStats{ - { - Service: "kafka2", - Name: "queue.add2", - Resource: "append2", - HTTPStatusCode: 2202, - Type: "queue2", - Hits: 152, - Errors: 32, - Duration: 1432, - OkSummary: testSketchBytes(7, 8), - ErrorSummary: testSketchBytes(9, 10, 11), - TopLevelHits: 52, - }, - }, - }, - }, - }, -} - -// The sketch's relative accuracy and maximum number of bins is identical -// to the one used in the trace-agent for consistency: -// https://github.com/DataDog/datadog-agent/blob/cbac965/pkg/trace/stats/statsraw.go#L18-L26 -const ( - sketchRelativeAccuracy = 0.01 - sketchMaxBins = 2048 -) - -// testSketchBytes returns the proto-encoded version of a DDSketch containing the -// points in nums. -func testSketchBytes(nums ...float64) []byte { - sketch, err := ddsketch.LogCollapsingLowestDenseDDSketch(sketchRelativeAccuracy, sketchMaxBins) - if err != nil { - // the only possible error is if the relative accuracy is < 0 or > 1; - // we know that's not the case because it's a constant defined as 0.01 - panic(err) - } - for _, num := range nums { - if err2 := sketch.Add(num); err2 != nil { - panic(err2) - } - } - buf, err := proto.Marshal(sketch.ToProto()) - if err != nil { - // there should be no error under any circumstances here - panic(err) - } - return buf -} diff --git a/exporter/datadogexporter/internal/testutil/test_utils_test.go b/exporter/datadogexporter/internal/testutil/test_utils_test.go deleted file mode 100644 index 2ddd68a0803d..000000000000 --- a/exporter/datadogexporter/internal/testutil/test_utils_test.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package testutil // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/testutil" - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestNewGaugeMetrics(t *testing.T) { - m := NewGaugeMetrics([]TestGauge{ - { - Name: "metric1", - DataPoints: []DataPoint{ - { - Value: 1, - Attributes: map[string]string{"a": "b", "c": "d", "e": "f"}, - }, - }, - }, - { - Name: "metric2", - DataPoints: []DataPoint{ - { - Value: 2, - Attributes: map[string]string{"x": "y", "z": "q", "w": "e"}, - }, - { - Value: 3, - Attributes: map[string]string{"w": "n"}, - }, - }, - }, - }) - all := m.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics() - require.Equal(t, all.Len(), 2) - require.Equal(t, all.At(0).Name(), "metric1") - require.Equal(t, all.At(0).Gauge().DataPoints().At(0).DoubleValue(), float64(1)) - require.EqualValues(t, all.At(0).Gauge().DataPoints().At(0).Attributes().AsRaw(), map[string]any{ - "a": "b", "c": "d", "e": "f", - }) - require.Equal(t, all.At(1).Name(), "metric2") - require.Equal(t, all.At(1).Gauge().DataPoints().At(0).DoubleValue(), float64(2)) - require.EqualValues(t, all.At(1).Gauge().DataPoints().At(0).Attributes().AsRaw(), map[string]any{ - "x": "y", "z": "q", "w": "e", - }) - require.Equal(t, all.At(1).Gauge().DataPoints().At(1).DoubleValue(), float64(3)) - require.EqualValues(t, all.At(1).Gauge().DataPoints().At(1).Attributes().AsRaw(), map[string]any{ - "w": "n", - }) -} diff --git a/exporter/datadogexporter/logs_exporter.go b/exporter/datadogexporter/logs_exporter.go index d54d8f1a0644..784db1572889 100644 --- a/exporter/datadogexporter/logs_exporter.go +++ b/exporter/datadogexporter/logs_exporter.go @@ -8,9 +8,11 @@ import ( "fmt" "sync" + "github.com/DataDog/datadog-agent/comp/logs/agent/config" "github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline" "github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline/logsagentpipelineimpl" "github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/exporter/logsagentexporter" + "github.com/DataDog/datadog-agent/pkg/logs/sources" "github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata" "github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes" "github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes/source" @@ -34,7 +36,7 @@ const ( ) type logsExporter struct { - params exporter.CreateSettings + params exporter.Settings cfg *Config ctx context.Context // ctx triggers shutdown upon cancellation scrubber scrub.Scrubber // scrubber scrubs sensitive information from error messages @@ -48,7 +50,7 @@ type logsExporter struct { // newLogsExporter creates a new instance of logsExporter func newLogsExporter( ctx context.Context, - params exporter.CreateSettings, + params exporter.Settings, cfg *Config, onceMetadata *sync.Once, attributesTranslator *attributes.Translator, @@ -124,10 +126,10 @@ func (exp *logsExporter) consumeLogs(ctx context.Context, ld plog.Logs) (err err // newLogsAgentExporter creates new instances of the logs agent and the logs agent exporter func newLogsAgentExporter( ctx context.Context, - params exporter.CreateSettings, + params exporter.Settings, cfg *Config, sourceProvider source.Provider, -) (logsagentpipeline.LogsAgent, exporter.Logs, error) { +) (logsagentpipeline.LogsAgent, *logsagentexporter.Exporter, error) { logComponent := newLogComponent(params.TelemetrySettings) cfgComponent := newConfigComponent(params.TelemetrySettings, cfg) logsAgentConfig := &logsagentexporter.Config{ @@ -142,12 +144,19 @@ func newLogsAgentExporter( }) err := logsAgent.Start(ctx) if err != nil { - return nil, nil, fmt.Errorf("failed to create logs agent: %w", err) + return nil, &logsagentexporter.Exporter{}, fmt.Errorf("failed to create logs agent: %w", err) } + pipelineChan := logsAgent.GetPipelineProvider().NextPipelineChan() - logsAgentExporter, err := logsagentexporter.NewFactory(pipelineChan).CreateLogsExporter(ctx, params, logsAgentConfig) + logSource := sources.NewLogSource(logsAgentConfig.LogSourceName, &config.LogsConfig{}) + attributesTranslator, err := attributes.NewTranslator(params.TelemetrySettings) + if err != nil { + return nil, &logsagentexporter.Exporter{}, fmt.Errorf("failed to create attribute translator: %w", err) + } + + logsAgentExporter, err := logsagentexporter.NewExporter(params.TelemetrySettings, logsAgentConfig, logSource, pipelineChan, attributesTranslator) if err != nil { - return nil, nil, fmt.Errorf("failed to create logs agent exporter: %w", err) + return nil, &logsagentexporter.Exporter{}, fmt.Errorf("failed to create logs agent exporter: %w", err) } return logsAgent, logsAgentExporter, nil } diff --git a/exporter/datadogexporter/logs_exporter_test.go b/exporter/datadogexporter/logs_exporter_test.go index 197153cc7fcb..941561890853 100644 --- a/exporter/datadogexporter/logs_exporter_test.go +++ b/exporter/datadogexporter/logs_exporter_test.go @@ -12,14 +12,15 @@ import ( "testing" "time" + "github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/config/confignet" "go.opentelemetry.io/collector/exporter/exportertest" "go.opentelemetry.io/collector/featuregate" "go.opentelemetry.io/collector/pdata/plog" + conventions127 "go.opentelemetry.io/collector/semconv/v1.27.0" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/testutil" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/testdata" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/traceutil" ) @@ -212,6 +213,8 @@ func TestLogsExporter(t *testing.T) { }, }, } + featuregateErr := featuregate.GlobalRegistry().Set("exporter.datadogexporter.UseLogsAgentExporter", false) + assert.NoError(t, featuregateErr) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { server := testutil.DatadogLogServerMock() @@ -229,15 +232,17 @@ func TestLogsExporter(t *testing.T) { }, } - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() f := NewFactory() ctx := context.Background() - exp, err := f.CreateLogsExporter(ctx, params, cfg) + exp, err := f.CreateLogs(ctx, params, cfg) require.NoError(t, err) require.NoError(t, exp.ConsumeLogs(ctx, tt.args.ld)) assert.Equal(t, tt.want, server.LogsData) }) } + featuregateErr = featuregate.GlobalRegistry().Set("exporter.datadogexporter.UseLogsAgentExporter", true) + assert.NoError(t, featuregateErr) } func TestLogsAgentExporter(t *testing.T) { @@ -291,6 +296,7 @@ func TestLogsAgentExporter(t *testing.T) { ldd := lrr.ResourceLogs().At(0).ScopeLogs().At(0).LogRecords().At(0) ldd.Attributes().PutStr("attr", "hello") ldd.Attributes().PutStr("service.name", "service") + ldd.Attributes().PutStr("host.name", "test-host") return lrr }(), retry: false, @@ -314,6 +320,8 @@ func TestLogsAgentExporter(t *testing.T) { "attr": "hello", "service": "service", "service.name": "service", + "host.name": "test-host", + "hostname": "test-host", }, "ddsource": "otlp_log_ingestion", "ddtags": "otel_source:datadog_exporter", @@ -496,9 +504,42 @@ func TestLogsAgentExporter(t *testing.T) { }, }, }, + { + name: "new-env-convention", + args: args{ + ld: func() plog.Logs { + lrr := testdata.GenerateLogsOneLogRecord() + lrr.ResourceLogs().At(0).Resource().Attributes().PutStr(conventions127.AttributeDeploymentEnvironmentName, "new_env") + return lrr + }(), + retry: false, + }, + want: testutil.JSONLogs{ + { + "message": testutil.JSONLog{ + "@timestamp": testdata.TestLogTime.Format(timeFormatString), + "app": "server", + "dd.span_id": fmt.Sprintf("%d", spanIDToUint64(ld.SpanID())), + "dd.trace_id": fmt.Sprintf("%d", traceIDToUint64(ld.TraceID())), + "deployment.environment.name": "new_env", + "instance_num": "1", + "message": ld.Body().AsString(), + "otel.severity_number": "9", + "otel.severity_text": "Info", + "otel.span_id": traceutil.SpanIDToHexOrEmptyString(ld.SpanID()), + "otel.timestamp": fmt.Sprintf("%d", testdata.TestLogTime.UnixNano()), + "otel.trace_id": traceutil.TraceIDToHexOrEmptyString(ld.TraceID()), + "resource-attr": "resource-attr-val-1", + "status": "Info", + }, + "ddsource": "otlp_log_ingestion", + "ddtags": "env:new_env,otel_source:datadog_exporter", + "service": "", + "status": "Info", + }, + }, + }, } - err := featuregate.GlobalRegistry().Set("exporter.datadogexporter.UseLogsAgentExporter", true) - assert.NoError(t, err) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { doneChannel := make(chan bool) @@ -555,10 +596,10 @@ func TestLogsAgentExporter(t *testing.T) { BatchWait: 1, }, } - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() f := NewFactory() ctx := context.Background() - exp, err := f.CreateLogsExporter(ctx, params, cfg) + exp, err := f.CreateLogs(ctx, params, cfg) require.NoError(t, err) require.NoError(t, exp.ConsumeLogs(ctx, tt.args.ld)) diff --git a/exporter/datadogexporter/metadata.yaml b/exporter/datadogexporter/metadata.yaml index 912ec16b09e4..bb1f67478bbe 100644 --- a/exporter/datadogexporter/metadata.yaml +++ b/exporter/datadogexporter/metadata.yaml @@ -1,14 +1,12 @@ type: datadog -scope_name: otelcol/datadog status: class: exporter stability: - alpha: [logs] - beta: [traces, metrics] + beta: [traces, metrics, logs] distributions: [contrib] codeowners: - active: [mx-psi, dineshg13, liustanley, songy23, mackjmr, ankitpatel96] + active: [mx-psi, dineshg13, liustanley, songy23, mackjmr, ankitpatel96, jade-guiton-dd] emeritus: [gbbr] tests: diff --git a/exporter/datadogexporter/metrics_exporter.go b/exporter/datadogexporter/metrics_exporter.go index 27dc783e3817..89d8260eb3c1 100644 --- a/exporter/datadogexporter/metrics_exporter.go +++ b/exporter/datadogexporter/metrics_exporter.go @@ -8,6 +8,7 @@ import ( "context" "errors" "fmt" + "io" "net/http" "sync" "time" @@ -18,8 +19,8 @@ import ( "github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes" "github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes/source" otlpmetrics "github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics" - "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/exporter" + "go.opentelemetry.io/collector/featuregate" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" "go.uber.org/zap" @@ -32,8 +33,20 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/scrub" ) +var metricRemappingDisableddFeatureGate = featuregate.GlobalRegistry().MustRegister( + "exporter.datadogexporter.metricremappingdisabled", + featuregate.StageAlpha, + featuregate.WithRegisterDescription("When enabled the Datadog Exporter remaps OpenTelemetry semantic conventions to Datadog semantic conventions. This feature gate is only for internal use."), + featuregate.WithRegisterReferenceURL("https://docs.datadoghq.com/opentelemetry/schema_semantics/metrics_mapping/"), +) + +// isMetricRemappingDisabled returns true if the datadogexporter should generate Datadog-compliant metrics from OpenTelemetry metrics +func isMetricRemappingDisabled() bool { + return metricRemappingDisableddFeatureGate.IsEnabled() +} + type metricsExporter struct { - params exporter.CreateSettings + params exporter.Settings cfg *Config agntConfig *config.AgentConfig ctx context.Context @@ -50,46 +63,9 @@ type metricsExporter struct { getPushTime func() uint64 } -// translatorFromConfig creates a new metrics translator from the exporter -func translatorFromConfig(set component.TelemetrySettings, cfg *Config, attrsTranslator *attributes.Translator, sourceProvider source.Provider, statsOut chan []byte) (*otlpmetrics.Translator, error) { - options := []otlpmetrics.TranslatorOption{ - otlpmetrics.WithDeltaTTL(cfg.Metrics.DeltaTTL), - otlpmetrics.WithFallbackSourceProvider(sourceProvider), - otlpmetrics.WithRemapping(), - } - - if cfg.Metrics.HistConfig.SendAggregations { - options = append(options, otlpmetrics.WithHistogramAggregations()) - } - - if cfg.Metrics.SummaryConfig.Mode == SummaryModeGauges { - options = append(options, otlpmetrics.WithQuantiles()) - } - - if cfg.Metrics.ExporterConfig.InstrumentationScopeMetadataAsTags { - options = append(options, otlpmetrics.WithInstrumentationScopeMetadataAsTags()) - } - - options = append(options, otlpmetrics.WithHistogramMode(otlpmetrics.HistogramMode(cfg.Metrics.HistConfig.Mode))) - - var numberMode otlpmetrics.NumberMode - switch cfg.Metrics.SumConfig.CumulativeMonotonicMode { - case CumulativeMonotonicSumModeRawValue: - numberMode = otlpmetrics.NumberModeRawValue - case CumulativeMonotonicSumModeToDelta: - numberMode = otlpmetrics.NumberModeCumulativeToDelta - } - options = append(options, otlpmetrics.WithNumberMode(numberMode)) - options = append(options, otlpmetrics.WithInitialCumulMonoValueMode( - otlpmetrics.InitialCumulMonoValueMode(cfg.Metrics.SumConfig.InitialCumulativeMonotonicMode))) - - options = append(options, otlpmetrics.WithStatsOut(statsOut)) - return otlpmetrics.NewTranslator(set, attrsTranslator, options...) -} - func newMetricsExporter( ctx context.Context, - params exporter.CreateSettings, + params exporter.Settings, cfg *Config, agntConfig *config.AgentConfig, onceMetadata *sync.Once, @@ -98,7 +74,16 @@ func newMetricsExporter( metadataReporter *inframetadata.Reporter, statsOut chan []byte, ) (*metricsExporter, error) { - tr, err := translatorFromConfig(params.TelemetrySettings, cfg, attrsTranslator, sourceProvider, statsOut) + options := cfg.Metrics.ToTranslatorOpts() + options = append(options, otlpmetrics.WithFallbackSourceProvider(sourceProvider)) + options = append(options, otlpmetrics.WithStatsOut(statsOut)) + if isMetricRemappingDisabled() { + params.TelemetrySettings.Logger.Warn("Metric remapping is disabled in the Datadog exporter. OpenTelemetry metrics must be mapped to Datadog semantics before metrics are exported to Datadog (ex: via a processor).") + } else { + options = append(options, otlpmetrics.WithRemapping()) + } + + tr, err := otlpmetrics.NewTranslator(params.TelemetrySettings, attrsTranslator, options...) if err != nil { return nil, err } @@ -170,6 +155,13 @@ func (exp *metricsExporter) pushSketches(ctx context.Context, sl sketches.Sketch } defer resp.Body.Close() + // We must read the full response body from the http request to ensure that connections can be + // properly re-used. https://pkg.go.dev/net/http#Client.Do + _, err = io.Copy(io.Discard, resp.Body) + if err != nil { + return clientutil.WrapError(fmt.Errorf("failed to read response body from sketches HTTP request: %w", err), resp) + } + if resp.StatusCode >= 400 { return clientutil.WrapError(fmt.Errorf("error when sending payload to %s: %s", sketches.SketchSeriesEndpoint, resp.Status), resp) } diff --git a/exporter/datadogexporter/metrics_exporter_test.go b/exporter/datadogexporter/metrics_exporter_test.go index a95e6516b01a..95935fd053a4 100644 --- a/exporter/datadogexporter/metrics_exporter_test.go +++ b/exporter/datadogexporter/metrics_exporter_test.go @@ -15,6 +15,7 @@ import ( "time" "github.com/DataDog/agent-payload/v5/gogen" + "github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil" traceconfig "github.com/DataDog/datadog-agent/pkg/trace/config" "github.com/DataDog/datadog-api-client-go/v2/api/datadogV2" "github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata" @@ -27,10 +28,9 @@ import ( "go.opentelemetry.io/collector/exporter/exportertest" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" + conventions127 "go.opentelemetry.io/collector/semconv/v1.27.0" conventions "go.opentelemetry.io/collector/semconv/v1.6.1" "go.uber.org/zap" - - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/testutil" ) func TestNewExporter(t *testing.T) { @@ -43,7 +43,7 @@ func TestNewExporter(t *testing.T) { cfg := &Config{ API: APIConfig{ - Key: "ddog_32_characters_long_api_key1", + Key: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", }, Metrics: MetricsConfig{ TCPAddrConfig: confignet.TCPAddrConfig{ @@ -58,28 +58,33 @@ func TestNewExporter(t *testing.T) { CumulativeMonotonicMode: CumulativeMonotonicSumModeToDelta, }, }, + HostMetadata: HostMetadataConfig{ + Enabled: true, + ReporterPeriod: 30 * time.Minute, + HostnameSource: HostnameSourceFirstResource, + }, } - params := exportertest.NewNopCreateSettings() + cfg.HostMetadata.SetSourceTimeout(50 * time.Millisecond) + + params := exportertest.NewNopSettings() f := NewFactory() // The client should have been created correctly - exp, err := f.CreateMetricsExporter(context.Background(), params, cfg) + exp, err := f.CreateMetrics(context.Background(), params, cfg) require.NoError(t, err) assert.NotNil(t, exp) testMetrics := pmetric.NewMetrics() testutil.TestMetrics.CopyTo(testMetrics) err = exp.ConsumeMetrics(context.Background(), testMetrics) require.NoError(t, err) - assert.Equal(t, len(server.MetadataChan), 0) + assert.Empty(t, server.MetadataChan) - cfg.HostMetadata.Enabled = true - cfg.HostMetadata.HostnameSource = HostnameSourceFirstResource testMetrics = pmetric.NewMetrics() testutil.TestMetrics.CopyTo(testMetrics) err = exp.ConsumeMetrics(context.Background(), testMetrics) require.NoError(t, err) recvMetadata := <-server.MetadataChan - assert.Equal(t, recvMetadata.InternalHostname, "custom-hostname") + assert.Equal(t, "custom-hostname", recvMetadata.InternalHostname) } func Test_metricsExporter_PushMetricsData(t *testing.T) { @@ -165,6 +170,64 @@ func Test_metricsExporter_PushMetricsData(t *testing.T) { }, }, }, + { + metrics: createTestMetrics(map[string]string{ + conventions127.AttributeDeploymentEnvironmentName: "new_env", + "custom_attribute": "custom_value", + }), + source: source.Source{ + Kind: source.HostnameKind, + Identifier: "test-host", + }, + histogramMode: HistogramModeCounters, + hostTags: []string{"key1:value1", "key2:value2"}, + expectedSeries: map[string]any{ + "series": []any{ + map[string]any{ + "metric": "int.gauge", + "points": []any{map[string]any{"timestamp": float64(0), "value": float64(222)}}, + "type": float64(datadogV2.METRICINTAKETYPE_GAUGE), + "resources": []any{map[string]any{"name": "test-host", "type": "host"}}, + "tags": []any{"env:new_env"}, + }, + map[string]any{ + "metric": "otel.system.filesystem.utilization", + "points": []any{map[string]any{"timestamp": float64(0), "value": float64(333)}}, + "type": float64(datadogV2.METRICINTAKETYPE_GAUGE), + "resources": []any{map[string]any{"name": "test-host", "type": "host"}}, + "tags": []any{"env:new_env"}, + }, + map[string]any{ + "metric": "double.histogram.bucket", + "points": []any{map[string]any{"timestamp": float64(0), "value": float64(2)}}, + "type": float64(datadogV2.METRICINTAKETYPE_COUNT), + "resources": []any{map[string]any{"name": "test-host", "type": "host"}}, + "tags": []any{"lower_bound:-inf", "upper_bound:0", "env:new_env"}, + }, + map[string]any{ + "metric": "double.histogram.bucket", + "points": []any{map[string]any{"timestamp": float64(0), "value": float64(18)}}, + "type": float64(datadogV2.METRICINTAKETYPE_COUNT), + "resources": []any{map[string]any{"name": "test-host", "type": "host"}}, + "tags": []any{"lower_bound:0", "upper_bound:inf", "env:new_env"}, + }, + map[string]any{ + "metric": "system.disk.in_use", + "points": []any{map[string]any{"timestamp": float64(0), "value": float64(333)}}, + "type": float64(datadogV2.METRICINTAKETYPE_GAUGE), + "resources": []any{map[string]any{"name": "test-host", "type": "host"}}, + "tags": []any{"env:new_env"}, + }, + map[string]any{ + "metric": "otel.datadog_exporter.metrics.running", + "points": []any{map[string]any{"timestamp": float64(0), "value": float64(1)}}, + "type": float64(datadogV2.METRICINTAKETYPE_GAUGE), + "resources": []any{map[string]any{"name": "test-host", "type": "host"}}, + "tags": []any{"version:latest", "command:otelcol"}, + }, + }, + }, + }, { metrics: createTestMetrics(attrs), source: source.Source{ @@ -290,9 +353,7 @@ func Test_metricsExporter_PushMetricsData(t *testing.T) { ) defer server.Close() - var ( - once sync.Once - ) + var once sync.Once pusher := newTestPusher(t) reporter, err := inframetadata.NewReporter(zap.NewNop(), pusher, 1*time.Second) require.NoError(t, err) @@ -301,7 +362,7 @@ func Test_metricsExporter_PushMetricsData(t *testing.T) { acfg := traceconfig.New() exp, err := newMetricsExporter( context.Background(), - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), newTestConfig(t, server.URL, tt.hostTags, tt.histogramMode), acfg, &once, @@ -364,7 +425,7 @@ func TestNewExporter_Zorkian(t *testing.T) { cfg := &Config{ API: APIConfig{ - Key: "ddog_32_characters_long_api_key1", + Key: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", }, Metrics: MetricsConfig{ TCPAddrConfig: confignet.TCPAddrConfig{ @@ -379,28 +440,31 @@ func TestNewExporter_Zorkian(t *testing.T) { CumulativeMonotonicMode: CumulativeMonotonicSumModeToDelta, }, }, + HostMetadata: HostMetadataConfig{ + Enabled: true, + ReporterPeriod: 30 * time.Minute, + HostnameSource: HostnameSourceFirstResource, + }, } - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() f := NewFactory() // The client should have been created correctly - exp, err := f.CreateMetricsExporter(context.Background(), params, cfg) + exp, err := f.CreateMetrics(context.Background(), params, cfg) require.NoError(t, err) assert.NotNil(t, exp) testMetrics := pmetric.NewMetrics() testutil.TestMetrics.CopyTo(testMetrics) err = exp.ConsumeMetrics(context.Background(), testMetrics) require.NoError(t, err) - assert.Equal(t, len(server.MetadataChan), 0) + assert.Empty(t, server.MetadataChan) - cfg.HostMetadata.Enabled = true - cfg.HostMetadata.HostnameSource = HostnameSourceFirstResource testMetrics = pmetric.NewMetrics() testutil.TestMetrics.CopyTo(testMetrics) err = exp.ConsumeMetrics(context.Background(), testMetrics) require.NoError(t, err) recvMetadata := <-server.MetadataChan - assert.Equal(t, recvMetadata.InternalHostname, "custom-hostname") + assert.Equal(t, "custom-hostname", recvMetadata.InternalHostname) } func Test_metricsExporter_PushMetricsData_Zorkian(t *testing.T) { @@ -486,6 +550,64 @@ func Test_metricsExporter_PushMetricsData_Zorkian(t *testing.T) { }, }, }, + { + metrics: createTestMetrics(map[string]string{ + conventions127.AttributeDeploymentEnvironmentName: "new_env", + "custom_attribute": "custom_value", + }), + source: source.Source{ + Kind: source.HostnameKind, + Identifier: "test-host", + }, + histogramMode: HistogramModeCounters, + hostTags: []string{"key1:value1", "key2:value2"}, + expectedSeries: map[string]any{ + "series": []any{ + map[string]any{ + "metric": "int.gauge", + "points": []any{[]any{float64(0), float64(222)}}, + "type": "gauge", + "host": "test-host", + "tags": []any{"env:new_env"}, + }, + map[string]any{ + "metric": "otel.system.filesystem.utilization", + "points": []any{[]any{float64(0), float64(333)}}, + "type": "gauge", + "host": "test-host", + "tags": []any{"env:new_env"}, + }, + map[string]any{ + "metric": "double.histogram.bucket", + "points": []any{[]any{float64(0), float64(2)}}, + "type": "count", + "host": "test-host", + "tags": []any{"lower_bound:-inf", "upper_bound:0", "env:new_env"}, + }, + map[string]any{ + "metric": "double.histogram.bucket", + "points": []any{[]any{float64(0), float64(18)}}, + "type": "count", + "host": "test-host", + "tags": []any{"lower_bound:0", "upper_bound:inf", "env:new_env"}, + }, + map[string]any{ + "metric": "system.disk.in_use", + "points": []any{[]any{float64(0), float64(333)}}, + "type": "gauge", + "host": "test-host", + "tags": []any{"env:new_env"}, + }, + map[string]any{ + "metric": "otel.datadog_exporter.metrics.running", + "points": []any{[]any{float64(0), float64(1)}}, + "type": "gauge", + "host": "test-host", + "tags": []any{"version:latest", "command:otelcol"}, + }, + }, + }, + }, { metrics: createTestMetrics(attrs), source: source.Source{ @@ -675,9 +797,7 @@ func Test_metricsExporter_PushMetricsData_Zorkian(t *testing.T) { ) defer server.Close() - var ( - once sync.Once - ) + var once sync.Once pusher := newTestPusher(t) reporter, err := inframetadata.NewReporter(zap.NewNop(), pusher, 1*time.Second) require.NoError(t, err) @@ -686,7 +806,7 @@ func Test_metricsExporter_PushMetricsData_Zorkian(t *testing.T) { acfg := traceconfig.New() exp, err := newMetricsExporter( context.Background(), - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), newTestConfig(t, server.URL, tt.hostTags, tt.histogramMode), acfg, &once, diff --git a/exporter/datadogexporter/traces_exporter.go b/exporter/datadogexporter/traces_exporter.go index 640e22b0b1be..a510c7e88ae4 100644 --- a/exporter/datadogexporter/traces_exporter.go +++ b/exporter/datadogexporter/traces_exporter.go @@ -10,6 +10,7 @@ import ( "sync" "time" + gzip "github.com/DataDog/datadog-agent/comp/trace/compression/impl-gzip" "github.com/DataDog/datadog-agent/pkg/trace/agent" traceconfig "github.com/DataDog/datadog-agent/pkg/trace/config" tracelog "github.com/DataDog/datadog-agent/pkg/trace/log" @@ -21,6 +22,7 @@ import ( "github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes/source" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/exporter" + "go.opentelemetry.io/collector/featuregate" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" "go.uber.org/zap" @@ -32,8 +34,15 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/scrub" ) +var traceCustomHTTPFeatureGate = featuregate.GlobalRegistry().MustRegister( + "exporter.datadogexporter.TraceExportUseCustomHTTPClient", + featuregate.StageAlpha, + featuregate.WithRegisterDescription("When enabled, trace export uses the HTTP client from the exporter HTTP configs"), + featuregate.WithRegisterFromVersion("v0.105.0"), +) + type traceExporter struct { - params exporter.CreateSettings + params exporter.Settings cfg *Config ctx context.Context // ctx triggers shutdown upon cancellation client *zorkian.Client // client sends runnimg metrics to backend & performs API validation @@ -48,7 +57,7 @@ type traceExporter struct { func newTracesExporter( ctx context.Context, - params exporter.CreateSettings, + params exporter.Settings, cfg *Config, onceMetadata *sync.Once, sourceProvider source.Provider, @@ -182,15 +191,15 @@ func (exp *traceExporter) exportUsageMetrics(ctx context.Context, hosts map[stri } } -func newTraceAgent(ctx context.Context, params exporter.CreateSettings, cfg *Config, sourceProvider source.Provider, metricsClient statsd.ClientInterface, attrsTranslator *attributes.Translator) (*agent.Agent, error) { +func newTraceAgent(ctx context.Context, params exporter.Settings, cfg *Config, sourceProvider source.Provider, metricsClient statsd.ClientInterface, attrsTranslator *attributes.Translator) (*agent.Agent, error) { acfg, err := newTraceAgentConfig(ctx, params, cfg, sourceProvider, attrsTranslator) if err != nil { return nil, err } - return agent.NewAgent(ctx, acfg, telemetry.NewNoopCollector(), metricsClient), nil + return agent.NewAgent(ctx, acfg, telemetry.NewNoopCollector(), metricsClient, gzip.NewComponent()), nil } -func newTraceAgentConfig(ctx context.Context, params exporter.CreateSettings, cfg *Config, sourceProvider source.Provider, attrsTranslator *attributes.Translator) (*traceconfig.AgentConfig, error) { +func newTraceAgentConfig(ctx context.Context, params exporter.Settings, cfg *Config, sourceProvider source.Provider, attrsTranslator *attributes.Translator) (*traceconfig.AgentConfig, error) { acfg := traceconfig.New() src, err := sourceProvider.Source(ctx) if err != nil { @@ -204,13 +213,20 @@ func newTraceAgentConfig(ctx context.Context, params exporter.CreateSettings, cf acfg.OTLPReceiver.SpanNameAsResourceName = cfg.Traces.SpanNameAsResourceName acfg.Endpoints[0].APIKey = string(cfg.API.Key) acfg.Ignore["resource"] = cfg.Traces.IgnoreResources - acfg.ReceiverPort = 0 // disable HTTP receiver + acfg.ReceiverEnabled = false // disable HTTP receiver acfg.AgentVersion = fmt.Sprintf("datadogexporter-%s-%s", params.BuildInfo.Command, params.BuildInfo.Version) acfg.SkipSSLValidation = cfg.ClientConfig.TLSSetting.InsecureSkipVerify acfg.ComputeStatsBySpanKind = cfg.Traces.ComputeStatsBySpanKind acfg.PeerTagsAggregation = cfg.Traces.PeerTagsAggregation acfg.PeerTags = cfg.Traces.PeerTags - if v := cfg.Traces.flushInterval; v > 0 { + acfg.MaxSenderRetries = 4 + if traceCustomHTTPFeatureGate.IsEnabled() { + params.Logger.Info("Experimental feature: datadog exporter trace export uses a custom HTTP client from the exporter HTTP configs") + acfg.HTTPClientFunc = func() *http.Client { + return clientutil.NewHTTPClient(cfg.ClientConfig) + } + } + if v := cfg.Traces.GetFlushInterval(); v > 0 { acfg.TraceWriter.FlushPeriodSeconds = v } if v := cfg.Traces.TraceBuffer; v > 0 { @@ -222,6 +238,6 @@ func newTraceAgentConfig(ctx context.Context, params exporter.CreateSettings, cf if cfg.Traces.ComputeTopLevelBySpanKind { acfg.Features["enable_otlp_compute_top_level_by_span_kind"] = struct{}{} } - tracelog.SetLogger(&zaplogger{params.Logger}) //TODO: This shouldn't be a singleton + tracelog.SetLogger(&zaplogger{params.Logger}) // TODO: This shouldn't be a singleton return acfg, nil } diff --git a/exporter/datadogexporter/traces_exporter_test.go b/exporter/datadogexporter/traces_exporter_test.go index 221619f284e5..169276dd8c9d 100644 --- a/exporter/datadogexporter/traces_exporter_test.go +++ b/exporter/datadogexporter/traces_exporter_test.go @@ -9,12 +9,15 @@ import ( "context" "encoding/json" "fmt" + "io" "net/http" "net/http/httptest" "os" "testing" "time" + "github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil" + pb "github.com/DataDog/datadog-agent/pkg/proto/pbgo/trace" tracelog "github.com/DataDog/datadog-agent/pkg/trace/log" "github.com/DataDog/datadog-api-client-go/v2/api/datadogV2" "github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes" @@ -24,9 +27,11 @@ import ( "go.opentelemetry.io/collector/exporter/exportertest" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" + conventions127 "go.opentelemetry.io/collector/semconv/v1.27.0" semconv "go.opentelemetry.io/collector/semconv/v1.6.1" + "google.golang.org/protobuf/proto" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/testutil" + datadogconfig "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/datadog/config" ) func setupTestMain(m *testing.M) { @@ -111,11 +116,10 @@ func TestTracesSource(t *testing.T) { return } buf := new(bytes.Buffer) - if _, err := buf.ReadFrom(r.Body); err != nil { - t.Fatalf("Metrics server handler error: %v", err) - } + _, err := buf.ReadFrom(r.Body) + assert.NoError(t, err, "Metrics server handler error: %v", err) reqs <- buf.Bytes() - _, err := w.Write([]byte("{\"status\": \"ok\"}")) + _, err = w.Write([]byte("{\"status\": \"ok\"}")) assert.NoError(t, err) })) defer metricsServer.Close() @@ -135,15 +139,17 @@ func TestTracesSource(t *testing.T) { TCPAddrConfig: confignet.TCPAddrConfig{Endpoint: metricsServer.URL}, }, Traces: TracesConfig{ - TCPAddrConfig: confignet.TCPAddrConfig{Endpoint: tracesServer.URL}, - IgnoreResources: []string{}, + TCPAddrConfig: confignet.TCPAddrConfig{Endpoint: tracesServer.URL}, + TracesConfig: datadogconfig.TracesConfig{ + IgnoreResources: []string{}, + }, }, } assert := assert.New(t) - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() f := NewFactory() - exporter, err := f.CreateTracesExporter(context.Background(), params, &cfg) + exporter, err := f.CreateTraces(context.Background(), params, &cfg) assert.NoError(err) // Payload specifies a sub-set of a Zorkian metrics series payload. @@ -255,15 +261,17 @@ func TestTraceExporter(t *testing.T) { TCPAddrConfig: confignet.TCPAddrConfig{ Endpoint: server.URL, }, - IgnoreResources: []string{}, - flushInterval: 0.1, - TraceBuffer: 2, + TracesConfig: datadogconfig.TracesConfig{ + IgnoreResources: []string{}, + }, + TraceBuffer: 2, }, } + cfg.Traces.SetFlushInterval(0.1) - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() f := NewFactory() - exporter, err := f.CreateTracesExporter(context.Background(), params, &cfg) + exporter, err := f.CreateTraces(context.Background(), params, &cfg) assert.NoError(t, err) ctx := context.Background() @@ -286,11 +294,11 @@ func TestNewTracesExporter(t *testing.T) { cfg := &Config{} cfg.API.Key = "ddog_32_characters_long_api_key1" cfg.Metrics.TCPAddrConfig.Endpoint = metricsServer.URL - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() // The client should have been created correctly f := NewFactory() - exp, err := f.CreateTracesExporter(context.Background(), params, cfg) + exp, err := f.CreateTraces(context.Background(), params, cfg) assert.NoError(t, err) assert.NotNil(t, exp) } @@ -311,16 +319,16 @@ func TestPushTraceData(t *testing.T) { Traces: TracesConfig{ TCPAddrConfig: confignet.TCPAddrConfig{Endpoint: server.URL}, }, - HostMetadata: HostMetadataConfig{ Enabled: true, HostnameSource: HostnameSourceFirstResource, + ReporterPeriod: 30 * time.Minute, }, } - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() f := NewFactory() - exp, err := f.CreateTracesExporter(context.Background(), params, cfg) + exp, err := f.CreateTraces(context.Background(), params, cfg) assert.NoError(t, err) testTraces := ptrace.NewTraces() @@ -329,7 +337,47 @@ func TestPushTraceData(t *testing.T) { assert.NoError(t, err) recvMetadata := <-server.MetadataChan - assert.Equal(t, recvMetadata.InternalHostname, "custom-hostname") + assert.Equal(t, "custom-hostname", recvMetadata.InternalHostname) +} + +func TestPushTraceData_NewEnvConvention(t *testing.T) { + tracesRec := &testutil.HTTPRequestRecorderWithChan{Pattern: testutil.TraceEndpoint, ReqChan: make(chan []byte)} + server := testutil.DatadogServerMock(tracesRec.HandlerFunc) + defer server.Close() + cfg := &Config{ + API: APIConfig{ + Key: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + }, + TagsConfig: TagsConfig{ + Hostname: "test-host", + }, + Metrics: MetricsConfig{ + TCPAddrConfig: confignet.TCPAddrConfig{Endpoint: server.URL}, + }, + Traces: TracesConfig{ + TCPAddrConfig: confignet.TCPAddrConfig{Endpoint: server.URL}, + }, + } + cfg.Traces.SetFlushInterval(0.1) + + params := exportertest.NewNopSettings() + f := NewFactory() + exp, err := f.CreateTraces(context.Background(), params, cfg) + assert.NoError(t, err) + + err = exp.ConsumeTraces(context.Background(), simpleTracesWithAttributes(map[string]any{conventions127.AttributeDeploymentEnvironmentName: "new_env"})) + assert.NoError(t, err) + + reqBytes := <-tracesRec.ReqChan + buf := bytes.NewBuffer(reqBytes) + reader, err := gzip.NewReader(buf) + require.NoError(t, err) + slurp, err := io.ReadAll(reader) + require.NoError(t, err) + var traces pb.AgentPayload + require.NoError(t, proto.Unmarshal(slurp, &traces)) + assert.Len(t, traces.TracerPayloads, 1) + assert.Equal(t, "new_env", traces.TracerPayloads[0].GetEnv()) } func simpleTraces() ptrace.Traces { diff --git a/exporter/datasetexporter/README.md b/exporter/datasetexporter/README.md index 05720c9645df..f9d9d55c6ff3 100644 --- a/exporter/datasetexporter/README.md +++ b/exporter/datasetexporter/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fdataset%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fdataset) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fdataset%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fdataset) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@atoulme](https://www.github.com/atoulme), [@martin-majlis-s1](https://www.github.com/martin-majlis-s1), [@zdaratom-s1](https://www.github.com/zdaratom-s1), [@tomaz-s1](https://www.github.com/tomaz-s1) | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib @@ -54,6 +54,7 @@ Make sure to provide the appropriate server host value in the `serverHost` attri - `retry_max_interval` (default = 30s): Is the upper bound on backoff. - `retry_max_elapsed_time` (default = 300s): Is the maximum amount of time spent trying to send a buffer. - `retry_shutdown_timeout` (default = 30s): The maximum time for which it will try to send data to the DataSet during shutdown. This value should be shorter than container's grace period. + - `max_parallel_outgoing` (default = 100): The maximum number of parallel outgoing requests. - `logs`: - `export_resource_info_on_event` (default = false): Include LogRecord resource information (if available) on the DataSet event. - `export_resource_prefix` (default = 'resource.attributes.'): A prefix string for the resource, if `export_resource_info_on_event` is enabled. diff --git a/exporter/datasetexporter/config.go b/exporter/datasetexporter/config.go index 22734ba4719a..ffc61e1401c0 100644 --- a/exporter/datasetexporter/config.go +++ b/exporter/datasetexporter/config.go @@ -18,8 +18,10 @@ import ( "go.opentelemetry.io/collector/exporter/exporterhelper" ) -const exportSeparatorDefault = "." -const exportDistinguishingSuffix = "_" +const ( + exportSeparatorDefault = "." + exportDistinguishingSuffix = "_" +) // exportSettings configures separator and distinguishing suffixes for all exported fields type exportSettings struct { @@ -52,12 +54,14 @@ func newDefaultTracesSettings() TracesSettings { } } -const logsExportResourceInfoDefault = false -const logsExportResourcePrefixDefault = "resource.attributes." -const logsExportScopeInfoDefault = true -const logsExportScopePrefixDefault = "scope.attributes." -const logsDecomposeComplexMessageFieldDefault = false -const logsDecomposedComplexMessageFieldPrefixDefault = "body.map." +const ( + logsExportResourceInfoDefault = false + logsExportResourcePrefixDefault = "resource.attributes." + logsExportScopeInfoDefault = true + logsExportScopePrefixDefault = "scope.attributes." + logsDecomposeComplexMessageFieldDefault = false + logsDecomposedComplexMessageFieldPrefixDefault = "body.map." +) type LogsSettings struct { // ExportResourceInfo is optional flag to signal that the resource info is being exported to DataSet while exporting Logs. @@ -105,12 +109,15 @@ func newDefaultLogsSettings() LogsSettings { } } -const bufferMaxLifetime = 5 * time.Second -const bufferPurgeOlderThan = 30 * time.Second -const bufferRetryInitialInterval = 5 * time.Second -const bufferRetryMaxInterval = 30 * time.Second -const bufferRetryMaxElapsedTime = 300 * time.Second -const bufferRetryShutdownTimeout = 30 * time.Second +const ( + bufferMaxLifetime = 5 * time.Second + bufferPurgeOlderThan = 30 * time.Second + bufferRetryInitialInterval = 5 * time.Second + bufferRetryMaxInterval = 30 * time.Second + bufferRetryMaxElapsedTime = 300 * time.Second + bufferRetryShutdownTimeout = 30 * time.Second + bufferMaxParallelOutgoing = 100 +) type BufferSettings struct { MaxLifetime time.Duration `mapstructure:"max_lifetime"` @@ -120,6 +127,7 @@ type BufferSettings struct { RetryMaxInterval time.Duration `mapstructure:"retry_max_interval"` RetryMaxElapsedTime time.Duration `mapstructure:"retry_max_elapsed_time"` RetryShutdownTimeout time.Duration `mapstructure:"retry_shutdown_timeout"` + MaxParallelOutgoing int `mapstructure:"max_parallel_outgoing"` } // newDefaultBufferSettings returns the default settings for BufferSettings. @@ -132,6 +140,7 @@ func newDefaultBufferSettings() BufferSettings { RetryMaxInterval: bufferRetryMaxInterval, RetryMaxElapsedTime: bufferRetryMaxElapsedTime, RetryShutdownTimeout: bufferRetryShutdownTimeout, + MaxParallelOutgoing: bufferMaxParallelOutgoing, } } @@ -151,16 +160,16 @@ func newDefaultServerHostSettings() ServerHostSettings { const debugDefault = false type Config struct { - DatasetURL string `mapstructure:"dataset_url"` - APIKey configopaque.String `mapstructure:"api_key"` - Debug bool `mapstructure:"debug"` - BufferSettings `mapstructure:"buffer"` - TracesSettings `mapstructure:"traces"` - LogsSettings `mapstructure:"logs"` - ServerHostSettings `mapstructure:"server_host"` - configretry.BackOffConfig `mapstructure:"retry_on_failure"` - exporterhelper.QueueSettings `mapstructure:"sending_queue"` - exporterhelper.TimeoutSettings `mapstructure:"timeout"` + DatasetURL string `mapstructure:"dataset_url"` + APIKey configopaque.String `mapstructure:"api_key"` + Debug bool `mapstructure:"debug"` + BufferSettings `mapstructure:"buffer"` + TracesSettings `mapstructure:"traces"` + LogsSettings `mapstructure:"logs"` + ServerHostSettings `mapstructure:"server_host"` + configretry.BackOffConfig `mapstructure:"retry_on_failure"` + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` + TimeoutSettings exporterhelper.TimeoutConfig `mapstructure:"timeout"` } func (c *Config) Unmarshal(conf *confmap.Conf) error { @@ -202,39 +211,34 @@ func (c *Config) String() string { return s } -func (c *Config) convert() (*ExporterConfig, error) { - err := c.Validate() - if err != nil { - return nil, fmt.Errorf("config is not valid: %w", err) - } - +func (c *Config) convert() *ExporterConfig { return &ExporterConfig{ - datasetConfig: &datasetConfig.DataSetConfig{ - Endpoint: c.DatasetURL, - Tokens: datasetConfig.DataSetTokens{WriteLog: string(c.APIKey)}, - BufferSettings: buffer_config.DataSetBufferSettings{ - MaxLifetime: c.BufferSettings.MaxLifetime, - PurgeOlderThan: c.BufferSettings.PurgeOlderThan, - MaxSize: buffer.LimitBufferSize, - GroupBy: c.BufferSettings.GroupBy, - RetryInitialInterval: c.BufferSettings.RetryInitialInterval, - RetryMaxInterval: c.BufferSettings.RetryMaxInterval, - RetryMaxElapsedTime: c.BufferSettings.RetryMaxElapsedTime, - RetryMultiplier: backoff.DefaultMultiplier, - RetryRandomizationFactor: backoff.DefaultRandomizationFactor, - RetryShutdownTimeout: c.BufferSettings.RetryShutdownTimeout, - }, - ServerHostSettings: server_host_config.DataSetServerHostSettings{ - UseHostName: c.ServerHostSettings.UseHostName, - ServerHost: c.ServerHostSettings.ServerHost, - }, - Debug: c.Debug, + datasetConfig: &datasetConfig.DataSetConfig{ + Endpoint: c.DatasetURL, + Tokens: datasetConfig.DataSetTokens{WriteLog: string(c.APIKey)}, + BufferSettings: buffer_config.DataSetBufferSettings{ + MaxLifetime: c.BufferSettings.MaxLifetime, + PurgeOlderThan: c.BufferSettings.PurgeOlderThan, + MaxSize: buffer.LimitBufferSize, + GroupBy: c.BufferSettings.GroupBy, + RetryInitialInterval: c.BufferSettings.RetryInitialInterval, + RetryMaxInterval: c.BufferSettings.RetryMaxInterval, + RetryMaxElapsedTime: c.BufferSettings.RetryMaxElapsedTime, + RetryMultiplier: backoff.DefaultMultiplier, + RetryRandomizationFactor: backoff.DefaultRandomizationFactor, + RetryShutdownTimeout: c.BufferSettings.RetryShutdownTimeout, + MaxParallelOutgoing: c.BufferSettings.MaxParallelOutgoing, + }, + ServerHostSettings: server_host_config.DataSetServerHostSettings{ + UseHostName: c.ServerHostSettings.UseHostName, + ServerHost: c.ServerHostSettings.ServerHost, }, - tracesSettings: c.TracesSettings, - logsSettings: c.LogsSettings, - serverHostSettings: c.ServerHostSettings, + Debug: c.Debug, }, - nil + tracesSettings: c.TracesSettings, + logsSettings: c.LogsSettings, + serverHostSettings: c.ServerHostSettings, + } } type ExporterConfig struct { diff --git a/exporter/datasetexporter/config_test.go b/exporter/datasetexporter/config_test.go index 156eaac34d2f..efe18a47afec 100644 --- a/exporter/datasetexporter/config_test.go +++ b/exporter/datasetexporter/config_test.go @@ -24,10 +24,7 @@ func TestConfigUnmarshalUnknownAttributes(t *testing.T) { }) err := configMap.Unmarshal(config) - unmarshalErr := fmt.Errorf("1 error(s) decoding:\n\n* '' has invalid keys: unknown_attribute") - expectedError := fmt.Errorf("cannot unmarshal config: %w", unmarshalErr) - - assert.Equal(t, expectedError.Error(), err.Error()) + assert.ErrorContains(t, err, "has invalid keys: unknown_attribute") } func TestConfigUseDefaults(t *testing.T) { @@ -97,7 +94,7 @@ func TestConfigValidate(t *testing.T) { t.Run(tt.name, func(t *testing.T) { err := tt.config.Validate() if err == nil { - assert.Nil(t, tt.expected, tt.name) + assert.NoError(t, tt.expected, tt.name) } else { assert.Equal(t, tt.expected.Error(), err.Error(), tt.name) } @@ -138,12 +135,12 @@ func TestConfigString(t *testing.T) { UseHostName: false, }, BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), - TimeoutSettings: exporterhelper.NewDefaultTimeoutSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), + TimeoutSettings: exporterhelper.NewDefaultTimeoutConfig(), } assert.Equal(t, - "DatasetURL: https://example.com; APIKey: [REDACTED] (6); Debug: true; BufferSettings: {MaxLifetime:123ns PurgeOlderThan:567ns GroupBy:[field1 field2] RetryInitialInterval:0s RetryMaxInterval:0s RetryMaxElapsedTime:0s RetryShutdownTimeout:0s}; LogsSettings: {ExportResourceInfo:true ExportResourcePrefix:AAA ExportScopeInfo:true ExportScopePrefix:BBB DecomposeComplexMessageField:true DecomposedComplexMessagePrefix:EEE exportSettings:{ExportSeparator:CCC ExportDistinguishingSuffix:DDD}}; TracesSettings: {exportSettings:{ExportSeparator:TTT ExportDistinguishingSuffix:UUU}}; ServerHostSettings: {UseHostName:false ServerHost:foo-bar}; BackOffConfig: {Enabled:true InitialInterval:5s RandomizationFactor:0.5 Multiplier:1.5 MaxInterval:30s MaxElapsedTime:5m0s}; QueueSettings: {Enabled:true NumConsumers:10 QueueSize:1000 StorageID:}; TimeoutSettings: {Timeout:5s}", + "DatasetURL: https://example.com; APIKey: [REDACTED] (6); Debug: true; BufferSettings: {MaxLifetime:123ns PurgeOlderThan:567ns GroupBy:[field1 field2] RetryInitialInterval:0s RetryMaxInterval:0s RetryMaxElapsedTime:0s RetryShutdownTimeout:0s MaxParallelOutgoing:0}; LogsSettings: {ExportResourceInfo:true ExportResourcePrefix:AAA ExportScopeInfo:true ExportScopePrefix:BBB DecomposeComplexMessageField:true DecomposedComplexMessagePrefix:EEE exportSettings:{ExportSeparator:CCC ExportDistinguishingSuffix:DDD}}; TracesSettings: {exportSettings:{ExportSeparator:TTT ExportDistinguishingSuffix:UUU}}; ServerHostSettings: {UseHostName:false ServerHost:foo-bar}; BackOffConfig: {Enabled:true InitialInterval:5s RandomizationFactor:0.5 Multiplier:1.5 MaxInterval:30s MaxElapsedTime:5m0s}; QueueSettings: {Enabled:true NumConsumers:10 QueueSize:1000 StorageID:}; TimeoutSettings: {Timeout:5s}", config.String(), ) } @@ -160,7 +157,7 @@ func TestConfigUseProvidedExportResourceInfoValue(t *testing.T) { }) err := config.Unmarshal(configMap) assert.NoError(t, err) - assert.Equal(t, true, config.LogsSettings.ExportResourceInfo) + assert.True(t, config.LogsSettings.ExportResourceInfo) } func TestConfigUseProvidedExportScopeInfoValue(t *testing.T) { @@ -175,5 +172,5 @@ func TestConfigUseProvidedExportScopeInfoValue(t *testing.T) { }) err := config.Unmarshal(configMap) assert.NoError(t, err) - assert.Equal(t, false, config.LogsSettings.ExportScopeInfo) + assert.False(t, config.LogsSettings.ExportScopeInfo) } diff --git a/exporter/datasetexporter/datasetexporter.go b/exporter/datasetexporter/datasetexporter.go index 70c962730b14..8f50db3a2a20 100644 --- a/exporter/datasetexporter/datasetexporter.go +++ b/exporter/datasetexporter/datasetexporter.go @@ -28,7 +28,7 @@ type DatasetExporter struct { serverHost string } -func newDatasetExporter(entity string, config *Config, set exporter.CreateSettings) (*DatasetExporter, error) { +func newDatasetExporter(entity string, config *Config, set exporter.Settings) (*DatasetExporter, error) { logger := set.Logger logger.Info("Creating new DataSetExporter", zap.String("config", config.String()), @@ -36,13 +36,7 @@ func newDatasetExporter(entity string, config *Config, set exporter.CreateSettin zap.String("id.string", set.ID.String()), zap.String("id.name", set.ID.Name()), ) - exporterCfg, err := config.convert() - if err != nil { - return nil, fmt.Errorf( - "cannot convert config: %s; %w", - config.String(), err, - ) - } + exporterCfg := config.convert() userAgent := fmt.Sprintf( "%s;%s;%s", "OtelCollector", diff --git a/exporter/datasetexporter/factory.go b/exporter/datasetexporter/factory.go index b631aae6527e..aef03084718b 100644 --- a/exporter/datasetexporter/factory.go +++ b/exporter/datasetexporter/factory.go @@ -31,8 +31,8 @@ func createDefaultConfig() component.Config { LogsSettings: newDefaultLogsSettings(), ServerHostSettings: newDefaultServerHostSettings(), BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), - TimeoutSettings: exporterhelper.NewDefaultTimeoutSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), + TimeoutSettings: exporterhelper.NewDefaultTimeoutConfig(), Debug: debugDefault, } } diff --git a/exporter/datasetexporter/factory_test.go b/exporter/datasetexporter/factory_test.go index 3168a0efb47a..dab12b484f66 100644 --- a/exporter/datasetexporter/factory_test.go +++ b/exporter/datasetexporter/factory_test.go @@ -30,11 +30,11 @@ func TestCreateDefaultConfig(t *testing.T) { LogsSettings: newDefaultLogsSettings(), ServerHostSettings: newDefaultServerHostSettings(), BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), - TimeoutSettings: exporterhelper.NewDefaultTimeoutSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), + TimeoutSettings: exporterhelper.NewDefaultTimeoutConfig(), }, cfg, "failed to create default config") - assert.Nil(t, componenttest.CheckConfigStruct(cfg)) + assert.NoError(t, componenttest.CheckConfigStruct(cfg)) } func TestLoadConfig(t *testing.T) { @@ -55,8 +55,8 @@ func TestLoadConfig(t *testing.T) { LogsSettings: newDefaultLogsSettings(), ServerHostSettings: newDefaultServerHostSettings(), BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), - TimeoutSettings: exporterhelper.NewDefaultTimeoutSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), + TimeoutSettings: exporterhelper.NewDefaultTimeoutConfig(), }, }, { @@ -72,13 +72,14 @@ func TestLoadConfig(t *testing.T) { RetryMaxInterval: bufferRetryMaxInterval, RetryMaxElapsedTime: bufferRetryMaxElapsedTime, RetryShutdownTimeout: bufferRetryShutdownTimeout, + MaxParallelOutgoing: bufferMaxParallelOutgoing, }, TracesSettings: newDefaultTracesSettings(), LogsSettings: newDefaultLogsSettings(), ServerHostSettings: newDefaultServerHostSettings(), BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), - TimeoutSettings: exporterhelper.NewDefaultTimeoutSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), + TimeoutSettings: exporterhelper.NewDefaultTimeoutConfig(), }, }, { @@ -95,6 +96,7 @@ func TestLoadConfig(t *testing.T) { RetryMaxInterval: 22 * time.Second, RetryMaxElapsedTime: 23 * time.Second, RetryShutdownTimeout: 24 * time.Second, + MaxParallelOutgoing: 25, }, TracesSettings: TracesSettings{ exportSettings: exportSettings{ @@ -126,12 +128,12 @@ func TestLoadConfig(t *testing.T) { MaxInterval: 12 * time.Nanosecond, MaxElapsedTime: 13 * time.Nanosecond, }, - QueueSettings: exporterhelper.QueueSettings{ + QueueSettings: exporterhelper.QueueConfig{ Enabled: true, NumConsumers: 14, QueueSize: 15, }, - TimeoutSettings: exporterhelper.TimeoutSettings{ + TimeoutSettings: exporterhelper.TimeoutConfig{ Timeout: 16 * time.Nanosecond, }, }, @@ -145,14 +147,25 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.Nil(t, component.UnmarshalConfig(sub, cfg)) - if assert.Nil(t, component.ValidateConfig(cfg)) { + require.NoError(t, sub.Unmarshal(cfg)) + if assert.NoError(t, component.ValidateConfig(cfg)) { assert.Equal(t, tt.expected, cfg) } }) } } +func TestValidateConfigs(t *testing.T) { + tests := createExporterTests() + + for _, tt := range tests { + t.Run(tt.name, func(*testing.T) { + err := component.ValidateConfig(tt.config) + assert.Equal(t, tt.expectedError, err) + }) + } +} + type CreateTest struct { name string config component.Config @@ -169,7 +182,17 @@ func createExporterTests() []CreateTest { { name: "broken", config: &Config{}, - expectedError: fmt.Errorf("cannot get DataSetExporter: cannot convert config: DatasetURL: ; APIKey: [REDACTED] (0); Debug: false; BufferSettings: {MaxLifetime:0s PurgeOlderThan:0s GroupBy:[] RetryInitialInterval:0s RetryMaxInterval:0s RetryMaxElapsedTime:0s RetryShutdownTimeout:0s}; LogsSettings: {ExportResourceInfo:false ExportResourcePrefix: ExportScopeInfo:false ExportScopePrefix: DecomposeComplexMessageField:false DecomposedComplexMessagePrefix: exportSettings:{ExportSeparator: ExportDistinguishingSuffix:}}; TracesSettings: {exportSettings:{ExportSeparator: ExportDistinguishingSuffix:}}; ServerHostSettings: {UseHostName:false ServerHost:}; BackOffConfig: {Enabled:false InitialInterval:0s RandomizationFactor:0 Multiplier:0 MaxInterval:0s MaxElapsedTime:0s}; QueueSettings: {Enabled:false NumConsumers:0 QueueSize:0 StorageID:}; TimeoutSettings: {Timeout:0s}; config is not valid: api_key is required"), + expectedError: fmt.Errorf("api_key is required"), + }, + { + name: "missing-url", + config: &Config{APIKey: "AAA"}, + expectedError: fmt.Errorf("dataset_url is required"), + }, + { + name: "missing-key", + config: &Config{DatasetURL: "bbb"}, + expectedError: fmt.Errorf("api_key is required"), }, { name: "valid", @@ -191,8 +214,8 @@ func createExporterTests() []CreateTest { UseHostName: true, }, BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), - TimeoutSettings: exporterhelper.NewDefaultTimeoutSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), + TimeoutSettings: exporterhelper.NewDefaultTimeoutConfig(), }, expectedError: nil, }, diff --git a/exporter/datasetexporter/generated_component_test.go b/exporter/datasetexporter/generated_component_test.go index 59fd2fcac742..c2681d637dd3 100644 --- a/exporter/datasetexporter/generated_component_test.go +++ b/exporter/datasetexporter/generated_component_test.go @@ -32,20 +32,20 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -57,9 +57,9 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) diff --git a/exporter/datasetexporter/go.mod b/exporter/datasetexporter/go.mod index c50c8bf1b917..f238da2b1721 100644 --- a/exporter/datasetexporter/go.mod +++ b/exporter/datasetexporter/go.mod @@ -1,68 +1,73 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datasetexporter -go 1.21.0 +go 1.22.0 require ( github.com/google/uuid v1.6.0 - // github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/filestorage v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 - github.com/scalyr/dataset-go v0.18.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 + // github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/filestorage v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/scalyr/dataset-go v0.20.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 go.uber.org/zap v1.27.0 ) require ( github.com/cenkalti/backoff/v4 v4.3.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cskr/pubsub v1.0.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/consumer v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/consumer v1.22.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/exp v0.0.0-20230711023510-fffb14384f22 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/datasetexporter/go.sum b/exporter/datasetexporter/go.sum index ae0386bd2e10..e2f0a6556d81 100644 --- a/exporter/datasetexporter/go.sum +++ b/exporter/datasetexporter/go.sum @@ -1,28 +1,26 @@ -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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= -github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -31,8 +29,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -48,60 +46,74 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/scalyr/dataset-go v0.18.0 h1:CTv7kk/FGdiicTWo3h1brFusHD1yjhVGINFamP8uukw= -github.com/scalyr/dataset-go v0.18.0/go.mod h1:4x0JK5X0UdhZ2TEO3kHu9pTELDRc3WsrBBwQfkOPZKc= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/scalyr/dataset-go v0.20.0 h1:VZJew4W/ufnb67yZSpWQKI40U4XpA+w+cDM+mk0qS2E= +github.com/scalyr/dataset-go v0.20.0/go.mod h1:k/A+KhdEyffuTGb1n+jSWg8J5ikV9iYVKejVGjGXXoA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -119,20 +131,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -141,12 +153,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/exporter/datasetexporter/internal/metadata/generated_status.go b/exporter/datasetexporter/internal/metadata/generated_status.go index 72a2f2b9eab2..06790bd20ffc 100644 --- a/exporter/datasetexporter/internal/metadata/generated_status.go +++ b/exporter/datasetexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("dataset") + Type = component.MustNewType("dataset") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datasetexporter" ) const ( diff --git a/exporter/datasetexporter/internal/metadata/generated_telemetry.go b/exporter/datasetexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index 30126089ffa2..000000000000 --- a/exporter/datasetexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/dataset") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/dataset") -} diff --git a/exporter/datasetexporter/internal/metadata/generated_telemetry_test.go b/exporter/datasetexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 66861ec36edb..000000000000 --- a/exporter/datasetexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/dataset", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/dataset", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/datasetexporter/logs_exporter.go b/exporter/datasetexporter/logs_exporter.go index 9ddba874f7f2..f1425c0312aa 100644 --- a/exporter/datasetexporter/logs_exporter.go +++ b/exporter/datasetexporter/logs_exporter.go @@ -39,14 +39,14 @@ const ( dataSetLogLevelFatal = 6 ) -func createLogsExporter(ctx context.Context, set exporter.CreateSettings, config component.Config) (exporter.Logs, error) { +func createLogsExporter(ctx context.Context, set exporter.Settings, config component.Config) (exporter.Logs, error) { cfg := castConfig(config) e, err := newDatasetExporter("logs", cfg, set) if err != nil { return nil, fmt.Errorf("cannot get DataSetExporter: %w", err) } - return exporterhelper.NewLogsExporter( + return exporterhelper.NewLogs( ctx, set, config, diff --git a/exporter/datasetexporter/logs_exporter_stress_test.go b/exporter/datasetexporter/logs_exporter_stress_test.go index d9fb02ef9650..1eaa542bfd8e 100644 --- a/exporter/datasetexporter/logs_exporter_stress_test.go +++ b/exporter/datasetexporter/logs_exporter_stress_test.go @@ -28,10 +28,8 @@ import ( ) func TestConsumeLogsManyLogsShouldSucceed(t *testing.T) { - t.Skip("TODO: Skipping due to https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/32533") - const maxDelay = 200 * time.Millisecond - createSettings := exportertest.NewNopCreateSettings() + createSettings := exportertest.NewNopSettings() const maxBatchCount = 20 const logsPerBatch = 10000 @@ -52,7 +50,7 @@ func TestConsumeLogsManyLogsShouldSucceed(t *testing.T) { for _, ev := range cer.Events { processedEvents.Add(1) - key, found := ev.Attrs["body.str"] + key, found := ev.Attrs["key"] assert.True(t, found) mutex.Lock() sKey := key.(string) @@ -82,11 +80,19 @@ func TestConsumeLogsManyLogsShouldSucceed(t *testing.T) { BufferSettings: BufferSettings{ MaxLifetime: maxDelay, GroupBy: []string{"attributes.container_id"}, + RetryInitialInterval: maxDelay, + RetryMaxInterval: 10 * maxDelay, + RetryMaxElapsedTime: 50 * maxDelay, RetryShutdownTimeout: time.Minute, + PurgeOlderThan: 100 * maxDelay, + MaxParallelOutgoing: bufferMaxParallelOutgoing, }, BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), - TimeoutSettings: exporterhelper.NewDefaultTimeoutSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), + TimeoutSettings: exporterhelper.NewDefaultTimeoutConfig(), + ServerHostSettings: ServerHostSettings{ + UseHostName: true, + }, } logs, err := createLogsExporter(context.Background(), createSettings, config) @@ -138,7 +144,7 @@ func TestConsumeLogsManyLogsShouldSucceed(t *testing.T) { assert.True(t, wasSuccessful.Load()) - assert.Equal(t, seenKeys, expectedKeys) + assert.Equal(t, expectedKeys, seenKeys) assert.Equal(t, expectedLogs, processedEvents.Load(), "processed items") assert.Equal(t, expectedLogs, uint64(len(seenKeys)), "unique items") } diff --git a/exporter/datasetexporter/logs_exporter_test.go b/exporter/datasetexporter/logs_exporter_test.go index 7e63516c6378..c07b44c27781 100644 --- a/exporter/datasetexporter/logs_exporter_test.go +++ b/exporter/datasetexporter/logs_exporter_test.go @@ -31,30 +31,6 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/testdata" ) -func TestCreateLogsExporter(t *testing.T) { - ctx := context.Background() - createSettings := exportertest.NewNopCreateSettings() - tests := createExporterTests() - - for _, tt := range tests { - t.Run(tt.name, func(*testing.T) { - logs, err := createLogsExporter(ctx, createSettings, tt.config) - - if err == nil { - assert.Nil(t, tt.expectedError, tt.name) - assert.NotNil(t, logs, tt.name) - } else { - if tt.expectedError == nil { - assert.Nil(t, err, tt.name) - } else { - assert.Equal(t, tt.expectedError.Error(), err.Error(), tt.name) - assert.Nil(t, logs, tt.name) - } - } - }) - } -} - func TestBuildBody(t *testing.T) { slice := pcommon.NewValueSlice() err := slice.FromRaw([]any{1, 2, 3}) @@ -628,7 +604,6 @@ func TestBuildEventFromLog(t *testing.T) { assert.Equal(t, expected, was) }) } - } func TestBuildEventFromLogExportResources(t *testing.T) { @@ -697,6 +672,7 @@ func TestBuildEventFromLogExportScopeInfo(t *testing.T) { assert.Equal(t, expected, was) } + func TestBuildEventFromLogEventWithoutTimestampWithObservedTimestampUseObservedTimestamp(t *testing.T) { // When LogRecord doesn't have timestamp set, but it has ObservedTimestamp set, // ObservedTimestamp should be used @@ -736,7 +712,7 @@ func TestBuildEventFromLogEventWithoutTimestampWithOutObservedTimestampUseCurren now = func() time.Time { return time.Unix(123456789, 0) } currentTime := now() assert.Equal(t, currentTime, time.Unix(123456789, 0)) - assert.Equal(t, strconv.FormatInt(currentTime.UnixNano(), 10), "123456789000000000") + assert.Equal(t, "123456789000000000", strconv.FormatInt(currentTime.UnixNano(), 10)) lr := testdata.GenerateLogsOneLogRecord() ld := lr.ResourceLogs().At(0).ScopeLogs().At(0).LogRecords().At(0) @@ -779,7 +755,7 @@ func extract(req *http.Request) (add_events.AddEventsRequest, error) { } func TestConsumeLogsShouldSucceed(t *testing.T) { - createSettings := exportertest.NewNopCreateSettings() + createSettings := exportertest.NewNopSettings() attempt := atomic.Uint64{} wasSuccessful := atomic.Bool{} @@ -819,6 +795,7 @@ func TestConsumeLogsShouldSucceed(t *testing.T) { RetryMaxInterval: time.Minute, RetryMaxElapsedTime: time.Hour, RetryShutdownTimeout: time.Minute, + MaxParallelOutgoing: 100, }, LogsSettings: LogsSettings{ ExportResourceInfo: true, @@ -840,8 +817,8 @@ func TestConsumeLogsShouldSucceed(t *testing.T) { ServerHost: testServerHost, }, BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), - TimeoutSettings: exporterhelper.NewDefaultTimeoutSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), + TimeoutSettings: exporterhelper.NewDefaultTimeoutConfig(), } lr1 := testdata.GenerateLogsOneLogRecord() @@ -1113,7 +1090,6 @@ func TestOtelSeverityToDataSetSeverityWithSeverityNumberNoSeverityTextInvalidVal ld = makeLogRecordWithSeverityNumberAndSeverityText(100, "") assert.Equal(t, defaultDataSetSeverityLevel, mapOtelSeverityToDataSetSeverity(ld)) - } func TestOtelSeverityToDataSetSeverityWithSeverityNumberNoSeverityTextDataSetTraceLogLevel(t *testing.T) { diff --git a/exporter/datasetexporter/metadata.yaml b/exporter/datasetexporter/metadata.yaml index 6e628b7ba1b8..f0f408f967ae 100644 --- a/exporter/datasetexporter/metadata.yaml +++ b/exporter/datasetexporter/metadata.yaml @@ -1,5 +1,4 @@ type: dataset -scope_name: otelcol/dataset status: class: exporter diff --git a/exporter/datasetexporter/testdata/config.yaml b/exporter/datasetexporter/testdata/config.yaml index 1338aec01753..5d9dd5173574 100644 --- a/exporter/datasetexporter/testdata/config.yaml +++ b/exporter/datasetexporter/testdata/config.yaml @@ -26,6 +26,7 @@ dataset/full: retry_max_interval: 22s retry_max_elapsed_time: 23s retry_shutdown_timeout: 24s + max_parallel_outgoing: 25 logs: export_resource_info_on_event: true export_resource_prefix: "_resource_" diff --git a/exporter/datasetexporter/traces_exporter.go b/exporter/datasetexporter/traces_exporter.go index 613775384206..c1fde0ae0935 100644 --- a/exporter/datasetexporter/traces_exporter.go +++ b/exporter/datasetexporter/traces_exporter.go @@ -19,14 +19,14 @@ import ( const ServiceNameKey = "service.name" -func createTracesExporter(ctx context.Context, set exporter.CreateSettings, config component.Config) (exporter.Traces, error) { +func createTracesExporter(ctx context.Context, set exporter.Settings, config component.Config) (exporter.Traces, error) { cfg := castConfig(config) e, err := newDatasetExporter("traces", cfg, set) if err != nil { return nil, fmt.Errorf("cannot get DataSetExporter: %w", err) } - return exporterhelper.NewTracesExporter( + return exporterhelper.NewTraces( ctx, set, config, @@ -88,8 +88,10 @@ func buildEventFromSpan( } } -const resourceName = "resource_name" -const resourceType = "resource_type" +const ( + resourceName = "resource_name" + resourceType = "resource_type" +) type ResourceType string @@ -134,7 +136,7 @@ type spanBundle struct { } func buildEventsFromTraces(ld ptrace.Traces, serverHost string, settings TracesSettings) []*add_events.EventBundle { - var spans = make([]spanBundle, 0) + spans := make([]spanBundle, 0) // convert spans into events resourceSpans := ld.ResourceSpans() diff --git a/exporter/datasetexporter/traces_exporter_test.go b/exporter/datasetexporter/traces_exporter_test.go index c265856b28bf..0c905ce021cf 100644 --- a/exporter/datasetexporter/traces_exporter_test.go +++ b/exporter/datasetexporter/traces_exporter_test.go @@ -4,7 +4,6 @@ package datasetexporter import ( - "context" "fmt" "strings" "testing" @@ -12,33 +11,12 @@ import ( "github.com/scalyr/dataset-go/pkg/api/add_events" "github.com/stretchr/testify/assert" - "go.opentelemetry.io/collector/exporter/exportertest" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/testdata" ) -func TestCreateTracesExporter(t *testing.T) { - ctx := context.Background() - createSettings := exportertest.NewNopCreateSettings() - tests := createExporterTests() - - for _, tt := range tests { - t.Run(tt.name, func(*testing.T) { - logs, err := createTracesExporter(ctx, createSettings, tt.config) - - if err == nil { - assert.Nil(t, tt.expectedError) - assert.NotNil(t, logs) - } else { - assert.Equal(t, tt.expectedError.Error(), err.Error()) - assert.Nil(t, logs) - } - }) - } -} - func generateTEvent1Raw() *add_events.Event { return &add_events.Event{ Thread: "TT", @@ -455,29 +433,41 @@ func TestBuildEventsFromTracesFromTwoSpansSameResourceOneDifferent(t *testing.T) assert.Equal(t, expected, was) } -var span0Id = [8]byte{1, 1, 1, 1, 1, 1, 1, 1} -var span00Id = [8]byte{1, 2, 1, 1, 1, 1, 1, 1} -var span01Id = [8]byte{1, 3, 1, 1, 1, 1, 1, 1} -var span000Id = [8]byte{1, 2, 2, 1, 1, 1, 1, 1} -var span001Id = [8]byte{1, 2, 3, 1, 1, 1, 1, 1} -var span002Id = [8]byte{1, 2, 4, 1, 1, 1, 1, 1} +var ( + span0Id = [8]byte{1, 1, 1, 1, 1, 1, 1, 1} + span00Id = [8]byte{1, 2, 1, 1, 1, 1, 1, 1} + span01Id = [8]byte{1, 3, 1, 1, 1, 1, 1, 1} + span000Id = [8]byte{1, 2, 2, 1, 1, 1, 1, 1} + span001Id = [8]byte{1, 2, 3, 1, 1, 1, 1, 1} + span002Id = [8]byte{1, 2, 4, 1, 1, 1, 1, 1} +) -var span1Id = [8]byte{2, 2, 2, 2, 2, 2, 2, 2} -var span10Id = [8]byte{2, 3, 2, 2, 2, 2, 2, 2} +var ( + span1Id = [8]byte{2, 2, 2, 2, 2, 2, 2, 2} + span10Id = [8]byte{2, 3, 2, 2, 2, 2, 2, 2} +) -var span21Id = [8]byte{3, 3, 3, 3, 3, 3, 3, 3} -var span22Id = [8]byte{3, 4, 3, 3, 3, 3, 3, 3} +var ( + span21Id = [8]byte{3, 3, 3, 3, 3, 3, 3, 3} + span22Id = [8]byte{3, 4, 3, 3, 3, 3, 3, 3} +) -var span21PId = [8]byte{3, 5, 3, 3, 3, 3, 3, 3} -var span22PId = [8]byte{3, 6, 3, 3, 3, 3, 3, 3} +var ( + span21PId = [8]byte{3, 5, 3, 3, 3, 3, 3, 3} + span22PId = [8]byte{3, 6, 3, 3, 3, 3, 3, 3} +) -var span3Id = [8]byte{4, 4, 4, 4, 4, 4, 4, 4} -var span30Id = [8]byte{4, 5, 4, 4, 4, 4, 4, 4} +var ( + span3Id = [8]byte{4, 4, 4, 4, 4, 4, 4, 4} + span30Id = [8]byte{4, 5, 4, 4, 4, 4, 4, 4} +) -var trace0Id = [16]byte{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} -var trace1Id = [16]byte{2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2} -var trace2Id = [16]byte{3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3} -var trace3Id = [16]byte{4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4} +var ( + trace0Id = [16]byte{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} + trace1Id = [16]byte{2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2} + trace2Id = [16]byte{3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3} + trace3Id = [16]byte{4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4} +) func generateTracesTreesAndOrphans() ptrace.Traces { td := ptrace.NewTraces() diff --git a/exporter/dorisexporter/Makefile b/exporter/dorisexporter/Makefile new file mode 100644 index 000000000000..84677bc7e9cb --- /dev/null +++ b/exporter/dorisexporter/Makefile @@ -0,0 +1,2 @@ +include ../../Makefile.Common + diff --git a/exporter/dorisexporter/README.md b/exporter/dorisexporter/README.md new file mode 100644 index 000000000000..c6f13aed25c3 --- /dev/null +++ b/exporter/dorisexporter/README.md @@ -0,0 +1,84 @@ +# Apache Doris Exporter + +| Status | | +| ------------- |-----------| +| Stability | [alpha]: traces, metrics, logs | +| Distributions | [contrib] | +| Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fdoris%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fdoris) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fdoris%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fdoris) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@atoulme](https://www.github.com/atoulme), [@joker-star-l](https://www.github.com/joker-star-l) | + +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha +[contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib + + +This exporter supports sending traces, metrics, and logs data to [Apache Doris](https://doris.apache.org/) (version >= 2.1.1). + +## Configuration + +The following configuration options are supported: + +* `endpoint` The http stream load address. +* `database` (default = otel) The database name. +* `username` The authentication username. +* `password` The authentication password. +* `table` + * `logs` (default = otel_logs) The table name for logs. + * `traces` (default = otel_traces) The table name for traces. + * `metrics` (default = otel_metrics) The table name for metrics. +* `create_schema` (default = true) Whether databases and tables are created automatically in doris. +* `mysql_endpoint` The mysql protocol address of doris. Only use to create the schema; ignored if `create_schema` is false. +* `history_days` (default = 0) Data older than these days will be deleted; ignored if `create_schema` is false. If set to 0, historical data will not be deleted. +* `create_history_days` (default = 0) The number of days in the history partition that was created when the table was created; ignored if `create_schema` is false. If `history_days` is not 0, `create_history_days` needs to be less than or equal to `history_days`. +* `replication_num` (default = 1) The number of replicas of the table; ignored if `create_schema` is false. +* `timezone` (default is UTC) The time zone of doris. +* `sending_queue` [details here](https://github.com/open-telemetry/opentelemetry-collector/tree/main/exporter/exporterhelper#configuration) + * `enabled` (default = true) + * `num_consumers` (default = 10) Number of consumers that dequeue batches; ignored if `enabled` is false. + * `queue_size` (default = 1000) Maximum number of batches kept in memory before dropping; ignored if `enabled` is false. +* `retry_on_failure` [details here](https://github.com/open-telemetry/opentelemetry-collector/tree/main/exporter/exporterhelper#configuration) + * `enabled` (default = true) + * `initial_interval` (default = 5s) Time to wait after the first failure before retrying; ignored if `enabled` is false. + * `max_interval` (default = 30s) The upper bound on backoff; ignored if `enabled` is false. + * `max_elapsed_time` (default = 300s) The maximum amount of time spent trying to send a batch; ignored if `enabled` is false. If set to 0, the retries are never stopped. + +The Doris exporter supports common [HTTP Configuration Settings](https://github.com/open-telemetry/opentelemetry-collector/blob/main/config/confighttp/README.md#http-configuration-settings), except for compression (all requests are uncompressed). As a consequence of supporting [confighttp](https://github.com/open-telemetry/opentelemetry-collector/blob/main/config/confighttp/README.md#http-configuration-settings), the Doris exporter also supports common [TLS Configuration Settings](https://github.com/open-telemetry/opentelemetry-collector/blob/main/config/configtls/README.md#tls-configuration-settings). + +The Doris exporter sets `timeout` (HTTP request timeout) to 60s by default. All other defaults are as defined by [confighttp](https://github.com/open-telemetry/opentelemetry-collector/blob/main/config/confighttp/README.md#http-configuration-settings). + +Example: +```yaml +exporters: + doris: + endpoint: http://localhost:8030 + database: otel + username: admin + password: admin + table: + logs: otel_logs + traces: otel_traces + metrics: otel_metrics + create_schema: true + mysql_endpoint: localhost:9030 + history_days: 0 + create_history_days: 0 + replication_num: 1 + timezone: Asia/Shanghai + timeout: 5s + sending_queue: + enabled: true + num_consumers: 10 + queue_size: 1000 + retry_on_failure: + enabled: true + initial_interval: 5s + max_interval: 30s + max_elapsed_time: 300s +``` + +## Notes + +1. Time Zone + + The Doris exporter uses IANA Time Zone Database (known as tzdata) to handle time zones, so make sure tzdata is on your system. + + For example, when you use docker, you should add option `-v your/path/to/tzdata:/usr/share/zoneinfo` when running the container. diff --git a/exporter/dorisexporter/config.go b/exporter/dorisexporter/config.go new file mode 100644 index 000000000000..bbc36785d44d --- /dev/null +++ b/exporter/dorisexporter/config.go @@ -0,0 +1,139 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package dorisexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/dorisexporter" + +import ( + "errors" + "fmt" + "regexp" + "time" + + "go.opentelemetry.io/collector/config/confighttp" + "go.opentelemetry.io/collector/config/configopaque" + "go.opentelemetry.io/collector/config/configretry" + "go.opentelemetry.io/collector/exporter/exporterhelper" +) + +type Config struct { + confighttp.ClientConfig `mapstructure:",squash"` + configretry.BackOffConfig `mapstructure:"retry_on_failure"` + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` + + // TableNames is the table name for logs, traces and metrics. + Table `mapstructure:"table"` + + // Database is the database name. + Database string `mapstructure:"database"` + // Username is the authentication username. + Username string `mapstructure:"username"` + // Password is the authentication password. + Password configopaque.String `mapstructure:"password"` + // CreateSchema is whether databases and tables are created automatically. + CreateSchema bool `mapstructure:"create_schema"` + // MySQLEndpoint is the mysql protocol address to create the schema; ignored if create_schema is false. + MySQLEndpoint string `mapstructure:"mysql_endpoint"` + // Data older than these days will be deleted; ignored if create_schema is false. If set to 0, historical data will not be deleted. + HistoryDays int32 `mapstructure:"history_days"` + // The number of days in the history partition that was created when the table was created; ignored if create_schema is false. + // If history_days is not 0, create_history_days needs to be less than or equal to history_days. + CreateHistoryDays int32 `mapstructure:"create_history_days"` + // ReplicationNum is the number of replicas of the table; ignored if create_schema is false. + ReplicationNum int32 `mapstructure:"replication_num"` + // Timezone is the timezone of the doris. + TimeZone string `mapstructure:"timezone"` +} + +type Table struct { + // Logs is the table name for logs. + Logs string `mapstructure:"logs"` + // Traces is the table name for traces. + Traces string `mapstructure:"traces"` + // Metrics is the table name for metrics. + Metrics string `mapstructure:"metrics"` +} + +func (cfg *Config) Validate() (err error) { + if cfg.Endpoint == "" { + err = errors.Join(err, errors.New("endpoint must be specified")) + } + if cfg.CreateSchema { + if cfg.MySQLEndpoint == "" { + err = errors.Join(err, errors.New("mysql_endpoint must be specified")) + } + + if cfg.HistoryDays < 0 { + err = errors.Join(err, errors.New("history_days must be greater than or equal to 0")) + } + + if cfg.CreateHistoryDays < 0 { + err = errors.Join(err, errors.New("create_history_days must be greater than or equal to 0")) + } + + if cfg.HistoryDays > 0 && cfg.CreateHistoryDays > cfg.HistoryDays { + err = errors.Join(err, errors.New("create_history_days must be less than or equal to history_days")) + } + + if cfg.ReplicationNum < 1 { + err = errors.Join(err, errors.New("replication_num must be greater than or equal to 1")) + } + } + + // Preventing SQL Injection Attacks + re := regexp.MustCompile(`^[a-zA-Z0-9_]+$`) + if !re.MatchString(cfg.Database) { + err = errors.Join(err, errors.New("database name must be alphanumeric and underscore")) + } + if !re.MatchString(cfg.Table.Logs) { + err = errors.Join(err, errors.New("logs table name must be alphanumeric and underscore")) + } + if !re.MatchString(cfg.Table.Traces) { + err = errors.Join(err, errors.New("traces table name must be alphanumeric and underscore")) + } + if !re.MatchString(cfg.Table.Metrics) { + err = errors.Join(err, errors.New("metrics table name must be alphanumeric and underscore")) + } + + _, errT := cfg.timeZone() + if errT != nil { + err = errors.Join(err, errors.New("invalid timezone")) + } + + return err +} + +const ( + defaultStart = -2147483648 // IntMin +) + +func (cfg *Config) startHistoryDays() int32 { + if cfg.HistoryDays == 0 { + return defaultStart + } + return -cfg.HistoryDays +} + +func (cfg *Config) timeZone() (*time.Location, error) { + return time.LoadLocation(cfg.TimeZone) +} + +const ( + properties = ` +PROPERTIES ( +"replication_num" = "%d", +"enable_single_replica_compaction" = "true", +"compaction_policy" = "time_series", +"dynamic_partition.enable" = "true", +"dynamic_partition.create_history_partition" = "true", +"dynamic_partition.time_unit" = "DAY", +"dynamic_partition.start" = "%d", +"dynamic_partition.history_partition_num" = "%d", +"dynamic_partition.end" = "1", +"dynamic_partition.prefix" = "p" +) +` +) + +func (cfg *Config) propertiesStr() string { + return fmt.Sprintf(properties, cfg.ReplicationNum, cfg.startHistoryDays(), cfg.CreateHistoryDays) +} diff --git a/exporter/dorisexporter/config_test.go b/exporter/dorisexporter/config_test.go new file mode 100644 index 000000000000..1870b3b565d3 --- /dev/null +++ b/exporter/dorisexporter/config_test.go @@ -0,0 +1,94 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package dorisexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/dorisexporter" + +import ( + "path/filepath" + "testing" + "time" + + "github.com/cenkalti/backoff/v4" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/confighttp" + "go.opentelemetry.io/collector/config/configopaque" + "go.opentelemetry.io/collector/config/configretry" + "go.opentelemetry.io/collector/confmap/confmaptest" + "go.opentelemetry.io/collector/exporter/exporterhelper" + + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/dorisexporter/internal/metadata" +) + +func TestLoadConfig(t *testing.T) { + t.Parallel() + + cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml")) + require.NoError(t, err) + + defaultCfg := createDefaultConfig() + defaultCfg.(*Config).Endpoint = "http://localhost:8030" + defaultCfg.(*Config).MySQLEndpoint = "localhost:9030" + + httpClientConfig := confighttp.NewDefaultClientConfig() + httpClientConfig.Timeout = 5 * time.Second + httpClientConfig.Endpoint = "http://localhost:8030" + + tests := []struct { + id component.ID + expected component.Config + }{ + { + id: component.NewIDWithName(metadata.Type, ""), + expected: defaultCfg, + }, + { + id: component.NewIDWithName(metadata.Type, "full"), + expected: &Config{ + ClientConfig: httpClientConfig, + BackOffConfig: configretry.BackOffConfig{ + Enabled: true, + InitialInterval: 5 * time.Second, + MaxInterval: 30 * time.Second, + MaxElapsedTime: 300 * time.Second, + RandomizationFactor: backoff.DefaultRandomizationFactor, + Multiplier: backoff.DefaultMultiplier, + }, + QueueSettings: exporterhelper.QueueConfig{ + Enabled: true, + NumConsumers: 10, + QueueSize: 1000, + }, + Table: Table{ + Logs: "otel_logs", + Traces: "otel_traces", + Metrics: "otel_metrics", + }, + Database: "otel", + Username: "admin", + Password: configopaque.String("admin"), + CreateSchema: true, + MySQLEndpoint: "localhost:9030", + HistoryDays: 0, + CreateHistoryDays: 0, + ReplicationNum: 2, + TimeZone: "Asia/Shanghai", + }, + }, + } + + for _, tt := range tests { + t.Run(tt.id.String(), func(t *testing.T) { + factory := NewFactory() + cfg := factory.CreateDefaultConfig() + + sub, err := cm.Sub(tt.id.String()) + require.NoError(t, err) + require.NoError(t, sub.Unmarshal(cfg)) + + assert.NoError(t, component.ValidateConfig(cfg)) + assert.Equal(t, tt.expected, cfg) + }) + } +} diff --git a/exporter/dorisexporter/doc.go b/exporter/dorisexporter/doc.go new file mode 100644 index 000000000000..2f1bab445c8f --- /dev/null +++ b/exporter/dorisexporter/doc.go @@ -0,0 +1,7 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +//go:generate mdatagen metadata.yaml + +// Package dorisexporter exports trace, metric and log data to an Apache Doris instance. +package dorisexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/dorisexporter" diff --git a/exporter/dorisexporter/exporter_common.go b/exporter/dorisexporter/exporter_common.go new file mode 100644 index 000000000000..7c889c3d42f8 --- /dev/null +++ b/exporter/dorisexporter/exporter_common.go @@ -0,0 +1,120 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package dorisexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/dorisexporter" + +import ( + "bytes" + "context" + "database/sql" + "fmt" + "net/http" + "time" + + _ "github.com/go-sql-driver/mysql" // for register database driver + "go.opentelemetry.io/collector/component" + "go.uber.org/zap" +) + +const timeFormat = "2006-01-02 15:04:05.999999" + +type commonExporter struct { + component.TelemetrySettings + + client *http.Client + + logger *zap.Logger + cfg *Config + timeZone *time.Location +} + +func newExporter(logger *zap.Logger, cfg *Config, set component.TelemetrySettings) *commonExporter { + // There won't be an error because it's already been validated in the Config.Validate method. + timeZone, _ := cfg.timeZone() + + return &commonExporter{ + TelemetrySettings: set, + logger: logger, + cfg: cfg, + timeZone: timeZone, + } +} + +func (e *commonExporter) formatTime(t time.Time) string { + return t.In(e.timeZone).Format(timeFormat) +} + +type streamLoadResponse struct { + TxnID int64 + Label string + Status string + ExistingJobStatus string + Message string + NumberTotalRows int64 + NumberLoadedRows int64 + NumberFilteredRows int64 + NumberUnselectedRows int64 + LoadBytes int64 + LoadTimeMs int64 + BeginTxnTimeMs int64 + StreamLoadPutTimeMs int64 + ReadDataTimeMs int64 + WriteDataTimeMs int64 + CommitAndPublishTimeMs int64 + ErrorURL string +} + +func (r *streamLoadResponse) success() bool { + return r.Status == "Success" || r.Status == "Publish Timeout" +} + +func streamLoadURL(address string, db string, table string) string { + return address + "/api/" + db + "/" + table + "/_stream_load" +} + +func streamLoadRequest(ctx context.Context, cfg *Config, table string, data []byte) (*http.Request, error) { + url := streamLoadURL(cfg.Endpoint, cfg.Database, table) + req, err := http.NewRequestWithContext(ctx, http.MethodPut, url, bytes.NewBuffer(data)) + if err != nil { + return nil, err + } + + req.Header.Set("format", "json") + req.Header.Set("Expect", "100-continue") + req.Header.Set("strip_outer_array", "true") + if cfg.ClientConfig.Timeout != 0 { + req.Header.Set("timeout", fmt.Sprintf("%d", cfg.ClientConfig.Timeout/time.Second)) + } + req.SetBasicAuth(cfg.Username, string(cfg.Password)) + + return req, nil +} + +func createDorisHTTPClient(ctx context.Context, cfg *Config, host component.Host, settings component.TelemetrySettings) (*http.Client, error) { + client, err := cfg.ClientConfig.ToClient(ctx, host, settings) + if err != nil { + return nil, err + } + + client.CheckRedirect = func(req *http.Request, _ []*http.Request) error { + req.SetBasicAuth(cfg.Username, string(cfg.Password)) + return nil + } + + return client, nil +} + +func createDorisMySQLClient(cfg *Config) (*sql.DB, error) { + dsn := fmt.Sprintf("%s:%s@tcp(%s)/mysql", cfg.Username, string(cfg.Password), cfg.MySQLEndpoint) + conn, err := sql.Open("mysql", dsn) + return conn, err +} + +func createAndUseDatabase(ctx context.Context, conn *sql.DB, cfg *Config) error { + _, err := conn.ExecContext(ctx, "CREATE DATABASE IF NOT EXISTS "+cfg.Database) + if err != nil { + return err + } + _, err = conn.ExecContext(ctx, "USE "+cfg.Database) + return err +} diff --git a/exporter/dorisexporter/exporter_common_test.go b/exporter/dorisexporter/exporter_common_test.go new file mode 100644 index 000000000000..baea71b36bb9 --- /dev/null +++ b/exporter/dorisexporter/exporter_common_test.go @@ -0,0 +1,62 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package dorisexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/dorisexporter" + +import ( + "net" + "testing" + "time" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component/componenttest" +) + +func TestNewCommonExporter(t *testing.T) { + cfg := createDefaultConfig().(*Config) + exporter := newExporter(nil, cfg, componenttest.NewNopTelemetrySettings()) + require.NotNil(t, exporter) +} + +func TestCommonExporter_FormatTime(t *testing.T) { + cfg := createDefaultConfig().(*Config) + exporter := newExporter(nil, cfg, componenttest.NewNopTelemetrySettings()) + require.NotNil(t, exporter) + + now := time.Date(2024, 1, 1, 0, 0, 0, 1000, time.Local) + require.Equal(t, "2024-01-01 00:00:00.000001", exporter.formatTime(now)) +} + +func TestStreamLoadResponse_Success(t *testing.T) { + resp := &streamLoadResponse{ + Status: "Success", + } + require.True(t, resp.success()) + + resp.Status = "Publish Timeout" + require.True(t, resp.success()) + + resp.Status = "Fail" + require.False(t, resp.success()) +} + +func TestStreamLoadUrl(t *testing.T) { + url := streamLoadURL("http://doris:8030", "otel", "otel_logs") + require.Equal(t, "http://doris:8030/api/otel/otel_logs/_stream_load", url) +} + +func findRandomPort() (int, error) { + l, err := net.Listen("tcp", "localhost:0") + if err != nil { + return 0, err + } + + port := l.Addr().(*net.TCPAddr).Port + + err = l.Close() + if err != nil { + return 0, err + } + + return port, nil +} diff --git a/exporter/dorisexporter/exporter_logs.go b/exporter/dorisexporter/exporter_logs.go new file mode 100644 index 000000000000..d3022e0c6290 --- /dev/null +++ b/exporter/dorisexporter/exporter_logs.go @@ -0,0 +1,157 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package dorisexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/dorisexporter" + +import ( + "context" + _ "embed" // for SQL file embedding + "encoding/json" + "fmt" + "io" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/pdata/plog" + semconv "go.opentelemetry.io/collector/semconv/v1.25.0" + "go.uber.org/zap" + + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/traceutil" +) + +//go:embed sql/logs_ddl.sql +var logsDDL string + +// dLog Log to Doris +type dLog struct { + ServiceName string `json:"service_name"` + Timestamp string `json:"timestamp"` + TraceID string `json:"trace_id"` + SpanID string `json:"span_id"` + SeverityNumber int32 `json:"severity_number"` + SeverityText string `json:"severity_text"` + Body string `json:"body"` + ResourceAttributes map[string]any `json:"resource_attributes"` + LogAttributes map[string]any `json:"log_attributes"` + ScopeName string `json:"scope_name"` + ScopeVersion string `json:"scope_version"` +} + +type logsExporter struct { + *commonExporter +} + +func newLogsExporter(logger *zap.Logger, cfg *Config, set component.TelemetrySettings) *logsExporter { + return &logsExporter{ + commonExporter: newExporter(logger, cfg, set), + } +} + +func (e *logsExporter) start(ctx context.Context, host component.Host) error { + client, err := createDorisHTTPClient(ctx, e.cfg, host, e.TelemetrySettings) + if err != nil { + return err + } + e.client = client + + if !e.cfg.CreateSchema { + return nil + } + + conn, err := createDorisMySQLClient(e.cfg) + if err != nil { + return err + } + defer conn.Close() + + err = createAndUseDatabase(ctx, conn, e.cfg) + if err != nil { + return err + } + + ddl := fmt.Sprintf(logsDDL, e.cfg.Table.Logs, e.cfg.propertiesStr()) + _, err = conn.ExecContext(ctx, ddl) + return err +} + +func (e *logsExporter) shutdown(_ context.Context) error { + if e.client != nil { + e.client.CloseIdleConnections() + } + return nil +} + +func (e *logsExporter) pushLogData(ctx context.Context, ld plog.Logs) error { + logs := make([]*dLog, 0, ld.LogRecordCount()) + + for i := 0; i < ld.ResourceLogs().Len(); i++ { + resourceLogs := ld.ResourceLogs().At(i) + resource := resourceLogs.Resource() + resourceAttributes := resource.Attributes() + serviceName := "" + v, ok := resourceAttributes.Get(semconv.AttributeServiceName) + if ok { + serviceName = v.AsString() + } + + for j := 0; j < resourceLogs.ScopeLogs().Len(); j++ { + scopeLogs := resourceLogs.ScopeLogs().At(j) + + for k := 0; k < scopeLogs.LogRecords().Len(); k++ { + logRecord := scopeLogs.LogRecords().At(k) + + log := &dLog{ + ServiceName: serviceName, + Timestamp: e.formatTime(logRecord.Timestamp().AsTime()), + TraceID: traceutil.TraceIDToHexOrEmptyString(logRecord.TraceID()), + SpanID: traceutil.SpanIDToHexOrEmptyString(logRecord.SpanID()), + SeverityNumber: int32(logRecord.SeverityNumber()), + SeverityText: logRecord.SeverityText(), + Body: logRecord.Body().AsString(), + ResourceAttributes: resourceAttributes.AsRaw(), + LogAttributes: logRecord.Attributes().AsRaw(), + ScopeName: scopeLogs.Scope().Name(), + ScopeVersion: scopeLogs.Scope().Version(), + } + + logs = append(logs, log) + } + } + } + + return e.pushLogDataInternal(ctx, logs) +} + +func (e *logsExporter) pushLogDataInternal(ctx context.Context, logs []*dLog) error { + marshal, err := json.Marshal(logs) + if err != nil { + return err + } + + req, err := streamLoadRequest(ctx, e.cfg, e.cfg.Table.Logs, marshal) + if err != nil { + return err + } + + res, err := e.client.Do(req) + if err != nil { + return err + } + defer res.Body.Close() + + body, err := io.ReadAll(res.Body) + if err != nil { + return err + } + + response := streamLoadResponse{} + err = json.Unmarshal(body, &response) + if err != nil { + return err + } + + if !response.success() { + return fmt.Errorf("failed to push log data: %s", response.Message) + } + + return nil +} diff --git a/exporter/dorisexporter/exporter_logs_test.go b/exporter/dorisexporter/exporter_logs_test.go new file mode 100644 index 000000000000..da26ee1de33b --- /dev/null +++ b/exporter/dorisexporter/exporter_logs_test.go @@ -0,0 +1,92 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package dorisexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/dorisexporter" + +import ( + "context" + "fmt" + "net/http" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/plog" + semconv "go.opentelemetry.io/collector/semconv/v1.25.0" +) + +func TestPushLogData(t *testing.T) { + port, err := findRandomPort() + require.NoError(t, err) + + config := createDefaultConfig().(*Config) + config.Endpoint = fmt.Sprintf("http://127.0.0.1:%d", port) + config.CreateSchema = false + + err = config.Validate() + require.NoError(t, err) + + exporter := newLogsExporter(nil, config, componenttest.NewNopTelemetrySettings()) + + ctx := context.Background() + + client, err := createDorisHTTPClient(ctx, config, nil, componenttest.NewNopTelemetrySettings()) + require.NoError(t, err) + require.NotNil(t, client) + + exporter.client = client + + defer func() { + _ = exporter.shutdown(ctx) + }() + + server := &http.Server{ + ReadTimeout: 3 * time.Second, + Addr: fmt.Sprintf(":%d", port), + } + + go func() { + http.HandleFunc("/api/otel/otel_logs/_stream_load", func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusOK) + _, _ = w.Write([]byte(`{"Status":"Success"}`)) + }) + err = server.ListenAndServe() + assert.Equal(t, http.ErrServerClosed, err) + }() + + err0 := fmt.Errorf("Not Started") + for i := 0; err0 != nil && i < 10; i++ { // until server started + err0 = exporter.pushLogData(ctx, simpleLogs(10)) + time.Sleep(100 * time.Millisecond) + } + require.NoError(t, err0) + + _ = server.Shutdown(ctx) +} + +func simpleLogs(count int) plog.Logs { + logs := plog.NewLogs() + rl := logs.ResourceLogs().AppendEmpty() + rl.Resource().Attributes().PutStr("service.name", "test-service") + sl := rl.ScopeLogs().AppendEmpty() + sl.Scope().SetName("io.opentelemetry.contrib.doris") + sl.Scope().SetVersion("1.0.0") + sl.Scope().Attributes().PutStr("lib", "doris") + timestamp := time.Now() + for i := 0; i < count; i++ { + r := sl.LogRecords().AppendEmpty() + r.SetTimestamp(pcommon.NewTimestampFromTime(timestamp)) + r.SetObservedTimestamp(pcommon.NewTimestampFromTime(timestamp)) + r.SetSeverityNumber(plog.SeverityNumberError2) + r.SetSeverityText("error") + r.Body().SetStr("error message") + r.Attributes().PutStr(semconv.AttributeServiceNamespace, "default") + r.SetFlags(plog.DefaultLogRecordFlags) + r.SetTraceID([16]byte{1, 2, 3, byte(i)}) + r.SetSpanID([8]byte{1, 2, 3, byte(i)}) + } + return logs +} diff --git a/exporter/dorisexporter/exporter_metrics.go b/exporter/dorisexporter/exporter_metrics.go new file mode 100644 index 000000000000..c2e0b8597d42 --- /dev/null +++ b/exporter/dorisexporter/exporter_metrics.go @@ -0,0 +1,233 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package dorisexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/dorisexporter" + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "io" + "sync" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/pdata/pmetric" + semconv "go.opentelemetry.io/collector/semconv/v1.25.0" + "go.uber.org/zap" +) + +var ddls = []string{ + metricsGaugeDDL, + metricsSumDDL, + metricsHistogramDDL, + metricsExponentialHistogramDDL, + metricsSummaryDDL, +} + +func initMetricMap(maxLen int) map[pmetric.MetricType]metricModel { + return map[pmetric.MetricType]metricModel{ + pmetric.MetricTypeGauge: &metricModelGauge{ + data: make([]*dMetricGauge, 0, maxLen), + }, + pmetric.MetricTypeSum: &metricModelSum{ + data: make([]*dMetricSum, 0, maxLen), + }, + pmetric.MetricTypeHistogram: &metricModelHistogram{ + data: make([]*dMetricHistogram, 0, maxLen), + }, + pmetric.MetricTypeExponentialHistogram: &metricModelExponentialHistogram{ + data: make([]*dMetricExponentialHistogram, 0, maxLen), + }, + pmetric.MetricTypeSummary: &metricModelSummary{ + data: make([]*dMetricSummary, 0, maxLen), + }, + } +} + +type metricsExporter struct { + *commonExporter +} + +func newMetricsExporter(logger *zap.Logger, cfg *Config, set component.TelemetrySettings) *metricsExporter { + return &metricsExporter{ + commonExporter: newExporter(logger, cfg, set), + } +} + +func (e *metricsExporter) start(ctx context.Context, host component.Host) error { + client, err := createDorisHTTPClient(ctx, e.cfg, host, e.TelemetrySettings) + if err != nil { + return err + } + e.client = client + + if !e.cfg.CreateSchema { + return nil + } + + conn, err := createDorisMySQLClient(e.cfg) + if err != nil { + return err + } + defer conn.Close() + + err = createAndUseDatabase(ctx, conn, e.cfg) + if err != nil { + return err + } + + for _, ddlTemplate := range ddls { + ddl := fmt.Sprintf(ddlTemplate, e.cfg.Table.Metrics, e.cfg.propertiesStr()) + _, err = conn.ExecContext(ctx, ddl) + if err != nil { + return err + } + } + + return nil +} + +func (e *metricsExporter) shutdown(_ context.Context) error { + if e.client != nil { + e.client.CloseIdleConnections() + } + return nil +} + +func (e *metricsExporter) pushMetricData(ctx context.Context, md pmetric.Metrics) error { + metricMap := initMetricMap(md.DataPointCount()) + + for i := 0; i < md.ResourceMetrics().Len(); i++ { + resourceMetric := md.ResourceMetrics().At(i) + resource := resourceMetric.Resource() + resourceAttributes := resource.Attributes() + serviceName := "" + v, ok := resourceAttributes.Get(semconv.AttributeServiceName) + if ok { + serviceName = v.AsString() + } + + for j := 0; j < resourceMetric.ScopeMetrics().Len(); j++ { + scopeMetric := resourceMetric.ScopeMetrics().At(j) + + for k := 0; k < scopeMetric.Metrics().Len(); k++ { + metric := scopeMetric.Metrics().At(k) + + dm := &dMetric{ + ServiceName: serviceName, + MetricName: metric.Name(), + MetricDescription: metric.Description(), + MetricUnit: metric.Unit(), + ResourceAttributes: resourceAttributes.AsRaw(), + ScopeName: scopeMetric.Scope().Name(), + ScopeVersion: scopeMetric.Scope().Version(), + } + + metricM, ok := metricMap[metric.Type()] + if !ok { + return fmt.Errorf("invalid metric type: %v", metric.Type().String()) + } + + err := metricM.add(metric, dm, e) + if err != nil { + return err + } + } + } + } + + return e.pushMetricDataParallel(ctx, metricMap) +} + +func (e *metricsExporter) pushMetricDataParallel(ctx context.Context, metricMap map[pmetric.MetricType]metricModel) error { + errChan := make(chan error, len(metricMap)) + wg := &sync.WaitGroup{} + for _, m := range metricMap { + if m.size() <= 0 { + continue + } + + wg.Add(1) + go func(m metricModel, wg *sync.WaitGroup) { + errChan <- e.pushMetricDataInternal(ctx, m) + wg.Done() + }(m, wg) + } + wg.Wait() + close(errChan) + var errs error + for err := range errChan { + errs = errors.Join(errs, err) + } + return errs +} + +func (e *metricsExporter) pushMetricDataInternal(ctx context.Context, metrics metricModel) error { + if metrics.size() <= 0 { + return nil + } + + marshal, err := metrics.bytes() + if err != nil { + return err + } + + req, err := streamLoadRequest(ctx, e.cfg, e.cfg.Table.Metrics+metrics.tableSuffix(), marshal) + if err != nil { + return err + } + + res, err := e.client.Do(req) + if err != nil { + return err + } + defer res.Body.Close() + + body, err := io.ReadAll(res.Body) + if err != nil { + return err + } + + response := streamLoadResponse{} + err = json.Unmarshal(body, &response) + if err != nil { + return err + } + + if !response.success() { + return fmt.Errorf("failed to push metric data: %s", response.Message) + } + + return nil +} + +func (e *metricsExporter) getNumberDataPointValue(dp pmetric.NumberDataPoint) float64 { + switch dp.ValueType() { + case pmetric.NumberDataPointValueTypeInt: + return float64(dp.IntValue()) + case pmetric.NumberDataPointValueTypeDouble: + return dp.DoubleValue() + case pmetric.NumberDataPointValueTypeEmpty: + e.logger.Warn("data point value type is unset, use 0.0 as default") + return 0.0 + default: + e.logger.Warn("data point value type is invalid, use 0.0 as default") + return 0.0 + } +} + +func (e *metricsExporter) getExemplarValue(ep pmetric.Exemplar) float64 { + switch ep.ValueType() { + case pmetric.ExemplarValueTypeInt: + return float64(ep.IntValue()) + case pmetric.ExemplarValueTypeDouble: + return ep.DoubleValue() + case pmetric.ExemplarValueTypeEmpty: + e.logger.Warn("exemplar value type is unset, use 0.0 as default") + return 0.0 + default: + e.logger.Warn("exemplar value type is invalid, use 0.0 as default") + return 0.0 + } +} diff --git a/exporter/dorisexporter/exporter_metrics_test.go b/exporter/dorisexporter/exporter_metrics_test.go new file mode 100644 index 000000000000..f61dfd4f2c42 --- /dev/null +++ b/exporter/dorisexporter/exporter_metrics_test.go @@ -0,0 +1,446 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package dorisexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/dorisexporter" + +import ( + "context" + "fmt" + "net/http" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/pmetric" +) + +func TestPushMetricData(t *testing.T) { + port, err := findRandomPort() + require.NoError(t, err) + + config := createDefaultConfig().(*Config) + config.Endpoint = fmt.Sprintf("http://127.0.0.1:%d", port) + config.CreateSchema = false + + err = config.Validate() + require.NoError(t, err) + + exporter := newMetricsExporter(nil, config, componenttest.NewNopTelemetrySettings()) + + ctx := context.Background() + + client, err := createDorisHTTPClient(ctx, config, nil, componenttest.NewNopTelemetrySettings()) + require.NoError(t, err) + require.NotNil(t, client) + + exporter.client = client + + defer func() { + _ = exporter.shutdown(ctx) + }() + + server := &http.Server{ + ReadTimeout: 3 * time.Second, + Addr: fmt.Sprintf(":%d", port), + } + + go func() { + metrics := []string{"gauge", "sum", "histogram", "exponential_histogram", "summary"} + for _, metric := range metrics { + url := fmt.Sprintf("/api/otel/otel_metrics_%s/_stream_load", metric) + http.HandleFunc(url, func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusOK) + _, _ = w.Write([]byte(`{"Status":"Success"}`)) + }) + } + err = server.ListenAndServe() + assert.Equal(t, http.ErrServerClosed, err) + }() + + err0 := fmt.Errorf("Not Started") + for i := 0; err0 != nil && i < 10; i++ { // until server started + err0 = exporter.pushMetricData(ctx, simpleMetrics(10, map[pmetric.MetricType]struct{}{ + pmetric.MetricTypeGauge: {}, + pmetric.MetricTypeSum: {}, + pmetric.MetricTypeHistogram: {}, + pmetric.MetricTypeExponentialHistogram: {}, + pmetric.MetricTypeSummary: {}, + })) + time.Sleep(100 * time.Millisecond) + } + require.NoError(t, err0) + + _ = server.Shutdown(ctx) +} + +func simpleMetrics(count int, typeSet map[pmetric.MetricType]struct{}) pmetric.Metrics { + metrics := pmetric.NewMetrics() + rm := metrics.ResourceMetrics().AppendEmpty() + rm.Resource().Attributes().PutStr("service.name", "demo 1") + rm.Resource().Attributes().PutStr("Resource Attributes 1", "value1") + sm := rm.ScopeMetrics().AppendEmpty() + sm.SetSchemaUrl("Scope SchemaUrl 1") + sm.Scope().Attributes().PutStr("Scope Attributes 1", "value1") + sm.Scope().SetName("Scope name 1") + sm.Scope().SetVersion("Scope version 1") + timestamp := time.Now() + for i := 0; i < count; i++ { + // gauge + if _, ok := typeSet[pmetric.MetricTypeGauge]; ok { + m := sm.Metrics().AppendEmpty() + m.SetName("gauge metrics") + m.SetUnit("count") + m.SetDescription("This is a gauge metrics") + dp := m.SetEmptyGauge().DataPoints().AppendEmpty() + dp.SetIntValue(int64(i)) + dp.SetFlags(pmetric.DefaultDataPointFlags) + dp.Attributes().PutStr("gauge_label_1", "1") + dp.SetStartTimestamp(pcommon.NewTimestampFromTime(timestamp)) + dp.SetTimestamp(pcommon.NewTimestampFromTime(timestamp)) + exemplars := dp.Exemplars().AppendEmpty() + exemplars.SetTimestamp(pcommon.NewTimestampFromTime(timestamp)) + exemplars.SetIntValue(54) + exemplars.FilteredAttributes().PutStr("key", "value") + exemplars.FilteredAttributes().PutStr("key2", "value2") + exemplars.SetSpanID([8]byte{1, 2, 3, byte(i)}) + exemplars.SetTraceID([16]byte{1, 2, 3, byte(i)}) + } + + // sum + if _, ok := typeSet[pmetric.MetricTypeSum]; ok { + m := sm.Metrics().AppendEmpty() + m.SetName("sum metrics") + m.SetUnit("count") + m.SetDescription("This is a sum metrics") + dp := m.SetEmptySum().DataPoints().AppendEmpty() + dp.SetDoubleValue(11.234) + dp.SetFlags(pmetric.DefaultDataPointFlags) + dp.Attributes().PutStr("sum_label_1", "1") + dp.SetStartTimestamp(pcommon.NewTimestampFromTime(timestamp)) + dp.SetTimestamp(pcommon.NewTimestampFromTime(timestamp)) + exemplars := dp.Exemplars().AppendEmpty() + exemplars.SetTimestamp(pcommon.NewTimestampFromTime(timestamp)) + exemplars.SetIntValue(54) + exemplars.FilteredAttributes().PutStr("key", "value") + exemplars.FilteredAttributes().PutStr("key2", "value2") + exemplars.SetSpanID([8]byte{1, 2, 3, byte(i)}) + exemplars.SetTraceID([16]byte{1, 2, 3, byte(i)}) + } + + // histogram + if _, ok := typeSet[pmetric.MetricTypeHistogram]; ok { + m := sm.Metrics().AppendEmpty() + m.SetName("histogram metrics") + m.SetUnit("ms") + m.SetDescription("This is a histogram metrics") + dpHisto := m.SetEmptyHistogram().DataPoints().AppendEmpty() + dpHisto.SetStartTimestamp(pcommon.NewTimestampFromTime(timestamp)) + dpHisto.SetTimestamp(pcommon.NewTimestampFromTime(timestamp)) + dpHisto.SetCount(1) + dpHisto.SetSum(1) + dpHisto.Attributes().PutStr("key", "value") + dpHisto.Attributes().PutStr("key2", "value") + dpHisto.ExplicitBounds().FromRaw([]float64{0, 0, 0, 0, 0}) + dpHisto.BucketCounts().FromRaw([]uint64{0, 0, 0, 1, 0}) + dpHisto.SetMin(0) + dpHisto.SetMax(1) + exemplars := dpHisto.Exemplars().AppendEmpty() + exemplars.SetTimestamp(pcommon.NewTimestampFromTime(timestamp)) + exemplars.SetDoubleValue(55.22) + exemplars.FilteredAttributes().PutStr("key", "value") + exemplars.FilteredAttributes().PutStr("key2", "value2") + exemplars.SetSpanID([8]byte{1, 2, 3, byte(i)}) + exemplars.SetTraceID([16]byte{1, 2, 3, byte(i)}) + } + + // exp histogram + if _, ok := typeSet[pmetric.MetricTypeExponentialHistogram]; ok { + m := sm.Metrics().AppendEmpty() + m.SetName("exp histogram metrics") + m.SetUnit("ms") + m.SetDescription("This is a exp histogram metrics") + dpExpHisto := m.SetEmptyExponentialHistogram().DataPoints().AppendEmpty() + dpExpHisto.SetStartTimestamp(pcommon.NewTimestampFromTime(timestamp)) + dpExpHisto.SetTimestamp(pcommon.NewTimestampFromTime(timestamp)) + dpExpHisto.SetSum(1) + dpExpHisto.SetMin(0) + dpExpHisto.SetMax(1) + dpExpHisto.SetZeroCount(0) + dpExpHisto.SetCount(1) + dpExpHisto.Attributes().PutStr("key", "value") + dpExpHisto.Attributes().PutStr("key2", "value") + dpExpHisto.Negative().SetOffset(1) + dpExpHisto.Negative().BucketCounts().FromRaw([]uint64{0, 0, 0, 1, 0}) + dpExpHisto.Positive().SetOffset(1) + dpExpHisto.Positive().BucketCounts().FromRaw([]uint64{0, 0, 0, 1, 0}) + + exemplars := dpExpHisto.Exemplars().AppendEmpty() + exemplars.SetTimestamp(pcommon.NewTimestampFromTime(timestamp)) + exemplars.SetIntValue(54) + exemplars.FilteredAttributes().PutStr("key", "value") + exemplars.FilteredAttributes().PutStr("key2", "value2") + exemplars.SetSpanID([8]byte{1, 2, 3, byte(i)}) + exemplars.SetTraceID([16]byte{1, 2, 3, byte(i)}) + } + + // summary + if _, ok := typeSet[pmetric.MetricTypeSummary]; ok { + m := sm.Metrics().AppendEmpty() + m.SetName("summary metrics") + m.SetUnit("ms") + m.SetDescription("This is a summary metrics") + summary := m.SetEmptySummary().DataPoints().AppendEmpty() + summary.SetStartTimestamp(pcommon.NewTimestampFromTime(timestamp)) + summary.SetTimestamp(pcommon.NewTimestampFromTime(timestamp)) + summary.Attributes().PutStr("key", "value") + summary.Attributes().PutStr("key2", "value") + summary.SetCount(1) + summary.SetSum(1) + quantileValues := summary.QuantileValues().AppendEmpty() + quantileValues.SetValue(1) + quantileValues.SetQuantile(1) + } + } + + rm = metrics.ResourceMetrics().AppendEmpty() + rm.Resource().Attributes().PutStr("service.name", "demo 2") + rm.Resource().Attributes().PutStr("Resource Attributes 2", "value2") + rm.Resource().SetDroppedAttributesCount(20) + rm.SetSchemaUrl("Resource SchemaUrl 2") + sm = rm.ScopeMetrics().AppendEmpty() + sm.SetSchemaUrl("Scope SchemaUrl 2") + sm.Scope().Attributes().PutStr("Scope Attributes 2", "value2") + sm.Scope().SetDroppedAttributesCount(20) + sm.Scope().SetName("Scope name 2") + sm.Scope().SetVersion("Scope version 2") + for i := 0; i < count; i++ { + // gauge + if _, ok := typeSet[pmetric.MetricTypeGauge]; ok { + m := sm.Metrics().AppendEmpty() + m.SetName("gauge metrics") + m.SetUnit("count") + m.SetDescription("This is a gauge metrics") + dp := m.SetEmptyGauge().DataPoints().AppendEmpty() + dp.SetIntValue(int64(i)) + dp.Attributes().PutStr("gauge_label_2", "2") + dp.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) + exemplars := dp.Exemplars().AppendEmpty() + exemplars.SetIntValue(54) + exemplars.FilteredAttributes().PutStr("key", "value") + exemplars.FilteredAttributes().PutStr("key2", "value2") + exemplars.SetSpanID([8]byte{1, 2, 3, byte(i)}) + exemplars.SetTraceID([16]byte{1, 2, 3, byte(i)}) + } + + // sum + if _, ok := typeSet[pmetric.MetricTypeSum]; ok { + m := sm.Metrics().AppendEmpty() + m.SetName("sum metrics") + m.SetUnit("count") + m.SetDescription("This is a sum metrics") + dp := m.SetEmptySum().DataPoints().AppendEmpty() + dp.SetIntValue(int64(i)) + dp.Attributes().PutStr("sum_label_2", "2") + dp.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) + exemplars := dp.Exemplars().AppendEmpty() + exemplars.SetIntValue(54) + exemplars.FilteredAttributes().PutStr("key", "value") + exemplars.FilteredAttributes().PutStr("key2", "value2") + exemplars.SetSpanID([8]byte{1, 2, 3, byte(i)}) + exemplars.SetTraceID([16]byte{1, 2, 3, byte(i)}) + } + + // histogram + if _, ok := typeSet[pmetric.MetricTypeHistogram]; ok { + m := sm.Metrics().AppendEmpty() + m.SetName("histogram metrics") + m.SetUnit("ms") + m.SetDescription("This is a histogram metrics") + dpHisto := m.SetEmptyHistogram().DataPoints().AppendEmpty() + dpHisto.SetStartTimestamp(pcommon.NewTimestampFromTime(time.Now())) + dpHisto.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) + dpHisto.SetCount(1) + dpHisto.SetSum(1) + dpHisto.Attributes().PutStr("key", "value") + dpHisto.Attributes().PutStr("key", "value") + dpHisto.ExplicitBounds().FromRaw([]float64{0, 0, 0, 0, 0}) + dpHisto.BucketCounts().FromRaw([]uint64{0, 0, 0, 1, 0}) + dpHisto.SetMin(0) + dpHisto.SetMax(1) + exemplars := dpHisto.Exemplars().AppendEmpty() + exemplars.SetIntValue(54) + exemplars.FilteredAttributes().PutStr("key", "value") + exemplars.FilteredAttributes().PutStr("key2", "value2") + exemplars.SetSpanID([8]byte{1, 2, 3, byte(i)}) + exemplars.SetTraceID([16]byte{1, 2, 3, byte(i)}) + } + + // exp histogram + if _, ok := typeSet[pmetric.MetricTypeExponentialHistogram]; ok { + m := sm.Metrics().AppendEmpty() + m.SetName("exp histogram metrics") + m.SetUnit("ms") + m.SetDescription("This is a exp histogram metrics") + dpExpHisto := m.SetEmptyExponentialHistogram().DataPoints().AppendEmpty() + dpExpHisto.SetStartTimestamp(pcommon.NewTimestampFromTime(time.Now())) + dpExpHisto.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) + dpExpHisto.SetSum(1) + dpExpHisto.SetMin(0) + dpExpHisto.SetMax(1) + dpExpHisto.SetZeroCount(0) + dpExpHisto.SetCount(1) + dpExpHisto.Attributes().PutStr("key", "value") + dpExpHisto.Attributes().PutStr("key", "value") + dpExpHisto.Negative().SetOffset(1) + dpExpHisto.Negative().BucketCounts().FromRaw([]uint64{0, 0, 0, 1, 0}) + dpExpHisto.Positive().SetOffset(1) + dpExpHisto.Positive().BucketCounts().FromRaw([]uint64{0, 0, 0, 1, 0}) + + exemplars := dpExpHisto.Exemplars().AppendEmpty() + exemplars.SetIntValue(54) + exemplars.FilteredAttributes().PutStr("key", "value") + exemplars.FilteredAttributes().PutStr("key2", "value2") + exemplars.SetSpanID([8]byte{1, 2, 3, byte(i)}) + exemplars.SetTraceID([16]byte{1, 2, 3, byte(i)}) + } + + // summary + if _, ok := typeSet[pmetric.MetricTypeSummary]; ok { + m := sm.Metrics().AppendEmpty() + m.SetName("summary histogram metrics") + m.SetUnit("ms") + m.SetDescription("This is a summary metrics") + summary := m.SetEmptySummary().DataPoints().AppendEmpty() + summary.SetStartTimestamp(pcommon.NewTimestampFromTime(time.Now())) + summary.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) + summary.Attributes().PutStr("key", "value") + summary.Attributes().PutStr("key2", "value2") + summary.SetCount(1) + summary.SetSum(1) + quantileValues := summary.QuantileValues().AppendEmpty() + quantileValues.SetValue(1) + quantileValues.SetQuantile(1) + } + } + + // add a different scope metrics + sm = rm.ScopeMetrics().AppendEmpty() + sm.SetSchemaUrl("Scope SchemaUrl 3") + sm.Scope().Attributes().PutStr("Scope Attributes 3", "value3") + sm.Scope().SetDroppedAttributesCount(20) + sm.Scope().SetName("Scope name 3") + sm.Scope().SetVersion("Scope version 3") + for i := 0; i < count; i++ { + // gauge + if _, ok := typeSet[pmetric.MetricTypeGauge]; ok { + m := sm.Metrics().AppendEmpty() + m.SetName("gauge metrics") + m.SetUnit("count") + m.SetDescription("This is a gauge metrics") + dp := m.SetEmptyGauge().DataPoints().AppendEmpty() + dp.SetIntValue(int64(i)) + dp.Attributes().PutStr("gauge_label_3", "3") + dp.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) + exemplars := dp.Exemplars().AppendEmpty() + exemplars.SetIntValue(54) + exemplars.FilteredAttributes().PutStr("key", "value") + exemplars.FilteredAttributes().PutStr("key2", "value2") + exemplars.SetSpanID([8]byte{1, 2, 3, byte(i)}) + exemplars.SetTraceID([16]byte{1, 2, 3, byte(i)}) + } + + // sum + if _, ok := typeSet[pmetric.MetricTypeSum]; ok { + m := sm.Metrics().AppendEmpty() + m.SetName("sum metrics") + m.SetUnit("count") + m.SetDescription("This is a sum metrics") + dp := m.SetEmptySum().DataPoints().AppendEmpty() + dp.SetIntValue(int64(i)) + dp.Attributes().PutStr("sum_label_2", "2") + dp.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) + exemplars := dp.Exemplars().AppendEmpty() + exemplars.SetIntValue(54) + exemplars.FilteredAttributes().PutStr("key", "value") + exemplars.FilteredAttributes().PutStr("key2", "value2") + exemplars.SetSpanID([8]byte{1, 2, 3, byte(i)}) + exemplars.SetTraceID([16]byte{1, 2, 3, byte(i)}) + } + + // histogram + if _, ok := typeSet[pmetric.MetricTypeHistogram]; ok { + m := sm.Metrics().AppendEmpty() + m.SetName("histogram metrics") + m.SetUnit("ms") + m.SetDescription("This is a histogram metrics") + dpHisto := m.SetEmptyHistogram().DataPoints().AppendEmpty() + dpHisto.SetStartTimestamp(pcommon.NewTimestampFromTime(time.Now())) + dpHisto.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) + dpHisto.SetCount(1) + dpHisto.SetSum(1) + dpHisto.Attributes().PutStr("key", "value") + dpHisto.Attributes().PutStr("key", "value") + dpHisto.ExplicitBounds().FromRaw([]float64{0, 0, 0, 0, 0}) + dpHisto.BucketCounts().FromRaw([]uint64{0, 0, 0, 1, 0}) + dpHisto.SetMin(0) + dpHisto.SetMax(1) + exemplars := dpHisto.Exemplars().AppendEmpty() + exemplars.SetIntValue(54) + exemplars.FilteredAttributes().PutStr("key", "value") + exemplars.FilteredAttributes().PutStr("key2", "value2") + exemplars.SetSpanID([8]byte{1, 2, 3, byte(i)}) + exemplars.SetTraceID([16]byte{1, 2, 3, byte(i)}) + } + + // exp histogram + if _, ok := typeSet[pmetric.MetricTypeExponentialHistogram]; ok { + m := sm.Metrics().AppendEmpty() + m.SetName("exp histogram metrics") + m.SetUnit("ms") + m.SetDescription("This is a exp histogram metrics") + dpExpHisto := m.SetEmptyExponentialHistogram().DataPoints().AppendEmpty() + dpExpHisto.SetStartTimestamp(pcommon.NewTimestampFromTime(time.Now())) + dpExpHisto.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) + dpExpHisto.SetSum(1) + dpExpHisto.SetMin(0) + dpExpHisto.SetMax(1) + dpExpHisto.SetZeroCount(0) + dpExpHisto.SetCount(1) + dpExpHisto.Attributes().PutStr("key", "value") + dpExpHisto.Attributes().PutStr("key", "value") + dpExpHisto.Negative().SetOffset(1) + dpExpHisto.Negative().BucketCounts().FromRaw([]uint64{0, 0, 0, 1, 0}) + dpExpHisto.Positive().SetOffset(1) + dpExpHisto.Positive().BucketCounts().FromRaw([]uint64{0, 0, 0, 1, 0}) + + exemplars := dpExpHisto.Exemplars().AppendEmpty() + exemplars.SetIntValue(54) + exemplars.FilteredAttributes().PutStr("key", "value") + exemplars.FilteredAttributes().PutStr("key2", "value2") + exemplars.SetSpanID([8]byte{1, 2, 3, byte(i)}) + exemplars.SetTraceID([16]byte{1, 2, 3, byte(i)}) + } + + // summary + if _, ok := typeSet[pmetric.MetricTypeSummary]; ok { + m := sm.Metrics().AppendEmpty() + m.SetName("summary histogram metrics") + m.SetUnit("ms") + m.SetDescription("This is a summary metrics") + summary := m.SetEmptySummary().DataPoints().AppendEmpty() + summary.SetStartTimestamp(pcommon.NewTimestampFromTime(time.Now())) + summary.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) + summary.Attributes().PutStr("key", "value") + summary.Attributes().PutStr("key2", "value2") + summary.SetCount(1) + summary.SetSum(1) + quantileValues := summary.QuantileValues().AppendEmpty() + quantileValues.SetValue(1) + quantileValues.SetQuantile(1) + } + } + return metrics +} diff --git a/exporter/dorisexporter/exporter_traces.go b/exporter/dorisexporter/exporter_traces.go new file mode 100644 index 000000000000..40793c613605 --- /dev/null +++ b/exporter/dorisexporter/exporter_traces.go @@ -0,0 +1,215 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package dorisexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/dorisexporter" + +import ( + "context" + _ "embed" // for SQL file embedding + "encoding/json" + "fmt" + "io" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/pdata/ptrace" + semconv "go.opentelemetry.io/collector/semconv/v1.25.0" + "go.uber.org/zap" + + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/traceutil" +) + +//go:embed sql/traces_ddl.sql +var tracesDDL string + +// dTrace Trace to Doris +type dTrace struct { + ServiceName string `json:"service_name"` + Timestamp string `json:"timestamp"` + TraceID string `json:"trace_id"` + SpanID string `json:"span_id"` + TraceState string `json:"trace_state"` + ParentSpanID string `json:"parent_span_id"` + SpanName string `json:"span_name"` + SpanKind string `json:"span_kind"` + EndTime string `json:"end_time"` + Duration int64 `json:"duration"` + SpanAttributes map[string]any `json:"span_attributes"` + Events []*dEvent `json:"events"` + Links []*dLink `json:"links"` + StatusMessage string `json:"status_message"` + StatusCode string `json:"status_code"` + ResourceAttributes map[string]any `json:"resource_attributes"` + ScopeName string `json:"scope_name"` + ScopeVersion string `json:"scope_version"` +} + +// dEvent Event to Doris +type dEvent struct { + Timestamp string `json:"timestamp"` + Name string `json:"name"` + Attributes map[string]any `json:"attributes"` +} + +// dLink Link to Doris +type dLink struct { + TraceID string `json:"trace_id"` + SpanID string `json:"span_id"` + TraceState string `json:"trace_state"` + Attributes map[string]any `json:"attributes"` +} + +type tracesExporter struct { + *commonExporter +} + +func newTracesExporter(logger *zap.Logger, cfg *Config, set component.TelemetrySettings) *tracesExporter { + return &tracesExporter{ + commonExporter: newExporter(logger, cfg, set), + } +} + +func (e *tracesExporter) start(ctx context.Context, host component.Host) error { + client, err := createDorisHTTPClient(ctx, e.cfg, host, e.TelemetrySettings) + if err != nil { + return err + } + e.client = client + + if !e.cfg.CreateSchema { + return nil + } + + conn, err := createDorisMySQLClient(e.cfg) + if err != nil { + return err + } + defer conn.Close() + + err = createAndUseDatabase(ctx, conn, e.cfg) + if err != nil { + return err + } + + ddl := fmt.Sprintf(tracesDDL, e.cfg.Table.Traces, e.cfg.propertiesStr()) + _, err = conn.ExecContext(ctx, ddl) + return err +} + +func (e *tracesExporter) shutdown(_ context.Context) error { + if e.client != nil { + e.client.CloseIdleConnections() + } + return nil +} + +func (e *tracesExporter) pushTraceData(ctx context.Context, td ptrace.Traces) error { + traces := make([]*dTrace, 0, td.SpanCount()) + + for i := 0; i < td.ResourceSpans().Len(); i++ { + resourceSpan := td.ResourceSpans().At(i) + resource := resourceSpan.Resource() + resourceAttributes := resource.Attributes() + serviceName := "" + v, ok := resourceAttributes.Get(semconv.AttributeServiceName) + if ok { + serviceName = v.AsString() + } + + for j := 0; j < resourceSpan.ScopeSpans().Len(); j++ { + scopeSpan := resourceSpan.ScopeSpans().At(j) + + for k := 0; k < scopeSpan.Spans().Len(); k++ { + span := scopeSpan.Spans().At(k) + + events := span.Events() + newEvents := make([]*dEvent, 0, events.Len()) + for l := 0; l < events.Len(); l++ { + event := events.At(l) + + newEvent := &dEvent{ + Timestamp: e.formatTime(event.Timestamp().AsTime()), + Name: event.Name(), + Attributes: event.Attributes().AsRaw(), + } + + newEvents = append(newEvents, newEvent) + } + + links := span.Links() + newLinks := make([]*dLink, 0, links.Len()) + for l := 0; l < links.Len(); l++ { + link := links.At(l) + + newLink := &dLink{ + TraceID: traceutil.TraceIDToHexOrEmptyString(link.TraceID()), + SpanID: traceutil.SpanIDToHexOrEmptyString(link.SpanID()), + TraceState: link.TraceState().AsRaw(), + Attributes: link.Attributes().AsRaw(), + } + + newLinks = append(newLinks, newLink) + } + + trace := &dTrace{ + ServiceName: serviceName, + Timestamp: e.formatTime(span.StartTimestamp().AsTime()), + TraceID: traceutil.TraceIDToHexOrEmptyString(span.TraceID()), + SpanID: traceutil.SpanIDToHexOrEmptyString(span.SpanID()), + TraceState: span.TraceState().AsRaw(), + ParentSpanID: traceutil.SpanIDToHexOrEmptyString(span.ParentSpanID()), + SpanName: span.Name(), + SpanKind: traceutil.SpanKindStr(span.Kind()), + EndTime: e.formatTime(span.EndTimestamp().AsTime()), + Duration: span.EndTimestamp().AsTime().Sub(span.StartTimestamp().AsTime()).Microseconds(), + SpanAttributes: span.Attributes().AsRaw(), + Events: newEvents, + Links: newLinks, + StatusMessage: span.Status().Message(), + StatusCode: traceutil.StatusCodeStr(span.Status().Code()), + ResourceAttributes: resourceAttributes.AsRaw(), + ScopeName: scopeSpan.Scope().Name(), + ScopeVersion: scopeSpan.Scope().Version(), + } + + traces = append(traces, trace) + } + } + } + + return e.pushTraceDataInternal(ctx, traces) +} + +func (e *tracesExporter) pushTraceDataInternal(ctx context.Context, traces []*dTrace) error { + marshal, err := json.Marshal(traces) + if err != nil { + return err + } + + req, err := streamLoadRequest(ctx, e.cfg, e.cfg.Table.Traces, marshal) + if err != nil { + return err + } + + res, err := e.client.Do(req) + if err != nil { + return err + } + defer res.Body.Close() + + body, err := io.ReadAll(res.Body) + if err != nil { + return err + } + + response := streamLoadResponse{} + err = json.Unmarshal(body, &response) + if err != nil { + return err + } + + if !response.success() { + return fmt.Errorf("failed to push trace data: %s", response.Message) + } + + return nil +} diff --git a/exporter/dorisexporter/exporter_traces_test.go b/exporter/dorisexporter/exporter_traces_test.go new file mode 100644 index 000000000000..0a3886d9b689 --- /dev/null +++ b/exporter/dorisexporter/exporter_traces_test.go @@ -0,0 +1,107 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package dorisexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/dorisexporter" + +import ( + "context" + "fmt" + "net/http" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/ptrace" + semconv "go.opentelemetry.io/collector/semconv/v1.25.0" +) + +func TestPushTraceData(t *testing.T) { + port, err := findRandomPort() + require.NoError(t, err) + + config := createDefaultConfig().(*Config) + config.Endpoint = fmt.Sprintf("http://127.0.0.1:%d", port) + config.CreateSchema = false + + err = config.Validate() + require.NoError(t, err) + + exporter := newTracesExporter(nil, config, componenttest.NewNopTelemetrySettings()) + + ctx := context.Background() + + client, err := createDorisHTTPClient(ctx, config, nil, componenttest.NewNopTelemetrySettings()) + require.NoError(t, err) + require.NotNil(t, client) + + exporter.client = client + + defer func() { + _ = exporter.shutdown(ctx) + }() + + server := &http.Server{ + ReadTimeout: 3 * time.Second, + Addr: fmt.Sprintf(":%d", port), + } + + go func() { + http.HandleFunc("/api/otel/otel_traces/_stream_load", func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusOK) + _, _ = w.Write([]byte(`{"Status":"Success"}`)) + }) + err = server.ListenAndServe() + assert.Equal(t, http.ErrServerClosed, err) + }() + + err0 := fmt.Errorf("Not Started") + for i := 0; err0 != nil && i < 10; i++ { // until server started + err0 = exporter.pushTraceData(ctx, simpleTraces(10)) + time.Sleep(100 * time.Millisecond) + } + require.NoError(t, err0) + + _ = server.Shutdown(ctx) +} + +func simpleTraces(count int) ptrace.Traces { + traces := ptrace.NewTraces() + rs := traces.ResourceSpans().AppendEmpty() + rs.SetSchemaUrl("https://opentelemetry.io/schemas/1.4.0") + rs.Resource().SetDroppedAttributesCount(10) + rs.Resource().Attributes().PutStr("service.name", "test-service") + ss := rs.ScopeSpans().AppendEmpty() + ss.Scope().SetName("io.opentelemetry.contrib.doris") + ss.Scope().SetVersion("1.0.0") + ss.SetSchemaUrl("https://opentelemetry.io/schemas/1.7.0") + ss.Scope().SetDroppedAttributesCount(20) + ss.Scope().Attributes().PutStr("lib", "doris") + timestamp := time.Now() + for i := 0; i < count; i++ { + s := ss.Spans().AppendEmpty() + s.SetTraceID([16]byte{1, 2, 3, byte(i)}) + s.SetSpanID([8]byte{1, 2, 3, byte(i)}) + s.TraceState().FromRaw("trace state") + s.SetParentSpanID([8]byte{1, 2, 4, byte(i)}) + s.SetName("call db") + s.SetKind(ptrace.SpanKindInternal) + s.SetStartTimestamp(pcommon.NewTimestampFromTime(timestamp)) + s.SetEndTimestamp(pcommon.NewTimestampFromTime(timestamp.Add(time.Minute))) + s.Attributes().PutStr(semconv.AttributeServiceName, "v") + s.Status().SetMessage("error") + s.Status().SetCode(ptrace.StatusCodeError) + event := s.Events().AppendEmpty() + event.SetName("event1") + event.SetTimestamp(pcommon.NewTimestampFromTime(timestamp)) + event.Attributes().PutStr("level", "info") + link := s.Links().AppendEmpty() + link.SetTraceID([16]byte{1, 2, 5, byte(i)}) + link.SetSpanID([8]byte{1, 2, 5, byte(i)}) + link.TraceState().FromRaw("error") + link.Attributes().PutStr("k", "v") + } + return traces +} diff --git a/exporter/dorisexporter/factory.go b/exporter/dorisexporter/factory.go new file mode 100644 index 000000000000..ec9da847af41 --- /dev/null +++ b/exporter/dorisexporter/factory.go @@ -0,0 +1,100 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package dorisexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/dorisexporter" + +import ( + "context" + "time" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/confighttp" + "go.opentelemetry.io/collector/config/configretry" + "go.opentelemetry.io/collector/exporter" + "go.opentelemetry.io/collector/exporter/exporterhelper" + + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/dorisexporter/internal/metadata" +) + +func NewFactory() exporter.Factory { + return exporter.NewFactory( + metadata.Type, + createDefaultConfig, + exporter.WithLogs(createLogsExporter, metadata.LogsStability), + exporter.WithTraces(createTracesExporter, metadata.TracesStability), + exporter.WithMetrics(createMetricsExporter, metadata.MetricsStability), + ) +} + +func createDefaultConfig() component.Config { + httpClientConfig := confighttp.NewDefaultClientConfig() + httpClientConfig.Timeout = 60 * time.Second + + return &Config{ + ClientConfig: httpClientConfig, + QueueSettings: exporterhelper.NewDefaultQueueConfig(), + BackOffConfig: configretry.NewDefaultBackOffConfig(), + Table: Table{ + Logs: "otel_logs", + Traces: "otel_traces", + Metrics: "otel_metrics", + }, + Database: "otel", + CreateSchema: true, + HistoryDays: 0, + CreateHistoryDays: 0, + ReplicationNum: 1, + TimeZone: time.Local.String(), + } +} + +func createLogsExporter(ctx context.Context, set exporter.Settings, cfg component.Config) (exporter.Logs, error) { + c := cfg.(*Config) + exporter := newLogsExporter(set.Logger, c, set.TelemetrySettings) + return exporterhelper.NewLogs( + ctx, + set, + cfg, + exporter.pushLogData, + exporterhelper.WithStart(exporter.start), + exporterhelper.WithShutdown(exporter.shutdown), + // we config the timeout option in http client, so we don't need to set timeout here + exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}), + exporterhelper.WithQueue(c.QueueSettings), + exporterhelper.WithRetry(c.BackOffConfig), + ) +} + +func createTracesExporter(ctx context.Context, set exporter.Settings, cfg component.Config) (exporter.Traces, error) { + c := cfg.(*Config) + exporter := newTracesExporter(set.Logger, c, set.TelemetrySettings) + return exporterhelper.NewTraces( + ctx, + set, + cfg, + exporter.pushTraceData, + exporterhelper.WithStart(exporter.start), + exporterhelper.WithShutdown(exporter.shutdown), + // we config the timeout option in http client, so we don't need to set timeout here + exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}), + exporterhelper.WithQueue(c.QueueSettings), + exporterhelper.WithRetry(c.BackOffConfig), + ) +} + +func createMetricsExporter(ctx context.Context, set exporter.Settings, cfg component.Config) (exporter.Metrics, error) { + c := cfg.(*Config) + exporter := newMetricsExporter(set.Logger, c, set.TelemetrySettings) + return exporterhelper.NewMetrics( + ctx, + set, + cfg, + exporter.pushMetricData, + exporterhelper.WithStart(exporter.start), + exporterhelper.WithShutdown(exporter.shutdown), + // we config the timeout option in http client, so we don't need to set timeout here + exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}), + exporterhelper.WithQueue(c.QueueSettings), + exporterhelper.WithRetry(c.BackOffConfig), + ) +} diff --git a/exporter/dorisexporter/generated_component_test.go b/exporter/dorisexporter/generated_component_test.go new file mode 100644 index 000000000000..f462ed535386 --- /dev/null +++ b/exporter/dorisexporter/generated_component_test.go @@ -0,0 +1,110 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package dorisexporter + +import ( + "context" + "testing" + "time" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/confmap/confmaptest" + "go.opentelemetry.io/collector/exporter" + "go.opentelemetry.io/collector/exporter/exportertest" + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/plog" + "go.opentelemetry.io/collector/pdata/pmetric" + "go.opentelemetry.io/collector/pdata/ptrace" +) + +func TestComponentFactoryType(t *testing.T) { + require.Equal(t, "doris", NewFactory().Type().String()) +} + +func TestComponentConfigStruct(t *testing.T) { + require.NoError(t, componenttest.CheckConfigStruct(NewFactory().CreateDefaultConfig())) +} + +func TestComponentLifecycle(t *testing.T) { + factory := NewFactory() + + tests := []struct { + name string + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) + }{ + + { + name: "logs", + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) + }, + }, + + { + name: "metrics", + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg) + }, + }, + + { + name: "traces", + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) + }, + }, + } + + cm, err := confmaptest.LoadConf("metadata.yaml") + require.NoError(t, err) + cfg := factory.CreateDefaultConfig() + sub, err := cm.Sub("tests::config") + require.NoError(t, err) + require.NoError(t, sub.Unmarshal(&cfg)) + + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) + require.NoError(t, err) + err = c.Shutdown(context.Background()) + require.NoError(t, err) + }) + } +} + +func generateLifecycleTestLogs() plog.Logs { + logs := plog.NewLogs() + rl := logs.ResourceLogs().AppendEmpty() + rl.Resource().Attributes().PutStr("resource", "R1") + l := rl.ScopeLogs().AppendEmpty().LogRecords().AppendEmpty() + l.Body().SetStr("test log message") + l.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) + return logs +} + +func generateLifecycleTestMetrics() pmetric.Metrics { + metrics := pmetric.NewMetrics() + rm := metrics.ResourceMetrics().AppendEmpty() + rm.Resource().Attributes().PutStr("resource", "R1") + m := rm.ScopeMetrics().AppendEmpty().Metrics().AppendEmpty() + m.SetName("test_metric") + dp := m.SetEmptyGauge().DataPoints().AppendEmpty() + dp.Attributes().PutStr("test_attr", "value_1") + dp.SetIntValue(123) + dp.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) + return metrics +} + +func generateLifecycleTestTraces() ptrace.Traces { + traces := ptrace.NewTraces() + rs := traces.ResourceSpans().AppendEmpty() + rs.Resource().Attributes().PutStr("resource", "R1") + span := rs.ScopeSpans().AppendEmpty().Spans().AppendEmpty() + span.Attributes().PutStr("test_attr", "value_1") + span.SetName("test_span") + span.SetStartTimestamp(pcommon.NewTimestampFromTime(time.Now().Add(-1 * time.Second))) + span.SetEndTimestamp(pcommon.NewTimestampFromTime(time.Now())) + return traces +} diff --git a/exporter/dorisexporter/generated_package_test.go b/exporter/dorisexporter/generated_package_test.go new file mode 100644 index 000000000000..85cc8c0d8e75 --- /dev/null +++ b/exporter/dorisexporter/generated_package_test.go @@ -0,0 +1,13 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package dorisexporter + +import ( + "testing" + + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + goleak.VerifyTestMain(m) +} diff --git a/exporter/dorisexporter/go.mod b/exporter/dorisexporter/go.mod new file mode 100644 index 000000000000..3e4bd8a9267d --- /dev/null +++ b/exporter/dorisexporter/go.mod @@ -0,0 +1,94 @@ +module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/dorisexporter + +go 1.22.0 + +require ( + github.com/cenkalti/backoff/v4 v4.3.0 + // https://github.com/go-sql-driver/mysql/issues/1602; https://github.com/apache/doris/pull/32177 + github.com/go-sql-driver/mysql v1.8.1 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.uber.org/goleak v1.3.0 + go.uber.org/zap v1.27.0 +) + +require ( + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/confighttp v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/semconv v0.116.0 +) + +require ( + filippo.io/edwards25519 v1.1.0 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.17.11 // indirect + github.com/knadh/koanf/maps v0.1.1 // indirect + github.com/knadh/koanf/providers/confmap v0.1.0 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/rs/cors v1.11.1 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/configtls v1.22.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/consumer v1.22.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal => ../../internal/coreinternal + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../../pkg/pdatautil + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest => ../../pkg/pdatatest + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden => ../../pkg/golden diff --git a/exporter/dorisexporter/go.sum b/exporter/dorisexporter/go.sum new file mode 100644 index 000000000000..129b738668e5 --- /dev/null +++ b/exporter/dorisexporter/go.sum @@ -0,0 +1,200 @@ +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= +github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= +github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= +github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/exporter/dorisexporter/internal/metadata/generated_status.go b/exporter/dorisexporter/internal/metadata/generated_status.go new file mode 100644 index 000000000000..de7a97cca84a --- /dev/null +++ b/exporter/dorisexporter/internal/metadata/generated_status.go @@ -0,0 +1,18 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "go.opentelemetry.io/collector/component" +) + +var ( + Type = component.MustNewType("doris") + ScopeName = "otelcol/doris" +) + +const ( + TracesStability = component.StabilityLevelAlpha + MetricsStability = component.StabilityLevelAlpha + LogsStability = component.StabilityLevelAlpha +) diff --git a/exporter/dorisexporter/metadata.yaml b/exporter/dorisexporter/metadata.yaml new file mode 100644 index 000000000000..6c1a7ec3443e --- /dev/null +++ b/exporter/dorisexporter/metadata.yaml @@ -0,0 +1,14 @@ +type: doris +scope_name: otelcol/doris + +status: + class: exporter + stability: + alpha: [traces, metrics, logs] + distributions: [contrib] + codeowners: + active: [atoulme, joker-star-l] + +# TODO: Update the exporter to pass the tests +tests: + skip_lifecycle: true diff --git a/exporter/dorisexporter/metrics_exponential_histogram.go b/exporter/dorisexporter/metrics_exponential_histogram.go new file mode 100644 index 000000000000..1498546f3229 --- /dev/null +++ b/exporter/dorisexporter/metrics_exponential_histogram.go @@ -0,0 +1,122 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package dorisexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/dorisexporter" + +import ( + _ "embed" + "encoding/json" + "fmt" + + "go.opentelemetry.io/collector/pdata/pmetric" +) + +//go:embed sql/metrics_exponential_histogram_ddl.sql +var metricsExponentialHistogramDDL string + +// dMetricExponentialHistogram Exponential Histogram Metric to Doris +type dMetricExponentialHistogram struct { + *dMetric `json:",inline"` + Timestamp string `json:"timestamp"` + Attributes map[string]any `json:"attributes"` + StartTime string `json:"start_time"` + Count int64 `json:"count"` + Sum float64 `json:"sum"` + Scale int32 `json:"scale"` + ZeroCount int64 `json:"zero_count"` + PositiveOffset int32 `json:"positive_offset"` + PositiveBucketCounts []int64 `json:"positive_bucket_counts"` + NegativeOffset int32 `json:"negative_offset"` + NegativeBucketCounts []int64 `json:"negative_bucket_counts"` + Exemplars []*dExemplar `json:"exemplars"` + Min float64 `json:"min"` + Max float64 `json:"max"` + ZeroThreshold float64 `json:"zero_threshold"` + AggregationTemporality string `json:"aggregation_temporality"` +} + +type metricModelExponentialHistogram struct { + data []*dMetricExponentialHistogram +} + +func (m *metricModelExponentialHistogram) metricType() pmetric.MetricType { + return pmetric.MetricTypeExponentialHistogram +} + +func (m *metricModelExponentialHistogram) tableSuffix() string { + return "_exponential_histogram" +} + +func (m *metricModelExponentialHistogram) add(pm pmetric.Metric, dm *dMetric, e *metricsExporter) error { + if pm.Type() != pmetric.MetricTypeExponentialHistogram { + return fmt.Errorf("metric type is not exponential histogram: %v", pm.Type().String()) + } + + dataPoints := pm.ExponentialHistogram().DataPoints() + for i := 0; i < dataPoints.Len(); i++ { + dp := dataPoints.At(i) + + exemplars := dp.Exemplars() + newExeplars := make([]*dExemplar, 0, exemplars.Len()) + for j := 0; j < exemplars.Len(); j++ { + exemplar := exemplars.At(j) + + newExeplar := &dExemplar{ + FilteredAttributes: exemplar.FilteredAttributes().AsRaw(), + Timestamp: e.formatTime(exemplar.Timestamp().AsTime()), + Value: e.getExemplarValue(exemplar), + SpanID: exemplar.SpanID().String(), + TraceID: exemplar.TraceID().String(), + } + + newExeplars = append(newExeplars, newExeplar) + } + + positiveBucketCounts := dp.Positive().BucketCounts() + newPositiveBucketCounts := make([]int64, 0, positiveBucketCounts.Len()) + for j := 0; j < positiveBucketCounts.Len(); j++ { + newPositiveBucketCounts = append(newPositiveBucketCounts, int64(positiveBucketCounts.At(j))) + } + + negativeBucketCounts := dp.Negative().BucketCounts() + newNegativeBucketCounts := make([]int64, 0, negativeBucketCounts.Len()) + for j := 0; j < negativeBucketCounts.Len(); j++ { + newNegativeBucketCounts = append(newNegativeBucketCounts, int64(negativeBucketCounts.At(j))) + } + + metric := &dMetricExponentialHistogram{ + dMetric: dm, + Timestamp: e.formatTime(dp.Timestamp().AsTime()), + Attributes: dp.Attributes().AsRaw(), + StartTime: e.formatTime(dp.StartTimestamp().AsTime()), + Count: int64(dp.Count()), + Sum: dp.Sum(), + Scale: dp.Scale(), + ZeroCount: int64(dp.ZeroCount()), + PositiveOffset: dp.Positive().Offset(), + PositiveBucketCounts: newPositiveBucketCounts, + NegativeOffset: dp.Negative().Offset(), + NegativeBucketCounts: newNegativeBucketCounts, + Exemplars: newExeplars, + Min: dp.Min(), + Max: dp.Max(), + ZeroThreshold: dp.ZeroThreshold(), + AggregationTemporality: pm.ExponentialHistogram().AggregationTemporality().String(), + } + m.data = append(m.data, metric) + } + + return nil +} + +func (m *metricModelExponentialHistogram) raw() any { + return m.data +} + +func (m *metricModelExponentialHistogram) size() int { + return len(m.data) +} + +func (m *metricModelExponentialHistogram) bytes() ([]byte, error) { + return json.Marshal(m.data) +} diff --git a/exporter/dorisexporter/metrics_gauge.go b/exporter/dorisexporter/metrics_gauge.go new file mode 100644 index 000000000000..a5cf1b9388dd --- /dev/null +++ b/exporter/dorisexporter/metrics_gauge.go @@ -0,0 +1,88 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package dorisexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/dorisexporter" + +import ( + _ "embed" + "encoding/json" + "fmt" + + "go.opentelemetry.io/collector/pdata/pmetric" +) + +//go:embed sql/metrics_gauge_ddl.sql +var metricsGaugeDDL string + +// dMetricGauge Gauge Metric to Doris +type dMetricGauge struct { + *dMetric `json:",inline"` + Timestamp string `json:"timestamp"` + Attributes map[string]any `json:"attributes"` + StartTime string `json:"start_time"` + Value float64 `json:"value"` + Exemplars []*dExemplar `json:"exemplars"` +} + +type metricModelGauge struct { + data []*dMetricGauge +} + +func (m *metricModelGauge) metricType() pmetric.MetricType { + return pmetric.MetricTypeGauge +} + +func (m *metricModelGauge) tableSuffix() string { + return "_gauge" +} + +func (m *metricModelGauge) add(pm pmetric.Metric, dm *dMetric, e *metricsExporter) error { + if pm.Type() != pmetric.MetricTypeGauge { + return fmt.Errorf("metric type is not gauge: %v", pm.Type().String()) + } + + dataPoints := pm.Gauge().DataPoints() + for i := 0; i < dataPoints.Len(); i++ { + dp := dataPoints.At(i) + + exemplars := dp.Exemplars() + newExeplars := make([]*dExemplar, 0, exemplars.Len()) + for j := 0; j < exemplars.Len(); j++ { + exemplar := exemplars.At(j) + + newExeplar := &dExemplar{ + FilteredAttributes: exemplar.FilteredAttributes().AsRaw(), + Timestamp: e.formatTime(exemplar.Timestamp().AsTime()), + Value: e.getExemplarValue(exemplar), + SpanID: exemplar.SpanID().String(), + TraceID: exemplar.TraceID().String(), + } + + newExeplars = append(newExeplars, newExeplar) + } + + metric := &dMetricGauge{ + dMetric: dm, + Timestamp: e.formatTime(dp.Timestamp().AsTime()), + Attributes: dp.Attributes().AsRaw(), + StartTime: e.formatTime(dp.StartTimestamp().AsTime()), + Value: e.getNumberDataPointValue(dp), + Exemplars: newExeplars, + } + m.data = append(m.data, metric) + } + + return nil +} + +func (m *metricModelGauge) raw() any { + return m.data +} + +func (m *metricModelGauge) size() int { + return len(m.data) +} + +func (m *metricModelGauge) bytes() ([]byte, error) { + return json.Marshal(m.data) +} diff --git a/exporter/dorisexporter/metrics_histogram.go b/exporter/dorisexporter/metrics_histogram.go new file mode 100644 index 000000000000..18d1b3f3afdb --- /dev/null +++ b/exporter/dorisexporter/metrics_histogram.go @@ -0,0 +1,112 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package dorisexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/dorisexporter" + +import ( + _ "embed" + "encoding/json" + "fmt" + + "go.opentelemetry.io/collector/pdata/pmetric" +) + +//go:embed sql/metrics_histogram_ddl.sql +var metricsHistogramDDL string + +// dMetricHistogram Histogram Metric to Doris +type dMetricHistogram struct { + *dMetric `json:",inline"` + Timestamp string `json:"timestamp"` + Attributes map[string]any `json:"attributes"` + StartTime string `json:"start_time"` + Count int64 `json:"count"` + Sum float64 `json:"sum"` + BucketCounts []int64 `json:"bucket_counts"` + ExplicitBounds []float64 `json:"explicit_bounds"` + Exemplars []*dExemplar `json:"exemplars"` + Min float64 `json:"min"` + Max float64 `json:"max"` + AggregationTemporality string `json:"aggregation_temporality"` +} + +type metricModelHistogram struct { + data []*dMetricHistogram +} + +func (m *metricModelHistogram) metricType() pmetric.MetricType { + return pmetric.MetricTypeHistogram +} + +func (m *metricModelHistogram) tableSuffix() string { + return "_histogram" +} + +func (m *metricModelHistogram) add(pm pmetric.Metric, dm *dMetric, e *metricsExporter) error { + if pm.Type() != pmetric.MetricTypeHistogram { + return fmt.Errorf("metric type is not histogram: %v", pm.Type().String()) + } + + dataPoints := pm.Histogram().DataPoints() + for i := 0; i < dataPoints.Len(); i++ { + dp := dataPoints.At(i) + + exemplars := dp.Exemplars() + newExeplars := make([]*dExemplar, 0, exemplars.Len()) + for j := 0; j < exemplars.Len(); j++ { + exemplar := exemplars.At(j) + + newExeplar := &dExemplar{ + FilteredAttributes: exemplar.FilteredAttributes().AsRaw(), + Timestamp: e.formatTime(exemplar.Timestamp().AsTime()), + Value: e.getExemplarValue(exemplar), + SpanID: exemplar.SpanID().String(), + TraceID: exemplar.TraceID().String(), + } + + newExeplars = append(newExeplars, newExeplar) + } + + bucketCounts := dp.BucketCounts() + newBucketCounts := make([]int64, 0, bucketCounts.Len()) + for j := 0; j < bucketCounts.Len(); j++ { + newBucketCounts = append(newBucketCounts, int64(bucketCounts.At(j))) + } + + explicitBounds := dp.ExplicitBounds() + newExplicitBounds := make([]float64, 0, explicitBounds.Len()) + for j := 0; j < explicitBounds.Len(); j++ { + newExplicitBounds = append(newExplicitBounds, explicitBounds.At(j)) + } + + metric := &dMetricHistogram{ + dMetric: dm, + Timestamp: e.formatTime(dp.Timestamp().AsTime()), + Attributes: dp.Attributes().AsRaw(), + StartTime: e.formatTime(dp.StartTimestamp().AsTime()), + Count: int64(dp.Count()), + Sum: dp.Sum(), + BucketCounts: newBucketCounts, + ExplicitBounds: newExplicitBounds, + Exemplars: newExeplars, + Min: dp.Min(), + Max: dp.Max(), + AggregationTemporality: pm.Histogram().AggregationTemporality().String(), + } + m.data = append(m.data, metric) + } + + return nil +} + +func (m *metricModelHistogram) raw() any { + return m.data +} + +func (m *metricModelHistogram) size() int { + return len(m.data) +} + +func (m *metricModelHistogram) bytes() ([]byte, error) { + return json.Marshal(m.data) +} diff --git a/exporter/dorisexporter/metrics_model.go b/exporter/dorisexporter/metrics_model.go new file mode 100644 index 000000000000..76ad79c47d97 --- /dev/null +++ b/exporter/dorisexporter/metrics_model.go @@ -0,0 +1,35 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package dorisexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/dorisexporter" + +import "go.opentelemetry.io/collector/pdata/pmetric" + +type metricModel interface { + metricType() pmetric.MetricType + tableSuffix() string + add(pm pmetric.Metric, dm *dMetric, e *metricsExporter) error + raw() any + size() int + bytes() ([]byte, error) +} + +// dMetric Basic Metric +type dMetric struct { + ServiceName string `json:"service_name"` + MetricName string `json:"metric_name"` + MetricDescription string `json:"metric_description"` + MetricUnit string `json:"metric_unit"` + ResourceAttributes map[string]any `json:"resource_attributes"` + ScopeName string `json:"scope_name"` + ScopeVersion string `json:"scope_version"` +} + +// dExemplar Exemplar to Doris +type dExemplar struct { + FilteredAttributes map[string]any `json:"filtered_attributes"` + Timestamp string `json:"timestamp"` + Value float64 `json:"value"` + SpanID string `json:"span_id"` + TraceID string `json:"trace_id"` +} diff --git a/exporter/dorisexporter/metrics_sum.go b/exporter/dorisexporter/metrics_sum.go new file mode 100644 index 000000000000..56c66ba86419 --- /dev/null +++ b/exporter/dorisexporter/metrics_sum.go @@ -0,0 +1,92 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package dorisexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/dorisexporter" + +import ( + _ "embed" + "encoding/json" + "fmt" + + "go.opentelemetry.io/collector/pdata/pmetric" +) + +//go:embed sql/metrics_sum_ddl.sql +var metricsSumDDL string + +// dMetricSum Sum Metric to Doris +type dMetricSum struct { + *dMetric `json:",inline"` + Timestamp string `json:"timestamp"` + Attributes map[string]any `json:"attributes"` + StartTime string `json:"start_time"` + Value float64 `json:"value"` + Exemplars []*dExemplar `json:"exemplars"` + AggregationTemporality string `json:"aggregation_temporality"` + IsMonotonic bool `json:"is_monotonic"` +} + +type metricModelSum struct { + data []*dMetricSum +} + +func (m *metricModelSum) metricType() pmetric.MetricType { + return pmetric.MetricTypeSum +} + +func (m *metricModelSum) tableSuffix() string { + return "_sum" +} + +func (m *metricModelSum) add(pm pmetric.Metric, dm *dMetric, e *metricsExporter) error { + if pm.Type() != pmetric.MetricTypeSum { + return fmt.Errorf("metric type is not sum: %v", pm.Type().String()) + } + + dataPoints := pm.Sum().DataPoints() + for i := 0; i < dataPoints.Len(); i++ { + dp := dataPoints.At(i) + + exemplars := dp.Exemplars() + newExeplars := make([]*dExemplar, 0, exemplars.Len()) + for j := 0; j < exemplars.Len(); j++ { + exemplar := exemplars.At(j) + + newExeplar := &dExemplar{ + FilteredAttributes: exemplar.FilteredAttributes().AsRaw(), + Timestamp: e.formatTime(exemplar.Timestamp().AsTime()), + Value: e.getExemplarValue(exemplar), + SpanID: exemplar.SpanID().String(), + TraceID: exemplar.TraceID().String(), + } + + newExeplars = append(newExeplars, newExeplar) + } + + metric := &dMetricSum{ + dMetric: dm, + Timestamp: e.formatTime(dp.Timestamp().AsTime()), + Attributes: dp.Attributes().AsRaw(), + StartTime: e.formatTime(dp.StartTimestamp().AsTime()), + Value: e.getNumberDataPointValue(dp), + Exemplars: newExeplars, + AggregationTemporality: pm.Sum().AggregationTemporality().String(), + IsMonotonic: pm.Sum().IsMonotonic(), + } + m.data = append(m.data, metric) + } + + return nil +} + +func (m *metricModelSum) raw() any { + return m.data +} + +func (m *metricModelSum) size() int { + return len(m.data) +} + +func (m *metricModelSum) bytes() ([]byte, error) { + return json.Marshal(m.data) +} diff --git a/exporter/dorisexporter/metrics_summary.go b/exporter/dorisexporter/metrics_summary.go new file mode 100644 index 000000000000..499d56fbcb47 --- /dev/null +++ b/exporter/dorisexporter/metrics_summary.go @@ -0,0 +1,93 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package dorisexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/dorisexporter" + +import ( + _ "embed" + "encoding/json" + "fmt" + + "go.opentelemetry.io/collector/pdata/pmetric" +) + +//go:embed sql/metrics_summary_ddl.sql +var metricsSummaryDDL string + +// dMetricSummary Summary metric model to Doris +type dMetricSummary struct { + *dMetric `json:",inline"` + Timestamp string `json:"timestamp"` + Attributes map[string]any `json:"attributes"` + StartTime string `json:"start_time"` + Count int64 `json:"count"` + Sum float64 `json:"sum"` + QuantileValues []*dQuantileValue `json:"quantile_values"` +} + +// dQuantileValue Quantile Value to Doris +type dQuantileValue struct { + Quantile float64 `json:"quantile"` + Value float64 `json:"value"` +} + +type metricModelSummary struct { + data []*dMetricSummary +} + +func (m *metricModelSummary) metricType() pmetric.MetricType { + return pmetric.MetricTypeSummary +} + +func (m *metricModelSummary) tableSuffix() string { + return "_summary" +} + +func (m *metricModelSummary) add(pm pmetric.Metric, dm *dMetric, e *metricsExporter) error { + if pm.Type() != pmetric.MetricTypeSummary { + return fmt.Errorf("metric type is not summary: %v", pm.Type().String()) + } + + dataPoints := pm.Summary().DataPoints() + for i := 0; i < dataPoints.Len(); i++ { + dp := dataPoints.At(i) + + quantileValues := dp.QuantileValues() + newQuantileValues := make([]*dQuantileValue, 0, quantileValues.Len()) + for j := 0; j < quantileValues.Len(); j++ { + quantileValue := quantileValues.At(j) + + newQuantileValue := &dQuantileValue{ + Quantile: quantileValue.Quantile(), + Value: quantileValue.Value(), + } + + newQuantileValues = append(newQuantileValues, newQuantileValue) + } + + metric := &dMetricSummary{ + dMetric: dm, + Timestamp: e.formatTime(dp.Timestamp().AsTime()), + Attributes: dp.Attributes().AsRaw(), + StartTime: e.formatTime(dp.StartTimestamp().AsTime()), + Count: int64(dp.Count()), + Sum: dp.Sum(), + QuantileValues: newQuantileValues, + } + m.data = append(m.data, metric) + } + + return nil +} + +func (m *metricModelSummary) raw() any { + return m.data +} + +func (m *metricModelSummary) size() int { + return len(m.data) +} + +func (m *metricModelSummary) bytes() ([]byte, error) { + return json.Marshal(m.data) +} diff --git a/exporter/dorisexporter/sql/logs_ddl.sql b/exporter/dorisexporter/sql/logs_ddl.sql new file mode 100644 index 000000000000..b69abf71a8b4 --- /dev/null +++ b/exporter/dorisexporter/sql/logs_ddl.sql @@ -0,0 +1,30 @@ +CREATE TABLE IF NOT EXISTS %s +( + service_name VARCHAR(200), + timestamp DATETIME(6), + trace_id VARCHAR(200), + span_id STRING, + severity_number INT, + severity_text STRING, + body STRING, + resource_attributes VARIANT, + log_attributes VARIANT, + scope_name STRING, + scope_version STRING, + INDEX idx_service_name(service_name) USING INVERTED, + INDEX idx_timestamp(timestamp) USING INVERTED, + INDEX idx_trace_id(trace_id) USING INVERTED, + INDEX idx_span_id(span_id) USING INVERTED, + INDEX idx_severity_number(severity_number) USING INVERTED, + INDEX idx_body(body) USING INVERTED PROPERTIES("parser"="unicode", "support_phrase"="true"), + INDEX idx_severity_text(severity_text) USING INVERTED, + INDEX idx_resource_attributes(resource_attributes) USING INVERTED, + INDEX idx_log_attributes(log_attributes) USING INVERTED, + INDEX idx_scope_name(scope_name) USING INVERTED, + INDEX idx_scope_version(scope_version) USING INVERTED +) +ENGINE = OLAP +DUPLICATE KEY(service_name, timestamp) +PARTITION BY RANGE(timestamp) () +DISTRIBUTED BY HASH(trace_id) BUCKETS AUTO +%s; \ No newline at end of file diff --git a/exporter/dorisexporter/sql/metrics_exponential_histogram_ddl.sql b/exporter/dorisexporter/sql/metrics_exponential_histogram_ddl.sql new file mode 100644 index 000000000000..ef81d9f599ad --- /dev/null +++ b/exporter/dorisexporter/sql/metrics_exponential_histogram_ddl.sql @@ -0,0 +1,47 @@ +CREATE TABLE IF NOT EXISTS %s_exponential_histogram +( + service_name VARCHAR(200), + timestamp DATETIME(6), + metric_name VARCHAR(200), + metric_description STRING, + metric_unit STRING, + attributes VARIANT, + start_time DATETIME(6), + count BIGINT, + sum DOUBLE, + scale INT, + zero_count BIGINT, + positive_offset INT, + positive_bucket_counts ARRAY, + negative_offset INT, + negative_bucket_counts ARRAY, + exemplars ARRAY, timestamp:DATETIME(6), value:DOUBLE, span_id:STRING, trace_id:STRING>>, + min DOUBLE, + max DOUBLE, + zero_threshold DOUBLE, + aggregation_temporality STRING, + resource_attributes VARIANT, + scope_name STRING, + scope_version STRING, + INDEX idx_service_name(service_name) USING INVERTED, + INDEX idx_timestamp(timestamp) USING INVERTED, + INDEX idx_metric_name(metric_name) USING INVERTED, + INDEX idx_metric_description(metric_description) USING INVERTED, + INDEX idx_metric_unit(metric_unit) USING INVERTED, + INDEX idx_attributes(attributes) USING INVERTED, + INDEX idx_start_time(start_time) USING INVERTED, + INDEX idx_count(count) USING INVERTED, + INDEX idx_scale(scale) USING INVERTED, + INDEX idx_zero_count(zero_count) USING INVERTED, + INDEX idx_positive_offset(positive_offset) USING INVERTED, + INDEX idx_negative_offset(negative_offset) USING INVERTED, + INDEX idx_aggregation_temporality(aggregation_temporality) USING INVERTED, + INDEX idx_resource_attributes(resource_attributes) USING INVERTED, + INDEX idx_scope_name(scope_name) USING INVERTED, + INDEX idx_scope_version(scope_version) USING INVERTED +) +ENGINE = OLAP +DUPLICATE KEY(service_name, timestamp) +PARTITION BY RANGE(timestamp) () +DISTRIBUTED BY HASH(metric_name) BUCKETS AUTO +%s; diff --git a/exporter/dorisexporter/sql/metrics_gauge_ddl.sql b/exporter/dorisexporter/sql/metrics_gauge_ddl.sql new file mode 100644 index 000000000000..59fc9a142a7e --- /dev/null +++ b/exporter/dorisexporter/sql/metrics_gauge_ddl.sql @@ -0,0 +1,30 @@ +CREATE TABLE IF NOT EXISTS %s_gauge +( + service_name VARCHAR(200), + timestamp DATETIME(6), + metric_name VARCHAR(200), + metric_description STRING, + metric_unit STRING, + attributes VARIANT, + start_time DATETIME(6), + value DOUBLE, + exemplars ARRAY, timestamp:DATETIME(6), value:DOUBLE, span_id:STRING, trace_id:STRING>>, + resource_attributes VARIANT, + scope_name STRING, + scope_version STRING, + INDEX idx_service_name(service_name) USING INVERTED, + INDEX idx_timestamp(timestamp) USING INVERTED, + INDEX idx_metric_name(metric_name) USING INVERTED, + INDEX idx_metric_description(metric_description) USING INVERTED, + INDEX idx_metric_unit(metric_unit) USING INVERTED, + INDEX idx_attributes(attributes) USING INVERTED, + INDEX idx_start_time(start_time) USING INVERTED, + INDEX idx_resource_attributes(resource_attributes) USING INVERTED, + INDEX idx_scope_name(scope_name) USING INVERTED, + INDEX idx_scope_version(scope_version) USING INVERTED +) +ENGINE = OLAP +DUPLICATE KEY(service_name, timestamp) +PARTITION BY RANGE(timestamp) () +DISTRIBUTED BY HASH(metric_name) BUCKETS AUTO +%s; \ No newline at end of file diff --git a/exporter/dorisexporter/sql/metrics_histogram_ddl.sql b/exporter/dorisexporter/sql/metrics_histogram_ddl.sql new file mode 100644 index 000000000000..74f1b37ec60d --- /dev/null +++ b/exporter/dorisexporter/sql/metrics_histogram_ddl.sql @@ -0,0 +1,38 @@ +CREATE TABLE IF NOT EXISTS %s_histogram +( + service_name VARCHAR(200), + timestamp DATETIME(6), + metric_name VARCHAR(200), + metric_description STRING, + metric_unit STRING, + attributes VARIANT, + start_time DATETIME(6), + count BIGINT, + sum DOUBLE, + bucket_counts ARRAY, + explicit_bounds ARRAY, + exemplars ARRAY, timestamp:DATETIME(6), value:DOUBLE, span_id:STRING, trace_id:STRING>>, + min DOUBLE, + max DOUBLE, + aggregation_temporality STRING, + resource_attributes VARIANT, + scope_name STRING, + scope_version STRING, + INDEX idx_service_name(service_name) USING INVERTED, + INDEX idx_timestamp(timestamp) USING INVERTED, + INDEX idx_metric_name(metric_name) USING INVERTED, + INDEX idx_metric_description(metric_description) USING INVERTED, + INDEX idx_metric_unit(metric_unit) USING INVERTED, + INDEX idx_attributes(attributes) USING INVERTED, + INDEX idx_start_time(start_time) USING INVERTED, + INDEX idx_count(count) USING INVERTED, + INDEX idx_aggregation_temporality(aggregation_temporality) USING INVERTED, + INDEX idx_resource_attributes(resource_attributes) USING INVERTED, + INDEX idx_scope_name(scope_name) USING INVERTED, + INDEX idx_scope_version(scope_version) USING INVERTED +) +ENGINE = OLAP +DUPLICATE KEY(service_name, timestamp) +PARTITION BY RANGE(timestamp) () +DISTRIBUTED BY HASH(metric_name) BUCKETS AUTO +%s; \ No newline at end of file diff --git a/exporter/dorisexporter/sql/metrics_sum_ddl.sql b/exporter/dorisexporter/sql/metrics_sum_ddl.sql new file mode 100644 index 000000000000..f8e082fda725 --- /dev/null +++ b/exporter/dorisexporter/sql/metrics_sum_ddl.sql @@ -0,0 +1,33 @@ +CREATE TABLE IF NOT EXISTS %s_sum +( + service_name VARCHAR(200), + timestamp DATETIME(6), + metric_name VARCHAR(200), + metric_description STRING, + metric_unit STRING, + attributes VARIANT, + start_time DATETIME(6), + value DOUBLE, + exemplars ARRAY, timestamp:DATETIME(6), value:DOUBLE, span_id:STRING, trace_id:STRING>>, + aggregation_temporality STRING, + is_monotonic BOOLEAN, + resource_attributes VARIANT, + scope_name STRING, + scope_version STRING, + INDEX idx_service_name(service_name) USING INVERTED, + INDEX idx_timestamp(timestamp) USING INVERTED, + INDEX idx_metric_name(metric_name) USING INVERTED, + INDEX idx_metric_description(metric_description) USING INVERTED, + INDEX idx_metric_unit(metric_unit) USING INVERTED, + INDEX idx_attributes(attributes) USING INVERTED, + INDEX idx_start_time(start_time) USING INVERTED, + INDEX idx_aggregation_temporality(aggregation_temporality) USING INVERTED, + INDEX idx_resource_attributes(resource_attributes) USING INVERTED, + INDEX idx_scope_name(scope_name) USING INVERTED, + INDEX idx_scope_version(scope_version) USING INVERTED +) +ENGINE = OLAP +DUPLICATE KEY(service_name, timestamp) +PARTITION BY RANGE(timestamp) () +DISTRIBUTED BY HASH(metric_name) BUCKETS AUTO +%s; \ No newline at end of file diff --git a/exporter/dorisexporter/sql/metrics_summary_ddl.sql b/exporter/dorisexporter/sql/metrics_summary_ddl.sql new file mode 100644 index 000000000000..5138f02e4ba7 --- /dev/null +++ b/exporter/dorisexporter/sql/metrics_summary_ddl.sql @@ -0,0 +1,32 @@ +CREATE TABLE IF NOT EXISTS %s_summary +( + service_name VARCHAR(200), + timestamp DATETIME(6), + metric_name VARCHAR(200), + metric_description STRING, + metric_unit STRING, + attributes VARIANT, + start_time DATETIME(6), + count BIGINT, + sum DOUBLE, + quantile_values ARRAY>, + resource_attributes VARIANT, + scope_name STRING, + scope_version STRING, + INDEX idx_service_name(service_name) USING INVERTED, + INDEX idx_timestamp(timestamp) USING INVERTED, + INDEX idx_metric_name(metric_name) USING INVERTED, + INDEX idx_metric_description(metric_description) USING INVERTED, + INDEX idx_metric_unit(metric_unit) USING INVERTED, + INDEX idx_attributes(attributes) USING INVERTED, + INDEX idx_start_time(start_time) USING INVERTED, + INDEX idx_count(count) USING INVERTED, + INDEX idx_resource_attributes(resource_attributes) USING INVERTED, + INDEX idx_scope_name(scope_name) USING INVERTED, + INDEX idx_scope_version(scope_version) USING INVERTED +) +ENGINE = OLAP +DUPLICATE KEY(service_name, timestamp) +PARTITION BY RANGE(timestamp) () +DISTRIBUTED BY HASH(metric_name) BUCKETS AUTO +%s; \ No newline at end of file diff --git a/exporter/dorisexporter/sql/traces_ddl.sql b/exporter/dorisexporter/sql/traces_ddl.sql new file mode 100644 index 000000000000..42d48d82de65 --- /dev/null +++ b/exporter/dorisexporter/sql/traces_ddl.sql @@ -0,0 +1,42 @@ +CREATE TABLE IF NOT EXISTS %s +( + service_name VARCHAR(200), + timestamp DATETIME(6), + trace_id VARCHAR(200), + span_id STRING, + trace_state STRING, + parent_span_id STRING, + span_name STRING, + span_kind STRING, + end_time DATETIME(6), + duration BIGINT, + span_attributes VARIANT, + events ARRAY>>, + links ARRAY>>, + status_message STRING, + status_code STRING, + resource_attributes VARIANT, + scope_name STRING, + scope_version STRING, + INDEX idx_service_name(service_name) USING INVERTED, + INDEX idx_timestamp(timestamp) USING INVERTED, + INDEX idx_trace_id(trace_id) USING INVERTED, + INDEX idx_span_id(span_id) USING INVERTED, + INDEX idx_trace_state(trace_state) USING INVERTED, + INDEX idx_parent_span_id(parent_span_id) USING INVERTED, + INDEX idx_span_name(span_name) USING INVERTED, + INDEX idx_span_kind(span_kind) USING INVERTED, + INDEX idx_end_time(end_time) USING INVERTED, + INDEX idx_duration(duration) USING INVERTED, + INDEX idx_span_attributes(span_attributes) USING INVERTED, + INDEX idx_status_message(status_message) USING INVERTED, + INDEX idx_status_code(status_code) USING INVERTED, + INDEX idx_resource_attributes(resource_attributes) USING INVERTED, + INDEX idx_scope_name(scope_name) USING INVERTED, + INDEX idx_scope_version(scope_version) USING INVERTED +) +ENGINE = OLAP +DUPLICATE KEY(service_name, timestamp) +PARTITION BY RANGE(timestamp) () +DISTRIBUTED BY HASH(trace_id) BUCKETS AUTO +%s; diff --git a/exporter/dorisexporter/testdata/config.yaml b/exporter/dorisexporter/testdata/config.yaml new file mode 100644 index 000000000000..6c292e7ef6c8 --- /dev/null +++ b/exporter/dorisexporter/testdata/config.yaml @@ -0,0 +1,28 @@ +doris: + endpoint: http://localhost:8030 + mysql_endpoint: localhost:9030 +doris/full: + endpoint: http://localhost:8030 + database: otel + username: admin + password: admin + table: + logs: otel_logs + traces: otel_traces + metrics: otel_metrics + create_schema: true + mysql_endpoint: localhost:9030 + history_days: 0 + create_history_days: 0 + replication_num: 2 + timezone: Asia/Shanghai + timeout: 5s + sending_queue: + enabled: true + num_consumers: 10 + queue_size: 1000 + retry_on_failure: + enabled: true + initial_interval: 5s + max_interval: 30s + max_elapsed_time: 300s diff --git a/exporter/elasticsearchexporter/README.md b/exporter/elasticsearchexporter/README.md index 7a6d815475c5..13ecfa53507d 100644 --- a/exporter/elasticsearchexporter/README.md +++ b/exporter/elasticsearchexporter/README.md @@ -3,139 +3,362 @@ | Status | | | ------------- |-----------| -| Stability | [beta]: traces, logs | +| Stability | [development]: metrics | +| | [beta]: traces, logs | | Distributions | [contrib] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Felasticsearch%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Felasticsearch) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Felasticsearch%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Felasticsearch) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@JaredTan95](https://www.github.com/JaredTan95), [@ycombinator](https://www.github.com/ycombinator), [@carsonip](https://www.github.com/carsonip) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@JaredTan95](https://www.github.com/JaredTan95), [@carsonip](https://www.github.com/carsonip), [@lahsivjar](https://www.github.com/lahsivjar) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[development]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#development +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib -This exporter supports sending OpenTelemetry logs and traces to [Elasticsearch](https://www.elastic.co/elasticsearch). +This exporter supports sending logs, metrics and traces to [Elasticsearch](https://www.elastic.co/elasticsearch). ## Configuration options -- `endpoints`: List of Elasticsearch URLs. If `endpoints` and `cloudid` are missing, the - ELASTICSEARCH_URL environment variable will be used. -- `cloudid` (optional): - [ID](https://www.elastic.co/guide/en/cloud/current/ec-cloud-id.html) of the - Elastic Cloud Cluster to publish events to. The `cloudid` can be used instead - of `endpoints`. -- `num_workers` (default=runtime.NumCPU()): Number of workers publishing bulk requests concurrently. -- `index` (DEPRECATED, please use `logs_index` for logs, `traces_index` for traces): The - [index](https://www.elastic.co/guide/en/elasticsearch/reference/current/indices.html) - or [data stream](https://www.elastic.co/guide/en/elasticsearch/reference/current/data-streams.html) - name to publish events to. The default value is `logs-generic-default`. -- `logs_index`: The - [index](https://www.elastic.co/guide/en/elasticsearch/reference/current/indices.html) - or [data stream](https://www.elastic.co/guide/en/elasticsearch/reference/current/data-streams.html) - name to publish events to. The default value is `logs-generic-default` -- `logs_dynamic_index` (optional): - takes resource or log record attribute named `elasticsearch.index.prefix` and `elasticsearch.index.suffix` - resulting dynamically prefixed / suffixed indexing based on `logs_index`. (priority: resource attribute > log record attribute) - - `enabled`(default=false): Enable/Disable dynamic index for log records -- `traces_index`: The - [index](https://www.elastic.co/guide/en/elasticsearch/reference/current/indices.html) - or [data stream](https://www.elastic.co/guide/en/elasticsearch/reference/current/data-streams.html) - name to publish traces to. The default value is `traces-generic-default`. -- `traces_dynamic_index` (optional): - takes resource or span attribute named `elasticsearch.index.prefix` and `elasticsearch.index.suffix` - resulting dynamically prefixed / suffixed indexing based on `traces_index`. (priority: resource attribute > span attribute) - - `enabled`(default=false): Enable/Disable dynamic index for trace spans -- `logstash_format` (optional): Logstash format compatibility. Traces or Logs data can be written into an index in logstash format. - - `enabled`(default=false): Enable/Disable Logstash format compatibility. When `logstash_format.enabled` is `true`, the index name is composed using `traces/logs_index` or `traces/logs_dynamic_index` as prefix and the date, - e.g: If `traces/logs_index` or `traces/logs_dynamic_index` is equals to `otlp-generic-default` your index will become `otlp-generic-default-YYYY.MM.DD`. - The last string appended belongs to the date when the data is being generated. +Exactly one of the following settings is required: + +- `endpoint` (no default): The target Elasticsearch URL to which data will be sent + (e.g. `https://elasticsearch:9200`) +- `endpoints` (no default): A list of Elasticsearch URLs to which data will be sent, + attempted in round-robin order +- `cloudid` (no default): The [Elastic Cloud ID](https://www.elastic.co/guide/en/cloud/current/ec-cloud-id.html) + of the Elastic Cloud Cluster to which data will be sent (e.g. `foo:YmFyLmNsb3VkLmVzLmlvJGFiYzEyMyRkZWY0NTY=`) + +When the above settings are missing, `endpoints` will default to the +comma-separated `ELASTICSEARCH_URL` environment variable. + +Elasticsearch credentials may be configured via [Authentication configuration][configauth] settings. +As a shortcut, the following settings are also supported: + +- `user` (optional): Username used for HTTP Basic Authentication. +- `password` (optional): Password used for HTTP Basic Authentication. +- `api_key` (optional): [Elasticsearch API Key] in "encoded" format. + +Example: + +```yaml +exporters: + elasticsearch: + endpoint: https://elastic.example.com:9200 + auth: + authenticator: basicauth + +extensions: + basicauth: + client_auth: + username: elastic + password: changeme + +······ + +service: + extensions: [basicauth] + pipelines: + logs: + receivers: [otlp] + processors: [batch] + exporters: [elasticsearch] + traces: + receivers: [otlp] + processors: [batch] + exporters: [elasticsearch] +``` + +## Advanced configuration + +### HTTP settings + +The Elasticsearch exporter supports common [HTTP Configuration Settings][confighttp]. Gzip compression is enabled by default. To disable compression, set `compression` to `none`. +As a consequence of supporting [confighttp], the Elasticsearch exporter also supports common [TLS Configuration Settings][configtls]. + +The Elasticsearch exporter sets `timeout` (HTTP request timeout) to 90s by default. +All other defaults are as defined by [confighttp]. + +### Queuing + +The Elasticsearch exporter supports the common [`sending_queue` settings][exporterhelper]. However, the sending queue is currently disabled by default. + +### Batching + +> [!WARNING] +> The `batcher` config is experimental and may change without notice. + +The Elasticsearch exporter supports the [common `batcher` settings](https://github.com/open-telemetry/opentelemetry-collector/blob/main/exporter/exporterbatcher/config.go). + +- `batcher`: + - `enabled` (default=unset): Enable batching of requests into 1 or more bulk requests. On a batcher flush, it is possible for a batched request to be translated to more than 1 bulk request due to `flush::bytes`. + - `min_size_items` (default=5000): Minimum number of log records / spans / data points in the batched request to immediately trigger a batcher flush. + - `max_size_items` (default=0): Maximum number of log records / spans / data points in a batched request. To limit bulk request size, configure `flush::bytes` instead. :warning: It is recommended to keep `max_size_items` as 0 as a non-zero value may lead to broken metrics grouping and indexing rejections. + - `flush_timeout` (default=30s): Maximum time of the oldest item spent inside the batcher buffer, aka "max age of batcher buffer". A batcher flush will happen regardless of the size of content in batcher buffer. + +By default, the exporter will perform its own buffering and batching, as configured through the +`flush` config, and `batcher` will be unused. By setting `batcher::enabled` to either `true` or +`false`, the exporter will not perform any of its own buffering or batching, and the `flush::interval` config +will be ignored. +In a future release when the `batcher` config is stable, and has feature parity +with the exporter's existing `flush` config, it will be enabled by default. + +Using the common `batcher` functionality provides several benefits over the default behavior: + - Combined with a persistent queue, or no queue at all, `batcher` enables at least once delivery. + With the default behavior, the exporter will accept data and process it asynchronously, + which interacts poorly with queuing. + - By ensuring the exporter makes requests to Elasticsearch synchronously, + client metadata can be passed through to Elasticsearch requests, + e.g. by using the [`headers_setter` extension](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/extension/headerssetterextension/README.md). + +### Elasticsearch document routing + +Telemetry data will be written to signal specific data streams by default: +logs to `logs-generic-default`, metrics to `metrics-generic-default`, and traces to `traces-generic-default`. +This can be customised through the following settings: + +- `index` (DEPRECATED, please use `logs_index` for logs, `metrics_index` for metrics, `traces_index` for traces): The [index] or [data stream] name to publish events to. + The default value is `logs-generic-default`. + +- `logs_index`: The [index] or [data stream] name to publish events to. The default value is `logs-generic-default` + +- `logs_dynamic_index` (optional): uses resource, scope, or log record attributes to dynamically construct index name. + - `enabled`(default=false): Enable/Disable dynamic index for log records. If `data_stream.dataset` or `data_stream.namespace` exist in attributes (precedence: log record attribute > scope attribute > resource attribute), they will be used to dynamically construct index name in the form `logs-${data_stream.dataset}-${data_stream.namespace}`. Otherwise, if + `elasticsearch.index.prefix` or `elasticsearch.index.suffix` exist in attributes (precedence: resource attribute > scope attribute > log record attribute), they will be used to dynamically construct index name in the form `${elasticsearch.index.prefix}${logs_index}${elasticsearch.index.suffix}`. Otherwise, if scope name matches regex `/receiver/(\w*receiver)`, `data_stream.dataset` will be capture group #1. Otherwise, the index name falls back to `logs-generic-default`, and `logs_index` config will be ignored. Except for prefix/suffix attribute presence, the resulting docs will contain the corresponding `data_stream.*` fields, see restrictions applied to [Data Stream Fields](https://www.elastic.co/guide/en/ecs/current/ecs-data_stream.html). + +- `metrics_index` (optional): The [index] or [data stream] name to publish metrics to. The default value is `metrics-generic-default`. + ⚠️ Note that metrics support is currently in development. + +- `metrics_dynamic_index` (optional): uses resource, scope or data point attributes to dynamically construct index name. + ⚠️ Note that metrics support is currently in development. + - `enabled`(default=true): Enable/disable dynamic index for metrics. If `data_stream.dataset` or `data_stream.namespace` exist in attributes (precedence: data point attribute > scope attribute > resource attribute), they will be used to dynamically construct index name in the form `metrics-${data_stream.dataset}-${data_stream.namespace}`. Otherwise, if + `elasticsearch.index.prefix` or `elasticsearch.index.suffix` exist in attributes (precedence: resource attribute > scope attribute > data point attribute), they will be used to dynamically construct index name in the form `${elasticsearch.index.prefix}${metrics_index}${elasticsearch.index.suffix}`. Otherwise, if scope name matches regex `/receiver/(\w*receiver)`, `data_stream.dataset` will be capture group #1. Otherwise, the index name falls back to `metrics-generic-default`, and `metrics_index` config will be ignored. Except for prefix/suffix attribute presence, the resulting docs will contain the corresponding `data_stream.*` fields, see restrictions applied to [Data Stream Fields](https://www.elastic.co/guide/en/ecs/current/ecs-data_stream.html). + +- `traces_index`: The [index] or [data stream] name to publish traces to. The default value is `traces-generic-default`. + +- `traces_dynamic_index` (optional): uses resource, scope, or span attributes to dynamically construct index name. + - `enabled`(default=false): Enable/Disable dynamic index for trace spans. If `data_stream.dataset` or `data_stream.namespace` exist in attributes (precedence: span attribute > scope attribute > resource attribute), they will be used to dynamically construct index name in the form `traces-${data_stream.dataset}-${data_stream.namespace}`. Otherwise, if + `elasticsearch.index.prefix` or `elasticsearch.index.suffix` exist in attributes (precedence: resource attribute > scope attribute > span attribute), they will be used to dynamically construct index name in the form `${elasticsearch.index.prefix}${traces_index}${elasticsearch.index.suffix}`. Otherwise, if scope name matches regex `/receiver/(\w*receiver)`, `data_stream.dataset` will be capture group #1. Otherwise, the index name falls back to `traces-generic-default`, and `traces_index` config will be ignored. Except for prefix/suffix attribute presence, the resulting docs will contain the corresponding `data_stream.*` fields, see restrictions applied to [Data Stream Fields](https://www.elastic.co/guide/en/ecs/current/ecs-data_stream.html). There is an exception for span events under OTel mapping mode (`mapping::mode: otel`), where span event attributes instead of span attributes are considered, and `data_stream.type` is always `logs` instead of `traces` such that documents are routed to `logs-${data_stream.dataset}-${data_stream.namespace}`. + +- `logstash_format` (optional): Logstash format compatibility. Logs, metrics and traces can be written into an index in Logstash format. + - `enabled`(default=false): Enable/disable Logstash format compatibility. When `logstash_format.enabled` is `true`, the index name is composed using `(logs|metrics|traces)_index` or `(logs|metrics|traces)_dynamic_index` as prefix and the date as suffix, + e.g: If `logs_index` or `logs_dynamic_index` is equal to `logs-generic-default`, your index will become `logs-generic-default-YYYY.MM.DD`. + The last string appended belongs to the date when the data is being generated. - `prefix_separator`(default=`-`): Set a separator between logstash_prefix and date. - `date_format`(default=`%Y.%m.%d`): Time format (based on strftime) to generate the second part of the Index name. -- `pipeline` (optional): Optional [Ingest pipeline](https://www.elastic.co/guide/en/elasticsearch/reference/current/ingest.html) ID used for processing documents published by the exporter. -- `flush`: Event bulk indexer buffer flush settings - - `bytes` (default=5000000): Write buffer flush size limit. - - `interval` (default=30s): Write buffer flush time limit. -- `retry`: Elasticsearch bulk request retry settings - - `enabled` (default=true): Enable/Disable request retry on error. Failed requests are retried with exponential backoff. - - `max_requests` (default=3): Number of HTTP request retries. - - `initial_interval` (default=100ms): Initial waiting time if a HTTP request failed. - - `max_interval` (default=1m): Max waiting time if a HTTP request failed. - - `retry_on_status` (default=[429, 500, 502, 503, 504]): Status codes that trigger request or document level retries. Request level retry and document level retry status codes are shared and cannot be configured separately. To avoid duplicates, it is recommended to set it to `[429]`. WARNING: The default will be changed to `[429]` in the future. + +### Elasticsearch document mapping + +The Elasticsearch exporter supports several document schemas and preprocessing +behaviours, which may be configured through the following settings: + - `mapping`: Events are encoded to JSON. The `mapping` allows users to configure additional mapping rules. - `mode` (default=none): The fields naming mode. valid modes are: - `none`: Use original fields and event structure from the OTLP event. - - `ecs`: Try to map fields defined in the - [OpenTelemetry Semantic Conventions](https://github.com/open-telemetry/semantic-conventions) (version 1.22.0) - to [Elastic Common Schema (ECS)](https://www.elastic.co/guide/en/ecs/current/index.html). :warning: This mode's behavior is unstable, it is currently undergoing changes + - `ecs`: Try to map fields to [Elastic Common Schema (ECS)][ECS] + - `otel`: Elastic's preferred "OTel-native" mapping mode. Uses original fields and event structure from the OTLP event. + - :warning: This mode's behavior is unstable, it is currently experimental and undergoing changes. + - There's a special treatment for the following attributes: `data_stream.type`, `data_stream.dataset`, `data_stream.namespace`. Instead of serializing these values under the `*attributes.*` namespace, they're put at the root of the document, to conform with the conventions of the data stream naming scheme that maps these as `constant_keyword` fields. + - `data_stream.dataset` will always be appended with `.otel`. It is recommended to use with `*_dynamic_index.enabled: true` to route documents to data stream `${data_stream.type}-${data_stream.dataset}-${data_stream.namespace}`. + - Span events are stored in separate documents. They will be routed with `data_stream.type` set to `logs` if `traces_dynamic_index::enabled` is `true`. + - `raw`: Omit the `Attributes.` string prefixed to field names for log and span attributes as well as omit the `Events.` string prefixed to - field names for span events. - - `fields` (optional): Configure additional fields mappings. - - `file` (optional): Read additional field mappings from the provided YAML file. - - `dedup` (default=true): Try to find and remove duplicate fields/attributes - from events before publishing to Elasticsearch. Some structured logging - libraries can produce duplicate fields (for example zap). Elasticsearch - will reject documents that have duplicate fields. - - `dedot` (default=true): When enabled attributes with `.` will be split into - proper json objects. -- `sending_queue` - - `enabled` (default = false) - - `num_consumers` (default = 10): Number of consumers that dequeue batches; ignored if `enabled` is `false` - - `queue_size` (default = 1000): Maximum number of batches kept in queue; ignored if `enabled` is `false`; -### HTTP settings + field names for span events. + - `bodymap`: Provides fine-grained control over the final documents to be ingested. + :warning: This mode's behavior is unstable, it is currently experimental and undergoing changes. + It works only for logs where the log record body is a map. Each LogRecord + body is serialized to JSON as-is and becomes a separate document for ingestion. + If the log record body is not a map, the exporter will log a warning and drop the log record. + - `dedup` (DEPRECATED). This configuration is deprecated and non-operational, + and will be removed in the future. Object keys are always deduplicated to + avoid Elasticsearch rejecting documents. + - `dedot` (default=true; DEPRECATED, in future dedotting will always be enabled + for ECS mode, and never for other modes): When enabled attributes with `.` + will be split into proper json objects. -- `read_buffer_size` (default=0): Read buffer size of HTTP client. -- `write_buffer_size` (default=0): Write buffer size of HTTP client. -- `timeout` (default=90s): HTTP request time limit. -- `headers` (optional): Headers to be sent with each HTTP request. +#### ECS mapping mode -### Security and Authentication settings +> [!WARNING] +> The ECS mode mapping mode is currently undergoing changes, and its behaviour is unstable. -- `user` (optional): Username used for HTTP Basic Authentication. -- `password` (optional): Password used for HTTP Basic Authentication. -- `api_key` (optional): Authorization [API Key](https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html) in "encoded" format. +In ECS mapping mode, the Elasticsearch Exporter attempts to map fields from +[OpenTelemetry Semantic Conventions][SemConv] (version 1.22.0) to [Elastic Common Schema][ECS]. +This mode may be used for compatibility with existing dashboards that work with ECS. -### TLS settings -- `ca_file` (optional): Root Certificate Authority (CA) certificate, for - verifying the server's identity, if TLS is enabled. -- `cert_file` (optional): Client TLS certificate. -- `key_file` (optional): Client TLS key. -- `insecure` (optional): In gRPC when set to true, this is used to disable the client transport security. In HTTP, this disables verifying the server's certificate chain and host name. -- `insecure_skip_verify` (optional): Will enable TLS but not verify the certificate. +### Elasticsearch ingest pipeline -### Node Discovery +Documents may be optionally passed through an [Elasticsearch Ingest pipeline] prior to indexing. +This can be configured through the following settings: -The Elasticsearch Exporter will check Elasticsearch regularly for available -nodes and updates the list of hosts if discovery is enabled. Newly discovered -nodes will automatically be used for load balancing. +- `pipeline` (optional): ID of an [Elasticsearch Ingest pipeline] used for processing documents published by the exporter. + +### Elasticsearch bulk indexing + +The Elasticsearch exporter uses the [Elasticsearch Bulk API] for indexing documents. +The behaviour of this bulk indexing can be configured with the following settings: + +- `num_workers` (default=runtime.NumCPU()): Number of workers publishing bulk requests concurrently. +- `flush`: Event bulk indexer buffer flush settings + - `bytes` (default=5000000): Write buffer flush size limit before compression. A bulk request will be sent immediately when its buffer exceeds this limit. This value should be much lower than [Elasticsearch's `http.max_content_length`](https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-network.html#http-settings) config to avoid HTTP 413 Entity Too Large error. It is recommended to keep this value under 5MB. + - `interval` (default=30s): Write buffer flush time limit. +- `retry`: Elasticsearch bulk request retry settings + - `enabled` (default=true): Enable/Disable request retry on error. Failed requests are retried with exponential backoff. + - `max_requests` (DEPRECATED, use retry::max_retries instead): Number of HTTP request retries including the initial attempt. If used, `retry::max_retries` will be set to `max_requests - 1`. + - `max_retries` (default=2): Number of HTTP request retries. To disable retries, set `retry::enabled` to `false` instead of setting `max_retries` to `0`. + - `initial_interval` (default=100ms): Initial waiting time if a HTTP request failed. + - `max_interval` (default=1m): Max waiting time if a HTTP request failed. + - `retry_on_status` (default=[429]): Status codes that trigger request or document level retries. Request level retry and document level retry status codes are shared and cannot be configured separately. To avoid duplicates, it defaults to `[429]`. + +> [!NOTE] +> The `flush::interval` config will be ignored when `batcher::enabled` config is explicitly set to `true` or `false`. + +### Elasticsearch node discovery + +The Elasticsearch Exporter will regularly check Elasticsearch for available nodes. +Newly discovered nodes will automatically be used for load balancing. +Settings related to node discovery are: - `discover`: - `on_start` (optional): If enabled the exporter queries Elasticsearch for all known nodes in the cluster on startup. - `interval` (optional): Interval to update the list of Elasticsearch nodes. -## Example +Node discovery can be disabled by setting `discover.interval` to 0. -```yaml -exporters: - elasticsearch/trace: - endpoints: [https://elastic.example.com:9200] - traces_index: trace_index - elasticsearch/log: - endpoints: [http://localhost:9200] - logs_index: my_log_index - sending_queue: - enabled: true - num_consumers: 20 - queue_size: 1000 -······ -service: - pipelines: - logs: - receivers: [otlp] - processors: [batch] - exporters: [elasticsearch/log] - traces: - receivers: [otlp] - exporters: [elasticsearch/trace] - processors: [batch] -``` +### Telemetry settings + +The Elasticsearch Exporter's own telemetry settings for testing and debugging purposes. + +⚠️ This is experimental and may change at any time. + +- `telemetry`: + - `log_request_body` (default=false): Logs Elasticsearch client request body as a field in a log line at DEBUG level. It requires `service::telemetry::logs::level` to be set to `debug`. WARNING: Enabling this config may expose sensitive data. + - `log_response_body` (default=false): Logs Elasticsearch client response body as a field in a log line at DEBUG level. It requires `service::telemetry::logs::level` to be set to `debug`. WARNING: Enabling this config may expose sensitive data. + +## Exporting metrics + +Metrics support is currently in development. +The metric types supported are: + +- Gauge +- Sum +- Histogram (Delta temporality only) +- Exponential histogram (Delta temporality only) +- Summary + +[confighttp]: https://github.com/open-telemetry/opentelemetry-collector/tree/main/config/confighttp/README.md#http-configuration-settings +[configtls]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/config/configtls/README.md#tls-configuration-settings +[configauth]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/config/configauth/README.md#authentication-configuration +[exporterhelper]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/exporter/exporterhelper/README.md +[Elasticsearch Ingest pipeline]: https://www.elastic.co/guide/en/elasticsearch/reference/current/ingest.html +[Elasticsearch Bulk API]: https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html +[Elasticsearch API Key]: https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html +[index]: https://www.elastic.co/guide/en/elasticsearch/reference/current/indices.html +[data stream]: https://www.elastic.co/guide/en/elasticsearch/reference/current/data-streams.html +[ecs]: https://www.elastic.co/guide/en/ecs/current/index.html +[SemConv]: https://github.com/open-telemetry/semantic-conventions + + +## ECS Mapping + +`elasticsearchexporter` follows ECS mapping defined here: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/logs/data-model-appendix.md#elastic-common-schema + +When `mode` is set to `ecs`, `elasticsearchexporter` performs conversions for resource-level attributes from their Semantic Conventions (SemConv) names to equivalent Elastic Common Schema (ECS) names. + +If the target ECS field name is specified as an empty string (""), the converter will neither convert the SemConv key to the equivalent ECS name nor pass through the SemConv key as-is to become the ECS name. + +When "Preserved" is true, the attribute will be preserved in the payload and duplicated as mapped to its ECS equivalent. + +| Semantic Convention Name | ECS Name | Preserve | +|--------------------------|-----------------------------|----------| +| cloud.platform | cloud.service.name | false | +| container.image.tags | container.image.tag | false | +| deployment.environment | service.environment | false | +| host.arch | host.architecture | false | +| host.name | host.hostname | true | +| k8s.cluster.name | orchestrator.cluster.name | false | +| k8s.container.name | kubernetes.container.name | false | +| k8s.cronjob.name | kubernetes.cronjob.name | false | +| k8s.daemonset.name | kubernetes.daemonset.name | false | +| k8s.deployment.name | kubernetes.deployment.name | false | +| k8s.job.name | kubernetes.job.name | false | +| k8s.namespace.name | kubernetes.namespace | false | +| k8s.node.name | kubernetes.node.name | false | +| k8s.pod.name | kubernetes.pod.name | false | +| k8s.pod.uid | kubernetes.pod.uid | false | +| k8s.replicaset.name | kubernetes.replicaset.name | false | +| k8s.statefulset.name | kubernetes.statefulset.name | false | +| os.description | host.os.full | false | +| os.name | host.os.name | false | +| os.type | host.os.platform | false | +| os.version | host.os.version | false | +| process.executable.path | process.executable | false | +| process.runtime.name | service.runtime.name | false | +| process.runtime.version | service.runtime.version | false | +| service.instance.id | service.node.name | false | +| telemetry.distro.name | "" | false | +| telemetry.distro.version | "" | false | +| telemetry.sdk.language | "" | false | +| telemetry.sdk.name | "" | false | +| telemetry.sdk.version | "" | false | + +### Compound Mapping + +There are ECS fields that are not mapped easily 1 to 1 but require more advanced logic. + +#### `agent.name` + +The agent name takes the form of a compound name consisting of 3 components: +- `telemetry.sdk.name` or, if not present, defaults to `otlp`, +- `telemetry.sdk.language`, defaulting to `unknown` in case it is missing, +- `telemetry.distro.name`, which is allowed to be empty. + +These values are all valid: + +| `telemetry.sdk.name` | `telemetry.sdk.language` | `telemetry.distro.name` | `agent.name` | +|----------------------|--------------------------|-------------------------|------------------------| +| "" | "" | "" | `otlp/unknown` | +| "" | dotnet | "" | `otlp/dotnet` | +| opentelemetry | dotnet | "" | `opentelemetry/dotnet` | +| "" | java | parts-unlimited-java | `otlp/java/parts-unlimited-java` | +| "" | "" | parts-unlimited-java | `otlp/unknown/parts-unlimited-java` | + +#### `agent.version` + +Takes the value of `telemetry.distro.version` or `telemetry.sdk.version`. If both telemetry.distro.version and telemetry.sdk.version are present, telemetry.distro.version takes precedence. + +#### `host.os.type` + +Maps values of `os.type` in the following manner: + +| SemConv Value | ECS Value | +|---------------|-----------| +| windows | windows | +| linux | linux | +| darwin | macos | +| aix | unix | +| hpux | unix | +| solaris | unix | + +In case `os.name` is present and falls within the specified range of values: + +| SemConv Value | ECS Value | +|---------------|-----------| +| Android | android | +| iOS | ios | + +Otherwise, it is mapped to an empty string (""). + +#### `@timestamp` + +In case the record contains `timestamp`, this value is used. Otherwise, the `observed timestamp` is used. + +## Known issues + +### version_conflict_engine_exception + +When sending high traffic of metrics to a TSDB metrics data stream, e.g. using OTel mapping mode to a 8.16 Elasticsearch, it is possible to get error logs "failed to index document" with `error.type` "version_conflict_engine_exception" and `error.reason` containing "version conflict, document already exists". It is due to Elasticsearch grouping metrics with the same dimensions, whether it is the same or different metric name, using `@timestamp` in milliseconds precision as opposed to nanoseconds in elasticsearchexporter. + +This will be fixed in a future version of Elasticsearch. A possible workaround would be to use a transform processor to truncate the timestamp, but this will cause duplicate data to be dropped silently. + +However, if `@timestamp` precision is not the problem, check your metrics pipeline setup for misconfiguration that causes an actual violation of the [single writer principle](https://opentelemetry.io/docs/specs/otel/metrics/data-model/#single-writer). \ No newline at end of file diff --git a/exporter/elasticsearchexporter/attribute.go b/exporter/elasticsearchexporter/attribute.go index 311b4ace84d1..369e885e22cc 100644 --- a/exporter/elasticsearchexporter/attribute.go +++ b/exporter/elasticsearchexporter/attribute.go @@ -7,33 +7,23 @@ import "go.opentelemetry.io/collector/pdata/pcommon" // dynamic index attribute key constants const ( - indexPrefix = "elasticsearch.index.prefix" - indexSuffix = "elasticsearch.index.suffix" + indexPrefix = "elasticsearch.index.prefix" + indexSuffix = "elasticsearch.index.suffix" + dataStreamDataset = "data_stream.dataset" + dataStreamNamespace = "data_stream.namespace" + dataStreamType = "data_stream.type" + defaultDataStreamDataset = "generic" + defaultDataStreamNamespace = "default" + defaultDataStreamTypeLogs = "logs" + defaultDataStreamTypeMetrics = "metrics" + defaultDataStreamTypeTraces = "traces" ) -// resource is higher priotized than record attribute -type attrGetter interface { - Attributes() pcommon.Map -} - -// retrieve attribute out of resource, scope, and record (span or log, if not found in resource) -func getFromAttributes(name string, resource, scope, record attrGetter) string { - var str string - val, exist := resource.Attributes().Get(name) - if !exist { - val, exist = scope.Attributes().Get(name) - if !exist { - val, exist = record.Attributes().Get(name) - if exist { - str = val.AsString() - } +func getFromAttributes(name string, defaultValue string, attributeMaps ...pcommon.Map) (string, bool) { + for _, attributeMap := range attributeMaps { + if value, exists := attributeMap.Get(name); exists { + return value.AsString(), true } - if exist { - str = val.AsString() - } - } - if exist { - str = val.AsString() } - return str + return defaultValue, false } diff --git a/exporter/elasticsearchexporter/bulkindexer.go b/exporter/elasticsearchexporter/bulkindexer.go new file mode 100644 index 000000000000..2200216be4ef --- /dev/null +++ b/exporter/elasticsearchexporter/bulkindexer.go @@ -0,0 +1,356 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package elasticsearchexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter" + +import ( + "compress/gzip" + "context" + "errors" + "io" + "runtime" + "strings" + "sync" + "sync/atomic" + "time" + + "github.com/elastic/go-docappender/v2" + "github.com/elastic/go-elasticsearch/v7" + "go.opentelemetry.io/collector/config/configcompression" + "go.uber.org/zap" +) + +type bulkIndexer interface { + // StartSession starts a new bulk indexing session. + StartSession(context.Context) (bulkIndexerSession, error) + + // Close closes the bulk indexer, ending any in-progress + // sessions and stopping any background processing. + Close(ctx context.Context) error +} + +type bulkIndexerSession interface { + // Add adds a document to the bulk indexing session. + Add(ctx context.Context, index string, document io.WriterTo, dynamicTemplates map[string]string) error + + // End must be called on the session object once it is no longer + // needed, in order to release any associated resources. + // + // Note that ending the session does _not_ implicitly flush + // documents. Call Flush before calling End as needed. + // + // Calling other methods (including End) after End may panic. + End() + + // Flush flushes any documents added to the bulk indexing session. + // + // The behavior of Flush depends on whether the bulk indexer is + // synchronous or asynchronous. Calling Flush on an asynchronous bulk + // indexer session is effectively a no-op; flushing will be done in + // the background. Calling Flush on a synchronous bulk indexer session + // will wait for bulk indexing of added documents to complete, + // successfully or not. + Flush(context.Context) error +} + +const defaultMaxRetries = 2 + +func newBulkIndexer(logger *zap.Logger, client *elasticsearch.Client, config *Config) (bulkIndexer, error) { + if config.Batcher.Enabled != nil { + return newSyncBulkIndexer(logger, client, config), nil + } + return newAsyncBulkIndexer(logger, client, config) +} + +func bulkIndexerConfig(client *elasticsearch.Client, config *Config) docappender.BulkIndexerConfig { + var maxDocRetries int + if config.Retry.Enabled { + maxDocRetries = defaultMaxRetries + if config.Retry.MaxRetries != 0 { + maxDocRetries = config.Retry.MaxRetries + } + } + var compressionLevel int + if config.Compression == configcompression.TypeGzip { + compressionLevel = gzip.BestSpeed + } + return docappender.BulkIndexerConfig{ + Client: client, + MaxDocumentRetries: maxDocRetries, + Pipeline: config.Pipeline, + RetryOnDocumentStatus: config.Retry.RetryOnStatus, + RequireDataStream: config.MappingMode() == MappingOTel, + CompressionLevel: compressionLevel, + } +} + +func newSyncBulkIndexer(logger *zap.Logger, client *elasticsearch.Client, config *Config) *syncBulkIndexer { + return &syncBulkIndexer{ + config: bulkIndexerConfig(client, config), + flushTimeout: config.Timeout, + flushBytes: config.Flush.Bytes, + retryConfig: config.Retry, + logger: logger, + } +} + +type syncBulkIndexer struct { + config docappender.BulkIndexerConfig + flushTimeout time.Duration + flushBytes int + retryConfig RetrySettings + logger *zap.Logger +} + +// StartSession creates a new docappender.BulkIndexer, and wraps +// it with a syncBulkIndexerSession. +func (s *syncBulkIndexer) StartSession(context.Context) (bulkIndexerSession, error) { + bi, err := docappender.NewBulkIndexer(s.config) + if err != nil { + return nil, err + } + return &syncBulkIndexerSession{ + s: s, + bi: bi, + }, nil +} + +// Close is a no-op. +func (s *syncBulkIndexer) Close(context.Context) error { + return nil +} + +type syncBulkIndexerSession struct { + s *syncBulkIndexer + bi *docappender.BulkIndexer +} + +// Add adds an item to the sync bulk indexer session. +func (s *syncBulkIndexerSession) Add(ctx context.Context, index string, document io.WriterTo, dynamicTemplates map[string]string) error { + err := s.bi.Add(docappender.BulkIndexerItem{Index: index, Body: document, DynamicTemplates: dynamicTemplates}) + if err != nil { + return err + } + // flush bytes should operate on uncompressed length + // as Elasticsearch http.max_content_length measures uncompressed length. + if s.bi.UncompressedLen() >= s.s.flushBytes { + return s.Flush(ctx) + } + return nil +} + +// End is a no-op. +func (s *syncBulkIndexerSession) End() { + // TODO acquire docappender.BulkIndexer from pool in StartSession, release here +} + +// Flush flushes documents added to the bulk indexer session. +func (s *syncBulkIndexerSession) Flush(ctx context.Context) error { + var retryBackoff func(int) time.Duration + for attempts := 0; ; attempts++ { + if _, err := flushBulkIndexer(ctx, s.bi, s.s.flushTimeout, s.s.logger); err != nil { + return err + } + if s.bi.Items() == 0 { + // No documents in buffer waiting for per-document retry, exit retry loop. + return nil + } + if retryBackoff == nil { + retryBackoff = createElasticsearchBackoffFunc(&s.s.retryConfig) + if retryBackoff == nil { + // BUG: This should never happen in practice. + // When retry is disabled / document level retry limit is reached, + // documents should go into FailedDocs instead of indexer buffer. + return errors.New("bulk indexer contains documents pending retry but retry is disabled") + } + } + backoff := retryBackoff(attempts + 1) // TODO: use exporterhelper retry_sender + timer := time.NewTimer(backoff) + select { + case <-ctx.Done(): + timer.Stop() + return ctx.Err() + case <-timer.C: + } + } +} + +func newAsyncBulkIndexer(logger *zap.Logger, client *elasticsearch.Client, config *Config) (*asyncBulkIndexer, error) { + numWorkers := config.NumWorkers + if numWorkers == 0 { + numWorkers = runtime.NumCPU() + } + + pool := &asyncBulkIndexer{ + wg: sync.WaitGroup{}, + items: make(chan docappender.BulkIndexerItem, config.NumWorkers), + stats: bulkIndexerStats{}, + } + pool.wg.Add(numWorkers) + + for i := 0; i < numWorkers; i++ { + bi, err := docappender.NewBulkIndexer(bulkIndexerConfig(client, config)) + if err != nil { + return nil, err + } + w := asyncBulkIndexerWorker{ + indexer: bi, + items: pool.items, + flushInterval: config.Flush.Interval, + flushTimeout: config.Timeout, + flushBytes: config.Flush.Bytes, + logger: logger, + stats: &pool.stats, + } + go func() { + defer pool.wg.Done() + w.run() + }() + } + return pool, nil +} + +type bulkIndexerStats struct { + docsIndexed atomic.Int64 +} + +type asyncBulkIndexer struct { + items chan docappender.BulkIndexerItem + wg sync.WaitGroup + stats bulkIndexerStats +} + +type asyncBulkIndexerSession struct { + *asyncBulkIndexer +} + +// StartSession returns a new asyncBulkIndexerSession. +func (a *asyncBulkIndexer) StartSession(context.Context) (bulkIndexerSession, error) { + return asyncBulkIndexerSession{a}, nil +} + +// Close closes the asyncBulkIndexer and any active sessions. +func (a *asyncBulkIndexer) Close(ctx context.Context) error { + close(a.items) + doneCh := make(chan struct{}) + go func() { + a.wg.Wait() + close(doneCh) + }() + select { + case <-ctx.Done(): + return ctx.Err() + case <-doneCh: + return nil + } +} + +// Add adds an item to the async bulk indexer session. +// +// Adding an item after a call to Close() will panic. +func (s asyncBulkIndexerSession) Add(ctx context.Context, index string, document io.WriterTo, dynamicTemplates map[string]string) error { + item := docappender.BulkIndexerItem{ + Index: index, + Body: document, + DynamicTemplates: dynamicTemplates, + } + select { + case <-ctx.Done(): + return ctx.Err() + case s.items <- item: + return nil + } +} + +// End is a no-op. +func (s asyncBulkIndexerSession) End() { +} + +// Flush is a no-op. +func (s asyncBulkIndexerSession) Flush(context.Context) error { + return nil +} + +type asyncBulkIndexerWorker struct { + indexer *docappender.BulkIndexer + items <-chan docappender.BulkIndexerItem + flushInterval time.Duration + flushTimeout time.Duration + flushBytes int + + stats *bulkIndexerStats + + logger *zap.Logger +} + +func (w *asyncBulkIndexerWorker) run() { + flushTick := time.NewTicker(w.flushInterval) + defer flushTick.Stop() + for { + select { + case item, ok := <-w.items: + // if channel is closed, flush and return + if !ok { + w.flush() + return + } + + if err := w.indexer.Add(item); err != nil { + w.logger.Error("error adding item to bulk indexer", zap.Error(err)) + } + + // flush bytes should operate on uncompressed length + // as Elasticsearch http.max_content_length measures uncompressed length. + if w.indexer.UncompressedLen() >= w.flushBytes { + w.flush() + flushTick.Reset(w.flushInterval) + } + case <-flushTick.C: + // bulk indexer needs to be flushed every flush interval because + // there may be pending bytes in bulk indexer buffer due to e.g. document level 429 + w.flush() + } + } +} + +func (w *asyncBulkIndexerWorker) flush() { + ctx := context.Background() + stat, _ := flushBulkIndexer(ctx, w.indexer, w.flushTimeout, w.logger) + w.stats.docsIndexed.Add(stat.Indexed) +} + +func flushBulkIndexer( + ctx context.Context, + bi *docappender.BulkIndexer, + timeout time.Duration, + logger *zap.Logger, +) (docappender.BulkIndexerResponseStat, error) { + if timeout > 0 { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, timeout) + defer cancel() + } + stat, err := bi.Flush(ctx) + if err != nil { + logger.Error("bulk indexer flush error", zap.Error(err)) + } + for _, resp := range stat.FailedDocs { + fields := []zap.Field{ + zap.String("index", resp.Index), + zap.String("error.type", resp.Error.Type), + zap.String("error.reason", resp.Error.Reason), + } + if hint := getErrorHint(resp.Index, resp.Error.Type); hint != "" { + fields = append(fields, zap.String("hint", hint)) + } + logger.Error("failed to index document", fields...) + } + return stat, err +} + +func getErrorHint(index, errorType string) string { + if strings.HasPrefix(index, ".ds-metrics-") && errorType == "version_conflict_engine_exception" { + return "check the \"Known issues\" section of Elasticsearch Exporter docs" + } + return "" +} diff --git a/exporter/elasticsearchexporter/bulkindexer_test.go b/exporter/elasticsearchexporter/bulkindexer_test.go new file mode 100644 index 000000000000..2b3d86a30128 --- /dev/null +++ b/exporter/elasticsearchexporter/bulkindexer_test.go @@ -0,0 +1,344 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package elasticsearchexporter + +import ( + "context" + "errors" + "io" + "net/http" + "strings" + "sync/atomic" + "testing" + "time" + + "github.com/elastic/go-elasticsearch/v7" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/config/confighttp" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" + "go.uber.org/zap/zaptest/observer" +) + +var defaultRoundTripFunc = func(*http.Request) (*http.Response, error) { + return &http.Response{ + Body: io.NopCloser(strings.NewReader("{}")), + }, nil +} + +type mockTransport struct { + RoundTripFunc func(*http.Request) (*http.Response, error) +} + +func (t *mockTransport) RoundTrip(req *http.Request) (*http.Response, error) { + if t.RoundTripFunc == nil { + return defaultRoundTripFunc(req) + } + return t.RoundTripFunc(req) +} + +const successResp = `{ + "took": 30, + "errors": false, + "items": [ + { + "create": { + "_index": "foo", + "status": 201 + } + } + ] +}` + +func TestAsyncBulkIndexer_flushOnClose(t *testing.T) { + cfg := Config{NumWorkers: 1, Flush: FlushSettings{Interval: time.Hour, Bytes: 2 << 30}} + client, err := elasticsearch.NewClient(elasticsearch.Config{Transport: &mockTransport{ + RoundTripFunc: func(*http.Request) (*http.Response, error) { + return &http.Response{ + Header: http.Header{"X-Elastic-Product": []string{"Elasticsearch"}}, + Body: io.NopCloser(strings.NewReader(successResp)), + }, nil + }, + }}) + require.NoError(t, err) + + bulkIndexer := runBulkIndexerOnce(t, &cfg, client) + + assert.Equal(t, int64(1), bulkIndexer.stats.docsIndexed.Load()) +} + +func TestAsyncBulkIndexer_flush(t *testing.T) { + tests := []struct { + name string + config Config + }{ + { + name: "flush.bytes", + config: Config{NumWorkers: 1, Flush: FlushSettings{Interval: time.Hour, Bytes: 1}}, + }, + { + name: "flush.interval", + config: Config{NumWorkers: 1, Flush: FlushSettings{Interval: 50 * time.Millisecond, Bytes: 2 << 30}}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + client, err := elasticsearch.NewClient(elasticsearch.Config{Transport: &mockTransport{ + RoundTripFunc: func(*http.Request) (*http.Response, error) { + return &http.Response{ + Header: http.Header{"X-Elastic-Product": []string{"Elasticsearch"}}, + Body: io.NopCloser(strings.NewReader(successResp)), + }, nil + }, + }}) + require.NoError(t, err) + + bulkIndexer, err := newAsyncBulkIndexer(zap.NewNop(), client, &tt.config) + require.NoError(t, err) + session, err := bulkIndexer.StartSession(context.Background()) + require.NoError(t, err) + + assert.NoError(t, session.Add(context.Background(), "foo", strings.NewReader(`{"foo": "bar"}`), nil)) + // should flush + time.Sleep(100 * time.Millisecond) + assert.Equal(t, int64(1), bulkIndexer.stats.docsIndexed.Load()) + assert.NoError(t, bulkIndexer.Close(context.Background())) + }) + } +} + +func TestAsyncBulkIndexer_requireDataStream(t *testing.T) { + tests := []struct { + name string + config Config + wantRequireDataStream bool + }{ + { + name: "ecs", + config: Config{ + NumWorkers: 1, + Mapping: MappingsSettings{Mode: MappingECS.String()}, + Flush: FlushSettings{Interval: time.Hour, Bytes: 1e+8}, + }, + wantRequireDataStream: false, + }, + { + name: "otel", + config: Config{ + NumWorkers: 1, + Mapping: MappingsSettings{Mode: MappingOTel.String()}, + Flush: FlushSettings{Interval: time.Hour, Bytes: 1e+8}, + }, + wantRequireDataStream: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + requireDataStreamCh := make(chan bool, 1) + client, err := elasticsearch.NewClient(elasticsearch.Config{Transport: &mockTransport{ + RoundTripFunc: func(r *http.Request) (*http.Response, error) { + if r.URL.Path == "/_bulk" { + requireDataStreamCh <- r.URL.Query().Get("require_data_stream") == "true" + } + return &http.Response{ + Header: http.Header{"X-Elastic-Product": []string{"Elasticsearch"}}, + Body: io.NopCloser(strings.NewReader(successResp)), + }, nil + }, + }}) + require.NoError(t, err) + + runBulkIndexerOnce(t, &tt.config, client) + + assert.Equal(t, tt.wantRequireDataStream, <-requireDataStreamCh) + }) + } +} + +func TestAsyncBulkIndexer_flush_error(t *testing.T) { + tests := []struct { + name string + roundTripFunc func(*http.Request) (*http.Response, error) + wantMessage string + wantFields []zap.Field + }{ + { + name: "500", + roundTripFunc: func(*http.Request) (*http.Response, error) { + return &http.Response{ + StatusCode: http.StatusInternalServerError, + Header: http.Header{"X-Elastic-Product": []string{"Elasticsearch"}}, + Body: io.NopCloser(strings.NewReader("error")), + }, nil + }, + wantMessage: "bulk indexer flush error", + }, + { + name: "429", + roundTripFunc: func(*http.Request) (*http.Response, error) { + return &http.Response{ + StatusCode: http.StatusTooManyRequests, + Header: http.Header{"X-Elastic-Product": []string{"Elasticsearch"}}, + Body: io.NopCloser(strings.NewReader("error")), + }, nil + }, + wantMessage: "bulk indexer flush error", + }, + { + name: "transport error", + roundTripFunc: func(*http.Request) (*http.Response, error) { + return nil, errors.New("transport error") + }, + wantMessage: "bulk indexer flush error", + }, + { + name: "known version conflict error", + roundTripFunc: func(*http.Request) (*http.Response, error) { + return &http.Response{ + StatusCode: http.StatusOK, + Header: http.Header{"X-Elastic-Product": []string{"Elasticsearch"}}, + Body: io.NopCloser(strings.NewReader( + `{"items":[{"create":{"_index":".ds-metrics-generic.otel-default","status":400,"error":{"type":"version_conflict_engine_exception","reason":""}}}]}`)), + }, nil + }, + wantMessage: "failed to index document", + wantFields: []zap.Field{zap.String("hint", "check the \"Known issues\" section of Elasticsearch Exporter docs")}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + cfg := Config{NumWorkers: 1, Flush: FlushSettings{Interval: time.Hour, Bytes: 1}} + client, err := elasticsearch.NewClient(elasticsearch.Config{Transport: &mockTransport{ + RoundTripFunc: tt.roundTripFunc, + }}) + require.NoError(t, err) + core, observed := observer.New(zap.NewAtomicLevelAt(zapcore.DebugLevel)) + + bulkIndexer, err := newAsyncBulkIndexer(zap.New(core), client, &cfg) + require.NoError(t, err) + defer bulkIndexer.Close(context.Background()) + + session, err := bulkIndexer.StartSession(context.Background()) + require.NoError(t, err) + + assert.NoError(t, session.Add(context.Background(), "foo", strings.NewReader(`{"foo": "bar"}`), nil)) + // should flush + time.Sleep(100 * time.Millisecond) + assert.Equal(t, int64(0), bulkIndexer.stats.docsIndexed.Load()) + messages := observed.FilterMessage(tt.wantMessage) + require.Equal(t, 1, messages.Len(), "message not found; observed.All()=%v", observed.All()) + for _, wantField := range tt.wantFields { + assert.Equal(t, 1, messages.FilterField(wantField).Len(), "message with field not found; observed.All()=%v", observed.All()) + } + }) + } +} + +func TestAsyncBulkIndexer_logRoundTrip(t *testing.T) { + tests := []struct { + name string + config Config + }{ + { + name: "compression none", + config: Config{ + NumWorkers: 1, + ClientConfig: confighttp.ClientConfig{Compression: "none"}, + Flush: FlushSettings{Interval: time.Hour, Bytes: 1e+8}, + }, + }, + { + name: "compression gzip", + config: Config{ + NumWorkers: 1, + ClientConfig: confighttp.ClientConfig{Compression: "gzip"}, + Flush: FlushSettings{Interval: time.Hour, Bytes: 1e+8}, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + loggerCore, logObserver := observer.New(zap.DebugLevel) + + esLogger := clientLogger{ + Logger: zap.New(loggerCore), + logRequestBody: true, + logResponseBody: true, + } + + client, err := elasticsearch.NewClient(elasticsearch.Config{ + Transport: &mockTransport{ + RoundTripFunc: func(*http.Request) (*http.Response, error) { + return &http.Response{ + Header: http.Header{"X-Elastic-Product": []string{"Elasticsearch"}}, + Body: io.NopCloser(strings.NewReader(successResp)), + }, nil + }, + }, + Logger: &esLogger, + }) + require.NoError(t, err) + + runBulkIndexerOnce(t, &tt.config, client) + + records := logObserver.AllUntimed() + assert.Len(t, records, 2) + + assert.Equal(t, "/", records[0].ContextMap()["path"]) + assert.Nil(t, records[0].ContextMap()["request_body"]) + assert.JSONEq(t, successResp, records[0].ContextMap()["response_body"].(string)) + + assert.Equal(t, "/_bulk", records[1].ContextMap()["path"]) + assert.Equal(t, "{\"create\":{\"_index\":\"foo\"}}\n{\"foo\": \"bar\"}\n", records[1].ContextMap()["request_body"]) + assert.JSONEq(t, successResp, records[1].ContextMap()["response_body"].(string)) + }) + } +} + +func runBulkIndexerOnce(t *testing.T, config *Config, client *elasticsearch.Client) *asyncBulkIndexer { + bulkIndexer, err := newAsyncBulkIndexer(zap.NewNop(), client, config) + require.NoError(t, err) + session, err := bulkIndexer.StartSession(context.Background()) + require.NoError(t, err) + + assert.NoError(t, session.Add(context.Background(), "foo", strings.NewReader(`{"foo": "bar"}`), nil)) + assert.NoError(t, bulkIndexer.Close(context.Background())) + + return bulkIndexer +} + +func TestSyncBulkIndexer_flushBytes(t *testing.T) { + var reqCnt atomic.Int64 + cfg := Config{NumWorkers: 1, Flush: FlushSettings{Interval: time.Hour, Bytes: 1}} + client, err := elasticsearch.NewClient(elasticsearch.Config{Transport: &mockTransport{ + RoundTripFunc: func(r *http.Request) (*http.Response, error) { + if r.URL.Path == "/_bulk" { + reqCnt.Add(1) + } + return &http.Response{ + Header: http.Header{"X-Elastic-Product": []string{"Elasticsearch"}}, + Body: io.NopCloser(strings.NewReader(successResp)), + }, nil + }, + }}) + require.NoError(t, err) + + bi := newSyncBulkIndexer(zap.NewNop(), client, &cfg) + session, err := bi.StartSession(context.Background()) + require.NoError(t, err) + + assert.NoError(t, session.Add(context.Background(), "foo", strings.NewReader(`{"foo": "bar"}`), nil)) + assert.Equal(t, int64(1), reqCnt.Load()) // flush due to flush::bytes + assert.NoError(t, bi.Close(context.Background())) +} diff --git a/exporter/elasticsearchexporter/config.go b/exporter/elasticsearchexporter/config.go index 8c3123294ceb..0835396d928f 100644 --- a/exporter/elasticsearchexporter/config.go +++ b/exporter/elasticsearchexporter/config.go @@ -12,14 +12,17 @@ import ( "strings" "time" + "go.opentelemetry.io/collector/config/configcompression" + "go.opentelemetry.io/collector/config/confighttp" "go.opentelemetry.io/collector/config/configopaque" - "go.opentelemetry.io/collector/config/configtls" + "go.opentelemetry.io/collector/exporter/exporterbatcher" "go.opentelemetry.io/collector/exporter/exporterhelper" + "go.uber.org/zap" ) // Config defines configuration for Elastic exporter. type Config struct { - exporterhelper.QueueSettings `mapstructure:"sending_queue"` + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` // Endpoints holds the Elasticsearch URLs the exporter should send events to. // // This setting is required if CloudID is not set and if the @@ -47,6 +50,12 @@ type Config struct { LogsIndex string `mapstructure:"logs_index"` // fall back to pure LogsIndex, if 'elasticsearch.index.prefix' or 'elasticsearch.index.suffix' are not found in resource or attribute (prio: resource > attribute) LogsDynamicIndex DynamicIndexSetting `mapstructure:"logs_dynamic_index"` + + // This setting is required when the exporter is used in a metrics pipeline. + MetricsIndex string `mapstructure:"metrics_index"` + // fall back to pure MetricsIndex, if 'elasticsearch.index.prefix' or 'elasticsearch.index.suffix' are not found in resource attributes + MetricsDynamicIndex DynamicIndexSetting `mapstructure:"metrics_dynamic_index"` + // This setting is required when traces pipelines used. TracesIndex string `mapstructure:"traces_index"` // fall back to pure TracesIndex, if 'elasticsearch.index.prefix' or 'elasticsearch.index.suffix' are not found in resource or attribute (prio: resource > attribute) @@ -58,12 +67,47 @@ type Config struct { // https://www.elastic.co/guide/en/elasticsearch/reference/current/ingest.html Pipeline string `mapstructure:"pipeline"` - ClientConfig `mapstructure:",squash"` - Discovery DiscoverySettings `mapstructure:"discover"` - Retry RetrySettings `mapstructure:"retry"` - Flush FlushSettings `mapstructure:"flush"` - Mapping MappingsSettings `mapstructure:"mapping"` - LogstashFormat LogstashFormatSettings `mapstructure:"logstash_format"` + confighttp.ClientConfig `mapstructure:",squash"` + Authentication AuthenticationSettings `mapstructure:",squash"` + Discovery DiscoverySettings `mapstructure:"discover"` + Retry RetrySettings `mapstructure:"retry"` + Flush FlushSettings `mapstructure:"flush"` + Mapping MappingsSettings `mapstructure:"mapping"` + LogstashFormat LogstashFormatSettings `mapstructure:"logstash_format"` + + // TelemetrySettings contains settings useful for testing/debugging purposes + // This is experimental and may change at any time. + TelemetrySettings `mapstructure:"telemetry"` + + // Batcher holds configuration for batching requests based on timeout + // and size-based thresholds. + // + // Batcher is unused by default, in which case Flush will be used. + // If Batcher.Enabled is non-nil (i.e. batcher::enabled is specified), + // then the Flush will be ignored even if Batcher.Enabled is false. + Batcher BatcherConfig `mapstructure:"batcher"` +} + +// BatcherConfig holds configuration for exporterbatcher. +// +// This is a slightly modified version of exporterbatcher.Config, +// to enable tri-state Enabled: unset, false, true. +type BatcherConfig struct { + // Enabled indicates whether to enqueue batches before sending + // to the exporter. If Enabled is specified (non-nil), + // then the exporter will not perform any buffering itself. + Enabled *bool `mapstructure:"enabled"` + + // FlushTimeout sets the time after which a batch will be sent regardless of its size. + FlushTimeout time.Duration `mapstructure:"flush_timeout"` + + exporterbatcher.MinSizeConfig `mapstructure:",squash"` + exporterbatcher.MaxSizeConfig `mapstructure:",squash"` +} + +type TelemetrySettings struct { + LogRequestBody bool `mapstructure:"log_request_body"` + LogResponseBody bool `mapstructure:"log_response_body"` } type LogstashFormatSettings struct { @@ -76,25 +120,6 @@ type DynamicIndexSetting struct { Enabled bool `mapstructure:"enabled"` } -type ClientConfig struct { - Authentication AuthenticationSettings `mapstructure:",squash"` - - // ReadBufferSize for HTTP client. See http.Transport.ReadBufferSize. - ReadBufferSize int `mapstructure:"read_buffer_size"` - - // WriteBufferSize for HTTP client. See http.Transport.WriteBufferSize. - WriteBufferSize int `mapstructure:"write_buffer_size"` - - // Timeout configures the HTTP request timeout. - Timeout time.Duration `mapstructure:"timeout"` - - // Headers allows users to configure optional HTTP headers that - // will be send with each HTTP request. - Headers map[string]string `mapstructure:"headers,omitempty"` - - configtls.ClientConfig `mapstructure:"tls,omitempty"` -} - // AuthenticationSettings defines user authentication related settings. type AuthenticationSettings struct { // User is used to configure HTTP Basic Authentication. @@ -128,7 +153,7 @@ type DiscoverySettings struct { Interval time.Duration `mapstructure:"interval"` } -// FlushSettings defines settings for configuring the write buffer flushing +// FlushSettings defines settings for configuring the write buffer flushing // policy in the Elasticsearch exporter. The exporter sends a bulk request with // all events already serialized into the send-buffer. type FlushSettings struct { @@ -145,9 +170,13 @@ type RetrySettings struct { // Enabled allows users to disable retry without having to comment out all settings. Enabled bool `mapstructure:"enabled"` - // MaxRequests configures how often an HTTP request is retried before it is assumed to be failed. + // MaxRequests configures how often an HTTP request is attempted before it is assumed to be failed. + // Deprecated: use MaxRetries instead. MaxRequests int `mapstructure:"max_requests"` + // MaxRetries configures how many times an HTTP request is retried. + MaxRetries int `mapstructure:"max_retries"` + // InitialInterval configures the initial waiting time if a request failed. InitialInterval time.Duration `mapstructure:"initial_interval"` @@ -162,15 +191,16 @@ type MappingsSettings struct { // Mode configures the field mappings. Mode string `mapstructure:"mode"` - // Additional field mappings. - Fields map[string]string `mapstructure:"fields"` - - // File to read additional fields mappings from. - File string `mapstructure:"file"` - - // Try to find and remove duplicate fields - Dedup bool `mapstructure:"dedup"` - + // Dedup is non-operational, and will be removed in the future. + // + // Deprecated: [v0.104.0] deduplication is always enabled, and cannot be + // disabled. Disabling deduplication is not meaningful, as Elasticsearch + // will always reject documents with duplicate JSON object keys. + Dedup *bool `mapstructure:"dedup,omitempty"` + + // Deprecated: [v0.104.0] dedotting will always be applied for ECS mode + // in future, and never for other modes. Elasticsearch's "dot_expander" + // Ingest processor may be used as an alternative for non-ECS modes. Dedot bool `mapstructure:"dedot"` } @@ -180,13 +210,14 @@ type MappingMode int const ( MappingNone MappingMode = iota MappingECS + MappingOTel MappingRaw + MappingBodyMap ) var ( - errConfigNoEndpoint = errors.New("endpoints or cloudid must be specified") - errConfigEmptyEndpoint = errors.New("endpoints must not include empty entries") - errConfigCloudIDMutuallyExclusive = errors.New("only one of endpoints or cloudid may be specified") + errConfigEndpointRequired = errors.New("exactly one of [endpoint, endpoints, cloudid] must be specified") + errConfigEmptyEndpoint = errors.New("endpoint must not be empty") ) func (m MappingMode) String() string { @@ -195,8 +226,12 @@ func (m MappingMode) String() string { return "" case MappingECS: return "ecs" + case MappingOTel: + return "otel" case MappingRaw: return "raw" + case MappingBodyMap: + return "bodymap" default: return "" } @@ -207,7 +242,9 @@ var mappingModes = func() map[string]MappingMode { for _, m := range []MappingMode{ MappingNone, MappingECS, + MappingOTel, MappingRaw, + MappingBodyMap, } { table[strings.ToLower(m.String())] = m } @@ -223,31 +260,87 @@ const defaultElasticsearchEnvName = "ELASTICSEARCH_URL" // Validate validates the elasticsearch server configuration. func (cfg *Config) Validate() error { - if len(cfg.Endpoints) == 0 && cfg.CloudID == "" { - if os.Getenv(defaultElasticsearchEnvName) == "" { - return errConfigNoEndpoint + endpoints, err := cfg.endpoints() + if err != nil { + return err + } + for _, endpoint := range endpoints { + if err := validateEndpoint(endpoint); err != nil { + return fmt.Errorf("invalid endpoint %q: %w", endpoint, err) } } + if _, ok := mappingModes[cfg.Mapping.Mode]; !ok { + return fmt.Errorf("unknown mapping mode %q", cfg.Mapping.Mode) + } + + if cfg.Compression != "none" && cfg.Compression != configcompression.TypeGzip { + return errors.New("compression must be one of [none, gzip]") + } + + if cfg.Retry.MaxRequests != 0 && cfg.Retry.MaxRetries != 0 { + return errors.New("must not specify both retry::max_requests and retry::max_retries") + } + if cfg.Retry.MaxRequests < 0 { + return errors.New("retry::max_requests should be non-negative") + } + if cfg.Retry.MaxRetries < 0 { + return errors.New("retry::max_retries should be non-negative") + } + + return nil +} + +func (cfg *Config) endpoints() ([]string, error) { + // Exactly one of endpoint, endpoints, or cloudid must be configured. + // If none are set, then $ELASTICSEARCH_URL may be specified instead. + var endpoints []string + var numEndpointConfigs int + if cfg.Endpoint != "" { + numEndpointConfigs++ + endpoints = []string{cfg.Endpoint} + } + if len(cfg.Endpoints) > 0 { + numEndpointConfigs++ + endpoints = cfg.Endpoints + } if cfg.CloudID != "" { - if len(cfg.Endpoints) > 0 { - return errConfigCloudIDMutuallyExclusive - } - if _, err := parseCloudID(cfg.CloudID); err != nil { - return err + numEndpointConfigs++ + u, err := parseCloudID(cfg.CloudID) + if err != nil { + return nil, err } + endpoints = []string{u.String()} } - - for _, endpoint := range cfg.Endpoints { - if endpoint == "" { - return errConfigEmptyEndpoint + if numEndpointConfigs == 0 { + if v := os.Getenv(defaultElasticsearchEnvName); v != "" { + numEndpointConfigs++ + endpoints = strings.Split(v, ",") + for i, endpoint := range endpoints { + endpoints[i] = strings.TrimSpace(endpoint) + } } } + if numEndpointConfigs != 1 { + return nil, errConfigEndpointRequired + } + return endpoints, nil +} - if _, ok := mappingModes[cfg.Mapping.Mode]; !ok { - return fmt.Errorf("unknown mapping mode %q", cfg.Mapping.Mode) +func validateEndpoint(endpoint string) error { + if endpoint == "" { + return errConfigEmptyEndpoint } + u, err := url.Parse(endpoint) + if err != nil { + return err + } + switch u.Scheme { + case "http", "https": + default: + return fmt.Errorf(`invalid scheme %q, expected "http" or "https"`, u.Scheme) + } return nil } @@ -276,3 +369,17 @@ func parseCloudID(input string) (*url.URL, error) { func (cfg *Config) MappingMode() MappingMode { return mappingModes[cfg.Mapping.Mode] } + +func handleDeprecatedConfig(cfg *Config, logger *zap.Logger) { + if cfg.Mapping.Dedup != nil { + logger.Warn("dedup is deprecated, and is always enabled") + } + if cfg.Mapping.Dedot && cfg.MappingMode() != MappingECS || !cfg.Mapping.Dedot && cfg.MappingMode() == MappingECS { + logger.Warn("dedot has been deprecated: in the future, dedotting will always be performed in ECS mode only") + } + if cfg.Retry.MaxRequests != 0 { + cfg.Retry.MaxRetries = cfg.Retry.MaxRequests - 1 + // Do not set cfg.Retry.Enabled = false if cfg.Retry.MaxRequest = 1 to avoid breaking change on behavior + logger.Warn("retry::max_requests has been deprecated, and will be removed in a future version. Use retry::max_retries instead.") + } +} diff --git a/exporter/elasticsearchexporter/config_test.go b/exporter/elasticsearchexporter/config_test.go index 8ff84a45c027..b83beb3e91ba 100644 --- a/exporter/elasticsearchexporter/config_test.go +++ b/exporter/elasticsearchexporter/config_test.go @@ -6,13 +6,18 @@ package elasticsearchexporter import ( "net/http" "path/filepath" + "strings" "testing" "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configcompression" + "go.opentelemetry.io/collector/config/confighttp" + "go.opentelemetry.io/collector/config/configopaque" "go.opentelemetry.io/collector/confmap/confmaptest" + "go.opentelemetry.io/collector/exporter/exporterbatcher" "go.opentelemetry.io/collector/exporter/exporterhelper" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter/internal/metadata" @@ -32,6 +37,10 @@ func TestConfig(t *testing.T) { defaultRawCfg.(*Config).Endpoints = []string{"http://localhost:9200"} defaultRawCfg.(*Config).Mapping.Mode = "raw" + defaultMaxIdleConns := 100 + defaultIdleConnTimeout := 90 * time.Second + defaultCompression := configcompression.TypeGzip + tests := []struct { configFile string id component.ID @@ -46,43 +55,56 @@ func TestConfig(t *testing.T) { id: component.NewIDWithName(metadata.Type, "trace"), configFile: "config.yaml", expected: &Config{ - QueueSettings: exporterhelper.QueueSettings{ + QueueSettings: exporterhelper.QueueConfig{ Enabled: false, - NumConsumers: exporterhelper.NewDefaultQueueSettings().NumConsumers, - QueueSize: exporterhelper.NewDefaultQueueSettings().QueueSize, + NumConsumers: exporterhelper.NewDefaultQueueConfig().NumConsumers, + QueueSize: exporterhelper.NewDefaultQueueConfig().QueueSize, + }, + Endpoints: []string{"https://elastic.example.com:9200"}, + Index: "", + LogsIndex: "logs-generic-default", + LogsDynamicIndex: DynamicIndexSetting{ + Enabled: false, + }, + MetricsIndex: "metrics-generic-default", + MetricsDynamicIndex: DynamicIndexSetting{ + Enabled: true, }, - Endpoints: []string{"https://elastic.example.com:9200"}, - Index: "", - LogsIndex: "logs-generic-default", TracesIndex: "trace_index", - Pipeline: "mypipeline", - ClientConfig: ClientConfig{ - Authentication: AuthenticationSettings{ - User: "elastic", - Password: "search", - APIKey: "AvFsEiPs==", - }, - Timeout: 2 * time.Minute, - Headers: map[string]string{ + TracesDynamicIndex: DynamicIndexSetting{ + Enabled: false, + }, + Pipeline: "mypipeline", + ClientConfig: withDefaultHTTPClientConfig(func(cfg *confighttp.ClientConfig) { + cfg.Timeout = 2 * time.Minute + cfg.MaxIdleConns = &defaultMaxIdleConns + cfg.IdleConnTimeout = &defaultIdleConnTimeout + cfg.Headers = map[string]configopaque.String{ "myheader": "test", - }, + } + cfg.Compression = defaultCompression + }), + Authentication: AuthenticationSettings{ + User: "elastic", + Password: "search", + APIKey: "AvFsEiPs==", }, Discovery: DiscoverySettings{ OnStart: true, }, Flush: FlushSettings{ - Bytes: 10485760, + Bytes: 10485760, + Interval: 30 * time.Second, }, Retry: RetrySettings{ Enabled: true, - MaxRequests: 5, + MaxRetries: 5, InitialInterval: 100 * time.Millisecond, MaxInterval: 1 * time.Minute, RetryOnStatus: []int{http.StatusTooManyRequests, http.StatusInternalServerError}, }, Mapping: MappingsSettings{ Mode: "none", - Dedup: true, Dedot: true, }, LogstashFormat: LogstashFormatSettings{ @@ -90,49 +112,143 @@ func TestConfig(t *testing.T) { PrefixSeparator: "-", DateFormat: "%Y.%m.%d", }, + Batcher: BatcherConfig{ + FlushTimeout: 30 * time.Second, + MinSizeConfig: exporterbatcher.MinSizeConfig{ + MinSizeItems: 5000, + }, + MaxSizeConfig: exporterbatcher.MaxSizeConfig{ + MaxSizeItems: 0, + }, + }, }, }, { id: component.NewIDWithName(metadata.Type, "log"), configFile: "config.yaml", expected: &Config{ - QueueSettings: exporterhelper.QueueSettings{ + QueueSettings: exporterhelper.QueueConfig{ Enabled: true, - NumConsumers: exporterhelper.NewDefaultQueueSettings().NumConsumers, - QueueSize: exporterhelper.NewDefaultQueueSettings().QueueSize, + NumConsumers: exporterhelper.NewDefaultQueueConfig().NumConsumers, + QueueSize: exporterhelper.NewDefaultQueueConfig().QueueSize, + }, + Endpoints: []string{"http://localhost:9200"}, + Index: "", + LogsIndex: "my_log_index", + LogsDynamicIndex: DynamicIndexSetting{ + Enabled: false, + }, + MetricsIndex: "metrics-generic-default", + MetricsDynamicIndex: DynamicIndexSetting{ + Enabled: true, }, - Endpoints: []string{"http://localhost:9200"}, - Index: "", - LogsIndex: "my_log_index", TracesIndex: "traces-generic-default", - Pipeline: "mypipeline", - ClientConfig: ClientConfig{ - Authentication: AuthenticationSettings{ - User: "elastic", - Password: "search", - APIKey: "AvFsEiPs==", - }, - Timeout: 2 * time.Minute, - Headers: map[string]string{ + TracesDynamicIndex: DynamicIndexSetting{ + Enabled: false, + }, + Pipeline: "mypipeline", + ClientConfig: withDefaultHTTPClientConfig(func(cfg *confighttp.ClientConfig) { + cfg.Timeout = 2 * time.Minute + cfg.MaxIdleConns = &defaultMaxIdleConns + cfg.IdleConnTimeout = &defaultIdleConnTimeout + cfg.Headers = map[string]configopaque.String{ "myheader": "test", + } + cfg.Compression = defaultCompression + }), + Authentication: AuthenticationSettings{ + User: "elastic", + Password: "search", + APIKey: "AvFsEiPs==", + }, + Discovery: DiscoverySettings{ + OnStart: true, + }, + Flush: FlushSettings{ + Bytes: 10485760, + Interval: 30 * time.Second, + }, + Retry: RetrySettings{ + Enabled: true, + MaxRetries: 5, + InitialInterval: 100 * time.Millisecond, + MaxInterval: 1 * time.Minute, + RetryOnStatus: []int{http.StatusTooManyRequests, http.StatusInternalServerError}, + }, + Mapping: MappingsSettings{ + Mode: "none", + Dedot: true, + }, + LogstashFormat: LogstashFormatSettings{ + Enabled: false, + PrefixSeparator: "-", + DateFormat: "%Y.%m.%d", + }, + Batcher: BatcherConfig{ + FlushTimeout: 30 * time.Second, + MinSizeConfig: exporterbatcher.MinSizeConfig{ + MinSizeItems: 5000, + }, + MaxSizeConfig: exporterbatcher.MaxSizeConfig{ + MaxSizeItems: 0, }, }, + }, + }, + { + id: component.NewIDWithName(metadata.Type, "metric"), + configFile: "config.yaml", + expected: &Config{ + QueueSettings: exporterhelper.QueueConfig{ + Enabled: true, + NumConsumers: exporterhelper.NewDefaultQueueConfig().NumConsumers, + QueueSize: exporterhelper.NewDefaultQueueConfig().QueueSize, + }, + Endpoints: []string{"http://localhost:9200"}, + Index: "", + LogsIndex: "logs-generic-default", + LogsDynamicIndex: DynamicIndexSetting{ + Enabled: false, + }, + MetricsIndex: "my_metric_index", + MetricsDynamicIndex: DynamicIndexSetting{ + Enabled: true, + }, + TracesIndex: "traces-generic-default", + TracesDynamicIndex: DynamicIndexSetting{ + Enabled: false, + }, + Pipeline: "mypipeline", + ClientConfig: withDefaultHTTPClientConfig(func(cfg *confighttp.ClientConfig) { + cfg.Timeout = 2 * time.Minute + cfg.MaxIdleConns = &defaultMaxIdleConns + cfg.IdleConnTimeout = &defaultIdleConnTimeout + cfg.Headers = map[string]configopaque.String{ + "myheader": "test", + } + cfg.Compression = defaultCompression + }), + Authentication: AuthenticationSettings{ + User: "elastic", + Password: "search", + APIKey: "AvFsEiPs==", + }, Discovery: DiscoverySettings{ OnStart: true, }, Flush: FlushSettings{ - Bytes: 10485760, + Bytes: 10485760, + Interval: 30 * time.Second, }, Retry: RetrySettings{ Enabled: true, - MaxRequests: 5, + MaxRetries: 5, InitialInterval: 100 * time.Millisecond, MaxInterval: 1 * time.Minute, RetryOnStatus: []int{http.StatusTooManyRequests, http.StatusInternalServerError}, }, Mapping: MappingsSettings{ Mode: "none", - Dedup: true, Dedot: true, }, LogstashFormat: LogstashFormatSettings{ @@ -140,6 +256,15 @@ func TestConfig(t *testing.T) { PrefixSeparator: "-", DateFormat: "%Y.%m.%d", }, + Batcher: BatcherConfig{ + FlushTimeout: 30 * time.Second, + MinSizeConfig: exporterbatcher.MinSizeConfig{ + MinSizeItems: 5000, + }, + MaxSizeConfig: exporterbatcher.MaxSizeConfig{ + MaxSizeItems: 0, + }, + }, }, }, { @@ -167,10 +292,45 @@ func TestConfig(t *testing.T) { cfg.Index = "my_log_index" }), }, + { + id: component.NewIDWithName(metadata.Type, "confighttp_endpoint"), + configFile: "config.yaml", + expected: withDefaultConfig(func(cfg *Config) { + cfg.Endpoint = "https://elastic.example.com:9200" + }), + }, + { + id: component.NewIDWithName(metadata.Type, "batcher_disabled"), + configFile: "config.yaml", + expected: withDefaultConfig(func(cfg *Config) { + cfg.Endpoint = "https://elastic.example.com:9200" + + enabled := false + cfg.Batcher.Enabled = &enabled + }), + }, + { + id: component.NewIDWithName(metadata.Type, "compression_none"), + configFile: "config.yaml", + expected: withDefaultConfig(func(cfg *Config) { + cfg.Endpoint = "https://elastic.example.com:9200" + + cfg.Compression = "none" + }), + }, + { + id: component.NewIDWithName(metadata.Type, "compression_gzip"), + configFile: "config.yaml", + expected: withDefaultConfig(func(cfg *Config) { + cfg.Endpoint = "https://elastic.example.com:9200" + + cfg.Compression = "gzip" + }), + }, } for _, tt := range tests { - t.Run(tt.id.String(), func(t *testing.T) { + t.Run(strings.ReplaceAll(tt.id.String(), "/", "_"), func(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() @@ -179,7 +339,7 @@ func TestConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) @@ -197,13 +357,19 @@ func TestConfig_Validate(t *testing.T) { }{ "no endpoints": { config: withDefaultConfig(), - err: "endpoints or cloudid must be specified", + err: "exactly one of [endpoint, endpoints, cloudid] must be specified", }, "empty endpoint": { config: withDefaultConfig(func(cfg *Config) { cfg.Endpoints = []string{""} }), - err: "endpoints must not include empty entries", + err: `invalid endpoint "": endpoint must not be empty`, + }, + "invalid endpoint": { + config: withDefaultConfig(func(cfg *Config) { + cfg.Endpoints = []string{"*:!"} + }), + err: `invalid endpoint "*:!": parse "*:!": first path segment in URL cannot contain colon`, }, "invalid cloudid": { config: withDefaultConfig(func(cfg *Config) { @@ -217,35 +383,70 @@ func TestConfig_Validate(t *testing.T) { }), err: `invalid decoded CloudID "abc"`, }, - "endpoint and cloudid both set": { + "endpoints and cloudid both set": { config: withDefaultConfig(func(cfg *Config) { - cfg.Endpoints = []string{"test:9200"} + cfg.Endpoints = []string{"http://test:9200"} cfg.CloudID = "foo:YmFyLmNsb3VkLmVzLmlvJGFiYzEyMyRkZWY0NTY=" }), - err: "only one of endpoints or cloudid may be specified", + err: "exactly one of [endpoint, endpoints, cloudid] must be specified", + }, + "endpoint and endpoints both set": { + config: withDefaultConfig(func(cfg *Config) { + cfg.Endpoint = "http://test:9200" + cfg.Endpoints = []string{"http://test:9200"} + }), + err: "exactly one of [endpoint, endpoints, cloudid] must be specified", }, "invalid mapping mode": { config: withDefaultConfig(func(cfg *Config) { - cfg.Endpoints = []string{"test:9200"} + cfg.Endpoints = []string{"http://test:9200"} cfg.Mapping.Mode = "invalid" }), err: `unknown mapping mode "invalid"`, }, + "invalid scheme": { + config: withDefaultConfig(func(cfg *Config) { + cfg.Endpoints = []string{"without_scheme"} + }), + err: `invalid endpoint "without_scheme": invalid scheme "", expected "http" or "https"`, + }, + "compression unsupported": { + config: withDefaultConfig(func(cfg *Config) { + cfg.Endpoints = []string{"http://test:9200"} + cfg.Compression = configcompression.TypeSnappy + }), + err: `compression must be one of [none, gzip]`, + }, + "both max_retries and max_requests specified": { + config: withDefaultConfig(func(cfg *Config) { + cfg.Endpoints = []string{"http://test:9200"} + cfg.Retry.MaxRetries = 1 + cfg.Retry.MaxRequests = 1 + }), + err: `must not specify both retry::max_requests and retry::max_retries`, + }, } for name, tt := range tests { t.Run(name, func(t *testing.T) { - err := tt.config.Validate() - assert.EqualError(t, err, tt.err) + assert.EqualError(t, component.ValidateConfig(tt.config), tt.err) }) } } func TestConfig_Validate_Environment(t *testing.T) { - t.Setenv("ELASTICSEARCH_URL", "test:9200") - config := withDefaultConfig() - err := config.Validate() - require.NoError(t, err) + t.Run("valid", func(t *testing.T) { + t.Setenv("ELASTICSEARCH_URL", "http://test:9200") + config := withDefaultConfig() + err := component.ValidateConfig(config) + require.NoError(t, err) + }) + t.Run("invalid", func(t *testing.T) { + t.Setenv("ELASTICSEARCH_URL", "http://valid:9200, *:!") + config := withDefaultConfig() + err := component.ValidateConfig(config) + assert.EqualError(t, err, `invalid endpoint "*:!": parse "*:!": first path segment in URL cannot contain colon`) + }) } func withDefaultConfig(fns ...func(*Config)) *Config { @@ -255,3 +456,11 @@ func withDefaultConfig(fns ...func(*Config)) *Config { } return cfg } + +func withDefaultHTTPClientConfig(fns ...func(config *confighttp.ClientConfig)) confighttp.ClientConfig { + cfg := confighttp.NewDefaultClientConfig() + for _, fn := range fns { + fn(&cfg) + } + return cfg +} diff --git a/exporter/elasticsearchexporter/data_stream_router.go b/exporter/elasticsearchexporter/data_stream_router.go new file mode 100644 index 000000000000..a64b15d0ad97 --- /dev/null +++ b/exporter/elasticsearchexporter/data_stream_router.go @@ -0,0 +1,117 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package elasticsearchexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter" + +import ( + "fmt" + "regexp" + "strings" + "unicode" + + "go.opentelemetry.io/collector/pdata/pcommon" +) + +var receiverRegex = regexp.MustCompile(`/receiver/(\w*receiver)`) + +const ( + maxDataStreamBytes = 100 + disallowedNamespaceRunes = "\\/*?\"<>| ,#:" + disallowedDatasetRunes = "-\\/*?\"<>| ,#:" +) + +// Sanitize the datastream fields (dataset, namespace) to apply restrictions +// as outlined in https://www.elastic.co/guide/en/ecs/current/ecs-data_stream.html +// The suffix will be appended after truncation of max bytes. +func sanitizeDataStreamField(field, disallowed, appendSuffix string) string { + field = strings.Map(func(r rune) rune { + if strings.ContainsRune(disallowed, r) { + return '_' + } + return unicode.ToLower(r) + }, field) + + if len(field) > maxDataStreamBytes-len(appendSuffix) { + field = field[:maxDataStreamBytes-len(appendSuffix)] + } + field += appendSuffix + + return field +} + +func routeWithDefaults(defaultDSType string) func( + pcommon.Map, + pcommon.Map, + pcommon.Map, + string, + bool, + string, +) string { + return func( + recordAttr pcommon.Map, + scopeAttr pcommon.Map, + resourceAttr pcommon.Map, + fIndex string, + otel bool, + scopeName string, + ) string { + // Order: + // 1. read data_stream.* from attributes + // 2. read elasticsearch.index.* from attributes + // 3. receiver-based routing + // 4. use default hardcoded data_stream.* + dataset, datasetExists := getFromAttributes(dataStreamDataset, defaultDataStreamDataset, recordAttr, scopeAttr, resourceAttr) + namespace, namespaceExists := getFromAttributes(dataStreamNamespace, defaultDataStreamNamespace, recordAttr, scopeAttr, resourceAttr) + dataStreamMode := datasetExists || namespaceExists + if !dataStreamMode { + prefix, prefixExists := getFromAttributes(indexPrefix, "", resourceAttr, scopeAttr, recordAttr) + suffix, suffixExists := getFromAttributes(indexSuffix, "", resourceAttr, scopeAttr, recordAttr) + if prefixExists || suffixExists { + return fmt.Sprintf("%s%s%s", prefix, fIndex, suffix) + } + } + + // Receiver-based routing + // For example, hostmetricsreceiver (or hostmetricsreceiver.otel in the OTel output mode) + // for the scope name + // github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/cpuscraper + if submatch := receiverRegex.FindStringSubmatch(scopeName); len(submatch) > 0 { + receiverName := submatch[1] + dataset = receiverName + } + + // For dataset, the naming convention for datastream is expected to be "logs-[dataset].otel-[namespace]". + // This is in order to match the built-in logs-*.otel-* index template. + var datasetSuffix string + if otel { + datasetSuffix += ".otel" + } + + dataset = sanitizeDataStreamField(dataset, disallowedDatasetRunes, datasetSuffix) + namespace = sanitizeDataStreamField(namespace, disallowedNamespaceRunes, "") + + recordAttr.PutStr(dataStreamDataset, dataset) + recordAttr.PutStr(dataStreamNamespace, namespace) + recordAttr.PutStr(dataStreamType, defaultDSType) + + return fmt.Sprintf("%s-%s-%s", defaultDSType, dataset, namespace) + } +} + +var ( + // routeLogRecord returns the name of the index to send the log record to according to data stream routing related attributes. + // This function may mutate record attributes. + routeLogRecord = routeWithDefaults(defaultDataStreamTypeLogs) + + // routeDataPoint returns the name of the index to send the data point to according to data stream routing related attributes. + // This function may mutate record attributes. + routeDataPoint = routeWithDefaults(defaultDataStreamTypeMetrics) + + // routeSpan returns the name of the index to send the span to according to data stream routing related attributes. + // This function may mutate record attributes. + routeSpan = routeWithDefaults(defaultDataStreamTypeTraces) + + // routeSpanEvent returns the name of the index to send the span event to according to data stream routing related attributes. + // This function may mutate record attributes. + routeSpanEvent = routeWithDefaults(defaultDataStreamTypeLogs) +) diff --git a/exporter/elasticsearchexporter/data_stream_router_test.go b/exporter/elasticsearchexporter/data_stream_router_test.go new file mode 100644 index 000000000000..81450da4d7a1 --- /dev/null +++ b/exporter/elasticsearchexporter/data_stream_router_test.go @@ -0,0 +1,98 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package elasticsearchexporter + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" + "go.opentelemetry.io/collector/pdata/pcommon" +) + +type routeTestCase struct { + name string + otel bool + scopeName string + want string +} + +func createRouteTests(dsType string) []routeTestCase { + renderWantRoute := func(dsType, dsDataset string, otel bool) string { + if otel { + return fmt.Sprintf("%s-%s.otel-%s", dsType, dsDataset, defaultDataStreamNamespace) + } + return fmt.Sprintf("%s-%s-%s", dsType, dsDataset, defaultDataStreamNamespace) + } + + return []routeTestCase{ + { + name: "default", + otel: false, + want: renderWantRoute(dsType, defaultDataStreamDataset, false), + }, + { + name: "otel", + otel: true, + want: renderWantRoute(dsType, defaultDataStreamDataset, true), + }, + { + name: "default with receiver scope name", + otel: false, + scopeName: "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/cpuscraper", + want: renderWantRoute(dsType, "hostmetricsreceiver", false), + }, + { + name: "otel with receiver scope name", + otel: true, + scopeName: "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/cpuscraper", + want: renderWantRoute(dsType, "hostmetricsreceiver", true), + }, + { + name: "default with non-receiver scope name", + otel: false, + scopeName: "some_other_scope_name", + want: renderWantRoute(dsType, defaultDataStreamDataset, false), + }, + { + name: "otel with non-receiver scope name", + otel: true, + scopeName: "some_other_scope_name", + want: renderWantRoute(dsType, defaultDataStreamDataset, true), + }, + } +} + +func TestRouteLogRecord(t *testing.T) { + tests := createRouteTests(defaultDataStreamTypeLogs) + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + ds := routeLogRecord(pcommon.NewMap(), pcommon.NewMap(), pcommon.NewMap(), "", tc.otel, tc.scopeName) + assert.Equal(t, tc.want, ds) + }) + } +} + +func TestRouteDataPoint(t *testing.T) { + tests := createRouteTests(defaultDataStreamTypeMetrics) + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + ds := routeDataPoint(pcommon.NewMap(), pcommon.NewMap(), pcommon.NewMap(), "", tc.otel, tc.scopeName) + assert.Equal(t, tc.want, ds) + }) + } +} + +func TestRouteSpan(t *testing.T) { + tests := createRouteTests(defaultDataStreamTypeTraces) + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + ds := routeSpan(pcommon.NewMap(), pcommon.NewMap(), pcommon.NewMap(), "", tc.otel, tc.scopeName) + assert.Equal(t, tc.want, ds) + }) + } +} diff --git a/exporter/elasticsearchexporter/elasticsearch_bulk.go b/exporter/elasticsearchexporter/elasticsearch_bulk.go deleted file mode 100644 index ea7f496df08d..000000000000 --- a/exporter/elasticsearchexporter/elasticsearch_bulk.go +++ /dev/null @@ -1,319 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package elasticsearchexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter" - -import ( - "bytes" - "context" - "crypto/tls" - "fmt" - "io" - "net/http" - "runtime" - "sync" - "sync/atomic" - "time" - - "github.com/cenkalti/backoff/v4" - "github.com/elastic/go-docappender/v2" - elasticsearch7 "github.com/elastic/go-elasticsearch/v7" - "go.uber.org/zap" - - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/sanitize" -) - -type esClientCurrent = elasticsearch7.Client -type esConfigCurrent = elasticsearch7.Config - -type esBulkIndexerCurrent = bulkIndexerPool - -type esBulkIndexerItem = docappender.BulkIndexerItem - -// clientLogger implements the estransport.Logger interface -// that is required by the Elasticsearch client for logging. -type clientLogger zap.Logger - -// LogRoundTrip should not modify the request or response, except for consuming and closing the body. -// Implementations have to check for nil values in request and response. -func (cl *clientLogger) LogRoundTrip(requ *http.Request, resp *http.Response, err error, _ time.Time, dur time.Duration) error { - zl := (*zap.Logger)(cl) - switch { - case err == nil && resp != nil: - zl.Debug("Request roundtrip completed.", - zap.String("path", sanitize.String(requ.URL.Path)), - zap.String("method", requ.Method), - zap.Duration("duration", dur), - zap.String("status", resp.Status)) - - case err != nil: - zl.Error("Request failed.", zap.NamedError("reason", err)) - } - - return nil -} - -// RequestBodyEnabled makes the client pass a copy of request body to the logger. -func (*clientLogger) RequestBodyEnabled() bool { - // TODO: introduce setting log the bodies for more detailed debug logs - return false -} - -// ResponseBodyEnabled makes the client pass a copy of response body to the logger. -func (*clientLogger) ResponseBodyEnabled() bool { - // TODO: introduce setting log the bodies for more detailed debug logs - return false -} - -func newElasticsearchClient(logger *zap.Logger, config *Config) (*esClientCurrent, error) { - tlsCfg, err := config.ClientConfig.LoadTLSConfig(context.Background()) - if err != nil { - return nil, err - } - - transport := newTransport(config, tlsCfg) - - headers := make(http.Header) - for k, v := range config.Headers { - headers.Add(k, v) - } - - // TODO: validate settings: - // - try to parse address and validate scheme (address must be a valid URL) - // - check if cloud ID is valid - - // maxRetries configures the maximum number of event publishing attempts, - // including the first send and additional retries. - - maxRetries := config.Retry.MaxRequests - 1 - retryDisabled := !config.Retry.Enabled || maxRetries <= 0 - - if retryDisabled { - maxRetries = 0 - } - - return elasticsearch7.NewClient(esConfigCurrent{ - Transport: transport, - - // configure connection setup - Addresses: config.Endpoints, - CloudID: config.CloudID, - Username: config.Authentication.User, - Password: string(config.Authentication.Password), - APIKey: string(config.Authentication.APIKey), - Header: headers, - - // configure retry behavior - RetryOnStatus: config.Retry.RetryOnStatus, - DisableRetry: retryDisabled, - EnableRetryOnTimeout: config.Retry.Enabled, - //RetryOnError: retryOnError, // should be used from esclient version 8 onwards - MaxRetries: maxRetries, - RetryBackoff: createElasticsearchBackoffFunc(&config.Retry), - - // configure sniffing - DiscoverNodesOnStart: config.Discovery.OnStart, - DiscoverNodesInterval: config.Discovery.Interval, - - // configure internal metrics reporting and logging - EnableMetrics: false, // TODO - EnableDebugLogger: false, // TODO - Logger: (*clientLogger)(logger), - }) -} - -func newTransport(config *Config, tlsCfg *tls.Config) *http.Transport { - transport := http.DefaultTransport.(*http.Transport).Clone() - if tlsCfg != nil { - transport.TLSClientConfig = tlsCfg - } - if config.ReadBufferSize > 0 { - transport.ReadBufferSize = config.ReadBufferSize - } - if config.WriteBufferSize > 0 { - transport.WriteBufferSize = config.WriteBufferSize - } - - return transport -} - -func createElasticsearchBackoffFunc(config *RetrySettings) func(int) time.Duration { - if !config.Enabled { - return nil - } - - expBackoff := backoff.NewExponentialBackOff() - if config.InitialInterval > 0 { - expBackoff.InitialInterval = config.InitialInterval - } - if config.MaxInterval > 0 { - expBackoff.MaxInterval = config.MaxInterval - } - expBackoff.Reset() - - return func(attempts int) time.Duration { - if attempts == 1 { - expBackoff.Reset() - } - - return expBackoff.NextBackOff() - } -} - -func pushDocuments(ctx context.Context, index string, document []byte, bulkIndexer *esBulkIndexerCurrent) error { - return bulkIndexer.Add(ctx, index, bytes.NewReader(document)) -} - -func newBulkIndexer(logger *zap.Logger, client *elasticsearch7.Client, config *Config) (*esBulkIndexerCurrent, error) { - numWorkers := config.NumWorkers - if numWorkers == 0 { - numWorkers = runtime.NumCPU() - } - - flushInterval := config.Flush.Interval - if flushInterval == 0 { - flushInterval = 30 * time.Second - } - - flushBytes := config.Flush.Bytes - if flushBytes == 0 { - flushBytes = 5e+6 - } - - var maxDocRetry int - if config.Retry.Enabled { - // max_requests includes initial attempt - // See https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/32344 - maxDocRetry = config.Retry.MaxRequests - 1 - } - - pool := &bulkIndexerPool{ - wg: sync.WaitGroup{}, - items: make(chan esBulkIndexerItem, config.NumWorkers), - stats: bulkIndexerStats{}, - } - pool.wg.Add(numWorkers) - - for i := 0; i < numWorkers; i++ { - bi, err := docappender.NewBulkIndexer(docappender.BulkIndexerConfig{ - Client: client, - MaxDocumentRetries: maxDocRetry, - Pipeline: config.Pipeline, - RetryOnDocumentStatus: config.Retry.RetryOnStatus, - }) - if err != nil { - return nil, err - } - w := worker{ - indexer: bi, - items: pool.items, - flushInterval: flushInterval, - flushTimeout: config.Timeout, - flushBytes: flushBytes, - logger: logger, - stats: &pool.stats, - } - go func() { - defer pool.wg.Done() - w.run() - }() - } - return pool, nil -} - -type bulkIndexerStats struct { - docsIndexed atomic.Int64 -} - -type bulkIndexerPool struct { - items chan esBulkIndexerItem - wg sync.WaitGroup - stats bulkIndexerStats -} - -// Add adds an item to the bulk indexer pool. -// -// Adding an item after a call to Close() will panic. -func (p *bulkIndexerPool) Add(ctx context.Context, index string, document io.WriterTo) error { - item := esBulkIndexerItem{ - Index: index, - Body: document, - } - select { - case <-ctx.Done(): - return ctx.Err() - case p.items <- item: - return nil - } -} - -// Close closes the items channel and waits for the workers to drain it. -func (p *bulkIndexerPool) Close(ctx context.Context) error { - close(p.items) - doneCh := make(chan struct{}) - go func() { - p.wg.Wait() - close(doneCh) - }() - select { - case <-ctx.Done(): - return ctx.Err() - case <-doneCh: - return nil - } -} - -type worker struct { - indexer *docappender.BulkIndexer - items <-chan esBulkIndexerItem - flushInterval time.Duration - flushTimeout time.Duration - flushBytes int - - stats *bulkIndexerStats - - logger *zap.Logger -} - -func (w *worker) run() { - flushTick := time.NewTicker(w.flushInterval) - defer flushTick.Stop() - for { - select { - case item, ok := <-w.items: - // if channel is closed, flush and return - if !ok { - w.flush() - return - } - - if err := w.indexer.Add(item); err != nil { - w.logger.Error("error adding item to bulk indexer", zap.Error(err)) - } - - // w.indexer.Len() can be either compressed or uncompressed bytes - if w.indexer.Len() >= w.flushBytes { - w.flush() - flushTick.Reset(w.flushInterval) - } - case <-flushTick.C: - // bulk indexer needs to be flushed every flush interval because - // there may be pending bytes in bulk indexer buffer due to e.g. document level 429 - w.flush() - } - } -} - -func (w *worker) flush() { - ctx, cancel := context.WithTimeout(context.Background(), w.flushTimeout) - defer cancel() - stat, err := w.indexer.Flush(ctx) - w.stats.docsIndexed.Add(stat.Indexed) - if err != nil { - w.logger.Error("bulk indexer flush error", zap.Error(err)) - } - for _, resp := range stat.FailedDocs { - w.logger.Error(fmt.Sprintf("Drop docs: failed to index: %#v", resp.Error), - zap.Int("status", resp.Status)) - } -} diff --git a/exporter/elasticsearchexporter/elasticsearch_bulk_test.go b/exporter/elasticsearchexporter/elasticsearch_bulk_test.go deleted file mode 100644 index 020d29fae623..000000000000 --- a/exporter/elasticsearchexporter/elasticsearch_bulk_test.go +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package elasticsearchexporter - -import ( - "context" - "errors" - "io" - "net/http" - "strings" - "testing" - "time" - - "github.com/elastic/go-elasticsearch/v7" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "go.uber.org/zap" - "go.uber.org/zap/zapcore" - "go.uber.org/zap/zaptest/observer" -) - -var defaultRoundTripFunc = func(*http.Request) (*http.Response, error) { - return &http.Response{ - Body: io.NopCloser(strings.NewReader("{}")), - }, nil -} - -type mockTransport struct { - RoundTripFunc func(*http.Request) (*http.Response, error) -} - -func (t *mockTransport) RoundTrip(req *http.Request) (*http.Response, error) { - if t.RoundTripFunc == nil { - return defaultRoundTripFunc(req) - } - return t.RoundTripFunc(req) -} - -const successResp = `{ - "took": 30, - "errors": false, - "items": [ - { - "create": { - "_index": "foo", - "status": 201 - } - } - ] -}` - -func TestBulkIndexer_flushOnClose(t *testing.T) { - cfg := Config{NumWorkers: 1, Flush: FlushSettings{Interval: time.Hour, Bytes: 2 << 30}} - client, err := elasticsearch.NewClient(elasticsearch.Config{Transport: &mockTransport{ - RoundTripFunc: func(*http.Request) (*http.Response, error) { - return &http.Response{ - Header: http.Header{"X-Elastic-Product": []string{"Elasticsearch"}}, - Body: io.NopCloser(strings.NewReader(successResp)), - }, nil - }, - }}) - require.NoError(t, err) - bulkIndexer, err := newBulkIndexer(zap.NewNop(), client, &cfg) - require.NoError(t, err) - assert.NoError(t, bulkIndexer.Add(context.Background(), "foo", strings.NewReader(`{"foo": "bar"}`))) - assert.NoError(t, bulkIndexer.Close(context.Background())) - assert.Equal(t, int64(1), bulkIndexer.stats.docsIndexed.Load()) -} - -func TestBulkIndexer_flush(t *testing.T) { - tests := []struct { - name string - config Config - }{ - { - name: "flush.bytes", - config: Config{NumWorkers: 1, Flush: FlushSettings{Interval: time.Hour, Bytes: 1}}, - }, - { - name: "flush.interval", - config: Config{NumWorkers: 1, Flush: FlushSettings{Interval: 50 * time.Millisecond, Bytes: 2 << 30}}, - }, - } - - for _, tt := range tests { - tt := tt - t.Run(tt.name, func(t *testing.T) { - t.Parallel() - client, err := elasticsearch.NewClient(elasticsearch.Config{Transport: &mockTransport{ - RoundTripFunc: func(*http.Request) (*http.Response, error) { - return &http.Response{ - Header: http.Header{"X-Elastic-Product": []string{"Elasticsearch"}}, - Body: io.NopCloser(strings.NewReader(successResp)), - }, nil - }, - }}) - require.NoError(t, err) - bulkIndexer, err := newBulkIndexer(zap.NewNop(), client, &tt.config) - require.NoError(t, err) - assert.NoError(t, bulkIndexer.Add(context.Background(), "foo", strings.NewReader(`{"foo": "bar"}`))) - // should flush - time.Sleep(100 * time.Millisecond) - assert.Equal(t, int64(1), bulkIndexer.stats.docsIndexed.Load()) - assert.NoError(t, bulkIndexer.Close(context.Background())) - }) - } -} - -func TestBulkIndexer_flush_error(t *testing.T) { - tests := []struct { - name string - roundTripFunc func(*http.Request) (*http.Response, error) - }{ - { - name: "500", - roundTripFunc: func(*http.Request) (*http.Response, error) { - return &http.Response{ - StatusCode: 500, - Header: http.Header{"X-Elastic-Product": []string{"Elasticsearch"}}, - Body: io.NopCloser(strings.NewReader("error")), - }, nil - }, - }, - { - name: "429", - roundTripFunc: func(*http.Request) (*http.Response, error) { - return &http.Response{ - StatusCode: 429, - Header: http.Header{"X-Elastic-Product": []string{"Elasticsearch"}}, - Body: io.NopCloser(strings.NewReader("error")), - }, nil - }, - }, - { - name: "transport error", - roundTripFunc: func(*http.Request) (*http.Response, error) { - return nil, errors.New("transport error") - }, - }, - } - - for _, tt := range tests { - tt := tt - t.Run(tt.name, func(t *testing.T) { - t.Parallel() - cfg := Config{NumWorkers: 1, Flush: FlushSettings{Interval: time.Hour, Bytes: 1}} - client, err := elasticsearch.NewClient(elasticsearch.Config{Transport: &mockTransport{ - RoundTripFunc: tt.roundTripFunc, - }}) - require.NoError(t, err) - core, observed := observer.New(zap.NewAtomicLevelAt(zapcore.DebugLevel)) - bulkIndexer, err := newBulkIndexer(zap.New(core), client, &cfg) - require.NoError(t, err) - assert.NoError(t, bulkIndexer.Add(context.Background(), "foo", strings.NewReader(`{"foo": "bar"}`))) - // should flush - time.Sleep(100 * time.Millisecond) - assert.Equal(t, int64(0), bulkIndexer.stats.docsIndexed.Load()) - assert.NoError(t, bulkIndexer.Close(context.Background())) - assert.Equal(t, 1, observed.FilterMessage("bulk indexer flush error").Len()) - }) - } -} diff --git a/exporter/elasticsearchexporter/esclient.go b/exporter/elasticsearchexporter/esclient.go new file mode 100644 index 000000000000..fe99cf8a2f12 --- /dev/null +++ b/exporter/elasticsearchexporter/esclient.go @@ -0,0 +1,169 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package elasticsearchexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter" + +import ( + "context" + "io" + "net/http" + "time" + + "github.com/cenkalti/backoff/v4" + "github.com/elastic/go-elasticsearch/v7" + "github.com/klauspost/compress/gzip" + "go.opentelemetry.io/collector/component" + "go.uber.org/zap" + + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/sanitize" +) + +// clientLogger implements the estransport.Logger interface +// that is required by the Elasticsearch client for logging. +type clientLogger struct { + *zap.Logger + logRequestBody bool + logResponseBody bool +} + +// LogRoundTrip should not modify the request or response, except for consuming and closing the body. +// Implementations have to check for nil values in request and response. +func (cl *clientLogger) LogRoundTrip(requ *http.Request, resp *http.Response, clientErr error, _ time.Time, dur time.Duration) error { + zl := cl.Logger + + var fields []zap.Field + if cl.logRequestBody && requ != nil && requ.Body != nil { + body := requ.Body + if requ.Header.Get("Content-Encoding") == "gzip" { + if r, err := gzip.NewReader(body); err == nil { + defer r.Close() + body = r + } + } + if b, err := io.ReadAll(body); err == nil { + fields = append(fields, zap.ByteString("request_body", b)) + } + } + if cl.logResponseBody && resp != nil && resp.Body != nil { + if b, err := io.ReadAll(resp.Body); err == nil { + fields = append(fields, zap.ByteString("response_body", b)) + } + } + + switch { + case clientErr == nil && resp != nil: + fields = append( + fields, + zap.String("path", sanitize.String(requ.URL.Path)), + zap.String("method", requ.Method), + zap.Duration("duration", dur), + zap.String("status", resp.Status), + ) + zl.Debug("Request roundtrip completed.", fields...) + + case clientErr != nil: + fields = append( + fields, + zap.NamedError("reason", clientErr), + ) + zl.Debug("Request failed.", fields...) + } + + return nil +} + +// RequestBodyEnabled makes the client pass a copy of request body to the logger. +func (cl *clientLogger) RequestBodyEnabled() bool { + return cl.logRequestBody +} + +// ResponseBodyEnabled makes the client pass a copy of response body to the logger. +func (cl *clientLogger) ResponseBodyEnabled() bool { + return cl.logResponseBody +} + +// newElasticsearchClient returns a new elasticsearch.Client +func newElasticsearchClient( + ctx context.Context, + config *Config, + host component.Host, + telemetry component.TelemetrySettings, + userAgent string, +) (*elasticsearch.Client, error) { + httpClient, err := config.ClientConfig.ToClient(ctx, host, telemetry) + if err != nil { + return nil, err + } + + headers := make(http.Header) + headers.Set("User-Agent", userAgent) + + // endpoints converts Config.Endpoints, Config.CloudID, + // and Config.ClientConfig.Endpoint to a list of addresses. + endpoints, err := config.endpoints() + if err != nil { + return nil, err + } + + esLogger := clientLogger{ + Logger: telemetry.Logger, + logRequestBody: config.LogRequestBody, + logResponseBody: config.LogResponseBody, + } + + maxRetries := defaultMaxRetries + if config.Retry.MaxRetries != 0 { + maxRetries = config.Retry.MaxRetries + } + + return elasticsearch.NewClient(elasticsearch.Config{ + Transport: httpClient.Transport, + + // configure connection setup + Addresses: endpoints, + Username: config.Authentication.User, + Password: string(config.Authentication.Password), + APIKey: string(config.Authentication.APIKey), + Header: headers, + + // configure retry behavior + RetryOnStatus: config.Retry.RetryOnStatus, + DisableRetry: !config.Retry.Enabled, + EnableRetryOnTimeout: config.Retry.Enabled, + // RetryOnError: retryOnError, // should be used from esclient version 8 onwards + MaxRetries: maxRetries, + RetryBackoff: createElasticsearchBackoffFunc(&config.Retry), + + // configure sniffing + DiscoverNodesOnStart: config.Discovery.OnStart, + DiscoverNodesInterval: config.Discovery.Interval, + + // configure internal metrics reporting and logging + EnableMetrics: false, // TODO + EnableDebugLogger: false, // TODO + Logger: &esLogger, + }) +} + +func createElasticsearchBackoffFunc(config *RetrySettings) func(int) time.Duration { + if !config.Enabled { + return nil + } + + expBackoff := backoff.NewExponentialBackOff() + if config.InitialInterval > 0 { + expBackoff.InitialInterval = config.InitialInterval + } + if config.MaxInterval > 0 { + expBackoff.MaxInterval = config.MaxInterval + } + expBackoff.Reset() + + return func(attempts int) time.Duration { + if attempts == 1 { + expBackoff.Reset() + } + + return expBackoff.NextBackOff() + } +} diff --git a/exporter/elasticsearchexporter/exporter.go b/exporter/elasticsearchexporter/exporter.go index d3c9f124f596..ebd3800858a2 100644 --- a/exporter/elasticsearchexporter/exporter.go +++ b/exporter/elasticsearchexporter/exporter.go @@ -4,69 +4,118 @@ package elasticsearchexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter" import ( + "bytes" "context" "errors" "fmt" + "runtime" + "sync" "time" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/exporter" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" + "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" "go.uber.org/zap" + + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter/internal/objmodel" ) type elasticsearchExporter struct { - logger *zap.Logger + component.TelemetrySettings + userAgent string + config *Config index string logstashFormat LogstashFormatSettings dynamicIndex bool + model mappingModel + otel bool - client *esClientCurrent - bulkIndexer *esBulkIndexerCurrent - model mappingModel + wg sync.WaitGroup // active sessions + bulkIndexer bulkIndexer } -func newExporter(logger *zap.Logger, cfg *Config, index string, dynamicIndex bool) (*elasticsearchExporter, error) { - if err := cfg.Validate(); err != nil { - return nil, err - } - - client, err := newElasticsearchClient(logger, cfg) - if err != nil { - return nil, err - } - - bulkIndexer, err := newBulkIndexer(logger, client, cfg) - if err != nil { - return nil, err - } - +func newExporter( + cfg *Config, + set exporter.Settings, + index string, + dynamicIndex bool, +) *elasticsearchExporter { model := &encodeModel{ - dedup: cfg.Mapping.Dedup, dedot: cfg.Mapping.Dedot, mode: cfg.MappingMode(), } + otel := model.mode == MappingOTel + + userAgent := fmt.Sprintf( + "%s/%s (%s/%s)", + set.BuildInfo.Description, + set.BuildInfo.Version, + runtime.GOOS, + runtime.GOARCH, + ) + return &elasticsearchExporter{ - logger: logger, - client: client, - bulkIndexer: bulkIndexer, + TelemetrySettings: set.TelemetrySettings, + userAgent: userAgent, + config: cfg, index: index, dynamicIndex: dynamicIndex, model: model, logstashFormat: cfg.LogstashFormat, - }, nil + otel: otel, + } +} + +func (e *elasticsearchExporter) Start(ctx context.Context, host component.Host) error { + client, err := newElasticsearchClient(ctx, e.config, host, e.TelemetrySettings, e.userAgent) + if err != nil { + return err + } + bulkIndexer, err := newBulkIndexer(e.Logger, client, e.config) + if err != nil { + return err + } + e.bulkIndexer = bulkIndexer + return nil } func (e *elasticsearchExporter) Shutdown(ctx context.Context) error { - return e.bulkIndexer.Close(ctx) + if e.bulkIndexer != nil { + if err := e.bulkIndexer.Close(ctx); err != nil { + return err + } + } + + doneCh := make(chan struct{}) + go func() { + e.wg.Wait() + close(doneCh) + }() + select { + case <-ctx.Done(): + return ctx.Err() + case <-doneCh: + return nil + } } func (e *elasticsearchExporter) pushLogsData(ctx context.Context, ld plog.Logs) error { - var errs []error + e.wg.Add(1) + defer e.wg.Done() + + session, err := e.bulkIndexer.StartSession(ctx) + if err != nil { + return err + } + defer session.End() + var errs []error rls := ld.ResourceLogs() for i := 0; i < rls.Len(); i++ { rl := rls.At(i) @@ -77,27 +126,43 @@ func (e *elasticsearchExporter) pushLogsData(ctx context.Context, ld plog.Logs) scope := ill.Scope() logs := ill.LogRecords() for k := 0; k < logs.Len(); k++ { - if err := e.pushLogRecord(ctx, resource, logs.At(k), scope); err != nil { + if err := e.pushLogRecord(ctx, resource, rl.SchemaUrl(), logs.At(k), scope, ill.SchemaUrl(), session); err != nil { if cerr := ctx.Err(); cerr != nil { return cerr } + if errors.Is(err, ErrInvalidTypeForBodyMapMode) { + e.Logger.Warn("dropping log record", zap.Error(err)) + continue + } + errs = append(errs, err) } } } } + if err := session.Flush(ctx); err != nil { + if cerr := ctx.Err(); cerr != nil { + return cerr + } + errs = append(errs, err) + } return errors.Join(errs...) } -func (e *elasticsearchExporter) pushLogRecord(ctx context.Context, resource pcommon.Resource, record plog.LogRecord, scope pcommon.InstrumentationScope) error { +func (e *elasticsearchExporter) pushLogRecord( + ctx context.Context, + resource pcommon.Resource, + resourceSchemaURL string, + record plog.LogRecord, + scope pcommon.InstrumentationScope, + scopeSchemaURL string, + bulkIndexerSession bulkIndexerSession, +) error { fIndex := e.index if e.dynamicIndex { - prefix := getFromAttributes(indexPrefix, resource, scope, record) - suffix := getFromAttributes(indexSuffix, resource, scope, record) - - fIndex = fmt.Sprintf("%s%s%s", prefix, fIndex, suffix) + fIndex = routeLogRecord(record.Attributes(), scope.Attributes(), resource.Attributes(), fIndex, e.otel, scope.Name()) } if e.logstashFormat.Enabled { @@ -108,17 +173,185 @@ func (e *elasticsearchExporter) pushLogRecord(ctx context.Context, resource pcom fIndex = formattedIndex } - document, err := e.model.encodeLog(resource, record, scope) + document, err := e.model.encodeLog(resource, resourceSchemaURL, record, scope, scopeSchemaURL) if err != nil { - return fmt.Errorf("Failed to encode log event: %w", err) + return fmt.Errorf("failed to encode log event: %w", err) } - return pushDocuments(ctx, fIndex, document, e.bulkIndexer) + return bulkIndexerSession.Add(ctx, fIndex, bytes.NewReader(document), nil) +} + +func (e *elasticsearchExporter) pushMetricsData( + ctx context.Context, + metrics pmetric.Metrics, +) error { + e.wg.Add(1) + defer e.wg.Done() + + session, err := e.bulkIndexer.StartSession(ctx) + if err != nil { + return err + } + defer session.End() + + var ( + validationErrs []error // log instead of returning these so that upstream does not retry + errs []error + ) + resourceMetrics := metrics.ResourceMetrics() + for i := 0; i < resourceMetrics.Len(); i++ { + resourceMetric := resourceMetrics.At(i) + resource := resourceMetric.Resource() + scopeMetrics := resourceMetric.ScopeMetrics() + + resourceDocs := make(map[string]map[uint32]objmodel.Document) + + for j := 0; j < scopeMetrics.Len(); j++ { + scopeMetrics := scopeMetrics.At(j) + scope := scopeMetrics.Scope() + for k := 0; k < scopeMetrics.Metrics().Len(); k++ { + metric := scopeMetrics.Metrics().At(k) + + upsertDataPoint := func(dp dataPoint) error { + fIndex, err := e.getMetricDataPointIndex(resource, scope, dp) + if err != nil { + return err + } + if _, ok := resourceDocs[fIndex]; !ok { + resourceDocs[fIndex] = make(map[uint32]objmodel.Document) + } + + if err = e.model.upsertMetricDataPointValue(resourceDocs[fIndex], resource, + resourceMetric.SchemaUrl(), scope, scopeMetrics.SchemaUrl(), metric, dp); err != nil { + return err + } + return nil + } + + switch metric.Type() { + case pmetric.MetricTypeSum: + dps := metric.Sum().DataPoints() + for l := 0; l < dps.Len(); l++ { + dp := dps.At(l) + if err := upsertDataPoint(newNumberDataPoint(dp)); err != nil { + validationErrs = append(validationErrs, err) + continue + } + } + case pmetric.MetricTypeGauge: + dps := metric.Gauge().DataPoints() + for l := 0; l < dps.Len(); l++ { + dp := dps.At(l) + if err := upsertDataPoint(newNumberDataPoint(dp)); err != nil { + validationErrs = append(validationErrs, err) + continue + } + } + case pmetric.MetricTypeExponentialHistogram: + if metric.ExponentialHistogram().AggregationTemporality() == pmetric.AggregationTemporalityCumulative { + validationErrs = append(validationErrs, fmt.Errorf("dropping cumulative temporality exponential histogram %q", metric.Name())) + continue + } + dps := metric.ExponentialHistogram().DataPoints() + for l := 0; l < dps.Len(); l++ { + dp := dps.At(l) + if err := upsertDataPoint(newExponentialHistogramDataPoint(dp)); err != nil { + validationErrs = append(validationErrs, err) + continue + } + } + case pmetric.MetricTypeHistogram: + if metric.Histogram().AggregationTemporality() == pmetric.AggregationTemporalityCumulative { + validationErrs = append(validationErrs, fmt.Errorf("dropping cumulative temporality histogram %q", metric.Name())) + continue + } + dps := metric.Histogram().DataPoints() + for l := 0; l < dps.Len(); l++ { + dp := dps.At(l) + if err := upsertDataPoint(newHistogramDataPoint(dp)); err != nil { + validationErrs = append(validationErrs, err) + continue + } + } + case pmetric.MetricTypeSummary: + dps := metric.Summary().DataPoints() + for l := 0; l < dps.Len(); l++ { + dp := dps.At(l) + if err := upsertDataPoint(newSummaryDataPoint(dp)); err != nil { + validationErrs = append(validationErrs, err) + continue + } + } + } + } + } + + if len(validationErrs) > 0 { + e.Logger.Warn("validation errors", zap.Error(errors.Join(validationErrs...))) + } + + for fIndex, docs := range resourceDocs { + for _, doc := range docs { + var ( + docBytes []byte + err error + ) + docBytes, err = e.model.encodeDocument(doc) + if err != nil { + errs = append(errs, err) + continue + } + if err := session.Add(ctx, fIndex, bytes.NewReader(docBytes), doc.DynamicTemplates()); err != nil { + if cerr := ctx.Err(); cerr != nil { + return cerr + } + errs = append(errs, err) + } + } + } + } + + if err := session.Flush(ctx); err != nil { + if cerr := ctx.Err(); cerr != nil { + return cerr + } + errs = append(errs, err) + } + return errors.Join(errs...) +} + +func (e *elasticsearchExporter) getMetricDataPointIndex( + resource pcommon.Resource, + scope pcommon.InstrumentationScope, + dataPoint dataPoint, +) (string, error) { + fIndex := e.index + if e.dynamicIndex { + fIndex = routeDataPoint(dataPoint.Attributes(), scope.Attributes(), resource.Attributes(), fIndex, e.otel, scope.Name()) + } + + if e.logstashFormat.Enabled { + formattedIndex, err := generateIndexWithLogstashFormat(fIndex, &e.logstashFormat, time.Now()) + if err != nil { + return "", err + } + fIndex = formattedIndex + } + return fIndex, nil } func (e *elasticsearchExporter) pushTraceData( ctx context.Context, td ptrace.Traces, ) error { + e.wg.Add(1) + defer e.wg.Done() + + session, err := e.bulkIndexer.StartSession(ctx) + if err != nil { + return err + } + defer session.End() + var errs []error resourceSpans := td.ResourceSpans() for i := 0; i < resourceSpans.Len(); i++ { @@ -131,26 +364,73 @@ func (e *elasticsearchExporter) pushTraceData( spans := scopeSpan.Spans() for k := 0; k < spans.Len(); k++ { span := spans.At(k) - if err := e.pushTraceRecord(ctx, resource, span, scope); err != nil { + if err := e.pushTraceRecord(ctx, resource, il.SchemaUrl(), span, scope, scopeSpan.SchemaUrl(), session); err != nil { if cerr := ctx.Err(); cerr != nil { return cerr } errs = append(errs, err) } + for ii := 0; ii < span.Events().Len(); ii++ { + spanEvent := span.Events().At(ii) + if err := e.pushSpanEvent(ctx, resource, il.SchemaUrl(), span, spanEvent, scope, scopeSpan.SchemaUrl(), session); err != nil { + errs = append(errs, err) + } + } } } } + if err := session.Flush(ctx); err != nil { + if cerr := ctx.Err(); cerr != nil { + return cerr + } + errs = append(errs, err) + } return errors.Join(errs...) } -func (e *elasticsearchExporter) pushTraceRecord(ctx context.Context, resource pcommon.Resource, span ptrace.Span, scope pcommon.InstrumentationScope) error { +func (e *elasticsearchExporter) pushTraceRecord( + ctx context.Context, + resource pcommon.Resource, + resourceSchemaURL string, + span ptrace.Span, + scope pcommon.InstrumentationScope, + scopeSchemaURL string, + bulkIndexerSession bulkIndexerSession, +) error { fIndex := e.index if e.dynamicIndex { - prefix := getFromAttributes(indexPrefix, resource, scope, span) - suffix := getFromAttributes(indexSuffix, resource, scope, span) + fIndex = routeSpan(span.Attributes(), scope.Attributes(), resource.Attributes(), fIndex, e.otel, span.Name()) + } - fIndex = fmt.Sprintf("%s%s%s", prefix, fIndex, suffix) + if e.logstashFormat.Enabled { + formattedIndex, err := generateIndexWithLogstashFormat(fIndex, &e.logstashFormat, time.Now()) + if err != nil { + return err + } + fIndex = formattedIndex + } + + document, err := e.model.encodeSpan(resource, resourceSchemaURL, span, scope, scopeSchemaURL) + if err != nil { + return fmt.Errorf("failed to encode trace record: %w", err) + } + return bulkIndexerSession.Add(ctx, fIndex, bytes.NewReader(document), nil) +} + +func (e *elasticsearchExporter) pushSpanEvent( + ctx context.Context, + resource pcommon.Resource, + resourceSchemaURL string, + span ptrace.Span, + spanEvent ptrace.SpanEvent, + scope pcommon.InstrumentationScope, + scopeSchemaURL string, + bulkIndexerSession bulkIndexerSession, +) error { + fIndex := e.index + if e.dynamicIndex { + fIndex = routeSpanEvent(spanEvent.Attributes(), scope.Attributes(), resource.Attributes(), fIndex, e.otel, scope.Name()) } if e.logstashFormat.Enabled { @@ -161,9 +441,13 @@ func (e *elasticsearchExporter) pushTraceRecord(ctx context.Context, resource pc fIndex = formattedIndex } - document, err := e.model.encodeSpan(resource, span, scope) + document := e.model.encodeSpanEvent(resource, resourceSchemaURL, span, spanEvent, scope, scopeSchemaURL) + if document == nil { + return nil + } + docBytes, err := e.model.encodeDocument(*document) if err != nil { - return fmt.Errorf("Failed to encode trace record: %w", err) + return err } - return pushDocuments(ctx, fIndex, document, e.bulkIndexer) + return bulkIndexerSession.Add(ctx, fIndex, bytes.NewReader(docBytes), nil) } diff --git a/exporter/elasticsearchexporter/exporter_test.go b/exporter/elasticsearchexporter/exporter_test.go index 77825911a7a2..5554c089e02b 100644 --- a/exporter/elasticsearchexporter/exporter_test.go +++ b/exporter/elasticsearchexporter/exporter_test.go @@ -6,10 +6,11 @@ package elasticsearchexporter import ( "context" "encoding/json" + "errors" "fmt" + "math" "net/http" "runtime" - "strings" "sync" "sync/atomic" "testing" @@ -17,17 +18,21 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/tidwall/gjson" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/config/configauth" + "go.opentelemetry.io/collector/config/configopaque" "go.opentelemetry.io/collector/exporter" "go.opentelemetry.io/collector/exporter/exportertest" + "go.opentelemetry.io/collector/extension/auth/authtest" + "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" + "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" ) func TestExporterLogs(t *testing.T) { - if runtime.GOOS == "windows" { - t.Skip("skipping test on Windows, see https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/10178") - } - t.Run("publish with success", func(t *testing.T) { rec := newBulkRecorder() server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { @@ -47,15 +52,9 @@ func TestExporterLogs(t *testing.T) { server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { rec.Record(docs) - var expectedDoc, actualDoc map[string]any - expected := []byte(`{"attrKey1":"abc","attrKey2":"def","application":"myapp","service":{"name":"myservice"},"error":{"stacktrace":"no no no no"},"agent":{"name":"otlp"},"@timestamp":"1970-01-01T00:00:00.000000000Z","message":"hello world"}`) - err := json.Unmarshal(expected, &expectedDoc) - require.NoError(t, err) - - actual := docs[0].Document - err = json.Unmarshal(actual, &actualDoc) - require.NoError(t, err) - assert.Equal(t, expectedDoc, actualDoc) + expected := `{"@timestamp":"1970-01-01T00:00:00.000000000Z","agent":{"name":"otlp"},"application":"myapp","attrKey1":"abc","attrKey2":"def","error":{"stacktrace":"no no no no"},"message":"hello world","service":{"name":"myservice"}}` + actual := string(docs[0].Document) + assert.Equal(t, expected, actual) return itemsAllOK(docs) }) @@ -63,15 +62,16 @@ func TestExporterLogs(t *testing.T) { exporter := newTestLogsExporter(t, server.URL, func(cfg *Config) { cfg.Mapping.Mode = "ecs" }) - logs := newLogsWithAttributeAndResourceMap( + logs := newLogsWithAttributes( // record attrs - map[string]string{ + map[string]any{ "application": "myapp", "service.name": "myservice", "exception.stacktrace": "no no no no", }, + nil, // resource attrs - map[string]string{ + map[string]any{ "attrKey1": "abc", "attrKey2": "def", }, @@ -81,6 +81,131 @@ func TestExporterLogs(t *testing.T) { rec.WaitItems(1) }) + t.Run("publish with bodymap encoding", func(t *testing.T) { + tableTests := []struct { + name string + body func() pcommon.Value + expected string + }{ + { + name: "flat", + body: func() pcommon.Value { + body := pcommon.NewValueMap() + m := body.Map() + m.PutStr("@timestamp", "2024-03-12T20:00:41.123456789Z") + m.PutInt("id", 1) + m.PutStr("key", "value") + return body + }, + expected: `{"@timestamp":"2024-03-12T20:00:41.123456789Z","id":1,"key":"value"}`, + }, + { + name: "dotted key", + body: func() pcommon.Value { + body := pcommon.NewValueMap() + m := body.Map() + m.PutInt("a", 1) + m.PutInt("a.b", 2) + m.PutInt("a.b.c", 3) + return body + }, + expected: `{"a":1,"a.b":2,"a.b.c":3}`, + }, + { + name: "slice", + body: func() pcommon.Value { + body := pcommon.NewValueMap() + m := body.Map() + s := m.PutEmptySlice("a") + for i := 0; i < 2; i++ { + s.AppendEmpty().SetInt(int64(i)) + } + return body + }, + expected: `{"a":[0,1]}`, + }, + { + name: "inner map", + body: func() pcommon.Value { + body := pcommon.NewValueMap() + m := body.Map() + m1 := m.PutEmptyMap("a") + m1.PutInt("b", 1) + m1.PutInt("c", 2) + return body + }, + expected: `{"a":{"b":1,"c":2}}`, + }, + { + name: "nested map", + body: func() pcommon.Value { + body := pcommon.NewValueMap() + m := body.Map() + m1 := m.PutEmptyMap("a") + m2 := m1.PutEmptyMap("b") + m2.PutInt("c", 1) + m2.PutInt("d", 2) + return body + }, + expected: `{"a":{"b":{"c":1,"d":2}}}`, + }, + } + + for _, tt := range tableTests { + t.Run(tt.name, func(t *testing.T) { + rec := newBulkRecorder() + server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { + rec.Record(docs) + assert.JSONEq(t, tt.expected, string(docs[0].Document)) + return itemsAllOK(docs) + }) + + exporter := newTestLogsExporter(t, server.URL, func(cfg *Config) { + cfg.Mapping.Mode = "bodymap" + }) + logs := plog.NewLogs() + resourceLogs := logs.ResourceLogs().AppendEmpty() + scopeLogs := resourceLogs.ScopeLogs().AppendEmpty() + logRecords := scopeLogs.LogRecords() + logRecord := logRecords.AppendEmpty() + tt.body().CopyTo(logRecord.Body()) + + mustSendLogs(t, exporter, logs) + rec.WaitItems(1) + }) + } + }) + + t.Run("drops log records for bodymap mode if body is not a map", func(t *testing.T) { + logs := plog.NewLogs() + resourceLogs := logs.ResourceLogs().AppendEmpty() + scopeLogs := resourceLogs.ScopeLogs().AppendEmpty() + logRecords := scopeLogs.LogRecords() + + // Invalid body type should be dropped. + logRecords.AppendEmpty().Body().SetEmptySlice() + + // We should still process the valid records in the batch. + bodyMap := logRecords.AppendEmpty().Body().SetEmptyMap() + bodyMap.PutInt("a", 42) + + rec := newBulkRecorder() + server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { + defer rec.Record(docs) + assert.Len(t, docs, 1) + assert.JSONEq(t, `{"a":42}`, string(docs[0].Document)) + return itemsAllOK(docs) + }) + + exporter := newTestLogsExporter(t, server.URL, func(cfg *Config) { + cfg.Mapping.Mode = "bodymap" + }) + + err := exporter.ConsumeLogs(context.Background(), logs) + assert.NoError(t, err) + rec.WaitItems(1) + }) + t.Run("publish with dedot", func(t *testing.T) { rec := newBulkRecorder() server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { @@ -96,8 +221,9 @@ func TestExporterLogs(t *testing.T) { cfg.Mapping.Mode = "ecs" cfg.Mapping.Dedot = true }) - logs := newLogsWithAttributeAndResourceMap( - map[string]string{"attr.key": "value"}, + logs := newLogsWithAttributes( + map[string]any{"attr.key": "value"}, + nil, nil, ) mustSendLogs(t, exporter, logs) @@ -107,7 +233,7 @@ func TestExporterLogs(t *testing.T) { t.Run("publish with dedup", func(t *testing.T) { rec := newBulkRecorder() server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { - assert.Equal(t, `{"@timestamp":"1970-01-01T00:00:00.000000000Z","Scope":{"name":"","value":"value","version":""},"SeverityNumber":0,"TraceFlags":0}`, string(docs[0].Document)) + assert.JSONEq(t, `{"@timestamp":"1970-01-01T00:00:00.000000000Z","Scope":{"name":"","value":"value","version":""},"SeverityNumber":0,"TraceFlags":0}`, string(docs[0].Document)) rec.Record(docs) return itemsAllOK(docs) }) @@ -116,10 +242,11 @@ func TestExporterLogs(t *testing.T) { cfg.Mapping.Mode = "raw" // dedup is the default }) - logs := newLogsWithAttributeAndResourceMap( + logs := newLogsWithAttributes( // Scope collides with the top-level "Scope" field, // so will be removed during deduplication. - map[string]string{"Scope": "value"}, + map[string]any{"Scope": "value"}, + nil, nil, ) mustSendLogs(t, exporter, logs) @@ -143,7 +270,7 @@ func TestExporterLogs(t *testing.T) { }) exporter := newTestLogsExporter(t, server.URL, func(cfg *Config) { - cfg.Headers = map[string]string{"foo": "bah"} + cfg.Headers = map[string]configopaque.String{"foo": "bah"} }) mustSendLogRecords(t, exporter, plog.NewLogRecord()) <-done @@ -164,14 +291,13 @@ func TestExporterLogs(t *testing.T) { }) exporter := newTestLogsExporter(t, server.URL, func(cfg *Config) { - cfg.Headers = map[string]string{"User-Agent": "overridden"} + cfg.Headers = map[string]configopaque.String{"User-Agent": "overridden"} }) mustSendLogRecords(t, exporter, plog.NewLogRecord()) <-done }) - t.Run("publish with dynamic index", func(t *testing.T) { - + t.Run("publish with dynamic index, prefix_suffix", func(t *testing.T) { rec := newBulkRecorder() var ( prefix = "resprefix-" @@ -182,16 +308,8 @@ func TestExporterLogs(t *testing.T) { server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { rec.Record(docs) - data, err := docs[0].Action.MarshalJSON() - assert.NoError(t, err) - - jsonVal := map[string]any{} - err = json.Unmarshal(data, &jsonVal) - assert.NoError(t, err) - - create := jsonVal["create"].(map[string]any) expected := fmt.Sprintf("%s%s%s", prefix, index, suffix) - assert.Equal(t, expected, create["_index"].(string)) + assert.Equal(t, expected, actionJSONToIndex(t, docs[0].Action)) return itemsAllOK(docs) }) @@ -200,12 +318,13 @@ func TestExporterLogs(t *testing.T) { cfg.LogsIndex = index cfg.LogsDynamicIndex.Enabled = true }) - logs := newLogsWithAttributeAndResourceMap( - map[string]string{ + logs := newLogsWithAttributes( + map[string]any{ indexPrefix: "attrprefix-", indexSuffix: suffix, }, - map[string]string{ + nil, + map[string]any{ indexPrefix: prefix, }, ) @@ -215,20 +334,42 @@ func TestExporterLogs(t *testing.T) { rec.WaitItems(1) }) - t.Run("publish with logstash index format enabled and dynamic index disabled", func(t *testing.T) { + t.Run("publish with dynamic index, data_stream", func(t *testing.T) { rec := newBulkRecorder() server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { rec.Record(docs) - data, err := docs[0].Action.MarshalJSON() - assert.NoError(t, err) + expected := "logs-record.dataset.____________-resource.namespace.-____________" + assert.Equal(t, expected, actionJSONToIndex(t, docs[0].Action)) - jsonVal := map[string]any{} - err = json.Unmarshal(data, &jsonVal) - assert.NoError(t, err) + return itemsAllOK(docs) + }) - create := jsonVal["create"].(map[string]any) - assert.Contains(t, create["_index"], "not-used-index") + exporter := newTestLogsExporter(t, server.URL, func(cfg *Config) { + cfg.LogsDynamicIndex.Enabled = true + }) + logs := newLogsWithAttributes( + map[string]any{ + dataStreamDataset: "record.dataset.\\/*?\"<>| ,#:", + }, + nil, + map[string]any{ + dataStreamDataset: "resource.dataset", + dataStreamNamespace: "resource.namespace.-\\/*?\"<>| ,#:", + }, + ) + logs.ResourceLogs().At(0).ScopeLogs().At(0).LogRecords().At(0).Body().SetStr("hello world") + mustSendLogs(t, exporter, logs) + + rec.WaitItems(1) + }) + + t.Run("publish with logstash index format enabled and dynamic index disabled", func(t *testing.T) { + rec := newBulkRecorder() + server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { + rec.Record(docs) + + assert.Contains(t, actionJSONToIndex(t, docs[0].Action), "not-used-index") return itemsAllOK(docs) }) @@ -237,7 +378,7 @@ func TestExporterLogs(t *testing.T) { cfg.LogstashFormat.Enabled = true cfg.LogsIndex = "not-used-index" }) - mustSendLogs(t, exporter, newLogsWithAttributeAndResourceMap(nil, nil)) + mustSendLogs(t, exporter, newLogsWithAttributes(nil, nil, nil)) rec.WaitItems(1) }) @@ -252,17 +393,8 @@ func TestExporterLogs(t *testing.T) { server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { rec.Record(docs) - data, err := docs[0].Action.MarshalJSON() - assert.NoError(t, err) - - jsonVal := map[string]any{} - err = json.Unmarshal(data, &jsonVal) - assert.NoError(t, err) - - create := jsonVal["create"].(map[string]any) expected := fmt.Sprintf("%s%s%s", prefix, index, suffix) - - assert.Equal(t, strings.Contains(create["_index"].(string), expected), true) + assert.Contains(t, actionJSONToIndex(t, docs[0].Action), expected) return itemsAllOK(docs) }) @@ -272,18 +404,118 @@ func TestExporterLogs(t *testing.T) { cfg.LogsDynamicIndex.Enabled = true cfg.LogstashFormat.Enabled = true }) - mustSendLogs(t, exporter, newLogsWithAttributeAndResourceMap( - map[string]string{ + mustSendLogs(t, exporter, newLogsWithAttributes( + map[string]any{ indexPrefix: "attrprefix-", indexSuffix: suffix, }, - map[string]string{ + nil, + map[string]any{ indexPrefix: prefix, }, )) rec.WaitItems(1) }) + t.Run("publish otel mapping mode", func(t *testing.T) { + for _, tc := range []struct { + body pcommon.Value + isEvent bool + wantDocument []byte + }{ + { + body: func() pcommon.Value { + return pcommon.NewValueStr("foo") + }(), + wantDocument: []byte(`{"@timestamp":"1970-01-01T00:00:00.000000000Z","attributes":{"attr.foo":"attr.foo.value"},"data_stream":{"dataset":"attr.dataset.otel","namespace":"resource.attribute.namespace","type":"logs"},"dropped_attributes_count":0,"observed_timestamp":"1970-01-01T00:00:00.000000000Z","resource":{"attributes":{"resource.attr.foo":"resource.attr.foo.value"},"dropped_attributes_count":0},"scope":{"dropped_attributes_count":0},"severity_number":0,"body":{"text":"foo"}}`), + }, + { + body: func() pcommon.Value { + vm := pcommon.NewValueMap() + m := vm.SetEmptyMap() + m.PutBool("true", true) + m.PutBool("false", false) + m.PutEmptyMap("inner").PutStr("foo", "bar") + return vm + }(), + wantDocument: []byte(`{"@timestamp":"1970-01-01T00:00:00.000000000Z","attributes":{"attr.foo":"attr.foo.value"},"data_stream":{"dataset":"attr.dataset.otel","namespace":"resource.attribute.namespace","type":"logs"},"dropped_attributes_count":0,"observed_timestamp":"1970-01-01T00:00:00.000000000Z","resource":{"attributes":{"resource.attr.foo":"resource.attr.foo.value"},"dropped_attributes_count":0},"scope":{"dropped_attributes_count":0},"severity_number":0,"body":{"flattened":{"true":true,"false":false,"inner":{"foo":"bar"}}}}`), + }, + { + body: func() pcommon.Value { + vm := pcommon.NewValueMap() + m := vm.SetEmptyMap() + m.PutBool("true", true) + m.PutBool("false", false) + m.PutEmptyMap("inner").PutStr("foo", "bar") + return vm + }(), + isEvent: true, + wantDocument: []byte(`{"@timestamp":"1970-01-01T00:00:00.000000000Z","attributes":{"attr.foo":"attr.foo.value","event.name":"foo"},"data_stream":{"dataset":"attr.dataset.otel","namespace":"resource.attribute.namespace","type":"logs"},"dropped_attributes_count":0,"observed_timestamp":"1970-01-01T00:00:00.000000000Z","resource":{"attributes":{"resource.attr.foo":"resource.attr.foo.value"},"dropped_attributes_count":0},"scope":{"dropped_attributes_count":0},"severity_number":0,"body":{"structured":{"true":true,"false":false,"inner":{"foo":"bar"}}}}`), + }, + { + body: func() pcommon.Value { + vs := pcommon.NewValueSlice() + s := vs.Slice() + s.AppendEmpty().SetStr("foo") + s.AppendEmpty().SetBool(false) + s.AppendEmpty().SetEmptyMap().PutStr("foo", "bar") + return vs + }(), + wantDocument: []byte(`{"@timestamp":"1970-01-01T00:00:00.000000000Z","attributes":{"attr.foo":"attr.foo.value"},"data_stream":{"dataset":"attr.dataset.otel","namespace":"resource.attribute.namespace","type":"logs"},"dropped_attributes_count":0,"observed_timestamp":"1970-01-01T00:00:00.000000000Z","resource":{"attributes":{"resource.attr.foo":"resource.attr.foo.value"},"dropped_attributes_count":0},"scope":{"dropped_attributes_count":0},"severity_number":0,"body":{"flattened":{"value":["foo",false,{"foo":"bar"}]}}}`), + }, + { + body: func() pcommon.Value { + vs := pcommon.NewValueSlice() + s := vs.Slice() + s.AppendEmpty().SetStr("foo") + s.AppendEmpty().SetBool(false) + s.AppendEmpty().SetEmptyMap().PutStr("foo", "bar") + return vs + }(), + isEvent: true, + wantDocument: []byte(`{"@timestamp":"1970-01-01T00:00:00.000000000Z","attributes":{"attr.foo":"attr.foo.value","event.name":"foo"},"data_stream":{"dataset":"attr.dataset.otel","namespace":"resource.attribute.namespace","type":"logs"},"dropped_attributes_count":0,"observed_timestamp":"1970-01-01T00:00:00.000000000Z","resource":{"attributes":{"resource.attr.foo":"resource.attr.foo.value"},"dropped_attributes_count":0},"scope":{"dropped_attributes_count":0},"severity_number":0,"body":{"structured":{"value":["foo",false,{"foo":"bar"}]}}}`), + }, + } { + rec := newBulkRecorder() + server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { + rec.Record(docs) + return itemsAllOK(docs) + }) + + exporter := newTestLogsExporter(t, server.URL, func(cfg *Config) { + cfg.LogsDynamicIndex.Enabled = true + cfg.Mapping.Mode = "otel" + }) + recordAttrs := map[string]any{ + "data_stream.dataset": "attr.dataset", + "attr.foo": "attr.foo.value", + } + if tc.isEvent { + recordAttrs["event.name"] = "foo" + } + logs := newLogsWithAttributes( + recordAttrs, + nil, + map[string]any{ + "data_stream.dataset": "resource.attribute.dataset", + "data_stream.namespace": "resource.attribute.namespace", + "resource.attr.foo": "resource.attr.foo.value", + }, + ) + tc.body.CopyTo(logs.ResourceLogs().At(0).ScopeLogs().At(0).LogRecords().At(0).Body()) + mustSendLogs(t, exporter, logs) + + expected := []itemRequest{ + { + Action: []byte(`{"create":{"_index":"logs-attr.dataset.otel-resource.attribute.namespace"}}`), + Document: tc.wantDocument, + }, + } + + assertRecordedItems(t, expected, rec, false) + } + }) + t.Run("retry http request", func(t *testing.T) { failures := 0 rec := newBulkRecorder() @@ -305,14 +537,10 @@ func TestExporterLogs(t *testing.T) { t.Run("no retry", func(t *testing.T) { configurations := map[string]func(*Config){ - "max_requests limited": func(cfg *Config) { - cfg.Retry.MaxRequests = 1 - cfg.Retry.InitialInterval = 1 * time.Millisecond - cfg.Retry.MaxInterval = 10 * time.Millisecond - }, "retry.enabled is false": func(cfg *Config) { cfg.Retry.Enabled = false - cfg.Retry.MaxRequests = 10 + cfg.Retry.RetryOnStatus = []int{429} + cfg.Retry.MaxRetries = 10 cfg.Retry.InitialInterval = 1 * time.Millisecond cfg.Retry.MaxInterval = 10 * time.Millisecond }, @@ -322,7 +550,7 @@ func TestExporterLogs(t *testing.T) { "fail http request": func(attempts *atomic.Int64) bulkHandler { return func([]itemRequest) ([]itemResponse, error) { attempts.Add(1) - return nil, &httpTestError{message: "oops"} + return nil, &httpTestError{message: "oops", status: 429} } }, "fail item": func(attempts *atomic.Int64) bulkHandler { @@ -334,11 +562,9 @@ func TestExporterLogs(t *testing.T) { } for name, handler := range handlers { - handler := handler t.Run(name, func(t *testing.T) { t.Parallel() for name, configurer := range configurations { - configurer := configurer t.Run(name, func(t *testing.T) { t.Parallel() attempts := &atomic.Int64{} @@ -451,179 +677,1155 @@ func TestExporterLogs(t *testing.T) { assert.Equal(t, [3]int{1, 2, 1}, attempts) }) -} -func TestExporterTraces(t *testing.T) { - if runtime.GOOS == "windows" { - t.Skip("skipping test on Windows, see https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/14759") - } - - t.Run("publish with success", func(t *testing.T) { + t.Run("otel mode attribute array value", func(t *testing.T) { rec := newBulkRecorder() server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { rec.Record(docs) return itemsAllOK(docs) }) - exporter := newTestTracesExporter(t, server.URL) - mustSendSpans(t, exporter, ptrace.NewSpan()) - mustSendSpans(t, exporter, ptrace.NewSpan()) + exporter := newTestLogsExporter(t, server.URL, func(cfg *Config) { + cfg.Mapping.Mode = "otel" + }) - rec.WaitItems(2) - }) + mustSendLogs(t, exporter, newLogsWithAttributes(map[string]any{ + "some.record.attribute": []string{"foo", "bar"}, + }, map[string]any{ + "some.scope.attribute": []string{"foo", "bar"}, + }, map[string]any{ + "some.resource.attribute": []string{"foo", "bar"}, + })) + + rec.WaitItems(1) - t.Run("publish with dynamic index", func(t *testing.T) { + assert.Len(t, rec.Items(), 1) + doc := rec.Items()[0].Document + assert.JSONEq(t, `{"some.record.attribute":["foo","bar"]}`, gjson.GetBytes(doc, `attributes`).Raw) + assert.JSONEq(t, `{"some.scope.attribute":["foo","bar"]}`, gjson.GetBytes(doc, `scope.attributes`).Raw) + assert.JSONEq(t, `{"some.resource.attribute":["foo","bar"]}`, gjson.GetBytes(doc, `resource.attributes`).Raw) + }) + t.Run("otel mode attribute key prefix conflict", func(t *testing.T) { rec := newBulkRecorder() - var ( - prefix = "resprefix-" - suffix = "-attrsuffix" - index = "someindex" - ) + server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { + rec.Record(docs) + return itemsAllOK(docs) + }) + + exporter := newTestLogsExporter(t, server.URL, func(cfg *Config) { + cfg.Mapping.Mode = "otel" + }) + + mustSendLogs(t, exporter, newLogsWithAttributes(map[string]any{ + "a": "a", + "a.b": "a.b", + }, map[string]any{ + "a": "a", + "a.b": "a.b", + }, map[string]any{ + "a": "a", + "a.b": "a.b", + })) + + rec.WaitItems(1) + doc := rec.Items()[0].Document + assert.JSONEq(t, `{"a":"a","a.b":"a.b"}`, gjson.GetBytes(doc, `attributes`).Raw) + assert.JSONEq(t, `{"a":"a","a.b":"a.b"}`, gjson.GetBytes(doc, `scope.attributes`).Raw) + assert.JSONEq(t, `{"a":"a","a.b":"a.b"}`, gjson.GetBytes(doc, `resource.attributes`).Raw) + }) +} +func TestExporterMetrics(t *testing.T) { + t.Run("publish with success", func(t *testing.T) { + rec := newBulkRecorder() server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { rec.Record(docs) + return itemsAllOK(docs) + }) - data, err := docs[0].Action.MarshalJSON() - assert.NoError(t, err) + exporter := newTestMetricsExporter(t, server.URL, func(cfg *Config) { + cfg.Mapping.Mode = "ecs" + }) + dp := pmetric.NewNumberDataPoint() + dp.SetDoubleValue(123.456) + dp.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) + mustSendMetricSumDataPoints(t, exporter, dp) + mustSendMetricGaugeDataPoints(t, exporter, dp) - jsonVal := map[string]any{} - err = json.Unmarshal(data, &jsonVal) - assert.NoError(t, err) + rec.WaitItems(2) + }) - create := jsonVal["create"].(map[string]any) + t.Run("publish with dynamic index, prefix_suffix", func(t *testing.T) { + rec := newBulkRecorder() + server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { + rec.Record(docs) - expected := fmt.Sprintf("%s%s%s", prefix, index, suffix) - assert.Equal(t, expected, create["_index"].(string)) + expected := "resource.prefix-metrics.index-resource.suffix" + assert.Equal(t, expected, actionJSONToIndex(t, docs[0].Action)) return itemsAllOK(docs) }) - exporter := newTestTracesExporter(t, server.URL, func(cfg *Config) { - cfg.TracesIndex = index - cfg.TracesDynamicIndex.Enabled = true + exporter := newTestMetricsExporter(t, server.URL, func(cfg *Config) { + cfg.MetricsIndex = "metrics.index" + cfg.Mapping.Mode = "ecs" }) - - mustSendTraces(t, exporter, newTracesWithAttributeAndResourceMap( - map[string]string{ - indexPrefix: "attrprefix-", - indexSuffix: suffix, + metrics := newMetricsWithAttributes( + map[string]any{ + indexSuffix: "-data.point.suffix", }, - map[string]string{ - indexPrefix: prefix, + nil, + map[string]any{ + indexPrefix: "resource.prefix-", + indexSuffix: "-resource.suffix", }, - )) + ) + metrics.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics().At(0).SetName("my.metric") + metrics.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics().At(0).SetEmptySum().DataPoints().AppendEmpty().SetIntValue(0) + mustSendMetrics(t, exporter, metrics) rec.WaitItems(1) }) - t.Run("publish with logstash format index", func(t *testing.T) { - var defaultCfg Config - + t.Run("publish with dynamic index, data_stream", func(t *testing.T) { rec := newBulkRecorder() server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { rec.Record(docs) - data, err := docs[0].Action.MarshalJSON() - assert.NoError(t, err) - - jsonVal := map[string]any{} - err = json.Unmarshal(data, &jsonVal) - assert.NoError(t, err) - - create := jsonVal["create"].(map[string]any) - - assert.Equal(t, strings.Contains(create["_index"].(string), defaultCfg.TracesIndex), true) + expected := "metrics-resource.dataset.____________-data.point.namespace.-____________" + assert.Equal(t, expected, actionJSONToIndex(t, docs[0].Action)) return itemsAllOK(docs) }) - exporter := newTestTracesExporter(t, server.URL, func(cfg *Config) { - cfg.LogstashFormat.Enabled = true - cfg.TracesIndex = "not-used-index" - defaultCfg = *cfg + exporter := newTestMetricsExporter(t, server.URL, func(cfg *Config) { + cfg.MetricsIndex = "metrics.index" + cfg.Mapping.Mode = "ecs" }) - - mustSendTraces(t, exporter, newTracesWithAttributeAndResourceMap(nil, nil)) + metrics := newMetricsWithAttributes( + map[string]any{ + dataStreamNamespace: "data.point.namespace.-\\/*?\"<>| ,#:", + }, + nil, + map[string]any{ + dataStreamDataset: "resource.dataset.\\/*?\"<>| ,#:", + dataStreamNamespace: "resource.namespace", + }, + ) + metrics.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics().At(0).SetName("my.metric") + mustSendMetrics(t, exporter, metrics) rec.WaitItems(1) }) - t.Run("publish with logstash format index and dynamic index enabled", func(t *testing.T) { - var ( - prefix = "resprefix-" - suffix = "-attrsuffix" - index = "someindex" - ) - + t.Run("publish with metrics grouping", func(t *testing.T) { rec := newBulkRecorder() server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { rec.Record(docs) + return itemsAllOK(docs) + }) - data, err := docs[0].Action.MarshalJSON() - assert.NoError(t, err) + exporter := newTestMetricsExporter(t, server.URL, func(cfg *Config) { + cfg.MetricsIndex = "metrics.index" + cfg.Mapping.Mode = "ecs" + }) - jsonVal := map[string]any{} - err = json.Unmarshal(data, &jsonVal) - assert.NoError(t, err) + addToMetricSlice := func(metricSlice pmetric.MetricSlice) { + fooMetric := metricSlice.AppendEmpty() + fooMetric.SetName("metric.foo") + fooDps := fooMetric.SetEmptyGauge().DataPoints() + fooDp := fooDps.AppendEmpty() + fooDp.SetIntValue(1) + fooOtherDp := fooDps.AppendEmpty() + fillAttributeMap(fooOtherDp.Attributes(), map[string]any{ + "dp.attribute": "dp.attribute.value", + }) + fooOtherDp.SetDoubleValue(1.0) + + barMetric := metricSlice.AppendEmpty() + barMetric.SetName("metric.bar") + barDps := barMetric.SetEmptyGauge().DataPoints() + barDp := barDps.AppendEmpty() + barDp.SetDoubleValue(1.0) + barOtherDp := barDps.AppendEmpty() + fillAttributeMap(barOtherDp.Attributes(), map[string]any{ + "dp.attribute": "dp.attribute.value", + }) + barOtherDp.SetDoubleValue(1.0) + barOtherIndexDp := barDps.AppendEmpty() + fillAttributeMap(barOtherIndexDp.Attributes(), map[string]any{ + "dp.attribute": "dp.attribute.value", + dataStreamNamespace: "bar", + }) + barOtherIndexDp.SetDoubleValue(1.0) + + bazMetric := metricSlice.AppendEmpty() + bazMetric.SetName("metric.baz") + bazDps := bazMetric.SetEmptyGauge().DataPoints() + bazDp := bazDps.AppendEmpty() + bazDp.SetTimestamp(pcommon.NewTimestampFromTime(time.Unix(3600, 0))) + bazDp.SetDoubleValue(1.0) + } - create := jsonVal["create"].(map[string]any) - expected := fmt.Sprintf("%s%s%s", prefix, index, suffix) + metrics := pmetric.NewMetrics() + resourceMetrics := metrics.ResourceMetrics().AppendEmpty() + fillAttributeMap(resourceMetrics.Resource().Attributes(), map[string]any{ + dataStreamNamespace: "resource.namespace", + }) + scopeA := resourceMetrics.ScopeMetrics().AppendEmpty() + addToMetricSlice(scopeA.Metrics()) + + scopeB := resourceMetrics.ScopeMetrics().AppendEmpty() + fillAttributeMap(scopeB.Scope().Attributes(), map[string]any{ + dataStreamDataset: "scope.b", + }) + addToMetricSlice(scopeB.Metrics()) - assert.Equal(t, strings.Contains(create["_index"].(string), expected), true) + mustSendMetrics(t, exporter, metrics) + expected := []itemRequest{ + { + Action: []byte(`{"create":{"_index":"metrics-generic-bar"}}`), + Document: []byte(`{"@timestamp":"1970-01-01T00:00:00.000000000Z","data_stream":{"dataset":"generic","namespace":"bar","type":"metrics"},"dp":{"attribute":"dp.attribute.value"},"metric":{"bar":1.0}}`), + }, + { + Action: []byte(`{"create":{"_index":"metrics-generic-resource.namespace"}}`), + Document: []byte(`{"@timestamp":"1970-01-01T00:00:00.000000000Z","data_stream":{"dataset":"generic","namespace":"resource.namespace","type":"metrics"},"dp":{"attribute":"dp.attribute.value"},"metric":{"bar":1.0,"foo":1.0}}`), + }, + { + Action: []byte(`{"create":{"_index":"metrics-generic-resource.namespace"}}`), + Document: []byte(`{"@timestamp":"1970-01-01T00:00:00.000000000Z","data_stream":{"dataset":"generic","namespace":"resource.namespace","type":"metrics"},"metric":{"bar":1.0,"foo":1}}`), + }, + { + Action: []byte(`{"create":{"_index":"metrics-generic-resource.namespace"}}`), + Document: []byte(`{"@timestamp":"1970-01-01T01:00:00.000000000Z","data_stream":{"dataset":"generic","namespace":"resource.namespace","type":"metrics"},"metric":{"baz":1.0}}`), + }, + { + Action: []byte(`{"create":{"_index":"metrics-scope.b-bar"}}`), + Document: []byte(`{"@timestamp":"1970-01-01T00:00:00.000000000Z","data_stream":{"dataset":"scope.b","namespace":"bar","type":"metrics"},"dp":{"attribute":"dp.attribute.value"},"metric":{"bar":1.0}}`), + }, + { + Action: []byte(`{"create":{"_index":"metrics-scope.b-resource.namespace"}}`), + Document: []byte(`{"@timestamp":"1970-01-01T00:00:00.000000000Z","data_stream":{"dataset":"scope.b","namespace":"resource.namespace","type":"metrics"},"dp":{"attribute":"dp.attribute.value"},"metric":{"bar":1.0,"foo":1.0}}`), + }, + { + Action: []byte(`{"create":{"_index":"metrics-scope.b-resource.namespace"}}`), + Document: []byte(`{"@timestamp":"1970-01-01T00:00:00.000000000Z","data_stream":{"dataset":"scope.b","namespace":"resource.namespace","type":"metrics"},"metric":{"bar":1.0,"foo":1}}`), + }, + { + Action: []byte(`{"create":{"_index":"metrics-scope.b-resource.namespace"}}`), + Document: []byte(`{"@timestamp":"1970-01-01T01:00:00.000000000Z","data_stream":{"dataset":"scope.b","namespace":"resource.namespace","type":"metrics"},"metric":{"baz":1.0}}`), + }, + } + + assertRecordedItems(t, expected, rec, false) + }) + + t.Run("publish histogram", func(t *testing.T) { + rec := newBulkRecorder() + server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { + rec.Record(docs) return itemsAllOK(docs) }) - exporter := newTestTracesExporter(t, server.URL, func(cfg *Config) { - cfg.TracesIndex = index - cfg.TracesDynamicIndex.Enabled = true - cfg.LogstashFormat.Enabled = true + exporter := newTestMetricsExporter(t, server.URL, func(cfg *Config) { + cfg.Mapping.Mode = "ecs" }) - mustSendTraces(t, exporter, newTracesWithAttributeAndResourceMap( - map[string]string{ - indexPrefix: "attrprefix-", - indexSuffix: suffix, + metrics := pmetric.NewMetrics() + resourceMetrics := metrics.ResourceMetrics().AppendEmpty() + scopeA := resourceMetrics.ScopeMetrics().AppendEmpty() + metricSlice := scopeA.Metrics() + fooMetric := metricSlice.AppendEmpty() + fooMetric.SetName("metric.foo") + fooHistogram := fooMetric.SetEmptyHistogram() + fooHistogram.SetAggregationTemporality(pmetric.AggregationTemporalityDelta) + fooDps := fooHistogram.DataPoints() + fooDp := fooDps.AppendEmpty() + fooDp.ExplicitBounds().FromRaw([]float64{1.0, 2.0, 3.0}) + fooDp.BucketCounts().FromRaw([]uint64{1, 2, 3, 4}) + fooOtherDp := fooDps.AppendEmpty() + fooOtherDp.SetTimestamp(pcommon.NewTimestampFromTime(time.Unix(3600, 0))) + fooOtherDp.ExplicitBounds().FromRaw([]float64{4.0, 5.0, 6.0}) + fooOtherDp.BucketCounts().FromRaw([]uint64{4, 5, 6, 7}) + + mustSendMetrics(t, exporter, metrics) + + expected := []itemRequest{ + { + Action: []byte(`{"create":{"_index":"metrics-generic-default"}}`), + Document: []byte(`{"@timestamp":"1970-01-01T00:00:00.000000000Z","data_stream":{"dataset":"generic","namespace":"default","type":"metrics"},"metric":{"foo":{"counts":[1,2,3,4],"values":[0.5,1.5,2.5,3.0]}}}`), }, - map[string]string{ - indexPrefix: prefix, + { + Action: []byte(`{"create":{"_index":"metrics-generic-default"}}`), + Document: []byte(`{"@timestamp":"1970-01-01T01:00:00.000000000Z","data_stream":{"dataset":"generic","namespace":"default","type":"metrics"},"metric":{"foo":{"counts":[4,5,6,7],"values":[2.0,4.5,5.5,6.0]}}}`), }, - )) - rec.WaitItems(1) - }) -} + } -func newTestTracesExporter(t *testing.T, url string, fns ...func(*Config)) exporter.Traces { - f := NewFactory() - cfg := withDefaultConfig(append([]func(*Config){func(cfg *Config) { - cfg.Endpoints = []string{url} - cfg.NumWorkers = 1 - cfg.Flush.Interval = 10 * time.Millisecond - }}, fns...)...) - exp, err := f.CreateTracesExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) - require.NoError(t, err) - t.Cleanup(func() { - require.NoError(t, exp.Shutdown(context.Background())) + assertRecordedItems(t, expected, rec, false) }) - return exp -} -func newTestLogsExporter(t *testing.T, url string, fns ...func(*Config)) exporter.Logs { - f := NewFactory() - cfg := withDefaultConfig(append([]func(*Config){func(cfg *Config) { - cfg.Endpoints = []string{url} - cfg.NumWorkers = 1 - cfg.Flush.Interval = 10 * time.Millisecond - }}, fns...)...) - exp, err := f.CreateLogsExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) - require.NoError(t, err) + t.Run("publish exponential histogram", func(t *testing.T) { + rec := newBulkRecorder() + server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { + rec.Record(docs) + return itemsAllOK(docs) + }) + + exporter := newTestMetricsExporter(t, server.URL, func(cfg *Config) { + cfg.Mapping.Mode = "ecs" + }) + + metrics := pmetric.NewMetrics() + resourceMetrics := metrics.ResourceMetrics().AppendEmpty() + scopeA := resourceMetrics.ScopeMetrics().AppendEmpty() + metricSlice := scopeA.Metrics() + fooMetric := metricSlice.AppendEmpty() + fooMetric.SetName("metric.foo") + fooHistogram := fooMetric.SetEmptyExponentialHistogram() + fooHistogram.SetAggregationTemporality(pmetric.AggregationTemporalityDelta) + fooDps := fooHistogram.DataPoints() + fooDp := fooDps.AppendEmpty() + fooDp.SetZeroCount(2) + fooDp.Positive().SetOffset(1) + fooDp.Positive().BucketCounts().FromRaw([]uint64{0, 1, 1, 0}) + + fooDp.Negative().SetOffset(1) + fooDp.Negative().BucketCounts().FromRaw([]uint64{1, 0, 0, 1}) + + mustSendMetrics(t, exporter, metrics) + + expected := []itemRequest{ + { + Action: []byte(`{"create":{"_index":"metrics-generic-default"}}`), + Document: []byte(`{"@timestamp":"1970-01-01T00:00:00.000000000Z","data_stream":{"dataset":"generic","namespace":"default","type":"metrics"},"metric":{"foo":{"counts":[1,1,2,1,1],"values":[-24.0,-3.0,0.0,6.0,12.0]}}}`), + }, + } + + assertRecordedItems(t, expected, rec, false) + }) + + t.Run("publish histogram cumulative temporality", func(t *testing.T) { + server := newESTestServer(t, func(_ []itemRequest) ([]itemResponse, error) { + require.Fail(t, "unexpected request") + return nil, nil + }) + + exporter := newTestMetricsExporter(t, server.URL, func(cfg *Config) { + cfg.Mapping.Mode = "ecs" + }) + + metrics := pmetric.NewMetrics() + resourceMetrics := metrics.ResourceMetrics().AppendEmpty() + scopeA := resourceMetrics.ScopeMetrics().AppendEmpty() + metricSlice := scopeA.Metrics() + fooMetric := metricSlice.AppendEmpty() + fooMetric.SetName("metric.foo") + fooHistogram := fooMetric.SetEmptyHistogram() + fooHistogram.SetAggregationTemporality(pmetric.AggregationTemporalityCumulative) + fooDps := fooHistogram.DataPoints() + fooDp := fooDps.AppendEmpty() + fooDp.ExplicitBounds().FromRaw([]float64{1.0, 2.0, 3.0}) + fooDp.BucketCounts().FromRaw([]uint64{1, 2, 3, 4}) + + err := exporter.ConsumeMetrics(context.Background(), metrics) + assert.NoError(t, err) + }) + + t.Run("publish exponential histogram cumulative temporality", func(t *testing.T) { + server := newESTestServer(t, func(_ []itemRequest) ([]itemResponse, error) { + require.Fail(t, "unexpected request") + return nil, nil + }) + + exporter := newTestMetricsExporter(t, server.URL, func(cfg *Config) { + cfg.Mapping.Mode = "ecs" + }) + + metrics := pmetric.NewMetrics() + resourceMetrics := metrics.ResourceMetrics().AppendEmpty() + scopeA := resourceMetrics.ScopeMetrics().AppendEmpty() + metricSlice := scopeA.Metrics() + fooMetric := metricSlice.AppendEmpty() + fooMetric.SetName("metric.foo") + fooHistogram := fooMetric.SetEmptyExponentialHistogram() + fooHistogram.SetAggregationTemporality(pmetric.AggregationTemporalityCumulative) + fooDps := fooHistogram.DataPoints() + fooDp := fooDps.AppendEmpty() + fooDp.SetZeroCount(2) + fooDp.Positive().SetOffset(1) + fooDp.Positive().BucketCounts().FromRaw([]uint64{0, 1, 1, 0}) + + fooDp.Negative().SetOffset(1) + fooDp.Negative().BucketCounts().FromRaw([]uint64{1, 0, 0, 1}) + + err := exporter.ConsumeMetrics(context.Background(), metrics) + assert.NoError(t, err) + }) + + t.Run("publish only valid data points", func(t *testing.T) { + rec := newBulkRecorder() + server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { + rec.Record(docs) + return itemsAllOK(docs) + }) + + exporter := newTestMetricsExporter(t, server.URL, func(cfg *Config) { + cfg.Mapping.Mode = "ecs" + }) + + metrics := pmetric.NewMetrics() + resourceMetrics := metrics.ResourceMetrics().AppendEmpty() + scopeA := resourceMetrics.ScopeMetrics().AppendEmpty() + metricSlice := scopeA.Metrics() + fooMetric := metricSlice.AppendEmpty() + fooMetric.SetName("metric.foo") + fooHistogram := fooMetric.SetEmptyHistogram() + fooHistogram.SetAggregationTemporality(pmetric.AggregationTemporalityDelta) + fooDps := fooHistogram.DataPoints() + fooDp := fooDps.AppendEmpty() + fooDp.ExplicitBounds().FromRaw([]float64{1.0, 2.0, 3.0}) + fooDp.BucketCounts().FromRaw([]uint64{}) + fooOtherDp := fooDps.AppendEmpty() + fooOtherDp.SetTimestamp(pcommon.NewTimestampFromTime(time.Unix(3600, 0))) + fooOtherDp.ExplicitBounds().FromRaw([]float64{4.0, 5.0, 6.0}) + fooOtherDp.BucketCounts().FromRaw([]uint64{4, 5, 6, 7}) + barMetric := metricSlice.AppendEmpty() + barMetric.SetName("metric.bar") + barDps := barMetric.SetEmptySum().DataPoints() + barDp := barDps.AppendEmpty() + barDp.SetDoubleValue(math.Inf(1)) + barOtherDp := barDps.AppendEmpty() + barOtherDp.SetDoubleValue(1.0) + + err := exporter.ConsumeMetrics(context.Background(), metrics) + assert.NoError(t, err) + + expected := []itemRequest{ + { + Action: []byte(`{"create":{"_index":"metrics-generic-default"}}`), + Document: []byte(`{"@timestamp":"1970-01-01T00:00:00.000000000Z","data_stream":{"dataset":"generic","namespace":"default","type":"metrics"},"metric":{"bar":1.0}}`), + }, + { + Action: []byte(`{"create":{"_index":"metrics-generic-default"}}`), + Document: []byte(`{"@timestamp":"1970-01-01T01:00:00.000000000Z","data_stream":{"dataset":"generic","namespace":"default","type":"metrics"},"metric":{"foo":{"counts":[4,5,6,7],"values":[2.0,4.5,5.5,6.0]}}}`), + }, + } + + assertRecordedItems(t, expected, rec, false) + }) + + t.Run("otel mode", func(t *testing.T) { + rec := newBulkRecorder() + server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { + rec.Record(docs) + return itemsAllOK(docs) + }) + + exporter := newTestMetricsExporter(t, server.URL, func(cfg *Config) { + cfg.Mapping.Mode = "otel" + }) + + metrics := pmetric.NewMetrics() + resourceMetrics := metrics.ResourceMetrics().AppendEmpty() + scopeA := resourceMetrics.ScopeMetrics().AppendEmpty() + metricSlice := scopeA.Metrics() + fooMetric := metricSlice.AppendEmpty() + fooMetric.SetName("metric.foo") + fooHistogram := fooMetric.SetEmptyHistogram() + fooHistogram.SetAggregationTemporality(pmetric.AggregationTemporalityDelta) + fooDps := fooHistogram.DataPoints() + fooDp := fooDps.AppendEmpty() + fooDp.ExplicitBounds().FromRaw([]float64{1.0, 2.0, 3.0}) + fooDp.BucketCounts().FromRaw([]uint64{1, 2, 3, 4}) + fooOtherDp := fooDps.AppendEmpty() + fooOtherDp.SetTimestamp(pcommon.NewTimestampFromTime(time.Unix(3600, 0))) + fooOtherDp.ExplicitBounds().FromRaw([]float64{4.0, 5.0, 6.0}) + fooOtherDp.BucketCounts().FromRaw([]uint64{4, 5, 6, 7}) + + sumMetric := metricSlice.AppendEmpty() + sumMetric.SetName("metric.sum") + sumDps := sumMetric.SetEmptySum().DataPoints() + sumDp := sumDps.AppendEmpty() + sumDp.SetTimestamp(pcommon.NewTimestampFromTime(time.Unix(3600, 0))) + sumDp.SetStartTimestamp(pcommon.NewTimestampFromTime(time.Unix(7200, 0))) + sumDp.SetDoubleValue(1.5) + + summaryMetric := metricSlice.AppendEmpty() + summaryMetric.SetName("metric.summary") + summaryDps := summaryMetric.SetEmptySummary().DataPoints() + summaryDp := summaryDps.AppendEmpty() + summaryDp.SetTimestamp(pcommon.NewTimestampFromTime(time.Unix(3*3600, 0))) + summaryDp.SetStartTimestamp(pcommon.NewTimestampFromTime(time.Unix(3*3600, 0))) + summaryDp.SetCount(1) + summaryDp.SetSum(1.5) + + mustSendMetrics(t, exporter, metrics) + + expected := []itemRequest{ + { + Action: []byte(`{"create":{"_index":"metrics-generic.otel-default","dynamic_templates":{"metrics.metric.foo":"histogram"}}}`), + Document: []byte(`{"@timestamp":"1970-01-01T00:00:00.000000000Z","data_stream":{"dataset":"generic.otel","namespace":"default","type":"metrics"},"metrics":{"metric.foo":{"counts":[1,2,3,4],"values":[0.5,1.5,2.5,3.0]}},"resource":{"dropped_attributes_count":0},"scope":{"dropped_attributes_count":0}}`), + }, + { + Action: []byte(`{"create":{"_index":"metrics-generic.otel-default","dynamic_templates":{"metrics.metric.foo":"histogram"}}}`), + Document: []byte(`{"@timestamp":"1970-01-01T01:00:00.000000000Z","data_stream":{"dataset":"generic.otel","namespace":"default","type":"metrics"},"metrics":{"metric.foo":{"counts":[4,5,6,7],"values":[2.0,4.5,5.5,6.0]}},"resource":{"dropped_attributes_count":0},"scope":{"dropped_attributes_count":0}}`), + }, + { + Action: []byte(`{"create":{"_index":"metrics-generic.otel-default","dynamic_templates":{"metrics.metric.sum":"gauge_double"}}}`), + Document: []byte(`{"@timestamp":"1970-01-01T01:00:00.000000000Z","data_stream":{"dataset":"generic.otel","namespace":"default","type":"metrics"},"metrics":{"metric.sum":1.5},"resource":{"dropped_attributes_count":0},"scope":{"dropped_attributes_count":0},"start_timestamp":"1970-01-01T02:00:00.000000000Z"}`), + }, + { + Action: []byte(`{"create":{"_index":"metrics-generic.otel-default","dynamic_templates":{"metrics.metric.summary":"summary"}}}`), + Document: []byte(`{"@timestamp":"1970-01-01T03:00:00.000000000Z","data_stream":{"dataset":"generic.otel","namespace":"default","type":"metrics"},"metrics":{"metric.summary":{"sum":1.5,"value_count":1}},"resource":{"dropped_attributes_count":0},"scope":{"dropped_attributes_count":0},"start_timestamp":"1970-01-01T03:00:00.000000000Z"}`), + }, + } + + assertRecordedItems(t, expected, rec, false) + }) + + t.Run("otel mode attribute array value", func(t *testing.T) { + rec := newBulkRecorder() + server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { + rec.Record(docs) + return itemsAllOK(docs) + }) + + exporter := newTestMetricsExporter(t, server.URL, func(cfg *Config) { + cfg.Mapping.Mode = "otel" + }) + + mustSendMetrics(t, exporter, newMetricsWithAttributes(map[string]any{ + "some.record.attribute": []string{"foo", "bar"}, + }, map[string]any{ + "some.scope.attribute": []string{"foo", "bar"}, + }, map[string]any{ + "some.resource.attribute": []string{"foo", "bar"}, + })) + + rec.WaitItems(1) + + assert.Len(t, rec.Items(), 1) + doc := rec.Items()[0].Document + assert.JSONEq(t, `{"some.record.attribute":["foo","bar"]}`, gjson.GetBytes(doc, `attributes`).Raw) + assert.JSONEq(t, `{"some.scope.attribute":["foo","bar"]}`, gjson.GetBytes(doc, `scope.attributes`).Raw) + assert.JSONEq(t, `{"some.resource.attribute":["foo","bar"]}`, gjson.GetBytes(doc, `resource.attributes`).Raw) + }) + + t.Run("otel mode _doc_count hint", func(t *testing.T) { + rec := newBulkRecorder() + server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { + rec.Record(docs) + return itemsAllOK(docs) + }) + + exporter := newTestMetricsExporter(t, server.URL, func(cfg *Config) { + cfg.Mapping.Mode = "otel" + }) + + metrics := pmetric.NewMetrics() + resourceMetric := metrics.ResourceMetrics().AppendEmpty() + scopeMetric := resourceMetric.ScopeMetrics().AppendEmpty() + + sumMetric := scopeMetric.Metrics().AppendEmpty() + sumMetric.SetName("sum") + sumDP := sumMetric.SetEmptySum().DataPoints().AppendEmpty() + sumDP.SetIntValue(0) + + summaryMetric := scopeMetric.Metrics().AppendEmpty() + summaryMetric.SetName("summary") + summaryDP := summaryMetric.SetEmptySummary().DataPoints().AppendEmpty() + summaryDP.SetSum(1) + summaryDP.SetCount(10) + fillAttributeMap(summaryDP.Attributes(), map[string]any{ + "elasticsearch.mapping.hints": []string{"_doc_count"}, + }) + + mustSendMetrics(t, exporter, metrics) + + expected := []itemRequest{ + { + Action: []byte(`{"create":{"_index":"metrics-generic.otel-default","dynamic_templates":{"metrics.sum":"gauge_long","metrics.summary":"summary"}}}`), + Document: []byte(`{"@timestamp":"1970-01-01T00:00:00.000000000Z","_doc_count":10,"data_stream":{"dataset":"generic.otel","namespace":"default","type":"metrics"},"metrics":{"sum":0,"summary":{"sum":1.0,"value_count":10}},"resource":{"dropped_attributes_count":0},"scope":{"dropped_attributes_count":0}}`), + }, + } + + assertRecordedItems(t, expected, rec, false) + }) + + t.Run("otel mode aggregate_metric_double hint", func(t *testing.T) { + rec := newBulkRecorder() + server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { + rec.Record(docs) + return itemsAllOK(docs) + }) + + exporter := newTestMetricsExporter(t, server.URL, func(cfg *Config) { + cfg.Mapping.Mode = "otel" + }) + + metrics := pmetric.NewMetrics() + resourceMetric := metrics.ResourceMetrics().AppendEmpty() + scopeMetric := resourceMetric.ScopeMetrics().AppendEmpty() + + histogramMetric := scopeMetric.Metrics().AppendEmpty() + histogramMetric.SetName("histogram.summary") + fooHistogram := histogramMetric.SetEmptyHistogram() + fooHistogram.SetAggregationTemporality(pmetric.AggregationTemporalityDelta) + fooDp := fooHistogram.DataPoints().AppendEmpty() + fooDp.SetSum(1) + fooDp.SetCount(10) + fillAttributeMap(fooDp.Attributes(), map[string]any{ + "elasticsearch.mapping.hints": []string{"_doc_count", "aggregate_metric_double"}, + }) + + exphistogramMetric := scopeMetric.Metrics().AppendEmpty() + exphistogramMetric.SetName("exphistogram.summary") + fooExpHistogram := exphistogramMetric.SetEmptyExponentialHistogram() + fooExpHistogram.SetAggregationTemporality(pmetric.AggregationTemporalityDelta) + fooExpDp := fooExpHistogram.DataPoints().AppendEmpty() + fooExpDp.SetTimestamp(pcommon.Timestamp(time.Hour)) + fooExpDp.SetSum(1) + fooExpDp.SetCount(10) + fillAttributeMap(fooExpDp.Attributes(), map[string]any{ + "elasticsearch.mapping.hints": []string{"_doc_count", "aggregate_metric_double"}, + }) + + mustSendMetrics(t, exporter, metrics) + + expected := []itemRequest{ + { + Action: []byte(`{"create":{"_index":"metrics-generic.otel-default","dynamic_templates":{"metrics.histogram.summary":"summary"}}}`), + Document: []byte(`{"@timestamp":"1970-01-01T00:00:00.000000000Z","_doc_count":10,"data_stream":{"dataset":"generic.otel","namespace":"default","type":"metrics"},"metrics":{"histogram.summary":{"sum":1.0,"value_count":10}},"resource":{"dropped_attributes_count":0},"scope":{"dropped_attributes_count":0}}`), + }, + { + Action: []byte(`{"create":{"_index":"metrics-generic.otel-default","dynamic_templates":{"metrics.exphistogram.summary":"summary"}}}`), + Document: []byte(`{"@timestamp":"1970-01-01T01:00:00.000000000Z","_doc_count":10,"data_stream":{"dataset":"generic.otel","namespace":"default","type":"metrics"},"metrics":{"exphistogram.summary":{"sum":1.0,"value_count":10}},"resource":{"dropped_attributes_count":0},"scope":{"dropped_attributes_count":0}}`), + }, + } + + assertRecordedItems(t, expected, rec, false) + }) + + t.Run("otel mode metric name conflict", func(t *testing.T) { + rec := newBulkRecorder() + server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { + rec.Record(docs) + return itemsAllOK(docs) + }) + + exporter := newTestMetricsExporter(t, server.URL, func(cfg *Config) { + cfg.Mapping.Mode = "otel" + }) + + metrics := pmetric.NewMetrics() + resourceMetric := metrics.ResourceMetrics().AppendEmpty() + scopeMetric := resourceMetric.ScopeMetrics().AppendEmpty() + + fooBarMetric := scopeMetric.Metrics().AppendEmpty() + fooBarMetric.SetName("foo.bar") + fooBarMetric.SetEmptySum().DataPoints().AppendEmpty().SetIntValue(0) + + fooMetric := scopeMetric.Metrics().AppendEmpty() + fooMetric.SetName("foo") + fooMetric.SetEmptySum().DataPoints().AppendEmpty().SetIntValue(0) + + fooBarBazMetric := scopeMetric.Metrics().AppendEmpty() + fooBarBazMetric.SetName("foo.bar.baz") + fooBarBazMetric.SetEmptySum().DataPoints().AppendEmpty().SetIntValue(0) + + mustSendMetrics(t, exporter, metrics) + + expected := []itemRequest{ + { + Action: []byte(`{"create":{"_index":"metrics-generic.otel-default","dynamic_templates":{"metrics.foo.bar":"gauge_long","metrics.foo":"gauge_long","metrics.foo.bar.baz":"gauge_long"}}}`), + Document: []byte(`{"@timestamp":"1970-01-01T00:00:00.000000000Z","data_stream":{"dataset":"generic.otel","namespace":"default","type":"metrics"},"metrics":{"foo":0,"foo.bar":0,"foo.bar.baz":0},"resource":{"dropped_attributes_count":0},"scope":{"dropped_attributes_count":0}}`), + }, + } + + assertRecordedItems(t, expected, rec, false) + }) + + t.Run("otel mode attribute key prefix conflict", func(t *testing.T) { + rec := newBulkRecorder() + server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { + rec.Record(docs) + return itemsAllOK(docs) + }) + + exporter := newTestMetricsExporter(t, server.URL, func(cfg *Config) { + cfg.Mapping.Mode = "otel" + }) + + mustSendMetrics(t, exporter, newMetricsWithAttributes(map[string]any{ + "a": "a", + "a.b": "a.b", + }, map[string]any{ + "a": "a", + "a.b": "a.b", + }, map[string]any{ + "a": "a", + "a.b": "a.b", + })) + + rec.WaitItems(1) + doc := rec.Items()[0].Document + assert.JSONEq(t, `{"a":"a","a.b":"a.b"}`, gjson.GetBytes(doc, `attributes`).Raw) + assert.JSONEq(t, `{"a":"a","a.b":"a.b"}`, gjson.GetBytes(doc, `scope.attributes`).Raw) + assert.JSONEq(t, `{"a":"a","a.b":"a.b"}`, gjson.GetBytes(doc, `resource.attributes`).Raw) + }) + + t.Run("publish summary", func(t *testing.T) { + rec := newBulkRecorder() + server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { + rec.Record(docs) + return itemsAllOK(docs) + }) + + exporter := newTestMetricsExporter(t, server.URL, func(cfg *Config) { + cfg.Mapping.Mode = "ecs" + }) + + metrics := pmetric.NewMetrics() + resourceMetrics := metrics.ResourceMetrics().AppendEmpty() + scopeA := resourceMetrics.ScopeMetrics().AppendEmpty() + metricSlice := scopeA.Metrics() + fooMetric := metricSlice.AppendEmpty() + fooMetric.SetName("metric.foo") + fooDps := fooMetric.SetEmptySummary().DataPoints() + fooDp := fooDps.AppendEmpty() + fooDp.SetSum(1.5) + fooDp.SetCount(1) + fooOtherDp := fooDps.AppendEmpty() + fooOtherDp.SetTimestamp(pcommon.NewTimestampFromTime(time.Unix(3600, 0))) + fooOtherDp.SetSum(2) + fooOtherDp.SetCount(3) + + mustSendMetrics(t, exporter, metrics) + + expected := []itemRequest{ + { + Action: []byte(`{"create":{"_index":"metrics-generic-default"}}`), + Document: []byte(`{"@timestamp":"1970-01-01T00:00:00.000000000Z","data_stream":{"dataset":"generic","namespace":"default","type":"metrics"},"metric":{"foo":{"sum":1.5,"value_count":1}}}`), + }, + { + Action: []byte(`{"create":{"_index":"metrics-generic-default"}}`), + Document: []byte(`{"@timestamp":"1970-01-01T01:00:00.000000000Z","data_stream":{"dataset":"generic","namespace":"default","type":"metrics"},"metric":{"foo":{"sum":2.0,"value_count":3}}}`), + }, + } + + assertRecordedItems(t, expected, rec, false) + }) +} + +func TestExporterTraces(t *testing.T) { + t.Run("publish with success", func(t *testing.T) { + rec := newBulkRecorder() + server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { + rec.Record(docs) + return itemsAllOK(docs) + }) + + exporter := newTestTracesExporter(t, server.URL) + mustSendSpans(t, exporter, ptrace.NewSpan()) + mustSendSpans(t, exporter, ptrace.NewSpan()) + + rec.WaitItems(2) + }) + + t.Run("publish with dynamic index, prefix_suffix", func(t *testing.T) { + rec := newBulkRecorder() + var ( + prefix = "resprefix-" + suffix = "-attrsuffix" + index = "someindex" + ) + + server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { + rec.Record(docs) + + data, err := docs[0].Action.MarshalJSON() + assert.NoError(t, err) + + jsonVal := map[string]any{} + err = json.Unmarshal(data, &jsonVal) + assert.NoError(t, err) + + create := jsonVal["create"].(map[string]any) + + expected := fmt.Sprintf("%s%s%s", prefix, index, suffix) + assert.Equal(t, expected, create["_index"].(string)) + + return itemsAllOK(docs) + }) + + exporter := newTestTracesExporter(t, server.URL, func(cfg *Config) { + cfg.TracesIndex = index + cfg.TracesDynamicIndex.Enabled = true + }) + + mustSendTraces(t, exporter, newTracesWithAttributes( + map[string]any{ + indexPrefix: "attrprefix-", + indexSuffix: suffix, + }, + nil, + map[string]any{ + indexPrefix: prefix, + }, + )) + + rec.WaitItems(1) + }) + + t.Run("publish with dynamic index, data_stream", func(t *testing.T) { + rec := newBulkRecorder() + + server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { + rec.Record(docs) + + expected := "traces-span.dataset.____________-default" + assert.Equal(t, expected, actionJSONToIndex(t, docs[0].Action)) + + return itemsAllOK(docs) + }) + + exporter := newTestTracesExporter(t, server.URL, func(cfg *Config) { + cfg.TracesDynamicIndex.Enabled = true + }) + + mustSendTraces(t, exporter, newTracesWithAttributes( + map[string]any{ + dataStreamDataset: "span.dataset.\\/*?\"<>| ,#:", + }, + nil, + map[string]any{ + dataStreamDataset: "resource.dataset", + }, + )) + + rec.WaitItems(1) + }) + + t.Run("publish with logstash format index", func(t *testing.T) { + var defaultCfg Config + + rec := newBulkRecorder() + server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { + rec.Record(docs) + + assert.Contains(t, actionJSONToIndex(t, docs[0].Action), defaultCfg.TracesIndex) + + return itemsAllOK(docs) + }) + + exporter := newTestTracesExporter(t, server.URL, func(cfg *Config) { + cfg.LogstashFormat.Enabled = true + cfg.TracesIndex = "not-used-index" + defaultCfg = *cfg + }) + + mustSendTraces(t, exporter, newTracesWithAttributes(nil, nil, nil)) + + rec.WaitItems(1) + }) + + t.Run("publish with logstash format index and dynamic index enabled", func(t *testing.T) { + var ( + prefix = "resprefix-" + suffix = "-attrsuffix" + index = "someindex" + ) + + rec := newBulkRecorder() + server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { + rec.Record(docs) + + expected := fmt.Sprintf("%s%s%s", prefix, index, suffix) + assert.Contains(t, actionJSONToIndex(t, docs[0].Action), expected) + + return itemsAllOK(docs) + }) + + exporter := newTestTracesExporter(t, server.URL, func(cfg *Config) { + cfg.TracesIndex = index + cfg.TracesDynamicIndex.Enabled = true + cfg.LogstashFormat.Enabled = true + }) + + mustSendTraces(t, exporter, newTracesWithAttributes( + map[string]any{ + indexPrefix: "attrprefix-", + indexSuffix: suffix, + }, + nil, + map[string]any{ + indexPrefix: prefix, + }, + )) + rec.WaitItems(1) + }) + + t.Run("otel mode", func(t *testing.T) { + rec := newBulkRecorder() + server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { + rec.Record(docs) + return itemsAllOK(docs) + }) + + exporter := newTestTracesExporter(t, server.URL, func(cfg *Config) { + cfg.TracesDynamicIndex.Enabled = true + cfg.Mapping.Mode = "otel" + }) + + traces := ptrace.NewTraces() + resourceSpans := traces.ResourceSpans() + rs := resourceSpans.AppendEmpty() + + span := rs.ScopeSpans().AppendEmpty().Spans().AppendEmpty() + span.SetName("name") + span.SetTraceID(pcommon.NewTraceIDEmpty()) + span.SetSpanID(pcommon.NewSpanIDEmpty()) + span.SetFlags(1) + span.SetDroppedAttributesCount(2) + span.SetDroppedEventsCount(3) + span.SetDroppedLinksCount(4) + span.TraceState().FromRaw("foo") + span.SetStartTimestamp(pcommon.NewTimestampFromTime(time.Unix(3600, 0))) + span.SetEndTimestamp(pcommon.NewTimestampFromTime(time.Unix(7200, 0))) + + event := span.Events().AppendEmpty() + event.SetName("exception") + event.Attributes().PutStr("event.attr.foo", "event.attr.bar") + event.SetDroppedAttributesCount(1) + + scopeAttr := span.Attributes() + fillAttributeMap(scopeAttr, map[string]any{ + "attr.foo": "attr.bar", + }) + + resAttr := rs.Resource().Attributes() + fillAttributeMap(resAttr, map[string]any{ + "resource.foo": "resource.bar", + }) + + spanLink := span.Links().AppendEmpty() + spanLink.SetTraceID(pcommon.NewTraceIDEmpty()) + spanLink.SetSpanID(pcommon.NewSpanIDEmpty()) + spanLink.SetFlags(10) + spanLink.SetDroppedAttributesCount(11) + spanLink.TraceState().FromRaw("bar") + fillAttributeMap(spanLink.Attributes(), map[string]any{ + "link.attr.foo": "link.attr.bar", + }) + + mustSendTraces(t, exporter, traces) + + expected := []itemRequest{ + { + Action: []byte(`{"create":{"_index":"traces-generic.otel-default"}}`), + Document: []byte(`{"@timestamp":"1970-01-01T01:00:00.000000000Z","attributes":{"attr.foo":"attr.bar"},"data_stream":{"dataset":"generic.otel","namespace":"default","type":"traces"},"dropped_attributes_count":2,"dropped_events_count":3,"dropped_links_count":4,"duration":3600000000000,"kind":"Unspecified","links":[{"attributes":{"link.attr.foo":"link.attr.bar"},"dropped_attributes_count":11,"span_id":"","trace_id":"","trace_state":"bar"}],"name":"name","resource":{"attributes":{"resource.foo":"resource.bar"},"dropped_attributes_count":0},"scope":{"dropped_attributes_count":0},"status":{"code":"Unset"},"trace_state":"foo"}`), + }, + { + Action: []byte(`{"create":{"_index":"logs-generic.otel-default"}}`), + Document: []byte(`{"@timestamp":"1970-01-01T00:00:00.000000000Z","attributes":{"event.attr.foo":"event.attr.bar","event.name":"exception"},"data_stream":{"dataset":"generic.otel","namespace":"default","type":"logs"},"dropped_attributes_count":1,"resource":{"attributes":{"resource.foo":"resource.bar"},"dropped_attributes_count":0},"scope":{"dropped_attributes_count":0}}`), + }, + } + + assertRecordedItems(t, expected, rec, false) + }) + + t.Run("otel mode attribute array value", func(t *testing.T) { + rec := newBulkRecorder() + server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { + rec.Record(docs) + return itemsAllOK(docs) + }) + + exporter := newTestTracesExporter(t, server.URL, func(cfg *Config) { + cfg.Mapping.Mode = "otel" + }) + + traces := newTracesWithAttributes(map[string]any{ + "some.record.attribute": []string{"foo", "bar"}, + }, map[string]any{ + "some.scope.attribute": []string{"foo", "bar"}, + }, map[string]any{ + "some.resource.attribute": []string{"foo", "bar"}, + }) + spanEventAttrs := traces.ResourceSpans().At(0).ScopeSpans().At(0).Spans().At(0).Events().AppendEmpty().Attributes() + fillAttributeMap(spanEventAttrs, map[string]any{ + "some.record.attribute": []string{"foo", "bar"}, + }) + mustSendTraces(t, exporter, traces) + + rec.WaitItems(2) + + assert.Len(t, rec.Items(), 2) + for _, item := range rec.Items() { + doc := item.Document + assert.JSONEq(t, `{"some.record.attribute":["foo","bar"]}`, gjson.GetBytes(doc, `attributes`).Raw) + assert.JSONEq(t, `{"some.scope.attribute":["foo","bar"]}`, gjson.GetBytes(doc, `scope.attributes`).Raw) + assert.JSONEq(t, `{"some.resource.attribute":["foo","bar"]}`, gjson.GetBytes(doc, `resource.attributes`).Raw) + } + }) + + t.Run("otel mode attribute key prefix conflict", func(t *testing.T) { + rec := newBulkRecorder() + server := newESTestServer(t, func(docs []itemRequest) ([]itemResponse, error) { + rec.Record(docs) + return itemsAllOK(docs) + }) + + exporter := newTestTracesExporter(t, server.URL, func(cfg *Config) { + cfg.Mapping.Mode = "otel" + }) + + mustSendTraces(t, exporter, newTracesWithAttributes(map[string]any{ + "a": "a", + "a.b": "a.b", + }, map[string]any{ + "a": "a", + "a.b": "a.b", + }, map[string]any{ + "a": "a", + "a.b": "a.b", + })) + + rec.WaitItems(1) + doc := rec.Items()[0].Document + assert.JSONEq(t, `{"a":"a","a.b":"a.b"}`, gjson.GetBytes(doc, `attributes`).Raw) + assert.JSONEq(t, `{"a":"a","a.b":"a.b"}`, gjson.GetBytes(doc, `scope.attributes`).Raw) + assert.JSONEq(t, `{"a":"a","a.b":"a.b"}`, gjson.GetBytes(doc, `resource.attributes`).Raw) + }) +} + +// TestExporterAuth verifies that the Elasticsearch exporter supports +// confighttp.ClientConfig.Auth. +func TestExporterAuth(t *testing.T) { + done := make(chan struct{}, 1) + testauthID := component.NewID(component.MustNewType("authtest")) + exporter := newUnstartedTestLogsExporter(t, "http://testing.invalid", func(cfg *Config) { + cfg.Auth = &configauth.Authentication{AuthenticatorID: testauthID} + }) + err := exporter.Start(context.Background(), &mockHost{ + extensions: map[component.ID]component.Component{ + testauthID: &authtest.MockClient{ + ResultRoundTripper: roundTripperFunc(func(*http.Request) (*http.Response, error) { + select { + case done <- struct{}{}: + default: + } + return nil, errors.New("nope") + }), + }, + }, + }) + require.NoError(t, err) + defer func() { + require.NoError(t, exporter.Shutdown(context.Background())) + }() + + mustSendLogRecords(t, exporter, plog.NewLogRecord()) + <-done +} + +func TestExporterBatcher(t *testing.T) { + var requests []*http.Request + testauthID := component.NewID(component.MustNewType("authtest")) + batcherEnabled := false // sync bulk indexer is used without batching + exporter := newUnstartedTestLogsExporter(t, "http://testing.invalid", func(cfg *Config) { + cfg.Batcher = BatcherConfig{Enabled: &batcherEnabled} + cfg.Auth = &configauth.Authentication{AuthenticatorID: testauthID} + }) + err := exporter.Start(context.Background(), &mockHost{ + extensions: map[component.ID]component.Component{ + testauthID: &authtest.MockClient{ + ResultRoundTripper: roundTripperFunc(func(req *http.Request) (*http.Response, error) { + requests = append(requests, req) + return nil, errors.New("nope") + }), + }, + }, + }) + require.NoError(t, err) + defer func() { + require.NoError(t, exporter.Shutdown(context.Background())) + }() + + logs := plog.NewLogs() + resourceLogs := logs.ResourceLogs().AppendEmpty() + scopeLogs := resourceLogs.ScopeLogs().AppendEmpty() + scopeLogs.LogRecords().AppendEmpty().Body().SetStr("log record body") + + type key struct{} + _ = exporter.ConsumeLogs(context.WithValue(context.Background(), key{}, "value1"), logs) + _ = exporter.ConsumeLogs(context.WithValue(context.Background(), key{}, "value2"), logs) + require.Len(t, requests, 2) // flushed immediately by Consume + + assert.Equal(t, "value1", requests[0].Context().Value(key{})) + assert.Equal(t, "value2", requests[1].Context().Value(key{})) +} + +func newTestTracesExporter(t *testing.T, url string, fns ...func(*Config)) exporter.Traces { + f := NewFactory() + cfg := withDefaultConfig(append([]func(*Config){func(cfg *Config) { + cfg.Endpoints = []string{url} + cfg.NumWorkers = 1 + cfg.Flush.Interval = 10 * time.Millisecond + }}, fns...)...) + exp, err := f.CreateTraces(context.Background(), exportertest.NewNopSettings(), cfg) + require.NoError(t, err) + + err = exp.Start(context.Background(), componenttest.NewNopHost()) + require.NoError(t, err) t.Cleanup(func() { require.NoError(t, exp.Shutdown(context.Background())) }) return exp } +func newTestMetricsExporter(t *testing.T, url string, fns ...func(*Config)) exporter.Metrics { + f := NewFactory() + cfg := withDefaultConfig(append([]func(*Config){func(cfg *Config) { + cfg.Endpoints = []string{url} + cfg.NumWorkers = 1 + cfg.Flush.Interval = 10 * time.Millisecond + }}, fns...)...) + exp, err := f.CreateMetrics(context.Background(), exportertest.NewNopSettings(), cfg) + require.NoError(t, err) + + err = exp.Start(context.Background(), componenttest.NewNopHost()) + require.NoError(t, err) + t.Cleanup(func() { + require.NoError(t, exp.Shutdown(context.Background())) + }) + return exp +} + +func newTestLogsExporter(t *testing.T, url string, fns ...func(*Config)) exporter.Logs { + exp := newUnstartedTestLogsExporter(t, url, fns...) + err := exp.Start(context.Background(), componenttest.NewNopHost()) + require.NoError(t, err) + t.Cleanup(func() { + require.NoError(t, exp.Shutdown(context.Background())) + }) + return exp +} + +func newUnstartedTestLogsExporter(t *testing.T, url string, fns ...func(*Config)) exporter.Logs { + f := NewFactory() + cfg := withDefaultConfig(append([]func(*Config){func(cfg *Config) { + cfg.Endpoints = []string{url} + cfg.NumWorkers = 1 + cfg.Flush.Interval = 10 * time.Millisecond + }}, fns...)...) + exp, err := f.CreateLogs(context.Background(), exportertest.NewNopSettings(), cfg) + require.NoError(t, err) + return exp +} + func mustSendLogRecords(t *testing.T, exporter exporter.Logs, records ...plog.LogRecord) { logs := plog.NewLogs() resourceLogs := logs.ResourceLogs().AppendEmpty() @@ -639,6 +1841,35 @@ func mustSendLogs(t *testing.T, exporter exporter.Logs, logs plog.Logs) { require.NoError(t, err) } +func mustSendMetricSumDataPoints(t *testing.T, exporter exporter.Metrics, dataPoints ...pmetric.NumberDataPoint) { + metrics := pmetric.NewMetrics() + scopeMetrics := metrics.ResourceMetrics().AppendEmpty().ScopeMetrics().AppendEmpty() + for _, dataPoint := range dataPoints { + metric := scopeMetrics.Metrics().AppendEmpty() + metric.SetEmptySum() + metric.SetName("sum") + dataPoint.CopyTo(metric.Sum().DataPoints().AppendEmpty()) + } + mustSendMetrics(t, exporter, metrics) +} + +func mustSendMetricGaugeDataPoints(t *testing.T, exporter exporter.Metrics, dataPoints ...pmetric.NumberDataPoint) { + metrics := pmetric.NewMetrics() + scopeMetrics := metrics.ResourceMetrics().AppendEmpty().ScopeMetrics().AppendEmpty() + for _, dataPoint := range dataPoints { + metric := scopeMetrics.Metrics().AppendEmpty() + metric.SetEmptyGauge() + metric.SetName("gauge") + dataPoint.CopyTo(metric.Gauge().DataPoints().AppendEmpty()) + } + mustSendMetrics(t, exporter, metrics) +} + +func mustSendMetrics(t *testing.T, exporter exporter.Metrics, metrics pmetric.Metrics) { + err := exporter.ConsumeMetrics(context.Background(), metrics) + require.NoError(t, err) +} + func mustSendSpans(t *testing.T, exporter exporter.Traces, spans ...ptrace.Span) { traces := ptrace.NewTraces() resourceSpans := traces.ResourceSpans().AppendEmpty() @@ -653,3 +1884,28 @@ func mustSendTraces(t *testing.T, exporter exporter.Traces, traces ptrace.Traces err := exporter.ConsumeTraces(context.Background(), traces) require.NoError(t, err) } + +type mockHost struct { + extensions map[component.ID]component.Component +} + +func (h *mockHost) GetExtensions() map[component.ID]component.Component { + return h.extensions +} + +type roundTripperFunc func(*http.Request) (*http.Response, error) + +func (f roundTripperFunc) RoundTrip(r *http.Request) (*http.Response, error) { + return f(r) +} + +func actionJSONToIndex(t *testing.T, actionJSON json.RawMessage) string { + action := struct { + Create struct { + Index string `json:"_index"` + } `json:"create"` + }{} + err := json.Unmarshal(actionJSON, &action) + require.NoError(t, err) + return action.Create.Index +} diff --git a/exporter/elasticsearchexporter/factory.go b/exporter/elasticsearchexporter/factory.go index afcf2d6197e4..4783d430196a 100644 --- a/exporter/elasticsearchexporter/factory.go +++ b/exporter/elasticsearchexporter/factory.go @@ -7,13 +7,15 @@ package elasticsearchexporter // import "github.com/open-telemetry/opentelemetry import ( "context" - "fmt" "net/http" - "runtime" "time" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configcompression" + "go.opentelemetry.io/collector/config/confighttp" + "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/exporter" + "go.opentelemetry.io/collector/exporter/exporterbatcher" "go.opentelemetry.io/collector/exporter/exporterhelper" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter/internal/metadata" @@ -21,9 +23,9 @@ import ( const ( // The value of "type" key in configuration. - defaultLogsIndex = "logs-generic-default" - defaultTracesIndex = "traces-generic-default" - userAgentHeaderKey = "User-Agent" + defaultLogsIndex = "logs-generic-default" + defaultMetricsIndex = "metrics-generic-default" + defaultTracesIndex = "traces-generic-default" ) // NewFactory creates a factory for Elastic exporter. @@ -32,37 +34,46 @@ func NewFactory() exporter.Factory { metadata.Type, createDefaultConfig, exporter.WithLogs(createLogsExporter, metadata.LogsStability), + exporter.WithMetrics(createMetricsExporter, metadata.MetricsStability), exporter.WithTraces(createTracesExporter, metadata.TracesStability), ) } func createDefaultConfig() component.Config { - qs := exporterhelper.NewDefaultQueueSettings() + qs := exporterhelper.NewDefaultQueueConfig() qs.Enabled = false + + httpClientConfig := confighttp.NewDefaultClientConfig() + httpClientConfig.Timeout = 90 * time.Second + httpClientConfig.Compression = configcompression.TypeGzip + return &Config{ QueueSettings: qs, - ClientConfig: ClientConfig{ - Timeout: 90 * time.Second, + ClientConfig: httpClientConfig, + Index: "", + LogsIndex: defaultLogsIndex, + LogsDynamicIndex: DynamicIndexSetting{ + Enabled: false, + }, + MetricsIndex: defaultMetricsIndex, + MetricsDynamicIndex: DynamicIndexSetting{ + Enabled: true, }, - Index: "", - LogsIndex: defaultLogsIndex, TracesIndex: defaultTracesIndex, + TracesDynamicIndex: DynamicIndexSetting{ + Enabled: false, + }, Retry: RetrySettings{ Enabled: true, - MaxRequests: 3, + MaxRetries: 0, // default is set in exporter code InitialInterval: 100 * time.Millisecond, MaxInterval: 1 * time.Minute, RetryOnStatus: []int{ http.StatusTooManyRequests, - http.StatusInternalServerError, - http.StatusBadGateway, - http.StatusServiceUnavailable, - http.StatusGatewayTimeout, }, }, Mapping: MappingsSettings{ Mode: "none", - Dedup: true, Dedot: true, }, LogstashFormat: LogstashFormatSettings{ @@ -70,6 +81,23 @@ func createDefaultConfig() component.Config { PrefixSeparator: "-", DateFormat: "%Y.%m.%d", }, + TelemetrySettings: TelemetrySettings{ + LogRequestBody: false, + LogResponseBody: false, + }, + Batcher: BatcherConfig{ + FlushTimeout: 30 * time.Second, + MinSizeConfig: exporterbatcher.MinSizeConfig{ + MinSizeItems: 5000, + }, + MaxSizeConfig: exporterbatcher.MaxSizeConfig{ + MaxSizeItems: 0, + }, + }, + Flush: FlushSettings{ + Bytes: 5e+6, + Interval: 30 * time.Second, + }, } } @@ -78,7 +106,7 @@ func createDefaultConfig() component.Config { // Logs are directly indexed into Elasticsearch. func createLogsExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exporter.Logs, error) { cf := cfg.(*Config) @@ -88,53 +116,81 @@ func createLogsExporter( set.Logger.Warn("index option are deprecated and replaced with logs_index and traces_index.") index = cf.Index } + handleDeprecatedConfig(cf, set.Logger) - setDefaultUserAgentHeader(cf, set.BuildInfo) - - exporter, err := newExporter(set.Logger, cf, index, cf.LogsDynamicIndex.Enabled) - if err != nil { - return nil, fmt.Errorf("cannot configure Elasticsearch exporter: %w", err) - } + exporter := newExporter(cf, set, index, cf.LogsDynamicIndex.Enabled) - return exporterhelper.NewLogsExporter( + return exporterhelper.NewLogs( ctx, set, cfg, exporter.pushLogsData, - exporterhelper.WithShutdown(exporter.Shutdown), - exporterhelper.WithQueue(cf.QueueSettings), + exporterhelperOptions(cf, exporter.Start, exporter.Shutdown)..., ) } -func createTracesExporter(ctx context.Context, - set exporter.CreateSettings, - cfg component.Config) (exporter.Traces, error) { +func createMetricsExporter( + ctx context.Context, + set exporter.Settings, + cfg component.Config, +) (exporter.Metrics, error) { + cf := cfg.(*Config) + handleDeprecatedConfig(cf, set.Logger) + + exporter := newExporter(cf, set, cf.MetricsIndex, cf.MetricsDynamicIndex.Enabled) + + return exporterhelper.NewMetrics( + ctx, + set, + cfg, + exporter.pushMetricsData, + exporterhelperOptions(cf, exporter.Start, exporter.Shutdown)..., + ) +} +func createTracesExporter(ctx context.Context, + set exporter.Settings, + cfg component.Config, +) (exporter.Traces, error) { cf := cfg.(*Config) + handleDeprecatedConfig(cf, set.Logger) - setDefaultUserAgentHeader(cf, set.BuildInfo) + exporter := newExporter(cf, set, cf.TracesIndex, cf.TracesDynamicIndex.Enabled) - exporter, err := newExporter(set.Logger, cf, cf.TracesIndex, cf.TracesDynamicIndex.Enabled) - if err != nil { - return nil, fmt.Errorf("cannot configure Elasticsearch exporter: %w", err) - } - return exporterhelper.NewTracesExporter( + return exporterhelper.NewTraces( ctx, set, cfg, exporter.pushTraceData, - exporterhelper.WithShutdown(exporter.Shutdown), - exporterhelper.WithQueue(cf.QueueSettings), + exporterhelperOptions(cf, exporter.Start, exporter.Shutdown)..., ) } -// set default User-Agent header with BuildInfo if User-Agent is empty -func setDefaultUserAgentHeader(cf *Config, info component.BuildInfo) { - if _, found := cf.Headers[userAgentHeaderKey]; found { - return +func exporterhelperOptions( + cfg *Config, + start component.StartFunc, + shutdown component.ShutdownFunc, +) []exporterhelper.Option { + opts := []exporterhelper.Option{ + exporterhelper.WithCapabilities(consumer.Capabilities{MutatesData: true}), + exporterhelper.WithStart(start), + exporterhelper.WithShutdown(shutdown), + exporterhelper.WithQueue(cfg.QueueSettings), } - if cf.Headers == nil { - cf.Headers = make(map[string]string) + if cfg.Batcher.Enabled != nil { + batcherConfig := exporterbatcher.Config{ + Enabled: *cfg.Batcher.Enabled, + FlushTimeout: cfg.Batcher.FlushTimeout, + MinSizeConfig: cfg.Batcher.MinSizeConfig, + MaxSizeConfig: cfg.Batcher.MaxSizeConfig, + } + opts = append(opts, exporterhelper.WithBatcher(batcherConfig)) + + // Effectively disable timeout_sender because timeout is enforced in bulk indexer. + // + // We keep timeout_sender enabled in the async mode (Batcher.Enabled == nil), + // to ensure sending data to the background workers will not block indefinitely. + opts = append(opts, exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0})) } - cf.Headers[userAgentHeaderKey] = fmt.Sprintf("%s/%s (%s/%s)", info.Description, info.Version, runtime.GOOS, runtime.GOARCH) + return opts } diff --git a/exporter/elasticsearchexporter/factory_test.go b/exporter/elasticsearchexporter/factory_test.go index e4d19f32fd78..e24dca1af5e6 100644 --- a/exporter/elasticsearchexporter/factory_test.go +++ b/exporter/elasticsearchexporter/factory_test.go @@ -11,6 +11,8 @@ import ( "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/exporter/exportertest" + "go.uber.org/zap" + "go.uber.org/zap/zaptest/observer" ) func TestCreateDefaultConfig(t *testing.T) { @@ -20,73 +22,130 @@ func TestCreateDefaultConfig(t *testing.T) { assert.NoError(t, componenttest.CheckConfigStruct(cfg)) } -func TestFactory_CreateLogsExporter(t *testing.T) { +func TestFactory_CreateLogs(t *testing.T) { factory := NewFactory() cfg := withDefaultConfig(func(cfg *Config) { - cfg.Endpoints = []string{"test:9200"} + cfg.Endpoints = []string{"http://test:9200"} }) - params := exportertest.NewNopCreateSettings() - exporter, err := factory.CreateLogsExporter(context.Background(), params, cfg) + params := exportertest.NewNopSettings() + exporter, err := factory.CreateLogs(context.Background(), params, cfg) require.NoError(t, err) require.NotNil(t, exporter) require.NoError(t, exporter.Shutdown(context.Background())) } -func TestFactory_CreateLogsExporter_Fail(t *testing.T) { +func TestFactory_CreateMetrics(t *testing.T) { factory := NewFactory() - cfg := factory.CreateDefaultConfig() - params := exportertest.NewNopCreateSettings() - _, err := factory.CreateLogsExporter(context.Background(), params, cfg) - require.Error(t, err, "expected an error when creating a logs exporter") - assert.EqualError(t, err, "cannot configure Elasticsearch exporter: endpoints or cloudid must be specified") -} + cfg := withDefaultConfig(func(cfg *Config) { + cfg.Endpoints = []string{"http://test:9200"} + }) + params := exportertest.NewNopSettings() + exporter, err := factory.CreateMetrics(context.Background(), params, cfg) + require.NoError(t, err) + require.NotNil(t, exporter) -func TestFactory_CreateMetricsExporter_Fail(t *testing.T) { - factory := NewFactory() - cfg := factory.CreateDefaultConfig() - params := exportertest.NewNopCreateSettings() - _, err := factory.CreateMetricsExporter(context.Background(), params, cfg) - require.Error(t, err, "expected an error when creating a traces exporter") - assert.EqualError(t, err, "telemetry type is not supported") + require.NoError(t, exporter.Shutdown(context.Background())) } -func TestFactory_CreateTracesExporter(t *testing.T) { +func TestFactory_CreateTraces(t *testing.T) { factory := NewFactory() cfg := withDefaultConfig(func(cfg *Config) { - cfg.Endpoints = []string{"test:9200"} + cfg.Endpoints = []string{"http://test:9200"} }) - params := exportertest.NewNopCreateSettings() - exporter, err := factory.CreateTracesExporter(context.Background(), params, cfg) + params := exportertest.NewNopSettings() + exporter, err := factory.CreateTraces(context.Background(), params, cfg) require.NoError(t, err) require.NotNil(t, exporter) require.NoError(t, exporter.Shutdown(context.Background())) } -func TestFactory_CreateTracesExporter_Fail(t *testing.T) { - factory := NewFactory() - cfg := factory.CreateDefaultConfig() - params := exportertest.NewNopCreateSettings() - _, err := factory.CreateTracesExporter(context.Background(), params, cfg) - require.Error(t, err, "expected an error when creating a traces exporter") - assert.EqualError(t, err, "cannot configure Elasticsearch exporter: endpoints or cloudid must be specified") -} - func TestFactory_CreateLogsAndTracesExporterWithDeprecatedIndexOption(t *testing.T) { factory := NewFactory() cfg := withDefaultConfig(func(cfg *Config) { - cfg.Endpoints = []string{"test:9200"} + cfg.Endpoints = []string{"http://test:9200"} cfg.Index = "test_index" }) - params := exportertest.NewNopCreateSettings() - logsExporter, err := factory.CreateLogsExporter(context.Background(), params, cfg) + params := exportertest.NewNopSettings() + logsExporter, err := factory.CreateLogs(context.Background(), params, cfg) require.NoError(t, err) require.NotNil(t, logsExporter) require.NoError(t, logsExporter.Shutdown(context.Background())) - tracesExporter, err := factory.CreateTracesExporter(context.Background(), params, cfg) + tracesExporter, err := factory.CreateTraces(context.Background(), params, cfg) require.NoError(t, err) require.NotNil(t, tracesExporter) require.NoError(t, tracesExporter.Shutdown(context.Background())) } + +func TestFactory_DedupDeprecated(t *testing.T) { + factory := NewFactory() + cfg := withDefaultConfig(func(cfg *Config) { + dedup := false + cfg.Endpoint = "http://testing.invalid:9200" + cfg.Mapping.Dedup = &dedup + cfg.Mapping.Dedot = false // avoid dedot warnings + }) + + loggerCore, logObserver := observer.New(zap.WarnLevel) + set := exportertest.NewNopSettings() + set.Logger = zap.New(loggerCore) + + logsExporter, err := factory.CreateLogs(context.Background(), set, cfg) + require.NoError(t, err) + require.NoError(t, logsExporter.Shutdown(context.Background())) + + tracesExporter, err := factory.CreateTraces(context.Background(), set, cfg) + require.NoError(t, err) + require.NoError(t, tracesExporter.Shutdown(context.Background())) + + metricsExporter, err := factory.CreateMetrics(context.Background(), set, cfg) + require.NoError(t, err) + require.NoError(t, metricsExporter.Shutdown(context.Background())) + + records := logObserver.AllUntimed() + assert.Len(t, records, 3) + assert.Equal(t, "dedup is deprecated, and is always enabled", records[0].Message) + assert.Equal(t, "dedup is deprecated, and is always enabled", records[1].Message) + assert.Equal(t, "dedup is deprecated, and is always enabled", records[2].Message) +} + +func TestFactory_DedotDeprecated(t *testing.T) { + loggerCore, logObserver := observer.New(zap.WarnLevel) + set := exportertest.NewNopSettings() + set.Logger = zap.New(loggerCore) + + cfgNoDedotECS := withDefaultConfig(func(cfg *Config) { + cfg.Endpoint = "http://testing.invalid:9200" + cfg.Mapping.Dedot = false + cfg.Mapping.Mode = "ecs" + }) + + cfgDedotRaw := withDefaultConfig(func(cfg *Config) { + cfg.Endpoint = "http://testing.invalid:9200" + cfg.Mapping.Dedot = true + cfg.Mapping.Mode = "raw" + }) + + for _, cfg := range []*Config{cfgNoDedotECS, cfgDedotRaw} { + factory := NewFactory() + logsExporter, err := factory.CreateLogs(context.Background(), set, cfg) + require.NoError(t, err) + require.NoError(t, logsExporter.Shutdown(context.Background())) + + tracesExporter, err := factory.CreateTraces(context.Background(), set, cfg) + require.NoError(t, err) + require.NoError(t, tracesExporter.Shutdown(context.Background())) + + metricsExporter, err := factory.CreateMetrics(context.Background(), set, cfg) + require.NoError(t, err) + require.NoError(t, metricsExporter.Shutdown(context.Background())) + } + + records := logObserver.AllUntimed() + assert.Len(t, records, 6) + for _, record := range records { + assert.Equal(t, "dedot has been deprecated: in the future, dedotting will always be performed in ECS mode only", record.Message) + } +} diff --git a/exporter/elasticsearchexporter/generated_component_test.go b/exporter/elasticsearchexporter/generated_component_test.go index a1791eb8564c..3b1f57751b83 100644 --- a/exporter/elasticsearchexporter/generated_component_test.go +++ b/exporter/elasticsearchexporter/generated_component_test.go @@ -32,20 +32,27 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) + }, + }, + + { + name: "metrics", + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg) }, }, { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -57,21 +64,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(exporter.Logs) require.True(t, ok) diff --git a/exporter/elasticsearchexporter/go.mod b/exporter/elasticsearchexporter/go.mod index b01bb4d2ff78..e153c918c59e 100644 --- a/exporter/elasticsearchexporter/go.mod +++ b/exporter/elasticsearchexporter/go.mod @@ -1,81 +1,102 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter -go 1.21.0 +go 1.22.0 require ( github.com/cenkalti/backoff/v4 v4.3.0 - github.com/elastic/go-docappender/v2 v2.1.2 + github.com/elastic/go-docappender/v2 v2.3.2 github.com/elastic/go-elasticsearch/v7 v7.17.10 - github.com/elastic/go-structform v0.0.10 - github.com/lestrrat-go/strftime v1.0.6 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/config/configtls v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/elastic/go-structform v0.0.12 + github.com/json-iterator/go v1.1.12 + github.com/klauspost/compress v1.17.11 + github.com/lestrrat-go/strftime v1.1.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/stretchr/testify v1.10.0 + github.com/tidwall/gjson v1.18.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configauth v0.116.0 + go.opentelemetry.io/collector/config/configcompression v1.22.0 + go.opentelemetry.io/collector/config/confighttp v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/semconv v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) require ( github.com/armon/go-radix v1.0.0 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/elastic/elastic-transport-go/v8 v8.5.0 // indirect - github.com/elastic/go-elasticsearch/v8 v8.13.1 // indirect + github.com/elastic/elastic-transport-go/v8 v8.6.0 // indirect + github.com/elastic/go-elasticsearch/v8 v8.16.0 // indirect github.com/elastic/go-sysinfo v1.7.1 // indirect github.com/elastic/go-windows v1.0.1 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.8 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.elastic.co/apm/module/apmzap/v2 v2.6.0 // indirect - go.elastic.co/apm/v2 v2.6.0 // indirect - go.elastic.co/fastjson v1.3.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configretry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/consumer v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/rs/cors v1.11.1 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.0 // indirect + go.elastic.co/apm/module/apmzap/v2 v2.6.2 // indirect + go.elastic.co/apm/v2 v2.6.2 // indirect + go.elastic.co/fastjson v1.4.0 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/config/configretry v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/configtls v1.22.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect howett.net/plist v1.0.0 // indirect ) diff --git a/exporter/elasticsearchexporter/go.sum b/exporter/elasticsearchexporter/go.sum index 931203b73613..7a84bcaee9db 100644 --- a/exporter/elasticsearchexporter/go.sum +++ b/exporter/elasticsearchexporter/go.sum @@ -1,45 +1,49 @@ github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/elastic/elastic-transport-go/v8 v8.5.0 h1:v5membAl7lvQgBTexPRDBO/RdnlQX+FM9fUVDyXxvH0= -github.com/elastic/elastic-transport-go/v8 v8.5.0/go.mod h1:YLHer5cj0csTzNFXoNQ8qhtGY1GTvSqPnKWKaqQE3Hk= -github.com/elastic/go-docappender/v2 v2.1.2 h1:zkEh+g/CxpJdQR6BqdcApa/A4oRQiiG3iFiIhNCoovs= -github.com/elastic/go-docappender/v2 v2.1.2/go.mod h1:oHi6MsHriWaG8W6T9iyJ/PkEo2+182HIzq+0RRAzzgA= +github.com/elastic/elastic-transport-go/v8 v8.6.0 h1:Y2S/FBjx1LlCv5m6pWAF2kDJAHoSjSRSJCApolgfthA= +github.com/elastic/elastic-transport-go/v8 v8.6.0/go.mod h1:YLHer5cj0csTzNFXoNQ8qhtGY1GTvSqPnKWKaqQE3Hk= +github.com/elastic/go-docappender/v2 v2.3.2 h1:FJhYgq2DpCaxGaZUquc75dauEzWTWOyWUESAA/h8SPY= +github.com/elastic/go-docappender/v2 v2.3.2/go.mod h1:5URybRUfmexRMtM/lwvcIRLje3Gsrj15qiiLm41gDrc= github.com/elastic/go-elasticsearch/v7 v7.17.10 h1:TCQ8i4PmIJuBunvBS6bwT2ybzVFxxUhhltAs3Gyu1yo= github.com/elastic/go-elasticsearch/v7 v7.17.10/go.mod h1:OJ4wdbtDNk5g503kvlHLyErCgQwwzmDtaFC4XyOxXA4= -github.com/elastic/go-elasticsearch/v8 v8.13.1 h1:du5F8IzUUyCkzxyHdrO9AtopcG95I/qwi2WK8Kf1xlg= -github.com/elastic/go-elasticsearch/v8 v8.13.1/go.mod h1:DIn7HopJs4oZC/w0WoJR13uMUxtHeq92eI5bqv5CRfI= -github.com/elastic/go-structform v0.0.10 h1:oy08o/Ih2hHTkNcRY/1HhaYvIp5z6t8si8gnCJPDo1w= -github.com/elastic/go-structform v0.0.10/go.mod h1:CZWf9aIRYY5SuKSmOhtXScE5uQiLZNqAFnwKR4OrIM4= +github.com/elastic/go-elasticsearch/v8 v8.16.0 h1:f7bR+iBz8GTAVhwyFO3hm4ixsz2eMaEy0QroYnXV3jE= +github.com/elastic/go-elasticsearch/v8 v8.16.0/go.mod h1:lGMlgKIbYoRvay3xWBeKahAiJOgmFDsjZC39nmO3H64= +github.com/elastic/go-structform v0.0.12 h1:HXpzlAKyej8T7LobqKDThUw7BMhwV6Db24VwxNtgxCs= +github.com/elastic/go-structform v0.0.12/go.mod h1:CZWf9aIRYY5SuKSmOhtXScE5uQiLZNqAFnwKR4OrIM4= github.com/elastic/go-sysinfo v1.7.1 h1:Wx4DSARcKLllpKT2TnFVdSUJOsybqMYCNQZq1/wO+s0= github.com/elastic/go-sysinfo v1.7.1/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= github.com/elastic/go-windows v1.0.1 h1:AlYZOldA+UJ0/2nBuqWdo90GFCgG9xuyw9SYzGUtJm0= github.com/elastic/go-windows v1.0.1/go.mod h1:FoVvqWSun28vaDQPbj2Elfc0JahhPB7WQEGa3c814Ss= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= @@ -47,14 +51,14 @@ 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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -64,8 +68,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2ttpEmkA4aQ3j4u9dStX2t4M8UM6qqNsG8= github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is= -github.com/lestrrat-go/strftime v1.0.6 h1:CFGsDEt1pOpFNU+TJB0nhz9jl+K0hZSLE205AhTIGQQ= -github.com/lestrrat-go/strftime v1.0.6/go.mod h1:f7jQKgV5nnJpYgdEasS+/y7EsTb8ykN2z68n3TtcTaw= +github.com/lestrrat-go/strftime v1.1.0 h1:gMESpZy44/4pXLO/m+sL0yBd1W6LjgjrrD4a68Gapyg= +github.com/lestrrat-go/strftime v1.1.0/go.mod h1:uzeIB52CeUJenCo1syghlugshMysrqUT51HlxphXVeI= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= @@ -75,79 +79,121 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.elastic.co/apm/module/apmelasticsearch/v2 v2.6.0 h1:ukMcwyMaDXsS1dRK2qRYXT2AsfwaUy74TOOYCqkWJow= -go.elastic.co/apm/module/apmelasticsearch/v2 v2.6.0/go.mod h1:YpfiTTrqX5LB/CKBwX89oDCBAxuLJTFv40gcfxJyehM= -go.elastic.co/apm/module/apmhttp/v2 v2.6.0 h1:s8UeNFQmVBCNd4eoz7KDD9rEFhQC0HeUFXz3z9gpAmQ= -go.elastic.co/apm/module/apmhttp/v2 v2.6.0/go.mod h1:D0GLppLuI0Ddwvtl595GUxRgn6Z8L5KaDFVMv2H3GK0= -go.elastic.co/apm/module/apmzap/v2 v2.6.0 h1:R/iVORzGu3F9uM43iEVHD0nwiRo59O0bIXdayKsgayQ= -go.elastic.co/apm/module/apmzap/v2 v2.6.0/go.mod h1:B3i/8xRkqLgi6zNuV+Bp7Pt4cutaOObvrVSa7wUTAPw= -go.elastic.co/apm/v2 v2.6.0 h1:VieBMLQFtXua2YxpYxaSdYGnmmxhLT46gosI5yErJgY= -go.elastic.co/apm/v2 v2.6.0/go.mod h1:33rOXgtHwbgZcDgi6I/GtCSMZQqgxkHC0IQT3gudKvo= -go.elastic.co/fastjson v1.3.0 h1:hJO3OsYIhiqiT4Fgu0ZxAECnKASbwgiS+LMW5oCopKs= -go.elastic.co/fastjson v1.3.0/go.mod h1:K9vDh7O0ODsVKV2B5e2XYLY277QZaCbB3tS1SnARvko= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.elastic.co/apm/module/apmelasticsearch/v2 v2.6.2 h1:x5LIkBAIo2XT8nBqoAjPeJKUJC94le7D9aclBYP9uCw= +go.elastic.co/apm/module/apmelasticsearch/v2 v2.6.2/go.mod h1:LkYiSaKsGns6yRqXKAMbFyz7Nk8ikPCD/5CGkgQOY/A= +go.elastic.co/apm/module/apmhttp/v2 v2.6.2 h1:+aYtP1Lnrsm+XtEs87RWG2PAyU6LHDDnYnJl3Lth0Qk= +go.elastic.co/apm/module/apmhttp/v2 v2.6.2/go.mod h1:vlH+vXHaEijKK4pk605LOK+lbLDKwcByhlq4J24PeXw= +go.elastic.co/apm/module/apmzap/v2 v2.6.2 h1:MPpoAPkz9c3E0oflwzyrXnND/4zv9nXf/wEU0aAVWWc= +go.elastic.co/apm/module/apmzap/v2 v2.6.2/go.mod h1:10Xugf8PdrDjmyQYqSgJ/JUhKFMgpivQkTRVV9dUUeI= +go.elastic.co/apm/v2 v2.6.2 h1:VBplAxgbOgTv+Giw/FS91xJpHYw/q8fz/XKPvqC+7/o= +go.elastic.co/apm/v2 v2.6.2/go.mod h1:33rOXgtHwbgZcDgi6I/GtCSMZQqgxkHC0IQT3gudKvo= +go.elastic.co/fastjson v1.4.0 h1:a4BXUKXZHAzjVOPrqtEx2FDsIRBCMek01vCnrtyutWs= +go.elastic.co/fastjson v1.4.0/go.mod h1:ZD5um63l0/8TIdddZbL2znD83FAr2IckYa3KR7VcdNA= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -163,25 +209,25 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191025021431-6c3a3bfe00ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -190,12 +236,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/exporter/elasticsearchexporter/integrationtest/collector.go b/exporter/elasticsearchexporter/integrationtest/collector.go index 5fae9172a27b..5c7dddc00519 100644 --- a/exporter/elasticsearchexporter/integrationtest/collector.go +++ b/exporter/elasticsearchexporter/integrationtest/collector.go @@ -8,11 +8,12 @@ import ( "errors" "fmt" "os" + "strings" "sync" "testing" "time" - "github.com/shirou/gopsutil/v3/process" + "github.com/shirou/gopsutil/v4/process" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/confmap" @@ -34,7 +35,7 @@ import ( // createConfigYaml creates a yaml config for an otel collector for testing. func createConfigYaml( - t testing.TB, + tb testing.TB, sender testbed.DataSender, receiver testbed.DataReceiver, processors map[string]string, @@ -42,13 +43,16 @@ func createConfigYaml( pipelineType string, debug bool, ) string { - t.Helper() + tb.Helper() processorSection, processorList := createConfigSection(processors) extensionSection, extensionList := createConfigSection(extensions) + exporters := []string{receiver.ProtocolName()} debugVerbosity := "basic" + logLevel := "INFO" if debug { - debugVerbosity = "detailed" + exporters = append(exporters, "debug") + logLevel = "DEBUG" } format := ` @@ -67,12 +71,16 @@ service: telemetry: metrics: address: 127.0.0.1:%d + logs: + level: %s + sampling: + enabled: false extensions: [%s] pipelines: %s: receivers: [%v] processors: [%s] - exporters: [%v] + exporters: [%s] ` return fmt.Sprintf( @@ -82,12 +90,13 @@ service: debugVerbosity, processorSection, extensionSection, - testutil.GetAvailablePort(t), + testutil.GetAvailablePort(tb), + logLevel, extensionList, pipelineType, sender.ProtocolName(), processorList, - receiver.ProtocolName(), + strings.Join(exporters, ","), ) } @@ -120,7 +129,7 @@ type recreatableOtelCol struct { col *otelcol.Collector } -func newRecreatableOtelCol(t testing.TB) *recreatableOtelCol { +func newRecreatableOtelCol(tb testing.TB) *recreatableOtelCol { var ( err error factories otelcol.Factories @@ -128,20 +137,20 @@ func newRecreatableOtelCol(t testing.TB) *recreatableOtelCol { factories.Receivers, err = receiver.MakeFactoryMap( otlpreceiver.NewFactory(), ) - require.NoError(t, err) + require.NoError(tb, err) factories.Extensions, err = extension.MakeFactoryMap( filestorage.NewFactory(), ) - require.NoError(t, err) + require.NoError(tb, err) factories.Processors, err = processor.MakeFactoryMap() - require.NoError(t, err) + require.NoError(tb, err) factories.Exporters, err = exporter.MakeFactoryMap( elasticsearchexporter.NewFactory(), debugexporter.NewFactory(), ) - require.NoError(t, err) + require.NoError(tb, err) return &recreatableOtelCol{ - tempDir: t.TempDir(), + tempDir: tb.TempDir(), factories: factories, } } diff --git a/exporter/elasticsearchexporter/integrationtest/config.go b/exporter/elasticsearchexporter/integrationtest/config.go index 8112f805aed6..06713de1101c 100644 --- a/exporter/elasticsearchexporter/integrationtest/config.go +++ b/exporter/elasticsearchexporter/integrationtest/config.go @@ -11,12 +11,12 @@ import ( "github.com/stretchr/testify/require" ) -func getDebugFlag(t testing.TB) bool { +func getDebugFlag(tb testing.TB) bool { raw := os.Getenv("DEBUG") if raw == "" { return false } debug, err := strconv.ParseBool(raw) - require.NoError(t, err, "debug flag parsing failed") + require.NoError(tb, err, "debug flag parsing failed") return debug } diff --git a/exporter/elasticsearchexporter/integrationtest/datareceiver.go b/exporter/elasticsearchexporter/integrationtest/datareceiver.go index b0d3c7d4baa4..bf237f86524b 100644 --- a/exporter/elasticsearchexporter/integrationtest/datareceiver.go +++ b/exporter/elasticsearchexporter/integrationtest/datareceiver.go @@ -16,10 +16,12 @@ import ( "github.com/gorilla/mux" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componentstatus" "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/config/confighttp" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/pdata/plog" + "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" "go.opentelemetry.io/collector/receiver" "go.opentelemetry.io/collector/receiver/receivertest" @@ -31,12 +33,17 @@ import ( ) const ( - // TestLogsIndex is used by the mock ES data receiver to indentify log events. + // TestLogsIndex is used by the mock ES data receiver to identify log events. // Exporter LogsIndex configuration must be configured with TestLogsIndex for // the data receiver to work properly TestLogsIndex = "logs-test-idx" - // TestTracesIndex is used by the mock ES data receiver to indentify trace + // TestMetricsIndex is used by the mock ES data receiver to identify metric events. + // Exporter MetricsIndex configuration must be configured with TestMetricsIndex for + // the data receiver to work properly + TestMetricsIndex = "metrics-test-idx" + + // TestTracesIndex is used by the mock ES data receiver to identify trace // events. Exporter TracesIndex configuration must be configured with // TestTracesIndex for the data receiver to work properly TestTracesIndex = "traces-test-idx" @@ -47,23 +54,43 @@ type esDataReceiver struct { receiver receiver.Logs endpoint string decodeBulkRequest bool + batcherEnabled *bool t testing.TB } -func newElasticsearchDataReceiver(t testing.TB, decodeBulkRequest bool) *esDataReceiver { - return &esDataReceiver{ +type dataReceiverOption func(*esDataReceiver) + +func newElasticsearchDataReceiver(tb testing.TB, opts ...dataReceiverOption) *esDataReceiver { + r := &esDataReceiver{ DataReceiverBase: testbed.DataReceiverBase{}, - endpoint: fmt.Sprintf("http://%s:%d", testbed.DefaultHost, testutil.GetAvailablePort(t)), - decodeBulkRequest: decodeBulkRequest, - t: t, + endpoint: fmt.Sprintf("http://%s:%d", testbed.DefaultHost, testutil.GetAvailablePort(tb)), + decodeBulkRequest: true, + t: tb, + } + for _, opt := range opts { + opt(r) + } + return r +} + +func withDecodeBulkRequest(decode bool) dataReceiverOption { + return func(r *esDataReceiver) { + r.decodeBulkRequest = decode } } -func (es *esDataReceiver) Start(tc consumer.Traces, _ consumer.Metrics, lc consumer.Logs) error { +func withBatcherEnabled(enabled bool) dataReceiverOption { + return func(r *esDataReceiver) { + r.batcherEnabled = &enabled + } +} + +func (es *esDataReceiver) Start(tc consumer.Traces, mc consumer.Metrics, lc consumer.Logs) error { factory := receiver.NewFactory( component.MustNewType("mockelasticsearch"), createDefaultConfig, receiver.WithLogs(createLogsReceiver, component.StabilityLevelDevelopment), + receiver.WithMetrics(createMetricsReceiver, component.StabilityLevelDevelopment), receiver.WithTraces(createTracesReceiver, component.StabilityLevelDevelopment), ) esURL, err := url.Parse(es.endpoint) @@ -74,20 +101,25 @@ func (es *esDataReceiver) Start(tc consumer.Traces, _ consumer.Metrics, lc consu cfg.ServerConfig.Endpoint = esURL.Host cfg.DecodeBulkRequests = es.decodeBulkRequest - set := receivertest.NewNopCreateSettings() + set := receivertest.NewNopSettings() // Use an actual logger to log errors. set.Logger = zap.Must(zap.NewDevelopment()) - logsReceiver, err := factory.CreateLogsReceiver(context.Background(), set, cfg, lc) + logsReceiver, err := factory.CreateLogs(context.Background(), set, cfg, lc) if err != nil { return fmt.Errorf("failed to create logs receiver: %w", err) } - tracesReceiver, err := factory.CreateTracesReceiver(context.Background(), set, cfg, tc) + metricsReceiver, err := factory.CreateMetrics(context.Background(), set, cfg, mc) + if err != nil { + return fmt.Errorf("failed to create metrics receiver: %w", err) + } + tracesReceiver, err := factory.CreateTraces(context.Background(), set, cfg, tc) if err != nil { return fmt.Errorf("failed to create traces receiver: %w", err) } // Since we use SharedComponent both receivers should be same require.Same(es.t, logsReceiver, tracesReceiver) + require.Same(es.t, logsReceiver, metricsReceiver) es.receiver = logsReceiver return es.receiver.Start(context.Background(), componenttest.NewNopHost()) @@ -102,20 +134,41 @@ func (es *esDataReceiver) Stop() error { func (es *esDataReceiver) GenConfigYAMLStr() string { // Note that this generates an exporter config for agent. - cfgFormat := ` + cfgFormat := fmt.Sprintf(` elasticsearch: endpoints: [%s] logs_index: %s + logs_dynamic_index: + enabled: false + metrics_index: %s + metrics_dynamic_index: + enabled: false traces_index: %s - flush: - interval: 1s + traces_dynamic_index: + enabled: false sending_queue: enabled: true retry: enabled: true - max_requests: 10000 -` - return fmt.Sprintf(cfgFormat, es.endpoint, TestLogsIndex, TestTracesIndex) + initial_interval: 100ms + max_interval: 1s + max_requests: 10000`, + es.endpoint, TestLogsIndex, TestMetricsIndex, TestTracesIndex, + ) + + if es.batcherEnabled == nil { + cfgFormat += ` + flush: + interval: 1s` + } else { + cfgFormat += fmt.Sprintf(` + batcher: + flush_timeout: 1s + enabled: %v`, + *es.batcherEnabled, + ) + } + return cfgFormat + "\n" } func (es *esDataReceiver) ProtocolName() string { @@ -144,7 +197,7 @@ func createDefaultConfig() component.Config { func createLogsReceiver( _ context.Context, - params receiver.CreateSettings, + params receiver.Settings, rawCfg component.Config, next consumer.Logs, ) (receiver.Logs, error) { @@ -155,9 +208,22 @@ func createLogsReceiver( return receiver, nil } +func createMetricsReceiver( + _ context.Context, + params receiver.Settings, + rawCfg component.Config, + next consumer.Metrics, +) (receiver.Metrics, error) { + receiver := receivers.GetOrAdd(rawCfg, func() component.Component { + return newMockESReceiver(params, rawCfg.(*config)) + }) + receiver.Unwrap().(*mockESReceiver).metricsConsumer = next + return receiver, nil +} + func createTracesReceiver( _ context.Context, - params receiver.CreateSettings, + params receiver.Settings, rawCfg component.Config, next consumer.Traces, ) (receiver.Traces, error) { @@ -169,16 +235,17 @@ func createTracesReceiver( } type mockESReceiver struct { - params receiver.CreateSettings + params receiver.Settings config *config - tracesConsumer consumer.Traces - logsConsumer consumer.Logs + tracesConsumer consumer.Traces + logsConsumer consumer.Logs + metricsConsumer consumer.Metrics server *http.Server } -func newMockESReceiver(params receiver.CreateSettings, cfg *config) receiver.Logs { +func newMockESReceiver(params receiver.Settings, cfg *config) receiver.Logs { return &mockESReceiver{ params: params, config: cfg, @@ -197,10 +264,12 @@ func (es *mockESReceiver) Start(ctx context.Context, host component.Host) error // Ideally bulk request items should be converted to the corresponding event record // however, since we only assert count for now there is no need to do the actual - // translation. Instead we use a pre-initialized empty logs and traces model to + // translation. Instead we use a pre-initialized empty models to // reduce allocation impact on tests and benchmarks. emptyLogs := plog.NewLogs() emptyLogs.ResourceLogs().AppendEmpty().ScopeLogs().AppendEmpty().LogRecords().AppendEmpty() + emptyMetrics := pmetric.NewMetrics() + emptyMetrics.ResourceMetrics().AppendEmpty().ScopeMetrics().AppendEmpty().Metrics().AppendEmpty().SetEmptySum().DataPoints().AppendEmpty() emptyTrace := ptrace.NewTraces() emptyTrace.ResourceSpans().AppendEmpty().ScopeSpans().AppendEmpty().Spans().AppendEmpty() @@ -216,7 +285,7 @@ func (es *mockESReceiver) Start(ctx context.Context, host component.Host) error }) r.HandleFunc("/_bulk", func(w http.ResponseWriter, r *http.Request) { if !es.config.DecodeBulkRequests { - w.WriteHeader(http.StatusOK) + fmt.Fprintln(w, "{}") return } _, response := docappendertest.DecodeBulkRequest(r) @@ -226,6 +295,8 @@ func (es *mockESReceiver) Start(ctx context.Context, host component.Host) error switch item.Index { case TestLogsIndex: consumeErr = es.logsConsumer.ConsumeLogs(context.Background(), emptyLogs) + case TestMetricsIndex: + consumeErr = es.metricsConsumer.ConsumeMetrics(context.Background(), emptyMetrics) case TestTracesIndex: consumeErr = es.tracesConsumer.ConsumeTraces(context.Background(), emptyTrace) } @@ -250,7 +321,7 @@ func (es *mockESReceiver) Start(ctx context.Context, host component.Host) error go func() { if err := es.server.Serve(ln); err != nil && !errors.Is(err, http.ErrServerClosed) { - es.params.ReportStatus(component.NewFatalErrorEvent(err)) + componentstatus.ReportStatus(host, componentstatus.NewFatalErrorEvent(err)) } }() return nil diff --git a/exporter/elasticsearchexporter/integrationtest/exporter_bench_test.go b/exporter/elasticsearchexporter/integrationtest/exporter_bench_test.go index 65c8abbbda1a..49106c7b084f 100644 --- a/exporter/elasticsearchexporter/integrationtest/exporter_bench_test.go +++ b/exporter/elasticsearchexporter/integrationtest/exporter_bench_test.go @@ -18,41 +18,49 @@ import ( "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" + "go.uber.org/zap" + "go.uber.org/zap/zaptest" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter" "github.com/open-telemetry/opentelemetry-collector-contrib/testbed/testbed" ) func BenchmarkExporter(b *testing.B) { - for _, eventType := range []string{"logs", "traces"} { - for _, tc := range []struct { - name string - batchSize int - }{ - {name: "small_batch", batchSize: 10}, - {name: "medium_batch", batchSize: 100}, - {name: "large_batch", batchSize: 1000}, - {name: "xlarge_batch", batchSize: 10000}, - } { - b.Run(fmt.Sprintf("%s/%s", eventType, tc.name), func(b *testing.B) { - switch eventType { - case "logs": - benchmarkLogs(b, tc.batchSize) - case "traces": - benchmarkTraces(b, tc.batchSize) - } - }) + for _, eventType := range []string{"logs", "metrics", "traces"} { + for _, mappingMode := range []string{"none", "ecs", "raw"} { + for _, tc := range []struct { + name string + batchSize int + }{ + {name: "small_batch", batchSize: 10}, + {name: "medium_batch", batchSize: 100}, + {name: "large_batch", batchSize: 1000}, + {name: "xlarge_batch", batchSize: 10000}, + } { + b.Run(fmt.Sprintf("%s/%s/%s", eventType, mappingMode, tc.name), func(b *testing.B) { + switch eventType { + case "logs": + benchmarkLogs(b, tc.batchSize, mappingMode) + case "metrics": + benchmarkMetrics(b, tc.batchSize, mappingMode) + case "traces": + benchmarkTraces(b, tc.batchSize, mappingMode) + } + }) + } } } } -func benchmarkLogs(b *testing.B, batchSize int) { +func benchmarkLogs(b *testing.B, batchSize int, mappingMode string) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - runnerCfg := prepareBenchmark(b, batchSize) - exporter, err := runnerCfg.factory.CreateLogsExporter( - ctx, exportertest.NewNopCreateSettings(), runnerCfg.esCfg, + exporterSettings := exportertest.NewNopSettings() + exporterSettings.TelemetrySettings.Logger = zaptest.NewLogger(b, zaptest.Level(zap.WarnLevel)) + runnerCfg := prepareBenchmark(b, batchSize, mappingMode) + exporter, err := runnerCfg.factory.CreateLogs( + ctx, exporterSettings, runnerCfg.esCfg, ) require.NoError(b, err) require.NoError(b, exporter.Start(ctx, componenttest.NewNopHost())) @@ -73,13 +81,44 @@ func benchmarkLogs(b *testing.B, batchSize int) { require.NoError(b, exporter.Shutdown(ctx)) } -func benchmarkTraces(b *testing.B, batchSize int) { +func benchmarkMetrics(b *testing.B, batchSize int, mappingMode string) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - runnerCfg := prepareBenchmark(b, batchSize) - exporter, err := runnerCfg.factory.CreateTracesExporter( - ctx, exportertest.NewNopCreateSettings(), runnerCfg.esCfg, + exporterSettings := exportertest.NewNopSettings() + exporterSettings.TelemetrySettings.Logger = zaptest.NewLogger(b, zaptest.Level(zap.WarnLevel)) + runnerCfg := prepareBenchmark(b, batchSize, mappingMode) + exporter, err := runnerCfg.factory.CreateMetrics( + ctx, exporterSettings, runnerCfg.esCfg, + ) + require.NoError(b, err) + require.NoError(b, exporter.Start(ctx, componenttest.NewNopHost())) + + b.ReportAllocs() + b.ResetTimer() + b.StopTimer() + for i := 0; i < b.N; i++ { + metrics, _ := runnerCfg.provider.GenerateMetrics() + b.StartTimer() + require.NoError(b, exporter.ConsumeMetrics(ctx, metrics)) + b.StopTimer() + } + b.ReportMetric( + float64(runnerCfg.generatedCount.Load())/b.Elapsed().Seconds(), + "events/s", + ) + require.NoError(b, exporter.Shutdown(ctx)) +} + +func benchmarkTraces(b *testing.B, batchSize int, mappingMode string) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + exporterSettings := exportertest.NewNopSettings() + exporterSettings.TelemetrySettings.Logger = zaptest.NewLogger(b, zaptest.Level(zap.WarnLevel)) + runnerCfg := prepareBenchmark(b, batchSize, mappingMode) + exporter, err := runnerCfg.factory.CreateTraces( + ctx, exporterSettings, runnerCfg.esCfg, ) require.NoError(b, err) require.NoError(b, exporter.Start(ctx, componenttest.NewNopHost())) @@ -111,20 +150,26 @@ type benchRunnerCfg struct { func prepareBenchmark( b *testing.B, batchSize int, + mappingMode string, ) *benchRunnerCfg { b.Helper() cfg := &benchRunnerCfg{} // Benchmarks don't decode the bulk requests to avoid allocations to pollute the results. - receiver := newElasticsearchDataReceiver(b, false /* DecodeBulkRequest */) + receiver := newElasticsearchDataReceiver(b, withDecodeBulkRequest(false)) cfg.provider = testbed.NewPerfTestDataProvider(testbed.LoadOptions{ItemsPerBatch: batchSize}) cfg.provider.SetLoadGeneratorCounters(&cfg.generatedCount) cfg.factory = elasticsearchexporter.NewFactory() cfg.esCfg = cfg.factory.CreateDefaultConfig().(*elasticsearchexporter.Config) + cfg.esCfg.Mapping.Mode = mappingMode cfg.esCfg.Endpoints = []string{receiver.endpoint} cfg.esCfg.LogsIndex = TestLogsIndex + cfg.esCfg.LogsDynamicIndex.Enabled = false + cfg.esCfg.MetricsIndex = TestMetricsIndex + cfg.esCfg.MetricsDynamicIndex.Enabled = false cfg.esCfg.TracesIndex = TestTracesIndex + cfg.esCfg.TracesDynamicIndex.Enabled = false cfg.esCfg.Flush.Interval = 10 * time.Millisecond cfg.esCfg.NumWorkers = 1 diff --git a/exporter/elasticsearchexporter/integrationtest/exporter_test.go b/exporter/elasticsearchexporter/integrationtest/exporter_test.go index c0df3d575308..57b6f936713f 100644 --- a/exporter/elasticsearchexporter/integrationtest/exporter_test.go +++ b/exporter/elasticsearchexporter/integrationtest/exporter_test.go @@ -17,9 +17,16 @@ import ( ) func TestExporter(t *testing.T) { - for _, eventType := range []string{"logs", "traces"} { + for _, eventType := range []string{"logs", "metrics", "traces"} { for _, tc := range []struct { name string + + // batcherEnabled enables/disables the batch sender. If this is + // nil, then the exporter buffers data itself (legacy behavior), + // whereas if it is non-nil then the exporter will not perform + // any buffering itself. + batcherEnabled *bool + // restartCollector restarts the OTEL collector. Restarting // the collector allows durability testing of the ES exporter // based on the OTEL config used for testing. @@ -28,19 +35,29 @@ func TestExporter(t *testing.T) { }{ {name: "basic"}, {name: "es_intermittent_failure", mockESFailure: true}, + + {name: "batcher_enabled", batcherEnabled: ptrTo(true)}, + {name: "batcher_enabled_es_intermittent_failure", batcherEnabled: ptrTo(true), mockESFailure: true}, + {name: "batcher_disabled", batcherEnabled: ptrTo(false)}, + {name: "batcher_disabled_es_intermittent_failure", batcherEnabled: ptrTo(false), mockESFailure: true}, + /* TODO: Below tests should be enabled after https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/30792 is fixed {name: "collector_restarts", restartCollector: true}, {name: "collector_restart_with_es_intermittent_failure", mockESFailure: true, restartCollector: true}, */ } { t.Run(fmt.Sprintf("%s/%s", eventType, tc.name), func(t *testing.T) { - runner(t, eventType, tc.restartCollector, tc.mockESFailure) + var opts []dataReceiverOption + if tc.batcherEnabled != nil { + opts = append(opts, withBatcherEnabled(*tc.batcherEnabled)) + } + runner(t, eventType, tc.restartCollector, tc.mockESFailure, opts...) }) } } } -func runner(t *testing.T, eventType string, restartCollector, mockESFailure bool) { +func runner(t *testing.T, eventType string, restartCollector, mockESFailure bool, opts ...dataReceiverOption) { t.Helper() var ( @@ -51,13 +68,15 @@ func runner(t *testing.T, eventType string, restartCollector, mockESFailure bool switch eventType { case "logs": sender = testbed.NewOTLPLogsDataSender(host, port) + case "metrics": + sender = testbed.NewOTLPMetricDataSender(host, port) case "traces": sender = testbed.NewOTLPTraceDataSender(host, port) default: t.Fatalf("failed to create data sender for type: %s", eventType) } - receiver := newElasticsearchDataReceiver(t, true) + receiver := newElasticsearchDataReceiver(t, opts...) loadOpts := testbed.LoadOptions{ DataItemsPerSecond: 1_000, ItemsPerBatch: 10, @@ -123,3 +142,7 @@ func runner(t *testing.T, eventType string, restartCollector, mockESFailure bool ) tc.ValidateData() } + +func ptrTo[T any](t T) *T { + return &t +} diff --git a/exporter/elasticsearchexporter/integrationtest/go.mod b/exporter/elasticsearchexporter/integrationtest/go.mod index 980931ffbb4c..acfd0781b1ce 100644 --- a/exporter/elasticsearchexporter/integrationtest/go.mod +++ b/exporter/elasticsearchexporter/integrationtest/go.mod @@ -1,184 +1,219 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter/integrationtest -go 1.21.0 +go 1.22.0 require ( - github.com/elastic/go-docappender/v2 v2.1.2 + github.com/elastic/go-docappender/v2 v2.3.2 github.com/gorilla/mux v1.8.1 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/filestorage v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/testbed v0.102.0 - github.com/shirou/gopsutil/v3 v3.24.4 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/confighttp v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/exporter/debugexporter v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/collector/otelcol v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/processor v0.102.0 - go.opentelemetry.io/collector/receiver v0.102.0 - go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0 + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/filestorage v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/testbed v0.116.0 + github.com/shirou/gopsutil/v4 v4.24.11 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componentstatus v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/confighttp v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/debugexporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/otelcol v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/processor v0.116.0 + go.opentelemetry.io/collector/receiver v0.116.0 + go.opentelemetry.io/collector/receiver/otlpreceiver v0.116.0 + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 go.uber.org/zap v1.27.0 - golang.org/x/sync v0.7.0 + golang.org/x/sync v0.10.0 ) require ( github.com/alecthomas/participle/v2 v2.1.1 // indirect - github.com/apache/thrift v0.20.0 // indirect + github.com/antchfx/xmlquery v1.4.2 // indirect + github.com/antchfx/xpath v1.3.2 // indirect + github.com/apache/thrift v0.21.0 // indirect github.com/armon/go-radix v1.0.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/elastic/elastic-transport-go/v8 v8.5.0 // indirect + github.com/ebitengine/purego v0.8.1 // indirect + github.com/elastic/elastic-transport-go/v8 v8.6.0 // indirect github.com/elastic/go-elasticsearch/v7 v7.17.10 // indirect - github.com/elastic/go-elasticsearch/v8 v8.13.1 // indirect - github.com/elastic/go-structform v0.0.10 // indirect + github.com/elastic/go-elasticsearch/v8 v8.16.0 // indirect + github.com/elastic/go-grok v0.3.1 // indirect + github.com/elastic/go-structform v0.0.12 // indirect github.com/elastic/go-sysinfo v1.14.0 // indirect github.com/elastic/go-windows v1.0.1 // indirect + github.com/elastic/lunes v0.1.0 // indirect github.com/expr-lang/expr v1.16.9 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gobwas/glob v0.2.3 // indirect + github.com/goccy/go-json v0.10.4 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/iancoleman/strcase v0.3.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/jaegertracing/jaeger v1.57.0 // indirect + github.com/jaegertracing/jaeger v1.62.0 // indirect + github.com/jonboulle/clockwork v0.4.0 // indirect github.com/jpillora/backoff v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect - github.com/leodido/go-syslog/v4 v4.1.0 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect + github.com/leodido/go-syslog/v4 v4.2.0 // indirect github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b // indirect - github.com/lestrrat-go/strftime v1.0.6 // indirect + github.com/lestrrat-go/strftime v1.1.0 // indirect github.com/lightstep/go-expohisto v1.0.0 // indirect github.com/lufia/plan9stats v0.0.0-20240226150601-1dcf7310316a // indirect + github.com/magefile/mage v1.15.0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/mostynb/go-grpc-compression v1.2.2 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.102.0 // indirect + github.com/mostynb/go-grpc-compression v1.2.3 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.116.0 // indirect github.com/openzipkin/zipkin-go v0.4.3 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect + github.com/prometheus/client_golang v1.20.5 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/rs/cors v1.11.0 // indirect - github.com/shoenig/go-m1cpu v0.1.6 // indirect - github.com/shoenig/test v1.7.1 // indirect + github.com/prometheus/common v0.61.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/rs/cors v1.11.1 // indirect github.com/soheilhy/cmux v0.1.5 // indirect - github.com/spf13/cobra v1.8.0 // indirect + github.com/spf13/cobra v1.8.1 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/tilinna/clock v1.1.0 // indirect github.com/tklauser/go-sysconf v0.3.13 // indirect github.com/tklauser/numcpus v0.7.0 // indirect + github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 // indirect github.com/valyala/fastjson v1.6.4 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect - go.elastic.co/apm/module/apmelasticsearch/v2 v2.6.0 // indirect - go.elastic.co/apm/module/apmhttp/v2 v2.6.0 // indirect - go.elastic.co/apm/module/apmzap/v2 v2.6.0 // indirect - go.elastic.co/apm/v2 v2.6.0 // indirect - go.elastic.co/fastjson v1.3.0 // indirect - go.etcd.io/bbolt v1.3.10 // indirect + go.elastic.co/apm/module/apmelasticsearch/v2 v2.6.2 // indirect + go.elastic.co/apm/module/apmhttp/v2 v2.6.2 // indirect + go.elastic.co/apm/module/apmzap/v2 v2.6.2 // indirect + go.elastic.co/apm/v2 v2.6.2 // indirect + go.elastic.co/fastjson v1.4.0 // indirect + go.etcd.io/bbolt v1.3.11 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/configgrpc v0.102.0 // indirect - go.opentelemetry.io/collector/config/confignet v0.102.0 // indirect - go.opentelemetry.io/collector/config/configopaque v1.9.0 // indirect - go.opentelemetry.io/collector/config/configretry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0 // indirect - go.opentelemetry.io/collector/connector v0.102.0 // indirect - go.opentelemetry.io/collector/exporter/otlpexporter v0.102.0 // indirect - go.opentelemetry.io/collector/exporter/otlphttpexporter v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/extension/ballastextension v0.102.0 // indirect - go.opentelemetry.io/collector/extension/zpagesextension v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/processor/batchprocessor v0.102.0 // indirect - go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.102.0 // indirect - go.opentelemetry.io/collector/semconv v0.102.0 // indirect - go.opentelemetry.io/collector/service v0.102.0 // indirect - go.opentelemetry.io/contrib/config v0.7.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/contrib/propagators/b3 v1.27.0 // indirect - go.opentelemetry.io/contrib/zpages v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/bridge/opencensus v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 // indirect - go.opentelemetry.io/otel/metric v1.27.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - go.opentelemetry.io/otel/trace v1.27.0 // indirect - go.opentelemetry.io/proto/otlp v1.2.0 // indirect + go.opentelemetry.io/collector v0.116.0 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/configgrpc v0.116.0 // indirect + go.opentelemetry.io/collector/config/confignet v1.22.0 // indirect + go.opentelemetry.io/collector/config/configopaque v1.22.0 // indirect + go.opentelemetry.io/collector/config/configretry v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/configtls v1.22.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/connector v0.116.0 // indirect + go.opentelemetry.io/collector/connector/connectortest v0.116.0 // indirect + go.opentelemetry.io/collector/connector/xconnector v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/otlpexporter v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/otlphttpexporter v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0 // indirect + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 // indirect + go.opentelemetry.io/collector/extension/zpagesextension v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/internal/memorylimiter v0.116.0 // indirect + go.opentelemetry.io/collector/internal/sharedcomponent v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/testdata v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 // indirect + go.opentelemetry.io/collector/processor/batchprocessor v0.116.0 // indirect + go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.116.0 // indirect + go.opentelemetry.io/collector/processor/processortest v0.116.0 // indirect + go.opentelemetry.io/collector/processor/xprocessor v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/collector/semconv v0.116.0 // indirect + go.opentelemetry.io/collector/service v0.116.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.6.0 // indirect + go.opentelemetry.io/contrib/config v0.10.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/contrib/propagators/b3 v1.31.0 // indirect + go.opentelemetry.io/contrib/zpages v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.54.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 // indirect + go.opentelemetry.io/otel/log v0.8.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.7.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - gonum.org/v1/gonum v0.15.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + gonum.org/v1/gonum v0.15.1 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect howett.net/plist v1.0.1 // indirect ) @@ -272,3 +307,7 @@ replace github.com/open-telemetry/opentelemetry-collector-contrib/connector/span replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl => ../../../pkg/ottl replace github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector => ../../../connector/routingconnector + +replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics => ../../../internal/exp/metrics + +replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil => ../../../internal/pdatautil diff --git a/exporter/elasticsearchexporter/integrationtest/go.sum b/exporter/elasticsearchexporter/integrationtest/go.sum index 3d01a1d4a5db..79dca129e643 100644 --- a/exporter/elasticsearchexporter/integrationtest/go.sum +++ b/exporter/elasticsearchexporter/integrationtest/go.sum @@ -2,16 +2,18 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/alecthomas/assert/v2 v2.3.0 h1:mAsH2wmvjsuvyBvAmCtm7zFsBlb8mIHx5ySLVdDZXL0= github.com/alecthomas/assert/v2 v2.3.0/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= github.com/alecthomas/participle/v2 v2.1.1 h1:hrjKESvSqGHzRb4yW1ciisFJ4p3MGYih6icjJvbsmV8= github.com/alecthomas/participle/v2 v2.1.1/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= -github.com/apache/thrift v0.20.0 h1:631+KvYbsBZxmuJjYwhezVsrfc/TbqtZV4QcxOX1fOI= -github.com/apache/thrift v0.20.0/go.mod h1:hOk1BQqcp2OLzGsyVXdfMk7YFlMxK3aoEVhjD06QhB8= +github.com/antchfx/xmlquery v1.4.2 h1:MZKd9+wblwxfQ1zd1AdrTsqVaMjMCwow3IqkCSe00KA= +github.com/antchfx/xmlquery v1.4.2/go.mod h1:QXhvf5ldTuGqhd1SHNvvtlhhdQLks4dD0awIVhXIDTA= +github.com/antchfx/xpath v1.3.2 h1:LNjzlsSjinu3bQpw9hWMY9ocB80oLOWuQqFvO6xt51U= +github.com/antchfx/xpath v1.3.2/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= +github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE= +github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw= github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -25,25 +27,31 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/elastic/elastic-transport-go/v8 v8.5.0 h1:v5membAl7lvQgBTexPRDBO/RdnlQX+FM9fUVDyXxvH0= -github.com/elastic/elastic-transport-go/v8 v8.5.0/go.mod h1:YLHer5cj0csTzNFXoNQ8qhtGY1GTvSqPnKWKaqQE3Hk= -github.com/elastic/go-docappender/v2 v2.1.2 h1:zkEh+g/CxpJdQR6BqdcApa/A4oRQiiG3iFiIhNCoovs= -github.com/elastic/go-docappender/v2 v2.1.2/go.mod h1:oHi6MsHriWaG8W6T9iyJ/PkEo2+182HIzq+0RRAzzgA= +github.com/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/BE= +github.com/ebitengine/purego v0.8.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/elastic/elastic-transport-go/v8 v8.6.0 h1:Y2S/FBjx1LlCv5m6pWAF2kDJAHoSjSRSJCApolgfthA= +github.com/elastic/elastic-transport-go/v8 v8.6.0/go.mod h1:YLHer5cj0csTzNFXoNQ8qhtGY1GTvSqPnKWKaqQE3Hk= +github.com/elastic/go-docappender/v2 v2.3.2 h1:FJhYgq2DpCaxGaZUquc75dauEzWTWOyWUESAA/h8SPY= +github.com/elastic/go-docappender/v2 v2.3.2/go.mod h1:5URybRUfmexRMtM/lwvcIRLje3Gsrj15qiiLm41gDrc= github.com/elastic/go-elasticsearch/v7 v7.17.10 h1:TCQ8i4PmIJuBunvBS6bwT2ybzVFxxUhhltAs3Gyu1yo= github.com/elastic/go-elasticsearch/v7 v7.17.10/go.mod h1:OJ4wdbtDNk5g503kvlHLyErCgQwwzmDtaFC4XyOxXA4= -github.com/elastic/go-elasticsearch/v8 v8.13.1 h1:du5F8IzUUyCkzxyHdrO9AtopcG95I/qwi2WK8Kf1xlg= -github.com/elastic/go-elasticsearch/v8 v8.13.1/go.mod h1:DIn7HopJs4oZC/w0WoJR13uMUxtHeq92eI5bqv5CRfI= -github.com/elastic/go-structform v0.0.10 h1:oy08o/Ih2hHTkNcRY/1HhaYvIp5z6t8si8gnCJPDo1w= -github.com/elastic/go-structform v0.0.10/go.mod h1:CZWf9aIRYY5SuKSmOhtXScE5uQiLZNqAFnwKR4OrIM4= +github.com/elastic/go-elasticsearch/v8 v8.16.0 h1:f7bR+iBz8GTAVhwyFO3hm4ixsz2eMaEy0QroYnXV3jE= +github.com/elastic/go-elasticsearch/v8 v8.16.0/go.mod h1:lGMlgKIbYoRvay3xWBeKahAiJOgmFDsjZC39nmO3H64= +github.com/elastic/go-grok v0.3.1 h1:WEhUxe2KrwycMnlvMimJXvzRa7DoByJB4PVUIE1ZD/U= +github.com/elastic/go-grok v0.3.1/go.mod h1:n38ls8ZgOboZRgKcjMY8eFeZFMmcL9n2lP0iHhIDk64= +github.com/elastic/go-structform v0.0.12 h1:HXpzlAKyej8T7LobqKDThUw7BMhwV6Db24VwxNtgxCs= +github.com/elastic/go-structform v0.0.12/go.mod h1:CZWf9aIRYY5SuKSmOhtXScE5uQiLZNqAFnwKR4OrIM4= github.com/elastic/go-sysinfo v1.14.0 h1:dQRtiqLycoOOla7IflZg3aN213vqJmP0lpVpKQ9lUEY= github.com/elastic/go-sysinfo v1.14.0/go.mod h1:FKUXnZWhnYI0ueO7jhsGV3uQJ5hiz8OqM5b3oGyaRr8= github.com/elastic/go-windows v1.0.1 h1:AlYZOldA+UJ0/2nBuqWdo90GFCgG9xuyw9SYzGUtJm0= github.com/elastic/go-windows v1.0.1/go.mod h1:FoVvqWSun28vaDQPbj2Elfc0JahhPB7WQEGa3c814Ss= +github.com/elastic/lunes v0.1.0 h1:amRtLPjwkWtzDF/RKzcEPMvSsSseLDLW+bnhfNSLRe4= +github.com/elastic/lunes v0.1.0/go.mod h1:xGphYIt3XdZRtyWosHQTErsQTd4OP1p9wsbVoHelrd4= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -52,22 +60,22 @@ github.com/expr-lang/expr v1.16.9 h1:WUAzmR0JNI9JCiF0/ewwHB1gmcGw5wW7nWt8gc6PpCI github.com/expr-lang/expr v1.16.9/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/go-kit/kit v0.13.0 h1:OoneCcHKHQ03LfBpoQCUfCluwd2Vt3ohz+kvbJneZAU= -github.com/go-kit/kit v0.13.0/go.mod h1:phqEHMMUbyrCFCTgH48JueqrM3md2HcAZ8N3XE4FKDg= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= +github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -96,26 +104,27 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= -github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= +github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= +github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= -github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 h1:pRhl55Yx1eC7BZ1N+BBWwnKaMyD8uC+34TLdndZMAKk= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ/U4HP0zS2Z9Fh8Ps9a+6X26m/tmI= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= @@ -124,40 +133,45 @@ github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSAS github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jaegertracing/jaeger v1.57.0 h1:3wDtUUPs6NRYH7+d+y8MilDkLHdpPrVlQ2wbcsA62bs= -github.com/jaegertracing/jaeger v1.57.0/go.mod h1:p/1fxIU9hKHl7qEhKC72p2ZYVhvvZvNB73y6V7YyuTs= +github.com/jaegertracing/jaeger v1.62.0 h1:YoaJ2e8oVz5sqGGlVAKSUCED8DzJ1q7PojBmZFNKoJA= +github.com/jaegertracing/jaeger v1.62.0/go.mod h1:jhEIHazwyb+a6xlRBi+p96BAvTYTSmGkghcwdQfV7FM= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/leodido/go-syslog/v4 v4.1.0 h1:Wsl194qyWXr7V6DrGWC3xmxA9Ra6XgWO+toNt2fmCaI= -github.com/leodido/go-syslog/v4 v4.1.0/go.mod h1:eJ8rUfDN5OS6dOkCOBYlg2a+hbAg6pJa99QXXgMrd98= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leodido/go-syslog/v4 v4.2.0 h1:A7vpbYxsO4e2E8udaurkLlxP5LDpDbmPMsGnuhb7jVk= +github.com/leodido/go-syslog/v4 v4.2.0/go.mod h1:eJ8rUfDN5OS6dOkCOBYlg2a+hbAg6pJa99QXXgMrd98= github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b h1:11UHH39z1RhZ5dc4y4r/4koJo6IYFgTRMe/LlwRTEw0= github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b/go.mod h1:WZxr2/6a/Ar9bMDc2rN/LJrE/hF6bXE4LPyDSIxwAfg= github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2ttpEmkA4aQ3j4u9dStX2t4M8UM6qqNsG8= github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is= -github.com/lestrrat-go/strftime v1.0.6 h1:CFGsDEt1pOpFNU+TJB0nhz9jl+K0hZSLE205AhTIGQQ= -github.com/lestrrat-go/strftime v1.0.6/go.mod h1:f7jQKgV5nnJpYgdEasS+/y7EsTb8ykN2z68n3TtcTaw= +github.com/lestrrat-go/strftime v1.1.0 h1:gMESpZy44/4pXLO/m+sL0yBd1W6LjgjrrD4a68Gapyg= +github.com/lestrrat-go/strftime v1.1.0/go.mod h1:uzeIB52CeUJenCo1syghlugshMysrqUT51HlxphXVeI= github.com/lightstep/go-expohisto v1.0.0 h1:UPtTS1rGdtehbbAF7o/dhkWLTDI73UifG8LbfQI7cA4= github.com/lightstep/go-expohisto v1.0.0/go.mod h1:xDXD0++Mu2FOaItXtdDfksfgxfV0z1TMPa+e/EUd0cs= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lufia/plan9stats v0.0.0-20240226150601-1dcf7310316a h1:3Bm7EwfUQUvhNeKIkUct/gl9eod1TcXuj8stxvi/GoI= github.com/lufia/plan9stats v0.0.0-20240226150601-1dcf7310316a/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k= +github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= +github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= @@ -171,46 +185,44 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mostynb/go-grpc-compression v1.2.2 h1:XaDbnRvt2+1vgr0b/l0qh4mJAfIxE0bKXtz2Znl3GGI= -github.com/mostynb/go-grpc-compression v1.2.2/go.mod h1:GOCr2KBxXcblCuczg3YdLQlcin1/NfyDA348ckuCH6w= +github.com/mostynb/go-grpc-compression v1.2.3 h1:42/BKWMy0KEJGSdWvzqIyOZ95YcR9mLPqKctH7Uo//I= +github.com/mostynb/go-grpc-compression v1.2.3/go.mod h1:AghIxF3P57umzqM9yz795+y1Vjs47Km/Y2FE6ouQ7Lg= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/openzipkin/zipkin-go v0.4.3 h1:9EGwpqkgnwdEIJ+Od7QVSEIH+ocmm5nPat0G7sjsSdg= github.com/openzipkin/zipkin-go v0.4.3/go.mod h1:M9wCJZFWCo2RiY+o1eBCEMe0Dp2S5LDHcMZmk3RmK7c= -github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= -github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= +github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= -github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= -github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/prometheus/common v0.61.0 h1:3gv/GThfX0cV2lpO7gkTUwZru38mxevy90Bj8YFSRQQ= +github.com/prometheus/common v0.61.0/go.mod h1:zr29OCN/2BsJRaFwG8QOBr41D6kkchKbpeNH7pAjb/s= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= -github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= -github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= -github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= -github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= -github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= -github.com/shoenig/test v1.7.1 h1:UJcjSAI3aUKx52kfcfhblgyhZceouhvvs3OYdWgn+PY= -github.com/shoenig/test v1.7.1/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI= +github.com/shirou/gopsutil/v4 v4.24.11 h1:WaU9xqGFKvFfsUv94SXcUPD7rCkU0vr/asVdQOBZNj8= +github.com/shirou/gopsutil/v4 v4.24.11/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8= github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= @@ -219,12 +231,12 @@ github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= -github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= +github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= +github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -235,159 +247,211 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/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 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/tilinna/clock v1.1.0 h1:6IQQQCo6KoBxVudv6gwtY8o4eDfhHo8ojA5dP0MfhSs= -github.com/tilinna/clock v1.1.0/go.mod h1:ZsP7BcY7sEEz7ktc0IVy8Us6boDrK8VradlKRUGfOao= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 h1:SIKIoA4e/5Y9ZOl0DCe3eVMLPOQzJxgZpfdHHeauNTM= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6/go.mod h1:BUbeWZiieNxAuuADTBNb3/aeje6on3DhU3rpWsQSB1E= github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ= github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.elastic.co/apm/module/apmelasticsearch/v2 v2.6.0 h1:ukMcwyMaDXsS1dRK2qRYXT2AsfwaUy74TOOYCqkWJow= -go.elastic.co/apm/module/apmelasticsearch/v2 v2.6.0/go.mod h1:YpfiTTrqX5LB/CKBwX89oDCBAxuLJTFv40gcfxJyehM= -go.elastic.co/apm/module/apmhttp/v2 v2.6.0 h1:s8UeNFQmVBCNd4eoz7KDD9rEFhQC0HeUFXz3z9gpAmQ= -go.elastic.co/apm/module/apmhttp/v2 v2.6.0/go.mod h1:D0GLppLuI0Ddwvtl595GUxRgn6Z8L5KaDFVMv2H3GK0= -go.elastic.co/apm/module/apmzap/v2 v2.6.0 h1:R/iVORzGu3F9uM43iEVHD0nwiRo59O0bIXdayKsgayQ= -go.elastic.co/apm/module/apmzap/v2 v2.6.0/go.mod h1:B3i/8xRkqLgi6zNuV+Bp7Pt4cutaOObvrVSa7wUTAPw= -go.elastic.co/apm/v2 v2.6.0 h1:VieBMLQFtXua2YxpYxaSdYGnmmxhLT46gosI5yErJgY= -go.elastic.co/apm/v2 v2.6.0/go.mod h1:33rOXgtHwbgZcDgi6I/GtCSMZQqgxkHC0IQT3gudKvo= -go.elastic.co/fastjson v1.3.0 h1:hJO3OsYIhiqiT4Fgu0ZxAECnKASbwgiS+LMW5oCopKs= -go.elastic.co/fastjson v1.3.0/go.mod h1:K9vDh7O0ODsVKV2B5e2XYLY277QZaCbB3tS1SnARvko= -go.etcd.io/bbolt v1.3.10 h1:+BqfJTcCzTItrop8mq/lbzL8wSGtj94UO/3U31shqG0= -go.etcd.io/bbolt v1.3.10/go.mod h1:bK3UQLPJZly7IlNmV7uVHJDxfe5aK9Ll93e/74Y9oEQ= +go.elastic.co/apm/module/apmelasticsearch/v2 v2.6.2 h1:x5LIkBAIo2XT8nBqoAjPeJKUJC94le7D9aclBYP9uCw= +go.elastic.co/apm/module/apmelasticsearch/v2 v2.6.2/go.mod h1:LkYiSaKsGns6yRqXKAMbFyz7Nk8ikPCD/5CGkgQOY/A= +go.elastic.co/apm/module/apmhttp/v2 v2.6.2 h1:+aYtP1Lnrsm+XtEs87RWG2PAyU6LHDDnYnJl3Lth0Qk= +go.elastic.co/apm/module/apmhttp/v2 v2.6.2/go.mod h1:vlH+vXHaEijKK4pk605LOK+lbLDKwcByhlq4J24PeXw= +go.elastic.co/apm/module/apmzap/v2 v2.6.2 h1:MPpoAPkz9c3E0oflwzyrXnND/4zv9nXf/wEU0aAVWWc= +go.elastic.co/apm/module/apmzap/v2 v2.6.2/go.mod h1:10Xugf8PdrDjmyQYqSgJ/JUhKFMgpivQkTRVV9dUUeI= +go.elastic.co/apm/v2 v2.6.2 h1:VBplAxgbOgTv+Giw/FS91xJpHYw/q8fz/XKPvqC+7/o= +go.elastic.co/apm/v2 v2.6.2/go.mod h1:33rOXgtHwbgZcDgi6I/GtCSMZQqgxkHC0IQT3gudKvo= +go.elastic.co/fastjson v1.4.0 h1:a4BXUKXZHAzjVOPrqtEx2FDsIRBCMek01vCnrtyutWs= +go.elastic.co/fastjson v1.4.0/go.mod h1:ZD5um63l0/8TIdddZbL2znD83FAr2IckYa3KR7VcdNA= +go.etcd.io/bbolt v1.3.11 h1:yGEzV1wPz2yVCLsD8ZAiGHhHVlczyC9d1rP43/VCRJ0= +go.etcd.io/bbolt v1.3.11/go.mod h1:dksAq7YMXoljX0xu6VF5DMZGbhYYoLUalEiSySYAS4I= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/configgrpc v0.102.0 h1:cQi5HwpkHvrZJUxZjoGXkWpAuK+gEyp/1Zjn0BrkvmQ= -go.opentelemetry.io/collector/config/configgrpc v0.102.0/go.mod h1:ASpBXzDWLiDGlG8iRFovU5R4LhAefoC4ajm+qIdslOw= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/confignet v0.102.0 h1:+wQevJ/iBnPxL+roY7WWnAjMxB8v4M5QrS3+0iEmauw= -go.opentelemetry.io/collector/config/confignet v0.102.0/go.mod h1:pfOrCTfSZEB6H2rKtx41/3RN4dKs+X2EKQbw3MGRh0E= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0 h1:8Ne/oL6M4kMWK0P3FKV9EduQa+1UOGyVAnFHfSo4c1A= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0/go.mod h1:Xj4Ld/RriP/Bj+5oPpaYJsLNs2wWRDN2TvzX3Lbi6+M= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0 h1:o1iKqN+oM+TZqHoGdnKw1Am2BQlIGCYbxCRzU8T3jbM= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0/go.mod h1:JpCemLtL/sXQ2Rk3Bx7OPPA7Qt/9NVH91q0bR655gSo= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0 h1:SfASE6lxXjrmYj/UibcWdOiFWvRG0zt4hJgenloEhlY= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0/go.mod h1:+Ku0Fvdb5f6e9UkfqJXAV5FaUJVxxg6Ykfx7Js8y+V4= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0 h1:GwJQTXs7pYPUv/fVf+0nBgsJdlrTuY/PfwQ/TRA/sIk= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0/go.mod h1:PGE3DcRgqYWWC2cq2hYZoET1d3Q8JZyPNmgvqXPFWEU= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0 h1:zdYZLiHHtDf4Kk9WU7mW9dW6WAXtBF54I5jmTMRJtiw= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0/go.mod h1:yFsgUM0PbUJkPlbpJfOG6da+YiF0Z80tv7YcnL3qwv4= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0 h1:Y4H+GaCQl2URp9mEJMV5CYOhw+erONqNyvtFoKQfIoA= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0/go.mod h1:g1RjfVD0gHAf/mPOIs3zBoKBeuDsN+rc5x0lZtgA8tI= -go.opentelemetry.io/collector/connector v0.102.0 h1:IvAsVfYRxP0ajmKbUovF8qugkcUtHq6RuYNtjcMa63E= -go.opentelemetry.io/collector/connector v0.102.0/go.mod h1:f4M7wZ/9+XtgTE0fivBFH3WlwntaEd0qFFA0giFkdnY= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/exporter/debugexporter v0.102.0 h1:b8z8EHdb3Q4f1A/lr6zP9aVv+7HTsouV0XCR8zb+R4w= -go.opentelemetry.io/collector/exporter/debugexporter v0.102.0/go.mod h1:fuFR9OIDtNe/ZGUp1YwrO2t0jy1/AIi4P93e+OoMCWA= -go.opentelemetry.io/collector/exporter/otlpexporter v0.102.0 h1:Nz2ULE5JfDj/houoV+VYSXTWP3/54/kCXH26WjJUNjI= -go.opentelemetry.io/collector/exporter/otlpexporter v0.102.0/go.mod h1:jaMS+3T8lwFc0jEjbqqOC+ArTwpGzR5De8u/jPncyKM= -go.opentelemetry.io/collector/exporter/otlphttpexporter v0.102.0 h1:ayoDBhSkXPrHO/L9MQKhZA/OCDZaOMEfosm+KMw4LBA= -go.opentelemetry.io/collector/exporter/otlphttpexporter v0.102.0/go.mod h1:9SN1giFZMQD0cWqYaBbUIjTnAI7/pWfEBwLosfHwWuY= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/extension/ballastextension v0.102.0 h1:p4gIucFZlTbV4VJ0zxUi8bkQFHnBCimYCe+nZwuPoHk= -go.opentelemetry.io/collector/extension/ballastextension v0.102.0/go.mod h1:hymqiVdV2Fu40lrXk8jm3uQsIFiUu2Fb8ptSzl5Emzw= -go.opentelemetry.io/collector/extension/zpagesextension v0.102.0 h1:BPq98py8nwzaV7KAsxt4ZZAF9LiSRu7ZjHNGavFNyKo= -go.opentelemetry.io/collector/extension/zpagesextension v0.102.0/go.mod h1:P86HW3x3epDS5F4yP0gAvsZiw4xxP1OupTEx2o6UqjY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/otelcol v0.102.0 h1:HuE+ok4iUjOrmYhQBSWpG5kBTVhcA24ljPL4pBERZ5E= -go.opentelemetry.io/collector/otelcol v0.102.0/go.mod h1:w8pCRu2nM/jAkLlEAS6ccKtJv5ylUQe6Ugl98zzTfyE= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/processor v0.102.0 h1:JsjTlpBRmoSYxcu3cAbKBchOmL6aNUxLa03ZkWIqZr8= -go.opentelemetry.io/collector/processor v0.102.0/go.mod h1:IaCSDcfy75uQTaOM+LgR1bMf/bUw2eFfzn20uvWYfLQ= -go.opentelemetry.io/collector/processor/batchprocessor v0.102.0 h1:lJSIMwip+Po5jOF/4dpx6c/3N45KJTr/UZoT086T4mI= -go.opentelemetry.io/collector/processor/batchprocessor v0.102.0/go.mod h1:e71Y6SnrCjD19dPjxWWi/kXa5tb0J8rC+9xl/72mLo4= -go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.102.0 h1:osoITPX0RITC8gJkyaNC6rqSKFl9wCeOqagjdNZUL70= -go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.102.0/go.mod h1:2OVM2IJOWVdxkOOt0WCyQSMv2T19OSKNIy1KCqHGXyY= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0 h1:eLc+AK0IQDDysrMt3SLwKaOFIjEwdO8ipwSck3+TUXE= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0/go.mod h1:p9yeFJktNrpwV9ATvaWeZwCMvVkVWnrfbJ4RHI/RS/I= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/collector/service v0.102.0 h1:B5nfyQZF7eB/y+yucl9G/7VsusbXixYXWingXn7VszM= -go.opentelemetry.io/collector/service v0.102.0/go.mod h1:c+0n0DfQeCjgrdplNHYwYbG/5aupTZVYU/50nMQraoc= -go.opentelemetry.io/contrib/config v0.7.0 h1:b1rK5tGTuhhPirJiMxOcyQfZs76j2VapY6ODn3b2Dbs= -go.opentelemetry.io/contrib/config v0.7.0/go.mod h1:8tdiFd8N5etOi3XzBmAoMxplEzI3TcL8dU5rM5/xcOQ= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 h1:vS1Ao/R55RNV4O7TA2Qopok8yN+X0LIP6RVWLFkprck= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0/go.mod h1:BMsdeOxN04K0L5FNUBfjFdvwWGNe/rkmSwH4Aelu/X0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/contrib/propagators/b3 v1.27.0 h1:IjgxbomVrV9za6bRi8fWCNXENs0co37SZedQilP2hm0= -go.opentelemetry.io/contrib/propagators/b3 v1.27.0/go.mod h1:Dv9obQz25lCisDvvs4dy28UPh974CxkahRDUPsY7y9E= -go.opentelemetry.io/contrib/zpages v0.52.0 h1:MPgkMy0Cp3O5EdfVXP0ss3ujhEibysTM4eszx7E7d+E= -go.opentelemetry.io/contrib/zpages v0.52.0/go.mod h1:fqG5AFdoYru3A3DnhibVuaaEfQV2WKxE7fYE1jgDRwk= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/bridge/opencensus v1.27.0 h1:ao9aGGHd+G4YfjBpGs6vbkvt5hoC67STlJA9fCnOAcs= -go.opentelemetry.io/otel/bridge/opencensus v1.27.0/go.mod h1:uRvWtAAXzyVOST0WMPX5JHGBaAvBws+2F8PcC5gMnTk= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 h1:bFgvUr3/O4PHj3VQcFEuYKvRZJX1SJDQ+11JXuSB3/w= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0/go.mod h1:xJntEd2KL6Qdg5lwp97HMLQDVeAhrYxmzFseAMDPQ8I= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 h1:CIHWikMsN3wO+wq1Tp5VGdVRTcON+DmOJSfDjXypKOc= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0/go.mod h1:TNupZ6cxqyFEpLXAZW7On+mLFL0/g0TE3unIYL91xWc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0 h1:/jlt1Y8gXWiHG9FBx6cJaIC5hYx5Fe64nC8w5Cylt/0= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0/go.mod h1:bmToOGOBZ4hA9ghphIc1PAf66VA8KOtsuy3+ScStG20= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 h1:/0YaXu3755A/cFbtXp+21lkXgI0QE5avTWA2HjU9/WE= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0/go.mod h1:m7SFxp0/7IxmJPLIY3JhOcU9CoFzDaCPL6xxQIxhA+o= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= -go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= -go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= +go.opentelemetry.io/collector v0.116.0 h1:Dscd6Nsnc7hjFQosO0SofcPQsXRfcj5N5PjQAslnmj4= +go.opentelemetry.io/collector v0.116.0/go.mod h1:Ug2hpW0SINPmJAGVEALRlux78NTZc3YXSuh5/Q/hFrA= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/configgrpc v0.116.0 h1:O8Y1X9wDH5dDdqDJ9kqoaMrxEauaDSJBg9aNC6QgB7g= +go.opentelemetry.io/collector/config/configgrpc v0.116.0/go.mod h1:RPrSQrr6xhIaAK2DdcECi142NjSo0npQfVQB3nommSo= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/confignet v1.22.0 h1:SBEMHJZWD8J4qgFw1O+BEkXW9AWldDi6Fz5YeDeoU58= +go.opentelemetry.io/collector/config/confignet v1.22.0/go.mod h1:ZppUH1hgUJOubawEsxsQ9MzEYFytqo2GnVSS7d4CVxc= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0 h1:upFhnU8EyPp0WMR53mJIdx+UR2EGFOr+ppYKzUCY/Vg= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0/go.mod h1:FhjMWU5nf3IctX27lVZomM5SKMyRywShRsA4/rHoBe8= +go.opentelemetry.io/collector/connector v0.116.0 h1:0Pz8RAXH1swLeA1fiyGGQWdv0Kemz4mbq+jnmd1TACE= +go.opentelemetry.io/collector/connector v0.116.0/go.mod h1:VQiZ2yW9KhZuF0yjDbvlgrAxm7+o8KQoxHxurQWLjKU= +go.opentelemetry.io/collector/connector/connectortest v0.116.0 h1:MdttvjqdZmp0ewW5IPCEtzzYmCqxrQxsjJ5m6gMVjzA= +go.opentelemetry.io/collector/connector/connectortest v0.116.0/go.mod h1:ko7aPyvAVf6SvRhWGZdPXSyk+7zPmsSCcMq0gYPMMIQ= +go.opentelemetry.io/collector/connector/xconnector v0.116.0 h1:fFJzrRco0g7HMkhnQ+ehlvicFf58vzsCLXnfuHyQM8w= +go.opentelemetry.io/collector/connector/xconnector v0.116.0/go.mod h1:m9oCk32zX6wDciYBpy+qMQkWKtOxb0gAkEUm8+trflY= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.116.0 h1:sSPDz4Qu7H86SrxtE6sQHDuWjFkTWHdKyGdsxhjZzcw= +go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.116.0/go.mod h1:0K7jbkCWtydn1IA3JwAUJeLVL79tJTxWoXR2gYTnCk0= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/debugexporter v0.116.0 h1:NCVGIkaA0eSDZPg0/NdWt7ivUmVukPVEixBDTulMa08= +go.opentelemetry.io/collector/exporter/debugexporter v0.116.0/go.mod h1:QZL/MKrgErI7O64ams2lmsQduLOkw/SLmtvS7W+iQNo= +go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.116.0 h1:BzMvZf9RKRcQPFjGnQSEWvfI5Er9kXfzyZ/4GHkUTa4= +go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.116.0/go.mod h1:RCbA3MNnZPTy2mViwQxMlnrq5moJ1XgetNQx2XHIpaI= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/otlpexporter v0.116.0 h1:2yA8fUW0R0hml2OFxfCmSdtdqpfCLqBGazJ8eALajgU= +go.opentelemetry.io/collector/exporter/otlpexporter v0.116.0/go.mod h1:hbK5ggV3hjsjdifV7oUQKhbjg0ijgIeK9BHixTAzuYo= +go.opentelemetry.io/collector/exporter/otlphttpexporter v0.116.0 h1:NKd1T+TfCss0Qo0RlkN2C30AO2/6ceHS0q+97hpQhI8= +go.opentelemetry.io/collector/exporter/otlphttpexporter v0.116.0/go.mod h1:ev8EFap0FyqEUe02sct8Aon4ctlCANcsHrIxROH1jTU= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0 h1:bXDgoiDiwFfrO5S6q1Wpe0su303CW4Qxthoy4CxG6eg= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0/go.mod h1:uFZlAPxk2+s6zk1W+u22DgxxSDugWy0QaY5kQzjNy7Q= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/extension/zpagesextension v0.116.0 h1:D0VY/ESPwkREfMaqJleGVTiCYoCs3MDipU93ywaIn68= +go.opentelemetry.io/collector/extension/zpagesextension v0.116.0/go.mod h1:MqkQSYKarMrjVSyGrAes1FBcsW6HDDPj/ouvcDvSjfk= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 h1:KKFb3u8iLk4V5GYz7eVpw8QgEdob5koX6GNEbaoDQJY= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0/go.mod h1:YyWHUWeSnRmy2CF7kPHpwJ6qkVjufbLZ8PYuY0Ph0o8= +go.opentelemetry.io/collector/internal/memorylimiter v0.116.0 h1:xLt/2jPHvaWQiNle66DsTz3kRbWoQ93AEMfSeKyCdN0= +go.opentelemetry.io/collector/internal/memorylimiter v0.116.0/go.mod h1:12KU4unWjF3nxrpOuuTi4TGK3KaD+kzmgA2Vd86MhWU= +go.opentelemetry.io/collector/internal/sharedcomponent v0.116.0 h1:5QhpnwgogQhBrcsOjk1Yhkugopj043XlSDB1lpHKCGo= +go.opentelemetry.io/collector/internal/sharedcomponent v0.116.0/go.mod h1:wMQM1Sqbj6J6jNVBb5hawkCfmqrLJ0hAeDKkalUfrEY= +go.opentelemetry.io/collector/otelcol v0.116.0 h1:8NoPEY2uAemwNzUcMxiZuuI8w/Ff+0p1DXXk6NVEGlk= +go.opentelemetry.io/collector/otelcol v0.116.0/go.mod h1:c/EhsBdHmC44SxhWMi7pTlYB+I6GBSJNBsj9NCwXMxM= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 h1:PFNy+Il/kqPdPL9rhG+1kG63Aauya+FhBKGXoB6ivxU= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0/go.mod h1:bVn9V4TGyeXi58/JDkeXCuKtc+V+qcOoTl8hNpV0qa8= +go.opentelemetry.io/collector/processor v0.116.0 h1:Kyu4tPzTdWNHtZjcxvI/bGNAgyv8L8Kem2r/Mk4IDAw= +go.opentelemetry.io/collector/processor v0.116.0/go.mod h1:+/Ugy48RAxlZEXmN2cw51W8t5wdHS9No+GAoP+moskk= +go.opentelemetry.io/collector/processor/batchprocessor v0.116.0 h1:jZMC+jlay3xCBBjcL85oT8nMFB5B3zvvwS6lW6xVGAc= +go.opentelemetry.io/collector/processor/batchprocessor v0.116.0/go.mod h1:KmLVhDjnatsZm5xQkgRLl12lwvHohmk3djJXfu8m33c= +go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.116.0 h1:7YwVMfpr0igtILydBFDXJsEGskI/4FIKPqc0hGIjJIE= +go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.116.0/go.mod h1:nMEGCezCKUedDmxTLNL9cpFUhG2ku8ThNn7t/wfKWI0= +go.opentelemetry.io/collector/processor/processortest v0.116.0 h1:+IqNEVEE0E2MsO2g7+Y/9dz35sDuvAXRXrLts9NdXrA= +go.opentelemetry.io/collector/processor/processortest v0.116.0/go.mod h1:DLaQDBxzgeeaUO0ULMn/efos9PmHZkmYCHuxwCsiVHI= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0 h1:iin/UwuWvSLB7ZNfINFUYbZ5lxIi1NjZ2brkyyFdiRA= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0/go.mod h1:cnA43/XpKDbaOmd8buqKp/LGJ2l/OoCqbR//u5DMfn8= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.116.0 h1:81u+wJsQp9VfrAdVpVvcV31YAs8qsZp/UnMmG9YCJ0A= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.116.0/go.mod h1:JXIwjUyh3Q+gNvr7YE937se4/E4UJ/oz5z9xbJeVl3M= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/collector/service v0.116.0 h1:1rFmax3ILOlQq4bW//0VKRcG/HmN2rxrgfTybn6bisU= +go.opentelemetry.io/collector/service v0.116.0/go.mod h1:CzQzj72mWr5arag+q8uUWGRuUkenNo5Gw9oA97SFZ78= +go.opentelemetry.io/contrib/bridges/otelzap v0.6.0 h1:j8icMXyyqNf6HGuwlYhniPnVsbJIq7n+WirDu3VAJdQ= +go.opentelemetry.io/contrib/bridges/otelzap v0.6.0/go.mod h1:evIOZpl+kAlU5IsaYX2Siw+IbpacAZvXemVsgt70uvw= +go.opentelemetry.io/contrib/config v0.10.0 h1:2JknAzMaYjxrHkTnZh3eOme/Y2P5eHE2SWfhfV6Xd6c= +go.opentelemetry.io/contrib/config v0.10.0/go.mod h1:aND2M6/KfNkntI5cyvHriR/zvZgPf8j9yETdSmvpfmc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 h1:yMkBS9yViCc7U7yeLzJPM2XizlfdVvBRSmsQDWu6qc0= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0/go.mod h1:n8MR6/liuGB5EmTETUBeU5ZgqMOlqKRxUaqPQBOANZ8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/contrib/propagators/b3 v1.31.0 h1:PQPXYscmwbCp76QDvO4hMngF2j8Bx/OTV86laEl8uqo= +go.opentelemetry.io/contrib/propagators/b3 v1.31.0/go.mod h1:jbqfV8wDdqSDrAYxVpXQnpM0XFMq2FtDesblJ7blOwQ= +go.opentelemetry.io/contrib/zpages v0.56.0 h1:W7vP6s3juzL5KiHpr41zLNmsJ0QAZudYu8ay0zGAoko= +go.opentelemetry.io/contrib/zpages v0.56.0/go.mod h1:IxPRP4TYHw9jLeaEOSDIiA9zmyJNZNO6sbW55iMvSXs= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 h1:mMOmtYie9Fx6TSVzw4W+NTpvoaS1JWWga37oI1a/4qQ= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0/go.mod h1:yy7nDsMMBUkD+jeekJ36ur5f3jJIrmCwUrY67VFhNpA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 h1:j7ZSD+5yn+lo3sGV69nW04rRR0jhYnBwjuX3r0HvnK0= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0/go.mod h1:WXbYJTUaZXAbYd8lbgGuvih0yuCfOFC5RJoYnoLcGz8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 h1:t/Qur3vKSkUCcDVaSumWF2PKHt85pc7fRvFuoVT8qFU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0/go.mod h1:Rl61tySSdcOJWoEgYZVtmnKdA0GeKrSqkHC1t+91CH8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 h1:K0XaT3DwHAcV4nKLzcQvwAgSyisUghWoY20I7huthMk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0/go.mod h1:B5Ki776z/MBnVha1Nzwp5arlzBbE3+1jk+pGmaP5HME= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy03iVTXP6ffeN2iXrxfGsZGCjVx0/4KlizjyBwU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0/go.mod h1:TMu73/k1CP8nBUpDLc71Wj/Kf7ZS9FK5b53VapRsP9o= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 h1:lUsI2TYsQw2r1IASwoROaCnjdj2cvC2+Jbxvk6nHnWU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0/go.mod h1:2HpZxxQurfGxJlJDblybejHB6RX6pmExPNe517hREw4= +go.opentelemetry.io/otel/exporters/prometheus v0.54.0 h1:rFwzp68QMgtzu9PgP3jm9XaMICI6TsofWWPcBDKwlsU= +go.opentelemetry.io/otel/exporters/prometheus v0.54.0/go.mod h1:QyjcV9qDP6VeK5qPyKETvNjmaaEc7+gqjh4SS0ZYzDU= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 h1:TwmL3O3fRR80m8EshBrd8YydEZMcUCsZXzOUlnFohwM= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0/go.mod h1:tH98dDv5KPmPThswbXA0fr0Lwfs+OhK8HgaCo7PjRrk= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 h1:SZmDnHcgp3zwlPBS2JX2urGYe/jBKEIT6ZedHRUyCz8= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0/go.mod h1:fdWW0HtZJ7+jNpTKUR0GpMEDP69nR8YBJQxNiVCE3jk= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 h1:UGZ1QwZWY67Z6BmckTU+9Rxn04m2bD3gD6Mk0OIOCPk= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0/go.mod h1:fcwWuDuaObkkChiDlhEpSq9+X1C0omv+s5mBtToAQ64= +go.opentelemetry.io/otel/log v0.8.0 h1:egZ8vV5atrUWUbnSsHn6vB8R21G2wrKqNiDt3iWertk= +go.opentelemetry.io/otel/log v0.8.0/go.mod h1:M9qvDdUTRCopJcGRKg57+JSQ9LgLBrwwfC32epk5NX8= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/log v0.7.0 h1:dXkeI2S0MLc5g0/AwxTZv6EUEjctiH8aG14Am56NTmQ= +go.opentelemetry.io/otel/sdk/log v0.7.0/go.mod h1:oIRXpW+WD6M8BuGj5rtS0aRu/86cbDV/dAfNaZBIjYM= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -397,6 +461,7 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= @@ -405,6 +470,7 @@ golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvx golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -415,33 +481,44 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -450,28 +527,29 @@ golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= -gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= +gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= +gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 h1:P8OJ/WCl/Xo4E4zoe4/bifHpSmmKwARqyqE4nW6J2GQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -481,14 +559,15 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/exporter/elasticsearchexporter/integrationtest/validator.go b/exporter/elasticsearchexporter/integrationtest/validator.go index cb9b411aecd9..0d8b48cac7a3 100644 --- a/exporter/elasticsearchexporter/integrationtest/validator.go +++ b/exporter/elasticsearchexporter/integrationtest/validator.go @@ -18,9 +18,9 @@ type countValidator struct { } // newCountValidator creates a new instance of the CountValidator. -func newCountValidator(t testing.TB, provider testbed.DataProvider) *countValidator { +func newCountValidator(tb testing.TB, provider testbed.DataProvider) *countValidator { return &countValidator{ - t: t, + t: tb, dataProvider: provider, } } diff --git a/exporter/elasticsearchexporter/internal/exphistogram/exphistogram.go b/exporter/elasticsearchexporter/internal/exphistogram/exphistogram.go new file mode 100644 index 000000000000..6f5299946ffd --- /dev/null +++ b/exporter/elasticsearchexporter/internal/exphistogram/exphistogram.go @@ -0,0 +1,74 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package exphistogram contains utility functions for exponential histogram conversions. +package exphistogram // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter/internal/exphistogram" + +import ( + "math" + + "go.opentelemetry.io/collector/pdata/pmetric" +) + +// LowerBoundary calculates the lower boundary given index and scale. +// Adopted from https://opentelemetry.io/docs/specs/otel/metrics/data-model/#producer-expectations +func LowerBoundary(index, scale int) float64 { + if scale <= 0 { + return LowerBoundaryNegativeScale(index, scale) + } + // Use this form in case the equation above computes +Inf + // as the lower boundary of a valid bucket. + inverseFactor := math.Ldexp(math.Ln2, -scale) + return 2.0 * math.Exp(float64(index-(1<= 0; i-- { + count := bucketCounts.At(i) + if count == 0 { + continue + } + lb := -LowerBoundary(offset+i+1, scale) + ub := -LowerBoundary(offset+i, scale) + counts = append(counts, safeUint64ToInt64(count)) + values = append(values, lb+(ub-lb)/2) + } + + if zeroCount := dp.ZeroCount(); zeroCount != 0 { + counts = append(counts, safeUint64ToInt64(zeroCount)) + values = append(values, 0) + } + + offset = int(dp.Positive().Offset()) + bucketCounts = dp.Positive().BucketCounts() + for i := 0; i < bucketCounts.Len(); i++ { + count := bucketCounts.At(i) + if count == 0 { + continue + } + lb := LowerBoundary(offset+i, scale) + ub := LowerBoundary(offset+i+1, scale) + counts = append(counts, safeUint64ToInt64(count)) + values = append(values, lb+(ub-lb)/2) + } + return +} + +func safeUint64ToInt64(v uint64) int64 { + if v > math.MaxInt64 { + return math.MaxInt64 + } else { + return int64(v) // nolint:goset // overflow checked + } +} diff --git a/exporter/elasticsearchexporter/internal/exphistogram/exphistogram_test.go b/exporter/elasticsearchexporter/internal/exphistogram/exphistogram_test.go new file mode 100644 index 000000000000..654b765eab1a --- /dev/null +++ b/exporter/elasticsearchexporter/internal/exphistogram/exphistogram_test.go @@ -0,0 +1,135 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package exphistogram + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "go.opentelemetry.io/collector/pdata/pmetric" +) + +func TestToTDigest(t *testing.T) { + for _, tc := range []struct { + name string + scale int32 + zeroCount uint64 + positiveOffset int32 + positiveBuckets []uint64 + negativeOffset int32 + negativeBuckets []uint64 + + expectedCounts []int64 + expectedValues []float64 + }{ + { + name: "empty", + scale: 0, + expectedCounts: nil, + expectedValues: nil, + }, + { + name: "empty, scale=1", + scale: 1, + expectedCounts: nil, + expectedValues: nil, + }, + { + name: "empty, scale=-1", + scale: -1, + expectedCounts: nil, + expectedValues: nil, + }, + { + name: "zeros", + scale: 0, + zeroCount: 1, + expectedCounts: []int64{1}, + expectedValues: []float64{0}, + }, + { + name: "scale=0", + scale: 0, + zeroCount: 1, + positiveBuckets: []uint64{1, 1}, + negativeBuckets: []uint64{1, 1}, + expectedCounts: []int64{1, 1, 1, 1, 1}, + expectedValues: []float64{-3, -1.5, 0, 1.5, 3}, + }, + { + name: "scale=0, no zeros", + scale: 0, + zeroCount: 0, + positiveBuckets: []uint64{1, 1}, + negativeBuckets: []uint64{1, 1}, + expectedCounts: []int64{1, 1, 1, 1}, + expectedValues: []float64{-3, -1.5, 1.5, 3}, + }, + { + name: "scale=0, offset=1", + scale: 0, + zeroCount: 1, + positiveOffset: 1, + positiveBuckets: []uint64{1, 1}, + negativeOffset: 1, + negativeBuckets: []uint64{1, 1}, + expectedCounts: []int64{1, 1, 1, 1, 1}, + expectedValues: []float64{-6, -3, 0, 3, 6}, + }, + { + name: "scale=0, offset=-1", + scale: 0, + zeroCount: 1, + positiveOffset: -1, + positiveBuckets: []uint64{1, 1}, + negativeOffset: -1, + negativeBuckets: []uint64{1, 1}, + expectedCounts: []int64{1, 1, 1, 1, 1}, + expectedValues: []float64{-1.5, -0.75, 0, 0.75, 1.5}, + }, + { + name: "scale=0, different offsets", + scale: 0, + zeroCount: 1, + positiveOffset: -1, + positiveBuckets: []uint64{1, 1}, + negativeOffset: 1, + negativeBuckets: []uint64{1, 1}, + expectedCounts: []int64{1, 1, 1, 1, 1}, + expectedValues: []float64{-6, -3, 0, 0.75, 1.5}, + }, + { + name: "scale=-1", + scale: -1, + zeroCount: 1, + positiveBuckets: []uint64{1, 1}, + negativeBuckets: []uint64{1, 1}, + expectedCounts: []int64{1, 1, 1, 1, 1}, + expectedValues: []float64{-10, -2.5, 0, 2.5, 10}, + }, + { + name: "scale=1", + scale: 1, + zeroCount: 1, + positiveBuckets: []uint64{1, 1}, + negativeBuckets: []uint64{1, 1}, + expectedCounts: []int64{1, 1, 1, 1, 1}, + expectedValues: []float64{-1.7071067811865475, -1.2071067811865475, 0, 1.2071067811865475, 1.7071067811865475}, + }, + } { + t.Run(tc.name, func(t *testing.T) { + dp := pmetric.NewExponentialHistogramDataPoint() + dp.SetScale(tc.scale) + dp.SetZeroCount(tc.zeroCount) + dp.Positive().SetOffset(tc.positiveOffset) + dp.Positive().BucketCounts().FromRaw(tc.positiveBuckets) + dp.Negative().SetOffset(tc.negativeOffset) + dp.Negative().BucketCounts().FromRaw(tc.negativeBuckets) + + counts, values := ToTDigest(dp) + assert.Equal(t, tc.expectedCounts, counts) + assert.Equal(t, tc.expectedValues, values) + }) + } +} diff --git a/exporter/elasticsearchexporter/internal/metadata/generated_status.go b/exporter/elasticsearchexporter/internal/metadata/generated_status.go index 459f80d7a82d..777092615160 100644 --- a/exporter/elasticsearchexporter/internal/metadata/generated_status.go +++ b/exporter/elasticsearchexporter/internal/metadata/generated_status.go @@ -7,10 +7,12 @@ import ( ) var ( - Type = component.MustNewType("elasticsearch") + Type = component.MustNewType("elasticsearch") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter" ) const ( - TracesStability = component.StabilityLevelBeta - LogsStability = component.StabilityLevelBeta + MetricsStability = component.StabilityLevelDevelopment + TracesStability = component.StabilityLevelBeta + LogsStability = component.StabilityLevelBeta ) diff --git a/exporter/elasticsearchexporter/internal/metadata/generated_telemetry.go b/exporter/elasticsearchexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index 6e8fca3a01a9..000000000000 --- a/exporter/elasticsearchexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/elasticsearch") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/elasticsearch") -} diff --git a/exporter/elasticsearchexporter/internal/metadata/generated_telemetry_test.go b/exporter/elasticsearchexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 4ba4a996db59..000000000000 --- a/exporter/elasticsearchexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/elasticsearch", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/elasticsearch", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/elasticsearchexporter/internal/objmodel/objmodel.go b/exporter/elasticsearchexporter/internal/objmodel/objmodel.go index a26260144fa1..0f514e06aaaa 100644 --- a/exporter/elasticsearchexporter/internal/objmodel/objmodel.go +++ b/exporter/elasticsearchexporter/internal/objmodel/objmodel.go @@ -34,6 +34,7 @@ package objmodel // import "github.com/open-telemetry/opentelemetry-collector-co import ( "encoding/hex" "io" + "maps" "math" "sort" "strings" @@ -48,7 +49,8 @@ import ( // Document is an intermediate representation for converting open telemetry records with arbitrary attributes // into a JSON document that can be processed by Elasticsearch. type Document struct { - fields []field + fields []field + dynamicTemplates map[string]string } type field struct { @@ -58,13 +60,14 @@ type field struct { // Value type that can be added to a Document. type Value struct { - kind Kind - primitive uint64 - dbl float64 - str string - arr []Value - doc Document - ts time.Time + kind Kind + ui uint64 + i int64 + dbl float64 + str string + arr []Value + doc Document + ts time.Time } // Kind represent the internal kind of a value stored in a Document. @@ -75,18 +78,22 @@ const ( KindNil Kind = iota KindBool KindInt + KindUInt KindDouble KindString KindArr KindObject KindTimestamp KindIgnore + KindUnflattenableObject // Unflattenable object is an object that should not be flattened at serialization time ) const tsLayout = "2006-01-02T15:04:05.000000000Z" -var nilValue = Value{kind: KindNil} -var ignoreValue = Value{kind: KindIgnore} +var ( + nilValue = Value{kind: KindNil} + ignoreValue = Value{kind: KindIgnore} +) // DocumentFromAttributes creates a document from a OpenTelemetry attribute // map. All nested maps will be flattened, with keys being joined using a `.` symbol. @@ -105,7 +112,24 @@ func DocumentFromAttributesWithPath(path string, am pcommon.Map) Document { fields := make([]field, 0, am.Len()) fields = appendAttributeFields(fields, path, am) - return Document{fields} + return Document{fields: fields} +} + +func (doc *Document) Clone() *Document { + fields := make([]field, len(doc.fields)) + copy(fields, doc.fields) + return &Document{fields: fields, dynamicTemplates: maps.Clone(doc.dynamicTemplates)} +} + +func (doc *Document) AddDynamicTemplate(path, template string) { + if doc.dynamicTemplates == nil { + doc.dynamicTemplates = make(map[string]string) + } + doc.dynamicTemplates[path] = template +} + +func (doc *Document) DynamicTemplates() map[string]string { + return doc.dynamicTemplates } // AddTimestamp adds a raw timestamp value to the Document. @@ -146,6 +170,11 @@ func (doc *Document) AddInt(key string, value int64) { doc.Add(key, IntValue(value)) } +// AddUInt adds an unsigned integer value to the document. +func (doc *Document) AddUInt(key string, value uint64) { + doc.Add(key, UIntValue(value)) +} + // AddAttributes expands and flattens all key-value pairs from the input attribute map into // the document. func (doc *Document) AddAttributes(key string, attributes pcommon.Map) { @@ -174,15 +203,14 @@ func (doc *Document) AddEvents(key string, events ptrace.SpanEventSlice) { } } -// Sort sorts all fields in the document by key name. -func (doc *Document) Sort() { +func (doc *Document) sort() { sort.SliceStable(doc.fields, func(i, j int) bool { return doc.fields[i].key < doc.fields[j].key }) for i := range doc.fields { fld := &doc.fields[i] - fld.value.Sort() + fld.value.sort() } } @@ -190,12 +218,12 @@ func (doc *Document) Sort() { // The filtering only keeps the last value for a key. // // Dedup ensure that keys are sorted. -func (doc *Document) Dedup() { +func (doc *Document) Dedup(appendValueOnConflict bool) { // 1. Always ensure the fields are sorted, Dedup support requires // Fields to be sorted. - doc.Sort() + doc.sort() - // 2. rename fields if a primitive value is overwritten by an object. + // 2. rename fields if a primitive value is overwritten by an object if appendValueOnConflict. // For example the pair (path.x=1, path.x.a="test") becomes: // (path.x.value=1, path.x.a="test"). // @@ -208,16 +236,18 @@ func (doc *Document) Dedup() { // field in favor of the `value` field in the document. // // This step removes potential conflicts when dedotting and serializing fields. - var renamed bool - for i := 0; i < len(doc.fields)-1; i++ { - key, nextKey := doc.fields[i].key, doc.fields[i+1].key - if len(key) < len(nextKey) && strings.HasPrefix(nextKey, key) && nextKey[len(key)] == '.' { - renamed = true - doc.fields[i].key = key + ".value" + if appendValueOnConflict { + var renamed bool + for i := 0; i < len(doc.fields)-1; i++ { + key, nextKey := doc.fields[i].key, doc.fields[i+1].key + if len(key) < len(nextKey) && strings.HasPrefix(nextKey, key) && nextKey[len(key)] == '.' { + renamed = true + doc.fields[i].key = key + ".value" + } + } + if renamed { + doc.sort() } - } - if renamed { - doc.Sort() } // 3. mark duplicates as 'ignore' @@ -232,26 +262,34 @@ func (doc *Document) Dedup() { // 4. fix objects that might be stored in arrays for i := range doc.fields { - doc.fields[i].value.Dedup() + doc.fields[i].value.Dedup(appendValueOnConflict) } } +func newJSONVisitor(w io.Writer) *json.Visitor { + v := json.NewVisitor(w) + // Enable ExplicitRadixPoint such that 1.0 is encoded as 1.0 instead of 1. + // This is required to generate the correct dynamic mapping in ES. + v.SetExplicitRadixPoint(true) + return v +} + // Serialize writes the document to the given writer. The serializer will create nested objects if dedot is true. // // NOTE: The documented MUST be sorted if dedot is true. -func (doc *Document) Serialize(w io.Writer, dedot bool) error { - v := json.NewVisitor(w) - return doc.iterJSON(v, dedot) +func (doc *Document) Serialize(w io.Writer, dedot bool, otel bool) error { + v := newJSONVisitor(w) + return doc.iterJSON(v, dedot, otel) } -func (doc *Document) iterJSON(v *json.Visitor, dedot bool) error { +func (doc *Document) iterJSON(v *json.Visitor, dedot bool, otel bool) error { if dedot { - return doc.iterJSONDedot(v) + return doc.iterJSONDedot(v, otel) } - return doc.iterJSONFlat(v) + return doc.iterJSONFlat(v, otel) } -func (doc *Document) iterJSONFlat(w *json.Visitor) error { +func (doc *Document) iterJSONFlat(w *json.Visitor, otel bool) error { err := w.OnObjectStart(-1, structform.AnyType) if err != nil { return err @@ -270,7 +308,7 @@ func (doc *Document) iterJSONFlat(w *json.Visitor) error { return err } - if err := fld.value.iterJSON(w, true); err != nil { + if err := fld.value.iterJSON(w, true, otel); err != nil { return err } } @@ -278,7 +316,20 @@ func (doc *Document) iterJSONFlat(w *json.Visitor) error { return nil } -func (doc *Document) iterJSONDedot(w *json.Visitor) error { +// Under OTel mode, set of key prefixes where keys should be flattened from that level, +// such that a document (root or not) with fields {"attributes.a.b": 1} will be serialized as {"attributes": {"a.b": 1}} +// It is not aware of whether it is a root document or sub-document. +// NOTE: This works very delicately with the implementation of OTel mode that +// e.g. resource.attributes is a "resource" objmodel.Document under the root document that contains attributes +// added using AddAttributes func as flattened keys. +// Therefore, there will be correctness issues when attributes are added / used in other ways, but it is working +// for current use cases and the proper fix will be slightly too complex. YAGNI. +var otelPrefixSet = map[string]struct{}{ + "attributes.": {}, + "metrics.": {}, +} + +func (doc *Document) iterJSONDedot(w *json.Visitor, otel bool) error { objPrefix := "" level := 0 @@ -330,6 +381,15 @@ func (doc *Document) iterJSONDedot(w *json.Visitor) error { // increase object level up to current field for { + // Otel mode serialization + if otel { + // Check the prefix + _, isOtelPrefix := otelPrefixSet[objPrefix] + if isOtelPrefix { + break + } + } + start := len(objPrefix) idx := strings.IndexByte(key[start:], '.') if idx < 0 { @@ -352,7 +412,7 @@ func (doc *Document) iterJSONDedot(w *json.Visitor) error { if err := w.OnKey(fieldName); err != nil { return err } - if err := fld.value.iterJSON(w, true); err != nil { + if err := fld.value.iterJSON(w, true, otel); err != nil { return err } } @@ -371,7 +431,10 @@ func (doc *Document) iterJSONDedot(w *json.Visitor) error { func StringValue(str string) Value { return Value{kind: KindString, str: str} } // IntValue creates a new value from an integer. -func IntValue(i int64) Value { return Value{kind: KindInt, primitive: uint64(i)} } +func IntValue(i int64) Value { return Value{kind: KindInt, i: i} } + +// UIntValue creates a new value from an unsigned integer. +func UIntValue(i uint64) Value { return Value{kind: KindUInt, ui: i} } // DoubleValue creates a new value from a double value.. func DoubleValue(d float64) Value { return Value{kind: KindDouble, dbl: d} } @@ -382,7 +445,7 @@ func BoolValue(b bool) Value { if b { v = 1 } - return Value{kind: KindBool, primitive: v} + return Value{kind: KindBool, ui: v} } // ArrValue combines multiple values into an array value. @@ -395,6 +458,12 @@ func TimestampValue(ts time.Time) Value { return Value{kind: KindTimestamp, ts: ts} } +// UnflattenableObjectValue creates a unflattenable object from a map +func UnflattenableObjectValue(m pcommon.Map) Value { + sub := DocumentFromAttributes(m) + return Value{kind: KindUnflattenableObject, doc: sub} +} + // ValueFromAttribute converts a AttributeValue into a value. func ValueFromAttribute(attr pcommon.Value) Value { switch attr.Type() { @@ -417,14 +486,13 @@ func ValueFromAttribute(attr pcommon.Value) Value { } } -// Sort recursively sorts all keys in docuemts held by the value. -func (v *Value) Sort() { +func (v *Value) sort() { switch v.kind { case KindObject: - v.doc.Sort() + v.doc.sort() case KindArr: for i := range v.arr { - v.arr[i].Sort() + v.arr[i].sort() } } } @@ -432,13 +500,13 @@ func (v *Value) Sort() { // Dedup recursively dedups keys in stored documents. // // NOTE: The value MUST be sorted. -func (v *Value) Dedup() { +func (v *Value) Dedup(appendValueOnConflict bool) { switch v.kind { case KindObject: - v.doc.Dedup() + v.doc.Dedup(appendValueOnConflict) case KindArr: for i := range v.arr { - v.arr[i].Dedup() + v.arr[i].Dedup(appendValueOnConflict) } } } @@ -456,14 +524,16 @@ func (v *Value) IsEmpty() bool { } } -func (v *Value) iterJSON(w *json.Visitor, dedot bool) error { +func (v *Value) iterJSON(w *json.Visitor, dedot bool, otel bool) error { switch v.kind { case KindNil: return w.OnNil() case KindBool: - return w.OnBool(v.primitive == 1) + return w.OnBool(v.ui == 1) case KindInt: - return w.OnInt64(int64(v.primitive)) + return w.OnInt64(v.i) + case KindUInt: + return w.OnUint64(v.ui) case KindDouble: if math.IsNaN(v.dbl) || math.IsInf(v.dbl, 0) { // NaN and Inf are undefined for JSON. Let's serialize to "null" @@ -479,13 +549,18 @@ func (v *Value) iterJSON(w *json.Visitor, dedot bool) error { if len(v.doc.fields) == 0 { return w.OnNil() } - return v.doc.iterJSON(w, dedot) + return v.doc.iterJSON(w, dedot, otel) + case KindUnflattenableObject: + if len(v.doc.fields) == 0 { + return w.OnNil() + } + return v.doc.iterJSON(w, true, otel) case KindArr: if err := w.OnArrayStart(-1, structform.AnyType); err != nil { return err } for i := range v.arr { - if err := v.arr[i].iterJSON(w, dedot); err != nil { + if err := v.arr[i].iterJSON(w, dedot, otel); err != nil { return err } } diff --git a/exporter/elasticsearchexporter/internal/objmodel/objmodel_test.go b/exporter/elasticsearchexporter/internal/objmodel/objmodel_test.go index 320a769f6419..6805a958a019 100644 --- a/exporter/elasticsearchexporter/internal/objmodel/objmodel_test.go +++ b/exporter/elasticsearchexporter/internal/objmodel/objmodel_test.go @@ -9,7 +9,6 @@ import ( "testing" "time" - "github.com/elastic/go-structform/json" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/pdata/pcommon" @@ -34,7 +33,7 @@ func TestObjectModel_CreateMap(t *testing.T) { m.PutStr("str", "test") return DocumentFromAttributes(m) }, - want: Document{[]field{{"i", IntValue(42)}, {"str", StringValue("test")}}}, + want: Document{fields: []field{{"i", IntValue(42)}, {"str", StringValue("test")}}}, }, "ignores nil values": { build: func() Document { @@ -43,7 +42,7 @@ func TestObjectModel_CreateMap(t *testing.T) { m.PutStr("str", "test") return DocumentFromAttributes(m) }, - want: Document{[]field{{"str", StringValue("test")}}}, + want: Document{fields: []field{{"str", StringValue("test")}}}, }, "from map with prefix": { build: func() Document { @@ -52,7 +51,7 @@ func TestObjectModel_CreateMap(t *testing.T) { m.PutStr("str", "test") return DocumentFromAttributesWithPath("prefix", m) }, - want: Document{[]field{{"prefix.i", IntValue(42)}, {"prefix.str", StringValue("test")}}}, + want: Document{fields: []field{{"prefix.i", IntValue(42)}, {"prefix.str", StringValue("test")}}}, }, "add attributes with key": { build: func() (doc Document) { @@ -62,7 +61,7 @@ func TestObjectModel_CreateMap(t *testing.T) { doc.AddAttributes("prefix", m) return doc }, - want: Document{[]field{{"prefix.i", IntValue(42)}, {"prefix.str", StringValue("test")}}}, + want: Document{fields: []field{{"prefix.i", IntValue(42)}, {"prefix.str", StringValue("test")}}}, }, "add attribute flattens a map value": { build: func() (doc Document) { @@ -73,57 +72,23 @@ func TestObjectModel_CreateMap(t *testing.T) { doc.AddAttribute("prefix", mapVal) return doc }, - want: Document{[]field{{"prefix.i", IntValue(42)}, {"prefix.str", StringValue("test")}}}, + want: Document{fields: []field{{"prefix.i", IntValue(42)}, {"prefix.str", StringValue("test")}}}, }, } for name, test := range tests { t.Run(name, func(t *testing.T) { doc := test.build() - doc.Sort() assert.Equal(t, test.want, doc) }) } } -func TestDocument_Sort(t *testing.T) { - tests := map[string]struct { - build func() Document - want Document - }{ - "keys are sorted": { - build: func() (doc Document) { - doc.AddInt("z", 26) - doc.AddInt("a", 1) - return doc - }, - want: Document{[]field{{"a", IntValue(1)}, {"z", IntValue(26)}}}, - }, - "sorting is stable": { - build: func() (doc Document) { - doc.AddInt("a", 1) - doc.AddInt("c", 3) - doc.AddInt("a", 2) - return doc - }, - want: Document{[]field{{"a", IntValue(1)}, {"a", IntValue(2)}, {"c", IntValue(3)}}}, - }, - } - - for name, test := range tests { - t.Run(name, func(t *testing.T) { - doc := test.build() - doc.Sort() - assert.Equal(t, test.want, doc) - }) - } - -} - func TestObjectModel_Dedup(t *testing.T) { tests := map[string]struct { - build func() Document - want Document + build func() Document + appendValueOnConflict bool + want Document }{ "no duplicates": { build: func() (doc Document) { @@ -131,7 +96,8 @@ func TestObjectModel_Dedup(t *testing.T) { doc.AddInt("c", 3) return doc }, - want: Document{[]field{{"a", IntValue(1)}, {"c", IntValue(3)}}}, + appendValueOnConflict: true, + want: Document{fields: []field{{"a", IntValue(1)}, {"c", IntValue(3)}}}, }, "duplicate keys": { build: func() (doc Document) { @@ -140,7 +106,8 @@ func TestObjectModel_Dedup(t *testing.T) { doc.AddInt("a", 2) return doc }, - want: Document{[]field{{"a", ignoreValue}, {"a", IntValue(2)}, {"c", IntValue(3)}}}, + appendValueOnConflict: true, + want: Document{fields: []field{{"a", ignoreValue}, {"a", IntValue(2)}, {"c", IntValue(3)}}}, }, "duplicate after flattening from map: namespace object at end": { build: func() Document { @@ -150,7 +117,8 @@ func TestObjectModel_Dedup(t *testing.T) { am.PutEmptyMap("namespace").PutInt("a", 23) return DocumentFromAttributes(am) }, - want: Document{[]field{{"namespace.a", ignoreValue}, {"namespace.a", IntValue(23)}, {"toplevel", StringValue("test")}}}, + appendValueOnConflict: true, + want: Document{fields: []field{{"namespace.a", ignoreValue}, {"namespace.a", IntValue(23)}, {"toplevel", StringValue("test")}}}, }, "duplicate after flattening from map: namespace object at beginning": { build: func() Document { @@ -160,7 +128,8 @@ func TestObjectModel_Dedup(t *testing.T) { am.PutStr("toplevel", "test") return DocumentFromAttributes(am) }, - want: Document{[]field{{"namespace.a", ignoreValue}, {"namespace.a", IntValue(42)}, {"toplevel", StringValue("test")}}}, + appendValueOnConflict: true, + want: Document{fields: []field{{"namespace.a", ignoreValue}, {"namespace.a", IntValue(42)}, {"toplevel", StringValue("test")}}}, }, "dedup in arrays": { build: func() (doc Document) { @@ -172,7 +141,8 @@ func TestObjectModel_Dedup(t *testing.T) { doc.Add("arr", ArrValue(Value{kind: KindObject, doc: embedded})) return doc }, - want: Document{[]field{{"arr", ArrValue(Value{kind: KindObject, doc: Document{[]field{ + appendValueOnConflict: true, + want: Document{fields: []field{{"arr", ArrValue(Value{kind: KindObject, doc: Document{fields: []field{ {"a", ignoreValue}, {"a", IntValue(2)}, {"c", IntValue(3)}, @@ -184,7 +154,8 @@ func TestObjectModel_Dedup(t *testing.T) { doc.AddInt("namespace.a", 2) return doc }, - want: Document{[]field{{"namespace.a", IntValue(2)}, {"namespace.value", IntValue(1)}}}, + appendValueOnConflict: true, + want: Document{fields: []field{{"namespace.a", IntValue(2)}, {"namespace.value", IntValue(1)}}}, }, "dedup removes primitive if value exists": { build: func() (doc Document) { @@ -193,15 +164,25 @@ func TestObjectModel_Dedup(t *testing.T) { doc.AddInt("namespace.value", 3) return doc }, - want: Document{[]field{{"namespace.a", IntValue(2)}, {"namespace.value", ignoreValue}, {"namespace.value", IntValue(3)}}}, + appendValueOnConflict: true, + want: Document{fields: []field{{"namespace.a", IntValue(2)}, {"namespace.value", ignoreValue}, {"namespace.value", IntValue(3)}}}, + }, + "dedup without append value on conflict": { + build: func() (doc Document) { + doc.AddInt("namespace", 1) + doc.AddInt("namespace.a", 2) + doc.AddInt("namespace.value", 3) + return doc + }, + appendValueOnConflict: false, + want: Document{fields: []field{{"namespace", IntValue(1)}, {"namespace.a", IntValue(2)}, {"namespace.value", IntValue(3)}}}, }, } for name, test := range tests { t.Run(name, func(t *testing.T) { doc := test.build() - doc.Sort() - doc.Dedup() + doc.Dedup(test.appendValueOnConflict) assert.Equal(t, test.want, doc) }) } @@ -255,7 +236,7 @@ func TestValue_FromAttribute(t *testing.T) { v.Map().PutInt("a", 1) return v }(), - want: Value{kind: KindObject, doc: Document{[]field{{"a", IntValue(1)}}}}, + want: Value{kind: KindObject, doc: Document{fields: []field{{"a", IntValue(1)}}}}, }, } @@ -319,8 +300,8 @@ func TestDocument_Serialize_Flat(t *testing.T) { m := pcommon.NewMap() assert.NoError(t, m.FromRaw(test.attrs)) doc := DocumentFromAttributes(m) - doc.Dedup() - err := doc.Serialize(&buf, false) + doc.Dedup(true) + err := doc.Serialize(&buf, false, false) require.NoError(t, err) assert.Equal(t, test.want, buf.String()) @@ -380,8 +361,8 @@ func TestDocument_Serialize_Dedot(t *testing.T) { m := pcommon.NewMap() assert.NoError(t, m.FromRaw(test.attrs)) doc := DocumentFromAttributes(m) - doc.Dedup() - err := doc.Serialize(&buf, true) + doc.Dedup(true) + err := doc.Serialize(&buf, true, false) require.NoError(t, err) assert.Equal(t, test.want, buf.String()) @@ -394,14 +375,16 @@ func TestValue_Serialize(t *testing.T) { value Value want string }{ - "nil value": {value: nilValue, want: "null"}, - "bool value: true": {value: BoolValue(true), want: "true"}, - "bool value: false": {value: BoolValue(false), want: "false"}, - "int value": {value: IntValue(42), want: "42"}, - "double value": {value: DoubleValue(3.14), want: "3.14"}, - "NaN is undefined": {value: DoubleValue(math.NaN()), want: "null"}, - "Inf is undefined": {value: DoubleValue(math.Inf(0)), want: "null"}, - "string value": {value: StringValue("Hello World!"), want: `"Hello World!"`}, + "nil value": {value: nilValue, want: "null"}, + "bool value: true": {value: BoolValue(true), want: "true"}, + "bool value: false": {value: BoolValue(false), want: "false"}, + "int value": {value: IntValue(42), want: "42"}, + "uint value": {value: UIntValue(42), want: "42"}, + "double value: 3.14": {value: DoubleValue(3.14), want: "3.14"}, + "double value: 1.0": {value: DoubleValue(1.0), want: "1.0"}, + "NaN is undefined": {value: DoubleValue(math.NaN()), want: "null"}, + "Inf is undefined": {value: DoubleValue(math.Inf(0)), want: "null"}, + "string value": {value: StringValue("Hello World!"), want: `"Hello World!"`}, "timestamp": { value: TimestampValue(dijkstra), want: `"1930-05-11T16:33:11.123456789Z"`, @@ -427,7 +410,7 @@ func TestValue_Serialize(t *testing.T) { for name, test := range tests { t.Run(name, func(t *testing.T) { var buf strings.Builder - err := test.value.iterJSON(json.NewVisitor(&buf), false) + err := test.value.iterJSON(newJSONVisitor(&buf), false, false) require.NoError(t, err) assert.Equal(t, test.want, buf.String()) }) diff --git a/exporter/elasticsearchexporter/mapping_hint.go b/exporter/elasticsearchexporter/mapping_hint.go new file mode 100644 index 000000000000..5362335c7b35 --- /dev/null +++ b/exporter/elasticsearchexporter/mapping_hint.go @@ -0,0 +1,42 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package elasticsearchexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter" + +import ( + "slices" + + "go.opentelemetry.io/collector/pdata/pcommon" +) + +const ( + mappingHintsAttrKey = "elasticsearch.mapping.hints" +) + +type mappingHint string + +const ( + hintAggregateMetricDouble mappingHint = "aggregate_metric_double" + hintDocCount mappingHint = "_doc_count" +) + +type mappingHintGetter struct { + hints []mappingHint +} + +func newMappingHintGetter(attr pcommon.Map) (g mappingHintGetter) { + v, ok := attr.Get(mappingHintsAttrKey) + if !ok || v.Type() != pcommon.ValueTypeSlice { + return + } + slice := v.Slice() + g.hints = slices.Grow(g.hints, slice.Len()) + for i := 0; i < slice.Len(); i++ { + g.hints = append(g.hints, mappingHint(slice.At(i).Str())) + } + return +} + +func (g mappingHintGetter) HasMappingHint(hint mappingHint) bool { + return slices.Contains(g.hints, hint) +} diff --git a/exporter/elasticsearchexporter/mapping_hint_test.go b/exporter/elasticsearchexporter/mapping_hint_test.go new file mode 100644 index 000000000000..b0d8aae4dd0a --- /dev/null +++ b/exporter/elasticsearchexporter/mapping_hint_test.go @@ -0,0 +1,87 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package elasticsearchexporter + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "go.opentelemetry.io/collector/pdata/pcommon" +) + +func TestHasHint(t *testing.T) { + tests := []struct { + name string + attrsFunc func() pcommon.Map + hint mappingHint + want bool + }{ + { + name: "empty map", + attrsFunc: pcommon.NewMap, + hint: hintAggregateMetricDouble, + want: false, + }, + { + name: "bad type", + attrsFunc: func() pcommon.Map { + m := pcommon.NewMap() + m.PutBool(mappingHintsAttrKey, true) + return m + }, + hint: hintAggregateMetricDouble, + want: false, + }, + { + name: "bad inner type", + attrsFunc: func() pcommon.Map { + m := pcommon.NewMap() + s := m.PutEmptySlice(mappingHintsAttrKey) + s.AppendEmpty().SetBool(true) + return m + }, + hint: hintAggregateMetricDouble, + want: false, + }, + { + name: "hit", + attrsFunc: func() pcommon.Map { + m := pcommon.NewMap() + s := m.PutEmptySlice(mappingHintsAttrKey) + s.AppendEmpty().SetStr(string(hintAggregateMetricDouble)) + return m + }, + hint: hintAggregateMetricDouble, + want: true, + }, + { + name: "hit 2nd", + attrsFunc: func() pcommon.Map { + m := pcommon.NewMap() + s := m.PutEmptySlice(mappingHintsAttrKey) + s.AppendEmpty().SetStr(string(hintDocCount)) + s.AppendEmpty().SetStr(string(hintAggregateMetricDouble)) + return m + }, + hint: hintAggregateMetricDouble, + want: true, + }, + { + name: "miss", + attrsFunc: func() pcommon.Map { + m := pcommon.NewMap() + s := m.PutEmptySlice(mappingHintsAttrKey) + s.AppendEmpty().SetStr(string(hintDocCount)) + return m + }, + hint: hintAggregateMetricDouble, + want: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + assert.Equal(t, tt.want, newMappingHintGetter(tt.attrsFunc()).HasMappingHint(tt.hint)) + }) + } +} diff --git a/exporter/elasticsearchexporter/metadata.yaml b/exporter/elasticsearchexporter/metadata.yaml index 1d5820e9b746..97b1c0b20349 100644 --- a/exporter/elasticsearchexporter/metadata.yaml +++ b/exporter/elasticsearchexporter/metadata.yaml @@ -1,14 +1,14 @@ type: elasticsearch -scope_name: otelcol/elasticsearch status: class: exporter stability: beta: [traces, logs] + development: [metrics] distributions: [contrib] codeowners: - active: [JaredTan95, ycombinator, carsonip] + active: [JaredTan95, carsonip, lahsivjar] tests: config: - endpoints: [http://localhost:9200] \ No newline at end of file + endpoints: [http://localhost:9200] diff --git a/exporter/elasticsearchexporter/model.go b/exporter/elasticsearchexporter/model.go index b3e8829a3006..f6ee644fb022 100644 --- a/exporter/elasticsearchexporter/model.go +++ b/exporter/elasticsearchexporter/model.go @@ -5,15 +5,25 @@ package elasticsearchexporter // import "github.com/open-telemetry/opentelemetry import ( "bytes" + "encoding/binary" "encoding/json" + "errors" "fmt" + "hash" + "hash/fnv" + "math" + "slices" + "strings" "time" + jsoniter "github.com/json-iterator/go" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" + "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" semconv "go.opentelemetry.io/collector/semconv/v1.22.0" + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter/internal/exphistogram" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter/internal/objmodel" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/traceutil" ) @@ -43,15 +53,35 @@ var resourceAttrsConversionMap = map[string]string{ semconv.AttributeOSType: "host.os.platform", semconv.AttributeOSDescription: "host.os.full", semconv.AttributeOSVersion: "host.os.version", - "k8s.namespace.name": "kubernetes.namespace", - "k8s.node.name": "kubernetes.node.name", - "k8s.pod.name": "kubernetes.pod.name", - "k8s.pod.uid": "kubernetes.pod.uid", + semconv.AttributeK8SDeploymentName: "kubernetes.deployment.name", + semconv.AttributeK8SNamespaceName: "kubernetes.namespace", + semconv.AttributeK8SNodeName: "kubernetes.node.name", + semconv.AttributeK8SPodName: "kubernetes.pod.name", + semconv.AttributeK8SPodUID: "kubernetes.pod.uid", + semconv.AttributeK8SJobName: "kubernetes.job.name", + semconv.AttributeK8SCronJobName: "kubernetes.cronjob.name", + semconv.AttributeK8SStatefulSetName: "kubernetes.statefulset.name", + semconv.AttributeK8SReplicaSetName: "kubernetes.replicaset.name", + semconv.AttributeK8SDaemonSetName: "kubernetes.daemonset.name", + semconv.AttributeK8SContainerName: "kubernetes.container.name", + semconv.AttributeK8SClusterName: "orchestrator.cluster.name", } +// resourceAttrsToPreserve contains conventions that should be preserved in ECS mode. +// This can happen when an attribute needs to be mapped to an ECS equivalent but +// at the same time be preserved to its original form. +var resourceAttrsToPreserve = map[string]bool{ + semconv.AttributeHostName: true, +} + +var ErrInvalidTypeForBodyMapMode = errors.New("invalid log record body type for 'bodymap' mapping mode") + type mappingModel interface { - encodeLog(pcommon.Resource, plog.LogRecord, pcommon.InstrumentationScope) ([]byte, error) - encodeSpan(pcommon.Resource, ptrace.Span, pcommon.InstrumentationScope) ([]byte, error) + encodeLog(pcommon.Resource, string, plog.LogRecord, pcommon.InstrumentationScope, string) ([]byte, error) + encodeSpan(pcommon.Resource, string, ptrace.Span, pcommon.InstrumentationScope, string) ([]byte, error) + encodeSpanEvent(resource pcommon.Resource, resourceSchemaURL string, span ptrace.Span, spanEvent ptrace.SpanEvent, scope pcommon.InstrumentationScope, scopeSchemaURL string) *objmodel.Document + upsertMetricDataPointValue(map[uint32]objmodel.Document, pcommon.Resource, string, pcommon.InstrumentationScope, string, pmetric.Metric, dataPoint) error + encodeDocument(objmodel.Document) ([]byte, error) } // encodeModel tries to keep the event as close to the original open telemetry semantics as is. @@ -61,28 +91,43 @@ type mappingModel interface { // // See: https://github.com/open-telemetry/oteps/blob/master/text/logs/0097-log-data-model.md type encodeModel struct { - dedup bool dedot bool mode MappingMode } +type dataPoint interface { + Timestamp() pcommon.Timestamp + StartTimestamp() pcommon.Timestamp + Attributes() pcommon.Map + Value() (pcommon.Value, error) + DynamicTemplate(pmetric.Metric) string + DocCount() uint64 + HasMappingHint(mappingHint) bool +} + const ( traceIDField = "traceID" spanIDField = "spanID" attributeField = "attribute" ) -func (m *encodeModel) encodeLog(resource pcommon.Resource, record plog.LogRecord, scope pcommon.InstrumentationScope) ([]byte, error) { +func (m *encodeModel) encodeLog(resource pcommon.Resource, resourceSchemaURL string, record plog.LogRecord, scope pcommon.InstrumentationScope, scopeSchemaURL string) ([]byte, error) { var document objmodel.Document switch m.mode { case MappingECS: document = m.encodeLogECSMode(resource, record, scope) + case MappingOTel: + document = m.encodeLogOTelMode(resource, resourceSchemaURL, record, scope, scopeSchemaURL) + case MappingBodyMap: + return m.encodeLogBodyMapMode(record) default: document = m.encodeLogDefaultMode(resource, record, scope) } + // For OTel mode, prefix conflicts are not a problem as otel-data has subobjects: false + document.Dedup(m.mode != MappingOTel) var buf bytes.Buffer - err := document.Serialize(&buf, m.dedot) + err := document.Serialize(&buf, m.dedot, m.mode == MappingOTel) return buf.Bytes(), err } @@ -104,27 +149,101 @@ func (m *encodeModel) encodeLogDefaultMode(resource pcommon.Resource, record plo document.AddAttributes("Resource", resource.Attributes()) document.AddAttributes("Scope", scopeToAttributes(scope)) - if m.dedup { - document.Dedup() - } else if m.dedot { - document.Sort() + return document +} + +func (m *encodeModel) encodeLogBodyMapMode(record plog.LogRecord) ([]byte, error) { + body := record.Body() + if body.Type() != pcommon.ValueTypeMap { + return nil, fmt.Errorf("%w: %q", ErrInvalidTypeForBodyMapMode, body.Type()) + } + + return jsoniter.Marshal(body.Map().AsRaw()) +} + +func (m *encodeModel) encodeLogOTelMode(resource pcommon.Resource, resourceSchemaURL string, record plog.LogRecord, scope pcommon.InstrumentationScope, scopeSchemaURL string) objmodel.Document { + var document objmodel.Document + + docTimeStamp := record.Timestamp() + if docTimeStamp.AsTime().UnixNano() == 0 { + docTimeStamp = record.ObservedTimestamp() } + document.AddTimestamp("@timestamp", docTimeStamp) + document.AddTimestamp("observed_timestamp", record.ObservedTimestamp()) + + document.AddTraceID("trace_id", record.TraceID()) + document.AddSpanID("span_id", record.SpanID()) + document.AddString("severity_text", record.SeverityText()) + document.AddInt("severity_number", int64(record.SeverityNumber())) + document.AddInt("dropped_attributes_count", int64(record.DroppedAttributesCount())) + + m.encodeAttributesOTelMode(&document, record.Attributes()) + m.encodeResourceOTelMode(&document, resource, resourceSchemaURL) + m.encodeScopeOTelMode(&document, scope, scopeSchemaURL) + + // Body + setOTelLogBody(&document, record.Body(), record.Attributes()) + return document +} + +func setOTelLogBody(doc *objmodel.Document, body pcommon.Value, attributes pcommon.Map) { + // Determine if this log record is an event, as they are mapped differently + // https://github.com/open-telemetry/semantic-conventions/blob/main/docs/general/events.md + _, isEvent := attributes.Get("event.name") + switch body.Type() { + case pcommon.ValueTypeMap: + if isEvent { + doc.AddAttribute("body.structured", body) + } else { + doc.AddAttribute("body.flattened", body) + } + case pcommon.ValueTypeSlice: + // output must be an array of objects due to ES limitations + // otherwise, wrap the array in an object + s := body.Slice() + allMaps := true + for i := 0; i < s.Len(); i++ { + if s.At(i).Type() != pcommon.ValueTypeMap { + allMaps = false + } + } + + var outVal pcommon.Value + if allMaps { + outVal = body + } else { + vm := pcommon.NewValueMap() + m := vm.SetEmptyMap() + body.Slice().CopyTo(m.PutEmptySlice("value")) + outVal = vm + } + + if isEvent { + doc.AddAttribute("body.structured", outVal) + } else { + doc.AddAttribute("body.flattened", outVal) + } + case pcommon.ValueTypeStr: + doc.AddString("body.text", body.Str()) + default: + doc.AddString("body.text", body.AsString()) + } } func (m *encodeModel) encodeLogECSMode(resource pcommon.Resource, record plog.LogRecord, scope pcommon.InstrumentationScope) objmodel.Document { var document objmodel.Document // First, try to map resource-level attributes to ECS fields. - encodeLogAttributesECSMode(&document, resource.Attributes(), resourceAttrsConversionMap) + encodeAttributesECSMode(&document, resource.Attributes(), resourceAttrsConversionMap, resourceAttrsToPreserve) // Then, try to map scope-level attributes to ECS fields. scopeAttrsConversionMap := map[string]string{ // None at the moment } - encodeLogAttributesECSMode(&document, scope.Attributes(), scopeAttrsConversionMap) + encodeAttributesECSMode(&document, scope.Attributes(), scopeAttrsConversionMap, resourceAttrsToPreserve) // Finally, try to map record-level attributes to ECS fields. recordAttrsConversionMap := map[string]string{ @@ -134,7 +253,7 @@ func (m *encodeModel) encodeLogECSMode(resource pcommon.Resource, record plog.Lo semconv.AttributeExceptionType: "error.type", semconv.AttributeExceptionEscaped: "event.error.exception.handled", } - encodeLogAttributesECSMode(&document, record.Attributes(), recordAttrsConversionMap) + encodeAttributesECSMode(&document, record.Attributes(), recordAttrsConversionMap, resourceAttrsToPreserve) // Handle special cases. encodeLogAgentNameECSMode(&document, resource) @@ -156,7 +275,438 @@ func (m *encodeModel) encodeLogECSMode(resource pcommon.Resource, record plog.Lo return document } -func (m *encodeModel) encodeSpan(resource pcommon.Resource, span ptrace.Span, scope pcommon.InstrumentationScope) ([]byte, error) { +func (m *encodeModel) encodeDocument(document objmodel.Document) ([]byte, error) { + // For OTel mode, prefix conflicts are not a problem as otel-data has subobjects: false + document.Dedup(m.mode != MappingOTel) + + var buf bytes.Buffer + err := document.Serialize(&buf, m.dedot, m.mode == MappingOTel) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +// upsertMetricDataPointValue upserts a datapoint value to documents which is already hashed by resource and index +func (m *encodeModel) upsertMetricDataPointValue(documents map[uint32]objmodel.Document, resource pcommon.Resource, resourceSchemaURL string, scope pcommon.InstrumentationScope, scopeSchemaURL string, metric pmetric.Metric, dp dataPoint) error { + switch m.mode { + case MappingOTel: + return m.upsertMetricDataPointValueOTelMode(documents, resource, resourceSchemaURL, scope, scopeSchemaURL, metric, dp) + case MappingECS: + return m.upsertMetricDataPointValueECSMode(documents, resource, resourceSchemaURL, scope, scopeSchemaURL, metric, dp) + default: + // Defaults to ECS for backward compatibility + return m.upsertMetricDataPointValueECSMode(documents, resource, resourceSchemaURL, scope, scopeSchemaURL, metric, dp) + } +} + +func (m *encodeModel) upsertMetricDataPointValueECSMode(documents map[uint32]objmodel.Document, resource pcommon.Resource, _ string, _ pcommon.InstrumentationScope, _ string, metric pmetric.Metric, dp dataPoint) error { + value, err := dp.Value() + if err != nil { + return err + } + + hash := metricECSHash(dp.Timestamp(), dp.Attributes()) + var ( + document objmodel.Document + ok bool + ) + if document, ok = documents[hash]; !ok { + encodeAttributesECSMode(&document, resource.Attributes(), resourceAttrsConversionMap, resourceAttrsToPreserve) + document.AddTimestamp("@timestamp", dp.Timestamp()) + document.AddAttributes("", dp.Attributes()) + } + + document.AddAttribute(metric.Name(), value) + + documents[hash] = document + return nil +} + +func (m *encodeModel) upsertMetricDataPointValueOTelMode(documents map[uint32]objmodel.Document, resource pcommon.Resource, resourceSchemaURL string, scope pcommon.InstrumentationScope, scopeSchemaURL string, metric pmetric.Metric, dp dataPoint) error { + value, err := dp.Value() + if err != nil { + return err + } + + // documents is per-resource. Therefore, there is no need to hash resource attributes + hash := metricOTelHash(dp, scope.Attributes(), metric.Unit()) + var ( + document objmodel.Document + ok bool + ) + if document, ok = documents[hash]; !ok { + document.AddTimestamp("@timestamp", dp.Timestamp()) + if dp.StartTimestamp() != 0 { + document.AddTimestamp("start_timestamp", dp.StartTimestamp()) + } + document.AddString("unit", metric.Unit()) + + m.encodeAttributesOTelMode(&document, dp.Attributes()) + m.encodeResourceOTelMode(&document, resource, resourceSchemaURL) + m.encodeScopeOTelMode(&document, scope, scopeSchemaURL) + } + + if dp.HasMappingHint(hintDocCount) { + docCount := dp.DocCount() + document.AddUInt("_doc_count", docCount) + } + + switch value.Type() { + case pcommon.ValueTypeMap: + m := pcommon.NewMap() + value.Map().CopyTo(m) + document.Add("metrics."+metric.Name(), objmodel.UnflattenableObjectValue(m)) + default: + document.Add("metrics."+metric.Name(), objmodel.ValueFromAttribute(value)) + } + // TODO: support quantiles + // https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/34561 + + // DynamicTemplate returns the name of dynamic template that applies to the metric and data point, + // so that the field is indexed into Elasticsearch with the correct mapping. The name should correspond to a + // dynamic template that is defined in ES mapping, e.g. + // https://github.com/elastic/elasticsearch/blob/8.15/x-pack/plugin/core/template-resources/src/main/resources/metrics%40mappings.json + document.AddDynamicTemplate("metrics."+metric.Name(), dp.DynamicTemplate(metric)) + documents[hash] = document + return nil +} + +type summaryDataPoint struct { + pmetric.SummaryDataPoint + mappingHintGetter +} + +func newSummaryDataPoint(dp pmetric.SummaryDataPoint) summaryDataPoint { + return summaryDataPoint{SummaryDataPoint: dp, mappingHintGetter: newMappingHintGetter(dp.Attributes())} +} + +func (dp summaryDataPoint) Value() (pcommon.Value, error) { + // TODO: Add support for quantiles + // https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/34561 + vm := pcommon.NewValueMap() + m := vm.Map() + m.PutDouble("sum", dp.Sum()) + m.PutInt("value_count", safeUint64ToInt64(dp.Count())) + return vm, nil +} + +func (dp summaryDataPoint) DynamicTemplate(_ pmetric.Metric) string { + return "summary" +} + +func (dp summaryDataPoint) DocCount() uint64 { + return dp.Count() +} + +type exponentialHistogramDataPoint struct { + pmetric.ExponentialHistogramDataPoint + mappingHintGetter +} + +func newExponentialHistogramDataPoint(dp pmetric.ExponentialHistogramDataPoint) exponentialHistogramDataPoint { + return exponentialHistogramDataPoint{ExponentialHistogramDataPoint: dp, mappingHintGetter: newMappingHintGetter(dp.Attributes())} +} + +func (dp exponentialHistogramDataPoint) Value() (pcommon.Value, error) { + if dp.HasMappingHint(hintAggregateMetricDouble) { + vm := pcommon.NewValueMap() + m := vm.Map() + m.PutDouble("sum", dp.Sum()) + m.PutInt("value_count", safeUint64ToInt64(dp.Count())) + return vm, nil + } + + counts, values := exphistogram.ToTDigest(dp.ExponentialHistogramDataPoint) + + vm := pcommon.NewValueMap() + m := vm.Map() + vmCounts := m.PutEmptySlice("counts") + vmCounts.EnsureCapacity(len(counts)) + for _, c := range counts { + vmCounts.AppendEmpty().SetInt(c) + } + vmValues := m.PutEmptySlice("values") + vmValues.EnsureCapacity(len(values)) + for _, v := range values { + vmValues.AppendEmpty().SetDouble(v) + } + + return vm, nil +} + +func (dp exponentialHistogramDataPoint) DynamicTemplate(_ pmetric.Metric) string { + if dp.HasMappingHint(hintAggregateMetricDouble) { + return "summary" + } + return "histogram" +} + +func (dp exponentialHistogramDataPoint) DocCount() uint64 { + return dp.Count() +} + +type histogramDataPoint struct { + pmetric.HistogramDataPoint + mappingHintGetter +} + +func newHistogramDataPoint(dp pmetric.HistogramDataPoint) histogramDataPoint { + return histogramDataPoint{HistogramDataPoint: dp, mappingHintGetter: newMappingHintGetter(dp.Attributes())} +} + +func (dp histogramDataPoint) Value() (pcommon.Value, error) { + if dp.HasMappingHint(hintAggregateMetricDouble) { + vm := pcommon.NewValueMap() + m := vm.Map() + m.PutDouble("sum", dp.Sum()) + m.PutInt("value_count", safeUint64ToInt64(dp.Count())) + return vm, nil + } + return histogramToValue(dp.HistogramDataPoint) +} + +func (dp histogramDataPoint) DynamicTemplate(_ pmetric.Metric) string { + if dp.HasMappingHint(hintAggregateMetricDouble) { + return "summary" + } + return "histogram" +} + +func (dp histogramDataPoint) DocCount() uint64 { + return dp.HistogramDataPoint.Count() +} + +func histogramToValue(dp pmetric.HistogramDataPoint) (pcommon.Value, error) { + // Histogram conversion function is from + // https://github.com/elastic/apm-data/blob/3b28495c3cbdc0902983134276eb114231730249/input/otlp/metrics.go#L277 + bucketCounts := dp.BucketCounts() + explicitBounds := dp.ExplicitBounds() + if bucketCounts.Len() != explicitBounds.Len()+1 || explicitBounds.Len() == 0 { + return pcommon.Value{}, errors.New("invalid histogram data point") + } + + vm := pcommon.NewValueMap() + m := vm.Map() + counts := m.PutEmptySlice("counts") + values := m.PutEmptySlice("values") + + values.EnsureCapacity(bucketCounts.Len()) + counts.EnsureCapacity(bucketCounts.Len()) + for i := 0; i < bucketCounts.Len(); i++ { + count := bucketCounts.At(i) + if count == 0 { + continue + } + + var value float64 + switch i { + // (-infinity, explicit_bounds[i]] + case 0: + value = explicitBounds.At(i) + if value > 0 { + value /= 2 + } + + // (explicit_bounds[i], +infinity) + case bucketCounts.Len() - 1: + value = explicitBounds.At(i - 1) + + // [explicit_bounds[i-1], explicit_bounds[i]) + default: + // Use the midpoint between the boundaries. + value = explicitBounds.At(i-1) + (explicitBounds.At(i)-explicitBounds.At(i-1))/2.0 + } + + counts.AppendEmpty().SetInt(safeUint64ToInt64(count)) + values.AppendEmpty().SetDouble(value) + } + + return vm, nil +} + +type numberDataPoint struct { + pmetric.NumberDataPoint + mappingHintGetter +} + +func newNumberDataPoint(dp pmetric.NumberDataPoint) numberDataPoint { + return numberDataPoint{NumberDataPoint: dp, mappingHintGetter: newMappingHintGetter(dp.Attributes())} +} + +func (dp numberDataPoint) Value() (pcommon.Value, error) { + switch dp.ValueType() { + case pmetric.NumberDataPointValueTypeDouble: + value := dp.DoubleValue() + if math.IsNaN(value) || math.IsInf(value, 0) { + return pcommon.Value{}, errInvalidNumberDataPoint + } + return pcommon.NewValueDouble(value), nil + case pmetric.NumberDataPointValueTypeInt: + return pcommon.NewValueInt(dp.IntValue()), nil + } + return pcommon.Value{}, errInvalidNumberDataPoint +} + +func (dp numberDataPoint) DynamicTemplate(metric pmetric.Metric) string { + switch metric.Type() { + case pmetric.MetricTypeSum: + switch dp.NumberDataPoint.ValueType() { + case pmetric.NumberDataPointValueTypeDouble: + if metric.Sum().IsMonotonic() { + return "counter_double" + } + return "gauge_double" + case pmetric.NumberDataPointValueTypeInt: + if metric.Sum().IsMonotonic() { + return "counter_long" + } + return "gauge_long" + default: + return "" // NumberDataPointValueTypeEmpty should already be discarded in numberToValue + } + case pmetric.MetricTypeGauge: + switch dp.NumberDataPoint.ValueType() { + case pmetric.NumberDataPointValueTypeDouble: + return "gauge_double" + case pmetric.NumberDataPointValueTypeInt: + return "gauge_long" + default: + return "" // NumberDataPointValueTypeEmpty should already be discarded in numberToValue + } + } + return "" +} + +func (dp numberDataPoint) DocCount() uint64 { + return 1 +} + +var errInvalidNumberDataPoint = errors.New("invalid number data point") + +func (m *encodeModel) encodeResourceOTelMode(document *objmodel.Document, resource pcommon.Resource, resourceSchemaURL string) { + resourceMapVal := pcommon.NewValueMap() + resourceMap := resourceMapVal.Map() + if resourceSchemaURL != "" { + resourceMap.PutStr("schema_url", resourceSchemaURL) + } + resourceMap.PutInt("dropped_attributes_count", int64(resource.DroppedAttributesCount())) + resourceAttrMap := resourceMap.PutEmptyMap("attributes") + resource.Attributes().CopyTo(resourceAttrMap) + resourceAttrMap.RemoveIf(func(key string, _ pcommon.Value) bool { + switch key { + case dataStreamType, dataStreamDataset, dataStreamNamespace: + return true + } + return false + }) + mergeGeolocation(resourceAttrMap) + document.Add("resource", objmodel.ValueFromAttribute(resourceMapVal)) +} + +func (m *encodeModel) encodeScopeOTelMode(document *objmodel.Document, scope pcommon.InstrumentationScope, scopeSchemaURL string) { + scopeMapVal := pcommon.NewValueMap() + scopeMap := scopeMapVal.Map() + if scope.Name() != "" { + scopeMap.PutStr("name", scope.Name()) + } + if scope.Version() != "" { + scopeMap.PutStr("version", scope.Version()) + } + if scopeSchemaURL != "" { + scopeMap.PutStr("schema_url", scopeSchemaURL) + } + scopeMap.PutInt("dropped_attributes_count", int64(scope.DroppedAttributesCount())) + scopeAttrMap := scopeMap.PutEmptyMap("attributes") + scope.Attributes().CopyTo(scopeAttrMap) + scopeAttrMap.RemoveIf(func(key string, _ pcommon.Value) bool { + switch key { + case dataStreamType, dataStreamDataset, dataStreamNamespace: + return true + } + return false + }) + mergeGeolocation(scopeAttrMap) + document.Add("scope", objmodel.ValueFromAttribute(scopeMapVal)) +} + +func (m *encodeModel) encodeAttributesOTelMode(document *objmodel.Document, attributeMap pcommon.Map) { + attrsCopy := pcommon.NewMap() // Copy to avoid mutating original map + attributeMap.CopyTo(attrsCopy) + attrsCopy.RemoveIf(func(key string, val pcommon.Value) bool { + switch key { + case dataStreamType, dataStreamDataset, dataStreamNamespace: + // At this point the data_stream attributes are expected to be in the record attributes, + // updated by the router. + // Move them to the top of the document and remove them from the record + document.AddAttribute(key, val) + return true + case mappingHintsAttrKey: + return true + } + return false + }) + mergeGeolocation(attrsCopy) + document.AddAttributes("attributes", attrsCopy) +} + +func (m *encodeModel) encodeSpan(resource pcommon.Resource, resourceSchemaURL string, span ptrace.Span, scope pcommon.InstrumentationScope, scopeSchemaURL string) ([]byte, error) { + var document objmodel.Document + switch m.mode { + case MappingOTel: + document = m.encodeSpanOTelMode(resource, resourceSchemaURL, span, scope, scopeSchemaURL) + default: + document = m.encodeSpanDefaultMode(resource, span, scope) + } + // For OTel mode, prefix conflicts are not a problem as otel-data has subobjects: false + document.Dedup(m.mode != MappingOTel) + var buf bytes.Buffer + err := document.Serialize(&buf, m.dedot, m.mode == MappingOTel) + return buf.Bytes(), err +} + +func (m *encodeModel) encodeSpanOTelMode(resource pcommon.Resource, resourceSchemaURL string, span ptrace.Span, scope pcommon.InstrumentationScope, scopeSchemaURL string) objmodel.Document { + var document objmodel.Document + document.AddTimestamp("@timestamp", span.StartTimestamp()) + document.AddTraceID("trace_id", span.TraceID()) + document.AddSpanID("span_id", span.SpanID()) + document.AddString("trace_state", span.TraceState().AsRaw()) + document.AddSpanID("parent_span_id", span.ParentSpanID()) + document.AddString("name", span.Name()) + document.AddString("kind", span.Kind().String()) + document.AddUInt("duration", uint64(span.EndTimestamp()-span.StartTimestamp())) + + m.encodeAttributesOTelMode(&document, span.Attributes()) + + document.AddInt("dropped_attributes_count", int64(span.DroppedAttributesCount())) + document.AddInt("dropped_events_count", int64(span.DroppedEventsCount())) + + links := pcommon.NewValueSlice() + linkSlice := links.SetEmptySlice() + spanLinks := span.Links() + for i := 0; i < spanLinks.Len(); i++ { + linkMap := linkSlice.AppendEmpty().SetEmptyMap() + spanLink := spanLinks.At(i) + linkMap.PutStr("trace_id", spanLink.TraceID().String()) + linkMap.PutStr("span_id", spanLink.SpanID().String()) + linkMap.PutStr("trace_state", spanLink.TraceState().AsRaw()) + mAttr := linkMap.PutEmptyMap("attributes") + spanLink.Attributes().CopyTo(mAttr) + linkMap.PutInt("dropped_attributes_count", int64(spanLink.DroppedAttributesCount())) + } + document.AddAttribute("links", links) + + document.AddInt("dropped_links_count", int64(span.DroppedLinksCount())) + document.AddString("status.message", span.Status().Message()) + document.AddString("status.code", span.Status().Code().String()) + + m.encodeResourceOTelMode(&document, resource, resourceSchemaURL) + m.encodeScopeOTelMode(&document, scope, scopeSchemaURL) + + return document +} + +func (m *encodeModel) encodeSpanDefaultMode(resource pcommon.Resource, span ptrace.Span, scope pcommon.InstrumentationScope) objmodel.Document { var document objmodel.Document document.AddTimestamp("@timestamp", span.StartTimestamp()) // We use @timestamp in order to ensure that we can index if the default data stream logs template is used. document.AddTimestamp("EndTimestamp", span.EndTimestamp()) @@ -173,16 +723,27 @@ func (m *encodeModel) encodeSpan(resource pcommon.Resource, span ptrace.Span, sc m.encodeEvents(&document, span.Events()) document.AddInt("Duration", durationAsMicroseconds(span.StartTimestamp().AsTime(), span.EndTimestamp().AsTime())) // unit is microseconds document.AddAttributes("Scope", scopeToAttributes(scope)) + return document +} - if m.dedup { - document.Dedup() - } else if m.dedot { - document.Sort() +func (m *encodeModel) encodeSpanEvent(resource pcommon.Resource, resourceSchemaURL string, span ptrace.Span, spanEvent ptrace.SpanEvent, scope pcommon.InstrumentationScope, scopeSchemaURL string) *objmodel.Document { + if m.mode != MappingOTel { + // Currently span events are stored separately only in OTel mapping mode. + // In other modes, they are stored within the span document. + return nil } + var document objmodel.Document + document.AddTimestamp("@timestamp", spanEvent.Timestamp()) + document.AddString("attributes.event.name", spanEvent.Name()) + document.AddSpanID("span_id", span.SpanID()) + document.AddTraceID("trace_id", span.TraceID()) + document.AddInt("dropped_attributes_count", int64(spanEvent.DroppedAttributesCount())) - var buf bytes.Buffer - err := document.Serialize(&buf, m.dedot) - return buf.Bytes(), err + m.encodeAttributesOTelMode(&document, spanEvent.Attributes()) + m.encodeResourceOTelMode(&document, resource, resourceSchemaURL) + m.encodeScopeOTelMode(&document, scope, scopeSchemaURL) + + return &document } func (m *encodeModel) encodeAttributes(document *objmodel.Document, attributes pcommon.Map) { @@ -231,7 +792,7 @@ func scopeToAttributes(scope pcommon.InstrumentationScope) pcommon.Map { return attrs } -func encodeLogAttributesECSMode(document *objmodel.Document, attrs pcommon.Map, conversionMap map[string]string) { +func encodeAttributesECSMode(document *objmodel.Document, attrs pcommon.Map, conversionMap map[string]string, preserveMap map[string]bool) { if len(conversionMap) == 0 { // No conversions to be done; add all attributes at top level of // document. @@ -248,6 +809,9 @@ func encodeLogAttributesECSMode(document *objmodel.Document, attrs pcommon.Map, } document.AddAttribute(ecsKey, v) + if preserve := preserveMap[k]; preserve { + document.AddAttribute(k, v) + } return true } @@ -344,3 +908,177 @@ func encodeLogTimestampECSMode(document *objmodel.Document, record plog.LogRecor document.AddTimestamp("@timestamp", record.ObservedTimestamp()) } + +// TODO use https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/internal/exp/metrics/identity +func metricECSHash(timestamp pcommon.Timestamp, attributes pcommon.Map) uint32 { + hasher := fnv.New32a() + + timestampBuf := make([]byte, 8) + binary.LittleEndian.PutUint64(timestampBuf, uint64(timestamp)) + hasher.Write(timestampBuf) + + mapHashExcludeReservedAttrs(hasher, attributes) + + return hasher.Sum32() +} + +func metricOTelHash(dp dataPoint, scopeAttrs pcommon.Map, unit string) uint32 { + hasher := fnv.New32a() + + timestampBuf := make([]byte, 8) + binary.LittleEndian.PutUint64(timestampBuf, uint64(dp.Timestamp())) + hasher.Write(timestampBuf) + + binary.LittleEndian.PutUint64(timestampBuf, uint64(dp.StartTimestamp())) + hasher.Write(timestampBuf) + + hasher.Write([]byte(unit)) + + mapHashExcludeReservedAttrs(hasher, scopeAttrs) + mapHashExcludeReservedAttrs(hasher, dp.Attributes(), mappingHintsAttrKey) + + return hasher.Sum32() +} + +// mapHashExcludeReservedAttrs is mapHash but ignoring some reserved attributes. +// e.g. index is already considered during routing and DS attributes do not need to be considered in hashing +func mapHashExcludeReservedAttrs(hasher hash.Hash, m pcommon.Map, extra ...string) { + m.Range(func(k string, v pcommon.Value) bool { + switch k { + case dataStreamType, dataStreamDataset, dataStreamNamespace: + return true + } + if slices.Contains(extra, k) { + return true + } + hasher.Write([]byte(k)) + valueHash(hasher, v) + + return true + }) +} + +func mapHash(hasher hash.Hash, m pcommon.Map) { + m.Range(func(k string, v pcommon.Value) bool { + hasher.Write([]byte(k)) + valueHash(hasher, v) + + return true + }) +} + +func valueHash(h hash.Hash, v pcommon.Value) { + switch v.Type() { + case pcommon.ValueTypeEmpty: + h.Write([]byte{0}) + case pcommon.ValueTypeStr: + h.Write([]byte(v.Str())) + case pcommon.ValueTypeBool: + if v.Bool() { + h.Write([]byte{1}) + } else { + h.Write([]byte{0}) + } + case pcommon.ValueTypeDouble: + buf := make([]byte, 8) + binary.LittleEndian.PutUint64(buf, math.Float64bits(v.Double())) + h.Write(buf) + case pcommon.ValueTypeInt: + buf := make([]byte, 8) + binary.LittleEndian.PutUint64(buf, uint64(v.Int())) // nolint:gosec // Overflow assumed. We prefer having high integers over zero. + h.Write(buf) + case pcommon.ValueTypeBytes: + h.Write(v.Bytes().AsRaw()) + case pcommon.ValueTypeMap: + mapHash(h, v.Map()) + case pcommon.ValueTypeSlice: + sliceHash(h, v.Slice()) + } +} + +func sliceHash(h hash.Hash, s pcommon.Slice) { + for i := 0; i < s.Len(); i++ { + valueHash(h, s.At(i)) + } +} + +// mergeGeolocation mutates attributes map to merge all `geo.location.{lon,lat}`, +// and namespaced `*.geo.location.{lon,lat}` to unnamespaced and namespaced `geo.location`. +// This is to match the geo_point type in Elasticsearch. +func mergeGeolocation(attributes pcommon.Map) { + const ( + lonKey = "geo.location.lon" + latKey = "geo.location.lat" + mergedKey = "geo.location" + ) + // Prefix is the attribute name without lonKey or latKey suffix + // e.g. prefix of "foo.bar.geo.location.lon" is "foo.bar.", prefix of "geo.location.lon" is "". + prefixToGeo := make(map[string]struct { + lon, lat float64 + lonSet, latSet bool + }) + setLon := func(prefix string, v float64) { + g := prefixToGeo[prefix] + g.lon = v + g.lonSet = true + prefixToGeo[prefix] = g + } + setLat := func(prefix string, v float64) { + g := prefixToGeo[prefix] + g.lat = v + g.latSet = true + prefixToGeo[prefix] = g + } + attributes.RemoveIf(func(key string, val pcommon.Value) bool { + if val.Type() != pcommon.ValueTypeDouble { + return false + } + + if key == lonKey { + setLon("", val.Double()) + return true + } else if key == latKey { + setLat("", val.Double()) + return true + } else if namespace, found := strings.CutSuffix(key, "."+lonKey); found { + prefix := namespace + "." + setLon(prefix, val.Double()) + return true + } else if namespace, found := strings.CutSuffix(key, "."+latKey); found { + prefix := namespace + "." + setLat(prefix, val.Double()) + return true + } + return false + }) + + for prefix, geo := range prefixToGeo { + if geo.lonSet && geo.latSet { + key := prefix + mergedKey + // Geopoint expressed as an array with the format: [lon, lat] + s := attributes.PutEmptySlice(key) + s.EnsureCapacity(2) + s.AppendEmpty().SetDouble(geo.lon) + s.AppendEmpty().SetDouble(geo.lat) + continue + } + + // Place the attributes back if lon and lat are not present together + if geo.lonSet { + key := prefix + lonKey + attributes.PutDouble(key, geo.lon) + } + if geo.latSet { + key := prefix + latKey + attributes.PutDouble(key, geo.lat) + } + } +} + +func safeUint64ToInt64(v uint64) int64 { + if v > math.MaxInt64 { + return math.MaxInt64 + } else { + return int64(v) // nolint:goset // overflow checked + } +} diff --git a/exporter/elasticsearchexporter/model_test.go b/exporter/elasticsearchexporter/model_test.go index 266c5dfecb59..eda750a540e7 100644 --- a/exporter/elasticsearchexporter/model_test.go +++ b/exporter/elasticsearchexporter/model_test.go @@ -4,14 +4,23 @@ package elasticsearchexporter import ( + "bytes" + "encoding/hex" + "encoding/json" "fmt" + "os" + "sort" + "strconv" + "strings" "testing" "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/tidwall/gjson" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" + "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" semconv "go.opentelemetry.io/collector/semconv/v1.22.0" @@ -22,45 +31,120 @@ var expectedSpanBody = `{"@timestamp":"2023-04-19T03:04:05.000000006Z","Attribut var expectedLogBody = `{"@timestamp":"2023-04-19T03:04:05.000000006Z","Attributes.log-attr1":"value1","Body":"log-body","Resource.key1":"value1","Scope.name":"","Scope.version":"","SeverityNumber":0,"TraceFlags":0}` -var expectedLogBodyWithEmptyTimestamp = `{"@timestamp":"1970-01-01T00:00:00.000000000Z","Attributes.log-attr1":"value1","Body":"log-body","Resource.key1":"value1","Scope.name":"","Scope.version":"","SeverityNumber":0,"TraceFlags":0}` -var expectedLogBodyDeDottedWithEmptyTimestamp = `{"@timestamp":"1970-01-01T00:00:00.000000000Z","Attributes":{"log-attr1":"value1"},"Body":"log-body","Resource":{"foo":{"bar":"baz"},"key1":"value1"},"Scope":{"name":"","version":""},"SeverityNumber":0,"TraceFlags":0}` +var expectedMetricsEncoded = `{"@timestamp":"2024-06-12T10:20:16.419290690Z","cpu":"cpu0","host":{"hostname":"my-host","name":"my-host","os":{"platform":"linux"}},"state":"idle","system":{"cpu":{"time":440.23}}} +{"@timestamp":"2024-06-12T10:20:16.419290690Z","cpu":"cpu0","host":{"hostname":"my-host","name":"my-host","os":{"platform":"linux"}},"state":"interrupt","system":{"cpu":{"time":0.0}}} +{"@timestamp":"2024-06-12T10:20:16.419290690Z","cpu":"cpu0","host":{"hostname":"my-host","name":"my-host","os":{"platform":"linux"}},"state":"nice","system":{"cpu":{"time":0.14}}} +{"@timestamp":"2024-06-12T10:20:16.419290690Z","cpu":"cpu0","host":{"hostname":"my-host","name":"my-host","os":{"platform":"linux"}},"state":"softirq","system":{"cpu":{"time":0.77}}} +{"@timestamp":"2024-06-12T10:20:16.419290690Z","cpu":"cpu0","host":{"hostname":"my-host","name":"my-host","os":{"platform":"linux"}},"state":"steal","system":{"cpu":{"time":0.0}}} +{"@timestamp":"2024-06-12T10:20:16.419290690Z","cpu":"cpu0","host":{"hostname":"my-host","name":"my-host","os":{"platform":"linux"}},"state":"system","system":{"cpu":{"time":24.8}}} +{"@timestamp":"2024-06-12T10:20:16.419290690Z","cpu":"cpu0","host":{"hostname":"my-host","name":"my-host","os":{"platform":"linux"}},"state":"user","system":{"cpu":{"time":64.78}}} +{"@timestamp":"2024-06-12T10:20:16.419290690Z","cpu":"cpu0","host":{"hostname":"my-host","name":"my-host","os":{"platform":"linux"}},"state":"wait","system":{"cpu":{"time":1.65}}} +{"@timestamp":"2024-06-12T10:20:16.419290690Z","cpu":"cpu1","host":{"hostname":"my-host","name":"my-host","os":{"platform":"linux"}},"state":"idle","system":{"cpu":{"time":475.69}}} +{"@timestamp":"2024-06-12T10:20:16.419290690Z","cpu":"cpu1","host":{"hostname":"my-host","name":"my-host","os":{"platform":"linux"}},"state":"interrupt","system":{"cpu":{"time":0.0}}} +{"@timestamp":"2024-06-12T10:20:16.419290690Z","cpu":"cpu1","host":{"hostname":"my-host","name":"my-host","os":{"platform":"linux"}},"state":"nice","system":{"cpu":{"time":0.1}}} +{"@timestamp":"2024-06-12T10:20:16.419290690Z","cpu":"cpu1","host":{"hostname":"my-host","name":"my-host","os":{"platform":"linux"}},"state":"softirq","system":{"cpu":{"time":0.57}}} +{"@timestamp":"2024-06-12T10:20:16.419290690Z","cpu":"cpu1","host":{"hostname":"my-host","name":"my-host","os":{"platform":"linux"}},"state":"steal","system":{"cpu":{"time":0.0}}} +{"@timestamp":"2024-06-12T10:20:16.419290690Z","cpu":"cpu1","host":{"hostname":"my-host","name":"my-host","os":{"platform":"linux"}},"state":"system","system":{"cpu":{"time":15.88}}} +{"@timestamp":"2024-06-12T10:20:16.419290690Z","cpu":"cpu1","host":{"hostname":"my-host","name":"my-host","os":{"platform":"linux"}},"state":"user","system":{"cpu":{"time":50.09}}} +{"@timestamp":"2024-06-12T10:20:16.419290690Z","cpu":"cpu1","host":{"hostname":"my-host","name":"my-host","os":{"platform":"linux"}},"state":"wait","system":{"cpu":{"time":0.95}}}` + +var ( + expectedLogBodyWithEmptyTimestamp = `{"@timestamp":"1970-01-01T00:00:00.000000000Z","Attributes.log-attr1":"value1","Body":"log-body","Resource.key1":"value1","Scope.name":"","Scope.version":"","SeverityNumber":0,"TraceFlags":0}` + expectedLogBodyDeDottedWithEmptyTimestamp = `{"@timestamp":"1970-01-01T00:00:00.000000000Z","Attributes":{"log-attr1":"value1"},"Body":"log-body","Resource":{"foo":{"bar":"baz"},"key1":"value1"},"Scope":{"name":"","version":""},"SeverityNumber":0,"TraceFlags":0}` +) func TestEncodeSpan(t *testing.T) { - model := &encodeModel{dedup: true, dedot: false} + model := &encodeModel{dedot: false} td := mockResourceSpans() - spanByte, err := model.encodeSpan(td.ResourceSpans().At(0).Resource(), td.ResourceSpans().At(0).ScopeSpans().At(0).Spans().At(0), td.ResourceSpans().At(0).ScopeSpans().At(0).Scope()) + spanByte, err := model.encodeSpan(td.ResourceSpans().At(0).Resource(), "", td.ResourceSpans().At(0).ScopeSpans().At(0).Spans().At(0), td.ResourceSpans().At(0).ScopeSpans().At(0).Scope(), "") assert.NoError(t, err) assert.Equal(t, expectedSpanBody, string(spanByte)) } func TestEncodeLog(t *testing.T) { t.Run("empty timestamp with observedTimestamp override", func(t *testing.T) { - model := &encodeModel{dedup: true, dedot: false} + model := &encodeModel{dedot: false} td := mockResourceLogs() td.ScopeLogs().At(0).LogRecords().At(0).SetObservedTimestamp(pcommon.NewTimestampFromTime(time.Date(2023, 4, 19, 3, 4, 5, 6, time.UTC))) - logByte, err := model.encodeLog(td.Resource(), td.ScopeLogs().At(0).LogRecords().At(0), td.ScopeLogs().At(0).Scope()) + logByte, err := model.encodeLog(td.Resource(), td.SchemaUrl(), td.ScopeLogs().At(0).LogRecords().At(0), td.ScopeLogs().At(0).Scope(), td.ScopeLogs().At(0).SchemaUrl()) assert.NoError(t, err) assert.Equal(t, expectedLogBody, string(logByte)) }) t.Run("both timestamp and observedTimestamp empty", func(t *testing.T) { - model := &encodeModel{dedup: true, dedot: false} + model := &encodeModel{dedot: false} td := mockResourceLogs() - logByte, err := model.encodeLog(td.Resource(), td.ScopeLogs().At(0).LogRecords().At(0), td.ScopeLogs().At(0).Scope()) + logByte, err := model.encodeLog(td.Resource(), td.SchemaUrl(), td.ScopeLogs().At(0).LogRecords().At(0), td.ScopeLogs().At(0).Scope(), td.ScopeLogs().At(0).SchemaUrl()) assert.NoError(t, err) assert.Equal(t, expectedLogBodyWithEmptyTimestamp, string(logByte)) }) t.Run("dedot true", func(t *testing.T) { - model := &encodeModel{dedup: true, dedot: true} + model := &encodeModel{dedot: true} td := mockResourceLogs() td.Resource().Attributes().PutStr("foo.bar", "baz") - logByte, err := model.encodeLog(td.Resource(), td.ScopeLogs().At(0).LogRecords().At(0), td.ScopeLogs().At(0).Scope()) + logByte, err := model.encodeLog(td.Resource(), td.SchemaUrl(), td.ScopeLogs().At(0).LogRecords().At(0), td.ScopeLogs().At(0).Scope(), td.ScopeLogs().At(0).SchemaUrl()) require.NoError(t, err) require.Equal(t, expectedLogBodyDeDottedWithEmptyTimestamp, string(logByte)) }) } +func TestEncodeMetric(t *testing.T) { + // Prepare metrics to test. + metrics := createTestMetrics(t) + + // Encode the metrics. + model := &encodeModel{ + dedot: true, + mode: MappingECS, + } + + docs := make(map[uint32]objmodel.Document) + + var docsBytes [][]byte + for i := 0; i < metrics.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics().At(0).Sum().DataPoints().Len(); i++ { + err := model.upsertMetricDataPointValue( + docs, + metrics.ResourceMetrics().At(0).Resource(), + "", + metrics.ResourceMetrics().At(0).ScopeMetrics().At(0).Scope(), + "", + metrics.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics().At(0), + newNumberDataPoint(metrics.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics().At(0).Sum().DataPoints().At(i)), + ) + require.NoError(t, err) + } + + for _, doc := range docs { + bytes, err := model.encodeDocument(doc) + require.NoError(t, err) + docsBytes = append(docsBytes, bytes) + } + + allDocsSorted := docBytesToSortedString(docsBytes) + assert.Equal(t, expectedMetricsEncoded, allDocsSorted) +} + +func docBytesToSortedString(docsBytes [][]byte) string { + // Convert the byte arrays to strings and sort the docs to make the test deterministic. + docs := make([]string, len(docsBytes)) + for i, docBytes := range docsBytes { + docs[i] = string(docBytes) + } + sort.Strings(docs) + allDocsSorted := strings.Join(docs, "\n") + return allDocsSorted +} + +func createTestMetrics(t *testing.T) pmetric.Metrics { + metricsUnmarshaler := &pmetric.JSONUnmarshaler{} + metricBytes, err := os.ReadFile("testdata/metrics-cpu.json") + require.NoError(t, err) + metrics, err := metricsUnmarshaler.UnmarshalMetrics(metricBytes) + require.NoError(t, err) + return metrics +} + func mockResourceSpans() ptrace.Traces { traces := ptrace.NewTraces() @@ -218,6 +302,46 @@ func TestEncodeEvents(t *testing.T) { } } +func TestEncodeLogECSModeDuplication(t *testing.T) { + resource := pcommon.NewResource() + err := resource.Attributes().FromRaw(map[string]any{ + semconv.AttributeServiceName: "foo.bar", + semconv.AttributeHostName: "localhost", + semconv.AttributeServiceVersion: "1.1.0", + semconv.AttributeOSType: "darwin", + semconv.AttributeOSDescription: "Mac OS Mojave", + semconv.AttributeOSName: "Mac OS X", + semconv.AttributeOSVersion: "10.14.1", + }) + require.NoError(t, err) + + want := `{"@timestamp":"2024-03-12T20:00:41.123456789Z","agent":{"name":"otlp"},"container":{"image":{"tag":["v3.4.0"]}},"event":{"action":"user-password-change"},"host":{"hostname":"localhost","name":"localhost","os":{"full":"Mac OS Mojave","name":"Mac OS X","platform":"darwin","type":"macos","version":"10.14.1"}},"service":{"name":"foo.bar","version":"1.1.0"}}` + require.NoError(t, err) + + resourceContainerImageTags := resource.Attributes().PutEmptySlice(semconv.AttributeContainerImageTags) + err = resourceContainerImageTags.FromRaw([]any{"v3.4.0"}) + require.NoError(t, err) + + scope := pcommon.NewInstrumentationScope() + + record := plog.NewLogRecord() + err = record.Attributes().FromRaw(map[string]any{ + "event.name": "user-password-change", + }) + require.NoError(t, err) + observedTimestamp := pcommon.Timestamp(1710273641123456789) + record.SetObservedTimestamp(observedTimestamp) + + m := encodeModel{ + mode: MappingECS, + dedot: true, + } + doc, err := m.encodeLog(resource, "", record, scope, "") + require.NoError(t, err) + + assert.Equal(t, want, string(doc)) +} + func TestEncodeLogECSMode(t *testing.T) { resource := pcommon.NewResource() err := resource.Attributes().FromRaw(map[string]any{ @@ -257,6 +381,14 @@ func TestEncodeLogECSMode(t *testing.T) { "k8s.node.name": "node-1", "k8s.pod.name": "opentelemetry-pod-autoconf", "k8s.pod.uid": "275ecb36-5aa8-4c2a-9c47-d8bb681b9aff", + "k8s.deployment.name": "coredns", + semconv.AttributeK8SJobName: "job.name", + semconv.AttributeK8SCronJobName: "cronjob.name", + semconv.AttributeK8SStatefulSetName: "statefulset.name", + semconv.AttributeK8SReplicaSetName: "replicaset.name", + semconv.AttributeK8SDaemonSetName: "daemonset.name", + semconv.AttributeK8SContainerName: "container.name", + semconv.AttributeK8SClusterName: "cluster.name", }) require.NoError(t, err) @@ -274,59 +406,61 @@ func TestEncodeLogECSMode(t *testing.T) { observedTimestamp := pcommon.Timestamp(1710273641123456789) record.SetObservedTimestamp(observedTimestamp) + var buf bytes.Buffer m := encodeModel{} doc := m.encodeLogECSMode(resource, record, scope) - - expectedDocFields := pcommon.NewMap() - err = expectedDocFields.FromRaw(map[string]any{ - "service.name": "foo.bar", - "service.version": "1.1.0", - "service.node.name": "i-103de39e0a", - "agent.name": "opentelemetry/perl", - "agent.version": "7.9.12", - "cloud.provider": "gcp", - "cloud.account.id": "19347013", - "cloud.region": "us-west-1", - "cloud.availability_zone": "us-west-1b", - "cloud.service.name": "gke", - "container.name": "happy-seger", - "container.id": "e69cc5d3dda", - "container.image.name": "my-app", - "container.runtime": "docker", - "host.hostname": "i-103de39e0a.gke.us-west-1b.cloud.google.com", - "host.id": "i-103de39e0a", - "host.type": "t2.medium", - "host.architecture": "x86_64", - "process.pid": 9833, - "process.command_line": "/usr/bin/ssh -l user 10.0.0.16", - "process.executable": "/usr/bin/ssh", - "service.runtime.name": "OpenJDK Runtime Environment", - "service.runtime.version": "14.0.2", - "host.os.platform": "darwin", - "host.os.full": "Mac OS Mojave", - "host.os.name": "Mac OS X", - "host.os.version": "10.14.1", - "host.os.type": "macos", - "device.id": "00000000-54b3-e7c7-0000-000046bffd97", - "device.model.identifier": "SM-G920F", - "device.model.name": "Samsung Galaxy S6", - "device.manufacturer": "Samsung", - "event.action": "user-password-change", - "kubernetes.namespace": "default", - "kubernetes.node.name": "node-1", - "kubernetes.pod.name": "opentelemetry-pod-autoconf", - "kubernetes.pod.uid": "275ecb36-5aa8-4c2a-9c47-d8bb681b9aff", - }) - require.NoError(t, err) - - expectedDoc := objmodel.Document{} - expectedDoc.AddAttributes("", expectedDocFields) - expectedDoc.AddTimestamp("@timestamp", observedTimestamp) - expectedDoc.Add("container.image.tag", objmodel.ArrValue(objmodel.StringValue("v3.4.0"))) - - doc.Sort() - expectedDoc.Sort() - require.Equal(t, expectedDoc, doc) + require.NoError(t, doc.Serialize(&buf, false, false)) + + require.JSONEq(t, `{ + "@timestamp": "2024-03-12T20:00:41.123456789Z", + "service.name": "foo.bar", + "service.version": "1.1.0", + "service.node.name": "i-103de39e0a", + "agent.name": "opentelemetry/perl", + "agent.version": "7.9.12", + "cloud.provider": "gcp", + "cloud.account.id": "19347013", + "cloud.region": "us-west-1", + "cloud.availability_zone": "us-west-1b", + "cloud.service.name": "gke", + "container.name": "happy-seger", + "container.id": "e69cc5d3dda", + "container.image.name": "my-app", + "container.image.tag": ["v3.4.0"], + "container.runtime": "docker", + "host.hostname": "i-103de39e0a.gke.us-west-1b.cloud.google.com", + "host.name": "i-103de39e0a.gke.us-west-1b.cloud.google.com", + "host.id": "i-103de39e0a", + "host.type": "t2.medium", + "host.architecture": "x86_64", + "process.pid": 9833, + "process.command_line": "/usr/bin/ssh -l user 10.0.0.16", + "process.executable": "/usr/bin/ssh", + "service.runtime.name": "OpenJDK Runtime Environment", + "service.runtime.version": "14.0.2", + "host.os.platform": "darwin", + "host.os.full": "Mac OS Mojave", + "host.os.name": "Mac OS X", + "host.os.version": "10.14.1", + "host.os.type": "macos", + "device.id": "00000000-54b3-e7c7-0000-000046bffd97", + "device.model.identifier": "SM-G920F", + "device.model.name": "Samsung Galaxy S6", + "device.manufacturer": "Samsung", + "event.action": "user-password-change", + "kubernetes.namespace": "default", + "kubernetes.node.name": "node-1", + "kubernetes.pod.name": "opentelemetry-pod-autoconf", + "kubernetes.pod.uid": "275ecb36-5aa8-4c2a-9c47-d8bb681b9aff", + "kubernetes.deployment.name": "coredns", + "kubernetes.job.name": "job.name", + "kubernetes.cronjob.name": "cronjob.name", + "kubernetes.statefulset.name": "statefulset.name", + "kubernetes.replicaset.name": "replicaset.name", + "kubernetes.daemonset.name": "daemonset.name", + "kubernetes.container.name": "container.name", + "orchestrator.cluster.name": "cluster.name" + }`, buf.String()) } func TestEncodeLogECSModeAgentName(t *testing.T) { @@ -403,16 +537,14 @@ func TestEncodeLogECSModeAgentName(t *testing.T) { timestamp := pcommon.Timestamp(1710373859123456789) record.SetTimestamp(timestamp) + var buf bytes.Buffer m := encodeModel{} doc := m.encodeLogECSMode(resource, record, scope) - - expectedDoc := objmodel.Document{} - expectedDoc.AddTimestamp("@timestamp", timestamp) - expectedDoc.AddString("agent.name", test.expectedAgentName) - - doc.Sort() - expectedDoc.Sort() - require.Equal(t, expectedDoc, doc) + require.NoError(t, doc.Serialize(&buf, false, false)) + require.JSONEq(t, fmt.Sprintf(`{ + "@timestamp": "2024-03-13T23:50:59.123456789Z", + "agent.name": %q + }`, test.expectedAgentName), buf.String()) }) } } @@ -457,17 +589,23 @@ func TestEncodeLogECSModeAgentVersion(t *testing.T) { timestamp := pcommon.Timestamp(1710373859123456789) record.SetTimestamp(timestamp) + var buf bytes.Buffer m := encodeModel{} doc := m.encodeLogECSMode(resource, record, scope) - - expectedDoc := objmodel.Document{} - expectedDoc.AddTimestamp("@timestamp", timestamp) - expectedDoc.AddString("agent.name", "otlp") - expectedDoc.AddString("agent.version", test.expectedAgentVersion) - - doc.Sort() - expectedDoc.Sort() - require.Equal(t, expectedDoc, doc) + require.NoError(t, doc.Serialize(&buf, false, false)) + + if test.expectedAgentVersion == "" { + require.JSONEq(t, `{ + "@timestamp": "2024-03-13T23:50:59.123456789Z", + "agent.name": "otlp" + }`, buf.String()) + } else { + require.JSONEq(t, fmt.Sprintf(`{ + "@timestamp": "2024-03-13T23:50:59.123456789Z", + "agent.name": "otlp", + "agent.version": %q + }`, test.expectedAgentVersion), buf.String()) + } }) } } @@ -558,25 +696,23 @@ func TestEncodeLogECSModeHostOSType(t *testing.T) { timestamp := pcommon.Timestamp(1710373859123456789) record.SetTimestamp(timestamp) + var buf bytes.Buffer m := encodeModel{} doc := m.encodeLogECSMode(resource, record, scope) + require.NoError(t, doc.Serialize(&buf, false, false)) - expectedDoc := objmodel.Document{} - expectedDoc.AddTimestamp("@timestamp", timestamp) - expectedDoc.AddString("agent.name", "otlp") + expectedJSON := `{"@timestamp":"2024-03-13T23:50:59.123456789Z", "agent.name":"otlp"` if test.expectedHostOsName != "" { - expectedDoc.AddString("host.os.name", test.expectedHostOsName) + expectedJSON += `, "host.os.name":` + strconv.Quote(test.expectedHostOsName) } if test.expectedHostOsType != "" { - expectedDoc.AddString("host.os.type", test.expectedHostOsType) + expectedJSON += `, "host.os.type":` + strconv.Quote(test.expectedHostOsType) } if test.expectedHostOsPlatform != "" { - expectedDoc.AddString("host.os.platform", test.expectedHostOsPlatform) + expectedJSON += `, "host.os.platform":` + strconv.Quote(test.expectedHostOsPlatform) } - - doc.Sort() - expectedDoc.Sort() - require.Equal(t, expectedDoc, doc) + expectedJSON += "}" + require.JSONEq(t, expectedJSON, buf.String()) }) } } @@ -585,16 +721,16 @@ func TestEncodeLogECSModeTimestamps(t *testing.T) { tests := map[string]struct { timeUnixNano int64 observedTimeUnixNano int64 - expectedTimestamp time.Time + expectedTimestamp string }{ "only_observed_set": { observedTimeUnixNano: 1710273641123456789, - expectedTimestamp: time.Unix(0, 1710273641123456789), + expectedTimestamp: "2024-03-12T20:00:41.123456789Z", }, "both_set": { timeUnixNano: 1710273639345678901, observedTimeUnixNano: 1710273641123456789, - expectedTimestamp: time.Unix(0, 1710273639345678901), + expectedTimestamp: "2024-03-12T20:00:39.345678901Z", }, } @@ -611,16 +747,14 @@ func TestEncodeLogECSModeTimestamps(t *testing.T) { record.SetObservedTimestamp(pcommon.Timestamp(test.observedTimeUnixNano)) } + var buf bytes.Buffer m := encodeModel{} doc := m.encodeLogECSMode(resource, record, scope) + require.NoError(t, doc.Serialize(&buf, false, false)) - expectedDoc := objmodel.Document{} - expectedDoc.AddTimestamp("@timestamp", pcommon.NewTimestampFromTime(test.expectedTimestamp)) - expectedDoc.AddString("agent.name", "otlp") - - doc.Sort() - expectedDoc.Sort() - require.Equal(t, expectedDoc, doc) + require.JSONEq(t, fmt.Sprintf( + `{"@timestamp":%q,"agent.name":"otlp"}`, test.expectedTimestamp, + ), buf.String()) }) } } @@ -629,6 +763,7 @@ func TestMapLogAttributesToECS(t *testing.T) { tests := map[string]struct { attrs func() pcommon.Map conversionMap map[string]string + preserveMap map[string]bool expectedDoc func() objmodel.Document }{ "no_attrs": { @@ -733,17 +868,446 @@ func TestMapLogAttributesToECS(t *testing.T) { return d }, }, + "preserve_map": { + attrs: func() pcommon.Map { + m := pcommon.NewMap() + m.PutStr("foo.bar", "baz") + return m + }, + conversionMap: map[string]string{ + "foo.bar": "bar.qux", + "qux": "foo", + }, preserveMap: map[string]bool{ + "foo.bar": true, + }, + expectedDoc: func() objmodel.Document { + d := objmodel.Document{} + d.AddString("bar.qux", "baz") + d.AddString("foo.bar", "baz") + return d + }, + }, } for name, test := range tests { t.Run(name, func(t *testing.T) { var doc objmodel.Document - encodeLogAttributesECSMode(&doc, test.attrs(), test.conversionMap) + encodeAttributesECSMode(&doc, test.attrs(), test.conversionMap, test.preserveMap) - doc.Sort() expectedDoc := test.expectedDoc() - expectedDoc.Sort() require.Equal(t, expectedDoc, doc) }) } } + +// JSON serializable structs for OTel test convenience +type OTelRecord struct { + TraceID OTelTraceID `json:"trace_id"` + SpanID OTelSpanID `json:"span_id"` + Timestamp time.Time `json:"@timestamp"` + ObservedTimestamp time.Time `json:"observed_timestamp"` + SeverityNumber int32 `json:"severity_number"` + SeverityText string `json:"severity_text"` + Attributes map[string]any `json:"attributes"` + DroppedAttributesCount uint32 `json:"dropped_attributes_count"` + Scope OTelScope `json:"scope"` + Resource OTelResource `json:"resource"` + Datastream OTelRecordDatastream `json:"data_stream"` +} + +type OTelRecordDatastream struct { + Dataset string `json:"dataset"` + Namespace string `json:"namespace"` + Type string `json:"type"` +} + +type OTelScope struct { + Name string `json:"name"` + Version string `json:"version"` + Attributes map[string]any `json:"attributes"` + DroppedAttributesCount uint32 `json:"dropped_attributes_count"` + SchemaURL string `json:"schema_url"` +} + +type OTelResource struct { + Attributes map[string]any `json:"attributes"` + DroppedAttributesCount uint32 `json:"dropped_attributes_count"` + SchemaURL string `json:"schema_url"` +} + +type OTelSpanID pcommon.SpanID + +func (o OTelSpanID) MarshalJSON() ([]byte, error) { + return nil, nil +} + +func (o *OTelSpanID) UnmarshalJSON(data []byte) error { + b, err := decodeOTelID(data) + if err != nil { + return err + } + copy(o[:], b) + return nil +} + +type OTelTraceID pcommon.TraceID + +func (o OTelTraceID) MarshalJSON() ([]byte, error) { + return nil, nil +} + +func (o *OTelTraceID) UnmarshalJSON(data []byte) error { + b, err := decodeOTelID(data) + if err != nil { + return err + } + copy(o[:], b) + return nil +} + +func decodeOTelID(data []byte) ([]byte, error) { + var s string + if err := json.Unmarshal(data, &s); err != nil { + return nil, err + } + + return hex.DecodeString(s) +} + +func TestEncodeLogOtelMode(t *testing.T) { + randomString := strings.Repeat("abcdefghijklmnopqrstuvwxyz0123456789", 10) + maxLenNamespace := maxDataStreamBytes - len(disallowedNamespaceRunes) + maxLenDataset := maxDataStreamBytes - len(disallowedDatasetRunes) - len(".otel") + + tests := []struct { + name string + rec OTelRecord + wantFn func(OTelRecord) OTelRecord // Allows each test to customized the expectations from the original test record data + }{ + { + name: "default", // Expecting default data_stream values + rec: buildOTelRecordTestData(t, nil), + wantFn: func(or OTelRecord) OTelRecord { + return assignDatastreamData(or) + }, + }, + { + name: "custom dataset", + rec: buildOTelRecordTestData(t, func(or OTelRecord) OTelRecord { + or.Attributes["data_stream.dataset"] = "custom" + return or + }), + wantFn: func(or OTelRecord) OTelRecord { + // Datastream attributes are expected to be deleted from under the attributes + deleteDatasetAttributes(or) + return assignDatastreamData(or, "", "custom.otel") + }, + }, + { + name: "custom dataset with otel suffix", + rec: buildOTelRecordTestData(t, func(or OTelRecord) OTelRecord { + or.Attributes["data_stream.dataset"] = "custom.otel" + return or + }), + wantFn: func(or OTelRecord) OTelRecord { + deleteDatasetAttributes(or) + return assignDatastreamData(or, "", "custom.otel.otel") + }, + }, + { + name: "custom dataset/namespace", + rec: buildOTelRecordTestData(t, func(or OTelRecord) OTelRecord { + or.Attributes["data_stream.dataset"] = "customds" + or.Attributes["data_stream.namespace"] = "customns" + return or + }), + wantFn: func(or OTelRecord) OTelRecord { + deleteDatasetAttributes(or) + return assignDatastreamData(or, "", "customds.otel", "customns") + }, + }, + { + name: "dataset attributes priority", + rec: buildOTelRecordTestData(t, func(or OTelRecord) OTelRecord { + or.Attributes["data_stream.dataset"] = "first" + or.Scope.Attributes["data_stream.dataset"] = "second" + or.Resource.Attributes["data_stream.dataset"] = "third" + return or + }), + wantFn: func(or OTelRecord) OTelRecord { + deleteDatasetAttributes(or) + return assignDatastreamData(or, "", "first.otel") + }, + }, + { + name: "dataset scope attribute priority", + rec: buildOTelRecordTestData(t, func(or OTelRecord) OTelRecord { + or.Scope.Attributes["data_stream.dataset"] = "second" + or.Resource.Attributes["data_stream.dataset"] = "third" + return or + }), + wantFn: func(or OTelRecord) OTelRecord { + deleteDatasetAttributes(or) + return assignDatastreamData(or, "", "second.otel") + }, + }, + { + name: "dataset resource attribute priority", + rec: buildOTelRecordTestData(t, func(or OTelRecord) OTelRecord { + or.Resource.Attributes["data_stream.dataset"] = "third" + return or + }), + wantFn: func(or OTelRecord) OTelRecord { + deleteDatasetAttributes(or) + return assignDatastreamData(or, "", "third.otel") + }, + }, + { + name: "sanitize dataset/namespace", + rec: buildOTelRecordTestData(t, func(or OTelRecord) OTelRecord { + or.Attributes["data_stream.dataset"] = disallowedDatasetRunes + randomString + or.Attributes["data_stream.namespace"] = disallowedNamespaceRunes + randomString + return or + }), + wantFn: func(or OTelRecord) OTelRecord { + deleteDatasetAttributes(or) + ds := strings.Repeat("_", len(disallowedDatasetRunes)) + randomString[:maxLenDataset] + ".otel" + ns := strings.Repeat("_", len(disallowedNamespaceRunes)) + randomString[:maxLenNamespace] + return assignDatastreamData(or, "", ds, ns) + }, + }, + } + + m := encodeModel{ + dedot: true, // default + mode: MappingOTel, + } + + for _, tc := range tests { + record, scope, resource := createTestOTelLogRecord(t, tc.rec) + + // This sets the data_stream values default or derived from the record/scope/resources + routeLogRecord(record.Attributes(), scope.Attributes(), resource.Attributes(), "", true, scope.Name()) + + b, err := m.encodeLog(resource, tc.rec.Resource.SchemaURL, record, scope, tc.rec.Scope.SchemaURL) + require.NoError(t, err) + + want := tc.rec + if tc.wantFn != nil { + want = tc.wantFn(want) + } + + var got OTelRecord + err = json.Unmarshal(b, &got) + + require.NoError(t, err) + + assert.Equal(t, want, got) + } +} + +// helper function that creates the OTel LogRecord from the test structure +func createTestOTelLogRecord(t *testing.T, rec OTelRecord) (plog.LogRecord, pcommon.InstrumentationScope, pcommon.Resource) { + record := plog.NewLogRecord() + record.SetTimestamp(pcommon.Timestamp(uint64(rec.Timestamp.UnixNano()))) //nolint:gosec // this input is controlled by tests + record.SetObservedTimestamp(pcommon.Timestamp(uint64(rec.ObservedTimestamp.UnixNano()))) //nolint:gosec // this input is controlled by tests + + record.SetTraceID(pcommon.TraceID(rec.TraceID)) + record.SetSpanID(pcommon.SpanID(rec.SpanID)) + record.SetSeverityNumber(plog.SeverityNumber(rec.SeverityNumber)) + record.SetSeverityText(rec.SeverityText) + record.SetDroppedAttributesCount(rec.DroppedAttributesCount) + + err := record.Attributes().FromRaw(rec.Attributes) + require.NoError(t, err) + + scope := pcommon.NewInstrumentationScope() + scope.SetName(rec.Scope.Name) + scope.SetVersion(rec.Scope.Version) + scope.SetDroppedAttributesCount(rec.Scope.DroppedAttributesCount) + err = scope.Attributes().FromRaw(rec.Scope.Attributes) + require.NoError(t, err) + + resource := pcommon.NewResource() + resource.SetDroppedAttributesCount(rec.Resource.DroppedAttributesCount) + err = resource.Attributes().FromRaw(rec.Resource.Attributes) + require.NoError(t, err) + + return record, scope, resource +} + +func buildOTelRecordTestData(t *testing.T, fn func(OTelRecord) OTelRecord) OTelRecord { + s := `{ + "@timestamp": "2024-03-12T20:00:41.123456780Z", + "attributes": { + "event.name": "user-password-change", + "foo.some": "bar" + }, + "dropped_attributes_count": 1, + "observed_timestamp": "2024-03-12T20:00:41.123456789Z", + "resource": { + "attributes": { + "host.name": "lebuntu", + "host.os.type": "linux" + }, + "dropped_attributes_count": 2, + "schema_url": "https://opentelemetry.io/schemas/1.6.0" + }, + "scope": { + "attributes": { + "attr.num": 1234, + "attr.str": "val1" + }, + "dropped_attributes_count": 2, + "name": "foobar", + "schema_url": "https://opentelemetry.io/schemas/1.6.1", + "version": "42" + }, + "severity_number": 17, + "severity_text": "ERROR", + "span_id": "0102030405060708", + "trace_id": "01020304050607080900010203040506" +}` + + var record OTelRecord + err := json.Unmarshal([]byte(s), &record) + assert.NoError(t, err) + if fn != nil { + record = fn(record) + } + return record +} + +func deleteDatasetAttributes(or OTelRecord) { + deleteDatasetAttributesFromMap(or.Attributes) + deleteDatasetAttributesFromMap(or.Scope.Attributes) + deleteDatasetAttributesFromMap(or.Resource.Attributes) +} + +func deleteDatasetAttributesFromMap(m map[string]any) { + delete(m, "data_stream.dataset") + delete(m, "data_stream.namespace") + delete(m, "data_stream.type") +} + +func assignDatastreamData(or OTelRecord, a ...string) OTelRecord { + r := OTelRecordDatastream{ + Dataset: "generic.otel", + Namespace: "default", + Type: "logs", + } + + if len(a) > 0 && a[0] != "" { + r.Type = a[0] + } + if len(a) > 1 && a[1] != "" { + r.Dataset = a[1] + } + if len(a) > 2 && a[2] != "" { + r.Namespace = a[2] + } + + or.Datastream = r + + return or +} + +func TestEncodeLogScalarObjectConflict(t *testing.T) { + // If there is an attribute named "foo", and another called "foo.bar", + // then "foo" will be renamed to "foo.value". + model := &encodeModel{} + td := mockResourceLogs() + td.ScopeLogs().At(0).LogRecords().At(0).Attributes().PutStr("foo", "scalar") + td.ScopeLogs().At(0).LogRecords().At(0).Attributes().PutStr("foo.bar", "baz") + encoded, err := model.encodeLog(td.Resource(), "", td.ScopeLogs().At(0).LogRecords().At(0), td.ScopeLogs().At(0).Scope(), "") + assert.NoError(t, err) + + assert.True(t, gjson.ValidBytes(encoded)) + assert.False(t, gjson.GetBytes(encoded, "Attributes\\.foo").Exists()) + fooValue := gjson.GetBytes(encoded, "Attributes\\.foo\\.value") + fooBar := gjson.GetBytes(encoded, "Attributes\\.foo\\.bar") + assert.Equal(t, "scalar", fooValue.Str) + assert.Equal(t, "baz", fooBar.Str) + + // If there is an attribute named "foo.value", then "foo" would be omitted rather than renamed. + td.ScopeLogs().At(0).LogRecords().At(0).Attributes().PutStr("foo.value", "foovalue") + encoded, err = model.encodeLog(td.Resource(), "", td.ScopeLogs().At(0).LogRecords().At(0), td.ScopeLogs().At(0).Scope(), "") + assert.NoError(t, err) + + assert.False(t, gjson.GetBytes(encoded, "Attributes\\.foo").Exists()) + fooValue = gjson.GetBytes(encoded, "Attributes\\.foo\\.value") + assert.Equal(t, "foovalue", fooValue.Str) +} + +func TestEncodeLogBodyMapMode(t *testing.T) { + // craft a log record with a body map + logs := plog.NewLogs() + resourceLogs := logs.ResourceLogs().AppendEmpty() + scopeLogs := resourceLogs.ScopeLogs().AppendEmpty() + logRecords := scopeLogs.LogRecords() + observedTimestamp := pcommon.Timestamp(time.Now().UnixNano()) // nolint:gosec // UnixNano is positive and thus safe to convert to signed integer. + + logRecord := logRecords.AppendEmpty() + logRecord.SetObservedTimestamp(observedTimestamp) + + bodyMap := pcommon.NewMap() + bodyMap.PutStr("@timestamp", "2024-03-12T20:00:41.123456789Z") + bodyMap.PutInt("id", 1) + bodyMap.PutStr("key", "value") + bodyMap.PutStr("key.a", "a") + bodyMap.PutStr("key.a.b", "b") + bodyMap.PutDouble("pi", 3.14) + bodyMap.CopyTo(logRecord.Body().SetEmptyMap()) + + m := encodeModel{} + got, err := m.encodeLogBodyMapMode(logRecord) + require.NoError(t, err) + + require.JSONEq(t, `{ + "@timestamp": "2024-03-12T20:00:41.123456789Z", + "id": 1, + "key": "value", + "key.a": "a", + "key.a.b": "b", + "pi": 3.14 + }`, string(got)) + + // invalid body map + logRecord.Body().SetEmptySlice() + _, err = m.encodeLogBodyMapMode(logRecord) + require.Error(t, err) + require.ErrorIs(t, err, ErrInvalidTypeForBodyMapMode) +} + +func TestMergeGeolocation(t *testing.T) { + attributes := map[string]any{ + "geo.location.lon": 1.1, + "geo.location.lat": 2.2, + "foo.bar.geo.location.lon": 3.3, + "foo.bar.geo.location.lat": 4.4, + "a.geo.location.lon": 5.5, + "b.geo.location.lat": 6.6, + "unrelatedgeo.location.lon": 7.7, + "unrelatedgeo.location.lat": 8.8, + "d": 9.9, + "e.geo.location.lon": "foo", + "e.geo.location.lat": "bar", + } + wantAttributes := map[string]any{ + "geo.location": []any{1.1, 2.2}, + "foo.bar.geo.location": []any{3.3, 4.4}, + "a.geo.location.lon": 5.5, + "b.geo.location.lat": 6.6, + "unrelatedgeo.location.lon": 7.7, + "unrelatedgeo.location.lat": 8.8, + "d": 9.9, + "e.geo.location.lon": "foo", + "e.geo.location.lat": "bar", + } + input := pcommon.NewMap() + err := input.FromRaw(attributes) + require.NoError(t, err) + mergeGeolocation(input) + after := input.AsRaw() + assert.Equal(t, wantAttributes, after) +} diff --git a/exporter/elasticsearchexporter/testdata/config.yaml b/exporter/elasticsearchexporter/testdata/config.yaml index b75fda2cf65a..e3f7ffc67fa9 100644 --- a/exporter/elasticsearchexporter/testdata/config.yaml +++ b/exporter/elasticsearchexporter/testdata/config.yaml @@ -17,10 +17,33 @@ elasticsearch/trace: flush: bytes: 10485760 retry: - max_requests: 5 + max_retries: 5 retry_on_status: - 429 - 500 +elasticsearch/metric: + tls: + insecure: false + endpoints: [http://localhost:9200] + metrics_index: my_metric_index + timeout: 2m + headers: + myheader: test + pipeline: mypipeline + user: elastic + password: search + api_key: AvFsEiPs== + discover: + on_start: true + flush: + bytes: 10485760 + retry: + max_retries: 5 + retry_on_status: + - 429 + - 500 + sending_queue: + enabled: true elasticsearch/log: tls: insecure: false @@ -38,7 +61,7 @@ elasticsearch/log: flush: bytes: 10485760 retry: - max_requests: 5 + max_retries: 5 retry_on_status: - 429 - 500 @@ -57,3 +80,15 @@ elasticsearch/cloudid: elasticsearch/deprecated_index: endpoints: [https://elastic.example.com:9200] index: my_log_index +elasticsearch/confighttp_endpoint: + endpoint: https://elastic.example.com:9200 +elasticsearch/batcher_disabled: + endpoint: https://elastic.example.com:9200 + batcher: + enabled: false +elasticsearch/compression_none: + endpoint: https://elastic.example.com:9200 + compression: none +elasticsearch/compression_gzip: + endpoint: https://elastic.example.com:9200 + compression: gzip diff --git a/exporter/elasticsearchexporter/testdata/metrics-cpu.json b/exporter/elasticsearchexporter/testdata/metrics-cpu.json new file mode 100644 index 000000000000..96470530c49f --- /dev/null +++ b/exporter/elasticsearchexporter/testdata/metrics-cpu.json @@ -0,0 +1,346 @@ +{ + "resourceMetrics": [ + { + "resource": { + "attributes": [ + { + "key": "host.name", + "value": { + "stringValue": "my-host" + } + }, + { + "key": "os.type", + "value": { + "stringValue": "linux" + } + } + ] + }, + "scopeMetrics": [ + { + "scope": { + "name": "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/cpuscraper", + "version": "0.102.0-dev" + }, + "metrics": [ + { + "name": "system.cpu.time", + "description": "Total seconds each logical CPU spent on each mode.", + "unit": "s", + "sum": { + "dataPoints": [ + { + "attributes": [ + { + "key": "cpu", + "value": { + "stringValue": "cpu0" + } + }, + { + "key": "state", + "value": { + "stringValue": "user" + } + } + ], + "startTimeUnixNano": "1718187065000000000", + "timeUnixNano": "1718187616419290690", + "asDouble": 64.78 + }, + { + "attributes": [ + { + "key": "cpu", + "value": { + "stringValue": "cpu0" + } + }, + { + "key": "state", + "value": { + "stringValue": "system" + } + } + ], + "startTimeUnixNano": "1718187065000000000", + "timeUnixNano": "1718187616419290690", + "asDouble": 24.8 + }, + { + "attributes": [ + { + "key": "cpu", + "value": { + "stringValue": "cpu0" + } + }, + { + "key": "state", + "value": { + "stringValue": "idle" + } + } + ], + "startTimeUnixNano": "1718187065000000000", + "timeUnixNano": "1718187616419290690", + "asDouble": 440.23 + }, + { + "attributes": [ + { + "key": "cpu", + "value": { + "stringValue": "cpu0" + } + }, + { + "key": "state", + "value": { + "stringValue": "interrupt" + } + } + ], + "startTimeUnixNano": "1718187065000000000", + "timeUnixNano": "1718187616419290690", + "asDouble": 0 + }, + { + "attributes": [ + { + "key": "cpu", + "value": { + "stringValue": "cpu0" + } + }, + { + "key": "state", + "value": { + "stringValue": "nice" + } + } + ], + "startTimeUnixNano": "1718187065000000000", + "timeUnixNano": "1718187616419290690", + "asDouble": 0.14 + }, + { + "attributes": [ + { + "key": "cpu", + "value": { + "stringValue": "cpu0" + } + }, + { + "key": "state", + "value": { + "stringValue": "softirq" + } + } + ], + "startTimeUnixNano": "1718187065000000000", + "timeUnixNano": "1718187616419290690", + "asDouble": 0.77 + }, + { + "attributes": [ + { + "key": "cpu", + "value": { + "stringValue": "cpu0" + } + }, + { + "key": "state", + "value": { + "stringValue": "steal" + } + } + ], + "startTimeUnixNano": "1718187065000000000", + "timeUnixNano": "1718187616419290690", + "asDouble": 0 + }, + { + "attributes": [ + { + "key": "cpu", + "value": { + "stringValue": "cpu0" + } + }, + { + "key": "state", + "value": { + "stringValue": "wait" + } + } + ], + "startTimeUnixNano": "1718187065000000000", + "timeUnixNano": "1718187616419290690", + "asDouble": 1.65 + }, + { + "attributes": [ + { + "key": "cpu", + "value": { + "stringValue": "cpu1" + } + }, + { + "key": "state", + "value": { + "stringValue": "user" + } + } + ], + "startTimeUnixNano": "1718187065000000000", + "timeUnixNano": "1718187616419290690", + "asDouble": 50.09 + }, + { + "attributes": [ + { + "key": "cpu", + "value": { + "stringValue": "cpu1" + } + }, + { + "key": "state", + "value": { + "stringValue": "system" + } + } + ], + "startTimeUnixNano": "1718187065000000000", + "timeUnixNano": "1718187616419290690", + "asDouble": 15.88 + }, + { + "attributes": [ + { + "key": "cpu", + "value": { + "stringValue": "cpu1" + } + }, + { + "key": "state", + "value": { + "stringValue": "idle" + } + } + ], + "startTimeUnixNano": "1718187065000000000", + "timeUnixNano": "1718187616419290690", + "asDouble": 475.69 + }, + { + "attributes": [ + { + "key": "cpu", + "value": { + "stringValue": "cpu1" + } + }, + { + "key": "state", + "value": { + "stringValue": "interrupt" + } + } + ], + "startTimeUnixNano": "1718187065000000000", + "timeUnixNano": "1718187616419290690", + "asDouble": 0 + }, + { + "attributes": [ + { + "key": "cpu", + "value": { + "stringValue": "cpu1" + } + }, + { + "key": "state", + "value": { + "stringValue": "nice" + } + } + ], + "startTimeUnixNano": "1718187065000000000", + "timeUnixNano": "1718187616419290690", + "asDouble": 0.1 + }, + { + "attributes": [ + { + "key": "cpu", + "value": { + "stringValue": "cpu1" + } + }, + { + "key": "state", + "value": { + "stringValue": "softirq" + } + } + ], + "startTimeUnixNano": "1718187065000000000", + "timeUnixNano": "1718187616419290690", + "asDouble": 0.57 + }, + { + "attributes": [ + { + "key": "cpu", + "value": { + "stringValue": "cpu1" + } + }, + { + "key": "state", + "value": { + "stringValue": "steal" + } + } + ], + "startTimeUnixNano": "1718187065000000000", + "timeUnixNano": "1718187616419290690", + "asDouble": 0 + }, + { + "attributes": [ + { + "key": "cpu", + "value": { + "stringValue": "cpu1" + } + }, + { + "key": "state", + "value": { + "stringValue": "wait" + } + } + ], + "startTimeUnixNano": "1718187065000000000", + "timeUnixNano": "1718187616419290690", + "asDouble": 0.95 + } + ] + } + } + ] + } + ], + "schemaUrl": "https://opentelemetry.io/schemas/1.9.0" + } + ] +} diff --git a/exporter/elasticsearchexporter/utils_test.go b/exporter/elasticsearchexporter/utils_test.go index de3d60418b24..fc320b36f073 100644 --- a/exporter/elasticsearchexporter/utils_test.go +++ b/exporter/elasticsearchexporter/utils_test.go @@ -10,14 +10,18 @@ import ( "fmt" "net/http" "net/http/httptest" + "slices" "strings" "sync" "testing" "time" + "github.com/klauspost/compress/gzip" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" + "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" ) @@ -26,6 +30,40 @@ type itemRequest struct { Document json.RawMessage } +func itemRequestsSortFunc(a, b itemRequest) int { + comp := bytes.Compare(a.Action, b.Action) + if comp == 0 { + return bytes.Compare(a.Document, b.Document) + } + return comp +} + +func assertRecordedItems(t *testing.T, expected []itemRequest, recorder *bulkRecorder, assertOrder bool) { // nolint:unparam + recorder.WaitItems(len(expected)) + assertItemRequests(t, expected, recorder.Items(), assertOrder) +} + +func assertItemRequests(t *testing.T, expected, actual []itemRequest, assertOrder bool) { // nolint:unparam + expectedItems := expected + actualItems := actual + if !assertOrder { + // Make copies to avoid mutating the args + expectedItems = make([]itemRequest, len(expected)) + copy(expectedItems, expected) + slices.SortFunc(expectedItems, itemRequestsSortFunc) + actualItems = make([]itemRequest, len(actual)) + copy(actualItems, actual) + slices.SortFunc(actualItems, itemRequestsSortFunc) + } + + require.Equal(t, len(expectedItems), len(actualItems), "want %d items, got %d", len(expectedItems), len(actualItems)) + for i, want := range expectedItems { + got := actualItems[i] + assert.JSONEq(t, string(want.Action), string(got.Action), "item %d action", i) + assert.JSONEq(t, string(want.Document), string(got.Document), "item %d document", i) + } +} + type itemResponse struct { Status int `json:"status"` } @@ -129,7 +167,11 @@ func newESTestServer(t *testing.T, bulkHandler bulkHandler) *httptest.Server { tsStart := time.Now() var items []itemRequest - dec := json.NewDecoder(req.Body) + body := req.Body + if req.Header.Get("Content-Encoding") == "gzip" { + body, _ = gzip.NewReader(req.Body) + } + dec := json.NewDecoder(body) for dec.More() { var action, doc json.RawMessage if err := dec.Decode(&action); err != nil { @@ -222,38 +264,58 @@ func itemsHasError(resp []itemResponse) bool { return false } -func newLogsWithAttributeAndResourceMap(attrMp map[string]string, resMp map[string]string) plog.Logs { +func newLogsWithAttributes(recordAttrs, scopeAttrs, resourceAttrs map[string]any) plog.Logs { logs := plog.NewLogs() - resourceSpans := logs.ResourceLogs() - rs := resourceSpans.AppendEmpty() + resourceLog := logs.ResourceLogs().AppendEmpty() + scopeLog := resourceLog.ScopeLogs().AppendEmpty() + fillAttributeMap(resourceLog.Resource().Attributes(), resourceAttrs) + fillAttributeMap(scopeLog.Scope().Attributes(), scopeAttrs) + fillAttributeMap(scopeLog.LogRecords().AppendEmpty().Attributes(), recordAttrs) - scopeAttr := rs.ScopeLogs().AppendEmpty().LogRecords().AppendEmpty().Attributes() - fillResourceAttributeMap(scopeAttr, attrMp) + return logs +} - resAttr := rs.Resource().Attributes() - fillResourceAttributeMap(resAttr, resMp) +func newMetricsWithAttributes(recordAttrs, scopeAttrs, resourceAttrs map[string]any) pmetric.Metrics { + metrics := pmetric.NewMetrics() + resourceMetric := metrics.ResourceMetrics().AppendEmpty() + scopeMetric := resourceMetric.ScopeMetrics().AppendEmpty() - return logs + fillAttributeMap(resourceMetric.Resource().Attributes(), resourceAttrs) + fillAttributeMap(scopeMetric.Scope().Attributes(), scopeAttrs) + dp := scopeMetric.Metrics().AppendEmpty().SetEmptySum().DataPoints().AppendEmpty() + dp.SetIntValue(0) + fillAttributeMap(dp.Attributes(), recordAttrs) + + return metrics } -func newTracesWithAttributeAndResourceMap(attrMp map[string]string, resMp map[string]string) ptrace.Traces { +func newTracesWithAttributes(recordAttrs, scopeAttrs, resourceAttrs map[string]any) ptrace.Traces { traces := ptrace.NewTraces() - resourceSpans := traces.ResourceSpans() - rs := resourceSpans.AppendEmpty() - - scopeAttr := rs.ScopeSpans().AppendEmpty().Spans().AppendEmpty().Attributes() - fillResourceAttributeMap(scopeAttr, attrMp) + resourceSpan := traces.ResourceSpans().AppendEmpty() + scopeSpan := resourceSpan.ScopeSpans().AppendEmpty() - resAttr := rs.Resource().Attributes() - fillResourceAttributeMap(resAttr, resMp) + fillAttributeMap(resourceSpan.Resource().Attributes(), resourceAttrs) + fillAttributeMap(scopeSpan.Scope().Attributes(), scopeAttrs) + fillAttributeMap(scopeSpan.Spans().AppendEmpty().Attributes(), recordAttrs) return traces } -func fillResourceAttributeMap(attrs pcommon.Map, mp map[string]string) { - attrs.EnsureCapacity(len(mp)) - for k, v := range mp { - attrs.PutStr(k, v) +func fillAttributeMap(attrs pcommon.Map, m map[string]any) { + attrs.EnsureCapacity(len(m)) + for k, v := range m { + switch vv := v.(type) { + case bool: + attrs.PutBool(k, vv) + case string: + attrs.PutStr(k, vv) + case []string: + slice := attrs.PutEmptySlice(k) + slice.EnsureCapacity(len(vv)) + for _, s := range vv { + slice.AppendEmpty().SetStr(s) + } + } } } @@ -263,21 +325,21 @@ func TestGetSuffixTime(t *testing.T) { testTime := time.Date(2023, 12, 2, 10, 10, 10, 1, time.UTC) index, err := generateIndexWithLogstashFormat(defaultCfg.LogsIndex, &defaultCfg.LogstashFormat, testTime) assert.NoError(t, err) - assert.Equal(t, index, "logs-generic-default-2023.12.02") + assert.Equal(t, "logs-generic-default-2023.12.02", index) defaultCfg.LogsIndex = "logstash" defaultCfg.LogstashFormat.PrefixSeparator = "." otelLogsIndex, err := generateIndexWithLogstashFormat(defaultCfg.LogsIndex, &defaultCfg.LogstashFormat, testTime) assert.NoError(t, err) - assert.Equal(t, otelLogsIndex, "logstash.2023.12.02") + assert.Equal(t, "logstash.2023.12.02", otelLogsIndex) defaultCfg.LogstashFormat.DateFormat = "%Y-%m-%d" newOtelLogsIndex, err := generateIndexWithLogstashFormat(defaultCfg.LogsIndex, &defaultCfg.LogstashFormat, testTime) assert.NoError(t, err) - assert.Equal(t, newOtelLogsIndex, "logstash.2023-12-02") + assert.Equal(t, "logstash.2023-12-02", newOtelLogsIndex) defaultCfg.LogstashFormat.DateFormat = "%d/%m/%Y" newOtelLogsIndexWithSpecDataFormat, err := generateIndexWithLogstashFormat(defaultCfg.LogsIndex, &defaultCfg.LogstashFormat, testTime) assert.NoError(t, err) - assert.Equal(t, newOtelLogsIndexWithSpecDataFormat, "logstash.02/12/2023") + assert.Equal(t, "logstash.02/12/2023", newOtelLogsIndexWithSpecDataFormat) } diff --git a/exporter/fileexporter/README.md b/exporter/fileexporter/README.md index ec550717b6d9..16a250af45ab 100644 --- a/exporter/fileexporter/README.md +++ b/exporter/fileexporter/README.md @@ -3,16 +3,23 @@ | Status | | | ------------- |-----------| -| Stability | [alpha]: traces, metrics, logs | -| Distributions | [core], [contrib] | +| Stability | [development]: profiles | +| | [alpha]: traces, metrics, logs | +| Distributions | [core], [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Ffile%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Ffile) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Ffile%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Ffile) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@atingchen](https://www.github.com/atingchen) | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[development]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#development +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha [core]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s +Writes telemetry data to files on disk. + +Use the [OTLP JSON File receiver](../../receiver/otlpjsonfilereceiver/README.md) to read the data back into the collector (as long as the data was exported using OTLP JSON format). + Exporter supports the following features: + Support for writing pipeline data to a file. diff --git a/exporter/fileexporter/buffered_writer.go b/exporter/fileexporter/buffered_writer.go index 6e50b6519296..d3d8de03fc57 100644 --- a/exporter/fileexporter/buffered_writer.go +++ b/exporter/fileexporter/buffered_writer.go @@ -16,9 +16,7 @@ type bufferedWriteCloser struct { buffered *bufio.Writer } -var ( - _ io.WriteCloser = (*bufferedWriteCloser)(nil) -) +var _ io.WriteCloser = (*bufferedWriteCloser)(nil) func newBufferedWriteCloser(f io.WriteCloser) io.WriteCloser { return &bufferedWriteCloser{ diff --git a/exporter/fileexporter/buffered_writer_test.go b/exporter/fileexporter/buffered_writer_test.go index 60f79a08a76b..ef56914076be 100644 --- a/exporter/fileexporter/buffered_writer_test.go +++ b/exporter/fileexporter/buffered_writer_test.go @@ -44,9 +44,7 @@ func TestBufferedWrites(t *testing.T) { assert.Equal(t, msg, b.String(), "Must match the expected string") } -var ( - errBenchmark error -) +var errBenchmark error func BenchmarkWriter(b *testing.B) { tempfile := func(tb testing.TB) io.WriteCloser { @@ -87,5 +85,4 @@ func BenchmarkWriter(b *testing.B) { }) } } - } diff --git a/exporter/fileexporter/config.go b/exporter/fileexporter/config.go index bdd05dd278b5..43499f70e105 100644 --- a/exporter/fileexporter/config.go +++ b/exporter/fileexporter/config.go @@ -20,7 +20,6 @@ const ( // Config defines configuration for file exporter. type Config struct { - // Path of the file to write to. Path is relative to current directory. Path string `mapstructure:"path"` diff --git a/exporter/fileexporter/config_test.go b/exporter/fileexporter/config_test.go index 2e588047406e..675e8b7b3e9f 100644 --- a/exporter/fileexporter/config_test.go +++ b/exporter/fileexporter/config_test.go @@ -194,7 +194,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) if tt.expected == nil { assert.EqualError(t, component.ValidateConfig(cfg), tt.errorMessage) diff --git a/exporter/fileexporter/encoding_test.go b/exporter/fileexporter/encoding_test.go index fbcf35415879..afc62a0a3784 100644 --- a/exporter/fileexporter/encoding_test.go +++ b/exporter/fileexporter/encoding_test.go @@ -14,10 +14,12 @@ import ( "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/exporter/exportertest" + "go.opentelemetry.io/collector/exporter/xexporter" "go.opentelemetry.io/collector/extension/extensiontest" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/pmetric" + "go.opentelemetry.io/collector/pdata/pprofile" "go.opentelemetry.io/collector/pdata/ptrace" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/otlpencodingextension" @@ -27,18 +29,10 @@ type hostWithEncoding struct { encodings map[component.ID]component.Component } -func (h hostWithEncoding) GetFactory(_ component.Kind, _ component.Type) component.Factory { - panic("unsupported") -} - func (h hostWithEncoding) GetExtensions() map[component.ID]component.Component { return h.encodings } -func (h hostWithEncoding) GetExporters() map[component.DataType]map[component.ID]component.Component { - panic("unsupported") -} - func TestEncoding(t *testing.T) { f := NewFactory() cfg := f.CreateDefaultConfig().(*Config) @@ -49,15 +43,17 @@ func TestEncoding(t *testing.T) { ef := otlpencodingextension.NewFactory() efCfg := ef.CreateDefaultConfig().(*otlpencodingextension.Config) efCfg.Protocol = "otlp_json" - ext, err := ef.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), efCfg) + ext, err := ef.Create(context.Background(), extensiontest.NewNopSettings(), efCfg) require.NoError(t, err) require.NoError(t, ext.Start(context.Background(), componenttest.NewNopHost())) - me, err := f.CreateMetricsExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + me, err := f.CreateMetrics(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) - te, err := f.CreateTracesExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + te, err := f.CreateTraces(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) - le, err := f.CreateLogsExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + le, err := f.CreateLogs(context.Background(), exportertest.NewNopSettings(), cfg) + require.NoError(t, err) + pe, err := f.(xexporter.Factory).CreateProfiles(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) host := hostWithEncoding{ map[component.ID]component.Component{id: ext}, @@ -65,23 +61,26 @@ func TestEncoding(t *testing.T) { require.NoError(t, me.Start(context.Background(), host)) require.NoError(t, te.Start(context.Background(), host)) require.NoError(t, le.Start(context.Background(), host)) + require.NoError(t, pe.Start(context.Background(), host)) t.Cleanup(func() { - }) require.NoError(t, me.ConsumeMetrics(context.Background(), generateMetrics())) require.NoError(t, te.ConsumeTraces(context.Background(), generateTraces())) require.NoError(t, le.ConsumeLogs(context.Background(), generateLogs())) + require.NoError(t, pe.ConsumeProfiles(context.Background(), generateProfiles())) require.NoError(t, me.Shutdown(context.Background())) require.NoError(t, te.Shutdown(context.Background())) require.NoError(t, le.Shutdown(context.Background())) + require.NoError(t, pe.Shutdown(context.Background())) b, err := os.ReadFile(cfg.Path) require.NoError(t, err) require.Contains(t, string(b), `{"resourceMetrics":`) require.Contains(t, string(b), `{"resourceSpans":`) require.Contains(t, string(b), `{"resourceLogs":`) + require.Contains(t, string(b), `{"resourceProfiles":`) } func generateLogs() plog.Logs { @@ -94,6 +93,17 @@ func generateLogs() plog.Logs { return logs } +func generateProfiles() pprofile.Profiles { + proflies := pprofile.NewProfiles() + rp := proflies.ResourceProfiles().AppendEmpty() + rp.Resource().Attributes().PutStr("resource", "R1") + p := rp.ScopeProfiles().AppendEmpty().Profiles().AppendEmpty() + p.SetProfileID(pprofile.NewProfileIDEmpty()) + p.SetStartTime(pcommon.NewTimestampFromTime(time.Now().Add(-1 * time.Second))) + p.SetDuration(pcommon.Timestamp(1 * time.Second / time.Nanosecond)) + return proflies +} + func generateMetrics() pmetric.Metrics { metrics := pmetric.NewMetrics() rm := metrics.ResourceMetrics().AppendEmpty() diff --git a/exporter/fileexporter/factory.go b/exporter/fileexporter/factory.go index 6c05220697bf..6773d587e3a5 100644 --- a/exporter/fileexporter/factory.go +++ b/exporter/fileexporter/factory.go @@ -13,8 +13,11 @@ import ( "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/exporter" "go.opentelemetry.io/collector/exporter/exporterhelper" + "go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper" + "go.opentelemetry.io/collector/exporter/xexporter" "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/pmetric" + "go.opentelemetry.io/collector/pdata/pprofile" "go.opentelemetry.io/collector/pdata/ptrace" "go.uber.org/zap" "gopkg.in/natefinch/lumberjack.v2" @@ -44,16 +47,18 @@ type FileExporter interface { consumeTraces(_ context.Context, td ptrace.Traces) error consumeMetrics(_ context.Context, md pmetric.Metrics) error consumeLogs(_ context.Context, ld plog.Logs) error + consumeProfiles(_ context.Context, pd pprofile.Profiles) error } // NewFactory creates a factory for OTLP exporter. func NewFactory() exporter.Factory { - return exporter.NewFactory( + return xexporter.NewFactory( metadata.Type, createDefaultConfig, - exporter.WithTraces(createTracesExporter, metadata.TracesStability), - exporter.WithMetrics(createMetricsExporter, metadata.MetricsStability), - exporter.WithLogs(createLogsExporter, metadata.LogsStability)) + xexporter.WithTraces(createTracesExporter, metadata.TracesStability), + xexporter.WithMetrics(createMetricsExporter, metadata.MetricsStability), + xexporter.WithLogs(createLogsExporter, metadata.LogsStability), + xexporter.WithProfiles(createProfilesExporter, metadata.ProfilesStability)) } func createDefaultConfig() component.Config { @@ -69,11 +74,11 @@ func createDefaultConfig() component.Config { func createTracesExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exporter.Traces, error) { fe := getOrCreateFileExporter(cfg, set.Logger) - return exporterhelper.NewTracesExporter( + return exporterhelper.NewTraces( ctx, set, cfg, @@ -86,11 +91,11 @@ func createTracesExporter( func createMetricsExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exporter.Metrics, error) { fe := getOrCreateFileExporter(cfg, set.Logger) - return exporterhelper.NewMetricsExporter( + return exporterhelper.NewMetrics( ctx, set, cfg, @@ -103,11 +108,11 @@ func createMetricsExporter( func createLogsExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exporter.Logs, error) { fe := getOrCreateFileExporter(cfg, set.Logger) - return exporterhelper.NewLogsExporter( + return exporterhelper.NewLogs( ctx, set, cfg, @@ -118,9 +123,26 @@ func createLogsExporter( ) } +func createProfilesExporter( + ctx context.Context, + set exporter.Settings, + cfg component.Config, +) (xexporter.Profiles, error) { + fe := getOrCreateFileExporter(cfg, set.Logger) + return xexporterhelper.NewProfilesExporter( + ctx, + set, + cfg, + fe.consumeProfiles, + exporterhelper.WithStart(fe.Start), + exporterhelper.WithShutdown(fe.Shutdown), + exporterhelper.WithCapabilities(consumer.Capabilities{MutatesData: false}), + ) +} + // getOrCreateFileExporter creates a FileExporter and caches it for a particular configuration, // or returns the already cached one. Caching is required because the factory is asked trace and -// metric receivers separately when it gets CreateTracesReceiver() and CreateMetricsReceiver() +// metric receivers separately when it gets CreateTraces() and CreateMetrics() // but they must not create separate objects, they must use one Exporter object per configuration. func getOrCreateFileExporter(cfg component.Config, logger *zap.Logger) FileExporter { conf := cfg.(*Config) @@ -143,7 +165,6 @@ func newFileExporter(conf *Config, logger *zap.Logger) FileExporter { conf: conf, logger: logger, } - } func newFileWriter(path string, shouldAppend bool, rotation *Rotation, flushInterval time.Duration, export exportFunc) (*fileWriter, error) { @@ -155,7 +176,7 @@ func newFileWriter(path string, shouldAppend bool, rotation *Rotation, flushInte } else { fileFlags |= os.O_TRUNC } - f, err := os.OpenFile(path, fileFlags, 0644) + f, err := os.OpenFile(path, fileFlags, 0o644) if err != nil { return nil, err } @@ -180,6 +201,6 @@ func newFileWriter(path string, shouldAppend bool, rotation *Rotation, flushInte // This is the map of already created File exporters for particular configurations. // We maintain this map because the Factory is asked trace and metric receivers separately -// when it gets CreateTracesReceiver() and CreateMetricsReceiver() but they must not +// when it gets CreateTraces() and CreateMetrics() but they must not // create separate objects, they must use one Exporter object per configuration. var exporters = sharedcomponent.NewSharedComponents() diff --git a/exporter/fileexporter/factory_test.go b/exporter/fileexporter/factory_test.go index 950bd4cce82c..10af98194e93 100644 --- a/exporter/fileexporter/factory_test.go +++ b/exporter/fileexporter/factory_test.go @@ -22,81 +22,108 @@ func TestCreateDefaultConfig(t *testing.T) { assert.NoError(t, componenttest.CheckConfigStruct(cfg)) } -func TestCreateMetricsExporterError(t *testing.T) { +func TestCreateMetricsError(t *testing.T) { cfg := &Config{ FormatType: formatTypeJSON, } e, err := createMetricsExporter( context.Background(), - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = e.Start(context.Background(), componenttest.NewNopHost()) assert.Error(t, err) } -func TestCreateMetricsExporter(t *testing.T) { +func TestCreateMetrics(t *testing.T) { cfg := &Config{ FormatType: formatTypeJSON, Path: tempFileName(t), } exp, err := createMetricsExporter( context.Background(), - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg) assert.NoError(t, err) require.NotNil(t, exp) assert.NoError(t, exp.Shutdown(context.Background())) } -func TestCreateTracesExporter(t *testing.T) { +func TestCreateTraces(t *testing.T) { cfg := &Config{ FormatType: formatTypeJSON, Path: tempFileName(t), } exp, err := createTracesExporter( context.Background(), - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg) assert.NoError(t, err) require.NotNil(t, exp) assert.NoError(t, exp.Shutdown(context.Background())) } -func TestCreateTracesExporterError(t *testing.T) { +func TestCreateTracesError(t *testing.T) { cfg := &Config{ FormatType: formatTypeJSON, } e, err := createTracesExporter( context.Background(), - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = e.Start(context.Background(), componenttest.NewNopHost()) assert.Error(t, err) } -func TestCreateLogsExporter(t *testing.T) { +func TestCreateLogs(t *testing.T) { cfg := &Config{ FormatType: formatTypeJSON, Path: tempFileName(t), } exp, err := createLogsExporter( context.Background(), - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg) assert.NoError(t, err) require.NotNil(t, exp) assert.NoError(t, exp.Shutdown(context.Background())) } -func TestCreateLogsExporterError(t *testing.T) { +func TestCreateLogsError(t *testing.T) { cfg := &Config{ FormatType: formatTypeJSON, } e, err := createLogsExporter( context.Background(), - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), + cfg) + require.NoError(t, err) + err = e.Start(context.Background(), componenttest.NewNopHost()) + assert.Error(t, err) +} + +func TestCreateProfiles(t *testing.T) { + cfg := &Config{ + FormatType: formatTypeJSON, + Path: tempFileName(t), + } + exp, err := createProfilesExporter( + context.Background(), + exportertest.NewNopSettings(), + cfg) + assert.NoError(t, err) + require.NotNil(t, exp) + assert.NoError(t, exp.Shutdown(context.Background())) +} + +func TestCreateProfilesError(t *testing.T) { + cfg := &Config{ + FormatType: formatTypeJSON, + } + e, err := createProfilesExporter( + context.Background(), + exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = e.Start(context.Background(), componenttest.NewNopHost()) @@ -124,7 +151,7 @@ func TestNewFileWriter(t *testing.T) { validate: func(t *testing.T, writer *fileWriter) { assert.Equal(t, 5*time.Second, writer.flushInterval) _, ok := writer.file.(*bufferedWriteCloser) - assert.Equal(t, true, ok) + assert.True(t, ok) }, }, { @@ -139,7 +166,7 @@ func TestNewFileWriter(t *testing.T) { }, validate: func(t *testing.T, writer *fileWriter) { logger, ok := writer.file.(*lumberjack.Logger) - assert.Equal(t, true, ok) + assert.True(t, ok) assert.Equal(t, defaultMaxBackups, logger.MaxBackups) }, }, @@ -158,11 +185,11 @@ func TestNewFileWriter(t *testing.T) { }, validate: func(t *testing.T, writer *fileWriter) { logger, ok := writer.file.(*lumberjack.Logger) - assert.Equal(t, true, ok) + assert.True(t, ok) assert.Equal(t, 3, logger.MaxBackups) assert.Equal(t, 30, logger.MaxSize) assert.Equal(t, 100, logger.MaxAge) - assert.Equal(t, true, logger.LocalTime) + assert.True(t, logger.LocalTime) }, }, } diff --git a/exporter/fileexporter/file_exporter.go b/exporter/fileexporter/file_exporter.go index c7a090f28c6c..8545773070f0 100644 --- a/exporter/fileexporter/file_exporter.go +++ b/exporter/fileexporter/file_exporter.go @@ -9,6 +9,7 @@ import ( "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/pmetric" + "go.opentelemetry.io/collector/pdata/pprofile" "go.opentelemetry.io/collector/pdata/ptrace" ) @@ -43,6 +44,14 @@ func (e *fileExporter) consumeLogs(_ context.Context, ld plog.Logs) error { return e.writer.export(buf) } +func (e *fileExporter) consumeProfiles(_ context.Context, pd pprofile.Profiles) error { + buf, err := e.marshaller.marshalProfiles(pd) + if err != nil { + return err + } + return e.writer.export(buf) +} + // Start starts the flush timer if set. func (e *fileExporter) Start(_ context.Context, host component.Host) error { var err error diff --git a/exporter/fileexporter/file_exporter_test.go b/exporter/fileexporter/file_exporter_test.go index cefc5747f775..f4d559693273 100644 --- a/exporter/fileexporter/file_exporter_test.go +++ b/exporter/fileexporter/file_exporter_test.go @@ -22,6 +22,7 @@ import ( "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/pmetric" + "go.opentelemetry.io/collector/pdata/pprofile" "go.opentelemetry.io/collector/pdata/ptrace" "go.uber.org/zap" "gopkg.in/natefinch/lumberjack.v2" @@ -297,7 +298,6 @@ func TestFileMetricsExporter(t *testing.T) { } }) } - } func TestFileMetricsExporterError(t *testing.T) { @@ -453,6 +453,138 @@ func TestFileLogsExporterErrors(t *testing.T) { assert.NoError(t, fe.Shutdown(context.Background())) } +func TestFileProfilesExporter(t *testing.T) { + type args struct { + conf *Config + unmarshaler pprofile.Unmarshaler + } + tests := []struct { + name string + args args + }{ + { + name: "json: default configuration", + args: args{ + conf: &Config{ + Path: tempFileName(t), + FormatType: "json", + }, + unmarshaler: &pprofile.JSONUnmarshaler{}, + }, + }, + { + name: "json: compression configuration", + args: args{ + conf: &Config{ + Path: tempFileName(t), + FormatType: "json", + Compression: compressionZSTD, + }, + unmarshaler: &pprofile.JSONUnmarshaler{}, + }, + }, + { + name: "Proto: default configuration", + args: args{ + conf: &Config{ + Path: tempFileName(t), + FormatType: "proto", + }, + unmarshaler: &pprofile.ProtoUnmarshaler{}, + }, + }, + { + name: "Proto: compression configuration", + args: args{ + conf: &Config{ + Path: tempFileName(t), + FormatType: "proto", + Compression: compressionZSTD, + }, + unmarshaler: &pprofile.ProtoUnmarshaler{}, + }, + }, + { + name: "Proto: compression configuration--rotation", + args: args{ + conf: &Config{ + Path: tempFileName(t), + FormatType: "proto", + Compression: compressionZSTD, + Rotation: &Rotation{ + MaxMegabytes: 3, + MaxDays: 0, + MaxBackups: defaultMaxBackups, + LocalTime: false, + }, + }, + unmarshaler: &pprofile.ProtoUnmarshaler{}, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + conf := tt.args.conf + fe := &fileExporter{ + conf: conf, + } + require.NotNil(t, fe) + + pd := testdata.GenerateProfilesTwoProfilesSameResource() + assert.NoError(t, fe.Start(context.Background(), componenttest.NewNopHost())) + assert.NoError(t, fe.consumeProfiles(context.Background(), pd)) + assert.NoError(t, fe.consumeProfiles(context.Background(), pd)) + defer func() { + assert.NoError(t, fe.Shutdown(context.Background())) + }() + + fi, err := os.Open(fe.writer.path) + assert.NoError(t, err) + defer fi.Close() + br := bufio.NewReader(fi) + for { + buf, isEnd, err := func() ([]byte, bool, error) { + if fe.marshaller.formatType == formatTypeJSON && fe.marshaller.compression == "" { + return readJSONMessage(br) + } + return readMessageFromStream(br) + }() + assert.NoError(t, err) + if isEnd { + break + } + decoder := buildUnCompressor(fe.marshaller.compression) + buf, err = decoder(buf) + assert.NoError(t, err) + got, err := tt.args.unmarshaler.UnmarshalProfiles(buf) + assert.NoError(t, err) + assert.EqualValues(t, pd, got) + } + }) + } +} + +func TestFileProfilesExporterErrors(t *testing.T) { + pf := &errorWriter{} + fe := &fileExporter{ + marshaller: &marshaller{ + formatType: formatTypeJSON, + profilesMarshaler: profilesMarshalers[formatTypeJSON], + compressor: noneCompress, + }, + writer: &fileWriter{ + file: pf, + exporter: exportMessageAsLine, + }, + } + require.NotNil(t, fe) + + pd := testdata.GenerateProfilesTwoProfilesSameResource() + // Cannot call Start since we inject directly the WriterCloser. + assert.Error(t, fe.consumeProfiles(context.Background(), pd)) + assert.NoError(t, fe.Shutdown(context.Background())) +} + func TestExportMessageAsBuffer(t *testing.T) { path := tempFileName(t) fe := &fileExporter{ @@ -480,13 +612,12 @@ func TestExportMessageAsBuffer(t *testing.T) { } // tempFileName provides a temporary file name for testing. -func tempFileName(t testing.TB) string { - return filepath.Join(t.TempDir(), "fileexporter_test.tmp") +func tempFileName(tb testing.TB) string { + return filepath.Join(tb.TempDir(), "fileexporter_test.tmp") } // errorWriter is an io.Writer that will return an error all ways -type errorWriter struct { -} +type errorWriter struct{} func (e errorWriter) Write([]byte) (n int, err error) { return 0, errors.New("all ways return error") @@ -536,15 +667,17 @@ func decompress(src []byte) ([]byte, error) { func TestConcurrentlyCompress(t *testing.T) { wg := sync.WaitGroup{} - wg.Add(3) + wg.Add(4) var ( ctd []byte cmd []byte cld []byte + cpd []byte ) td := testdata.GenerateTracesTwoSpansSameResource() md := testdata.GenerateMetricsTwoMetrics() ld := testdata.GenerateLogsTwoLogRecordsSameResource() + pd := testdata.GenerateProfilesTwoProfilesSameResource() go func() { defer wg.Done() buf, err := tracesMarshalers[formatTypeJSON].MarshalTraces(td) @@ -569,6 +702,14 @@ func TestConcurrentlyCompress(t *testing.T) { } cld = zstdCompress(buf) }() + go func() { + defer wg.Done() + buf, err := profilesMarshalers[formatTypeJSON].MarshalProfiles(pd) + if err != nil { + return + } + cpd = zstdCompress(buf) + }() wg.Wait() buf, err := decompress(ctd) assert.NoError(t, err) @@ -590,6 +731,13 @@ func TestConcurrentlyCompress(t *testing.T) { gotLd, err := logsUnmarshaler.UnmarshalLogs(buf) assert.NoError(t, err) assert.EqualValues(t, ld, gotLd) + + buf, err = decompress(cpd) + assert.NoError(t, err) + profilesUnmarshaler := &pprofile.JSONUnmarshaler{} + gotPd, err := profilesUnmarshaler.UnmarshalProfiles(buf) + assert.NoError(t, err) + assert.EqualValues(t, pd, gotPd) } // tsBuffer is a thread safe buffer to prevent race conditions in the CI/CD. diff --git a/exporter/fileexporter/file_writer.go b/exporter/fileexporter/file_writer.go index fc4c34e25425..0f1d607ba055 100644 --- a/exporter/fileexporter/file_writer.go +++ b/exporter/fileexporter/file_writer.go @@ -95,7 +95,6 @@ func (w *fileWriter) start() { // Shutdown stops the exporter and is invoked during shutdown. // It stops the flush ticker if set. func (w *fileWriter) shutdown() error { - // Stop the flush ticker. if w.flushTicker != nil { // Stop the go routine. diff --git a/exporter/fileexporter/generated_component_test.go b/exporter/fileexporter/generated_component_test.go index 7c768e799ebf..f7d603f7074e 100644 --- a/exporter/fileexporter/generated_component_test.go +++ b/exporter/fileexporter/generated_component_test.go @@ -32,27 +32,27 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, { name: "metrics", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg) }, }, { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -64,21 +64,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(exporter.Logs) require.True(t, ok) diff --git a/exporter/fileexporter/go.mod b/exporter/fileexporter/go.mod index fbfa8b37bcad..ce0d12d110fc 100644 --- a/exporter/fileexporter/go.mod +++ b/exporter/fileexporter/go.mod @@ -1,66 +1,76 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter -go 1.21.0 +go 1.22.0 require ( github.com/hashicorp/golang-lru/v2 v2.0.7 - github.com/klauspost/compress v1.17.8 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/otlpencodingextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/klauspost/compress v1.17.11 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/otlpencodingextension v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 gopkg.in/natefinch/lumberjack.v2 v2.2.1 ) require ( - github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding v0.102.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding v0.116.0 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configretry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + go.opentelemetry.io/collector/config/configretry v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/fileexporter/go.sum b/exporter/fileexporter/go.sum index 917318496673..98a518c4a8d1 100644 --- a/exporter/fileexporter/go.sum +++ b/exporter/fileexporter/go.sum @@ -1,41 +1,41 @@ -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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -52,56 +52,76 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.116.0 h1:sSPDz4Qu7H86SrxtE6sQHDuWjFkTWHdKyGdsxhjZzcw= +go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.116.0/go.mod h1:0K7jbkCWtydn1IA3JwAUJeLVL79tJTxWoXR2gYTnCk0= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.116.0 h1:BzMvZf9RKRcQPFjGnQSEWvfI5Er9kXfzyZ/4GHkUTa4= +go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.116.0/go.mod h1:RCbA3MNnZPTy2mViwQxMlnrq5moJ1XgetNQx2XHIpaI= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 h1:PFNy+Il/kqPdPL9rhG+1kG63Aauya+FhBKGXoB6ivxU= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0/go.mod h1:bVn9V4TGyeXi58/JDkeXCuKtc+V+qcOoTl8hNpV0qa8= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -117,20 +137,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -139,12 +159,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/exporter/fileexporter/grouping_file_exporter.go b/exporter/fileexporter/grouping_file_exporter.go index 329c61878577..3276f027c110 100644 --- a/exporter/fileexporter/grouping_file_exporter.go +++ b/exporter/fileexporter/grouping_file_exporter.go @@ -18,6 +18,7 @@ import ( "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/pmetric" + "go.opentelemetry.io/collector/pdata/pprofile" "go.opentelemetry.io/collector/pdata/ptrace" "go.uber.org/zap" ) @@ -150,6 +151,44 @@ func (e *groupingFileExporter) consumeLogs(ctx context.Context, ld plog.Logs) er return nil } +func (e *groupingFileExporter) consumeProfiles(ctx context.Context, pd pprofile.Profiles) error { + if pd.ResourceProfiles().Len() == 0 { + return nil + } + + groups := make(map[string][]pprofile.ResourceProfiles) + + for i := 0; i < pd.ResourceProfiles().Len(); i++ { + rProfiles := pd.ResourceProfiles().At(i) + group(e, groups, rProfiles.Resource(), rProfiles) + } + + var errs error + for pathSegment, rProfilesSlice := range groups { + profiles := pprofile.NewProfiles() + for _, rProfiles := range rProfilesSlice { + rProfiles.CopyTo(profiles.ResourceProfiles().AppendEmpty()) + } + + buf, err := e.marshaller.marshalProfiles(profiles) + if err != nil { + errs = errors.Join(errs, err) + continue + } + + err = e.write(ctx, pathSegment, buf) + if err != nil { + errs = errors.Join(errs, err) + } + } + + if errs != nil { + return consumererror.NewPermanent(errs) + } + + return nil +} + func (e *groupingFileExporter) write(_ context.Context, pathSegment string, buf []byte) error { writer, err := e.getWriter(pathSegment) if err != nil { @@ -175,7 +214,7 @@ func (e *groupingFileExporter) getWriter(pathSegment string) (*fileWriter, error return writer, nil } - err := os.MkdirAll(path.Dir(fullPath), 0755) + err := os.MkdirAll(path.Dir(fullPath), 0o755) if err != nil { return nil, err } diff --git a/exporter/fileexporter/grouping_file_exporter_test.go b/exporter/fileexporter/grouping_file_exporter_test.go index 53f1b06a7382..a5b479303af5 100644 --- a/exporter/fileexporter/grouping_file_exporter_test.go +++ b/exporter/fileexporter/grouping_file_exporter_test.go @@ -15,6 +15,7 @@ import ( "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/pmetric" + "go.opentelemetry.io/collector/pdata/pprofile" "go.opentelemetry.io/collector/pdata/ptrace" "go.uber.org/zap" "go.uber.org/zap/zaptest/observer" @@ -38,12 +39,17 @@ func (m *testMarshaller) MarshalMetrics(pmetric.Metrics) ([]byte, error) { return m.content, nil } +func (m *testMarshaller) MarshalProfiles(pprofile.Profiles) ([]byte, error) { + return m.content, nil +} + type groupingExporterTestCase struct { - name string - conf *Config - traceUnmarshaler ptrace.Unmarshaler - logUnmarshaler plog.Unmarshaler - metricUnmarshaler pmetric.Unmarshaler + name string + conf *Config + traceUnmarshaler ptrace.Unmarshaler + logUnmarshaler plog.Unmarshaler + metricUnmarshaler pmetric.Unmarshaler + profileUnmarshaler pprofile.Unmarshaler } func groupingExporterTestCases() []groupingExporterTestCase { @@ -60,9 +66,10 @@ func groupingExporterTestCases() []groupingExporterTestCase { MaxOpenFiles: defaultMaxOpenFiles, }, }, - traceUnmarshaler: &ptrace.JSONUnmarshaler{}, - logUnmarshaler: &plog.JSONUnmarshaler{}, - metricUnmarshaler: &pmetric.JSONUnmarshaler{}, + traceUnmarshaler: &ptrace.JSONUnmarshaler{}, + logUnmarshaler: &plog.JSONUnmarshaler{}, + metricUnmarshaler: &pmetric.JSONUnmarshaler{}, + profileUnmarshaler: &pprofile.JSONUnmarshaler{}, }, { name: "json: compression configuration", @@ -77,9 +84,10 @@ func groupingExporterTestCases() []groupingExporterTestCase { MaxOpenFiles: defaultMaxOpenFiles, }, }, - traceUnmarshaler: &ptrace.JSONUnmarshaler{}, - logUnmarshaler: &plog.JSONUnmarshaler{}, - metricUnmarshaler: &pmetric.JSONUnmarshaler{}, + traceUnmarshaler: &ptrace.JSONUnmarshaler{}, + logUnmarshaler: &plog.JSONUnmarshaler{}, + metricUnmarshaler: &pmetric.JSONUnmarshaler{}, + profileUnmarshaler: &pprofile.JSONUnmarshaler{}, }, { name: "Proto: default configuration", @@ -92,9 +100,10 @@ func groupingExporterTestCases() []groupingExporterTestCase { MaxOpenFiles: defaultMaxOpenFiles, }, }, - traceUnmarshaler: &ptrace.ProtoUnmarshaler{}, - logUnmarshaler: &plog.ProtoUnmarshaler{}, - metricUnmarshaler: &pmetric.ProtoUnmarshaler{}, + traceUnmarshaler: &ptrace.ProtoUnmarshaler{}, + logUnmarshaler: &plog.ProtoUnmarshaler{}, + metricUnmarshaler: &pmetric.ProtoUnmarshaler{}, + profileUnmarshaler: &pprofile.JSONUnmarshaler{}, }, { name: "Proto: compression configuration", @@ -109,9 +118,10 @@ func groupingExporterTestCases() []groupingExporterTestCase { MaxOpenFiles: defaultMaxOpenFiles, }, }, - traceUnmarshaler: &ptrace.ProtoUnmarshaler{}, - logUnmarshaler: &plog.ProtoUnmarshaler{}, - metricUnmarshaler: &pmetric.ProtoUnmarshaler{}, + traceUnmarshaler: &ptrace.ProtoUnmarshaler{}, + logUnmarshaler: &plog.ProtoUnmarshaler{}, + metricUnmarshaler: &pmetric.ProtoUnmarshaler{}, + profileUnmarshaler: &pprofile.JSONUnmarshaler{}, }, { name: "json: max_open_files=1", @@ -125,9 +135,10 @@ func groupingExporterTestCases() []groupingExporterTestCase { ResourceAttribute: defaultResourceAttribute, }, }, - traceUnmarshaler: &ptrace.JSONUnmarshaler{}, - logUnmarshaler: &plog.JSONUnmarshaler{}, - metricUnmarshaler: &pmetric.JSONUnmarshaler{}, + traceUnmarshaler: &ptrace.JSONUnmarshaler{}, + logUnmarshaler: &plog.JSONUnmarshaler{}, + metricUnmarshaler: &pmetric.JSONUnmarshaler{}, + profileUnmarshaler: &pprofile.JSONUnmarshaler{}, }, } } diff --git a/exporter/fileexporter/internal/metadata/generated_status.go b/exporter/fileexporter/internal/metadata/generated_status.go index 4a61e902bd65..688175e24706 100644 --- a/exporter/fileexporter/internal/metadata/generated_status.go +++ b/exporter/fileexporter/internal/metadata/generated_status.go @@ -7,11 +7,13 @@ import ( ) var ( - Type = component.MustNewType("file") + Type = component.MustNewType("file") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter" ) const ( - TracesStability = component.StabilityLevelAlpha - MetricsStability = component.StabilityLevelAlpha - LogsStability = component.StabilityLevelAlpha + ProfilesStability = component.StabilityLevelDevelopment + TracesStability = component.StabilityLevelAlpha + MetricsStability = component.StabilityLevelAlpha + LogsStability = component.StabilityLevelAlpha ) diff --git a/exporter/fileexporter/internal/metadata/generated_telemetry.go b/exporter/fileexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index fee9287ffc53..000000000000 --- a/exporter/fileexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/file") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/file") -} diff --git a/exporter/fileexporter/internal/metadata/generated_telemetry_test.go b/exporter/fileexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index f8af967c4414..000000000000 --- a/exporter/fileexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/file", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/file", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/fileexporter/marshaller.go b/exporter/fileexporter/marshaller.go index e3452b93ee64..166d42c4ce0d 100644 --- a/exporter/fileexporter/marshaller.go +++ b/exporter/fileexporter/marshaller.go @@ -10,6 +10,7 @@ import ( "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/pmetric" + "go.opentelemetry.io/collector/pdata/pprofile" "go.opentelemetry.io/collector/pdata/ptrace" ) @@ -18,19 +19,27 @@ var tracesMarshalers = map[string]ptrace.Marshaler{ formatTypeJSON: &ptrace.JSONMarshaler{}, formatTypeProto: &ptrace.ProtoMarshaler{}, } + var metricsMarshalers = map[string]pmetric.Marshaler{ formatTypeJSON: &pmetric.JSONMarshaler{}, formatTypeProto: &pmetric.ProtoMarshaler{}, } + var logsMarshalers = map[string]plog.Marshaler{ formatTypeJSON: &plog.JSONMarshaler{}, formatTypeProto: &plog.ProtoMarshaler{}, } +var profilesMarshalers = map[string]pprofile.Marshaler{ + formatTypeJSON: &pprofile.JSONMarshaler{}, + formatTypeProto: &pprofile.ProtoMarshaler{}, +} + type marshaller struct { - tracesMarshaler ptrace.Marshaler - metricsMarshaler pmetric.Marshaler - logsMarshaler plog.Marshaler + tracesMarshaler ptrace.Marshaler + metricsMarshaler pmetric.Marshaler + logsMarshaler plog.Marshaler + profilesMarshaler pprofile.Marshaler compression string compressor compressFunc @@ -46,23 +55,26 @@ func newMarshaller(conf *Config, host component.Host) (*marshaller, error) { } // cast with ok to avoid panics. tm, _ := encoding.(ptrace.Marshaler) - pm, _ := encoding.(pmetric.Marshaler) + mm, _ := encoding.(pmetric.Marshaler) lm, _ := encoding.(plog.Marshaler) + pm, _ := encoding.(pprofile.Marshaler) return &marshaller{ - tracesMarshaler: tm, - metricsMarshaler: pm, - logsMarshaler: lm, - compression: conf.Compression, - compressor: buildCompressor(conf.Compression), + tracesMarshaler: tm, + metricsMarshaler: mm, + logsMarshaler: lm, + profilesMarshaler: pm, + compression: conf.Compression, + compressor: buildCompressor(conf.Compression), }, nil } return &marshaller{ - formatType: conf.FormatType, - tracesMarshaler: tracesMarshalers[conf.FormatType], - metricsMarshaler: metricsMarshalers[conf.FormatType], - logsMarshaler: logsMarshalers[conf.FormatType], - compression: conf.Compression, - compressor: buildCompressor(conf.Compression), + formatType: conf.FormatType, + tracesMarshaler: tracesMarshalers[conf.FormatType], + metricsMarshaler: metricsMarshalers[conf.FormatType], + logsMarshaler: logsMarshalers[conf.FormatType], + profilesMarshaler: profilesMarshalers[conf.FormatType], + compression: conf.Compression, + compressor: buildCompressor(conf.Compression), }, nil } @@ -101,3 +113,15 @@ func (m *marshaller) marshalLogs(ld plog.Logs) ([]byte, error) { buf = m.compressor(buf) return buf, nil } + +func (m *marshaller) marshalProfiles(pd pprofile.Profiles) ([]byte, error) { + if m.profilesMarshaler == nil { + return nil, errors.New("profiles are not supported by encoding") + } + buf, err := m.profilesMarshaler.MarshalProfiles(pd) + if err != nil { + return nil, err + } + buf = m.compressor(buf) + return buf, nil +} diff --git a/exporter/fileexporter/metadata.yaml b/exporter/fileexporter/metadata.yaml index f3a1ff03148e..75c12d292001 100644 --- a/exporter/fileexporter/metadata.yaml +++ b/exporter/fileexporter/metadata.yaml @@ -1,11 +1,11 @@ type: file -scope_name: otelcol/file status: class: exporter stability: alpha: [traces, metrics, logs] - distributions: [core, contrib] + development: [profiles] + distributions: [core, contrib, k8s] codeowners: active: [atingchen] @@ -17,4 +17,4 @@ tests: ignore: top: # Existing issue for leak: https://github.com/natefinch/lumberjack/issues/56 - - "gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun" \ No newline at end of file + - "gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun" diff --git a/exporter/googlecloudexporter/README.md b/exporter/googlecloudexporter/README.md index 78c7b96d9900..8a7754f45b8a 100644 --- a/exporter/googlecloudexporter/README.md +++ b/exporter/googlecloudexporter/README.md @@ -6,9 +6,9 @@ | Stability | [beta]: traces, metrics, logs | | Distributions | [contrib] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fgooglecloud%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fgooglecloud) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fgooglecloud%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fgooglecloud) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@aabmass](https://www.github.com/aabmass), [@dashpole](https://www.github.com/dashpole), [@jsuereth](https://www.github.com/jsuereth), [@punya](https://www.github.com/punya), [@damemi](https://www.github.com/damemi), [@psx95](https://www.github.com/psx95) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@aabmass](https://www.github.com/aabmass), [@dashpole](https://www.github.com/dashpole), [@jsuereth](https://www.github.com/jsuereth), [@punya](https://www.github.com/punya), [@psx95](https://www.github.com/psx95) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib @@ -16,6 +16,10 @@ This exporter can be used to send metrics to [Google Cloud Monitoring](https://c (formerly Stackdriver), traces to [Google Cloud Trace](https://cloud.google.com/trace), and logs to [Google Cloud Logging](https://cloud.google.com/logging). +To learn more about instrumentation and observability, including opinionated recommendations +for Google Cloud Observability, visit [Instrumentation and +observability](https://cloud.google.com/stackdriver/docs/instrumentation/overview). + ## Getting started ### Prerequisite: Authenticating @@ -136,7 +140,7 @@ These instructions are to get you up and running quickly with the GCP exporter i section](#prerequisite-authenticating) above. -4. **Run the collector.** The following runs the collector in the foreground, so please execute it in a separate terminal. +4. **Run the collector.** The following runs the collector in the foreground, so please execute it in a separate terminal. ```sh ./otelcol-contrib --config=config.yaml @@ -435,7 +439,7 @@ By default, the exporter sends telemetry to the project specified by `project` i The `gcp.project.id` label can be combined with the `destination_project_quota` option to attribute quota usage to the project parsed by the label. This feature is currently only available for traces and metrics. The Collector's default service account will need `roles/serviceusage.serviceUsageConsumer` IAM permissions in the destination quota project. -Note that this option will not work if a quota project is already defined in your Collector's GCP credentials. In this case, the telemetry will fail to export with a "project not found" error. +Note that this option will not work if a quota project is already defined in your Collector's GCP credentials. In this case, the telemetry will fail to export with a "project not found" error. This can be done by manually editing your [ADC file](https://cloud.google.com/docs/authentication/application-default-credentials#personal) (if it exists) to remove the `quota_project_id` entry line. ## Features and Feature-Gates diff --git a/exporter/googlecloudexporter/config.go b/exporter/googlecloudexporter/config.go index b0f70727dca5..bb4d9f169c52 100644 --- a/exporter/googlecloudexporter/config.go +++ b/exporter/googlecloudexporter/config.go @@ -15,8 +15,8 @@ type Config struct { collector.Config `mapstructure:",squash"` // Timeout for all API calls. If not set, defaults to 12 seconds. - exporterhelper.TimeoutSettings `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. - exporterhelper.QueueSettings `mapstructure:"sending_queue"` + TimeoutSettings exporterhelper.TimeoutConfig `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` } func (cfg *Config) Validate() error { diff --git a/exporter/googlecloudexporter/config_test.go b/exporter/googlecloudexporter/config_test.go index 748100efb56a..74cfced9886f 100644 --- a/exporter/googlecloudexporter/config_test.go +++ b/exporter/googlecloudexporter/config_test.go @@ -26,17 +26,17 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.Equal(t, sanitize(cfg.(*Config)), sanitize(factory.CreateDefaultConfig().(*Config))) sub, err = cm.Sub(component.NewIDWithName(metadata.Type, "customname").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.Equal(t, &Config{ - TimeoutSettings: exporterhelper.TimeoutSettings{ + TimeoutSettings: exporterhelper.TimeoutConfig{ Timeout: 20 * time.Second, }, Config: collector.Config{ @@ -64,7 +64,7 @@ func TestLoadConfig(t *testing.T) { }, }, }, - QueueSettings: exporterhelper.QueueSettings{ + QueueSettings: exporterhelper.QueueConfig{ Enabled: true, NumConsumers: 2, QueueSize: 10, diff --git a/exporter/googlecloudexporter/factory.go b/exporter/googlecloudexporter/factory.go index 25f681a3bad2..fd35483a4856 100644 --- a/exporter/googlecloudexporter/factory.go +++ b/exporter/googlecloudexporter/factory.go @@ -11,6 +11,7 @@ import ( "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/exporter" "go.opentelemetry.io/collector/exporter/exporterhelper" "go.opentelemetry.io/collector/featuregate" @@ -44,22 +45,23 @@ func NewFactory() exporter.Factory { // createDefaultConfig creates the default configuration for exporter. func createDefaultConfig() component.Config { return &Config{ - TimeoutSettings: exporterhelper.TimeoutSettings{Timeout: defaultTimeout}, - QueueSettings: exporterhelper.NewDefaultQueueSettings(), + TimeoutSettings: exporterhelper.TimeoutConfig{Timeout: defaultTimeout}, + QueueSettings: exporterhelper.NewDefaultQueueConfig(), Config: collector.DefaultConfig(), } } func createLogsExporter( ctx context.Context, - params exporter.CreateSettings, - cfg component.Config) (exporter.Logs, error) { + params exporter.Settings, + cfg component.Config, +) (exporter.Logs, error) { eCfg := cfg.(*Config) - logsExporter, err := collector.NewGoogleCloudLogsExporter(ctx, eCfg.Config, params.TelemetrySettings.Logger, params.BuildInfo.Version) + logsExporter, err := collector.NewGoogleCloudLogsExporter(ctx, eCfg.Config, params.TelemetrySettings.Logger, params.TelemetrySettings.MeterProvider, params.BuildInfo.Version, eCfg.TimeoutSettings.Timeout) if err != nil { return nil, err } - return exporterhelper.NewLogsExporter( + return exporterhelper.NewLogs( ctx, params, cfg, @@ -68,21 +70,24 @@ func createLogsExporter( exporterhelper.WithShutdown(logsExporter.Shutdown), // Disable exporterhelper Timeout, since we are using a custom mechanism // within exporter itself - exporterhelper.WithTimeout(exporterhelper.TimeoutSettings{Timeout: 0}), - exporterhelper.WithQueue(eCfg.QueueSettings)) + exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}), + exporterhelper.WithQueue(eCfg.QueueSettings), + exporterhelper.WithCapabilities(consumer.Capabilities{MutatesData: true}), + ) } // createTracesExporter creates a trace exporter based on this config. func createTracesExporter( ctx context.Context, - params exporter.CreateSettings, - cfg component.Config) (exporter.Traces, error) { + params exporter.Settings, + cfg component.Config, +) (exporter.Traces, error) { eCfg := cfg.(*Config) - tExp, err := collector.NewGoogleCloudTracesExporter(ctx, eCfg.Config, params.BuildInfo.Version, eCfg.Timeout) + tExp, err := collector.NewGoogleCloudTracesExporter(ctx, eCfg.Config, params.TelemetrySettings.Logger, params.TelemetrySettings.MeterProvider, params.BuildInfo.Version, eCfg.TimeoutSettings.Timeout) if err != nil { return nil, err } - return exporterhelper.NewTracesExporter( + return exporterhelper.NewTraces( ctx, params, cfg, @@ -91,21 +96,24 @@ func createTracesExporter( exporterhelper.WithShutdown(tExp.Shutdown), // Disable exporterhelper Timeout, since we are using a custom mechanism // within exporter itself - exporterhelper.WithTimeout(exporterhelper.TimeoutSettings{Timeout: 0}), - exporterhelper.WithQueue(eCfg.QueueSettings)) + exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}), + exporterhelper.WithQueue(eCfg.QueueSettings), + exporterhelper.WithCapabilities(consumer.Capabilities{MutatesData: true}), + ) } // createMetricsExporter creates a metrics exporter based on this config. func createMetricsExporter( ctx context.Context, - params exporter.CreateSettings, - cfg component.Config) (exporter.Metrics, error) { + params exporter.Settings, + cfg component.Config, +) (exporter.Metrics, error) { eCfg := cfg.(*Config) - mExp, err := collector.NewGoogleCloudMetricsExporter(ctx, eCfg.Config, params.TelemetrySettings.Logger, params.BuildInfo.Version, eCfg.Timeout) + mExp, err := collector.NewGoogleCloudMetricsExporter(ctx, eCfg.Config, params.TelemetrySettings.Logger, params.TelemetrySettings.MeterProvider, params.BuildInfo.Version, eCfg.TimeoutSettings.Timeout) if err != nil { return nil, err } - return exporterhelper.NewMetricsExporter( + return exporterhelper.NewMetrics( ctx, params, cfg, @@ -114,6 +122,8 @@ func createMetricsExporter( exporterhelper.WithShutdown(mExp.Shutdown), // Disable exporterhelper Timeout, since we are using a custom mechanism // within exporter itself - exporterhelper.WithTimeout(exporterhelper.TimeoutSettings{Timeout: 0}), - exporterhelper.WithQueue(eCfg.QueueSettings)) + exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}), + exporterhelper.WithQueue(eCfg.QueueSettings), + exporterhelper.WithCapabilities(consumer.Capabilities{MutatesData: true}), + ) } diff --git a/exporter/googlecloudexporter/factory_test.go b/exporter/googlecloudexporter/factory_test.go index 174bc7154703..028fe2e1e669 100644 --- a/exporter/googlecloudexporter/factory_test.go +++ b/exporter/googlecloudexporter/factory_test.go @@ -30,11 +30,11 @@ func TestCreateExporter(t *testing.T) { eCfg := cfg.(*Config) eCfg.ProjectID = "test" - te, err := factory.CreateTracesExporter(ctx, exportertest.NewNopCreateSettings(), eCfg) + te, err := factory.CreateTraces(ctx, exportertest.NewNopSettings(), eCfg) assert.NoError(t, err) assert.NotNil(t, te, "failed to create trace exporter") - me, err := factory.CreateMetricsExporter(ctx, exportertest.NewNopCreateSettings(), eCfg) + me, err := factory.CreateMetrics(ctx, exportertest.NewNopSettings(), eCfg) assert.NoError(t, err) assert.NotNil(t, me, "failed to create metrics exporter") } @@ -49,11 +49,11 @@ func TestCreateLegacyExporter(t *testing.T) { eCfg := cfg.(*Config) eCfg.ProjectID = "test" - te, err := factory.CreateTracesExporter(ctx, exportertest.NewNopCreateSettings(), eCfg) + te, err := factory.CreateTraces(ctx, exportertest.NewNopSettings(), eCfg) assert.NoError(t, err) assert.NotNil(t, te, "failed to create trace exporter") - me, err := factory.CreateMetricsExporter(ctx, exportertest.NewNopCreateSettings(), eCfg) + me, err := factory.CreateMetrics(ctx, exportertest.NewNopSettings(), eCfg) assert.NoError(t, err) assert.NotNil(t, me, "failed to create metrics exporter") } diff --git a/exporter/googlecloudexporter/generated_component_test.go b/exporter/googlecloudexporter/generated_component_test.go index 791add365872..2c24a3043af9 100644 --- a/exporter/googlecloudexporter/generated_component_test.go +++ b/exporter/googlecloudexporter/generated_component_test.go @@ -32,27 +32,27 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, { name: "metrics", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg) }, }, { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -64,9 +64,9 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) diff --git a/exporter/googlecloudexporter/go.mod b/exporter/googlecloudexporter/go.mod index 9338277b26c8..2d5dd24a4dc3 100644 --- a/exporter/googlecloudexporter/go.mod +++ b/exporter/googlecloudexporter/go.mod @@ -1,96 +1,100 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlecloudexporter -go 1.21.0 +go 1.22.7 require ( - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector v0.47.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/featuregate v1.9.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector v0.49.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/featuregate v1.22.0 + go.opentelemetry.io/collector/pdata v1.22.0 go.uber.org/goleak v1.3.0 ) require ( - cloud.google.com/go v0.112.1 // indirect - cloud.google.com/go/compute v1.25.1 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/logging v1.9.0 // indirect - cloud.google.com/go/longrunning v0.5.5 // indirect - cloud.google.com/go/monitoring v1.18.0 // indirect - cloud.google.com/go/trace v1.10.5 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.23.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.47.0 // indirect - github.com/beorn7/perks v1.0.1 // indirect + cloud.google.com/go v0.116.0 // indirect + cloud.google.com/go/auth v0.10.0 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.5 // indirect + cloud.google.com/go/compute/metadata v0.5.2 // indirect + cloud.google.com/go/logging v1.12.0 // indirect + cloud.google.com/go/longrunning v0.6.2 // indirect + cloud.google.com/go/monitoring v1.21.2 // indirect + cloud.google.com/go/trace v1.11.2 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.25.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.49.0 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.4 // indirect - github.com/google/s2a-go v0.1.7 // indirect + github.com/google/s2a-go v0.1.8 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.2 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect + github.com/googleapis/gax-go/v2 v2.13.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/tidwall/gjson v1.10.2 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/tidwall/gjson v1.18.0 // indirect github.com/tidwall/match v1.1.1 // indirect - github.com/tidwall/pretty v1.2.0 // indirect - github.com/tidwall/tinylru v1.1.0 // indirect + github.com/tidwall/pretty v1.2.1 // indirect + github.com/tidwall/tinylru v1.2.1 // indirect github.com/tidwall/wal v1.1.7 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configretry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/consumer v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/collector/semconv v0.102.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - go.uber.org/atomic v1.10.0 // indirect + go.opentelemetry.io/collector/config/configretry v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/collector/semconv v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.23.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/oauth2 v0.18.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - golang.org/x/time v0.5.0 // indirect - google.golang.org/api v0.169.0 // indirect - google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/net v0.30.0 // indirect + golang.org/x/oauth2 v0.23.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + golang.org/x/time v0.7.0 // indirect + google.golang.org/api v0.204.0 // indirect + google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/grpc/stats/opentelemetry v0.0.0-20241028142157-ada6787961b3 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/googlecloudexporter/go.sum b/exporter/googlecloudexporter/go.sum index eb46fcc42187..04693bf09a6f 100644 --- a/exporter/googlecloudexporter/go.sum +++ b/exporter/googlecloudexporter/go.sum @@ -1,54 +1,64 @@ +cel.dev/expr v0.16.2 h1:RwRhoH17VhAu9U5CMvMhH1PDVgf0tuz9FT+24AfMLfU= +cel.dev/expr v0.16.2/go.mod h1:gXngZQMkWJoSbE8mOzehJlXQyubn/Vg0vR9/F3W7iw8= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM= -cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4= -cloud.google.com/go/compute v1.25.1 h1:ZRpHJedLtTpKgr3RV1Fx23NuaAEN1Zfx9hw1u4aJdjU= -cloud.google.com/go/compute v1.25.1/go.mod h1:oopOIR53ly6viBYxaDhBfJwzUAxf1zE//uf3IB011ls= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/logging v1.9.0 h1:iEIOXFO9EmSiTjDmfpbRjOxECO7R8C7b8IXUGOj7xZw= -cloud.google.com/go/logging v1.9.0/go.mod h1:1Io0vnZv4onoUnsVUQY3HZ3Igb1nBchky0A0y7BBBhE= -cloud.google.com/go/longrunning v0.5.5 h1:GOE6pZFdSrTb4KAiKnXsJBtlE6mEyaW44oKyMILWnOg= -cloud.google.com/go/longrunning v0.5.5/go.mod h1:WV2LAxD8/rg5Z1cNW6FJ/ZpX4E4VnDnoTk0yawPBB7s= -cloud.google.com/go/monitoring v1.18.0 h1:NfkDLQDG2UR3WYZVQE8kwSbUIEyIqJUPl+aOQdFH1T4= -cloud.google.com/go/monitoring v1.18.0/go.mod h1:c92vVBCeq/OB4Ioyo+NbN2U7tlg5ZH41PZcdvfc+Lcg= -cloud.google.com/go/trace v1.10.5 h1:0pr4lIKJ5XZFYD9GtxXEWr0KkVeigc3wlGpZco0X1oA= -cloud.google.com/go/trace v1.10.5/go.mod h1:9hjCV1nGBCtXbAE4YK7OqJ8pmPYSxPA0I67JwRd5s3M= +cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE= +cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U= +cloud.google.com/go/auth v0.10.0 h1:tWlkvFAh+wwTOzXIjrwM64karR1iTBZ/GRr0S/DULYo= +cloud.google.com/go/auth v0.10.0/go.mod h1:xxA5AqpDrvS+Gkmo9RqrGGRh6WSNKKOXhY3zNOr38tI= +cloud.google.com/go/auth/oauth2adapt v0.2.5 h1:2p29+dePqsCHPP1bqDJcKj4qxRyYCcbzKpFyKGt3MTk= +cloud.google.com/go/auth/oauth2adapt v0.2.5/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8= +cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo= +cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k= +cloud.google.com/go/logging v1.12.0 h1:ex1igYcGFd4S/RZWOCU51StlIEuey5bjqwH9ZYjHibk= +cloud.google.com/go/logging v1.12.0/go.mod h1:wwYBt5HlYP1InnrtYI0wtwttpVU1rifnMT7RejksUAM= +cloud.google.com/go/longrunning v0.6.2 h1:xjDfh1pQcWPEvnfjZmwjKQEcHnpz6lHjfy7Fo0MK+hc= +cloud.google.com/go/longrunning v0.6.2/go.mod h1:k/vIs83RN4bE3YCswdXC5PFfWVILjm3hpEUlSko4PiI= +cloud.google.com/go/monitoring v1.21.2 h1:FChwVtClH19E7pJ+e0xUhJPGksctZNVOk2UhMmblmdU= +cloud.google.com/go/monitoring v1.21.2/go.mod h1:hS3pXvaG8KgWTSz+dAdyzPrGUYmi2Q+WFX8g2hqVEZU= +cloud.google.com/go/trace v1.11.2 h1:4ZmaBdL8Ng/ajrgKqY5jfvzqMXbrDcBsUGXOT9aqTtI= +cloud.google.com/go/trace v1.11.2/go.mod h1:bn7OwXd4pd5rFuAnTrzBuoZ4ax2XQeG3qNgYmfCy0Io= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector v0.47.0 h1:riVd60yiSVM8oTZEnM/nscvZ2o4mcol45ZPv62zlu/M= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector v0.47.0/go.mod h1:LoJOu8+DY6cbxXF753iWmZ88nHEudiySwpQg//6mU/0= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.23.0 h1:5A4O4OdC7yzkIEPl4GrS+PRYV15zsboaWBT52g3Hc0k= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.23.0/go.mod h1:zO73rmlwRYxQF/6Nul4PA/UIAYJo9BtDAMgPfMthXnw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.47.0 h1:h3GAq9n95A6IYOGqAucbp+tGBxAQul2vj5ORkmRrGxg= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.47.0/go.mod h1:PdB0wkmILI+phhoBhWdrrB4LfORT9tHc03OOn+q3dWU= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.47.0 h1:TOjDcFzPkoglwb5sa6+704TXwYgs+XsN5HYc98ksK+M= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.47.0/go.mod h1:ZC7rjqRzdhRKDK223jQ7Tsz89ZtrSSLH/VFzf7k5Sb0= -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/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector v0.49.0 h1:rr2d5SF7ZftByIvSRcY0O3/d1CcJqCKUa2IM4w+jDO4= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector v0.49.0/go.mod h1:KqGde6Vb234azF979c1vjkzDltsWQuXDlwH70UViMPg= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.25.0 h1:4PoDbd/9/06IpwLGxSfvfNoEr9urvfkrN6mmJangGCg= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.25.0/go.mod h1:EycllQ1gupHbjqbcmfCr/H6FKSGSmEUONJ2ivb86qeY= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.49.0 h1:jJKWl98inONJAr/IZrdFQUWcwUO95DLY1XMD1ZIut+g= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.49.0/go.mod h1:l2fIqmwB+FKSfvn3bAD/0i+AXAxhIZjTK2svT/mgUXs= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.49.0 h1:GYUJLfvd++4DMuMhCFLgLXvFwofIxh/qOwoGuS/LTew= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.49.0/go.mod h1:wRbFgBQUVm1YXrvWKofAEmq9HNJTDphbAaJSSX01KUI= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.13.1 h1:vPfJZCkob6yTMEgS+0TwfTUfbHjfy/6vOJ8hUWX/uXE= +github.com/envoyproxy/go-control-plane v0.13.1/go.mod h1:X45hY0mufo6Fd0KW3rqsGvQMw58jvjymeCzBU3mWyHw= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM= +github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -65,8 +75,6 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -75,19 +83,18 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= -github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= +github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= +github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= -github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= -github.com/googleapis/gax-go/v2 v2.12.2 h1:mhN09QQW1jEWeMF74zGR81R30z4VJzjZsfkUhuHF+DA= -github.com/googleapis/gax-go/v2 v2.12.2/go.mod h1:61M8vcyyXR2kqKFxKrfA22jaA8JGF7Dc8App1U3H6jc= +github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= +github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= +github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s= +github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -98,8 +105,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -113,19 +120,13 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -133,67 +134,89 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/tidwall/gjson v1.10.2 h1:APbLGOM0rrEkd8WBw9C24nllro4ajFuJu0Sc9hRz8Bo= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tidwall/gjson v1.10.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tidwall/tinylru v1.1.0 h1:XY6IUfzVTU9rpwdhKUF6nQdChgCdGjkMfLzbWyiau6I= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/tinylru v1.1.0/go.mod h1:3+bX+TJ2baOLMWTnlyNWHh4QMnFyARg2TLTQ6OFbzw8= +github.com/tidwall/tinylru v1.2.1 h1:VgBr72c2IEr+V+pCdkPZUwiQ0KJknnWIYbhxAVkYfQk= +github.com/tidwall/tinylru v1.2.1/go.mod h1:9bQnEduwB6inr2Y7AkBP7JPgCkyrhTV/ZpX0oOOpBI4= github.com/tidwall/wal v1.1.7 h1:emc1TRjIVsdKKSnpwGBAcsAGg0767SvUk8+ygx7Bb+4= github.com/tidwall/wal v1.1.7/go.mod h1:r6lR1j27W9EPalgHiB7zLJDYu3mzW5BQP5KrzBpYY/E= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0 h1:cEPbyTSEHlQR89XVlyo78gqluF8Y3oMeBkXGWzQsfXY= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0/go.mod h1:DKdbWcT4GH1D0Y3Sqt/PFXt2naRKDWtU+eE6oLdFNA8= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 h1:yMkBS9yViCc7U7yeLzJPM2XizlfdVvBRSmsQDWu6qc0= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0/go.mod h1:n8MR6/liuGB5EmTETUBeU5ZgqMOlqKRxUaqPQBOANZ8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -203,16 +226,14 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -222,41 +243,30 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= -golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= +golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= +golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ= +golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -265,33 +275,32 @@ golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.169.0 h1:QwWPy71FgMWqJN/l6jVlFHUa29a7dcUy02I8o799nPY= -google.golang.org/api v0.169.0/go.mod h1:gpNOiMA2tZ4mf5R9Iwf4rK/Dcz0fbdIgWYWVoxmsyLg= +google.golang.org/api v0.204.0 h1:3PjmQQEDkR/ENVZZwIYB4W/KzYtN8OrqnNcHWpeR8E4= +google.golang.org/api v0.204.0/go.mod h1:69y8QSoKIbL9F94bWgWAq6wGqGwyjBgi2y8rAK8zLag= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY= -google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 h1:P8OJ/WCl/Xo4E4zoe4/bifHpSmmKwARqyqE4nW6J2GQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 h1:Q3nlH8iSQSRUwOskjbcSMcF2jiYMNiQYZ0c2KEJLKKU= +google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38/go.mod h1:xBI+tzfqGGN2JBeSebfKXFSdBpWVQ7sLW40PTupVRm4= +google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38 h1:2oV8dfuIkM1Ti7DwXc0BJfnwr9csz4TDXI9EmiI+Rbw= +google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38/go.mod h1:vuAjtvlwkDKF6L1GQ0SokiRLCGFfeBUXWr/aFFkHACc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 h1:zciRKQ4kBpFgpfC5QQCVtnnNAcLIqweL7plyZRQHVpI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/grpc/stats/opentelemetry v0.0.0-20241028142157-ada6787961b3 h1:hUfOButuEtpc0UvYiaYRbNwxVYr0mQQOWq6X8beJ9Gc= +google.golang.org/grpc/stats/opentelemetry v0.0.0-20241028142157-ada6787961b3/go.mod h1:jzYlkSMbKypzuu6xoAEijsNVo9ZeDF1u/zCfFgsx7jg= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -301,10 +310,8 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/exporter/googlecloudexporter/internal/metadata/generated_status.go b/exporter/googlecloudexporter/internal/metadata/generated_status.go index b48a145edc73..7c23b7ab4108 100644 --- a/exporter/googlecloudexporter/internal/metadata/generated_status.go +++ b/exporter/googlecloudexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("googlecloud") + Type = component.MustNewType("googlecloud") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlecloudexporter" ) const ( diff --git a/exporter/googlecloudexporter/internal/metadata/generated_telemetry.go b/exporter/googlecloudexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index b7216c8660c5..000000000000 --- a/exporter/googlecloudexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/googlecloud") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/googlecloud") -} diff --git a/exporter/googlecloudexporter/internal/metadata/generated_telemetry_test.go b/exporter/googlecloudexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index d811e7a7e4be..000000000000 --- a/exporter/googlecloudexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/googlecloud", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/googlecloud", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/googlecloudexporter/metadata.yaml b/exporter/googlecloudexporter/metadata.yaml index 5b212ffc365f..41b9add8065a 100644 --- a/exporter/googlecloudexporter/metadata.yaml +++ b/exporter/googlecloudexporter/metadata.yaml @@ -1,5 +1,4 @@ type: googlecloud -scope_name: otelcol/googlecloud status: class: exporter @@ -7,7 +6,7 @@ status: beta: [traces, metrics, logs] distributions: [contrib] codeowners: - active: [aabmass, dashpole, jsuereth, punya, damemi, psx95] + active: [aabmass, dashpole, jsuereth, punya, psx95] tests: skip_lifecycle: true diff --git a/exporter/googlecloudpubsubexporter/README.md b/exporter/googlecloudpubsubexporter/README.md index ef247ff7962e..3a494927e063 100644 --- a/exporter/googlecloudpubsubexporter/README.md +++ b/exporter/googlecloudpubsubexporter/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fgooglecloudpubsub%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fgooglecloudpubsub) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fgooglecloudpubsub%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fgooglecloudpubsub) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@alexvanboxel](https://www.github.com/alexvanboxel) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib diff --git a/exporter/googlecloudpubsubexporter/config.go b/exporter/googlecloudpubsubexporter/config.go index 4b2979a7d9b1..829e659a6238 100644 --- a/exporter/googlecloudpubsubexporter/config.go +++ b/exporter/googlecloudpubsubexporter/config.go @@ -16,9 +16,9 @@ var topicMatcher = regexp.MustCompile(`^projects/[a-z][a-z0-9\-]*/topics/`) type Config struct { // Timeout for all API calls. If not set, defaults to 12 seconds. - exporterhelper.TimeoutSettings `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. - exporterhelper.QueueSettings `mapstructure:"sending_queue"` - configretry.BackOffConfig `mapstructure:"retry_on_failure"` + TimeoutSettings exporterhelper.TimeoutConfig `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` + configretry.BackOffConfig `mapstructure:"retry_on_failure"` // Google Cloud Project ID where the Pubsub client will connect to ProjectID string `mapstructure:"project"` // User agent that will be used by the Pubsub client to connect to the service @@ -38,7 +38,7 @@ type Config struct { // WatermarkConfig customizes the behavior of the watermark type WatermarkConfig struct { - // Behavior of the watermark. Currently, only of the message (none, earliest and current, current being the default) + // Behavior of the watermark. Currently, only of the message (none, earliest and current, current being the default) // will set the timestamp on pubsub based on timestamps of the events inside the message Behavior string `mapstructure:"behavior"` // Indication on how much the timestamp can drift from the current time, the timestamp will be capped to the allowed diff --git a/exporter/googlecloudpubsubexporter/config_test.go b/exporter/googlecloudpubsubexporter/config_test.go index e50197eebbae..0a7943d000db 100644 --- a/exporter/googlecloudpubsubexporter/config_test.go +++ b/exporter/googlecloudpubsubexporter/config_test.go @@ -25,20 +25,20 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) defaultConfig := factory.CreateDefaultConfig().(*Config) assert.Equal(t, cfg, defaultConfig) sub, err = cm.Sub(component.NewIDWithName(metadata.Type, "customname").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) customConfig := factory.CreateDefaultConfig().(*Config) customConfig.ProjectID = "my-project" customConfig.UserAgent = "opentelemetry-collector-contrib {{version}}" - customConfig.TimeoutSettings = exporterhelper.TimeoutSettings{ + customConfig.TimeoutSettings = exporterhelper.TimeoutConfig{ Timeout: 20 * time.Second, } customConfig.Topic = "projects/my-project/topics/otlp-topic" diff --git a/exporter/googlecloudpubsubexporter/exporter.go b/exporter/googlecloudpubsubexporter/exporter.go index c3c5a0ddacfb..420f98fc70f3 100644 --- a/exporter/googlecloudpubsubexporter/exporter.go +++ b/exporter/googlecloudpubsubexporter/exporter.go @@ -10,7 +10,6 @@ import ( "fmt" "time" - pubsub "cloud.google.com/go/pubsub/apiv1" "cloud.google.com/go/pubsub/apiv1/pubsubpb" "github.com/google/uuid" "go.opentelemetry.io/collector/component" @@ -18,16 +17,13 @@ import ( "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" "go.uber.org/zap" - "google.golang.org/api/option" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" ) const name = "googlecloudpubsub" type pubsubExporter struct { logger *zap.Logger - client *pubsub.PublisherClient + client publisherClient cancel context.CancelFunc userAgent string ceSource string @@ -71,8 +67,7 @@ func (ex *pubsubExporter) start(ctx context.Context, _ component.Host) error { ctx, ex.cancel = context.WithCancel(ctx) if ex.client == nil { - copts := ex.generateClientOptions() - client, err := pubsub.NewPublisherClient(ctx, copts...) + client, err := newPublisherClient(ctx, ex.config, ex.userAgent) if err != nil { return fmt.Errorf("failed creating the gRPC client to Pubsub: %w", err) } @@ -82,31 +77,14 @@ func (ex *pubsubExporter) start(ctx context.Context, _ component.Host) error { return nil } -func (ex *pubsubExporter) shutdown(context.Context) error { - if ex.client != nil { - ex.client.Close() - ex.client = nil +func (ex *pubsubExporter) shutdown(_ context.Context) error { + if ex.client == nil { + return nil } - return nil -} -func (ex *pubsubExporter) generateClientOptions() (copts []option.ClientOption) { - if ex.userAgent != "" { - copts = append(copts, option.WithUserAgent(ex.userAgent)) - } - if ex.config.Endpoint != "" { - if ex.config.Insecure { - var dialOpts []grpc.DialOption - if ex.userAgent != "" { - dialOpts = append(dialOpts, grpc.WithUserAgent(ex.userAgent)) - } - conn, _ := grpc.NewClient(ex.config.Endpoint, append(dialOpts, grpc.WithTransportCredentials(insecure.NewCredentials()))...) - copts = append(copts, option.WithGRPCConn(conn)) - } else { - copts = append(copts, option.WithEndpoint(ex.config.Endpoint)) - } - } - return copts + client := ex.client + ex.client = nil + return client.Close() } func (ex *pubsubExporter) publishMessage(ctx context.Context, encoding encoding, data []byte, watermark time.Time) error { diff --git a/exporter/googlecloudpubsubexporter/exporter_test.go b/exporter/googlecloudpubsubexporter/exporter_test.go index 099af678bcfd..54565cddf203 100644 --- a/exporter/googlecloudpubsubexporter/exporter_test.go +++ b/exporter/googlecloudpubsubexporter/exporter_test.go @@ -16,7 +16,6 @@ import ( "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" - "google.golang.org/api/option" ) func TestName(t *testing.T) { @@ -24,32 +23,6 @@ func TestName(t *testing.T) { assert.Equal(t, "googlecloudpubsub", exporter.Name()) } -func TestGenerateClientOptions(t *testing.T) { - // Start a fake server running locally. - srv := pstest.NewServer() - defer srv.Close() - factory := NewFactory() - cfg := factory.CreateDefaultConfig() - exporterConfig := cfg.(*Config) - exporterConfig.Endpoint = srv.Addr - exporterConfig.UserAgent = "test-user-agent" - exporterConfig.Insecure = true - exporterConfig.ProjectID = "my-project" - exporterConfig.Topic = "projects/my-project/topics/otlp" - exporterConfig.TimeoutSettings = exporterhelper.TimeoutSettings{ - Timeout: 12 * time.Second, - } - exporter := ensureExporter(exportertest.NewNopCreateSettings(), exporterConfig) - - options := exporter.generateClientOptions() - assert.Equal(t, option.WithUserAgent("test-user-agent"), options[0]) - - exporter.config.Insecure = false - options = exporter.generateClientOptions() - assert.Equal(t, option.WithUserAgent("test-user-agent"), options[0]) - assert.Equal(t, option.WithEndpoint(srv.Addr), options[1]) -} - func TestExporterDefaultSettings(t *testing.T) { ctx := context.Background() // Start a fake server running locally. @@ -67,10 +40,10 @@ func TestExporterDefaultSettings(t *testing.T) { exporterConfig.Insecure = true exporterConfig.ProjectID = "my-project" exporterConfig.Topic = "projects/my-project/topics/otlp" - exporterConfig.TimeoutSettings = exporterhelper.TimeoutSettings{ + exporterConfig.TimeoutSettings = exporterhelper.TimeoutConfig{ Timeout: 12 * time.Second, } - exporter := ensureExporter(exportertest.NewNopCreateSettings(), exporterConfig) + exporter := ensureExporter(exportertest.NewNopSettings(), exporterConfig) assert.NoError(t, exporter.start(ctx, nil)) assert.NoError(t, exporter.consumeTraces(ctx, ptrace.NewTraces())) assert.NoError(t, exporter.consumeMetrics(ctx, pmetric.NewMetrics())) @@ -96,11 +69,11 @@ func TestExporterCompression(t *testing.T) { exporterConfig.Insecure = true exporterConfig.ProjectID = "my-project" exporterConfig.Topic = "projects/my-project/topics/otlp" - exporterConfig.TimeoutSettings = exporterhelper.TimeoutSettings{ + exporterConfig.TimeoutSettings = exporterhelper.TimeoutConfig{ Timeout: 12 * time.Second, } exporterConfig.Compression = "gzip" - exporter := ensureExporter(exportertest.NewNopCreateSettings(), exporterConfig) + exporter := ensureExporter(exportertest.NewNopSettings(), exporterConfig) assert.NoError(t, exporter.start(ctx, nil)) assert.NoError(t, exporter.consumeTraces(ctx, ptrace.NewTraces())) assert.NoError(t, exporter.consumeMetrics(ctx, pmetric.NewMetrics())) diff --git a/exporter/googlecloudpubsubexporter/factory.go b/exporter/googlecloudpubsubexporter/factory.go index 147bb8cf7207..3ee84921ff9e 100644 --- a/exporter/googlecloudpubsubexporter/factory.go +++ b/exporter/googlecloudpubsubexporter/factory.go @@ -38,7 +38,7 @@ func NewFactory() exporter.Factory { var exporters = map[*Config]*pubsubExporter{} -func ensureExporter(params exporter.CreateSettings, pCfg *Config) *pubsubExporter { +func ensureExporter(params exporter.Settings, pCfg *Config) *pubsubExporter { receiver := exporters[pCfg] if receiver != nil { return receiver @@ -73,7 +73,7 @@ func ensureExporter(params exporter.CreateSettings, pCfg *Config) *pubsubExporte func createDefaultConfig() component.Config { return &Config{ UserAgent: "opentelemetry-collector-contrib {{version}}", - TimeoutSettings: exporterhelper.TimeoutSettings{Timeout: defaultTimeout}, + TimeoutSettings: exporterhelper.TimeoutConfig{Timeout: defaultTimeout}, Watermark: WatermarkConfig{ Behavior: "current", AllowedDrift: 0, @@ -83,13 +83,13 @@ func createDefaultConfig() component.Config { func createTracesExporter( ctx context.Context, - set exporter.CreateSettings, - cfg component.Config) (exporter.Traces, error) { - + set exporter.Settings, + cfg component.Config, +) (exporter.Traces, error) { pCfg := cfg.(*Config) pubsubExporter := ensureExporter(set, pCfg) - return exporterhelper.NewTracesExporter( + return exporterhelper.NewTraces( ctx, set, cfg, @@ -105,12 +105,12 @@ func createTracesExporter( func createMetricsExporter( ctx context.Context, - set exporter.CreateSettings, - cfg component.Config) (exporter.Metrics, error) { - + set exporter.Settings, + cfg component.Config, +) (exporter.Metrics, error) { pCfg := cfg.(*Config) pubsubExporter := ensureExporter(set, pCfg) - return exporterhelper.NewMetricsExporter( + return exporterhelper.NewMetrics( ctx, set, cfg, @@ -126,13 +126,13 @@ func createMetricsExporter( func createLogsExporter( ctx context.Context, - set exporter.CreateSettings, - cfg component.Config) (exporter.Logs, error) { - + set exporter.Settings, + cfg component.Config, +) (exporter.Logs, error) { pCfg := cfg.(*Config) pubsubExporter := ensureExporter(set, pCfg) - return exporterhelper.NewLogsExporter( + return exporterhelper.NewLogs( ctx, set, cfg, diff --git a/exporter/googlecloudpubsubexporter/factory_test.go b/exporter/googlecloudpubsubexporter/factory_test.go index 399e17291606..5ff0bf8ffe84 100644 --- a/exporter/googlecloudpubsubexporter/factory_test.go +++ b/exporter/googlecloudpubsubexporter/factory_test.go @@ -26,30 +26,30 @@ func TestType(t *testing.T) { assert.Equal(t, metadata.Type, factory.Type()) } -func TestCreateTracesExporter(t *testing.T) { +func TestCreateTraces(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() eCfg := cfg.(*Config) eCfg.Endpoint = "http://testing.invalid" - te, err := factory.CreateTracesExporter( + te, err := factory.CreateTraces( context.Background(), - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), eCfg, ) assert.NoError(t, err) assert.NotNil(t, te, "failed to create trace exporter") } -func TestCreateMetricsExporter(t *testing.T) { +func TestCreateMetrics(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() eCfg := cfg.(*Config) eCfg.Endpoint = "http://testing.invalid" - me, err := factory.CreateMetricsExporter( + me, err := factory.CreateMetrics( context.Background(), - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), eCfg, ) assert.NoError(t, err) @@ -62,9 +62,9 @@ func TestLogsCreateExporter(t *testing.T) { eCfg := cfg.(*Config) eCfg.Endpoint = "http://testing.invalid" - me, err := factory.CreateLogsExporter( + me, err := factory.CreateLogs( context.Background(), - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), eCfg, ) assert.NoError(t, err) @@ -77,7 +77,7 @@ func TestEnsureExporter(t *testing.T) { eCfg := cfg.(*Config) eCfg.Endpoint = "http://testing.invalid" - exporter1 := ensureExporter(exportertest.NewNopCreateSettings(), eCfg) - exporter2 := ensureExporter(exportertest.NewNopCreateSettings(), eCfg) + exporter1 := ensureExporter(exportertest.NewNopSettings(), eCfg) + exporter2 := ensureExporter(exportertest.NewNopSettings(), eCfg) assert.Equal(t, exporter1, exporter2) } diff --git a/exporter/googlecloudpubsubexporter/generated_component_test.go b/exporter/googlecloudpubsubexporter/generated_component_test.go index b4df5abb725d..38b560760989 100644 --- a/exporter/googlecloudpubsubexporter/generated_component_test.go +++ b/exporter/googlecloudpubsubexporter/generated_component_test.go @@ -32,27 +32,27 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, { name: "metrics", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg) }, }, { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -64,9 +64,9 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) diff --git a/exporter/googlecloudpubsubexporter/generated_package_test.go b/exporter/googlecloudpubsubexporter/generated_package_test.go index 4ef5c9f0b7f2..d2986bed895b 100644 --- a/exporter/googlecloudpubsubexporter/generated_package_test.go +++ b/exporter/googlecloudpubsubexporter/generated_package_test.go @@ -3,11 +3,11 @@ package googlecloudpubsubexporter import ( - "os" "testing" + + "go.uber.org/goleak" ) func TestMain(m *testing.M) { - // skipping goleak test as per metadata.yml configuration - os.Exit(m.Run()) + goleak.VerifyTestMain(m, goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start")) } diff --git a/exporter/googlecloudpubsubexporter/go.mod b/exporter/googlecloudpubsubexporter/go.mod index 433942b9591f..6eec58a28f4d 100644 --- a/exporter/googlecloudpubsubexporter/go.mod +++ b/exporter/googlecloudpubsubexporter/go.mod @@ -1,82 +1,88 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlecloudpubsubexporter -go 1.21.0 +go 1.22.0 require ( - cloud.google.com/go/pubsub v1.38.0 + cloud.google.com/go/pubsub v1.45.3 github.com/google/uuid v1.6.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/googleapis/gax-go/v2 v2.14.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 - google.golang.org/api v0.182.0 - google.golang.org/grpc v1.64.0 + google.golang.org/api v0.210.0 + google.golang.org/grpc v1.68.1 ) require ( - cloud.google.com/go v0.114.0 // indirect - cloud.google.com/go/auth v0.4.2 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.2 // indirect - cloud.google.com/go/compute/metadata v0.3.0 // indirect - cloud.google.com/go/iam v1.1.7 // indirect - github.com/beorn7/perks v1.0.1 // indirect + cloud.google.com/go v0.116.0 // indirect + cloud.google.com/go/auth v0.11.0 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.6 // indirect + cloud.google.com/go/compute/metadata v0.5.2 // indirect + cloud.google.com/go/iam v1.2.2 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.4 // indirect github.com/google/go-cmp v0.6.0 // indirect - github.com/google/s2a-go v0.1.7 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.4 // indirect + github.com/google/s2a-go v0.1.8 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.einride.tech/aip v0.67.1 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + go.einride.tech/aip v0.68.0 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.23.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/oauth2 v0.20.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - golang.org/x/time v0.5.0 // indirect - google.golang.org/genproto v0.0.0-20240401170217-c3f982113cda // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240521202816-d264139d666e // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/oauth2 v0.24.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + golang.org/x/time v0.8.0 // indirect + google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241113202542-65e8d215514f // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/googlecloudpubsubexporter/go.sum b/exporter/googlecloudpubsubexporter/go.sum index 6eaefe269fb3..47bf16c66eb2 100644 --- a/exporter/googlecloudpubsubexporter/go.sum +++ b/exporter/googlecloudpubsubexporter/go.sum @@ -1,24 +1,20 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.114.0 h1:OIPFAdfrFDFO2ve2U7r/H5SwSbBzEdrBdE7xkgwc+kY= -cloud.google.com/go v0.114.0/go.mod h1:ZV9La5YYxctro1HTPug5lXH/GefROyW8PPD4T8n9J8E= -cloud.google.com/go/auth v0.4.2 h1:sb0eyLkhRtpq5jA+a8KWw0W70YcdVca7KJ8TM0AFYDg= -cloud.google.com/go/auth v0.4.2/go.mod h1:Kqvlz1cf1sNA0D+sYJnkPQOP+JMHkuHeIgVmCRtZOLc= -cloud.google.com/go/auth/oauth2adapt v0.2.2 h1:+TTV8aXpjeChS9M+aTtN/TjdQnzJvmzKFt//oWu7HX4= -cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q= -cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= -cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/iam v1.1.7 h1:z4VHOhwKLF/+UYXAJDFwGtNF0b6gjsW1Pk9Ml0U/IoM= -cloud.google.com/go/iam v1.1.7/go.mod h1:J4PMPg8TtyurAUvSmPj8FF3EDgY1SPRZxcUGrn7WXGA= -cloud.google.com/go/pubsub v1.38.0 h1:J1OT7h51ifATIedjqk/uBNPh+1hkvUaH4VKbz4UuAsc= -cloud.google.com/go/pubsub v1.38.0/go.mod h1:IPMJSWSus/cu57UyR01Jqa/bNOQA+XnPF6Z4dKW4fAA= +cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE= +cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U= +cloud.google.com/go/auth v0.11.0 h1:Ic5SZz2lsvbYcWT5dfjNWgw6tTlGi2Wc8hyQSC9BstA= +cloud.google.com/go/auth v0.11.0/go.mod h1:xxA5AqpDrvS+Gkmo9RqrGGRh6WSNKKOXhY3zNOr38tI= +cloud.google.com/go/auth/oauth2adapt v0.2.6 h1:V6a6XDu2lTwPZWOawrAa9HUK+DB2zfJyTuciBG5hFkU= +cloud.google.com/go/auth/oauth2adapt v0.2.6/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8= +cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo= +cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k= +cloud.google.com/go/iam v1.2.2 h1:ozUSofHUGf/F4tCNy/mu9tHLTaxZFLOUiKzjcgWHGIA= +cloud.google.com/go/iam v1.2.2/go.mod h1:0Ys8ccaZHdI1dEUilwzqng/6ps2YB6vRsjIe00/+6JY= +cloud.google.com/go/pubsub v1.45.3 h1:prYj8EEAAAwkp6WNoGTE4ahe0DgHoyJd5Pbop931zow= +cloud.google.com/go/pubsub v1.45.3/go.mod h1:cGyloK/hXC4at7smAtxFnXprKEFTqmMXNNd9w+bd94Q= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -31,12 +27,12 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -64,15 +60,17 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= -github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= +github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= +github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= -github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= -github.com/googleapis/gax-go/v2 v2.12.4 h1:9gWcmF85Wvq4ryPFvGFaOgPIs1AQX0d0bcbGw4Z96qg= -github.com/googleapis/gax-go/v2 v2.12.4/go.mod h1:KYEYLorsnIGDi/rPC8b5TdlB9kbKoFubselGIoBMCwI= +github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= +github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= +github.com/googleapis/gax-go/v2 v2.14.0 h1:f+jMrjBPl+DL9nI4IQzLUxMq7XrAqFYB7hBPqMNIe8o= +github.com/googleapis/gax-go/v2 v2.14.0/go.mod h1:lhBCnjdLrWRaPvLWhmc8IS24m9mr07qSYnHncrgo+zk= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -81,8 +79,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -98,17 +96,9 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -116,52 +106,74 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.einride.tech/aip v0.67.1 h1:d/4TW92OxXBngkSOwWS2CH5rez869KpKMaN44mdxkFI= -go.einride.tech/aip v0.67.1/go.mod h1:ZGX4/zKw8dcgzdLsrvpOOGxfxI2QSk12SlP7d6c0/XI= +go.einride.tech/aip v0.68.0 h1:4seM66oLzTpz50u4K1zlJyOXQ3tCzcJN7I22tKkjipw= +go.einride.tech/aip v0.68.0/go.mod h1:7y9FF8VtPWqpxuAxl0KQWqaULxW4zFIesD6zF5RIHHg= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -171,8 +183,8 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -188,30 +200,30 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= -golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg= +golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -224,26 +236,26 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.182.0 h1:if5fPvudRQ78GeRx3RayIoiuV7modtErPIZC/T2bIvE= -google.golang.org/api v0.182.0/go.mod h1:cGhjy4caqA5yXRzEhkHI8Y9mfyC2VLTlER2l08xaqtM= +google.golang.org/api v0.210.0 h1:HMNffZ57OoZCRYSbdWVRoqOa8V8NIHLL0CzdBPLztWk= +google.golang.org/api v0.210.0/go.mod h1:B9XDZGnx2NtyjzVkOVTGrFSAVZgPcbedzKg/gTLwqBs= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20240401170217-c3f982113cda h1:wu/KJm9KJwpfHWhkkZGohVC6KRrc1oJNr4jwtQMOQXw= -google.golang.org/genproto v0.0.0-20240401170217-c3f982113cda/go.mod h1:g2LLCvCeCSir/JJSWosk19BR4NVxGqHUC6rxIRsd7Aw= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 h1:P8OJ/WCl/Xo4E4zoe4/bifHpSmmKwARqyqE4nW6J2GQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240521202816-d264139d666e h1:Elxv5MwEkCI9f5SkoL6afed6NTdxaGoAo39eANBwHL8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240521202816-d264139d666e/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 h1:ToEetK57OidYuqD4Q5w+vfEnPvPpuTwedCNVohYJfNk= +google.golang.org/genproto v0.0.0-20241118233622-e639e219e697/go.mod h1:JJrvXBWRZaFMxBufik1a4RpFw4HhgVtBBWQeQgUj2cc= +google.golang.org/genproto/googleapis/api v0.0.0-20241113202542-65e8d215514f h1:M65LEviCfuZTfrfzwwEoxVtgvfkFkBUbFnRbxCXuXhU= +google.golang.org/genproto/googleapis/api v0.0.0-20241113202542-65e8d215514f/go.mod h1:Yo94eF2nj7igQt+TiJ49KxjIH8ndLYPZMIRSiRcEbg0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697 h1:LWZqQOEjDyONlF1H6afSWpAL/znlREo2tHfLoe+8LMA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -253,8 +265,8 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/exporter/googlecloudpubsubexporter/internal/metadata/generated_status.go b/exporter/googlecloudpubsubexporter/internal/metadata/generated_status.go index 9052674aaa72..71d64c591845 100644 --- a/exporter/googlecloudpubsubexporter/internal/metadata/generated_status.go +++ b/exporter/googlecloudpubsubexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("googlecloudpubsub") + Type = component.MustNewType("googlecloudpubsub") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlecloudpubsubexporter" ) const ( diff --git a/exporter/googlecloudpubsubexporter/internal/metadata/generated_telemetry.go b/exporter/googlecloudpubsubexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index 0e5165be7520..000000000000 --- a/exporter/googlecloudpubsubexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/googlecloudpubsub") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/googlecloudpubsub") -} diff --git a/exporter/googlecloudpubsubexporter/internal/metadata/generated_telemetry_test.go b/exporter/googlecloudpubsubexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 3ae9eadd3581..000000000000 --- a/exporter/googlecloudpubsubexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/googlecloudpubsub", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/googlecloudpubsub", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/googlecloudpubsubexporter/metadata.yaml b/exporter/googlecloudpubsubexporter/metadata.yaml index d15ce4de6d3e..49a90e104b92 100644 --- a/exporter/googlecloudpubsubexporter/metadata.yaml +++ b/exporter/googlecloudpubsubexporter/metadata.yaml @@ -1,5 +1,4 @@ type: googlecloudpubsub -scope_name: otelcol/googlecloudpubsub status: class: exporter @@ -13,4 +12,7 @@ status: tests: skip_lifecycle: true goleak: - skip: true + ignore: + top: + # See https://github.com/census-instrumentation/opencensus-go/issues/1191 for more information. + - "go.opencensus.io/stats/view.(*worker).start" diff --git a/exporter/googlecloudpubsubexporter/publisher_client.go b/exporter/googlecloudpubsubexporter/publisher_client.go new file mode 100644 index 000000000000..959136ef5649 --- /dev/null +++ b/exporter/googlecloudpubsubexporter/publisher_client.go @@ -0,0 +1,82 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package googlecloudpubsubexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlecloudpubsubexporter" + +import ( + "context" + "fmt" + + pubsub "cloud.google.com/go/pubsub/apiv1" + "cloud.google.com/go/pubsub/apiv1/pubsubpb" + "github.com/googleapis/gax-go/v2" + "google.golang.org/api/option" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" +) + +// publisherClient subset of `pubsub.PublisherClient` +type publisherClient interface { + Close() error + Publish(ctx context.Context, req *pubsubpb.PublishRequest, opts ...gax.CallOption) (*pubsubpb.PublishResponse, error) +} + +// wrappedPublisherClient allows to override the close function +type wrappedPublisherClient struct { + publisherClient + closeFn func() error +} + +func (c *wrappedPublisherClient) Close() error { + if c.closeFn != nil { + return c.closeFn() + } + return c.publisherClient.Close() +} + +func newPublisherClient(ctx context.Context, config *Config, userAgent string) (publisherClient, error) { + clientOptions, closeFn, err := generateClientOptions(config, userAgent) + if err != nil { + return nil, fmt.Errorf("failed preparing the gRPC client options to PubSub: %w", err) + } + + client, err := pubsub.NewPublisherClient(ctx, clientOptions...) + if err != nil { + return nil, fmt.Errorf("failed creating the gRPC client to PubSub: %w", err) + } + + if closeFn == nil { + return client, nil + } + + return &wrappedPublisherClient{ + publisherClient: client, + closeFn: closeFn, + }, nil +} + +func generateClientOptions(config *Config, userAgent string) ([]option.ClientOption, func() error, error) { + var copts []option.ClientOption + var closeFn func() error + + if userAgent != "" { + copts = append(copts, option.WithUserAgent(userAgent)) + } + if config.Endpoint != "" { + if config.Insecure { + var dialOpts []grpc.DialOption + if userAgent != "" { + dialOpts = append(dialOpts, grpc.WithUserAgent(userAgent)) + } + client, err := grpc.NewClient(config.Endpoint, append(dialOpts, grpc.WithTransportCredentials(insecure.NewCredentials()))...) + if err != nil { + return nil, nil, err + } + copts = append(copts, option.WithGRPCConn(client)) + closeFn = client.Close // we need to be able to properly close the grpc client otherwise it'll leak goroutines + } else { + copts = append(copts, option.WithEndpoint(config.Endpoint)) + } + } + return copts, closeFn, nil +} diff --git a/exporter/googlecloudpubsubexporter/publisher_client_test.go b/exporter/googlecloudpubsubexporter/publisher_client_test.go new file mode 100644 index 000000000000..ff3370a5f264 --- /dev/null +++ b/exporter/googlecloudpubsubexporter/publisher_client_test.go @@ -0,0 +1,126 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package googlecloudpubsubexporter + +import ( + "context" + "testing" + + pubsub "cloud.google.com/go/pubsub/apiv1" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/api/option" +) + +func TestGenerateClientOptions(t *testing.T) { + factory := NewFactory() + + t.Run("defaults", func(t *testing.T) { + cfg := factory.CreateDefaultConfig().(*Config) + cfg.ProjectID = "my-project" + cfg.Topic = "projects/my-project/topics/otlp" + + require.NoError(t, cfg.Validate()) + + gotOptions, closeConnFn, err := generateClientOptions(cfg, "test-user-agent 6789") + assert.NoError(t, err) + assert.Empty(t, closeConnFn) + + expectedOptions := []option.ClientOption{ + option.WithUserAgent("test-user-agent 6789"), + } + assert.ElementsMatch(t, expectedOptions, gotOptions) + }) + + t.Run("secure custom endpoint", func(t *testing.T) { + cfg := factory.CreateDefaultConfig().(*Config) + cfg.ProjectID = "my-project" + cfg.Topic = "projects/my-project/topics/otlp" + cfg.Endpoint = "defg" + + require.NoError(t, cfg.Validate()) + + gotOptions, closeConnFn, err := generateClientOptions(cfg, "test-user-agent 4321") + assert.NoError(t, err) + assert.Empty(t, closeConnFn) + + expectedOptions := []option.ClientOption{ + option.WithUserAgent("test-user-agent 4321"), + option.WithEndpoint("defg"), + } + assert.ElementsMatch(t, expectedOptions, gotOptions) + }) + + t.Run("insecure endpoint", func(t *testing.T) { + cfg := factory.CreateDefaultConfig().(*Config) + cfg.ProjectID = "my-project" + cfg.Topic = "projects/my-project/topics/otlp" + cfg.Endpoint = "abcd" + cfg.Insecure = true + + require.NoError(t, cfg.Validate()) + + gotOptions, closeConnFn, err := generateClientOptions(cfg, "test-user-agent 1234") + assert.NoError(t, err) + assert.NotEmpty(t, closeConnFn) + assert.NoError(t, closeConnFn()) + + require.Len(t, gotOptions, 2) + assert.Equal(t, option.WithUserAgent("test-user-agent 1234"), gotOptions[0]) + assert.IsType(t, option.WithGRPCConn(nil), gotOptions[1]) + }) +} + +func TestNewPublisherClient(t *testing.T) { + // The publisher client checks for credentials during init + t.Setenv("GOOGLE_APPLICATION_CREDENTIALS", "testdata/gcp-fake-creds.json") + + ctx := context.Background() + factory := NewFactory() + + t.Run("defaults", func(t *testing.T) { + cfg := factory.CreateDefaultConfig().(*Config) + cfg.ProjectID = "my-project" + cfg.Topic = "projects/my-project/topics/otlp" + + require.NoError(t, cfg.Validate()) + + client, err := newPublisherClient(ctx, cfg, "test-user-agent 6789") + assert.NoError(t, err) + require.NotEmpty(t, client) + assert.IsType(t, &pubsub.PublisherClient{}, client) + assert.NoError(t, client.Close()) + }) + + t.Run("secure custom endpoint", func(t *testing.T) { + cfg := factory.CreateDefaultConfig().(*Config) + cfg.ProjectID = "my-project" + cfg.Topic = "projects/my-project/topics/otlp" + cfg.Endpoint = "xyz" + + require.NoError(t, cfg.Validate()) + + client, err := newPublisherClient(ctx, cfg, "test-user-agent 6789") + assert.NoError(t, err) + require.NotEmpty(t, client) + assert.IsType(t, &pubsub.PublisherClient{}, client) + assert.NoError(t, client.Close()) + }) + + t.Run("insecure endpoint", func(t *testing.T) { + cfg := factory.CreateDefaultConfig().(*Config) + cfg.ProjectID = "my-project" + cfg.Topic = "projects/my-project/topics/otlp" + cfg.Endpoint = "abc" + cfg.Insecure = true + + require.NoError(t, cfg.Validate()) + + client, err := newPublisherClient(ctx, cfg, "test-user-agent 6789") + assert.NoError(t, err) + require.NotEmpty(t, client) + assert.IsType(t, &wrappedPublisherClient{}, client) + assert.NoError(t, client.Close()) + }) +} diff --git a/exporter/googlecloudpubsubexporter/testdata/gcp-fake-creds.json b/exporter/googlecloudpubsubexporter/testdata/gcp-fake-creds.json new file mode 100644 index 000000000000..f3eac606f048 --- /dev/null +++ b/exporter/googlecloudpubsubexporter/testdata/gcp-fake-creds.json @@ -0,0 +1,9 @@ +{ + "type": "service_account", + "private_key_id": "abc", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDY3E8o1NEFcjMM\nHW/5ZfFJw29/8NEqpViNjQIx95Xx5KDtJ+nWn9+OW0uqsSqKlKGhAdAo+Q6bjx2c\nuXVsXTu7XrZUY5Kltvj94DvUa1wjNXs606r/RxWTJ58bfdC+gLLxBfGnB6CwK0YQ\nxnfpjNbkUfVVzO0MQD7UP0Hl5ZcY0Puvxd/yHuONQn/rIAieTHH1pqgW+zrH/y3c\n59IGThC9PPtugI9ea8RSnVj3PWz1bX2UkCDpy9IRh9LzJLaYYX9RUd7++dULUlat\nAaXBh1U6emUDzhrIsgApjDVtimOPbmQWmX1S60mqQikRpVYZ8u+NDD+LNw+/Eovn\nxCj2Y3z1AgMBAAECggEAWDBzoqO1IvVXjBA2lqId10T6hXmN3j1ifyH+aAqK+FVl\nGjyWjDj0xWQcJ9ync7bQ6fSeTeNGzP0M6kzDU1+w6FgyZqwdmXWI2VmEizRjwk+/\n/uLQUcL7I55Dxn7KUoZs/rZPmQDxmGLoue60Gg6z3yLzVcKiDc7cnhzhdBgDc8vd\nQorNAlqGPRnm3EqKQ6VQp6fyQmCAxrr45kspRXNLddat3AMsuqImDkqGKBmF3Q1y\nxWGe81LphUiRqvqbyUlh6cdSZ8pLBpc9m0c3qWPKs9paqBIvgUPlvOZMqec6x4S6\nChbdkkTRLnbsRr0Yg/nDeEPlkhRBhasXpxpMUBgPywKBgQDs2axNkFjbU94uXvd5\nznUhDVxPFBuxyUHtsJNqW4p/ujLNimGet5E/YthCnQeC2P3Ym7c3fiz68amM6hiA\nOnW7HYPZ+jKFnefpAtjyOOs46AkftEg07T9XjwWNPt8+8l0DYawPoJgbM5iE0L2O\nx8TU1Vs4mXc+ql9F90GzI0x3VwKBgQDqZOOqWw3hTnNT07Ixqnmd3dugV9S7eW6o\nU9OoUgJB4rYTpG+yFqNqbRT8bkx37iKBMEReppqonOqGm4wtuRR6LSLlgcIU9Iwx\nyfH12UWqVmFSHsgZFqM/cK3wGev38h1WBIOx3/djKn7BdlKVh8kWyx6uC8bmV+E6\nOoK0vJD6kwKBgHAySOnROBZlqzkiKW8c+uU2VATtzJSydrWm0J4wUPJifNBa/hVW\ndcqmAzXC9xznt5AVa3wxHBOfyKaE+ig8CSsjNyNZ3vbmr0X04FoV1m91k2TeXNod\njMTobkPThaNm4eLJMN2SQJuaHGTGERWC0l3T18t+/zrDMDCPiSLX1NAvAoGBAN1T\nVLJYdjvIMxf1bm59VYcepbK7HLHFkRq6xMJMZbtG0ryraZjUzYvB4q4VjHk2UDiC\nlhx13tXWDZH7MJtABzjyg+AI7XWSEQs2cBXACos0M4Myc6lU+eL+iA+OuoUOhmrh\nqmT8YYGu76/IBWUSqWuvcpHPpwl7871i4Ga/I3qnAoGBANNkKAcMoeAbJQK7a/Rn\nwPEJB+dPgNDIaboAsh1nZhVhN5cvdvCWuEYgOGCPQLYQF0zmTLcM+sVxOYgfy8mV\nfbNgPgsP5xmu6dw2COBKdtozw0HrWSRjACd1N4yGu75+wPCcX/gQarcjRcXXZeEa\nNtBLSfcqPULqD+h7br9lEJio\n-----END PRIVATE KEY-----\n", + "client_email": "123-abc@developer.gserviceaccount.com", + "client_id": "123-abc.apps.googleusercontent.com", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "http://localhost:8080/token" +} \ No newline at end of file diff --git a/exporter/googlecloudpubsubexporter/watermark.go b/exporter/googlecloudpubsubexporter/watermark.go index d363fa40b8fd..66997204832f 100644 --- a/exporter/googlecloudpubsubexporter/watermark.go +++ b/exporter/googlecloudpubsubexporter/watermark.go @@ -12,9 +12,11 @@ import ( "go.opentelemetry.io/collector/pdata/ptrace" ) -type metricsWatermarkFunc func(metrics pmetric.Metrics, processingTime time.Time, allowedDrift time.Duration) time.Time -type logsWatermarkFunc func(logs plog.Logs, processingTime time.Time, allowedDrift time.Duration) time.Time -type tracesWatermarkFunc func(traces ptrace.Traces, processingTime time.Time, allowedDrift time.Duration) time.Time +type ( + metricsWatermarkFunc func(metrics pmetric.Metrics, processingTime time.Time, allowedDrift time.Duration) time.Time + logsWatermarkFunc func(logs plog.Logs, processingTime time.Time, allowedDrift time.Duration) time.Time + tracesWatermarkFunc func(traces ptrace.Traces, processingTime time.Time, allowedDrift time.Duration) time.Time +) type collectFunc func(timestamp pcommon.Timestamp) bool diff --git a/exporter/googlemanagedprometheusexporter/README.md b/exporter/googlemanagedprometheusexporter/README.md index 2bf8eaceff1c..edac0117be2e 100644 --- a/exporter/googlemanagedprometheusexporter/README.md +++ b/exporter/googlemanagedprometheusexporter/README.md @@ -6,14 +6,18 @@ | Stability | [beta]: metrics | | Distributions | [contrib] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fgooglemanagedprometheus%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fgooglemanagedprometheus) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fgooglemanagedprometheus%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fgooglemanagedprometheus) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@aabmass](https://www.github.com/aabmass), [@dashpole](https://www.github.com/dashpole), [@jsuereth](https://www.github.com/jsuereth), [@punya](https://www.github.com/punya), [@damemi](https://www.github.com/damemi), [@psx95](https://www.github.com/psx95) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@aabmass](https://www.github.com/aabmass), [@dashpole](https://www.github.com/dashpole), [@jsuereth](https://www.github.com/jsuereth), [@punya](https://www.github.com/punya), [@psx95](https://www.github.com/psx95) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib This exporter can be used to send metrics (including trace exemplars) to [Google Cloud Managed Service for Prometheus](https://cloud.google.com/stackdriver/docs/managed-prometheus). It is one of [several supported approaches for sending metrics to Google Cloud Managed Service for Prometheus](https://cloud.google.com/stackdriver/docs/managed-prometheus#gmp-data-collection). +To learn more about instrumentation and observability, including opinionated recommendations +for Google Cloud Observability, visit [Instrumentation and +observability](https://cloud.google.com/stackdriver/docs/instrumentation/overview). + ## Configuration Reference The following configuration options are supported: @@ -111,7 +115,7 @@ service: pipelines: metrics: receivers: [prometheus] - processors: [batch, memory_limiter, transform, resourcedetection] + processors: [memory_limiter, batch, transform, resourcedetection] exporters: [googlemanagedprometheus] ``` @@ -185,11 +189,11 @@ processors: ## Feature-gates -- `exporter.googlemanagedpromethues.intToDouble`: `Default=false` Change all metric datapoint type to double +- `exporter.googlemanagedprometheus.intToDouble`: `Default=false` Change all metric datapoint type to double to prevent `Value type for metric conflicts with the existing value type` errors: ```shell -"--feature-gates=exporter.googlemanagedpromethues.intToDouble" +"--feature-gates=exporter.googlemanagedprometheus.intToDouble" ``` ## Troubleshooting @@ -280,13 +284,21 @@ logic from OpenTelemetry resource to Google Cloud's `prometheus_target` monitored resouce didn't preserve a resource attribute that was needed to distinguish timeseries. This can be mitigated by adding resource attributes as metric labels using `resource_filters` configuration in the -exporter: +exporter. The following example adds common identifying resource attributes. +You may need to expand this list with other resource attributes to fix +duplicate timeseries errors: ```yaml googlemanagedprometheus: metric: resource_filters: - regex: ".*" + - prefix: "cloud" + - prefix: "k8s" + - prefix: "faas" + - regex: "container.id" + - regex: "process.pid" + - regex: "host.name" + - regex: "host.id" ``` If you need to troubleshoot errors further, start by filtering down to a single diff --git a/exporter/googlemanagedprometheusexporter/config.go b/exporter/googlemanagedprometheusexporter/config.go index 41708ad3b93f..207ecf778c64 100644 --- a/exporter/googlemanagedprometheusexporter/config.go +++ b/exporter/googlemanagedprometheusexporter/config.go @@ -9,6 +9,9 @@ import ( "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector" "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector/googlemanagedprometheus" "go.opentelemetry.io/collector/exporter/exporterhelper" + "go.opentelemetry.io/collector/pdata/pmetric" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus" ) // Config defines configuration for Google Cloud Managed Service for Prometheus exporter. @@ -16,8 +19,8 @@ type Config struct { GMPConfig `mapstructure:",squash"` // Timeout for all API calls. If not set, defaults to 12 seconds. - exporterhelper.TimeoutSettings `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. - exporterhelper.QueueSettings `mapstructure:"sending_queue"` + TimeoutSettings exporterhelper.TimeoutConfig `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` } // GMPConfig is a subset of the collector config applicable to the GMP exporter. @@ -34,12 +37,18 @@ type MetricConfig struct { ClientConfig collector.ClientConfig `mapstructure:",squash"` Config googlemanagedprometheus.Config `mapstructure:",squash"` ResourceFilters []collector.ResourceFilter `mapstructure:"resource_filters"` + // CumulativeNormalization normalizes cumulative metrics without start times or with + // explicit reset points by subtracting subsequent points from the initial point. + // It is enabled by default. Since it caches starting points, it may result in + // increased memory usage. + CumulativeNormalization bool `mapstructure:"cumulative_normalization"` } func (c *GMPConfig) toCollectorConfig() collector.Config { // start with whatever the default collector config is. cfg := collector.DefaultConfig() cfg.MetricConfig.Prefix = c.MetricConfig.Prefix + cfg.MetricConfig.CumulativeNormalization = c.MetricConfig.CumulativeNormalization if c.MetricConfig.Prefix == "" { cfg.MetricConfig.Prefix = "prometheus.googleapis.com" } @@ -47,7 +56,10 @@ func (c *GMPConfig) toCollectorConfig() collector.Config { cfg.MetricConfig.InstrumentationLibraryLabels = false cfg.MetricConfig.ServiceResourceLabels = false // Update metric naming to match GMP conventions - cfg.MetricConfig.GetMetricName = c.MetricConfig.Config.GetMetricName + cfg.MetricConfig.GetMetricName = func(baseName string, metric pmetric.Metric) (string, error) { + compliantName := prometheus.BuildCompliantName(metric, "", c.MetricConfig.Config.AddMetricSuffixes) + return googlemanagedprometheus.GetMetricName(baseName, compliantName, metric) + } // Map to the prometheus_target monitored resource cfg.MetricConfig.MapMonitoredResource = c.MetricConfig.Config.MapToPrometheusTarget cfg.MetricConfig.ExtraMetrics = c.MetricConfig.Config.ExtraMetrics diff --git a/exporter/googlemanagedprometheusexporter/config_test.go b/exporter/googlemanagedprometheusexporter/config_test.go index 8e784c25392e..5fd62114381b 100644 --- a/exporter/googlemanagedprometheusexporter/config_test.go +++ b/exporter/googlemanagedprometheusexporter/config_test.go @@ -8,6 +8,7 @@ import ( "testing" "time" + "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector" "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector/googlemanagedprometheus" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -24,40 +25,65 @@ func TestLoadConfig(t *testing.T) { factory := NewFactory() factories.Exporters[metadata.Type] = factory + // https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/33594 + // nolint:staticcheck cfg, err := otelcoltest.LoadConfigAndValidate(filepath.Join("testdata", "config.yaml"), factories) require.NoError(t, err) require.NotNil(t, cfg) - assert.Equal(t, len(cfg.Exporters), 2) + assert.Len(t, cfg.Exporters, 2) r0 := cfg.Exporters[component.NewID(metadata.Type)].(*Config) assert.Equal(t, r0, factory.CreateDefaultConfig().(*Config)) r1 := cfg.Exporters[component.NewIDWithName(metadata.Type, "customname")].(*Config) - assert.Equal(t, r1, - &Config{ - TimeoutSettings: exporterhelper.TimeoutSettings{ - Timeout: 20 * time.Second, - }, - GMPConfig: GMPConfig{ - ProjectID: "my-project", - UserAgent: "opentelemetry-collector-contrib {{version}}", - MetricConfig: MetricConfig{ - Config: googlemanagedprometheus.Config{ - AddMetricSuffixes: false, - ExtraMetricsConfig: googlemanagedprometheus.ExtraMetricsConfig{ - EnableTargetInfo: false, - EnableScopeInfo: false, - }, - }, - Prefix: "my-metric-domain.com", + assert.Equal(t, &Config{ + TimeoutSettings: exporterhelper.TimeoutConfig{ + Timeout: 20 * time.Second, + }, + GMPConfig: GMPConfig{ + ProjectID: "my-project", + UserAgent: "opentelemetry-collector-contrib {{version}}", + MetricConfig: MetricConfig{ + Config: googlemanagedprometheus.Config{ + AddMetricSuffixes: false, + ExtraMetricsConfig: googlemanagedprometheus.ExtraMetricsConfig{ + EnableTargetInfo: false, + EnableScopeInfo: false, + }, }, + Prefix: "my-metric-domain.com", + ResourceFilters: []collector.ResourceFilter{ + { + Prefix: "cloud", + }, + { + Prefix: "k8s", + }, + { + Prefix: "faas", + }, + { + Regex: "container.id", + }, + { + Regex: "process.pid", + }, + { + Regex: "host.name", + }, + { + Regex: "host.id", + }, + }, + CumulativeNormalization: false, }, - QueueSettings: exporterhelper.QueueSettings{ - Enabled: true, - NumConsumers: 2, - QueueSize: 10, - }, - }) + }, + QueueSettings: exporterhelper.QueueConfig{ + Enabled: true, + NumConsumers: 2, + QueueSize: 10, + }, + }, r1) } diff --git a/exporter/googlemanagedprometheusexporter/factory.go b/exporter/googlemanagedprometheusexporter/factory.go index 548e144b2fab..01fd0e395bed 100644 --- a/exporter/googlemanagedprometheusexporter/factory.go +++ b/exporter/googlemanagedprometheusexporter/factory.go @@ -12,6 +12,7 @@ import ( "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector" "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector/googlemanagedprometheus" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/exporter" "go.opentelemetry.io/collector/exporter/exporterhelper" @@ -34,11 +35,12 @@ func NewFactory() exporter.Factory { // createDefaultConfig creates the default configuration for exporter. func createDefaultConfig() component.Config { return &Config{ - TimeoutSettings: exporterhelper.TimeoutSettings{Timeout: defaultTimeout}, - QueueSettings: exporterhelper.NewDefaultQueueSettings(), + TimeoutSettings: exporterhelper.TimeoutConfig{Timeout: defaultTimeout}, + QueueSettings: exporterhelper.NewDefaultQueueConfig(), GMPConfig: GMPConfig{ MetricConfig: MetricConfig{ - Config: googlemanagedprometheus.DefaultConfig(), + Config: googlemanagedprometheus.DefaultConfig(), + CumulativeNormalization: true, }, }, } @@ -47,14 +49,15 @@ func createDefaultConfig() component.Config { // createMetricsExporter creates a metrics exporter based on this config. func createMetricsExporter( ctx context.Context, - params exporter.CreateSettings, - cfg component.Config) (exporter.Metrics, error) { + params exporter.Settings, + cfg component.Config, +) (exporter.Metrics, error) { eCfg := cfg.(*Config) - mExp, err := collector.NewGoogleCloudMetricsExporter(ctx, eCfg.GMPConfig.toCollectorConfig(), params.TelemetrySettings.Logger, params.BuildInfo.Version, eCfg.Timeout) + mExp, err := collector.NewGoogleCloudMetricsExporter(ctx, eCfg.GMPConfig.toCollectorConfig(), params.TelemetrySettings.Logger, params.TelemetrySettings.MeterProvider, params.BuildInfo.Version, eCfg.TimeoutSettings.Timeout) if err != nil { return nil, err } - return exporterhelper.NewMetricsExporter( + return exporterhelper.NewMetrics( ctx, params, cfg, @@ -63,6 +66,8 @@ func createMetricsExporter( exporterhelper.WithShutdown(mExp.Shutdown), // Disable exporterhelper Timeout, since we are using a custom mechanism // within exporter itself - exporterhelper.WithTimeout(exporterhelper.TimeoutSettings{Timeout: 0}), - exporterhelper.WithQueue(eCfg.QueueSettings)) + exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}), + exporterhelper.WithQueue(eCfg.QueueSettings), + exporterhelper.WithCapabilities(consumer.Capabilities{MutatesData: true}), + ) } diff --git a/exporter/googlemanagedprometheusexporter/factory_test.go b/exporter/googlemanagedprometheusexporter/factory_test.go index 96eb875d5332..7b1c2c1d1884 100644 --- a/exporter/googlemanagedprometheusexporter/factory_test.go +++ b/exporter/googlemanagedprometheusexporter/factory_test.go @@ -30,11 +30,11 @@ func TestCreateExporter(t *testing.T) { eCfg := cfg.(*Config) eCfg.ProjectID = "test" - te, err := factory.CreateTracesExporter(ctx, exportertest.NewNopCreateSettings(), eCfg) + te, err := factory.CreateTraces(ctx, exportertest.NewNopSettings(), eCfg) assert.NoError(t, err) assert.NotNil(t, te, "failed to create trace exporter") - me, err := factory.CreateMetricsExporter(ctx, exportertest.NewNopCreateSettings(), eCfg) + me, err := factory.CreateMetrics(ctx, exportertest.NewNopSettings(), eCfg) assert.NoError(t, err) assert.NotNil(t, me, "failed to create metrics exporter") } diff --git a/exporter/googlemanagedprometheusexporter/generated_component_test.go b/exporter/googlemanagedprometheusexporter/generated_component_test.go index db599ebc7b22..76b329d29132 100644 --- a/exporter/googlemanagedprometheusexporter/generated_component_test.go +++ b/exporter/googlemanagedprometheusexporter/generated_component_test.go @@ -32,13 +32,13 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "metrics", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg) }, }, } @@ -50,9 +50,9 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) diff --git a/exporter/googlemanagedprometheusexporter/go.mod b/exporter/googlemanagedprometheusexporter/go.mod index 4944b51bd604..3e6b0b7a0126 100644 --- a/exporter/googlemanagedprometheusexporter/go.mod +++ b/exporter/googlemanagedprometheusexporter/go.mod @@ -1,132 +1,158 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlemanagedprometheusexporter -go 1.21.0 +go 1.22.7 require ( - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector v0.47.0 - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector/googlemanagedprometheus v0.47.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/otelcol v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector v0.49.0 + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector/googlemanagedprometheus v0.49.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/otelcol/otelcoltest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 go.uber.org/goleak v1.3.0 ) require ( - cloud.google.com/go v0.112.1 // indirect - cloud.google.com/go/compute/metadata v0.3.0 // indirect - cloud.google.com/go/logging v1.9.0 // indirect - cloud.google.com/go/longrunning v0.5.5 // indirect - cloud.google.com/go/monitoring v1.18.0 // indirect - cloud.google.com/go/trace v1.10.5 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.23.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.47.0 // indirect + cloud.google.com/go v0.116.0 // indirect + cloud.google.com/go/auth v0.10.0 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.5 // indirect + cloud.google.com/go/compute/metadata v0.5.2 // indirect + cloud.google.com/go/logging v1.12.0 // indirect + cloud.google.com/go/longrunning v0.6.2 // indirect + cloud.google.com/go/monitoring v1.21.2 // indirect + cloud.google.com/go/trace v1.11.2 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.25.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.49.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/ebitengine/purego v0.8.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.4 // indirect - github.com/google/s2a-go v0.1.7 // indirect + github.com/google/s2a-go v0.1.8 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.2 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect + github.com/googleapis/gax-go/v2 v2.13.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.102.0 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/client_golang v1.19.1 // indirect + github.com/prometheus/client_golang v1.20.5 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/shirou/gopsutil/v3 v3.24.4 // indirect - github.com/shoenig/go-m1cpu v0.1.6 // indirect - github.com/spf13/cobra v1.8.0 // indirect + github.com/prometheus/common v0.61.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/shirou/gopsutil/v4 v4.24.11 // indirect + github.com/spf13/cobra v1.8.1 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/tidwall/gjson v1.10.2 // indirect + github.com/tidwall/gjson v1.18.0 // indirect github.com/tidwall/match v1.1.1 // indirect - github.com/tidwall/pretty v1.2.0 // indirect - github.com/tidwall/tinylru v1.1.0 // indirect + github.com/tidwall/pretty v1.2.1 // indirect + github.com/tidwall/tinylru v1.2.1 // indirect github.com/tidwall/wal v1.1.7 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configretry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0 // indirect - go.opentelemetry.io/collector/connector v0.102.0 // indirect - go.opentelemetry.io/collector/consumer v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/pdata/testdata v0.102.0 // indirect - go.opentelemetry.io/collector/processor v0.102.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/collector/semconv v0.102.0 // indirect - go.opentelemetry.io/collector/service v0.102.0 // indirect - go.opentelemetry.io/contrib/config v0.7.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0 // indirect - go.opentelemetry.io/contrib/propagators/b3 v1.27.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/bridge/opencensus v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - go.opentelemetry.io/proto/otlp v1.2.0 // indirect - go.uber.org/atomic v1.10.0 // indirect + go.opentelemetry.io/collector/component/componentstatus v0.116.0 // indirect + go.opentelemetry.io/collector/config/configretry v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0 // indirect + go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0 // indirect + go.opentelemetry.io/collector/confmap/provider/httpprovider v1.22.0 // indirect + go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.22.0 // indirect + go.opentelemetry.io/collector/connector v0.116.0 // indirect + go.opentelemetry.io/collector/connector/connectortest v0.116.0 // indirect + go.opentelemetry.io/collector/connector/xconnector v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0 // indirect + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/otelcol v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/testdata v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 // indirect + go.opentelemetry.io/collector/processor v0.116.0 // indirect + go.opentelemetry.io/collector/processor/processortest v0.116.0 // indirect + go.opentelemetry.io/collector/processor/xprocessor v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/collector/semconv v0.116.0 // indirect + go.opentelemetry.io/collector/service v0.116.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.6.0 // indirect + go.opentelemetry.io/contrib/config v0.10.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/contrib/propagators/b3 v1.31.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.54.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 // indirect + go.opentelemetry.io/otel/log v0.8.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.7.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect + go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.23.0 // indirect + golang.org/x/crypto v0.31.0 // indirect golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/oauth2 v0.20.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - golang.org/x/time v0.5.0 // indirect - gonum.org/v1/gonum v0.15.0 // indirect - google.golang.org/api v0.169.0 // indirect - google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/oauth2 v0.24.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + golang.org/x/time v0.7.0 // indirect + gonum.org/v1/gonum v0.15.1 // indirect + google.golang.org/api v0.204.0 // indirect + google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/grpc/stats/opentelemetry v0.0.0-20241028142157-ada6787961b3 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/googlemanagedprometheusexporter/go.sum b/exporter/googlemanagedprometheusexporter/go.sum index d08770ff8173..75d4ae4a191a 100644 --- a/exporter/googlemanagedprometheusexporter/go.sum +++ b/exporter/googlemanagedprometheusexporter/go.sum @@ -1,57 +1,73 @@ +cel.dev/expr v0.16.2 h1:RwRhoH17VhAu9U5CMvMhH1PDVgf0tuz9FT+24AfMLfU= +cel.dev/expr v0.16.2/go.mod h1:gXngZQMkWJoSbE8mOzehJlXQyubn/Vg0vR9/F3W7iw8= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM= -cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4= -cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= -cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/logging v1.9.0 h1:iEIOXFO9EmSiTjDmfpbRjOxECO7R8C7b8IXUGOj7xZw= -cloud.google.com/go/logging v1.9.0/go.mod h1:1Io0vnZv4onoUnsVUQY3HZ3Igb1nBchky0A0y7BBBhE= -cloud.google.com/go/longrunning v0.5.5 h1:GOE6pZFdSrTb4KAiKnXsJBtlE6mEyaW44oKyMILWnOg= -cloud.google.com/go/longrunning v0.5.5/go.mod h1:WV2LAxD8/rg5Z1cNW6FJ/ZpX4E4VnDnoTk0yawPBB7s= -cloud.google.com/go/monitoring v1.18.0 h1:NfkDLQDG2UR3WYZVQE8kwSbUIEyIqJUPl+aOQdFH1T4= -cloud.google.com/go/monitoring v1.18.0/go.mod h1:c92vVBCeq/OB4Ioyo+NbN2U7tlg5ZH41PZcdvfc+Lcg= -cloud.google.com/go/trace v1.10.5 h1:0pr4lIKJ5XZFYD9GtxXEWr0KkVeigc3wlGpZco0X1oA= -cloud.google.com/go/trace v1.10.5/go.mod h1:9hjCV1nGBCtXbAE4YK7OqJ8pmPYSxPA0I67JwRd5s3M= +cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE= +cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U= +cloud.google.com/go/auth v0.10.0 h1:tWlkvFAh+wwTOzXIjrwM64karR1iTBZ/GRr0S/DULYo= +cloud.google.com/go/auth v0.10.0/go.mod h1:xxA5AqpDrvS+Gkmo9RqrGGRh6WSNKKOXhY3zNOr38tI= +cloud.google.com/go/auth/oauth2adapt v0.2.5 h1:2p29+dePqsCHPP1bqDJcKj4qxRyYCcbzKpFyKGt3MTk= +cloud.google.com/go/auth/oauth2adapt v0.2.5/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8= +cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo= +cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k= +cloud.google.com/go/logging v1.12.0 h1:ex1igYcGFd4S/RZWOCU51StlIEuey5bjqwH9ZYjHibk= +cloud.google.com/go/logging v1.12.0/go.mod h1:wwYBt5HlYP1InnrtYI0wtwttpVU1rifnMT7RejksUAM= +cloud.google.com/go/longrunning v0.6.2 h1:xjDfh1pQcWPEvnfjZmwjKQEcHnpz6lHjfy7Fo0MK+hc= +cloud.google.com/go/longrunning v0.6.2/go.mod h1:k/vIs83RN4bE3YCswdXC5PFfWVILjm3hpEUlSko4PiI= +cloud.google.com/go/monitoring v1.21.2 h1:FChwVtClH19E7pJ+e0xUhJPGksctZNVOk2UhMmblmdU= +cloud.google.com/go/monitoring v1.21.2/go.mod h1:hS3pXvaG8KgWTSz+dAdyzPrGUYmi2Q+WFX8g2hqVEZU= +cloud.google.com/go/trace v1.11.2 h1:4ZmaBdL8Ng/ajrgKqY5jfvzqMXbrDcBsUGXOT9aqTtI= +cloud.google.com/go/trace v1.11.2/go.mod h1:bn7OwXd4pd5rFuAnTrzBuoZ4ax2XQeG3qNgYmfCy0Io= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector v0.47.0 h1:riVd60yiSVM8oTZEnM/nscvZ2o4mcol45ZPv62zlu/M= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector v0.47.0/go.mod h1:LoJOu8+DY6cbxXF753iWmZ88nHEudiySwpQg//6mU/0= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector/googlemanagedprometheus v0.47.0 h1:qXG3UhUqfpjCbaFDTW03giIZa4PUMQ6nRoUDEDOhLWI= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector/googlemanagedprometheus v0.47.0/go.mod h1:VkkA3E9i8gTBNBIsAjypbvpwei4dSokmLdHsXLzwHOk= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.23.0 h1:5A4O4OdC7yzkIEPl4GrS+PRYV15zsboaWBT52g3Hc0k= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.23.0/go.mod h1:zO73rmlwRYxQF/6Nul4PA/UIAYJo9BtDAMgPfMthXnw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.47.0 h1:h3GAq9n95A6IYOGqAucbp+tGBxAQul2vj5ORkmRrGxg= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.47.0/go.mod h1:PdB0wkmILI+phhoBhWdrrB4LfORT9tHc03OOn+q3dWU= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.47.0 h1:TOjDcFzPkoglwb5sa6+704TXwYgs+XsN5HYc98ksK+M= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.47.0/go.mod h1:ZC7rjqRzdhRKDK223jQ7Tsz89ZtrSSLH/VFzf7k5Sb0= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector v0.49.0 h1:rr2d5SF7ZftByIvSRcY0O3/d1CcJqCKUa2IM4w+jDO4= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector v0.49.0/go.mod h1:KqGde6Vb234azF979c1vjkzDltsWQuXDlwH70UViMPg= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector/googlemanagedprometheus v0.49.0 h1:9pdyqZQ667if9lQn63Ju9yFc77iWT2TUWJ4rZjyBlV0= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector/googlemanagedprometheus v0.49.0/go.mod h1:oeyVbfp6YKpD7Ot1Gaf86cpTRHx3dhLtnCZr+s1c/ro= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.25.0 h1:4PoDbd/9/06IpwLGxSfvfNoEr9urvfkrN6mmJangGCg= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.25.0/go.mod h1:EycllQ1gupHbjqbcmfCr/H6FKSGSmEUONJ2ivb86qeY= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.49.0 h1:jJKWl98inONJAr/IZrdFQUWcwUO95DLY1XMD1ZIut+g= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.49.0/go.mod h1:l2fIqmwB+FKSfvn3bAD/0i+AXAxhIZjTK2svT/mgUXs= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.49.0 h1:GYUJLfvd++4DMuMhCFLgLXvFwofIxh/qOwoGuS/LTew= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.49.0/go.mod h1:wRbFgBQUVm1YXrvWKofAEmq9HNJTDphbAaJSSX01KUI= 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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/BE= +github.com/ebitengine/purego v0.8.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.13.1 h1:vPfJZCkob6yTMEgS+0TwfTUfbHjfy/6vOJ8hUWX/uXE= +github.com/envoyproxy/go-control-plane v0.13.1/go.mod h1:X45hY0mufo6Fd0KW3rqsGvQMw58jvjymeCzBU3mWyHw= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM= +github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -70,6 +86,8 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -77,21 +95,20 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= -github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= +github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= +github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= -github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= -github.com/googleapis/gax-go/v2 v2.12.2 h1:mhN09QQW1jEWeMF74zGR81R30z4VJzjZsfkUhuHF+DA= -github.com/googleapis/gax-go/v2 v2.12.2/go.mod h1:61M8vcyyXR2kqKFxKrfA22jaA8JGF7Dc8App1U3H6jc= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= +github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= +github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s= +github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= @@ -100,16 +117,20 @@ 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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= @@ -121,51 +142,56 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= +github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/prometheus/common v0.61.0 h1:3gv/GThfX0cV2lpO7gkTUwZru38mxevy90Bj8YFSRQQ= +github.com/prometheus/common v0.61.0/go.mod h1:zr29OCN/2BsJRaFwG8QOBr41D6kkchKbpeNH7pAjb/s= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= -github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= -github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= -github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= -github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= -github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/shirou/gopsutil/v4 v4.24.11 h1:WaU9xqGFKvFfsUv94SXcUPD7rCkU0vr/asVdQOBZNj8= +github.com/shirou/gopsutil/v4 v4.24.11/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/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 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/tidwall/gjson v1.10.2 h1:APbLGOM0rrEkd8WBw9C24nllro4ajFuJu0Sc9hRz8Bo= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tidwall/gjson v1.10.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tidwall/tinylru v1.1.0 h1:XY6IUfzVTU9rpwdhKUF6nQdChgCdGjkMfLzbWyiau6I= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/tinylru v1.1.0/go.mod h1:3+bX+TJ2baOLMWTnlyNWHh4QMnFyARg2TLTQ6OFbzw8= +github.com/tidwall/tinylru v1.2.1 h1:VgBr72c2IEr+V+pCdkPZUwiQ0KJknnWIYbhxAVkYfQk= +github.com/tidwall/tinylru v1.2.1/go.mod h1:9bQnEduwB6inr2Y7AkBP7JPgCkyrhTV/ZpX0oOOpBI4= github.com/tidwall/wal v1.1.7 h1:emc1TRjIVsdKKSnpwGBAcsAGg0767SvUk8+ygx7Bb+4= github.com/tidwall/wal v1.1.7/go.mod h1:r6lR1j27W9EPalgHiB7zLJDYu3mzW5BQP5KrzBpYY/E= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= @@ -178,98 +204,158 @@ github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/confignet v0.102.0 h1:+wQevJ/iBnPxL+roY7WWnAjMxB8v4M5QrS3+0iEmauw= -go.opentelemetry.io/collector/config/confignet v0.102.0/go.mod h1:pfOrCTfSZEB6H2rKtx41/3RN4dKs+X2EKQbw3MGRh0E= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0 h1:8Ne/oL6M4kMWK0P3FKV9EduQa+1UOGyVAnFHfSo4c1A= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0/go.mod h1:Xj4Ld/RriP/Bj+5oPpaYJsLNs2wWRDN2TvzX3Lbi6+M= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0 h1:o1iKqN+oM+TZqHoGdnKw1Am2BQlIGCYbxCRzU8T3jbM= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0/go.mod h1:JpCemLtL/sXQ2Rk3Bx7OPPA7Qt/9NVH91q0bR655gSo= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0 h1:SfASE6lxXjrmYj/UibcWdOiFWvRG0zt4hJgenloEhlY= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0/go.mod h1:+Ku0Fvdb5f6e9UkfqJXAV5FaUJVxxg6Ykfx7Js8y+V4= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0 h1:GwJQTXs7pYPUv/fVf+0nBgsJdlrTuY/PfwQ/TRA/sIk= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0/go.mod h1:PGE3DcRgqYWWC2cq2hYZoET1d3Q8JZyPNmgvqXPFWEU= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0 h1:zdYZLiHHtDf4Kk9WU7mW9dW6WAXtBF54I5jmTMRJtiw= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0/go.mod h1:yFsgUM0PbUJkPlbpJfOG6da+YiF0Z80tv7YcnL3qwv4= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0 h1:Y4H+GaCQl2URp9mEJMV5CYOhw+erONqNyvtFoKQfIoA= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0/go.mod h1:g1RjfVD0gHAf/mPOIs3zBoKBeuDsN+rc5x0lZtgA8tI= -go.opentelemetry.io/collector/connector v0.102.0 h1:IvAsVfYRxP0ajmKbUovF8qugkcUtHq6RuYNtjcMa63E= -go.opentelemetry.io/collector/connector v0.102.0/go.mod h1:f4M7wZ/9+XtgTE0fivBFH3WlwntaEd0qFFA0giFkdnY= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/zpagesextension v0.102.0 h1:BPq98py8nwzaV7KAsxt4ZZAF9LiSRu7ZjHNGavFNyKo= -go.opentelemetry.io/collector/extension/zpagesextension v0.102.0/go.mod h1:P86HW3x3epDS5F4yP0gAvsZiw4xxP1OupTEx2o6UqjY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/otelcol v0.102.0 h1:HuE+ok4iUjOrmYhQBSWpG5kBTVhcA24ljPL4pBERZ5E= -go.opentelemetry.io/collector/otelcol v0.102.0/go.mod h1:w8pCRu2nM/jAkLlEAS6ccKtJv5ylUQe6Ugl98zzTfyE= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/processor v0.102.0 h1:JsjTlpBRmoSYxcu3cAbKBchOmL6aNUxLa03ZkWIqZr8= -go.opentelemetry.io/collector/processor v0.102.0/go.mod h1:IaCSDcfy75uQTaOM+LgR1bMf/bUw2eFfzn20uvWYfLQ= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/collector/service v0.102.0 h1:B5nfyQZF7eB/y+yucl9G/7VsusbXixYXWingXn7VszM= -go.opentelemetry.io/collector/service v0.102.0/go.mod h1:c+0n0DfQeCjgrdplNHYwYbG/5aupTZVYU/50nMQraoc= -go.opentelemetry.io/contrib/config v0.7.0 h1:b1rK5tGTuhhPirJiMxOcyQfZs76j2VapY6ODn3b2Dbs= -go.opentelemetry.io/contrib/config v0.7.0/go.mod h1:8tdiFd8N5etOi3XzBmAoMxplEzI3TcL8dU5rM5/xcOQ= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0 h1:cEPbyTSEHlQR89XVlyo78gqluF8Y3oMeBkXGWzQsfXY= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0/go.mod h1:DKdbWcT4GH1D0Y3Sqt/PFXt2naRKDWtU+eE6oLdFNA8= -go.opentelemetry.io/contrib/propagators/b3 v1.27.0 h1:IjgxbomVrV9za6bRi8fWCNXENs0co37SZedQilP2hm0= -go.opentelemetry.io/contrib/propagators/b3 v1.27.0/go.mod h1:Dv9obQz25lCisDvvs4dy28UPh974CxkahRDUPsY7y9E= -go.opentelemetry.io/contrib/zpages v0.52.0 h1:MPgkMy0Cp3O5EdfVXP0ss3ujhEibysTM4eszx7E7d+E= -go.opentelemetry.io/contrib/zpages v0.52.0/go.mod h1:fqG5AFdoYru3A3DnhibVuaaEfQV2WKxE7fYE1jgDRwk= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/bridge/opencensus v1.27.0 h1:ao9aGGHd+G4YfjBpGs6vbkvt5hoC67STlJA9fCnOAcs= -go.opentelemetry.io/otel/bridge/opencensus v1.27.0/go.mod h1:uRvWtAAXzyVOST0WMPX5JHGBaAvBws+2F8PcC5gMnTk= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 h1:bFgvUr3/O4PHj3VQcFEuYKvRZJX1SJDQ+11JXuSB3/w= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0/go.mod h1:xJntEd2KL6Qdg5lwp97HMLQDVeAhrYxmzFseAMDPQ8I= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 h1:CIHWikMsN3wO+wq1Tp5VGdVRTcON+DmOJSfDjXypKOc= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0/go.mod h1:TNupZ6cxqyFEpLXAZW7On+mLFL0/g0TE3unIYL91xWc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0 h1:/jlt1Y8gXWiHG9FBx6cJaIC5hYx5Fe64nC8w5Cylt/0= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0/go.mod h1:bmToOGOBZ4hA9ghphIc1PAf66VA8KOtsuy3+ScStG20= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 h1:/0YaXu3755A/cFbtXp+21lkXgI0QE5avTWA2HjU9/WE= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0/go.mod h1:m7SFxp0/7IxmJPLIY3JhOcU9CoFzDaCPL6xxQIxhA+o= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= -go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= -go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.opentelemetry.io/collector v0.116.0 h1:Dscd6Nsnc7hjFQosO0SofcPQsXRfcj5N5PjQAslnmj4= +go.opentelemetry.io/collector v0.116.0/go.mod h1:Ug2hpW0SINPmJAGVEALRlux78NTZc3YXSuh5/Q/hFrA= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0 h1:AdHaQo/GSSRLJvEFLCMHo02r+u6Ed8j0/MNz7u3noug= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0/go.mod h1:InKYEGFdkwz3H2q648kT6rMCFBhPvevIW9ZbWIY5QR4= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0 h1:upFhnU8EyPp0WMR53mJIdx+UR2EGFOr+ppYKzUCY/Vg= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0/go.mod h1:FhjMWU5nf3IctX27lVZomM5SKMyRywShRsA4/rHoBe8= +go.opentelemetry.io/collector/confmap/provider/httpprovider v1.22.0 h1:jKLicfZRiA+G/sgso26aM6Dmmva4Dx9Txk2R58+R3e8= +go.opentelemetry.io/collector/confmap/provider/httpprovider v1.22.0/go.mod h1:nZhEGDufHuZAaeVyFVz15IluXwrnQRCp+U/w7j8Lx9Y= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.22.0 h1:dkiNwLxBqeNDN5fIwtvr2GoA0I2xZB2SEdQ9ceBbJVs= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.22.0/go.mod h1:P9SxKZvim1C3K1R2j3gI+Qb4/l9MffX2sY5f9ajsk7Y= +go.opentelemetry.io/collector/connector v0.116.0 h1:0Pz8RAXH1swLeA1fiyGGQWdv0Kemz4mbq+jnmd1TACE= +go.opentelemetry.io/collector/connector v0.116.0/go.mod h1:VQiZ2yW9KhZuF0yjDbvlgrAxm7+o8KQoxHxurQWLjKU= +go.opentelemetry.io/collector/connector/connectortest v0.116.0 h1:MdttvjqdZmp0ewW5IPCEtzzYmCqxrQxsjJ5m6gMVjzA= +go.opentelemetry.io/collector/connector/connectortest v0.116.0/go.mod h1:ko7aPyvAVf6SvRhWGZdPXSyk+7zPmsSCcMq0gYPMMIQ= +go.opentelemetry.io/collector/connector/xconnector v0.116.0 h1:fFJzrRco0g7HMkhnQ+ehlvicFf58vzsCLXnfuHyQM8w= +go.opentelemetry.io/collector/connector/xconnector v0.116.0/go.mod h1:m9oCk32zX6wDciYBpy+qMQkWKtOxb0gAkEUm8+trflY= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0 h1:bXDgoiDiwFfrO5S6q1Wpe0su303CW4Qxthoy4CxG6eg= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0/go.mod h1:uFZlAPxk2+s6zk1W+u22DgxxSDugWy0QaY5kQzjNy7Q= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/extension/zpagesextension v0.116.0 h1:D0VY/ESPwkREfMaqJleGVTiCYoCs3MDipU93ywaIn68= +go.opentelemetry.io/collector/extension/zpagesextension v0.116.0/go.mod h1:MqkQSYKarMrjVSyGrAes1FBcsW6HDDPj/ouvcDvSjfk= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 h1:KKFb3u8iLk4V5GYz7eVpw8QgEdob5koX6GNEbaoDQJY= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0/go.mod h1:YyWHUWeSnRmy2CF7kPHpwJ6qkVjufbLZ8PYuY0Ph0o8= +go.opentelemetry.io/collector/otelcol v0.116.0 h1:8NoPEY2uAemwNzUcMxiZuuI8w/Ff+0p1DXXk6NVEGlk= +go.opentelemetry.io/collector/otelcol v0.116.0/go.mod h1:c/EhsBdHmC44SxhWMi7pTlYB+I6GBSJNBsj9NCwXMxM= +go.opentelemetry.io/collector/otelcol/otelcoltest v0.116.0 h1:ZNg2kFLKnreaGSMfbr74k1yEbHLxG4ZbVvSIr+XleXo= +go.opentelemetry.io/collector/otelcol/otelcoltest v0.116.0/go.mod h1:TruQJSWWiDRlSYZTcLSE0GeECJZALDw8X8dvoYXUJ+A= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 h1:PFNy+Il/kqPdPL9rhG+1kG63Aauya+FhBKGXoB6ivxU= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0/go.mod h1:bVn9V4TGyeXi58/JDkeXCuKtc+V+qcOoTl8hNpV0qa8= +go.opentelemetry.io/collector/processor v0.116.0 h1:Kyu4tPzTdWNHtZjcxvI/bGNAgyv8L8Kem2r/Mk4IDAw= +go.opentelemetry.io/collector/processor v0.116.0/go.mod h1:+/Ugy48RAxlZEXmN2cw51W8t5wdHS9No+GAoP+moskk= +go.opentelemetry.io/collector/processor/processortest v0.116.0 h1:+IqNEVEE0E2MsO2g7+Y/9dz35sDuvAXRXrLts9NdXrA= +go.opentelemetry.io/collector/processor/processortest v0.116.0/go.mod h1:DLaQDBxzgeeaUO0ULMn/efos9PmHZkmYCHuxwCsiVHI= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0 h1:iin/UwuWvSLB7ZNfINFUYbZ5lxIi1NjZ2brkyyFdiRA= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0/go.mod h1:cnA43/XpKDbaOmd8buqKp/LGJ2l/OoCqbR//u5DMfn8= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/collector/service v0.116.0 h1:1rFmax3ILOlQq4bW//0VKRcG/HmN2rxrgfTybn6bisU= +go.opentelemetry.io/collector/service v0.116.0/go.mod h1:CzQzj72mWr5arag+q8uUWGRuUkenNo5Gw9oA97SFZ78= +go.opentelemetry.io/contrib/bridges/otelzap v0.6.0 h1:j8icMXyyqNf6HGuwlYhniPnVsbJIq7n+WirDu3VAJdQ= +go.opentelemetry.io/contrib/bridges/otelzap v0.6.0/go.mod h1:evIOZpl+kAlU5IsaYX2Siw+IbpacAZvXemVsgt70uvw= +go.opentelemetry.io/contrib/config v0.10.0 h1:2JknAzMaYjxrHkTnZh3eOme/Y2P5eHE2SWfhfV6Xd6c= +go.opentelemetry.io/contrib/config v0.10.0/go.mod h1:aND2M6/KfNkntI5cyvHriR/zvZgPf8j9yETdSmvpfmc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 h1:yMkBS9yViCc7U7yeLzJPM2XizlfdVvBRSmsQDWu6qc0= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0/go.mod h1:n8MR6/liuGB5EmTETUBeU5ZgqMOlqKRxUaqPQBOANZ8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/contrib/propagators/b3 v1.31.0 h1:PQPXYscmwbCp76QDvO4hMngF2j8Bx/OTV86laEl8uqo= +go.opentelemetry.io/contrib/propagators/b3 v1.31.0/go.mod h1:jbqfV8wDdqSDrAYxVpXQnpM0XFMq2FtDesblJ7blOwQ= +go.opentelemetry.io/contrib/zpages v0.56.0 h1:W7vP6s3juzL5KiHpr41zLNmsJ0QAZudYu8ay0zGAoko= +go.opentelemetry.io/contrib/zpages v0.56.0/go.mod h1:IxPRP4TYHw9jLeaEOSDIiA9zmyJNZNO6sbW55iMvSXs= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 h1:mMOmtYie9Fx6TSVzw4W+NTpvoaS1JWWga37oI1a/4qQ= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0/go.mod h1:yy7nDsMMBUkD+jeekJ36ur5f3jJIrmCwUrY67VFhNpA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 h1:j7ZSD+5yn+lo3sGV69nW04rRR0jhYnBwjuX3r0HvnK0= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0/go.mod h1:WXbYJTUaZXAbYd8lbgGuvih0yuCfOFC5RJoYnoLcGz8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 h1:t/Qur3vKSkUCcDVaSumWF2PKHt85pc7fRvFuoVT8qFU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0/go.mod h1:Rl61tySSdcOJWoEgYZVtmnKdA0GeKrSqkHC1t+91CH8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 h1:K0XaT3DwHAcV4nKLzcQvwAgSyisUghWoY20I7huthMk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0/go.mod h1:B5Ki776z/MBnVha1Nzwp5arlzBbE3+1jk+pGmaP5HME= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy03iVTXP6ffeN2iXrxfGsZGCjVx0/4KlizjyBwU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0/go.mod h1:TMu73/k1CP8nBUpDLc71Wj/Kf7ZS9FK5b53VapRsP9o= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 h1:lUsI2TYsQw2r1IASwoROaCnjdj2cvC2+Jbxvk6nHnWU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0/go.mod h1:2HpZxxQurfGxJlJDblybejHB6RX6pmExPNe517hREw4= +go.opentelemetry.io/otel/exporters/prometheus v0.54.0 h1:rFwzp68QMgtzu9PgP3jm9XaMICI6TsofWWPcBDKwlsU= +go.opentelemetry.io/otel/exporters/prometheus v0.54.0/go.mod h1:QyjcV9qDP6VeK5qPyKETvNjmaaEc7+gqjh4SS0ZYzDU= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 h1:TwmL3O3fRR80m8EshBrd8YydEZMcUCsZXzOUlnFohwM= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0/go.mod h1:tH98dDv5KPmPThswbXA0fr0Lwfs+OhK8HgaCo7PjRrk= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 h1:SZmDnHcgp3zwlPBS2JX2urGYe/jBKEIT6ZedHRUyCz8= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0/go.mod h1:fdWW0HtZJ7+jNpTKUR0GpMEDP69nR8YBJQxNiVCE3jk= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 h1:UGZ1QwZWY67Z6BmckTU+9Rxn04m2bD3gD6Mk0OIOCPk= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0/go.mod h1:fcwWuDuaObkkChiDlhEpSq9+X1C0omv+s5mBtToAQ64= +go.opentelemetry.io/otel/log v0.8.0 h1:egZ8vV5atrUWUbnSsHn6vB8R21G2wrKqNiDt3iWertk= +go.opentelemetry.io/otel/log v0.8.0/go.mod h1:M9qvDdUTRCopJcGRKg57+JSQ9LgLBrwwfC32epk5NX8= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/log v0.7.0 h1:dXkeI2S0MLc5g0/AwxTZv6EUEjctiH8aG14Am56NTmQ= +go.opentelemetry.io/otel/sdk/log v0.7.0/go.mod h1:oIRXpW+WD6M8BuGj5rtS0aRu/86cbDV/dAfNaZBIjYM= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -279,8 +365,8 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= @@ -298,18 +384,18 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= -golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -318,15 +404,14 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ= +golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -339,28 +424,30 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= -gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= -google.golang.org/api v0.169.0 h1:QwWPy71FgMWqJN/l6jVlFHUa29a7dcUy02I8o799nPY= -google.golang.org/api v0.169.0/go.mod h1:gpNOiMA2tZ4mf5R9Iwf4rK/Dcz0fbdIgWYWVoxmsyLg= +gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= +gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= +google.golang.org/api v0.204.0 h1:3PjmQQEDkR/ENVZZwIYB4W/KzYtN8OrqnNcHWpeR8E4= +google.golang.org/api v0.204.0/go.mod h1:69y8QSoKIbL9F94bWgWAq6wGqGwyjBgi2y8rAK8zLag= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY= -google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 h1:P8OJ/WCl/Xo4E4zoe4/bifHpSmmKwARqyqE4nW6J2GQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 h1:Q3nlH8iSQSRUwOskjbcSMcF2jiYMNiQYZ0c2KEJLKKU= +google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38/go.mod h1:xBI+tzfqGGN2JBeSebfKXFSdBpWVQ7sLW40PTupVRm4= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/grpc/stats/opentelemetry v0.0.0-20241028142157-ada6787961b3 h1:hUfOButuEtpc0UvYiaYRbNwxVYr0mQQOWq6X8beJ9Gc= +google.golang.org/grpc/stats/opentelemetry v0.0.0-20241028142157-ada6787961b3/go.mod h1:jzYlkSMbKypzuu6xoAEijsNVo9ZeDF1u/zCfFgsx7jg= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -370,8 +457,8 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/exporter/googlemanagedprometheusexporter/internal/metadata/generated_status.go b/exporter/googlemanagedprometheusexporter/internal/metadata/generated_status.go index 97e8a909d405..2f664d8f7518 100644 --- a/exporter/googlemanagedprometheusexporter/internal/metadata/generated_status.go +++ b/exporter/googlemanagedprometheusexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("googlemanagedprometheus") + Type = component.MustNewType("googlemanagedprometheus") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlemanagedprometheusexporter" ) const ( diff --git a/exporter/googlemanagedprometheusexporter/internal/metadata/generated_telemetry.go b/exporter/googlemanagedprometheusexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index 30ed2cc1bcac..000000000000 --- a/exporter/googlemanagedprometheusexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/googlemanagedprometheus") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/googlemanagedprometheus") -} diff --git a/exporter/googlemanagedprometheusexporter/internal/metadata/generated_telemetry_test.go b/exporter/googlemanagedprometheusexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 00fb4132fd27..000000000000 --- a/exporter/googlemanagedprometheusexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/googlemanagedprometheus", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/googlemanagedprometheus", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/googlemanagedprometheusexporter/metadata.yaml b/exporter/googlemanagedprometheusexporter/metadata.yaml index 37b8a8aadcc0..b17962250191 100644 --- a/exporter/googlemanagedprometheusexporter/metadata.yaml +++ b/exporter/googlemanagedprometheusexporter/metadata.yaml @@ -1,5 +1,4 @@ type: googlemanagedprometheus -scope_name: otelcol/googlemanagedprometheus status: class: exporter @@ -7,7 +6,7 @@ status: beta: [metrics] distributions: [contrib] codeowners: - active: [aabmass, dashpole, jsuereth, punya, damemi, psx95] + active: [aabmass, dashpole, jsuereth, punya, psx95] tests: skip_lifecycle: true diff --git a/exporter/googlemanagedprometheusexporter/testdata/config.yaml b/exporter/googlemanagedprometheusexporter/testdata/config.yaml index db8c177c4f8e..b0ec1367b86a 100644 --- a/exporter/googlemanagedprometheusexporter/testdata/config.yaml +++ b/exporter/googlemanagedprometheusexporter/testdata/config.yaml @@ -17,15 +17,22 @@ exporters: metric: prefix: my-metric-domain.com add_metric_suffixes: false + cumulative_normalization: false extra_metrics_config: enable_target_info: false enable_scope_info: false - + resource_filters: + - prefix: "cloud" + - prefix: "k8s" + - prefix: "faas" + - regex: "container.id" + - regex: "process.pid" + - regex: "host.name" + - regex: "host.id" service: pipelines: traces: - receivers: [nop] - processors: [nop] - exporters: [googlemanagedprometheus] - + receivers: [nop] + processors: [nop] + exporters: [googlemanagedprometheus] diff --git a/exporter/honeycombmarkerexporter/README.md b/exporter/honeycombmarkerexporter/README.md index 0f036d0b62e2..365089ec2de1 100644 --- a/exporter/honeycombmarkerexporter/README.md +++ b/exporter/honeycombmarkerexporter/README.md @@ -7,7 +7,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fhoneycombmarker%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fhoneycombmarker) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fhoneycombmarker%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fhoneycombmarker) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@TylerHelmuth](https://www.github.com/TylerHelmuth), [@fchikwekwe](https://www.github.com/fchikwekwe) | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib diff --git a/exporter/honeycombmarkerexporter/config.go b/exporter/honeycombmarkerexporter/config.go index 47b739f36120..f7e4b9facab0 100644 --- a/exporter/honeycombmarkerexporter/config.go +++ b/exporter/honeycombmarkerexporter/config.go @@ -28,9 +28,9 @@ type Config struct { // Markers is the list of markers to create Markers []Marker `mapstructure:"markers"` - confighttp.ClientConfig `mapstructure:",squash"` - exporterhelper.QueueSettings `mapstructure:"sending_queue"` - configretry.BackOffConfig `mapstructure:"retry_on_failure"` + confighttp.ClientConfig `mapstructure:",squash"` + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` + configretry.BackOffConfig `mapstructure:"retry_on_failure"` } type Marker struct { diff --git a/exporter/honeycombmarkerexporter/config_test.go b/exporter/honeycombmarkerexporter/config_test.go index df0298fb98eb..4a1a59611bd4 100644 --- a/exporter/honeycombmarkerexporter/config_test.go +++ b/exporter/honeycombmarkerexporter/config_test.go @@ -47,7 +47,7 @@ func TestLoadConfig(t *testing.T) { { id: component.NewIDWithName(metadata.Type, "all_fields"), expected: &Config{ - QueueSettings: exporterhelper.NewDefaultQueueSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), BackOffConfig: configretry.NewDefaultBackOffConfig(), APIKey: "test-apikey", APIURL: "https://api.testhost.io", @@ -87,7 +87,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) if tt.expected == nil { err = component.ValidateConfig(cfg) diff --git a/exporter/honeycombmarkerexporter/factory.go b/exporter/honeycombmarkerexporter/factory.go index 0008f05fe028..35276ce09b4b 100644 --- a/exporter/honeycombmarkerexporter/factory.go +++ b/exporter/honeycombmarkerexporter/factory.go @@ -29,7 +29,7 @@ func createDefaultConfig() component.Config { func createLogsExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exporter.Logs, error) { cf := cfg.(*Config) @@ -39,12 +39,12 @@ func createLogsExporter( return nil, err } - return exporterhelper.NewLogsExporter( + return exporterhelper.NewLogs( ctx, set, cfg, logsExp.exportMarkers, - exporterhelper.WithTimeout(exporterhelper.TimeoutSettings{Timeout: 0}), + exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}), exporterhelper.WithRetry(cf.BackOffConfig), exporterhelper.WithQueue(cf.QueueSettings), exporterhelper.WithStart(logsExp.start), diff --git a/exporter/honeycombmarkerexporter/factory_test.go b/exporter/honeycombmarkerexporter/factory_test.go index 8b3fce63d577..5354d7b29abb 100644 --- a/exporter/honeycombmarkerexporter/factory_test.go +++ b/exporter/honeycombmarkerexporter/factory_test.go @@ -22,13 +22,13 @@ func TestCreateDefaultConfig(t *testing.T) { assert.NoError(t, componenttest.CheckConfigStruct(cfg)) } -func TestFactory_CreateLogsExporter(t *testing.T) { +func TestFactory_CreateLogs(t *testing.T) { factory := NewFactory() cfg := withDefaultConfig(func(cfg *Config) { cfg.APIURL = defaultURL }) - params := exportertest.NewNopCreateSettings() - exporter, err := factory.CreateLogsExporter(context.Background(), params, cfg) + params := exportertest.NewNopSettings() + exporter, err := factory.CreateLogs(context.Background(), params, cfg) require.NoError(t, err) require.NotNil(t, exporter) diff --git a/exporter/honeycombmarkerexporter/generated_component_test.go b/exporter/honeycombmarkerexporter/generated_component_test.go index e12ab7592758..5974aae7f9f6 100644 --- a/exporter/honeycombmarkerexporter/generated_component_test.go +++ b/exporter/honeycombmarkerexporter/generated_component_test.go @@ -32,13 +32,13 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, } @@ -50,21 +50,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(exporter.Logs) require.True(t, ok) diff --git a/exporter/honeycombmarkerexporter/go.mod b/exporter/honeycombmarkerexporter/go.mod index 02f545f4c610..405360446ef1 100644 --- a/exporter/honeycombmarkerexporter/go.mod +++ b/exporter/honeycombmarkerexporter/go.mod @@ -1,82 +1,101 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/honeycombmarkerexporter -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/confighttp v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/config/confighttp v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/semconv v0.116.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) +require ( + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 +) + require ( github.com/alecthomas/participle/v2 v2.1.1 // indirect - github.com/beorn7/perks v1.0.1 // indirect + github.com/antchfx/xmlquery v1.4.2 // indirect + github.com/antchfx/xpath v1.3.2 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/elastic/go-grok v0.3.1 // indirect + github.com/elastic/lunes v0.1.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gobwas/glob v0.2.3 // indirect + github.com/goccy/go-json v0.10.4 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect + github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/iancoleman/strcase v0.3.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect + github.com/magefile/mage v1.15.0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/rs/cors v1.10.1 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/consumer v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + github.com/rs/cors v1.11.1 // indirect + github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/configtls v1.22.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/consumer v1.22.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/honeycombmarkerexporter/go.sum b/exporter/honeycombmarkerexporter/go.sum index ea0624233c19..2c58b5435e1d 100644 --- a/exporter/honeycombmarkerexporter/go.sum +++ b/exporter/honeycombmarkerexporter/go.sum @@ -4,30 +4,40 @@ github.com/alecthomas/participle/v2 v2.1.1 h1:hrjKESvSqGHzRb4yW1ciisFJ4p3MGYih6i github.com/alecthomas/participle/v2 v2.1.1/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= -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/antchfx/xmlquery v1.4.2 h1:MZKd9+wblwxfQ1zd1AdrTsqVaMjMCwow3IqkCSe00KA= +github.com/antchfx/xmlquery v1.4.2/go.mod h1:QXhvf5ldTuGqhd1SHNvvtlhhdQLks4dD0awIVhXIDTA= +github.com/antchfx/xpath v1.3.2 h1:LNjzlsSjinu3bQpw9hWMY9ocB80oLOWuQqFvO6xt51U= +github.com/antchfx/xpath v1.3.2/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/elastic/go-grok v0.3.1 h1:WEhUxe2KrwycMnlvMimJXvzRa7DoByJB4PVUIE1ZD/U= +github.com/elastic/go-grok v0.3.1/go.mod h1:n38ls8ZgOboZRgKcjMY8eFeZFMmcL9n2lP0iHhIDk64= +github.com/elastic/lunes v0.1.0 h1:amRtLPjwkWtzDF/RKzcEPMvSsSseLDLW+bnhfNSLRe4= +github.com/elastic/lunes v0.1.0/go.mod h1:xGphYIt3XdZRtyWosHQTErsQTd4OP1p9wsbVoHelrd4= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= +github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= @@ -37,6 +47,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= @@ -47,18 +59,20 @@ 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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= +github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= @@ -68,78 +82,101 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 h1:SIKIoA4e/5Y9ZOl0DCe3eVMLPOQzJxgZpfdHHeauNTM= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6/go.mod h1:BUbeWZiieNxAuuADTBNb3/aeje6on3DhU3rpWsQSB1E= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -149,44 +186,64 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/exporter/honeycombmarkerexporter/internal/metadata/generated_status.go b/exporter/honeycombmarkerexporter/internal/metadata/generated_status.go index a1abc2e2bbc0..55b385008b23 100644 --- a/exporter/honeycombmarkerexporter/internal/metadata/generated_status.go +++ b/exporter/honeycombmarkerexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("honeycombmarker") + Type = component.MustNewType("honeycombmarker") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/honeycombmarkerexporter" ) const ( diff --git a/exporter/honeycombmarkerexporter/internal/metadata/generated_telemetry.go b/exporter/honeycombmarkerexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index 5abe8b8c2d74..000000000000 --- a/exporter/honeycombmarkerexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/honeycombmarker") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/honeycombmarker") -} diff --git a/exporter/honeycombmarkerexporter/internal/metadata/generated_telemetry_test.go b/exporter/honeycombmarkerexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 1ee476bb5727..000000000000 --- a/exporter/honeycombmarkerexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/honeycombmarker", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/honeycombmarker", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/honeycombmarkerexporter/logs_exporter.go b/exporter/honeycombmarkerexporter/logs_exporter.go index 6dd7676f7a12..5b1747734fa7 100644 --- a/exporter/honeycombmarkerexporter/logs_exporter.go +++ b/exporter/honeycombmarkerexporter/logs_exporter.go @@ -19,7 +19,6 @@ import ( "go.opentelemetry.io/collector/exporter" "go.opentelemetry.io/collector/pdata/plog" - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter/expr" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter/filterottl" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottllog" @@ -34,7 +33,7 @@ const ( type marker struct { Marker - logBoolExpr expr.BoolExpr[ottllog.TransformContext] + logBoolExpr *ottl.ConditionSequence[ottllog.TransformContext] } type honeycombLogsExporter struct { @@ -47,7 +46,7 @@ type honeycombLogsExporter struct { userAgentHeader string } -func newHoneycombLogsExporter(set exporter.CreateSettings, config *Config) (*honeycombLogsExporter, error) { +func newHoneycombLogsExporter(set exporter.Settings, config *Config) (*honeycombLogsExporter, error) { if config == nil { return nil, fmt.Errorf("unable to create honeycombLogsExporter without config") } @@ -83,7 +82,7 @@ func (e *honeycombLogsExporter) exportMarkers(ctx context.Context, ld plog.Logs) logs := slogs.LogRecords() for k := 0; k < logs.Len(); k++ { logRecord := logs.At(k) - tCtx := ottllog.NewTransformContext(logRecord, slogs.Scope(), rlogs.Resource()) + tCtx := ottllog.NewTransformContext(logRecord, slogs.Scope(), rlogs.Resource(), slogs, rlogs) for _, m := range e.markers { match, err := m.logBoolExpr.Eval(ctx, tCtx) if err != nil { @@ -96,7 +95,6 @@ func (e *honeycombLogsExporter) exportMarkers(ctx context.Context, ld plog.Logs) } } } - } } } @@ -160,7 +158,6 @@ func (e *honeycombLogsExporter) sendMarker(ctx context.Context, m marker, logRec func (e *honeycombLogsExporter) start(ctx context.Context, host component.Host) (err error) { client, err := e.httpClientSettings.ToClient(ctx, host, e.set) - if err != nil { return err } diff --git a/exporter/honeycombmarkerexporter/logs_exporter_test.go b/exporter/honeycombmarkerexporter/logs_exporter_test.go index d3daae01f66b..403e43863a1b 100644 --- a/exporter/honeycombmarkerexporter/logs_exporter_test.go +++ b/exporter/honeycombmarkerexporter/logs_exporter_test.go @@ -8,7 +8,6 @@ import ( "encoding/json" "net/http" "net/http/httptest" - "strings" "testing" "github.com/stretchr/testify/assert" @@ -124,7 +123,7 @@ func TestExportMarkers(t *testing.T) { decodedBody := map[string]any{} err := json.NewDecoder(req.Body).Decode(&decodedBody) - require.NoError(t, err) + assert.NoError(t, err) assert.Equal(t, len(tt.attributeMap), len(decodedBody)) @@ -138,7 +137,7 @@ func TestExportMarkers(t *testing.T) { userAgent := req.Header.Get(userAgentHeaderKey) assert.NotEmpty(t, userAgent) - assert.Equal(t, strings.Contains(userAgent, "OpenTelemetry Collector"), true) + assert.Contains(t, userAgent, "OpenTelemetry Collector") rw.WriteHeader(http.StatusAccepted) })) @@ -148,7 +147,7 @@ func TestExportMarkers(t *testing.T) { config.APIURL = markerServer.URL f := NewFactory() - exp, err := f.CreateLogsExporter(context.Background(), exportertest.NewNopCreateSettings(), &config) + exp, err := f.CreateLogs(context.Background(), exportertest.NewNopSettings(), &config) require.NoError(t, err) err = exp.Start(context.Background(), componenttest.NewNopHost()) @@ -236,7 +235,7 @@ func TestExportMarkers_Error(t *testing.T) { config.APIURL = markerServer.URL f := NewFactory() - exp, err := f.CreateLogsExporter(context.Background(), exportertest.NewNopCreateSettings(), &config) + exp, err := f.CreateLogs(context.Background(), exportertest.NewNopSettings(), &config) require.NoError(t, err) err = exp.Start(context.Background(), componenttest.NewNopHost()) @@ -287,7 +286,7 @@ func TestExportMarkers_NoAPICall(t *testing.T) { config.APIURL = markerServer.URL f := NewFactory() - exp, err := f.CreateLogsExporter(context.Background(), exportertest.NewNopCreateSettings(), &config) + exp, err := f.CreateLogs(context.Background(), exportertest.NewNopSettings(), &config) require.NoError(t, err) err = exp.Start(context.Background(), componenttest.NewNopHost()) diff --git a/exporter/honeycombmarkerexporter/metadata.yaml b/exporter/honeycombmarkerexporter/metadata.yaml index d609671d0fd1..956f924f3e5b 100644 --- a/exporter/honeycombmarkerexporter/metadata.yaml +++ b/exporter/honeycombmarkerexporter/metadata.yaml @@ -1,5 +1,4 @@ type: honeycombmarker -scope_name: otelcol/honeycombmarker status: class: exporter diff --git a/exporter/influxdbexporter/README.md b/exporter/influxdbexporter/README.md index d0585e781474..afeedad977b8 100644 --- a/exporter/influxdbexporter/README.md +++ b/exporter/influxdbexporter/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Finfluxdb%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Finfluxdb) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Finfluxdb%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Finfluxdb) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@jacobmarble](https://www.github.com/jacobmarble) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib diff --git a/exporter/influxdbexporter/config.go b/exporter/influxdbexporter/config.go index 53103640489b..33c40f4d3e59 100644 --- a/exporter/influxdbexporter/config.go +++ b/exporter/influxdbexporter/config.go @@ -28,9 +28,9 @@ type V1Compatibility struct { // Config defines configuration for the InfluxDB exporter. type Config struct { - confighttp.ClientConfig `mapstructure:",squash"` - exporterhelper.QueueSettings `mapstructure:"sending_queue"` - configretry.BackOffConfig `mapstructure:"retry_on_failure"` + confighttp.ClientConfig `mapstructure:",squash"` + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` + configretry.BackOffConfig `mapstructure:"retry_on_failure"` // Org is the InfluxDB organization name of the destination bucket. Org string `mapstructure:"org"` diff --git a/exporter/influxdbexporter/config_test.go b/exporter/influxdbexporter/config_test.go index ea8f355e69b5..6459d4cad16a 100644 --- a/exporter/influxdbexporter/config_test.go +++ b/exporter/influxdbexporter/config_test.go @@ -22,6 +22,10 @@ import ( ) func TestLoadConfig(t *testing.T) { + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Endpoint = "http://localhost:8080" + clientConfig.Timeout = 500 * time.Millisecond + clientConfig.Headers = map[string]configopaque.String{"User-Agent": "OpenTelemetry -> Influx"} t.Parallel() cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml")) @@ -38,12 +42,8 @@ func TestLoadConfig(t *testing.T) { { id: component.NewIDWithName(metadata.Type, "override-config"), expected: &Config{ - ClientConfig: confighttp.ClientConfig{ - Endpoint: "http://localhost:8080", - Timeout: 500 * time.Millisecond, - Headers: map[string]configopaque.String{"User-Agent": "OpenTelemetry -> Influx"}, - }, - QueueSettings: exporterhelper.QueueSettings{ + ClientConfig: clientConfig, + QueueSettings: exporterhelper.QueueConfig{ Enabled: true, NumConsumers: 3, QueueSize: 10, @@ -75,7 +75,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) diff --git a/exporter/influxdbexporter/factory.go b/exporter/influxdbexporter/factory.go index 2f8eb08c11f2..d9cfa42ae311 100644 --- a/exporter/influxdbexporter/factory.go +++ b/exporter/influxdbexporter/factory.go @@ -34,14 +34,15 @@ func NewFactory() exporter.Factory { } func createDefaultConfig() component.Config { + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Timeout = 5 * time.Second + clientConfig.Headers = map[string]configopaque.String{ + "User-Agent": "OpenTelemetry -> Influx", + } + return &Config{ - ClientConfig: confighttp.ClientConfig{ - Timeout: 5 * time.Second, - Headers: map[string]configopaque.String{ - "User-Agent": "OpenTelemetry -> Influx", - }, - }, - QueueSettings: exporterhelper.NewDefaultQueueSettings(), + ClientConfig: clientConfig, + QueueSettings: exporterhelper.NewDefaultQueueConfig(), BackOffConfig: configretry.NewDefaultBackOffConfig(), MetricsSchema: common.MetricsSchemaTelegrafPrometheusV1.String(), SpanDimensions: otel2influx.DefaultOtelTracesToLineProtocolConfig().SpanDimensions, @@ -55,7 +56,7 @@ func createDefaultConfig() component.Config { func createTraceExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, config component.Config, ) (exporter.Traces, error) { cfg := config.(*Config) @@ -76,7 +77,7 @@ func createTraceExporter( return nil, err } - return exporterhelper.NewTracesExporter( + return exporterhelper.NewTraces( ctx, set, cfg, @@ -87,7 +88,7 @@ func createTraceExporter( ) } -func createMetricsExporter(ctx context.Context, set exporter.CreateSettings, config component.Config) (exporter.Metrics, error) { +func createMetricsExporter(ctx context.Context, set exporter.Settings, config component.Config) (exporter.Metrics, error) { cfg := config.(*Config) logger := newZapInfluxLogger(set.Logger) @@ -111,7 +112,7 @@ func createMetricsExporter(ctx context.Context, set exporter.CreateSettings, con return nil, err } - return exporterhelper.NewMetricsExporter( + return exporterhelper.NewMetrics( ctx, set, cfg, @@ -122,7 +123,7 @@ func createMetricsExporter(ctx context.Context, set exporter.CreateSettings, con ) } -func createLogsExporter(ctx context.Context, set exporter.CreateSettings, config component.Config) (exporter.Logs, error) { +func createLogsExporter(ctx context.Context, set exporter.Settings, config component.Config) (exporter.Logs, error) { cfg := config.(*Config) logger := newZapInfluxLogger(set.Logger) @@ -141,7 +142,7 @@ func createLogsExporter(ctx context.Context, set exporter.CreateSettings, config return nil, err } - return exporterhelper.NewLogsExporter( + return exporterhelper.NewLogs( ctx, set, cfg, diff --git a/exporter/influxdbexporter/generated_component_test.go b/exporter/influxdbexporter/generated_component_test.go index 7fa4c9366efb..ce1bc38fad11 100644 --- a/exporter/influxdbexporter/generated_component_test.go +++ b/exporter/influxdbexporter/generated_component_test.go @@ -32,27 +32,27 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, { name: "metrics", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg) }, }, { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -64,21 +64,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(exporter.Logs) require.True(t, ok) diff --git a/exporter/influxdbexporter/generated_package_test.go b/exporter/influxdbexporter/generated_package_test.go index 6d80a169448f..f5807c6cd5ca 100644 --- a/exporter/influxdbexporter/generated_package_test.go +++ b/exporter/influxdbexporter/generated_package_test.go @@ -9,5 +9,5 @@ import ( ) func TestMain(m *testing.M) { - goleak.VerifyTestMain(m, goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start")) + goleak.VerifyTestMain(m) } diff --git a/exporter/influxdbexporter/go.mod b/exporter/influxdbexporter/go.mod index c4317c5ef40f..da728d62bf7f 100644 --- a/exporter/influxdbexporter/go.mod +++ b/exporter/influxdbexporter/go.mod @@ -1,80 +1,85 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/influxdbexporter -go 1.21.0 +go 1.22.0 require ( github.com/cenkalti/backoff/v4 v4.3.0 github.com/influxdata/influxdb-observability/common v0.5.12 github.com/influxdata/influxdb-observability/otel2influx v0.5.12 github.com/influxdata/line-protocol/v2 v2.2.1 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/confighttp v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/confighttp v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/frankban/quicktest v1.14.0 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/rs/cors v1.10.1 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/collector/semconv v0.102.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + github.com/rs/cors v1.11.1 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/configtls v1.22.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/consumer v1.22.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/collector/semconv v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/influxdbexporter/go.sum b/exporter/influxdbexporter/go.sum index eed0fa174c92..1671b695ad24 100644 --- a/exporter/influxdbexporter/go.sum +++ b/exporter/influxdbexporter/go.sum @@ -1,9 +1,5 @@ -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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -15,17 +11,19 @@ github.com/frankban/quicktest v1.11.2/go.mod h1:K+q6oSqb0W0Ininfk863uOk1lMy69l/P github.com/frankban/quicktest v1.13.0/go.mod h1:qLE0fzW0VuyUAJgPU19zByoIr0HtCHN/r/VLSOOIySU= github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss= github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -53,14 +51,14 @@ 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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= @@ -80,81 +78,99 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -172,20 +188,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -194,12 +210,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/exporter/influxdbexporter/internal/metadata/generated_status.go b/exporter/influxdbexporter/internal/metadata/generated_status.go index eb2798c5bd18..762aa44e6668 100644 --- a/exporter/influxdbexporter/internal/metadata/generated_status.go +++ b/exporter/influxdbexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("influxdb") + Type = component.MustNewType("influxdb") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/influxdbexporter" ) const ( diff --git a/exporter/influxdbexporter/internal/metadata/generated_telemetry.go b/exporter/influxdbexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index 7c1669a3d41d..000000000000 --- a/exporter/influxdbexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/influxdb") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/influxdb") -} diff --git a/exporter/influxdbexporter/internal/metadata/generated_telemetry_test.go b/exporter/influxdbexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 162b7efcc070..000000000000 --- a/exporter/influxdbexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/influxdb", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/influxdb", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/influxdbexporter/metadata.yaml b/exporter/influxdbexporter/metadata.yaml index 99da9d967b1a..5791e7c8e4c2 100644 --- a/exporter/influxdbexporter/metadata.yaml +++ b/exporter/influxdbexporter/metadata.yaml @@ -1,5 +1,4 @@ type: influxdb -scope_name: otelcol/influxdb status: class: exporter @@ -11,8 +10,3 @@ status: tests: expect_consumer_error: true - goleak: - ignore: - top: - # See https://github.com/census-instrumentation/opencensus-go/issues/1191 for more information. - - "go.opencensus.io/stats/view.(*worker).start" \ No newline at end of file diff --git a/exporter/influxdbexporter/writer.go b/exporter/influxdbexporter/writer.go index 5009b489d232..f2235d21314b 100644 --- a/exporter/influxdbexporter/writer.go +++ b/exporter/influxdbexporter/writer.go @@ -205,10 +205,10 @@ func (b *influxHTTPWriterBatch) WriteBatch(ctx context.Context) error { if err = res.Body.Close(); err != nil { return err } - switch res.StatusCode / 100 { - case 2: // Success + switch { + case res.StatusCode >= 200 && res.StatusCode < 300: // Success break - case 5: // Retryable error + case res.StatusCode >= 500 && res.StatusCode < 600: // Retryable error return fmt.Errorf("line protocol write returned %q %q", res.Status, string(body)) default: // Terminal error return consumererror.NewPermanent(fmt.Errorf("line protocol write returned %q %q", res.Status, string(body))) diff --git a/exporter/influxdbexporter/writer_test.go b/exporter/influxdbexporter/writer_test.go index ed882ca9be71..8970bf6b29dc 100644 --- a/exporter/influxdbexporter/writer_test.go +++ b/exporter/influxdbexporter/writer_test.go @@ -17,7 +17,7 @@ import ( "github.com/influxdata/line-protocol/v2/lineprotocol" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/config/confighttp" ) @@ -138,9 +138,9 @@ func Test_influxHTTPWriterBatch_maxPayload(t *testing.T) { require.NoError(t, err) if testCase.expectMultipleRequests { - assert.Equal(t, 2, len(httpRequests)) + assert.Len(t, httpRequests, 2) } else { - assert.Equal(t, 1, len(httpRequests)) + assert.Len(t, httpRequests, 1) } }) } @@ -158,15 +158,15 @@ func Test_influxHTTPWriterBatch_EnqueuePoint_emptyTagValue(t *testing.T) { t.Cleanup(noopHTTPServer.Close) nowTime := time.Unix(1000, 2000) + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Endpoint = noopHTTPServer.URL influxWriter, err := newInfluxHTTPWriter( new(common.NoopLogger), &Config{ - ClientConfig: confighttp.ClientConfig{ - Endpoint: noopHTTPServer.URL, - }, + ClientConfig: clientConfig, }, - component.TelemetrySettings{}) + componenttest.NewNopTelemetrySettings()) require.NoError(t, err) influxWriter.httpClient = noopHTTPServer.Client() influxWriterBatch := influxWriter.NewBatch() diff --git a/exporter/instanaexporter/README.md b/exporter/instanaexporter/README.md deleted file mode 100644 index 90b19a8e2cb9..000000000000 --- a/exporter/instanaexporter/README.md +++ /dev/null @@ -1,77 +0,0 @@ -# Instana Exporter - - -| Status | | -| ------------- |-----------| -| Stability | [deprecated]: traces | -| Distributions | [contrib] | -| Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Finstana%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Finstana) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Finstana%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Finstana) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@jpkrohling](https://www.github.com/jpkrohling), [@hickeyma](https://www.github.com/hickeyma) | - -[deprecated]: https://github.com/open-telemetry/opentelemetry-collector#deprecated -[contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib - - -The Instana Exporter converts OpenTelemetry trace data and then sends it to the [Instana Backend](https://www.ibm.com/docs/en/instana-observability/current?topic=setting-up-managing-instana). - -## Exporter Configuration - -The following exporter configuration parameters are supported. - - -| Parameter | Description | -|----------------|-------------| -| endpoint | The Instana backend endpoint that the Exporter connects to. It depends on your region and how it is hosted. It starts with ``https://serverless-`` for SaaS. Otherwise, it starts with ``https://``. It corresponds to the Instana environment variable ``INSTANA_ENDPOINT_URL`` | -| agent_key | Your Instana Agent key. The same agent key can be used for host agents and serverless monitoring. It corresponds to the Instana environment variable ``INSTANA_AGENT_KEY`` | -| tls/ca_file | [Optional] Certificate authority file for an Instana backend connection where the backend uses a self signed certificate. | - -> These parameters match the Instana Serverless Monitoring environment variables and can be found [here](https://www.ibm.com/docs/en/instana-observability/current?topic=references-environment-variables#serverless-monitoring). - - -### Sample Configuration - -The code snippet below shows how your configuration file should look like: - -```yaml -[...] - -exporters: - instana: - endpoint: ${env:INSTANA_ENDPOINT_URL} - agent_key: ${env:INSTANA_AGENT_KEY} - -[...] - -service: - pipelines: - traces: - exporters: [instana] - -[...] -``` - -### Full Example - -```yaml -receivers: - otlp: - protocols: - grpc: - http: - -processors: - batch: -exporters: - instana: - endpoint: ${env:INSTANA_ENDPOINT_URL} - agent_key: ${env:INSTANA_AGENT_KEY} - tls: - ca_file: someCA.pem # Optional. Certificate authority file for Instana backend connection. - -service: - pipelines: - traces: - receivers: [otlp] - processors: [batch] - exporters: [instana] -``` diff --git a/exporter/instanaexporter/config.go b/exporter/instanaexporter/config.go deleted file mode 100644 index 7a7c6c95aba0..000000000000 --- a/exporter/instanaexporter/config.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package instanaexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter" - -import ( - "errors" - "net/url" - "strings" - - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/config/confighttp" - "go.opentelemetry.io/collector/config/configopaque" -) - -// Config defines configuration for the Instana exporter -type Config struct { - Endpoint string `mapstructure:"endpoint"` - - AgentKey configopaque.String `mapstructure:"agent_key"` - - confighttp.ClientConfig `mapstructure:",squash"` -} - -var _ component.Config = (*Config)(nil) - -// Validate checks if the exporter configuration is valid -func (cfg *Config) Validate() error { - - if cfg.Endpoint == "" { - return errors.New("no Instana endpoint set") - } - - if cfg.AgentKey == "" { - return errors.New("no Instana agent key set") - } - - if !strings.HasPrefix(cfg.Endpoint, "https://") { - return errors.New("endpoint must start with https://") - } - _, err := url.Parse(cfg.Endpoint) - if err != nil { - return errors.New("endpoint must be a valid URL") - } - - return nil -} diff --git a/exporter/instanaexporter/config_test.go b/exporter/instanaexporter/config_test.go deleted file mode 100644 index 68074ccb8a2c..000000000000 --- a/exporter/instanaexporter/config_test.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package instanaexporter - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "go.opentelemetry.io/collector/config/confighttp" - "go.opentelemetry.io/collector/config/configtls" -) - -func TestConfigValidate(t *testing.T) { - t.Run("Empty configuration", func(t *testing.T) { - c := &Config{} - err := c.Validate() - assert.Error(t, err) - }) - - t.Run("Valid configuration", func(t *testing.T) { - c := &Config{Endpoint: "https://example.com/", AgentKey: "key1"} - err := c.Validate() - assert.NoError(t, err) - - assert.Equal(t, "https://example.com/", c.Endpoint, "no Instana endpoint set") - assert.Equal(t, "", c.TLSSetting.CAFile, "optional ca_file property not set") - }) - - t.Run("Valid configuration with ca_file", func(t *testing.T) { - c := &Config{Endpoint: "https://example.com/", AgentKey: "key1", ClientConfig: confighttp.ClientConfig{ - TLSSetting: configtls.ClientConfig{ - Config: configtls.Config{ - CAFile: "ca.crt", - }, - }, - }} - err := c.Validate() - assert.NoError(t, err) - - assert.Equal(t, "https://example.com/", c.Endpoint, "no Instana endpoint set") - assert.Equal(t, "ca.crt", c.TLSSetting.CAFile, "optional ca_file property set") - }) - - t.Run("Invalid Endpoint Invalid URL", func(t *testing.T) { - c := &Config{Endpoint: "https://example.}~", AgentKey: "key1"} - err := c.Validate() - assert.Error(t, err) - }) - - t.Run("Invalid Endpoint No Protocol", func(t *testing.T) { - c := &Config{Endpoint: "example.com", AgentKey: "key1"} - err := c.Validate() - assert.Error(t, err) - }) - - t.Run("Invalid Endpoint No https:// Protocol", func(t *testing.T) { - c := &Config{Endpoint: "http://example.com", AgentKey: "key1"} - err := c.Validate() - assert.Error(t, err, "endpoint must start with https://") - }) - - t.Run("No Agent key", func(t *testing.T) { - c := &Config{Endpoint: "https://example.com/"} - err := c.Validate() - assert.Error(t, err) - }) -} diff --git a/exporter/instanaexporter/exporter.go b/exporter/instanaexporter/exporter.go deleted file mode 100644 index 16f899de26ae..000000000000 --- a/exporter/instanaexporter/exporter.go +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package instanaexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter" - -import ( - "bytes" - "context" - "fmt" - "net/http" - "runtime" - "strings" - - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/consumer/consumererror" - "go.opentelemetry.io/collector/exporter" - "go.opentelemetry.io/collector/pdata/ptrace" - "go.uber.org/zap" - - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter/internal/backend" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter/internal/converter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter/internal/converter/model" -) - -type instanaExporter struct { - config *Config - client *http.Client - settings component.TelemetrySettings - userAgent string -} - -func (e *instanaExporter) start(ctx context.Context, host component.Host) error { - client, err := e.config.ClientConfig.ToClient(ctx, host, e.settings) - if err != nil { - return err - } - e.client = client - return nil -} - -func (e *instanaExporter) pushConvertedTraces(ctx context.Context, td ptrace.Traces) error { - converter := converter.NewConvertAllConverter(e.settings.Logger) - var spans []model.Span - - hostID := "" - resourceSpans := td.ResourceSpans() - for i := 0; i < resourceSpans.Len(); i++ { - resSpan := resourceSpans.At(i) - - resource := resSpan.Resource() - - hostIDAttr, ok := resource.Attributes().Get(backend.AttributeInstanaHostID) - if ok { - hostID = hostIDAttr.Str() - } - - ilSpans := resSpan.ScopeSpans() - for j := 0; j < ilSpans.Len(); j++ { - converterBundle := converter.ConvertSpans(resource.Attributes(), ilSpans.At(j).Spans()) - - spans = append(spans, converterBundle.Spans...) - } - } - - bundle := model.Bundle{Spans: spans} - if len(bundle.Spans) == 0 { - // skip exporting, nothing to do - return nil - } - - req, err := bundle.Marshal() - if err != nil { - return consumererror.NewPermanent(err) - } - - headers := map[string]string{ - backend.HeaderKey: string(e.config.AgentKey), - backend.HeaderHost: hostID, - // Used only by the Instana agent and can be set to "0" for the exporter - backend.HeaderTime: "0", - } - - return e.export(ctx, e.config.Endpoint, headers, req) -} - -func newInstanaExporter(cfg component.Config, set exporter.CreateSettings) *instanaExporter { - iCfg := cfg.(*Config) - userAgent := fmt.Sprintf("%s/%s (%s/%s)", set.BuildInfo.Description, set.BuildInfo.Version, runtime.GOOS, runtime.GOARCH) - return &instanaExporter{ - config: iCfg, - settings: set.TelemetrySettings, - userAgent: userAgent, - } -} - -func (e *instanaExporter) export(ctx context.Context, url string, header map[string]string, request []byte) error { - url = strings.TrimSuffix(url, "/") + "/bundle" - e.settings.Logger.Debug("Preparing to make HTTP request", zap.String("url", url)) - req, err := http.NewRequestWithContext(ctx, http.MethodPost, url, bytes.NewReader(request)) - if err != nil { - return consumererror.NewPermanent(err) - } - - req.Header.Set("Content-Type", "application/json") - req.Header.Set("User-Agent", e.userAgent) - - for name, value := range header { - req.Header.Set(name, value) - } - - resp, err := e.client.Do(req) - if err != nil { - return fmt.Errorf("failed to send a request: %w", err) - } - defer resp.Body.Close() - - if resp.StatusCode >= 400 && resp.StatusCode <= 499 { - return consumererror.NewPermanent(fmt.Errorf("error when sending payload to %s: %s", - url, resp.Status)) - } - if resp.StatusCode >= 500 && resp.StatusCode <= 599 { - return fmt.Errorf("error when sending payload to %s: %s", url, resp.Status) - } - - return nil -} diff --git a/exporter/instanaexporter/exporter_test.go b/exporter/instanaexporter/exporter_test.go deleted file mode 100644 index bc6b76c1057d..000000000000 --- a/exporter/instanaexporter/exporter_test.go +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package instanaexporter - -import ( - "context" - "encoding/base64" - "io" - "net/http" - "net/http/httptest" - "os" - "testing" - - "github.com/stretchr/testify/assert" - "go.opentelemetry.io/collector/component/componenttest" - "go.opentelemetry.io/collector/config/confighttp" - "go.opentelemetry.io/collector/config/configtls" - "go.opentelemetry.io/collector/exporter/exportertest" - "go.opentelemetry.io/collector/pdata/ptrace" -) - -func TestPushConvertedTraces(t *testing.T) { - traceServer := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, _ *http.Request) { - rw.WriteHeader(http.StatusAccepted) - })) - defer traceServer.Close() - - cfg := Config{ - AgentKey: "key11", - ClientConfig: confighttp.ClientConfig{Endpoint: traceServer.URL}, - Endpoint: traceServer.URL, - } - - instanaExporter := newInstanaExporter(&cfg, exportertest.NewNopCreateSettings()) - ctx := context.Background() - err := instanaExporter.start(ctx, componenttest.NewNopHost()) - assert.NoError(t, err) - - err = instanaExporter.pushConvertedTraces(ctx, newTestTraces()) - assert.NoError(t, err) -} - -func newTestTraces() ptrace.Traces { - traces := ptrace.NewTraces() - rspans := traces.ResourceSpans().AppendEmpty() - rspans.Resource().Attributes().PutStr("instana.agent", "agent1") - span := rspans.ScopeSpans().AppendEmpty().Spans().AppendEmpty() - span.SetTraceID([16]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4}) - span.SetSpanID([8]byte{0, 0, 0, 0, 1, 2, 3, 4}) - return traces -} - -func TestSelfSignedBackend(t *testing.T) { - var err error - caFile := "testdata/ca.crt" - handler := http.NewServeMux() - handler.HandleFunc("/bundle", func(w http.ResponseWriter, _ *http.Request) { - _, err = io.WriteString(w, "Hello from CA self signed server") - - if err != nil { - t.Fatal(err) - } - }) - - server := httptest.NewTLSServer(handler) - defer server.Close() - - s := base64.StdEncoding.EncodeToString(server.Certificate().Raw) - wholeCert := "-----BEGIN CERTIFICATE-----\n" + s + "\n-----END CERTIFICATE-----" - - err = os.WriteFile(caFile, []byte(wholeCert), os.FileMode(0600)) - defer func() { - assert.NoError(t, os.Remove(caFile)) - }() - - if err != nil { - t.Fatal(err) - } - - // Starts the exporter to test the HTTP client request - - cfg := Config{ - AgentKey: "key11", - ClientConfig: confighttp.ClientConfig{ - Endpoint: server.URL, - TLSSetting: configtls.ClientConfig{ - Config: configtls.Config{ - CAFile: caFile, - }, - }, - }, - Endpoint: server.URL, - } - - ctx := context.Background() - - instanaExporter := newInstanaExporter(&cfg, exportertest.NewNopCreateSettings()) - err = instanaExporter.start(ctx, componenttest.NewNopHost()) - - if err != nil { - t.Fatal(err) - } - - assert.NoError(t, instanaExporter.export(ctx, server.URL, make(map[string]string), []byte{})) -} - -func TestSelfSignedBackendCAFileNotFound(t *testing.T) { - cfg := Config{ - AgentKey: "key11", - ClientConfig: confighttp.ClientConfig{ - Endpoint: "", - TLSSetting: configtls.ClientConfig{ - Config: configtls.Config{ - CAFile: "ca_file_not_found.pem", - }, - }, - }, - Endpoint: "", - } - - ctx := context.Background() - - instanaExporter := newInstanaExporter(&cfg, exportertest.NewNopCreateSettings()) - - assert.Error(t, instanaExporter.start(ctx, componenttest.NewNopHost()), "expect not to find the ca file") -} diff --git a/exporter/instanaexporter/factory.go b/exporter/instanaexporter/factory.go deleted file mode 100644 index df2749f014dd..000000000000 --- a/exporter/instanaexporter/factory.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -//go:generate mdatagen metadata.yaml - -package instanaexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter" - -import ( - "context" - "time" - - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/config/confighttp" - "go.opentelemetry.io/collector/config/configopaque" - "go.opentelemetry.io/collector/config/configretry" - "go.opentelemetry.io/collector/consumer" - "go.opentelemetry.io/collector/exporter" - "go.opentelemetry.io/collector/exporter/exporterhelper" - - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter/internal/metadata" -) - -// NewFactory creates an Instana exporter factory -func NewFactory() exporter.Factory { - return exporter.NewFactory( - metadata.Type, - createDefaultConfig, - exporter.WithTraces(createTracesExporter, metadata.TracesStability), - ) -} - -// createDefaultConfig creates the default exporter configuration -func createDefaultConfig() component.Config { - return &Config{ - ClientConfig: confighttp.ClientConfig{ - Endpoint: "", - Timeout: 30 * time.Second, - Headers: map[string]configopaque.String{}, - WriteBufferSize: 512 * 1024, - }, - } -} - -// createTracesExporter creates a trace exporter based on this configuration -func createTracesExporter(ctx context.Context, set exporter.CreateSettings, config component.Config) (exporter.Traces, error) { - cfg := config.(*Config) - - ctx, cancel := context.WithCancel(ctx) - - instanaExporter := newInstanaExporter(cfg, set) - - return exporterhelper.NewTracesExporter( - ctx, - set, - config, - instanaExporter.pushConvertedTraces, - exporterhelper.WithCapabilities(consumer.Capabilities{MutatesData: false}), - exporterhelper.WithStart(instanaExporter.start), - // Disable Timeout/RetryOnFailure and SendingQueue - exporterhelper.WithTimeout(exporterhelper.TimeoutSettings{Timeout: 0}), - exporterhelper.WithRetry(configretry.BackOffConfig{Enabled: false}), - exporterhelper.WithQueue(exporterhelper.QueueSettings{Enabled: false}), - exporterhelper.WithShutdown(func(context.Context) error { - cancel() - return nil - }), - ) -} diff --git a/exporter/instanaexporter/factory_test.go b/exporter/instanaexporter/factory_test.go deleted file mode 100644 index 2829f93112e9..000000000000 --- a/exporter/instanaexporter/factory_test.go +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package instanaexporter - -import ( - "path/filepath" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/component/componenttest" - "go.opentelemetry.io/collector/config/confighttp" - "go.opentelemetry.io/collector/config/configopaque" - "go.opentelemetry.io/collector/config/configtls" - "go.opentelemetry.io/collector/confmap/confmaptest" - - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter/internal/metadata" -) - -// Test that the factory creates the default configuration -func TestCreateDefaultConfig(t *testing.T) { - factory := NewFactory() - cfg := factory.CreateDefaultConfig() - - assert.Equal(t, &Config{ - ClientConfig: confighttp.ClientConfig{ - Endpoint: "", - Timeout: 30 * time.Second, - Headers: map[string]configopaque.String{}, - WriteBufferSize: 512 * 1024, - }, - }, cfg, "failed to create default config") - - assert.NoError(t, componenttest.CheckConfigStruct(cfg)) -} - -// TestLoadConfig tests that the configuration is loaded correctly -func TestLoadConfig(t *testing.T) { - cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yml")) - require.NoError(t, err) - factory := NewFactory() - - t.Run("valid config", func(t *testing.T) { - cfg := factory.CreateDefaultConfig() - sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "valid").String()) - require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) - - err = component.ValidateConfig(cfg) - - require.NoError(t, err) - assert.Equal(t, &Config{ - ClientConfig: confighttp.ClientConfig{ - Endpoint: "https://example.com/api/", - Timeout: 30 * time.Second, - Headers: map[string]configopaque.String{}, - WriteBufferSize: 512 * 1024, - }, - Endpoint: "https://example.com/api/", - AgentKey: "key1", - }, cfg) - }) - - t.Run("valid config with ca_file", func(t *testing.T) { - cfg := factory.CreateDefaultConfig() - sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "valid_with_ca_file").String()) - require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) - - err = component.ValidateConfig(cfg) - - require.NoError(t, err) - assert.Equal(t, &Config{ - ClientConfig: confighttp.ClientConfig{ - Endpoint: "https://example.com/api/", - Timeout: 30 * time.Second, - Headers: map[string]configopaque.String{}, - WriteBufferSize: 512 * 1024, - TLSSetting: configtls.ClientConfig{ - Config: configtls.Config{ - CAFile: "ca.crt", - }, - }, - }, - Endpoint: "https://example.com/api/", - AgentKey: "key1", - }, cfg) - }) - - t.Run("valid config without ca_file", func(t *testing.T) { - cfg := factory.CreateDefaultConfig() - sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "valid_no_ca_file").String()) - require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) - - err = component.ValidateConfig(cfg) - - require.NoError(t, err) - assert.Equal(t, &Config{ - ClientConfig: confighttp.ClientConfig{ - Endpoint: "https://example.com/api/", - Timeout: 30 * time.Second, - Headers: map[string]configopaque.String{}, - WriteBufferSize: 512 * 1024, - }, - Endpoint: "https://example.com/api/", - AgentKey: "key1", - }, cfg) - }) - - t.Run("bad endpoint", func(t *testing.T) { - cfg := factory.CreateDefaultConfig() - sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "bad_endpoint").String()) - require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) - - err = component.ValidateConfig(cfg) - require.Error(t, err) - }) - - t.Run("non https endpoint", func(t *testing.T) { - cfg := factory.CreateDefaultConfig() - sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "non_https_endpoint").String()) - - require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) - - err = component.ValidateConfig(cfg) - require.Error(t, err) - }) - - t.Run("missing agent key", func(t *testing.T) { - cfg := factory.CreateDefaultConfig() - sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "missing_agent_key").String()) - require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) - - err = component.ValidateConfig(cfg) - require.Error(t, err) - }) -} diff --git a/exporter/instanaexporter/generated_component_test.go b/exporter/instanaexporter/generated_component_test.go deleted file mode 100644 index 9ffa0b0aed8d..000000000000 --- a/exporter/instanaexporter/generated_component_test.go +++ /dev/null @@ -1,134 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package instanaexporter - -import ( - "context" - "testing" - "time" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/component/componenttest" - "go.opentelemetry.io/collector/confmap/confmaptest" - "go.opentelemetry.io/collector/exporter" - "go.opentelemetry.io/collector/exporter/exportertest" - "go.opentelemetry.io/collector/pdata/pcommon" - "go.opentelemetry.io/collector/pdata/plog" - "go.opentelemetry.io/collector/pdata/pmetric" - "go.opentelemetry.io/collector/pdata/ptrace" -) - -func TestComponentFactoryType(t *testing.T) { - require.Equal(t, "instana", NewFactory().Type().String()) -} - -func TestComponentConfigStruct(t *testing.T) { - require.NoError(t, componenttest.CheckConfigStruct(NewFactory().CreateDefaultConfig())) -} - -func TestComponentLifecycle(t *testing.T) { - factory := NewFactory() - - tests := []struct { - name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) - }{ - - { - name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) - }, - }, - } - - cm, err := confmaptest.LoadConf("metadata.yaml") - require.NoError(t, err) - cfg := factory.CreateDefaultConfig() - sub, err := cm.Sub("tests::config") - require.NoError(t, err) - require.NoError(t, sub.Unmarshal(&cfg)) - - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) - require.NoError(t, err) - err = c.Shutdown(context.Background()) - require.NoError(t, err) - }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) - require.NoError(t, err) - host := componenttest.NewNopHost() - err = c.Start(context.Background(), host) - require.NoError(t, err) - require.NotPanics(t, func() { - switch test.name { - case "logs": - e, ok := c.(exporter.Logs) - require.True(t, ok) - logs := generateLifecycleTestLogs() - if !e.Capabilities().MutatesData { - logs.MarkReadOnly() - } - err = e.ConsumeLogs(context.Background(), logs) - case "metrics": - e, ok := c.(exporter.Metrics) - require.True(t, ok) - metrics := generateLifecycleTestMetrics() - if !e.Capabilities().MutatesData { - metrics.MarkReadOnly() - } - err = e.ConsumeMetrics(context.Background(), metrics) - case "traces": - e, ok := c.(exporter.Traces) - require.True(t, ok) - traces := generateLifecycleTestTraces() - if !e.Capabilities().MutatesData { - traces.MarkReadOnly() - } - err = e.ConsumeTraces(context.Background(), traces) - } - }) - - err = c.Shutdown(context.Background()) - require.NoError(t, err) - }) - } -} - -func generateLifecycleTestLogs() plog.Logs { - logs := plog.NewLogs() - rl := logs.ResourceLogs().AppendEmpty() - rl.Resource().Attributes().PutStr("resource", "R1") - l := rl.ScopeLogs().AppendEmpty().LogRecords().AppendEmpty() - l.Body().SetStr("test log message") - l.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) - return logs -} - -func generateLifecycleTestMetrics() pmetric.Metrics { - metrics := pmetric.NewMetrics() - rm := metrics.ResourceMetrics().AppendEmpty() - rm.Resource().Attributes().PutStr("resource", "R1") - m := rm.ScopeMetrics().AppendEmpty().Metrics().AppendEmpty() - m.SetName("test_metric") - dp := m.SetEmptyGauge().DataPoints().AppendEmpty() - dp.Attributes().PutStr("test_attr", "value_1") - dp.SetIntValue(123) - dp.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) - return metrics -} - -func generateLifecycleTestTraces() ptrace.Traces { - traces := ptrace.NewTraces() - rs := traces.ResourceSpans().AppendEmpty() - rs.Resource().Attributes().PutStr("resource", "R1") - span := rs.ScopeSpans().AppendEmpty().Spans().AppendEmpty() - span.Attributes().PutStr("test_attr", "value_1") - span.SetName("test_span") - span.SetStartTimestamp(pcommon.NewTimestampFromTime(time.Now().Add(-1 * time.Second))) - span.SetEndTimestamp(pcommon.NewTimestampFromTime(time.Now())) - return traces -} diff --git a/exporter/instanaexporter/generated_package_test.go b/exporter/instanaexporter/generated_package_test.go deleted file mode 100644 index 516f339423e8..000000000000 --- a/exporter/instanaexporter/generated_package_test.go +++ /dev/null @@ -1,13 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package instanaexporter - -import ( - "testing" - - "go.uber.org/goleak" -) - -func TestMain(m *testing.M) { - goleak.VerifyTestMain(m) -} diff --git a/exporter/instanaexporter/go.mod b/exporter/instanaexporter/go.mod deleted file mode 100644 index 11a3caa0abc7..000000000000 --- a/exporter/instanaexporter/go.mod +++ /dev/null @@ -1,89 +0,0 @@ -module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter - -go 1.21.0 - -require ( - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/confighttp v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/collector/config/configtls v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 - go.uber.org/goleak v1.3.0 - go.uber.org/zap v1.27.0 -) - -require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect - github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/snappy v0.0.4 // indirect - github.com/google/uuid v1.6.0 // indirect - github.com/hashicorp/go-version v1.7.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.8 // indirect - github.com/knadh/koanf/maps v0.1.1 // indirect - github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect - github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/reflectwalk v1.0.2 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/rs/cors v1.10.1 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect -) - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal => ../../internal/coreinternal - -retract ( - v0.76.2 - v0.76.1 - v0.65.0 -) - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../../pkg/pdatautil - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest => ../../pkg/pdatatest - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden => ../../pkg/golden diff --git a/exporter/instanaexporter/go.sum b/exporter/instanaexporter/go.sum deleted file mode 100644 index 3faaee5330e9..000000000000 --- a/exporter/instanaexporter/go.sum +++ /dev/null @@ -1,178 +0,0 @@ -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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= -github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= -github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= -github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= -github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= -github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= -github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= -go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= -go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= -go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= -go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/exporter/instanaexporter/internal/backend/config.go b/exporter/instanaexporter/internal/backend/config.go deleted file mode 100644 index 45a63588fefb..000000000000 --- a/exporter/instanaexporter/internal/backend/config.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package backend // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter/internal/backend" - -const ( - // AttributeInstanaHostID can be used to distinguish multiple hosts' data - // being processed by a single collector (in a chained scenario) - AttributeInstanaHostID = "instana.host.id" - - HeaderKey = "x-instana-key" - HeaderHost = "x-instana-host" - HeaderTime = "x-instana-time" -) diff --git a/exporter/instanaexporter/internal/converter/all_converter.go b/exporter/instanaexporter/internal/converter/all_converter.go deleted file mode 100644 index e90ff5742113..000000000000 --- a/exporter/instanaexporter/internal/converter/all_converter.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package converter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter/internal/converter" - -import ( - "fmt" - - "go.opentelemetry.io/collector/pdata/pcommon" - "go.opentelemetry.io/collector/pdata/ptrace" - "go.uber.org/zap" - - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter/internal/converter/model" -) - -var _ Converter = (*ConvertAllConverter)(nil) - -type ConvertAllConverter struct { - converters []Converter - logger *zap.Logger -} - -func (c *ConvertAllConverter) AcceptsSpans(_ pcommon.Map, _ ptrace.SpanSlice) bool { - return true -} - -func (c *ConvertAllConverter) ConvertSpans(attributes pcommon.Map, spanSlice ptrace.SpanSlice) model.Bundle { - bundle := model.NewBundle() - - for i := 0; i < len(c.converters); i++ { - if !c.converters[i].AcceptsSpans(attributes, spanSlice) { - c.logger.Warn(fmt.Sprintf("Converter %q didn't accept spans", c.converters[i].Name())) - - continue - } - - converterBundle := c.converters[i].ConvertSpans(attributes, spanSlice) - if len(converterBundle.Spans) > 0 { - bundle.Spans = append(bundle.Spans, converterBundle.Spans...) - } - } - - return bundle -} - -func (c *ConvertAllConverter) Name() string { - return "ConvertAllConverter" -} - -func NewConvertAllConverter(logger *zap.Logger) Converter { - - return &ConvertAllConverter{ - converters: []Converter{ - &SpanConverter{logger: logger}, - }, - logger: logger, - } -} diff --git a/exporter/instanaexporter/internal/converter/converter.go b/exporter/instanaexporter/internal/converter/converter.go deleted file mode 100644 index 5fecf52be7f9..000000000000 --- a/exporter/instanaexporter/internal/converter/converter.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package converter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter/internal/converter" - -import ( - "go.opentelemetry.io/collector/pdata/pcommon" - "go.opentelemetry.io/collector/pdata/ptrace" - - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter/internal/converter/model" -) - -type Converter interface { - AcceptsSpans(attributes pcommon.Map, spanSlice ptrace.SpanSlice) bool - ConvertSpans(attributes pcommon.Map, spanSlice ptrace.SpanSlice) model.Bundle - Name() string -} diff --git a/exporter/instanaexporter/internal/converter/model/bundle.go b/exporter/instanaexporter/internal/converter/model/bundle.go deleted file mode 100644 index 52f6349bd557..000000000000 --- a/exporter/instanaexporter/internal/converter/model/bundle.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package model // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter/internal/converter/model" - -import ( - "encoding/json" -) - -type Bundle struct { - Spans []Span `json:"spans,omitempty"` -} - -func NewBundle() Bundle { - return Bundle{ - Spans: []Span{}, - } -} - -func (b *Bundle) Marshal() ([]byte, error) { - json, err := json.Marshal(b) - if err != nil { - return nil, err - } - - return json, nil -} diff --git a/exporter/instanaexporter/internal/converter/model/package_test.go b/exporter/instanaexporter/internal/converter/model/package_test.go deleted file mode 100644 index 078a3432d433..000000000000 --- a/exporter/instanaexporter/internal/converter/model/package_test.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package model - -import ( - "testing" - - "go.uber.org/goleak" -) - -func TestMain(m *testing.M) { - goleak.VerifyTestMain(m) -} diff --git a/exporter/instanaexporter/internal/converter/model/span.go b/exporter/instanaexporter/internal/converter/model/span.go deleted file mode 100644 index d86034211080..000000000000 --- a/exporter/instanaexporter/internal/converter/model/span.go +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package model // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter/internal/converter/model" - -import ( - "fmt" - "time" - - "go.opentelemetry.io/collector/pdata/pcommon" - "go.opentelemetry.io/collector/pdata/ptrace" - - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/traceutil" -) - -const ( - OtelSpanType = "otel" - - InstanaSpanKindServer = "server" - InstanaSpanKindClient = "client" - InstanaSpanKindProducer = "producer" - InstanaSpanKindConsumer = "consumer" - InstanaSpanKindInternal = "internal" - - InstanaDataError = "error" - InstanaDataErrorDetail = "error_detail" -) - -type BatchInfo struct { - Size int `json:"s"` -} - -type FromS struct { - EntityID string `json:"e"` - // Serverless agents fields - Hostless bool `json:"hl,omitempty"` - CloudProvider string `json:"cp,omitempty"` - // Host agent fields - HostID string `json:"h,omitempty"` -} - -type TraceReference struct { - TraceID string `json:"t"` - ParentID string `json:"p,omitempty"` -} - -type OTelSpanData struct { - Kind string `json:"kind"` - HasTraceParent bool `json:"tp,omitempty"` - ServiceName string `json:"service"` - Operation string `json:"operation"` - TraceState string `json:"trace_state,omitempty"` - Tags map[string]string `json:"tags,omitempty"` - Resource map[string]string `json:"resource,omitempty"` -} - -type Span struct { - TraceReference - - SpanID string `json:"s"` - LongTraceID string `json:"lt,omitempty"` - Timestamp uint64 `json:"ts"` - Duration uint64 `json:"d"` - Name string `json:"n"` - From *FromS `json:"f"` - Batch *BatchInfo `json:"b,omitempty"` - Ec int `json:"ec,omitempty"` - Synthetic bool `json:"sy,omitempty"` - CorrelationType string `json:"crtp,omitempty"` - CorrelationID string `json:"crid,omitempty"` - ForeignTrace bool `json:"tp,omitempty"` - Ancestor *TraceReference `json:"ia,omitempty"` - Data OTelSpanData `json:"data,omitempty"` -} - -func ConvertPDataSpanToInstanaSpan(fromS FromS, otelSpan ptrace.Span, serviceName string, attributes pcommon.Map) (Span, error) { - traceID := convertTraceID(otelSpan.TraceID()) - - instanaSpan := Span{ - Name: OtelSpanType, - TraceReference: TraceReference{}, - Timestamp: uint64(otelSpan.StartTimestamp()) / uint64(time.Millisecond), - Duration: (uint64(otelSpan.EndTimestamp()) - uint64(otelSpan.StartTimestamp())) / uint64(time.Millisecond), - Data: OTelSpanData{ - Tags: make(map[string]string), - Resource: make(map[string]string), - }, - From: &fromS, - } - - if len(traceID) != 32 { - return Span{}, fmt.Errorf("failed parsing span, length of TraceID should be 32, but got %d", len(traceID)) - } - - instanaSpan.TraceReference.TraceID = traceID[16:32] - instanaSpan.LongTraceID = traceID - - if !otelSpan.ParentSpanID().IsEmpty() { - instanaSpan.TraceReference.ParentID = convertSpanID(otelSpan.ParentSpanID()) - } - - instanaSpan.SpanID = convertSpanID(otelSpan.SpanID()) - - kind, isEntry := otelKindToInstanaKind(otelSpan.Kind()) - instanaSpan.Data.Kind = kind - - if !otelSpan.ParentSpanID().IsEmpty() && isEntry { - instanaSpan.Data.HasTraceParent = true - } - - instanaSpan.Data.ServiceName = serviceName - - instanaSpan.Data.Operation = otelSpan.Name() - - instanaSpan.Data.TraceState = otelSpan.TraceState().AsRaw() - - otelSpan.Attributes().Range(func(k string, v pcommon.Value) bool { - instanaSpan.Data.Tags[k] = v.AsString() - - return true - }) - - attributes.Range(func(k string, v pcommon.Value) bool { - instanaSpan.Data.Resource[k] = v.AsString() - - return true - }) - - errornous := false - if otelSpan.Status().Code() == ptrace.StatusCodeError { - errornous = true - instanaSpan.Data.Tags[InstanaDataError] = traceutil.StatusCodeStr(otelSpan.Status().Code()) - instanaSpan.Data.Tags[InstanaDataErrorDetail] = otelSpan.Status().Message() - } - - if errornous { - instanaSpan.Ec = 1 - } - - return instanaSpan, nil -} diff --git a/exporter/instanaexporter/internal/converter/model/util.go b/exporter/instanaexporter/internal/converter/model/util.go deleted file mode 100644 index 173fbbad7f64..000000000000 --- a/exporter/instanaexporter/internal/converter/model/util.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package model // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter/internal/converter/model" - -import ( - "encoding/hex" - - "go.opentelemetry.io/collector/pdata/pcommon" - "go.opentelemetry.io/collector/pdata/ptrace" -) - -func convertTraceID(traceID pcommon.TraceID) string { - return hex.EncodeToString(traceID[:]) -} - -func convertSpanID(spanID pcommon.SpanID) string { - return hex.EncodeToString(spanID[:]) -} - -func otelKindToInstanaKind(otelKind ptrace.SpanKind) (string, bool) { - switch otelKind { - case ptrace.SpanKindServer: - return InstanaSpanKindServer, true - case ptrace.SpanKindClient: - return InstanaSpanKindClient, false - case ptrace.SpanKindProducer: - return InstanaSpanKindProducer, false - case ptrace.SpanKindConsumer: - return InstanaSpanKindConsumer, true - case ptrace.SpanKindInternal: - return InstanaSpanKindInternal, false - default: - return "unknown", false - } -} diff --git a/exporter/instanaexporter/internal/converter/model/util_test.go b/exporter/instanaexporter/internal/converter/model/util_test.go deleted file mode 100644 index 87273014ceb6..000000000000 --- a/exporter/instanaexporter/internal/converter/model/util_test.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package model - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "go.opentelemetry.io/collector/pdata/pcommon" -) - -func TestCanConvertSpanID(t *testing.T) { - bytes := [8]byte{1, 2, 3, 4, 10, 11, 12, 13} - - assert.Equal(t, "010203040a0b0c0d", convertSpanID(pcommon.SpanID(bytes))) -} diff --git a/exporter/instanaexporter/internal/converter/package_test.go b/exporter/instanaexporter/internal/converter/package_test.go deleted file mode 100644 index dd30fae768ab..000000000000 --- a/exporter/instanaexporter/internal/converter/package_test.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package converter - -import ( - "testing" - - "go.uber.org/goleak" -) - -func TestMain(m *testing.M) { - goleak.VerifyTestMain(m) -} diff --git a/exporter/instanaexporter/internal/converter/span_converter.go b/exporter/instanaexporter/internal/converter/span_converter.go deleted file mode 100644 index 23eae39ec9e9..000000000000 --- a/exporter/instanaexporter/internal/converter/span_converter.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package converter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter/internal/converter" - -import ( - "fmt" - - "go.opentelemetry.io/collector/pdata/pcommon" - "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.8.0" - "go.uber.org/zap" - - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter/internal/backend" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter/internal/converter/model" -) - -var _ Converter = (*SpanConverter)(nil) - -type SpanConverter struct { - logger *zap.Logger -} - -func (c *SpanConverter) AcceptsSpans(_ pcommon.Map, _ ptrace.SpanSlice) bool { - return true -} - -func (c *SpanConverter) ConvertSpans(attributes pcommon.Map, spanSlice ptrace.SpanSlice) model.Bundle { - bundle := model.NewBundle() - fromS := model.FromS{} - - hostIDValue, ex := attributes.Get(backend.AttributeInstanaHostID) - if !ex { - fromS.HostID = "unknown-host-id" - } else { - fromS.HostID = hostIDValue.AsString() - } - - processIDValue, ex := attributes.Get(conventions.AttributeProcessPID) - if !ex { - fromS.EntityID = "unknown-process-id" - } else { - fromS.EntityID = processIDValue.AsString() - } - - serviceName := "" - serviceNameValue, ex := attributes.Get(conventions.AttributeServiceName) - if ex { - serviceName = serviceNameValue.AsString() - } - - for i := 0; i < spanSlice.Len(); i++ { - otelSpan := spanSlice.At(i) - - instanaSpan, err := model.ConvertPDataSpanToInstanaSpan(fromS, otelSpan, serviceName, attributes) - if err != nil { - c.logger.Warn(fmt.Sprintf("Error converting Open Telemetry span to Instana span: %s", err.Error())) - continue - } - - bundle.Spans = append(bundle.Spans, instanaSpan) - } - - return bundle -} - -func (c *SpanConverter) Name() string { - return "SpanConverter" -} diff --git a/exporter/instanaexporter/internal/converter/span_converter_test.go b/exporter/instanaexporter/internal/converter/span_converter_test.go deleted file mode 100644 index 386cc0d29960..000000000000 --- a/exporter/instanaexporter/internal/converter/span_converter_test.go +++ /dev/null @@ -1,274 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package converter - -import ( - "bytes" - "crypto/rand" - "encoding/json" - "testing" - "time" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/pdata/pcommon" - "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.8.0" - - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter/internal/backend" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter/internal/converter/model" -) - -type SpanOptions struct { - TraceID [16]byte - SpanID [8]byte - ParentID [8]byte - Error string - StartTimestamp time.Duration - EndTimestamp time.Duration -} - -func setupSpan(span ptrace.Span, opts SpanOptions) (err error) { - var empty16 [16]byte - var empty8 [8]byte - - now := time.Now().UnixMilli() - - traceID := opts.TraceID - spanID := opts.SpanID - parentID := opts.ParentID - startTime := opts.StartTimestamp - endTime := opts.EndTimestamp - - if bytes.Equal(traceID[:], empty16[:]) { - traceID, err = generateTraceID() - } - - if bytes.Equal(spanID[:], empty8[:]) { - spanID, err = generateSpanID() - } - - if startTime == time.Second*0 { - startTime = time.Duration(now) - } - - if endTime == time.Second*0 { - endTime = startTime + 1000 - } - - if opts.Error != "" { - span.Status().SetCode(ptrace.StatusCodeError) - span.Status().SetMessage(opts.Error) - } - - if !bytes.Equal(parentID[:], empty8[:]) { - span.SetParentSpanID(parentID) - } - - span.SetStartTimestamp(pcommon.Timestamp(startTime * 1e6)) - span.SetEndTimestamp(pcommon.Timestamp(endTime * 1e6)) - - span.SetSpanID(spanID) - span.SetKind(ptrace.SpanKindClient) - span.SetName("my_operation") - span.TraceState().FromRaw("") - span.SetTraceID(traceID) - - // adding attributes (tags in the instana side) - span.Attributes().PutBool("some_key", true) - return err -} - -func generateAttrs() pcommon.Map { - attrs := pcommon.NewMap() - attrs.PutBool("some_boolean_key", true) - attrs.PutStr("custom_attribute", "ok") - - // test non empty pid - attrs.PutStr(conventions.AttributeProcessPID, "1234") - - // test non empty service name - attrs.PutStr(conventions.AttributeServiceName, "myservice") - - // test non empty instana host id - attrs.PutStr(backend.AttributeInstanaHostID, "myhost1") - - attrs.PutBool("itistrue", true) - - return attrs -} - -func validateInstanaSpanBasics(sp model.Span, t *testing.T) { - if sp.SpanID == "" { - t.Error("expected span id not to be empty") - } - - if sp.TraceID == "" { - t.Error("expected trace id not to be empty") - } - - if sp.Name != "otel" { - t.Errorf("expected span name to be 'otel' but received '%v'", sp.Name) - } - - if sp.Timestamp <= 0 { - t.Errorf("expected timestamp to be provided but received %v", sp.Timestamp) - } - - if sp.Duration <= 0 { - t.Errorf("expected duration to be provided but received %v", sp.Duration) - } - - if sp.Data.ServiceName != "myservice" { - t.Errorf("expected span name to be 'myservice' but received '%v'", sp.Data.ServiceName) - } - - if len(sp.Data.Resource) == 0 { - t.Error("expected resource block not to be empty") - } - - if sp.Data.Resource[conventions.AttributeServiceName] != sp.Data.ServiceName { - t.Errorf("expected resource block to contain same name (%v) as span.Name (%v)", - sp.Data.Resource[conventions.AttributeServiceName], sp.Data.ServiceName) - } - -} - -func validateBundle(jsonData []byte, t *testing.T, fn func(model.Span, *testing.T)) { - var bundle model.Bundle - - err := json.Unmarshal(jsonData, &bundle) - - if err != nil { - t.Fatal(err) - } - - if len(bundle.Spans) == 0 { - t.Log("bundle contains no spans") - return - } - - for _, span := range bundle.Spans { - fn(span, t) - } -} - -func validateSpanError(sp model.Span, shouldHaveError bool, t *testing.T) { - if shouldHaveError { - if sp.Ec <= 0 { - t.Error("expected span to have errors (ec = 1)") - } - - if sp.Data.Tags[model.InstanaDataError] == "" { - t.Error("expected data.error to exist") - } - - if sp.Data.Tags[model.InstanaDataErrorDetail] == "" { - t.Error("expected data.error_detail to exist") - } - - return - } - - if sp.Ec > 0 { - t.Error("expected span not to have errors (ec = 0)") - } - - if sp.Data.Tags[model.InstanaDataError] != "" { - t.Error("expected data.error to be empty") - } - - if sp.Data.Tags[model.InstanaDataErrorDetail] != "" { - t.Error("expected data.error_detail to be empty") - } -} - -func TestSpanBasics(t *testing.T) { - spanSlice := ptrace.NewSpanSlice() - - sp1 := spanSlice.AppendEmpty() - - err := setupSpan(sp1, SpanOptions{}) - require.NoError(t, err) - - attrs := generateAttrs() - conv := SpanConverter{} - bundle := conv.ConvertSpans(attrs, spanSlice) - data, _ := json.MarshalIndent(bundle, "", " ") - - validateBundle(data, t, func(sp model.Span, t *testing.T) { - validateInstanaSpanBasics(sp, t) - validateSpanError(sp, false, t) - }) -} - -func TestSpanCorrelation(t *testing.T) { - spanSlice := ptrace.NewSpanSlice() - - sp1 := spanSlice.AppendEmpty() - err := setupSpan(sp1, SpanOptions{}) - require.NoError(t, err) - - sp2 := spanSlice.AppendEmpty() - err = setupSpan(sp2, SpanOptions{ - ParentID: sp1.SpanID(), - }) - require.NoError(t, err) - - sp3 := spanSlice.AppendEmpty() - err = setupSpan(sp3, SpanOptions{ - ParentID: sp2.SpanID(), - }) - require.NoError(t, err) - - sp4 := spanSlice.AppendEmpty() - require.NoError(t, setupSpan(sp4, SpanOptions{ - ParentID: sp1.SpanID(), - })) - - attrs := generateAttrs() - conv := SpanConverter{} - bundle := conv.ConvertSpans(attrs, spanSlice) - data, _ := json.MarshalIndent(bundle, "", " ") - - spanIDList := make(map[string]bool) - - validateBundle(data, t, func(sp model.Span, t *testing.T) { - validateInstanaSpanBasics(sp, t) - validateSpanError(sp, false, t) - - spanIDList[sp.SpanID] = true - - if sp.ParentID != "" && !spanIDList[sp.ParentID] { - t.Errorf("span %v expected to have parent id %v", sp.SpanID, sp.ParentID) - } - }) -} -func TestSpanWithError(t *testing.T) { - spanSlice := ptrace.NewSpanSlice() - - sp1 := spanSlice.AppendEmpty() - require.NoError(t, setupSpan(sp1, SpanOptions{ - Error: "some error", - })) - - attrs := generateAttrs() - conv := SpanConverter{} - bundle := conv.ConvertSpans(attrs, spanSlice) - data, _ := json.MarshalIndent(bundle, "", " ") - - validateBundle(data, t, func(sp model.Span, t *testing.T) { - validateInstanaSpanBasics(sp, t) - validateSpanError(sp, true, t) - }) -} - -func generateTraceID() (data [16]byte, err error) { - _, err = rand.Read(data[:]) - return data, err -} - -func generateSpanID() (data [8]byte, err error) { - _, err = rand.Read(data[:]) - return data, err -} diff --git a/exporter/instanaexporter/internal/metadata/generated_status.go b/exporter/instanaexporter/internal/metadata/generated_status.go deleted file mode 100644 index 16c3c2a611a5..000000000000 --- a/exporter/instanaexporter/internal/metadata/generated_status.go +++ /dev/null @@ -1,15 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" -) - -var ( - Type = component.MustNewType("instana") -) - -const ( - TracesStability = component.StabilityLevelDeprecated -) diff --git a/exporter/instanaexporter/internal/metadata/generated_telemetry.go b/exporter/instanaexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index 7fc4d672670a..000000000000 --- a/exporter/instanaexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/instana") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/instana") -} diff --git a/exporter/instanaexporter/internal/metadata/generated_telemetry_test.go b/exporter/instanaexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index adf6c42509dd..000000000000 --- a/exporter/instanaexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/instana", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/instana", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/instanaexporter/metadata.yaml b/exporter/instanaexporter/metadata.yaml deleted file mode 100644 index 95f3c88dd5f0..000000000000 --- a/exporter/instanaexporter/metadata.yaml +++ /dev/null @@ -1,13 +0,0 @@ -type: instana -scope_name: otelcol/instana - -status: - class: exporter - stability: - deprecated: [traces] - distributions: [contrib] - codeowners: - active: [jpkrohling, hickeyma] - -tests: - expect_consumer_error: true \ No newline at end of file diff --git a/exporter/instanaexporter/testdata/config.yml b/exporter/instanaexporter/testdata/config.yml deleted file mode 100644 index f4fbb355a13a..000000000000 --- a/exporter/instanaexporter/testdata/config.yml +++ /dev/null @@ -1,23 +0,0 @@ -instana/bad_endpoint: - endpoint: never a url - agent_key: key1 - tls: - ca_file: ca.crt -instana/missing_agent_key: - endpoint: https://example.com/api/ - tls: - ca_file: ca.crt -instana/valid: - endpoint: https://example.com/api/ - agent_key: key1 -instana/valid_with_ca_file: - endpoint: https://example.com/api/ - agent_key: key1 - tls: - ca_file: ca.crt -instana/valid_no_ca_file: - endpoint: https://example.com/api/ - agent_key: key1 -instana/non_https_endpoint: - endpoint: http://example.com/api/ - agent_key: key1 diff --git a/exporter/kafkaexporter/README.md b/exporter/kafkaexporter/README.md index d5ac9644199c..1fcb128a8a52 100644 --- a/exporter/kafkaexporter/README.md +++ b/exporter/kafkaexporter/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fkafka%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fkafka) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fkafka%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fkafka) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@pavolloffay](https://www.github.com/pavolloffay), [@MovieStoreGuy](https://www.github.com/MovieStoreGuy) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [core]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib @@ -24,8 +24,8 @@ The following settings can be optionally configured: - `brokers` (default = localhost:9092): The list of kafka brokers. - `resolve_canonical_bootstrap_servers_only` (default = false): Whether to resolve then reverse-lookup broker IPs during startup. - `client_id` (default = "sarama"): The client ID to configure the Sarama Kafka client with. The client ID will be used for all produce requests. -- `topic` (default = otlp_spans for traces, otlp_metrics for metrics, otlp_logs for logs): The name of the kafka topic to export to. -- `topic_from_attribute` (default = ""): Specify the resource attribute whose value should be used as the message's topic. This option, when set, will take precedence over the default topic. If `topic_from_attribute` is not set, the message's topic will be set to the value of the configuration option `topic` instead. +- `topic` (default = otlp_spans for traces, otlp_metrics for metrics, otlp_logs for logs): The name of the default kafka topic to export to. See [Destination Topic](#destination-topic) below for more details. +- `topic_from_attribute` (default = ""): Specify the resource attribute whose value should be used as the message's topic. See [Destination Topic](#destination-topic) below for more details. - `encoding` (default = otlp_proto): The encoding of the traces sent to kafka. All available encodings: - `otlp_proto`: payload is Protobuf serialized from `ExportTraceServiceRequest` if set as a traces exporter or `ExportMetricsServiceRequest` for metrics or `ExportLogsServiceRequest` for logs. - `otlp_json`: payload is JSON serialized from `ExportTraceServiceRequest` if set as a traces exporter or `ExportMetricsServiceRequest` for metrics or `ExportLogsServiceRequest` for logs. @@ -38,6 +38,7 @@ The following settings can be optionally configured: - `raw`: if the log record body is a byte array, it is sent as is. Otherwise, it is serialized to JSON. Resource and record attributes are discarded. - `partition_traces_by_id` (default = false): configures the exporter to include the trace ID as the message key in trace messages sent to kafka. *Please note:* this setting does not have any effect on Jaeger encoding exporters since Jaeger exporters include trace ID as the message key by default. - `partition_metrics_by_resource_attributes` (default = false) configures the exporter to include the hash of sorted resource attributes as the message partitioning key in metric messages sent to kafka. +- `partition_logs_by_resource_attributes` (default = false) configures the exporter to include the hash of sorted resource attributes as the message partitioning key in log messages sent to kafka. - `auth` - `plain_text` - `username`: The username to use. @@ -45,9 +46,9 @@ The following settings can be optionally configured: - `sasl` - `username`: The username to use. - `password`: The password to use - - `mechanism`: The SASL mechanism to use (SCRAM-SHA-256, SCRAM-SHA-512, AWS_MSK_IAM or PLAIN) + - `mechanism`: The SASL mechanism to use (SCRAM-SHA-256, SCRAM-SHA-512, AWS_MSK_IAM, AWS_MSK_IAM_OAUTHBEARER or PLAIN) - `version` (default = 0): The SASL protocol version to use (0 or 1) - - `aws_msk.region`: AWS Region in case of AWS_MSK_IAM mechanism + - `aws_msk.region`: AWS Region in case of AWS_MSK_IAM or AWS_MSK_IAM_OAUTHBEARER mechanism - `aws_msk.broker_addr`: MSK Broker address in case of AWS_MSK_IAM mechanism - `tls`: see [TLS Configuration Settings](https://github.com/open-telemetry/opentelemetry-collector/blob/main/config/configtls/README.md) for the full set of available options. - `ca_file`: path to the CA cert. For a client this verifies the server certificate. Should @@ -68,6 +69,7 @@ The following settings can be optionally configured: - `password`: The Kerberos password used for authenticate with KDC - `config_file`: Path to Kerberos configuration. i.e /etc/krb5.conf - `keytab_file`: Path to keytab file. i.e /etc/security/kafka.keytab + - `disable_fast_negotiation`: Disable PA-FX-FAST negotiation (Pre-Authentication Framework - Fast). Some common Kerberos implementations do not support PA-FX-FAST negotiation. This is set to `false` by default. - `metadata` - `full` (default = true): Whether to maintain a full set of metadata. When disabled, the client does not make the initial request to broker at the @@ -103,3 +105,9 @@ exporters: - localhost:9092 protocol_version: 2.0.0 ``` + +## Destination Topic +The destination topic can be defined in a few different ways and takes priority in the following order: +1. When `topic_from_attribute` is configured, and the corresponding attribute is found on the ingested data, the value of this attribute is used. +2. If a prior component in the collector pipeline sets the topic on the context via the `topic.WithTopic` function (from the `github.com/open-telemetry/opentelemetry-collector-contrib/pkg/kafka/topic` package), the value set in the context is used. +3. Finally, the `topic` configuration is used as a default/fallback destination. diff --git a/exporter/kafkaexporter/config.go b/exporter/kafkaexporter/config.go index d048b27a88f9..aac2cf77c097 100644 --- a/exporter/kafkaexporter/config.go +++ b/exporter/kafkaexporter/config.go @@ -17,9 +17,9 @@ import ( // Config defines configuration for Kafka exporter. type Config struct { - exporterhelper.TimeoutSettings `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. - exporterhelper.QueueSettings `mapstructure:"sending_queue"` - configretry.BackOffConfig `mapstructure:"retry_on_failure"` + TimeoutSettings exporterhelper.TimeoutConfig `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` + configretry.BackOffConfig `mapstructure:"retry_on_failure"` // The list of kafka brokers (default localhost:9092) Brokers []string `mapstructure:"brokers"` @@ -53,6 +53,8 @@ type Config struct { PartitionMetricsByResourceAttributes bool `mapstructure:"partition_metrics_by_resource_attributes"` + PartitionLogsByResourceAttributes bool `mapstructure:"partition_logs_by_resource_attributes"` + // Metadata is the namespace for metadata management properties used by the // Client, and shared by the Producer/Consumer. Metadata Metadata `mapstructure:"metadata"` @@ -142,10 +144,10 @@ func validateSASLConfig(c *kafka.SASLConfig) error { } switch c.Mechanism { - case "PLAIN", "AWS_MSK_IAM", "SCRAM-SHA-256", "SCRAM-SHA-512": + case "PLAIN", "AWS_MSK_IAM", "AWS_MSK_IAM_OAUTHBEARER", "SCRAM-SHA-256", "SCRAM-SHA-512": // Do nothing, valid mechanism default: - return fmt.Errorf("auth.sasl.mechanism should be one of 'PLAIN', 'AWS_MSK_IAM', 'SCRAM-SHA-256' or 'SCRAM-SHA-512'. configured value %v", c.Mechanism) + return fmt.Errorf("auth.sasl.mechanism should be one of 'PLAIN', 'AWS_MSK_IAM', 'AWS_MSK_IAM_OAUTHBEARER', 'SCRAM-SHA-256' or 'SCRAM-SHA-512'. configured value %v", c.Mechanism) } if c.Version < 0 || c.Version > 1 { diff --git a/exporter/kafkaexporter/config_test.go b/exporter/kafkaexporter/config_test.go index 4b43f948ebe3..3264e996cbe5 100644 --- a/exporter/kafkaexporter/config_test.go +++ b/exporter/kafkaexporter/config_test.go @@ -39,7 +39,7 @@ func TestLoadConfig(t *testing.T) { // intentionally left blank so we use default config }, expected: &Config{ - TimeoutSettings: exporterhelper.TimeoutSettings{ + TimeoutSettings: exporterhelper.TimeoutConfig{ Timeout: 10 * time.Second, }, BackOffConfig: configretry.BackOffConfig{ @@ -50,7 +50,7 @@ func TestLoadConfig(t *testing.T) { RandomizationFactor: backoff.DefaultRandomizationFactor, Multiplier: backoff.DefaultMultiplier, }, - QueueSettings: exporterhelper.QueueSettings{ + QueueSettings: exporterhelper.QueueConfig{ Enabled: true, NumConsumers: 2, QueueSize: 10, @@ -59,6 +59,7 @@ func TestLoadConfig(t *testing.T) { Encoding: "otlp_proto", PartitionTracesByID: true, PartitionMetricsByResourceAttributes: true, + PartitionLogsByResourceAttributes: true, Brokers: []string{"foo:123", "bar:456"}, ClientID: "test_client_id", Authentication: kafka.Authentication{ @@ -94,7 +95,7 @@ func TestLoadConfig(t *testing.T) { } }, expected: &Config{ - TimeoutSettings: exporterhelper.TimeoutSettings{ + TimeoutSettings: exporterhelper.TimeoutConfig{ Timeout: 10 * time.Second, }, BackOffConfig: configretry.BackOffConfig{ @@ -105,7 +106,7 @@ func TestLoadConfig(t *testing.T) { RandomizationFactor: backoff.DefaultRandomizationFactor, Multiplier: backoff.DefaultMultiplier, }, - QueueSettings: exporterhelper.QueueSettings{ + QueueSettings: exporterhelper.QueueConfig{ Enabled: true, NumConsumers: 2, QueueSize: 10, @@ -114,6 +115,7 @@ func TestLoadConfig(t *testing.T) { Encoding: "otlp_proto", PartitionTracesByID: true, PartitionMetricsByResourceAttributes: true, + PartitionLogsByResourceAttributes: true, Brokers: []string{"foo:123", "bar:456"}, ClientID: "test_client_id", Authentication: kafka.Authentication{ @@ -148,7 +150,7 @@ func TestLoadConfig(t *testing.T) { conf.ResolveCanonicalBootstrapServersOnly = true }, expected: &Config{ - TimeoutSettings: exporterhelper.TimeoutSettings{ + TimeoutSettings: exporterhelper.TimeoutConfig{ Timeout: 10 * time.Second, }, BackOffConfig: configretry.BackOffConfig{ @@ -159,7 +161,7 @@ func TestLoadConfig(t *testing.T) { RandomizationFactor: backoff.DefaultRandomizationFactor, Multiplier: backoff.DefaultMultiplier, }, - QueueSettings: exporterhelper.QueueSettings{ + QueueSettings: exporterhelper.QueueConfig{ Enabled: true, NumConsumers: 2, QueueSize: 10, @@ -168,6 +170,7 @@ func TestLoadConfig(t *testing.T) { Encoding: "otlp_proto", PartitionTracesByID: true, PartitionMetricsByResourceAttributes: true, + PartitionLogsByResourceAttributes: true, Brokers: []string{"foo:123", "bar:456"}, ClientID: "test_client_id", ResolveCanonicalBootstrapServersOnly: true, @@ -199,7 +202,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) @@ -269,7 +272,7 @@ func TestValidate_sasl_mechanism(t *testing.T) { } err := config.Validate() - assert.EqualError(t, err, "auth.sasl.mechanism should be one of 'PLAIN', 'AWS_MSK_IAM', 'SCRAM-SHA-256' or 'SCRAM-SHA-512'. configured value FAKE") + assert.EqualError(t, err, "auth.sasl.mechanism should be one of 'PLAIN', 'AWS_MSK_IAM', 'AWS_MSK_IAM_OAUTHBEARER', 'SCRAM-SHA-256' or 'SCRAM-SHA-512'. configured value FAKE") } func TestValidate_sasl_version(t *testing.T) { @@ -332,8 +335,8 @@ func Test_saramaProducerCompressionCodec(t *testing.T) { for name, test := range tests { t.Run(name, func(t *testing.T) { c, err := saramaProducerCompressionCodec(test.compression) - assert.Equal(t, c, test.expectedCompression) - assert.Equal(t, err, test.expectedError) + assert.Equal(t, test.expectedCompression, c) + assert.Equal(t, test.expectedError, err) }) } } diff --git a/exporter/kafkaexporter/factory.go b/exporter/kafkaexporter/factory.go index d990a17dab8d..eb366d7cfa8b 100644 --- a/exporter/kafkaexporter/factory.go +++ b/exporter/kafkaexporter/factory.go @@ -40,45 +40,16 @@ const ( defaultFluxMaxMessages = 0 // partitioning metrics by resource attributes is disabled by default defaultPartitionMetricsByResourceAttributesEnabled = false + // partitioning logs by resource attributes is disabled by default + defaultPartitionLogsByResourceAttributesEnabled = false ) // FactoryOption applies changes to kafkaExporterFactory. type FactoryOption func(factory *kafkaExporterFactory) -// withTracesMarshalers adds tracesMarshalers. -func withTracesMarshalers(tracesMarshalers ...TracesMarshaler) FactoryOption { - return func(factory *kafkaExporterFactory) { - for _, marshaler := range tracesMarshalers { - factory.tracesMarshalers[marshaler.Encoding()] = marshaler - } - } -} - -// withMetricsMarshalers adds additional metric marshalers to the exporter factory. -func withMetricsMarshalers(metricMarshalers ...MetricsMarshaler) FactoryOption { - return func(factory *kafkaExporterFactory) { - for _, marshaler := range metricMarshalers { - factory.metricsMarshalers[marshaler.Encoding()] = marshaler - } - } -} - -// withLogsMarshalers adds additional log marshalers to the exporter factory. -func withLogsMarshalers(logsMarshalers ...LogsMarshaler) FactoryOption { - return func(factory *kafkaExporterFactory) { - for _, marshaler := range logsMarshalers { - factory.logsMarshalers[marshaler.Encoding()] = marshaler - } - } -} - // NewFactory creates Kafka exporter factory. func NewFactory(options ...FactoryOption) exporter.Factory { - f := &kafkaExporterFactory{ - tracesMarshalers: tracesMarshalers(), - metricsMarshalers: metricsMarshalers(), - logsMarshalers: logsMarshalers(), - } + f := &kafkaExporterFactory{} for _, o := range options { o(f) } @@ -93,15 +64,16 @@ func NewFactory(options ...FactoryOption) exporter.Factory { func createDefaultConfig() component.Config { return &Config{ - TimeoutSettings: exporterhelper.NewDefaultTimeoutSettings(), + TimeoutSettings: exporterhelper.NewDefaultTimeoutConfig(), BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), Brokers: []string{defaultBroker}, ClientID: defaultClientID, // using an empty topic to track when it has not been set by user, default is based on traces or metrics. Topic: "", Encoding: defaultEncoding, PartitionMetricsByResourceAttributes: defaultPartitionMetricsByResourceAttributesEnabled, + PartitionLogsByResourceAttributes: defaultPartitionLogsByResourceAttributesEnabled, Metadata: Metadata{ Full: defaultMetadataFull, Retry: MetadataRetry{ @@ -118,15 +90,11 @@ func createDefaultConfig() component.Config { } } -type kafkaExporterFactory struct { - tracesMarshalers map[string]TracesMarshaler - metricsMarshalers map[string]MetricsMarshaler - logsMarshalers map[string]LogsMarshaler -} +type kafkaExporterFactory struct{} func (f *kafkaExporterFactory) createTracesExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exporter.Traces, error) { oCfg := *(cfg.(*Config)) // Clone the config @@ -136,11 +104,8 @@ func (f *kafkaExporterFactory) createTracesExporter( if oCfg.Encoding == "otlp_json" { set.Logger.Info("otlp_json is considered experimental and should not be used in a production environment") } - exp, err := newTracesExporter(oCfg, set, f.tracesMarshalers) - if err != nil { - return nil, err - } - return exporterhelper.NewTracesExporter( + exp := newTracesExporter(oCfg, set) + return exporterhelper.NewTraces( ctx, set, &oCfg, @@ -148,7 +113,7 @@ func (f *kafkaExporterFactory) createTracesExporter( exporterhelper.WithCapabilities(consumer.Capabilities{MutatesData: false}), // Disable exporterhelper Timeout, because we cannot pass a Context to the Producer, // and will rely on the sarama Producer Timeout logic. - exporterhelper.WithTimeout(exporterhelper.TimeoutSettings{Timeout: 0}), + exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}), exporterhelper.WithRetry(oCfg.BackOffConfig), exporterhelper.WithQueue(oCfg.QueueSettings), exporterhelper.WithStart(exp.start), @@ -157,7 +122,7 @@ func (f *kafkaExporterFactory) createTracesExporter( func (f *kafkaExporterFactory) createMetricsExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exporter.Metrics, error) { oCfg := *(cfg.(*Config)) // Clone the config @@ -167,11 +132,8 @@ func (f *kafkaExporterFactory) createMetricsExporter( if oCfg.Encoding == "otlp_json" { set.Logger.Info("otlp_json is considered experimental and should not be used in a production environment") } - exp, err := newMetricsExporter(oCfg, set, f.metricsMarshalers) - if err != nil { - return nil, err - } - return exporterhelper.NewMetricsExporter( + exp := newMetricsExporter(oCfg, set) + return exporterhelper.NewMetrics( ctx, set, &oCfg, @@ -179,7 +141,7 @@ func (f *kafkaExporterFactory) createMetricsExporter( exporterhelper.WithCapabilities(consumer.Capabilities{MutatesData: false}), // Disable exporterhelper Timeout, because we cannot pass a Context to the Producer, // and will rely on the sarama Producer Timeout logic. - exporterhelper.WithTimeout(exporterhelper.TimeoutSettings{Timeout: 0}), + exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}), exporterhelper.WithRetry(oCfg.BackOffConfig), exporterhelper.WithQueue(oCfg.QueueSettings), exporterhelper.WithStart(exp.start), @@ -188,7 +150,7 @@ func (f *kafkaExporterFactory) createMetricsExporter( func (f *kafkaExporterFactory) createLogsExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exporter.Logs, error) { oCfg := *(cfg.(*Config)) // Clone the config @@ -198,11 +160,8 @@ func (f *kafkaExporterFactory) createLogsExporter( if oCfg.Encoding == "otlp_json" { set.Logger.Info("otlp_json is considered experimental and should not be used in a production environment") } - exp, err := newLogsExporter(oCfg, set, f.logsMarshalers) - if err != nil { - return nil, err - } - return exporterhelper.NewLogsExporter( + exp := newLogsExporter(oCfg, set) + return exporterhelper.NewLogs( ctx, set, &oCfg, @@ -210,7 +169,7 @@ func (f *kafkaExporterFactory) createLogsExporter( exporterhelper.WithCapabilities(consumer.Capabilities{MutatesData: false}), // Disable exporterhelper Timeout, because we cannot pass a Context to the Producer, // and will rely on the sarama Producer Timeout logic. - exporterhelper.WithTimeout(exporterhelper.TimeoutSettings{Timeout: 0}), + exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}), exporterhelper.WithRetry(oCfg.BackOffConfig), exporterhelper.WithQueue(oCfg.QueueSettings), exporterhelper.WithStart(exp.start), diff --git a/exporter/kafkaexporter/factory_test.go b/exporter/kafkaexporter/factory_test.go index 6760029478df..96fdfbd243e2 100644 --- a/exporter/kafkaexporter/factory_test.go +++ b/exporter/kafkaexporter/factory_test.go @@ -5,45 +5,15 @@ package kafkaexporter import ( "context" - "errors" "net" "testing" - "github.com/IBM/sarama" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/exporter/exportertest" - "go.opentelemetry.io/collector/pdata/plog" - "go.opentelemetry.io/collector/pdata/pmetric" - "go.opentelemetry.io/collector/pdata/ptrace" ) -// data is a simple means of allowing -// interchangeability between the -// different marshaller types -type data interface { - ptrace.Traces | plog.Logs | pmetric.Metrics -} - -type mockMarshaler[Data data] struct { - consume func(d Data, topic string) ([]*sarama.ProducerMessage, error) - encoding string -} - -func (mm *mockMarshaler[Data]) Encoding() string { return mm.encoding } - -func (mm *mockMarshaler[Data]) Marshal(d Data, topic string) ([]*sarama.ProducerMessage, error) { - if mm.consume != nil { - return mm.consume(d, topic) - } - return nil, errors.New("not implemented") -} - -func newMockMarshaler[Data data](encoding string) *mockMarshaler[Data] { - return &mockMarshaler[Data]{encoding: encoding} -} - // applyConfigOption is used to modify values of the // the default exporter config to make it easier to // use the return in a test table set up @@ -69,7 +39,7 @@ func TestCreateMetricExporter(t *testing.T) { name string conf *Config marshalers []MetricsMarshaler - err error + err *net.DNSError }{ { name: "valid config (no validating broker)", @@ -100,18 +70,6 @@ func TestCreateMetricExporter(t *testing.T) { marshalers: nil, err: nil, }, - { - name: "custom_encoding", - conf: applyConfigOption(func(conf *Config) { - // Disabling broker check to ensure encoding work - conf.Metadata.Full = false - conf.Encoding = "custom" - }), - marshalers: []MetricsMarshaler{ - newMockMarshaler[pmetric.Metrics]("custom"), - }, - err: nil, - }, } for _, tc := range tests { @@ -119,10 +77,10 @@ func TestCreateMetricExporter(t *testing.T) { t.Run(tc.name, func(t *testing.T) { t.Parallel() - f := NewFactory(withMetricsMarshalers(tc.marshalers...)) - exporter, err := f.CreateMetricsExporter( + f := NewFactory() + exporter, err := f.CreateMetrics( context.Background(), - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), tc.conf, ) require.NoError(t, err) @@ -146,7 +104,7 @@ func TestCreateLogExporter(t *testing.T) { name string conf *Config marshalers []LogsMarshaler - err error + err *net.DNSError }{ { name: "valid config (no validating broker)", @@ -177,18 +135,6 @@ func TestCreateLogExporter(t *testing.T) { marshalers: nil, err: nil, }, - { - name: "custom_encoding", - conf: applyConfigOption(func(conf *Config) { - // Disabling broker check to ensure encoding work - conf.Metadata.Full = false - conf.Encoding = "custom" - }), - marshalers: []LogsMarshaler{ - newMockMarshaler[plog.Logs]("custom"), - }, - err: nil, - }, } for _, tc := range tests { @@ -196,10 +142,10 @@ func TestCreateLogExporter(t *testing.T) { t.Run(tc.name, func(t *testing.T) { t.Parallel() - f := NewFactory(withLogsMarshalers(tc.marshalers...)) - exporter, err := f.CreateLogsExporter( + f := NewFactory() + exporter, err := f.CreateLogs( context.Background(), - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), tc.conf, ) require.NoError(t, err) @@ -223,7 +169,7 @@ func TestCreateTraceExporter(t *testing.T) { name string conf *Config marshalers []TracesMarshaler - err error + err *net.DNSError }{ { name: "valid config (no validating brokers)", @@ -254,18 +200,6 @@ func TestCreateTraceExporter(t *testing.T) { marshalers: nil, err: nil, }, - { - name: "custom_encoding", - conf: applyConfigOption(func(conf *Config) { - // Disabling broker check to ensure encoding work - conf.Metadata.Full = false - conf.Encoding = "custom" - }), - marshalers: []TracesMarshaler{ - newMockMarshaler[ptrace.Traces]("custom"), - }, - err: nil, - }, } for _, tc := range tests { @@ -273,10 +207,10 @@ func TestCreateTraceExporter(t *testing.T) { t.Run(tc.name, func(t *testing.T) { t.Parallel() - f := NewFactory(withTracesMarshalers(tc.marshalers...)) - exporter, err := f.CreateTracesExporter( + f := NewFactory() + exporter, err := f.CreateTraces( context.Background(), - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), tc.conf, ) require.NoError(t, err) diff --git a/exporter/kafkaexporter/generated_component_test.go b/exporter/kafkaexporter/generated_component_test.go index f95de0a3faa0..40de95161619 100644 --- a/exporter/kafkaexporter/generated_component_test.go +++ b/exporter/kafkaexporter/generated_component_test.go @@ -32,27 +32,27 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, { name: "metrics", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg) }, }, { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -64,9 +64,9 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) diff --git a/exporter/kafkaexporter/go.mod b/exporter/kafkaexporter/go.mod index c63ccdf12076..82b25e75a13f 100644 --- a/exporter/kafkaexporter/go.mod +++ b/exporter/kafkaexporter/go.mod @@ -1,54 +1,69 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter -go 1.21.0 +go 1.22.0 require ( - github.com/IBM/sarama v1.43.2 + github.com/IBM/sarama v1.43.3 github.com/cenkalti/backoff/v4 v4.3.0 github.com/gogo/protobuf v1.3.2 - github.com/jaegertracing/jaeger v1.57.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.102.0 + github.com/jaegertracing/jaeger v1.62.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/kafka/topic v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.116.0 github.com/openzipkin/zipkin-go v0.4.3 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/collector/config/configtls v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/pdata/testdata v0.102.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/config/configtls v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/pdata/testdata v0.116.0 + go.opentelemetry.io/collector/semconv v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 ) require ( - github.com/apache/thrift v0.20.0 // indirect - github.com/aws/aws-sdk-go v1.53.11 // indirect - github.com/beorn7/perks v1.0.1 // indirect + github.com/apache/thrift v0.21.0 // indirect + github.com/aws/aws-msk-iam-sasl-signer-go v1.0.0 // indirect + github.com/aws/aws-sdk-go v1.55.5 // indirect + github.com/aws/aws-sdk-go-v2 v1.19.0 // indirect + github.com/aws/aws-sdk-go-v2/config v1.18.28 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.27 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.5 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.29 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.3.36 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.29 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.12.13 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.13 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.19.3 // indirect + github.com/aws/smithy-go v1.13.5 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/eapache/go-resiliency v1.6.0 // indirect + github.com/eapache/go-resiliency v1.7.0 // indirect github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 // indirect github.com/eapache/queue v1.1.0 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect github.com/jcmturner/aescts/v2 v2.0.0 // indirect github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect github.com/jcmturner/gofork v1.7.6 // indirect @@ -56,40 +71,45 @@ require ( github.com/jcmturner/rpc/v2 v2.0.3 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/compress v1.17.10 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/scram v1.1.2 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configopaque v1.9.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - golang.org/x/crypto v0.23.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + go.opentelemetry.io/collector/config/configopaque v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/net v0.30.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) @@ -99,6 +119,8 @@ replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal => ../../pkg/batchpersignal +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/kafka/topic => ../../pkg/kafka/topic + replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger => ../../pkg/translator/jaeger retract ( diff --git a/exporter/kafkaexporter/go.sum b/exporter/kafkaexporter/go.sum index d7e81439bb41..282560ba490f 100644 --- a/exporter/kafkaexporter/go.sum +++ b/exporter/kafkaexporter/go.sum @@ -1,11 +1,35 @@ -github.com/IBM/sarama v1.43.2 h1:HABeEqRUh32z8yzY2hGB/j8mHSzC/HA9zlEjqFNCzSw= -github.com/IBM/sarama v1.43.2/go.mod h1:Kyo4WkF24Z+1nz7xeVUFWIuKVV8RS3wM8mkvPKMdXFQ= -github.com/apache/thrift v0.20.0 h1:631+KvYbsBZxmuJjYwhezVsrfc/TbqtZV4QcxOX1fOI= -github.com/apache/thrift v0.20.0/go.mod h1:hOk1BQqcp2OLzGsyVXdfMk7YFlMxK3aoEVhjD06QhB8= -github.com/aws/aws-sdk-go v1.53.11 h1:KcmduYvX15rRqt4ZU/7jKkmDxU/G87LJ9MUI0yQJh00= -github.com/aws/aws-sdk-go v1.53.11/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= -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/IBM/sarama v1.43.3 h1:Yj6L2IaNvb2mRBop39N7mmJAHBVY3dTPncr3qGVkxPA= +github.com/IBM/sarama v1.43.3/go.mod h1:FVIRaLrhK3Cla/9FfRF5X9Zua2KpS3SYIXxhac1H+FQ= +github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE= +github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw= +github.com/aws/aws-msk-iam-sasl-signer-go v1.0.0 h1:UyjtGmO0Uwl/K+zpzPwLoXzMhcN9xmnR2nrqJoBrg3c= +github.com/aws/aws-msk-iam-sasl-signer-go v1.0.0/go.mod h1:TJAXuFs2HcMib3sN5L0gUC+Q01Qvy3DemvA55WuC+iA= +github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= +github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/aws/aws-sdk-go-v2 v1.19.0 h1:klAT+y3pGFBU/qVf1uzwttpBbiuozJYWzNLHioyDJ+k= +github.com/aws/aws-sdk-go-v2 v1.19.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= +github.com/aws/aws-sdk-go-v2/config v1.18.28 h1:TINEaKyh1Td64tqFvn09iYpKiWjmHYrG1fa91q2gnqw= +github.com/aws/aws-sdk-go-v2/config v1.18.28/go.mod h1:nIL+4/8JdAuNHEjn/gPEXqtnS02Q3NXB/9Z7o5xE4+A= +github.com/aws/aws-sdk-go-v2/credentials v1.13.27 h1:dz0yr/yR1jweAnsCx+BmjerUILVPQ6FS5AwF/OyG1kA= +github.com/aws/aws-sdk-go-v2/credentials v1.13.27/go.mod h1:syOqAek45ZXZp29HlnRS/BNgMIW6uiRmeuQsz4Qh2UE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.5 h1:kP3Me6Fy3vdi+9uHd7YLr6ewPxRL+PU6y15urfTaamU= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.5/go.mod h1:Gj7tm95r+QsDoN2Fhuz/3npQvcZbkEf5mL70n3Xfluc= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35 h1:hMUCiE3Zi5AHrRNGf5j985u0WyqI6r2NULhUfo0N/No= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35/go.mod h1:ipR5PvpSPqIqL5Mi82BxLnfMkHVbmco8kUwO2xrCi0M= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.29 h1:yOpYx+FTBdpk/g+sBU6Cb1H0U/TLEcYYp66mYqsPpcc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.29/go.mod h1:M/eUABlDbw2uVrdAn+UsI6M727qp2fxkp8K0ejcBDUY= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.36 h1:8r5m1BoAWkn0TDC34lUculryf7nUF25EgIMdjvGCkgo= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.36/go.mod h1:Rmw2M1hMVTwiUhjwMoIBFWFJMhvJbct06sSidxInkhY= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.29 h1:IiDolu/eLmuB18DRZibj77n1hHQT7z12jnGO7Ze3pLc= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.29/go.mod h1:fDbkK4o7fpPXWn8YAPmTieAMuB9mk/VgvW64uaUqxd4= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.13 h1:sWDv7cMITPcZ21QdreULwxOOAmE05JjEsT6fCDtDA9k= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.13/go.mod h1:DfX0sWuT46KpcqbMhJ9QWtxAIP1VozkDWf8VAkByjYY= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.13 h1:BFubHS/xN5bjl818QaroN6mQdjneYQ+AOx44KNXlyH4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.13/go.mod h1:BzqsVVFduubEmzrVtUFQQIQdFqvUItF8XUq2EnS8Wog= +github.com/aws/aws-sdk-go-v2/service/sts v1.19.3 h1:e5mnydVdCVWxP+5rPAGi2PYxC7u2OZgH1ypC114H04U= +github.com/aws/aws-sdk-go-v2/service/sts v1.19.3/go.mod h1:yVGZA1CPkmUhBdA039jXNJJG7/6t+G+EBWmFq23xqnY= +github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= +github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= @@ -14,27 +38,30 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/eapache/go-resiliency v1.6.0 h1:CqGDTLtpwuWKn6Nj3uNUdflaq+/kIPsg0gfNzHton30= -github.com/eapache/go-resiliency v1.6.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= +github.com/eapache/go-resiliency v1.7.0 h1:n3NRTnBn5N0Cbi/IeOHuQn9s2UwVUH7Ga0ZWcP+9JTA= +github.com/eapache/go-resiliency v1.7.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 h1:Oy0F4ALJ04o5Qqpdz8XLIpNA3WM/iSIXqxtqo7UGVws= github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -50,8 +77,10 @@ github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9 github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/jaegertracing/jaeger v1.57.0 h1:3wDtUUPs6NRYH7+d+y8MilDkLHdpPrVlQ2wbcsA62bs= -github.com/jaegertracing/jaeger v1.57.0/go.mod h1:p/1fxIU9hKHl7qEhKC72p2ZYVhvvZvNB73y6V7YyuTs= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/jaegertracing/jaeger v1.62.0 h1:YoaJ2e8oVz5sqGGlVAKSUCED8DzJ1q7PojBmZFNKoJA= +github.com/jaegertracing/jaeger v1.62.0/go.mod h1:jhEIHazwyb+a6xlRBi+p96BAvTYTSmGkghcwdQfV7FM= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= @@ -72,14 +101,14 @@ 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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.10 h1:oXAz+Vh0PMUvJczoi+flxpnBEPxoER1IaAnU/NMPtT0= +github.com/klauspost/compress v1.17.10/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -100,18 +129,10 @@ github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFu github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -120,8 +141,8 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= @@ -131,46 +152,69 @@ github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gi github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector v0.111.0 h1:D3LJTYrrK2ac94E2PXPSbVkArqxbklbCLsE4MAJQdRo= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -182,8 +226,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= @@ -196,14 +240,14 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -212,8 +256,8 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -222,8 +266,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -233,12 +277,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/exporter/kafkaexporter/internal/metadata/generated_status.go b/exporter/kafkaexporter/internal/metadata/generated_status.go index 63e9bce921ad..e139063fd64e 100644 --- a/exporter/kafkaexporter/internal/metadata/generated_status.go +++ b/exporter/kafkaexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("kafka") + Type = component.MustNewType("kafka") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter" ) const ( diff --git a/exporter/kafkaexporter/internal/metadata/generated_telemetry.go b/exporter/kafkaexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index 5f4488d92693..000000000000 --- a/exporter/kafkaexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/kafka") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/kafka") -} diff --git a/exporter/kafkaexporter/internal/metadata/generated_telemetry_test.go b/exporter/kafkaexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 36f28975d2cd..000000000000 --- a/exporter/kafkaexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/kafka", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/kafka", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/kafkaexporter/jaeger_marshaler.go b/exporter/kafkaexporter/jaeger_marshaler.go index abc73c22f18a..50640c83763f 100644 --- a/exporter/kafkaexporter/jaeger_marshaler.go +++ b/exporter/kafkaexporter/jaeger_marshaler.go @@ -22,10 +22,7 @@ type jaegerMarshaler struct { var _ TracesMarshaler = (*jaegerMarshaler)(nil) func (j jaegerMarshaler) Marshal(traces ptrace.Traces, topic string) ([]*sarama.ProducerMessage, error) { - batches, err := jaeger.ProtoFromTraces(traces) - if err != nil { - return nil, err - } + batches := jaeger.ProtoFromTraces(traces) var messages []*sarama.ProducerMessage var errs error @@ -58,8 +55,7 @@ type jaegerSpanMarshaler interface { encoding() string } -type jaegerProtoSpanMarshaler struct { -} +type jaegerProtoSpanMarshaler struct{} var _ jaegerSpanMarshaler = (*jaegerProtoSpanMarshaler)(nil) diff --git a/exporter/kafkaexporter/jaeger_marshaler_test.go b/exporter/kafkaexporter/jaeger_marshaler_test.go index 81a310c4a353..ca4cd7e7440e 100644 --- a/exporter/kafkaexporter/jaeger_marshaler_test.go +++ b/exporter/kafkaexporter/jaeger_marshaler_test.go @@ -25,8 +25,7 @@ func TestJaegerMarshaler(t *testing.T) { span.SetEndTimestamp(pcommon.Timestamp(20)) span.SetTraceID([16]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}) span.SetSpanID([8]byte{1, 2, 3, 4, 5, 6, 7, 8}) - batches, err := jaeger.ProtoFromTraces(td) - require.NoError(t, err) + batches := jaeger.ProtoFromTraces(td) batches[0].Spans[0].Process = batches[0].Process jaegerProtoBytes, err := batches[0].Spans[0].Marshal() diff --git a/exporter/kafkaexporter/kafka_exporter.go b/exporter/kafkaexporter/kafka_exporter.go index 59fc26e647b1..6720237fabe2 100644 --- a/exporter/kafkaexporter/kafka_exporter.go +++ b/exporter/kafkaexporter/kafka_exporter.go @@ -19,6 +19,7 @@ import ( "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/kafka/topic" ) var errUnrecognizedEncoding = fmt.Errorf("unrecognized encoding") @@ -40,8 +41,8 @@ func (ke kafkaErrors) Error() string { return fmt.Sprintf("Failed to deliver %d messages due to %s", ke.count, ke.err) } -func (e *kafkaTracesProducer) tracesPusher(_ context.Context, td ptrace.Traces) error { - messages, err := e.marshaler.Marshal(td, getTopic(&e.cfg, td.ResourceSpans())) +func (e *kafkaTracesProducer) tracesPusher(ctx context.Context, td ptrace.Traces) error { + messages, err := e.marshaler.Marshal(td, getTopic(ctx, &e.cfg, td.ResourceSpans())) if err != nil { return consumererror.NewPermanent(err) } @@ -65,8 +66,24 @@ func (e *kafkaTracesProducer) Close(context.Context) error { return e.producer.Close() } -func (e *kafkaTracesProducer) start(_ context.Context, _ component.Host) error { - producer, err := newSaramaProducer(e.cfg) +func (e *kafkaTracesProducer) start(ctx context.Context, host component.Host) error { + // extensions take precedence over internal encodings + if marshaler, errExt := loadEncodingExtension[ptrace.Marshaler]( + host, + e.cfg.Encoding, + ); errExt == nil { + e.marshaler = &tracesEncodingMarshaler{ + marshaler: *marshaler, + encoding: e.cfg.Encoding, + } + } + if marshaler, errInt := createTracesMarshaler(e.cfg); e.marshaler == nil && errInt == nil { + e.marshaler = marshaler + } + if e.marshaler == nil { + return errUnrecognizedEncoding + } + producer, err := newSaramaProducer(ctx, e.cfg) if err != nil { return err } @@ -82,8 +99,8 @@ type kafkaMetricsProducer struct { logger *zap.Logger } -func (e *kafkaMetricsProducer) metricsDataPusher(_ context.Context, md pmetric.Metrics) error { - messages, err := e.marshaler.Marshal(md, getTopic(&e.cfg, md.ResourceMetrics())) +func (e *kafkaMetricsProducer) metricsDataPusher(ctx context.Context, md pmetric.Metrics) error { + messages, err := e.marshaler.Marshal(md, getTopic(ctx, &e.cfg, md.ResourceMetrics())) if err != nil { return consumererror.NewPermanent(err) } @@ -107,8 +124,24 @@ func (e *kafkaMetricsProducer) Close(context.Context) error { return e.producer.Close() } -func (e *kafkaMetricsProducer) start(_ context.Context, _ component.Host) error { - producer, err := newSaramaProducer(e.cfg) +func (e *kafkaMetricsProducer) start(ctx context.Context, host component.Host) error { + // extensions take precedence over internal encodings + if marshaler, errExt := loadEncodingExtension[pmetric.Marshaler]( + host, + e.cfg.Encoding, + ); errExt == nil { + e.marshaler = &metricsEncodingMarshaler{ + marshaler: *marshaler, + encoding: e.cfg.Encoding, + } + } + if marshaler, errInt := createMetricMarshaler(e.cfg); e.marshaler == nil && errInt == nil { + e.marshaler = marshaler + } + if e.marshaler == nil { + return errUnrecognizedEncoding + } + producer, err := newSaramaProducer(ctx, e.cfg) if err != nil { return err } @@ -124,8 +157,8 @@ type kafkaLogsProducer struct { logger *zap.Logger } -func (e *kafkaLogsProducer) logsDataPusher(_ context.Context, ld plog.Logs) error { - messages, err := e.marshaler.Marshal(ld, getTopic(&e.cfg, ld.ResourceLogs())) +func (e *kafkaLogsProducer) logsDataPusher(ctx context.Context, ld plog.Logs) error { + messages, err := e.marshaler.Marshal(ld, getTopic(ctx, &e.cfg, ld.ResourceLogs())) if err != nil { return consumererror.NewPermanent(err) } @@ -149,8 +182,24 @@ func (e *kafkaLogsProducer) Close(context.Context) error { return e.producer.Close() } -func (e *kafkaLogsProducer) start(_ context.Context, _ component.Host) error { - producer, err := newSaramaProducer(e.cfg) +func (e *kafkaLogsProducer) start(ctx context.Context, host component.Host) error { + // extensions take precedence over internal encodings + if marshaler, errExt := loadEncodingExtension[plog.Marshaler]( + host, + e.cfg.Encoding, + ); errExt == nil { + e.marshaler = &logsEncodingMarshaler{ + marshaler: *marshaler, + encoding: e.cfg.Encoding, + } + } + if marshaler, errInt := createLogMarshaler(e.cfg); e.marshaler == nil && errInt == nil { + e.marshaler = marshaler + } + if e.marshaler == nil { + return errUnrecognizedEncoding + } + producer, err := newSaramaProducer(ctx, e.cfg) if err != nil { return err } @@ -158,7 +207,7 @@ func (e *kafkaLogsProducer) start(_ context.Context, _ component.Host) error { return nil } -func newSaramaProducer(config Config) (sarama.SyncProducer, error) { +func newSaramaProducer(ctx context.Context, config Config) (sarama.SyncProducer, error) { c := sarama.NewConfig() c.ClientID = config.ClientID @@ -168,7 +217,7 @@ func newSaramaProducer(config Config) (sarama.SyncProducer, error) { c.Producer.Return.Errors = true c.Producer.RequiredAcks = config.Producer.RequiredAcks // Because sarama does not accept a Context for every message, set the Timeout here. - c.Producer.Timeout = config.Timeout + c.Producer.Timeout = config.TimeoutSettings.Timeout c.Metadata.Full = config.Metadata.Full c.Metadata.Retry.Max = config.Metadata.Retry.Max c.Metadata.Retry.Backoff = config.Metadata.Retry.Backoff @@ -187,7 +236,7 @@ func newSaramaProducer(config Config) (sarama.SyncProducer, error) { c.Version = version } - if err := kafka.ConfigureAuthentication(config.Authentication, c); err != nil { + if err := kafka.ConfigureAuthentication(ctx, config.Authentication, c); err != nil { return nil, err } @@ -204,56 +253,26 @@ func newSaramaProducer(config Config) (sarama.SyncProducer, error) { return producer, nil } -func newMetricsExporter(config Config, set exporter.CreateSettings, marshalers map[string]MetricsMarshaler) (*kafkaMetricsProducer, error) { - marshaler := marshalers[config.Encoding] - if marshaler == nil { - return nil, errUnrecognizedEncoding - } - if config.PartitionMetricsByResourceAttributes { - if keyableMarshaler, ok := marshaler.(KeyableMetricsMarshaler); ok { - keyableMarshaler.Key() - } - } - +func newMetricsExporter(config Config, set exporter.Settings) *kafkaMetricsProducer { return &kafkaMetricsProducer{ - cfg: config, - marshaler: marshaler, - logger: set.Logger, - }, nil - + cfg: config, + logger: set.Logger, + } } // newTracesExporter creates Kafka exporter. -func newTracesExporter(config Config, set exporter.CreateSettings, marshalers map[string]TracesMarshaler) (*kafkaTracesProducer, error) { - marshaler := marshalers[config.Encoding] - if marshaler == nil { - return nil, errUnrecognizedEncoding - } - if config.PartitionTracesByID { - if keyableMarshaler, ok := marshaler.(KeyableTracesMarshaler); ok { - keyableMarshaler.Key() - } - } - +func newTracesExporter(config Config, set exporter.Settings) *kafkaTracesProducer { return &kafkaTracesProducer{ - cfg: config, - marshaler: marshaler, - logger: set.Logger, - }, nil -} - -func newLogsExporter(config Config, set exporter.CreateSettings, marshalers map[string]LogsMarshaler) (*kafkaLogsProducer, error) { - marshaler := marshalers[config.Encoding] - if marshaler == nil { - return nil, errUnrecognizedEncoding + cfg: config, + logger: set.Logger, } +} +func newLogsExporter(config Config, set exporter.Settings) *kafkaLogsProducer { return &kafkaLogsProducer{ - cfg: config, - marshaler: marshaler, - logger: set.Logger, - }, nil - + cfg: config, + logger: set.Logger, + } } type resourceSlice[T any] interface { @@ -265,15 +284,45 @@ type resource interface { Resource() pcommon.Resource } -func getTopic[T resource](cfg *Config, resources resourceSlice[T]) string { - if cfg.TopicFromAttribute == "" { - return cfg.Topic - } - for i := 0; i < resources.Len(); i++ { - rv, ok := resources.At(i).Resource().Attributes().Get(cfg.TopicFromAttribute) - if ok && rv.Str() != "" { - return rv.Str() +func getTopic[T resource](ctx context.Context, cfg *Config, resources resourceSlice[T]) string { + if cfg.TopicFromAttribute != "" { + for i := 0; i < resources.Len(); i++ { + rv, ok := resources.At(i).Resource().Attributes().Get(cfg.TopicFromAttribute) + if ok && rv.Str() != "" { + return rv.Str() + } } } + contextTopic, ok := topic.FromContext(ctx) + if ok { + return contextTopic + } return cfg.Topic } + +// loadEncodingExtension tries to load an available extension for the given encoding. +func loadEncodingExtension[T any](host component.Host, encoding string) (*T, error) { + extensionID, err := encodingToComponentID(encoding) + if err != nil { + return nil, err + } + encodingExtension, ok := host.GetExtensions()[*extensionID] + if !ok { + return nil, fmt.Errorf("unknown encoding extension %q", encoding) + } + unmarshaler, ok := encodingExtension.(T) + if !ok { + return nil, fmt.Errorf("extension %q is not an unmarshaler", encoding) + } + return &unmarshaler, nil +} + +// encodingToComponentID converts an encoding string to a component ID using the given encoding as type. +func encodingToComponentID(encoding string) (*component.ID, error) { + componentType, err := component.NewType(encoding) + if err != nil { + return nil, fmt.Errorf("invalid component type: %w", err) + } + id := component.NewID(componentType) + return &id, nil +} diff --git a/exporter/kafkaexporter/kafka_exporter_test.go b/exporter/kafkaexporter/kafka_exporter_test.go index 1ebd548b49aa..80b56d05dbc8 100644 --- a/exporter/kafkaexporter/kafka_exporter_test.go +++ b/exporter/kafkaexporter/kafka_exporter_test.go @@ -12,6 +12,7 @@ import ( "github.com/IBM/sarama/mocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/config/configtls" "go.opentelemetry.io/collector/exporter/exportertest" @@ -22,65 +23,91 @@ import ( "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/kafka/topic" ) func TestNewExporter_err_version(t *testing.T) { c := Config{ProtocolVersion: "0.0.0", Encoding: defaultEncoding} - texp, err := newTracesExporter(c, exportertest.NewNopCreateSettings(), tracesMarshalers()) - require.NoError(t, err) - err = texp.start(context.Background(), componenttest.NewNopHost()) + texp := newTracesExporter(c, exportertest.NewNopSettings()) + err := texp.start(context.Background(), componenttest.NewNopHost()) assert.Error(t, err) } func TestNewExporter_err_encoding(t *testing.T) { c := Config{Encoding: "foo"} - texp, err := newTracesExporter(c, exportertest.NewNopCreateSettings(), tracesMarshalers()) + texp := newTracesExporter(c, exportertest.NewNopSettings()) + assert.NotNil(t, texp) + err := texp.start(context.Background(), componenttest.NewNopHost()) assert.EqualError(t, err, errUnrecognizedEncoding.Error()) - assert.Nil(t, texp) } func TestNewMetricsExporter_err_version(t *testing.T) { c := Config{ProtocolVersion: "0.0.0", Encoding: defaultEncoding} - mexp, err := newMetricsExporter(c, exportertest.NewNopCreateSettings(), metricsMarshalers()) - require.NoError(t, err) - err = mexp.start(context.Background(), componenttest.NewNopHost()) + mexp := newMetricsExporter(c, exportertest.NewNopSettings()) + err := mexp.start(context.Background(), componenttest.NewNopHost()) assert.Error(t, err) } func TestNewMetricsExporter_err_encoding(t *testing.T) { c := Config{Encoding: "bar"} - mexp, err := newMetricsExporter(c, exportertest.NewNopCreateSettings(), metricsMarshalers()) + mexp := newMetricsExporter(c, exportertest.NewNopSettings()) + assert.NotNil(t, mexp) + err := mexp.start(context.Background(), componenttest.NewNopHost()) assert.EqualError(t, err, errUnrecognizedEncoding.Error()) - assert.Nil(t, mexp) } func TestNewMetricsExporter_err_traces_encoding(t *testing.T) { c := Config{Encoding: "jaeger_proto"} - mexp, err := newMetricsExporter(c, exportertest.NewNopCreateSettings(), metricsMarshalers()) + mexp := newMetricsExporter(c, exportertest.NewNopSettings()) + assert.NotNil(t, mexp) + err := mexp.start(context.Background(), componenttest.NewNopHost()) assert.EqualError(t, err, errUnrecognizedEncoding.Error()) - assert.Nil(t, mexp) +} + +func TestMetricsExporter_encoding_extension(t *testing.T) { + c := Config{ + Encoding: "metrics_encoding", + } + texp := newMetricsExporter(c, exportertest.NewNopSettings()) + require.NotNil(t, texp) + err := texp.start(context.Background(), &testComponentHost{}) + assert.Error(t, err) + assert.NotContains(t, err.Error(), errUnrecognizedEncoding.Error()) } func TestNewLogsExporter_err_version(t *testing.T) { c := Config{ProtocolVersion: "0.0.0", Encoding: defaultEncoding} - lexp, err := newLogsExporter(c, exportertest.NewNopCreateSettings(), logsMarshalers()) - require.NoError(t, err) - err = lexp.start(context.Background(), componenttest.NewNopHost()) + lexp := newLogsExporter(c, exportertest.NewNopSettings()) + require.NotNil(t, lexp) + err := lexp.start(context.Background(), componenttest.NewNopHost()) assert.Error(t, err) } func TestNewLogsExporter_err_encoding(t *testing.T) { c := Config{Encoding: "bar"} - mexp, err := newLogsExporter(c, exportertest.NewNopCreateSettings(), logsMarshalers()) + lexp := newLogsExporter(c, exportertest.NewNopSettings()) + assert.NotNil(t, lexp) + err := lexp.start(context.Background(), componenttest.NewNopHost()) assert.EqualError(t, err, errUnrecognizedEncoding.Error()) - assert.Nil(t, mexp) } func TestNewLogsExporter_err_traces_encoding(t *testing.T) { c := Config{Encoding: "jaeger_proto"} - mexp, err := newLogsExporter(c, exportertest.NewNopCreateSettings(), logsMarshalers()) + lexp := newLogsExporter(c, exportertest.NewNopSettings()) + assert.NotNil(t, lexp) + err := lexp.start(context.Background(), componenttest.NewNopHost()) assert.EqualError(t, err, errUnrecognizedEncoding.Error()) - assert.Nil(t, mexp) +} + +func TestLogsExporter_encoding_extension(t *testing.T) { + c := Config{ + Encoding: "logs_encoding", + } + texp := newLogsExporter(c, exportertest.NewNopSettings()) + require.NotNil(t, texp) + err := texp.start(context.Background(), &testComponentHost{}) + assert.Error(t, err) + assert.NotContains(t, err.Error(), errUnrecognizedEncoding.Error()) } func TestNewExporter_err_auth_type(t *testing.T) { @@ -101,22 +128,18 @@ func TestNewExporter_err_auth_type(t *testing.T) { Compression: "none", }, } - texp, err := newTracesExporter(c, exportertest.NewNopCreateSettings(), tracesMarshalers()) - require.NoError(t, err) - err = texp.start(context.Background(), componenttest.NewNopHost()) - assert.Error(t, err) - assert.Contains(t, err.Error(), "failed to load TLS config") - mexp, err := newMetricsExporter(c, exportertest.NewNopCreateSettings(), metricsMarshalers()) - require.NoError(t, err) + texp := newTracesExporter(c, exportertest.NewNopSettings()) + require.NotNil(t, texp) + err := texp.start(context.Background(), componenttest.NewNopHost()) + assert.ErrorContains(t, err, "failed to load TLS config") + mexp := newMetricsExporter(c, exportertest.NewNopSettings()) + require.NotNil(t, mexp) err = mexp.start(context.Background(), componenttest.NewNopHost()) - assert.Error(t, err) - assert.Contains(t, err.Error(), "failed to load TLS config") - lexp, err := newLogsExporter(c, exportertest.NewNopCreateSettings(), logsMarshalers()) - require.NoError(t, err) + assert.ErrorContains(t, err, "failed to load TLS config") + lexp := newLogsExporter(c, exportertest.NewNopSettings()) + require.NotNil(t, lexp) err = lexp.start(context.Background(), componenttest.NewNopHost()) - assert.Error(t, err) - assert.Contains(t, err.Error(), "failed to load TLS config") - + assert.ErrorContains(t, err, "failed to load TLS config") } func TestNewExporter_err_compression(t *testing.T) { @@ -126,11 +149,22 @@ func TestNewExporter_err_compression(t *testing.T) { Compression: "idk", }, } - texp, err := newTracesExporter(c, exportertest.NewNopCreateSettings(), tracesMarshalers()) - require.NoError(t, err) - err = texp.start(context.Background(), componenttest.NewNopHost()) + texp := newTracesExporter(c, exportertest.NewNopSettings()) + require.NotNil(t, texp) + err := texp.start(context.Background(), componenttest.NewNopHost()) + assert.Error(t, err) + assert.ErrorContains(t, err, "producer.compression should be one of 'none', 'gzip', 'snappy', 'lz4', or 'zstd'. configured value idk") +} + +func TestTracesExporter_encoding_extension(t *testing.T) { + c := Config{ + Encoding: "traces_encoding", + } + texp := newTracesExporter(c, exportertest.NewNopSettings()) + require.NotNil(t, texp) + err := texp.start(context.Background(), &testComponentHost{}) assert.Error(t, err) - assert.Contains(t, err.Error(), "producer.compression should be one of 'none', 'gzip', 'snappy', 'lz4', or 'zstd'. configured value idk") + assert.NotContains(t, err.Error(), errUnrecognizedEncoding.Error()) } func TestTracesPusher(t *testing.T) { @@ -140,7 +174,7 @@ func TestTracesPusher(t *testing.T) { p := kafkaTracesProducer{ producer: producer, - marshaler: newPdataTracesMarshaler(&ptrace.ProtoMarshaler{}, defaultEncoding), + marshaler: newPdataTracesMarshaler(&ptrace.ProtoMarshaler{}, defaultEncoding, false), } t.Cleanup(func() { require.NoError(t, p.Close(context.Background())) @@ -159,7 +193,7 @@ func TestTracesPusher_attr(t *testing.T) { TopicFromAttribute: "kafka_topic", }, producer: producer, - marshaler: newPdataTracesMarshaler(&ptrace.ProtoMarshaler{}, defaultEncoding), + marshaler: newPdataTracesMarshaler(&ptrace.ProtoMarshaler{}, defaultEncoding, false), } t.Cleanup(func() { require.NoError(t, p.Close(context.Background())) @@ -168,6 +202,22 @@ func TestTracesPusher_attr(t *testing.T) { require.NoError(t, err) } +func TestTracesPusher_ctx(t *testing.T) { + c := sarama.NewConfig() + producer := mocks.NewSyncProducer(t, c) + producer.ExpectSendMessageAndSucceed() + + p := kafkaTracesProducer{ + producer: producer, + marshaler: newPdataTracesMarshaler(&ptrace.ProtoMarshaler{}, defaultEncoding, false), + } + t.Cleanup(func() { + require.NoError(t, p.Close(context.Background())) + }) + err := p.tracesPusher(topic.WithTopic(context.Background(), "my_topic"), testdata.GenerateTraces(2)) + require.NoError(t, err) +} + func TestTracesPusher_err(t *testing.T) { c := sarama.NewConfig() producer := mocks.NewSyncProducer(t, c) @@ -176,7 +226,7 @@ func TestTracesPusher_err(t *testing.T) { p := kafkaTracesProducer{ producer: producer, - marshaler: newPdataTracesMarshaler(&ptrace.ProtoMarshaler{}, defaultEncoding), + marshaler: newPdataTracesMarshaler(&ptrace.ProtoMarshaler{}, defaultEncoding, false), logger: zap.NewNop(), } t.Cleanup(func() { @@ -195,8 +245,7 @@ func TestTracesPusher_marshal_error(t *testing.T) { } td := testdata.GenerateTraces(2) err := p.tracesPusher(context.Background(), td) - require.Error(t, err) - assert.Contains(t, err.Error(), expErr.Error()) + assert.ErrorContains(t, err, expErr.Error()) } func TestMetricsDataPusher(t *testing.T) { @@ -206,7 +255,7 @@ func TestMetricsDataPusher(t *testing.T) { p := kafkaMetricsProducer{ producer: producer, - marshaler: newPdataMetricsMarshaler(&pmetric.ProtoMarshaler{}, defaultEncoding), + marshaler: newPdataMetricsMarshaler(&pmetric.ProtoMarshaler{}, defaultEncoding, false), } t.Cleanup(func() { require.NoError(t, p.Close(context.Background())) @@ -225,7 +274,7 @@ func TestMetricsDataPusher_attr(t *testing.T) { TopicFromAttribute: "kafka_topic", }, producer: producer, - marshaler: newPdataMetricsMarshaler(&pmetric.ProtoMarshaler{}, defaultEncoding), + marshaler: newPdataMetricsMarshaler(&pmetric.ProtoMarshaler{}, defaultEncoding, false), } t.Cleanup(func() { require.NoError(t, p.Close(context.Background())) @@ -234,6 +283,22 @@ func TestMetricsDataPusher_attr(t *testing.T) { require.NoError(t, err) } +func TestMetricsDataPusher_ctx(t *testing.T) { + c := sarama.NewConfig() + producer := mocks.NewSyncProducer(t, c) + producer.ExpectSendMessageAndSucceed() + + p := kafkaMetricsProducer{ + producer: producer, + marshaler: newPdataMetricsMarshaler(&pmetric.ProtoMarshaler{}, defaultEncoding, false), + } + t.Cleanup(func() { + require.NoError(t, p.Close(context.Background())) + }) + err := p.metricsDataPusher(topic.WithTopic(context.Background(), "my_topic"), testdata.GenerateMetrics(2)) + require.NoError(t, err) +} + func TestMetricsDataPusher_err(t *testing.T) { c := sarama.NewConfig() producer := mocks.NewSyncProducer(t, c) @@ -242,7 +307,7 @@ func TestMetricsDataPusher_err(t *testing.T) { p := kafkaMetricsProducer{ producer: producer, - marshaler: newPdataMetricsMarshaler(&pmetric.ProtoMarshaler{}, defaultEncoding), + marshaler: newPdataMetricsMarshaler(&pmetric.ProtoMarshaler{}, defaultEncoding, false), logger: zap.NewNop(), } t.Cleanup(func() { @@ -261,8 +326,7 @@ func TestMetricsDataPusher_marshal_error(t *testing.T) { } md := testdata.GenerateMetrics(2) err := p.metricsDataPusher(context.Background(), md) - require.Error(t, err) - assert.Contains(t, err.Error(), expErr.Error()) + assert.ErrorContains(t, err, expErr.Error()) } func TestLogsDataPusher(t *testing.T) { @@ -272,7 +336,7 @@ func TestLogsDataPusher(t *testing.T) { p := kafkaLogsProducer{ producer: producer, - marshaler: newPdataLogsMarshaler(&plog.ProtoMarshaler{}, defaultEncoding), + marshaler: newPdataLogsMarshaler(&plog.ProtoMarshaler{}, defaultEncoding, false), } t.Cleanup(func() { require.NoError(t, p.Close(context.Background())) @@ -291,7 +355,7 @@ func TestLogsDataPusher_attr(t *testing.T) { TopicFromAttribute: "kafka_topic", }, producer: producer, - marshaler: newPdataLogsMarshaler(&plog.ProtoMarshaler{}, defaultEncoding), + marshaler: newPdataLogsMarshaler(&plog.ProtoMarshaler{}, defaultEncoding, false), } t.Cleanup(func() { require.NoError(t, p.Close(context.Background())) @@ -300,6 +364,22 @@ func TestLogsDataPusher_attr(t *testing.T) { require.NoError(t, err) } +func TestLogsDataPusher_ctx(t *testing.T) { + c := sarama.NewConfig() + producer := mocks.NewSyncProducer(t, c) + producer.ExpectSendMessageAndSucceed() + + p := kafkaLogsProducer{ + producer: producer, + marshaler: newPdataLogsMarshaler(&plog.ProtoMarshaler{}, defaultEncoding, false), + } + t.Cleanup(func() { + require.NoError(t, p.Close(context.Background())) + }) + err := p.logsDataPusher(topic.WithTopic(context.Background(), "my_topic"), testdata.GenerateLogs(1)) + require.NoError(t, err) +} + func TestLogsDataPusher_err(t *testing.T) { c := sarama.NewConfig() producer := mocks.NewSyncProducer(t, c) @@ -308,7 +388,7 @@ func TestLogsDataPusher_err(t *testing.T) { p := kafkaLogsProducer{ producer: producer, - marshaler: newPdataLogsMarshaler(&plog.ProtoMarshaler{}, defaultEncoding), + marshaler: newPdataLogsMarshaler(&plog.ProtoMarshaler{}, defaultEncoding, false), logger: zap.NewNop(), } t.Cleanup(func() { @@ -327,8 +407,7 @@ func TestLogsDataPusher_marshal_error(t *testing.T) { } ld := testdata.GenerateLogs(1) err := p.logsDataPusher(context.Background(), ld) - require.Error(t, err) - assert.Contains(t, err.Error(), expErr.Error()) + assert.ErrorContains(t, err, expErr.Error()) } type tracesErrorMarshaler struct { @@ -373,6 +452,7 @@ func Test_GetTopic(t *testing.T) { tests := []struct { name string cfg Config + ctx context.Context resource any wantTopic string }{ @@ -382,6 +462,7 @@ func Test_GetTopic(t *testing.T) { TopicFromAttribute: "resource-attr", Topic: "defaultTopic", }, + ctx: topic.WithTopic(context.Background(), "context-topic"), resource: testdata.GenerateMetrics(1).ResourceMetrics(), wantTopic: "resource-attr-val-1", }, @@ -391,6 +472,7 @@ func Test_GetTopic(t *testing.T) { TopicFromAttribute: "resource-attr", Topic: "defaultTopic", }, + ctx: topic.WithTopic(context.Background(), "context-topic"), resource: testdata.GenerateTraces(1).ResourceSpans(), wantTopic: "resource-attr-val-1", }, @@ -400,6 +482,7 @@ func Test_GetTopic(t *testing.T) { TopicFromAttribute: "resource-attr", Topic: "defaultTopic", }, + ctx: topic.WithTopic(context.Background(), "context-topic"), resource: testdata.GenerateLogs(1).ResourceLogs(), wantTopic: "resource-attr-val-1", }, @@ -409,14 +492,58 @@ func Test_GetTopic(t *testing.T) { TopicFromAttribute: "nonexistent_attribute", Topic: "defaultTopic", }, + ctx: context.Background(), resource: testdata.GenerateMetrics(1).ResourceMetrics(), wantTopic: "defaultTopic", }, + { - name: "TopicFromAttribute not set, return default topic", + name: "Valid metric context, return topic name", + cfg: Config{ + TopicFromAttribute: "nonexistent_attribute", + Topic: "defaultTopic", + }, + ctx: topic.WithTopic(context.Background(), "context-topic"), + resource: testdata.GenerateMetrics(1).ResourceMetrics(), + wantTopic: "context-topic", + }, + { + name: "Valid trace context, return topic name", + cfg: Config{ + TopicFromAttribute: "nonexistent_attribute", + Topic: "defaultTopic", + }, + ctx: topic.WithTopic(context.Background(), "context-topic"), + resource: testdata.GenerateTraces(1).ResourceSpans(), + wantTopic: "context-topic", + }, + { + name: "Valid log context, return topic name", + cfg: Config{ + TopicFromAttribute: "nonexistent_attribute", + Topic: "defaultTopic", + }, + ctx: topic.WithTopic(context.Background(), "context-topic"), + resource: testdata.GenerateLogs(1).ResourceLogs(), + wantTopic: "context-topic", + }, + + { + name: "Attribute not found", + cfg: Config{ + TopicFromAttribute: "nonexistent_attribute", + Topic: "defaultTopic", + }, + ctx: context.Background(), + resource: testdata.GenerateMetrics(1).ResourceMetrics(), + wantTopic: "defaultTopic", + }, + { + name: "TopicFromAttribute, return default topic", cfg: Config{ Topic: "defaultTopic", }, + ctx: context.Background(), resource: testdata.GenerateMetrics(1).ResourceMetrics(), wantTopic: "defaultTopic", }, @@ -427,13 +554,74 @@ func Test_GetTopic(t *testing.T) { topic := "" switch r := tests[i].resource.(type) { case pmetric.ResourceMetricsSlice: - topic = getTopic(&tests[i].cfg, r) + topic = getTopic(tests[i].ctx, &tests[i].cfg, r) case ptrace.ResourceSpansSlice: - topic = getTopic(&tests[i].cfg, r) + topic = getTopic(tests[i].ctx, &tests[i].cfg, r) case plog.ResourceLogsSlice: - topic = getTopic(&tests[i].cfg, r) + topic = getTopic(tests[i].ctx, &tests[i].cfg, r) } assert.Equal(t, tests[i].wantTopic, topic) }) } } + +func TestLoadEncodingExtension_logs(t *testing.T) { + extension, err := loadEncodingExtension[plog.Marshaler](&testComponentHost{}, "logs_encoding") + require.NoError(t, err) + require.NotNil(t, extension) +} + +func TestLoadEncodingExtension_notfound_error(t *testing.T) { + extension, err := loadEncodingExtension[plog.Marshaler](&testComponentHost{}, "logs_notfound") + require.Error(t, err) + require.Nil(t, extension) +} + +func TestLoadEncodingExtension_nomarshaler_error(t *testing.T) { + extension, err := loadEncodingExtension[plog.Marshaler](&testComponentHost{}, "logs_nomarshaler") + require.Error(t, err) + require.Nil(t, extension) +} + +type testComponentHost struct{} + +func (h *testComponentHost) GetExtensions() map[component.ID]component.Component { + return map[component.ID]component.Component{ + component.MustNewID("logs_encoding"): &nopComponent{}, + component.MustNewID("logs_nomarshaler"): &nopNoMarshalerComponent{}, + component.MustNewID("metrics_encoding"): &nopComponent{}, + component.MustNewID("traces_encoding"): &nopComponent{}, + } +} + +type nopComponent struct{} + +func (c *nopComponent) Start(_ context.Context, _ component.Host) error { + return nil +} + +func (c *nopComponent) Shutdown(_ context.Context) error { + return nil +} + +func (c *nopComponent) MarshalLogs(_ plog.Logs) ([]byte, error) { + return []byte{}, nil +} + +func (c *nopComponent) MarshalMetrics(_ pmetric.Metrics) ([]byte, error) { + return []byte{}, nil +} + +func (c *nopComponent) MarshalTraces(_ ptrace.Traces) ([]byte, error) { + return []byte{}, nil +} + +type nopNoMarshalerComponent struct{} + +func (c *nopNoMarshalerComponent) Start(_ context.Context, _ component.Host) error { + return nil +} + +func (c *nopNoMarshalerComponent) Shutdown(_ context.Context) error { + return nil +} diff --git a/exporter/kafkaexporter/marshaler.go b/exporter/kafkaexporter/marshaler.go index 4acb625407fd..ba8f00ff5cf4 100644 --- a/exporter/kafkaexporter/marshaler.go +++ b/exporter/kafkaexporter/marshaler.go @@ -4,6 +4,8 @@ package kafkaexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter" import ( + "fmt" + "github.com/IBM/sarama" "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/pmetric" @@ -39,42 +41,129 @@ type LogsMarshaler interface { Encoding() string } -// tracesMarshalers returns map of supported encodings with TracesMarshaler. -func tracesMarshalers() map[string]TracesMarshaler { - otlpPb := newPdataTracesMarshaler(&ptrace.ProtoMarshaler{}, defaultEncoding) - otlpJSON := newPdataTracesMarshaler(&ptrace.JSONMarshaler{}, "otlp_json") - zipkinProto := newPdataTracesMarshaler(zipkinv2.NewProtobufTracesMarshaler(), "zipkin_proto") - zipkinJSON := newPdataTracesMarshaler(zipkinv2.NewJSONTracesMarshaler(), "zipkin_json") +// creates TracesMarshaler based on the provided config +func createTracesMarshaler(config Config) (TracesMarshaler, error) { + encoding := config.Encoding + partitionTracesByID := config.PartitionTracesByID + jaegerProto := jaegerMarshaler{marshaler: jaegerProtoSpanMarshaler{}} jaegerJSON := jaegerMarshaler{marshaler: newJaegerJSONMarshaler()} - return map[string]TracesMarshaler{ - otlpPb.Encoding(): otlpPb, - otlpJSON.Encoding(): otlpJSON, - zipkinProto.Encoding(): zipkinProto, - zipkinJSON.Encoding(): zipkinJSON, - jaegerProto.Encoding(): jaegerProto, - jaegerJSON.Encoding(): jaegerJSON, + + switch encoding { + case defaultEncoding: + return newPdataTracesMarshaler(&ptrace.ProtoMarshaler{}, defaultEncoding, partitionTracesByID), nil + case "otlp_json": + return newPdataTracesMarshaler(&ptrace.JSONMarshaler{}, "otlp_json", partitionTracesByID), nil + case "zipkin_proto": + return newPdataTracesMarshaler(zipkinv2.NewProtobufTracesMarshaler(), "zipkin_proto", partitionTracesByID), nil + case "zipkin_json": + return newPdataTracesMarshaler(zipkinv2.NewJSONTracesMarshaler(), "zipkin_json", partitionTracesByID), nil + case jaegerProtoSpanMarshaler{}.encoding(): + return jaegerProto, nil + case jaegerJSON.Encoding(): + return jaegerJSON, nil + default: + return nil, errUnrecognizedEncoding } } -// metricsMarshalers returns map of supported encodings and MetricsMarshaler -func metricsMarshalers() map[string]MetricsMarshaler { - otlpPb := newPdataMetricsMarshaler(&pmetric.ProtoMarshaler{}, defaultEncoding) - otlpJSON := newPdataMetricsMarshaler(&pmetric.JSONMarshaler{}, "otlp_json") - return map[string]MetricsMarshaler{ - otlpPb.Encoding(): otlpPb, - otlpJSON.Encoding(): otlpJSON, +// creates MetricsMarshaler based on the provided config +func createMetricMarshaler(config Config) (MetricsMarshaler, error) { + encoding := config.Encoding + partitionMetricsByResources := config.PartitionMetricsByResourceAttributes + switch encoding { + case defaultEncoding: + return newPdataMetricsMarshaler(&pmetric.ProtoMarshaler{}, defaultEncoding, partitionMetricsByResources), nil + case "otlp_json": + return newPdataMetricsMarshaler(&pmetric.JSONMarshaler{}, "otlp_json", partitionMetricsByResources), nil + default: + return nil, errUnrecognizedEncoding } } -// logsMarshalers returns map of supported encodings and LogsMarshaler -func logsMarshalers() map[string]LogsMarshaler { - otlpPb := newPdataLogsMarshaler(&plog.ProtoMarshaler{}, defaultEncoding) - otlpJSON := newPdataLogsMarshaler(&plog.JSONMarshaler{}, "otlp_json") +// creates LogsMarshalers based on the provided config +func createLogMarshaler(config Config) (LogsMarshaler, error) { + encoding := config.Encoding + partitionLogsByAttributes := config.PartitionLogsByResourceAttributes + raw := newRawMarshaler() - return map[string]LogsMarshaler{ - otlpPb.Encoding(): otlpPb, - otlpJSON.Encoding(): otlpJSON, - raw.Encoding(): raw, + switch encoding { + case defaultEncoding: + return newPdataLogsMarshaler(&plog.ProtoMarshaler{}, defaultEncoding, partitionLogsByAttributes), nil + case "otlp_json": + return newPdataLogsMarshaler(&plog.JSONMarshaler{}, "otlp_json", partitionLogsByAttributes), nil + case raw.Encoding(): + return raw, nil + default: + return nil, errUnrecognizedEncoding } } + +// tracesEncodingMarshaler is a wrapper around ptrace.Marshaler that implements TracesMarshaler. +type tracesEncodingMarshaler struct { + marshaler ptrace.Marshaler + encoding string +} + +func (t *tracesEncodingMarshaler) Marshal(traces ptrace.Traces, topic string) ([]*sarama.ProducerMessage, error) { + var messages []*sarama.ProducerMessage + data, err := t.marshaler.MarshalTraces(traces) + if err != nil { + return nil, fmt.Errorf("failed to marshal traces: %w", err) + } + messages = append(messages, &sarama.ProducerMessage{ + Topic: topic, + Value: sarama.ByteEncoder(data), + }) + return messages, nil +} + +func (t *tracesEncodingMarshaler) Encoding() string { + return t.encoding +} + +// metricsEncodingMarshaler is a wrapper around pmetric.Marshaler that implements MetricsMarshaler. +type metricsEncodingMarshaler struct { + marshaler pmetric.Marshaler + encoding string +} + +func (m *metricsEncodingMarshaler) Marshal(metrics pmetric.Metrics, topic string) ([]*sarama.ProducerMessage, error) { + var messages []*sarama.ProducerMessage + data, err := m.marshaler.MarshalMetrics(metrics) + if err != nil { + return nil, fmt.Errorf("failed to marshal metrics: %w", err) + } + messages = append(messages, &sarama.ProducerMessage{ + Topic: topic, + Value: sarama.ByteEncoder(data), + }) + return messages, nil +} + +func (m *metricsEncodingMarshaler) Encoding() string { + return m.encoding +} + +// logsEncodingMarshaler is a wrapper around plog.Marshaler that implements LogsMarshaler. +type logsEncodingMarshaler struct { + marshaler plog.Marshaler + encoding string +} + +func (l *logsEncodingMarshaler) Marshal(logs plog.Logs, topic string) ([]*sarama.ProducerMessage, error) { + var messages []*sarama.ProducerMessage + data, err := l.marshaler.MarshalLogs(logs) + if err != nil { + return nil, fmt.Errorf("failed to marshal logs: %w", err) + } + messages = append(messages, &sarama.ProducerMessage{ + Topic: topic, + Value: sarama.ByteEncoder(data), + }) + return messages, nil +} + +func (l *logsEncodingMarshaler) Encoding() string { + return l.encoding +} diff --git a/exporter/kafkaexporter/marshaler_test.go b/exporter/kafkaexporter/marshaler_test.go index 5f40379d75a2..d68c6332768b 100644 --- a/exporter/kafkaexporter/marshaler_test.go +++ b/exporter/kafkaexporter/marshaler_test.go @@ -14,6 +14,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" conventions "go.opentelemetry.io/collector/semconv/v1.6.1" @@ -28,12 +29,12 @@ func TestDefaultTracesMarshalers(t *testing.T) { "jaeger_proto", "jaeger_json", } - marshalers := tracesMarshalers() - assert.Equal(t, len(expectedEncodings), len(marshalers)) for _, e := range expectedEncodings { t.Run(e, func(t *testing.T) { - m, ok := marshalers[e] - require.True(t, ok) + m, err := createTracesMarshaler(Config{ + Encoding: e, + }) + require.NoError(t, err) assert.NotNil(t, m) }) } @@ -44,12 +45,12 @@ func TestDefaultMetricsMarshalers(t *testing.T) { "otlp_proto", "otlp_json", } - marshalers := metricsMarshalers() - assert.Equal(t, len(expectedEncodings), len(marshalers)) for _, e := range expectedEncodings { t.Run(e, func(t *testing.T) { - m, ok := marshalers[e] - require.True(t, ok) + m, err := createMetricMarshaler(Config{ + Encoding: e, + }) + require.NoError(t, err) assert.NotNil(t, m) }) } @@ -61,12 +62,12 @@ func TestDefaultLogsMarshalers(t *testing.T) { "otlp_json", "raw", } - marshalers := logsMarshalers() - assert.Equal(t, len(expectedEncodings), len(marshalers)) for _, e := range expectedEncodings { t.Run(e, func(t *testing.T) { - m, ok := marshalers[e] - require.True(t, ok) + m, err := createLogMarshaler(Config{ + Encoding: e, + }) + require.NoError(t, err) assert.NotNil(t, m) }) } @@ -75,17 +76,17 @@ func TestDefaultLogsMarshalers(t *testing.T) { func TestOTLPMetricsJsonMarshaling(t *testing.T) { tests := []struct { name string - keyEnabled bool + partitionByResources bool messagePartitionKeys []sarama.Encoder }{ { name: "partitioning_disabled", - keyEnabled: false, + partitionByResources: false, messagePartitionKeys: []sarama.Encoder{nil}, }, { - name: "partitioning_enabled", - keyEnabled: true, + name: "partitioning_enabled", + partitionByResources: true, messagePartitionKeys: []sarama.Encoder{ sarama.ByteEncoder{0x62, 0x7f, 0x20, 0x34, 0x85, 0x49, 0x55, 0x2e, 0xfa, 0x93, 0xae, 0xd7, 0xde, 0x91, 0xd7, 0x16}, sarama.ByteEncoder{0x75, 0x6b, 0xb4, 0xd6, 0xff, 0xeb, 0x92, 0x22, 0xa, 0x68, 0x65, 0x48, 0xe0, 0xd3, 0x94, 0x44}, @@ -116,16 +117,76 @@ func TestOTLPMetricsJsonMarshaling(t *testing.T) { r1.Attributes().PutStr("service.name", "my_service_name") r1.CopyTo(metric.ResourceMetrics().AppendEmpty().Resource()) - standardMarshaler := metricsMarshalers()["otlp_json"] - keyableMarshaler, ok := standardMarshaler.(KeyableMetricsMarshaler) - require.True(t, ok, "Must be a KeyableMetricsMarshaler") - if tt.keyEnabled { - keyableMarshaler.Key() - } + marshaler, err := createMetricMarshaler( + Config{ + Encoding: "otlp_json", + PartitionMetricsByResourceAttributes: tt.partitionByResources, + }) + require.NoError(t, err) - msgs, err := standardMarshaler.Marshal(metric, "KafkaTopicX") + msgs, err := marshaler.Marshal(metric, "KafkaTopicX") require.NoError(t, err, "Must have marshaled the data without error") + require.Len(t, msgs, len(tt.messagePartitionKeys), "Number of messages must be %d, but was %d", len(tt.messagePartitionKeys), len(msgs)) + + for i := 0; i < len(tt.messagePartitionKeys); i++ { + require.Equal(t, tt.messagePartitionKeys[i], msgs[i].Key, "message %d has incorrect key", i) + } + }) + } +} + +func TestOTLPLogsJsonMarshaling(t *testing.T) { + tests := []struct { + name string + partitionByResources bool + messagePartitionKeys []sarama.Encoder + }{ + { + name: "partitioning_disabled", + partitionByResources: false, + messagePartitionKeys: []sarama.Encoder{nil}, + }, + { + name: "partitioning_enabled", + partitionByResources: true, + messagePartitionKeys: []sarama.Encoder{ + sarama.ByteEncoder{0x62, 0x7f, 0x20, 0x34, 0x85, 0x49, 0x55, 0x2e, 0xfa, 0x93, 0xae, 0xd7, 0xde, 0x91, 0xd7, 0x16}, + sarama.ByteEncoder{0x75, 0x6b, 0xb4, 0xd6, 0xff, 0xeb, 0x92, 0x22, 0xa, 0x68, 0x65, 0x48, 0xe0, 0xd3, 0x94, 0x44}, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + log := plog.NewLogs() + r := pcommon.NewResource() + r.Attributes().PutStr("service.name", "my_service_name") + r.Attributes().PutStr("service.instance.id", "kek_x_1") + r.CopyTo(log.ResourceLogs().AppendEmpty().Resource()) + + rm := log.ResourceLogs().At(0) + rm.SetSchemaUrl(conventions.SchemaURL) + + sl := rm.ScopeLogs().AppendEmpty() + plog.NewScopeLogs() + l := sl.LogRecords().AppendEmpty() + l.SetSeverityText("INFO") + l.SetTimestamp(pcommon.Timestamp(1)) + l.Body().SetStr("Simple log message") + + r1 := pcommon.NewResource() + r1.Attributes().PutStr("service.instance.id", "kek_x_2") + r1.Attributes().PutStr("service.name", "my_service_name") + r1.CopyTo(log.ResourceLogs().AppendEmpty().Resource()) + marshaler, err := createLogMarshaler( + Config{ + Encoding: "otlp_json", + PartitionLogsByResourceAttributes: tt.partitionByResources, + }) + require.NoError(t, err) + + msgs, err := marshaler.Marshal(log, "KafkaTopicX") + require.NoError(t, err, "Must have marshaled the data without error") require.Len(t, msgs, len(tt.messagePartitionKeys), "Number of messages must be %d, but was %d", len(tt.messagePartitionKeys), len(msgs)) for i := 0; i < len(tt.messagePartitionKeys); i++ { @@ -382,28 +443,24 @@ func TestOTLPTracesJsonMarshaling(t *testing.T) { tests := []struct { encoding string - keyed bool + partitionTracesByID bool numExpectedMessages int expectedJSON []any expectedMessageKey []sarama.Encoder unmarshaled any }{ {encoding: "otlp_json", numExpectedMessages: 1, expectedJSON: unkeyedOtlpJSONResult, expectedMessageKey: unkeyedMessageKey, unmarshaled: map[string]any{}}, - {encoding: "otlp_json", keyed: true, numExpectedMessages: 2, expectedJSON: keyedOtlpJSONResult, expectedMessageKey: keyedMessageKey, unmarshaled: map[string]any{}}, + {encoding: "otlp_json", partitionTracesByID: true, numExpectedMessages: 2, expectedJSON: keyedOtlpJSONResult, expectedMessageKey: keyedMessageKey, unmarshaled: map[string]any{}}, {encoding: "zipkin_json", numExpectedMessages: 1, expectedJSON: unkeyedZipkinJSONResult, expectedMessageKey: unkeyedMessageKey, unmarshaled: []map[string]any{}}, - {encoding: "zipkin_json", keyed: true, numExpectedMessages: 2, expectedJSON: keyedZipkinJSONResult, expectedMessageKey: keyedMessageKey, unmarshaled: []map[string]any{}}, + {encoding: "zipkin_json", partitionTracesByID: true, numExpectedMessages: 2, expectedJSON: keyedZipkinJSONResult, expectedMessageKey: keyedMessageKey, unmarshaled: []map[string]any{}}, } for _, test := range tests { - - marshaler, ok := tracesMarshalers()[test.encoding] - require.True(t, ok, fmt.Sprintf("Must have %s marshaller", test.encoding)) - - if test.keyed { - keyableMarshaler, ok := marshaler.(KeyableTracesMarshaler) - require.True(t, ok, "Must be a KeyableTracesMarshaler") - keyableMarshaler.Key() - } + marshaler, err := createTracesMarshaler(Config{ + Encoding: test.encoding, + PartitionTracesByID: test.partitionTracesByID, + }) + require.NoErrorf(t, err, "Must have %s marshaler", test.encoding) msg, err := marshaler.Marshal(traces, t.Name()) require.NoError(t, err, "Must have marshaled the data without error") @@ -423,3 +480,93 @@ func TestOTLPTracesJsonMarshaling(t *testing.T) { } } } + +func TestTracesEncodingMarshaler(t *testing.T) { + m := &tracesEncodingMarshaler{ + marshaler: &nopComponent{}, + encoding: "trace_encoding", + } + assert.Equal(t, "trace_encoding", m.Encoding()) + data, err := m.Marshal(ptrace.NewTraces(), "topic") + assert.NoError(t, err) + assert.Len(t, data, 1) +} + +type encodingTracesErrorMarshaler struct { + err error +} + +func (m *encodingTracesErrorMarshaler) MarshalTraces(_ ptrace.Traces) ([]byte, error) { + return nil, m.err +} + +func TestTracesEncodingMarshaler_error(t *testing.T) { + expErr := fmt.Errorf("failed to marshal") + m := &tracesEncodingMarshaler{ + marshaler: &encodingTracesErrorMarshaler{err: expErr}, + encoding: "trace_encoding", + } + data, err := m.Marshal(ptrace.NewTraces(), "topic") + assert.Error(t, err) + assert.Nil(t, data) +} + +func TestMetricsEncodingMarshaler(t *testing.T) { + m := &metricsEncodingMarshaler{ + marshaler: &nopComponent{}, + encoding: "metric_encoding", + } + assert.Equal(t, "metric_encoding", m.Encoding()) + data, err := m.Marshal(pmetric.NewMetrics(), "topic") + assert.NoError(t, err) + assert.Len(t, data, 1) +} + +type encodingMetricsErrorMarshaler struct { + err error +} + +func (m *encodingMetricsErrorMarshaler) MarshalMetrics(_ pmetric.Metrics) ([]byte, error) { + return nil, m.err +} + +func TestMetricsEncodingMarshaler_error(t *testing.T) { + expErr := fmt.Errorf("failed to marshal") + m := &metricsEncodingMarshaler{ + marshaler: &encodingMetricsErrorMarshaler{err: expErr}, + encoding: "metrics_encoding", + } + data, err := m.Marshal(pmetric.NewMetrics(), "topic") + assert.Error(t, err) + assert.Nil(t, data) +} + +func TestLogsEncodingMarshaler(t *testing.T) { + m := &logsEncodingMarshaler{ + marshaler: &nopComponent{}, + encoding: "log_encoding", + } + assert.Equal(t, "log_encoding", m.Encoding()) + data, err := m.Marshal(plog.NewLogs(), "topic") + assert.NoError(t, err) + assert.Len(t, data, 1) +} + +type encodingLogsErrorMarshaler struct { + err error +} + +func (m *encodingLogsErrorMarshaler) MarshalLogs(_ plog.Logs) ([]byte, error) { + return nil, m.err +} + +func TestLogsEncodingMarshaler_error(t *testing.T) { + expErr := fmt.Errorf("failed to marshal") + m := &logsEncodingMarshaler{ + marshaler: &encodingLogsErrorMarshaler{err: expErr}, + encoding: "logs_encoding", + } + data, err := m.Marshal(plog.NewLogs(), "topic") + assert.Error(t, err) + assert.Nil(t, data) +} diff --git a/exporter/kafkaexporter/metadata.yaml b/exporter/kafkaexporter/metadata.yaml index 7c1683989506..ea264ca5e48f 100644 --- a/exporter/kafkaexporter/metadata.yaml +++ b/exporter/kafkaexporter/metadata.yaml @@ -1,5 +1,4 @@ type: kafka -scope_name: otelcol/kafka status: class: exporter diff --git a/exporter/kafkaexporter/pdata_marshaler.go b/exporter/kafkaexporter/pdata_marshaler.go index 3429cdd8316e..ae9726f2cbe8 100644 --- a/exporter/kafkaexporter/pdata_marshaler.go +++ b/exporter/kafkaexporter/pdata_marshaler.go @@ -15,60 +15,72 @@ import ( ) type pdataLogsMarshaler struct { - marshaler plog.Marshaler - encoding string + marshaler plog.Marshaler + encoding string + partitionedByResources bool } func (p pdataLogsMarshaler) Marshal(ld plog.Logs, topic string) ([]*sarama.ProducerMessage, error) { - bts, err := p.marshaler.MarshalLogs(ld) - if err != nil { - return nil, err - } - return []*sarama.ProducerMessage{ - { + var msgs []*sarama.ProducerMessage + if p.partitionedByResources { + logs := ld.ResourceLogs() + + for i := 0; i < logs.Len(); i++ { + resourceMetrics := logs.At(i) + hash := pdatautil.MapHash(resourceMetrics.Resource().Attributes()) + + newLogs := plog.NewLogs() + resourceMetrics.CopyTo(newLogs.ResourceLogs().AppendEmpty()) + + bts, err := p.marshaler.MarshalLogs(newLogs) + if err != nil { + return nil, err + } + msgs = append(msgs, &sarama.ProducerMessage{ + Topic: topic, + Value: sarama.ByteEncoder(bts), + Key: sarama.ByteEncoder(hash[:]), + }) + } + } else { + bts, err := p.marshaler.MarshalLogs(ld) + if err != nil { + return nil, err + } + msgs = append(msgs, &sarama.ProducerMessage{ Topic: topic, Value: sarama.ByteEncoder(bts), - }, - }, nil + }) + } + return msgs, nil } func (p pdataLogsMarshaler) Encoding() string { return p.encoding } -func newPdataLogsMarshaler(marshaler plog.Marshaler, encoding string) LogsMarshaler { +func newPdataLogsMarshaler(marshaler plog.Marshaler, encoding string, partitionedByResources bool) LogsMarshaler { return pdataLogsMarshaler{ - marshaler: marshaler, - encoding: encoding, + marshaler: marshaler, + encoding: encoding, + partitionedByResources: partitionedByResources, } } -// KeyableMetricsMarshaler is an extension of the MetricsMarshaler interface intended to provide partition key capabilities -// for metrics messages -type KeyableMetricsMarshaler interface { - MetricsMarshaler - Key() -} - type pdataMetricsMarshaler struct { - marshaler pmetric.Marshaler - encoding string - keyed bool -} - -// Key configures the pdataMetricsMarshaler to set the message key on the kafka messages -func (p *pdataMetricsMarshaler) Key() { - p.keyed = true + marshaler pmetric.Marshaler + encoding string + partitionedByResources bool } func (p pdataMetricsMarshaler) Marshal(ld pmetric.Metrics, topic string) ([]*sarama.ProducerMessage, error) { var msgs []*sarama.ProducerMessage - if p.keyed { + if p.partitionedByResources { metrics := ld.ResourceMetrics() for i := 0; i < metrics.Len(); i++ { resourceMetrics := metrics.At(i) - var hash = pdatautil.MapHash(resourceMetrics.Resource().Attributes()) + hash := pdatautil.MapHash(resourceMetrics.Resource().Attributes()) newMetrics := pmetric.NewMetrics() resourceMetrics.CopyTo(newMetrics.ResourceMetrics().AppendEmpty()) @@ -101,29 +113,23 @@ func (p pdataMetricsMarshaler) Encoding() string { return p.encoding } -func newPdataMetricsMarshaler(marshaler pmetric.Marshaler, encoding string) MetricsMarshaler { +func newPdataMetricsMarshaler(marshaler pmetric.Marshaler, encoding string, partitionedByResources bool) MetricsMarshaler { return &pdataMetricsMarshaler{ - marshaler: marshaler, - encoding: encoding, + marshaler: marshaler, + encoding: encoding, + partitionedByResources: partitionedByResources, } } -// KeyableTracesMarshaler is an extension of the TracesMarshaler interface intended to provide partition key capabilities -// for trace messages -type KeyableTracesMarshaler interface { - TracesMarshaler - Key() -} - type pdataTracesMarshaler struct { - marshaler ptrace.Marshaler - encoding string - keyed bool + marshaler ptrace.Marshaler + encoding string + partitionedByTraceID bool } func (p *pdataTracesMarshaler) Marshal(td ptrace.Traces, topic string) ([]*sarama.ProducerMessage, error) { var msgs []*sarama.ProducerMessage - if p.keyed { + if p.partitionedByTraceID { for _, trace := range batchpersignal.SplitTraces(td) { bts, err := p.marshaler.MarshalTraces(trace) if err != nil { @@ -134,7 +140,6 @@ func (p *pdataTracesMarshaler) Marshal(td ptrace.Traces, topic string) ([]*saram Value: sarama.ByteEncoder(bts), Key: sarama.ByteEncoder(traceutil.TraceIDToHexOrEmptyString(trace.ResourceSpans().At(0).ScopeSpans().At(0).Spans().At(0).TraceID())), }) - } } else { bts, err := p.marshaler.MarshalTraces(td) @@ -154,14 +159,10 @@ func (p *pdataTracesMarshaler) Encoding() string { return p.encoding } -// Key configures the pdataTracesMarshaler to set the message key on the kafka messages -func (p *pdataTracesMarshaler) Key() { - p.keyed = true -} - -func newPdataTracesMarshaler(marshaler ptrace.Marshaler, encoding string) TracesMarshaler { +func newPdataTracesMarshaler(marshaler ptrace.Marshaler, encoding string, partitionedByTraceID bool) TracesMarshaler { return &pdataTracesMarshaler{ - marshaler: marshaler, - encoding: encoding, + marshaler: marshaler, + encoding: encoding, + partitionedByTraceID: partitionedByTraceID, } } diff --git a/exporter/kafkaexporter/raw_marshaler.go b/exporter/kafkaexporter/raw_marshaler.go index 166be57f3e06..5a9e283436e8 100644 --- a/exporter/kafkaexporter/raw_marshaler.go +++ b/exporter/kafkaexporter/raw_marshaler.go @@ -14,8 +14,7 @@ import ( var errUnsupported = errors.New("unsupported serialization") -type rawMarshaler struct { -} +type rawMarshaler struct{} func newRawMarshaler() rawMarshaler { return rawMarshaler{} diff --git a/exporter/kafkaexporter/testdata/config.yaml b/exporter/kafkaexporter/testdata/config.yaml index 7c89bea74ade..016e931394e3 100644 --- a/exporter/kafkaexporter/testdata/config.yaml +++ b/exporter/kafkaexporter/testdata/config.yaml @@ -14,6 +14,7 @@ kafka: timeout: 10s partition_traces_by_id: true partition_metrics_by_resource_attributes: true + partition_logs_by_resource_attributes: true auth: plain_text: username: jdoe diff --git a/exporter/kineticaexporter/README.md b/exporter/kineticaexporter/README.md index 7ffd005803fe..7c6e619f3eb3 100644 --- a/exporter/kineticaexporter/README.md +++ b/exporter/kineticaexporter/README.md @@ -1,12 +1,13 @@ | Status | | | ------------- |-----------| -| Stability | [development]: metrics, traces, logs | +| Stability | [unmaintained]: metrics, traces, logs | | Distributions | [] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fkinetica%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fkinetica) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fkinetica%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fkinetica) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@am-kinetica](https://www.github.com/am-kinetica), [@TylerHelmuth](https://www.github.com/TylerHelmuth) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@TylerHelmuth](https://www.github.com/TylerHelmuth) | +| Emeritus | [@am-kinetica](https://www.github.com/am-kinetica) | -[development]: https://github.com/open-telemetry/opentelemetry-collector#development +[unmaintained]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#unmaintained

diff --git a/exporter/kineticaexporter/common.go b/exporter/kineticaexporter/common.go index 902ff230e67c..6eb68b73463c 100644 --- a/exporter/kineticaexporter/common.go +++ b/exporter/kineticaexporter/common.go @@ -733,7 +733,6 @@ func getAttributeValue(vtPair ValueTypePair) (*AttributeValue, error) { } return av, nil - } // chunkBySize - Splits a slice into multiple slices of the given size @@ -742,7 +741,7 @@ func getAttributeValue(vtPair ValueTypePair) (*AttributeValue, error) { // @param chunkSize // @return [][]T func chunkBySize[T any](items []T, chunkSize int) [][]T { - var _chunks = make([][]T, 0, (len(items)/chunkSize)+1) + _chunks := make([][]T, 0, (len(items)/chunkSize)+1) for chunkSize < len(items) { items, _chunks = items[chunkSize:], append(_chunks, items[0:chunkSize:chunkSize]) } diff --git a/exporter/kineticaexporter/config_test.go b/exporter/kineticaexporter/config_test.go index 8d5517b78e92..d4726fe36970 100644 --- a/exporter/kineticaexporter/config_test.go +++ b/exporter/kineticaexporter/config_test.go @@ -27,7 +27,6 @@ func TestLoadConfig(t *testing.T) { id component.ID expected component.Config }{ - { id: component.MustNewIDWithName("kinetica", ""), expected: defaultCfg, @@ -41,7 +40,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) diff --git a/exporter/kineticaexporter/exporter_metric_test.go b/exporter/kineticaexporter/exporter_metric_test.go index 3f8682adea0d..cca7713a38a3 100644 --- a/exporter/kineticaexporter/exporter_metric_test.go +++ b/exporter/kineticaexporter/exporter_metric_test.go @@ -20,22 +20,24 @@ import ( "go.uber.org/zap/zaptest" ) -var testServer *httptest.Server -var baseURL string +var ( + testServer *httptest.Server + baseURL string +) -var showTableMetricSummaryResponse = "\x04OK\x00&show_table_response\xfe\x13&otel.metric_summary\x02&otel.metric_summary\x00\x02\x00\x00\x02(14940230562727554683\x00\x02\xc6\x03{\"type\":\"record\",\"name\":\"type_name\",\"fields\":[{\"name\":\"summary_id\",\"type\":\"string\"},{\"name\":\"metric_name\",\"type\":\"string\"},{\"name\":\"metric_description\",\"type\":[\"string\",\"null\"]},{\"name\":\"metric_unit\",\"type\":[\"string\",\"null\"]}]}\x00\x02\x00\x00\x02\x08$metric_description\x06\x08data\x0echar256\x10nullable\x00\x16metric_name\x04\x08data\x0echar256\x00\x16metric_unit\x06\x08data\x0echar256\x10nullable\x00\x14summary_id\x08\x08data\x16primary_key\x12shard_key\x08uuid\x00\x00\x00\x028\"attribute_indexes\x00 collection_names\x08otel$compressed_columns\x000datasource_subscriptions\x00\x18foreign_keys\x00\"foreign_shard_key\x00$global_access_mode\x14read_write,is_automatic_partition\nfalse\x10is_dirty\x00\"is_view_persisted\x00\"last_refresh_time\x00(owner_resource_group This is an exporter that will consistently export spans, metrics and logs depending on the `routing_key` configured. -The options for `routing_key` are: `service`, `traceID`, `metric` (metric name), `resource`. +The options for `routing_key` are: `service`, `traceID`, `metric` (metric name), `resource`, `streamID`. -| routing_key | can be used for | -| ------------- |-----------| -| service | logs, spans, metrics | -| traceID | logs, spans | -| resource | metrics | -| metric | metrics | +| routing_key | can be used for | +| ----------- | -------------------- | +| service | logs, spans, metrics | +| traceID | logs, spans | +| resource | metrics | +| metric | metrics | +| streamID | metrics | If no `routing_key` is configured, the default routing mechanism is `traceID` for traces, while `service` is the default for metrics. This means that spans belonging to the same `traceID` (or `service.name`, when `service` is used as the `routing_key`) will be sent to the same backend. @@ -33,7 +35,7 @@ Note that either the Trace ID or Service name is used for the decision on which This load balancer is especially useful for backends configured with tail-based samplers or red-metrics-collectors, which make a decision based on the view of the full trace. -When a list of backends is updated, some of the signals will be rerouted to different backends. +When a list of backends is updated, some of the signals will be rerouted to different backends. Around R/N of the "routes" will be rerouted differently, where: * A "route" is either a trace ID or a service name mapped to a certain backend. @@ -45,14 +47,42 @@ This should be stable enough for most cases, and the larger the number of backen This also supports service name based exporting for traces. If you have two or more collectors that collect traces and then use spanmetrics connector to generate metrics and push to prometheus, there is a high chance of facing label collisions on prometheus if the routing is based on `traceID` because every collector sees the `service+operation` label. With service name based routing, each collector can only see one service name and can push metrics without any label collisions. ## Resilience and scaling considerations -The `loadbalancingexporter` will, irrespective of the chosen resolver (`static`, `dns`, `k8s`), create one exporter per endpoint. The exporter conforms to its published configuration regarding sending queue and retry mechanisms. Importantly, the `loadbalancingexporter` will not attempt to re-route data to a healthy endpoint on delivery failure, and data loss is therefore possible if the exporter's target remains unavailable once redelivery is exhausted. Due consideration needs to be given to the exporter queue and retry configuration when running in a highly elastic environment. -- When using the `static` resolver and a target is unavailable, all the target's load-balanced telemetry will fail to be delivered until either the target is restored or removed from the static list. The same principle applies to the `dns` resolver. -- When using `k8s`, `dns`, and likely future resolvers, topology changes are eventually reflected in the `loadbalancingexporter`. The `k8s` resolver will update more quickly than `dns`, but a window of time in which the true topology doesn't match the view of the `loadbalancingexporter` remains. +The `loadbalancingexporter` will, irrespective of the chosen resolver (`static`, `dns`, `k8s`), create one `otlp` exporter per endpoint. Each level of exporters, `loadbalancingexporter` itself and all sub-exporters (one per each endpoint), have it's own queue, timeout and retry mechanisms. Importantly, the `loadbalancingexporter`, by default, will NOT attempt to re-route data to a healthy endpoint on delivery failure, because in-memory queue, retry and timeout setting are disabled by default ([more details on queuing, retry and timeout default settings](https://github.com/open-telemetry/opentelemetry-collector/blob/main/exporter/exporterhelper/README.md)). + +``` + +------------------+ +---------------+ + resiliency options 1 | | | | + -- otlp exporter 1 ------------ backend 1 | + | ---/ | | | | + | ---/ +----|-------------+ +---------------+ + | ---/ | + +-----------------+ ---/ | + | --/ | + | loadbalancing | resiliency options 2 + | exporter | | + | --\ | + +-----------------+ ----\ | + ----\ +----|-------------+ +---------------+ + ----\ | | | | + --- otlp exporter N ------------ backend N | + | | | | + +------------------+ +---------------+ +``` + +* For all types of resolvers (`static`, `dns`, `k8s`) - if one of endpoints is unavailable - first works queue, retry and timeout settings defined for sub-exporters (under `otlp` property). Once redelivery is exhausted on sub-exporter level, and resilience options 1 are enabled - telemetry data returns to `loadbalancingexporter` itself and data redelivery happens according to exporter level queue, retry and timeout settings. +* When using the `static` resolver and all targets are unavailable, all load-balanced telemetry will fail to be delivered until either one or all targets are restored or valid target is added the static list. The same principle applies to the `dns` and `k8s` resolvers, except for endpoints list update which happens automatically. +* When using `k8s`, `dns`, and likely future resolvers, topology changes are eventually reflected in the `loadbalancingexporter`. The `k8s` resolver will update more quickly than `dns`, but a window of time in which the true topology doesn't match the view of the `loadbalancingexporter` remains. +* Resiliency options 1 (`timeout`, `retry_on_failure` and `sending_queue` settings in `loadbalancing` section) - are useful for highly elastic environment (like k8s), where list of resolved endpoints frequently changed due to deployments, scale-up or scale-down events. In case of permanent change of list of resolved exporters this options provide capability to re-route data into new set of healthy backends. Disabled by default. +* Resiliency options 1 (`timeout`, `retry_on_failure` and `sending_queue` settings in `otlp` section) - are useful for temporary problems with specific backend, like network flukes. Persistent Queue is NOT supported here as all sub-exporter shares the same `sending_queue` configuration, including `storage`. Enabled by default. + +Unfortunately, data loss is still possible if all of the exporter's targets remains unavailable once redelivery is exhausted. Due consideration needs to be given to the exporter queue and retry configuration when running in a highly elastic environment. + +To avoid a single point of failure, requests can be distributed among multiple Collector instances configured with the `loadbalancingexporter`. The consistent hashing mechanism will ensure a deterministic result between instances sharing the same configuration and resolve an exact list of backend endpoints. ## Configuration -Refer to [config.yaml](./testdata/config.yaml) for detailed examples on using the processor. +Refer to [config.yaml](./testdata/config.yaml) for detailed examples on using the exporter. * The `otlp` property configures the template used for building the OTLP exporter. Refer to the OTLP Exporter documentation for information on which options are available. Note that the `endpoint` property should not be set and will be overridden by this exporter with the backend endpoint. * The `resolver` accepts a `static` node, a `dns`, a `k8s` service or `aws_cloud_map`. If all four are specified, an `errMultipleResolversProvided` error will be thrown. @@ -66,28 +96,32 @@ Refer to [config.yaml](./testdata/config.yaml) for detailed examples on using th * `service` Kubernetes service to resolve, e.g. `lb-svc.lb-ns`. If no namespace is specified, an attempt will be made to infer the namespace for this collector, and if this fails it will fall back to the `default` namespace. * `ports` port to be used for exporting the traces to the addresses resolved from `service`. If `ports` is not specified, the default port 4317 is used. When multiple ports are specified, two backends are added to the load balancer as if they were at different pods. * `timeout` resolver timeout in go-Duration format, e.g. `5s`, `1d`, `30m`. If not specified, `1s` will be used. + * `return_hostnames` will return hostnames instead of IPs. This is useful in certain situations like using istio in sidecar mode. To use this feature, the `service` must be a headless `Service`, pointing at a `StatefulSet`, and the `service` must be what is specified under `.spec.serviceName` in the `StatefulSet`. * The `aws_cloud_map` node accepts the following properties: * `namespace` The CloudMap namespace where the service is register, e.g. `cloudmap`. If no `namespace` is specified, this will fail to start the Load Balancer exporter. * `service_name` The name of the service that you specified when you registered the instance, e.g. `otelcollectors`. If no `service_name` is specified, this will fail to start the Load Balancer exporter. * `interval` resolver interval in go-Duration format, e.g. `5s`, `1d`, `30m`. If not specified, `30s` will be used. * `timeout` resolver timeout in go-Duration format, e.g. `5s`, `1d`, `30m`. If not specified, `5s` will be used. * `port` port to be used for exporting the traces to the addresses resolved from `service`. By default, the port is set in Cloud Map, but can be be overridden with a static value in this config - * `health_status` filter in AWS Cloud Map, you can specify the health status of the instances that you want to discover. The health_status filter is optional and allows you to query based on the health status of the instances. - * Available values are + * `health_status` filter in AWS Cloud Map, you can specify the health status of the instances that you want to discover. The health_status filter is optional and allows you to query based on the health status of the instances. + * Available values are * `HEALTHY`: Only return instances that are healthy. * `UNHEALTHY`: Only return instances that are unhealthy. * `ALL`: Return all instances, regardless of their health status. * `HEALTHY_OR_ELSE_ALL`: Returns healthy instances, unless none are reporting a healthy state. In that case, return all instances. This is also called failing open. * Resolver's default filter is set to `HEALTHY` when none is explicitly defined - * **Notes:** - * This resolver currently returns a maximum of 100 hosts. + * **Notes:** + * This resolver currently returns a maximum of 100 hosts. * `TODO`: Feature request [29771](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/29771) aims to cover the pagination for this scenario -* The `routing_key` property is used to route spans to exporters based on different parameters. This functionality is currently enabled only for `trace` pipeline types. It supports one of the following values: - * `service`: exports spans based on their service name. This is useful when using processors like the span metrics, so all spans for each service are sent to consistent collector instances for metric collection. Otherwise, metrics for the same services are sent to different collectors, making aggregations inaccurate. - * `traceID` (default): exports spans based on their `traceID`. - * If not configured, defaults to `traceID` based routing. +* The `routing_key` property is used to specify how to route values (spans or metrics) to exporters based on different parameters. This functionality is currently enabled only for `trace` and `metric` pipeline types. It supports one of the following values: + * `service`: Routes values based on their service name. This is useful when using processors like the span metrics, so all spans for each service are sent to consistent collector instances for metric collection. Otherwise, metrics for the same services are sent to different collectors, making aggregations inaccurate. + * `traceID`: Routes spans based on their `traceID`. Invalid for metrics. + * `metric`: Routes metrics based on their metric name. Invalid for spans. + * `streamID`: Routes metrics based on their datapoint streamID. That's the unique hash of all it's attributes, plus the attributes and identifying information of its resource, scope, and metric data +* loadbalancing exporter supports set of standard [queuing, retry and timeout settings](https://github.com/open-telemetry/opentelemetry-collector/blob/main/exporter/exporterhelper/README.md), but they are disable by default to maintain compatibility Simple example + ```yaml receivers: otlp: @@ -112,9 +146,9 @@ exporters: - backend-2:4317 - backend-3:4317 - backend-4:4317 - # Notice to config a headless service DNS in Kubernetes + # Notice to config a headless service DNS in Kubernetes # dns: - # hostname: otelcol-headless.observability.svc.cluster.local + # hostname: otelcol-headless.observability.svc.cluster.local service: pipelines: @@ -132,7 +166,75 @@ service: - loadbalancing ``` +Persistent queue, retry and timeout usage example: + +```yaml +receivers: + otlp: + protocols: + grpc: + endpoint: localhost:4317 + +processors: + +exporters: + loadbalancing: + timeout: 10s + retry_on_failure: + enabled: true + initial_interval: 5s + max_interval: 30s + max_elapsed_time: 300s + sending_queue: + enabled: true + num_consumers: 2 + queue_size: 1000 + storage: file_storage/otc + routing_key: "service" + protocol: + otlp: + # all options from the OTLP exporter are supported + # except the endpoint + timeout: 1s + sending_queue: + enabled: true + resolver: + static: + hostnames: + - backend-1:4317 + - backend-2:4317 + - backend-3:4317 + - backend-4:4317 + # Notice to config a headless service DNS in Kubernetes + # dns: + # hostname: otelcol-headless.observability.svc.cluster.local + +extensions: + file_storage/otc: + directory: /var/lib/storage/otc + timeout: 10s + +service: + extensions: [file_storage] + pipelines: + traces: + receivers: + - otlp + processors: [] + exporters: + - loadbalancing + logs: + receivers: + - otlp + processors: [] + exporters: + - loadbalancing +``` + Kubernetes resolver example (For a more specific example: [example/k8s-resolver](./example/k8s-resolver/README.md)) +> [!IMPORTANT] +> The k8s resolver requires proper permissions. See [the full example](./example/k8s-resolver/README.md) for more information. + ```yaml receivers: otlp: @@ -175,6 +277,7 @@ service: ``` AWS CloudMap resolver example + ```yaml receivers: otlp: @@ -214,6 +317,7 @@ service: ``` For testing purposes, the following configuration can be used, where both the load balancer and all backends are running locally: + ```yaml receivers: otlp/loadbalancer: @@ -326,7 +430,7 @@ service: ## Metrics -The following metrics are recorded by this processor: +The following metrics are recorded by this exporter: * `otelcol_loadbalancer_num_resolutions` represents the total number of resolutions performed by the resolver specified in the tag `resolver`, split by their outcome (`success=true|false`). For the static resolver, this should always be `1` with the tag `success=true`. * `otelcol_loadbalancer_num_backends` informs how many backends are currently in use. It should always match the number of items specified in the configuration file in case the `static` resolver is used, and should eventually (seconds) catch up with the DNS changes. Note that DNS caches that might exist between the load balancer and the record authority will influence how long it takes for the load balancer to see the change. diff --git a/exporter/loadbalancingexporter/config.go b/exporter/loadbalancingexporter/config.go index 212531567e48..5af3af678979 100644 --- a/exporter/loadbalancingexporter/config.go +++ b/exporter/loadbalancingexporter/config.go @@ -7,6 +7,8 @@ import ( "time" "github.com/aws/aws-sdk-go-v2/service/servicediscovery/types" + "go.opentelemetry.io/collector/config/configretry" + "go.opentelemetry.io/collector/exporter/exporterhelper" "go.opentelemetry.io/collector/exporter/otlpexporter" ) @@ -18,10 +20,24 @@ const ( metricNameRouting resourceRouting resourceKeysRouting + streamIDRouting +) + +const ( + svcRoutingStr = "service" + traceIDRoutingStr = "traceID" + metricNameRoutingStr = "metric" + resourceRoutingStr = "resource" + resourceKeysRoutingStr = "resource_keys" + streamIDRoutingStr = "streamID" ) // Config defines configuration for the exporter. type Config struct { + TimeoutSettings exporterhelper.TimeoutConfig `mapstructure:",squash"` + configretry.BackOffConfig `mapstructure:"retry_on_failure"` + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` + Protocol Protocol `mapstructure:"protocol"` Resolver ResolverSettings `mapstructure:"resolver"` RoutingKey string `mapstructure:"routing_key"` @@ -56,9 +72,10 @@ type DNSResolver struct { // K8sSvcResolver defines the configuration for the DNS resolver type K8sSvcResolver struct { - Service string `mapstructure:"service"` - Ports []int32 `mapstructure:"ports"` - Timeout time.Duration `mapstructure:"timeout"` + Service string `mapstructure:"service"` + Ports []int32 `mapstructure:"ports"` + Timeout time.Duration `mapstructure:"timeout"` + ReturnHostnames bool `mapstructure:"return_hostnames"` } type AWSCloudMapResolver struct { diff --git a/exporter/loadbalancingexporter/config_test.go b/exporter/loadbalancingexporter/config_test.go index 71d9ed01905e..c34644174d08 100644 --- a/exporter/loadbalancingexporter/config_test.go +++ b/exporter/loadbalancingexporter/config_test.go @@ -22,6 +22,6 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) require.NotNil(t, cfg) } diff --git a/exporter/loadbalancingexporter/consistent_hashing.go b/exporter/loadbalancingexporter/consistent_hashing.go index 3bd2b3de5911..eda24bb2927e 100644 --- a/exporter/loadbalancingexporter/consistent_hashing.go +++ b/exporter/loadbalancingexporter/consistent_hashing.go @@ -8,8 +8,10 @@ import ( "sort" ) -const maxPositions uint32 = 36000 // 360 degrees with two decimal places -const defaultWeight int = 100 // the number of points in the ring for each entry. For better results, it should be higher than 100. +const ( + maxPositions uint32 = 36000 // 360 degrees with two decimal places + defaultWeight int = 100 // the number of points in the ring for each entry. For better results, it should be higher than 100. +) // position represents a specific angle in the ring. // Each entry in the ring is positioned at an angle in a hypothetical circle, meaning that it ranges from 0 to 360. diff --git a/exporter/loadbalancingexporter/consistent_hashing_test.go b/exporter/loadbalancingexporter/consistent_hashing_test.go index b37d95dafc09..b0d2b22a33f3 100644 --- a/exporter/loadbalancingexporter/consistent_hashing_test.go +++ b/exporter/loadbalancingexporter/consistent_hashing_test.go @@ -42,7 +42,6 @@ func TestEndpointFor(t *testing.T) { // verify assert.Equal(t, tt.expected, endpoint) - }) } } diff --git a/exporter/loadbalancingexporter/documentation.md b/exporter/loadbalancingexporter/documentation.md new file mode 100644 index 000000000000..e28ba185edf1 --- /dev/null +++ b/exporter/loadbalancingexporter/documentation.md @@ -0,0 +1,47 @@ +[comment]: <> (Code generated by mdatagen. DO NOT EDIT.) + +# loadbalancing + +## Internal Telemetry + +The following telemetry is emitted by this component. + +### otelcol_loadbalancer_backend_latency + +Response latency in ms for the backends. + +| Unit | Metric Type | Value Type | +| ---- | ----------- | ---------- | +| ms | Histogram | Int | + +### otelcol_loadbalancer_backend_outcome + +Number of successes and failures for each endpoint. + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| {outcomes} | Sum | Int | true | + +### otelcol_loadbalancer_num_backend_updates + +Number of times the list of backends was updated. + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| {updates} | Sum | Int | true | + +### otelcol_loadbalancer_num_backends + +Current number of backends in use. + +| Unit | Metric Type | Value Type | +| ---- | ----------- | ---------- | +| {backends} | Gauge | Int | + +### otelcol_loadbalancer_num_resolutions + +Number of times the resolver has triggered new resolutions. + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| {resolutions} | Sum | Int | true | diff --git a/exporter/loadbalancingexporter/example/Dockerfile b/exporter/loadbalancingexporter/example/Dockerfile index 29289f483359..d0d5ee5fe1aa 100644 --- a/exporter/loadbalancingexporter/example/Dockerfile +++ b/exporter/loadbalancingexporter/example/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.22 AS build +FROM golang:1.23 AS build WORKDIR /src ADD . /src diff --git a/exporter/loadbalancingexporter/factory.go b/exporter/loadbalancingexporter/factory.go index f748ff162c6f..864acf3a8d2e 100644 --- a/exporter/loadbalancingexporter/factory.go +++ b/exporter/loadbalancingexporter/factory.go @@ -7,19 +7,23 @@ package loadbalancingexporter // import "github.com/open-telemetry/opentelemetry import ( "context" + "fmt" - "go.opencensus.io/stats/view" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/exporter" + "go.opentelemetry.io/collector/exporter/exporterhelper" "go.opentelemetry.io/collector/exporter/otlpexporter" + "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter/internal/metadata" ) +const ( + zapEndpointKey = "endpoint" +) + // NewFactory creates a factory for the exporter. func NewFactory() exporter.Factory { - _ = view.Register(metricViews()...) - return exporter.NewFactory( metadata.Type, createDefaultConfig, @@ -35,20 +39,110 @@ func createDefaultConfig() component.Config { otlpDefaultCfg.Endpoint = "placeholder:4317" return &Config{ + // By default we disable resilience options on loadbalancing exporter level + // to maintain compatibility with workflow in previous versions Protocol: Protocol{ OTLP: *otlpDefaultCfg, }, } } -func createTracesExporter(_ context.Context, params exporter.CreateSettings, cfg component.Config) (exporter.Traces, error) { - return newTracesExporter(params, cfg) +func buildExporterConfig(cfg *Config, endpoint string) otlpexporter.Config { + oCfg := cfg.Protocol.OTLP + oCfg.Endpoint = endpoint + + return oCfg +} + +func buildExporterSettings(params exporter.Settings, endpoint string) exporter.Settings { + // Override child exporter ID to segregate metrics from loadbalancing top level + childName := endpoint + if params.ID.Name() != "" { + childName = fmt.Sprintf("%s_%s", params.ID.Name(), childName) + } + params.ID = component.NewIDWithName(params.ID.Type(), childName) + // Add "endpoint" attribute to child exporter logger to segregate logs from loadbalancing top level + params.Logger = params.Logger.With(zap.String(zapEndpointKey, endpoint)) + + return params } -func createLogsExporter(_ context.Context, params exporter.CreateSettings, cfg component.Config) (exporter.Logs, error) { - return newLogsExporter(params, cfg) +func buildExporterResilienceOptions(options []exporterhelper.Option, cfg *Config) []exporterhelper.Option { + if cfg.TimeoutSettings.Timeout > 0 { + options = append(options, exporterhelper.WithTimeout(cfg.TimeoutSettings)) + } + if cfg.QueueSettings.Enabled { + options = append(options, exporterhelper.WithQueue(cfg.QueueSettings)) + } + if cfg.BackOffConfig.Enabled { + options = append(options, exporterhelper.WithRetry(cfg.BackOffConfig)) + } + + return options } -func createMetricsExporter(_ context.Context, params exporter.CreateSettings, cfg component.Config) (exporter.Metrics, error) { - return newMetricsExporter(params, cfg) +func createTracesExporter(ctx context.Context, params exporter.Settings, cfg component.Config) (exporter.Traces, error) { + c := cfg.(*Config) + exp, err := newTracesExporter(params, cfg) + if err != nil { + return nil, fmt.Errorf("cannot configure loadbalancing traces exporter: %w", err) + } + + options := []exporterhelper.Option{ + exporterhelper.WithStart(exp.Start), + exporterhelper.WithShutdown(exp.Shutdown), + exporterhelper.WithCapabilities(exp.Capabilities()), + } + + return exporterhelper.NewTraces( + ctx, + params, + cfg, + exp.ConsumeTraces, + buildExporterResilienceOptions(options, c)..., + ) +} + +func createLogsExporter(ctx context.Context, params exporter.Settings, cfg component.Config) (exporter.Logs, error) { + c := cfg.(*Config) + exporter, err := newLogsExporter(params, cfg) + if err != nil { + return nil, fmt.Errorf("cannot configure loadbalancing logs exporter: %w", err) + } + + options := []exporterhelper.Option{ + exporterhelper.WithStart(exporter.Start), + exporterhelper.WithShutdown(exporter.Shutdown), + exporterhelper.WithCapabilities(exporter.Capabilities()), + } + + return exporterhelper.NewLogs( + ctx, + params, + cfg, + exporter.ConsumeLogs, + buildExporterResilienceOptions(options, c)..., + ) +} + +func createMetricsExporter(ctx context.Context, params exporter.Settings, cfg component.Config) (exporter.Metrics, error) { + c := cfg.(*Config) + exporter, err := newMetricsExporter(params, cfg) + if err != nil { + return nil, fmt.Errorf("cannot configure loadbalancing metrics exporter: %w", err) + } + + options := []exporterhelper.Option{ + exporterhelper.WithStart(exporter.Start), + exporterhelper.WithShutdown(exporter.Shutdown), + exporterhelper.WithCapabilities(exporter.Capabilities()), + } + + return exporterhelper.NewMetrics( + ctx, + params, + cfg, + exporter.ConsumeMetrics, + buildExporterResilienceOptions(options, c)..., + ) } diff --git a/exporter/loadbalancingexporter/factory_test.go b/exporter/loadbalancingexporter/factory_test.go index 6da108067651..b4d3ff103e5a 100644 --- a/exporter/loadbalancingexporter/factory_test.go +++ b/exporter/loadbalancingexporter/factory_test.go @@ -5,16 +5,28 @@ package loadbalancingexporter import ( "context" + "fmt" + "path/filepath" "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configretry" + "go.opentelemetry.io/collector/exporter/exporterhelper" "go.opentelemetry.io/collector/exporter/exportertest" + "go.opentelemetry.io/collector/exporter/otlpexporter" + "go.opentelemetry.io/collector/otelcol/otelcoltest" + "go.uber.org/zap" + "go.uber.org/zap/zaptest/observer" + + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter/internal/metadata" ) func TestTracesExporterGetsCreatedWithValidConfiguration(t *testing.T) { // prepare factory := NewFactory() - creationParams := exportertest.NewNopCreateSettings() + creationParams := exportertest.NewNopSettings() cfg := &Config{ Resolver: ResolverSettings{ Static: &StaticResolver{Hostnames: []string{"endpoint-1"}}, @@ -22,7 +34,7 @@ func TestTracesExporterGetsCreatedWithValidConfiguration(t *testing.T) { } // test - exp, err := factory.CreateTracesExporter(context.Background(), creationParams, cfg) + exp, err := factory.CreateTraces(context.Background(), creationParams, cfg) // verify assert.NoError(t, err) @@ -32,7 +44,7 @@ func TestTracesExporterGetsCreatedWithValidConfiguration(t *testing.T) { func TestLogExporterGetsCreatedWithValidConfiguration(t *testing.T) { // prepare factory := NewFactory() - creationParams := exportertest.NewNopCreateSettings() + creationParams := exportertest.NewNopSettings() cfg := &Config{ Resolver: ResolverSettings{ Static: &StaticResolver{Hostnames: []string{"endpoint-1"}}, @@ -40,7 +52,7 @@ func TestLogExporterGetsCreatedWithValidConfiguration(t *testing.T) { } // test - exp, err := factory.CreateLogsExporter(context.Background(), creationParams, cfg) + exp, err := factory.CreateLogs(context.Background(), creationParams, cfg) // verify assert.NoError(t, err) @@ -58,3 +70,90 @@ func TestOTLPConfigIsValid(t *testing.T) { // verify assert.NoError(t, otlpCfg.Validate()) } + +func TestBuildExporterConfig(t *testing.T) { + // prepare + factories, err := otelcoltest.NopFactories() + require.NoError(t, err) + + factories.Exporters[metadata.Type] = NewFactory() + // https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/33594 + // nolint:staticcheck + cfg, err := otelcoltest.LoadConfigAndValidate(filepath.Join("testdata", "test-build-exporter-config.yaml"), factories) + require.NoError(t, err) + require.NotNil(t, cfg) + + c := cfg.Exporters[component.NewID(metadata.Type)] + require.NotNil(t, c) + + // test + defaultCfg := otlpexporter.NewFactory().CreateDefaultConfig().(*otlpexporter.Config) + exporterCfg := buildExporterConfig(c.(*Config), "the-endpoint") + + // verify + grpcSettings := defaultCfg.ClientConfig + grpcSettings.Endpoint = "the-endpoint" + assert.Equal(t, grpcSettings, exporterCfg.ClientConfig) + + assert.Equal(t, defaultCfg.TimeoutConfig, exporterCfg.TimeoutConfig) + assert.Equal(t, defaultCfg.QueueConfig, exporterCfg.QueueConfig) + assert.Equal(t, defaultCfg.RetryConfig, exporterCfg.RetryConfig) +} + +func TestBuildExporterSettings(t *testing.T) { + // prepare + creationParams := exportertest.NewNopSettings() + testEndpoint := "the-endpoint" + observedZapCore, observedLogs := observer.New(zap.InfoLevel) + creationParams.Logger = zap.New(observedZapCore) + + // test + exporterParams := buildExporterSettings(creationParams, testEndpoint) + exporterParams.Logger.Info("test") + + // verify + expectedID := component.NewIDWithName( + creationParams.ID.Type(), + fmt.Sprintf("%s_%s", creationParams.ID.Name(), testEndpoint), + ) + assert.Equal(t, expectedID, exporterParams.ID) + + allLogs := observedLogs.All() + require.Equal(t, 1, observedLogs.Len()) + assert.Contains(t, + allLogs[0].Context, + zap.String(zapEndpointKey, testEndpoint), + ) +} + +func TestBuildExporterResilienceOptions(t *testing.T) { + t.Run("Shouldn't have resilience options by default", func(t *testing.T) { + o := []exporterhelper.Option{} + cfg := createDefaultConfig().(*Config) + assert.Empty(t, buildExporterResilienceOptions(o, cfg)) + }) + t.Run("Should have timeout option if defined", func(t *testing.T) { + o := []exporterhelper.Option{} + cfg := createDefaultConfig().(*Config) + cfg.TimeoutSettings = exporterhelper.NewDefaultTimeoutConfig() + + assert.Len(t, buildExporterResilienceOptions(o, cfg), 1) + }) + t.Run("Should have timeout and queue options if defined", func(t *testing.T) { + o := []exporterhelper.Option{} + cfg := createDefaultConfig().(*Config) + cfg.TimeoutSettings = exporterhelper.NewDefaultTimeoutConfig() + cfg.QueueSettings = exporterhelper.NewDefaultQueueConfig() + + assert.Len(t, buildExporterResilienceOptions(o, cfg), 2) + }) + t.Run("Should have all resilience options if defined", func(t *testing.T) { + o := []exporterhelper.Option{} + cfg := createDefaultConfig().(*Config) + cfg.TimeoutSettings = exporterhelper.NewDefaultTimeoutConfig() + cfg.QueueSettings = exporterhelper.NewDefaultQueueConfig() + cfg.BackOffConfig = configretry.NewDefaultBackOffConfig() + + assert.Len(t, buildExporterResilienceOptions(o, cfg), 3) + }) +} diff --git a/exporter/loadbalancingexporter/generated_component_telemetry_test.go b/exporter/loadbalancingexporter/generated_component_telemetry_test.go new file mode 100644 index 000000000000..b8e4b136fb6b --- /dev/null +++ b/exporter/loadbalancingexporter/generated_component_telemetry_test.go @@ -0,0 +1,84 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package loadbalancingexporter + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + sdkmetric "go.opentelemetry.io/otel/sdk/metric" + "go.opentelemetry.io/otel/sdk/metric/metricdata" + "go.opentelemetry.io/otel/sdk/metric/metricdata/metricdatatest" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/config/configtelemetry" + "go.opentelemetry.io/collector/exporter" + "go.opentelemetry.io/collector/exporter/exportertest" +) + +type componentTestTelemetry struct { + reader *sdkmetric.ManualReader + meterProvider *sdkmetric.MeterProvider +} + +func (tt *componentTestTelemetry) NewSettings() exporter.Settings { + set := exportertest.NewNopSettings() + set.ID = component.NewID(component.MustNewType("loadbalancing")) + set.TelemetrySettings = tt.newTelemetrySettings() + return set +} + +func (tt *componentTestTelemetry) newTelemetrySettings() component.TelemetrySettings { + set := componenttest.NewNopTelemetrySettings() + set.MeterProvider = tt.meterProvider + set.MetricsLevel = configtelemetry.LevelDetailed + return set +} + +func setupTestTelemetry() componentTestTelemetry { + reader := sdkmetric.NewManualReader() + return componentTestTelemetry{ + reader: reader, + meterProvider: sdkmetric.NewMeterProvider(sdkmetric.WithReader(reader)), + } +} + +func (tt *componentTestTelemetry) assertMetrics(t *testing.T, expected []metricdata.Metrics) { + var md metricdata.ResourceMetrics + require.NoError(t, tt.reader.Collect(context.Background(), &md)) + // ensure all required metrics are present + for _, want := range expected { + got := tt.getMetric(want.Name, md) + metricdatatest.AssertEqual(t, want, got, metricdatatest.IgnoreTimestamp()) + } + + // ensure no additional metrics are emitted + require.Equal(t, len(expected), tt.len(md)) +} + +func (tt *componentTestTelemetry) getMetric(name string, got metricdata.ResourceMetrics) metricdata.Metrics { + for _, sm := range got.ScopeMetrics { + for _, m := range sm.Metrics { + if m.Name == name { + return m + } + } + } + + return metricdata.Metrics{} +} + +func (tt *componentTestTelemetry) len(got metricdata.ResourceMetrics) int { + metricsCount := 0 + for _, sm := range got.ScopeMetrics { + metricsCount += len(sm.Metrics) + } + + return metricsCount +} + +func (tt *componentTestTelemetry) Shutdown(ctx context.Context) error { + return tt.meterProvider.Shutdown(ctx) +} diff --git a/exporter/loadbalancingexporter/generated_component_test.go b/exporter/loadbalancingexporter/generated_component_test.go index d20c3a701d4d..7e349cca3fb9 100644 --- a/exporter/loadbalancingexporter/generated_component_test.go +++ b/exporter/loadbalancingexporter/generated_component_test.go @@ -32,27 +32,27 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, { name: "metrics", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg) }, }, { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -64,21 +64,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(exporter.Logs) require.True(t, ok) diff --git a/exporter/loadbalancingexporter/generated_package_test.go b/exporter/loadbalancingexporter/generated_package_test.go index 9f3b2bb9b31d..469069df786b 100644 --- a/exporter/loadbalancingexporter/generated_package_test.go +++ b/exporter/loadbalancingexporter/generated_package_test.go @@ -9,5 +9,5 @@ import ( ) func TestMain(m *testing.M) { - goleak.VerifyTestMain(m, goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start")) + goleak.VerifyTestMain(m) } diff --git a/exporter/loadbalancingexporter/go.mod b/exporter/loadbalancingexporter/go.mod index 0cb553d1b5e5..f041e7ac77ef 100644 --- a/exporter/loadbalancingexporter/go.mod +++ b/exporter/loadbalancingexporter/go.mod @@ -1,158 +1,187 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter -go 1.21.0 +go 1.22.0 require ( - github.com/aws/aws-sdk-go-v2/config v1.27.16 - github.com/aws/aws-sdk-go-v2/service/servicediscovery v1.29.10 - github.com/aws/smithy-go v1.20.2 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opencensus.io v0.24.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/exporter/otlpexporter v0.102.0 - go.opentelemetry.io/collector/otelcol v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/aws/aws-sdk-go-v2/config v1.28.6 + github.com/aws/aws-sdk-go-v2/service/servicediscovery v1.33.7 + github.com/aws/smithy-go v1.22.1 + github.com/json-iterator/go v1.1.12 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/exporter/otlpexporter v0.116.0 + go.opentelemetry.io/collector/otelcol/otelcoltest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/semconv v0.116.0 + go.opentelemetry.io/otel v1.32.0 + go.opentelemetry.io/otel/metric v1.32.0 + go.opentelemetry.io/otel/sdk/metric v1.32.0 + go.opentelemetry.io/otel/trace v1.32.0 go.uber.org/goleak v1.3.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 - k8s.io/api v0.29.3 - k8s.io/apimachinery v0.29.3 - k8s.io/client-go v0.29.3 - k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0 - sigs.k8s.io/controller-runtime v0.17.3 + gopkg.in/yaml.v2 v2.4.0 + k8s.io/api v0.31.3 + k8s.io/apimachinery v0.31.3 + k8s.io/client-go v0.31.3 + k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 + sigs.k8s.io/controller-runtime v0.19.3 ) require ( - github.com/aws/aws-sdk-go-v2 v1.27.0 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.16 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.20.9 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.28.10 // indirect + github.com/aws/aws-sdk-go-v2 v1.32.6 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.47 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.24.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.33.2 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/ebitengine/purego v0.8.1 // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect - github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/evanphx/json-patch/v5 v5.8.0 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/evanphx/json-patch/v5 v5.9.0 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/swag v0.22.3 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-openapi/swag v0.22.4 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/imdario/mergo v0.3.6 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/josharian/intern v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.4 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/mostynb/go-grpc-compression v1.2.2 // indirect + github.com/mostynb/go-grpc-compression v1.2.3 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/client_golang v1.19.1 // indirect + github.com/prometheus/client_golang v1.20.5 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/shirou/gopsutil/v3 v3.24.4 // indirect - github.com/shoenig/go-m1cpu v0.1.6 // indirect - github.com/spf13/cobra v1.8.0 // indirect + github.com/prometheus/common v0.61.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/shirou/gopsutil/v4 v4.24.11 // indirect + github.com/spf13/cobra v1.8.1 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect + github.com/x448/float16 v0.8.4 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/configgrpc v0.102.0 // indirect - go.opentelemetry.io/collector/config/confignet v0.102.0 // indirect - go.opentelemetry.io/collector/config/configopaque v1.9.0 // indirect - go.opentelemetry.io/collector/config/configretry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0 // indirect - go.opentelemetry.io/collector/connector v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/pdata/testdata v0.102.0 // indirect - go.opentelemetry.io/collector/processor v0.102.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/collector/service v0.102.0 // indirect - go.opentelemetry.io/contrib/config v0.7.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 // indirect - go.opentelemetry.io/contrib/propagators/b3 v1.27.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/bridge/opencensus v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - go.opentelemetry.io/proto/otlp v1.2.0 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/component/componentstatus v0.116.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/configgrpc v0.116.0 // indirect + go.opentelemetry.io/collector/config/confignet v1.22.0 // indirect + go.opentelemetry.io/collector/config/configopaque v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtls v1.22.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0 // indirect + go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0 // indirect + go.opentelemetry.io/collector/confmap/provider/httpprovider v1.22.0 // indirect + go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.22.0 // indirect + go.opentelemetry.io/collector/connector v0.116.0 // indirect + go.opentelemetry.io/collector/connector/connectortest v0.116.0 // indirect + go.opentelemetry.io/collector/connector/xconnector v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0 // indirect + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/otelcol v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/testdata v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 // indirect + go.opentelemetry.io/collector/processor v0.116.0 // indirect + go.opentelemetry.io/collector/processor/processortest v0.116.0 // indirect + go.opentelemetry.io/collector/processor/xprocessor v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/collector/service v0.116.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.6.0 // indirect + go.opentelemetry.io/contrib/config v0.10.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 // indirect + go.opentelemetry.io/contrib/propagators/b3 v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.54.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 // indirect + go.opentelemetry.io/otel/log v0.8.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.7.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/oauth2 v0.20.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/term v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/oauth2 v0.24.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect golang.org/x/time v0.4.0 // indirect - gonum.org/v1/gonum v0.15.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + gonum.org/v1/gonum v0.15.1 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect + gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/klog/v2 v2.110.1 // indirect - k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect sigs.k8s.io/yaml v1.4.0 // indirect @@ -168,3 +197,11 @@ retract ( // ambiguous import: found package cloud.google.com/go/compute/metadata in multiple modules replace cloud.google.com/go v0.65.0 => cloud.google.com/go v0.110.10 + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../../pkg/pdatautil + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest => ../../pkg/pdatatest + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden => ../../pkg/golden + +replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics => ../../internal/exp/metrics diff --git a/exporter/loadbalancingexporter/go.sum b/exporter/loadbalancingexporter/go.sum index 530844652744..ac45f0094c6e 100644 --- a/exporter/loadbalancingexporter/go.sum +++ b/exporter/loadbalancingexporter/go.sum @@ -1,63 +1,58 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/aws/aws-sdk-go-v2 v1.27.0 h1:7bZWKoXhzI+mMR/HjdMx8ZCC5+6fY0lS5tr0bbgiLlo= -github.com/aws/aws-sdk-go-v2 v1.27.0/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= -github.com/aws/aws-sdk-go-v2/config v1.27.16 h1:knpCuH7laFVGYTNd99Ns5t+8PuRjDn4HnnZK48csipM= -github.com/aws/aws-sdk-go-v2/config v1.27.16/go.mod h1:vutqgRhDUktwSge3hrC3nkuirzkJ4E/mLj5GvI0BQas= -github.com/aws/aws-sdk-go-v2/credentials v1.17.16 h1:7d2QxY83uYl0l58ceyiSpxg9bSbStqBC6BeEeHEchwo= -github.com/aws/aws-sdk-go-v2/credentials v1.17.16/go.mod h1:Ae6li/6Yc6eMzysRL2BXlPYvnrLLBg3D11/AmOjw50k= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3 h1:dQLK4TjtnlRGb0czOht2CevZ5l6RSyRWAnKeGd7VAFE= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3/go.mod h1:TL79f2P6+8Q7dTsILpiVST+AL9lkF6PPGI167Ny0Cjw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7 h1:lf/8VTF2cM+N4SLzaYJERKEWAXq8MOMpZfU6wEPWsPk= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7/go.mod h1:4SjkU7QiqK2M9oozyMzfZ/23LmUY+h3oFqhdeP5OMiI= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7 h1:4OYVp0705xu8yjdyoWix0r9wPIRXnIzzOoUpQVHIJ/g= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7/go.mod h1:vd7ESTEvI76T2Na050gODNmNU7+OyKrIKroYTu4ABiI= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2/go.mod h1:5CsjAbs3NlGQyZNFACh+zztPDI7fU6eW9QsxjfnuBKg= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9 h1:Wx0rlZoEJR7JwlSZcHnEa7CNjrSIyVxMFWGAaXy4fJY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9/go.mod h1:aVMHdE0aHO3v+f/iw01fmXV/5DbfQ3Bi9nN7nd9bE9Y= -github.com/aws/aws-sdk-go-v2/service/servicediscovery v1.29.10 h1:MNECBvcQiQxwBsVwZKShXRc1mrYawtj39jIxPXWeAQY= -github.com/aws/aws-sdk-go-v2/service/servicediscovery v1.29.10/go.mod h1:/tT3hQYAj8aGFmy4hYqeR8I5R1uFVaIlHwj6jNU+ohs= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.9 h1:aD7AGQhvPuAxlSUfo0CWU7s6FpkbyykMhGYMvlqTjVs= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.9/go.mod h1:c1qtZUWtygI6ZdvKppzCSXsDOq5I4luJPZ0Ud3juFCA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.3 h1:Pav5q3cA260Zqez42T9UhIlsd9QeypszRPwC9LdSSsQ= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.3/go.mod h1:9lmoVDVLz/yUZwLaQ676TK02fhCu4+PgRSmMaKR1ozk= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.10 h1:69tpbPED7jKPyzMcrwSvhWcJ9bPnZsZs18NT40JwM0g= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.10/go.mod h1:0Aqn1MnEuitqfsCNyKsdKLhDUOr4txD/g19EfiUqgws= -github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= -github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= +github.com/aws/aws-sdk-go-v2 v1.32.6 h1:7BokKRgRPuGmKkFMhEg/jSul+tB9VvXhcViILtfG8b4= +github.com/aws/aws-sdk-go-v2 v1.32.6/go.mod h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U= +github.com/aws/aws-sdk-go-v2/config v1.28.6 h1:D89IKtGrs/I3QXOLNTH93NJYtDhm8SYa9Q5CsPShmyo= +github.com/aws/aws-sdk-go-v2/config v1.28.6/go.mod h1:GDzxJ5wyyFSCoLkS+UhGB0dArhb9mI+Co4dHtoTxbko= +github.com/aws/aws-sdk-go-v2/credentials v1.17.47 h1:48bA+3/fCdi2yAwVt+3COvmatZ6jUDNkDTIsqDiMUdw= +github.com/aws/aws-sdk-go-v2/credentials v1.17.47/go.mod h1:+KdckOejLW3Ks3b0E3b5rHsr2f9yuORBum0WPnE5o5w= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21 h1:AmoU1pziydclFT/xRV+xXE/Vb8fttJCLRPv8oAkprc0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21/go.mod h1:AjUdLYe4Tgs6kpH4Bv7uMZo7pottoyHMn4eTcIcneaY= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25 h1:s/fF4+yDQDoElYhfIVvSNyeCydfbuTKzhxSXDXCPasU= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25/go.mod h1:IgPfDv5jqFIzQSNbUEMoitNooSMXjRSDkhXv8jiROvU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25 h1:ZntTCl5EsYnhN/IygQEUugpdwbhdkom9uHcbCftiGgA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25/go.mod h1:DBdPrgeocww+CSl1C8cEV8PN1mHMBhuCDLpXezyvWkE= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6 h1:50+XsN70RS7dwJ2CkVNXzj7U2L1HKP8nqTd3XWEXBN4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6/go.mod h1:WqgLmwY7so32kG01zD8CPTJWVWM+TzJoOVHwTg4aPug= +github.com/aws/aws-sdk-go-v2/service/servicediscovery v1.33.7 h1:GfXWwM9/iEJVcWQaMu22YzBeGQnY6zjiZD556awNJBA= +github.com/aws/aws-sdk-go-v2/service/servicediscovery v1.33.7/go.mod h1:YMM+e0OfZQVBpTJs+WNZWP/hdodeWnepXgancR5NFFw= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.7 h1:rLnYAfXQ3YAccocshIH5mzNNwZBkBo+bP6EhIxak6Hw= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.7/go.mod h1:ZHtuQJ6t9A/+YDuxOLnbryAmITtr8UysSny3qcyvJTc= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6 h1:JnhTZR3PiYDNKlXy50/pNeix9aGMo6lLpXwJ1mw8MD4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6/go.mod h1:URronUEGfXZN1VpdktPSD1EkAL9mfrV+2F4sjH38qOY= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.2 h1:s4074ZO1Hk8qv65GqNXqDjmkf4HSQqJukaLuuW0TpDA= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.2/go.mod h1:mVggCnIWoM09jP71Wh+ea7+5gAp53q+49wDFs1SW5z8= +github.com/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro= +github.com/aws/smithy-go v1.22.1/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= 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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/BE= +github.com/ebitengine/purego v0.8.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.8.0 h1:lRj6N9Nci7MvzrXuX6HFzU8XjmhPiXPlsKEy1u0KQro= -github.com/evanphx/json-patch/v5 v5.8.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= +github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= @@ -68,40 +63,21 @@ github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= +github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= @@ -109,13 +85,12 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af h1:kmjWCqn2qkEml422C2Rrd27c3VGxi6a/6HNq8QmHRKM= +github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= @@ -128,14 +103,14 @@ 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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= -github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -143,6 +118,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= @@ -156,167 +133,223 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mostynb/go-grpc-compression v1.2.2 h1:XaDbnRvt2+1vgr0b/l0qh4mJAfIxE0bKXtz2Znl3GGI= -github.com/mostynb/go-grpc-compression v1.2.2/go.mod h1:GOCr2KBxXcblCuczg3YdLQlcin1/NfyDA348ckuCH6w= +github.com/mostynb/go-grpc-compression v1.2.3 h1:42/BKWMy0KEJGSdWvzqIyOZ95YcR9mLPqKctH7Uo//I= +github.com/mostynb/go-grpc-compression v1.2.3/go.mod h1:AghIxF3P57umzqM9yz795+y1Vjs47Km/Y2FE6ouQ7Lg= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/onsi/ginkgo/v2 v2.14.0 h1:vSmGj2Z5YPb9JwCWT6z6ihcUvDhuXLc3sJiqd3jMKAY= -github.com/onsi/ginkgo/v2 v2.14.0/go.mod h1:JkUdW7JkN0V6rFvsHcJ478egV3XH9NxpD27Hal/PhZw= -github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= -github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= +github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= +github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk= +github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/prometheus/common v0.61.0 h1:3gv/GThfX0cV2lpO7gkTUwZru38mxevy90Bj8YFSRQQ= +github.com/prometheus/common v0.61.0/go.mod h1:zr29OCN/2BsJRaFwG8QOBr41D6kkchKbpeNH7pAjb/s= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= -github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= -github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= -github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= -github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= -github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/shirou/gopsutil/v4 v4.24.11 h1:WaU9xqGFKvFfsUv94SXcUPD7rCkU0vr/asVdQOBZNj8= +github.com/shirou/gopsutil/v4 v4.24.11/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/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 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/configgrpc v0.102.0 h1:cQi5HwpkHvrZJUxZjoGXkWpAuK+gEyp/1Zjn0BrkvmQ= -go.opentelemetry.io/collector/config/configgrpc v0.102.0/go.mod h1:ASpBXzDWLiDGlG8iRFovU5R4LhAefoC4ajm+qIdslOw= -go.opentelemetry.io/collector/config/confignet v0.102.0 h1:+wQevJ/iBnPxL+roY7WWnAjMxB8v4M5QrS3+0iEmauw= -go.opentelemetry.io/collector/config/confignet v0.102.0/go.mod h1:pfOrCTfSZEB6H2rKtx41/3RN4dKs+X2EKQbw3MGRh0E= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0 h1:8Ne/oL6M4kMWK0P3FKV9EduQa+1UOGyVAnFHfSo4c1A= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0/go.mod h1:Xj4Ld/RriP/Bj+5oPpaYJsLNs2wWRDN2TvzX3Lbi6+M= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0 h1:o1iKqN+oM+TZqHoGdnKw1Am2BQlIGCYbxCRzU8T3jbM= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0/go.mod h1:JpCemLtL/sXQ2Rk3Bx7OPPA7Qt/9NVH91q0bR655gSo= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0 h1:SfASE6lxXjrmYj/UibcWdOiFWvRG0zt4hJgenloEhlY= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0/go.mod h1:+Ku0Fvdb5f6e9UkfqJXAV5FaUJVxxg6Ykfx7Js8y+V4= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0 h1:GwJQTXs7pYPUv/fVf+0nBgsJdlrTuY/PfwQ/TRA/sIk= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0/go.mod h1:PGE3DcRgqYWWC2cq2hYZoET1d3Q8JZyPNmgvqXPFWEU= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0 h1:zdYZLiHHtDf4Kk9WU7mW9dW6WAXtBF54I5jmTMRJtiw= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0/go.mod h1:yFsgUM0PbUJkPlbpJfOG6da+YiF0Z80tv7YcnL3qwv4= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0 h1:Y4H+GaCQl2URp9mEJMV5CYOhw+erONqNyvtFoKQfIoA= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0/go.mod h1:g1RjfVD0gHAf/mPOIs3zBoKBeuDsN+rc5x0lZtgA8tI= -go.opentelemetry.io/collector/connector v0.102.0 h1:IvAsVfYRxP0ajmKbUovF8qugkcUtHq6RuYNtjcMa63E= -go.opentelemetry.io/collector/connector v0.102.0/go.mod h1:f4M7wZ/9+XtgTE0fivBFH3WlwntaEd0qFFA0giFkdnY= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/exporter/otlpexporter v0.102.0 h1:Nz2ULE5JfDj/houoV+VYSXTWP3/54/kCXH26WjJUNjI= -go.opentelemetry.io/collector/exporter/otlpexporter v0.102.0/go.mod h1:jaMS+3T8lwFc0jEjbqqOC+ArTwpGzR5De8u/jPncyKM= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/extension/zpagesextension v0.102.0 h1:BPq98py8nwzaV7KAsxt4ZZAF9LiSRu7ZjHNGavFNyKo= -go.opentelemetry.io/collector/extension/zpagesextension v0.102.0/go.mod h1:P86HW3x3epDS5F4yP0gAvsZiw4xxP1OupTEx2o6UqjY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/otelcol v0.102.0 h1:HuE+ok4iUjOrmYhQBSWpG5kBTVhcA24ljPL4pBERZ5E= -go.opentelemetry.io/collector/otelcol v0.102.0/go.mod h1:w8pCRu2nM/jAkLlEAS6ccKtJv5ylUQe6Ugl98zzTfyE= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/processor v0.102.0 h1:JsjTlpBRmoSYxcu3cAbKBchOmL6aNUxLa03ZkWIqZr8= -go.opentelemetry.io/collector/processor v0.102.0/go.mod h1:IaCSDcfy75uQTaOM+LgR1bMf/bUw2eFfzn20uvWYfLQ= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/collector/service v0.102.0 h1:B5nfyQZF7eB/y+yucl9G/7VsusbXixYXWingXn7VszM= -go.opentelemetry.io/collector/service v0.102.0/go.mod h1:c+0n0DfQeCjgrdplNHYwYbG/5aupTZVYU/50nMQraoc= -go.opentelemetry.io/contrib/config v0.7.0 h1:b1rK5tGTuhhPirJiMxOcyQfZs76j2VapY6ODn3b2Dbs= -go.opentelemetry.io/contrib/config v0.7.0/go.mod h1:8tdiFd8N5etOi3XzBmAoMxplEzI3TcL8dU5rM5/xcOQ= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 h1:vS1Ao/R55RNV4O7TA2Qopok8yN+X0LIP6RVWLFkprck= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0/go.mod h1:BMsdeOxN04K0L5FNUBfjFdvwWGNe/rkmSwH4Aelu/X0= -go.opentelemetry.io/contrib/propagators/b3 v1.27.0 h1:IjgxbomVrV9za6bRi8fWCNXENs0co37SZedQilP2hm0= -go.opentelemetry.io/contrib/propagators/b3 v1.27.0/go.mod h1:Dv9obQz25lCisDvvs4dy28UPh974CxkahRDUPsY7y9E= -go.opentelemetry.io/contrib/zpages v0.52.0 h1:MPgkMy0Cp3O5EdfVXP0ss3ujhEibysTM4eszx7E7d+E= -go.opentelemetry.io/contrib/zpages v0.52.0/go.mod h1:fqG5AFdoYru3A3DnhibVuaaEfQV2WKxE7fYE1jgDRwk= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/bridge/opencensus v1.27.0 h1:ao9aGGHd+G4YfjBpGs6vbkvt5hoC67STlJA9fCnOAcs= -go.opentelemetry.io/otel/bridge/opencensus v1.27.0/go.mod h1:uRvWtAAXzyVOST0WMPX5JHGBaAvBws+2F8PcC5gMnTk= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 h1:bFgvUr3/O4PHj3VQcFEuYKvRZJX1SJDQ+11JXuSB3/w= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0/go.mod h1:xJntEd2KL6Qdg5lwp97HMLQDVeAhrYxmzFseAMDPQ8I= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 h1:CIHWikMsN3wO+wq1Tp5VGdVRTcON+DmOJSfDjXypKOc= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0/go.mod h1:TNupZ6cxqyFEpLXAZW7On+mLFL0/g0TE3unIYL91xWc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0 h1:/jlt1Y8gXWiHG9FBx6cJaIC5hYx5Fe64nC8w5Cylt/0= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0/go.mod h1:bmToOGOBZ4hA9ghphIc1PAf66VA8KOtsuy3+ScStG20= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 h1:/0YaXu3755A/cFbtXp+21lkXgI0QE5avTWA2HjU9/WE= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0/go.mod h1:m7SFxp0/7IxmJPLIY3JhOcU9CoFzDaCPL6xxQIxhA+o= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= -go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= -go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= +go.opentelemetry.io/collector v0.116.0 h1:Dscd6Nsnc7hjFQosO0SofcPQsXRfcj5N5PjQAslnmj4= +go.opentelemetry.io/collector v0.116.0/go.mod h1:Ug2hpW0SINPmJAGVEALRlux78NTZc3YXSuh5/Q/hFrA= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/configgrpc v0.116.0 h1:O8Y1X9wDH5dDdqDJ9kqoaMrxEauaDSJBg9aNC6QgB7g= +go.opentelemetry.io/collector/config/configgrpc v0.116.0/go.mod h1:RPrSQrr6xhIaAK2DdcECi142NjSo0npQfVQB3nommSo= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/confignet v1.22.0 h1:SBEMHJZWD8J4qgFw1O+BEkXW9AWldDi6Fz5YeDeoU58= +go.opentelemetry.io/collector/config/confignet v1.22.0/go.mod h1:ZppUH1hgUJOubawEsxsQ9MzEYFytqo2GnVSS7d4CVxc= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0 h1:AdHaQo/GSSRLJvEFLCMHo02r+u6Ed8j0/MNz7u3noug= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0/go.mod h1:InKYEGFdkwz3H2q648kT6rMCFBhPvevIW9ZbWIY5QR4= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0 h1:upFhnU8EyPp0WMR53mJIdx+UR2EGFOr+ppYKzUCY/Vg= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0/go.mod h1:FhjMWU5nf3IctX27lVZomM5SKMyRywShRsA4/rHoBe8= +go.opentelemetry.io/collector/confmap/provider/httpprovider v1.22.0 h1:jKLicfZRiA+G/sgso26aM6Dmmva4Dx9Txk2R58+R3e8= +go.opentelemetry.io/collector/confmap/provider/httpprovider v1.22.0/go.mod h1:nZhEGDufHuZAaeVyFVz15IluXwrnQRCp+U/w7j8Lx9Y= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.22.0 h1:dkiNwLxBqeNDN5fIwtvr2GoA0I2xZB2SEdQ9ceBbJVs= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.22.0/go.mod h1:P9SxKZvim1C3K1R2j3gI+Qb4/l9MffX2sY5f9ajsk7Y= +go.opentelemetry.io/collector/connector v0.116.0 h1:0Pz8RAXH1swLeA1fiyGGQWdv0Kemz4mbq+jnmd1TACE= +go.opentelemetry.io/collector/connector v0.116.0/go.mod h1:VQiZ2yW9KhZuF0yjDbvlgrAxm7+o8KQoxHxurQWLjKU= +go.opentelemetry.io/collector/connector/connectortest v0.116.0 h1:MdttvjqdZmp0ewW5IPCEtzzYmCqxrQxsjJ5m6gMVjzA= +go.opentelemetry.io/collector/connector/connectortest v0.116.0/go.mod h1:ko7aPyvAVf6SvRhWGZdPXSyk+7zPmsSCcMq0gYPMMIQ= +go.opentelemetry.io/collector/connector/xconnector v0.116.0 h1:fFJzrRco0g7HMkhnQ+ehlvicFf58vzsCLXnfuHyQM8w= +go.opentelemetry.io/collector/connector/xconnector v0.116.0/go.mod h1:m9oCk32zX6wDciYBpy+qMQkWKtOxb0gAkEUm8+trflY= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.116.0 h1:sSPDz4Qu7H86SrxtE6sQHDuWjFkTWHdKyGdsxhjZzcw= +go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.116.0/go.mod h1:0K7jbkCWtydn1IA3JwAUJeLVL79tJTxWoXR2gYTnCk0= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.116.0 h1:BzMvZf9RKRcQPFjGnQSEWvfI5Er9kXfzyZ/4GHkUTa4= +go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.116.0/go.mod h1:RCbA3MNnZPTy2mViwQxMlnrq5moJ1XgetNQx2XHIpaI= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/otlpexporter v0.116.0 h1:2yA8fUW0R0hml2OFxfCmSdtdqpfCLqBGazJ8eALajgU= +go.opentelemetry.io/collector/exporter/otlpexporter v0.116.0/go.mod h1:hbK5ggV3hjsjdifV7oUQKhbjg0ijgIeK9BHixTAzuYo= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0 h1:bXDgoiDiwFfrO5S6q1Wpe0su303CW4Qxthoy4CxG6eg= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0/go.mod h1:uFZlAPxk2+s6zk1W+u22DgxxSDugWy0QaY5kQzjNy7Q= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/extension/zpagesextension v0.116.0 h1:D0VY/ESPwkREfMaqJleGVTiCYoCs3MDipU93ywaIn68= +go.opentelemetry.io/collector/extension/zpagesextension v0.116.0/go.mod h1:MqkQSYKarMrjVSyGrAes1FBcsW6HDDPj/ouvcDvSjfk= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 h1:KKFb3u8iLk4V5GYz7eVpw8QgEdob5koX6GNEbaoDQJY= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0/go.mod h1:YyWHUWeSnRmy2CF7kPHpwJ6qkVjufbLZ8PYuY0Ph0o8= +go.opentelemetry.io/collector/otelcol v0.116.0 h1:8NoPEY2uAemwNzUcMxiZuuI8w/Ff+0p1DXXk6NVEGlk= +go.opentelemetry.io/collector/otelcol v0.116.0/go.mod h1:c/EhsBdHmC44SxhWMi7pTlYB+I6GBSJNBsj9NCwXMxM= +go.opentelemetry.io/collector/otelcol/otelcoltest v0.116.0 h1:ZNg2kFLKnreaGSMfbr74k1yEbHLxG4ZbVvSIr+XleXo= +go.opentelemetry.io/collector/otelcol/otelcoltest v0.116.0/go.mod h1:TruQJSWWiDRlSYZTcLSE0GeECJZALDw8X8dvoYXUJ+A= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 h1:PFNy+Il/kqPdPL9rhG+1kG63Aauya+FhBKGXoB6ivxU= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0/go.mod h1:bVn9V4TGyeXi58/JDkeXCuKtc+V+qcOoTl8hNpV0qa8= +go.opentelemetry.io/collector/processor v0.116.0 h1:Kyu4tPzTdWNHtZjcxvI/bGNAgyv8L8Kem2r/Mk4IDAw= +go.opentelemetry.io/collector/processor v0.116.0/go.mod h1:+/Ugy48RAxlZEXmN2cw51W8t5wdHS9No+GAoP+moskk= +go.opentelemetry.io/collector/processor/processortest v0.116.0 h1:+IqNEVEE0E2MsO2g7+Y/9dz35sDuvAXRXrLts9NdXrA= +go.opentelemetry.io/collector/processor/processortest v0.116.0/go.mod h1:DLaQDBxzgeeaUO0ULMn/efos9PmHZkmYCHuxwCsiVHI= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0 h1:iin/UwuWvSLB7ZNfINFUYbZ5lxIi1NjZ2brkyyFdiRA= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0/go.mod h1:cnA43/XpKDbaOmd8buqKp/LGJ2l/OoCqbR//u5DMfn8= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/collector/service v0.116.0 h1:1rFmax3ILOlQq4bW//0VKRcG/HmN2rxrgfTybn6bisU= +go.opentelemetry.io/collector/service v0.116.0/go.mod h1:CzQzj72mWr5arag+q8uUWGRuUkenNo5Gw9oA97SFZ78= +go.opentelemetry.io/contrib/bridges/otelzap v0.6.0 h1:j8icMXyyqNf6HGuwlYhniPnVsbJIq7n+WirDu3VAJdQ= +go.opentelemetry.io/contrib/bridges/otelzap v0.6.0/go.mod h1:evIOZpl+kAlU5IsaYX2Siw+IbpacAZvXemVsgt70uvw= +go.opentelemetry.io/contrib/config v0.10.0 h1:2JknAzMaYjxrHkTnZh3eOme/Y2P5eHE2SWfhfV6Xd6c= +go.opentelemetry.io/contrib/config v0.10.0/go.mod h1:aND2M6/KfNkntI5cyvHriR/zvZgPf8j9yETdSmvpfmc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 h1:yMkBS9yViCc7U7yeLzJPM2XizlfdVvBRSmsQDWu6qc0= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0/go.mod h1:n8MR6/liuGB5EmTETUBeU5ZgqMOlqKRxUaqPQBOANZ8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/contrib/propagators/b3 v1.31.0 h1:PQPXYscmwbCp76QDvO4hMngF2j8Bx/OTV86laEl8uqo= +go.opentelemetry.io/contrib/propagators/b3 v1.31.0/go.mod h1:jbqfV8wDdqSDrAYxVpXQnpM0XFMq2FtDesblJ7blOwQ= +go.opentelemetry.io/contrib/zpages v0.56.0 h1:W7vP6s3juzL5KiHpr41zLNmsJ0QAZudYu8ay0zGAoko= +go.opentelemetry.io/contrib/zpages v0.56.0/go.mod h1:IxPRP4TYHw9jLeaEOSDIiA9zmyJNZNO6sbW55iMvSXs= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 h1:mMOmtYie9Fx6TSVzw4W+NTpvoaS1JWWga37oI1a/4qQ= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0/go.mod h1:yy7nDsMMBUkD+jeekJ36ur5f3jJIrmCwUrY67VFhNpA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 h1:j7ZSD+5yn+lo3sGV69nW04rRR0jhYnBwjuX3r0HvnK0= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0/go.mod h1:WXbYJTUaZXAbYd8lbgGuvih0yuCfOFC5RJoYnoLcGz8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 h1:t/Qur3vKSkUCcDVaSumWF2PKHt85pc7fRvFuoVT8qFU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0/go.mod h1:Rl61tySSdcOJWoEgYZVtmnKdA0GeKrSqkHC1t+91CH8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 h1:K0XaT3DwHAcV4nKLzcQvwAgSyisUghWoY20I7huthMk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0/go.mod h1:B5Ki776z/MBnVha1Nzwp5arlzBbE3+1jk+pGmaP5HME= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy03iVTXP6ffeN2iXrxfGsZGCjVx0/4KlizjyBwU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0/go.mod h1:TMu73/k1CP8nBUpDLc71Wj/Kf7ZS9FK5b53VapRsP9o= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 h1:lUsI2TYsQw2r1IASwoROaCnjdj2cvC2+Jbxvk6nHnWU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0/go.mod h1:2HpZxxQurfGxJlJDblybejHB6RX6pmExPNe517hREw4= +go.opentelemetry.io/otel/exporters/prometheus v0.54.0 h1:rFwzp68QMgtzu9PgP3jm9XaMICI6TsofWWPcBDKwlsU= +go.opentelemetry.io/otel/exporters/prometheus v0.54.0/go.mod h1:QyjcV9qDP6VeK5qPyKETvNjmaaEc7+gqjh4SS0ZYzDU= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 h1:TwmL3O3fRR80m8EshBrd8YydEZMcUCsZXzOUlnFohwM= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0/go.mod h1:tH98dDv5KPmPThswbXA0fr0Lwfs+OhK8HgaCo7PjRrk= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 h1:SZmDnHcgp3zwlPBS2JX2urGYe/jBKEIT6ZedHRUyCz8= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0/go.mod h1:fdWW0HtZJ7+jNpTKUR0GpMEDP69nR8YBJQxNiVCE3jk= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 h1:UGZ1QwZWY67Z6BmckTU+9Rxn04m2bD3gD6Mk0OIOCPk= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0/go.mod h1:fcwWuDuaObkkChiDlhEpSq9+X1C0omv+s5mBtToAQ64= +go.opentelemetry.io/otel/log v0.8.0 h1:egZ8vV5atrUWUbnSsHn6vB8R21G2wrKqNiDt3iWertk= +go.opentelemetry.io/otel/log v0.8.0/go.mod h1:M9qvDdUTRCopJcGRKg57+JSQ9LgLBrwwfC32epk5NX8= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/log v0.7.0 h1:dXkeI2S0MLc5g0/AwxTZv6EUEjctiH8aG14Am56NTmQ= +go.opentelemetry.io/otel/sdk/log v0.7.0/go.mod h1:oIRXpW+WD6M8BuGj5rtS0aRu/86cbDV/dAfNaZBIjYM= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -326,34 +359,21 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= -golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -361,63 +381,41 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.4.0 h1:Z81tqI5ddIoXDPvVQ7/7CC9TnLM7ubaFG2qXYd5BbYY= golang.org/x/time v0.4.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= -golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= -gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 h1:P8OJ/WCl/Xo4E4zoe4/bifHpSmmKwARqyqE4nW6J2GQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= +gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= +gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -426,24 +424,22 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/api v0.29.3 h1:2ORfZ7+bGC3YJqGpV0KSDDEVf8hdGQ6A03/50vj8pmw= -k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80= -k8s.io/apiextensions-apiserver v0.29.2 h1:UK3xB5lOWSnhaCk0RFZ0LUacPZz9RY4wi/yt2Iu+btg= -k8s.io/apiextensions-apiserver v0.29.2/go.mod h1:aLfYjpA5p3OwtqNXQFkhJ56TB+spV8Gc4wfMhUA3/b8= -k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= -k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= -k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg= -k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= -k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= -k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= -k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0 h1:jgGTlFYnhF1PM1Ax/lAlxUPE+KfCIXHaathvJg1C3ak= -k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/controller-runtime v0.17.3 h1:65QmN7r3FWgTxDMz9fvGnO1kbf2nu+acg9p2R9oYYYk= -sigs.k8s.io/controller-runtime v0.17.3/go.mod h1:N0jpP5Lo7lMTF9aL56Z/B2oWBJjey6StQM0jRbKQXtY= +k8s.io/api v0.31.3 h1:umzm5o8lFbdN/hIXbrK9oRpOproJO62CV1zqxXrLgk8= +k8s.io/api v0.31.3/go.mod h1:UJrkIp9pnMOI9K2nlL6vwpxRzzEX5sWgn8kGQe92kCE= +k8s.io/apiextensions-apiserver v0.31.0 h1:fZgCVhGwsclj3qCw1buVXCV6khjRzKC5eCFt24kyLSk= +k8s.io/apiextensions-apiserver v0.31.0/go.mod h1:b9aMDEYaEe5sdK+1T0KU78ApR/5ZVp4i56VacZYEHxk= +k8s.io/apimachinery v0.31.3 h1:6l0WhcYgasZ/wk9ktLq5vLaoXJJr5ts6lkaQzgeYPq4= +k8s.io/apimachinery v0.31.3/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= +k8s.io/client-go v0.31.3 h1:CAlZuM+PH2cm+86LOBemaJI/lQ5linJ6UFxKX/SoG+4= +k8s.io/client-go v0.31.3/go.mod h1:2CgjPUTpv3fE5dNygAr2NcM8nhHzXvxB8KL5gYc3kJs= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/controller-runtime v0.19.3 h1:XO2GvC9OPftRst6xWCpTgBZO04S2cbp0Qqkj8bX1sPw= +sigs.k8s.io/controller-runtime v0.19.3/go.mod h1:j4j87DqtsThvwTv5/Tc5NFRyyF/RF0ip4+62tbTSIUM= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= diff --git a/exporter/loadbalancingexporter/helpers.go b/exporter/loadbalancingexporter/helpers.go index 13322efb98f2..56a5f81d9739 100644 --- a/exporter/loadbalancingexporter/helpers.go +++ b/exporter/loadbalancingexporter/helpers.go @@ -4,7 +4,6 @@ package loadbalancingexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter" import ( - "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" ) @@ -13,9 +12,3 @@ func mergeTraces(t1 ptrace.Traces, t2 ptrace.Traces) ptrace.Traces { t2.ResourceSpans().MoveAndAppendTo(t1.ResourceSpans()) return t1 } - -// mergeMetrics concatenates two pmetric.Metrics into a single pmetric.Metrics. -func mergeMetrics(m1 pmetric.Metrics, m2 pmetric.Metrics) pmetric.Metrics { - m2.ResourceMetrics().MoveAndAppendTo(m1.ResourceMetrics()) - return m1 -} diff --git a/exporter/loadbalancingexporter/helpers_test.go b/exporter/loadbalancingexporter/helpers_test.go index e8bda317d54b..bea11d3c213f 100644 --- a/exporter/loadbalancingexporter/helpers_test.go +++ b/exporter/loadbalancingexporter/helpers_test.go @@ -7,9 +7,8 @@ import ( "testing" "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" ) func TestMergeTracesTwoEmpty(t *testing.T) { @@ -66,60 +65,6 @@ func TestMergeTraces(t *testing.T) { require.Equal(t, expectedTraces, mergedTraces) } -func TestMergeMetricsTwoEmpty(t *testing.T) { - expectedEmpty := pmetric.NewMetrics() - metric1 := pmetric.NewMetrics() - metric2 := pmetric.NewMetrics() - - mergedMetrics := mergeMetrics(metric1, metric2) - - require.Equal(t, expectedEmpty, mergedMetrics) -} - -func TestMergeMetricsSingleEmpty(t *testing.T) { - expectedMetrics := simpleMetricsWithResource() - - metric1 := pmetric.NewMetrics() - metric2 := simpleMetricsWithResource() - - mergedMetrics := mergeMetrics(metric1, metric2) - - require.Equal(t, expectedMetrics, mergedMetrics) -} - -func TestMergeMetrics(t *testing.T) { - expectedMetrics := pmetric.NewMetrics() - expectedMetrics.ResourceMetrics().EnsureCapacity(3) - ametrics := expectedMetrics.ResourceMetrics().AppendEmpty() - ametrics.Resource().Attributes().PutStr(conventions.AttributeServiceName, "service-name-1") - ametrics.ScopeMetrics().AppendEmpty().Metrics().AppendEmpty().SetName("m1") - bmetrics := expectedMetrics.ResourceMetrics().AppendEmpty() - bmetrics.Resource().Attributes().PutStr(conventions.AttributeServiceName, "service-name-2") - bmetrics.ScopeMetrics().AppendEmpty().Metrics().AppendEmpty().SetName("m1") - cmetrics := expectedMetrics.ResourceMetrics().AppendEmpty() - cmetrics.Resource().Attributes().PutStr(conventions.AttributeServiceName, "service-name-3") - cmetrics.ScopeMetrics().AppendEmpty().Metrics().AppendEmpty().SetName("m2") - - metric1 := pmetric.NewMetrics() - metric1.ResourceMetrics().EnsureCapacity(2) - m1ametrics := metric1.ResourceMetrics().AppendEmpty() - m1ametrics.Resource().Attributes().PutStr(conventions.AttributeServiceName, "service-name-1") - m1ametrics.ScopeMetrics().AppendEmpty().Metrics().AppendEmpty().SetName("m1") - m1bmetrics := metric1.ResourceMetrics().AppendEmpty() - m1bmetrics.Resource().Attributes().PutStr(conventions.AttributeServiceName, "service-name-2") - m1bmetrics.ScopeMetrics().AppendEmpty().Metrics().AppendEmpty().SetName("m1") - - metric2 := pmetric.NewMetrics() - metric2.ResourceMetrics().EnsureCapacity(1) - m2cmetrics := metric2.ResourceMetrics().AppendEmpty() - m2cmetrics.Resource().Attributes().PutStr(conventions.AttributeServiceName, "service-name-3") - m2cmetrics.ScopeMetrics().AppendEmpty().Metrics().AppendEmpty().SetName("m2") - - mergedMetrics := mergeMetrics(metric1, metric2) - - require.Equal(t, expectedMetrics, mergedMetrics) -} - func benchMergeTraces(b *testing.B, tracesCount int) { traces1 := ptrace.NewTraces() traces2 := ptrace.NewTraces() @@ -146,30 +91,3 @@ func BenchmarkMergeTraces_X500(b *testing.B) { func BenchmarkMergeTraces_X1000(b *testing.B) { benchMergeTraces(b, 1000) } - -func benchMergeMetrics(b *testing.B, metricsCount int) { - metrics1 := pmetric.NewMetrics() - metrics2 := pmetric.NewMetrics() - - for i := 0; i < metricsCount; i++ { - appendSimpleMetricWithID(metrics2.ResourceMetrics().AppendEmpty(), "metrics-2") - } - - b.ResetTimer() - - for i := 0; i < b.N; i++ { - mergeMetrics(metrics1, metrics2) - } -} - -func BenchmarkMergeMetrics_X100(b *testing.B) { - benchMergeMetrics(b, 100) -} - -func BenchmarkMergeMetrics_X500(b *testing.B) { - benchMergeMetrics(b, 500) -} - -func BenchmarkMergeMetrics_X1000(b *testing.B) { - benchMergeMetrics(b, 1000) -} diff --git a/exporter/loadbalancingexporter/internal/metadata/generated_status.go b/exporter/loadbalancingexporter/internal/metadata/generated_status.go index 98cd81971c7e..135ca834af66 100644 --- a/exporter/loadbalancingexporter/internal/metadata/generated_status.go +++ b/exporter/loadbalancingexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("loadbalancing") + Type = component.MustNewType("loadbalancing") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter" ) const ( diff --git a/exporter/loadbalancingexporter/internal/metadata/generated_telemetry.go b/exporter/loadbalancingexporter/internal/metadata/generated_telemetry.go index e22a8fdda8f5..0b94025141b4 100644 --- a/exporter/loadbalancingexporter/internal/metadata/generated_telemetry.go +++ b/exporter/loadbalancingexporter/internal/metadata/generated_telemetry.go @@ -3,15 +3,92 @@ package metadata import ( - "go.opentelemetry.io/collector/component" + "errors" + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/metric/noop" "go.opentelemetry.io/otel/trace" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configtelemetry" ) func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/loadbalancing") + return settings.MeterProvider.Meter("github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter") } func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/loadbalancing") + return settings.TracerProvider.Tracer("github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter") +} + +// TelemetryBuilder provides an interface for components to report telemetry +// as defined in metadata and user config. +type TelemetryBuilder struct { + meter metric.Meter + LoadbalancerBackendLatency metric.Int64Histogram + LoadbalancerBackendOutcome metric.Int64Counter + LoadbalancerNumBackendUpdates metric.Int64Counter + LoadbalancerNumBackends metric.Int64Gauge + LoadbalancerNumResolutions metric.Int64Counter +} + +// TelemetryBuilderOption applies changes to default builder. +type TelemetryBuilderOption interface { + apply(*TelemetryBuilder) +} + +type telemetryBuilderOptionFunc func(mb *TelemetryBuilder) + +func (tbof telemetryBuilderOptionFunc) apply(mb *TelemetryBuilder) { + tbof(mb) +} + +// NewTelemetryBuilder provides a struct with methods to update all internal telemetry +// for a component +func NewTelemetryBuilder(settings component.TelemetrySettings, options ...TelemetryBuilderOption) (*TelemetryBuilder, error) { + builder := TelemetryBuilder{} + for _, op := range options { + op.apply(&builder) + } + builder.meter = Meter(settings) + var err, errs error + builder.LoadbalancerBackendLatency, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Histogram( + "otelcol_loadbalancer_backend_latency", + metric.WithDescription("Response latency in ms for the backends."), + metric.WithUnit("ms"), + metric.WithExplicitBucketBoundaries([]float64{5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000}...), + ) + errs = errors.Join(errs, err) + builder.LoadbalancerBackendOutcome, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_loadbalancer_backend_outcome", + metric.WithDescription("Number of successes and failures for each endpoint."), + metric.WithUnit("{outcomes}"), + ) + errs = errors.Join(errs, err) + builder.LoadbalancerNumBackendUpdates, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_loadbalancer_num_backend_updates", + metric.WithDescription("Number of times the list of backends was updated."), + metric.WithUnit("{updates}"), + ) + errs = errors.Join(errs, err) + builder.LoadbalancerNumBackends, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Gauge( + "otelcol_loadbalancer_num_backends", + metric.WithDescription("Current number of backends in use."), + metric.WithUnit("{backends}"), + ) + errs = errors.Join(errs, err) + builder.LoadbalancerNumResolutions, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_loadbalancer_num_resolutions", + metric.WithDescription("Number of times the resolver has triggered new resolutions."), + metric.WithUnit("{resolutions}"), + ) + errs = errors.Join(errs, err) + return &builder, errs +} + +func getLeveledMeter(meter metric.Meter, cfgLevel, srvLevel configtelemetry.Level) metric.Meter { + if cfgLevel <= srvLevel { + return meter + } + return noop.Meter{} } diff --git a/exporter/loadbalancingexporter/internal/metadata/generated_telemetry_test.go b/exporter/loadbalancingexporter/internal/metadata/generated_telemetry_test.go index 8b724ff7dece..813a551209f6 100644 --- a/exporter/loadbalancingexporter/internal/metadata/generated_telemetry_test.go +++ b/exporter/loadbalancingexporter/internal/metadata/generated_telemetry_test.go @@ -14,6 +14,7 @@ import ( nooptrace "go.opentelemetry.io/otel/trace/noop" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" ) type mockMeter struct { @@ -49,15 +50,25 @@ func TestProviders(t *testing.T) { meter := Meter(set) if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/loadbalancing", m.name) + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter", m.name) } else { require.Fail(t, "returned Meter not mockMeter") } tracer := Tracer(set) if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/loadbalancing", m.name) + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter", m.name) } else { require.Fail(t, "returned Meter not mockTracer") } } + +func TestNewTelemetryBuilder(t *testing.T) { + set := componenttest.NewNopTelemetrySettings() + applied := false + _, err := NewTelemetryBuilder(set, telemetryBuilderOptionFunc(func(b *TelemetryBuilder) { + applied = true + })) + require.NoError(t, err) + require.True(t, applied) +} diff --git a/exporter/loadbalancingexporter/loadbalancer.go b/exporter/loadbalancingexporter/loadbalancer.go index ea087762bad1..c14ad3d91183 100644 --- a/exporter/loadbalancingexporter/loadbalancer.go +++ b/exporter/loadbalancingexporter/loadbalancer.go @@ -11,8 +11,9 @@ import ( "sync" "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/exporter" "go.uber.org/zap" + + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter/internal/metadata" ) const ( @@ -41,10 +42,10 @@ type loadBalancer struct { } // Create new load balancer -func newLoadBalancer(params exporter.CreateSettings, cfg component.Config, factory componentFactory) (*loadBalancer, error) { +func newLoadBalancer(logger *zap.Logger, cfg component.Config, factory componentFactory, telemetry *metadata.TelemetryBuilder) (*loadBalancer, error) { oCfg := cfg.(*Config) - var count = 0 + count := 0 if oCfg.Resolver.DNS != nil { count++ } @@ -64,37 +65,64 @@ func newLoadBalancer(params exporter.CreateSettings, cfg component.Config, facto var res resolver if oCfg.Resolver.Static != nil { var err error - res, err = newStaticResolver(oCfg.Resolver.Static.Hostnames) + res, err = newStaticResolver( + oCfg.Resolver.Static.Hostnames, + telemetry, + ) if err != nil { return nil, err } } if oCfg.Resolver.DNS != nil { - dnsLogger := params.Logger.With(zap.String("resolver", "dns")) + dnsLogger := logger.With(zap.String("resolver", "dns")) var err error - res, err = newDNSResolver(dnsLogger, oCfg.Resolver.DNS.Hostname, oCfg.Resolver.DNS.Port, oCfg.Resolver.DNS.Interval, oCfg.Resolver.DNS.Timeout) + res, err = newDNSResolver( + dnsLogger, + oCfg.Resolver.DNS.Hostname, + oCfg.Resolver.DNS.Port, + oCfg.Resolver.DNS.Interval, + oCfg.Resolver.DNS.Timeout, + telemetry, + ) if err != nil { return nil, err } } if oCfg.Resolver.K8sSvc != nil { - k8sLogger := params.Logger.With(zap.String("resolver", "k8s service")) + k8sLogger := logger.With(zap.String("resolver", "k8s service")) clt, err := newInClusterClient() if err != nil { return nil, err } - res, err = newK8sResolver(clt, k8sLogger, oCfg.Resolver.K8sSvc.Service, oCfg.Resolver.K8sSvc.Ports, oCfg.Resolver.K8sSvc.Timeout) + res, err = newK8sResolver( + clt, + k8sLogger, + oCfg.Resolver.K8sSvc.Service, + oCfg.Resolver.K8sSvc.Ports, + oCfg.Resolver.K8sSvc.Timeout, + oCfg.Resolver.K8sSvc.ReturnHostnames, + telemetry, + ) if err != nil { return nil, err } } if oCfg.Resolver.AWSCloudMap != nil { - awsCloudMapLogger := params.Logger.With(zap.String("resolver", "aws_cloud_map")) + awsCloudMapLogger := logger.With(zap.String("resolver", "aws_cloud_map")) var err error - res, err = newCloudMapResolver(awsCloudMapLogger, &oCfg.Resolver.AWSCloudMap.NamespaceName, &oCfg.Resolver.AWSCloudMap.ServiceName, oCfg.Resolver.AWSCloudMap.Port, &oCfg.Resolver.AWSCloudMap.HealthStatus, oCfg.Resolver.AWSCloudMap.Interval, oCfg.Resolver.AWSCloudMap.Timeout) + res, err = newCloudMapResolver( + awsCloudMapLogger, + &oCfg.Resolver.AWSCloudMap.NamespaceName, + &oCfg.Resolver.AWSCloudMap.ServiceName, + oCfg.Resolver.AWSCloudMap.Port, + &oCfg.Resolver.AWSCloudMap.HealthStatus, + oCfg.Resolver.AWSCloudMap.Interval, + oCfg.Resolver.AWSCloudMap.Timeout, + telemetry, + ) if err != nil { return nil, err } @@ -105,7 +133,7 @@ func newLoadBalancer(params exporter.CreateSettings, cfg component.Config, facto } return &loadBalancer{ - logger: params.Logger, + logger: logger, res: res, componentFactory: factory, exporters: map[string]*wrappedExporter{}, @@ -146,7 +174,7 @@ func (lb *loadBalancer) addMissingExporters(ctx context.Context, endpoints []str lb.logger.Error("failed to create new exporter for endpoint", zap.String("endpoint", endpoint), zap.Error(err)) continue } - we := newWrappedExporter(exp) + we := newWrappedExporter(exp, endpoint) if err = we.Start(ctx, lb.host); err != nil { lb.logger.Error("failed to start new exporter for endpoint", zap.String("endpoint", endpoint), zap.Error(err)) continue @@ -193,6 +221,10 @@ func endpointFound(endpoint string, endpoints []string) bool { func (lb *loadBalancer) Shutdown(ctx context.Context) error { err := lb.res.shutdown(ctx) lb.stopped = true + + for _, e := range lb.exporters { + err = errors.Join(err, e.Shutdown(ctx)) + } return err } diff --git a/exporter/loadbalancingexporter/loadbalancer_test.go b/exporter/loadbalancingexporter/loadbalancer_test.go index 47816dc482d8..859e6d4a2f5e 100644 --- a/exporter/loadbalancingexporter/loadbalancer_test.go +++ b/exporter/loadbalancingexporter/loadbalancer_test.go @@ -20,10 +20,11 @@ import ( func TestNewLoadBalancerNoResolver(t *testing.T) { // prepare + ts, tb := getTelemetryAssets(t) cfg := &Config{} // test - p, err := newLoadBalancer(exportertest.NewNopCreateSettings(), cfg, nil) + p, err := newLoadBalancer(ts.Logger, cfg, nil, tb) // verify require.Nil(t, p) @@ -32,6 +33,7 @@ func TestNewLoadBalancerNoResolver(t *testing.T) { func TestNewLoadBalancerInvalidStaticResolver(t *testing.T) { // prepare + ts, tb := getTelemetryAssets(t) cfg := &Config{ Resolver: ResolverSettings{ Static: &StaticResolver{Hostnames: []string{}}, @@ -39,7 +41,7 @@ func TestNewLoadBalancerInvalidStaticResolver(t *testing.T) { } // test - p, err := newLoadBalancer(exportertest.NewNopCreateSettings(), cfg, nil) + p, err := newLoadBalancer(ts.Logger, cfg, nil, tb) // verify require.Nil(t, p) @@ -48,6 +50,7 @@ func TestNewLoadBalancerInvalidStaticResolver(t *testing.T) { func TestNewLoadBalancerInvalidDNSResolver(t *testing.T) { // prepare + ts, tb := getTelemetryAssets(t) cfg := &Config{ Resolver: ResolverSettings{ DNS: &DNSResolver{ @@ -57,7 +60,7 @@ func TestNewLoadBalancerInvalidDNSResolver(t *testing.T) { } // test - p, err := newLoadBalancer(exportertest.NewNopCreateSettings(), cfg, nil) + p, err := newLoadBalancer(ts.Logger, cfg, nil, tb) // verify require.Nil(t, p) @@ -66,6 +69,7 @@ func TestNewLoadBalancerInvalidDNSResolver(t *testing.T) { func TestNewLoadBalancerInvalidK8sResolver(t *testing.T) { // prepare + ts, tb := getTelemetryAssets(t) cfg := &Config{ Resolver: ResolverSettings{ K8sSvc: &K8sSvcResolver{ @@ -75,7 +79,7 @@ func TestNewLoadBalancerInvalidK8sResolver(t *testing.T) { } // test - p, err := newLoadBalancer(exportertest.NewNopCreateSettings(), cfg, nil) + p, err := newLoadBalancer(ts.Logger, cfg, nil, tb) // verify assert.Nil(t, p) @@ -84,8 +88,10 @@ func TestNewLoadBalancerInvalidK8sResolver(t *testing.T) { func TestLoadBalancerStart(t *testing.T) { // prepare + ts, tb := getTelemetryAssets(t) cfg := simpleConfig() - p, err := newLoadBalancer(exportertest.NewNopCreateSettings(), cfg, nil) + + p, err := newLoadBalancer(ts.Logger, cfg, nil, tb) require.NotNil(t, p) require.NoError(t, err) p.res = &mockResolver{} @@ -96,10 +102,11 @@ func TestLoadBalancerStart(t *testing.T) { require.NoError(t, p.Shutdown(context.Background())) }() // verify - assert.Nil(t, res) + assert.NoError(t, res) } func TestWithDNSResolver(t *testing.T) { + ts, tb := getTelemetryAssets(t) cfg := &Config{ Resolver: ResolverSettings{ DNS: &DNSResolver{ @@ -107,7 +114,8 @@ func TestWithDNSResolver(t *testing.T) { }, }, } - p, err := newLoadBalancer(exportertest.NewNopCreateSettings(), cfg, nil) + + p, err := newLoadBalancer(ts.Logger, cfg, nil, tb) require.NotNil(t, p) require.NoError(t, err) @@ -121,6 +129,7 @@ func TestWithDNSResolver(t *testing.T) { func TestWithDNSResolverNoEndpoints(t *testing.T) { // prepare + ts, tb := getTelemetryAssets(t) cfg := &Config{ Resolver: ResolverSettings{ DNS: &DNSResolver{ @@ -128,7 +137,8 @@ func TestWithDNSResolverNoEndpoints(t *testing.T) { }, }, } - p, err := newLoadBalancer(exportertest.NewNopCreateSettings(), cfg, nil) + + p, err := newLoadBalancer(ts.Logger, cfg, nil, tb) require.NotNil(t, p) require.NoError(t, err) @@ -144,6 +154,7 @@ func TestWithDNSResolverNoEndpoints(t *testing.T) { } func TestMultipleResolvers(t *testing.T) { + ts, tb := getTelemetryAssets(t) cfg := &Config{ Resolver: ResolverSettings{ Static: &StaticResolver{ @@ -156,7 +167,7 @@ func TestMultipleResolvers(t *testing.T) { } // test - p, err := newLoadBalancer(exportertest.NewNopCreateSettings(), cfg, nil) + p, err := newLoadBalancer(ts.Logger, cfg, nil, tb) // verify assert.Nil(t, p) @@ -165,8 +176,10 @@ func TestMultipleResolvers(t *testing.T) { func TestStartFailureStaticResolver(t *testing.T) { // prepare + ts, tb := getTelemetryAssets(t) cfg := simpleConfig() - p, err := newLoadBalancer(exportertest.NewNopCreateSettings(), cfg, nil) + + p, err := newLoadBalancer(ts.Logger, cfg, nil, tb) require.NotNil(t, p) require.NoError(t, err) @@ -187,7 +200,7 @@ func TestStartFailureStaticResolver(t *testing.T) { func TestLoadBalancerShutdown(t *testing.T) { // prepare cfg := simpleConfig() - p, err := newTracesExporter(exportertest.NewNopCreateSettings(), cfg) + p, err := newTracesExporter(exportertest.NewNopSettings(), cfg) require.NotNil(t, p) require.NoError(t, err) @@ -195,16 +208,18 @@ func TestLoadBalancerShutdown(t *testing.T) { res := p.Shutdown(context.Background()) // verify - assert.Nil(t, res) + assert.NoError(t, res) } func TestOnBackendChanges(t *testing.T) { // prepare + ts, tb := getTelemetryAssets(t) cfg := simpleConfig() componentFactory := func(_ context.Context, _ string) (component.Component, error) { return newNopMockExporter(), nil } - p, err := newLoadBalancer(exportertest.NewNopCreateSettings(), cfg, componentFactory) + + p, err := newLoadBalancer(ts.Logger, cfg, componentFactory, tb) require.NotNil(t, p) require.NoError(t, err) @@ -222,11 +237,13 @@ func TestOnBackendChanges(t *testing.T) { func TestRemoveExtraExporters(t *testing.T) { // prepare + ts, tb := getTelemetryAssets(t) cfg := simpleConfig() componentFactory := func(_ context.Context, _ string) (component.Component, error) { return newNopMockExporter(), nil } - p, err := newLoadBalancer(exportertest.NewNopCreateSettings(), cfg, componentFactory) + + p, err := newLoadBalancer(ts.Logger, cfg, componentFactory, tb) require.NotNil(t, p) require.NoError(t, err) @@ -243,12 +260,13 @@ func TestRemoveExtraExporters(t *testing.T) { func TestAddMissingExporters(t *testing.T) { // prepare + ts, tb := getTelemetryAssets(t) cfg := simpleConfig() exporterFactory := exporter.NewFactory(component.MustNewType("otlp"), func() component.Config { return &otlpexporter.Config{} }, exporter.WithTraces(func( _ context.Context, - _ exporter.CreateSettings, + _ exporter.Settings, _ component.Config, ) (exporter.Traces, error) { return newNopMockTracesExporter(), nil @@ -256,10 +274,10 @@ func TestAddMissingExporters(t *testing.T) { fn := func(ctx context.Context, endpoint string) (component.Component, error) { oCfg := cfg.Protocol.OTLP oCfg.Endpoint = endpoint - return exporterFactory.CreateTracesExporter(ctx, exportertest.NewNopCreateSettings(), &oCfg) + return exporterFactory.CreateTraces(ctx, exportertest.NewNopSettings(), &oCfg) } - p, err := newLoadBalancer(exportertest.NewNopCreateSettings(), cfg, fn) + p, err := newLoadBalancer(ts.Logger, cfg, fn, tb) require.NotNil(t, p) require.NoError(t, err) @@ -276,13 +294,14 @@ func TestAddMissingExporters(t *testing.T) { func TestFailedToAddMissingExporters(t *testing.T) { // prepare + ts, tb := getTelemetryAssets(t) cfg := simpleConfig() expectedErr := errors.New("some expected error") exporterFactory := exporter.NewFactory(component.MustNewType("otlp"), func() component.Config { return &otlpexporter.Config{} }, exporter.WithTraces(func( _ context.Context, - _ exporter.CreateSettings, + _ exporter.Settings, _ component.Config, ) (exporter.Traces, error) { return nil, expectedErr @@ -290,10 +309,10 @@ func TestFailedToAddMissingExporters(t *testing.T) { fn := func(ctx context.Context, endpoint string) (component.Component, error) { oCfg := cfg.Protocol.OTLP oCfg.Endpoint = endpoint - return exporterFactory.CreateTracesExporter(ctx, exportertest.NewNopCreateSettings(), &oCfg) + return exporterFactory.CreateTraces(ctx, exportertest.NewNopSettings(), &oCfg) } - p, err := newLoadBalancer(exportertest.NewNopCreateSettings(), cfg, fn) + p, err := newLoadBalancer(ts.Logger, cfg, fn, tb) require.NotNil(t, p) require.NoError(t, err) @@ -350,6 +369,7 @@ func TestFailedExporterInRing(t *testing.T) { // this test is based on the discussion in the original PR for this exporter: // https://github.com/open-telemetry/opentelemetry-collector-contrib/pull/1542#discussion_r521268180 // prepare + ts, tb := getTelemetryAssets(t) cfg := &Config{ Resolver: ResolverSettings{ Static: &StaticResolver{Hostnames: []string{"endpoint-1", "endpoint-2"}}, @@ -358,7 +378,7 @@ func TestFailedExporterInRing(t *testing.T) { componentFactory := func(_ context.Context, _ string) (component.Component, error) { return newNopMockExporter(), nil } - p, err := newLoadBalancer(exportertest.NewNopCreateSettings(), cfg, componentFactory) + p, err := newLoadBalancer(ts.Logger, cfg, componentFactory, tb) require.NotNil(t, p) require.NoError(t, err) @@ -392,6 +412,7 @@ func TestFailedExporterInRing(t *testing.T) { func TestNewLoadBalancerInvalidNamespaceAwsResolver(t *testing.T) { // prepare + ts, tb := getTelemetryAssets(t) cfg := &Config{ Resolver: ResolverSettings{ AWSCloudMap: &AWSCloudMapResolver{ @@ -401,7 +422,7 @@ func TestNewLoadBalancerInvalidNamespaceAwsResolver(t *testing.T) { } // test - p, err := newLoadBalancer(exportertest.NewNopCreateSettings(), cfg, nil) + p, err := newLoadBalancer(ts.Logger, cfg, nil, tb) // verify assert.Nil(t, p) @@ -410,6 +431,7 @@ func TestNewLoadBalancerInvalidNamespaceAwsResolver(t *testing.T) { func TestNewLoadBalancerInvalidServiceAwsResolver(t *testing.T) { // prepare + ts, tb := getTelemetryAssets(t) cfg := &Config{ Resolver: ResolverSettings{ AWSCloudMap: &AWSCloudMapResolver{ @@ -420,7 +442,7 @@ func TestNewLoadBalancerInvalidServiceAwsResolver(t *testing.T) { } // test - p, err := newLoadBalancer(exportertest.NewNopCreateSettings(), cfg, nil) + p, err := newLoadBalancer(ts.Logger, cfg, nil, tb) // verify assert.Nil(t, p) @@ -428,5 +450,5 @@ func TestNewLoadBalancerInvalidServiceAwsResolver(t *testing.T) { } func newNopMockExporter() *wrappedExporter { - return newWrappedExporter(mockComponent{}) + return newWrappedExporter(mockComponent{}, "mock") } diff --git a/exporter/loadbalancingexporter/log_exporter.go b/exporter/loadbalancingexporter/log_exporter.go index 9b79bdc439dc..efa5e23bc429 100644 --- a/exporter/loadbalancingexporter/log_exporter.go +++ b/exporter/loadbalancingexporter/log_exporter.go @@ -9,16 +9,17 @@ import ( "sync" "time" - "go.opencensus.io/stats" - "go.opencensus.io/tag" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/exporter" "go.opentelemetry.io/collector/exporter/otlpexporter" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" + "go.opentelemetry.io/otel/metric" "go.uber.org/multierr" + "go.uber.org/zap" + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter/internal/metadata" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal" ) @@ -27,24 +28,35 @@ var _ exporter.Logs = (*logExporterImp)(nil) type logExporterImp struct { loadBalancer *loadBalancer + logger *zap.Logger started bool shutdownWg sync.WaitGroup + telemetry *metadata.TelemetryBuilder } // Create new logs exporter -func newLogsExporter(params exporter.CreateSettings, cfg component.Config) (*logExporterImp, error) { +func newLogsExporter(params exporter.Settings, cfg component.Config) (*logExporterImp, error) { + telemetry, err := metadata.NewTelemetryBuilder(params.TelemetrySettings) + if err != nil { + return nil, err + } exporterFactory := otlpexporter.NewFactory() - - lb, err := newLoadBalancer(params, cfg, func(ctx context.Context, endpoint string) (component.Component, error) { + cfFunc := func(ctx context.Context, endpoint string) (component.Component, error) { oCfg := buildExporterConfig(cfg.(*Config), endpoint) - return exporterFactory.CreateLogsExporter(ctx, params, &oCfg) - }) + oParams := buildExporterSettings(params, endpoint) + + return exporterFactory.CreateLogs(ctx, oParams, &oCfg) + } + + lb, err := newLoadBalancer(params.Logger, cfg, cfFunc, telemetry) if err != nil { return nil, err } return &logExporterImp{ loadBalancer: lb, + telemetry: telemetry, + logger: params.Logger, }, nil } @@ -87,7 +99,7 @@ func (e *logExporterImp) consumeLog(ctx context.Context, ld plog.Logs) error { balancingKey = random() } - le, endpoint, err := e.loadBalancer.exporterAndEndpoint(balancingKey[:]) + le, _, err := e.loadBalancer.exporterAndEndpoint(balancingKey[:]) if err != nil { return err } @@ -98,16 +110,12 @@ func (e *logExporterImp) consumeLog(ctx context.Context, ld plog.Logs) error { start := time.Now() err = le.ConsumeLogs(ctx, ld) duration := time.Since(start) + e.telemetry.LoadbalancerBackendLatency.Record(ctx, duration.Milliseconds(), metric.WithAttributeSet(le.endpointAttr)) if err == nil { - _ = stats.RecordWithTags( - ctx, - []tag.Mutator{tag.Upsert(endpointTagKey, endpoint), successTrueMutator}, - mBackendLatency.M(duration.Milliseconds())) + e.telemetry.LoadbalancerBackendOutcome.Add(ctx, 1, metric.WithAttributeSet(le.successAttr)) } else { - _ = stats.RecordWithTags( - ctx, - []tag.Mutator{tag.Upsert(endpointTagKey, endpoint), successFalseMutator}, - mBackendLatency.M(duration.Milliseconds())) + e.telemetry.LoadbalancerBackendOutcome.Add(ctx, 1, metric.WithAttributeSet(le.failureAttr)) + e.logger.Debug("failed to export log", zap.Error(err)) } return err diff --git a/exporter/loadbalancingexporter/log_exporter_test.go b/exporter/loadbalancingexporter/log_exporter_test.go index 82ee460f6427..e6661964372c 100644 --- a/exporter/loadbalancingexporter/log_exporter_test.go +++ b/exporter/loadbalancingexporter/log_exporter_test.go @@ -45,7 +45,7 @@ func TestNewLogsExporter(t *testing.T) { } { t.Run(tt.desc, func(t *testing.T) { // test - _, err := newLogsExporter(exportertest.NewNopCreateSettings(), tt.config) + _, err := newLogsExporter(exportertest.NewNopSettings(), tt.config) // verify require.Equal(t, tt.err, err) @@ -54,6 +54,7 @@ func TestNewLogsExporter(t *testing.T) { } func TestLogExporterStart(t *testing.T) { + ts, tb := getTelemetryAssets(t) for _, tt := range []struct { desc string le *logExporterImp @@ -62,7 +63,7 @@ func TestLogExporterStart(t *testing.T) { { "ok", func() *logExporterImp { - p, _ := newLogsExporter(exportertest.NewNopCreateSettings(), simpleConfig()) + p, _ := newLogsExporter(exportertest.NewNopSettings(), simpleConfig()) return p }(), nil, @@ -71,8 +72,9 @@ func TestLogExporterStart(t *testing.T) { "error", func() *logExporterImp { // prepare - lb, _ := newLoadBalancer(exportertest.NewNopCreateSettings(), simpleConfig(), nil) - p, _ := newLogsExporter(exportertest.NewNopCreateSettings(), simpleConfig()) + lb, err := newLoadBalancer(ts.Logger, simpleConfig(), nil, tb) + require.NoError(t, err) + p, _ := newLogsExporter(exportertest.NewNopSettings(), simpleConfig()) lb.res = &mockResolver{ onStart: func(context.Context) error { @@ -102,7 +104,7 @@ func TestLogExporterStart(t *testing.T) { } func TestLogExporterShutdown(t *testing.T) { - p, err := newLogsExporter(exportertest.NewNopCreateSettings(), simpleConfig()) + p, err := newLogsExporter(exportertest.NewNopSettings(), simpleConfig()) require.NotNil(t, p) require.NoError(t, err) @@ -110,18 +112,20 @@ func TestLogExporterShutdown(t *testing.T) { res := p.Shutdown(context.Background()) // verify - assert.Nil(t, res) + assert.NoError(t, res) } func TestConsumeLogs(t *testing.T) { + ts, tb := getTelemetryAssets(t) componentFactory := func(_ context.Context, _ string) (component.Component, error) { return newNopMockLogsExporter(), nil } - lb, err := newLoadBalancer(exportertest.NewNopCreateSettings(), simpleConfig(), componentFactory) + + lb, err := newLoadBalancer(ts.Logger, simpleConfig(), componentFactory, tb) require.NotNil(t, lb) require.NoError(t, err) - p, err := newLogsExporter(exportertest.NewNopCreateSettings(), simpleConfig()) + p, err := newLogsExporter(ts, simpleConfig()) require.NotNil(t, p) require.NoError(t, err) @@ -145,18 +149,20 @@ func TestConsumeLogs(t *testing.T) { res := p.ConsumeLogs(context.Background(), simpleLogs()) // verify - assert.Nil(t, res) + assert.NoError(t, res) } func TestConsumeLogsUnexpectedExporterType(t *testing.T) { componentFactory := func(_ context.Context, _ string) (component.Component, error) { return newNopMockExporter(), nil } - lb, err := newLoadBalancer(exportertest.NewNopCreateSettings(), simpleConfig(), componentFactory) + ts, tb := getTelemetryAssets(t) + + lb, err := newLoadBalancer(ts.Logger, simpleConfig(), componentFactory, tb) require.NotNil(t, lb) require.NoError(t, err) - p, err := newLogsExporter(exportertest.NewNopCreateSettings(), simpleConfig()) + p, err := newLogsExporter(ts, simpleConfig()) require.NotNil(t, p) require.NoError(t, err) @@ -185,15 +191,17 @@ func TestConsumeLogsUnexpectedExporterType(t *testing.T) { } func TestLogBatchWithTwoTraces(t *testing.T) { + ts, tb := getTelemetryAssets(t) sink := new(consumertest.LogsSink) componentFactory := func(_ context.Context, _ string) (component.Component, error) { return newMockLogsExporter(sink.ConsumeLogs), nil } - lb, err := newLoadBalancer(exportertest.NewNopCreateSettings(), simpleConfig(), componentFactory) + + lb, err := newLoadBalancer(ts.Logger, simpleConfig(), componentFactory, tb) require.NotNil(t, lb) require.NoError(t, err) - p, err := newLogsExporter(exportertest.NewNopCreateSettings(), simpleConfig()) + p, err := newLogsExporter(ts, simpleConfig()) require.NotNil(t, p) require.NoError(t, err) @@ -257,15 +265,16 @@ func TestNoLogsInBatch(t *testing.T) { } func TestLogsWithoutTraceID(t *testing.T) { + ts, tb := getTelemetryAssets(t) sink := new(consumertest.LogsSink) componentFactory := func(_ context.Context, _ string) (component.Component, error) { return newMockLogsExporter(sink.ConsumeLogs), nil } - lb, err := newLoadBalancer(exportertest.NewNopCreateSettings(), simpleConfig(), componentFactory) + lb, err := newLoadBalancer(ts.Logger, simpleConfig(), componentFactory, tb) require.NotNil(t, lb) require.NoError(t, err) - p, err := newLogsExporter(exportertest.NewNopCreateSettings(), simpleConfig()) + p, err := newLogsExporter(ts, simpleConfig()) require.NotNil(t, p) require.NoError(t, err) @@ -289,24 +298,25 @@ func TestLogsWithoutTraceID(t *testing.T) { // this test validates that exporter is can concurrently change the endpoints while consuming logs. func TestConsumeLogs_ConcurrentResolverChange(t *testing.T) { + ts, tb := getTelemetryAssets(t) consumeStarted := make(chan struct{}) consumeDone := make(chan struct{}) - // imitate a slow exporter - te := &mockLogsExporter{Component: mockComponent{}} - te.consumelogsfn = func(_ context.Context, _ plog.Logs) error { - close(consumeStarted) - time.Sleep(50 * time.Millisecond) - return te.consumeErr - } componentFactory := func(_ context.Context, _ string) (component.Component, error) { + // imitate a slow exporter + te := &mockLogsExporter{Component: mockComponent{}} + te.consumelogsfn = func(_ context.Context, _ plog.Logs) error { + close(consumeStarted) + time.Sleep(50 * time.Millisecond) + return te.consumeErr + } return te, nil } - lb, err := newLoadBalancer(exportertest.NewNopCreateSettings(), simpleConfig(), componentFactory) + lb, err := newLoadBalancer(ts.Logger, simpleConfig(), componentFactory, tb) require.NotNil(t, lb) require.NoError(t, err) - p, err := newLogsExporter(exportertest.NewNopCreateSettings(), simpleConfig()) + p, err := newLogsExporter(ts, simpleConfig()) require.NotNil(t, p) require.NoError(t, err) @@ -348,7 +358,8 @@ func TestRollingUpdatesWhenConsumeLogs(t *testing.T) { // simulate rolling updates, the dns resolver should resolve in the following order // ["127.0.0.1"] -> ["127.0.0.1", "127.0.0.2"] -> ["127.0.0.2"] - res, err := newDNSResolver(zap.NewNop(), "service-1", "", 5*time.Second, 1*time.Second) + ts, tb := getTelemetryAssets(t) + res, err := newDNSResolver(zap.NewNop(), "service-1", "", 5*time.Second, 1*time.Second, tb) require.NoError(t, err) mu := sync.Mutex{} @@ -399,11 +410,11 @@ func TestRollingUpdatesWhenConsumeLogs(t *testing.T) { componentFactory := func(_ context.Context, _ string) (component.Component, error) { return newNopMockLogsExporter(), nil } - lb, err := newLoadBalancer(exportertest.NewNopCreateSettings(), cfg, componentFactory) + lb, err := newLoadBalancer(ts.Logger, cfg, componentFactory, tb) require.NotNil(t, lb) require.NoError(t, err) - p, err := newLogsExporter(exportertest.NewNopCreateSettings(), cfg) + p, err := newLogsExporter(exportertest.NewNopSettings(), cfg) require.NotNil(t, p) require.NoError(t, err) @@ -412,17 +423,19 @@ func TestRollingUpdatesWhenConsumeLogs(t *testing.T) { counter1 := &atomic.Int64{} counter2 := &atomic.Int64{} + id1 := "127.0.0.1:4317" + id2 := "127.0.0.2:4317" defaultExporters := map[string]*wrappedExporter{ - "127.0.0.1:4317": newWrappedExporter(newMockLogsExporter(func(_ context.Context, _ plog.Logs) error { + id1: newWrappedExporter(newMockLogsExporter(func(_ context.Context, _ plog.Logs) error { counter1.Add(1) // simulate an unreachable backend time.Sleep(10 * time.Second) return nil - })), - "127.0.0.2:4317": newWrappedExporter(newMockLogsExporter(func(_ context.Context, _ plog.Logs) error { + }), id1), + id2: newWrappedExporter(newMockLogsExporter(func(_ context.Context, _ plog.Logs) error { counter2.Add(1) return nil - })), + }), id2), } // test @@ -453,7 +466,7 @@ func TestRollingUpdatesWhenConsumeLogs(t *testing.T) { return case <-ticker.C: go func() { - require.NoError(t, p.ConsumeLogs(ctx, randomLogs())) + assert.NoError(t, p.ConsumeLogs(ctx, randomLogs())) }() } } @@ -475,8 +488,8 @@ func TestRollingUpdatesWhenConsumeLogs(t *testing.T) { mu.Lock() require.Equal(t, []string{"127.0.0.2"}, lastResolved) mu.Unlock() - require.Greater(t, counter1.Load(), int64(0)) - require.Greater(t, counter2.Load(), int64(0)) + require.Positive(t, counter1.Load()) + require.Positive(t, counter2.Load()) } func randomLogs() plog.Logs { diff --git a/exporter/loadbalancingexporter/metadata.yaml b/exporter/loadbalancingexporter/metadata.yaml index d0077af9cafd..8a1c0d40b879 100644 --- a/exporter/loadbalancingexporter/metadata.yaml +++ b/exporter/loadbalancingexporter/metadata.yaml @@ -1,13 +1,11 @@ type: loadbalancing -scope_name: otelcol/loadbalancing status: class: exporter stability: beta: [traces, logs] development: [metrics] - distributions: - - contrib + distributions: [contrib, k8s] codeowners: active: [jpkrohling] @@ -25,8 +23,40 @@ tests: - backend-3:4317 - backend-4:4317 expect_consumer_error: true - goleak: - ignore: - top: - # See https://github.com/census-instrumentation/opencensus-go/issues/1191 for more information. - - "go.opencensus.io/stats/view.(*worker).start" + +telemetry: + metrics: + loadbalancer_num_resolutions: + enabled: true + description: Number of times the resolver has triggered new resolutions. + unit: "{resolutions}" + sum: + value_type: int + monotonic: true + loadbalancer_num_backends: + enabled: true + description: Current number of backends in use. + unit: "{backends}" + gauge: + value_type: int + loadbalancer_backend_latency: + enabled: true + description: Response latency in ms for the backends. + unit: ms + histogram: + value_type: int + bucket_boundaries: [5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000] + loadbalancer_num_backend_updates: + enabled: true + description: Number of times the list of backends was updated. + unit: "{updates}" + sum: + value_type: int + monotonic: true + loadbalancer_backend_outcome: + enabled: true + description: Number of successes and failures for each endpoint. + unit: "{outcomes}" + sum: + value_type: int + monotonic: true diff --git a/exporter/loadbalancingexporter/metrics.go b/exporter/loadbalancingexporter/metrics.go deleted file mode 100644 index 0bbdb4528d13..000000000000 --- a/exporter/loadbalancingexporter/metrics.go +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package loadbalancingexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter" - -import ( - "go.opencensus.io/stats" - "go.opencensus.io/stats/view" - "go.opencensus.io/tag" -) - -var ( - mNumResolutions = stats.Int64("loadbalancer_num_resolutions", "Number of times the resolver triggered a new resolutions", stats.UnitDimensionless) - mNumBackends = stats.Int64("loadbalancer_num_backends", "Current number of backends in use", stats.UnitDimensionless) - mBackendLatency = stats.Int64("loadbalancer_backend_latency", "Response latency in ms for the backends", stats.UnitMilliseconds) - - endpointTagKey = tag.MustNewKey("endpoint") - successTrueMutator = tag.Upsert(tag.MustNewKey("success"), "true") - successFalseMutator = tag.Upsert(tag.MustNewKey("success"), "false") -) - -// metricViews return the metrics views according to given telemetry level. -func metricViews() []*view.View { - return []*view.View{ - { - Name: mNumResolutions.Name(), - Measure: mNumResolutions, - Description: mNumResolutions.Description(), - Aggregation: view.Count(), - TagKeys: []tag.Key{ - tag.MustNewKey("resolver"), - tag.MustNewKey("success"), - }, - }, - { - Name: mNumBackends.Name(), - Measure: mNumBackends, - Description: mNumBackends.Description(), - Aggregation: view.LastValue(), - TagKeys: []tag.Key{ - tag.MustNewKey("resolver"), - }, - }, - { - Name: "loadbalancer_num_backend_updates", // counts the number of times the measure was changed - Measure: mNumBackends, - Description: "Number of times the list of backends was updated", - Aggregation: view.Count(), - TagKeys: []tag.Key{ - tag.MustNewKey("resolver"), - }, - }, - { - Name: mBackendLatency.Name(), - Measure: mBackendLatency, - Description: mBackendLatency.Description(), - TagKeys: []tag.Key{ - tag.MustNewKey("endpoint"), - }, - Aggregation: view.Distribution(0, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000), - }, - { - Name: "loadbalancer_backend_outcome", - Measure: mBackendLatency, - Description: "Number of success/failures for each endpoint", - TagKeys: []tag.Key{ - tag.MustNewKey("endpoint"), - tag.MustNewKey("success"), - }, - Aggregation: view.Count(), - }, - } -} diff --git a/exporter/loadbalancingexporter/metrics_exporter.go b/exporter/loadbalancingexporter/metrics_exporter.go index 9210723227d8..fb61bd84ae7f 100644 --- a/exporter/loadbalancingexporter/metrics_exporter.go +++ b/exporter/loadbalancingexporter/metrics_exporter.go @@ -7,63 +7,75 @@ import ( "context" "errors" "fmt" - "sort" - "strings" "sync" "time" - "go.opencensus.io/stats" - "go.opencensus.io/tag" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/exporter" "go.opentelemetry.io/collector/exporter/otlpexporter" - "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" + "go.opentelemetry.io/otel/metric" "go.uber.org/multierr" + "go.uber.org/zap" - "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal" + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter/internal/metadata" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics/identity" ) var _ exporter.Metrics = (*metricExporterImp)(nil) -type exporterMetrics map[*wrappedExporter]pmetric.Metrics - type metricExporterImp struct { loadBalancer *loadBalancer routingKey routingKey + logger *zap.Logger stopped bool shutdownWg sync.WaitGroup + telemetry *metadata.TelemetryBuilder } -func newMetricsExporter(params exporter.CreateSettings, cfg component.Config) (*metricExporterImp, error) { +func newMetricsExporter(params exporter.Settings, cfg component.Config) (*metricExporterImp, error) { + telemetry, err := metadata.NewTelemetryBuilder(params.TelemetrySettings) + if err != nil { + return nil, err + } exporterFactory := otlpexporter.NewFactory() - - lb, err := newLoadBalancer(params, cfg, func(ctx context.Context, endpoint string) (component.Component, error) { + cfFunc := func(ctx context.Context, endpoint string) (component.Component, error) { oCfg := buildExporterConfig(cfg.(*Config), endpoint) - return exporterFactory.CreateMetricsExporter(ctx, params, &oCfg) - }) + oParams := buildExporterSettings(params, endpoint) + + return exporterFactory.CreateMetrics(ctx, oParams, &oCfg) + } + + lb, err := newLoadBalancer(params.Logger, cfg, cfFunc, telemetry) if err != nil { return nil, err } - metricExporter := metricExporterImp{loadBalancer: lb, routingKey: svcRouting} + metricExporter := metricExporterImp{ + loadBalancer: lb, + routingKey: svcRouting, + telemetry: telemetry, + logger: params.Logger, + } switch cfg.(*Config).RoutingKey { - case "service", "": + case svcRoutingStr, "": // default case for empty routing key metricExporter.routingKey = svcRouting - case "resource": + case resourceRoutingStr: metricExporter.routingKey = resourceRouting - case "metric": + case metricNameRoutingStr: metricExporter.routingKey = metricNameRouting + case streamIDRoutingStr: + metricExporter.routingKey = streamIDRouting default: return nil, fmt.Errorf("unsupported routing_key: %q", cfg.(*Config).RoutingKey) } return &metricExporter, nil - } func (e *metricExporterImp) Capabilities() consumer.Capabilities { @@ -82,143 +94,285 @@ func (e *metricExporterImp) Shutdown(ctx context.Context) error { } func (e *metricExporterImp) ConsumeMetrics(ctx context.Context, md pmetric.Metrics) error { - batches := batchpersignal.SplitMetrics(md) - - exporterSegregatedMetrics := make(exporterMetrics) - endpoints := make(map[*wrappedExporter]string) + var batches map[string]pmetric.Metrics - for _, batch := range batches { - routingIDs, err := routingIdentifiersFromMetrics(batch, e.routingKey) + switch e.routingKey { + case svcRouting: + var err error + batches, err = splitMetricsByResourceServiceName(md) if err != nil { return err } + case resourceRouting: + batches = splitMetricsByResourceID(md) + case metricNameRouting: + batches = splitMetricsByMetricName(md) + case streamIDRouting: + batches = splitMetricsByStreamID(md) + } - for rid := range routingIDs { - exp, endpoint, err := e.loadBalancer.exporterAndEndpoint([]byte(rid)) - if err != nil { - return err - } + // Now assign each batch to an exporter, and merge as we go + metricsByExporter := map[*wrappedExporter]pmetric.Metrics{} + exporterEndpoints := map[*wrappedExporter]string{} - _, ok := exporterSegregatedMetrics[exp] - if !ok { - exp.consumeWG.Add(1) - exporterSegregatedMetrics[exp] = pmetric.NewMetrics() - } - exporterSegregatedMetrics[exp] = mergeMetrics(exporterSegregatedMetrics[exp], batch) + for routingID, mds := range batches { + exp, endpoint, err := e.loadBalancer.exporterAndEndpoint([]byte(routingID)) + if err != nil { + return err + } - endpoints[exp] = endpoint + expMetrics, ok := metricsByExporter[exp] + if !ok { + exp.consumeWG.Add(1) + expMetrics = pmetric.NewMetrics() + metricsByExporter[exp] = expMetrics + exporterEndpoints[exp] = endpoint } + + metrics.Merge(expMetrics, mds) } var errs error - - for exp, metrics := range exporterSegregatedMetrics { + for exp, mds := range metricsByExporter { start := time.Now() - err := exp.ConsumeMetrics(ctx, metrics) - exp.consumeWG.Done() + err := exp.ConsumeMetrics(ctx, mds) duration := time.Since(start) - errs = multierr.Append(errs, err) + exp.consumeWG.Done() + errs = multierr.Append(errs, err) + e.telemetry.LoadbalancerBackendLatency.Record(ctx, duration.Milliseconds(), metric.WithAttributeSet(exp.endpointAttr)) if err == nil { - _ = stats.RecordWithTags( - ctx, - []tag.Mutator{tag.Upsert(endpointTagKey, endpoints[exp]), successTrueMutator}, - mBackendLatency.M(duration.Milliseconds())) + e.telemetry.LoadbalancerBackendOutcome.Add(ctx, 1, metric.WithAttributeSet(exp.successAttr)) } else { - _ = stats.RecordWithTags( - ctx, - []tag.Mutator{tag.Upsert(endpointTagKey, endpoints[exp]), successFalseMutator}, - mBackendLatency.M(duration.Milliseconds())) + e.telemetry.LoadbalancerBackendOutcome.Add(ctx, 1, metric.WithAttributeSet(exp.failureAttr)) + e.logger.Debug("failed to export metrics", zap.Error(err)) } } return errs } -func routingIdentifiersFromMetrics(mds pmetric.Metrics, key routingKey) (map[string]bool, error) { - ids := make(map[string]bool) +func splitMetricsByResourceServiceName(md pmetric.Metrics) (map[string]pmetric.Metrics, error) { + results := map[string]pmetric.Metrics{} - // no need to test "empty labels" - // no need to test "empty resources" + for i := 0; i < md.ResourceMetrics().Len(); i++ { + rm := md.ResourceMetrics().At(i) - rs := mds.ResourceMetrics() - if rs.Len() == 0 { - return nil, errors.New("empty resource metrics") - } + svc, ok := rm.Resource().Attributes().Get(conventions.AttributeServiceName) + if !ok { + return nil, errors.New("unable to get service name") + } + + newMD := pmetric.NewMetrics() + rmClone := newMD.ResourceMetrics().AppendEmpty() + rm.CopyTo(rmClone) - ils := rs.At(0).ScopeMetrics() - if ils.Len() == 0 { - return nil, errors.New("empty scope metrics") + key := svc.Str() + existing, ok := results[key] + if ok { + metrics.Merge(existing, newMD) + } else { + results[key] = newMD + } } - metrics := ils.At(0).Metrics() - if metrics.Len() == 0 { - return nil, errors.New("empty metrics") + return results, nil +} + +func splitMetricsByResourceID(md pmetric.Metrics) map[string]pmetric.Metrics { + results := map[string]pmetric.Metrics{} + + for i := 0; i < md.ResourceMetrics().Len(); i++ { + rm := md.ResourceMetrics().At(i) + + newMD := pmetric.NewMetrics() + rmClone := newMD.ResourceMetrics().AppendEmpty() + rm.CopyTo(rmClone) + + key := identity.OfResource(rm.Resource()).String() + existing, ok := results[key] + if ok { + metrics.Merge(existing, newMD) + } else { + results[key] = newMD + } } - for i := 0; i < rs.Len(); i++ { - resource := rs.At(i).Resource() - switch key { - default: - case svcRouting, traceIDRouting: - svc, ok := resource.Attributes().Get(conventions.AttributeServiceName) - if !ok { - return nil, errors.New("unable to get service name") - } - ids[svc.Str()] = true - case metricNameRouting: - sm := rs.At(i).ScopeMetrics() - for j := 0; j < sm.Len(); j++ { - metrics := sm.At(j).Metrics() - for k := 0; k < metrics.Len(); k++ { - md := metrics.At(k) - rKey := metricRoutingKey(md) - ids[rKey] = true - } - } - case resourceRouting: - sm := rs.At(i).ScopeMetrics() - for j := 0; j < sm.Len(); j++ { - metrics := sm.At(j).Metrics() - for k := 0; k < metrics.Len(); k++ { - md := metrics.At(k) - rKey := resourceRoutingKey(md, resource.Attributes()) - ids[rKey] = true + return results +} + +func splitMetricsByMetricName(md pmetric.Metrics) map[string]pmetric.Metrics { + results := map[string]pmetric.Metrics{} + + for i := 0; i < md.ResourceMetrics().Len(); i++ { + rm := md.ResourceMetrics().At(i) + + for j := 0; j < rm.ScopeMetrics().Len(); j++ { + sm := rm.ScopeMetrics().At(j) + + for k := 0; k < sm.Metrics().Len(); k++ { + m := sm.Metrics().At(k) + + newMD, mClone := cloneMetricWithoutType(rm, sm, m) + m.CopyTo(mClone) + + key := m.Name() + existing, ok := results[key] + if ok { + metrics.Merge(existing, newMD) + } else { + results[key] = newMD } } } } - return ids, nil - + return results } -// maintain -func sortedMapAttrs(attrs pcommon.Map) []string { - keys := make([]string, 0) - for k := range attrs.AsRaw() { - keys = append(keys, k) - } - sort.Strings(keys) - - attrsHash := make([]string, 0) - for _, k := range keys { - attrsHash = append(attrsHash, k) - if v, ok := attrs.Get(k); ok { - attrsHash = append(attrsHash, v.AsString()) +func splitMetricsByStreamID(md pmetric.Metrics) map[string]pmetric.Metrics { + results := map[string]pmetric.Metrics{} + + for i := 0; i < md.ResourceMetrics().Len(); i++ { + rm := md.ResourceMetrics().At(i) + res := rm.Resource() + + for j := 0; j < rm.ScopeMetrics().Len(); j++ { + sm := rm.ScopeMetrics().At(j) + scope := sm.Scope() + + for k := 0; k < sm.Metrics().Len(); k++ { + m := sm.Metrics().At(k) + metricID := identity.OfResourceMetric(res, scope, m) + + switch m.Type() { + case pmetric.MetricTypeGauge: + gauge := m.Gauge() + + for l := 0; l < gauge.DataPoints().Len(); l++ { + dp := gauge.DataPoints().At(l) + + newMD, mClone := cloneMetricWithoutType(rm, sm, m) + gaugeClone := mClone.SetEmptyGauge() + + dpClone := gaugeClone.DataPoints().AppendEmpty() + dp.CopyTo(dpClone) + + key := identity.OfStream(metricID, dp).String() + existing, ok := results[key] + if ok { + metrics.Merge(existing, newMD) + } else { + results[key] = newMD + } + } + case pmetric.MetricTypeSum: + sum := m.Sum() + + for l := 0; l < sum.DataPoints().Len(); l++ { + dp := sum.DataPoints().At(l) + + newMD, mClone := cloneMetricWithoutType(rm, sm, m) + sumClone := mClone.SetEmptySum() + sumClone.SetIsMonotonic(sum.IsMonotonic()) + sumClone.SetAggregationTemporality(sum.AggregationTemporality()) + + dpClone := sumClone.DataPoints().AppendEmpty() + dp.CopyTo(dpClone) + + key := identity.OfStream(metricID, dp).String() + existing, ok := results[key] + if ok { + metrics.Merge(existing, newMD) + } else { + results[key] = newMD + } + } + case pmetric.MetricTypeHistogram: + histogram := m.Histogram() + + for l := 0; l < histogram.DataPoints().Len(); l++ { + dp := histogram.DataPoints().At(l) + + newMD, mClone := cloneMetricWithoutType(rm, sm, m) + histogramClone := mClone.SetEmptyHistogram() + histogramClone.SetAggregationTemporality(histogram.AggregationTemporality()) + + dpClone := histogramClone.DataPoints().AppendEmpty() + dp.CopyTo(dpClone) + + key := identity.OfStream(metricID, dp).String() + existing, ok := results[key] + if ok { + metrics.Merge(existing, newMD) + } else { + results[key] = newMD + } + } + case pmetric.MetricTypeExponentialHistogram: + expHistogram := m.ExponentialHistogram() + + for l := 0; l < expHistogram.DataPoints().Len(); l++ { + dp := expHistogram.DataPoints().At(l) + + newMD, mClone := cloneMetricWithoutType(rm, sm, m) + expHistogramClone := mClone.SetEmptyExponentialHistogram() + expHistogramClone.SetAggregationTemporality(expHistogram.AggregationTemporality()) + + dpClone := expHistogramClone.DataPoints().AppendEmpty() + dp.CopyTo(dpClone) + + key := identity.OfStream(metricID, dp).String() + existing, ok := results[key] + if ok { + metrics.Merge(existing, newMD) + } else { + results[key] = newMD + } + } + case pmetric.MetricTypeSummary: + summary := m.Summary() + + for l := 0; l < summary.DataPoints().Len(); l++ { + dp := summary.DataPoints().At(l) + + newMD, mClone := cloneMetricWithoutType(rm, sm, m) + sumClone := mClone.SetEmptySummary() + + dpClone := sumClone.DataPoints().AppendEmpty() + dp.CopyTo(dpClone) + + key := identity.OfStream(metricID, dp).String() + existing, ok := results[key] + if ok { + metrics.Merge(existing, newMD) + } else { + results[key] = newMD + } + } + } + } } } - return attrsHash + + return results } -func resourceRoutingKey(md pmetric.Metric, attrs pcommon.Map) string { - attrsHash := sortedMapAttrs(attrs) - attrsHash = append(attrsHash, md.Name()) - routingRef := strings.Join(attrsHash, "") +func cloneMetricWithoutType(rm pmetric.ResourceMetrics, sm pmetric.ScopeMetrics, m pmetric.Metric) (md pmetric.Metrics, mClone pmetric.Metric) { + md = pmetric.NewMetrics() - return routingRef -} + rmClone := md.ResourceMetrics().AppendEmpty() + rm.Resource().CopyTo(rmClone.Resource()) + rmClone.SetSchemaUrl(rm.SchemaUrl()) + + smClone := rmClone.ScopeMetrics().AppendEmpty() + sm.Scope().CopyTo(smClone.Scope()) + smClone.SetSchemaUrl(sm.SchemaUrl()) + + mClone = smClone.Metrics().AppendEmpty() + mClone.SetName(m.Name()) + mClone.SetDescription(m.Description()) + mClone.SetUnit(m.Unit()) -func metricRoutingKey(md pmetric.Metric) string { - return md.Name() + return md, mClone } diff --git a/exporter/loadbalancingexporter/metrics_exporter_test.go b/exporter/loadbalancingexporter/metrics_exporter_test.go index fb2e319c2abc..1013dcda2a5e 100644 --- a/exporter/loadbalancingexporter/metrics_exporter_test.go +++ b/exporter/loadbalancingexporter/metrics_exporter_test.go @@ -9,13 +9,14 @@ import ( "fmt" "math/rand" "net" + "os" "path/filepath" - "strconv" "sync" "sync/atomic" "testing" "time" + jsoniter "github.com/json-iterator/go" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component" @@ -23,22 +24,16 @@ import ( "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/consumer/consumertest" "go.opentelemetry.io/collector/exporter" - "go.opentelemetry.io/collector/exporter/exportertest" - "go.opentelemetry.io/collector/exporter/otlpexporter" - "go.opentelemetry.io/collector/otelcol/otelcoltest" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" - conventions "go.opentelemetry.io/collector/semconv/v1.9.0" - "go.uber.org/zap" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" + "gopkg.in/yaml.v2" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter/internal/metadata" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/pmetrictest" ) const ( - serviceRouteKey = "service" - resourceRouteKey = "resource" - metricRouteKey = "metric" - ilsName1 = "library-1" ilsName2 = "library-2" keyAttr1 = "resattr-1" @@ -60,6 +55,7 @@ const ( ) func TestNewMetricsExporter(t *testing.T) { + ts, _ := getTelemetryAssets(t) for _, tt := range []struct { desc string config *Config @@ -88,14 +84,14 @@ func TestNewMetricsExporter(t *testing.T) { { "traceID", &Config{ - RoutingKey: "service", + RoutingKey: traceIDRoutingStr, }, errNoResolver, }, } { t.Run(tt.desc, func(t *testing.T) { // test - _, err := newMetricsExporter(exportertest.NewNopCreateSettings(), tt.config) + _, err := newMetricsExporter(ts, tt.config) // verify require.Equal(t, tt.err, err) @@ -104,6 +100,7 @@ func TestNewMetricsExporter(t *testing.T) { } func TestMetricsExporterStart(t *testing.T) { + ts, tb := getTelemetryAssets(t) for _, tt := range []struct { desc string te *metricExporterImp @@ -112,7 +109,7 @@ func TestMetricsExporterStart(t *testing.T) { { "ok", func() *metricExporterImp { - p, _ := newMetricsExporter(exportertest.NewNopCreateSettings(), serviceBasedRoutingConfig()) + p, _ := newMetricsExporter(ts, serviceBasedRoutingConfig()) return p }(), nil, @@ -120,8 +117,10 @@ func TestMetricsExporterStart(t *testing.T) { { "error", func() *metricExporterImp { - lb, _ := newLoadBalancer(exportertest.NewNopCreateSettings(), serviceBasedRoutingConfig(), nil) - p, _ := newMetricsExporter(exportertest.NewNopCreateSettings(), serviceBasedRoutingConfig()) + lb, err := newLoadBalancer(ts.Logger, serviceBasedRoutingConfig(), nil, tb) + require.NoError(t, err) + + p, _ := newMetricsExporter(ts, serviceBasedRoutingConfig()) lb.res = &mockResolver{ onStart: func(context.Context) error { @@ -151,7 +150,8 @@ func TestMetricsExporterStart(t *testing.T) { } func TestMetricsExporterShutdown(t *testing.T) { - p, err := newMetricsExporter(exportertest.NewNopCreateSettings(), serviceBasedRoutingConfig()) + ts, _ := getTelemetryAssets(t) + p, err := newMetricsExporter(ts, serviceBasedRoutingConfig()) require.NotNil(t, p) require.NoError(t, err) @@ -159,189 +159,420 @@ func TestMetricsExporterShutdown(t *testing.T) { res := p.Shutdown(context.Background()) // verify - assert.Nil(t, res) + assert.NoError(t, res) } -func TestConsumeMetrics(t *testing.T) { - componentFactory := func(_ context.Context, _ string) (component.Component, error) { - return newNopMockMetricsExporter(), nil - } - lb, err := newLoadBalancer(exportertest.NewNopCreateSettings(), serviceBasedRoutingConfig(), componentFactory) - require.NotNil(t, lb) +// loadMetricsMap will parse the given yaml file into a map[string]pmetric.Metrics +func loadMetricsMap(t *testing.T, path string) map[string]pmetric.Metrics { + b, err := os.ReadFile(path) require.NoError(t, err) - p, err := newMetricsExporter(exportertest.NewNopCreateSettings(), serviceBasedRoutingConfig()) - require.NotNil(t, p) + var expectedOutputRaw map[string]any + err = yaml.Unmarshal(b, &expectedOutputRaw) require.NoError(t, err) - assert.Equal(t, p.routingKey, svcRouting) - // pre-load an exporter here, so that we don't use the actual OTLP exporter - lb.addMissingExporters(context.Background(), []string{"endpoint-1", "endpoint-2"}) - lb.res = &mockResolver{ - triggerCallbacks: true, - onResolve: func(_ context.Context) ([]string, error) { - return []string{"endpoint-1", "endpoint-2"}, nil - }, + expectedOutput := map[string]pmetric.Metrics{} + for key, data := range expectedOutputRaw { + b, err = jsoniter.Marshal(data) + require.NoError(t, err) + + unmarshaller := &pmetric.JSONUnmarshaler{} + md, err := unmarshaller.UnmarshalMetrics(b) + require.NoError(t, err) + + expectedOutput[key] = md } - p.loadBalancer = lb - err = p.Start(context.Background(), componenttest.NewNopHost()) - require.NoError(t, err) - defer func() { - require.NoError(t, p.Shutdown(context.Background())) - }() + return expectedOutput +} - // test - res := p.ConsumeMetrics(context.Background(), simpleMetricsWithNoService()) +func compareMetricsMaps(t *testing.T, expected map[string]pmetric.Metrics, actual map[string]pmetric.Metrics) { + expectedKeys := make([]string, 0, len(expected)) + for key := range expected { + expectedKeys = append(expectedKeys, key) + } - // verify - assert.Error(t, res) + actualKeys := make([]string, 0, len(actual)) + for key := range actual { + actualKeys = append(actualKeys, key) + } + require.ElementsMatch(t, expectedKeys, actualKeys, "Maps have differing keys") + + for key, actualMD := range actual { + expectedMD := expected[key] + t.Logf("Comparing map values for key: %s", key) + require.NoError(t, pmetrictest.CompareMetrics( + expectedMD, actualMD, + // We have to ignore ordering, because we do MergeMetrics() inside a map + // iteration. And golang map iteration order is random. This means the + // order of the merges is random + pmetrictest.IgnoreResourceMetricsOrder(), + pmetrictest.IgnoreScopeMetricsOrder(), + pmetrictest.IgnoreMetricsOrder(), + pmetrictest.IgnoreMetricDataPointsOrder(), + )) + } } -// this test validates that exporter is can concurrently change the endpoints while consuming metrics. -func TestConsumeMetrics_ConcurrentResolverChange(t *testing.T) { - consumeStarted := make(chan struct{}) - consumeDone := make(chan struct{}) +func TestSplitMetricsByResourceServiceName(t *testing.T) { + t.Parallel() - // imitate a slow exporter - te := &mockMetricsExporter{Component: mockComponent{}} - te.ConsumeMetricsFn = func(_ context.Context, _ pmetric.Metrics) error { - close(consumeStarted) - time.Sleep(50 * time.Millisecond) - return te.consumeErr + testCases := []string{ + "basic_resource_service_name", + "duplicate_resource_service_name", } - componentFactory := func(_ context.Context, _ string) (component.Component, error) { - return te, nil + + for _, tc := range testCases { + testName := tc + + t.Run(testName, func(t *testing.T) { + t.Parallel() + + dir := filepath.Join("testdata", "metrics", "split_metrics", testName) + + input, err := golden.ReadMetrics(filepath.Join(dir, "input.yaml")) + require.NoError(t, err) + + expectedOutput := loadMetricsMap(t, filepath.Join(dir, "output.yaml")) + + output, err := splitMetricsByResourceServiceName(input) + require.NoError(t, err) + compareMetricsMaps(t, expectedOutput, output) + }) } - lb, err := newLoadBalancer(exportertest.NewNopCreateSettings(), simpleConfig(), componentFactory) - require.NotNil(t, lb) - require.NoError(t, err) +} - p, err := newMetricsExporter(exportertest.NewNopCreateSettings(), simpleConfig()) - require.NotNil(t, p) +func TestSplitMetricsByResourceServiceNameFailsIfMissingServiceNameAttribute(t *testing.T) { + t.Parallel() + + input, err := golden.ReadMetrics(filepath.Join("testdata", "metrics", "split_metrics", "missing_service_name", "input.yaml")) require.NoError(t, err) - endpoints := []string{"endpoint-1"} - lb.res = &mockResolver{ - triggerCallbacks: true, - onResolve: func(_ context.Context) ([]string, error) { - return endpoints, nil + _, err = splitMetricsByResourceServiceName(input) + require.Error(t, err) +} + +func TestSplitMetrics(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + splitFunc func(md pmetric.Metrics) map[string]pmetric.Metrics + }{ + { + name: "basic_resource_id", + splitFunc: splitMetricsByResourceID, + }, + { + name: "duplicate_resource_id", + splitFunc: splitMetricsByResourceID, + }, + { + name: "basic_metric_name", + splitFunc: splitMetricsByMetricName, + }, + { + name: "duplicate_metric_name", + splitFunc: splitMetricsByMetricName, + }, + { + name: "basic_stream_id", + splitFunc: splitMetricsByStreamID, + }, + { + name: "duplicate_stream_id", + splitFunc: splitMetricsByStreamID, }, } - p.loadBalancer = lb - err = p.Start(context.Background(), componenttest.NewNopHost()) - require.NoError(t, err) - defer func() { - require.NoError(t, p.Shutdown(context.Background())) - }() + for _, tc := range testCases { + // Purposely make a copy since we're running in a goroutine due to t.Parallel() + tc := tc - go func() { - assert.NoError(t, p.ConsumeMetrics(context.Background(), simpleMetricsWithResource())) - close(consumeDone) - }() + t.Run(tc.name, func(t *testing.T) { + t.Parallel() - // update endpoint while consuming logs - <-consumeStarted - endpoints = []string{"endpoint-2"} - endpoint, err := lb.res.resolve(context.Background()) - require.NoError(t, err) - require.Equal(t, endpoints, endpoint) - <-consumeDone -} + dir := filepath.Join("testdata", "metrics", "split_metrics", tc.name) -func TestConsumeMetricsServiceBased(t *testing.T) { - componentFactory := func(_ context.Context, _ string) (component.Component, error) { - return newNopMockMetricsExporter(), nil + input, err := golden.ReadMetrics(filepath.Join(dir, "input.yaml")) + require.NoError(t, err) + + expectedOutput := loadMetricsMap(t, filepath.Join(dir, "output.yaml")) + + output := tc.splitFunc(input) + require.NoError(t, err) + compareMetricsMaps(t, expectedOutput, output) + }) } - lb, err := newLoadBalancer(exportertest.NewNopCreateSettings(), serviceBasedRoutingConfig(), componentFactory) - require.NotNil(t, lb) - require.NoError(t, err) +} - p, err := newMetricsExporter(exportertest.NewNopCreateSettings(), serviceBasedRoutingConfig()) - require.NotNil(t, p) - require.NoError(t, err) - assert.Equal(t, p.routingKey, svcRouting) +func TestConsumeMetrics_SingleEndpoint(t *testing.T) { + ts, tb := getTelemetryAssets(t) + t.Parallel() - // pre-load an exporter here, so that we don't use the actual OTLP exporter - lb.addMissingExporters(context.Background(), []string{"endpoint-1"}) - lb.res = &mockResolver{ - triggerCallbacks: true, - onResolve: func(_ context.Context) ([]string, error) { - return []string{"endpoint-1"}, nil + testCases := []struct { + name string + routingKey string + }{ + { + name: "resource_service_name", + routingKey: svcRoutingStr, + }, + { + name: "resource_id", + routingKey: resourceRoutingStr, + }, + { + name: "metric_name", + routingKey: metricNameRoutingStr, + }, + { + name: "stream_id", + routingKey: streamIDRoutingStr, }, } - p.loadBalancer = lb - err = p.Start(context.Background(), componenttest.NewNopHost()) - require.NoError(t, err) - defer func() { - require.NoError(t, p.Shutdown(context.Background())) - }() + for _, tc := range testCases { + // Purposely make a copy since we're running in a goroutine due to t.Parallel() + tc := tc - // test - res := p.ConsumeMetrics(context.Background(), simpleMetricsWithServiceName()) + t.Run(tc.name, func(t *testing.T) { + t.Parallel() - // verify - assert.Nil(t, res) -} + createSettings := ts + config := &Config{ + Resolver: ResolverSettings{ + Static: &StaticResolver{Hostnames: []string{"endpoint-1"}}, + }, + RoutingKey: tc.routingKey, + } -func TestConsumeMetricsResourceBased(t *testing.T) { - componentFactory := func(_ context.Context, _ string) (component.Component, error) { - return newNopMockMetricsExporter(), nil + p, err := newMetricsExporter(createSettings, config) + require.NoError(t, err) + require.NotNil(t, p) + + // newMetricsExporter will internally create a loadBalancer instance which is + // hardcoded to use OTLP exporters + // We manually override that to use our testing sink + sink := consumertest.MetricsSink{} + componentFactory := func(_ context.Context, _ string) (component.Component, error) { + return newMockMetricsExporter(sink.ConsumeMetrics), nil + } + + lb, err := newLoadBalancer(ts.Logger, config, componentFactory, tb) + require.NoError(t, err) + require.NotNil(t, lb) + + lb.addMissingExporters(context.Background(), []string{"endpoint-1"}) + lb.res = &mockResolver{ + triggerCallbacks: true, + onResolve: func(_ context.Context) ([]string, error) { + return []string{"endpoint-1"}, nil + }, + } + p.loadBalancer = lb + + // Start everything up + err = p.Start(context.Background(), componenttest.NewNopHost()) + require.NoError(t, err) + defer func() { + require.NoError(t, p.Shutdown(context.Background())) + }() + + // Test + dir := filepath.Join("testdata", "metrics", "consume_metrics", "single_endpoint", tc.name) + + input, err := golden.ReadMetrics(filepath.Join(dir, "input.yaml")) + require.NoError(t, err) + + err = p.ConsumeMetrics(context.Background(), input) + require.NoError(t, err) + + expectedOutput, err := golden.ReadMetrics(filepath.Join(dir, "output.yaml")) + require.NoError(t, err) + + allOutputs := sink.AllMetrics() + require.Len(t, allOutputs, 1) + + actualOutput := allOutputs[0] + require.NoError(t, pmetrictest.CompareMetrics( + expectedOutput, actualOutput, + // We have to ignore ordering, because we do MergeMetrics() inside a map + // iteration. And golang map iteration order is random. This means the + // order of the merges is random + pmetrictest.IgnoreResourceMetricsOrder(), + pmetrictest.IgnoreScopeMetricsOrder(), + pmetrictest.IgnoreMetricsOrder(), + pmetrictest.IgnoreMetricDataPointsOrder(), + )) + }) } - lb, err := newLoadBalancer(exportertest.NewNopCreateSettings(), resourceBasedRoutingConfig(), componentFactory) - require.NotNil(t, lb) - require.NoError(t, err) +} - p, err := newMetricsExporter(exportertest.NewNopCreateSettings(), resourceBasedRoutingConfig()) - require.NotNil(t, p) - require.NoError(t, err) - assert.Equal(t, p.routingKey, resourceRouting) +func TestConsumeMetrics_TripleEndpoint(t *testing.T) { + ts, tb := getTelemetryAssets(t) + // I'm not fully satisfied with the design of this test. + // We're hard-reliant on the implementation of the ring hash to give use the routing. + // So if that algorithm changes, all these tests will need to be updated. In addition, + // it's not easy to "know" what the routing *should* be. Can *can* calculate it by + // hand, but it's very tedious. - // pre-load an exporter here, so that we don't use the actual OTLP exporter - lb.addMissingExporters(context.Background(), []string{"endpoint-1"}) - lb.res = &mockResolver{ - triggerCallbacks: true, - onResolve: func(_ context.Context) ([]string, error) { - return []string{"endpoint-1"}, nil + t.Parallel() + + testCases := []struct { + name string + routingKey string + }{ + { + name: "resource_service_name", + routingKey: svcRoutingStr, + }, + { + name: "resource_id", + routingKey: resourceRoutingStr, + }, + { + name: "metric_name", + routingKey: metricNameRoutingStr, + }, + { + name: "stream_id", + routingKey: streamIDRoutingStr, }, } - p.loadBalancer = lb - err = p.Start(context.Background(), componenttest.NewNopHost()) - require.NoError(t, err) - defer func() { - require.NoError(t, p.Shutdown(context.Background())) - }() + for _, tc := range testCases { + // Purposely make a copy since we're running in a goroutine due to t.Parallel() + tc := tc - // test - res := p.ConsumeMetrics(context.Background(), simpleMetricsWithResource()) + t.Run(tc.name, func(t *testing.T) { + t.Parallel() - // verify - assert.Nil(t, res) + createSettings := ts + config := &Config{ + Resolver: ResolverSettings{ + Static: &StaticResolver{Hostnames: []string{"endpoint-1", "endpoint-2", "endpoint-3"}}, + }, + RoutingKey: tc.routingKey, + } + + p, err := newMetricsExporter(createSettings, config) + require.NoError(t, err) + require.NotNil(t, p) + + // newMetricsExporter will internally create a loadBalancer instance which is + // hardcoded to use OTLP exporters + // We manually override that to use our testing sink + sink1 := consumertest.MetricsSink{} + sink2 := consumertest.MetricsSink{} + sink3 := consumertest.MetricsSink{} + componentFactory := func(_ context.Context, endpoint string) (component.Component, error) { + if endpoint == "endpoint-1:4317" { + return newMockMetricsExporter(sink1.ConsumeMetrics), nil + } + if endpoint == "endpoint-2:4317" { + return newMockMetricsExporter(sink2.ConsumeMetrics), nil + } + if endpoint == "endpoint-3:4317" { + return newMockMetricsExporter(sink3.ConsumeMetrics), nil + } + + t.Fatalf("invalid endpoint %s", endpoint) + return nil, errors.New("invalid endpoint") + } + + lb, err := newLoadBalancer(ts.Logger, config, componentFactory, tb) + require.NoError(t, err) + require.NotNil(t, lb) + + lb.addMissingExporters(context.Background(), []string{"endpoint-1", "endpoint-2", "endpoint-3"}) + lb.res = &mockResolver{ + triggerCallbacks: true, + onResolve: func(_ context.Context) ([]string, error) { + return []string{"endpoint-1", "endpoint-2", "endpoint-3"}, nil + }, + } + p.loadBalancer = lb + + // Start everything up + err = p.Start(context.Background(), componenttest.NewNopHost()) + require.NoError(t, err) + defer func() { + require.NoError(t, p.Shutdown(context.Background())) + }() + + // Test + dir := filepath.Join("testdata", "metrics", "consume_metrics", "triple_endpoint", tc.name) + + input, err := golden.ReadMetrics(filepath.Join(dir, "input.yaml")) + require.NoError(t, err) + + err = p.ConsumeMetrics(context.Background(), input) + require.NoError(t, err) + + expectedOutput := loadMetricsMap(t, filepath.Join(dir, "output.yaml")) + + actualOutput := map[string]pmetric.Metrics{} + + sink1Outputs := sink1.AllMetrics() + require.LessOrEqual(t, len(sink1Outputs), 1) + if len(sink1Outputs) == 1 { + actualOutput["endpoint-1"] = sink1Outputs[0] + } else { + actualOutput["endpoint-1"] = pmetric.NewMetrics() + } + + sink2Outputs := sink2.AllMetrics() + require.LessOrEqual(t, len(sink2Outputs), 1) + if len(sink2Outputs) == 1 { + actualOutput["endpoint-2"] = sink2Outputs[0] + } else { + actualOutput["endpoint-2"] = pmetric.NewMetrics() + } + + sink3Outputs := sink3.AllMetrics() + require.LessOrEqual(t, len(sink3Outputs), 1) + if len(sink3Outputs) == 1 { + actualOutput["endpoint-3"] = sink3Outputs[0] + } else { + actualOutput["endpoint-3"] = pmetric.NewMetrics() + } + + compareMetricsMaps(t, expectedOutput, actualOutput) + }) + } } -func TestConsumeMetricsMetricNameBased(t *testing.T) { +// this test validates that exporter is can concurrently change the endpoints while consuming metrics. +func TestConsumeMetrics_ConcurrentResolverChange(t *testing.T) { + ts, tb := getTelemetryAssets(t) + consumeStarted := make(chan struct{}) + consumeDone := make(chan struct{}) + componentFactory := func(_ context.Context, _ string) (component.Component, error) { - return newNopMockMetricsExporter(), nil + // imitate a slow exporter + te := &mockMetricsExporter{Component: mockComponent{}} + te.ConsumeMetricsFn = func(_ context.Context, _ pmetric.Metrics) error { + close(consumeStarted) + time.Sleep(50 * time.Millisecond) + return te.consumeErr + } + return te, nil } - lb, err := newLoadBalancer(exportertest.NewNopCreateSettings(), metricNameBasedRoutingConfig(), componentFactory) + lb, err := newLoadBalancer(ts.Logger, simpleConfig(), componentFactory, tb) require.NotNil(t, lb) require.NoError(t, err) - p, err := newMetricsExporter(exportertest.NewNopCreateSettings(), metricNameBasedRoutingConfig()) + p, err := newMetricsExporter(ts, simpleConfig()) require.NotNil(t, p) require.NoError(t, err) - assert.Equal(t, p.routingKey, metricNameRouting) - // pre-load an exporter here, so that we don't use the actual OTLP exporter - lb.addMissingExporters(context.Background(), []string{"endpoint-1"}) + endpoints := []string{"endpoint-1"} lb.res = &mockResolver{ triggerCallbacks: true, onResolve: func(_ context.Context) ([]string, error) { - return []string{"endpoint-1"}, nil + return endpoints, nil }, } p.loadBalancer = lb @@ -352,45 +583,30 @@ func TestConsumeMetricsMetricNameBased(t *testing.T) { require.NoError(t, p.Shutdown(context.Background())) }() - // test - res := p.ConsumeMetrics(context.Background(), simpleMetricsWithResource()) - - // verify - assert.Nil(t, res) -} - -func TestServiceBasedRoutingForSameMetricName(t *testing.T) { + go func() { + assert.NoError(t, p.ConsumeMetrics(context.Background(), simpleMetricsWithResource())) + close(consumeDone) + }() - for _, tt := range []struct { - desc string - batch pmetric.Metrics - routingKey routingKey - res map[string]bool - }{ - { - "different services - service based routing", - twoServicesWithSameMetricName(), - svcRouting, - map[string]bool{serviceName1: true, serviceName2: true}, - }, - } { - t.Run(tt.desc, func(t *testing.T) { - res, err := routingIdentifiersFromMetrics(tt.batch, tt.routingKey) - assert.Equal(t, err, nil) - assert.Equal(t, res, tt.res) - }) - } + // update endpoint while consuming logs + <-consumeStarted + endpoints = []string{"endpoint-2"} + endpoint, err := lb.res.resolve(context.Background()) + require.NoError(t, err) + require.Equal(t, endpoints, endpoint) + <-consumeDone } func TestConsumeMetricsExporterNoEndpoint(t *testing.T) { + ts, tb := getTelemetryAssets(t) componentFactory := func(_ context.Context, _ string) (component.Component, error) { return newNopMockMetricsExporter(), nil } - lb, err := newLoadBalancer(exportertest.NewNopCreateSettings(), serviceBasedRoutingConfig(), componentFactory) + lb, err := newLoadBalancer(ts.Logger, serviceBasedRoutingConfig(), componentFactory, tb) require.NotNil(t, lb) require.NoError(t, err) - p, err := newMetricsExporter(exportertest.NewNopCreateSettings(), endpoint2Config()) + p, err := newMetricsExporter(ts, endpoint2Config()) require.NotNil(t, p) require.NoError(t, err) @@ -417,14 +633,15 @@ func TestConsumeMetricsExporterNoEndpoint(t *testing.T) { } func TestConsumeMetricsUnexpectedExporterType(t *testing.T) { + ts, tb := getTelemetryAssets(t) componentFactory := func(_ context.Context, _ string) (component.Component, error) { return newNopMockExporter(), nil } - lb, err := newLoadBalancer(exportertest.NewNopCreateSettings(), serviceBasedRoutingConfig(), componentFactory) + lb, err := newLoadBalancer(ts.Logger, serviceBasedRoutingConfig(), componentFactory, tb) require.NotNil(t, lb) require.NoError(t, err) - p, err := newMetricsExporter(exportertest.NewNopCreateSettings(), serviceBasedRoutingConfig()) + p, err := newMetricsExporter(ts, serviceBasedRoutingConfig()) require.NotNil(t, p) require.NoError(t, err) @@ -453,44 +670,17 @@ func TestConsumeMetricsUnexpectedExporterType(t *testing.T) { assert.EqualError(t, res, fmt.Sprintf("unable to export metrics, unexpected exporter type: expected exporter.Metrics but got %T", newNopMockExporter())) } -func TestBuildExporterConfigUnknown(t *testing.T) { - // prepare - factories, err := otelcoltest.NopFactories() - require.NoError(t, err) - - factories.Exporters[metadata.Type] = NewFactory() - - cfg, err := otelcoltest.LoadConfigAndValidate(filepath.Join("testdata", "test-build-exporter-config.yaml"), factories) - require.NoError(t, err) - require.NotNil(t, cfg) - - c := cfg.Exporters[component.NewID(metadata.Type)] - require.NotNil(t, c) - - // test - defaultCfg := otlpexporter.NewFactory().CreateDefaultConfig().(*otlpexporter.Config) - exporterCfg := buildExporterConfig(c.(*Config), "the-endpoint") - - // verify - grpcSettings := defaultCfg.ClientConfig - grpcSettings.Endpoint = "the-endpoint" - assert.Equal(t, grpcSettings, exporterCfg.ClientConfig) - - assert.Equal(t, defaultCfg.TimeoutSettings, exporterCfg.TimeoutSettings) - assert.Equal(t, defaultCfg.QueueConfig, exporterCfg.QueueConfig) - assert.Equal(t, defaultCfg.RetryConfig, exporterCfg.RetryConfig) -} - func TestBatchWithTwoMetrics(t *testing.T) { + ts, tb := getTelemetryAssets(t) sink := new(consumertest.MetricsSink) componentFactory := func(_ context.Context, _ string) (component.Component, error) { return newMockMetricsExporter(sink.ConsumeMetrics), nil } - lb, err := newLoadBalancer(exportertest.NewNopCreateSettings(), serviceBasedRoutingConfig(), componentFactory) + lb, err := newLoadBalancer(ts.Logger, serviceBasedRoutingConfig(), componentFactory, tb) require.NotNil(t, lb) require.NoError(t, err) - p, err := newMetricsExporter(exportertest.NewNopCreateSettings(), serviceBasedRoutingConfig()) + p, err := newMetricsExporter(ts, serviceBasedRoutingConfig()) require.NotNil(t, p) require.NoError(t, err) @@ -510,86 +700,9 @@ func TestBatchWithTwoMetrics(t *testing.T) { assert.Len(t, sink.AllMetrics(), 2) } -func TestNoMetricsInBatch(t *testing.T) { - for _, tt := range []struct { - desc string - batch pmetric.Metrics - routingKey routingKey - err error - }{ - { - "no resource metrics", - pmetric.NewMetrics(), - svcRouting, - errors.New("empty resource metrics"), - }, - { - "no instrumentation library metrics", - func() pmetric.Metrics { - batch := pmetric.NewMetrics() - batch.ResourceMetrics().AppendEmpty() - return batch - }(), - svcRouting, - errors.New("empty scope metrics"), - }, - { - "no metrics", - func() pmetric.Metrics { - batch := pmetric.NewMetrics() - batch.ResourceMetrics().AppendEmpty().ScopeMetrics().AppendEmpty() - return batch - }(), - svcRouting, - errors.New("empty metrics"), - }, - } { - t.Run(tt.desc, func(t *testing.T) { - res, err := routingIdentifiersFromMetrics(tt.batch, tt.routingKey) - assert.Equal(t, err, tt.err) - assert.Equal(t, res, map[string]bool(nil)) - }) - } -} - -func TestResourceRoutingKey(t *testing.T) { - - md := pmetric.NewMetric() - md.SetName("metric") - attrs := pcommon.NewMap() - if got := resourceRoutingKey(md, attrs); got != "metric" { - t.Errorf("metricRoutingKey() = %v, want %v", got, "metric") - } - - attrs.PutStr("k1", "v1") - if got := resourceRoutingKey(md, attrs); got != "k1v1metric" { - t.Errorf("metricRoutingKey() = %v, want %v", got, "k1v1metric") - } - - attrs.PutStr("k2", "v2") - if got := resourceRoutingKey(md, attrs); got != "k1v1k2v2metric" { - t.Errorf("metricRoutingKey() = %v, want %v", got, "k1v1k2v2metric") - } -} - -func TestMetricNameRoutingKey(t *testing.T) { - - md := pmetric.NewMetric() - md.SetName(signal1Name) - if got := metricRoutingKey(md); got != signal1Name { - t.Errorf("metricRoutingKey() = %v, want %v", got, signal1Name) - } - - md = pmetric.NewMetric() - md.SetName(signal2Name) - if got := metricRoutingKey(md); got != signal2Name { - t.Errorf("metricRoutingKey() = %v, want %v", got, signal2Name) - } - -} - func TestRollingUpdatesWhenConsumeMetrics(t *testing.T) { t.Skip("Flaky Test - See https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/13331") + ts, tb := getTelemetryAssets(t) // this test is based on the discussion in the following issue for this exporter: // https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/1690 @@ -597,7 +710,7 @@ func TestRollingUpdatesWhenConsumeMetrics(t *testing.T) { // simulate rolling updates, the dns resolver should resolve in the following order // ["127.0.0.1"] -> ["127.0.0.1", "127.0.0.2"] -> ["127.0.0.2"] - res, err := newDNSResolver(zap.NewNop(), "service-1", "", 5*time.Second, 1*time.Second) + res, err := newDNSResolver(ts.Logger, "service-1", "", 5*time.Second, 1*time.Second, tb) require.NoError(t, err) mu := sync.Mutex{} @@ -648,11 +761,11 @@ func TestRollingUpdatesWhenConsumeMetrics(t *testing.T) { componentFactory := func(_ context.Context, _ string) (component.Component, error) { return newNopMockMetricsExporter(), nil } - lb, err := newLoadBalancer(exportertest.NewNopCreateSettings(), cfg, componentFactory) + lb, err := newLoadBalancer(ts.Logger, cfg, componentFactory, tb) require.NotNil(t, lb) require.NoError(t, err) - p, err := newMetricsExporter(exportertest.NewNopCreateSettings(), cfg) + p, err := newMetricsExporter(ts, cfg) require.NotNil(t, p) require.NoError(t, err) @@ -667,11 +780,11 @@ func TestRollingUpdatesWhenConsumeMetrics(t *testing.T) { // simulate an unreachable backend time.Sleep(10 * time.Second) return nil - })), + }), "127.0.0.1"), "127.0.0.2:4317": newWrappedExporter(newMockMetricsExporter(func(_ context.Context, _ pmetric.Metrics) error { counter2.Add(1) return nil - })), + }), "127.0.0.2"), } // test @@ -702,7 +815,7 @@ func TestRollingUpdatesWhenConsumeMetrics(t *testing.T) { return case <-ticker.C: go func() { - require.NoError(t, p.ConsumeMetrics(ctx, randomMetrics())) + assert.NoError(t, p.ConsumeMetrics(ctx, randomMetrics(t, 1, 1, 1, 1))) }() } } @@ -724,18 +837,65 @@ func TestRollingUpdatesWhenConsumeMetrics(t *testing.T) { mu.Lock() require.Equal(t, []string{"127.0.0.2"}, lastResolved) mu.Unlock() - require.Greater(t, counter1.Load(), int64(0)) - require.Greater(t, counter2.Load(), int64(0)) + require.Positive(t, counter1.Load()) + require.Positive(t, counter2.Load()) } -func appendSimpleMetricWithServiceName(metric pmetric.Metrics, serviceName string, sigName string) { - metric.ResourceMetrics().EnsureCapacity(1) - rmetrics := metric.ResourceMetrics().AppendEmpty() - rmetrics.Resource().Attributes().PutStr(conventions.AttributeServiceName, serviceName) - rmetrics.ScopeMetrics().AppendEmpty().Metrics().AppendEmpty().SetName(sigName) +func randomMetrics(t require.TestingT, rmCount int, smCount int, mCount int, dpCount int) pmetric.Metrics { + md := pmetric.NewMetrics() + + timeStamp := pcommon.Timestamp(rand.Intn(256)) + value := int64(rand.Intn(256)) + + for i := 0; i < rmCount; i++ { + rm := md.ResourceMetrics().AppendEmpty() + err := rm.Resource().Attributes().FromRaw(map[string]any{ + conventions.AttributeServiceName: fmt.Sprintf("service-%d", rand.Intn(512)), + }) + require.NoError(t, err) + + for j := 0; j < smCount; j++ { + sm := rm.ScopeMetrics().AppendEmpty() + scope := sm.Scope() + scope.SetName("MyTestInstrument") + scope.SetVersion("1.2.3") + err = scope.Attributes().FromRaw(map[string]any{ + "scope.key": fmt.Sprintf("scope-%d", rand.Intn(512)), + }) + require.NoError(t, err) + + for k := 0; k < mCount; k++ { + m := sm.Metrics().AppendEmpty() + m.SetName(fmt.Sprintf("metric.%d.test", rand.Intn(512))) + + sum := m.SetEmptySum() + sum.SetAggregationTemporality(pmetric.AggregationTemporalityCumulative) + sum.SetIsMonotonic(true) + + for l := 0; l < dpCount; l++ { + dp := sum.DataPoints().AppendEmpty() + + dp.SetTimestamp(timeStamp) + timeStamp += 10 + + dp.SetIntValue(value) + value += 15 + + err = dp.Attributes().FromRaw(map[string]any{ + "datapoint.key": fmt.Sprintf("dp-%d", rand.Intn(512)), + }) + require.NoError(t, err) + } + } + } + } + + return md } -func benchConsumeMetrics(b *testing.B, endpointsCount int, metricsCount int) { +func benchConsumeMetrics(b *testing.B, routingKey string, endpointsCount int, rmCount int, smCount int, mCount int, dpCount int) { + ts, tb := getTelemetryAssets(b) + sink := new(consumertest.MetricsSink) componentFactory := func(_ context.Context, _ string) (component.Component, error) { return newMockMetricsExporter(sink.ConsumeMetrics), nil @@ -750,13 +910,14 @@ func benchConsumeMetrics(b *testing.B, endpointsCount int, metricsCount int) { Resolver: ResolverSettings{ Static: &StaticResolver{Hostnames: endpoints}, }, + RoutingKey: routingKey, } - lb, err := newLoadBalancer(exportertest.NewNopCreateSettings(), config, componentFactory) + lb, err := newLoadBalancer(ts.Logger, config, componentFactory, tb) require.NotNil(b, lb) require.NoError(b, err) - p, err := newMetricsExporter(exportertest.NewNopCreateSettings(), config) + p, err := newMetricsExporter(ts, config) require.NotNil(b, p) require.NoError(b, err) @@ -765,15 +926,7 @@ func benchConsumeMetrics(b *testing.B, endpointsCount int, metricsCount int) { err = p.Start(context.Background(), componenttest.NewNopHost()) require.NoError(b, err) - metric1 := pmetric.NewMetrics() - metric2 := pmetric.NewMetrics() - for i := 0; i < endpointsCount; i++ { - for j := 0; j < metricsCount/endpointsCount; j++ { - appendSimpleMetricWithServiceName(metric2, fmt.Sprintf("service-%d", i), fmt.Sprintf("sig-%d", i)) - } - } - simpleMetricsWithServiceName() - md := mergeMetrics(metric1, metric2) + md := randomMetrics(b, rmCount, smCount, mCount, dpCount) b.ResetTimer() @@ -787,36 +940,42 @@ func benchConsumeMetrics(b *testing.B, endpointsCount int, metricsCount int) { require.NoError(b, err) } -func BenchmarkConsumeMetrics_1E100T(b *testing.B) { - benchConsumeMetrics(b, 1, 100) -} - -func BenchmarkConsumeMetrics_1E1000T(b *testing.B) { - benchConsumeMetrics(b, 1, 1000) -} - -func BenchmarkConsumeMetrics_5E100T(b *testing.B) { - benchConsumeMetrics(b, 5, 100) -} - -func BenchmarkConsumeMetrics_5E500T(b *testing.B) { - benchConsumeMetrics(b, 5, 500) -} - -func BenchmarkConsumeMetrics_5E1000T(b *testing.B) { - benchConsumeMetrics(b, 5, 1000) -} - -func BenchmarkConsumeMetrics_10E100T(b *testing.B) { - benchConsumeMetrics(b, 10, 100) -} - -func BenchmarkConsumeMetrics_10E500T(b *testing.B) { - benchConsumeMetrics(b, 10, 500) -} +func BenchmarkConsumeMetrics(b *testing.B) { + testCases := []struct { + routingKey string + }{ + { + routingKey: svcRoutingStr, + }, + { + routingKey: resourceRoutingStr, + }, + { + routingKey: metricNameRoutingStr, + }, + { + routingKey: streamIDRoutingStr, + }, + } -func BenchmarkConsumeMetrics_10E1000T(b *testing.B) { - benchConsumeMetrics(b, 10, 1000) + for _, tc := range testCases { + b.Run(tc.routingKey, func(b *testing.B) { + for _, endpointCount := range []int{1, 5, 10} { + for _, rmCount := range []int{1, 3} { + for _, smCount := range []int{1, 3} { + for _, totalMCount := range []int{100, 500, 1000} { + mCount := totalMCount / smCount / rmCount + dpCount := 2 + + b.Run(fmt.Sprintf("%dE_%dRM_%dSM_%dM", endpointCount, rmCount, smCount, mCount), func(b *testing.B) { + benchConsumeMetrics(b, tc.routingKey, endpointCount, rmCount, smCount, mCount, dpCount) + }) + } + } + } + } + }) + } } func endpoint2Config() *Config { @@ -833,7 +992,7 @@ func resourceBasedRoutingConfig() *Config { Resolver: ResolverSettings{ Static: &StaticResolver{Hostnames: []string{"endpoint-1", "endpoint-2"}}, }, - RoutingKey: resourceRouteKey, + RoutingKey: resourceRoutingStr, } } @@ -842,24 +1001,10 @@ func metricNameBasedRoutingConfig() *Config { Resolver: ResolverSettings{ Static: &StaticResolver{Hostnames: []string{"endpoint-1", "endpoint-2"}}, }, - RoutingKey: metricRouteKey, + RoutingKey: metricNameRoutingStr, } } -func randomMetrics() pmetric.Metrics { - v1 := uint64(rand.Intn(256)) - name := strconv.FormatUint(v1, 10) - metrics := pmetric.NewMetrics() - appendSimpleMetricWithID(metrics.ResourceMetrics().AppendEmpty(), name) - return metrics -} - -func simpleMetricsWithNoService() pmetric.Metrics { - metrics := pmetric.NewMetrics() - appendSimpleMetricWithID(metrics.ResourceMetrics().AppendEmpty(), "simple-metric-name") - return metrics -} - func simpleMetricsWithServiceName() pmetric.Metrics { metrics := pmetric.NewMetrics() metrics.ResourceMetrics().EnsureCapacity(1) diff --git a/exporter/loadbalancingexporter/metrics_test.go b/exporter/loadbalancingexporter/metrics_test.go deleted file mode 100644 index 2db6ea4183fa..000000000000 --- a/exporter/loadbalancingexporter/metrics_test.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package loadbalancingexporter - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestProcessorMetrics(t *testing.T) { - expectedViewNames := []string{ - "loadbalancer_num_resolutions", - "loadbalancer_num_backends", - "loadbalancer_num_backend_updates", - "loadbalancer_backend_latency", - } - - views := metricViews() - for i, viewName := range expectedViewNames { - assert.Equal(t, viewName, views[i].Name) - } -} diff --git a/exporter/loadbalancingexporter/resolver_aws_cloudmap.go b/exporter/loadbalancingexporter/resolver_aws_cloudmap.go index ea316df105cf..324093bc53e1 100644 --- a/exporter/loadbalancingexporter/resolver_aws_cloudmap.go +++ b/exporter/loadbalancingexporter/resolver_aws_cloudmap.go @@ -15,9 +15,11 @@ import ( "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/servicediscovery" "github.com/aws/aws-sdk-go-v2/service/servicediscovery/types" - "go.opencensus.io/stats" - "go.opencensus.io/tag" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric" "go.uber.org/zap" + + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter/internal/metadata" ) const ( @@ -29,10 +31,10 @@ var ( errNoNamespace = errors.New("no Cloud Map namespace specified to resolve the backends") errNoServiceName = errors.New("no Cloud Map service_name specified to resolve the backends") - awsResolverMutator = tag.Upsert(tag.MustNewKey("resolver"), "aws") - - awsResolverSuccessTrueMutators = []tag.Mutator{awsResolverMutator, successTrueMutator} - awsResolverSuccessFalseMutators = []tag.Mutator{awsResolverMutator, successFalseMutator} + awsResolverAttr = attribute.String("resolver", "aws") + awsResolverAttrSet = attribute.NewSet(awsResolverAttr) + awsResolverSuccessAttrSet = attribute.NewSet(awsResolverAttr, attribute.Bool("success", true)) + awsResolverFailureAttrSet = attribute.NewSet(awsResolverAttr, attribute.Bool("success", false)) ) func createDiscoveryFunction(client *servicediscovery.Client) func(params *servicediscovery.DiscoverInstancesInput) (*servicediscovery.DiscoverInstancesOutput, error) { @@ -59,10 +61,19 @@ type cloudMapResolver struct { shutdownWg sync.WaitGroup changeCallbackLock sync.RWMutex discoveryFn func(params *servicediscovery.DiscoverInstancesInput) (*servicediscovery.DiscoverInstancesOutput, error) + telemetry *metadata.TelemetryBuilder } -func newCloudMapResolver(logger *zap.Logger, namespaceName *string, serviceName *string, port *uint16, healthStatus *types.HealthStatusFilter, interval time.Duration, timeout time.Duration) (*cloudMapResolver, error) { - // Using the SDK's default configuration, loading additional config +func newCloudMapResolver( + logger *zap.Logger, + namespaceName *string, + serviceName *string, + port *uint16, + healthStatus *types.HealthStatusFilter, + interval time.Duration, + timeout time.Duration, + tb *metadata.TelemetryBuilder, +) (*cloudMapResolver, error) { // Using the SDK's default configuration, loading additional config // and credentials values from the environment variables, shared // credentials, and shared configuration files cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithDefaultRegion("us-east-1")) @@ -90,7 +101,7 @@ func newCloudMapResolver(logger *zap.Logger, namespaceName *string, serviceName } if healthStatus == nil { - var healthStatusFilter = types.HealthStatusFilterHealthy + healthStatusFilter := types.HealthStatusFilterHealthy healthStatus = &healthStatusFilter } @@ -104,6 +115,7 @@ func newCloudMapResolver(logger *zap.Logger, namespaceName *string, serviceName resTimeout: timeout, stopCh: make(chan struct{}), discoveryFn: createDiscoveryFunction(svc), + telemetry: tb, }, nil } @@ -165,11 +177,11 @@ func (r *cloudMapResolver) resolve(ctx context.Context) ([]string, error) { QueryParameters: nil, }) if err != nil { - _ = stats.RecordWithTags(ctx, awsResolverSuccessFalseMutators, mNumResolutions.M(1)) + r.telemetry.LoadbalancerNumResolutions.Add(ctx, 1, metric.WithAttributeSet(awsResolverFailureAttrSet)) return nil, err } - _ = stats.RecordWithTags(ctx, awsResolverSuccessTrueMutators, mNumResolutions.M(1)) + r.telemetry.LoadbalancerNumResolutions.Add(ctx, 1, metric.WithAttributeSet(awsResolverSuccessAttrSet)) r.logger.Debug("resolver has discovered instances ", zap.Int("Instance Count", len(discoverInstancesOutput.Instances))) @@ -200,7 +212,8 @@ func (r *cloudMapResolver) resolve(ctx context.Context) ([]string, error) { r.updateLock.Lock() r.endpoints = backends r.updateLock.Unlock() - _ = stats.RecordWithTags(ctx, awsResolverSuccessTrueMutators, mNumBackends.M(int64(len(backends)))) + r.telemetry.LoadbalancerNumBackends.Record(ctx, int64(len(backends)), metric.WithAttributeSet(awsResolverAttrSet)) + r.telemetry.LoadbalancerNumBackendUpdates.Add(ctx, 1, metric.WithAttributeSet(awsResolverAttrSet)) // propagate the change r.changeCallbackLock.RLock() diff --git a/exporter/loadbalancingexporter/resolver_aws_cloudmap_test.go b/exporter/loadbalancingexporter/resolver_aws_cloudmap_test.go index a236f14bce0b..53e4b6060bfc 100644 --- a/exporter/loadbalancingexporter/resolver_aws_cloudmap_test.go +++ b/exporter/loadbalancingexporter/resolver_aws_cloudmap_test.go @@ -17,14 +17,17 @@ import ( "go.uber.org/zap" ) -var instanceID = "test" -var namespaceName = "cloudmap" -var statusFilterHealthy = types.HealthStatusFilterHealthy +var ( + instanceID = "test" + namespaceName = "cloudmap" + statusFilterHealthy = types.HealthStatusFilterHealthy +) var port uint16 = 1234 func TestInitialCloudMapResolution(t *testing.T) { // prepare + _, tb := getTelemetryAssets(t) res := &cloudMapResolver{ logger: zap.NewNop(), @@ -35,6 +38,7 @@ func TestInitialCloudMapResolution(t *testing.T) { resTimeout: 1 * time.Second, stopCh: make(chan struct{}), discoveryFn: mockDiscovery, + telemetry: tb, } // test @@ -56,6 +60,7 @@ func TestInitialCloudMapResolution(t *testing.T) { func TestInitialCloudMapResolutionWithPort(t *testing.T) { // prepare + _, tb := getTelemetryAssets(t) res := &cloudMapResolver{ logger: zap.NewNop(), @@ -67,6 +72,7 @@ func TestInitialCloudMapResolutionWithPort(t *testing.T) { resTimeout: 1 * time.Second, stopCh: make(chan struct{}), discoveryFn: mockDiscovery, + telemetry: tb, } // test @@ -98,8 +104,8 @@ func makeSummary(i int) types.HttpInstanceSummary { ServiceName: nil, } } -func mockDiscovery(*servicediscovery.DiscoverInstancesInput) (*servicediscovery.DiscoverInstancesOutput, error) { +func mockDiscovery(*servicediscovery.DiscoverInstancesInput) (*servicediscovery.DiscoverInstancesOutput, error) { s := &servicediscovery.DiscoverInstancesOutput{ Instances: []types.HttpInstanceSummary{ makeSummary(1), diff --git a/exporter/loadbalancingexporter/resolver_dns.go b/exporter/loadbalancingexporter/resolver_dns.go index 97d111d3d029..0d1a5422db27 100644 --- a/exporter/loadbalancingexporter/resolver_dns.go +++ b/exporter/loadbalancingexporter/resolver_dns.go @@ -12,9 +12,11 @@ import ( "sync" "time" - "go.opencensus.io/stats" - "go.opencensus.io/tag" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric" "go.uber.org/zap" + + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter/internal/metadata" ) var _ resolver = (*dnsResolver)(nil) @@ -27,10 +29,10 @@ const ( var ( errNoHostname = errors.New("no hostname specified to resolve the backends") - resolverMutator = tag.Upsert(tag.MustNewKey("resolver"), "dns") - - resolverSuccessTrueMutators = []tag.Mutator{resolverMutator, successTrueMutator} - resolverSuccessFalseMutators = []tag.Mutator{resolverMutator, successFalseMutator} + dnsResolverAttr = attribute.String("resolver", "dns") + dnsResolverAttrSet = attribute.NewSet(dnsResolverAttr) + dnsResolverSuccessAttrSet = attribute.NewSet(dnsResolverAttr, attribute.Bool("success", true)) + dnsResolverFailureAttrSet = attribute.NewSet(dnsResolverAttr, attribute.Bool("success", false)) ) type dnsResolver struct { @@ -49,13 +51,21 @@ type dnsResolver struct { updateLock sync.Mutex shutdownWg sync.WaitGroup changeCallbackLock sync.RWMutex + telemetry *metadata.TelemetryBuilder } type netResolver interface { LookupIPAddr(ctx context.Context, host string) ([]net.IPAddr, error) } -func newDNSResolver(logger *zap.Logger, hostname string, port string, interval time.Duration, timeout time.Duration) (*dnsResolver, error) { +func newDNSResolver( + logger *zap.Logger, + hostname string, + port string, + interval time.Duration, + timeout time.Duration, + tb *metadata.TelemetryBuilder, +) (*dnsResolver, error) { if len(hostname) == 0 { return nil, errNoHostname } @@ -74,6 +84,7 @@ func newDNSResolver(logger *zap.Logger, hostname string, port string, interval t resInterval: interval, resTimeout: timeout, stopCh: make(chan struct{}), + telemetry: tb, }, nil } @@ -125,11 +136,11 @@ func (r *dnsResolver) resolve(ctx context.Context) ([]string, error) { addrs, err := r.resolver.LookupIPAddr(ctx, r.hostname) if err != nil { - _ = stats.RecordWithTags(ctx, resolverSuccessFalseMutators, mNumResolutions.M(1)) + r.telemetry.LoadbalancerNumResolutions.Add(ctx, 1, metric.WithAttributeSet(dnsResolverFailureAttrSet)) return nil, err } - _ = stats.RecordWithTags(ctx, resolverSuccessTrueMutators, mNumResolutions.M(1)) + r.telemetry.LoadbalancerNumResolutions.Add(ctx, 1, metric.WithAttributeSet(dnsResolverSuccessAttrSet)) backends := make([]string, len(addrs)) for i, ip := range addrs { @@ -160,7 +171,8 @@ func (r *dnsResolver) resolve(ctx context.Context) ([]string, error) { r.updateLock.Lock() r.endpoints = backends r.updateLock.Unlock() - _ = stats.RecordWithTags(ctx, resolverSuccessTrueMutators, mNumBackends.M(int64(len(backends)))) + r.telemetry.LoadbalancerNumBackends.Record(ctx, int64(len(backends)), metric.WithAttributeSet(dnsResolverAttrSet)) + r.telemetry.LoadbalancerNumBackendUpdates.Add(ctx, 1, metric.WithAttributeSet(dnsResolverAttrSet)) // propagate the change r.changeCallbackLock.RLock() diff --git a/exporter/loadbalancingexporter/resolver_dns_test.go b/exporter/loadbalancingexporter/resolver_dns_test.go index 0201c5a9cea5..a6896b52940c 100644 --- a/exporter/loadbalancingexporter/resolver_dns_test.go +++ b/exporter/loadbalancingexporter/resolver_dns_test.go @@ -19,7 +19,8 @@ import ( func TestInitialDNSResolution(t *testing.T) { // prepare - res, err := newDNSResolver(zap.NewNop(), "service-1", "", 5*time.Second, 1*time.Second) + _, tb := getTelemetryAssets(t) + res, err := newDNSResolver(zap.NewNop(), "service-1", "", 5*time.Second, 1*time.Second, tb) require.NoError(t, err) res.resolver = &mockDNSResolver{ @@ -51,7 +52,8 @@ func TestInitialDNSResolution(t *testing.T) { func TestInitialDNSResolutionWithPort(t *testing.T) { // prepare - res, err := newDNSResolver(zap.NewNop(), "service-1", "55690", 5*time.Second, 1*time.Second) + _, tb := getTelemetryAssets(t) + res, err := newDNSResolver(zap.NewNop(), "service-1", "55690", 5*time.Second, 1*time.Second, tb) require.NoError(t, err) res.resolver = &mockDNSResolver{ @@ -83,7 +85,8 @@ func TestInitialDNSResolutionWithPort(t *testing.T) { func TestErrNoHostname(t *testing.T) { // test - res, err := newDNSResolver(zap.NewNop(), "", "", 5*time.Second, 1*time.Second) + _, tb := getTelemetryAssets(t) + res, err := newDNSResolver(zap.NewNop(), "", "", 5*time.Second, 1*time.Second, tb) // verify assert.Nil(t, res) @@ -92,7 +95,8 @@ func TestErrNoHostname(t *testing.T) { func TestCantResolve(t *testing.T) { // prepare - res, err := newDNSResolver(zap.NewNop(), "service-1", "", 5*time.Second, 1*time.Second) + _, tb := getTelemetryAssets(t) + res, err := newDNSResolver(zap.NewNop(), "service-1", "", 5*time.Second, 1*time.Second, tb) require.NoError(t, err) expectedErr := errors.New("some expected error") @@ -112,7 +116,8 @@ func TestCantResolve(t *testing.T) { func TestOnChange(t *testing.T) { // prepare - res, err := newDNSResolver(zap.NewNop(), "service-1", "", 5*time.Second, 1*time.Second) + _, tb := getTelemetryAssets(t) + res, err := newDNSResolver(zap.NewNop(), "service-1", "", 5*time.Second, 1*time.Second, tb) require.NoError(t, err) resolve := []net.IPAddr{ @@ -179,7 +184,8 @@ func TestEqualStringSlice(t *testing.T) { func TestPeriodicallyResolve(t *testing.T) { // prepare - res, err := newDNSResolver(zap.NewNop(), "service-1", "", 10*time.Millisecond, 1*time.Second) + _, tb := getTelemetryAssets(t) + res, err := newDNSResolver(zap.NewNop(), "service-1", "", 10*time.Millisecond, 1*time.Second, tb) require.NoError(t, err) counter := &atomic.Int64{} @@ -237,7 +243,8 @@ func TestPeriodicallyResolve(t *testing.T) { func TestPeriodicallyResolveFailure(t *testing.T) { // prepare - res, err := newDNSResolver(zap.NewNop(), "service-1", "", 10*time.Millisecond, 1*time.Second) + _, tb := getTelemetryAssets(t) + res, err := newDNSResolver(zap.NewNop(), "service-1", "", 10*time.Millisecond, 1*time.Second, tb) require.NoError(t, err) expectedErr := errors.New("some expected error") @@ -280,7 +287,8 @@ func TestPeriodicallyResolveFailure(t *testing.T) { func TestShutdownClearsCallbacks(t *testing.T) { // prepare - res, err := newDNSResolver(zap.NewNop(), "service-1", "", 5*time.Second, 1*time.Second) + _, tb := getTelemetryAssets(t) + res, err := newDNSResolver(zap.NewNop(), "service-1", "", 5*time.Second, 1*time.Second, tb) require.NoError(t, err) res.resolver = &mockDNSResolver{} @@ -295,7 +303,7 @@ func TestShutdownClearsCallbacks(t *testing.T) { // verify assert.NoError(t, err) - assert.Len(t, res.onChangeCallbacks, 0) + assert.Empty(t, res.onChangeCallbacks) // check that we can add a new onChange before a new start res.onChange(func(_ []string) {}) diff --git a/exporter/loadbalancingexporter/resolver_k8s.go b/exporter/loadbalancingexporter/resolver_k8s.go index 4a2d64fb6a61..040eb8120814 100644 --- a/exporter/loadbalancingexporter/resolver_k8s.go +++ b/exporter/loadbalancingexporter/resolver_k8s.go @@ -15,8 +15,8 @@ import ( "sync" "time" - "go.opencensus.io/stats" - "go.opencensus.io/tag" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric" "go.uber.org/zap" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,15 +27,19 @@ import ( "k8s.io/utils/ptr" "k8s.io/utils/strings/slices" "sigs.k8s.io/controller-runtime/pkg/client/config" + + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter/internal/metadata" ) var _ resolver = (*k8sResolver)(nil) var ( - errNoSvc = errors.New("no service specified to resolve the backends") - k8sResolverMutator = tag.Upsert(tag.MustNewKey("resolver"), "k8s") - k8sResolverSuccessTrueMutators = []tag.Mutator{k8sResolverMutator, successTrueMutator} - k8sResolverSuccessFalseMutators = []tag.Mutator{k8sResolverMutator, successFalseMutator} + errNoSvc = errors.New("no service specified to resolve the backends") + + k8sResolverAttr = attribute.String("resolver", "k8s") + k8sResolverAttrSet = attribute.NewSet(k8sResolverAttr) + k8sResolverSuccessAttrSet = attribute.NewSet(k8sResolverAttr, attribute.Bool("success", true)) + k8sResolverFailureAttrSet = attribute.NewSet(k8sResolverAttr, attribute.Bool("success", false)) ) const ( @@ -57,18 +61,24 @@ type k8sResolver struct { endpoints []string onChangeCallbacks []func([]string) + returnNames bool stopCh chan struct{} updateLock sync.RWMutex shutdownWg sync.WaitGroup changeCallbackLock sync.RWMutex + + telemetry *metadata.TelemetryBuilder } func newK8sResolver(clt kubernetes.Interface, logger *zap.Logger, service string, - ports []int32, timeout time.Duration) (*k8sResolver, error) { - + ports []int32, + timeout time.Duration, + returnNames bool, + tb *metadata.TelemetryBuilder, +) (*k8sResolver, error) { if len(service) == 0 { return nil, errNoSvc } @@ -106,7 +116,12 @@ func newK8sResolver(clt kubernetes.Interface, } epsStore := &sync.Map{} - h := &handler{endpoints: epsStore, logger: logger} + h := &handler{ + endpoints: epsStore, + logger: logger, + telemetry: tb, + returnNames: returnNames, + } r := &k8sResolver{ logger: logger, svcName: name, @@ -118,6 +133,8 @@ func newK8sResolver(clt kubernetes.Interface, handler: h, stopCh: make(chan struct{}), lwTimeout: timeout, + telemetry: tb, + returnNames: returnNames, } h.callback = r.resolve @@ -160,6 +177,7 @@ func (r *k8sResolver) shutdown(_ context.Context) error { r.shutdownWg.Wait() return nil } + func newInClusterClient() (kubernetes.Interface, error) { cfg, err := config.GetConfig() if err != nil { @@ -173,18 +191,24 @@ func (r *k8sResolver) resolve(ctx context.Context) ([]string, error) { defer r.shutdownWg.Done() var backends []string - r.endpointsStore.Range(func(address, _ any) bool { - addr := address.(string) + var ep string + r.endpointsStore.Range(func(host, _ any) bool { + switch r.returnNames { + case true: + ep = fmt.Sprintf("%s.%s.%s", host, r.svcName, r.svcNs) + default: + ep = host.(string) + } if len(r.port) == 0 { - backends = append(backends, addr) + backends = append(backends, ep) } else { for _, port := range r.port { - backends = append(backends, net.JoinHostPort(addr, strconv.FormatInt(int64(port), 10))) + backends = append(backends, net.JoinHostPort(ep, strconv.FormatInt(int64(port), 10))) } } return true }) - _ = stats.RecordWithTags(ctx, k8sResolverSuccessTrueMutators, mNumResolutions.M(1)) + r.telemetry.LoadbalancerNumResolutions.Add(ctx, 1, metric.WithAttributeSet(k8sResolverSuccessAttrSet)) // keep it always in the same order sort.Strings(backends) @@ -197,7 +221,8 @@ func (r *k8sResolver) resolve(ctx context.Context) ([]string, error) { r.updateLock.Lock() r.endpoints = backends r.updateLock.Unlock() - _ = stats.RecordWithTags(ctx, k8sResolverSuccessTrueMutators, mNumBackends.M(int64(len(backends)))) + r.telemetry.LoadbalancerNumBackends.Record(ctx, int64(len(backends)), metric.WithAttributeSet(k8sResolverAttrSet)) + r.telemetry.LoadbalancerNumBackendUpdates.Add(ctx, 1, metric.WithAttributeSet(k8sResolverAttrSet)) // propagate the change r.changeCallbackLock.RLock() @@ -213,6 +238,7 @@ func (r *k8sResolver) onChange(f func([]string)) { defer r.changeCallbackLock.Unlock() r.onChangeCallbacks = append(r.onChangeCallbacks, f) } + func (r *k8sResolver) Endpoints() []string { r.updateLock.RLock() defer r.updateLock.RUnlock() diff --git a/exporter/loadbalancingexporter/resolver_k8s_handler.go b/exporter/loadbalancingexporter/resolver_k8s_handler.go index d93cc2d94a88..895c7fbfca2c 100644 --- a/exporter/loadbalancingexporter/resolver_k8s_handler.go +++ b/exporter/loadbalancingexporter/resolver_k8s_handler.go @@ -7,33 +7,48 @@ import ( "context" "sync" - "go.opencensus.io/stats" + "go.opentelemetry.io/otel/metric" "go.uber.org/zap" corev1 "k8s.io/api/core/v1" "k8s.io/client-go/tools/cache" + + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter/internal/metadata" ) var _ cache.ResourceEventHandler = (*handler)(nil) +const ( + epMissingHostnamesMsg = "Endpoints object missing hostnames" +) + type handler struct { - endpoints *sync.Map - callback func(ctx context.Context) ([]string, error) - logger *zap.Logger + endpoints *sync.Map + callback func(ctx context.Context) ([]string, error) + logger *zap.Logger + telemetry *metadata.TelemetryBuilder + returnNames bool } func (h handler) OnAdd(obj any, _ bool) { - var endpoints []string + var endpoints map[string]bool + var ok bool switch object := obj.(type) { case *corev1.Endpoints: - endpoints = convertToEndpoints(object) + ok, endpoints = convertToEndpoints(h.returnNames, object) + if !ok { + h.logger.Warn(epMissingHostnamesMsg, zap.Any("obj", obj)) + h.telemetry.LoadbalancerNumResolutions.Add(context.Background(), 1, metric.WithAttributeSet(k8sResolverFailureAttrSet)) + return + } + default: // unsupported h.logger.Warn("Got an unexpected Kubernetes data type during the inclusion of a new pods for the service", zap.Any("obj", obj)) - _ = stats.RecordWithTags(context.Background(), k8sResolverSuccessFalseMutators, mNumResolutions.M(1)) + h.telemetry.LoadbalancerNumResolutions.Add(context.Background(), 1, metric.WithAttributeSet(k8sResolverFailureAttrSet)) return } changed := false - for _, ep := range endpoints { + for ep := range endpoints { if _, loaded := h.endpoints.LoadOrStore(ep, true); !loaded { changed = true } @@ -46,67 +61,96 @@ func (h handler) OnAdd(obj any, _ bool) { func (h handler) OnUpdate(oldObj, newObj any) { switch oldEps := oldObj.(type) { case *corev1.Endpoints: - epRemove := convertToEndpoints(oldEps) - for _, ep := range epRemove { - h.endpoints.Delete(ep) - } - if len(epRemove) > 0 { - _, _ = h.callback(context.Background()) - } - newEps, ok := newObj.(*corev1.Endpoints) if !ok { h.logger.Warn("Got an unexpected Kubernetes data type during the update of the pods for a service", zap.Any("obj", newObj)) - _ = stats.RecordWithTags(context.Background(), k8sResolverSuccessFalseMutators, mNumResolutions.M(1)) + h.telemetry.LoadbalancerNumResolutions.Add(context.Background(), 1, metric.WithAttributeSet(k8sResolverFailureAttrSet)) + return + } + + _, oldEndpoints := convertToEndpoints(h.returnNames, oldEps) + hostnameOk, newEndpoints := convertToEndpoints(h.returnNames, newEps) + if !hostnameOk { + h.logger.Warn(epMissingHostnamesMsg, zap.Any("obj", newEps)) + h.telemetry.LoadbalancerNumResolutions.Add(context.Background(), 1, metric.WithAttributeSet(k8sResolverFailureAttrSet)) return } + changed := false - for _, ep := range convertToEndpoints(newEps) { + + // Iterate through old endpoints and remove those that are not in the new list. + for ep := range oldEndpoints { + if _, ok := newEndpoints[ep]; !ok { + h.endpoints.Delete(ep) + changed = true + } + } + + // Iterate through new endpoints and add those that are not in the endpoints map already. + for ep := range newEndpoints { if _, loaded := h.endpoints.LoadOrStore(ep, true); !loaded { changed = true } } + if changed { _, _ = h.callback(context.Background()) + } else { + h.logger.Debug("No changes detected in the endpoints for the service", zap.Any("old", oldEps), zap.Any("new", newEps)) } + default: // unsupported h.logger.Warn("Got an unexpected Kubernetes data type during the update of the pods for a service", zap.Any("obj", oldObj)) - _ = stats.RecordWithTags(context.Background(), k8sResolverSuccessFalseMutators, mNumResolutions.M(1)) + h.telemetry.LoadbalancerNumResolutions.Add(context.Background(), 1, metric.WithAttributeSet(k8sResolverFailureAttrSet)) return } } func (h handler) OnDelete(obj any) { - var endpoints []string + var endpoints map[string]bool + var ok bool + switch object := obj.(type) { case *cache.DeletedFinalStateUnknown: h.OnDelete(object.Obj) return case *corev1.Endpoints: if object != nil { - endpoints = convertToEndpoints(object) + ok, endpoints = convertToEndpoints(h.returnNames, object) + if !ok { + h.logger.Warn(epMissingHostnamesMsg, zap.Any("obj", obj)) + h.telemetry.LoadbalancerNumResolutions.Add(context.Background(), 1, metric.WithAttributeSet(k8sResolverFailureAttrSet)) + return + } } default: // unsupported h.logger.Warn("Got an unexpected Kubernetes data type during the removal of the pods for a service", zap.Any("obj", obj)) - _ = stats.RecordWithTags(context.Background(), k8sResolverSuccessFalseMutators, mNumResolutions.M(1)) + h.telemetry.LoadbalancerNumResolutions.Add(context.Background(), 1, metric.WithAttributeSet(k8sResolverFailureAttrSet)) return } if len(endpoints) != 0 { - for _, endpoint := range endpoints { + for endpoint := range endpoints { h.endpoints.Delete(endpoint) } _, _ = h.callback(context.Background()) } } -func convertToEndpoints(eps ...*corev1.Endpoints) []string { - var ipAddress []string +func convertToEndpoints(retNames bool, eps ...*corev1.Endpoints) (bool, map[string]bool) { + res := map[string]bool{} for _, ep := range eps { for _, subsets := range ep.Subsets { for _, addr := range subsets.Addresses { - ipAddress = append(ipAddress, addr.IP) + if retNames { + if addr.Hostname == "" { + return false, nil + } + res[addr.Hostname] = true + } else { + res[addr.IP] = true + } } } } - return ipAddress + return true, res } diff --git a/exporter/loadbalancingexporter/resolver_k8s_handler_test.go b/exporter/loadbalancingexporter/resolver_k8s_handler_test.go new file mode 100644 index 000000000000..1a8cbd70c223 --- /dev/null +++ b/exporter/loadbalancingexporter/resolver_k8s_handler_test.go @@ -0,0 +1,105 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package loadbalancingexporter + +import ( + "testing" + + "github.com/stretchr/testify/assert" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func TestConvertToEndpoints(tst *testing.T) { + // Create dummy Endpoints objects + endpoints1 := &corev1.Endpoints{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-endpoints-1", + Namespace: "test-namespace", + }, + Subsets: []corev1.EndpointSubset{ + { + Addresses: []corev1.EndpointAddress{ + { + Hostname: "pod-1", + IP: "192.168.10.101", + }, + }, + }, + }, + } + endpoints2 := &corev1.Endpoints{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-endpoints-2", + Namespace: "test-namespace", + }, + Subsets: []corev1.EndpointSubset{ + { + Addresses: []corev1.EndpointAddress{ + { + Hostname: "pod-2", + IP: "192.168.10.102", + }, + }, + }, + }, + } + endpoints3 := &corev1.Endpoints{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-endpoints-3", + Namespace: "test-namespace", + }, + Subsets: []corev1.EndpointSubset{ + { + Addresses: []corev1.EndpointAddress{ + { + IP: "192.168.10.103", + }, + }, + }, + }, + } + + tests := []struct { + name string + returnNames bool + includedEndpoints []*corev1.Endpoints + expectedEndpoints map[string]bool + wantNil bool + }{ + { + name: "return hostnames", + returnNames: true, + includedEndpoints: []*corev1.Endpoints{endpoints1, endpoints2}, + expectedEndpoints: map[string]bool{"pod-1": true, "pod-2": true}, + wantNil: false, + }, + { + name: "return IPs", + returnNames: false, + includedEndpoints: []*corev1.Endpoints{endpoints1, endpoints2, endpoints3}, + expectedEndpoints: map[string]bool{"192.168.10.101": true, "192.168.10.102": true, "192.168.10.103": true}, + wantNil: false, + }, + { + name: "missing hostname", + returnNames: true, + includedEndpoints: []*corev1.Endpoints{endpoints1, endpoints3}, + expectedEndpoints: nil, + wantNil: true, + }, + } + + for _, tt := range tests { + tst.Run(tt.name, func(tst *testing.T) { + ok, res := convertToEndpoints(tt.returnNames, tt.includedEndpoints...) + if tt.wantNil { + assert.Nil(tst, res) + } else { + assert.Equal(tst, tt.expectedEndpoints, res) + } + assert.Equal(tst, !tt.wantNil, ok) + }) + } +} diff --git a/exporter/loadbalancingexporter/resolver_k8s_test.go b/exporter/loadbalancingexporter/resolver_k8s_test.go index b7faf8497743..c344fc1c6bb8 100644 --- a/exporter/loadbalancingexporter/resolver_k8s_test.go +++ b/exporter/loadbalancingexporter/resolver_k8s_test.go @@ -21,10 +21,11 @@ import ( func TestK8sResolve(t *testing.T) { type args struct { - logger *zap.Logger - service string - ports []int32 - namespace string + logger *zap.Logger + service string + ports []int32 + namespace string + returnHostnames bool } type suiteContext struct { endpoint *corev1.Endpoints @@ -32,7 +33,7 @@ func TestK8sResolve(t *testing.T) { resolver *k8sResolver } setupSuite := func(t *testing.T, args args) (*suiteContext, func(*testing.T)) { - service, defaultNs, ports := args.service, args.namespace, args.ports + service, defaultNs, ports, returnHostnames := args.service, args.namespace, args.ports, args.returnHostnames endpoint := &corev1.Endpoints{ ObjectMeta: metav1.ObjectMeta{ Name: service, @@ -41,7 +42,10 @@ func TestK8sResolve(t *testing.T) { Subsets: []corev1.EndpointSubset{ { Addresses: []corev1.EndpointAddress{ - {IP: "192.168.10.100"}, + { + Hostname: "pod-0", + IP: "192.168.10.100", + }, }, }, }, @@ -50,13 +54,18 @@ func TestK8sResolve(t *testing.T) { for _, subset := range endpoint.Subsets { for _, address := range subset.Addresses { for _, port := range args.ports { - expectInit = append(expectInit, fmt.Sprintf("%s:%d", address.IP, port)) + if returnHostnames { + expectInit = append(expectInit, fmt.Sprintf("%s.%s.%s:%d", address.Hostname, service, defaultNs, port)) + } else { + expectInit = append(expectInit, fmt.Sprintf("%s:%d", address.IP, port)) + } } } } cl := fake.NewSimpleClientset(endpoint) - res, err := newK8sResolver(cl, zap.NewNop(), service, ports, defaultListWatchTimeout) + _, tb := getTelemetryAssets(t) + res, err := newK8sResolver(cl, zap.NewNop(), service, ports, defaultListWatchTimeout, returnHostnames, tb) require.NoError(t, err) require.NoError(t, res.start(context.Background())) @@ -76,10 +85,11 @@ func TestK8sResolve(t *testing.T) { name string args args simulateFn func(*suiteContext, args) error + onChangeFn func([]string) verifyFn func(*suiteContext, args) error }{ { - name: "simulate append the backend ip address", + name: "add new IP to existing backends", args: args{ logger: zap.NewNop(), service: "lb", @@ -99,7 +109,6 @@ func TestK8sResolve(t *testing.T) { _, err = suiteCtx.clientset.CoreV1().Endpoints(args.namespace). Patch(context.TODO(), args.service, types.MergePatchType, data, metav1.PatchOptions{}) return err - }, verifyFn: func(ctx *suiteContext, _ args) error { if _, err := ctx.resolver.resolve(context.Background()); err != nil { @@ -117,7 +126,80 @@ func TestK8sResolve(t *testing.T) { }, }, { - name: "simulate change the backend ip address", + name: "simulate re-list that does not change endpoints", + args: args{ + logger: zap.NewNop(), + service: "lb", + namespace: "default", + ports: []int32{8080, 9090}, + }, + simulateFn: func(suiteCtx *suiteContext, args args) error { + exist := suiteCtx.endpoint.DeepCopy() + patch := client.MergeFrom(exist) + data, err := patch.Data(exist) + if err != nil { + return err + } + _, err = suiteCtx.clientset.CoreV1().Endpoints(args.namespace). + Patch(context.TODO(), args.service, types.MergePatchType, data, metav1.PatchOptions{}) + return err + }, + onChangeFn: func([]string) { + assert.Fail(t, "should not call onChange") + }, + verifyFn: func(ctx *suiteContext, _ args) error { + if _, err := ctx.resolver.resolve(context.Background()); err != nil { + return err + } + + assert.Equal(t, []string{ + "192.168.10.100:8080", + "192.168.10.100:9090", + }, ctx.resolver.Endpoints(), "resolver failed, endpoints not equal") + + return nil + }, + }, + { + name: "add new hostname to existing backends", + args: args{ + logger: zap.NewNop(), + service: "lb", + namespace: "default", + ports: []int32{8080, 9090}, + returnHostnames: true, + }, + simulateFn: func(suiteCtx *suiteContext, args args) error { + endpoint, exist := suiteCtx.endpoint.DeepCopy(), suiteCtx.endpoint.DeepCopy() + endpoint.Subsets = append(endpoint.Subsets, corev1.EndpointSubset{ + Addresses: []corev1.EndpointAddress{{IP: "10.10.0.11", Hostname: "pod-1"}}, + }) + patch := client.MergeFrom(exist) + data, err := patch.Data(endpoint) + if err != nil { + return err + } + _, err = suiteCtx.clientset.CoreV1().Endpoints(args.namespace). + Patch(context.TODO(), args.service, types.MergePatchType, data, metav1.PatchOptions{}) + return err + }, + verifyFn: func(ctx *suiteContext, _ args) error { + if _, err := ctx.resolver.resolve(context.Background()); err != nil { + return err + } + + assert.Equal(t, []string{ + "pod-0.lb.default:8080", + "pod-0.lb.default:9090", + "pod-1.lb.default:8080", + "pod-1.lb.default:9090", + }, ctx.resolver.Endpoints(), "resolver failed, endpoints not equal") + + return nil + }, + }, + { + name: "change existing backend ip address", args: args{ logger: zap.NewNop(), service: "lb", @@ -137,7 +219,6 @@ func TestK8sResolve(t *testing.T) { _, err = suiteCtx.clientset.CoreV1().Endpoints(args.namespace). Patch(context.TODO(), args.service, types.MergePatchType, data, metav1.PatchOptions{}) return err - }, verifyFn: func(ctx *suiteContext, _ args) error { if _, err := ctx.resolver.resolve(context.Background()); err != nil { @@ -178,6 +259,10 @@ func TestK8sResolve(t *testing.T) { suiteCtx, teardownSuite := setupSuite(t, tt.args) defer teardownSuite(t) + if tt.onChangeFn != nil { + suiteCtx.resolver.onChange(tt.onChangeFn) + } + err := tt.simulateFn(suiteCtx, tt.args) assert.NoError(t, err) @@ -241,9 +326,10 @@ func Test_newK8sResolver(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := newK8sResolver(fake.NewSimpleClientset(), tt.args.logger, tt.args.service, tt.args.ports, defaultListWatchTimeout) + _, tb := getTelemetryAssets(t) + got, err := newK8sResolver(fake.NewSimpleClientset(), tt.args.logger, tt.args.service, tt.args.ports, defaultListWatchTimeout, false, tb) if tt.wantErr != nil { - require.Error(t, err, tt.wantErr) + require.ErrorIs(t, err, tt.wantErr) } else { require.NoError(t, err) require.Equal(t, tt.wantNil, got == nil) diff --git a/exporter/loadbalancingexporter/resolver_static.go b/exporter/loadbalancingexporter/resolver_static.go index 86759f132bbe..dac67631a0a2 100644 --- a/exporter/loadbalancingexporter/resolver_static.go +++ b/exporter/loadbalancingexporter/resolver_static.go @@ -9,25 +9,30 @@ import ( "sort" "sync" - "go.opencensus.io/stats" - "go.opencensus.io/tag" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric" + + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter/internal/metadata" ) var _ resolver = (*staticResolver)(nil) var ( - errNoEndpoints = errors.New("no endpoints specified for the static resolver") - - staticResolverMutators = []tag.Mutator{tag.Upsert(tag.MustNewKey("resolver"), "static"), successTrueMutator} + errNoEndpoints = errors.New("no endpoints specified for the static resolver") + staticResolverAttr = attribute.String("resolver", "static") + staticResolverAttrSet = attribute.NewSet(staticResolverAttr) + staticResolverSuccessAttrSet = attribute.NewSet(staticResolverAttr, attribute.Bool("success", true)) ) type staticResolver struct { endpoints []string onChangeCallbacks []func([]string) once sync.Once // we trigger the onChange only once + + telemetry *metadata.TelemetryBuilder } -func newStaticResolver(endpoints []string) (*staticResolver, error) { +func newStaticResolver(endpoints []string, tb *metadata.TelemetryBuilder) (*staticResolver, error) { if len(endpoints) == 0 { return nil, errNoEndpoints } @@ -41,6 +46,7 @@ func newStaticResolver(endpoints []string) (*staticResolver, error) { return &staticResolver{ endpoints: endpointsCopy, + telemetry: tb, }, nil } @@ -60,11 +66,10 @@ func (r *staticResolver) shutdown(context.Context) error { } func (r *staticResolver) resolve(ctx context.Context) ([]string, error) { - _ = stats.RecordWithTags(ctx, staticResolverMutators, mNumResolutions.M(1)) - + r.telemetry.LoadbalancerNumResolutions.Add(ctx, 1, metric.WithAttributeSet(staticResolverSuccessAttrSet)) r.once.Do(func() { - _ = stats.RecordWithTags(ctx, staticResolverMutators, mNumBackends.M(int64(len(r.endpoints)))) - + r.telemetry.LoadbalancerNumBackends.Record(ctx, int64(len(r.endpoints)), metric.WithAttributeSet(staticResolverAttrSet)) + r.telemetry.LoadbalancerNumBackendUpdates.Add(ctx, 1, metric.WithAttributeSet(staticResolverAttrSet)) for _, callback := range r.onChangeCallbacks { callback(r.endpoints) } diff --git a/exporter/loadbalancingexporter/resolver_static_test.go b/exporter/loadbalancingexporter/resolver_static_test.go index 63dda4be2367..7c17da4bb9a3 100644 --- a/exporter/loadbalancingexporter/resolver_static_test.go +++ b/exporter/loadbalancingexporter/resolver_static_test.go @@ -13,8 +13,9 @@ import ( func TestInitialResolution(t *testing.T) { // prepare + _, tb := getTelemetryAssets(t) provided := []string{"endpoint-2", "endpoint-1"} - res, err := newStaticResolver(provided) + res, err := newStaticResolver(provided, tb) require.NoError(t, err) // test @@ -34,8 +35,9 @@ func TestInitialResolution(t *testing.T) { func TestResolvedOnlyOnce(t *testing.T) { // prepare + _, tb := getTelemetryAssets(t) expected := []string{"endpoint-1", "endpoint-2"} - res, err := newStaticResolver(expected) + res, err := newStaticResolver(expected, tb) require.NoError(t, err) counter := 0 @@ -58,10 +60,11 @@ func TestResolvedOnlyOnce(t *testing.T) { func TestFailOnMissingEndpoints(t *testing.T) { // prepare + _, tb := getTelemetryAssets(t) var expected []string // test - res, err := newStaticResolver(expected) + res, err := newStaticResolver(expected, tb) // verify assert.Equal(t, errNoEndpoints, err) diff --git a/exporter/loadbalancingexporter/telemetry_utils_test.go b/exporter/loadbalancingexporter/telemetry_utils_test.go new file mode 100644 index 000000000000..21a9dc117f81 --- /dev/null +++ b/exporter/loadbalancingexporter/telemetry_utils_test.go @@ -0,0 +1,20 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package loadbalancingexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter" + +import ( + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/exporter" + + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter/internal/metadata" +) + +func getTelemetryAssets(t require.TestingT) (exporter.Settings, *metadata.TelemetryBuilder) { + s := setupTestTelemetry() + st := s.NewSettings() + ts := st.TelemetrySettings + tb, err := metadata.NewTelemetryBuilder(ts) + require.NoError(t, err) + return st, tb +} diff --git a/exporter/loadbalancingexporter/testdata/config.yaml b/exporter/loadbalancingexporter/testdata/config.yaml index da1d51818e59..64a0271338b3 100644 --- a/exporter/loadbalancingexporter/testdata/config.yaml +++ b/exporter/loadbalancingexporter/testdata/config.yaml @@ -1,6 +1,6 @@ loadbalancing: protocol: - # the OTLP exporter configuration. "endpoint" values will be ignored + # the OTLP exporter configuration "endpoint" values will be ignored otlp: timeout: 1s @@ -38,3 +38,12 @@ loadbalancing/4: namespace: cloudmap-1 service_name: service-1 port: 4319 + +loadbalancing/5: + # the OTLP exporter configuration "sending_queue" values will be ignored + sending_queue: + enabled: true + protocol: + otlp: + sending_queue: + enabled: false diff --git a/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/single_endpoint/metric_name/input.yaml b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/single_endpoint/metric_name/input.yaml new file mode 100644 index 000000000000..d81894c1fbb4 --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/single_endpoint/metric_name/input.yaml @@ -0,0 +1,77 @@ +resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: first.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - name: second.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 945 + attributes: + - key: aaa + value: + stringValue: bbb + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: first.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 80 + asDouble: 444 + attributes: + - key: aaa + value: + stringValue: bbb + - name: second.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 80 + asDouble: 1000 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/single_endpoint/metric_name/output.yaml b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/single_endpoint/metric_name/output.yaml new file mode 100644 index 000000000000..9813bfbd7324 --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/single_endpoint/metric_name/output.yaml @@ -0,0 +1,51 @@ +resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: first.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 80 + asDouble: 444 + attributes: + - key: aaa + value: + stringValue: bbb + - name: second.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 945 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 80 + asDouble: 1000 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/single_endpoint/resource_id/input.yaml b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/single_endpoint/resource_id/input.yaml new file mode 100644 index 000000000000..7d8e24c2cfb8 --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/single_endpoint/resource_id/input.yaml @@ -0,0 +1,55 @@ +resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 80 + asDouble: 555 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/single_endpoint/resource_id/output.yaml b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/single_endpoint/resource_id/output.yaml new file mode 100644 index 000000000000..28029bd23802 --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/single_endpoint/resource_id/output.yaml @@ -0,0 +1,34 @@ +resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 80 + asDouble: 555 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/single_endpoint/resource_service_name/input.yaml b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/single_endpoint/resource_service_name/input.yaml new file mode 100644 index 000000000000..1a0a17714a3a --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/single_endpoint/resource_service_name/input.yaml @@ -0,0 +1,55 @@ +resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: service.name + value: + stringValue: serviceA + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: service.name + value: + stringValue: serviceA + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 80 + asDouble: 555 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/single_endpoint/resource_service_name/output.yaml b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/single_endpoint/resource_service_name/output.yaml new file mode 100644 index 000000000000..7e422a478b12 --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/single_endpoint/resource_service_name/output.yaml @@ -0,0 +1,34 @@ +resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: service.name + value: + stringValue: serviceA + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 80 + asDouble: 555 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/single_endpoint/stream_id/input.yaml b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/single_endpoint/stream_id/input.yaml new file mode 100644 index 000000000000..6876e49c90c4 --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/single_endpoint/stream_id/input.yaml @@ -0,0 +1,101 @@ +resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: first.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 80 + asDouble: 444 + attributes: + - key: bbb + value: + stringValue: ccc + - name: second.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 555 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 80 + asDouble: 666 + attributes: + - key: bbb + value: + stringValue: ccc + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: bar + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: first.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 80 + asDouble: 444 + attributes: + - key: aaa + value: + stringValue: bbb + - name: second.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 555 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 80 + asDouble: 666 + attributes: + - key: bbb + value: + stringValue: ccc diff --git a/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/single_endpoint/stream_id/output.yaml b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/single_endpoint/stream_id/output.yaml new file mode 100644 index 000000000000..6876e49c90c4 --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/single_endpoint/stream_id/output.yaml @@ -0,0 +1,101 @@ +resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: first.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 80 + asDouble: 444 + attributes: + - key: bbb + value: + stringValue: ccc + - name: second.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 555 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 80 + asDouble: 666 + attributes: + - key: bbb + value: + stringValue: ccc + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: bar + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: first.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 80 + asDouble: 444 + attributes: + - key: aaa + value: + stringValue: bbb + - name: second.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 555 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 80 + asDouble: 666 + attributes: + - key: bbb + value: + stringValue: ccc diff --git a/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/triple_endpoint/metric_name/input.yaml b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/triple_endpoint/metric_name/input.yaml new file mode 100644 index 000000000000..481b8d7ab629 --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/triple_endpoint/metric_name/input.yaml @@ -0,0 +1,99 @@ +resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: first.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - name: second.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 945 + attributes: + - key: aaa + value: + stringValue: bbb + - name: third.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 945 + attributes: + - key: aaa + value: + stringValue: bbb + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: bar + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: first.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 80 + asDouble: 444 + attributes: + - key: aaa + value: + stringValue: bbb + - name: second.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 80 + asDouble: 1000 + attributes: + - key: aaa + value: + stringValue: bbb + - name: third.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 80 + asDouble: 1000 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/triple_endpoint/metric_name/output.yaml b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/triple_endpoint/metric_name/output.yaml new file mode 100644 index 000000000000..30dad4b27d7c --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/triple_endpoint/metric_name/output.yaml @@ -0,0 +1,168 @@ +endpoint-1: + resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: third.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 945 + attributes: + - key: aaa + value: + stringValue: bbb + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: bar + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: third.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 80 + asDouble: 1000 + attributes: + - key: aaa + value: + stringValue: bbb +endpoint-2: + resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: first.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: bar + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: first.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 80 + asDouble: 444 + attributes: + - key: aaa + value: + stringValue: bbb +endpoint-3: + resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: second.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 945 + attributes: + - key: aaa + value: + stringValue: bbb + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: bar + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: second.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 80 + asDouble: 1000 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/triple_endpoint/resource_id/input.yaml b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/triple_endpoint/resource_id/input.yaml new file mode 100644 index 000000000000..c680eb718fc7 --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/triple_endpoint/resource_id/input.yaml @@ -0,0 +1,82 @@ +resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: bar + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 80 + asDouble: 555 + attributes: + - key: aaa + value: + stringValue: bbb + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: asdf + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 90 + asDouble: 666 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/triple_endpoint/resource_id/output.yaml b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/triple_endpoint/resource_id/output.yaml new file mode 100644 index 000000000000..27fdc9c8c65c --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/triple_endpoint/resource_id/output.yaml @@ -0,0 +1,87 @@ +endpoint-1: + resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: asdf + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 90 + asDouble: 666 + attributes: + - key: aaa + value: + stringValue: bbb +endpoint-2: + resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: bar + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 80 + asDouble: 555 + attributes: + - key: aaa + value: + stringValue: bbb +endpoint-3: + resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/triple_endpoint/resource_service_name/input.yaml b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/triple_endpoint/resource_service_name/input.yaml new file mode 100644 index 000000000000..e740ad01eefc --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/triple_endpoint/resource_service_name/input.yaml @@ -0,0 +1,82 @@ +resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: service.name + value: + stringValue: serviceA + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: service.name + value: + stringValue: serviceB + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 80 + asDouble: 555 + attributes: + - key: aaa + value: + stringValue: bbb + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: service.name + value: + stringValue: serviceC + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 90 + asDouble: 666 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/triple_endpoint/resource_service_name/output.yaml b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/triple_endpoint/resource_service_name/output.yaml new file mode 100644 index 000000000000..848796eb1cad --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/triple_endpoint/resource_service_name/output.yaml @@ -0,0 +1,87 @@ +endpoint-1: + resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: service.name + value: + stringValue: serviceA + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: service.name + value: + stringValue: serviceB + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 80 + asDouble: 555 + attributes: + - key: aaa + value: + stringValue: bbb +endpoint-2: + resourceMetrics: [] +endpoint-3: + resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: service.name + value: + stringValue: serviceC + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 90 + asDouble: 666 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/triple_endpoint/stream_id/input.yaml b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/triple_endpoint/stream_id/input.yaml new file mode 100644 index 000000000000..6876e49c90c4 --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/triple_endpoint/stream_id/input.yaml @@ -0,0 +1,101 @@ +resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: first.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 80 + asDouble: 444 + attributes: + - key: bbb + value: + stringValue: ccc + - name: second.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 555 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 80 + asDouble: 666 + attributes: + - key: bbb + value: + stringValue: ccc + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: bar + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: first.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 80 + asDouble: 444 + attributes: + - key: aaa + value: + stringValue: bbb + - name: second.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 555 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 80 + asDouble: 666 + attributes: + - key: bbb + value: + stringValue: ccc diff --git a/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/triple_endpoint/stream_id/output.yaml b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/triple_endpoint/stream_id/output.yaml new file mode 100644 index 000000000000..5cd6c00ae95d --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/consume_metrics/triple_endpoint/stream_id/output.yaml @@ -0,0 +1,123 @@ +endpoint-1: + resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: first.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 80 + asDouble: 444 + attributes: + - key: bbb + value: + stringValue: ccc + + - name: second.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 555 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 80 + asDouble: 666 + attributes: + - key: bbb + value: + stringValue: ccc +endpoint-2: + resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: bar + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: second.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 555 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 80 + asDouble: 666 + attributes: + - key: bbb + value: + stringValue: ccc +endpoint-3: + resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: bar + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: first.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 80 + asDouble: 444 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/exporter/loadbalancingexporter/testdata/metrics/split_metrics/basic_metric_name/input.yaml b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/basic_metric_name/input.yaml new file mode 100644 index 000000000000..23a11f0fa726 --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/basic_metric_name/input.yaml @@ -0,0 +1,77 @@ +resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: first.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - name: second.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 945 + attributes: + - key: aaa + value: + stringValue: bbb + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: bar + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: first.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - name: second.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 945 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/exporter/loadbalancingexporter/testdata/metrics/split_metrics/basic_metric_name/output.yaml b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/basic_metric_name/output.yaml new file mode 100644 index 000000000000..59f0ad62b030 --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/basic_metric_name/output.yaml @@ -0,0 +1,112 @@ +first.monotonic.sum: + resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: first.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: bar + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: first.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb +second.monotonic.sum: + resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: second.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 945 + attributes: + - key: aaa + value: + stringValue: bbb + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: bar + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: second.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 945 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/exporter/loadbalancingexporter/testdata/metrics/split_metrics/basic_resource_id/input.yaml b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/basic_resource_id/input.yaml new file mode 100644 index 000000000000..ac105660c678 --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/basic_resource_id/input.yaml @@ -0,0 +1,55 @@ +resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: bar + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/exporter/loadbalancingexporter/testdata/metrics/split_metrics/basic_resource_id/output.yaml b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/basic_resource_id/output.yaml new file mode 100644 index 000000000000..8c065a1805f0 --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/basic_resource_id/output.yaml @@ -0,0 +1,58 @@ +resource/99d9e3f8e25dd8f6: + resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb +resource/561be85f9d0f9beb: + resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: bar + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/exporter/loadbalancingexporter/testdata/metrics/split_metrics/basic_resource_service_name/input.yaml b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/basic_resource_service_name/input.yaml new file mode 100644 index 000000000000..ea96dce95939 --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/basic_resource_service_name/input.yaml @@ -0,0 +1,55 @@ +resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: service.name + value: + stringValue: serviceA + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: service.name + value: + stringValue: serviceB + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 80 + asDouble: 555 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/exporter/loadbalancingexporter/testdata/metrics/split_metrics/basic_resource_service_name/output.yaml b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/basic_resource_service_name/output.yaml new file mode 100644 index 000000000000..d44a7d4086da --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/basic_resource_service_name/output.yaml @@ -0,0 +1,58 @@ +serviceA: + resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: service.name + value: + stringValue: serviceA + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb +serviceB: + resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: service.name + value: + stringValue: serviceB + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 80 + asDouble: 555 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/exporter/loadbalancingexporter/testdata/metrics/split_metrics/basic_stream_id/input.yaml b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/basic_stream_id/input.yaml new file mode 100644 index 000000000000..6876e49c90c4 --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/basic_stream_id/input.yaml @@ -0,0 +1,101 @@ +resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: first.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 80 + asDouble: 444 + attributes: + - key: bbb + value: + stringValue: ccc + - name: second.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 555 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 80 + asDouble: 666 + attributes: + - key: bbb + value: + stringValue: ccc + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: bar + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: first.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 80 + asDouble: 444 + attributes: + - key: aaa + value: + stringValue: bbb + - name: second.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 555 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 80 + asDouble: 666 + attributes: + - key: bbb + value: + stringValue: ccc diff --git a/exporter/loadbalancingexporter/testdata/metrics/split_metrics/basic_stream_id/output.yaml b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/basic_stream_id/output.yaml new file mode 100644 index 000000000000..df85ab9e3b16 --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/basic_stream_id/output.yaml @@ -0,0 +1,209 @@ +stream/770305850f3632c4: + resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: first.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb +stream/df3ac8f1f36e5836: + resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: first.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 80 + asDouble: 444 + attributes: + - key: bbb + value: + stringValue: ccc +stream/10f62caa42f23208: + resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: second.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 555 + attributes: + - key: aaa + value: + stringValue: bbb +stream/a6cee13bcfa90742: + resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: second.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 80 + asDouble: 666 + attributes: + - key: bbb + value: + stringValue: ccc +stream/94a1b62d162da7e3: + resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: bar + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: first.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 80 + asDouble: 444 + attributes: + - key: aaa + value: + stringValue: bbb +stream/33c7b4e4b72e9f19: + resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: bar + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: second.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 555 + attributes: + - key: aaa + value: + stringValue: bbb +stream/f1a737c32030b2ff: + resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: bar + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: second.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 80 + asDouble: 666 + attributes: + - key: bbb + value: + stringValue: ccc diff --git a/exporter/loadbalancingexporter/testdata/metrics/split_metrics/duplicate_metric_name/input.yaml b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/duplicate_metric_name/input.yaml new file mode 100644 index 000000000000..fc56857343a3 --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/duplicate_metric_name/input.yaml @@ -0,0 +1,77 @@ +resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 80 + asDouble: 444 + attributes: + - key: aaa + value: + stringValue: bbb + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 120 + asDouble: 555 + attributes: + - key: aaa + value: + stringValue: bbb + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 150 + asDouble: 945 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/exporter/loadbalancingexporter/testdata/metrics/split_metrics/duplicate_metric_name/output.yaml b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/duplicate_metric_name/output.yaml new file mode 100644 index 000000000000..95cf91293989 --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/duplicate_metric_name/output.yaml @@ -0,0 +1,47 @@ +cumulative.monotonic.sum: + resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 80 + asDouble: 444 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 120 + asDouble: 555 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 150 + asDouble: 945 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/exporter/loadbalancingexporter/testdata/metrics/split_metrics/duplicate_resource_id/input.yaml b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/duplicate_resource_id/input.yaml new file mode 100644 index 000000000000..7d8e24c2cfb8 --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/duplicate_resource_id/input.yaml @@ -0,0 +1,55 @@ +resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 80 + asDouble: 555 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/exporter/loadbalancingexporter/testdata/metrics/split_metrics/duplicate_resource_id/output.yaml b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/duplicate_resource_id/output.yaml new file mode 100644 index 000000000000..a7ffc97394e7 --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/duplicate_resource_id/output.yaml @@ -0,0 +1,35 @@ +resource/99d9e3f8e25dd8f6: + resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 80 + asDouble: 555 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/exporter/loadbalancingexporter/testdata/metrics/split_metrics/duplicate_resource_service_name/input.yaml b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/duplicate_resource_service_name/input.yaml new file mode 100644 index 000000000000..1a0a17714a3a --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/duplicate_resource_service_name/input.yaml @@ -0,0 +1,55 @@ +resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: service.name + value: + stringValue: serviceA + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: service.name + value: + stringValue: serviceA + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 80 + asDouble: 555 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/exporter/loadbalancingexporter/testdata/metrics/split_metrics/duplicate_resource_service_name/output.yaml b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/duplicate_resource_service_name/output.yaml new file mode 100644 index 000000000000..0ad35224eb9a --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/duplicate_resource_service_name/output.yaml @@ -0,0 +1,35 @@ +serviceA: + resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: service.name + value: + stringValue: serviceA + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 80 + asDouble: 555 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/exporter/loadbalancingexporter/testdata/metrics/split_metrics/duplicate_stream_id/input.yaml b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/duplicate_stream_id/input.yaml new file mode 100644 index 000000000000..4a0b1f381941 --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/duplicate_stream_id/input.yaml @@ -0,0 +1,119 @@ +resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 80 + asDouble: 444 + attributes: + - key: bbb + value: + stringValue: ccc + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 60 + asDouble: 444 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 90 + asDouble: 555 + attributes: + - key: bbb + value: + stringValue: ccc + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 70 + asDouble: 555 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 100 + asDouble: 666 + attributes: + - key: bbb + value: + stringValue: ccc + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 80 + asDouble: 666 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 110 + asDouble: 777 + attributes: + - key: bbb + value: + stringValue: ccc diff --git a/exporter/loadbalancingexporter/testdata/metrics/split_metrics/duplicate_stream_id/output.yaml b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/duplicate_stream_id/output.yaml new file mode 100644 index 000000000000..ee74b580e62b --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/duplicate_stream_id/output.yaml @@ -0,0 +1,94 @@ +stream/c7006b564eec22c9: + resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 60 + asDouble: 444 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 70 + asDouble: 555 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 80 + asDouble: 666 + attributes: + - key: aaa + value: + stringValue: bbb +stream/e2d32621d2dcda0f: + resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_key + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 80 + asDouble: 444 + attributes: + - key: bbb + value: + stringValue: ccc + - timeUnixNano: 90 + asDouble: 555 + attributes: + - key: bbb + value: + stringValue: ccc + - timeUnixNano: 100 + asDouble: 666 + attributes: + - key: bbb + value: + stringValue: ccc + - timeUnixNano: 110 + asDouble: 777 + attributes: + - key: bbb + value: + stringValue: ccc diff --git a/exporter/loadbalancingexporter/testdata/metrics/split_metrics/missing_service_name/input.yaml b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/missing_service_name/input.yaml new file mode 100644 index 000000000000..c2063568128d --- /dev/null +++ b/exporter/loadbalancingexporter/testdata/metrics/split_metrics/missing_service_name/input.yaml @@ -0,0 +1,28 @@ +resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: resource_label + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: scope_key + value: + stringValue: foo + metrics: + - name: cumulative.monotonic.sum + sum: + aggregationTemporality: 2 + isMonotonic: true + dataPoints: + - timeUnixNano: 50 + asDouble: 333 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/exporter/loadbalancingexporter/trace_exporter.go b/exporter/loadbalancingexporter/trace_exporter.go index 25d394514c86..baeb1778cb41 100644 --- a/exporter/loadbalancingexporter/trace_exporter.go +++ b/exporter/loadbalancingexporter/trace_exporter.go @@ -10,15 +10,16 @@ import ( "sync" "time" - "go.opencensus.io/stats" - "go.opencensus.io/tag" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/exporter" "go.opentelemetry.io/collector/exporter/otlpexporter" "go.opentelemetry.io/collector/pdata/ptrace" + "go.opentelemetry.io/otel/metric" "go.uber.org/multierr" + "go.uber.org/zap" + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter/internal/metadata" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal" ) @@ -31,45 +32,53 @@ type traceExporterImp struct { routingKey routingKey routingResourceKeys []string + logger *zap.Logger stopped bool shutdownWg sync.WaitGroup + telemetry *metadata.TelemetryBuilder } // Create new traces exporter -func newTracesExporter(params exporter.CreateSettings, cfg component.Config) (*traceExporterImp, error) { +func newTracesExporter(params exporter.Settings, cfg component.Config) (*traceExporterImp, error) { + telemetry, err := metadata.NewTelemetryBuilder(params.TelemetrySettings) + if err != nil { + return nil, err + } + exporterFactory := otlpexporter.NewFactory() + cfFunc := func(ctx context.Context, endpoint string) (component.Component, error) { + oCfg := buildExporterConfig(cfg.(*Config), endpoint) + oParams := buildExporterSettings(params, endpoint) + + return exporterFactory.CreateTraces(ctx, oParams, &oCfg) + } - eCfg := cfg.(*Config) - lb, err := newLoadBalancer(params, cfg, func(ctx context.Context, endpoint string) (component.Component, error) { - oCfg := buildExporterConfig(eCfg, endpoint) - return exporterFactory.CreateTracesExporter(ctx, params, &oCfg) - }) + lb, err := newLoadBalancer(params.Logger, cfg, cfFunc, telemetry) if err != nil { return nil, err } - traceExporter := traceExporterImp{loadBalancer: lb, routingKey: traceIDRouting} + traceExporter := traceExporterImp{ + loadBalancer: lb, + routingKey: traceIDRouting, + telemetry: telemetry, + logger: params.Logger, + } - switch eCfg.RoutingKey { - case "service": + switch cfg.(*Config).RoutingKey { + case svcRoutingStr: traceExporter.routingKey = resourceKeysRouting traceExporter.routingResourceKeys = []string{"service.name"} - case "resource": + case resourceKeysRoutingStr: traceExporter.routingKey = resourceKeysRouting - traceExporter.routingResourceKeys = eCfg.ResourceKeys - case "traceID", "": + traceExporter.routingResourceKeys = cfg.(*Config).ResourceKeys + case traceIDRoutingStr, "": default: return nil, fmt.Errorf("unsupported routing_key: %s", cfg.(*Config).RoutingKey) } return &traceExporter, nil } -func buildExporterConfig(cfg *Config, endpoint string) otlpexporter.Config { - oCfg := cfg.Protocol.OTLP - oCfg.Endpoint = endpoint - return oCfg -} - func (e *traceExporterImp) Capabilities() consumer.Capabilities { return consumer.Capabilities{MutatesData: false} } @@ -121,17 +130,12 @@ func (e *traceExporterImp) ConsumeTraces(ctx context.Context, td ptrace.Traces) exp.consumeWG.Done() errs = multierr.Append(errs, err) duration := time.Since(start) - + e.telemetry.LoadbalancerBackendLatency.Record(ctx, duration.Milliseconds(), metric.WithAttributeSet(exp.endpointAttr)) if err == nil { - _ = stats.RecordWithTags( - ctx, - []tag.Mutator{tag.Upsert(endpointTagKey, endpoints[exp]), successTrueMutator}, - mBackendLatency.M(duration.Milliseconds())) + e.telemetry.LoadbalancerBackendOutcome.Add(ctx, 1, metric.WithAttributeSet(exp.successAttr)) } else { - _ = stats.RecordWithTags( - ctx, - []tag.Mutator{tag.Upsert(endpointTagKey, endpoints[exp]), successFalseMutator}, - mBackendLatency.M(duration.Milliseconds())) + e.telemetry.LoadbalancerBackendOutcome.Add(ctx, 1, metric.WithAttributeSet(exp.failureAttr)) + e.logger.Debug("failed to export traces", zap.Error(err)) } } diff --git a/exporter/loadbalancingexporter/trace_exporter_test.go b/exporter/loadbalancingexporter/trace_exporter_test.go index 2deb4b5ff3e6..2d2f95f2050a 100644 --- a/exporter/loadbalancingexporter/trace_exporter_test.go +++ b/exporter/loadbalancingexporter/trace_exporter_test.go @@ -9,7 +9,6 @@ import ( "fmt" "math/rand" "net" - "path/filepath" "sync" "sync/atomic" "testing" @@ -23,14 +22,9 @@ import ( "go.opentelemetry.io/collector/consumer/consumertest" "go.opentelemetry.io/collector/exporter" "go.opentelemetry.io/collector/exporter/exportertest" - "go.opentelemetry.io/collector/exporter/otlpexporter" - "go.opentelemetry.io/collector/otelcol/otelcoltest" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.9.0" - "go.uber.org/zap" - - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter/internal/metadata" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" ) func TestNewTracesExporter(t *testing.T) { @@ -72,7 +66,7 @@ func TestNewTracesExporter(t *testing.T) { } { t.Run(tt.desc, func(t *testing.T) { // test - te, err := newTracesExporter(exportertest.NewNopCreateSettings(), tt.config) + te, err := newTracesExporter(exportertest.NewNopSettings(), tt.config) // verify require.Equal(t, tt.err, err) @@ -94,7 +88,7 @@ func TestTracesExporterStart(t *testing.T) { { "ok", func() *traceExporterImp { - p, _ := newTracesExporter(exportertest.NewNopCreateSettings(), simpleConfig()) + p, _ := newTracesExporter(exportertest.NewNopSettings(), simpleConfig()) return p }(), nil, @@ -102,8 +96,9 @@ func TestTracesExporterStart(t *testing.T) { { "error", func() *traceExporterImp { - lb, _ := newLoadBalancer(exportertest.NewNopCreateSettings(), simpleConfig(), nil) - p, _ := newTracesExporter(exportertest.NewNopCreateSettings(), simpleConfig()) + ts, tb := getTelemetryAssets(t) + lb, _ := newLoadBalancer(ts.Logger, simpleConfig(), nil, tb) + p, _ := newTracesExporter(ts, simpleConfig()) lb.res = &mockResolver{ onStart: func(context.Context) error { @@ -133,7 +128,7 @@ func TestTracesExporterStart(t *testing.T) { } func TestTracesExporterShutdown(t *testing.T) { - p, err := newTracesExporter(exportertest.NewNopCreateSettings(), simpleConfig()) + p, err := newTracesExporter(exportertest.NewNopSettings(), simpleConfig()) require.NotNil(t, p) require.NoError(t, err) @@ -141,21 +136,22 @@ func TestTracesExporterShutdown(t *testing.T) { res := p.Shutdown(context.Background()) // verify - assert.Nil(t, res) + assert.NoError(t, res) } func TestConsumeTraces(t *testing.T) { + ts, tb := getTelemetryAssets(t) componentFactory := func(_ context.Context, _ string) (component.Component, error) { return newNopMockTracesExporter(), nil } - lb, err := newLoadBalancer(exportertest.NewNopCreateSettings(), simpleConfig(), componentFactory) + lb, err := newLoadBalancer(ts.Logger, simpleConfig(), componentFactory, tb) require.NotNil(t, lb) require.NoError(t, err) - p, err := newTracesExporter(exportertest.NewNopCreateSettings(), simpleConfig()) + p, err := newTracesExporter(ts, simpleConfig()) require.NotNil(t, p) require.NoError(t, err) - assert.Equal(t, p.routingKey, traceIDRouting) + assert.Equal(t, traceIDRouting, p.routingKey) // pre-load an exporter here, so that we don't use the actual OTLP exporter lb.addMissingExporters(context.Background(), []string{"endpoint-1"}) @@ -177,32 +173,33 @@ func TestConsumeTraces(t *testing.T) { res := p.ConsumeTraces(context.Background(), simpleTraces()) // verify - assert.Nil(t, res) + assert.NoError(t, res) } // This test validates that exporter is can concurrently change the endpoints while consuming traces. func TestConsumeTraces_ConcurrentResolverChange(t *testing.T) { + ts, tb := getTelemetryAssets(t) consumeStarted := make(chan struct{}) consumeDone := make(chan struct{}) // imitate a slow exporter - te := &mockTracesExporter{Component: mockComponent{}} - te.ConsumeTracesFn = func(_ context.Context, _ ptrace.Traces) error { - close(consumeStarted) - time.Sleep(50 * time.Millisecond) - return te.consumeErr - } componentFactory := func(_ context.Context, _ string) (component.Component, error) { + te := &mockTracesExporter{Component: mockComponent{}} + te.ConsumeTracesFn = func(_ context.Context, _ ptrace.Traces) error { + close(consumeStarted) + time.Sleep(50 * time.Millisecond) + return te.consumeErr + } return te, nil } - lb, err := newLoadBalancer(exportertest.NewNopCreateSettings(), simpleConfig(), componentFactory) + lb, err := newLoadBalancer(ts.Logger, simpleConfig(), componentFactory, tb) require.NotNil(t, lb) require.NoError(t, err) - p, err := newTracesExporter(exportertest.NewNopCreateSettings(), simpleConfig()) + p, err := newTracesExporter(ts, simpleConfig()) require.NotNil(t, p) require.NoError(t, err) - assert.Equal(t, p.routingKey, traceIDRouting) + assert.Equal(t, traceIDRouting, p.routingKey) endpoints := []string{"endpoint-1"} lb.res = &mockResolver{ @@ -234,18 +231,19 @@ func TestConsumeTraces_ConcurrentResolverChange(t *testing.T) { } func TestConsumeTracesServiceBased(t *testing.T) { + ts, tb := getTelemetryAssets(t) componentFactory := func(_ context.Context, _ string) (component.Component, error) { return newNopMockTracesExporter(), nil } - lb, err := newLoadBalancer(exportertest.NewNopCreateSettings(), serviceBasedRoutingConfig(), componentFactory) + lb, err := newLoadBalancer(ts.Logger, serviceBasedRoutingConfig(), componentFactory, tb) require.NotNil(t, lb) require.NoError(t, err) - p, err := newTracesExporter(exportertest.NewNopCreateSettings(), serviceBasedRoutingConfig()) + p, err := newTracesExporter(ts, serviceBasedRoutingConfig()) require.NotNil(t, p) require.NoError(t, err) - assert.Equal(t, p.routingKey, resourceKeysRouting) - assert.Equal(t, p.routingResourceKeys, []string{"service.name"}) + assert.Equal(t, resourceKeysRouting, p.routingKey) + assert.Equal(t, []string{"service.name"}, p.routingResourceKeys) // pre-load an exporter here, so that we don't use the actual OTLP exporter lb.addMissingExporters(context.Background(), []string{"endpoint-1"}) @@ -268,18 +266,19 @@ func TestConsumeTracesServiceBased(t *testing.T) { res := p.ConsumeTraces(context.Background(), simpleTracesWithServiceName()) // verify - assert.Nil(t, res) + assert.NoError(t, res) } func TestConsumeTracesResourceKeysBased(t *testing.T) { + ts, tb := getTelemetryAssets(t) componentFactory := func(_ context.Context, _ string) (component.Component, error) { return newNopMockTracesExporter(), nil } - lb, err := newLoadBalancer(exportertest.NewNopCreateSettings(), resourceKeysBasedRoutingConfig(), componentFactory) + lb, err := newLoadBalancer(ts.Logger, resourceKeysBasedRoutingConfig(), componentFactory, tb) require.NotNil(t, lb) require.NoError(t, err) - p, err := newTracesExporter(exportertest.NewNopCreateSettings(), resourceKeysBasedRoutingConfig()) + p, err := newTracesExporter(ts, resourceKeysBasedRoutingConfig()) require.NotNil(t, p) require.NoError(t, err) assert.Equal(t, p.routingKey, resourceKeysRouting) @@ -306,7 +305,7 @@ func TestConsumeTracesResourceKeysBased(t *testing.T) { res := p.ConsumeTraces(context.Background(), simpleTracesWithResourceKeys()) // verify - assert.Nil(t, res) + assert.NoError(t, res) } func TestServiceBasedRoutingForSameTraceId(t *testing.T) { @@ -378,21 +377,22 @@ func TestResourceKeysBasedRoutingIdentifiers(t *testing.T) { } { t.Run(tt.desc, func(t *testing.T) { res, err := tt.te.routingIdentifiersFromTraces(tt.batch) - assert.Equal(t, err, nil) + assert.NoError(t, err) assert.Equal(t, res, tt.res) }) } } func TestConsumeTracesExporterNoEndpoint(t *testing.T) { + ts, tb := getTelemetryAssets(t) componentFactory := func(_ context.Context, _ string) (component.Component, error) { return newNopMockTracesExporter(), nil } - lb, err := newLoadBalancer(exportertest.NewNopCreateSettings(), simpleConfig(), componentFactory) + lb, err := newLoadBalancer(ts.Logger, simpleConfig(), componentFactory, tb) require.NotNil(t, lb) require.NoError(t, err) - p, err := newTracesExporter(exportertest.NewNopCreateSettings(), simpleConfig()) + p, err := newTracesExporter(ts, simpleConfig()) require.NotNil(t, p) require.NoError(t, err) @@ -419,14 +419,15 @@ func TestConsumeTracesExporterNoEndpoint(t *testing.T) { } func TestConsumeTracesUnexpectedExporterType(t *testing.T) { + ts, tb := getTelemetryAssets(t) componentFactory := func(_ context.Context, _ string) (component.Component, error) { return newNopMockExporter(), nil } - lb, err := newLoadBalancer(exportertest.NewNopCreateSettings(), simpleConfig(), componentFactory) + lb, err := newLoadBalancer(ts.Logger, simpleConfig(), componentFactory, tb) require.NotNil(t, lb) require.NoError(t, err) - p, err := newTracesExporter(exportertest.NewNopCreateSettings(), simpleConfig()) + p, err := newTracesExporter(ts, simpleConfig()) require.NotNil(t, p) require.NoError(t, err) @@ -454,44 +455,17 @@ func TestConsumeTracesUnexpectedExporterType(t *testing.T) { assert.EqualError(t, res, fmt.Sprintf("unable to export traces, unexpected exporter type: expected exporter.Traces but got %T", newNopMockExporter())) } -func TestBuildExporterConfig(t *testing.T) { - // prepare - factories, err := otelcoltest.NopFactories() - require.NoError(t, err) - - factories.Exporters[metadata.Type] = NewFactory() - - cfg, err := otelcoltest.LoadConfigAndValidate(filepath.Join("testdata", "test-build-exporter-config.yaml"), factories) - require.NoError(t, err) - require.NotNil(t, cfg) - - c := cfg.Exporters[component.NewID(metadata.Type)] - require.NotNil(t, c) - - // test - defaultCfg := otlpexporter.NewFactory().CreateDefaultConfig().(*otlpexporter.Config) - exporterCfg := buildExporterConfig(c.(*Config), "the-endpoint") - - // verify - grpcSettings := defaultCfg.ClientConfig - grpcSettings.Endpoint = "the-endpoint" - assert.Equal(t, grpcSettings, exporterCfg.ClientConfig) - - assert.Equal(t, defaultCfg.TimeoutSettings, exporterCfg.TimeoutSettings) - assert.Equal(t, defaultCfg.QueueConfig, exporterCfg.QueueConfig) - assert.Equal(t, defaultCfg.RetryConfig, exporterCfg.RetryConfig) -} - func TestBatchWithTwoTraces(t *testing.T) { + ts, tb := getTelemetryAssets(t) sink := new(consumertest.TracesSink) componentFactory := func(_ context.Context, _ string) (component.Component, error) { return newMockTracesExporter(sink.ConsumeTraces), nil } - lb, err := newLoadBalancer(exportertest.NewNopCreateSettings(), simpleConfig(), componentFactory) + lb, err := newLoadBalancer(ts.Logger, simpleConfig(), componentFactory, tb) require.NotNil(t, lb) require.NoError(t, err) - p, err := newTracesExporter(exportertest.NewNopCreateSettings(), simpleConfig()) + p, err := newTracesExporter(ts, simpleConfig()) require.NotNil(t, p) require.NoError(t, err) @@ -510,7 +484,7 @@ func TestBatchWithTwoTraces(t *testing.T) { // verify assert.NoError(t, err) assert.Len(t, sink.AllTraces(), 1) - assert.Equal(t, sink.AllTraces()[0].SpanCount(), 2) + assert.Equal(t, 2, sink.AllTraces()[0].SpanCount()) } func TestNoTracesInBatch(t *testing.T) { @@ -563,6 +537,7 @@ func TestNoTracesInBatch(t *testing.T) { func TestRollingUpdatesWhenConsumeTraces(t *testing.T) { t.Skip("Flaky Test - See https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/13331") + ts, tb := getTelemetryAssets(t) // this test is based on the discussion in the following issue for this exporter: // https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/1690 @@ -570,7 +545,7 @@ func TestRollingUpdatesWhenConsumeTraces(t *testing.T) { // simulate rolling updates, the dns resolver should resolve in the following order // ["127.0.0.1"] -> ["127.0.0.1", "127.0.0.2"] -> ["127.0.0.2"] - res, err := newDNSResolver(zap.NewNop(), "service-1", "", 5*time.Second, 1*time.Second) + res, err := newDNSResolver(ts.Logger, "service-1", "", 5*time.Second, 1*time.Second, tb) require.NoError(t, err) mu := sync.Mutex{} @@ -621,11 +596,11 @@ func TestRollingUpdatesWhenConsumeTraces(t *testing.T) { componentFactory := func(_ context.Context, _ string) (component.Component, error) { return newNopMockTracesExporter(), nil } - lb, err := newLoadBalancer(exportertest.NewNopCreateSettings(), cfg, componentFactory) + lb, err := newLoadBalancer(ts.Logger, cfg, componentFactory, tb) require.NotNil(t, lb) require.NoError(t, err) - p, err := newTracesExporter(exportertest.NewNopCreateSettings(), cfg) + p, err := newTracesExporter(ts, cfg) require.NotNil(t, p) require.NoError(t, err) @@ -634,17 +609,19 @@ func TestRollingUpdatesWhenConsumeTraces(t *testing.T) { counter1 := &atomic.Int64{} counter2 := &atomic.Int64{} + id1 := "127.0.0.1:4317" + id2 := "127.0.0.2:4317" defaultExporters := map[string]*wrappedExporter{ - "127.0.0.1:4317": newWrappedExporter(newMockTracesExporter(func(_ context.Context, _ ptrace.Traces) error { + id1: newWrappedExporter(newMockTracesExporter(func(_ context.Context, _ ptrace.Traces) error { counter1.Add(1) // simulate an unreachable backend time.Sleep(10 * time.Second) return nil - })), - "127.0.0.2:4317": newWrappedExporter(newMockTracesExporter(func(_ context.Context, _ ptrace.Traces) error { + }), id1), + id2: newWrappedExporter(newMockTracesExporter(func(_ context.Context, _ ptrace.Traces) error { counter2.Add(1) return nil - })), + }), id2), } // test @@ -675,7 +652,7 @@ func TestRollingUpdatesWhenConsumeTraces(t *testing.T) { return case <-ticker.C: go func() { - require.NoError(t, p.ConsumeTraces(ctx, randomTraces())) + assert.NoError(t, p.ConsumeTraces(ctx, randomTraces())) }() } } @@ -697,11 +674,12 @@ func TestRollingUpdatesWhenConsumeTraces(t *testing.T) { mu.Lock() require.Equal(t, []string{"127.0.0.2"}, lastResolved) mu.Unlock() - require.Greater(t, counter1.Load(), int64(0)) - require.Greater(t, counter2.Load(), int64(0)) + require.Positive(t, counter1.Load()) + require.Positive(t, counter2.Load()) } func benchConsumeTraces(b *testing.B, endpointsCount int, tracesCount int) { + ts, tb := getTelemetryAssets(b) sink := new(consumertest.TracesSink) componentFactory := func(_ context.Context, _ string) (component.Component, error) { return newMockTracesExporter(sink.ConsumeTraces), nil @@ -718,11 +696,11 @@ func benchConsumeTraces(b *testing.B, endpointsCount int, tracesCount int) { }, } - lb, err := newLoadBalancer(exportertest.NewNopCreateSettings(), config, componentFactory) + lb, err := newLoadBalancer(ts.Logger, config, componentFactory, tb) require.NotNil(b, lb) require.NoError(b, err) - p, err := newTracesExporter(exportertest.NewNopCreateSettings(), config) + p, err := newTracesExporter(exportertest.NewNopSettings(), config) require.NotNil(b, p) require.NoError(b, err) diff --git a/exporter/loadbalancingexporter/wrapped_exporter.go b/exporter/loadbalancingexporter/wrapped_exporter.go index cb2491fc23ff..c6ca5f639850 100644 --- a/exporter/loadbalancingexporter/wrapped_exporter.go +++ b/exporter/loadbalancingexporter/wrapped_exporter.go @@ -13,6 +13,7 @@ import ( "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" + "go.opentelemetry.io/otel/attribute" ) // wrappedExporter is an exporter that waits for the data processing to complete before shutting down. @@ -20,10 +21,21 @@ import ( type wrappedExporter struct { component.Component consumeWG sync.WaitGroup + + // we store the attributes here for both cases, to avoid new allocations on the hot path + endpointAttr attribute.Set + successAttr attribute.Set + failureAttr attribute.Set } -func newWrappedExporter(exp component.Component) *wrappedExporter { - return &wrappedExporter{Component: exp} +func newWrappedExporter(exp component.Component, identifier string) *wrappedExporter { + ea := attribute.String("endpoint", identifier) + return &wrappedExporter{ + Component: exp, + endpointAttr: attribute.NewSet(ea), + successAttr: attribute.NewSet(ea, attribute.Bool("success", true)), + failureAttr: attribute.NewSet(ea, attribute.Bool("success", false)), + } } func (we *wrappedExporter) Shutdown(ctx context.Context) error { diff --git a/exporter/logicmonitorexporter/README.md b/exporter/logicmonitorexporter/README.md index f46d814434a8..f58df5019cd4 100644 --- a/exporter/logicmonitorexporter/README.md +++ b/exporter/logicmonitorexporter/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Flogicmonitor%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Flogicmonitor) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Flogicmonitor%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Flogicmonitor) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@bogdandrutu](https://www.github.com/bogdandrutu), [@khyatigandhi6](https://www.github.com/khyatigandhi6), [@avadhut123pisal](https://www.github.com/avadhut123pisal) | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib diff --git a/exporter/logicmonitorexporter/config.go b/exporter/logicmonitorexporter/config.go index f5625988288d..e6dd9fa8d08f 100644 --- a/exporter/logicmonitorexporter/config.go +++ b/exporter/logicmonitorexporter/config.go @@ -20,9 +20,9 @@ import ( type Config struct { confighttp.ClientConfig `mapstructure:",squash"` - exporterhelper.QueueSettings `mapstructure:"sending_queue"` - configretry.BackOffConfig `mapstructure:"retry_on_failure"` - ResourceToTelemetrySettings resourcetotelemetry.Settings `mapstructure:"resource_to_telemetry_conversion"` + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` + configretry.BackOffConfig `mapstructure:"retry_on_failure"` + ResourceToTelemetrySettings resourcetotelemetry.Settings `mapstructure:"resource_to_telemetry_conversion"` // ApiToken of Logicmonitor Platform APIToken APIToken `mapstructure:"api_token"` diff --git a/exporter/logicmonitorexporter/config_test.go b/exporter/logicmonitorexporter/config_test.go index 2e9cf01edca7..2791854b0f7c 100644 --- a/exporter/logicmonitorexporter/config_test.go +++ b/exporter/logicmonitorexporter/config_test.go @@ -103,7 +103,7 @@ func TestLoadConfig(t *testing.T) { id: component.NewIDWithName(metadata.Type, "apitoken"), expected: &Config{ BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), ClientConfig: confighttp.ClientConfig{ Endpoint: "https://company.logicmonitor.com/rest", }, @@ -117,7 +117,7 @@ func TestLoadConfig(t *testing.T) { id: component.NewIDWithName(metadata.Type, "bearertoken"), expected: &Config{ BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), ClientConfig: confighttp.ClientConfig{ Endpoint: "https://company.logicmonitor.com/rest", Headers: map[string]configopaque.String{ @@ -130,7 +130,7 @@ func TestLoadConfig(t *testing.T) { id: component.NewIDWithName(metadata.Type, "resource-mapping-op"), expected: &Config{ BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), ClientConfig: confighttp.ClientConfig{ Endpoint: "https://company.logicmonitor.com/rest", Headers: map[string]configopaque.String{ @@ -151,7 +151,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) @@ -173,7 +173,7 @@ func TestUnmarshal(t *testing.T) { "resource_mapping_op": "invalid_op", }, }), - err: "1 error(s) decoding:\n\n* error decoding 'logs.resource_mapping_op': unsupported mapping operation \"invalid_op\"", + err: "'logs.resource_mapping_op': unsupported mapping operation \"invalid_op\"", }, } @@ -181,9 +181,9 @@ func TestUnmarshal(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { cfg := f.CreateDefaultConfig().(*Config) - err := component.UnmarshalConfig(tt.configMap, cfg) + err := tt.configMap.Unmarshal(cfg) if err != nil || tt.err != "" { - assert.EqualError(t, err, tt.err) + assert.ErrorContains(t, err, tt.err) } else { assert.Equal(t, tt.cfg, cfg) } diff --git a/exporter/logicmonitorexporter/factory.go b/exporter/logicmonitorexporter/factory.go index e5c6e9c3f2db..e46cad35a113 100644 --- a/exporter/logicmonitorexporter/factory.go +++ b/exporter/logicmonitorexporter/factory.go @@ -30,15 +30,15 @@ func NewFactory() exporter.Factory { func createDefaultConfig() component.Config { return &Config{ BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), } } -func createLogsExporter(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (exporter.Logs, error) { +func createLogsExporter(ctx context.Context, set exporter.Settings, cfg component.Config) (exporter.Logs, error) { lmLogExp := newLogsExporter(ctx, cfg, set) c := cfg.(*Config) - return exporterhelper.NewLogsExporter( + return exporterhelper.NewLogs( ctx, set, cfg, @@ -50,11 +50,11 @@ func createLogsExporter(ctx context.Context, set exporter.CreateSettings, cfg co ) } -func createTracesExporter(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (exporter.Traces, error) { +func createTracesExporter(ctx context.Context, set exporter.Settings, cfg component.Config) (exporter.Traces, error) { lmTraceExp := newTracesExporter(ctx, cfg, set) c := cfg.(*Config) - return exporterhelper.NewTracesExporter( + return exporterhelper.NewTraces( ctx, set, cfg, diff --git a/exporter/logicmonitorexporter/factory_test.go b/exporter/logicmonitorexporter/factory_test.go index 4f03d0b61ad8..64fef6c2f00d 100644 --- a/exporter/logicmonitorexporter/factory_test.go +++ b/exporter/logicmonitorexporter/factory_test.go @@ -22,13 +22,13 @@ func TestCreateDefaultConfig(t *testing.T) { assert.Equal(t, &Config{ BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), }, cfg, "failed to create default config") assert.NoError(t, componenttest.CheckConfigStruct(cfg)) } -func TestCreateLogsExporter(t *testing.T) { +func TestCreateLogs(t *testing.T) { tests := []struct { name string config Config @@ -49,10 +49,10 @@ func TestCreateLogsExporter(t *testing.T) { t.Run(tt.name, func(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig().(*Config) - set := exportertest.NewNopCreateSettings() - oexp, err := factory.CreateLogsExporter(context.Background(), set, cfg) + set := exportertest.NewNopSettings() + oexp, err := factory.CreateLogs(context.Background(), set, cfg) if (err != nil) != tt.shouldError { - t.Errorf("CreateLogsExporter() error = %v, shouldError %v", err, tt.shouldError) + t.Errorf("CreateLogs() error = %v, shouldError %v", err, tt.shouldError) return } if tt.shouldError { @@ -68,7 +68,7 @@ func TestCreateLogsExporter(t *testing.T) { } } -func TestCreateTracesExporter(t *testing.T) { +func TestCreateTraces(t *testing.T) { tests := []struct { name string config Config @@ -89,10 +89,10 @@ func TestCreateTracesExporter(t *testing.T) { t.Run(tt.name, func(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig().(*Config) - set := exportertest.NewNopCreateSettings() - oexp, err := factory.CreateTracesExporter(context.Background(), set, cfg) + set := exportertest.NewNopSettings() + oexp, err := factory.CreateTraces(context.Background(), set, cfg) if (err != nil) != tt.shouldError { - t.Errorf("CreateTracesExporter() error = %v, shouldError %v", err, tt.shouldError) + t.Errorf("CreateTraces() error = %v, shouldError %v", err, tt.shouldError) return } if tt.shouldError { diff --git a/exporter/logicmonitorexporter/generated_component_test.go b/exporter/logicmonitorexporter/generated_component_test.go index 21e8bf739627..4d625d16e994 100644 --- a/exporter/logicmonitorexporter/generated_component_test.go +++ b/exporter/logicmonitorexporter/generated_component_test.go @@ -32,20 +32,20 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -57,21 +57,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(exporter.Logs) require.True(t, ok) diff --git a/exporter/logicmonitorexporter/go.mod b/exporter/logicmonitorexporter/go.mod index ee11dec89a8a..7f95efb124ef 100644 --- a/exporter/logicmonitorexporter/go.mod +++ b/exporter/logicmonitorexporter/go.mod @@ -1,77 +1,82 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/logicmonitorexporter -go 1.21.0 +go 1.22.0 require ( - github.com/logicmonitor/lm-data-sdk-go v1.3.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/confighttp v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/pdata/testdata v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/logicmonitor/lm-data-sdk-go v1.3.2 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/confighttp v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/pdata/testdata v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/rs/cors v1.10.1 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + github.com/rs/cors v1.11.1 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/configtls v1.22.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/logicmonitorexporter/go.sum b/exporter/logicmonitorexporter/go.sum index a83acfedcfd7..b003398010d7 100644 --- a/exporter/logicmonitorexporter/go.sum +++ b/exporter/logicmonitorexporter/go.sum @@ -1,25 +1,23 @@ -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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= @@ -33,20 +31,20 @@ 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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/logicmonitor/lm-data-sdk-go v1.3.0 h1:Obrexk35IKupFQezngkesR/kMfHQdAEUR1zYbJrOrzg= -github.com/logicmonitor/lm-data-sdk-go v1.3.0/go.mod h1:nIHr4uOPfg6AM7mG1rewg3L4O3rfge34o7UYB7joBM4= +github.com/logicmonitor/lm-data-sdk-go v1.3.2 h1:sgDRufUGd/EHQcKlip3Ak5km2Y6HfuwFGROinCSe+bI= +github.com/logicmonitor/lm-data-sdk-go v1.3.2/go.mod h1:Hp/eMI2wMmpUX0MP/ZIpx+4MUpwFmkPRkeEAXb+W+vk= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= @@ -56,78 +54,96 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -143,20 +159,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -165,12 +181,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/exporter/logicmonitorexporter/internal/logs/sender_test.go b/exporter/logicmonitorexporter/internal/logs/sender_test.go index 03624995987a..839b40ea9af1 100644 --- a/exporter/logicmonitorexporter/internal/logs/sender_test.go +++ b/exporter/logicmonitorexporter/internal/logs/sender_test.go @@ -21,7 +21,6 @@ import ( ) func TestSendLogs(t *testing.T) { - t.Run("should not return error", func(t *testing.T) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { response := lmsdklogs.LMLogIngestResponse{ @@ -64,7 +63,7 @@ func TestSendLogs(t *testing.T) { err = sender.SendLogs(ctx, []model.LogInput{logInput}) cancel() assert.Error(t, err) - assert.Equal(t, true, consumererror.IsPermanent(err)) + assert.True(t, consumererror.IsPermanent(err)) }) t.Run("should not return permanent failure error", func(t *testing.T) { @@ -87,7 +86,7 @@ func TestSendLogs(t *testing.T) { err = sender.SendLogs(ctx, []model.LogInput{logInput}) cancel() assert.Error(t, err) - assert.Equal(t, false, consumererror.IsPermanent(err)) + assert.False(t, consumererror.IsPermanent(err)) }) } diff --git a/exporter/logicmonitorexporter/internal/metadata/generated_status.go b/exporter/logicmonitorexporter/internal/metadata/generated_status.go index 126a32b9f7e9..7c208ba14e0f 100644 --- a/exporter/logicmonitorexporter/internal/metadata/generated_status.go +++ b/exporter/logicmonitorexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("logicmonitor") + Type = component.MustNewType("logicmonitor") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/logicmonitorexporter" ) const ( diff --git a/exporter/logicmonitorexporter/internal/metadata/generated_telemetry.go b/exporter/logicmonitorexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index 64d4d4a499b5..000000000000 --- a/exporter/logicmonitorexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/logicmonitor") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/logicmonitor") -} diff --git a/exporter/logicmonitorexporter/internal/metadata/generated_telemetry_test.go b/exporter/logicmonitorexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 53322d2440b0..000000000000 --- a/exporter/logicmonitorexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/logicmonitor", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/logicmonitor", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/logicmonitorexporter/internal/traces/sender_test.go b/exporter/logicmonitorexporter/internal/traces/sender_test.go index c9b07aafdf5f..ed1feacefdf4 100644 --- a/exporter/logicmonitorexporter/internal/traces/sender_test.go +++ b/exporter/logicmonitorexporter/internal/traces/sender_test.go @@ -64,7 +64,7 @@ func TestSendTraces(t *testing.T) { err = sender.SendTraces(ctx, testdata.GenerateTraces(1)) cancel() assert.Error(t, err) - assert.Equal(t, true, consumererror.IsPermanent(err)) + assert.True(t, consumererror.IsPermanent(err)) }) t.Run("should not return permanent failure error", func(t *testing.T) { @@ -86,6 +86,6 @@ func TestSendTraces(t *testing.T) { err = sender.SendTraces(ctx, testdata.GenerateTraces(1)) cancel() assert.Error(t, err) - assert.Equal(t, false, consumererror.IsPermanent(err)) + assert.False(t, consumererror.IsPermanent(err)) }) } diff --git a/exporter/logicmonitorexporter/logs_exporter.go b/exporter/logicmonitorexporter/logs_exporter.go index 8cadfb0b5cae..7c29b79597eb 100644 --- a/exporter/logicmonitorexporter/logs_exporter.go +++ b/exporter/logicmonitorexporter/logs_exporter.go @@ -36,7 +36,7 @@ type logExporter struct { } // Create new logicmonitor logs exporter -func newLogsExporter(_ context.Context, cfg component.Config, set exporter.CreateSettings) *logExporter { +func newLogsExporter(_ context.Context, cfg component.Config, set exporter.Settings) *logExporter { oCfg := cfg.(*Config) return &logExporter{ diff --git a/exporter/logicmonitorexporter/logs_exporter_test.go b/exporter/logicmonitorexporter/logs_exporter_test.go index 2fbace5657cb..50d8f5c2a634 100644 --- a/exporter/logicmonitorexporter/logs_exporter_test.go +++ b/exporter/logicmonitorexporter/logs_exporter_test.go @@ -49,7 +49,7 @@ func Test_NewLogsExporter(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - set := exportertest.NewNopCreateSettings() + set := exportertest.NewNopSettings() exp := newLogsExporter(context.Background(), tt.args.config, set) assert.NotNil(t, exp) }) @@ -106,7 +106,7 @@ func TestPushLogData(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { - set := exportertest.NewNopCreateSettings() + set := exportertest.NewNopSettings() exp := newLogsExporter(test.args.ctx, test.fields.config, set) require.NoError(t, exp.start(test.args.ctx, componenttest.NewNopHost())) diff --git a/exporter/logicmonitorexporter/metadata.yaml b/exporter/logicmonitorexporter/metadata.yaml index 3934ecea1bed..8f0d9e8365f6 100644 --- a/exporter/logicmonitorexporter/metadata.yaml +++ b/exporter/logicmonitorexporter/metadata.yaml @@ -1,5 +1,4 @@ type: logicmonitor -scope_name: otelcol/logicmonitor status: class: exporter diff --git a/exporter/logicmonitorexporter/traces_exporter.go b/exporter/logicmonitorexporter/traces_exporter.go index 3042eed0ca48..328c2cef44c8 100644 --- a/exporter/logicmonitorexporter/traces_exporter.go +++ b/exporter/logicmonitorexporter/traces_exporter.go @@ -23,7 +23,7 @@ type tracesExporter struct { } // newTracesExporter creates new Logicmonitor Traces Exporter. -func newTracesExporter(_ context.Context, cfg component.Config, set exporter.CreateSettings) *tracesExporter { +func newTracesExporter(_ context.Context, cfg component.Config, set exporter.Settings) *tracesExporter { oCfg := cfg.(*Config) // client construction is deferred to start diff --git a/exporter/logicmonitorexporter/traces_exporter_test.go b/exporter/logicmonitorexporter/traces_exporter_test.go index 27ce15ede5f0..460b9c7be501 100644 --- a/exporter/logicmonitorexporter/traces_exporter_test.go +++ b/exporter/logicmonitorexporter/traces_exporter_test.go @@ -26,7 +26,7 @@ func Test_NewTracesExporter(t *testing.T) { }, APIToken: APIToken{AccessID: "testid", AccessKey: "testkey"}, } - set := exportertest.NewNopCreateSettings() + set := exportertest.NewNopSettings() exp := newTracesExporter(context.Background(), config, set) assert.NotNil(t, exp) }) @@ -42,7 +42,7 @@ func TestPushTraceData(t *testing.T) { })) defer ts.Close() - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() f := NewFactory() config := &Config{ ClientConfig: confighttp.ClientConfig{ @@ -51,7 +51,7 @@ func TestPushTraceData(t *testing.T) { APIToken: APIToken{AccessID: "testid", AccessKey: "testkey"}, } ctx := context.Background() - exp, err := f.CreateTracesExporter(ctx, params, config) + exp, err := f.CreateTraces(ctx, params, config) assert.NoError(t, err) assert.NoError(t, exp.Start(ctx, componenttest.NewNopHost())) defer func() { assert.NoError(t, exp.Shutdown(ctx)) }() diff --git a/exporter/logzioexporter/README.md b/exporter/logzioexporter/README.md index 7becbc6f090a..c614d8c17b13 100644 --- a/exporter/logzioexporter/README.md +++ b/exporter/logzioexporter/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Flogzio%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Flogzio) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Flogzio%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Flogzio) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@yotamloe](https://www.github.com/yotamloe) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib diff --git a/exporter/logzioexporter/config.go b/exporter/logzioexporter/config.go index d0d12bfacc8e..74c53e495832 100644 --- a/exporter/logzioexporter/config.go +++ b/exporter/logzioexporter/config.go @@ -15,15 +15,15 @@ import ( // Config contains Logz.io specific configuration such as Account TracesToken, Region, etc. type Config struct { - confighttp.ClientConfig `mapstructure:",squash"` // confighttp client settings https://pkg.go.dev/go.opentelemetry.io/collector/config/confighttp#ClientConfig - exporterhelper.QueueSettings `mapstructure:"sending_queue"` // exporter helper queue settings https://pkg.go.dev/go.opentelemetry.io/collector/exporter/exporterhelper#QueueSettings - configretry.BackOffConfig `mapstructure:"retry_on_failure"` // exporter helper retry settings https://pkg.go.dev/go.opentelemetry.io/collector/exporter/exporterhelper#RetrySettings - Token configopaque.String `mapstructure:"account_token"` // Your Logz.io Account Token, can be found at https://app.logz.io/#/dashboard/settings/general - Region string `mapstructure:"region"` // Your Logz.io 2-letter region code, can be found at https://docs.logz.io/user-guide/accounts/account-region.html#available-regions - CustomEndpoint string `mapstructure:"custom_endpoint"` // **Deprecation** Custom endpoint to ship traces to. Use only for dev and tests. - DrainInterval int `mapstructure:"drain_interval"` // **Deprecation** Queue drain interval in seconds. Defaults to `3`. - QueueCapacity int64 `mapstructure:"queue_capacity"` // **Deprecation** Queue capacity in bytes. Defaults to `20 * 1024 * 1024` ~ 20mb. - QueueMaxLength int `mapstructure:"queue_max_length"` // **Deprecation** Max number of items allowed in the queue. Defaults to `500000`. + confighttp.ClientConfig `mapstructure:",squash"` // confighttp client settings https://pkg.go.dev/go.opentelemetry.io/collector/config/confighttp#ClientConfig + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` // exporter helper queue settings https://pkg.go.dev/go.opentelemetry.io/collector/exporter/exporterhelper#QueueSettings + configretry.BackOffConfig `mapstructure:"retry_on_failure"` // exporter helper retry settings https://pkg.go.dev/go.opentelemetry.io/collector/exporter/exporterhelper#RetrySettings + Token configopaque.String `mapstructure:"account_token"` // Your Logz.io Account Token, can be found at https://app.logz.io/#/dashboard/settings/general + Region string `mapstructure:"region"` // Your Logz.io 2-letter region code, can be found at https://docs.logz.io/user-guide/accounts/account-region.html#available-regions + CustomEndpoint string `mapstructure:"custom_endpoint"` // **Deprecation** Custom endpoint to ship traces to. Use only for dev and tests. + DrainInterval int `mapstructure:"drain_interval"` // **Deprecation** Queue drain interval in seconds. Defaults to `3`. + QueueCapacity int64 `mapstructure:"queue_capacity"` // **Deprecation** Queue capacity in bytes. Defaults to `20 * 1024 * 1024` ~ 20mb. + QueueMaxLength int `mapstructure:"queue_max_length"` // **Deprecation** Max number of items allowed in the queue. Defaults to `500000`. } func (c *Config) Validate() error { @@ -36,7 +36,7 @@ func (c *Config) Validate() error { // CheckAndWarnDeprecatedOptions Is checking for soon deprecated configuration options (queue_max_length, queue_capacity, drain_interval, custom_endpoint) log a warning message and map to the relevant updated option func (c *Config) checkAndWarnDeprecatedOptions(logger hclog.Logger) { if c.QueueCapacity != 0 { - logger.Warn("You are using the deprecated`queue_capacity` option that will be removed in the next release; use exporter helper configuration instead: https://github.com/open-telemetry/opentelemetry-collector/blob/main/exporter/exporterhelper/README.md") + logger.Warn("You are using the deprecated `queue_capacity` option that will be removed in the next release; use exporter helper configuration instead: https://github.com/open-telemetry/opentelemetry-collector/blob/main/exporter/exporterhelper/README.md") } // Warn and map queue_max_length -> QueueSettings.QueueSize if c.QueueMaxLength != 0 { diff --git a/exporter/logzioexporter/config_test.go b/exporter/logzioexporter/config_test.go index a85ca894239d..bf16dbe27644 100644 --- a/exporter/logzioexporter/config_test.go +++ b/exporter/logzioexporter/config_test.go @@ -13,7 +13,6 @@ import ( "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/config/configcompression" "go.opentelemetry.io/collector/config/confighttp" - "go.opentelemetry.io/collector/config/configopaque" "go.opentelemetry.io/collector/config/configretry" "go.opentelemetry.io/collector/confmap/confmaptest" "go.opentelemetry.io/collector/exporter/exporterhelper" @@ -30,7 +29,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "2").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) expected := &Config{ Token: "token", @@ -38,17 +37,13 @@ func TestLoadConfig(t *testing.T) { } expected.BackOffConfig = configretry.NewDefaultBackOffConfig() expected.BackOffConfig.MaxInterval = 5 * time.Second - expected.QueueSettings = exporterhelper.NewDefaultQueueSettings() + expected.QueueSettings = exporterhelper.NewDefaultQueueConfig() expected.QueueSettings.Enabled = false - expected.ClientConfig = confighttp.ClientConfig{ - Endpoint: "", - Timeout: 30 * time.Second, - Headers: map[string]configopaque.String{}, - // Default to gzip compression - Compression: configcompression.TypeGzip, - // We almost read 0 bytes, so no need to tune ReadBufferSize. - WriteBufferSize: 512 * 1024, - } + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Timeout = 30 * time.Second + clientConfig.Compression = configcompression.TypeGzip + clientConfig.WriteBufferSize = 512 * 1024 + expected.ClientConfig = clientConfig assert.Equal(t, expected, cfg) } @@ -60,67 +55,57 @@ func TestDefaultLoadConfig(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "2").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) expected := &Config{ Token: "logzioTESTtoken", } expected.BackOffConfig = configretry.NewDefaultBackOffConfig() - expected.QueueSettings = exporterhelper.NewDefaultQueueSettings() - expected.ClientConfig = confighttp.ClientConfig{ - Endpoint: "", - Timeout: 30 * time.Second, - Headers: map[string]configopaque.String{}, - // Default to gzip compression - Compression: configcompression.TypeGzip, - // We almost read 0 bytes, so no need to tune ReadBufferSize. - WriteBufferSize: 512 * 1024, - } + expected.QueueSettings = exporterhelper.NewDefaultQueueConfig() + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Timeout = 30 * time.Second + clientConfig.Compression = configcompression.TypeGzip + clientConfig.WriteBufferSize = 512 * 1024 + expected.ClientConfig = clientConfig assert.Equal(t, expected, cfg) } func TestCheckAndWarnDeprecatedOptions(t *testing.T) { + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Timeout = 10 * time.Second + clientConfig.Compression = configcompression.TypeGzip + clientConfig.WriteBufferSize = 512 * 1024 // Config with legacy options actualCfg := &Config{ - QueueSettings: exporterhelper.NewDefaultQueueSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), BackOffConfig: configretry.NewDefaultBackOffConfig(), Token: "logzioTESTtoken", CustomEndpoint: "https://api.example.com", QueueMaxLength: 10, DrainInterval: 10, - ClientConfig: confighttp.ClientConfig{ - Endpoint: "", - Timeout: 10 * time.Second, - Headers: map[string]configopaque.String{}, - // Default to gzip compression - Compression: configcompression.TypeGzip, - // We almost read 0 bytes, so no need to tune ReadBufferSize. - WriteBufferSize: 512 * 1024, - }, + ClientConfig: clientConfig, } - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() logger := hclog2ZapLogger{ Zap: params.Logger, name: loggerName, } actualCfg.checkAndWarnDeprecatedOptions(&logger) + clientConfigEndpoint := confighttp.NewDefaultClientConfig() + clientConfigEndpoint.Timeout = 10 * time.Second + clientConfigEndpoint.Compression = configcompression.TypeGzip + clientConfigEndpoint.WriteBufferSize = 512 * 1024 + clientConfigEndpoint.Endpoint = "https://api.example.com" + expected := &Config{ Token: "logzioTESTtoken", CustomEndpoint: "https://api.example.com", QueueMaxLength: 10, DrainInterval: 10, BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), - ClientConfig: confighttp.ClientConfig{ - Endpoint: "https://api.example.com", - Timeout: 10 * time.Second, - Headers: map[string]configopaque.String{}, - // Default to gzip compression - Compression: configcompression.TypeGzip, - // We almost read 0 bytes, so no need to tune ReadBufferSize. - WriteBufferSize: 512 * 1024, - }, + QueueSettings: exporterhelper.NewDefaultQueueConfig(), + ClientConfig: clientConfigEndpoint, } expected.QueueSettings.QueueSize = 10 assert.Equal(t, expected, actualCfg) diff --git a/exporter/logzioexporter/exporter.go b/exporter/logzioexporter/exporter.go index 9ce04c26effc..a4cc01780ec9 100644 --- a/exporter/logzioexporter/exporter.go +++ b/exporter/logzioexporter/exporter.go @@ -46,7 +46,7 @@ type logzioExporter struct { serviceCache cache.Cache } -func newLogzioExporter(cfg *Config, params exporter.CreateSettings) (*logzioExporter, error) { +func newLogzioExporter(cfg *Config, params exporter.Settings) (*logzioExporter, error) { logger := hclog2ZapLogger{ Zap: params.Logger, name: loggerName, @@ -67,7 +67,7 @@ func newLogzioExporter(cfg *Config, params exporter.CreateSettings) (*logzioExpo }, nil } -func newLogzioTracesExporter(config *Config, set exporter.CreateSettings) (exporter.Traces, error) { +func newLogzioTracesExporter(config *Config, set exporter.Settings) (exporter.Traces, error) { exporter, err := newLogzioExporter(config, set) if err != nil { return nil, err @@ -77,19 +77,20 @@ func newLogzioTracesExporter(config *Config, set exporter.CreateSettings) (expor return nil, err } config.checkAndWarnDeprecatedOptions(exporter.logger) - return exporterhelper.NewTracesExporter( + return exporterhelper.NewTraces( context.TODO(), set, config, exporter.pushTraceData, exporterhelper.WithStart(exporter.start), // disable since we rely on http.Client timeout logic. - exporterhelper.WithTimeout(exporterhelper.TimeoutSettings{Timeout: 0}), + exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}), exporterhelper.WithQueue(config.QueueSettings), exporterhelper.WithRetry(config.BackOffConfig), ) } -func newLogzioLogsExporter(config *Config, set exporter.CreateSettings) (exporter.Logs, error) { + +func newLogzioLogsExporter(config *Config, set exporter.Settings) (exporter.Logs, error) { exporter, err := newLogzioExporter(config, set) if err != nil { return nil, err @@ -99,14 +100,14 @@ func newLogzioLogsExporter(config *Config, set exporter.CreateSettings) (exporte return nil, err } config.checkAndWarnDeprecatedOptions(exporter.logger) - return exporterhelper.NewLogsExporter( + return exporterhelper.NewLogs( context.TODO(), set, config, exporter.pushLogData, exporterhelper.WithStart(exporter.start), // disable since we rely on http.Client timeout logic. - exporterhelper.WithTimeout(exporterhelper.TimeoutSettings{Timeout: 0}), + exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}), exporterhelper.WithQueue(config.QueueSettings), exporterhelper.WithRetry(config.BackOffConfig), ) @@ -130,10 +131,10 @@ func (exporter *logzioExporter) pushLogData(ctx context.Context, ld plog.Logs) e for j := 0; j < scopeLogs.Len(); j++ { logRecords := scopeLogs.At(j).LogRecords() scope := scopeLogs.At(j).Scope() - details := mergeMapEntries(resource.Attributes(), scope.Attributes()) - details.PutStr(`scopeName`, scope.Name()) for k := 0; k < logRecords.Len(); k++ { log := logRecords.At(k) + details := mergeMapEntries(resource.Attributes(), scope.Attributes(), log.Attributes()) + details.PutStr(`scopeName`, scope.Name()) jsonLog, err := json.Marshal(convertLogRecordToJSON(log, details)) if err != nil { return err @@ -182,10 +183,7 @@ func mergeMapEntries(maps ...pcommon.Map) pcommon.Map { func (exporter *logzioExporter) pushTraceData(ctx context.Context, traces ptrace.Traces) error { // a buffer to store logzio span and services bytes var dataBuffer bytes.Buffer - batches, err := jaeger.ProtoFromTraces(traces) - if err != nil { - return err - } + batches := jaeger.ProtoFromTraces(traces) for _, batch := range batches { for _, span := range batch.Spans { span.Process = batch.Process @@ -195,7 +193,7 @@ func (exporter *logzioExporter) pushTraceData(ctx context.Context, traces ptrace if transformErr != nil { return transformErr } - _, err = dataBuffer.Write(append(logzioSpan, '\n')) + _, err := dataBuffer.Write(append(logzioSpan, '\n')) if err != nil { return err } @@ -220,7 +218,7 @@ func (exporter *logzioExporter) pushTraceData(ctx context.Context, traces ptrace } } } - err = exporter.export(ctx, exporter.config.ClientConfig.Endpoint, dataBuffer.Bytes()) + err := exporter.export(ctx, exporter.config.ClientConfig.Endpoint, dataBuffer.Bytes()) // reset the data buffer after each export to prevent duplicated data dataBuffer.Reset() return err diff --git a/exporter/logzioexporter/exporter_test.go b/exporter/logzioexporter/exporter_test.go index 190afaa825c6..2943c50a9413 100644 --- a/exporter/logzioexporter/exporter_test.go +++ b/exporter/logzioexporter/exporter_test.go @@ -26,7 +26,7 @@ import ( "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/ptrace" "go.opentelemetry.io/collector/pdata/testdata" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" ) const ( @@ -97,9 +97,9 @@ func generateLogsOneEmptyTimestamp() plog.Logs { return ld } -func testLogsExporter(ld plog.Logs, t *testing.T, cfg *Config) error { +func testLogsExporter(t *testing.T, ld plog.Logs, cfg *Config) error { var err error - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() exporter, err := createLogsExporter(context.Background(), params, cfg) if err != nil { return err @@ -146,8 +146,8 @@ func newTestTraces() ptrace.Traces { return td } -func testTracesExporter(td ptrace.Traces, t *testing.T, cfg *Config) error { - params := exportertest.NewNopCreateSettings() +func testTracesExporter(t *testing.T, td ptrace.Traces, cfg *Config) error { + params := exportertest.NewNopSettings() exporter, err := createTracesExporter(context.Background(), params, cfg) if err != nil { return err @@ -173,7 +173,7 @@ func TestExportErrors(tester *testing.T) { type ExportErrorsTest struct { status int } - var ExportErrorsTests = []ExportErrorsTest{ + ExportErrorsTests := []ExportErrorsTest{ {http.StatusUnauthorized}, {http.StatusBadGateway}, {http.StatusInternalServerError}, @@ -186,34 +186,34 @@ func TestExportErrors(tester *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, _ *http.Request) { rw.WriteHeader(test.status) })) + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Endpoint = server.URL + cfg := &Config{ - Region: "", - Token: "token", - ClientConfig: confighttp.ClientConfig{ - Endpoint: server.URL, - }, + Region: "", + Token: "token", + ClientConfig: clientConfig, } td := newTestTracesWithAttributes() ld := testdata.GenerateLogs(10) - err := testTracesExporter(td, tester, cfg) + err := testTracesExporter(tester, td, cfg) fmt.Println(err.Error()) require.Error(tester, err) - err = testLogsExporter(ld, tester, cfg) + err = testLogsExporter(tester, ld, cfg) fmt.Println(err.Error()) server.Close() require.Error(tester, err) } - } func TestNullTracesExporterConfig(tester *testing.T) { - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() _, err := newLogzioTracesExporter(nil, params) assert.Error(tester, err, "Null exporter config should produce error") } func TestNullExporterConfig(tester *testing.T) { - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() _, err := newLogzioExporter(nil, params) assert.Error(tester, err, "Null exporter config should produce error") } @@ -240,20 +240,20 @@ func TestPushTraceData(tester *testing.T) { recordedRequests, _ = io.ReadAll(req.Body) rw.WriteHeader(http.StatusOK) })) + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Endpoint = server.URL + clientConfig.Compression = configcompression.TypeGzip cfg := Config{ - Token: "token", - Region: "", - ClientConfig: confighttp.ClientConfig{ - Endpoint: server.URL, - Compression: configcompression.TypeGzip, - }, + Token: "token", + Region: "", + ClientConfig: clientConfig, } defer server.Close() td := newTestTraces() res := td.ResourceSpans().At(0).Resource() res.Attributes().PutStr(conventions.AttributeServiceName, testService) res.Attributes().PutStr(conventions.AttributeHostName, testHost) - err := testTracesExporter(td, tester, &cfg) + err := testTracesExporter(tester, td, &cfg) require.NoError(tester, err) var newSpan logzioSpan decoded, _ := gUnzipData(recordedRequests) @@ -273,20 +273,20 @@ func TestPushLogsData(tester *testing.T) { recordedRequests, _ = io.ReadAll(req.Body) rw.WriteHeader(http.StatusOK) })) + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Endpoint = server.URL + clientConfig.Compression = configcompression.TypeGzip cfg := Config{ - Token: "token", - Region: "", - ClientConfig: confighttp.ClientConfig{ - Endpoint: server.URL, - Compression: configcompression.TypeGzip, - }, + Token: "token", + Region: "", + ClientConfig: clientConfig, } defer server.Close() - ld := testdata.GenerateLogs(2) + ld := generateLogsOneEmptyTimestamp() res := ld.ResourceLogs().At(0).Resource() res.Attributes().PutStr(conventions.AttributeServiceName, testService) res.Attributes().PutStr(conventions.AttributeHostName, testHost) - err := testLogsExporter(ld, tester, &cfg) + err := testLogsExporter(tester, ld, &cfg) require.NoError(tester, err) var jsonLog map[string]any decoded, _ := gUnzipData(recordedRequests) @@ -294,12 +294,18 @@ func TestPushLogsData(tester *testing.T) { assert.NoError(tester, json.Unmarshal([]byte(requests[0]), &jsonLog)) assert.Equal(tester, testHost, jsonLog["host.name"]) assert.Equal(tester, testService, jsonLog["service.name"]) + assert.Equal(tester, "server", jsonLog["app"]) + assert.Equal(tester, 1.0, jsonLog["instance_num"]) + assert.Equal(tester, "logScopeName", jsonLog["scopeName"]) + assert.Equal(tester, "hello there", jsonLog["message"]) + assert.Equal(tester, "bar", jsonLog["foo"]) + assert.Equal(tester, 45.0, jsonLog["23"]) } func TestMergeMapEntries(tester *testing.T) { - var firstMap = pcommon.NewMap() - var secondMap = pcommon.NewMap() - var expectedMap = pcommon.NewMap() + firstMap := pcommon.NewMap() + secondMap := pcommon.NewMap() + expectedMap := pcommon.NewMap() firstMap.PutStr("name", "exporter") firstMap.PutStr("host", "localhost") firstMap.PutStr("instanceNum", "1") @@ -310,17 +316,17 @@ func TestMergeMapEntries(tester *testing.T) { secondMap.PutEmptyMap("id").PutInt("instance_a", 1) expectedMap.PutStr("name", "exporter") expectedMap.PutStr("tag", "test") - var slice = expectedMap.PutEmptySlice("host") + slice := expectedMap.PutEmptySlice("host") slice.AppendEmpty().SetStr("localhost") slice.AppendEmpty().SetStr("ec2") slice = expectedMap.PutEmptySlice("instanceNum") - var val = slice.AppendEmpty() + val := slice.AppendEmpty() val.SetStr("1") val = slice.AppendEmpty() val.SetInt(3) slice = expectedMap.PutEmptySlice("id") slice.AppendEmpty().SetInt(4) slice.AppendEmpty().SetEmptyMap().PutInt("instance_a", 1) - var mergedMap = mergeMapEntries(firstMap, secondMap) + mergedMap := mergeMapEntries(firstMap, secondMap) assert.Equal(tester, expectedMap.AsRaw(), mergedMap.AsRaw()) } diff --git a/exporter/logzioexporter/factory.go b/exporter/logzioexporter/factory.go index 6b65fcd83fb8..463cfeb0f55e 100644 --- a/exporter/logzioexporter/factory.go +++ b/exporter/logzioexporter/factory.go @@ -15,7 +15,6 @@ import ( "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/config/configcompression" "go.opentelemetry.io/collector/config/confighttp" - "go.opentelemetry.io/collector/config/configopaque" "go.opentelemetry.io/collector/config/configretry" "go.opentelemetry.io/collector/exporter" "go.opentelemetry.io/collector/exporter/exporterhelper" @@ -30,24 +29,21 @@ func NewFactory() exporter.Factory { createDefaultConfig, exporter.WithTraces(createTracesExporter, metadata.TracesStability), exporter.WithLogs(createLogsExporter, metadata.LogsStability)) - } func createDefaultConfig() component.Config { + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Timeout = 30 * time.Second + // Default to gzip compression + clientConfig.Compression = configcompression.TypeGzip + // We almost read 0 bytes, so no need to tune ReadBufferSize. + clientConfig.WriteBufferSize = 512 * 1024 return &Config{ Region: "", Token: "", BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), - ClientConfig: confighttp.ClientConfig{ - Endpoint: "", - Timeout: 30 * time.Second, - Headers: map[string]configopaque.String{}, - // Default to gzip compression - Compression: configcompression.TypeGzip, - // We almost read 0 bytes, so no need to tune ReadBufferSize. - WriteBufferSize: 512 * 1024, - }, + QueueSettings: exporterhelper.NewDefaultQueueConfig(), + ClientConfig: clientConfig, } } @@ -89,12 +85,12 @@ func generateEndpoint(cfg *Config) (string, error) { } } -func createTracesExporter(_ context.Context, params exporter.CreateSettings, cfg component.Config) (exporter.Traces, error) { +func createTracesExporter(_ context.Context, params exporter.Settings, cfg component.Config) (exporter.Traces, error) { exporterConfig := cfg.(*Config) return newLogzioTracesExporter(exporterConfig, params) } -func createLogsExporter(_ context.Context, params exporter.CreateSettings, cfg component.Config) (exporter.Logs, error) { +func createLogsExporter(_ context.Context, params exporter.Settings, cfg component.Config) (exporter.Logs, error) { exporterConfig := cfg.(*Config) return newLogzioLogsExporter(exporterConfig, params) } diff --git a/exporter/logzioexporter/factory_test.go b/exporter/logzioexporter/factory_test.go index 60624fa977cd..343e9b4565f7 100644 --- a/exporter/logzioexporter/factory_test.go +++ b/exporter/logzioexporter/factory_test.go @@ -25,8 +25,7 @@ func TestCreateDefaultConfig(t *testing.T) { assert.NoError(t, componenttest.CheckConfigStruct(cfg)) } -func TestCreateTracesExporter(t *testing.T) { - +func TestCreateTraces(t *testing.T) { cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml")) require.NoError(t, err) factory := NewFactory() @@ -34,10 +33,10 @@ func TestCreateTracesExporter(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "2").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) - params := exportertest.NewNopCreateSettings() - exporter, err := factory.CreateTracesExporter(context.Background(), params, cfg) + params := exportertest.NewNopSettings() + exporter, err := factory.CreateTraces(context.Background(), params, cfg) assert.NoError(t, err) assert.NotNil(t, exporter) } @@ -48,7 +47,7 @@ func TestGenerateUrl(t *testing.T) { region string expected string } - var generateURLTests = []generateURLTest{ + generateURLTests := []generateURLTest{ {"", "us", "https://listener.logz.io:8071/?token=token"}, {"", "", "https://listener.logz.io:8071/?token=token"}, {"https://doesnotexist.com", "", "https://doesnotexist.com"}, @@ -60,12 +59,12 @@ func TestGenerateUrl(t *testing.T) { {"", "EU", "https://listener-eu.logz.io:8071/?token=token"}, } for _, test := range generateURLTests { + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Endpoint = test.endpoint cfg := &Config{ - Region: test.region, - Token: "token", - ClientConfig: confighttp.ClientConfig{ - Endpoint: test.endpoint, - }, + Region: test.region, + Token: "token", + ClientConfig: clientConfig, } output, _ := generateEndpoint(cfg) require.Equal(t, test.expected, output) @@ -77,7 +76,7 @@ func TestGetListenerURL(t *testing.T) { arg1 string expected string } - var getListenerURLTests = []getListenerURLTest{ + getListenerURLTests := []getListenerURLTest{ {"us", "https://listener.logz.io:8071"}, {"eu", "https://listener-eu.logz.io:8071"}, {"au", "https://listener-au.logz.io:8071"}, @@ -92,6 +91,6 @@ func TestGetListenerURL(t *testing.T) { } for _, test := range getListenerURLTests { output := getListenerURL(test.arg1) - require.Equal(t, output, test.expected) + require.Equal(t, test.expected, output) } } diff --git a/exporter/logzioexporter/generated_component_test.go b/exporter/logzioexporter/generated_component_test.go index 24bbd18ddeaf..506bf18d855d 100644 --- a/exporter/logzioexporter/generated_component_test.go +++ b/exporter/logzioexporter/generated_component_test.go @@ -32,20 +32,20 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -57,21 +57,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(exporter.Logs) require.True(t, ok) diff --git a/exporter/logzioexporter/go.mod b/exporter/logzioexporter/go.mod index d29b870cde68..5554cf8dfce5 100644 --- a/exporter/logzioexporter/go.mod +++ b/exporter/logzioexporter/go.mod @@ -1,84 +1,89 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/logzioexporter -go 1.21.0 +go 1.22.0 require ( github.com/hashicorp/go-hclog v1.6.3 - github.com/jaegertracing/jaeger v1.57.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configcompression v1.9.0 - go.opentelemetry.io/collector/config/confighttp v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/pdata/testdata v0.102.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/jaegertracing/jaeger v1.62.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configcompression v1.22.0 + go.opentelemetry.io/collector/config/confighttp v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/pdata/testdata v0.116.0 + go.opentelemetry.io/collector/semconv v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 - google.golang.org/protobuf v1.34.1 + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 + google.golang.org/protobuf v1.35.2 ) require ( - github.com/apache/thrift v0.20.0 // indirect - github.com/beorn7/perks v1.0.1 // indirect + github.com/apache/thrift v0.21.0 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/fatih/color v1.15.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/rs/cors v1.10.1 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + github.com/rs/cors v1.11.1 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/configtls v1.22.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/consumer v1.22.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/grpc v1.64.0 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/grpc v1.68.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/logzioexporter/go.sum b/exporter/logzioexporter/go.sum index 4af8a66e24e4..dc01ba8afd78 100644 --- a/exporter/logzioexporter/go.sum +++ b/exporter/logzioexporter/go.sum @@ -1,11 +1,7 @@ -github.com/apache/thrift v0.20.0 h1:631+KvYbsBZxmuJjYwhezVsrfc/TbqtZV4QcxOX1fOI= -github.com/apache/thrift v0.20.0/go.mod h1:hOk1BQqcp2OLzGsyVXdfMk7YFlMxK3aoEVhjD06QhB8= -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/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE= +github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -15,17 +11,19 @@ github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= @@ -37,20 +35,20 @@ github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB1 github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/jaegertracing/jaeger v1.57.0 h1:3wDtUUPs6NRYH7+d+y8MilDkLHdpPrVlQ2wbcsA62bs= -github.com/jaegertracing/jaeger v1.57.0/go.mod h1:p/1fxIU9hKHl7qEhKC72p2ZYVhvvZvNB73y6V7YyuTs= +github.com/jaegertracing/jaeger v1.62.0 h1:YoaJ2e8oVz5sqGGlVAKSUCED8DzJ1q7PojBmZFNKoJA= +github.com/jaegertracing/jaeger v1.62.0/go.mod h1:jhEIHazwyb+a6xlRBi+p96BAvTYTSmGkghcwdQfV7FM= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -73,82 +71,101 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector v0.111.0 h1:D3LJTYrrK2ac94E2PXPSbVkArqxbklbCLsE4MAJQdRo= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -164,8 +181,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -179,12 +196,12 @@ golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -193,12 +210,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/exporter/logzioexporter/internal/metadata/generated_status.go b/exporter/logzioexporter/internal/metadata/generated_status.go index d808141b06cc..b6b54abff3ac 100644 --- a/exporter/logzioexporter/internal/metadata/generated_status.go +++ b/exporter/logzioexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("logzio") + Type = component.MustNewType("logzio") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/logzioexporter" ) const ( diff --git a/exporter/logzioexporter/internal/metadata/generated_telemetry.go b/exporter/logzioexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index a7af4b2d8b0e..000000000000 --- a/exporter/logzioexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/logzio") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/logzio") -} diff --git a/exporter/logzioexporter/internal/metadata/generated_telemetry_test.go b/exporter/logzioexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index a68a03dfd166..000000000000 --- a/exporter/logzioexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/logzio", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/logzio", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/logzioexporter/jsonlog_test.go b/exporter/logzioexporter/jsonlog_test.go index 6d75ceecc148..f7225b3db4f8 100644 --- a/exporter/logzioexporter/jsonlog_test.go +++ b/exporter/logzioexporter/jsonlog_test.go @@ -27,6 +27,7 @@ func generateLogRecordWithNestedBody() plog.LogRecord { fillLogOne(lr) return lr } + func generateLogRecordWithMultiTypeValues() plog.LogRecord { lr := plog.NewLogRecord() fillLogTwo(lr) @@ -40,8 +41,9 @@ func TestConvertLogRecordToJSON(t *testing.T) { expected map[string]any } - var convertLogRecordToJSONTests = []convertLogRecordToJSONTest{ - {generateLogRecordWithNestedBody(), + convertLogRecordToJSONTests := []convertLogRecordToJSONTest{ + { + generateLogRecordWithNestedBody(), pcommon.NewResource(), map[string]any{ "23": float64(45), @@ -56,7 +58,8 @@ func TestConvertLogRecordToJSON(t *testing.T) { "traceID": "08040201000000000000000000000000", }, }, - {generateLogRecordWithMultiTypeValues(), + { + generateLogRecordWithMultiTypeValues(), pcommon.NewResource(), map[string]any{ "bool": true, @@ -71,7 +74,7 @@ func TestConvertLogRecordToJSON(t *testing.T) { } for _, test := range convertLogRecordToJSONTests { output := convertLogRecordToJSON(test.log, test.log.Attributes()) - require.Equal(t, output, test.expected) + require.Equal(t, test.expected, output) } } @@ -83,16 +86,16 @@ func TestSetTimeStamp(t *testing.T) { })) defer func() { server.Close() }() ld := generateLogsOneEmptyTimestamp() + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Endpoint = server.URL + clientConfig.Compression = configcompression.TypeGzip cfg := &Config{ - Region: "us", - Token: "token", - ClientConfig: confighttp.ClientConfig{ - Endpoint: server.URL, - Compression: configcompression.TypeGzip, - }, + Region: "us", + Token: "token", + ClientConfig: clientConfig, } var err error - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() exporter, err := createLogsExporter(context.Background(), params, cfg) require.NoError(t, err) err = exporter.Start(context.Background(), componenttest.NewNopHost()) @@ -108,10 +111,6 @@ func TestSetTimeStamp(t *testing.T) { requests := strings.Split(string(decoded), "\n") require.NoError(t, json.Unmarshal([]byte(requests[0]), &jsonLog)) require.NoError(t, json.Unmarshal([]byte(requests[1]), &jsonLogNoTimestamp)) - if jsonLogNoTimestamp["@timestamp"] != nil { - t.Fatalf("did not expect @timestamp") - } - if jsonLog["@timestamp"] == nil { - t.Fatalf("@timestamp does not exist") - } + require.Nil(t, jsonLogNoTimestamp["@timestamp"], "did not expect @timestamp") + require.NotNil(t, jsonLog["@timestamp"], "@timestamp does not exist") } diff --git a/exporter/logzioexporter/logger_test.go b/exporter/logzioexporter/logger_test.go index 8821f7f76c0b..3c74dbf60723 100644 --- a/exporter/logzioexporter/logger_test.go +++ b/exporter/logzioexporter/logger_test.go @@ -17,7 +17,7 @@ func TestLoggerConfigs(tester *testing.T) { name: loggerName, } - assert.Equal(tester, exporterLogger.Name(), loggerName) + assert.Equal(tester, loggerName, exporterLogger.Name()) assert.NotNil(tester, exporterLogger.Named("logger")) assert.NotNil(tester, exporterLogger.With("key", "val")) assert.NotNil(tester, exporterLogger.ResetNamed(loggerName)) diff --git a/exporter/logzioexporter/logziospan_test.go b/exporter/logzioexporter/logziospan_test.go index 5a8f15ec412a..faea671f4b40 100644 --- a/exporter/logzioexporter/logziospan_test.go +++ b/exporter/logzioexporter/logziospan_test.go @@ -10,13 +10,12 @@ import ( "testing" "github.com/jaegertracing/jaeger/model" + "github.com/stretchr/testify/require" ) func TestTransformToLogzioSpanBytes(tester *testing.T) { inStr, err := os.ReadFile("./testdata/span.json") - if err != nil { - tester.Fatalf(fmt.Sprintf("error opening sample span file %s", err.Error())) - } + require.NoError(tester, err, "error opening sample span file") var span model.Span err = json.Unmarshal(inStr, &span) @@ -24,14 +23,10 @@ func TestTransformToLogzioSpanBytes(tester *testing.T) { fmt.Println("json.Unmarshal") } newSpan, err := transformToLogzioSpanBytes(&span) - if err != nil { - tester.Fatalf(err.Error()) - } + require.NoError(tester, err) m := make(map[string]any) err = json.Unmarshal(newSpan, &m) - if err != nil { - tester.Fatalf(err.Error()) - } + require.NoError(tester, err) if _, ok := m["JaegerTag"]; !ok { tester.Error("error converting span to logzioSpan, JaegerTag is not found") } @@ -39,25 +34,17 @@ func TestTransformToLogzioSpanBytes(tester *testing.T) { func TestTransformToDbModelSpan(tester *testing.T) { inStr, err := os.ReadFile("./testdata/span.json") - if err != nil { - tester.Fatalf(fmt.Sprintf("error opening sample span file %s", err.Error())) - } + require.NoError(tester, err, "error opening sample span file") var span model.Span err = json.Unmarshal(inStr, &span) if err != nil { fmt.Println("json.Unmarshal") } newSpan, err := transformToLogzioSpanBytes(&span) - if err != nil { - tester.Fatalf(err.Error()) - } + require.NoError(tester, err) var testLogzioSpan logzioSpan err = json.Unmarshal(newSpan, &testLogzioSpan) - if err != nil { - tester.Fatalf(err.Error()) - } + require.NoError(tester, err) dbModelSpan := testLogzioSpan.transformToDbModelSpan() - if len(dbModelSpan.References) != 3 { - tester.Fatalf("Error converting logzio span to dbmodel span") - } + require.Len(tester, dbModelSpan.References, 3, "Error converting logzio span to dbmodel span") } diff --git a/exporter/logzioexporter/metadata.yaml b/exporter/logzioexporter/metadata.yaml index 1b4fb9cd2046..0bbdcd868960 100644 --- a/exporter/logzioexporter/metadata.yaml +++ b/exporter/logzioexporter/metadata.yaml @@ -1,5 +1,4 @@ type: logzio -scope_name: otelcol/logzio status: class: exporter diff --git a/exporter/lokiexporter/README.md b/exporter/lokiexporter/README.md index 02e5e1a3fafd..8929d4f32582 100644 --- a/exporter/lokiexporter/README.md +++ b/exporter/lokiexporter/README.md @@ -3,17 +3,230 @@ | Status | | | ------------- |-----------| -| Stability | [beta]: logs | +| Stability | [deprecated]: logs | | Distributions | [contrib] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Floki%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Floki) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Floki%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Floki) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@gramidt](https://www.github.com/gramidt), [@gouthamve](https://www.github.com/gouthamve), [@jpkrohling](https://www.github.com/jpkrohling), [@mar4uk](https://www.github.com/mar4uk) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@gramidt](https://www.github.com/gramidt), [@mar4uk](https://www.github.com/mar4uk) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[deprecated]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#deprecated [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib Exports data via HTTP to [Loki](https://grafana.com/docs/loki/latest/). -## Getting Started +## Deprecation notice + +This component is **deprecated**: Loki now supports native [OTLP ingestion](https://grafana.com/docs/loki/latest/send-data/otel/) starting from v3. Grafana Cloud also supports [OTLP native ingestion](https://grafana.com/docs/grafana-cloud/send-data/otlp/send-data-otlp) for logs. This component will be removed in November 2024. + + +### Benefits of the new Loki OpenTelemetry log format + +The new format for OpenTelemetry logs introduced in Loki V3 brings the following benefits: + +* Native support for the structure of OpenTelemetry logs enabling simpler querying (no more JSON parsing). +* Simplified client configuration to send OpenTelemetry data using the standard OTLP protocol. + +### Loki log message format changes for OpenTelemetry logs + +See OpenTelemetry Logs Data Model specification [here](https://opentelemetry.io/docs/specs/otel/logs/data-model/). + +| OpenTelemetry log field | Pre Loki V3 | Loki V3 through the Loki OTLP Endpoint | +| ----- | ----- | ----- | +| [`Timestamp`](https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-timestamp) | `timestamp` | `timestamp` | +| [`ObservedTimestamp`](https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-observedtimestamp) | Not available | `metadata[observed_timestamp]` | +| [`TraceId`](https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-traceid) | `traceid` field of the Loki JSON log message | `metadata[trace_id]` | +| [`SpanId`](https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-spanid) | `spanid` field of the Loki JSON log message | `metadata[span_id]` | +| [`TraceFlags`](https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-traceflags) | Not available | `metadata[flags]` | +| [`SeverityText`](https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-severitytext) | `severity` field of the JSON log message (e.g. `Information`) and `level` label (e.g. `ERROR`, `INFO`...), the `detected_level` label is also available | `metadata[severity_text]`, the `detected_level` label is also available | +| [`SeverityNumber`](https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-severitynumber) | Not available | `metadata[severity_number]` | +| [`Body`](https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-body) | `body` field of the Loki JSON log message | The Loki log message. `__line__`in LogQL functions (e.g. `line_format`)| +| [`InstrumentationScope`](https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-instrumentationscope) | `instrumentation_scope_name` field of the JSON log message | `metadata[scope_name]` | +| [`Attributes`](https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-attributes) | JSON fields of the Loki log message | `metadata[xyz]` Where `xyz` is the `_` version of the OTel attribute name (e.g. `thread_name` Loki metadata for the `thread.name` OpenTelemetry attribute)| +| [`Resource`](https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-resource) | `service.name`, `service.namespace`, and `service.instance.id` are promoted as the following labels: `job=[${service.namespace}/]${service.name}`, instance=${service.instance.id}, exporter="OTLP"`. Other resource attributes are stored as JSON fields of the Loki log message with the prefix `resources_` (e.g. `resources_k8s_namespace_name`) | Default list of resource attributes promoted as Loki labels: `cloud.availability_zone`, `cloud.region`, `container.name`, `deployment.environment`, `k8s.cluster.name`, `k8s.container.name`, `k8s.cronjob.name`, `k8s.daemonset.name`, `k8s.deployment.name`, `k8s.job.name`, `k8s.namespace.name`, `k8s.pod.name`, `k8s.replicaset.name` `k8s.statefulset.name`, `service.instance.id`, `service.name`, `service.namespace`.
Other resource attributes are by default promoted as Loki message metadata.
ℹ️ The list of promoted resource attributes is configurable using Loki’s distributor config parameter `default_resource_attributes_as_index_labels` when using self managed Loki ([here](https://grafana.com/docs/loki/latest/configure/\#distributor)) or opening a support request when using Grafana Cloud | + +ℹ️ Additional conversion rules from OpenTelemetry Logs to Loki + +* All special characters, including `.` in attribute and resource attribute names, are converted into `_` when they are mapped as Loki labels or metadata. +* OTel attribute values with complex data types (i.e. arrays, nested structures) are converted into JSON strings + +### Migration instructions + +#### Instrumentation migration + +No changes are needed in the instrumentation layer. OpenTelemetry logs sources like OpenTelemetry SDKs or the [OpenTelemetry Collector File Log Receiver](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/filelogreceiver) don’t have to be modified. + +#### Logs collection migration + +Replace the OpenTelemetry Collector Loki Exporter by the [OpenTelemetry Collector OTLP HTTP Exporter](https://github.com/open-telemetry/opentelemetry-collector/tree/main/exporter/otlphttpexporter) as OpenTelemetry logs should now be exported as is to the Loki OTLP endpoint. + + +OpenTelemetry Collector configuration migration + +```yaml +======================== += BEFORE MIGRATION = +======================== + +extensions: + basicauth/loki: + client_auth: + username: <> + password: <> + +exporters: + loki: + auth: + authenticator: basicauth/loki + endpoint: https://loki.example.com:3100/loki/api/v1/push + +service: + extensions: [basicauth/loki] + pipelines: + logs: + receivers: [...] + processors: [...] + exporters: [loki, ...] + + +======================== += AFTER MIGRATION = +======================== + +extensions: + basicauth/loki: + client_auth: + username: <> + password: <> + +exporters: + otlphttp/loki: + auth: + authenticator: basicauth/loki + endpoint: http://loki.example.com:3100/otlp/v1/logs + +service: + extensions: [basicauth/loki] + pipelines: + logs: + receivers: [...] + processors: [...] + exporters: [otlphttp/loki, ...] +``` + +* When using Grafana Cloud, the [Grafana Cloud OTLP endpoint](https://grafana.com/docs/grafana-cloud/send-data/otlp/send-data-otlp/) should be used instead of the Loki OTLP endpoint. The connection details of the Grafana Cloud OTLP endpoint, OTLP HTTP URL and credentials are available using the Grafana Cloud "OpenTelemetry Collector" connection tile. +* The promotion of OpenTelemetry attributes and resource attributes to Loki labels using the `loki.attribute.labels` and `loki.resource.labels` hints is replaced by the list of promoted attributes managed centrally in Loki. +* The default list of resource attributes promoted as labels (see above) should be sufficient for most use cases. +* ℹ️ Changes can be made to this list using the Loki distributor configuration parameter `default_resource_attributes_as_index_labels` ([here](https://grafana.com/docs/loki/latest/configure/\#distributor)) for self managed instances and opening a support ticket for Grafana Cloud. + +#### LogQL queries migration + +##### From `job` and `instance` to `service_name`, `service_namespace`, and `service_instance_id` + +The Loki labels `job` and `instance` are no longer generated and are replaced by the `service_name`, `service_namespace`, and `service_instance_id` labels. + +Example: + +``` +BEFORE +{job="ecommerce/frontend", instance="instance-1234567890"} + +AFTER +{service_name="frontend", service_namespace="ecommerce", service_instance_id="instance-1234567890"} +``` + +##### From `| json | an_attribute=...` to `{an_attribute=...}` or `| an_attribute=...` + +OTel log attributes, resource attributes, and fields are no longer stored in the JSON message but are stored as: +* Loki message labels for promoted resource attributes (see list above), +* Loki message metadata for other resource attributes, log attributes, and log fields. + +LogQL statements `| json | an_attribute=...` must be converted to: + +* Promoted resource attributes: `{an_attribute=...}` +* For other resource attributes, log attributes, and log fields: `| an_attribute=...` + +Example: + +``` +BEFORE +{exporter="OTLP", job="frontend"} | json | resources_deployment_environment="production" + +AFTER +{service_name="frontend"} | deployment_environment="production" +``` + +##### From `| json | traceid=...` and `| json | spanid=...` to `| trace_id=...` and `| span_id=...` + +The log fields `SpanID` and `TraceId` were stored as the JSON fields `spanid` and `traceid`; they are now stored as `metadata[span_id]` and `metadata[trace_id]`, LogQL queries must be changed accordingly. + +`TraceID` filters like `| json | traceid=<> ...` and `|= <> ...` must be converted to `| trace_id=<> ...` where `<>` and <> are the values you search for. +Similarly, `SpanID` filters like `| json | spanid=<> ...` and `|=<> ...` must be converted to `| span_id=<> ...`. + +Example: + +``` +BEFORE +{exporter="OTLP", job="/frontend"} |= "00960a472ea5b87954ca07902d66f914" + +AFTER +{service_name="frontend"} | trace_id="00960a472ea5b87954ca07902d66f914" +``` + +##### From `line_format {{.body}}` to `line_format {{__line__}}` + +The `{{.body}}` element of the JSON payload that used to hold the OTel log message body is now the message of the Loki log line and should be referenced as `{{__line__}}` in `line_format` calls. + +Example: + +``` +BEFORE +{exporter="OTLP", job="frontend"} | json | line_format `[{{.level}}] {{.body}}` + +AFTER +{service_name="frontend"} | line_format `[{{.detected_level}}] {{__line__}}` +``` + +#### Grafana visualizations migration + +Navigation between traces and logs must be updated to account for the new Loki format form OpenTelemetry logs. + +##### Tempo data source: Trace to Logs + +To enable the "trace to logs" navigation from Tempo to Loki, navigate to the Grafana Tempo data source configuration screen, in the "Trace to logs" section, + +* Select a Loki data source on which logs to trace is configured for the new Loki format for OTel logs as described in the next section +* Select "Use custom query" and specify the query: + + ``` + {${__tags}} | trace_id="${__span.traceId}" + ``` + +Configuration screenshot: + +![Grafana / Data Source / A Tempo datasource / Trace to logs](https://github.com/user-attachments/assets/f9728223-d6ba-4ce4-a377-77d6452a2014) + + +##### Loki data source: Log to Trace + +To enable the "logs to trace" navigation from Loki to Tempo, navigate to the Grafana Loki data source configuration screen, in the "Derived fields" section, update or create a derived field with: +* Name: `Trace ID` +* Type: `Label` (note that this `Label` name may be missleading because it also supports Loki message metadata) +* Label: `trace_id` +* Internal link: activated +* Select the Tempo data source on which "trace to logs" is configured as described above + +Configuration screenshot: + +![Grafana / Data Source / A Loki datasource / Log to trace](https://github.com/user-attachments/assets/579a58bc-4fb2-4dcd-ade8-81c9fb0055f6) + + +### See Also + +* [Loki documentation / Ingesting OpenTelemetry logs](https://grafana.com/docs/loki/latest/send-data/otel/) + +
+
+ +## Getting Started with the deprecated OpenTelemetry Collector Loki Exporter The following settings are required: diff --git a/exporter/lokiexporter/config.go b/exporter/lokiexporter/config.go index 1ac225728286..3ff583211c92 100644 --- a/exporter/lokiexporter/config.go +++ b/exporter/lokiexporter/config.go @@ -14,9 +14,9 @@ import ( // Config defines configuration for Loki exporter. type Config struct { - confighttp.ClientConfig `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. - exporterhelper.QueueSettings `mapstructure:"sending_queue"` - configretry.BackOffConfig `mapstructure:"retry_on_failure"` + confighttp.ClientConfig `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` + configretry.BackOffConfig `mapstructure:"retry_on_failure"` DefaultLabelsEnabled map[string]bool `mapstructure:"default_labels_enabled"` } diff --git a/exporter/lokiexporter/config_test.go b/exporter/lokiexporter/config_test.go index dfdda9c34e26..f9ee4470fc63 100644 --- a/exporter/lokiexporter/config_test.go +++ b/exporter/lokiexporter/config_test.go @@ -24,6 +24,22 @@ import ( ) func TestLoadConfigNewExporter(t *testing.T) { + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Headers = map[string]configopaque.String{ + "X-Custom-Header": "loki_rocks", + } + clientConfig.Endpoint = "https://loki:3100/loki/api/v1/push" + clientConfig.TLSSetting = configtls.ClientConfig{ + Config: configtls.Config{ + CAFile: "/var/lib/mycert.pem", + CertFile: "certfile", + KeyFile: "keyfile", + }, + Insecure: true, + } + clientConfig.ReadBufferSize = 123 + clientConfig.WriteBufferSize = 345 + clientConfig.Timeout = time.Second * 10 t.Parallel() cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml")) @@ -36,23 +52,7 @@ func TestLoadConfigNewExporter(t *testing.T) { { id: component.NewIDWithName(metadata.Type, "allsettings"), expected: &Config{ - ClientConfig: confighttp.ClientConfig{ - Headers: map[string]configopaque.String{ - "X-Custom-Header": "loki_rocks", - }, - Endpoint: "https://loki:3100/loki/api/v1/push", - TLSSetting: configtls.ClientConfig{ - Config: configtls.Config{ - CAFile: "/var/lib/mycert.pem", - CertFile: "certfile", - KeyFile: "keyfile", - }, - Insecure: true, - }, - ReadBufferSize: 123, - WriteBufferSize: 345, - Timeout: time.Second * 10, - }, + ClientConfig: clientConfig, BackOffConfig: configretry.BackOffConfig{ Enabled: true, InitialInterval: 10 * time.Second, @@ -61,7 +61,7 @@ func TestLoadConfigNewExporter(t *testing.T) { RandomizationFactor: backoff.DefaultRandomizationFactor, Multiplier: backoff.DefaultMultiplier, }, - QueueSettings: exporterhelper.QueueSettings{ + QueueSettings: exporterhelper.QueueConfig{ Enabled: true, NumConsumers: 2, QueueSize: 10, @@ -83,7 +83,7 @@ func TestLoadConfigNewExporter(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) @@ -92,6 +92,8 @@ func TestLoadConfigNewExporter(t *testing.T) { } func TestConfigValidate(t *testing.T) { + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Endpoint = "https://loki.example.com" testCases := []struct { desc string cfg *Config @@ -99,7 +101,7 @@ func TestConfigValidate(t *testing.T) { }{ { desc: "QueueSettings are invalid", - cfg: &Config{QueueSettings: exporterhelper.QueueSettings{QueueSize: -1, Enabled: true}}, + cfg: &Config{QueueSettings: exporterhelper.QueueConfig{QueueSize: -1, Enabled: true}}, err: fmt.Errorf("queue settings has invalid configuration"), }, { @@ -110,9 +112,7 @@ func TestConfigValidate(t *testing.T) { { desc: "Config is valid", cfg: &Config{ - ClientConfig: confighttp.ClientConfig{ - Endpoint: "https://loki.example.com", - }, + ClientConfig: clientConfig, }, err: nil, }, @@ -122,8 +122,7 @@ func TestConfigValidate(t *testing.T) { t.Run(tc.desc, func(t *testing.T) { err := tc.cfg.Validate() if tc.err != nil { - require.Error(t, err) - assert.Contains(t, err.Error(), tc.err.Error()) + assert.ErrorContains(t, err, tc.err.Error()) } else { require.NoError(t, err) } diff --git a/exporter/lokiexporter/documentation.md b/exporter/lokiexporter/documentation.md index fe2572209a71..b1dfd091598a 100644 --- a/exporter/lokiexporter/documentation.md +++ b/exporter/lokiexporter/documentation.md @@ -6,7 +6,7 @@ The following telemetry is emitted by this component. -### lokiexporter_send_failed_due_to_missing_labels +### otelcol_lokiexporter_send_failed_due_to_missing_labels Number of log records failed to send because labels were missing diff --git a/exporter/lokiexporter/exporter.go b/exporter/lokiexporter/exporter.go index 75b445838771..de3a6b792f52 100644 --- a/exporter/lokiexporter/exporter.go +++ b/exporter/lokiexporter/exporter.go @@ -43,7 +43,6 @@ func newExporter(config *Config, settings component.TelemetrySettings) (*lokiExp settings.Logger.Info("using the new Loki exporter") builder, err := metadata.NewTelemetryBuilder(settings) - if err != nil { return nil, err } @@ -90,7 +89,7 @@ func (l *lokiExporter) sendPushRequest(ctx context.Context, tenant string, reque return consumererror.NewPermanent(err) } - req, err := http.NewRequestWithContext(ctx, "POST", l.config.ClientConfig.Endpoint, bytes.NewReader(buf)) + req, err := http.NewRequestWithContext(ctx, http.MethodPost, l.config.ClientConfig.Endpoint, bytes.NewReader(buf)) if err != nil { return consumererror.NewPermanent(err) } diff --git a/exporter/lokiexporter/exporter_test.go b/exporter/lokiexporter/exporter_test.go index 6fbb09b3b3f0..37f29f29d3da 100644 --- a/exporter/lokiexporter/exporter_test.go +++ b/exporter/lokiexporter/exporter_test.go @@ -65,24 +65,24 @@ func TestPushLogData(t *testing.T) { // prepare ts := httptest.NewServer(http.HandlerFunc(func(_ http.ResponseWriter, r *http.Request) { encPayload, err := io.ReadAll(r.Body) - require.NoError(t, err) + assert.NoError(t, err) decPayload, err := snappy.Decode(nil, encPayload) - require.NoError(t, err) + assert.NoError(t, err) err = proto.Unmarshal(decPayload, actualPushRequest) - require.NoError(t, err) + assert.NoError(t, err) })) defer ts.Close() + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Endpoint = ts.URL cfg := &Config{ - ClientConfig: confighttp.ClientConfig{ - Endpoint: ts.URL, - }, + ClientConfig: clientConfig, } f := NewFactory() - exp, err := f.CreateLogsExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + exp, err := f.CreateLogs(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = exp.Start(context.Background(), componenttest.NewNopHost()) @@ -241,27 +241,28 @@ func TestLogsToLokiRequestWithGroupingByTenant(t *testing.T) { // prepare ts := httptest.NewServer(http.HandlerFunc(func(_ http.ResponseWriter, r *http.Request) { encPayload, err := io.ReadAll(r.Body) - require.NoError(t, err) + assert.NoError(t, err) decPayload, err := snappy.Decode(nil, encPayload) - require.NoError(t, err) + assert.NoError(t, err) pr := &push.PushRequest{} err = proto.Unmarshal(decPayload, pr) - require.NoError(t, err) + assert.NoError(t, err) actualPushRequestPerTenant[r.Header.Get("X-Scope-OrgID")] = pr })) defer ts.Close() + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Endpoint = ts.URL + cfg := &Config{ - ClientConfig: confighttp.ClientConfig{ - Endpoint: ts.URL, - }, + ClientConfig: clientConfig, } f := NewFactory() - exp, err := f.CreateLogsExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + exp, err := f.CreateLogs(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = exp.Start(context.Background(), componenttest.NewNopHost()) @@ -276,7 +277,7 @@ func TestLogsToLokiRequestWithGroupingByTenant(t *testing.T) { assert.Equal(t, len(actualPushRequestPerTenant), len(tC.expected)) for tenant, request := range actualPushRequestPerTenant { pr, ok := tC.expected[tenant] - assert.Equal(t, ok, true) + assert.True(t, ok) expectedLabel := pr.label expectedLine := pr.line diff --git a/exporter/lokiexporter/factory.go b/exporter/lokiexporter/factory.go index d82d0ee1355f..50361d137cc4 100644 --- a/exporter/lokiexporter/factory.go +++ b/exporter/lokiexporter/factory.go @@ -11,7 +11,6 @@ import ( "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/config/confighttp" - "go.opentelemetry.io/collector/config/configopaque" "go.opentelemetry.io/collector/config/configretry" "go.opentelemetry.io/collector/exporter" "go.opentelemetry.io/collector/exporter/exporterhelper" @@ -29,16 +28,14 @@ func NewFactory() exporter.Factory { } func createDefaultConfig() component.Config { + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Timeout = 30 * time.Second + // We almost read 0 bytes, so no need to tune ReadBufferSize. + clientConfig.WriteBufferSize = 512 * 1024 return &Config{ - ClientConfig: confighttp.ClientConfig{ - Endpoint: "", - Timeout: 30 * time.Second, - Headers: map[string]configopaque.String{}, - // We almost read 0 bytes, so no need to tune ReadBufferSize. - WriteBufferSize: 512 * 1024, - }, + ClientConfig: clientConfig, BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), DefaultLabelsEnabled: map[string]bool{ "exporter": true, "job": true, @@ -48,21 +45,20 @@ func createDefaultConfig() component.Config { } } -func createLogsExporter(ctx context.Context, set exporter.CreateSettings, config component.Config) (exporter.Logs, error) { +func createLogsExporter(ctx context.Context, set exporter.Settings, config component.Config) (exporter.Logs, error) { exporterConfig := config.(*Config) exp, err := newExporter(exporterConfig, set.TelemetrySettings) - if err != nil { return nil, err } - return exporterhelper.NewLogsExporter( + return exporterhelper.NewLogs( ctx, set, config, exp.pushLogData, // explicitly disable since we rely on http.Client timeout logic. - exporterhelper.WithTimeout(exporterhelper.TimeoutSettings{Timeout: 0}), + exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}), exporterhelper.WithRetry(exporterConfig.BackOffConfig), exporterhelper.WithQueue(exporterConfig.QueueSettings), exporterhelper.WithStart(exp.start), diff --git a/exporter/lokiexporter/factory_test.go b/exporter/lokiexporter/factory_test.go index c9c01d4faf39..c24650045877 100644 --- a/exporter/lokiexporter/factory_test.go +++ b/exporter/lokiexporter/factory_test.go @@ -5,13 +5,12 @@ package lokiexporter import ( "context" - "fmt" - "net/http" "testing" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/config/confighttp" + "go.opentelemetry.io/collector/config/configtls" ) const ( @@ -19,11 +18,12 @@ const ( ) func TestExporter_new(t *testing.T) { + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Endpoint = validEndpoint + t.Run("with valid config", func(t *testing.T) { config := &Config{ - ClientConfig: confighttp.ClientConfig{ - Endpoint: validEndpoint, - }, + ClientConfig: clientConfig, } exp, err := newExporter(config, componenttest.NewNopTelemetrySettings()) require.NoError(t, err) @@ -32,10 +32,11 @@ func TestExporter_new(t *testing.T) { } func TestExporter_startReturnsNillWhenValidConfig(t *testing.T) { + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Endpoint = validEndpoint + config := &Config{ - ClientConfig: confighttp.ClientConfig{ - Endpoint: validEndpoint, - }, + ClientConfig: clientConfig, } exp, err := newExporter(config, componenttest.NewNopTelemetrySettings()) require.NoError(t, err) @@ -44,14 +45,17 @@ func TestExporter_startReturnsNillWhenValidConfig(t *testing.T) { } func TestExporter_startReturnsErrorWhenInvalidHttpClientSettings(t *testing.T) { - config := &Config{ - ClientConfig: confighttp.ClientConfig{ - Endpoint: "", - CustomRoundTripper: func(_ http.RoundTripper) (http.RoundTripper, error) { - return nil, fmt.Errorf("this causes ClientConfig.ToClient() to error") - }, + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Endpoint = "" + clientConfig.TLSSetting = configtls.ClientConfig{ + Config: configtls.Config{ + MinVersion: "invalid", }, } + + config := &Config{ + ClientConfig: clientConfig, + } exp, err := newExporter(config, componenttest.NewNopTelemetrySettings()) require.NoError(t, err) require.NotNil(t, exp) @@ -59,10 +63,11 @@ func TestExporter_startReturnsErrorWhenInvalidHttpClientSettings(t *testing.T) { } func TestExporter_stopAlwaysReturnsNil(t *testing.T) { + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Endpoint = validEndpoint + config := &Config{ - ClientConfig: confighttp.ClientConfig{ - Endpoint: validEndpoint, - }, + ClientConfig: clientConfig, } exp, err := newExporter(config, componenttest.NewNopTelemetrySettings()) require.NoError(t, err) diff --git a/exporter/lokiexporter/generated_component_telemetry_test.go b/exporter/lokiexporter/generated_component_telemetry_test.go index 4954d93b80ee..80c96b84caa8 100644 --- a/exporter/lokiexporter/generated_component_telemetry_test.go +++ b/exporter/lokiexporter/generated_component_telemetry_test.go @@ -12,6 +12,8 @@ import ( "go.opentelemetry.io/otel/sdk/metric/metricdata/metricdatatest" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/config/configtelemetry" "go.opentelemetry.io/collector/exporter" "go.opentelemetry.io/collector/exporter/exportertest" ) @@ -21,12 +23,18 @@ type componentTestTelemetry struct { meterProvider *sdkmetric.MeterProvider } -func (tt *componentTestTelemetry) NewCreateSettings() exporter.CreateSettings { - settings := exportertest.NewNopCreateSettings() - settings.MeterProvider = tt.meterProvider - settings.ID = component.NewID(component.MustNewType("loki")) +func (tt *componentTestTelemetry) NewSettings() exporter.Settings { + set := exportertest.NewNopSettings() + set.ID = component.NewID(component.MustNewType("loki")) + set.TelemetrySettings = tt.newTelemetrySettings() + return set +} - return settings +func (tt *componentTestTelemetry) newTelemetrySettings() component.TelemetrySettings { + set := componenttest.NewNopTelemetrySettings() + set.MeterProvider = tt.meterProvider + set.MetricsLevel = configtelemetry.LevelDetailed + return set } func setupTestTelemetry() componentTestTelemetry { diff --git a/exporter/lokiexporter/generated_component_test.go b/exporter/lokiexporter/generated_component_test.go index 2221983ae170..a0cef5e154e5 100644 --- a/exporter/lokiexporter/generated_component_test.go +++ b/exporter/lokiexporter/generated_component_test.go @@ -32,13 +32,13 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, } @@ -50,21 +50,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(exporter.Logs) require.True(t, ok) diff --git a/exporter/lokiexporter/go.mod b/exporter/lokiexporter/go.mod index 31ba93195f24..d0a957c047ba 100644 --- a/exporter/lokiexporter/go.mod +++ b/exporter/lokiexporter/go.mod @@ -1,29 +1,31 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/lokiexporter -go 1.21.0 +go 1.22.0 require ( github.com/cenkalti/backoff/v4 v4.3.0 github.com/gogo/protobuf v1.3.2 github.com/golang/snappy v0.0.4 github.com/grafana/loki/pkg/push v0.0.0-20240514112848-a1b1eeb09583 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/loki v0.102.0 - github.com/prometheus/common v0.53.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector v0.102.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/confighttp v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 - go.opentelemetry.io/collector/config/configtls v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/sdk/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/loki v0.116.0 + github.com/prometheus/common v0.61.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/client v1.22.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/confighttp v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 + go.opentelemetry.io/collector/config/configtls v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/otel/metric v1.32.0 + go.opentelemetry.io/otel/sdk/metric v1.32.0 + go.opentelemetry.io/otel/trace v1.32.0 go.uber.org/goleak v1.3.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 @@ -35,52 +37,62 @@ require ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dennwc/varint v1.0.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd // indirect + github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.102.0 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.116.0 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect + github.com/prometheus/client_golang v1.20.4 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e // indirect - github.com/rs/cors v1.10.1 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/collector/semconv v0.102.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/prometheus/prometheus v0.54.1 // indirect + github.com/rs/cors v1.11.1 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/consumer v1.22.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/collector/semconv v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect go.uber.org/atomic v1.11.0 // indirect golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/lokiexporter/go.sum b/exporter/lokiexporter/go.sum index 67a051a3c434..15672468819a 100644 --- a/exporter/lokiexporter/go.sum +++ b/exporter/lokiexporter/go.sum @@ -1,15 +1,15 @@ -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.10.0 h1:n1DH8TPV4qqPTje2RcUBYwtrTWlabVp4n46+74X2pn4= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.10.0/go.mod h1:HDcZnuGbiyppErN6lB+idp4CKhjbc8gwjto6OPpyggM= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1 h1:sO0/P7g68FrryJzljemN+6GTssUXdANk6aJ7T1ZxnsQ= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1/go.mod h1:h8hyGFDsU5HMivxiS2iYFZsgDbU9OnnJ163x5UGVKYo= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 h1:LqbJ/WzJUwBf8UiaSzgX7aMclParm9/5Vgp+TY51uBQ= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2/go.mod h1:yInRyqWXAuaPrgI7p70+lDDgh3mlBohis29jGMISnmc= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 h1:DzHpqpoJVaCgOUdVHxE8QB52S6NiVdDQvGlny1qvPqA= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= -github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 h1:ez/4by2iGztzR4L0zgAOR8lTQK9VlyBVVd7G4omaOQs= -github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/aws/aws-sdk-go v1.50.32 h1:POt81DvegnpQKM4DMDLlHz1CO6OBnEoQ1gRhYFd7QRY= -github.com/aws/aws-sdk-go v1.50.32/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0 h1:GJHeeA2N7xrG3q30L2UXDyuWRzDM900/65j70wcM4Ww= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0/go.mod h1:l38EPgmsp71HHLq9j7De57JcKOWPyhrsW1Awm1JS6K0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 h1:t3eaIm0rUkzbrIewtiFmMK5RXHej2XnoXNhxVsAYUfg= +github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= +github.com/aws/aws-sdk-go v1.54.19 h1:tyWV+07jagrNiCcGRzRhdtVjQs7Vy41NwsuOcl0IbVI= +github.com/aws/aws-sdk-go v1.54.19/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 h1:6df1vn4bBlDDo4tARvBm7l6KA9iVMnE3NWizDeWSrps= github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3/go.mod h1:CIWtjkly68+yqLPbvwwR/fjNJA/idrtULjZWh2v1ys0= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -26,23 +26,23 @@ github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE= github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw= -github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= @@ -54,8 +54,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grafana/loki/pkg/push v0.0.0-20240514112848-a1b1eeb09583 h1:dN3eF1S5fvVu2l9WoqYSvmNmPK8Uh2vjE4yUsBq80l4= github.com/grafana/loki/pkg/push v0.0.0-20240514112848-a1b1eeb09583/go.mod h1:lJEF/Wh5MYlmBem6tOYAFObkLsuikfrEf8Iy9AdMPiQ= -github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= -github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc h1:GN2Lv3MGO7AS6PrRoT6yV5+wkrOpcszoIsO4+4ds248= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= @@ -66,14 +66,14 @@ 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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -89,91 +89,119 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= +github.com/prometheus/client_golang v1.20.4 h1:Tgh3Yr67PaOv/uTqloMsCEdeuFTatm5zIq5+qNN23vI= +github.com/prometheus/client_golang v1.20.4/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= +github.com/prometheus/common v0.61.0 h1:3gv/GThfX0cV2lpO7gkTUwZru38mxevy90Bj8YFSRQQ= +github.com/prometheus/common v0.61.0/go.mod h1:zr29OCN/2BsJRaFwG8QOBr41D6kkchKbpeNH7pAjb/s= github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e h1:UmqAuY2OyDoog8+l5FybViJE5B2r+UxVGCUwFTsY5AA= -github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e/go.mod h1:+0ld+ozir7zWFcHA2vVpWAKxXakIioEjPPNOqH+J3ZA= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/prometheus/prometheus v0.54.1 h1:vKuwQNjnYN2/mDoWfHXDhAsz/68q/dQDb+YbcEqU7MQ= +github.com/prometheus/prometheus v0.54.1/go.mod h1:xlLByHhk2g3ycakQGrMaU8K7OySZx98BzeCR99991NY= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -185,8 +213,8 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw= golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -195,24 +223,24 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= -golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -223,14 +251,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= @@ -243,7 +269,7 @@ k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQI k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg= k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= -k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= -k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= diff --git a/exporter/lokiexporter/internal/metadata/generated_status.go b/exporter/lokiexporter/internal/metadata/generated_status.go index eb80be3c6ade..1b3541698594 100644 --- a/exporter/lokiexporter/internal/metadata/generated_status.go +++ b/exporter/lokiexporter/internal/metadata/generated_status.go @@ -7,9 +7,10 @@ import ( ) var ( - Type = component.MustNewType("loki") + Type = component.MustNewType("loki") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/lokiexporter" ) const ( - LogsStability = component.StabilityLevelBeta + LogsStability = component.StabilityLevelDeprecated ) diff --git a/exporter/lokiexporter/internal/metadata/generated_telemetry.go b/exporter/lokiexporter/internal/metadata/generated_telemetry.go index ff882f0f1e73..e0d9797081d1 100644 --- a/exporter/lokiexporter/internal/metadata/generated_telemetry.go +++ b/exporter/lokiexporter/internal/metadata/generated_telemetry.go @@ -14,51 +14,52 @@ import ( ) func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/loki") + return settings.MeterProvider.Meter("github.com/open-telemetry/opentelemetry-collector-contrib/exporter/lokiexporter") } func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/loki") + return settings.TracerProvider.Tracer("github.com/open-telemetry/opentelemetry-collector-contrib/exporter/lokiexporter") } // TelemetryBuilder provides an interface for components to report telemetry // as defined in metadata and user config. type TelemetryBuilder struct { + meter metric.Meter LokiexporterSendFailedDueToMissingLabels metric.Int64Counter - level configtelemetry.Level } -// telemetryBuilderOption applies changes to default builder. -type telemetryBuilderOption func(*TelemetryBuilder) +// TelemetryBuilderOption applies changes to default builder. +type TelemetryBuilderOption interface { + apply(*TelemetryBuilder) +} -// WithLevel sets the current telemetry level for the component. -func WithLevel(lvl configtelemetry.Level) telemetryBuilderOption { - return func(builder *TelemetryBuilder) { - builder.level = lvl - } +type telemetryBuilderOptionFunc func(mb *TelemetryBuilder) + +func (tbof telemetryBuilderOptionFunc) apply(mb *TelemetryBuilder) { + tbof(mb) } // NewTelemetryBuilder provides a struct with methods to update all internal telemetry // for a component -func NewTelemetryBuilder(settings component.TelemetrySettings, options ...telemetryBuilderOption) (*TelemetryBuilder, error) { - builder := TelemetryBuilder{level: configtelemetry.LevelBasic} +func NewTelemetryBuilder(settings component.TelemetrySettings, options ...TelemetryBuilderOption) (*TelemetryBuilder, error) { + builder := TelemetryBuilder{} for _, op := range options { - op(&builder) - } - var ( - err, errs error - meter metric.Meter - ) - if builder.level >= configtelemetry.LevelBasic { - meter = Meter(settings) - } else { - meter = noop.Meter{} + op.apply(&builder) } - builder.LokiexporterSendFailedDueToMissingLabels, err = meter.Int64Counter( - "lokiexporter_send_failed_due_to_missing_labels", + builder.meter = Meter(settings) + var err, errs error + builder.LokiexporterSendFailedDueToMissingLabels, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_lokiexporter_send_failed_due_to_missing_labels", metric.WithDescription("Number of log records failed to send because labels were missing"), metric.WithUnit("1"), ) errs = errors.Join(errs, err) return &builder, errs } + +func getLeveledMeter(meter metric.Meter, cfgLevel, srvLevel configtelemetry.Level) metric.Meter { + if cfgLevel <= srvLevel { + return meter + } + return noop.Meter{} +} diff --git a/exporter/lokiexporter/internal/metadata/generated_telemetry_test.go b/exporter/lokiexporter/internal/metadata/generated_telemetry_test.go index 9f901038e567..7d2808159ab4 100644 --- a/exporter/lokiexporter/internal/metadata/generated_telemetry_test.go +++ b/exporter/lokiexporter/internal/metadata/generated_telemetry_test.go @@ -14,6 +14,7 @@ import ( nooptrace "go.opentelemetry.io/otel/trace/noop" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" ) type mockMeter struct { @@ -49,28 +50,25 @@ func TestProviders(t *testing.T) { meter := Meter(set) if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/loki", m.name) + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/lokiexporter", m.name) } else { require.Fail(t, "returned Meter not mockMeter") } tracer := Tracer(set) if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/loki", m.name) + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/lokiexporter", m.name) } else { require.Fail(t, "returned Meter not mockTracer") } } func TestNewTelemetryBuilder(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } + set := componenttest.NewNopTelemetrySettings() applied := false - _, err := NewTelemetryBuilder(set, func(b *TelemetryBuilder) { + _, err := NewTelemetryBuilder(set, telemetryBuilderOptionFunc(func(b *TelemetryBuilder) { applied = true - }) + })) require.NoError(t, err) require.True(t, applied) } diff --git a/exporter/lokiexporter/metadata.yaml b/exporter/lokiexporter/metadata.yaml index a0b3be7a2cef..9ad3e2c2d47b 100644 --- a/exporter/lokiexporter/metadata.yaml +++ b/exporter/lokiexporter/metadata.yaml @@ -1,14 +1,13 @@ type: loki -scope_name: otelcol/loki status: class: exporter stability: - beta: [logs] + deprecated: [logs] distributions: - contrib codeowners: - active: [gramidt, gouthamve, jpkrohling, mar4uk] + active: [gramidt, mar4uk] tests: expect_consumer_error: true @@ -18,7 +17,7 @@ telemetry: lokiexporter_send_failed_due_to_missing_labels: enabled: true description: Number of log records failed to send because labels were missing - unit: 1 + unit: "1" sum: monotonic: true value_type: int diff --git a/exporter/mezmoexporter/README.md b/exporter/mezmoexporter/README.md index 1846c062ba63..d7f2cb7be9ad 100644 --- a/exporter/mezmoexporter/README.md +++ b/exporter/mezmoexporter/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fmezmo%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fmezmo) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fmezmo%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fmezmo) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@dashpole](https://www.github.com/dashpole), [@billmeyer](https://www.github.com/billmeyer), [@gjanco](https://www.github.com/gjanco) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib diff --git a/exporter/mezmoexporter/config.go b/exporter/mezmoexporter/config.go index 691f19f54094..c1e74db45893 100644 --- a/exporter/mezmoexporter/config.go +++ b/exporter/mezmoexporter/config.go @@ -33,9 +33,9 @@ const ( // Config defines configuration for Mezmo exporter. type Config struct { - confighttp.ClientConfig `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. - exporterhelper.QueueSettings `mapstructure:"sending_queue"` - configretry.BackOffConfig `mapstructure:"retry_on_failure"` + confighttp.ClientConfig `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` + configretry.BackOffConfig `mapstructure:"retry_on_failure"` // IngestURL is the URL to send telemetry to. IngestURL string `mapstructure:"ingest_url"` @@ -46,9 +46,9 @@ type Config struct { // returns default http client settings func createDefaultClientConfig() confighttp.ClientConfig { - return confighttp.ClientConfig{ - Timeout: defaultTimeout, - } + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Timeout = defaultTimeout + return clientConfig } func (c *Config) Validate() error { diff --git a/exporter/mezmoexporter/config_test.go b/exporter/mezmoexporter/config_test.go index 953ea71aa778..aa2e9b789e84 100644 --- a/exporter/mezmoexporter/config_test.go +++ b/exporter/mezmoexporter/config_test.go @@ -13,6 +13,7 @@ import ( "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/config/confighttp" + "go.opentelemetry.io/collector/config/configopaque" "go.opentelemetry.io/collector/config/configretry" "go.opentelemetry.io/collector/confmap/confmaptest" "go.opentelemetry.io/collector/exporter/exporterhelper" @@ -42,7 +43,12 @@ func TestLoadConfig(t *testing.T) { id: component.NewIDWithName(metadata.Type, "allsettings"), expected: &Config{ ClientConfig: confighttp.ClientConfig{ - Timeout: 5 * time.Second, + Timeout: 5 * time.Second, + MaxIdleConns: &defaultMaxIdleConns, + MaxIdleConnsPerHost: &defaultMaxIdleConnsPerHost, + MaxConnsPerHost: &defaultMaxConnsPerHost, + IdleConnTimeout: &defaultIdleConnTimeout, + Headers: map[string]configopaque.String{}, }, BackOffConfig: configretry.BackOffConfig{ Enabled: false, @@ -52,7 +58,7 @@ func TestLoadConfig(t *testing.T) { RandomizationFactor: backoff.DefaultRandomizationFactor, Multiplier: backoff.DefaultMultiplier, }, - QueueSettings: exporterhelper.QueueSettings{ + QueueSettings: exporterhelper.QueueConfig{ Enabled: false, NumConsumers: 7, QueueSize: 17, @@ -70,7 +76,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) diff --git a/exporter/mezmoexporter/exporter.go b/exporter/mezmoexporter/exporter.go index 3e60c24ec323..46df8e26c174 100644 --- a/exporter/mezmoexporter/exporter.go +++ b/exporter/mezmoexporter/exporter.go @@ -42,7 +42,7 @@ type mezmoLogBody struct { } func newLogsExporter(config *Config, settings component.TelemetrySettings, buildInfo component.BuildInfo, logger *zap.Logger) *mezmoExporter { - var e = &mezmoExporter{ + e := &mezmoExporter{ config: config, settings: settings, userAgentString: fmt.Sprintf("mezmo-otel-exporter/%s", buildInfo.Version), @@ -145,7 +145,7 @@ func (m *mezmoExporter) logDataToMezmo(ld plog.Logs) error { return fmt.Errorf("error Creating JSON payload: %w", errs) } - var newBufSize = b.Len() + len(lineBytes) + newBufSize := b.Len() + len(lineBytes) if newBufSize >= maxBodySize-2 { str := b.String() str = str[:len(str)-1] + "]}" @@ -167,7 +167,7 @@ func (m *mezmoExporter) logDataToMezmo(ld plog.Logs) error { } func (m *mezmoExporter) sendLinesToMezmo(post string) (errs error) { - req, _ := http.NewRequest("POST", m.config.IngestURL, strings.NewReader(post)) + req, _ := http.NewRequest(http.MethodPost, m.config.IngestURL, strings.NewReader(post)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("User-Agent", m.userAgentString) diff --git a/exporter/mezmoexporter/exporter_test.go b/exporter/mezmoexporter/exporter_test.go index 9722a20b3cc0..1e601f221050 100644 --- a/exporter/mezmoexporter/exporter_test.go +++ b/exporter/mezmoexporter/exporter_test.go @@ -20,7 +20,7 @@ import ( "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "go.uber.org/zap" "go.uber.org/zap/zapcore" "go.uber.org/zap/zaptest/observer" @@ -74,8 +74,8 @@ func createMaxLogData() plog.Logs { rl.ScopeLogs().AppendEmpty() // Add an empty ScopeLogs sl := rl.ScopeLogs().AppendEmpty() - var lineLen = maxMessageSize - var lineCnt = (maxBodySize / lineLen) * 2 + lineLen := maxMessageSize + lineCnt := (maxBodySize / lineLen) * 2 for i := 0; i < lineCnt; i++ { ts := pcommon.Timestamp(int64(i) * time.Millisecond.Nanoseconds()) @@ -109,20 +109,20 @@ type testServer struct { url string } -type httpAssertionCallback func(req *http.Request, body mezmoLogBody) (int, string) -type testServerParams struct { - t *testing.T - assertionsCallback httpAssertionCallback -} +type ( + httpAssertionCallback func(req *http.Request, body mezmoLogBody) (int, string) + testServerParams struct { + t *testing.T + assertionsCallback httpAssertionCallback + } +) // Creates an HTTP server to test log delivery payloads by applying a set of // assertions through the assertCB function. func createHTTPServer(params *testServerParams) testServer { httpServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { body, err := io.ReadAll(r.Body) - if err != nil { - params.t.Fatal(err) - } + assert.NoError(params.t, err) var logBody mezmoLogBody if err = json.Unmarshal(body, &logBody); err != nil { @@ -185,19 +185,19 @@ func TestLogsExporter(t *testing.T) { exporter := createExporter(t, config, log) t.Run("Test simple log data", func(t *testing.T) { - var logs = createSimpleLogData(3) + logs := createSimpleLogData(3) err := exporter.pushLogData(context.Background(), logs) require.NoError(t, err) }) t.Run("Test max message size", func(t *testing.T) { - var logs = createSizedPayloadLogData(maxMessageSize) + logs := createSizedPayloadLogData(maxMessageSize) err := exporter.pushLogData(context.Background(), logs) require.NoError(t, err) }) t.Run("Test max body size", func(t *testing.T) { - var logs = createMaxLogData() + logs := createMaxLogData() err := exporter.pushLogData(context.Background(), logs) require.NoError(t, err) }) @@ -212,10 +212,10 @@ func TestAddsRequiredAttributes(t *testing.T) { lines := body.Lines for _, line := range lines { - assert.True(t, line.Timestamp > 0) - assert.Equal(t, line.Level, "info") - assert.Equal(t, line.App, "") - assert.Equal(t, line.Line, "minimal attribute log") + assert.Positive(t, line.Timestamp) + assert.Equal(t, "info", line.Level) + assert.Equal(t, "", line.App) + assert.Equal(t, "minimal attribute log", line.Line) } return http.StatusOK, "" @@ -256,17 +256,17 @@ func Test404IngestError(t *testing.T) { err := exporter.pushLogData(context.Background(), logs) require.NoError(t, err) - assert.Equal(t, logObserver.Len(), 2) + assert.Equal(t, 2, logObserver.Len()) logLine := logObserver.All()[0] - assert.Equal(t, logLine.Message, "got http status (/foobar): 404 Not Found") - assert.Equal(t, logLine.Level, zapcore.ErrorLevel) + assert.Equal(t, "got http status (/foobar): 404 Not Found", logLine.Message) + assert.Equal(t, zapcore.ErrorLevel, logLine.Level) logLine = logObserver.All()[1] - assert.Equal(t, logLine.Message, "http response") - assert.Equal(t, logLine.Level, zapcore.DebugLevel) + assert.Equal(t, "http response", logLine.Message) + assert.Equal(t, zapcore.DebugLevel, logLine.Level) responseField := logLine.Context[0] - assert.Equal(t, responseField.Key, "response") - assert.Equal(t, responseField.String, `{"foo":"bar"}`) + assert.Equal(t, "response", responseField.Key) + assert.JSONEq(t, `{"foo":"bar"}`, responseField.String) } diff --git a/exporter/mezmoexporter/factory.go b/exporter/mezmoexporter/factory.go index f771189aad26..88eeb8ad1699 100644 --- a/exporter/mezmoexporter/factory.go +++ b/exporter/mezmoexporter/factory.go @@ -29,13 +29,13 @@ func createDefaultConfig() component.Config { return &Config{ ClientConfig: createDefaultClientConfig(), BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), IngestURL: defaultIngestURL, } } // Create a log exporter for exporting to Mezmo -func createLogsExporter(ctx context.Context, settings exporter.CreateSettings, exporterConfig component.Config) (exporter.Logs, error) { +func createLogsExporter(ctx context.Context, settings exporter.Settings, exporterConfig component.Config) (exporter.Logs, error) { log := settings.Logger if exporterConfig == nil { @@ -45,13 +45,13 @@ func createLogsExporter(ctx context.Context, settings exporter.CreateSettings, e exp := newLogsExporter(expCfg, settings.TelemetrySettings, settings.BuildInfo, log) - return exporterhelper.NewLogsExporter( + return exporterhelper.NewLogs( ctx, settings, expCfg, exp.pushLogData, // explicitly disable since we rely on http.Client timeout logic. - exporterhelper.WithTimeout(exporterhelper.TimeoutSettings{Timeout: 0}), + exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}), exporterhelper.WithRetry(expCfg.BackOffConfig), exporterhelper.WithQueue(expCfg.QueueSettings), exporterhelper.WithStart(exp.start), diff --git a/exporter/mezmoexporter/factory_test.go b/exporter/mezmoexporter/factory_test.go index d68d4b7df8b4..77518c4cd371 100644 --- a/exporter/mezmoexporter/factory_test.go +++ b/exporter/mezmoexporter/factory_test.go @@ -5,12 +5,14 @@ package mezmoexporter import ( "context" + "net/http" "testing" "time" "github.com/stretchr/testify/assert" "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/config/confighttp" + "go.opentelemetry.io/collector/config/configopaque" "go.opentelemetry.io/collector/config/configretry" "go.opentelemetry.io/collector/exporter/exporterhelper" "go.opentelemetry.io/collector/exporter/exportertest" @@ -24,20 +26,32 @@ func TestType(t *testing.T) { assert.Equal(t, pType, metadata.Type) } +var ( + defaultMaxIdleConns = http.DefaultTransport.(*http.Transport).MaxIdleConns + defaultMaxIdleConnsPerHost = http.DefaultTransport.(*http.Transport).MaxIdleConnsPerHost + defaultMaxConnsPerHost = http.DefaultTransport.(*http.Transport).MaxConnsPerHost + defaultIdleConnTimeout = http.DefaultTransport.(*http.Transport).IdleConnTimeout +) + func TestCreateDefaultConfig(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() - assert.Equal(t, cfg, &Config{ + assert.Equal(t, &Config{ IngestURL: defaultIngestURL, IngestKey: "", ClientConfig: confighttp.ClientConfig{ - Timeout: 5 * time.Second, + Timeout: 5 * time.Second, + MaxIdleConns: &defaultMaxIdleConns, + MaxIdleConnsPerHost: &defaultMaxIdleConnsPerHost, + MaxConnsPerHost: &defaultMaxConnsPerHost, + IdleConnTimeout: &defaultIdleConnTimeout, + Headers: map[string]configopaque.String{}, }, BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), - }) + QueueSettings: exporterhelper.NewDefaultQueueConfig(), + }, cfg) assert.NoError(t, componenttest.CheckConfigStruct(cfg)) } @@ -49,18 +63,18 @@ func TestIngestUrlMustConform(t *testing.T) { assert.Error(t, cfg.Validate(), `"ingest_url" must contain a valid host`) } -func TestCreateLogsExporter(t *testing.T) { +func TestCreateLogs(t *testing.T) { cfg := createDefaultConfig().(*Config) cfg.IngestURL = "https://example.com:8088/otel/ingest/rest" cfg.IngestKey = "1234-1234" - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() _, err := createLogsExporter(context.Background(), params, cfg) assert.NoError(t, err) } -func TestCreateLogsExporterNoConfig(t *testing.T) { - params := exportertest.NewNopCreateSettings() +func TestCreateLogsNoConfig(t *testing.T) { + params := exportertest.NewNopSettings() _, err := createLogsExporter(context.Background(), params, nil) assert.Error(t, err) } diff --git a/exporter/mezmoexporter/generated_component_test.go b/exporter/mezmoexporter/generated_component_test.go index 983f3eb8b1af..c83dbc0a4e7a 100644 --- a/exporter/mezmoexporter/generated_component_test.go +++ b/exporter/mezmoexporter/generated_component_test.go @@ -32,13 +32,13 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, } @@ -50,21 +50,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(exporter.Logs) require.True(t, ok) diff --git a/exporter/mezmoexporter/go.mod b/exporter/mezmoexporter/go.mod index b663e69d3d87..888ae92fdc35 100644 --- a/exporter/mezmoexporter/go.mod +++ b/exporter/mezmoexporter/go.mod @@ -1,75 +1,80 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/mezmoexporter -go 1.21.0 +go 1.22.0 require ( github.com/cenkalti/backoff/v4 v4.3.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/confighttp v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/confighttp v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/semconv v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/rs/cors v1.10.1 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/consumer v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + github.com/rs/cors v1.11.1 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/configtls v1.22.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/consumer v1.22.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/mezmoexporter/go.sum b/exporter/mezmoexporter/go.sum index 3faaee5330e9..59bcbbb92a51 100644 --- a/exporter/mezmoexporter/go.sum +++ b/exporter/mezmoexporter/go.sum @@ -1,25 +1,23 @@ -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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= @@ -33,14 +31,14 @@ 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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -54,80 +52,98 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -143,20 +159,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -165,12 +181,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/exporter/mezmoexporter/internal/metadata/generated_status.go b/exporter/mezmoexporter/internal/metadata/generated_status.go index b95de9716913..d158b0a0cc6d 100644 --- a/exporter/mezmoexporter/internal/metadata/generated_status.go +++ b/exporter/mezmoexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("mezmo") + Type = component.MustNewType("mezmo") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/mezmoexporter" ) const ( diff --git a/exporter/mezmoexporter/internal/metadata/generated_telemetry.go b/exporter/mezmoexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index a0339e5015ac..000000000000 --- a/exporter/mezmoexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/mezmo") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/mezmo") -} diff --git a/exporter/mezmoexporter/internal/metadata/generated_telemetry_test.go b/exporter/mezmoexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 09f812776c5e..000000000000 --- a/exporter/mezmoexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/mezmo", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/mezmo", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/mezmoexporter/metadata.yaml b/exporter/mezmoexporter/metadata.yaml index 457faeeb2b31..281b1cbf1636 100644 --- a/exporter/mezmoexporter/metadata.yaml +++ b/exporter/mezmoexporter/metadata.yaml @@ -1,5 +1,4 @@ type: mezmo -scope_name: otelcol/mezmo status: class: exporter diff --git a/exporter/mezmoexporter/utils_test.go b/exporter/mezmoexporter/utils_test.go index eeb183cdf0e5..1b5e6d96082d 100644 --- a/exporter/mezmoexporter/utils_test.go +++ b/exporter/mezmoexporter/utils_test.go @@ -13,34 +13,34 @@ import ( func TestTruncateString(t *testing.T) { t.Run("Test empty string", func(t *testing.T) { s := truncateString("", 10) - require.Len(t, s, 0) + require.Empty(t, s) }) // Test string is less than the maximum length t.Run("Test shorter string", func(t *testing.T) { s := truncateString("short", 10) require.Len(t, s, 5) - require.Equal(t, s, "short") + require.Equal(t, "short", s) }) // Test string is equal to the maximum length t.Run("Test equal string", func(t *testing.T) { s := truncateString("short", 5) require.Len(t, s, 5) - require.Equal(t, s, "short") + require.Equal(t, "short", s) }) // Test string is longer than the maximum length t.Run("Test longer string", func(t *testing.T) { s := truncateString("longstring", 4) require.Len(t, s, 4) - require.Equal(t, s, "long") + require.Equal(t, "long", s) }) } func TestRandString(t *testing.T) { t.Run("Test fixed length string", func(t *testing.T) { - var s = randString(16 * 1024) + s := randString(16 * 1024) require.Len(t, s, 16*1024) }) } diff --git a/exporter/opencensusexporter/README.md b/exporter/opencensusexporter/README.md index f4fb787a6f90..e60ce46c85a9 100644 --- a/exporter/opencensusexporter/README.md +++ b/exporter/opencensusexporter/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fopencensus%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fopencensus) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fopencensus%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fopencensus) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@open-telemetry/collector-approvers](https://github.com/orgs/open-telemetry/teams/collector-approvers) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [core]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib diff --git a/exporter/opencensusexporter/config.go b/exporter/opencensusexporter/config.go index 7890a95609c0..b241147f048b 100644 --- a/exporter/opencensusexporter/config.go +++ b/exporter/opencensusexporter/config.go @@ -12,9 +12,9 @@ import ( // Config defines configuration for OpenCensus exporter. type Config struct { - configgrpc.ClientConfig `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. - exporterhelper.QueueSettings `mapstructure:"sending_queue"` - configretry.BackOffConfig `mapstructure:"retry_on_failure"` + configgrpc.ClientConfig `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` + configretry.BackOffConfig `mapstructure:"retry_on_failure"` // The number of workers that send the gRPC requests. NumWorkers int `mapstructure:"num_workers"` diff --git a/exporter/opencensusexporter/config_test.go b/exporter/opencensusexporter/config_test.go index 323fdd64ed11..f3b8fc991dff 100644 --- a/exporter/opencensusexporter/config_test.go +++ b/exporter/opencensusexporter/config_test.go @@ -44,7 +44,7 @@ func TestLoadConfig(t *testing.T) { MaxInterval: 1 * time.Minute, MaxElapsedTime: 10 * time.Minute, }, - QueueSettings: exporterhelper.QueueSettings{ + QueueSettings: exporterhelper.QueueConfig{ Enabled: true, NumConsumers: 2, QueueSize: 10, @@ -83,7 +83,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) diff --git a/exporter/opencensusexporter/factory.go b/exporter/opencensusexporter/factory.go index 4cf079f447dc..d6821b8e0662 100644 --- a/exporter/opencensusexporter/factory.go +++ b/exporter/opencensusexporter/factory.go @@ -34,14 +34,14 @@ func createDefaultConfig() component.Config { } } -func createTracesExporter(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (exporter.Traces, error) { +func createTracesExporter(ctx context.Context, set exporter.Settings, cfg component.Config) (exporter.Traces, error) { oCfg := cfg.(*Config) oce, err := newTracesExporter(ctx, oCfg, set.TelemetrySettings) if err != nil { return nil, err } - return exporterhelper.NewTracesExporter( + return exporterhelper.NewTraces( ctx, set, cfg, @@ -53,14 +53,14 @@ func createTracesExporter(ctx context.Context, set exporter.CreateSettings, cfg exporterhelper.WithShutdown(oce.shutdown)) } -func createMetricsExporter(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (exporter.Metrics, error) { +func createMetricsExporter(ctx context.Context, set exporter.Settings, cfg component.Config) (exporter.Metrics, error) { oCfg := cfg.(*Config) oce, err := newMetricsExporter(ctx, oCfg, set.TelemetrySettings) if err != nil { return nil, err } - return exporterhelper.NewMetricsExporter( + return exporterhelper.NewMetrics( ctx, set, cfg, diff --git a/exporter/opencensusexporter/factory_test.go b/exporter/opencensusexporter/factory_test.go index 5b4be53f952e..51cd2b7b7fe0 100644 --- a/exporter/opencensusexporter/factory_test.go +++ b/exporter/opencensusexporter/factory_test.go @@ -26,7 +26,7 @@ func TestCreateDefaultConfig(t *testing.T) { assert.NoError(t, componenttest.CheckConfigStruct(cfg)) } -func TestCreateTracesExporter(t *testing.T) { +func TestCreateTraces(t *testing.T) { endpoint := testutil.GetAvailableLocalAddress(t) tests := []struct { name string @@ -152,7 +152,7 @@ func TestCreateTracesExporter(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - set := exportertest.NewNopCreateSettings() + set := exportertest.NewNopSettings() tExporter, tErr := createTracesExporter(context.Background(), set, tt.config) checkErrorsAndStartAndShutdown(t, tExporter, tErr, tt.mustFailOnCreate, tt.mustFailOnStart) mExporter, mErr := createMetricsExporter(context.Background(), set, tt.config) diff --git a/exporter/opencensusexporter/generated_component_test.go b/exporter/opencensusexporter/generated_component_test.go index 545ab32cb97c..44180376cda0 100644 --- a/exporter/opencensusexporter/generated_component_test.go +++ b/exporter/opencensusexporter/generated_component_test.go @@ -32,20 +32,20 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "metrics", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg) }, }, { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -57,21 +57,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(exporter.Logs) require.True(t, ok) diff --git a/exporter/opencensusexporter/go.mod b/exporter/opencensusexporter/go.mod index 89589df8de42..dbb57bd1992d 100644 --- a/exporter/opencensusexporter/go.mod +++ b/exporter/opencensusexporter/go.mod @@ -1,89 +1,94 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter -go 1.21.0 +go 1.22.0 require ( github.com/census-instrumentation/opencensus-proto v0.4.1 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configgrpc v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/collector/config/configtls v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/pdata/testdata v0.102.0 - go.opentelemetry.io/collector/receiver v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configgrpc v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/config/configtls v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/pdata/testdata v0.116.0 + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 go.uber.org/goleak v1.3.0 - google.golang.org/grpc v1.64.0 + google.golang.org/grpc v1.68.1 ) require ( - github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.2 // indirect + github.com/klauspost/compress v1.17.9 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/mostynb/go-grpc-compression v1.2.2 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.102.0 // indirect + github.com/mostynb/go-grpc-compression v1.2.3 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.116.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/rs/cors v1.11.0 // indirect + github.com/rs/cors v1.11.1 // indirect github.com/soheilhy/cmux v0.1.5 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/confignet v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/semconv v0.102.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/component/componentstatus v0.116.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/confignet v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/collector/semconv v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.30.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/opencensusexporter/go.sum b/exporter/opencensusexporter/go.sum index 907b52e52b6d..7364ecf8ab0e 100644 --- a/exporter/opencensusexporter/go.sum +++ b/exporter/opencensusexporter/go.sum @@ -1,7 +1,5 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -18,15 +16,15 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -59,22 +57,22 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4= -github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -88,23 +86,15 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mostynb/go-grpc-compression v1.2.2 h1:XaDbnRvt2+1vgr0b/l0qh4mJAfIxE0bKXtz2Znl3GGI= -github.com/mostynb/go-grpc-compression v1.2.2/go.mod h1:GOCr2KBxXcblCuczg3YdLQlcin1/NfyDA348ckuCH6w= +github.com/mostynb/go-grpc-compression v1.2.3 h1:42/BKWMy0KEJGSdWvzqIyOZ95YcR9mLPqKctH7Uo//I= +github.com/mostynb/go-grpc-compression v1.2.3/go.mod h1:AghIxF3P57umzqM9yz795+y1Vjs47Km/Y2FE6ouQ7Lg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= -github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -114,68 +104,94 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/configgrpc v0.102.0 h1:cQi5HwpkHvrZJUxZjoGXkWpAuK+gEyp/1Zjn0BrkvmQ= -go.opentelemetry.io/collector/config/configgrpc v0.102.0/go.mod h1:ASpBXzDWLiDGlG8iRFovU5R4LhAefoC4ajm+qIdslOw= -go.opentelemetry.io/collector/config/confignet v0.102.0 h1:+wQevJ/iBnPxL+roY7WWnAjMxB8v4M5QrS3+0iEmauw= -go.opentelemetry.io/collector/config/confignet v0.102.0/go.mod h1:pfOrCTfSZEB6H2rKtx41/3RN4dKs+X2EKQbw3MGRh0E= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 h1:vS1Ao/R55RNV4O7TA2Qopok8yN+X0LIP6RVWLFkprck= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0/go.mod h1:BMsdeOxN04K0L5FNUBfjFdvwWGNe/rkmSwH4Aelu/X0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/configgrpc v0.116.0 h1:O8Y1X9wDH5dDdqDJ9kqoaMrxEauaDSJBg9aNC6QgB7g= +go.opentelemetry.io/collector/config/configgrpc v0.116.0/go.mod h1:RPrSQrr6xhIaAK2DdcECi142NjSo0npQfVQB3nommSo= +go.opentelemetry.io/collector/config/confignet v1.22.0 h1:SBEMHJZWD8J4qgFw1O+BEkXW9AWldDi6Fz5YeDeoU58= +go.opentelemetry.io/collector/config/confignet v1.22.0/go.mod h1:ZppUH1hgUJOubawEsxsQ9MzEYFytqo2GnVSS7d4CVxc= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 h1:yMkBS9yViCc7U7yeLzJPM2XizlfdVvBRSmsQDWu6qc0= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0/go.mod h1:n8MR6/liuGB5EmTETUBeU5ZgqMOlqKRxUaqPQBOANZ8= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -201,8 +217,8 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -213,12 +229,12 @@ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -236,17 +252,17 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 h1:P8OJ/WCl/Xo4E4zoe4/bifHpSmmKwARqyqE4nW6J2GQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38 h1:2oV8dfuIkM1Ti7DwXc0BJfnwr9csz4TDXI9EmiI+Rbw= +google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38/go.mod h1:vuAjtvlwkDKF6L1GQ0SokiRLCGFfeBUXWr/aFFkHACc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 h1:zciRKQ4kBpFgpfC5QQCVtnnNAcLIqweL7plyZRQHVpI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -256,8 +272,8 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/exporter/opencensusexporter/internal/metadata/generated_status.go b/exporter/opencensusexporter/internal/metadata/generated_status.go index b29064d8b396..517251575fa6 100644 --- a/exporter/opencensusexporter/internal/metadata/generated_status.go +++ b/exporter/opencensusexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("opencensus") + Type = component.MustNewType("opencensus") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter" ) const ( diff --git a/exporter/opencensusexporter/internal/metadata/generated_telemetry.go b/exporter/opencensusexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index fda6cdc4fca9..000000000000 --- a/exporter/opencensusexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/opencensus") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/opencensus") -} diff --git a/exporter/opencensusexporter/internal/metadata/generated_telemetry_test.go b/exporter/opencensusexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 3cb88ba75ecd..000000000000 --- a/exporter/opencensusexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/opencensus", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/opencensus", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/opencensusexporter/metadata.yaml b/exporter/opencensusexporter/metadata.yaml index 496eed6c698a..7f757cdf201b 100644 --- a/exporter/opencensusexporter/metadata.yaml +++ b/exporter/opencensusexporter/metadata.yaml @@ -1,5 +1,4 @@ type: opencensus -scope_name: otelcol/opencensus status: class: exporter diff --git a/exporter/opencensusexporter/opencensus_test.go b/exporter/opencensusexporter/opencensus_test.go index 607ed49ca75c..9e03306cf174 100644 --- a/exporter/opencensusexporter/opencensus_test.go +++ b/exporter/opencensusexporter/opencensus_test.go @@ -29,8 +29,8 @@ func TestSendTraces(t *testing.T) { rCfg := rFactory.CreateDefaultConfig().(*opencensusreceiver.Config) endpoint := testutil.GetAvailableLocalAddress(t) rCfg.ServerConfig.NetAddr.Endpoint = endpoint - set := receivertest.NewNopCreateSettings() - recv, err := rFactory.CreateTracesReceiver(context.Background(), set, rCfg, sink) + set := receivertest.NewNopSettings() + recv, err := rFactory.CreateTraces(context.Background(), set, rCfg, sink) assert.NoError(t, err) assert.NoError(t, recv.Start(context.Background(), componenttest.NewNopHost())) t.Cleanup(func() { @@ -46,7 +46,7 @@ func TestSendTraces(t *testing.T) { }, } cfg.NumWorkers = 1 - exp, err := factory.CreateTracesExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + exp, err := factory.CreateTraces(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) require.NotNil(t, exp) host := componenttest.NewNopHost() @@ -87,7 +87,7 @@ func TestSendTraces_NoBackend(t *testing.T) { Insecure: true, }, } - exp, err := factory.CreateTracesExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + exp, err := factory.CreateTraces(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) require.NotNil(t, exp) host := componenttest.NewNopHost() @@ -111,7 +111,7 @@ func TestSendTraces_AfterStop(t *testing.T) { Insecure: true, }, } - exp, err := factory.CreateTracesExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + exp, err := factory.CreateTraces(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) require.NotNil(t, exp) host := componenttest.NewNopHost() @@ -128,8 +128,8 @@ func TestSendMetrics(t *testing.T) { rCfg := rFactory.CreateDefaultConfig().(*opencensusreceiver.Config) endpoint := testutil.GetAvailableLocalAddress(t) rCfg.ServerConfig.NetAddr.Endpoint = endpoint - set := receivertest.NewNopCreateSettings() - recv, err := rFactory.CreateMetricsReceiver(context.Background(), set, rCfg, sink) + set := receivertest.NewNopSettings() + recv, err := rFactory.CreateMetrics(context.Background(), set, rCfg, sink) assert.NoError(t, err) assert.NoError(t, recv.Start(context.Background(), componenttest.NewNopHost())) t.Cleanup(func() { @@ -145,7 +145,7 @@ func TestSendMetrics(t *testing.T) { }, } cfg.NumWorkers = 1 - exp, err := factory.CreateMetricsExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + exp, err := factory.CreateMetrics(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) require.NotNil(t, exp) host := componenttest.NewNopHost() @@ -184,7 +184,7 @@ func TestSendMetrics_NoBackend(t *testing.T) { Insecure: true, }, } - exp, err := factory.CreateMetricsExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + exp, err := factory.CreateMetrics(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) require.NotNil(t, exp) host := componenttest.NewNopHost() @@ -208,7 +208,7 @@ func TestSendMetrics_AfterStop(t *testing.T) { Insecure: true, }, } - exp, err := factory.CreateMetricsExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + exp, err := factory.CreateMetrics(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) require.NotNil(t, exp) host := componenttest.NewNopHost() diff --git a/exporter/opencensusexporter/testdata/config.yaml b/exporter/opencensusexporter/testdata/config.yaml index 66ed63d969f3..aa8df3670c4b 100644 --- a/exporter/opencensusexporter/testdata/config.yaml +++ b/exporter/opencensusexporter/testdata/config.yaml @@ -7,7 +7,7 @@ opencensus/2: ca_file: /var/lib/mycert.pem headers: "can you have a . here?": "F0000000-0000-0000-0000-000000000000" - header1: 234 + header1: "234" another: "somevalue" balancer_name: "round_robin" keepalive: diff --git a/exporter/opensearchexporter/README.md b/exporter/opensearchexporter/README.md index 47c7bd705f87..21f5cc63d350 100644 --- a/exporter/opensearchexporter/README.md +++ b/exporter/opensearchexporter/README.md @@ -3,14 +3,13 @@ | Status | | | ------------- |-----------| -| Stability | [development]: logs | -| | [alpha]: traces | +| Stability | [unmaintained]: traces, logs | | Distributions | [contrib] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fopensearch%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fopensearch) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fopensearch%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fopensearch) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@Aneurysm9](https://www.github.com/Aneurysm9), [@MitchellGale](https://www.github.com/MitchellGale), [@MaxKsyunz](https://www.github.com/MaxKsyunz), [@YANG-DB](https://www.github.com/YANG-DB) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@Aneurysm9](https://www.github.com/Aneurysm9) | +| Emeritus | [@MitchellGale](https://www.github.com/MitchellGale), [@MaxKsyunz](https://www.github.com/MaxKsyunz), [@YANG-DB](https://www.github.com/YANG-DB) | -[development]: https://github.com/open-telemetry/opentelemetry-collector#development -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[unmaintained]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#unmaintained [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib @@ -20,9 +19,15 @@ The documents are sent using [observability catalog](https://github.com/opensear ## Configuration options ### Indexing Options +The Observability indices would follow the recommended pattern for immutable data stream ingestion using +the [data_stream](https://opensearch.org/docs/latest/dashboards/im-dashboards/datastream) concepts. +Index pattern will follow the next naming template `ss4o_{type}-{dataset}-{namespace}` - `dataset` (default=`default`) a user-provided label to classify source of telemetry. It is used to construct the name of the destination index or data stream. - `namespace` (default=`namespace`) a user-provided label to group telemetry. It is used to construct the name of the destination index or data stream. +LogsIndex configures the index, index alias, or data stream name logs should be indexed in. +- `logs_index` a user-provided label to specify name of the destination index or data stream. + ### HTTP Connection Options OpenSearch export supports standard [HTTP client settings](https://github.com/open-telemetry/opentelemetry-collector/tree/main/config/confighttp#client-configuration). - `http.endpoint` (required) `:` of OpenSearch node to send data to. diff --git a/exporter/opensearchexporter/config.go b/exporter/opensearchexporter/config.go index c8546a6d407a..e31fdb37f807 100644 --- a/exporter/opensearchexporter/config.go +++ b/exporter/opensearchexporter/config.go @@ -28,10 +28,10 @@ const ( // Config defines configuration for OpenSearch exporter. type Config struct { - confighttp.ClientConfig `mapstructure:"http"` - configretry.BackOffConfig `mapstructure:"retry_on_failure"` - exporterhelper.TimeoutSettings `mapstructure:",squash"` - MappingsSettings `mapstructure:"mapping"` + confighttp.ClientConfig `mapstructure:"http"` + configretry.BackOffConfig `mapstructure:"retry_on_failure"` + TimeoutSettings exporterhelper.TimeoutConfig `mapstructure:",squash"` + MappingsSettings `mapstructure:"mapping"` // The Observability indices would follow the recommended for immutable data stream ingestion pattern using // the data_stream concepts. See https://opensearch.org/docs/latest/dashboards/im-dashboards/datastream/ diff --git a/exporter/opensearchexporter/config_test.go b/exporter/opensearchexporter/config_test.go index 68d9abd6b681..921ce1a00428 100644 --- a/exporter/opensearchexporter/config_test.go +++ b/exporter/opensearchexporter/config_test.go @@ -44,21 +44,28 @@ func TestLoadConfig(t *testing.T) { expected: sampleCfg, configValidateAssert: assert.NoError, }, + { + id: component.NewIDWithName(metadata.Type, "default"), + expected: withDefaultConfig(), + configValidateAssert: func(t assert.TestingT, err error, _ ...any) bool { + return assert.ErrorContains(t, err, "endpoint must be specified") + }, + }, { id: component.NewIDWithName(metadata.Type, "trace"), expected: &Config{ Dataset: "ngnix", Namespace: "eu", - ClientConfig: confighttp.ClientConfig{ - Endpoint: sampleEndpoint, - Timeout: 2 * time.Minute, - Headers: map[string]configopaque.String{ + ClientConfig: withDefaultHTTPClientConfig(func(config *confighttp.ClientConfig) { + config.Endpoint = sampleEndpoint + config.Timeout = 2 * time.Minute + config.Headers = map[string]configopaque.String{ "myheader": "test", - }, - MaxIdleConns: &maxIdleConns, - IdleConnTimeout: &idleConnTimeout, - Auth: &configauth.Authentication{AuthenticatorID: component.MustNewID("sample_basic_auth")}, - }, + } + config.MaxIdleConns = &maxIdleConns + config.IdleConnTimeout = &idleConnTimeout + config.Auth = &configauth.Authentication{AuthenticatorID: component.MustNewID("sample_basic_auth")} + }), BackOffConfig: configretry.BackOffConfig{ Enabled: true, InitialInterval: 100 * time.Millisecond, @@ -115,7 +122,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) vv := component.ValidateConfig(cfg) tt.configValidateAssert(t, vv) @@ -133,3 +140,11 @@ func withDefaultConfig(fns ...func(*Config)) *Config { } return cfg } + +func withDefaultHTTPClientConfig(fns ...func(config *confighttp.ClientConfig)) confighttp.ClientConfig { + cfg := confighttp.NewDefaultClientConfig() + for _, fn := range fns { + fn(&cfg) + } + return cfg +} diff --git a/exporter/opensearchexporter/encoder.go b/exporter/opensearchexporter/encoder.go index bc64ea1e9916..ec9696fed249 100644 --- a/exporter/opensearchexporter/encoder.go +++ b/exporter/opensearchexporter/encoder.go @@ -42,7 +42,8 @@ type encodeModel struct { func (m *encodeModel) encodeLog(resource pcommon.Resource, scope pcommon.InstrumentationScope, schemaURL string, - record plog.LogRecord) ([]byte, error) { + record plog.LogRecord, +) ([]byte, error) { if m.sso { return m.encodeLogSSO(resource, scope, schemaURL, record) } diff --git a/exporter/opensearchexporter/factory.go b/exporter/opensearchexporter/factory.go index 75a74580f7f0..4e577884f20c 100644 --- a/exporter/opensearchexporter/factory.go +++ b/exporter/opensearchexporter/factory.go @@ -40,15 +40,13 @@ func newDefaultConfig() component.Config { } func createTracesExporter(ctx context.Context, - set exporter.CreateSettings, - cfg component.Config) (exporter.Traces, error) { + set exporter.Settings, + cfg component.Config, +) (exporter.Traces, error) { c := cfg.(*Config) - te, e := newSSOTracesExporter(c, set) - if e != nil { - return nil, e - } + te := newSSOTracesExporter(c, set) - return exporterhelper.NewTracesExporter(ctx, set, cfg, + return exporterhelper.NewTraces(ctx, set, cfg, te.pushTraceData, exporterhelper.WithStart(te.Start), exporterhelper.WithCapabilities(consumer.Capabilities{MutatesData: false}), @@ -57,15 +55,13 @@ func createTracesExporter(ctx context.Context, } func createLogsExporter(ctx context.Context, - set exporter.CreateSettings, - cfg component.Config) (exporter.Logs, error) { + set exporter.Settings, + cfg component.Config, +) (exporter.Logs, error) { c := cfg.(*Config) - le, e := newLogExporter(c, set) - if e != nil { - return nil, e - } + le := newLogExporter(c, set) - return exporterhelper.NewLogsExporter(ctx, set, cfg, + return exporterhelper.NewLogs(ctx, set, cfg, le.pushLogData, exporterhelper.WithStart(le.Start), exporterhelper.WithCapabilities(consumer.Capabilities{MutatesData: true}), diff --git a/exporter/opensearchexporter/factory_test.go b/exporter/opensearchexporter/factory_test.go index 3b1124928fb7..ab9e6a81e021 100644 --- a/exporter/opensearchexporter/factory_test.go +++ b/exporter/opensearchexporter/factory_test.go @@ -20,50 +20,26 @@ func TestCreateDefaultConfig(t *testing.T) { assert.NoError(t, componenttest.CheckConfigStruct(cfg)) } -func TestFactory_CreateMetricsExporter_Fail(t *testing.T) { - factory := NewFactory() - cfg := factory.CreateDefaultConfig() - params := exportertest.NewNopCreateSettings() - _, err := factory.CreateMetricsExporter(context.Background(), params, cfg) - require.Error(t, err, "expected an error when creating a metrics exporter") -} - -func TestFactory_CreateTracesExporter_Fail(t *testing.T) { - factory := NewFactory() - cfg := factory.CreateDefaultConfig() - params := exportertest.NewNopCreateSettings() - _, err := factory.CreateTracesExporter(context.Background(), params, cfg) - require.Error(t, err, "expected an error when creating a traces exporter") -} - -func TestFactory_CreateLogsExporter_Fail(t *testing.T) { - factory := NewFactory() - cfg := factory.CreateDefaultConfig() - params := exportertest.NewNopCreateSettings() - _, err := factory.CreateLogsExporter(context.Background(), params, cfg) - require.Error(t, err, "expected an error when creating a logs exporter") -} - -func TestFactory_CreateTracesExporter(t *testing.T) { +func TestFactory_CreateTraces(t *testing.T) { factory := NewFactory() cfg := withDefaultConfig(func(cfg *Config) { cfg.Endpoint = "https://opensearch.example.com:9200" }) - params := exportertest.NewNopCreateSettings() - exporter, err := factory.CreateTracesExporter(context.Background(), params, cfg) + params := exportertest.NewNopSettings() + exporter, err := factory.CreateTraces(context.Background(), params, cfg) require.NoError(t, err) require.NotNil(t, exporter) require.NoError(t, exporter.Shutdown(context.TODO())) } -func TestFactory_CreateLogsExporter(t *testing.T) { +func TestFactory_CreateLogs(t *testing.T) { factory := NewFactory() cfg := withDefaultConfig(func(cfg *Config) { cfg.Endpoint = "https://opensearch.example.com:9200" }) - params := exportertest.NewNopCreateSettings() - exporter, err := factory.CreateLogsExporter(context.Background(), params, cfg) + params := exportertest.NewNopSettings() + exporter, err := factory.CreateLogs(context.Background(), params, cfg) require.NoError(t, err) require.NotNil(t, exporter) diff --git a/exporter/opensearchexporter/generated_component_test.go b/exporter/opensearchexporter/generated_component_test.go index a369508a9d9b..45e863024899 100644 --- a/exporter/opensearchexporter/generated_component_test.go +++ b/exporter/opensearchexporter/generated_component_test.go @@ -32,20 +32,20 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -57,21 +57,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(exporter.Logs) require.True(t, ok) diff --git a/exporter/opensearchexporter/go.mod b/exporter/opensearchexporter/go.mod index d23bd9e41ef6..8c0fc6fa0646 100644 --- a/exporter/opensearchexporter/go.mod +++ b/exporter/opensearchexporter/go.mod @@ -1,82 +1,88 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opensearchexporter -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.102.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.116.0 github.com/opensearch-project/opensearch-go/v2 v2.3.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configauth v0.102.0 - go.opentelemetry.io/collector/config/confighttp v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configauth v0.116.0 + go.opentelemetry.io/collector/config/confighttp v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) require ( github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/elastic/go-structform v0.0.10 + github.com/elastic/go-structform v0.0.12 github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/rs/cors v1.10.1 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/rs/cors v1.11.1 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/configtls v1.22.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect ) replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../../pkg/pdatautil diff --git a/exporter/opensearchexporter/go.sum b/exporter/opensearchexporter/go.sum index d7eda7bb0ca5..ed68586854fe 100644 --- a/exporter/opensearchexporter/go.sum +++ b/exporter/opensearchexporter/go.sum @@ -11,8 +11,6 @@ github.com/aws/aws-sdk-go-v2/service/sso v1.12.10/go.mod h1:ouy2P4z6sJN70fR3ka3w github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.10/go.mod h1:AFvkxc8xfBe8XA+5St5XIHHrQQtkxqrRincx4hmMHOk= github.com/aws/aws-sdk-go-v2/service/sts v1.19.0/go.mod h1:BgQOMsg8av8jset59jelyPW7NoZcZXLVpDsXunGDrk8= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= @@ -20,21 +18,23 @@ github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/elastic/go-structform v0.0.10 h1:oy08o/Ih2hHTkNcRY/1HhaYvIp5z6t8si8gnCJPDo1w= -github.com/elastic/go-structform v0.0.10/go.mod h1:CZWf9aIRYY5SuKSmOhtXScE5uQiLZNqAFnwKR4OrIM4= +github.com/elastic/go-structform v0.0.12 h1:HXpzlAKyej8T7LobqKDThUw7BMhwV6Db24VwxNtgxCs= +github.com/elastic/go-structform v0.0.12/go.mod h1:CZWf9aIRYY5SuKSmOhtXScE5uQiLZNqAFnwKR4OrIM4= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -51,14 +51,14 @@ 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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -74,21 +74,15 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/opensearch-project/opensearch-go/v2 v2.3.0 h1:nQIEMr+A92CkhHrZgUhcfsrZjibvB3APXf2a1VwCmMQ= github.com/opensearch-project/opensearch-go/v2 v2.3.0/go.mod h1:8LDr9FCgUTVoT+5ESjc2+iaZuldqE+23Iq0r1XeNue8= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -97,63 +91,87 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -175,8 +193,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -190,8 +208,8 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -201,8 +219,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -212,12 +230,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/exporter/opensearchexporter/integration_test.go b/exporter/opensearchexporter/integration_test.go index 5b43bf7ec790..06227c2d6a13 100644 --- a/exporter/opensearchexporter/integration_test.go +++ b/exporter/opensearchexporter/integration_test.go @@ -12,6 +12,7 @@ import ( "os" "testing" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/consumer/consumererror" @@ -108,17 +109,17 @@ func TestOpenSearchTraceExporter(t *testing.T) { for _, tc := range tests { // Create HTTP listener - var requestCount = 0 + requestCount := 0 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { var err error docs := getReceivedDocuments(r.Body) - require.LessOrEqualf(t, requestCount, len(tc.RequestHandlers), "Test case generated more requests than it has response for.") + assert.LessOrEqualf(t, requestCount, len(tc.RequestHandlers), "Test case generated more requests than it has response for.") tc.RequestHandlers[requestCount].ValidateReceivedDocuments(t, requestCount, docs) - w.WriteHeader(200) + w.WriteHeader(http.StatusOK) response, _ := os.ReadFile(tc.RequestHandlers[requestCount].ResponseJSONPath) _, err = w.Write(response) - require.NoError(t, err) + assert.NoError(t, err) requestCount++ })) @@ -130,7 +131,7 @@ func TestOpenSearchTraceExporter(t *testing.T) { // Create exporter f := NewFactory() - exporter, err := f.CreateTracesExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + exporter, err := f.CreateTraces(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) // Initialize the exporter @@ -238,17 +239,17 @@ func TestOpenSearchLogExporter(t *testing.T) { for _, tc := range tests { // Create HTTP listener - var requestCount = 0 + requestCount := 0 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { var err error docs := getReceivedDocuments(r.Body) - require.LessOrEqualf(t, requestCount, len(tc.RequestHandlers), "Test case generated more requests than it has response for.") + assert.LessOrEqualf(t, requestCount, len(tc.RequestHandlers), "Test case generated more requests than it has response for.") tc.RequestHandlers[requestCount].ValidateReceivedDocuments(t, requestCount, docs) - w.WriteHeader(200) + w.WriteHeader(http.StatusOK) response, _ := os.ReadFile(tc.RequestHandlers[requestCount].ResponseJSONPath) _, err = w.Write(response) - require.NoError(t, err) + assert.NoError(t, err) requestCount++ })) @@ -260,7 +261,7 @@ func TestOpenSearchLogExporter(t *testing.T) { // Create exporter f := NewFactory() - exporter, err := f.CreateLogsExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + exporter, err := f.CreateLogs(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) // Initialize the exporter diff --git a/exporter/opensearchexporter/internal/metadata/generated_status.go b/exporter/opensearchexporter/internal/metadata/generated_status.go index 0a430392f288..000c4cca9412 100644 --- a/exporter/opensearchexporter/internal/metadata/generated_status.go +++ b/exporter/opensearchexporter/internal/metadata/generated_status.go @@ -7,10 +7,11 @@ import ( ) var ( - Type = component.MustNewType("opensearch") + Type = component.MustNewType("opensearch") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opensearchexporter" ) const ( - LogsStability = component.StabilityLevelDevelopment - TracesStability = component.StabilityLevelAlpha + TracesStability = component.StabilityLevelUnmaintained + LogsStability = component.StabilityLevelUnmaintained ) diff --git a/exporter/opensearchexporter/internal/metadata/generated_telemetry.go b/exporter/opensearchexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index 3e7eb8aed9aa..000000000000 --- a/exporter/opensearchexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/opensearch") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/opensearch") -} diff --git a/exporter/opensearchexporter/internal/metadata/generated_telemetry_test.go b/exporter/opensearchexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 496e200dad34..000000000000 --- a/exporter/opensearchexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/opensearch", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/opensearch", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/opensearchexporter/internal/objmodel/objmodel.go b/exporter/opensearchexporter/internal/objmodel/objmodel.go index efccbdc9f59e..de7d93da9b04 100644 --- a/exporter/opensearchexporter/internal/objmodel/objmodel.go +++ b/exporter/opensearchexporter/internal/objmodel/objmodel.go @@ -85,8 +85,10 @@ const ( const tsLayout = "2006-01-02T15:04:05.000000000Z" -var nilValue = Value{kind: KindNil} -var ignoreValue = Value{kind: KindIgnore} +var ( + nilValue = Value{kind: KindNil} + ignoreValue = Value{kind: KindIgnore} +) // DocumentFromAttributes creates a document from a OpenTelemetry attribute // map. All nested maps will be flattened, with keys being joined using a `.` symbol. diff --git a/exporter/opensearchexporter/internal/objmodel/objmodel_test.go b/exporter/opensearchexporter/internal/objmodel/objmodel_test.go index 320a769f6419..5d446136187a 100644 --- a/exporter/opensearchexporter/internal/objmodel/objmodel_test.go +++ b/exporter/opensearchexporter/internal/objmodel/objmodel_test.go @@ -117,7 +117,6 @@ func TestDocument_Sort(t *testing.T) { assert.Equal(t, test.want, doc) }) } - } func TestObjectModel_Dedup(t *testing.T) { diff --git a/exporter/opensearchexporter/metadata.yaml b/exporter/opensearchexporter/metadata.yaml index 81899f33adbd..04d160fa8f38 100644 --- a/exporter/opensearchexporter/metadata.yaml +++ b/exporter/opensearchexporter/metadata.yaml @@ -1,14 +1,13 @@ type: opensearch -scope_name: otelcol/opensearch status: class: exporter stability: - alpha: [traces] - development: [logs] + unmaintained: [traces, logs] distributions: [contrib] codeowners: - active: [Aneurysm9, MitchellGale, MaxKsyunz, YANG-DB] + active: [Aneurysm9] + emeritus: [MitchellGale, MaxKsyunz, YANG-DB] tests: expect_consumer_error: true diff --git a/exporter/opensearchexporter/sso_log_exporter.go b/exporter/opensearchexporter/sso_log_exporter.go index 4b3c4ffed560..fe3584f3e0f0 100644 --- a/exporter/opensearchexporter/sso_log_exporter.go +++ b/exporter/opensearchexporter/sso_log_exporter.go @@ -23,11 +23,7 @@ type logExporter struct { telemetry component.TelemetrySettings } -func newLogExporter(cfg *Config, set exporter.CreateSettings) (*logExporter, error) { - if err := cfg.Validate(); err != nil { - return nil, err - } - +func newLogExporter(cfg *Config, set exporter.Settings) *logExporter { model := &encodeModel{ dedup: cfg.Dedup, dedot: cfg.Dedot, @@ -45,7 +41,7 @@ func newLogExporter(cfg *Config, set exporter.CreateSettings) (*logExporter, err bulkAction: cfg.BulkAction, httpSettings: cfg.ClientConfig, model: model, - }, nil + } } func (l *logExporter) Start(ctx context.Context, host component.Host) error { diff --git a/exporter/opensearchexporter/sso_trace_exporter.go b/exporter/opensearchexporter/sso_trace_exporter.go index 4b5234f94d51..3c0f2e4b2211 100644 --- a/exporter/opensearchexporter/sso_trace_exporter.go +++ b/exporter/opensearchexporter/sso_trace_exporter.go @@ -25,11 +25,7 @@ type ssoTracesExporter struct { telemetry component.TelemetrySettings } -func newSSOTracesExporter(cfg *Config, set exporter.CreateSettings) (*ssoTracesExporter, error) { - if err := cfg.Validate(); err != nil { - return nil, err - } - +func newSSOTracesExporter(cfg *Config, set exporter.Settings) *ssoTracesExporter { model := &encodeModel{ dataset: cfg.Dataset, namespace: cfg.Namespace, @@ -42,7 +38,7 @@ func newSSOTracesExporter(cfg *Config, set exporter.CreateSettings) (*ssoTracesE bulkAction: cfg.BulkAction, model: model, httpSettings: cfg.ClientConfig, - }, nil + } } func (s *ssoTracesExporter) Start(ctx context.Context, host component.Host) error { diff --git a/exporter/opensearchexporter/testdata/config.yaml b/exporter/opensearchexporter/testdata/config.yaml index a187af23318e..2f967002ed96 100644 --- a/exporter/opensearchexporter/testdata/config.yaml +++ b/exporter/opensearchexporter/testdata/config.yaml @@ -7,6 +7,8 @@ opensearch: http: endpoint: https://opensearch.example.com:9200 +opensearch/default: + opensearch/empty_namespace: dataset: ngnix namespace: "" diff --git a/exporter/opensearchexporter/trace_bulk_indexer.go b/exporter/opensearchexporter/trace_bulk_indexer.go index b6e7f5132e1e..4e7bcccc8a86 100644 --- a/exporter/opensearchexporter/trace_bulk_indexer.go +++ b/exporter/opensearchexporter/trace_bulk_indexer.go @@ -128,7 +128,7 @@ func attributesToMapString(attributes pcommon.Map) map[string]string { } func shouldRetryEvent(status int) bool { - var retryOnStatus = []int{500, 502, 503, 504, 429} + retryOnStatus := []int{500, 502, 503, 504, 429} for _, retryable := range retryOnStatus { if status == retryable { return true diff --git a/exporter/otelarrowexporter/README.md b/exporter/otelarrowexporter/README.md index 87ece851ffe0..2be2a1c4b069 100644 --- a/exporter/otelarrowexporter/README.md +++ b/exporter/otelarrowexporter/README.md @@ -3,12 +3,14 @@ | Status | | | ------------- |-----------| -| Stability | [development]: traces, metrics, logs | -| Distributions | [] | +| Stability | [beta]: traces, metrics, logs | +| Distributions | [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fotelarrow%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fotelarrow) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fotelarrow%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fotelarrow) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@jmacd](https://www.github.com/jmacd), [@moh-osman3](https://www.github.com/moh-osman3), [@codeboten](https://www.github.com/codeboten) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@jmacd](https://www.github.com/jmacd), [@moh-osman3](https://www.github.com/moh-osman3), [@lquerel](https://www.github.com/lquerel) | -[development]: https://github.com/open-telemetry/opentelemetry-collector#development +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta +[contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s Exports telemetry data using [OpenTelemetry Protocol with Apache @@ -101,20 +103,40 @@ to standard OTLP. - `disabled` (default: false): disables use of Arrow, causing the exporter to use standard OTLP - `disable_downgrade` (default: false): prevents this exporter from using standard OTLP. -The following settings determine the resources that the exporter will use: +The following setting determines how long a stream will stay open. +Stream lifetime is limited to 30 seconds because compression benefit +is limited at that point and shorter streams make load balancing +easier. -- `num_streams` (default: number of CPUs): the number of concurrent Arrow streams -- `max_stream_lifetime` (default: unlimited): duration after which streams are recycled. +- `max_stream_lifetime` (default: 30s): duration after which streams + are recycled. -When `num_streams` is greater than one, a configurable policy -determines how load is assigned across streams. The supported -policies are `leastloaded`, which picks the stream with the smallest -number of outstanding requests, and `leastloadedN` for `N <= -num_streams`, which limits the decision to a random subset of `N` -streams. +The following setting determines memory and CPU resources that the +exporter will use: + +- `num_streams` (default: `max(1, NumCPU()/2)`): the number of concurrent Arrow streams + +The `num_streams` default limits the exporter stream count to half the +number of CPUs or 1, whichever is greater. When `num_streams` is +greater than one, a configurable policy determines how load is +assigned across streams to balance load. The supported policies are +`leastloaded`, which picks the stream with the smallest number of +outstanding requests, and `leastloadedN` for `N <= num_streams`, which +limits the decision to a random subset of `N` streams. - `prioritizer` (default: "leastloaded"): policy for distributing load across multiple streams. +### Matching Metadata Per Stream + +The following configuration values allow for separate streams per unique +metadata combinations: +- `metadata_keys` (default = empty): When set, this exporter will create one + arrow exporter instance per distinct combination of values in the + client.Metadata. +- `metadata_cardinality_limit` (default = 1000): When metadata_keys is not empty, + this setting limits the number of unique combinations of metadata key values + that will be processed over the lifetime of the exporter. + ### Network Configuration This component uses `round_robin` by default as the gRPC load @@ -173,17 +195,17 @@ metrics, this component provides network-level measurement instruments which we anticipate will become part of `exporterhelper` and/or `obsreport` in the future. At the `normal` level of metrics detail: -- `exporter_sent`: uncompressed bytes sent, prior to compression -- `exporter_sent_wire`: compressed bytes sent, on the wire. +- `otelcol_exporter_sent`: uncompressed bytes sent, prior to compression +- `otelcol_exporter_sent_wire`: compressed bytes sent, on the wire. Arrow's compression performance can be derived by dividing the average -`exporter_sent` value by the average `exporter_sent_wire` value. +`otelcol_exporter_sent` value by the average `otelcol_exporter_sent_wire` value. At the `detailed` metrics detail level, information about the stream of data being returned to the exporter will be instrumented: -- `exporter_recv`: uncompressed bytes received, prior to compression -- `exporter_recv_wire`: compressed bytes received, on the wire. +- `otelcol_exporter_recv`: uncompressed bytes received, prior to compression +- `otelcol_exporter_recv_wire`: compressed bytes received, on the wire. ### Compression Configuration @@ -218,12 +240,12 @@ The exporter supports configuring compression at the [Arrow columnar-protocol level](https://arrow.apache.org/docs/format/Columnar.html#format-ipc). -- `payload_compression`: compression applied at the Arrow IPC level, "none" by default, "zstd" supported. +- `payload_compression` (default "zstd"): compression applied at the Arrow IPC level. -Compression settings at the Arrow IPC level cannot be further -configured. We do not recommend configuring both payload and -gRPC-level compression at once, hwoever these settings are -independent. +Compression at the Arrow level is enabled by default because it boosts +compression slightly and helps Arrow payloads meet gRPC maximum +request size limits. Compression settings at the Arrow IPC level +cannot be further configured. For example, two exporters may be configured with multiple zstd configurations, provided they use different levels: @@ -241,3 +263,46 @@ exporters: zstd: level: 1 # 1 is the "fastest" compression level ``` + +### Batching Configuration + +This exporter includes a new, experimental `batcher` configuration for +batching in the `exporterhelper` module, but this mode is disabled by +default. This batching support works when combined with +`queue_sender` functionality. + +``` +exporters: + otelarrow: + batcher: + enabled: true + sending_queue: + enabled: true + storage: file_storage/otc +extensions: + file_storage/otc: + directory: /var/lib/storage/otc +``` + +The built-in batcher is only recommended with a persistent queue, +otherwise it cannot provide back-pressure to the caller. If building +a custom build of the OpenTelemetry Collector, we recommend using the +[Concurrent Batch +Processor](https://github.com/open-telemetry/otel-arrow/blob/main/collector/processor/concurrentbatchprocessor/README.md) +to provide simultaneous back-pressure, concurrency, and batching +functionality. See [more discussion on this +issue](https://github.com/open-telemetry/opentelemetry-collector/issues/10368). + +``` +exporters: + otelarrow: + batcher: + enabled: false + sending_queue: + enabled: false +processors: + concurrentbatch: + send_batch_max_size: 1500 + send_batch_size: 1000 + timeout: 1s +``` diff --git a/exporter/otelarrowexporter/config.go b/exporter/otelarrowexporter/config.go index 68837d818b16..9786e203a3c5 100644 --- a/exporter/otelarrowexporter/config.go +++ b/exporter/otelarrowexporter/config.go @@ -5,18 +5,20 @@ package otelarrowexporter // import "github.com/open-telemetry/opentelemetry-col import ( "fmt" + "strings" "time" - "github.com/open-telemetry/otel-arrow/collector/compression/zstd" "github.com/open-telemetry/otel-arrow/pkg/config" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/config/configcompression" "go.opentelemetry.io/collector/config/configgrpc" "go.opentelemetry.io/collector/config/configretry" + "go.opentelemetry.io/collector/exporter/exporterbatcher" "go.opentelemetry.io/collector/exporter/exporterhelper" "google.golang.org/grpc" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/otelarrowexporter/internal/arrow" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/compression/zstd" ) // Config defines configuration for OTLP exporter. @@ -25,13 +27,17 @@ type Config struct { // inherited from exporterhelper using field names // intentionally identical to the core OTLP exporter. - exporterhelper.TimeoutSettings `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. - exporterhelper.QueueSettings `mapstructure:"sending_queue"` + TimeoutSettings exporterhelper.TimeoutConfig `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` RetryConfig configretry.BackOffConfig `mapstructure:"retry_on_failure"` configgrpc.ClientConfig `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. + // Experimental: This configuration is at the early stage of development and may change without backward compatibility + // until https://github.com/open-telemetry/opentelemetry-collector/issues/8122 is resolved + BatcherConfig exporterbatcher.Config `mapstructure:"batcher"` + // Arrow includes settings specific to OTel Arrow. Arrow ArrowConfig `mapstructure:"arrow"` @@ -40,6 +46,23 @@ type Config struct { // exporter is built and configured via code instead of yaml. // Uses include custom dialer, custom user-agent, etc. UserDialOptions []grpc.DialOption `mapstructure:"-"` + + // MetadataKeys is a list of client.Metadata keys that will be + // used to form distinct exporters. If this setting is empty, + // a single exporter instance will be used. When this setting + // is not empty, one exporter will be used per distinct + // combination of values for the listed metadata keys. + // + // Empty value and unset metadata are treated as distinct cases. + // + // Entries are case-insensitive. Duplicated entries will + // trigger a validation error. + MetadataKeys []string `mapstructure:"metadata_keys"` + + // MetadataCardinalityLimit indicates the maximum number of + // exporter instances that will be created through a distinct + // combination of MetadataKeys. + MetadataCardinalityLimit uint32 `mapstructure:"metadata_cardinality_limit"` } // ArrowConfig includes whether Arrow is enabled and the number of @@ -85,6 +108,24 @@ var _ component.Config = (*Config)(nil) var _ component.ConfigValidator = (*ArrowConfig)(nil) +func (cfg *Config) Validate() error { + err := cfg.Arrow.Validate() + if err != nil { + return err + } + + uniq := map[string]bool{} + for _, k := range cfg.MetadataKeys { + l := strings.ToLower(k) + if _, has := uniq[l]; has { + return fmt.Errorf("duplicate entry in metadata_keys: %q (case-insensitive)", l) + } + uniq[l] = true + } + + return nil +} + // Validate returns an error when the number of streams is less than 1. func (cfg *ArrowConfig) Validate() error { if cfg.NumStreams < 1 { diff --git a/exporter/otelarrowexporter/config_test.go b/exporter/otelarrowexporter/config_test.go index b1a6253837df..7ad1a0a633b5 100644 --- a/exporter/otelarrowexporter/config_test.go +++ b/exporter/otelarrowexporter/config_test.go @@ -9,7 +9,6 @@ import ( "testing" "time" - "github.com/open-telemetry/otel-arrow/collector/compression/zstd" "github.com/open-telemetry/otel-arrow/pkg/config" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -21,9 +20,11 @@ import ( "go.opentelemetry.io/collector/config/configretry" "go.opentelemetry.io/collector/config/configtls" "go.opentelemetry.io/collector/confmap/confmaptest" + "go.opentelemetry.io/collector/exporter/exporterbatcher" "go.opentelemetry.io/collector/exporter/exporterhelper" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/otelarrowexporter/internal/arrow" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/compression/zstd" ) func TestUnmarshalDefaultConfig(t *testing.T) { @@ -31,7 +32,7 @@ func TestUnmarshalDefaultConfig(t *testing.T) { require.NoError(t, err) factory := NewFactory() cfg := factory.CreateDefaultConfig() - assert.NoError(t, component.UnmarshalConfig(cm, cfg)) + assert.NoError(t, cm.Unmarshal(cfg)) assert.Equal(t, factory.CreateDefaultConfig(), cfg) assert.Equal(t, "round_robin", cfg.(*Config).ClientConfig.BalancerName) assert.Equal(t, arrow.DefaultPrioritizer, cfg.(*Config).Arrow.Prioritizer) @@ -42,10 +43,10 @@ func TestUnmarshalConfig(t *testing.T) { require.NoError(t, err) factory := NewFactory() cfg := factory.CreateDefaultConfig() - assert.NoError(t, component.UnmarshalConfig(cm, cfg)) + assert.NoError(t, cm.Unmarshal(cfg)) assert.Equal(t, &Config{ - TimeoutSettings: exporterhelper.TimeoutSettings{ + TimeoutSettings: exporterhelper.TimeoutConfig{ Timeout: 10 * time.Second, }, RetryConfig: configretry.BackOffConfig{ @@ -56,7 +57,7 @@ func TestUnmarshalConfig(t *testing.T) { MaxInterval: 1 * time.Minute, MaxElapsedTime: 10 * time.Minute, }, - QueueSettings: exporterhelper.QueueSettings{ + QueueSettings: exporterhelper.QueueConfig{ Enabled: true, NumConsumers: 2, QueueSize: 10, @@ -84,6 +85,16 @@ func TestUnmarshalConfig(t *testing.T) { BalancerName: "experimental", Auth: &configauth.Authentication{AuthenticatorID: component.NewID(component.MustNewType("nop"))}, }, + BatcherConfig: exporterbatcher.Config{ + Enabled: true, + FlushTimeout: 200 * time.Millisecond, + MinSizeConfig: exporterbatcher.MinSizeConfig{ + MinSizeItems: 1000, + }, + MaxSizeConfig: exporterbatcher.MaxSizeConfig{ + MaxSizeItems: 10000, + }, + }, Arrow: ArrowConfig{ NumStreams: 2, MaxStreamLifetime: 2 * time.Hour, diff --git a/exporter/otelarrowexporter/factory.go b/exporter/otelarrowexporter/factory.go index 0302e067085b..6c8dfbfa5864 100644 --- a/exporter/otelarrowexporter/factory.go +++ b/exporter/otelarrowexporter/factory.go @@ -5,12 +5,8 @@ package otelarrowexporter // import "github.com/open-telemetry/opentelemetry-col import ( "context" - "runtime" - "time" arrowpb "github.com/open-telemetry/otel-arrow/api/experimental/arrow/v1" - "github.com/open-telemetry/otel-arrow/collector/compression/zstd" - "github.com/open-telemetry/otel-arrow/collector/netstats" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/config/configcompression" "go.opentelemetry.io/collector/config/configgrpc" @@ -18,11 +14,14 @@ import ( "go.opentelemetry.io/collector/config/configretry" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/exporter" + "go.opentelemetry.io/collector/exporter/exporterbatcher" "go.opentelemetry.io/collector/exporter/exporterhelper" "google.golang.org/grpc" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/otelarrowexporter/internal/arrow" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/otelarrowexporter/internal/metadata" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/compression/zstd" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/netstats" ) // NewFactory creates a factory for OTLP exporter. @@ -37,10 +36,14 @@ func NewFactory() exporter.Factory { } func createDefaultConfig() component.Config { + batcherCfg := exporterbatcher.NewDefaultConfig() + batcherCfg.Enabled = false + return &Config{ - TimeoutSettings: exporterhelper.NewDefaultTimeoutSettings(), + TimeoutSettings: exporterhelper.NewDefaultTimeoutConfig(), RetryConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), + BatcherConfig: batcherCfg, ClientConfig: configgrpc.ClientConfig{ Headers: map[string]configopaque.String{}, // Default to zstd compression @@ -54,27 +57,28 @@ func createDefaultConfig() component.Config { BalancerName: "round_robin", }, Arrow: ArrowConfig{ - NumStreams: runtime.NumCPU(), - MaxStreamLifetime: time.Hour, + NumStreams: arrow.DefaultNumStreams, + MaxStreamLifetime: arrow.DefaultMaxStreamLifetime, Zstd: zstd.DefaultEncoderConfig(), Prioritizer: arrow.DefaultPrioritizer, - // PayloadCompression is off by default because gRPC - // compression is on by default, above. - PayloadCompression: "", + // Note the default payload compression is + PayloadCompression: arrow.DefaultPayloadCompression, }, } } -func (exp *baseExporter) helperOptions() []exporterhelper.Option { +func helperOptions(e exp) []exporterhelper.Option { + cfg := e.getConfig().(*Config) return []exporterhelper.Option{ exporterhelper.WithCapabilities(consumer.Capabilities{MutatesData: false}), - exporterhelper.WithTimeout(exp.config.TimeoutSettings), - exporterhelper.WithRetry(exp.config.RetryConfig), - exporterhelper.WithQueue(exp.config.QueueSettings), - exporterhelper.WithStart(exp.start), - exporterhelper.WithShutdown(exp.shutdown), + exporterhelper.WithTimeout(cfg.TimeoutSettings), + exporterhelper.WithRetry(cfg.RetryConfig), + exporterhelper.WithQueue(cfg.QueueSettings), + exporterhelper.WithStart(e.start), + exporterhelper.WithBatcher(cfg.BatcherConfig), + exporterhelper.WithShutdown(e.shutdown), } } @@ -94,16 +98,16 @@ func createArrowTracesStream(conn *grpc.ClientConn) arrow.StreamClientFunc { func createTracesExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exporter.Traces, error) { - exp, err := newExporter(cfg, set, createArrowTracesStream) + e, err := newMetadataExporter(cfg, set, createArrowTracesStream) if err != nil { return nil, err } - return exporterhelper.NewTracesExporter(ctx, exp.settings, exp.config, - exp.pushTraces, - exp.helperOptions()..., + return exporterhelper.NewTraces(ctx, e.getSettings(), e.getConfig(), + e.pushTraces, + helperOptions(e)..., ) } @@ -113,16 +117,16 @@ func createArrowMetricsStream(conn *grpc.ClientConn) arrow.StreamClientFunc { func createMetricsExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exporter.Metrics, error) { - exp, err := newExporter(cfg, set, createArrowMetricsStream) + e, err := newMetadataExporter(cfg, set, createArrowMetricsStream) if err != nil { return nil, err } - return exporterhelper.NewMetricsExporter(ctx, exp.settings, exp.config, - exp.pushMetrics, - exp.helperOptions()..., + return exporterhelper.NewMetrics(ctx, e.getSettings(), e.getConfig(), + e.pushMetrics, + helperOptions(e)..., ) } @@ -132,15 +136,15 @@ func createArrowLogsStream(conn *grpc.ClientConn) arrow.StreamClientFunc { func createLogsExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exporter.Logs, error) { - exp, err := newExporter(cfg, set, createArrowLogsStream) + e, err := newMetadataExporter(cfg, set, createArrowLogsStream) if err != nil { return nil, err } - return exporterhelper.NewLogsExporter(ctx, exp.settings, exp.config, - exp.pushLogs, - exp.helperOptions()..., + return exporterhelper.NewLogs(ctx, e.getSettings(), e.getConfig(), + e.pushLogs, + helperOptions(e)..., ) } diff --git a/exporter/otelarrowexporter/factory_test.go b/exporter/otelarrowexporter/factory_test.go index 75dfcc736a4b..ea3430d0ac96 100644 --- a/exporter/otelarrowexporter/factory_test.go +++ b/exporter/otelarrowexporter/factory_test.go @@ -10,8 +10,6 @@ import ( "testing" "time" - "github.com/open-telemetry/otel-arrow/collector/compression/zstd" - "github.com/open-telemetry/otel-arrow/collector/testutil" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component/componenttest" @@ -24,6 +22,8 @@ import ( "go.opentelemetry.io/collector/exporter/exportertest" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/otelarrowexporter/internal/arrow" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/compression/zstd" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/testutil" ) func TestCreateDefaultConfig(t *testing.T) { @@ -31,34 +31,33 @@ func TestCreateDefaultConfig(t *testing.T) { cfg := factory.CreateDefaultConfig() assert.NotNil(t, cfg, "failed to create default config") assert.NoError(t, componenttest.CheckConfigStruct(cfg)) - ocfg, ok := factory.CreateDefaultConfig().(*Config) - assert.True(t, ok) + ocfg := factory.CreateDefaultConfig().(*Config) assert.Equal(t, ocfg.RetryConfig, configretry.NewDefaultBackOffConfig()) - assert.Equal(t, ocfg.QueueSettings, exporterhelper.NewDefaultQueueSettings()) - assert.Equal(t, ocfg.TimeoutSettings, exporterhelper.NewDefaultTimeoutSettings()) - assert.Equal(t, ocfg.Compression, configcompression.TypeZstd) - assert.Equal(t, ocfg.Arrow, ArrowConfig{ + assert.Equal(t, ocfg.QueueSettings, exporterhelper.NewDefaultQueueConfig()) + assert.Equal(t, ocfg.TimeoutSettings, exporterhelper.NewDefaultTimeoutConfig()) + assert.Equal(t, configcompression.TypeZstd, ocfg.Compression) + assert.Equal(t, ArrowConfig{ Disabled: false, - NumStreams: runtime.NumCPU(), - MaxStreamLifetime: time.Hour, - PayloadCompression: "", + NumStreams: max(1, runtime.NumCPU()/2), + MaxStreamLifetime: 30 * time.Second, + PayloadCompression: "zstd", Zstd: zstd.DefaultEncoderConfig(), Prioritizer: arrow.DefaultPrioritizer, - }) + }, ocfg.Arrow) } -func TestCreateMetricsExporter(t *testing.T) { +func TestCreateMetrics(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig().(*Config) cfg.ClientConfig.Endpoint = testutil.GetAvailableLocalAddress(t) - set := exportertest.NewNopCreateSettings() - oexp, err := factory.CreateMetricsExporter(context.Background(), set, cfg) - require.Nil(t, err) + set := exportertest.NewNopSettings() + oexp, err := factory.CreateMetrics(context.Background(), set, cfg) + require.NoError(t, err) require.NotNil(t, oexp) } -func TestCreateTracesExporter(t *testing.T) { +func TestCreateTraces(t *testing.T) { endpoint := testutil.GetAvailableLocalAddress(t) tests := []struct { name string @@ -187,11 +186,11 @@ func TestCreateTracesExporter(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { factory := NewFactory() - set := exportertest.NewNopCreateSettings() + set := exportertest.NewNopSettings() cfg := tt.config - consumer, err := factory.CreateTracesExporter(context.Background(), set, &cfg) + consumer, err := factory.CreateTraces(context.Background(), set, &cfg) if tt.mustFailOnCreate { - assert.NotNil(t, err) + assert.Error(t, err) return } assert.NoError(t, err) @@ -207,20 +206,20 @@ func TestCreateTracesExporter(t *testing.T) { if err != nil { // Since the endpoint of OTLP exporter doesn't actually exist, // exporter may already stop because it cannot connect. - assert.Equal(t, err.Error(), "rpc error: code = Canceled desc = grpc: the client connection is closing") + assert.Equal(t, "rpc error: code = Canceled desc = grpc: the client connection is closing", err.Error()) } }) } } -func TestCreateLogsExporter(t *testing.T) { +func TestCreateLogs(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig().(*Config) cfg.ClientConfig.Endpoint = testutil.GetAvailableLocalAddress(t) - set := exportertest.NewNopCreateSettings() - oexp, err := factory.CreateLogsExporter(context.Background(), set, cfg) - require.Nil(t, err) + set := exportertest.NewNopSettings() + oexp, err := factory.CreateLogs(context.Background(), set, cfg) + require.NoError(t, err) require.NotNil(t, oexp) } @@ -231,8 +230,8 @@ func TestCreateArrowTracesExporter(t *testing.T) { cfg.Arrow = ArrowConfig{ NumStreams: 1, } - set := exportertest.NewNopCreateSettings() - oexp, err := factory.CreateTracesExporter(context.Background(), set, cfg) - require.Nil(t, err) + set := exportertest.NewNopSettings() + oexp, err := factory.CreateTraces(context.Background(), set, cfg) + require.NoError(t, err) require.NotNil(t, oexp) } diff --git a/exporter/otelarrowexporter/generated_component_test.go b/exporter/otelarrowexporter/generated_component_test.go index 4a990c2ed1f1..45afb5a3c0aa 100644 --- a/exporter/otelarrowexporter/generated_component_test.go +++ b/exporter/otelarrowexporter/generated_component_test.go @@ -32,27 +32,27 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, { name: "metrics", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg) }, }, { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -64,21 +64,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(exporter.Logs) require.True(t, ok) diff --git a/exporter/otelarrowexporter/go.mod b/exporter/otelarrowexporter/go.mod index 397c2ce1750e..a18205dce52a 100644 --- a/exporter/otelarrowexporter/go.mod +++ b/exporter/otelarrowexporter/go.mod @@ -1,90 +1,106 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/otelarrowexporter -go 1.21.0 +go 1.22.0 require ( - github.com/apache/arrow/go/v14 v14.0.2 - github.com/open-telemetry/otel-arrow v0.23.0 - github.com/open-telemetry/otel-arrow/collector v0.23.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector v0.102.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configauth v0.102.0 - go.opentelemetry.io/collector/config/configcompression v1.9.0 - go.opentelemetry.io/collector/config/configgrpc v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/collector/config/configtls v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/collector/extension/auth v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/otel v1.27.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/apache/arrow/go/v16 v16.1.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/grpcutil v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow v0.116.0 + github.com/open-telemetry/otel-arrow v0.31.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/client v1.22.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configauth v0.116.0 + go.opentelemetry.io/collector/config/configcompression v1.22.0 + go.opentelemetry.io/collector/config/configgrpc v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/config/configtls v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/auth v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/otel v1.32.0 + go.opentelemetry.io/otel/trace v1.32.0 go.uber.org/goleak v1.3.0 - go.uber.org/mock v0.4.0 + go.uber.org/mock v0.5.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 - golang.org/x/net v0.25.0 - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 - google.golang.org/grpc v1.64.0 - google.golang.org/protobuf v1.34.1 + golang.org/x/net v0.31.0 + google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 + google.golang.org/grpc v1.68.1 + google.golang.org/protobuf v1.35.2 ) require ( github.com/HdrHistogram/hdrhistogram-go v1.1.2 // indirect + github.com/apache/arrow/go/v17 v17.0.0 // indirect github.com/axiomhq/hyperloglog v0.0.0-20230201085229-3ddf4bad03dc // indirect - github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dgryski/go-metro v0.0.0-20180109044635-280f6062b5bc // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect github.com/fxamacker/cbor/v2 v2.4.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect - github.com/goccy/go-json v0.10.2 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/goccy/go-json v0.10.4 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/google/flatbuffers v23.5.26+incompatible // indirect + github.com/google/flatbuffers v24.3.25+incompatible // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.8 // indirect - github.com/klauspost/cpuid/v2 v2.2.5 // indirect + github.com/klauspost/compress v1.17.11 // indirect + github.com/klauspost/cpuid/v2 v2.2.8 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/mostynb/go-grpc-compression v1.2.2 // indirect - github.com/pierrec/lz4/v4 v4.1.18 // indirect + github.com/mostynb/go-grpc-compression v1.2.3 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/zeebo/xxh3 v1.0.2 // indirect - go.opentelemetry.io/collector/config/confignet v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - golang.org/x/mod v0.14.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - golang.org/x/tools v0.15.0 // indirect + go.opentelemetry.io/collector/config/confignet v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect + golang.org/x/mod v0.18.0 // indirect + golang.org/x/sync v0.9.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.20.0 // indirect + golang.org/x/tools v0.22.0 // indirect golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) + +replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow => ../../internal/otelarrow + +replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/otelarrowreceiver => ../../receiver/otelarrowreceiver + +replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent => ../../internal/sharedcomponent + +replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/grpcutil => ../../internal/grpcutil diff --git a/exporter/otelarrowexporter/go.sum b/exporter/otelarrowexporter/go.sum index 8710234c3476..cc407cfe58d4 100644 --- a/exporter/otelarrowexporter/go.sum +++ b/exporter/otelarrowexporter/go.sum @@ -3,18 +3,16 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/apache/arrow/go/v14 v14.0.2 h1:N8OkaJEOfI3mEZt07BIkvo4sC6XDbL+48MBPWO5IONw= -github.com/apache/arrow/go/v14 v14.0.2/go.mod h1:u3fgh3EdgN/YQ8cVQRguVW3R+seMybFg8QBQ5LU+eBY= +github.com/apache/arrow/go/v16 v16.1.0 h1:dwgfOya6s03CzH9JrjCBx6bkVb4yPD4ma3haj9p7FXI= +github.com/apache/arrow/go/v16 v16.1.0/go.mod h1:9wnc9mn6vEDTRIm4+27pEjQpRKuTvBaessPoEXQzxWA= +github.com/apache/arrow/go/v17 v17.0.0 h1:RRR2bdqKcdbss9Gxy2NS/hK8i4LDMh23L6BbkN5+F54= +github.com/apache/arrow/go/v17 v17.0.0/go.mod h1:jR7QHkODl15PfYyjM2nU+yTLScZ/qfj7OSUZmJ8putc= github.com/axiomhq/hyperloglog v0.0.0-20230201085229-3ddf4bad03dc h1:Keo7wQ7UODUaHcEi7ltENhbAK2VgZjfat6mLy03tQzo= github.com/axiomhq/hyperloglog v0.0.0-20230201085229-3ddf4bad03dc/go.mod h1:k08r+Yj1PRAmuayFiRK6MYuR5Ve4IuZtTfxErMIh0+c= -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/brianvoe/gofakeit/v6 v6.17.0 h1:obbQTJeHfktJtiZzq0Q1bEpsNUs+yHrYlPVWt7BtmJ4= github.com/brianvoe/gofakeit/v6 v6.17.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -22,27 +20,29 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/dgryski/go-metro v0.0.0-20180109044635-280f6062b5bc h1:8WFBn63wegobsYAX0YjD+8suexZDga5CctH4CCTx2+8= github.com/dgryski/go-metro v0.0.0-20180109044635-280f6062b5bc/go.mod h1:c9O8+fpSOX1DM8cPNSkX/qsBWdkD4yd2dpciOWQjpBw= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/fxamacker/cbor/v2 v2.4.0 h1:ri0ArlOR+5XunOP8CRUowT0pSJOwhW098ZCUyskZD88= github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= +github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/flatbuffers v23.5.26+incompatible h1:M9dgRyhJemaM4Sw8+66GHBu8ioaQmyPLg1b8VwK5WJg= -github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v24.3.25+incompatible h1:CX395cjN9Kke9mmalRoL3d81AtFUxJM+yDthflgJGkI= +github.com/google/flatbuffers v24.3.25+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -56,16 +56,16 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= -github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= +github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -81,32 +81,22 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mostynb/go-grpc-compression v1.2.2 h1:XaDbnRvt2+1vgr0b/l0qh4mJAfIxE0bKXtz2Znl3GGI= -github.com/mostynb/go-grpc-compression v1.2.2/go.mod h1:GOCr2KBxXcblCuczg3YdLQlcin1/NfyDA348ckuCH6w= +github.com/mostynb/go-grpc-compression v1.2.3 h1:42/BKWMy0KEJGSdWvzqIyOZ95YcR9mLPqKctH7Uo//I= +github.com/mostynb/go-grpc-compression v1.2.3/go.mod h1:AghIxF3P57umzqM9yz795+y1Vjs47Km/Y2FE6ouQ7Lg= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/open-telemetry/otel-arrow v0.23.0 h1:Vx4q3GR36l9O+S7ZOOITNL1TPp+X1WxkXbeXQA146k0= -github.com/open-telemetry/otel-arrow v0.23.0/go.mod h1:F50XFaiNfkfB0MYftZIUKFULm6pxfGqjbgQzevi+65M= -github.com/open-telemetry/otel-arrow/collector v0.23.0 h1:ztmq1ipJBhm4xWjHDbmKOtgP3Nl/ZDoLX+3ThhzFs6k= -github.com/open-telemetry/otel-arrow/collector v0.23.0/go.mod h1:SLgLEhhcfR9MjG1taK8RPuwiuIoAPW7IpCjFBobwIUM= -github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ= -github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/open-telemetry/otel-arrow v0.31.0 h1:KEWHM5XrUbuGktf17gp3Tgls0OHPyT0VtT5WEohiCC4= +github.com/open-telemetry/otel-arrow v0.31.0/go.mod h1:rEiUiCmxRT3RrtB0ZsT5LeTWJBynPCs0iBkVlMGk+E8= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -115,64 +105,88 @@ github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/configgrpc v0.102.0 h1:cQi5HwpkHvrZJUxZjoGXkWpAuK+gEyp/1Zjn0BrkvmQ= -go.opentelemetry.io/collector/config/configgrpc v0.102.0/go.mod h1:ASpBXzDWLiDGlG8iRFovU5R4LhAefoC4ajm+qIdslOw= -go.opentelemetry.io/collector/config/confignet v0.102.0 h1:+wQevJ/iBnPxL+roY7WWnAjMxB8v4M5QrS3+0iEmauw= -go.opentelemetry.io/collector/config/confignet v0.102.0/go.mod h1:pfOrCTfSZEB6H2rKtx41/3RN4dKs+X2EKQbw3MGRh0E= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 h1:vS1Ao/R55RNV4O7TA2Qopok8yN+X0LIP6RVWLFkprck= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0/go.mod h1:BMsdeOxN04K0L5FNUBfjFdvwWGNe/rkmSwH4Aelu/X0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/configgrpc v0.116.0 h1:O8Y1X9wDH5dDdqDJ9kqoaMrxEauaDSJBg9aNC6QgB7g= +go.opentelemetry.io/collector/config/configgrpc v0.116.0/go.mod h1:RPrSQrr6xhIaAK2DdcECi142NjSo0npQfVQB3nommSo= +go.opentelemetry.io/collector/config/confignet v1.22.0 h1:SBEMHJZWD8J4qgFw1O+BEkXW9AWldDi6Fz5YeDeoU58= +go.opentelemetry.io/collector/config/confignet v1.22.0/go.mod h1:ZppUH1hgUJOubawEsxsQ9MzEYFytqo2GnVSS7d4CVxc= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 h1:yMkBS9yViCc7U7yeLzJPM2XizlfdVvBRSmsQDWu6qc0= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0/go.mod h1:n8MR6/liuGB5EmTETUBeU5ZgqMOlqKRxUaqPQBOANZ8= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= -go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= +go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= +go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= @@ -186,8 +200,8 @@ golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -195,30 +209,30 @@ golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCc golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= +golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ= +golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -226,8 +240,8 @@ golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= -golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= +golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= +golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -240,12 +254,12 @@ gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 h1:QCqS/PdaHTSWGvupk2F/ehwHtGc0/GYkT+3GAcR1CCc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/exporter/otelarrowexporter/internal/arrow/bestofn.go b/exporter/otelarrowexporter/internal/arrow/bestofn.go index ae4bce633643..443713cda815 100644 --- a/exporter/otelarrowexporter/internal/arrow/bestofn.go +++ b/exporter/otelarrowexporter/internal/arrow/bestofn.go @@ -8,6 +8,10 @@ import ( "math/rand" "runtime" "sort" + "time" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" ) // bestOfNPrioritizer is a prioritizer that selects a less-loaded stream to write. @@ -42,7 +46,7 @@ type streamSorter struct { var _ streamPrioritizer = &bestOfNPrioritizer{} -func newBestOfNPrioritizer(dc doneCancel, numChoices, numStreams int, lf loadFunc) (*bestOfNPrioritizer, []*streamWorkState) { +func newBestOfNPrioritizer(dc doneCancel, numChoices, numStreams int, lf loadFunc, maxLifetime time.Duration) (*bestOfNPrioritizer, []*streamWorkState) { var state []*streamWorkState // Limit numChoices to the number of streams. @@ -50,8 +54,9 @@ func newBestOfNPrioritizer(dc doneCancel, numChoices, numStreams int, lf loadFun for i := 0; i < numStreams; i++ { ws := &streamWorkState{ - waiters: map[int64]chan<- error{}, - toWrite: make(chan writeItem, 1), + maxStreamLifetime: addJitter(maxLifetime), + waiters: map[int64]chan<- error{}, + toWrite: make(chan writeItem, 1), } state = append(state, ws) @@ -112,7 +117,7 @@ func (lp *bestOfNPrioritizer) sendAndWait(ctx context.Context, errCh <-chan erro case <-lp.done: return ErrStreamRestarting case <-ctx.Done(): - return context.Canceled + return status.Errorf(codes.Canceled, "stream wait: %v", ctx.Err()) case lp.input <- wri: return waitForWrite(ctx, errCh, lp.done) } diff --git a/exporter/otelarrowexporter/internal/arrow/common_test.go b/exporter/otelarrowexporter/internal/arrow/common_test.go index f0f6f3823c09..a0451e7143c0 100644 --- a/exporter/otelarrowexporter/internal/arrow/common_test.go +++ b/exporter/otelarrowexporter/internal/arrow/common_test.go @@ -10,7 +10,6 @@ import ( arrowpb "github.com/open-telemetry/otel-arrow/api/experimental/arrow/v1" arrowCollectorMock "github.com/open-telemetry/otel-arrow/api/experimental/arrow/v1/mock" - "github.com/open-telemetry/otel-arrow/collector/testdata" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/component/componenttest" "go.uber.org/mock/gomock" @@ -24,6 +23,7 @@ import ( "google.golang.org/grpc/status" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/otelarrowexporter/internal/arrow/grpcmock" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/testdata" ) var ( @@ -51,8 +51,10 @@ type commonTestCase struct { type noisyTest bool -const Noisy noisyTest = true -const NotNoisy noisyTest = false +const ( + Noisy noisyTest = true + NotNoisy noisyTest = false +) func newTestTelemetry(t zaptest.TestingT, noisy noisyTest) (component.TelemetrySettings, *observer.ObservedLogs) { telset := componenttest.NewNopTelemetrySettings() @@ -279,8 +281,7 @@ func (tc *unresponsiveTestChannel) unblock() { // unsupportedTestChannel mimics gRPC's behavior when there is no // arrow stream service registered with the server. -type arrowUnsupportedTestChannel struct { -} +type arrowUnsupportedTestChannel struct{} func newArrowUnsupportedTestChannel() *arrowUnsupportedTestChannel { return &arrowUnsupportedTestChannel{} @@ -314,8 +315,7 @@ func (tc *arrowUnsupportedTestChannel) onRecv(_ context.Context) func() (*arrowp } // disconnectedTestChannel allows the connection to time out. -type disconnectedTestChannel struct { -} +type disconnectedTestChannel struct{} func newDisconnectedTestChannel() *disconnectedTestChannel { return &disconnectedTestChannel{} @@ -383,8 +383,7 @@ func (tc *sendErrorTestChannel) onRecv(_ context.Context) func() (*arrowpb.Batch } // connectErrorTestChannel returns an error from the ArrowTraces() call -type connectErrorTestChannel struct { -} +type connectErrorTestChannel struct{} func newConnectErrorTestChannel() *connectErrorTestChannel { return &connectErrorTestChannel{} diff --git a/exporter/otelarrowexporter/internal/arrow/exporter.go b/exporter/otelarrowexporter/internal/arrow/exporter.go index 18b3259d3b4a..5836e9256e5d 100644 --- a/exporter/otelarrowexporter/internal/arrow/exporter.go +++ b/exporter/otelarrowexporter/internal/arrow/exporter.go @@ -7,20 +7,53 @@ import ( "context" "errors" "math/rand" + "runtime" "strconv" "sync" "time" arrowpb "github.com/open-telemetry/otel-arrow/api/experimental/arrow/v1" - "github.com/open-telemetry/otel-arrow/collector/netstats" arrowRecord "github.com/open-telemetry/otel-arrow/pkg/otel/arrow_record" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configcompression" "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" "go.uber.org/zap" "google.golang.org/grpc" + "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" + "google.golang.org/grpc/status" + + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/grpcutil" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/netstats" +) + +// Defaults settings should use relatively few resources, so that +// users are required to explicitly configure large instances. +var ( + // DefaultNumStreams is half the number of CPUs. This is + // selected as an estimate of relatively how much work is + // being performed by the exporter compared with other + // components in the system. + DefaultNumStreams = max(1, runtime.NumCPU()/2) +) + +const ( + // DefaultMaxStreamLifetime is 30 seconds, because the + // marginal compression benefit of a longer OTel-Arrow stream + // is limited after 100s of batches. + DefaultMaxStreamLifetime = 30 * time.Second + + // DefaultPayloadCompression is "zstd" so that Arrow IPC + // payloads use Arrow-configured Zstd over the payload + // independently of whatever compression gRPC may have + // configured. This is on by default, achieving "double + // compression" because: + // (a) relatively cheap in CPU terms + // (b) minor compression benefit + // (c) helps stay under gRPC request size limits + DefaultPayloadCompression configcompression.Type = "zstd" ) // Exporter is 1:1 with exporter, isolates arrow-specific @@ -32,9 +65,7 @@ type Exporter struct { // prioritizerName the name of a balancer policy. prioritizerName PrioritizerName - // maxStreamLifetime is a limit on duration for streams. A - // slight "jitter" is applied relative to this value on a - // per-stream basis. + // maxStreamLifetime is a limit on duration for streams. maxStreamLifetime time.Duration // disableDowngrade prevents downgrade from occurring, supports @@ -156,7 +187,7 @@ func (e *Exporter) Start(ctx context.Context) error { downCtx, downDc := newDoneCancel(ctx) var sws []*streamWorkState - e.ready, sws = newStreamPrioritizer(downDc, e.prioritizerName, e.numStreams) + e.ready, sws = newStreamPrioritizer(downDc, e.prioritizerName, e.numStreams, e.maxStreamLifetime) for _, ws := range sws { e.startArrowStream(downCtx, ws) @@ -236,7 +267,6 @@ func (e *Exporter) runArrowStream(ctx context.Context, dc doneCancel, state *str producer := e.newProducer() stream := newStream(producer, e.ready, e.telemetry, e.netReporter, state) - stream.maxStreamLifetime = addJitter(e.maxStreamLifetime) defer func() { if err := producer.Close(); err != nil { @@ -258,6 +288,14 @@ func (e *Exporter) runArrowStream(ctx context.Context, dc doneCancel, state *str // // consumer should fall back to standard OTLP, (true, nil) func (e *Exporter) SendAndWait(ctx context.Context, data any) (bool, error) { + // If the incoming context is already canceled, return the + // same error condition a unary gRPC or HTTP exporter would do. + select { + case <-ctx.Done(): + return false, status.Errorf(codes.Canceled, "context done before send: %v", ctx.Err()) + default: + } + errCh := make(chan error, 1) // Note that if the OTLP exporter's gRPC Headers field was @@ -302,6 +340,10 @@ func (e *Exporter) SendAndWait(ctx context.Context, data any) (bool, error) { } md["otlp-pdata-size"] = strconv.Itoa(uncompSize) + if dead, ok := ctx.Deadline(); ok { + md["grpc-timeout"] = grpcutil.EncodeTimeout(time.Until(dead)) + } + wri := writeItem{ records: data, md: md, @@ -320,7 +362,6 @@ func (e *Exporter) SendAndWait(ctx context.Context, data any) (bool, error) { err := writer.sendAndWait(ctx, errCh, wri) if err != nil && errors.Is(err, ErrStreamRestarting) { continue // an internal retry - } // result from arrow server (may be nil, may be // permanent, etc.) @@ -343,7 +384,7 @@ func waitForWrite(ctx context.Context, errCh <-chan error, down <-chan struct{}) select { case <-ctx.Done(): // This caller's context timed out. - return ctx.Err() + return status.Errorf(codes.Canceled, "send wait: %v", ctx.Err()) case <-down: return ErrStreamRestarting case err := <-errCh: diff --git a/exporter/otelarrowexporter/internal/arrow/exporter_test.go b/exporter/otelarrowexporter/internal/arrow/exporter_test.go index 276e5f3fa437..a182d02ecc45 100644 --- a/exporter/otelarrowexporter/internal/arrow/exporter_test.go +++ b/exporter/otelarrowexporter/internal/arrow/exporter_test.go @@ -6,7 +6,6 @@ package arrow import ( "context" "encoding/json" - "errors" "fmt" "sync" "sync/atomic" @@ -14,8 +13,6 @@ import ( "time" arrowpb "github.com/open-telemetry/otel-arrow/api/experimental/arrow/v1" - "github.com/open-telemetry/otel-arrow/collector/netstats" - "github.com/open-telemetry/otel-arrow/collector/testdata" arrowRecord "github.com/open-telemetry/otel-arrow/pkg/otel/arrow_record" arrowRecordMock "github.com/open-telemetry/otel-arrow/pkg/otel/arrow_record/mock" otelAssert "github.com/open-telemetry/otel-arrow/pkg/otel/assert" @@ -31,16 +28,24 @@ import ( "go.uber.org/zap/zaptest" "golang.org/x/net/http2/hpack" "google.golang.org/grpc" + "google.golang.org/grpc/codes" "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/grpcutil" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/netstats" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/testdata" ) var AllPrioritizers = []PrioritizerName{LeastLoadedPrioritizer, LeastLoadedTwoPrioritizer} const defaultMaxStreamLifetime = 11 * time.Second -type compareJSONTraces struct{ ptrace.Traces } -type compareJSONMetrics struct{ pmetric.Metrics } -type compareJSONLogs struct{ plog.Logs } +type ( + compareJSONTraces struct{ ptrace.Traces } + compareJSONMetrics struct{ pmetric.Metrics } + compareJSONLogs struct{ plog.Logs } +) func (c compareJSONTraces) MarshalJSON() ([]byte, error) { var m ptrace.JSONMarshaler @@ -226,7 +231,7 @@ func TestArrowExporterSuccess(t *testing.T) { case ptrace.Traces: traces, err := testCon.TracesFrom(outputData) require.NoError(t, err) - require.Equal(t, 1, len(traces)) + require.Len(t, traces, 1) otelAssert.Equiv(stdTesting, []json.Marshaler{ compareJSONTraces{testData}, }, []json.Marshaler{ @@ -235,7 +240,7 @@ func TestArrowExporterSuccess(t *testing.T) { case plog.Logs: logs, err := testCon.LogsFrom(outputData) require.NoError(t, err) - require.Equal(t, 1, len(logs)) + require.Len(t, logs, 1) otelAssert.Equiv(stdTesting, []json.Marshaler{ compareJSONLogs{testData}, }, []json.Marshaler{ @@ -244,7 +249,7 @@ func TestArrowExporterSuccess(t *testing.T) { case pmetric.Metrics: metrics, err := testCon.MetricsFrom(outputData) require.NoError(t, err) - require.Equal(t, 1, len(metrics)) + require.Len(t, metrics, 1) otelAssert.Equiv(stdTesting, []json.Marshaler{ compareJSONMetrics{testData}, }, []json.Marshaler{ @@ -278,7 +283,18 @@ func TestArrowExporterTimeout(t *testing.T) { sent, err := tc.exporter.SendAndWait(ctx, twoTraces) require.True(t, sent) require.Error(t, err) - require.True(t, errors.Is(err, context.Canceled)) + + stat, is := status.FromError(err) + require.True(t, is, "is a gRPC status") + require.Equal(t, codes.Canceled, stat.Code()) + + // Repeat the request, will get immediate timeout. + sent, err = tc.exporter.SendAndWait(ctx, twoTraces) + require.False(t, sent) + stat, is = status.FromError(err) + require.True(t, is, "is a gRPC status error: %v", err) + require.Equal(t, "context done before send: context canceled", stat.Message()) + require.Equal(t, codes.Canceled, stat.Code()) require.NoError(t, tc.exporter.Shutdown(ctx)) }) @@ -304,8 +320,8 @@ func TestArrowExporterStreamConnectError(t *testing.T) { require.NoError(t, tc.exporter.Shutdown(bg)) - require.Less(t, 0, len(tc.observedLogs.All()), "should have at least one log: %v", tc.observedLogs.All()) - require.Equal(t, tc.observedLogs.All()[0].Message, "cannot start arrow stream") + require.NotEmpty(t, tc.observedLogs.All(), "should have at least one log: %v", tc.observedLogs.All()) + require.Equal(t, "cannot start arrow stream", tc.observedLogs.All()[0].Message) }) } } @@ -331,7 +347,7 @@ func TestArrowExporterDowngrade(t *testing.T) { require.NoError(t, tc.exporter.Shutdown(bg)) require.Less(t, 1, len(tc.observedLogs.All()), "should have at least two logs: %v", tc.observedLogs.All()) - require.Equal(t, tc.observedLogs.All()[0].Message, "arrow is not supported") + require.Equal(t, "arrow is not supported", tc.observedLogs.All()[0].Message) require.Contains(t, tc.observedLogs.All()[1].Message, "downgrading") }) } @@ -380,7 +396,7 @@ func TestArrowExporterDisableDowngrade(t *testing.T) { require.NoError(t, tc.exporter.Shutdown(bg)) require.Less(t, 1, len(tc.observedLogs.All()), "should have at least two logs: %v", tc.observedLogs.All()) - require.Equal(t, tc.observedLogs.All()[0].Message, "arrow is not supported") + require.Equal(t, "arrow is not supported", tc.observedLogs.All()[0].Message) require.NotContains(t, tc.observedLogs.All()[1].Message, "downgrading") }) } @@ -406,7 +422,10 @@ func TestArrowExporterConnectTimeout(t *testing.T) { }() _, err := tc.exporter.SendAndWait(ctx, twoTraces) require.Error(t, err) - require.True(t, errors.Is(err, context.Canceled)) + + stat, is := status.FromError(err) + require.True(t, is, "is a gRPC status error: %v", err) + require.Equal(t, codes.Canceled, stat.Code()) require.NoError(t, tc.exporter.Shutdown(bg)) }) @@ -488,8 +507,11 @@ func TestArrowExporterStreamRace(t *testing.T) { defer wg.Done() // This blocks until the cancelation. _, err := tc.exporter.SendAndWait(callctx, twoTraces) - require.Error(t, err) - require.True(t, errors.Is(err, context.Canceled)) + assert.Error(t, err) + + stat, is := status.FromError(err) + assert.True(t, is, "is a gRPC status error: %v", err) + assert.Equal(t, codes.Canceled, stat.Code()) }() } @@ -527,8 +549,8 @@ func TestArrowExporterStreaming(t *testing.T) { defer wg.Done() for data := range channel.sendChannel() { traces, err := testCon.TracesFrom(data) - require.NoError(t, err) - require.Equal(t, 1, len(traces)) + assert.NoError(t, err) + assert.Len(t, traces, 1) actualOutput = append(actualOutput, traces[0]) channel.recv <- statusOKFor(data.BatchId) } @@ -557,65 +579,93 @@ func TestArrowExporterStreaming(t *testing.T) { // TestArrowExporterHeaders tests a mix of outgoing context headers. func TestArrowExporterHeaders(t *testing.T) { - tc := newSingleStreamMetadataTestCase(t) - channel := newHealthyTestChannel() + for _, withDeadline := range []bool{true, false} { + t.Run(fmt.Sprint("with_deadline=", withDeadline), func(t *testing.T) { + tc := newSingleStreamMetadataTestCase(t) + channel := newHealthyTestChannel() - tc.traceCall.AnyTimes().DoAndReturn(tc.returnNewStream(channel)) + tc.traceCall.AnyTimes().DoAndReturn(tc.returnNewStream(channel)) - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - require.NoError(t, tc.exporter.Start(ctx)) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() - var expectOutput []metadata.MD - var actualOutput []metadata.MD + require.NoError(t, tc.exporter.Start(ctx)) - var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() - md := metadata.MD{} - hpd := hpack.NewDecoder(4096, func(f hpack.HeaderField) { - md[f.Name] = append(md[f.Name], f.Value) - }) - for data := range channel.sendChannel() { - if len(data.Headers) == 0 { - actualOutput = append(actualOutput, nil) - } else { - _, err := hpd.Write(data.Headers) + var expectOutput []metadata.MD + var actualOutput []metadata.MD + + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + md := metadata.MD{} + hpd := hpack.NewDecoder(4096, func(f hpack.HeaderField) { + md[f.Name] = append(md[f.Name], f.Value) + }) + for data := range channel.sendChannel() { + if len(data.Headers) == 0 { + actualOutput = append(actualOutput, nil) + } else { + _, err := hpd.Write(data.Headers) + assert.NoError(t, err) + actualOutput = append(actualOutput, md) + md = metadata.MD{} + } + channel.recv <- statusOKFor(data.BatchId) + } + }() + + for times := 0; times < 10; times++ { + input := testdata.GenerateTraces(2) + + if times%2 == 1 { + md := metadata.MD{ + "expected1": []string{"metadata1"}, + "expected2": []string{fmt.Sprint(times)}, + "otlp-pdata-size": []string{"329"}, + } + expectOutput = append(expectOutput, md) + } else { + expectOutput = append(expectOutput, metadata.MD{ + "otlp-pdata-size": []string{"329"}, + }) + } + + sendCtx := ctx + if withDeadline { + var sendCancel context.CancelFunc + sendCtx, sendCancel = context.WithTimeout(sendCtx, time.Second) + defer sendCancel() + } + + sent, err := tc.exporter.SendAndWait(sendCtx, input) require.NoError(t, err) - actualOutput = append(actualOutput, md) - md = metadata.MD{} + require.True(t, sent) } - channel.recv <- statusOKFor(data.BatchId) - } - }() - - for times := 0; times < 10; times++ { - input := testdata.GenerateTraces(2) + // Stop the test conduit started above. + cancel() + wg.Wait() - if times%2 == 1 { - md := metadata.MD{ - "expected1": []string{"metadata1"}, - "expected2": []string{fmt.Sprint(times)}, - "otlp-pdata-size": []string{"329"}, + // Manual check for proper deadline propagation. Since the test + // is timed we don't expect an exact match. + if withDeadline { + for _, out := range actualOutput { + dead := out.Get("grpc-timeout") + require.Len(t, dead, 1) + require.NotEmpty(t, dead[0]) + to, err := grpcutil.DecodeTimeout(dead[0]) + require.NoError(t, err) + // Allow the test to lapse for 0.5s. + require.Less(t, time.Second/2, to) + require.GreaterOrEqual(t, time.Second, to) + out.Delete("grpc-timeout") + } } - expectOutput = append(expectOutput, md) - } else { - expectOutput = append(expectOutput, metadata.MD{ - "otlp-pdata-size": []string{"329"}, - }) - } - sent, err := tc.exporter.SendAndWait(context.Background(), input) - require.NoError(t, err) - require.True(t, sent) + require.Equal(t, expectOutput, actualOutput) + require.NoError(t, tc.exporter.Shutdown(ctx)) + }) } - // Stop the test conduit started above. - cancel() - wg.Wait() - - require.Equal(t, expectOutput, actualOutput) - require.NoError(t, tc.exporter.Shutdown(ctx)) } // TestArrowExporterIsTraced tests whether trace and span ID are @@ -649,7 +699,7 @@ func TestArrowExporterIsTraced(t *testing.T) { actualOutput = append(actualOutput, nil) } else { _, err := hpd.Write(data.Headers) - require.NoError(t, err) + assert.NoError(t, err) actualOutput = append(actualOutput, md) md = metadata.MD{} } @@ -737,8 +787,8 @@ func TestArrowExporterStreamLifetimeAndShutdown(t *testing.T) { for data := range channel.sendChannel() { traces, err := testCon.TracesFrom(data) - require.NoError(t, err) - require.Equal(t, 1, len(traces)) + assert.NoError(t, err) + assert.Len(t, traces, 1) atomic.AddUint64(&actualCount, 1) channel.recv <- statusOKFor(data.BatchId) } @@ -872,9 +922,7 @@ func benchmarkPrioritizer(b *testing.B, numStreams int, pname PrioritizerName) { wg.Add(1) defer func() { - if err := tc.exporter.Shutdown(bg); err != nil { - b.Errorf("shutdown failed: %v", err) - } + assert.NoError(b, tc.exporter.Shutdown(bg), "shutdown failed") wg.Done() wg.Wait() }() diff --git a/exporter/otelarrowexporter/internal/arrow/prioritizer.go b/exporter/otelarrowexporter/internal/arrow/prioritizer.go index 84220338348f..551b9f781fc3 100644 --- a/exporter/otelarrowexporter/internal/arrow/prioritizer.go +++ b/exporter/otelarrowexporter/internal/arrow/prioritizer.go @@ -8,6 +8,7 @@ import ( "fmt" "strconv" "strings" + "time" "go.opentelemetry.io/collector/component" "google.golang.org/grpc/codes" @@ -50,7 +51,7 @@ type streamWriter interface { sendAndWait(context.Context, <-chan error, writeItem) error } -func newStreamPrioritizer(dc doneCancel, name PrioritizerName, numStreams int) (streamPrioritizer, []*streamWorkState) { +func newStreamPrioritizer(dc doneCancel, name PrioritizerName, numStreams int, maxLifetime time.Duration) (streamPrioritizer, []*streamWorkState) { if name == unsetPrioritizer { name = DefaultPrioritizer } @@ -58,10 +59,10 @@ func newStreamPrioritizer(dc doneCancel, name PrioritizerName, numStreams int) ( // error was checked and reported in Validate n, err := strconv.Atoi(string(name[len(llPrefix):])) if err == nil { - return newBestOfNPrioritizer(dc, n, numStreams, pendingRequests) + return newBestOfNPrioritizer(dc, n, numStreams, pendingRequests, maxLifetime) } } - return newBestOfNPrioritizer(dc, numStreams, numStreams, pendingRequests) + return newBestOfNPrioritizer(dc, numStreams, numStreams, pendingRequests, maxLifetime) } // pendingRequests is the load function used by leastloadedN. diff --git a/exporter/otelarrowexporter/internal/arrow/stream.go b/exporter/otelarrowexporter/internal/arrow/stream.go index 7070d8c6ea42..c6251b7ad249 100644 --- a/exporter/otelarrowexporter/internal/arrow/stream.go +++ b/exporter/otelarrowexporter/internal/arrow/stream.go @@ -7,16 +7,13 @@ import ( "bytes" "context" "errors" - "fmt" "io" "sync" "time" arrowpb "github.com/open-telemetry/otel-arrow/api/experimental/arrow/v1" - "github.com/open-telemetry/otel-arrow/collector/netstats" arrowRecord "github.com/open-telemetry/otel-arrow/pkg/otel/arrow_record" "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/consumer/consumererror" "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" @@ -30,16 +27,12 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/netstats" ) // Stream is 1:1 with gRPC stream. type Stream struct { - // maxStreamLifetime is the max timeout before stream - // should be closed on the client side. This ensures a - // graceful shutdown before max_connection_age is reached - // on the server side. - maxStreamLifetime time.Duration - // producer is exclusive to the holder of the stream. producer arrowRecord.ProducerAPI @@ -77,6 +70,11 @@ type streamWorkState struct { // prioritizer and a stream. toWrite chan writeItem + // maxStreamLifetime is a limit on duration for streams. A + // slight "jitter" is applied relative to this value on a + // per-stream basis. + maxStreamLifetime time.Duration + // lock protects waiters lock sync.Mutex @@ -130,9 +128,9 @@ func (s *Stream) setBatchChannel(batchID int64, errCh chan<- error) { s.workState.waiters[batchID] = errCh } -// logStreamError decides how to log an error. `which` indicates the -// stream direction, will be "reader" or "writer". -func (s *Stream) logStreamError(which string, err error) { +// logStreamError decides how to log an error. `where` indicates the +// error location, will be "reader" or "writer". +func (s *Stream) logStreamError(where string, err error) { var code codes.Code var msg string // gRPC tends to supply status-wrapped errors, so we always @@ -151,9 +149,9 @@ func (s *Stream) logStreamError(which string, err error) { msg = err.Error() } if code == codes.Canceled { - s.telemetry.Logger.Debug("arrow stream shutdown", zap.String("which", which), zap.String("message", msg)) + s.telemetry.Logger.Debug("arrow stream shutdown", zap.String("message", msg), zap.String("where", where)) } else { - s.telemetry.Logger.Error("arrow stream error", zap.String("which", which), zap.String("message", msg), zap.Int("code", int(code))) + s.telemetry.Logger.Error("arrow stream error", zap.Int("code", int(code)), zap.String("message", msg), zap.String("where", where)) } } @@ -254,8 +252,8 @@ func (s *Stream) write(ctx context.Context) (retErr error) { hdrsEnc := hpack.NewEncoder(&hdrsBuf) var timerCh <-chan time.Time - if s.maxStreamLifetime != 0 { - timer := time.NewTimer(s.maxStreamLifetime) + if s.workState.maxStreamLifetime != 0 { + timer := time.NewTimer(s.workState.maxStreamLifetime) timerCh = timer.C defer timer.Stop() } @@ -269,7 +267,7 @@ func (s *Stream) write(ctx context.Context) (retErr error) { return nil case wri = <-s.workState.toWrite: case <-ctx.Done(): - return ctx.Err() + return status.Errorf(codes.Canceled, "stream input: %v", ctx.Err()) } err := s.encodeAndSend(wri, &hdrsBuf, hdrsEnc) @@ -314,8 +312,8 @@ func (s *Stream) encodeAndSend(wri writeItem, hdrsBuf *bytes.Buffer, hdrsEnc *hp if err != nil { // This is some kind of internal error. We will restart the // stream and mark this record as a permanent one. - err = fmt.Errorf("encode: %w", err) - wri.errCh <- consumererror.NewPermanent(err) + err = status.Errorf(codes.Internal, "encode: %v", err) + wri.errCh <- err return err } @@ -331,8 +329,8 @@ func (s *Stream) encodeAndSend(wri writeItem, hdrsBuf *bytes.Buffer, hdrsEnc *hp // This case is like the encode-failure case // above, we will restart the stream but consider // this a permenent error. - err = fmt.Errorf("hpack: %w", err) - wri.errCh <- consumererror.NewPermanent(err) + err = status.Errorf(codes.Internal, "hpack: %v", err) + wri.errCh <- err return err } } @@ -346,13 +344,10 @@ func (s *Stream) encodeAndSend(wri writeItem, hdrsBuf *bytes.Buffer, hdrsEnc *hp // unreliable for arrow transport, so we instrument it // directly here. Only the primary direction of transport // is instrumented this way. - if wri.uncompSize != 0 { - var sized netstats.SizesStruct - sized.Method = s.method - sized.Length = int64(wri.uncompSize) - s.netReporter.CountSend(ctx, sized) - s.netReporter.SetSpanSizeAttributes(ctx, sized) - } + var sized netstats.SizesStruct + sized.Method = s.method + sized.Length = int64(wri.uncompSize) + s.netReporter.CountSend(ctx, sized) if err := s.client.Send(batch); err != nil { // The error will be sent to errCh during cleanup for this stream. @@ -380,24 +375,24 @@ func (s *Stream) read(_ context.Context) error { } if err = s.processBatchStatus(resp); err != nil { - return fmt.Errorf("process: %w", err) + return err } } } // getSenderChannel takes the stream lock and removes the corresonding // sender channel. -func (sws *streamWorkState) getSenderChannel(status *arrowpb.BatchStatus) (chan<- error, error) { +func (sws *streamWorkState) getSenderChannel(bstat *arrowpb.BatchStatus) (chan<- error, error) { sws.lock.Lock() defer sws.lock.Unlock() - ch, ok := sws.waiters[status.BatchId] + ch, ok := sws.waiters[bstat.BatchId] if !ok { // Will break the stream. - return nil, fmt.Errorf("unrecognized batch ID: %d", status.BatchId) + return nil, status.Errorf(codes.Internal, "unrecognized batch ID: %d", bstat.BatchId) } - delete(sws.waiters, status.BatchId) + delete(sws.waiters, bstat.BatchId) return ch, nil } @@ -458,7 +453,7 @@ func (s *Stream) encode(records any) (_ *arrowpb.BatchArrowRecords, retErr error zap.Reflect("recovered", err), zap.Stack("stacktrace"), ) - retErr = fmt.Errorf("panic in otel-arrow-adapter: %v", err) + retErr = status.Errorf(codes.Internal, "panic in otel-arrow-adapter: %v", err) } }() var batch *arrowpb.BatchArrowRecords @@ -471,7 +466,7 @@ func (s *Stream) encode(records any) (_ *arrowpb.BatchArrowRecords, retErr error case pmetric.Metrics: batch, err = s.producer.BatchArrowRecordsFromMetrics(data) default: - return nil, fmt.Errorf("unsupported OTLP type: %T", records) + return nil, status.Errorf(codes.Unimplemented, "unsupported OTel-Arrow signal type: %T", records) } return batch, err } diff --git a/exporter/otelarrowexporter/internal/arrow/stream_test.go b/exporter/otelarrowexporter/internal/arrow/stream_test.go index e916667c455c..75338bb3d681 100644 --- a/exporter/otelarrowexporter/internal/arrow/stream_test.go +++ b/exporter/otelarrowexporter/internal/arrow/stream_test.go @@ -5,19 +5,20 @@ package arrow import ( "context" - "errors" "fmt" "sync" "testing" "time" arrowpb "github.com/open-telemetry/otel-arrow/api/experimental/arrow/v1" - "github.com/open-telemetry/otel-arrow/collector/netstats" arrowRecordMock "github.com/open-telemetry/otel-arrow/pkg/otel/arrow_record/mock" "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/consumer/consumererror" "go.uber.org/mock/gomock" "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/netstats" ) var oneBatch = &arrowpb.BatchArrowRecords{ @@ -44,7 +45,7 @@ func newStreamTestCase(t *testing.T, pname PrioritizerName) *streamTestCase { producer := arrowRecordMock.NewMockProducerAPI(ctrl) bg, dc := newDoneCancel(context.Background()) - prio, state := newStreamPrioritizer(dc, pname, 1) + prio, state := newStreamPrioritizer(dc, pname, 1, 10*time.Second) ctc := newCommonTestCase(t, NotNoisy) cts := ctc.newMockStream(bg) @@ -53,7 +54,6 @@ func newStreamTestCase(t *testing.T, pname PrioritizerName) *streamTestCase { ctc.requestMetadataCall.AnyTimes().Return(nil, nil) stream := newStream(producer, prio, ctc.telset, netstats.Noop{}, state[0]) - stream.maxStreamLifetime = 10 * time.Second fromTracesCall := producer.EXPECT().BatchArrowRecordsFromTraces(gomock.Any()).Times(0) fromMetricsCall := producer.EXPECT().BatchArrowRecordsFromMetrics(gomock.Any()).Times(0) @@ -141,9 +141,7 @@ func (tc *streamTestCase) mustSendAndWait() error { func TestStreamNoMaxLifetime(t *testing.T) { for _, pname := range AllPrioritizers { t.Run(string(pname), func(t *testing.T) { - tc := newStreamTestCase(t, pname) - tc.stream.maxStreamLifetime = 0 tc.fromTracesCall.Times(1).Return(oneBatch, nil) tc.closeSendCall.Times(0) @@ -182,8 +180,12 @@ func TestStreamEncodeError(t *testing.T) { // sender should get a permanent testErr err := tc.mustSendAndWait() require.Error(t, err) - require.True(t, errors.Is(err, testErr)) - require.True(t, consumererror.IsPermanent(err)) + + stat, is := status.FromError(err) + require.True(t, is, "is a gRPC status error: %v", err) + require.Equal(t, codes.Internal, stat.Code()) + + require.Contains(t, stat.Message(), testErr.Error()) }) } } @@ -212,7 +214,7 @@ func TestStreamUnknownBatchError(t *testing.T) { // sender should get ErrStreamRestarting err := tc.mustSendAndWait() require.Error(t, err) - require.True(t, errors.Is(err, ErrStreamRestarting)) + require.ErrorIs(t, err, ErrStreamRestarting) }) } } @@ -244,12 +246,10 @@ func TestStreamStatusUnavailableInvalid(t *testing.T) { }() // sender should get "test unavailable" once, success second time. err := tc.mustSendAndWait() - require.Error(t, err) - require.Contains(t, err.Error(), "test unavailable") + require.ErrorContains(t, err, "test unavailable") err = tc.mustSendAndWait() - require.Error(t, err) - require.Contains(t, err.Error(), "test invalid") + require.ErrorContains(t, err, "test invalid") err = tc.mustSendAndWait() require.NoError(t, err) @@ -279,8 +279,7 @@ func TestStreamStatusUnrecognized(t *testing.T) { channel.recv <- statusUnrecognizedFor(batch.BatchId) }() err := tc.mustSendAndWait() - require.Error(t, err) - require.Contains(t, err.Error(), "test unrecognized") + require.ErrorContains(t, err, "test unrecognized") // Note: do not cancel the context, the stream should be // shutting down due to the error. @@ -317,8 +316,8 @@ func TestStreamUnsupported(t *testing.T) { tc.waitForShutdown() - require.Less(t, 0, len(tc.observedLogs.All()), "should have at least one log: %v", tc.observedLogs.All()) - require.Equal(t, tc.observedLogs.All()[0].Message, "arrow is not supported") + require.NotEmpty(t, tc.observedLogs.All(), "should have at least one log: %v", tc.observedLogs.All()) + require.Equal(t, "arrow is not supported", tc.observedLogs.All()[0].Message) }) } } @@ -343,7 +342,7 @@ func TestStreamSendError(t *testing.T) { // sender should get ErrStreamRestarting err := tc.mustSendAndWait() require.Error(t, err) - require.True(t, errors.Is(err, ErrStreamRestarting)) + require.ErrorIs(t, err, ErrStreamRestarting) }) } } diff --git a/exporter/otelarrowexporter/internal/metadata/generated_status.go b/exporter/otelarrowexporter/internal/metadata/generated_status.go index fb81886dc57f..cc06fd2c526c 100644 --- a/exporter/otelarrowexporter/internal/metadata/generated_status.go +++ b/exporter/otelarrowexporter/internal/metadata/generated_status.go @@ -7,11 +7,12 @@ import ( ) var ( - Type = component.MustNewType("otelarrow") + Type = component.MustNewType("otelarrow") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/otelarrowexporter" ) const ( - TracesStability = component.StabilityLevelDevelopment - MetricsStability = component.StabilityLevelDevelopment - LogsStability = component.StabilityLevelDevelopment + TracesStability = component.StabilityLevelBeta + MetricsStability = component.StabilityLevelBeta + LogsStability = component.StabilityLevelBeta ) diff --git a/exporter/otelarrowexporter/internal/metadata/generated_telemetry.go b/exporter/otelarrowexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index f7c6cdc6ff88..000000000000 --- a/exporter/otelarrowexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/otelarrow") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/otelarrow") -} diff --git a/exporter/otelarrowexporter/internal/metadata/generated_telemetry_test.go b/exporter/otelarrowexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 94bc2ee335f0..000000000000 --- a/exporter/otelarrowexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/otelarrow", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/otelarrow", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/otelarrowexporter/metadata.go b/exporter/otelarrowexporter/metadata.go new file mode 100644 index 000000000000..6bd167624dfc --- /dev/null +++ b/exporter/otelarrowexporter/metadata.go @@ -0,0 +1,201 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package otelarrowexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/otelarrowexporter" + +import ( + "context" + "errors" + "fmt" + "runtime" + "sort" + "strings" + "sync" + + arrowPkg "github.com/apache/arrow/go/v16/arrow" + "go.opentelemetry.io/collector/client" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/consumer/consumererror" + "go.opentelemetry.io/collector/exporter" + "go.opentelemetry.io/collector/pdata/plog" + "go.opentelemetry.io/collector/pdata/pmetric" + "go.opentelemetry.io/collector/pdata/ptrace" + "go.opentelemetry.io/otel/attribute" + "go.uber.org/multierr" + "google.golang.org/grpc/metadata" + + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/compression/zstd" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/netstats" +) + +// errTooManyExporters is returned when the MetadataCardinalityLimit has been reached. +var errTooManyExporters = consumererror.NewPermanent(errors.New("too many exporter metadata-value combinations")) + +type metadataExporter struct { + config *Config + settings exporter.Settings + scf streamClientFactory + host component.Host + + metadataKeys []string + exporters sync.Map + netReporter *netstats.NetworkReporter + + userAgent string + + // Guards the size and the storing logic to ensure no more than limit items are stored. + // If we are willing to allow "some" extra items than the limit this can be removed and size can be made atomic. + lock sync.Mutex + size int +} + +var _ exp = (*metadataExporter)(nil) + +func newMetadataExporter(cfg component.Config, set exporter.Settings, streamClientFactory streamClientFactory) (exp, error) { + oCfg := cfg.(*Config) + netReporter, err := netstats.NewExporterNetworkReporter(set) + if err != nil { + return nil, err + } + userAgent := fmt.Sprintf("%s/%s (%s/%s)", + set.BuildInfo.Description, set.BuildInfo.Version, runtime.GOOS, runtime.GOARCH) + + if !oCfg.Arrow.Disabled { + // Ignoring an error because Validate() was called. + _ = zstd.SetEncoderConfig(oCfg.Arrow.Zstd) + + userAgent += fmt.Sprintf(" ApacheArrow/%s (NumStreams/%d)", arrowPkg.PkgVersion, oCfg.Arrow.NumStreams) + } + // use lower-case, to be consistent with http/2 headers. + mks := make([]string, len(oCfg.MetadataKeys)) + for i, k := range oCfg.MetadataKeys { + mks[i] = strings.ToLower(k) + } + sort.Strings(mks) + if len(mks) == 0 { + return newExporter(cfg, set, streamClientFactory, userAgent, netReporter) + } + return &metadataExporter{ + config: oCfg, + settings: set, + scf: streamClientFactory, + metadataKeys: mks, + userAgent: userAgent, + netReporter: netReporter, + }, nil +} + +func (e *metadataExporter) getSettings() exporter.Settings { + return e.settings +} + +func (e *metadataExporter) getConfig() component.Config { + return e.config +} + +func (e *metadataExporter) start(_ context.Context, host component.Host) (err error) { + e.host = host + return nil +} + +func (e *metadataExporter) shutdown(ctx context.Context) error { + var err error + e.exporters.Range(func(_ any, value any) bool { + be := value.(exp) + err = multierr.Append(err, be.shutdown(ctx)) + return true + }) + return err +} + +func (e *metadataExporter) pushTraces(ctx context.Context, td ptrace.Traces) error { + s, mdata := e.getAttrSet(ctx, e.metadataKeys) + + be, err := e.getOrCreateExporter(ctx, s, mdata) + if err != nil { + return err + } + return be.pushTraces(ctx, td) +} + +func (e *metadataExporter) pushMetrics(ctx context.Context, md pmetric.Metrics) error { + s, mdata := e.getAttrSet(ctx, e.metadataKeys) + + be, err := e.getOrCreateExporter(ctx, s, mdata) + if err != nil { + return err + } + + return be.pushMetrics(ctx, md) +} + +func (e *metadataExporter) pushLogs(ctx context.Context, ld plog.Logs) error { + s, mdata := e.getAttrSet(ctx, e.metadataKeys) + + be, err := e.getOrCreateExporter(ctx, s, mdata) + if err != nil { + return err + } + + return be.pushLogs(ctx, ld) +} + +func (e *metadataExporter) getOrCreateExporter(ctx context.Context, s attribute.Set, md metadata.MD) (exp, error) { + e.lock.Lock() + defer e.lock.Unlock() + + if e.config.MetadataCardinalityLimit != 0 && e.size >= int(e.config.MetadataCardinalityLimit) { + return nil, errTooManyExporters + } + + v, ok := e.exporters.Load(s) + if ok { + return v.(exp), nil + } + + newExp, err := newExporter(e.config, e.settings, e.scf, e.userAgent, e.netReporter) + if err != nil { + return nil, fmt.Errorf("failed to create exporter: %w", err) + } + + var loaded bool + v, loaded = e.exporters.LoadOrStore(s, newExp) + if !loaded { + // set metadata keys for base exporter to add them to the outgoing context. + newExp.(*baseExporter).setMetadata(md) + + // Start the goroutine only if we added the object to the map, otherwise is already started. + err = newExp.start(ctx, e.host) + if err != nil { + e.exporters.Delete(s) + return nil, fmt.Errorf("failed to start exporter: %w", err) + } + + e.size++ + } + + return v.(exp), nil +} + +// getAttrSet is code taken from the core collector's batchprocessor multibatch logic. +// https://github.com/open-telemetry/opentelemetry-collector/blob/v0.107.0/processor/batchprocessor/batch_processor.go#L298 +func (e *metadataExporter) getAttrSet(ctx context.Context, keys []string) (attribute.Set, metadata.MD) { + // Get each metadata key value, form the corresponding + // attribute set for use as a map lookup key. + info := client.FromContext(ctx) + md := map[string][]string{} + var attrs []attribute.KeyValue + for _, k := range keys { + // Lookup the value in the incoming metadata, copy it + // into the outgoing metadata, and create a unique + // value for the attributeSet. + vs := info.Metadata.Get(k) + md[k] = vs + if len(vs) == 1 { + attrs = append(attrs, attribute.String(k, vs[0])) + } else { + attrs = append(attrs, attribute.StringSlice(k, vs)) + } + } + return attribute.NewSet(attrs...), metadata.MD(md) +} diff --git a/exporter/otelarrowexporter/metadata.yaml b/exporter/otelarrowexporter/metadata.yaml index 110222201898..7a09e682f725 100644 --- a/exporter/otelarrowexporter/metadata.yaml +++ b/exporter/otelarrowexporter/metadata.yaml @@ -1,13 +1,12 @@ type: otelarrow -scope_name: otelcol/otelarrow status: class: exporter stability: - development: [traces, metrics, logs] - distributions: [] + beta: [traces, metrics, logs] + distributions: [contrib, k8s] codeowners: - active: [jmacd, moh-osman3, codeboten] + active: [jmacd, moh-osman3, lquerel] tests: config: diff --git a/exporter/otelarrowexporter/metadata_test.go b/exporter/otelarrowexporter/metadata_test.go new file mode 100644 index 000000000000..4ec7b7e8d23a --- /dev/null +++ b/exporter/otelarrowexporter/metadata_test.go @@ -0,0 +1,208 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 +package otelarrowexporter + +import ( + "context" + "fmt" + "net" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/client" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/config/configgrpc" + "go.opentelemetry.io/collector/config/configtls" + "go.opentelemetry.io/collector/consumer/consumererror" + "go.opentelemetry.io/collector/exporter/exportertest" + + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/testdata" +) + +func TestSendTracesWithMetadata(t *testing.T) { + // Start an OTel-Arrow receiver. + ln, err := net.Listen("tcp", "localhost:") + require.NoError(t, err, "Failed to find an available address to run the gRPC server: %v", err) + rcv, err := otelArrowTracesReceiverOnGRPCServer(ln, false) + rcv.hasMetadata = true + rcv.spanCountByMetadata = make(map[string]int) + + rcv.start() + require.NoError(t, err, "Failed to start mock OTLP receiver") + // Also closes the connection. + defer rcv.srv.GracefulStop() + + // Start an OTLP exporter and point to the receiver. + factory := NewFactory() + cfg := createDefaultConfig().(*Config) + cfg.ClientConfig = configgrpc.ClientConfig{ + Endpoint: ln.Addr().String(), + TLSSetting: configtls.ClientConfig{ + Insecure: true, + }, + } + cfg.Arrow.MaxStreamLifetime = 100 * time.Second + + cfg.MetadataCardinalityLimit = 10 + cfg.MetadataKeys = []string{"key1", "key2"} + set := exportertest.NewNopSettings() + set.BuildInfo.Description = "Collector" + set.BuildInfo.Version = "1.2.3test" + bg := context.Background() + exp, err := factory.CreateTraces(bg, set, cfg) + require.NoError(t, err) + require.NotNil(t, exp) + defer func() { + assert.NoError(t, exp.Shutdown(context.Background())) + }() + + host := componenttest.NewNopHost() + + assert.NoError(t, exp.Start(context.Background(), host)) + + // Ensure that initially there is no data in the receiver. + assert.EqualValues(t, 0, rcv.requestCount.Load()) + + callCtxs := []context.Context{ + client.NewContext(context.Background(), client.Info{ + Metadata: client.NewMetadata(map[string][]string{ + "key1": {"first"}, + "key2": {"second"}, + }), + }), + client.NewContext(context.Background(), client.Info{ + Metadata: client.NewMetadata(map[string][]string{ + "key1": {"third"}, + "key2": {"fourth"}, + }), + }), + } + + expectByContext := make([]int, len(callCtxs)) + + requestCount := 3 + spansPerRequest := 33 + for requestNum := 0; requestNum < requestCount; requestNum++ { + td := testdata.GenerateTraces(spansPerRequest) + spans := td.ResourceSpans().At(0).ScopeSpans().At(0).Spans() + for spanIndex := 0; spanIndex < spansPerRequest; spanIndex++ { + spans.At(spanIndex).SetName(fmt.Sprintf("%d-%d", requestNum, spanIndex)) + } + + num := requestNum % len(callCtxs) + expectByContext[num] += spansPerRequest + go func(n int) { + assert.NoError(t, exp.ConsumeTraces(callCtxs[n], td)) + }(num) + } + + assert.Eventually(t, func() bool { + return rcv.requestCount.Load() == int32(requestCount) + }, 1*time.Second, 5*time.Millisecond) + assert.Eventually(t, func() bool { + return rcv.totalItems.Load() == int32(requestCount*spansPerRequest) + }, 1*time.Second, 5*time.Millisecond) + assert.Eventually(t, func() bool { + rcv.mux.Lock() + defer rcv.mux.Unlock() + return len(callCtxs) == len(rcv.spanCountByMetadata) + }, 1*time.Second, 5*time.Millisecond) + + for idx, ctx := range callCtxs { + md := client.FromContext(ctx).Metadata + key := fmt.Sprintf("%s|%s", md.Get("key1"), md.Get("key2")) + require.Equal(t, expectByContext[idx], rcv.spanCountByMetadata[key]) + } +} + +func TestDuplicateMetadataKeys(t *testing.T) { + cfg := createDefaultConfig().(*Config) + cfg.MetadataKeys = []string{"myTOKEN", "mytoken"} + err := cfg.Validate() + require.ErrorContains(t, err, "duplicate") + require.ErrorContains(t, err, "mytoken") +} + +func TestMetadataExporterCardinalityLimit(t *testing.T) { + const cardLimit = 10 + // Start an OTel-Arrow receiver. + ln, err := net.Listen("tcp", "localhost:") + require.NoError(t, err, "Failed to find an available address to run the gRPC server: %v", err) + rcv, err := otelArrowTracesReceiverOnGRPCServer(ln, false) + rcv.hasMetadata = true + rcv.spanCountByMetadata = make(map[string]int) + + rcv.start() + require.NoError(t, err, "Failed to start mock OTLP receiver") + // Also closes the connection. + defer rcv.srv.GracefulStop() + + // Start an OTLP exporter and point to the receiver. + factory := NewFactory() + cfg := createDefaultConfig().(*Config) + cfg.ClientConfig = configgrpc.ClientConfig{ + Endpoint: ln.Addr().String(), + TLSSetting: configtls.ClientConfig{ + Insecure: true, + }, + } + cfg.Arrow.MaxStreamLifetime = 100 * time.Second + + // disable queue settings to allow for error backpropagation. + cfg.QueueSettings.Enabled = false + + cfg.MetadataCardinalityLimit = cardLimit + cfg.MetadataKeys = []string{"key1", "key2"} + set := exportertest.NewNopSettings() + bg := context.Background() + exp, err := factory.CreateTraces(bg, set, cfg) + require.NoError(t, err) + require.NotNil(t, exp) + defer func() { + assert.NoError(t, exp.Shutdown(context.Background())) + }() + + host := componenttest.NewNopHost() + + assert.NoError(t, exp.Start(context.Background(), host)) + + // Ensure that initially there is no data in the receiver. + assert.EqualValues(t, 0, rcv.requestCount.Load()) + + for requestNum := 0; requestNum < cardLimit; requestNum++ { + td := testdata.GenerateTraces(1) + ctx := client.NewContext(bg, client.Info{ + Metadata: client.NewMetadata(map[string][]string{ + "key1": {fmt.Sprint(requestNum)}, + "key2": {fmt.Sprint(requestNum)}, + }), + }) + + assert.NoError(t, exp.ConsumeTraces(ctx, td)) + } + + td := testdata.GenerateTraces(1) + ctx := client.NewContext(bg, client.Info{ + Metadata: client.NewMetadata(map[string][]string{ + "key1": {"limit_exceeded"}, + "key2": {"limit_exceeded"}, + }), + }) + + // above the metadata cardinality limit. + err = exp.ConsumeTraces(ctx, td) + require.Error(t, err) + assert.True(t, consumererror.IsPermanent(err)) + assert.ErrorContains(t, err, "too many") + + assert.Eventually(t, func() bool { + return rcv.requestCount.Load() == int32(cardLimit) + }, 1*time.Second, 5*time.Millisecond) + assert.Eventually(t, func() bool { + return rcv.totalItems.Load() == int32(cardLimit) + }, 1*time.Second, 5*time.Millisecond) + + require.Len(t, rcv.spanCountByMetadata, cardLimit) +} diff --git a/exporter/otelarrowexporter/otelarrow.go b/exporter/otelarrowexporter/otelarrow.go index 01b21e392b00..31d9145e4c63 100644 --- a/exporter/otelarrowexporter/otelarrow.go +++ b/exporter/otelarrowexporter/otelarrow.go @@ -6,16 +6,12 @@ package otelarrowexporter // import "github.com/open-telemetry/opentelemetry-col import ( "context" "errors" - "fmt" - "runtime" "time" - arrowPkg "github.com/apache/arrow/go/v14/arrow" - "github.com/open-telemetry/otel-arrow/collector/compression/zstd" - "github.com/open-telemetry/otel-arrow/collector/netstats" arrowRecord "github.com/open-telemetry/otel-arrow/pkg/otel/arrow_record" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/config/configcompression" + "go.opentelemetry.io/collector/config/configgrpc" "go.opentelemetry.io/collector/consumer/consumererror" "go.opentelemetry.io/collector/exporter" "go.opentelemetry.io/collector/exporter/exporterhelper" @@ -35,8 +31,22 @@ import ( "google.golang.org/grpc/status" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/otelarrowexporter/internal/arrow" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/compression/zstd" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/netstats" ) +type exp interface { + getSettings() exporter.Settings + getConfig() component.Config + + start(context.Context, component.Host) error + shutdown(context.Context) error + + pushTraces(context.Context, ptrace.Traces) error + pushMetrics(context.Context, pmetric.Metrics) error + pushLogs(context.Context, plog.Logs) error +} + type baseExporter struct { // Input configuration. config *Config @@ -48,7 +58,7 @@ type baseExporter struct { clientConn *grpc.ClientConn metadata metadata.MD callOptions []grpc.CallOption - settings exporter.CreateSettings + settings exporter.Settings netReporter *netstats.NetworkReporter // Default user-agent header. @@ -60,31 +70,19 @@ type baseExporter struct { streamClientFactory streamClientFactory } +var _ exp = (*baseExporter)(nil) + type streamClientFactory func(conn *grpc.ClientConn) arrow.StreamClientFunc // Crete new exporter and start it. The exporter will begin connecting but // this function may return before the connection is established. -func newExporter(cfg component.Config, set exporter.CreateSettings, streamClientFactory streamClientFactory) (*baseExporter, error) { +func newExporter(cfg component.Config, set exporter.Settings, streamClientFactory streamClientFactory, userAgent string, netReporter *netstats.NetworkReporter) (exp, error) { oCfg := cfg.(*Config) if oCfg.Endpoint == "" { return nil, errors.New("OTLP exporter config requires an Endpoint") } - netReporter, err := netstats.NewExporterNetworkReporter(set) - if err != nil { - return nil, err - } - userAgent := fmt.Sprintf("%s/%s (%s/%s)", - set.BuildInfo.Description, set.BuildInfo.Version, runtime.GOOS, runtime.GOARCH) - - if !oCfg.Arrow.Disabled { - // Ignoring an error because Validate() was called. - _ = zstd.SetEncoderConfig(oCfg.Arrow.Zstd) - - userAgent += fmt.Sprintf(" ApacheArrow/%s (NumStreams/%d)", arrowPkg.PkgVersion, oCfg.Arrow.NumStreams) - } - return &baseExporter{ config: oCfg, settings: set, @@ -94,16 +92,31 @@ func newExporter(cfg component.Config, set exporter.CreateSettings, streamClient }, nil } +func (e *baseExporter) getSettings() exporter.Settings { + return e.settings +} + +func (e *baseExporter) getConfig() component.Config { + return e.config +} + +func (e *baseExporter) setMetadata(md metadata.MD) { + e.metadata = metadata.Join(e.metadata, md) +} + // start actually creates the gRPC connection. The client construction is deferred till this point as this // is the only place we get hold of Extensions which are required to construct auth round tripper. func (e *baseExporter) start(ctx context.Context, host component.Host) (err error) { - dialOpts := []grpc.DialOption{ - grpc.WithUserAgent(e.userAgent), + dialOpts := []configgrpc.ToClientConnOption{ + configgrpc.WithGrpcDialOption(grpc.WithUserAgent(e.userAgent)), } if e.netReporter != nil { - dialOpts = append(dialOpts, grpc.WithStatsHandler(e.netReporter.Handler())) + dialOpts = append(dialOpts, configgrpc.WithGrpcDialOption(grpc.WithStatsHandler(e.netReporter.Handler()))) } - dialOpts = append(dialOpts, e.config.UserDialOptions...) + for _, opt := range e.config.UserDialOptions { + dialOpts = append(dialOpts, configgrpc.WithGrpcDialOption(opt)) + } + if e.clientConn, err = e.config.ClientConfig.ToClientConn(ctx, host, e.settings.TelemetrySettings, dialOpts...); err != nil { return err } @@ -114,7 +127,8 @@ func (e *baseExporter) start(ctx context.Context, host component.Host) (err erro for k, v := range e.config.ClientConfig.Headers { headers[k] = string(v) } - e.metadata = metadata.New(headers) + headerMetadata := metadata.New(headers) + e.metadata = metadata.Join(e.metadata, headerMetadata) e.callOptions = []grpc.CallOption{ grpc.WaitForReady(e.config.ClientConfig.WaitForReady), } @@ -126,7 +140,7 @@ func (e *baseExporter) start(ctx context.Context, host component.Host) (err erro var perRPCCreds credentials.PerRPCCredentials if e.config.ClientConfig.Auth != nil { // Get the auth extension, we'll use it to enrich the request context. - authClient, err := e.config.ClientConfig.Auth.GetClientAuthenticator(host.GetExtensions()) + authClient, err := e.config.ClientConfig.Auth.GetClientAuthenticator(ctx, host.GetExtensions()) if err != nil { return err } diff --git a/exporter/otelarrowexporter/otelarrow_test.go b/exporter/otelarrowexporter/otelarrow_test.go index 3d84fd6ca618..1bf44d8cb111 100644 --- a/exporter/otelarrowexporter/otelarrow_test.go +++ b/exporter/otelarrowexporter/otelarrow_test.go @@ -18,7 +18,6 @@ import ( arrowpb "github.com/open-telemetry/otel-arrow/api/experimental/arrow/v1" arrowpbMock "github.com/open-telemetry/otel-arrow/api/experimental/arrow/v1/mock" - "github.com/open-telemetry/otel-arrow/collector/testdata" arrowRecord "github.com/open-telemetry/otel-arrow/pkg/otel/arrow_record" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -51,6 +50,7 @@ import ( "google.golang.org/protobuf/types/known/durationpb" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/otelarrowexporter/internal/arrow/grpcmock" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/testdata" ) type mockReceiver struct { @@ -78,8 +78,10 @@ func (r *mockReceiver) setExportError(err error) { type mockTracesReceiver struct { ptraceotlp.UnimplementedGRPCServer mockReceiver - exportResponse func() ptraceotlp.ExportResponse - lastRequest ptrace.Traces + exportResponse func() ptraceotlp.ExportResponse + lastRequest ptrace.Traces + hasMetadata bool + spanCountByMetadata map[string]int } func (r *mockTracesReceiver) Export(ctx context.Context, req ptraceotlp.ExportRequest) (ptraceotlp.ExportResponse, error) { @@ -88,8 +90,14 @@ func (r *mockTracesReceiver) Export(ctx context.Context, req ptraceotlp.ExportRe r.totalItems.Add(int32(td.SpanCount())) r.mux.Lock() defer r.mux.Unlock() - r.lastRequest = td r.metadata, _ = metadata.FromIncomingContext(ctx) + if r.hasMetadata { + v1 := r.metadata.Get("key1") + v2 := r.metadata.Get("key2") + hashKey := fmt.Sprintf("%s|%s", v1, v2) + r.spanCountByMetadata[hashKey] += (td.SpanCount()) + } + r.lastRequest = td return r.exportResponse(), r.exportError } @@ -319,10 +327,10 @@ func TestSendTraces(t *testing.T) { // caller's context, and the newStream doesn't have it. cfg.Arrow.Disabled = true - set := exportertest.NewNopCreateSettings() + set := exportertest.NewNopSettings() set.BuildInfo.Description = "Collector" set.BuildInfo.Version = "1.2.3test" - exp, err := factory.CreateTracesExporter(context.Background(), set, cfg) + exp, err := factory.CreateTraces(context.Background(), set, cfg) require.NoError(t, err) require.NotNil(t, exp) @@ -394,7 +402,7 @@ func TestSendTraces(t *testing.T) { // Test the static metadata md = rcv.getMetadata() require.EqualValues(t, expectedHeader, md.Get("header")) - require.Equal(t, len(md.Get("User-Agent")), 1) + require.Len(t, md.Get("User-Agent"), 1) require.Contains(t, md.Get("User-Agent")[0], "Collector/1.2.3test") // Test the caller's dynamic metadata @@ -463,8 +471,8 @@ func TestSendTracesWhenEndpointHasHttpScheme(t *testing.T) { if test.useTLS { cfg.ClientConfig.TLSSetting.InsecureSkipVerify = true } - set := exportertest.NewNopCreateSettings() - exp, err := factory.CreateTracesExporter(context.Background(), set, cfg) + set := exportertest.NewNopSettings() + exp, err := factory.CreateTraces(context.Background(), set, cfg) require.NoError(t, err) require.NotNil(t, exp) @@ -518,10 +526,10 @@ func TestSendMetrics(t *testing.T) { }, } cfg.Arrow.MaxStreamLifetime = 100 * time.Second - set := exportertest.NewNopCreateSettings() + set := exportertest.NewNopSettings() set.BuildInfo.Description = "Collector" set.BuildInfo.Version = "1.2.3test" - exp, err := factory.CreateMetricsExporter(context.Background(), set, cfg) + exp, err := factory.CreateMetrics(context.Background(), set, cfg) require.NoError(t, err) require.NotNil(t, exp) defer func() { @@ -566,8 +574,8 @@ func TestSendMetrics(t *testing.T) { assert.EqualValues(t, md, rcv.getLastRequest()) mdata := rcv.getMetadata() - require.EqualValues(t, mdata.Get("header"), expectedHeader) - require.Equal(t, len(mdata.Get("User-Agent")), 1) + require.EqualValues(t, expectedHeader, mdata.Get("header")) + require.Len(t, mdata.Get("User-Agent"), 1) require.Contains(t, mdata.Get("User-Agent")[0], "Collector/1.2.3test") st := status.New(codes.InvalidArgument, "Invalid argument") @@ -617,8 +625,8 @@ func TestSendTraceDataServerDownAndUp(t *testing.T) { WaitForReady: true, } cfg.Arrow.MaxStreamLifetime = 100 * time.Second - set := exportertest.NewNopCreateSettings() - exp, err := factory.CreateTracesExporter(context.Background(), set, cfg) + set := exportertest.NewNopSettings() + exp, err := factory.CreateTraces(context.Background(), set, cfg) require.NoError(t, err) require.NotNil(t, exp) defer func() { @@ -675,8 +683,8 @@ func TestSendTraceDataServerStartWhileRequest(t *testing.T) { }, } cfg.Arrow.MaxStreamLifetime = 100 * time.Second - set := exportertest.NewNopCreateSettings() - exp, err := factory.CreateTracesExporter(context.Background(), set, cfg) + set := exportertest.NewNopSettings() + exp, err := factory.CreateTraces(context.Background(), set, cfg) require.NoError(t, err) require.NotNil(t, exp) defer func() { @@ -729,8 +737,8 @@ func TestSendTracesOnResourceExhaustion(t *testing.T) { }, } cfg.Arrow.MaxStreamLifetime = 100 * time.Second - set := exportertest.NewNopCreateSettings() - exp, err := factory.CreateTracesExporter(context.Background(), set, cfg) + set := exportertest.NewNopSettings() + exp, err := factory.CreateTraces(context.Background(), set, cfg) require.NoError(t, err) require.NotNil(t, exp) @@ -812,10 +820,10 @@ func TestSendLogData(t *testing.T) { }, } cfg.Arrow.MaxStreamLifetime = 100 * time.Second - set := exportertest.NewNopCreateSettings() + set := exportertest.NewNopSettings() set.BuildInfo.Description = "Collector" set.BuildInfo.Version = "1.2.3test" - exp, err := factory.CreateLogsExporter(context.Background(), set, cfg) + exp, err := factory.CreateLogs(context.Background(), set, cfg) require.NoError(t, err) require.NotNil(t, exp) defer func() { @@ -858,7 +866,7 @@ func TestSendLogData(t *testing.T) { assert.EqualValues(t, ld, rcv.getLastRequest()) md := rcv.getMetadata() - require.Equal(t, len(md.Get("User-Agent")), 1) + require.Len(t, md.Get("User-Agent"), 1) require.Contains(t, md.Get("User-Agent")[0], "Collector/1.2.3test") st := status.New(codes.InvalidArgument, "Invalid argument") @@ -929,16 +937,12 @@ func testSendArrowTraces(t *testing.T, clientWaitForReady, streamServiceAvailabl MaxStreamLifetime: 100 * time.Second, } - set := exportertest.NewNopCreateSettings() + set := exportertest.NewNopSettings() set.TelemetrySettings.Logger = zaptest.NewLogger(t) - exp, err := factory.CreateTracesExporter(context.Background(), set, cfg) + exp, err := factory.CreateTraces(context.Background(), set, cfg) require.NoError(t, err) require.NotNil(t, exp) - defer func() { - assert.NoError(t, exp.Shutdown(context.Background())) - }() - type isUserCall struct{} host := newHostWithExtensions( @@ -956,6 +960,15 @@ func testSendArrowTraces(t *testing.T, clientWaitForReady, streamServiceAvailabl assert.NoError(t, exp.Start(context.Background(), host)) rcv, _ := otelArrowTracesReceiverOnGRPCServer(ln, false) + + defer func() { + // Shutdown before GracefulStop, because otherwise we + // wait for a full stream lifetime instead of closing + // after requests are served. + assert.NoError(t, exp.Shutdown(context.Background())) + rcv.srv.GracefulStop() + }() + if streamServiceAvailable { rcv.startStreamMockArrowTraces(t, okStatusFor) } @@ -988,8 +1001,6 @@ func testSendArrowTraces(t *testing.T, clientWaitForReady, streamServiceAvailabl md := rcv.getMetadata() require.EqualValues(t, []string{"arrow"}, md.Get("callerid")) require.EqualValues(t, expectedHeader, md.Get("header")) - - rcv.srv.GracefulStop() } func okStatusFor(id int64) *arrowpb.BatchStatus { @@ -1071,7 +1082,6 @@ func (r *mockTracesReceiver) startStreamMockArrowTraces(t *testing.T, statusFor MockArrowTracesServiceServer: svc, }) svc.EXPECT().ArrowTraces(gomock.Any()).Times(1).DoAndReturn(doer) - } func TestSendArrowFailedTraces(t *testing.T) { @@ -1096,22 +1106,23 @@ func TestSendArrowFailedTraces(t *testing.T) { } cfg.QueueSettings.Enabled = false - set := exportertest.NewNopCreateSettings() + set := exportertest.NewNopSettings() set.TelemetrySettings.Logger = zaptest.NewLogger(t) - exp, err := factory.CreateTracesExporter(context.Background(), set, cfg) + exp, err := factory.CreateTraces(context.Background(), set, cfg) require.NoError(t, err) require.NotNil(t, exp) - defer func() { - assert.NoError(t, exp.Shutdown(context.Background())) - }() - host := componenttest.NewNopHost() assert.NoError(t, exp.Start(context.Background(), host)) rcv, _ := otelArrowTracesReceiverOnGRPCServer(ln, false) rcv.startStreamMockArrowTraces(t, failedStatusFor) + defer func() { + assert.NoError(t, exp.Shutdown(context.Background())) + rcv.srv.GracefulStop() + }() + // Delay the server start, slightly. go func() { time.Sleep(100 * time.Millisecond) @@ -1121,8 +1132,7 @@ func TestSendArrowFailedTraces(t *testing.T) { // Send two trace items. td := testdata.GenerateTraces(2) err = exp.ConsumeTraces(context.Background(), td) - assert.Error(t, err) - assert.Contains(t, err.Error(), "test failed") + assert.ErrorContains(t, err, "test failed") // Wait until it is received. assert.Eventually(t, func() bool { @@ -1133,8 +1143,6 @@ func TestSendArrowFailedTraces(t *testing.T) { assert.EqualValues(t, int32(2), rcv.totalItems.Load()) assert.EqualValues(t, int32(1), rcv.requestCount.Load()) assert.EqualValues(t, td, rcv.getLastRequest()) - - rcv.srv.GracefulStop() } func TestUserDialOptions(t *testing.T) { @@ -1162,9 +1170,9 @@ func TestUserDialOptions(t *testing.T) { grpc.WithUserAgent(testAgent), } - set := exportertest.NewNopCreateSettings() + set := exportertest.NewNopSettings() set.TelemetrySettings.Logger = zaptest.NewLogger(t) - exp, err := factory.CreateTracesExporter(context.Background(), set, cfg) + exp, err := factory.CreateTraces(context.Background(), set, cfg) require.NoError(t, err) require.NotNil(t, exp) @@ -1184,6 +1192,6 @@ func TestUserDialOptions(t *testing.T) { err = exp.ConsumeTraces(context.Background(), td) assert.NoError(t, err) - require.Equal(t, len(rcv.getMetadata().Get("User-Agent")), 1) + require.Len(t, rcv.getMetadata().Get("User-Agent"), 1) require.Contains(t, rcv.getMetadata().Get("User-Agent")[0], testAgent) } diff --git a/exporter/otelarrowexporter/testdata/config.yaml b/exporter/otelarrowexporter/testdata/config.yaml index db9e8016ce0e..76cc6df400e7 100644 --- a/exporter/otelarrowexporter/testdata/config.yaml +++ b/exporter/otelarrowexporter/testdata/config.yaml @@ -18,13 +18,18 @@ auth: authenticator: nop headers: "can you have a . here?": "F0000000-0000-0000-0000-000000000000" - header1: 234 + header1: "234" another: "somevalue" keepalive: time: 20s timeout: 30s permit_without_stream: true balancer_name: "experimental" +batcher: + enabled: true + flush_timeout: 200ms + min_size_items: 1000 + max_size_items: 10000 arrow: num_streams: 2 disabled: false diff --git a/exporter/prometheusexporter/README.md b/exporter/prometheusexporter/README.md index c208eaa11abb..82d10371d28f 100644 --- a/exporter/prometheusexporter/README.md +++ b/exporter/prometheusexporter/README.md @@ -6,9 +6,9 @@ | Stability | [beta]: metrics | | Distributions | [core], [contrib] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fprometheus%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fprometheus) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fprometheus%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fprometheus) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@Aneurysm9](https://www.github.com/Aneurysm9) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@Aneurysm9](https://www.github.com/Aneurysm9), [@dashpole](https://www.github.com/dashpole), [@ArthurSens](https://www.github.com/ArthurSens) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [core]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib diff --git a/exporter/prometheusexporter/accumulator.go b/exporter/prometheusexporter/accumulator.go index e5c7f281092d..3a6559118fe5 100644 --- a/exporter/prometheusexporter/accumulator.go +++ b/exporter/prometheusexporter/accumulator.go @@ -365,7 +365,6 @@ func accumulateHistogramValues(prev, current, dest pmetric.HistogramDataPoint) { } if match { - dest.SetCount(newer.Count() + older.Count()) dest.SetSum(newer.Sum() + older.Sum()) diff --git a/exporter/prometheusexporter/accumulator_test.go b/exporter/prometheusexporter/accumulator_test.go index 43b78ced5f01..693211453d3d 100644 --- a/exporter/prometheusexporter/accumulator_test.go +++ b/exporter/prometheusexporter/accumulator_test.go @@ -218,7 +218,6 @@ func TestAccumulateMetrics(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - ts1 := time.Now().Add(-3 * time.Second) ts2 := time.Now().Add(-2 * time.Second) ts3 := time.Now().Add(-1 * time.Second) @@ -248,7 +247,7 @@ func TestAccumulateMetrics(t *testing.T) { v := m.(*accumulatedValue) vLabels, vTS, vValue, vTemporality, vIsMonotonic := getMetricProperties(ilm2.Metrics().At(0)) - require.Equal(t, v.scope.Name(), "test") + require.Equal(t, "test", v.scope.Name()) require.Equal(t, v.value.Type(), ilm2.Metrics().At(0).Type()) vLabels.Range(func(k string, v pcommon.Value) bool { r, _ := m2Labels.Get(k) @@ -327,7 +326,6 @@ func TestAccumulateDeltaToCumulative(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - ts1 := time.Now().Add(-3 * time.Second) ts2 := time.Now().Add(-2 * time.Second) ts3 := time.Now().Add(-1 * time.Second) @@ -360,7 +358,7 @@ func TestAccumulateDeltaToCumulative(t *testing.T) { v := m.(*accumulatedValue) vLabels, vTS, vValue, vTemporality, vIsMonotonic := getMetricProperties(v.value) - require.Equal(t, v.scope.Name(), "test") + require.Equal(t, "test", v.scope.Name()) require.Equal(t, v.value.Type(), ilm.Metrics().At(0).Type()) require.Equal(t, v.value.Type(), ilm.Metrics().At(1).Type()) @@ -373,7 +371,7 @@ func TestAccumulateDeltaToCumulative(t *testing.T) { require.Equal(t, mValue, vValue) require.Equal(t, dataPointValue1+dataPointValue2, vValue) require.Equal(t, pmetric.AggregationTemporalityCumulative, vTemporality) - require.Equal(t, true, vIsMonotonic) + require.True(t, vIsMonotonic) require.Equal(t, ts3.Unix(), vTS.Unix()) }) diff --git a/exporter/prometheusexporter/collector.go b/exporter/prometheusexporter/collector.go index 8a243c01a921..dd3891095473 100644 --- a/exporter/prometheusexporter/collector.go +++ b/exporter/prometheusexporter/collector.go @@ -7,20 +7,22 @@ import ( "encoding/hex" "fmt" "sort" + "sync" + "time" "github.com/prometheus/client_golang/prometheus" + dto "github.com/prometheus/client_model/go" "github.com/prometheus/common/model" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.25.0" "go.uber.org/zap" + "google.golang.org/protobuf/proto" prometheustranslator "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus" ) -var ( - separatorString = string([]byte{model.SeparatorByte}) -) +var separatorString = string([]byte{model.SeparatorByte}) type collector struct { accumulator accumulator @@ -30,6 +32,13 @@ type collector struct { addMetricSuffixes bool namespace string constLabels prometheus.Labels + metricFamilies sync.Map + metricExpiration time.Duration +} + +type metricFamily struct { + lastSeen time.Time + mf *dto.MetricFamily } func newCollector(config *Config, logger *zap.Logger) *collector { @@ -40,6 +49,7 @@ func newCollector(config *Config, logger *zap.Logger) *collector { sendTimestamps: config.SendTimestamps, constLabels: config.ConstLabels, addMetricSuffixes: config.AddMetricSuffixes, + metricExpiration: config.MetricExpiration, } } @@ -72,7 +82,6 @@ func convertExemplars(exemplars pmetric.ExemplarSlice) []prometheus.Exemplar { Labels: exemplarLabels, Timestamp: e.Timestamp().AsTime(), } - } return result } @@ -105,7 +114,13 @@ func (c *collector) convertMetric(metric pmetric.Metric, resourceAttrs pcommon.M return nil, errUnknownMetricType } -func (c *collector) getMetricMetadata(metric pmetric.Metric, attributes pcommon.Map, resourceAttrs pcommon.Map) (*prometheus.Desc, []string) { +func (c *collector) getMetricMetadata(metric pmetric.Metric, mType *dto.MetricType, attributes pcommon.Map, resourceAttrs pcommon.Map) (*prometheus.Desc, []string, error) { + name := prometheustranslator.BuildCompliantName(metric, c.namespace, c.addMetricSuffixes) + help, err := c.validateMetrics(name, metric.Description(), mType) + if err != nil { + return nil, nil, err + } + keys := make([]string, 0, attributes.Len()+2) // +2 for job and instance labels. values := make([]string, 0, attributes.Len()+2) @@ -124,18 +139,17 @@ func (c *collector) getMetricMetadata(metric pmetric.Metric, attributes pcommon. values = append(values, instance) } - return prometheus.NewDesc( - prometheustranslator.BuildCompliantName(metric, c.namespace, c.addMetricSuffixes), - metric.Description(), - keys, - c.constLabels, - ), values + return prometheus.NewDesc(name, help, keys, c.constLabels), values, nil } func (c *collector) convertGauge(metric pmetric.Metric, resourceAttrs pcommon.Map) (prometheus.Metric, error) { ip := metric.Gauge().DataPoints().At(0) - desc, attributes := c.getMetricMetadata(metric, ip.Attributes(), resourceAttrs) + desc, attributes, err := c.getMetricMetadata(metric, dto.MetricType_GAUGE.Enum(), ip.Attributes(), resourceAttrs) + if err != nil { + return nil, err + } + var value float64 switch ip.ValueType() { case pmetric.NumberDataPointValueTypeInt: @@ -163,11 +177,16 @@ func (c *collector) convertSum(metric pmetric.Metric, resourceAttrs pcommon.Map) ip := metric.Sum().DataPoints().At(0) metricType := prometheus.GaugeValue + mType := dto.MetricType_GAUGE.Enum() if metric.Sum().IsMonotonic() { metricType = prometheus.CounterValue + mType = dto.MetricType_COUNTER.Enum() } - desc, attributes := c.getMetricMetadata(metric, ip.Attributes(), resourceAttrs) + desc, attributes, err := c.getMetricMetadata(metric, mType, ip.Attributes(), resourceAttrs) + if err != nil { + return nil, err + } var value float64 switch ip.ValueType() { case pmetric.NumberDataPointValueTypeInt: @@ -182,7 +201,12 @@ func (c *collector) convertSum(metric pmetric.Metric, resourceAttrs pcommon.Map) exemplars = convertExemplars(ip.Exemplars()) } - m, err := prometheus.NewConstMetric(desc, metricType, value, attributes...) + var m prometheus.Metric + if metricType == prometheus.CounterValue && ip.StartTimestamp().AsTime().Unix() > 0 { + m, err = prometheus.NewConstMetricWithCreatedTimestamp(desc, metricType, value, ip.StartTimestamp().AsTime(), attributes...) + } else { + m, err = prometheus.NewConstMetric(desc, metricType, value, attributes...) + } if err != nil { return nil, err } @@ -213,8 +237,16 @@ func (c *collector) convertSummary(metric pmetric.Metric, resourceAttrs pcommon. quantiles[qvj.Quantile()] = qvj.Value() } - desc, attributes := c.getMetricMetadata(metric, point.Attributes(), resourceAttrs) - m, err := prometheus.NewConstSummary(desc, point.Count(), point.Sum(), quantiles, attributes...) + desc, attributes, err := c.getMetricMetadata(metric, dto.MetricType_SUMMARY.Enum(), point.Attributes(), resourceAttrs) + if err != nil { + return nil, err + } + var m prometheus.Metric + if point.StartTimestamp().AsTime().Unix() > 0 { + m, err = prometheus.NewConstSummaryWithCreatedTimestamp(desc, point.Count(), point.Sum(), quantiles, point.StartTimestamp().AsTime(), attributes...) + } else { + m, err = prometheus.NewConstSummary(desc, point.Count(), point.Sum(), quantiles, attributes...) + } if err != nil { return nil, err } @@ -226,7 +258,10 @@ func (c *collector) convertSummary(metric pmetric.Metric, resourceAttrs pcommon. func (c *collector) convertDoubleHistogram(metric pmetric.Metric, resourceAttrs pcommon.Map) (prometheus.Metric, error) { ip := metric.Histogram().DataPoints().At(0) - desc, attributes := c.getMetricMetadata(metric, ip.Attributes(), resourceAttrs) + desc, attributes, err := c.getMetricMetadata(metric, dto.MetricType_HISTOGRAM.Enum(), ip.Attributes(), resourceAttrs) + if err != nil { + return nil, err + } indicesMap := make(map[float64]int) buckets := make([]float64, 0, ip.BucketCounts().Len()) @@ -254,7 +289,12 @@ func (c *collector) convertDoubleHistogram(metric pmetric.Metric, resourceAttrs exemplars := convertExemplars(ip.Exemplars()) - m, err := prometheus.NewConstHistogram(desc, ip.Count(), ip.Sum(), points, attributes...) + var m prometheus.Metric + if ip.StartTimestamp().AsTime().Unix() > 0 { + m, err = prometheus.NewConstHistogramWithCreatedTimestamp(desc, ip.Count(), ip.Sum(), points, ip.StartTimestamp().AsTime(), attributes...) + } else { + m, err = prometheus.NewConstHistogram(desc, ip.Count(), ip.Sum(), points, attributes...) + } if err != nil { return nil, err } @@ -386,4 +426,50 @@ func (c *collector) Collect(ch chan<- prometheus.Metric) { ch <- m c.logger.Debug(fmt.Sprintf("metric served: %s", m.Desc().String())) } + c.cleanupMetricFamilies() +} + +func (c *collector) validateMetrics(name, description string, metricType *dto.MetricType) (help string, err error) { + now := time.Now() + v, exist := c.metricFamilies.Load(name) + if !exist { + c.metricFamilies.Store(name, metricFamily{ + lastSeen: now, + mf: &dto.MetricFamily{ + Name: proto.String(name), + Help: proto.String(description), + Type: metricType, + }, + }) + return description, nil + } + emf := v.(metricFamily) + if emf.mf.GetType() != *metricType { + return "", fmt.Errorf("instrument type conflict, using existing type definition. instrument: %s, existing: %s, dropped: %s", name, emf.mf.GetType(), *metricType) + } + emf.lastSeen = now + c.metricFamilies.Store(name, emf) + if emf.mf.GetHelp() != description { + c.logger.Info( + "Instrument description conflict, using existing", + zap.String("instrument", name), + zap.String("existing", emf.mf.GetHelp()), + zap.String("dropped", description), + ) + } + return emf.mf.GetHelp(), nil +} + +func (c *collector) cleanupMetricFamilies() { + expirationTime := time.Now().Add(-c.metricExpiration) + + c.metricFamilies.Range(func(key, value any) bool { + v := value.(metricFamily) + if expirationTime.After(v.lastSeen) { + c.logger.Debug("metric expired", zap.String("instrument", key.(string))) + c.metricFamilies.Delete(key) + return true + } + return true + }) } diff --git a/exporter/prometheusexporter/collector_test.go b/exporter/prometheusexporter/collector_test.go index ab71ec1a8cea..0552f2ec7135 100644 --- a/exporter/prometheusexporter/collector_test.go +++ b/exporter/prometheusexporter/collector_test.go @@ -10,13 +10,16 @@ import ( "time" "github.com/prometheus/client_golang/prometheus" + dto "github.com/prometheus/client_model/go" io_prometheus_client "github.com/prometheus/client_model/go" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.25.0" "go.uber.org/zap" "go.uber.org/zap/zapcore" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/timestamppb" prometheustranslator "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus" ) @@ -65,25 +68,85 @@ func TestConvertInvalidDataType(t *testing.T) { } } -func TestConvertInvalidMetric(t *testing.T) { - for _, mType := range []pmetric.MetricType{ - pmetric.MetricTypeHistogram, - pmetric.MetricTypeSum, - pmetric.MetricTypeGauge, - } { - metric := pmetric.NewMetric() - switch mType { - case pmetric.MetricTypeGauge: - metric.SetEmptyGauge().DataPoints().AppendEmpty() - case pmetric.MetricTypeSum: - metric.SetEmptySum().DataPoints().AppendEmpty() - case pmetric.MetricTypeHistogram: - metric.SetEmptyHistogram().DataPoints().AppendEmpty() - } - c := collector{} +func TestConvertMetric(t *testing.T) { + tests := []struct { + description string + mName string + mType pmetric.MetricType + mapVals map[string]metricFamily + err bool + }{ + { + description: "invalid histogram metric", + mType: pmetric.MetricTypeHistogram, + err: true, + }, + { + description: "invalid sum metric", + mType: pmetric.MetricTypeSum, + err: true, + }, + { + description: "invalid gauge metric", + mType: pmetric.MetricTypeGauge, + err: true, + }, + { + description: "metric type conflict", + mName: "testgauge", + mType: pmetric.MetricTypeGauge, + mapVals: map[string]metricFamily{ + "testgauge": { + mf: &io_prometheus_client.MetricFamily{ + Name: proto.String("testgauge"), + Type: dto.MetricType_COUNTER.Enum(), + }, + }, + }, + err: true, + }, + { + description: "metric description conflict", + mName: "testgauge", + mType: pmetric.MetricTypeGauge, + mapVals: map[string]metricFamily{ + "testgauge": { + mf: &io_prometheus_client.MetricFamily{ + Name: proto.String("testgauge"), + Type: dto.MetricType_GAUGE.Enum(), + Help: proto.String("test help value"), + }, + }, + }, + err: false, + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + metric := pmetric.NewMetric() + metric.SetName(tt.mName) + switch tt.mType { + case pmetric.MetricTypeGauge: + metric.SetEmptyGauge().DataPoints().AppendEmpty() + case pmetric.MetricTypeSum: + metric.SetEmptySum().DataPoints().AppendEmpty() + case pmetric.MetricTypeHistogram: + metric.SetEmptyHistogram().DataPoints().AppendEmpty() + } + c := collector{ + logger: zap.NewNop(), + } + for k, v := range tt.mapVals { + c.metricFamilies.Store(k, v) + } - _, err := c.convertMetric(metric, pcommon.NewMap()) - require.Error(t, err) + _, err := c.convertMetric(metric, pcommon.NewMap()) + if tt.err { + require.Error(t, err) + return + } + require.NoError(t, err) + }) } } @@ -126,7 +189,7 @@ func exemplarsEqual(t *testing.T, otelExemplar pmetric.Exemplar, promExemplar *i } require.Equal(t, givenValue, promExemplar.GetValue()) - require.Equal(t, 2, len(promExemplar.GetLabel())) + require.Len(t, promExemplar.GetLabel(), 2) ml := make(map[string]string) for _, l := range promExemplar.GetLabel() { ml[l.GetName()] = l.GetValue() @@ -157,7 +220,6 @@ func TestConvertDoubleHistogramExemplar(t *testing.T) { pMap := pcommon.NewMap() c := collector{ - accumulator: &mockAccumulator{ metrics: []pmetric.Metric{metric}, resourceAttributes: pMap, @@ -174,7 +236,7 @@ func TestConvertDoubleHistogramExemplar(t *testing.T) { buckets := m.GetHistogram().GetBucket() - require.Equal(t, 3, len(buckets)) + require.Len(t, buckets, 3) require.Equal(t, 3.0, buckets[0].GetExemplar().GetValue()) exemplarsEqual(t, promExporterExemplars, buckets[0].GetExemplar()) @@ -199,7 +261,6 @@ func TestConvertMonotonicSumExemplar(t *testing.T) { pMap := pcommon.NewMap() c := collector{ - accumulator: &mockAccumulator{ metrics: []pmetric.Metric{metric}, resourceAttributes: pMap, @@ -232,6 +293,7 @@ func (c *errorCheckCore) Check(ent zapcore.Entry, ce *zapcore.CheckedEntry) *zap } return ce } + func (c *errorCheckCore) Write(ent zapcore.Entry, _ []zapcore.Field) error { if ent.Level == zapcore.ErrorLevel { c.errorMessages = append(c.errorMessages, ent.Message) @@ -287,7 +349,7 @@ func TestCollectMetricsLabelSanitize(t *testing.T) { func TestCollectMetrics(t *testing.T) { tests := []struct { name string - metric func(time.Time) pmetric.Metric + metric func(time.Time, bool) pmetric.Metric metricType prometheus.ValueType value float64 }{ @@ -295,7 +357,7 @@ func TestCollectMetrics(t *testing.T) { name: "IntGauge", metricType: prometheus.GaugeValue, value: 42.0, - metric: func(ts time.Time) (metric pmetric.Metric) { + metric: func(ts time.Time, withStartTime bool) (metric pmetric.Metric) { metric = pmetric.NewMetric() metric.SetName("test_metric") metric.SetDescription("test description") @@ -304,6 +366,9 @@ func TestCollectMetrics(t *testing.T) { dp.Attributes().PutStr("label_1", "1") dp.Attributes().PutStr("label_2", "2") dp.SetTimestamp(pcommon.NewTimestampFromTime(ts)) + if withStartTime { + dp.SetStartTimestamp(pcommon.NewTimestampFromTime(ts)) + } return }, @@ -312,7 +377,7 @@ func TestCollectMetrics(t *testing.T) { name: "Gauge", metricType: prometheus.GaugeValue, value: 42.42, - metric: func(ts time.Time) (metric pmetric.Metric) { + metric: func(ts time.Time, withStartTime bool) (metric pmetric.Metric) { metric = pmetric.NewMetric() metric.SetName("test_metric") metric.SetDescription("test description") @@ -321,6 +386,9 @@ func TestCollectMetrics(t *testing.T) { dp.Attributes().PutStr("label_1", "1") dp.Attributes().PutStr("label_2", "2") dp.SetTimestamp(pcommon.NewTimestampFromTime(ts)) + if withStartTime { + dp.SetStartTimestamp(pcommon.NewTimestampFromTime(ts)) + } return }, @@ -329,7 +397,7 @@ func TestCollectMetrics(t *testing.T) { name: "IntSum", metricType: prometheus.GaugeValue, value: 42.0, - metric: func(ts time.Time) (metric pmetric.Metric) { + metric: func(ts time.Time, withStartTime bool) (metric pmetric.Metric) { metric = pmetric.NewMetric() metric.SetName("test_metric") metric.SetEmptySum().SetIsMonotonic(false) @@ -340,6 +408,9 @@ func TestCollectMetrics(t *testing.T) { dp.Attributes().PutStr("label_1", "1") dp.Attributes().PutStr("label_2", "2") dp.SetTimestamp(pcommon.NewTimestampFromTime(ts)) + if withStartTime { + dp.SetStartTimestamp(pcommon.NewTimestampFromTime(ts)) + } return }, @@ -348,7 +419,7 @@ func TestCollectMetrics(t *testing.T) { name: "Sum", metricType: prometheus.GaugeValue, value: 42.42, - metric: func(ts time.Time) (metric pmetric.Metric) { + metric: func(ts time.Time, withStartTime bool) (metric pmetric.Metric) { metric = pmetric.NewMetric() metric.SetName("test_metric") metric.SetEmptySum().SetIsMonotonic(false) @@ -359,6 +430,9 @@ func TestCollectMetrics(t *testing.T) { dp.Attributes().PutStr("label_1", "1") dp.Attributes().PutStr("label_2", "2") dp.SetTimestamp(pcommon.NewTimestampFromTime(ts)) + if withStartTime { + dp.SetStartTimestamp(pcommon.NewTimestampFromTime(ts)) + } return }, @@ -367,7 +441,7 @@ func TestCollectMetrics(t *testing.T) { name: "MonotonicIntSum", metricType: prometheus.CounterValue, value: 42.0, - metric: func(ts time.Time) (metric pmetric.Metric) { + metric: func(ts time.Time, withStartTime bool) (metric pmetric.Metric) { metric = pmetric.NewMetric() metric.SetName("test_metric") metric.SetEmptySum().SetIsMonotonic(true) @@ -378,6 +452,9 @@ func TestCollectMetrics(t *testing.T) { dp.Attributes().PutStr("label_1", "1") dp.Attributes().PutStr("label_2", "2") dp.SetTimestamp(pcommon.NewTimestampFromTime(ts)) + if withStartTime { + dp.SetStartTimestamp(pcommon.NewTimestampFromTime(ts)) + } return }, @@ -386,7 +463,7 @@ func TestCollectMetrics(t *testing.T) { name: "MonotonicSum", metricType: prometheus.CounterValue, value: 42.42, - metric: func(ts time.Time) (metric pmetric.Metric) { + metric: func(ts time.Time, withStartTime bool) (metric pmetric.Metric) { metric = pmetric.NewMetric() metric.SetName("test_metric") metric.SetEmptySum().SetIsMonotonic(true) @@ -397,6 +474,9 @@ func TestCollectMetrics(t *testing.T) { dp.Attributes().PutStr("label_1", "1") dp.Attributes().PutStr("label_2", "2") dp.SetTimestamp(pcommon.NewTimestampFromTime(ts)) + if withStartTime { + dp.SetStartTimestamp(pcommon.NewTimestampFromTime(ts)) + } return }, @@ -405,7 +485,7 @@ func TestCollectMetrics(t *testing.T) { name: "Unknown", metricType: prometheus.UntypedValue, value: 42.42, - metric: func(ts time.Time) (metric pmetric.Metric) { + metric: func(ts time.Time, withStartTime bool) (metric pmetric.Metric) { metric = pmetric.NewMetric() metric.SetName("test_metric") metric.SetDescription("test description") @@ -415,6 +495,9 @@ func TestCollectMetrics(t *testing.T) { dp.Attributes().PutStr("label_1", "1") dp.Attributes().PutStr("label_2", "2") dp.SetTimestamp(pcommon.NewTimestampFromTime(ts)) + if withStartTime { + dp.SetStartTimestamp(pcommon.NewTimestampFromTime(ts)) + } return }, @@ -424,6 +507,8 @@ func TestCollectMetrics(t *testing.T) { for _, tt := range tests { for _, sendTimestamp := range []bool{true, false} { name := tt.name + // In this test, sendTimestamp is used to test + // both prometheus regular timestamp and "created timestamp". if sendTimestamp { name += "/WithTimestamp" } @@ -435,7 +520,7 @@ func TestCollectMetrics(t *testing.T) { t.Run(name, func(t *testing.T) { ts := time.Now() - metric := tt.metric(ts) + metric := tt.metric(ts, sendTimestamp) c := collector{ namespace: "test_space", accumulator: &mockAccumulator{ @@ -481,8 +566,15 @@ func TestCollectMetrics(t *testing.T) { if sendTimestamp { require.Equal(t, ts.UnixNano()/1e6, *(pbMetric.TimestampMs)) + // Prometheus gauges don't have created timestamp. + if tt.metricType == prometheus.CounterValue { + require.Equal(t, timestamppb.New(ts), pbMetric.Counter.CreatedTimestamp) + } } else { require.Nil(t, pbMetric.TimestampMs) + if tt.metricType == prometheus.CounterValue { + require.Nil(t, pbMetric.Counter.CreatedTimestamp) + } } switch tt.metricType { @@ -507,7 +599,7 @@ func TestCollectMetrics(t *testing.T) { func TestAccumulateHistograms(t *testing.T) { tests := []struct { name string - metric func(time.Time) pmetric.Metric + metric func(time.Time, bool) pmetric.Metric histogramPoints map[float64]uint64 histogramSum float64 @@ -521,7 +613,7 @@ func TestAccumulateHistograms(t *testing.T) { }, histogramSum: 42.42, histogramCount: 7, - metric: func(ts time.Time) (metric pmetric.Metric) { + metric: func(ts time.Time, withStartTime bool) (metric pmetric.Metric) { metric = pmetric.NewMetric() metric.SetName("test_metric") metric.SetEmptyHistogram().SetAggregationTemporality(pmetric.AggregationTemporalityCumulative) @@ -534,6 +626,9 @@ func TestAccumulateHistograms(t *testing.T) { dp.Attributes().PutStr("label_1", "1") dp.Attributes().PutStr("label_2", "2") dp.SetTimestamp(pcommon.NewTimestampFromTime(ts)) + if withStartTime { + dp.SetStartTimestamp(pcommon.NewTimestampFromTime(ts)) + } return }, }, @@ -542,12 +637,14 @@ func TestAccumulateHistograms(t *testing.T) { for _, tt := range tests { for _, sendTimestamp := range []bool{true, false} { name := tt.name + // In this test, sendTimestamp is used to test + // both prometheus regular timestamp and "created timestamp". if sendTimestamp { name += "/WithTimestamp" } t.Run(name, func(t *testing.T) { ts := time.Now() - metric := tt.metric(ts) + metric := tt.metric(ts, sendTimestamp) c := collector{ accumulator: &mockAccumulator{ []pmetric.Metric{metric}, @@ -580,8 +677,10 @@ func TestAccumulateHistograms(t *testing.T) { if sendTimestamp { require.Equal(t, ts.UnixNano()/1e6, *(pbMetric.TimestampMs)) + require.Equal(t, timestamppb.New(ts), pbMetric.Histogram.CreatedTimestamp) } else { require.Nil(t, pbMetric.TimestampMs) + require.Nil(t, pbMetric.Histogram.CreatedTimestamp) } require.Nil(t, pbMetric.Gauge) @@ -609,7 +708,7 @@ func TestAccumulateSummary(t *testing.T) { } tests := []struct { name string - metric func(time.Time) pmetric.Metric + metric func(time.Time, bool) pmetric.Metric wantSum float64 wantCount uint64 wantQuantiles map[float64]float64 @@ -622,7 +721,7 @@ func TestAccumulateSummary(t *testing.T) { 0.50: 190, 0.99: 817, }, - metric: func(ts time.Time) (metric pmetric.Metric) { + metric: func(ts time.Time, withStartTime bool) (metric pmetric.Metric) { metric = pmetric.NewMetric() metric.SetName("test_metric") metric.SetDescription("test description") @@ -633,6 +732,9 @@ func TestAccumulateSummary(t *testing.T) { sp.Attributes().PutStr("label_1", "1") sp.Attributes().PutStr("label_2", "2") sp.SetTimestamp(pcommon.NewTimestampFromTime(ts)) + if withStartTime { + sp.SetStartTimestamp(pcommon.NewTimestampFromTime(ts)) + } fillQuantileValue(0.50, 190, sp.QuantileValues().AppendEmpty()) fillQuantileValue(0.99, 817, sp.QuantileValues().AppendEmpty()) @@ -645,12 +747,14 @@ func TestAccumulateSummary(t *testing.T) { for _, tt := range tests { for _, sendTimestamp := range []bool{true, false} { name := tt.name + // In this test, sendTimestamp is used to test + // both prometheus regular timestamp and "created timestamp". if sendTimestamp { name += "/WithTimestamp" } t.Run(name, func(t *testing.T) { ts := time.Now() - metric := tt.metric(ts) + metric := tt.metric(ts, sendTimestamp) c := collector{ accumulator: &mockAccumulator{ []pmetric.Metric{metric}, @@ -683,8 +787,10 @@ func TestAccumulateSummary(t *testing.T) { if sendTimestamp { require.Equal(t, ts.UnixNano()/1e6, *(pbMetric.TimestampMs)) + require.Equal(t, timestamppb.New(ts), pbMetric.Summary.CreatedTimestamp) } else { require.Nil(t, pbMetric.TimestampMs) + require.Nil(t, pbMetric.Summary.CreatedTimestamp) } require.Nil(t, pbMetric.Gauge) diff --git a/exporter/prometheusexporter/config_test.go b/exporter/prometheusexporter/config_test.go index 05c465288e41..c0d8b0ff1dc7 100644 --- a/exporter/prometheusexporter/config_test.go +++ b/exporter/prometheusexporter/config_test.go @@ -64,7 +64,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) diff --git a/exporter/prometheusexporter/end_to_end_test.go b/exporter/prometheusexporter/end_to_end_test.go index b941787e3277..87a9e1283c84 100644 --- a/exporter/prometheusexporter/end_to_end_test.go +++ b/exporter/prometheusexporter/end_to_end_test.go @@ -16,6 +16,7 @@ import ( "testing" "time" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/config/confighttp" "go.opentelemetry.io/collector/exporter/exportertest" @@ -32,13 +33,13 @@ func TestEndToEndSummarySupport(t *testing.T) { // 1. Create the Prometheus scrape endpoint. var wg sync.WaitGroup - var currentScrapeIndex = 0 + currentScrapeIndex := 0 wg.Add(1) // scrape one endpoint dropWizardServer := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, _ *http.Request) { // Serve back the metrics as if they were from DropWizard. _, err := rw.Write([]byte(dropWizardResponse)) - require.NoError(t, err) + assert.NoError(t, err) currentScrapeIndex++ if currentScrapeIndex == 8 { // We shall let the Prometheus receiver scrape the DropWizard mock server, at least 8 times. wg.Done() // done scraping dropWizardResponse 8 times @@ -47,9 +48,7 @@ func TestEndToEndSummarySupport(t *testing.T) { defer dropWizardServer.Close() srvURL, err := url.Parse(dropWizardServer.URL) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -64,14 +63,10 @@ func TestEndToEndSummarySupport(t *testing.T) { MetricExpiration: 2 * time.Hour, } exporterFactory := NewFactory() - set := exportertest.NewNopCreateSettings() - exporter, err := exporterFactory.CreateMetricsExporter(ctx, set, exporterCfg) - if err != nil { - t.Fatal(err) - } - if err = exporter.Start(ctx, nil); err != nil { - t.Fatalf("Failed to start the Prometheus exporter: %v", err) - } + set := exportertest.NewNopSettings() + exporter, err := exporterFactory.CreateMetrics(ctx, set, exporterCfg) + require.NoError(t, err) + require.NoError(t, exporter.Start(ctx, nil), "Failed to start the Prometheus exporter") t.Cleanup(func() { require.NoError(t, exporter.Shutdown(ctx)) }) // 3. Create the Prometheus receiver scraping from the DropWizard mock server and @@ -88,37 +83,27 @@ func TestEndToEndSummarySupport(t *testing.T) { - targets: ['%s'] `, srvURL.Host)) receiverConfig := new(prometheusreceiver.PromConfig) - if err = yaml.Unmarshal(yamlConfig, receiverConfig); err != nil { - t.Fatal(err) - } + require.NoError(t, yaml.Unmarshal(yamlConfig, receiverConfig)) receiverFactory := prometheusreceiver.NewFactory() - receiverCreateSet := receivertest.NewNopCreateSettings() + receiverCreateSet := receivertest.NewNopSettings() rcvCfg := &prometheusreceiver.Config{ PrometheusConfig: receiverConfig, } // 3.5 Create the Prometheus receiver and pass in the previously created Prometheus exporter. - prometheusReceiver, err := receiverFactory.CreateMetricsReceiver(ctx, receiverCreateSet, rcvCfg, exporter) - if err != nil { - t.Fatal(err) - } - if err = prometheusReceiver.Start(ctx, nil); err != nil { - t.Fatalf("Failed to start the Prometheus receiver: %v", err) - } + prometheusReceiver, err := receiverFactory.CreateMetrics(ctx, receiverCreateSet, rcvCfg, exporter) + require.NoError(t, err) + require.NoError(t, prometheusReceiver.Start(ctx, nil), "Failed to start the Prometheus receiver") t.Cleanup(func() { require.NoError(t, prometheusReceiver.Shutdown(ctx)) }) // 4. Scrape from the Prometheus receiver to ensure that we export summary metrics wg.Wait() res, err := http.Get("http://" + exporterCfg.Endpoint + "/metrics") - if err != nil { - t.Fatalf("Failed to scrape from the exporter: %v", err) - } + require.NoError(t, err, "Failed to scrape from the exporter") prometheusExporterScrape, err := io.ReadAll(res.Body) res.Body.Close() - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) // 5. Verify that we have the summary metrics and that their values make sense. wantLineRegexps := []string{ @@ -158,7 +143,7 @@ func TestEndToEndSummarySupport(t *testing.T) { `test_up.instance="127.0.0.1:.*",job="otel-collector". 1 .*`, `. HELP test_target_info Target metadata`, `. TYPE test_target_info gauge`, - `test_target_info.http_scheme="http",instance="127.0.0.1:.*",job="otel-collector",net_host_port=".*". 1`, + `test_target_info.http_scheme=\"http\",instance="127.0.0.1:.*",job="otel-collector",net_host_port=".*,server_port=".*",url_scheme="http". 1`, } // 5.5: Perform a complete line by line prefix verification to ensure we extract back the inputs @@ -170,10 +155,7 @@ func TestEndToEndSummarySupport(t *testing.T) { // After this replacement, there should ONLY be newlines present. prometheusExporterScrape = bytes.ReplaceAll(prometheusExporterScrape, []byte("\n"), []byte("")) // Now assert that NO output was left over. - if len(prometheusExporterScrape) != 0 { - t.Fatalf("Left-over unmatched Prometheus scrape content: %q\n", prometheusExporterScrape) - } - + require.Empty(t, prometheusExporterScrape, "Left-over unmatched Prometheus scrape content: %q\n", prometheusExporterScrape) } // the following triggers G101: Potential hardcoded credentials diff --git a/exporter/prometheusexporter/factory.go b/exporter/prometheusexporter/factory.go index b29253fe0f8c..9b3975842adb 100644 --- a/exporter/prometheusexporter/factory.go +++ b/exporter/prometheusexporter/factory.go @@ -36,7 +36,7 @@ func createDefaultConfig() component.Config { func createMetricsExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exporter.Metrics, error) { pcfg := cfg.(*Config) @@ -46,7 +46,7 @@ func createMetricsExporter( return nil, err } - exporter, err := exporterhelper.NewMetricsExporter( + exporter, err := exporterhelper.NewMetrics( ctx, set, cfg, diff --git a/exporter/prometheusexporter/factory_test.go b/exporter/prometheusexporter/factory_test.go index 51918cd1c2dd..3920b6956f29 100644 --- a/exporter/prometheusexporter/factory_test.go +++ b/exporter/prometheusexporter/factory_test.go @@ -19,25 +19,25 @@ func TestCreateDefaultConfig(t *testing.T) { assert.NoError(t, componenttest.CheckConfigStruct(cfg)) } -func TestCreateMetricsExporter(t *testing.T) { +func TestCreateMetrics(t *testing.T) { cfg := createDefaultConfig() oCfg := cfg.(*Config) oCfg.Endpoint = "" exp, err := createMetricsExporter( context.Background(), - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg) require.Equal(t, errBlankPrometheusAddress, err) require.Nil(t, exp) } -func TestCreateMetricsExporterExportHelperError(t *testing.T) { +func TestCreateMetricsExportHelperError(t *testing.T) { cfg, ok := createDefaultConfig().(*Config) require.True(t, ok) cfg.Endpoint = "http://localhost:8889" - set := exportertest.NewNopCreateSettings() + set := exportertest.NewNopSettings() set.Logger = nil // Should give us an exporterhelper.errNilLogger diff --git a/exporter/prometheusexporter/generated_component_test.go b/exporter/prometheusexporter/generated_component_test.go index a5637aed9749..3e8a4ff5f61c 100644 --- a/exporter/prometheusexporter/generated_component_test.go +++ b/exporter/prometheusexporter/generated_component_test.go @@ -32,13 +32,13 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "metrics", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg) }, }, } @@ -50,21 +50,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(exporter.Logs) require.True(t, ok) diff --git a/exporter/prometheusexporter/go.mod b/exporter/prometheusexporter/go.mod index a6107cbb6ee7..fe78b4d64532 100644 --- a/exporter/prometheusexporter/go.mod +++ b/exporter/prometheusexporter/go.mod @@ -1,74 +1,77 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.102.0 - github.com/prometheus/client_golang v1.19.1 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.116.0 + github.com/prometheus/client_golang v1.20.5 github.com/prometheus/client_model v0.6.1 - github.com/prometheus/common v0.53.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/confighttp v0.102.0 - go.opentelemetry.io/collector/config/configtls v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/receiver v0.102.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/prometheus/common v0.61.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/confighttp v0.116.0 + go.opentelemetry.io/collector/config/configtls v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 + go.opentelemetry.io/collector/semconv v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 + google.golang.org/protobuf v1.35.2 gopkg.in/yaml.v2 v2.4.0 ) require ( - cloud.google.com/go/compute/metadata v0.3.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.10.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 // indirect - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.5.0 // indirect + cloud.google.com/go/auth v0.7.0 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.2 // indirect + cloud.google.com/go/compute/metadata v0.5.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 // indirect - github.com/Code-Hex/go-generics-cache v1.3.1 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect + github.com/Code-Hex/go-generics-cache v1.5.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 // indirect github.com/armon/go-metrics v0.4.1 // indirect - github.com/aws/aws-sdk-go v1.50.32 // indirect + github.com/aws/aws-sdk-go v1.54.19 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50 // indirect + github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dennwc/varint v1.0.0 // indirect - github.com/digitalocean/godo v1.109.0 // indirect - github.com/distribution/reference v0.5.0 // indirect - github.com/docker/docker v25.0.5+incompatible // indirect + github.com/digitalocean/godo v1.118.0 // indirect + github.com/distribution/reference v0.6.0 // indirect + github.com/docker/docker v27.3.1+incompatible // indirect github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect - github.com/envoyproxy/go-control-plane v0.12.0 // indirect - github.com/envoyproxy/protoc-gen-validate v1.0.4 // indirect - github.com/fatih/color v1.15.0 // indirect + github.com/envoyproxy/go-control-plane v0.13.0 // indirect + github.com/envoyproxy/protoc-gen-validate v1.1.0 // indirect + github.com/fatih/color v1.16.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.20.2 // indirect github.com/go-openapi/jsonreference v0.20.4 // indirect github.com/go-openapi/swag v0.22.9 // indirect - github.com/go-resty/resty/v2 v2.12.0 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-resty/resty/v2 v2.13.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/go-zookeeper/zk v1.0.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v5 v5.2.0 // indirect + github.com/golang-jwt/jwt/v5 v5.2.1 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 // indirect @@ -79,106 +82,118 @@ require ( github.com/google/s2a-go v0.1.7 // indirect github.com/google/uuid v1.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.2 // indirect - github.com/gophercloud/gophercloud v1.8.0 // indirect + github.com/googleapis/gax-go/v2 v2.12.5 // indirect + github.com/gophercloud/gophercloud v1.13.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect - github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd // indirect - github.com/hashicorp/consul/api v1.28.2 // indirect + github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc // indirect + github.com/hashicorp/consul/api v1.29.2 // indirect github.com/hashicorp/cronexpr v1.1.2 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-hclog v1.5.0 // indirect + github.com/hashicorp/go-hclog v1.6.3 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-retryablehttp v0.7.4 // indirect + github.com/hashicorp/go-retryablehttp v0.7.7 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect - github.com/hashicorp/nomad/api v0.0.0-20240306004928-3e7191ccb702 // indirect + github.com/hashicorp/nomad/api v0.0.0-20240717122358-3d93bd3778f3 // indirect github.com/hashicorp/serf v0.10.1 // indirect - github.com/hetznercloud/hcloud-go/v2 v2.6.0 // indirect + github.com/hetznercloud/hcloud-go/v2 v2.10.2 // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/ionos-cloud/sdk-go/v6 v6.1.11 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/jpillora/backoff v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b // indirect github.com/kylelemons/godebug v1.1.0 // indirect - github.com/linode/linodego v1.33.0 // indirect + github.com/linode/linodego v1.37.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect - github.com/miekg/dns v1.1.58 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/miekg/dns v1.1.61 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect - github.com/ovh/go-ovh v1.4.3 // indirect + github.com/ovh/go-ovh v1.6.0 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/common/sigv4 v0.1.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e // indirect - github.com/rs/cors v1.10.1 // indirect - github.com/scaleway/scaleway-sdk-go v1.0.0-beta.25 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/prometheus/prometheus v0.54.1 // indirect + github.com/rs/cors v1.11.1 // indirect + github.com/scaleway/scaleway-sdk-go v1.0.0-beta.29 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/vultr/govultr/v2 v2.17.2 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/configopaque v1.9.0 // indirect - go.opentelemetry.io/collector/config/configretry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/component/componentstatus v0.116.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/configopaque v1.22.0 // indirect + go.opentelemetry.io/collector/config/configretry v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.23.0 // indirect + golang.org/x/crypto v0.31.0 // indirect golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/mod v0.17.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/oauth2 v0.20.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/term v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect + golang.org/x/mod v0.19.0 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/oauth2 v0.24.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.21.0 // indirect - google.golang.org/api v0.169.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/tools v0.23.0 // indirect + google.golang.org/api v0.188.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/grpc v1.68.1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/api v0.29.3 // indirect k8s.io/apimachinery v0.29.3 // indirect k8s.io/client-go v0.29.3 // indirect - k8s.io/klog/v2 v2.120.1 // indirect - k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect diff --git a/exporter/prometheusexporter/go.sum b/exporter/prometheusexporter/go.sum index 0dda9e5b318d..b539992e3427 100644 --- a/exporter/prometheusexporter/go.sum +++ b/exporter/prometheusexporter/go.sum @@ -13,14 +13,18 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go/auth v0.7.0 h1:kf/x9B3WTbBUHkC+1VS8wwwli9TzhSt0vSTVBmMR8Ts= +cloud.google.com/go/auth v0.7.0/go.mod h1:D+WqdrpcjmiCgWrXmLLxOVq1GACoE36chW6KXoEvuIw= +cloud.google.com/go/auth/oauth2adapt v0.2.2 h1:+TTV8aXpjeChS9M+aTtN/TjdQnzJvmzKFt//oWu7HX4= +cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= -cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY= +cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= @@ -33,14 +37,14 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.10.0 h1:n1DH8TPV4qqPTje2RcUBYwtrTWlabVp4n46+74X2pn4= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.10.0/go.mod h1:HDcZnuGbiyppErN6lB+idp4CKhjbc8gwjto6OPpyggM= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1 h1:sO0/P7g68FrryJzljemN+6GTssUXdANk6aJ7T1ZxnsQ= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1/go.mod h1:h8hyGFDsU5HMivxiS2iYFZsgDbU9OnnJ163x5UGVKYo= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 h1:LqbJ/WzJUwBf8UiaSzgX7aMclParm9/5Vgp+TY51uBQ= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2/go.mod h1:yInRyqWXAuaPrgI7p70+lDDgh3mlBohis29jGMISnmc= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.5.0 h1:MxA59PGoCFb+vCwRQi3PhQEwHj4+r2dhuv9HG+vM7iM= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.5.0/go.mod h1:uYt4CfhkJA9o0FN7jfE5minm/i4nUE4MjGUJkzB6Zs8= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0 h1:GJHeeA2N7xrG3q30L2UXDyuWRzDM900/65j70wcM4Ww= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0/go.mod h1:l38EPgmsp71HHLq9j7De57JcKOWPyhrsW1Awm1JS6K0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0 h1:LkHbJbgF3YyvC53aqYGR+wWQDn2Rdp9AQdGndf9QvY4= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0/go.mod h1:QyiQdW4f4/BIfB8ZutZ2s+28RAgfa/pT+zS++ZHyM1I= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0 h1:PTFGRSlMKCQelWwxUyYVEUqseBJVemLyqWJjvMyt0do= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0/go.mod h1:LRr2FzBTQlONPPa5HREE5+RjSCTXl7BwOvYOaWTqCaI= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 h1:bXwSugBiSbgtz7rOtbfGf+woewp4f06orW9OP5BjHLA= @@ -49,22 +53,22 @@ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1. github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.1.1/go.mod h1:c/wcGeGx5FUPbM/JltUYHZcKmigwyVLJlDq+4HdtXaw= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 h1:DzHpqpoJVaCgOUdVHxE8QB52S6NiVdDQvGlny1qvPqA= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Code-Hex/go-generics-cache v1.3.1 h1:i8rLwyhoyhaerr7JpjtYjJZUcCbWOdiYO3fZXLiEC4g= -github.com/Code-Hex/go-generics-cache v1.3.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4= +github.com/Code-Hex/go-generics-cache v1.5.1 h1:6vhZGc5M7Y/YD8cIUcY8kcuQLB4cHR7U+0KMqAA0KcU= +github.com/Code-Hex/go-generics-cache v1.5.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 h1:ez/4by2iGztzR4L0zgAOR8lTQK9VlyBVVd7G4omaOQs= -github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 h1:t3eaIm0rUkzbrIewtiFmMK5RXHej2XnoXNhxVsAYUfg= +github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= @@ -72,8 +76,8 @@ github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+ github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.50.32 h1:POt81DvegnpQKM4DMDLlHz1CO6OBnEoQ1gRhYFd7QRY= -github.com/aws/aws-sdk-go v1.50.32/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.54.19 h1:tyWV+07jagrNiCcGRzRhdtVjQs7Vy41NwsuOcl0IbVI= +github.com/aws/aws-sdk-go v1.54.19/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 h1:6df1vn4bBlDDo4tARvBm7l6KA9iVMnE3NWizDeWSrps= github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3/go.mod h1:CIWtjkly68+yqLPbvwwR/fjNJA/idrtULjZWh2v1ys0= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -94,8 +98,8 @@ github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6D github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50 h1:DBmgJDC9dTfkVyGgipamEh2BpGYxScCH1TOF1LL1cXc= -github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50/go.mod h1:5e1+Vvlzido69INQaVO6d87Qn543Xr6nooe9Kz7oBFM= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -104,39 +108,41 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE= github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= -github.com/digitalocean/godo v1.109.0 h1:4W97RJLJSUQ3veRZDNbp1Ol3Rbn6Lmt9bKGvfqYI5SU= -github.com/digitalocean/godo v1.109.0/go.mod h1:R6EmmWI8CT1+fCtjWY9UCB+L5uufuZH13wk3YhxycCs= -github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= -github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/digitalocean/godo v1.118.0 h1:lkzGFQmACrVCp7UqH1sAi4JK/PWwlc5aaxubgorKmC4= +github.com/digitalocean/godo v1.118.0/go.mod h1:Vk0vpCot2HOAJwc5WE8wljZGtJ3ZtWIc8MQ8rF38sdo= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docker/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= -github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v27.3.1+incompatible h1:KttF0XoteNTicmUtBO0L2tP+J7FGRFTjaEF4k6WdhfI= +github.com/docker/docker v27.3.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/BE= +github.com/ebitengine/purego v0.8.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.12.0 h1:4X+VP1GHd1Mhj6IB5mMeGbLCleqxjletLK6K0rbxyZI= -github.com/envoyproxy/go-control-plane v0.12.0/go.mod h1:ZBTaoJ23lqITozF0M6G4/IragXCQKCnYbmlmtHvwRG0= +github.com/envoyproxy/go-control-plane v0.13.0 h1:HzkeUz1Knt+3bK+8LG1bxOO/jzWZmdxpwC51i202les= +github.com/envoyproxy/go-control-plane v0.13.0/go.mod h1:GRaKG3dwvFoTg4nj7aXdZnvMg4d7nvT/wl9WgVXn3Q8= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= -github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= +github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM= +github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -151,8 +157,8 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= @@ -163,20 +169,20 @@ github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdX github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= github.com/go-openapi/swag v0.22.9 h1:XX2DssF+mQKM2DHsbgZK74y/zj4mo9I99+89xUmuZCE= github.com/go-openapi/swag v0.22.9/go.mod h1:3/OXnFfnMAwBD099SwYRk7GD3xOrr1iL7d/XNLXVVwE= -github.com/go-resty/resty/v2 v2.12.0 h1:rsVL8P90LFvkUYq/V5BTVe203WfRIU4gvcf+yfzJzGA= -github.com/go-resty/resty/v2 v2.12.0/go.mod h1:o0yGPrkS3lOe1+eFajk6kBW8ScXzwU3hD69/gt2yB/0= +github.com/go-resty/resty/v2 v2.13.1 h1:x+LHXBI2nMB1vqndymf26quycC4aggYJ7DECYbiz03g= +github.com/go-resty/resty/v2 v2.13.1/go.mod h1:GznXlLxkq6Nh4sU59rPmUw3VtgpO3aS96ORAI6Q7d+0= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg= github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw= -github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -242,8 +248,8 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7 h1:y3N7Bm7Y9/CtpiVkw/ZWj6lSlDF3F74SfKwfTCer72Q= -github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/pprof v0.0.0-20240711041743-f6c9dda6c6da h1:xRmpO92tb8y+Z85iUOMOicpCfaYcv7o3Cg3wKrIpg8g= +github.com/google/pprof v0.0.0-20240711041743-f6c9dda6c6da/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= @@ -254,21 +260,23 @@ github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfF github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.12.2 h1:mhN09QQW1jEWeMF74zGR81R30z4VJzjZsfkUhuHF+DA= -github.com/googleapis/gax-go/v2 v2.12.2/go.mod h1:61M8vcyyXR2kqKFxKrfA22jaA8JGF7Dc8App1U3H6jc= -github.com/gophercloud/gophercloud v1.8.0 h1:TM3Jawprb2NrdOnvcHhWJalmKmAmOGgfZElM/3oBYCk= -github.com/gophercloud/gophercloud v1.8.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= +github.com/googleapis/gax-go/v2 v2.12.5 h1:8gw9KZK8TiVKB6q3zHY3SBzLnrGp6HQjyfYBYGmXdxA= +github.com/googleapis/gax-go/v2 v2.12.5/go.mod h1:BUDKcWo+RaKq5SC9vVYL0wLADa3VcfswbOMMRmB9H3E= +github.com/gophercloud/gophercloud v1.13.0 h1:8iY9d1DAbzMW6Vok1AxbbK5ZaUjzMp0tdyt4fX9IeJ0= +github.com/gophercloud/gophercloud v1.13.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= -github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc h1:GN2Lv3MGO7AS6PrRoT6yV5+wkrOpcszoIsO4+4ds248= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= -github.com/hashicorp/consul/api v1.28.2 h1:mXfkRHrpHN4YY3RqL09nXU1eHKLNiuAN4kHvDQ16k/8= -github.com/hashicorp/consul/api v1.28.2/go.mod h1:KyzqzgMEya+IZPcD65YFoOVAgPpbfERu4I/tzG6/ueE= -github.com/hashicorp/consul/sdk v0.16.0 h1:SE9m0W6DEfgIVCJX7xU+iv/hUl4m/nxqMTnCdMxDpJ8= -github.com/hashicorp/consul/sdk v0.16.0/go.mod h1:7pxqqhqoaPqnBnzXD1StKed62LqJeClzVsUEy85Zr0A= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= +github.com/hashicorp/consul/api v1.29.2 h1:aYyRn8EdE2mSfG14S1+L9Qkjtz8RzmaWh6AcNGRNwPw= +github.com/hashicorp/consul/api v1.29.2/go.mod h1:0YObcaLNDSbtlgzIRtmRXI1ZkeuK0trCBxwZQ4MYnIk= +github.com/hashicorp/consul/proto-public v0.6.2 h1:+DA/3g/IiKlJZb88NBn0ZgXrxJp2NlvCZdEyl+qxvL0= +github.com/hashicorp/consul/proto-public v0.6.2/go.mod h1:cXXbOg74KBNGajC+o8RlA502Esf0R9prcoJgiOX/2Tg= +github.com/hashicorp/consul/sdk v0.16.1 h1:V8TxTnImoPD5cj0U9Spl0TUxcytjcbbJeADFF07KdHg= +github.com/hashicorp/consul/sdk v0.16.1/go.mod h1:fSXvwxB2hmh1FMZCNl6PwX0Q/1wdWtHJcZ7Ea5tns0s= github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -277,9 +285,8 @@ github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brv github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= -github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -291,8 +298,8 @@ github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+ github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-retryablehttp v0.7.4 h1:ZQgVdpTdAL7WpMIwLzCfbalOcSUdkDZnpUv3/+BxzFA= -github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= +github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= +github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= @@ -313,12 +320,12 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= -github.com/hashicorp/nomad/api v0.0.0-20240306004928-3e7191ccb702 h1:fI1LXuBaS1d9z1kmb++Og6YD8uMRwadXorCwE+xgOFA= -github.com/hashicorp/nomad/api v0.0.0-20240306004928-3e7191ccb702/go.mod h1:z71gkJdrkAt/Rl6C7Q79VE7AwJ5lUF+M+fzFTyIHYB0= +github.com/hashicorp/nomad/api v0.0.0-20240717122358-3d93bd3778f3 h1:fgVfQ4AC1avVOnu2cfms8VAiD8lUq3vWI8mTocOXN/w= +github.com/hashicorp/nomad/api v0.0.0-20240717122358-3d93bd3778f3/go.mod h1:svtxn6QnrQ69P23VvIWMR34tg3vmwLz4UdUzm1dSCgE= github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/hetznercloud/hcloud-go/v2 v2.6.0 h1:RJOA2hHZ7rD1pScA4O1NF6qhkHyUdbbxjHgFNot8928= -github.com/hetznercloud/hcloud-go/v2 v2.6.0/go.mod h1:4J1cSE57+g0WS93IiHLV7ubTHItcp+awzeBp5bM9mfA= +github.com/hetznercloud/hcloud-go/v2 v2.10.2 h1:9gyTUPhfNbfbS40Spgij5mV5k37bOZgt8iHKCbfGs5I= +github.com/hetznercloud/hcloud-go/v2 v2.10.2/go.mod h1:xQ+8KhIS62W0D78Dpi57jsufWh844gUw1az5OUvaeq8= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= @@ -348,14 +355,14 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -370,8 +377,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/linode/linodego v1.33.0 h1:cX2FYry7r6CA1ujBMsdqiM4VhvIQtnWsOuVblzfBhCw= -github.com/linode/linodego v1.33.0/go.mod h1:dSJJgIwqZCF5wnpuC6w5cyIbRtcexAm7uVvuJopGB40= +github.com/linode/linodego v1.37.0 h1:B/2Spzv9jYXzKA+p+GD8fVCNJ7Wuw6P91ZDD9eCkkso= +github.com/linode/linodego v1.37.0/go.mod h1:L7GXKFD3PoN2xSEtFc04wIXP5WK65O10jYQx0PQISWQ= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= @@ -389,15 +396,15 @@ github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOA github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04nTH68g= github.com/maxatome/go-testdeep v1.12.0/go.mod h1:lPZc/HAcJMP92l7yI6TRz1aZN5URwUBUAfUNvrclaNM= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.58 h1:ca2Hdkz+cDg/7eNF6V56jjzuZ4aCAE+DbVkILdQWG/4= -github.com/miekg/dns v1.1.58/go.mod h1:Ypv+3b/KadlvW9vJfXOTf300O4UqaHFzFCuHz+rPkBY= +github.com/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs= +github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= @@ -405,13 +412,13 @@ github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= -github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4= -github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c h1:cqn374mizHuIWj+OSJCajGr/phAmuMug9qIX3l9CflE= github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -438,17 +445,21 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= -github.com/ovh/go-ovh v1.4.3 h1:Gs3V823zwTFpzgGLZNI6ILS4rmxZgJwJCz54Er9LwD0= -github.com/ovh/go-ovh v1.4.3/go.mod h1:AkPXVtgwB6xlKblMjRKJJmjRp+ogrE7fz2lVgcQY8SY= +github.com/ovh/go-ovh v1.6.0 h1:ixLOwxQdzYDx296sXcgS35TOPEahJkpjMGtzPadCjQI= +github.com/ovh/go-ovh v1.6.0/go.mod h1:cTVDnl94z4tl8pP1uZ/8jlVxntjSIf09bNcQ5TJSC7c= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -461,8 +472,8 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= +github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -474,8 +485,8 @@ github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8b github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= +github.com/prometheus/common v0.61.0 h1:3gv/GThfX0cV2lpO7gkTUwZru38mxevy90Bj8YFSRQQ= +github.com/prometheus/common v0.61.0/go.mod h1:zr29OCN/2BsJRaFwG8QOBr41D6kkchKbpeNH7pAjb/s= github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -483,24 +494,22 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e h1:UmqAuY2OyDoog8+l5FybViJE5B2r+UxVGCUwFTsY5AA= -github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e/go.mod h1:+0ld+ozir7zWFcHA2vVpWAKxXakIioEjPPNOqH+J3ZA= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/prometheus/prometheus v0.54.1 h1:vKuwQNjnYN2/mDoWfHXDhAsz/68q/dQDb+YbcEqU7MQ= +github.com/prometheus/prometheus v0.54.1/go.mod h1:xlLByHhk2g3ycakQGrMaU8K7OySZx98BzeCR99991NY= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.25 h1:/8rfZAdFfafRXOgz+ZpMZZWZ5pYggCY9t7e/BvjaBHM= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.25/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.29 h1:BkTk4gynLjguayxrYxZoMZjBnAOh7ntQvUkOFmkMqPU= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.29/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= -github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= -github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= -github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/shirou/gopsutil/v4 v4.24.11 h1:WaU9xqGFKvFfsUv94SXcUPD7rCkU0vr/asVdQOBZNj8= +github.com/shirou/gopsutil/v4 v4.24.11/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8= github.com/shoenig/test v1.7.1 h1:UJcjSAI3aUKx52kfcfhblgyhZceouhvvs3OYdWgn+PY= github.com/shoenig/test v1.7.1/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= @@ -508,8 +517,8 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -526,8 +535,10 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +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 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tidwall/gjson v1.10.2 h1:APbLGOM0rrEkd8WBw9C24nllro4ajFuJu0Sc9hRz8Bo= github.com/tidwall/gjson v1.10.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= @@ -536,8 +547,8 @@ github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/tinylru v1.1.0 h1:XY6IUfzVTU9rpwdhKUF6nQdChgCdGjkMfLzbWyiau6I= github.com/tidwall/tinylru v1.1.0/go.mod h1:3+bX+TJ2baOLMWTnlyNWHh4QMnFyARg2TLTQ6OFbzw8= -github.com/tidwall/wal v1.1.7 h1:emc1TRjIVsdKKSnpwGBAcsAGg0767SvUk8+ygx7Bb+4= -github.com/tidwall/wal v1.1.7/go.mod h1:r6lR1j27W9EPalgHiB7zLJDYu3mzW5BQP5KrzBpYY/E= +github.com/tidwall/wal v1.1.8 h1:2qDSGdAdjaY3PEvHRva+9UFqgk+ef7cOiW1Qn5JH1y0= +github.com/tidwall/wal v1.1.8/go.mod h1:r6lR1j27W9EPalgHiB7zLJDYu3mzW5BQP5KrzBpYY/E= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= @@ -559,104 +570,144 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0 h1:8Ne/oL6M4kMWK0P3FKV9EduQa+1UOGyVAnFHfSo4c1A= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0/go.mod h1:Xj4Ld/RriP/Bj+5oPpaYJsLNs2wWRDN2TvzX3Lbi6+M= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0 h1:o1iKqN+oM+TZqHoGdnKw1Am2BQlIGCYbxCRzU8T3jbM= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0/go.mod h1:JpCemLtL/sXQ2Rk3Bx7OPPA7Qt/9NVH91q0bR655gSo= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0 h1:SfASE6lxXjrmYj/UibcWdOiFWvRG0zt4hJgenloEhlY= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0/go.mod h1:+Ku0Fvdb5f6e9UkfqJXAV5FaUJVxxg6Ykfx7Js8y+V4= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0 h1:GwJQTXs7pYPUv/fVf+0nBgsJdlrTuY/PfwQ/TRA/sIk= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0/go.mod h1:PGE3DcRgqYWWC2cq2hYZoET1d3Q8JZyPNmgvqXPFWEU= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0 h1:zdYZLiHHtDf4Kk9WU7mW9dW6WAXtBF54I5jmTMRJtiw= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0/go.mod h1:yFsgUM0PbUJkPlbpJfOG6da+YiF0Z80tv7YcnL3qwv4= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0 h1:Y4H+GaCQl2URp9mEJMV5CYOhw+erONqNyvtFoKQfIoA= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0/go.mod h1:g1RjfVD0gHAf/mPOIs3zBoKBeuDsN+rc5x0lZtgA8tI= -go.opentelemetry.io/collector/connector v0.102.0 h1:IvAsVfYRxP0ajmKbUovF8qugkcUtHq6RuYNtjcMa63E= -go.opentelemetry.io/collector/connector v0.102.0/go.mod h1:f4M7wZ/9+XtgTE0fivBFH3WlwntaEd0qFFA0giFkdnY= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/otelcol v0.102.0 h1:HuE+ok4iUjOrmYhQBSWpG5kBTVhcA24ljPL4pBERZ5E= -go.opentelemetry.io/collector/otelcol v0.102.0/go.mod h1:w8pCRu2nM/jAkLlEAS6ccKtJv5ylUQe6Ugl98zzTfyE= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/processor v0.102.0 h1:JsjTlpBRmoSYxcu3cAbKBchOmL6aNUxLa03ZkWIqZr8= -go.opentelemetry.io/collector/processor v0.102.0/go.mod h1:IaCSDcfy75uQTaOM+LgR1bMf/bUw2eFfzn20uvWYfLQ= -go.opentelemetry.io/collector/processor/batchprocessor v0.102.0 h1:lJSIMwip+Po5jOF/4dpx6c/3N45KJTr/UZoT086T4mI= -go.opentelemetry.io/collector/processor/batchprocessor v0.102.0/go.mod h1:e71Y6SnrCjD19dPjxWWi/kXa5tb0J8rC+9xl/72mLo4= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/collector/service v0.102.0 h1:B5nfyQZF7eB/y+yucl9G/7VsusbXixYXWingXn7VszM= -go.opentelemetry.io/collector/service v0.102.0/go.mod h1:c+0n0DfQeCjgrdplNHYwYbG/5aupTZVYU/50nMQraoc= -go.opentelemetry.io/contrib/config v0.7.0 h1:b1rK5tGTuhhPirJiMxOcyQfZs76j2VapY6ODn3b2Dbs= -go.opentelemetry.io/contrib/config v0.7.0/go.mod h1:8tdiFd8N5etOi3XzBmAoMxplEzI3TcL8dU5rM5/xcOQ= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/contrib/propagators/b3 v1.27.0 h1:IjgxbomVrV9za6bRi8fWCNXENs0co37SZedQilP2hm0= -go.opentelemetry.io/contrib/propagators/b3 v1.27.0/go.mod h1:Dv9obQz25lCisDvvs4dy28UPh974CxkahRDUPsY7y9E= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/bridge/opencensus v1.27.0 h1:ao9aGGHd+G4YfjBpGs6vbkvt5hoC67STlJA9fCnOAcs= -go.opentelemetry.io/otel/bridge/opencensus v1.27.0/go.mod h1:uRvWtAAXzyVOST0WMPX5JHGBaAvBws+2F8PcC5gMnTk= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 h1:bFgvUr3/O4PHj3VQcFEuYKvRZJX1SJDQ+11JXuSB3/w= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0/go.mod h1:xJntEd2KL6Qdg5lwp97HMLQDVeAhrYxmzFseAMDPQ8I= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 h1:CIHWikMsN3wO+wq1Tp5VGdVRTcON+DmOJSfDjXypKOc= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0/go.mod h1:TNupZ6cxqyFEpLXAZW7On+mLFL0/g0TE3unIYL91xWc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0 h1:/jlt1Y8gXWiHG9FBx6cJaIC5hYx5Fe64nC8w5Cylt/0= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0/go.mod h1:bmToOGOBZ4hA9ghphIc1PAf66VA8KOtsuy3+ScStG20= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 h1:/0YaXu3755A/cFbtXp+21lkXgI0QE5avTWA2HjU9/WE= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0/go.mod h1:m7SFxp0/7IxmJPLIY3JhOcU9CoFzDaCPL6xxQIxhA+o= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= -go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= -go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0 h1:upFhnU8EyPp0WMR53mJIdx+UR2EGFOr+ppYKzUCY/Vg= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0/go.mod h1:FhjMWU5nf3IctX27lVZomM5SKMyRywShRsA4/rHoBe8= +go.opentelemetry.io/collector/connector v0.116.0 h1:0Pz8RAXH1swLeA1fiyGGQWdv0Kemz4mbq+jnmd1TACE= +go.opentelemetry.io/collector/connector v0.116.0/go.mod h1:VQiZ2yW9KhZuF0yjDbvlgrAxm7+o8KQoxHxurQWLjKU= +go.opentelemetry.io/collector/connector/connectortest v0.116.0 h1:MdttvjqdZmp0ewW5IPCEtzzYmCqxrQxsjJ5m6gMVjzA= +go.opentelemetry.io/collector/connector/connectortest v0.116.0/go.mod h1:ko7aPyvAVf6SvRhWGZdPXSyk+7zPmsSCcMq0gYPMMIQ= +go.opentelemetry.io/collector/connector/xconnector v0.116.0 h1:fFJzrRco0g7HMkhnQ+ehlvicFf58vzsCLXnfuHyQM8w= +go.opentelemetry.io/collector/connector/xconnector v0.116.0/go.mod h1:m9oCk32zX6wDciYBpy+qMQkWKtOxb0gAkEUm8+trflY= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0 h1:bXDgoiDiwFfrO5S6q1Wpe0su303CW4Qxthoy4CxG6eg= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0/go.mod h1:uFZlAPxk2+s6zk1W+u22DgxxSDugWy0QaY5kQzjNy7Q= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 h1:KKFb3u8iLk4V5GYz7eVpw8QgEdob5koX6GNEbaoDQJY= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0/go.mod h1:YyWHUWeSnRmy2CF7kPHpwJ6qkVjufbLZ8PYuY0Ph0o8= +go.opentelemetry.io/collector/otelcol v0.116.0 h1:8NoPEY2uAemwNzUcMxiZuuI8w/Ff+0p1DXXk6NVEGlk= +go.opentelemetry.io/collector/otelcol v0.116.0/go.mod h1:c/EhsBdHmC44SxhWMi7pTlYB+I6GBSJNBsj9NCwXMxM= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 h1:PFNy+Il/kqPdPL9rhG+1kG63Aauya+FhBKGXoB6ivxU= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0/go.mod h1:bVn9V4TGyeXi58/JDkeXCuKtc+V+qcOoTl8hNpV0qa8= +go.opentelemetry.io/collector/processor v0.116.0 h1:Kyu4tPzTdWNHtZjcxvI/bGNAgyv8L8Kem2r/Mk4IDAw= +go.opentelemetry.io/collector/processor v0.116.0/go.mod h1:+/Ugy48RAxlZEXmN2cw51W8t5wdHS9No+GAoP+moskk= +go.opentelemetry.io/collector/processor/batchprocessor v0.116.0 h1:jZMC+jlay3xCBBjcL85oT8nMFB5B3zvvwS6lW6xVGAc= +go.opentelemetry.io/collector/processor/batchprocessor v0.116.0/go.mod h1:KmLVhDjnatsZm5xQkgRLl12lwvHohmk3djJXfu8m33c= +go.opentelemetry.io/collector/processor/processortest v0.116.0 h1:+IqNEVEE0E2MsO2g7+Y/9dz35sDuvAXRXrLts9NdXrA= +go.opentelemetry.io/collector/processor/processortest v0.116.0/go.mod h1:DLaQDBxzgeeaUO0ULMn/efos9PmHZkmYCHuxwCsiVHI= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0 h1:iin/UwuWvSLB7ZNfINFUYbZ5lxIi1NjZ2brkyyFdiRA= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0/go.mod h1:cnA43/XpKDbaOmd8buqKp/LGJ2l/OoCqbR//u5DMfn8= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/collector/service v0.116.0 h1:1rFmax3ILOlQq4bW//0VKRcG/HmN2rxrgfTybn6bisU= +go.opentelemetry.io/collector/service v0.116.0/go.mod h1:CzQzj72mWr5arag+q8uUWGRuUkenNo5Gw9oA97SFZ78= +go.opentelemetry.io/contrib/bridges/otelzap v0.6.0 h1:j8icMXyyqNf6HGuwlYhniPnVsbJIq7n+WirDu3VAJdQ= +go.opentelemetry.io/contrib/bridges/otelzap v0.6.0/go.mod h1:evIOZpl+kAlU5IsaYX2Siw+IbpacAZvXemVsgt70uvw= +go.opentelemetry.io/contrib/config v0.10.0 h1:2JknAzMaYjxrHkTnZh3eOme/Y2P5eHE2SWfhfV6Xd6c= +go.opentelemetry.io/contrib/config v0.10.0/go.mod h1:aND2M6/KfNkntI5cyvHriR/zvZgPf8j9yETdSmvpfmc= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/contrib/propagators/b3 v1.31.0 h1:PQPXYscmwbCp76QDvO4hMngF2j8Bx/OTV86laEl8uqo= +go.opentelemetry.io/contrib/propagators/b3 v1.31.0/go.mod h1:jbqfV8wDdqSDrAYxVpXQnpM0XFMq2FtDesblJ7blOwQ= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 h1:mMOmtYie9Fx6TSVzw4W+NTpvoaS1JWWga37oI1a/4qQ= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0/go.mod h1:yy7nDsMMBUkD+jeekJ36ur5f3jJIrmCwUrY67VFhNpA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 h1:j7ZSD+5yn+lo3sGV69nW04rRR0jhYnBwjuX3r0HvnK0= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0/go.mod h1:WXbYJTUaZXAbYd8lbgGuvih0yuCfOFC5RJoYnoLcGz8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 h1:t/Qur3vKSkUCcDVaSumWF2PKHt85pc7fRvFuoVT8qFU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0/go.mod h1:Rl61tySSdcOJWoEgYZVtmnKdA0GeKrSqkHC1t+91CH8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 h1:K0XaT3DwHAcV4nKLzcQvwAgSyisUghWoY20I7huthMk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0/go.mod h1:B5Ki776z/MBnVha1Nzwp5arlzBbE3+1jk+pGmaP5HME= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy03iVTXP6ffeN2iXrxfGsZGCjVx0/4KlizjyBwU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0/go.mod h1:TMu73/k1CP8nBUpDLc71Wj/Kf7ZS9FK5b53VapRsP9o= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 h1:lUsI2TYsQw2r1IASwoROaCnjdj2cvC2+Jbxvk6nHnWU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0/go.mod h1:2HpZxxQurfGxJlJDblybejHB6RX6pmExPNe517hREw4= +go.opentelemetry.io/otel/exporters/prometheus v0.54.0 h1:rFwzp68QMgtzu9PgP3jm9XaMICI6TsofWWPcBDKwlsU= +go.opentelemetry.io/otel/exporters/prometheus v0.54.0/go.mod h1:QyjcV9qDP6VeK5qPyKETvNjmaaEc7+gqjh4SS0ZYzDU= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 h1:TwmL3O3fRR80m8EshBrd8YydEZMcUCsZXzOUlnFohwM= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0/go.mod h1:tH98dDv5KPmPThswbXA0fr0Lwfs+OhK8HgaCo7PjRrk= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 h1:SZmDnHcgp3zwlPBS2JX2urGYe/jBKEIT6ZedHRUyCz8= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0/go.mod h1:fdWW0HtZJ7+jNpTKUR0GpMEDP69nR8YBJQxNiVCE3jk= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 h1:UGZ1QwZWY67Z6BmckTU+9Rxn04m2bD3gD6Mk0OIOCPk= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0/go.mod h1:fcwWuDuaObkkChiDlhEpSq9+X1C0omv+s5mBtToAQ64= +go.opentelemetry.io/otel/log v0.8.0 h1:egZ8vV5atrUWUbnSsHn6vB8R21G2wrKqNiDt3iWertk= +go.opentelemetry.io/otel/log v0.8.0/go.mod h1:M9qvDdUTRCopJcGRKg57+JSQ9LgLBrwwfC32epk5NX8= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/log v0.7.0 h1:dXkeI2S0MLc5g0/AwxTZv6EUEjctiH8aG14Am56NTmQ= +go.opentelemetry.io/otel/sdk/log v0.7.0/go.mod h1:oIRXpW+WD6M8BuGj5rtS0aRu/86cbDV/dAfNaZBIjYM= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -675,9 +726,9 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -712,8 +763,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8= +golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -753,17 +804,17 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= -golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -777,8 +828,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -836,17 +887,17 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -857,8 +908,9 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -909,14 +961,14 @@ golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= -golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg= +golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= -gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= +gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= +gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -933,8 +985,8 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.169.0 h1:QwWPy71FgMWqJN/l6jVlFHUa29a7dcUy02I8o799nPY= -google.golang.org/api v0.169.0/go.mod h1:gpNOiMA2tZ4mf5R9Iwf4rK/Dcz0fbdIgWYWVoxmsyLg= +google.golang.org/api v0.188.0 h1:51y8fJ/b1AaaBRJr4yWm96fPcuxSo0JcegXE3DaHQHw= +google.golang.org/api v0.188.0/go.mod h1:VR0d+2SIiWOYG3r/jdm7adPW9hI2aRv9ETOSCQ9Beag= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -970,10 +1022,10 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 h1:P8OJ/WCl/Xo4E4zoe4/bifHpSmmKwARqyqE4nW6J2GQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -987,8 +1039,8 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1000,8 +1052,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1039,10 +1091,10 @@ k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg= k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= -k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= -k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/exporter/prometheusexporter/internal/metadata/generated_status.go b/exporter/prometheusexporter/internal/metadata/generated_status.go index ec8e6dd593d6..67e9c198be77 100644 --- a/exporter/prometheusexporter/internal/metadata/generated_status.go +++ b/exporter/prometheusexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("prometheus") + Type = component.MustNewType("prometheus") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter" ) const ( diff --git a/exporter/prometheusexporter/internal/metadata/generated_telemetry.go b/exporter/prometheusexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index 4dc34b4367dc..000000000000 --- a/exporter/prometheusexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/prometheus") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/prometheus") -} diff --git a/exporter/prometheusexporter/internal/metadata/generated_telemetry_test.go b/exporter/prometheusexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index ce1c1326cb83..000000000000 --- a/exporter/prometheusexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/prometheus", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/prometheus", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/prometheusexporter/metadata.yaml b/exporter/prometheusexporter/metadata.yaml index 6ed4fc5ef5ba..624b14ed4308 100644 --- a/exporter/prometheusexporter/metadata.yaml +++ b/exporter/prometheusexporter/metadata.yaml @@ -1,5 +1,4 @@ type: prometheus -scope_name: otelcol/prometheus status: class: exporter @@ -9,7 +8,7 @@ status: - core - contrib codeowners: - active: [Aneurysm9] + active: [Aneurysm9, dashpole, ArthurSens] tests: config: diff --git a/exporter/prometheusexporter/prometheus.go b/exporter/prometheusexporter/prometheus.go index f8efe36e2267..8de4fa367e88 100644 --- a/exporter/prometheusexporter/prometheus.go +++ b/exporter/prometheusexporter/prometheus.go @@ -20,7 +20,7 @@ type prometheusExporter struct { config Config name string endpoint string - shutdownFunc func() error + shutdownFunc func(ctx context.Context) error handler http.Handler collector *collector registry *prometheus.Registry @@ -29,7 +29,7 @@ type prometheusExporter struct { var errBlankPrometheusAddress = errors.New("expecting a non-blank address to run the Prometheus metrics handler") -func newPrometheusExporter(config *Config, set exporter.CreateSettings) (*prometheusExporter, error) { +func newPrometheusExporter(config *Config, set exporter.Settings) (*prometheusExporter, error) { addr := strings.TrimSpace(config.Endpoint) if strings.TrimSpace(config.Endpoint) == "" { return nil, errBlankPrometheusAddress @@ -44,7 +44,7 @@ func newPrometheusExporter(config *Config, set exporter.CreateSettings) (*promet endpoint: addr, collector: collector, registry: registry, - shutdownFunc: func() error { return nil }, + shutdownFunc: func(_ context.Context) error { return nil }, handler: promhttp.HandlerFor( registry, promhttp.HandlerOpts{ @@ -63,13 +63,15 @@ func (pe *prometheusExporter) Start(ctx context.Context, host component.Host) er return err } - pe.shutdownFunc = ln.Close - mux := http.NewServeMux() mux.Handle("/metrics", pe.handler) srv, err := pe.config.ToServer(ctx, host, pe.settings, mux) if err != nil { - return err + lnerr := ln.Close() + return errors.Join(err, lnerr) + } + pe.shutdownFunc = func(ctx context.Context) error { + return srv.Shutdown(ctx) } go func() { _ = srv.Serve(ln) @@ -88,6 +90,6 @@ func (pe *prometheusExporter) ConsumeMetrics(_ context.Context, md pmetric.Metri return nil } -func (pe *prometheusExporter) Shutdown(context.Context) error { - return pe.shutdownFunc() +func (pe *prometheusExporter) Shutdown(ctx context.Context) error { + return pe.shutdownFunc(ctx) } diff --git a/exporter/prometheusexporter/prometheus_test.go b/exporter/prometheusexporter/prometheus_test.go index 6068f982b129..563f7803eaff 100644 --- a/exporter/prometheusexporter/prometheus_test.go +++ b/exporter/prometheusexporter/prometheus_test.go @@ -8,7 +8,6 @@ import ( "fmt" "io" "net/http" - "strings" "testing" "time" @@ -20,7 +19,7 @@ import ( "go.opentelemetry.io/collector/exporter/exportertest" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.25.0" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/testdata" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry" @@ -61,11 +60,11 @@ func TestPrometheusExporter(t *testing.T) { } factory := NewFactory() - set := exportertest.NewNopCreateSettings() + set := exportertest.NewNopSettings() for _, tt := range tests { // Run it a few times to ensure that shutdowns exit cleanly. for j := 0; j < 3; j++ { - exp, err := factory.CreateMetricsExporter(context.Background(), set, tt.config) + exp, err := factory.CreateMetrics(context.Background(), set, tt.config) if tt.wantErr != "" { require.Error(t, err) @@ -113,8 +112,8 @@ func TestPrometheusExporter_WithTLS(t *testing.T) { }, } factory := NewFactory() - set := exportertest.NewNopCreateSettings() - exp, err := factory.CreateMetricsExporter(context.Background(), set, cfg) + set := exportertest.NewNopSettings() + exp, err := factory.CreateMetrics(context.Background(), set, cfg) require.NoError(t, err) tlscs := configtls.ClientConfig{ @@ -135,11 +134,6 @@ func TestPrometheusExporter_WithTLS(t *testing.T) { t.Cleanup(func() { require.NoError(t, exp.Shutdown(context.Background())) - // trigger a get so that the server cleans up our keepalive socket - var resp *http.Response - resp, err = httpClient.Get("https://localhost:7777/metrics") - require.NoError(t, err) - require.NoError(t, resp.Body.Close()) }) assert.NotNil(t, exp) @@ -154,9 +148,7 @@ func TestPrometheusExporter_WithTLS(t *testing.T) { rsp, err := httpClient.Get("https://localhost:7777/metrics") require.NoError(t, err, "Failed to perform a scrape") - if g, w := rsp.StatusCode, 200; g != w { - t.Errorf("Mismatched HTTP response status code: Got: %d Want: %d", g, w) - } + assert.Equal(t, http.StatusOK, rsp.StatusCode, "Mismatched HTTP response status code") blob, _ := io.ReadAll(rsp.Body) _ = rsp.Body.Close() @@ -169,9 +161,7 @@ func TestPrometheusExporter_WithTLS(t *testing.T) { } for _, w := range want { - if !strings.Contains(string(blob), w) { - t.Errorf("Missing %v from response:\n%v", w, string(blob)) - } + assert.Contains(t, string(blob), w, "Missing %v from response:\n%v", w, string(blob)) } } @@ -190,17 +180,12 @@ func TestPrometheusExporter_endToEndMultipleTargets(t *testing.T) { } factory := NewFactory() - set := exportertest.NewNopCreateSettings() - exp, err := factory.CreateMetricsExporter(context.Background(), set, cfg) + set := exportertest.NewNopSettings() + exp, err := factory.CreateMetrics(context.Background(), set, cfg) assert.NoError(t, err) t.Cleanup(func() { require.NoError(t, exp.Shutdown(context.Background())) - // trigger a get so that the server cleans up our keepalive socket - var resp *http.Response - resp, err = http.Get("http://localhost:7777/metrics") - require.NoError(t, err) - require.NoError(t, resp.Body.Close()) }) assert.NotNil(t, exp) @@ -218,9 +203,7 @@ func TestPrometheusExporter_endToEndMultipleTargets(t *testing.T) { res, err1 := http.Get("http://localhost:7777/metrics") require.NoError(t, err1, "Failed to perform a scrape") - if g, w := res.StatusCode, 200; g != w { - t.Errorf("Mismatched HTTP response status code: Got: %d Want: %d", g, w) - } + assert.Equal(t, http.StatusOK, res.StatusCode, "Mismatched HTTP response status code") blob, _ := io.ReadAll(res.Body) _ = res.Body.Close() want := []string{ @@ -239,9 +222,7 @@ func TestPrometheusExporter_endToEndMultipleTargets(t *testing.T) { } for _, w := range want { - if !strings.Contains(string(blob), w) { - t.Errorf("Missing %v from response:\n%v", w, string(blob)) - } + assert.Contains(t, string(blob), w, "Missing %v from response:\n%v", w, string(blob)) } } @@ -252,9 +233,7 @@ func TestPrometheusExporter_endToEndMultipleTargets(t *testing.T) { res, err := http.Get("http://localhost:7777/metrics") require.NoError(t, err, "Failed to perform a scrape") - if g, w := res.StatusCode, 200; g != w { - t.Errorf("Mismatched HTTP response status code: Got: %d Want: %d", g, w) - } + assert.Equal(t, http.StatusOK, res.StatusCode, "Mismatched HTTP response status code") blob, _ := io.ReadAll(res.Body) _ = res.Body.Close() require.Emptyf(t, string(blob), "Metrics did not expire") @@ -274,17 +253,12 @@ func TestPrometheusExporter_endToEnd(t *testing.T) { } factory := NewFactory() - set := exportertest.NewNopCreateSettings() - exp, err := factory.CreateMetricsExporter(context.Background(), set, cfg) + set := exportertest.NewNopSettings() + exp, err := factory.CreateMetrics(context.Background(), set, cfg) assert.NoError(t, err) t.Cleanup(func() { require.NoError(t, exp.Shutdown(context.Background())) - // trigger a get so that the server cleans up our keepalive socket - var resp *http.Response - resp, err = http.Get("http://localhost:7777/metrics") - require.NoError(t, err) - require.NoError(t, resp.Body.Close()) }) assert.NotNil(t, exp) @@ -300,9 +274,7 @@ func TestPrometheusExporter_endToEnd(t *testing.T) { res, err1 := http.Get("http://localhost:7777/metrics") require.NoError(t, err1, "Failed to perform a scrape") - if g, w := res.StatusCode, 200; g != w { - t.Errorf("Mismatched HTTP response status code: Got: %d Want: %d", g, w) - } + assert.Equal(t, http.StatusOK, res.StatusCode, "Mismatched HTTP response status code") blob, _ := io.ReadAll(res.Body) _ = res.Body.Close() want := []string{ @@ -317,9 +289,7 @@ func TestPrometheusExporter_endToEnd(t *testing.T) { } for _, w := range want { - if !strings.Contains(string(blob), w) { - t.Errorf("Missing %v from response:\n%v", w, string(blob)) - } + assert.Contains(t, string(blob), w, "Missing %v from response:\n%v", w, string(blob)) } } @@ -330,9 +300,7 @@ func TestPrometheusExporter_endToEnd(t *testing.T) { res, err := http.Get("http://localhost:7777/metrics") require.NoError(t, err, "Failed to perform a scrape") - if g, w := res.StatusCode, 200; g != w { - t.Errorf("Mismatched HTTP response status code: Got: %d Want: %d", g, w) - } + assert.Equal(t, http.StatusOK, res.StatusCode, "Mismatched HTTP response status code") blob, _ := io.ReadAll(res.Body) _ = res.Body.Close() require.Emptyf(t, string(blob), "Metrics did not expire") @@ -353,17 +321,12 @@ func TestPrometheusExporter_endToEndWithTimestamps(t *testing.T) { } factory := NewFactory() - set := exportertest.NewNopCreateSettings() - exp, err := factory.CreateMetricsExporter(context.Background(), set, cfg) + set := exportertest.NewNopSettings() + exp, err := factory.CreateMetrics(context.Background(), set, cfg) assert.NoError(t, err) t.Cleanup(func() { require.NoError(t, exp.Shutdown(context.Background())) - // trigger a get so that the server cleans up our keepalive socket - var resp *http.Response - resp, err = http.Get("http://localhost:7777/metrics") - require.NoError(t, err) - require.NoError(t, resp.Body.Close()) }) assert.NotNil(t, exp) @@ -379,9 +342,7 @@ func TestPrometheusExporter_endToEndWithTimestamps(t *testing.T) { res, err1 := http.Get("http://localhost:7777/metrics") require.NoError(t, err1, "Failed to perform a scrape") - if g, w := res.StatusCode, 200; g != w { - t.Errorf("Mismatched HTTP response status code: Got: %d Want: %d", g, w) - } + assert.Equal(t, http.StatusOK, res.StatusCode, "Mismatched HTTP response status code") blob, _ := io.ReadAll(res.Body) _ = res.Body.Close() want := []string{ @@ -396,9 +357,7 @@ func TestPrometheusExporter_endToEndWithTimestamps(t *testing.T) { } for _, w := range want { - if !strings.Contains(string(blob), w) { - t.Errorf("Missing %v from response:\n%v", w, string(blob)) - } + assert.Contains(t, string(blob), w, "Missing %v from response:\n%v", w, string(blob)) } } @@ -409,9 +368,7 @@ func TestPrometheusExporter_endToEndWithTimestamps(t *testing.T) { res, err := http.Get("http://localhost:7777/metrics") require.NoError(t, err, "Failed to perform a scrape") - if g, w := res.StatusCode, 200; g != w { - t.Errorf("Mismatched HTTP response status code: Got: %d Want: %d", g, w) - } + assert.Equal(t, http.StatusOK, res.StatusCode, "Mismatched HTTP response status code") blob, _ := io.ReadAll(res.Body) _ = res.Body.Close() require.Emptyf(t, string(blob), "Metrics did not expire") @@ -435,17 +392,12 @@ func TestPrometheusExporter_endToEndWithResource(t *testing.T) { } factory := NewFactory() - set := exportertest.NewNopCreateSettings() - exp, err := factory.CreateMetricsExporter(context.Background(), set, cfg) + set := exportertest.NewNopSettings() + exp, err := factory.CreateMetrics(context.Background(), set, cfg) assert.NoError(t, err) t.Cleanup(func() { require.NoError(t, exp.Shutdown(context.Background())) - // trigger a get so that the server cleans up our keepalive socket - var resp *http.Response - resp, err = http.Get("http://localhost:7777/metrics") - require.NoError(t, err, "Failed to perform a scrape") - require.NoError(t, resp.Body.Close()) }) assert.NotNil(t, exp) @@ -459,9 +411,7 @@ func TestPrometheusExporter_endToEndWithResource(t *testing.T) { rsp, err := http.Get("http://localhost:7777/metrics") require.NoError(t, err, "Failed to perform a scrape") - if g, w := rsp.StatusCode, 200; g != w { - t.Errorf("Mismatched HTTP response status code: Got: %d Want: %d", g, w) - } + assert.Equal(t, http.StatusOK, rsp.StatusCode, "Mismatched HTTP response status code") blob, _ := io.ReadAll(rsp.Body) _ = rsp.Body.Close() @@ -474,9 +424,7 @@ func TestPrometheusExporter_endToEndWithResource(t *testing.T) { } for _, w := range want { - if !strings.Contains(string(blob), w) { - t.Errorf("Missing %v from response:\n%v", w, string(blob)) - } + assert.Contains(t, string(blob), w, "Missing %v from response:\n%v", w, string(blob)) } } diff --git a/exporter/prometheusexporter/utils.go b/exporter/prometheusexporter/utils.go index bb5c064227d6..4d229b30f3de 100644 --- a/exporter/prometheusexporter/utils.go +++ b/exporter/prometheusexporter/utils.go @@ -7,7 +7,7 @@ import ( "fmt" "go.opentelemetry.io/collector/pdata/pcommon" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.25.0" ) func resourceSignature(attributes pcommon.Map) string { diff --git a/exporter/prometheusremotewriteexporter/DESIGN.md b/exporter/prometheusremotewriteexporter/DESIGN.md index 3fbf369050f0..36946ddccd5f 100644 --- a/exporter/prometheusremotewriteexporter/DESIGN.md +++ b/exporter/prometheusremotewriteexporter/DESIGN.md @@ -45,10 +45,10 @@ Because of the gaps mentioned above, this project will convert from the current ## **2. Prometheus Remote Write/Cortex Exporter** -The Prometheus remote write/Cortex exporter should receive OTLP metrics, group data points by metric name and label set, convert each group to a TimeSeries, and send all TimeSeries to a storage backend via HTTP. +The Prometheus remote write/Cortex exporter should receive OTLP metrics, group data points by metric name and label set, convert each group to a TimeSeries, and send all TimeSeries to a storage backend via HTTP. ### **2.1 Receiving Metrics** -The Prometheus remote write/Cortex exporter receives a MetricsData instance in its PushMetrics() function. MetricsData contains a collection of Metric instances. Each Metric instance contains a series of data points, and each data point has a set of labels associated with it. Since Prometheus remote write TimeSeries are identified by unique sets of labels, the exporter needs to group data points within each Metric instance by their label set, and convert each group to a TimeSeries. +The Prometheus remote write/Cortex exporter receives a MetricsData instance in its PushMetrics() function. MetricsData contains a collection of Metric instances. Each Metric instance contains a series of data points, and each data point has a set of labels associated with it. Since Prometheus remote write TimeSeries are identified by unique sets of labels, the exporter needs to group data points within each Metric instance by their label set, and convert each group to a TimeSeries. To group data points by label set, the exporter should create a map with each PushMetrics() call. The key of the map should represent a combination of the following information: @@ -67,7 +67,7 @@ The value of the map should be Prometheus TimeSeries, and each data point’s va Pseudocode: - func PushMetrics(metricsData) { + func PushMetrics(metricsData) { // Create a map that stores distinct TimeSeries map := make(map[String][]TimeSeries) @@ -81,7 +81,7 @@ Pseudocode: // Add to TimeSeries // Sends TimeSeries to backend - export(map) + export(map) } ### **2.2 Mapping of OTLP Metrics to TimeSeries** diff --git a/exporter/prometheusremotewriteexporter/README.md b/exporter/prometheusremotewriteexporter/README.md index 33ae05e1604d..4357de6689de 100644 --- a/exporter/prometheusremotewriteexporter/README.md +++ b/exporter/prometheusremotewriteexporter/README.md @@ -6,9 +6,9 @@ | Stability | [beta]: metrics | | Distributions | [core], [contrib] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fprometheusremotewrite%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fprometheusremotewrite) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fprometheusremotewrite%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fprometheusremotewrite) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@Aneurysm9](https://www.github.com/Aneurysm9), [@rapphil](https://www.github.com/rapphil) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@Aneurysm9](https://www.github.com/Aneurysm9), [@rapphil](https://www.github.com/rapphil), [@dashpole](https://www.github.com/dashpole), [@ArthurSens](https://www.github.com/ArthurSens) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [core]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib @@ -59,7 +59,7 @@ The following settings can be optionally configured: - `enabled` (default = false): If `enabled` is `true`, all the resource attributes will be converted to metric labels by default. - `target_info`: customize `target_info` metric - `enabled` (default = true): If `enabled` is `true`, a `target_info` metric will be generated for each resource metric (see https://github.com/open-telemetry/opentelemetry-specification/pull/2381). -- `export_created_metric`: +- `export_created_metric`: `WARNING` Deprecated and planned for removal in v0.116.0. See [related issue](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/35003) for more information. - `enabled` (default = false): If `enabled` is `true`, a `_created` metric is exported for Summary, Histogram, and Monotonic Sum metric points if `StartTimeUnixNano` is set. diff --git a/exporter/prometheusremotewriteexporter/config.go b/exporter/prometheusremotewriteexporter/config.go index f63468783b1f..23b8c5f1e4e3 100644 --- a/exporter/prometheusremotewriteexporter/config.go +++ b/exporter/prometheusremotewriteexporter/config.go @@ -16,8 +16,8 @@ import ( // Config defines configuration for Remote Write exporter. type Config struct { - exporterhelper.TimeoutSettings `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. - configretry.BackOffConfig `mapstructure:"retry_on_failure"` + TimeoutSettings exporterhelper.TimeoutConfig `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. + configretry.BackOffConfig `mapstructure:"retry_on_failure"` // prefix attached to each exported metric name // See: https://prometheus.io/docs/practices/naming/#metric-names @@ -45,6 +45,8 @@ type Config struct { TargetInfo *TargetInfo `mapstructure:"target_info,omitempty"` // CreatedMetric allows customizing creation of _created metrics + // Deprecated[0.114.0]: The feature doesn't provide the expected behavior. Use Prometheus remote-write v2 to enable sending Created Timestamps. + // This feature is planned to be removed in v0.116.0 CreatedMetric *CreatedMetric `mapstructure:"export_created_metric,omitempty"` // AddMetricSuffixes controls whether unit and type suffixes are added to metrics on export diff --git a/exporter/prometheusremotewriteexporter/config_test.go b/exporter/prometheusremotewriteexporter/config_test.go index 00e6074eda19..1f37f7972a5e 100644 --- a/exporter/prometheusremotewriteexporter/config_test.go +++ b/exporter/prometheusremotewriteexporter/config_test.go @@ -29,6 +29,21 @@ func TestLoadConfig(t *testing.T) { cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml")) require.NoError(t, err) + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Endpoint = "localhost:8888" + clientConfig.TLSSetting = configtls.ClientConfig{ + Config: configtls.Config{ + CAFile: "/var/lib/mycert.pem", // This is subject to change, but currently I have no idea what else to put here lol + }, + Insecure: false, + } + clientConfig.ReadBufferSize = 0 + clientConfig.WriteBufferSize = 512 * 1024 + clientConfig.Timeout = 5 * time.Second + clientConfig.Headers = map[string]configopaque.String{ + "Prometheus-Remote-Write-Version": "0.1.0", + "X-Scope-OrgID": "234", + } tests := []struct { id component.ID expected component.Config @@ -42,7 +57,7 @@ func TestLoadConfig(t *testing.T) { id: component.NewIDWithName(metadata.Type, "2"), expected: &Config{ MaxBatchSizeBytes: 3000000, - TimeoutSettings: exporterhelper.NewDefaultTimeoutSettings(), + TimeoutSettings: exporterhelper.NewDefaultTimeoutConfig(), BackOffConfig: configretry.BackOffConfig{ Enabled: true, InitialInterval: 10 * time.Second, @@ -56,24 +71,10 @@ func TestLoadConfig(t *testing.T) { QueueSize: 2000, NumConsumers: 10, }, - AddMetricSuffixes: false, - Namespace: "test-space", - ExternalLabels: map[string]string{"key1": "value1", "key2": "value2"}, - ClientConfig: confighttp.ClientConfig{ - Endpoint: "localhost:8888", - TLSSetting: configtls.ClientConfig{ - Config: configtls.Config{ - CAFile: "/var/lib/mycert.pem", // This is subject to change, but currently I have no idea what else to put here lol - }, - Insecure: false, - }, - ReadBufferSize: 0, - WriteBufferSize: 512 * 1024, - Timeout: 5 * time.Second, - Headers: map[string]configopaque.String{ - "Prometheus-Remote-Write-Version": "0.1.0", - "X-Scope-OrgID": "234"}, - }, + AddMetricSuffixes: false, + Namespace: "test-space", + ExternalLabels: map[string]string{"key1": "value1", "key2": "value2"}, + ClientConfig: clientConfig, ResourceToTelemetrySettings: resourcetotelemetry.Settings{Enabled: true}, TargetInfo: &TargetInfo{ Enabled: true, @@ -98,7 +99,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) if tt.expected == nil { assert.EqualError(t, component.ValidateConfig(cfg), tt.errorMessage) @@ -118,7 +119,7 @@ func TestDisabledQueue(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "disabled_queue").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.False(t, cfg.(*Config).RemoteWriteQueue.Enabled) } @@ -131,7 +132,7 @@ func TestDisabledTargetInfo(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "disabled_target_info").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.False(t, cfg.(*Config).TargetInfo.Enabled) } diff --git a/exporter/prometheusremotewriteexporter/documentation.md b/exporter/prometheusremotewriteexporter/documentation.md index dc8d0cdf5998..69d02f9194a6 100644 --- a/exporter/prometheusremotewriteexporter/documentation.md +++ b/exporter/prometheusremotewriteexporter/documentation.md @@ -6,7 +6,7 @@ The following telemetry is emitted by this component. -### exporter_prometheusremotewrite_failed_translations +### otelcol_exporter_prometheusremotewrite_failed_translations Number of translation operations that failed to translate metrics from Otel to Prometheus @@ -14,7 +14,7 @@ Number of translation operations that failed to translate metrics from Otel to P | ---- | ----------- | ---------- | --------- | | 1 | Sum | Int | true | -### exporter_prometheusremotewrite_translated_time_series +### otelcol_exporter_prometheusremotewrite_translated_time_series Number of Prometheus time series that were translated from OTel metrics diff --git a/exporter/prometheusremotewriteexporter/exporter.go b/exporter/prometheusremotewriteexporter/exporter.go index 1e2c22908a24..74e1cff42b79 100644 --- a/exporter/prometheusremotewriteexporter/exporter.go +++ b/exporter/prometheusremotewriteexporter/exporter.go @@ -53,25 +53,41 @@ func (p *prwTelemetryOtel) recordTranslatedTimeSeries(ctx context.Context, numTS p.telemetryBuilder.ExporterPrometheusremotewriteTranslatedTimeSeries.Add(ctx, int64(numTS), metric.WithAttributes(p.otelAttrs...)) } +type buffer struct { + protobuf *proto.Buffer + snappy []byte +} + +// A reusable buffer pool for serializing protobufs and compressing them with Snappy. +var bufferPool = sync.Pool{ + New: func() any { + return &buffer{ + protobuf: proto.NewBuffer(nil), + snappy: nil, + } + }, +} + // prwExporter converts OTLP metrics to Prometheus remote write TimeSeries and sends them to a remote endpoint. type prwExporter struct { - endpointURL *url.URL - client *http.Client - wg *sync.WaitGroup - closeChan chan struct{} - concurrency int - userAgentHeader string - maxBatchSizeBytes int - clientSettings *confighttp.ClientConfig - settings component.TelemetrySettings - retrySettings configretry.BackOffConfig - retryOnHTTP429 bool - wal *prweWAL - exporterSettings prometheusremotewrite.Settings - telemetry prwTelemetry + endpointURL *url.URL + client *http.Client + wg *sync.WaitGroup + closeChan chan struct{} + concurrency int + userAgentHeader string + maxBatchSizeBytes int + clientSettings *confighttp.ClientConfig + settings component.TelemetrySettings + retrySettings configretry.BackOffConfig + retryOnHTTP429 bool + wal *prweWAL + exporterSettings prometheusremotewrite.Settings + telemetry prwTelemetry + batchTimeSeriesState batchTimeSeriesState } -func newPRWTelemetry(set exporter.CreateSettings) (prwTelemetry, error) { +func newPRWTelemetry(set exporter.Settings) (prwTelemetry, error) { telemetryBuilder, err := metadata.NewTelemetryBuilder(set.TelemetrySettings) if err != nil { return nil, err @@ -86,7 +102,7 @@ func newPRWTelemetry(set exporter.CreateSettings) (prwTelemetry, error) { } // newPRWExporter initializes a new prwExporter instance and sets fields accordingly. -func newPRWExporter(cfg *Config, set exporter.CreateSettings) (*prwExporter, error) { +func newPRWExporter(cfg *Config, set exporter.Settings) (*prwExporter, error) { sanitizedLabels, err := validateAndSanitizeExternalLabels(cfg) if err != nil { return nil, err @@ -123,7 +139,12 @@ func newPRWExporter(cfg *Config, set exporter.CreateSettings) (*prwExporter, err AddMetricSuffixes: cfg.AddMetricSuffixes, SendMetadata: cfg.SendMetadata, }, - telemetry: prwTelemetry, + telemetry: prwTelemetry, + batchTimeSeriesState: newBatchTimeSericesState(), + } + + if prwe.exporterSettings.ExportCreatedMetric { + prwe.settings.Logger.Warn("export_created_metric is deprecated and will be removed in a future release") } prwe.wal = newWAL(cfg.WAL, prwe.export) @@ -208,7 +229,7 @@ func (prwe *prwExporter) handleExport(ctx context.Context, tsMap map[string]*pro } // Calls the helper function to convert and batch the TsMap to the desired format - requests, err := batchTimeSeries(tsMap, prwe.maxBatchSizeBytes, m) + requests, err := batchTimeSeries(tsMap, prwe.maxBatchSizeBytes, m, &prwe.batchTimeSeriesState) if err != nil { return err } @@ -269,13 +290,26 @@ func (prwe *prwExporter) export(ctx context.Context, requests []*prompb.WriteReq } func (prwe *prwExporter) execute(ctx context.Context, writeReq *prompb.WriteRequest) error { + buf := bufferPool.Get().(*buffer) + buf.protobuf.Reset() + defer bufferPool.Put(buf) + // Uses proto.Marshal to convert the WriteRequest into bytes array - data, errMarshal := proto.Marshal(writeReq) + errMarshal := buf.protobuf.Marshal(writeReq) if errMarshal != nil { return consumererror.NewPermanent(errMarshal) } - buf := make([]byte, len(data), cap(data)) - compressedData := snappy.Encode(buf, data) + // If we don't pass a buffer large enough, Snappy Encode function will not use it and instead will allocate a new buffer. + // Manually grow the buffer to make sure Snappy uses it and we can re-use it afterwards. + maxCompressedLen := snappy.MaxEncodedLen(len(buf.protobuf.Bytes())) + if maxCompressedLen > len(buf.snappy) { + if cap(buf.snappy) < maxCompressedLen { + buf.snappy = make([]byte, maxCompressedLen) + } else { + buf.snappy = buf.snappy[:maxCompressedLen] + } + } + compressedData := snappy.Encode(buf.snappy, buf.protobuf.Bytes()) // executeFunc can be used for backoff and non backoff scenarios. executeFunc := func() error { @@ -289,7 +323,7 @@ func (prwe *prwExporter) execute(ctx context.Context, writeReq *prompb.WriteRequ } // Create the HTTP POST request to send to the endpoint - req, err := http.NewRequestWithContext(ctx, "POST", prwe.endpointURL.String(), bytes.NewReader(compressedData)) + req, err := http.NewRequestWithContext(ctx, http.MethodPost, prwe.endpointURL.String(), bytes.NewReader(compressedData)) if err != nil { return backoff.Permanent(consumererror.NewPermanent(err)) } @@ -323,7 +357,7 @@ func (prwe *prwExporter) execute(ctx context.Context, writeReq *prompb.WriteRequ // 429 errors are recoverable and the exporter should retry if RetryOnHTTP429 enabled // Reference: https://github.com/prometheus/prometheus/pull/12677 - if prwe.retryOnHTTP429 && resp.StatusCode == 429 { + if prwe.retryOnHTTP429 && resp.StatusCode == http.StatusTooManyRequests { return rerr } diff --git a/exporter/prometheusremotewriteexporter/exporter_test.go b/exporter/prometheusremotewriteexporter/exporter_test.go index f0db9029f75d..864e85323bdb 100644 --- a/exporter/prometheusremotewriteexporter/exporter_test.go +++ b/exporter/prometheusremotewriteexporter/exporter_test.go @@ -5,10 +5,13 @@ package prometheusremotewriteexporter import ( "context" + "fmt" "io" "net/http" "net/http/httptest" "net/url" + "strconv" + "strings" "sync" "testing" "time" @@ -23,6 +26,7 @@ import ( "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/config/confighttp" "go.opentelemetry.io/collector/config/configretry" + "go.opentelemetry.io/collector/config/configtelemetry" "go.opentelemetry.io/collector/config/configtls" "go.opentelemetry.io/collector/consumer/consumererror" "go.opentelemetry.io/collector/exporter" @@ -38,11 +42,11 @@ import ( // Test_NewPRWExporter checks that a new exporter instance with non-nil fields is initialized func Test_NewPRWExporter(t *testing.T) { cfg := &Config{ - TimeoutSettings: exporterhelper.TimeoutSettings{}, + TimeoutSettings: exporterhelper.TimeoutConfig{}, BackOffConfig: configretry.BackOffConfig{}, Namespace: "", ExternalLabels: map[string]string{}, - ClientConfig: confighttp.ClientConfig{Endpoint: ""}, + ClientConfig: confighttp.NewDefaultClientConfig(), TargetInfo: &TargetInfo{ Enabled: true, }, @@ -54,7 +58,7 @@ func Test_NewPRWExporter(t *testing.T) { Description: "OpenTelemetry Collector", Version: "1.0", } - set := exportertest.NewNopCreateSettings() + set := exportertest.NewNopSettings() set.BuildInfo = buildInfo tests := []struct { @@ -65,7 +69,7 @@ func Test_NewPRWExporter(t *testing.T) { concurrency int externalLabels map[string]string returnErrorOnCreate bool - set exporter.CreateSettings + set exporter.Settings }{ { name: "invalid_URL", @@ -134,7 +138,7 @@ func Test_NewPRWExporter(t *testing.T) { // Test_Start checks if the client is properly created as expected. func Test_Start(t *testing.T) { cfg := &Config{ - TimeoutSettings: exporterhelper.TimeoutSettings{}, + TimeoutSettings: exporterhelper.TimeoutConfig{}, BackOffConfig: configretry.BackOffConfig{}, MaxBatchSizeBytes: 3000000, Namespace: "", @@ -150,8 +154,23 @@ func Test_Start(t *testing.T) { Description: "OpenTelemetry Collector", Version: "1.0", } - set := exportertest.NewNopCreateSettings() + set := exportertest.NewNopSettings() set.BuildInfo = buildInfo + + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Endpoint = "https://some.url:9411/api/prom/push" + clientConfigTLS := confighttp.NewDefaultClientConfig() + clientConfigTLS.Endpoint = "https://some.url:9411/api/prom/push" + clientConfigTLS.TLSSetting = configtls.ClientConfig{ + Config: configtls.Config{ + CAFile: "non-existent file", + CertFile: "", + KeyFile: "", + }, + Insecure: false, + ServerName: "", + } + tests := []struct { name string config *Config @@ -159,7 +178,7 @@ func Test_Start(t *testing.T) { concurrency int externalLabels map[string]string returnErrorOnStartUp bool - set exporter.CreateSettings + set exporter.Settings endpoint string clientSettings confighttp.ClientConfig }{ @@ -170,7 +189,7 @@ func Test_Start(t *testing.T) { concurrency: 5, externalLabels: map[string]string{"Key1": "Val1"}, set: set, - clientSettings: confighttp.ClientConfig{Endpoint: "https://some.url:9411/api/prom/push"}, + clientSettings: clientConfig, }, { name: "invalid_tls", @@ -180,18 +199,7 @@ func Test_Start(t *testing.T) { externalLabels: map[string]string{"Key1": "Val1"}, set: set, returnErrorOnStartUp: true, - clientSettings: confighttp.ClientConfig{ - Endpoint: "https://some.url:9411/api/prom/push", - TLSSetting: configtls.ClientConfig{ - Config: configtls.Config{ - CAFile: "non-existent file", - CertFile: "", - KeyFile: "", - }, - Insecure: false, - ServerName: "", - }, - }, + clientSettings: clientConfigTLS, }, } @@ -252,9 +260,7 @@ func Test_export(t *testing.T) { // The following is a handler function that reads the sent httpRequest, unmarshal, and checks if the WriteRequest // preserves the TimeSeries data correctly body, err := io.ReadAll(r.Body) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) require.NotNil(t, body) // Receives the http requests and unzip, unmarshalls, and extracts TimeSeries assert.Equal(t, "0.1.0", r.Header.Get("X-Prometheus-Remote-Write-Version")) @@ -269,7 +275,7 @@ func Test_export(t *testing.T) { ok := proto.Unmarshal(dest, writeReq) require.NoError(t, ok) - assert.EqualValues(t, 1, len(writeReq.Timeseries)) + assert.Len(t, writeReq.Timeseries, 1) require.NotNil(t, writeReq.GetTimeseries()) assert.Equal(t, *ts1, writeReq.GetTimeseries()[0]) w.WriteHeader(code) @@ -284,7 +290,8 @@ func Test_export(t *testing.T) { httpResponseCode int returnErrorOnCreate bool }{ - {"success_case", + { + "success_case", *ts1, true, http.StatusAccepted, @@ -296,7 +303,8 @@ func Test_export(t *testing.T) { false, http.StatusAccepted, true, - }, { + }, + { "error_status_code_case", *ts1, true, @@ -359,7 +367,7 @@ func runExportPipeline(ts *prompb.TimeSeries, endpoint *url.URL) error { Description: "OpenTelemetry Collector", Version: "1.0", } - set := exportertest.NewNopCreateSettings() + set := exportertest.NewNopSettings() set.BuildInfo = buildInfo // after this, instantiate a CortexExporter with the current HTTP client and endpoint set to passed in endpoint prwe, err := newPRWExporter(cfg, set) @@ -377,7 +385,6 @@ func runExportPipeline(ts *prompb.TimeSeries, endpoint *url.URL) error { // Test_PushMetrics checks the number of TimeSeries received by server and the number of metrics dropped is the same as // expected func Test_PushMetrics(t *testing.T) { - invalidTypeBatch := testdata.GenerateMetricsMetricTypeInvalid() // success cases @@ -443,9 +450,7 @@ func Test_PushMetrics(t *testing.T) { checkFunc := func(t *testing.T, r *http.Request, expected int, isStaleMarker bool) { body, err := io.ReadAll(r.Body) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) buf := make([]byte, len(body)) dest, err := snappy.Decode(buf, body) @@ -456,8 +461,8 @@ func Test_PushMetrics(t *testing.T) { require.NoError(t, err) wr := &prompb.WriteRequest{} ok := proto.Unmarshal(dest, wr) - require.Nil(t, ok) - assert.EqualValues(t, expected, len(wr.Timeseries)) + require.NoError(t, ok) + assert.Len(t, wr.Timeseries, expected) if isStaleMarker { assert.True(t, value.IsStaleNaN(wr.Timeseries[0].Samples[0].Value)) } @@ -702,14 +707,13 @@ func Test_PushMetrics(t *testing.T) { MaxInterval: 1 * time.Second, // Shorter max interval MaxElapsedTime: 2 * time.Second, // Shorter max elapsed time } + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Endpoint = server.URL + clientConfig.ReadBufferSize = 0 + clientConfig.WriteBufferSize = 512 * 1024 cfg := &Config{ - Namespace: "", - ClientConfig: confighttp.ClientConfig{ - Endpoint: server.URL, - // We almost read 0 bytes, so no need to tune ReadBufferSize. - ReadBufferSize: 0, - WriteBufferSize: 512 * 1024, - }, + Namespace: "", + ClientConfig: clientConfig, MaxBatchSizeBytes: 3000000, RemoteWriteQueue: RemoteWriteQueue{NumConsumers: 1}, TargetInfo: &TargetInfo{ @@ -733,7 +737,9 @@ func Test_PushMetrics(t *testing.T) { Version: "1.0", } tel := setupTestTelemetry() - set := tel.NewCreateSettings() + set := tel.NewSettings() + // detailed level enables otelhttp client instrumentation which we dont want to test here + set.MetricsLevel = configtelemetry.LevelBasic set.BuildInfo = buildInfo prwe, nErr := newPRWExporter(cfg, set) @@ -753,7 +759,7 @@ func Test_PushMetrics(t *testing.T) { expectedMetrics := []metricdata.Metrics{} if tt.expectedFailedTranslations > 0 { expectedMetrics = append(expectedMetrics, metricdata.Metrics{ - Name: "exporter_prometheusremotewrite_failed_translations", + Name: "otelcol_exporter_prometheusremotewrite_failed_translations", Description: "Number of translation operations that failed to translate metrics from Otel to Prometheus", Unit: "1", Data: metricdata.Sum[int64]{ @@ -770,7 +776,7 @@ func Test_PushMetrics(t *testing.T) { } expectedMetrics = append(expectedMetrics, metricdata.Metrics{ - Name: "exporter_prometheusremotewrite_translated_time_series", + Name: "otelcol_exporter_prometheusremotewrite_translated_time_series", Description: "Number of Prometheus time series that were translated from OTel metrics", Unit: "1", Data: metricdata.Sum[int64]{ @@ -799,32 +805,38 @@ func Test_validateAndSanitizeExternalLabels(t *testing.T) { expectedLabels map[string]string returnErrorOnCreate bool }{ - {"success_case_no_labels", + { + "success_case_no_labels", map[string]string{}, map[string]string{}, false, }, - {"success_case_with_labels", + { + "success_case_with_labels", map[string]string{"key1": "val1"}, map[string]string{"key1": "val1"}, false, }, - {"success_case_2_with_labels", + { + "success_case_2_with_labels", map[string]string{"__key1__": "val1"}, map[string]string{"__key1__": "val1"}, false, }, - {"success_case_with_sanitized_labels", + { + "success_case_with_sanitized_labels", map[string]string{"__key1.key__": "val1"}, map[string]string{"__key1_key__": "val1"}, false, }, - {"labels_that_start_with_digit", + { + "labels_that_start_with_digit", map[string]string{"6key_": "val1"}, map[string]string{"key_6key_": "val1"}, false, }, - {"fail_case_empty_label", + { + "fail_case_empty_label", map[string]string{"": "val1"}, map[string]string{}, true, @@ -836,32 +848,38 @@ func Test_validateAndSanitizeExternalLabels(t *testing.T) { expectedLabels map[string]string returnErrorOnCreate bool }{ - {"success_case_no_labels", + { + "success_case_no_labels", map[string]string{}, map[string]string{}, false, }, - {"success_case_with_labels", + { + "success_case_with_labels", map[string]string{"key1": "val1"}, map[string]string{"key1": "val1"}, false, }, - {"success_case_2_with_labels", + { + "success_case_2_with_labels", map[string]string{"__key1__": "val1"}, map[string]string{"__key1__": "val1"}, false, }, - {"success_case_with_sanitized_labels", + { + "success_case_with_sanitized_labels", map[string]string{"__key1.key__": "val1"}, map[string]string{"__key1_key__": "val1"}, false, }, - {"labels_that_start_with_digit", + { + "labels_that_start_with_digit", map[string]string{"6key_": "val1"}, map[string]string{"key_6key_": "val1"}, false, }, - {"fail_case_empty_label", + { + "fail_case_empty_label", map[string]string{"": "val1"}, map[string]string{}, true, @@ -926,11 +944,11 @@ func TestWALOnExporterRoundTrip(t *testing.T) { // 2. Create the WAL configuration, create the // exporter and export some time series! tempDir := t.TempDir() + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Endpoint = prweServer.URL cfg := &Config{ - Namespace: "test_ns", - ClientConfig: confighttp.ClientConfig{ - Endpoint: prweServer.URL, - }, + Namespace: "test_ns", + ClientConfig: clientConfig, RemoteWriteQueue: RemoteWriteQueue{NumConsumers: 1}, WAL: &WALConfig{ Directory: tempDir, @@ -944,7 +962,7 @@ func TestWALOnExporterRoundTrip(t *testing.T) { }, } - set := exportertest.NewNopCreateSettings() + set := exportertest.NewNopSettings() set.BuildInfo = component.BuildInfo{ Description: "OpenTelemetry Collector", Version: "1.0", @@ -1007,10 +1025,10 @@ func TestWALOnExporterRoundTrip(t *testing.T) { assert.NoError(t, err) reqs = append(reqs, req) } - assert.Equal(t, 1, len(reqs)) + assert.Len(t, reqs, 1) // We MUST have 2 time series as were passed into tsMap. gotFromWAL := reqs[0] - assert.Equal(t, 2, len(gotFromWAL.Timeseries)) + assert.Len(t, gotFromWAL.Timeseries, 2) want := &prompb.WriteRequest{ Timeseries: orderBySampleTimestamp([]prompb.TimeSeries{ *ts1, *ts2, @@ -1065,7 +1083,6 @@ func assertPermanentConsumerError(t assert.TestingT, err error, _ ...any) bool { } func TestRetries(t *testing.T) { - tts := []struct { name string serverErrorCount int // number of times server should return error @@ -1162,3 +1179,94 @@ func TestRetries(t *testing.T) { }) } } + +func BenchmarkExecute(b *testing.B) { + for _, numSample := range []int{100, 1000, 10000} { + b.Run(fmt.Sprintf("numSample=%d", numSample), func(b *testing.B) { + benchmarkExecute(b, numSample) + }) + } +} + +func benchmarkExecute(b *testing.B, numSample int) { + mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusOK) + })) + defer mockServer.Close() + endpointURL, err := url.Parse(mockServer.URL) + require.NoError(b, err) + + // Create the prwExporter + exporter := &prwExporter{ + endpointURL: endpointURL, + client: http.DefaultClient, + } + + generateSamples := func(n int) []prompb.Sample { + samples := make([]prompb.Sample, 0, n) + for i := 0; i < n; i++ { + samples = append(samples, prompb.Sample{ + Timestamp: int64(i), + Value: float64(i), + }) + } + return samples + } + + generateHistograms := func(n int) []prompb.Histogram { + histograms := make([]prompb.Histogram, 0, n) + for i := 0; i < n; i++ { + histograms = append(histograms, prompb.Histogram{ + Timestamp: int64(i), + Count: &prompb.Histogram_CountInt{CountInt: uint64(i)}, + PositiveCounts: []float64{float64(i)}, + }) + } + return histograms + } + + reqs := make([]*prompb.WriteRequest, 0, b.N) + const labelValue = "abcdefg'hijlmn234!@#$%^&*()_+~`\"{}[],./<>?hello0123hiOlá你好Dzieńdobry9Zd8ra765v4stvuyte" + for n := 0; n < b.N; n++ { + num := strings.Repeat(strconv.Itoa(n), 16) + req := &prompb.WriteRequest{ + Metadata: []prompb.MetricMetadata{ + { + Type: prompb.MetricMetadata_COUNTER, + Unit: "seconds", + Help: "This is a counter", + }, + { + Type: prompb.MetricMetadata_HISTOGRAM, + Unit: "seconds", + Help: "This is a histogram", + }, + }, + Timeseries: []prompb.TimeSeries{ + { + Samples: generateSamples(numSample), + Labels: []prompb.Label{ + {Name: "__name__", Value: "test_metric"}, + {Name: "test_label_name_" + num, Value: labelValue + num}, + }, + }, + { + Histograms: generateHistograms(numSample), + Labels: []prompb.Label{ + {Name: "__name__", Value: "test_histogram"}, + {Name: "test_label_name_" + num, Value: labelValue + num}, + }, + }, + }, + } + reqs = append(reqs, req) + } + + ctx := context.Background() + b.ReportAllocs() + b.ResetTimer() + for _, req := range reqs { + err := exporter.execute(ctx, req) + require.NoError(b, err) + } +} diff --git a/exporter/prometheusremotewriteexporter/factory.go b/exporter/prometheusremotewriteexporter/factory.go index b84fa7ce15af..46c52d233d91 100644 --- a/exporter/prometheusremotewriteexporter/factory.go +++ b/exporter/prometheusremotewriteexporter/factory.go @@ -10,7 +10,6 @@ import ( "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/config/confighttp" - "go.opentelemetry.io/collector/config/configopaque" "go.opentelemetry.io/collector/config/configretry" "go.opentelemetry.io/collector/exporter" "go.opentelemetry.io/collector/exporter/exporterhelper" @@ -35,9 +34,9 @@ func NewFactory() exporter.Factory { exporter.WithMetrics(createMetricsExporter, metadata.MetricsStability)) } -func createMetricsExporter(ctx context.Context, set exporter.CreateSettings, - cfg component.Config) (exporter.Metrics, error) { - +func createMetricsExporter(ctx context.Context, set exporter.Settings, + cfg component.Config, +) (exporter.Metrics, error) { prwCfg, ok := cfg.(*Config) if !ok { return nil, errors.New("invalid configuration") @@ -54,13 +53,13 @@ func createMetricsExporter(ctx context.Context, set exporter.CreateSettings, // order for each timeseries. If we shard the incoming metrics // without considering this limitation, we experience // "out of order samples" errors. - exporter, err := exporterhelper.NewMetricsExporter( + exporter, err := exporterhelper.NewMetrics( ctx, set, cfg, prwe.PushMetrics, exporterhelper.WithTimeout(prwCfg.TimeoutSettings), - exporterhelper.WithQueue(exporterhelper.QueueSettings{ + exporterhelper.WithQueue(exporterhelper.QueueConfig{ Enabled: prwCfg.RemoteWriteQueue.Enabled, NumConsumers: 1, QueueSize: prwCfg.RemoteWriteQueue.QueueSize, @@ -77,23 +76,22 @@ func createMetricsExporter(ctx context.Context, set exporter.CreateSettings, func createDefaultConfig() component.Config { retrySettings := configretry.NewDefaultBackOffConfig() retrySettings.InitialInterval = 50 * time.Millisecond + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Endpoint = "http://some.url:9411/api/prom/push" + // We almost read 0 bytes, so no need to tune ReadBufferSize. + clientConfig.ReadBufferSize = 0 + clientConfig.WriteBufferSize = 512 * 1024 + clientConfig.Timeout = exporterhelper.NewDefaultTimeoutConfig().Timeout return &Config{ Namespace: "", ExternalLabels: map[string]string{}, MaxBatchSizeBytes: 3000000, - TimeoutSettings: exporterhelper.NewDefaultTimeoutSettings(), + TimeoutSettings: exporterhelper.NewDefaultTimeoutConfig(), BackOffConfig: retrySettings, AddMetricSuffixes: true, SendMetadata: false, - ClientConfig: confighttp.ClientConfig{ - Endpoint: "http://some.url:9411/api/prom/push", - // We almost read 0 bytes, so no need to tune ReadBufferSize. - ReadBufferSize: 0, - WriteBufferSize: 512 * 1024, - Timeout: exporterhelper.NewDefaultTimeoutSettings().Timeout, - Headers: map[string]configopaque.String{}, - }, + ClientConfig: clientConfig, // TODO(jbd): Adjust the default queue size. RemoteWriteQueue: RemoteWriteQueue{ Enabled: true, diff --git a/exporter/prometheusremotewriteexporter/factory_test.go b/exporter/prometheusremotewriteexporter/factory_test.go index c1625bcbb383..8196d5baaf8f 100644 --- a/exporter/prometheusremotewriteexporter/factory_test.go +++ b/exporter/prometheusremotewriteexporter/factory_test.go @@ -25,9 +25,8 @@ func Test_createDefaultConfig(t *testing.T) { // Tests whether or not a correct Metrics Exporter from the default Config parameters func Test_createMetricsExporter(t *testing.T) { - invalidConfig := createDefaultConfig().(*Config) - invalidConfig.ClientConfig = confighttp.ClientConfig{} + invalidConfig.ClientConfig = confighttp.NewDefaultClientConfig() invalidTLSConfig := createDefaultConfig().(*Config) invalidTLSConfig.ClientConfig.TLSSetting = configtls.ClientConfig{ Config: configtls.Config{ @@ -41,31 +40,35 @@ func Test_createMetricsExporter(t *testing.T) { tests := []struct { name string cfg component.Config - set exporter.CreateSettings + set exporter.Settings returnErrorOnCreate bool returnErrorOnStart bool }{ - {"success_case", + { + "success_case", createDefaultConfig(), - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), false, false, }, - {"fail_case", + { + "fail_case", nil, - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), true, false, }, - {"invalid_config_case", + { + "invalid_config_case", invalidConfig, - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), true, false, }, - {"invalid_tls_config_case", + { + "invalid_tls_config_case", invalidTLSConfig, - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), false, true, }, diff --git a/exporter/prometheusremotewriteexporter/generated_component_telemetry_test.go b/exporter/prometheusremotewriteexporter/generated_component_telemetry_test.go index 78082bf04706..ca13452a47ec 100644 --- a/exporter/prometheusremotewriteexporter/generated_component_telemetry_test.go +++ b/exporter/prometheusremotewriteexporter/generated_component_telemetry_test.go @@ -12,6 +12,8 @@ import ( "go.opentelemetry.io/otel/sdk/metric/metricdata/metricdatatest" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/config/configtelemetry" "go.opentelemetry.io/collector/exporter" "go.opentelemetry.io/collector/exporter/exportertest" ) @@ -21,12 +23,18 @@ type componentTestTelemetry struct { meterProvider *sdkmetric.MeterProvider } -func (tt *componentTestTelemetry) NewCreateSettings() exporter.CreateSettings { - settings := exportertest.NewNopCreateSettings() - settings.MeterProvider = tt.meterProvider - settings.ID = component.NewID(component.MustNewType("prometheusremotewrite")) +func (tt *componentTestTelemetry) NewSettings() exporter.Settings { + set := exportertest.NewNopSettings() + set.ID = component.NewID(component.MustNewType("prometheusremotewrite")) + set.TelemetrySettings = tt.newTelemetrySettings() + return set +} - return settings +func (tt *componentTestTelemetry) newTelemetrySettings() component.TelemetrySettings { + set := componenttest.NewNopTelemetrySettings() + set.MeterProvider = tt.meterProvider + set.MetricsLevel = configtelemetry.LevelDetailed + return set } func setupTestTelemetry() componentTestTelemetry { diff --git a/exporter/prometheusremotewriteexporter/generated_component_test.go b/exporter/prometheusremotewriteexporter/generated_component_test.go index 8bd585ba5dca..9d48b842f881 100644 --- a/exporter/prometheusremotewriteexporter/generated_component_test.go +++ b/exporter/prometheusremotewriteexporter/generated_component_test.go @@ -32,13 +32,13 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "metrics", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg) }, }, } @@ -50,21 +50,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(exporter.Logs) require.True(t, ok) diff --git a/exporter/prometheusremotewriteexporter/go.mod b/exporter/prometheusremotewriteexporter/go.mod index 499cf12306ae..a7a10d3f0921 100644 --- a/exporter/prometheusremotewriteexporter/go.mod +++ b/exporter/prometheusremotewriteexporter/go.mod @@ -1,85 +1,94 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter -go 1.21.0 +go 1.22.0 require ( github.com/cenkalti/backoff/v4 v4.3.0 - github.com/fsnotify/fsnotify v1.7.0 + github.com/fsnotify/fsnotify v1.8.0 github.com/gogo/protobuf v1.3.2 github.com/golang/snappy v0.0.4 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.102.0 - github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e - github.com/stretchr/testify v1.9.0 - github.com/tidwall/wal v1.1.7 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/confighttp v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 - go.opentelemetry.io/collector/config/configtls v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/featuregate v1.9.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/otel v1.27.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/sdk/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.116.0 + github.com/prometheus/prometheus v0.54.1 + github.com/stretchr/testify v1.10.0 + github.com/tidwall/wal v1.1.8 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/confighttp v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 + go.opentelemetry.io/collector/config/configtls v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/featuregate v1.22.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/otel v1.32.0 + go.opentelemetry.io/otel/metric v1.32.0 + go.opentelemetry.io/otel/sdk/metric v1.32.0 + go.opentelemetry.io/otel/trace v1.32.0 go.uber.org/goleak v1.3.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/rs/cors v1.10.1 // indirect + github.com/prometheus/common v0.61.0 // indirect + github.com/rs/cors v1.11.1 // indirect github.com/tidwall/gjson v1.10.2 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect github.com/tidwall/tinylru v1.1.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/collector/semconv v0.102.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/consumer v1.22.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/collector/semconv v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/prometheusremotewriteexporter/go.sum b/exporter/prometheusremotewriteexporter/go.sum index ee5ba8039306..84787be5754b 100644 --- a/exporter/prometheusremotewriteexporter/go.sum +++ b/exporter/prometheusremotewriteexporter/go.sum @@ -1,5 +1,3 @@ -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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= @@ -10,17 +8,19 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= @@ -28,20 +28,22 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc h1:GN2Lv3MGO7AS6PrRoT6yV5+wkrOpcszoIsO4+4ds248= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -55,27 +57,25 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e h1:UmqAuY2OyDoog8+l5FybViJE5B2r+UxVGCUwFTsY5AA= -github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e/go.mod h1:+0ld+ozir7zWFcHA2vVpWAKxXakIioEjPPNOqH+J3ZA= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/prometheus/common v0.61.0 h1:3gv/GThfX0cV2lpO7gkTUwZru38mxevy90Bj8YFSRQQ= +github.com/prometheus/common v0.61.0/go.mod h1:zr29OCN/2BsJRaFwG8QOBr41D6kkchKbpeNH7pAjb/s= +github.com/prometheus/prometheus v0.54.1 h1:vKuwQNjnYN2/mDoWfHXDhAsz/68q/dQDb+YbcEqU7MQ= +github.com/prometheus/prometheus v0.54.1/go.mod h1:xlLByHhk2g3ycakQGrMaU8K7OySZx98BzeCR99991NY= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tidwall/gjson v1.10.2 h1:APbLGOM0rrEkd8WBw9C24nllro4ajFuJu0Sc9hRz8Bo= github.com/tidwall/gjson v1.10.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= @@ -84,64 +84,88 @@ github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/tinylru v1.1.0 h1:XY6IUfzVTU9rpwdhKUF6nQdChgCdGjkMfLzbWyiau6I= github.com/tidwall/tinylru v1.1.0/go.mod h1:3+bX+TJ2baOLMWTnlyNWHh4QMnFyARg2TLTQ6OFbzw8= -github.com/tidwall/wal v1.1.7 h1:emc1TRjIVsdKKSnpwGBAcsAGg0767SvUk8+ygx7Bb+4= -github.com/tidwall/wal v1.1.7/go.mod h1:r6lR1j27W9EPalgHiB7zLJDYu3mzW5BQP5KrzBpYY/E= +github.com/tidwall/wal v1.1.8 h1:2qDSGdAdjaY3PEvHRva+9UFqgk+ef7cOiW1Qn5JH1y0= +github.com/tidwall/wal v1.1.8/go.mod h1:r6lR1j27W9EPalgHiB7zLJDYu3mzW5BQP5KrzBpYY/E= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -157,20 +181,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -179,14 +203,16 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/exporter/prometheusremotewriteexporter/helper.go b/exporter/prometheusremotewriteexporter/helper.go index d5eca3086a7e..5819aefc4fe8 100644 --- a/exporter/prometheusremotewriteexporter/helper.go +++ b/exporter/prometheusremotewriteexporter/helper.go @@ -5,19 +5,39 @@ package prometheusremotewriteexporter // import "github.com/open-telemetry/opent import ( "errors" + "math" "sort" "github.com/prometheus/prometheus/prompb" ) +type batchTimeSeriesState struct { + // Track batch sizes sent to avoid over allocating huge buffers. + // This helps in the case where large batches are sent to avoid allocating too much unused memory + nextTimeSeriesBufferSize int + nextMetricMetadataBufferSize int + nextRequestBufferSize int +} + +func newBatchTimeSericesState() batchTimeSeriesState { + return batchTimeSeriesState{ + nextTimeSeriesBufferSize: math.MaxInt, + nextMetricMetadataBufferSize: math.MaxInt, + nextRequestBufferSize: 0, + } +} + // batchTimeSeries splits series into multiple batch write requests. -func batchTimeSeries(tsMap map[string]*prompb.TimeSeries, maxBatchByteSize int, m []*prompb.MetricMetadata) ([]*prompb.WriteRequest, error) { +func batchTimeSeries(tsMap map[string]*prompb.TimeSeries, maxBatchByteSize int, m []*prompb.MetricMetadata, state *batchTimeSeriesState) ([]*prompb.WriteRequest, error) { if len(tsMap) == 0 { return nil, errors.New("invalid tsMap: cannot be empty map") } - requests := make([]*prompb.WriteRequest, 0, len(tsMap)+len(m)) - tsArray := make([]prompb.TimeSeries, 0, len(tsMap)) + // Allocate a buffer size of at least 10, or twice the last # of requests we sent + requests := make([]*prompb.WriteRequest, 0, max(10, state.nextRequestBufferSize)) + + // Allocate a time series buffer 2x the last time series batch size or the length of the input if smaller + tsArray := make([]prompb.TimeSeries, 0, min(state.nextTimeSeriesBufferSize, len(tsMap))) sizeOfCurrentBatch := 0 i := 0 @@ -25,10 +45,11 @@ func batchTimeSeries(tsMap map[string]*prompb.TimeSeries, maxBatchByteSize int, sizeOfSeries := v.Size() if sizeOfCurrentBatch+sizeOfSeries >= maxBatchByteSize { + state.nextTimeSeriesBufferSize = max(10, 2*len(tsArray)) wrapped := convertTimeseriesToRequest(tsArray) requests = append(requests, wrapped) - tsArray = make([]prompb.TimeSeries, 0, len(tsMap)-i) + tsArray = make([]prompb.TimeSeries, 0, min(state.nextTimeSeriesBufferSize, len(tsMap)-i)) sizeOfCurrentBatch = 0 } @@ -42,17 +63,19 @@ func batchTimeSeries(tsMap map[string]*prompb.TimeSeries, maxBatchByteSize int, requests = append(requests, wrapped) } - mArray := make([]prompb.MetricMetadata, 0, len(m)) + // Allocate a metric metadata buffer 2x the last metric metadata batch size or the length of the input if smaller + mArray := make([]prompb.MetricMetadata, 0, min(state.nextMetricMetadataBufferSize, len(m))) sizeOfCurrentBatch = 0 i = 0 for _, v := range m { sizeOfM := v.Size() if sizeOfCurrentBatch+sizeOfM >= maxBatchByteSize { + state.nextMetricMetadataBufferSize = max(10, 2*len(mArray)) wrapped := convertMetadataToRequest(mArray) requests = append(requests, wrapped) - mArray = make([]prompb.MetricMetadata, 0, len(m)-i) + mArray = make([]prompb.MetricMetadata, 0, min(state.nextMetricMetadataBufferSize, len(m)-i)) sizeOfCurrentBatch = 0 } @@ -66,6 +89,7 @@ func batchTimeSeries(tsMap map[string]*prompb.TimeSeries, maxBatchByteSize int, requests = append(requests, wrapped) } + state.nextRequestBufferSize = 2 * len(requests) return requests, nil } diff --git a/exporter/prometheusremotewriteexporter/helper_test.go b/exporter/prometheusremotewriteexporter/helper_test.go index 8404bb6c9e9e..e7ce715ac5be 100644 --- a/exporter/prometheusremotewriteexporter/helper_test.go +++ b/exporter/prometheusremotewriteexporter/helper_test.go @@ -4,6 +4,7 @@ package prometheusremotewriteexporter import ( + "math" "testing" "github.com/prometheus/prometheus/prompb" @@ -57,17 +58,86 @@ func Test_batchTimeSeries(t *testing.T) { // run tests for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - requests, err := batchTimeSeries(tt.tsMap, tt.maxBatchByteSize, nil) + state := newBatchTimeSericesState() + requests, err := batchTimeSeries(tt.tsMap, tt.maxBatchByteSize, nil, &state) if tt.returnErr { assert.Error(t, err) return } + assert.NoError(t, err) - assert.Equal(t, tt.numExpectedRequests, len(requests)) + assert.Len(t, requests, tt.numExpectedRequests) + if tt.numExpectedRequests <= 1 { + assert.Equal(t, math.MaxInt, state.nextTimeSeriesBufferSize) + assert.Equal(t, math.MaxInt, state.nextMetricMetadataBufferSize) + assert.Equal(t, 2*len(requests), state.nextRequestBufferSize) + } else { + assert.Equal(t, max(10, len(requests[len(requests)-2].Timeseries)*2), state.nextTimeSeriesBufferSize) + assert.Equal(t, math.MaxInt, state.nextMetricMetadataBufferSize) + assert.Equal(t, 2*len(requests), state.nextRequestBufferSize) + } }) } } +func Test_batchTimeSeriesUpdatesStateForLargeBatches(t *testing.T) { + labels := getPromLabels(label11, value11, label12, value12, label21, value21, label22, value22) + sample1 := getSample(floatVal1, msTime1) + sample2 := getSample(floatVal2, msTime2) + sample3 := getSample(floatVal3, msTime3) + + // Benchmark for large data sizes + // First allocate 100k time series + tsArray := make([]*prompb.TimeSeries, 0, 100000) + for i := 0; i < 100000; i++ { + ts := getTimeSeries(labels, sample1, sample2, sample3) + tsArray = append(tsArray, ts) + } + + tsMap1 := getTimeseriesMap(tsArray) + + state := newBatchTimeSericesState() + requests, err := batchTimeSeries(tsMap1, 1000000, nil, &state) + + assert.NoError(t, err) + assert.Len(t, requests, 18) + assert.Equal(t, len(requests[len(requests)-2].Timeseries)*2, state.nextTimeSeriesBufferSize) + assert.Equal(t, math.MaxInt, state.nextMetricMetadataBufferSize) + assert.Equal(t, 36, state.nextRequestBufferSize) +} + +// Benchmark_batchTimeSeries checks batchTimeSeries +// To run and gather alloc data: +// go test -bench ^Benchmark_batchTimeSeries$ -benchmem -benchtime=100x -run=^$ -count=10 -memprofile memprofile.out +// go tool pprof -svg memprofile.out +func Benchmark_batchTimeSeries(b *testing.B) { + labels := getPromLabels(label11, value11, label12, value12, label21, value21, label22, value22) + sample1 := getSample(floatVal1, msTime1) + sample2 := getSample(floatVal2, msTime2) + sample3 := getSample(floatVal3, msTime3) + + // Benchmark for large data sizes + // First allocate 100k time series + tsArray := make([]*prompb.TimeSeries, 0, 100000) + for i := 0; i < 100000; i++ { + ts := getTimeSeries(labels, sample1, sample2, sample3) + tsArray = append(tsArray, ts) + } + + tsMap1 := getTimeseriesMap(tsArray) + + b.ReportAllocs() + b.ResetTimer() + + state := newBatchTimeSericesState() + // Run batchTimeSeries 100 times with a 1mb max request size + for i := 0; i < b.N; i++ { + requests, err := batchTimeSeries(tsMap1, 1000000, nil, &state) + assert.NoError(b, err) + assert.Len(b, requests, 18) + } +} + // Ensure that before a prompb.WriteRequest is created, that the points per TimeSeries // are sorted by Timestamp value, to prevent Prometheus from barfing when it gets poorly // sorted values. See issues: @@ -163,7 +233,7 @@ func TestEnsureTimeseriesPointsAreSortedByTimestamp(t *testing.T) { }, }, } - assert.Equal(t, got, want) + assert.Equal(t, want, got) // For a full sanity/logical check, assert that EVERY // Sample has a Timestamp bigger than its prior values. @@ -172,10 +242,8 @@ func TestEnsureTimeseriesPointsAreSortedByTimestamp(t *testing.T) { si := ts.Samples[i] for j := 0; j < i; j++ { sj := ts.Samples[j] - if sj.Timestamp > si.Timestamp { - t.Errorf("Timeseries[%d]: Sample[%d].Timestamp(%d) > Sample[%d].Timestamp(%d)", - ti, j, sj.Timestamp, i, si.Timestamp) - } + assert.LessOrEqual(t, sj.Timestamp, si.Timestamp, "Timeseries[%d]: Sample[%d].Timestamp(%d) > Sample[%d].Timestamp(%d)", + ti, j, sj.Timestamp, i, si.Timestamp) } } } diff --git a/exporter/prometheusremotewriteexporter/internal/metadata/generated_status.go b/exporter/prometheusremotewriteexporter/internal/metadata/generated_status.go index 6a7a98fa90cd..2cab1515e581 100644 --- a/exporter/prometheusremotewriteexporter/internal/metadata/generated_status.go +++ b/exporter/prometheusremotewriteexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("prometheusremotewrite") + Type = component.MustNewType("prometheusremotewrite") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter" ) const ( diff --git a/exporter/prometheusremotewriteexporter/internal/metadata/generated_telemetry.go b/exporter/prometheusremotewriteexporter/internal/metadata/generated_telemetry.go index 2dc39557ca01..248d453764c4 100644 --- a/exporter/prometheusremotewriteexporter/internal/metadata/generated_telemetry.go +++ b/exporter/prometheusremotewriteexporter/internal/metadata/generated_telemetry.go @@ -14,58 +14,59 @@ import ( ) func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/prometheusremotewrite") + return settings.MeterProvider.Meter("github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter") } func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/prometheusremotewrite") + return settings.TracerProvider.Tracer("github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter") } // TelemetryBuilder provides an interface for components to report telemetry // as defined in metadata and user config. type TelemetryBuilder struct { + meter metric.Meter ExporterPrometheusremotewriteFailedTranslations metric.Int64Counter ExporterPrometheusremotewriteTranslatedTimeSeries metric.Int64Counter - level configtelemetry.Level } -// telemetryBuilderOption applies changes to default builder. -type telemetryBuilderOption func(*TelemetryBuilder) +// TelemetryBuilderOption applies changes to default builder. +type TelemetryBuilderOption interface { + apply(*TelemetryBuilder) +} -// WithLevel sets the current telemetry level for the component. -func WithLevel(lvl configtelemetry.Level) telemetryBuilderOption { - return func(builder *TelemetryBuilder) { - builder.level = lvl - } +type telemetryBuilderOptionFunc func(mb *TelemetryBuilder) + +func (tbof telemetryBuilderOptionFunc) apply(mb *TelemetryBuilder) { + tbof(mb) } // NewTelemetryBuilder provides a struct with methods to update all internal telemetry // for a component -func NewTelemetryBuilder(settings component.TelemetrySettings, options ...telemetryBuilderOption) (*TelemetryBuilder, error) { - builder := TelemetryBuilder{level: configtelemetry.LevelBasic} +func NewTelemetryBuilder(settings component.TelemetrySettings, options ...TelemetryBuilderOption) (*TelemetryBuilder, error) { + builder := TelemetryBuilder{} for _, op := range options { - op(&builder) - } - var ( - err, errs error - meter metric.Meter - ) - if builder.level >= configtelemetry.LevelBasic { - meter = Meter(settings) - } else { - meter = noop.Meter{} + op.apply(&builder) } - builder.ExporterPrometheusremotewriteFailedTranslations, err = meter.Int64Counter( - "exporter_prometheusremotewrite_failed_translations", + builder.meter = Meter(settings) + var err, errs error + builder.ExporterPrometheusremotewriteFailedTranslations, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_exporter_prometheusremotewrite_failed_translations", metric.WithDescription("Number of translation operations that failed to translate metrics from Otel to Prometheus"), metric.WithUnit("1"), ) errs = errors.Join(errs, err) - builder.ExporterPrometheusremotewriteTranslatedTimeSeries, err = meter.Int64Counter( - "exporter_prometheusremotewrite_translated_time_series", + builder.ExporterPrometheusremotewriteTranslatedTimeSeries, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_exporter_prometheusremotewrite_translated_time_series", metric.WithDescription("Number of Prometheus time series that were translated from OTel metrics"), metric.WithUnit("1"), ) errs = errors.Join(errs, err) return &builder, errs } + +func getLeveledMeter(meter metric.Meter, cfgLevel, srvLevel configtelemetry.Level) metric.Meter { + if cfgLevel <= srvLevel { + return meter + } + return noop.Meter{} +} diff --git a/exporter/prometheusremotewriteexporter/internal/metadata/generated_telemetry_test.go b/exporter/prometheusremotewriteexporter/internal/metadata/generated_telemetry_test.go index bfcc2f51f273..8d1a898b5da1 100644 --- a/exporter/prometheusremotewriteexporter/internal/metadata/generated_telemetry_test.go +++ b/exporter/prometheusremotewriteexporter/internal/metadata/generated_telemetry_test.go @@ -14,6 +14,7 @@ import ( nooptrace "go.opentelemetry.io/otel/trace/noop" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" ) type mockMeter struct { @@ -49,28 +50,25 @@ func TestProviders(t *testing.T) { meter := Meter(set) if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/prometheusremotewrite", m.name) + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter", m.name) } else { require.Fail(t, "returned Meter not mockMeter") } tracer := Tracer(set) if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/prometheusremotewrite", m.name) + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter", m.name) } else { require.Fail(t, "returned Meter not mockTracer") } } func TestNewTelemetryBuilder(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } + set := componenttest.NewNopTelemetrySettings() applied := false - _, err := NewTelemetryBuilder(set, func(b *TelemetryBuilder) { + _, err := NewTelemetryBuilder(set, telemetryBuilderOptionFunc(func(b *TelemetryBuilder) { applied = true - }) + })) require.NoError(t, err) require.True(t, applied) } diff --git a/exporter/prometheusremotewriteexporter/metadata.yaml b/exporter/prometheusremotewriteexporter/metadata.yaml index 492aaacc1d66..9d9ab6f8bb2d 100644 --- a/exporter/prometheusremotewriteexporter/metadata.yaml +++ b/exporter/prometheusremotewriteexporter/metadata.yaml @@ -1,5 +1,4 @@ type: prometheusremotewrite -scope_name: otelcol/prometheusremotewrite status: class: exporter @@ -7,7 +6,7 @@ status: beta: [metrics] distributions: [core, contrib] codeowners: - active: [Aneurysm9, rapphil] + active: [Aneurysm9, rapphil, dashpole, ArthurSens] tests: expect_consumer_error: true @@ -17,14 +16,14 @@ telemetry: exporter_prometheusremotewrite_failed_translations: enabled: true description: Number of translation operations that failed to translate metrics from Otel to Prometheus - unit: 1 + unit: "1" sum: value_type: int monotonic: true exporter_prometheusremotewrite_translated_time_series: enabled: true description: Number of Prometheus time series that were translated from OTel metrics - unit: 1 + unit: "1" sum: value_type: int monotonic: true diff --git a/exporter/prometheusremotewriteexporter/testdata/config.yaml b/exporter/prometheusremotewriteexporter/testdata/config.yaml index 4bd9b2bf11ff..7ea0bdf3e3b1 100644 --- a/exporter/prometheusremotewriteexporter/testdata/config.yaml +++ b/exporter/prometheusremotewriteexporter/testdata/config.yaml @@ -14,7 +14,7 @@ prometheusremotewrite/2: add_metric_suffixes: false headers: Prometheus-Remote-Write-Version: "0.1.0" - X-Scope-OrgID: 234 + X-Scope-OrgID: "234" external_labels: key1: value1 key2: value2 diff --git a/exporter/prometheusremotewriteexporter/testutil_test.go b/exporter/prometheusremotewriteexporter/testutil_test.go index eada2d8b30f6..02e1167164c3 100644 --- a/exporter/prometheusremotewriteexporter/testutil_test.go +++ b/exporter/prometheusremotewriteexporter/testutil_test.go @@ -321,7 +321,8 @@ func getExpHistogramMetric( } func getHistogramMetric(name string, attributes pcommon.Map, ts uint64, sum *float64, count uint64, bounds []float64, - buckets []uint64) pmetric.Metric { + buckets []uint64, +) pmetric.Metric { metric := pmetric.NewMetric() metric.SetName(name) metric.SetEmptyHistogram().SetAggregationTemporality(pmetric.AggregationTemporalityCumulative) diff --git a/exporter/pulsarexporter/README.md b/exporter/pulsarexporter/README.md index 5db5064bfd78..87a090977918 100644 --- a/exporter/pulsarexporter/README.md +++ b/exporter/pulsarexporter/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fpulsar%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fpulsar) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fpulsar%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fpulsar) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@dmitryax](https://www.github.com/dmitryax), [@dao-jun](https://www.github.com/dao-jun) | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib @@ -49,21 +49,21 @@ The following settings can be optionally configured: - `hashing_scheme`: used to define the partition on where to publish a particular message. Can be set to `java_string_hash` (default) or `murmur3_32hash`. - `compression_level`: one of 'default' (default), 'faster', or 'better'. - `compression_type`: one of 'none' (default), 'lz4', 'zlib', or 'zstd'. - - `max_pending_messages"`: specifies the max size of the queue holding the messages pending to receive an acknowledgment from the broker. - - `batch_builder_type"`: one of 'default' (default) or 'key_based'. - - `partitions_auto_discovery_interval"`: the time interval for the background process to discover new partitions - - `batching_max_publish_delay"`: specifies the time period within which the messages sent will be batched (default: 10ms) - - `batching_max_messages"`: specifies the maximum number of messages permitted in a batch. (default: 1000) - - `batching_max_size"`: specifies the maximum number of bytes permitted in a batch. (default 128 KB) - - `disable_block_if_queue_full"`: controls whether Send and SendAsync block if producer's message queue is full. Defaults to false. - - `disable_batching"`: controls whether automatic batching of messages is enabled for the producer. Defaults to false. + - `max_pending_messages`: specifies the max size of the queue holding the messages pending to receive an acknowledgment from the broker. + - `batch_builder_type`: one of 'default' (default) or 'key_based'. + - `partitions_auto_discovery_interval`: the time interval for the background process to discover new partitions + - `batching_max_publish_delay`: specifies the time period within which the messages sent will be batched (default: 10ms) + - `batching_max_messages`: specifies the maximum number of messages permitted in a batch. (default: 1000) + - `batching_max_size`: specifies the maximum number of bytes permitted in a batch. (default 128 KB) + - `disable_block_if_queue_full`: controls whether Send and SendAsync block if producer's message queue is full. Defaults to false. + - `disable_batching`: controls whether automatic batching of messages is enabled for the producer. Defaults to false. - `tls_trust_certs_file_path`: path to the CA cert. For a client this verifies the server certificate. Should only be used if `insecure` is set to true. - `tls_allow_insecure_connection`: configure whether the Pulsar client accept untrusted TLS certificate from broker (default: false) - `timeout`: send pulsar message timeout (default: 5s) - `operation_timeout`: sets producer-create, subscribe and unsubscribe operations timeout (default: 30 seconds) - `connection_timeout`: timeout for the establishment of a TCP connection (default: 5 seconds) -- `map_connections_per_broker`: max number of connections to a single broker that will kept in the pool. (default: 1 connection) +- `max_connections_per_broker`: max number of connections to a single broker that will kept in the pool. (default: 1 connection) - `retry_on_failure` - `enabled` (default = true) - `initial_interval` (default = 5s): Time to wait after the first failure before retrying; ignored if `enabled` is `false` diff --git a/exporter/pulsarexporter/config.go b/exporter/pulsarexporter/config.go index 8bc9d557ecc9..ea1a45faab1d 100644 --- a/exporter/pulsarexporter/config.go +++ b/exporter/pulsarexporter/config.go @@ -16,9 +16,9 @@ import ( // Config defines configuration for Pulsar exporter. type Config struct { - exporterhelper.TimeoutSettings `mapstructure:",squash"` - exporterhelper.QueueSettings `mapstructure:"sending_queue"` - configretry.BackOffConfig `mapstructure:"retry_on_failure"` + TimeoutSettings exporterhelper.TimeoutConfig `mapstructure:",squash"` + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` + configretry.BackOffConfig `mapstructure:"retry_on_failure"` // Endpoint of pulsar broker (default "pulsar://localhost:6650") Endpoint string `mapstructure:"endpoint"` @@ -35,7 +35,7 @@ type Config struct { Authentication Authentication `mapstructure:"auth"` OperationTimeout time.Duration `mapstructure:"operation_timeout"` ConnectionTimeout time.Duration `mapstructure:"connection_timeout"` - MaxConnectionsPerBroker int `mapstructure:"map_connections_per_broker"` + MaxConnectionsPerBroker int `mapstructure:"max_connections_per_broker"` } type Authentication struct { @@ -90,7 +90,6 @@ var _ component.Config = (*Config)(nil) // Validate checks if the exporter configuration is valid func (cfg *Config) Validate() error { - return nil } @@ -145,7 +144,7 @@ func (cfg *Config) clientOptions() pulsar.ClientOptions { func (cfg *Config) getProducerOptions() pulsar.ProducerOptions { producerOptions := pulsar.ProducerOptions{ Topic: cfg.Topic, - SendTimeout: cfg.Timeout, + SendTimeout: cfg.TimeoutSettings.Timeout, BatcherBuilderType: cfg.Producer.BatcherBuilderType.ToPulsar(), BatchingMaxMessages: cfg.Producer.BatchingMaxMessages, BatchingMaxPublishDelay: cfg.Producer.BatchingMaxPublishDelay, diff --git a/exporter/pulsarexporter/config_test.go b/exporter/pulsarexporter/config_test.go index bd43784cc546..02cef15496a2 100644 --- a/exporter/pulsarexporter/config_test.go +++ b/exporter/pulsarexporter/config_test.go @@ -33,7 +33,7 @@ func TestLoadConfig(t *testing.T) { { id: component.NewIDWithName(metadata.Type, ""), expected: &Config{ - TimeoutSettings: exporterhelper.TimeoutSettings{ + TimeoutSettings: exporterhelper.TimeoutConfig{ Timeout: 20 * time.Second, }, BackOffConfig: configretry.BackOffConfig{ @@ -44,7 +44,7 @@ func TestLoadConfig(t *testing.T) { RandomizationFactor: backoff.DefaultRandomizationFactor, Multiplier: backoff.DefaultMultiplier, }, - QueueSettings: exporterhelper.QueueSettings{ + QueueSettings: exporterhelper.QueueConfig{ Enabled: true, NumConsumers: 2, QueueSize: 10, @@ -82,7 +82,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) @@ -98,7 +98,7 @@ func TestClientOptions(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) options := cfg.(*Config).clientOptions() @@ -110,5 +110,4 @@ func TestClientOptions(t *testing.T) { OperationTimeout: 30 * time.Second, MaxConnectionsPerBroker: 1, }, &options) - } diff --git a/exporter/pulsarexporter/factory.go b/exporter/pulsarexporter/factory.go index d66cf9188568..0ea0ac6757c1 100644 --- a/exporter/pulsarexporter/factory.go +++ b/exporter/pulsarexporter/factory.go @@ -59,9 +59,9 @@ func NewFactory(options ...FactoryOption) exporter.Factory { func createDefaultConfig() component.Config { return &Config{ - TimeoutSettings: exporterhelper.NewDefaultTimeoutSettings(), + TimeoutSettings: exporterhelper.NewDefaultTimeoutConfig(), BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), Endpoint: defaultBroker, // using an empty topic to track when it has not been set by user, default is based on traces or metrics. Topic: "", @@ -81,7 +81,7 @@ type pulsarExporterFactory struct { func (f *pulsarExporterFactory) createTracesExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exporter.Traces, error) { oCfg := *(cfg.(*Config)) @@ -95,7 +95,7 @@ func (f *pulsarExporterFactory) createTracesExporter( if err != nil { return nil, err } - return exporterhelper.NewTracesExporter( + return exporterhelper.NewTraces( ctx, set, cfg, @@ -103,7 +103,7 @@ func (f *pulsarExporterFactory) createTracesExporter( exporterhelper.WithCapabilities(consumer.Capabilities{MutatesData: false}), // Disable exporterhelper Timeout, because we cannot pass a Context to the Producer, // and will rely on the Pulsar Producer Timeout logic. - exporterhelper.WithTimeout(exporterhelper.TimeoutSettings{Timeout: 0}), + exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}), exporterhelper.WithRetry(oCfg.BackOffConfig), exporterhelper.WithQueue(oCfg.QueueSettings), exporterhelper.WithStart(exp.start), @@ -112,7 +112,7 @@ func (f *pulsarExporterFactory) createTracesExporter( func (f *pulsarExporterFactory) createMetricsExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exporter.Metrics, error) { oCfg := *(cfg.(*Config)) @@ -126,7 +126,7 @@ func (f *pulsarExporterFactory) createMetricsExporter( if err != nil { return nil, err } - return exporterhelper.NewMetricsExporter( + return exporterhelper.NewMetrics( ctx, set, cfg, @@ -134,7 +134,7 @@ func (f *pulsarExporterFactory) createMetricsExporter( exporterhelper.WithCapabilities(consumer.Capabilities{MutatesData: false}), // Disable exporterhelper Timeout, because we cannot pass a Context to the Producer, // and will rely on the sarama Pulsar Timeout logic. - exporterhelper.WithTimeout(exporterhelper.TimeoutSettings{Timeout: 0}), + exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}), exporterhelper.WithRetry(oCfg.BackOffConfig), exporterhelper.WithQueue(oCfg.QueueSettings), exporterhelper.WithStart(exp.start), @@ -143,7 +143,7 @@ func (f *pulsarExporterFactory) createMetricsExporter( func (f *pulsarExporterFactory) createLogsExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exporter.Logs, error) { oCfg := *(cfg.(*Config)) @@ -157,7 +157,7 @@ func (f *pulsarExporterFactory) createLogsExporter( if err != nil { return nil, err } - return exporterhelper.NewLogsExporter( + return exporterhelper.NewLogs( ctx, set, cfg, @@ -165,7 +165,7 @@ func (f *pulsarExporterFactory) createLogsExporter( exporterhelper.WithCapabilities(consumer.Capabilities{MutatesData: false}), // Disable exporterhelper Timeout, because we cannot pass a Context to the Producer, // and will rely on the Pulsar Producer Timeout logic. - exporterhelper.WithTimeout(exporterhelper.TimeoutSettings{Timeout: 0}), + exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}), exporterhelper.WithRetry(oCfg.BackOffConfig), exporterhelper.WithQueue(oCfg.QueueSettings), exporterhelper.WithStart(exp.start), diff --git a/exporter/pulsarexporter/factory_test.go b/exporter/pulsarexporter/factory_test.go index 186542c706df..a4e2b40bcb3e 100644 --- a/exporter/pulsarexporter/factory_test.go +++ b/exporter/pulsarexporter/factory_test.go @@ -18,19 +18,19 @@ import ( func Test_createDefaultConfig(t *testing.T) { cfg := createDefaultConfig() - assert.Equal(t, cfg, &Config{ - TimeoutSettings: exporterhelper.NewDefaultTimeoutSettings(), + assert.Equal(t, &Config{ + TimeoutSettings: exporterhelper.NewDefaultTimeoutConfig(), BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), Endpoint: defaultBroker, - // using an empty topic to track when it has not been set by user, default is based on traces or metrics. + Topic: "", Encoding: defaultEncoding, Authentication: Authentication{}, MaxConnectionsPerBroker: 1, ConnectionTimeout: 5 * time.Second, OperationTimeout: 30 * time.Second, - }) + }, cfg) } func TestWithTracesMarshalers_err(t *testing.T) { @@ -39,42 +39,42 @@ func TestWithTracesMarshalers_err(t *testing.T) { tracesMarshaler := &customTraceMarshaler{encoding: "unknown"} f := NewFactory(withTracesMarshalers(tracesMarshaler)) - r, err := f.CreateTracesExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + r, err := f.CreateTraces(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = r.Start(context.Background(), componenttest.NewNopHost()) // no available broker require.Error(t, err) } -func TestCreateTracesExporter_err(t *testing.T) { +func TestCreateTraces_err(t *testing.T) { cfg := createDefaultConfig().(*Config) cfg.Endpoint = "" f := pulsarExporterFactory{tracesMarshalers: tracesMarshalers()} - r, err := f.createTracesExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + r, err := f.createTracesExporter(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = r.Start(context.Background(), componenttest.NewNopHost()) // no available broker require.Error(t, err) } -func TestCreateMetricsExporter_err(t *testing.T) { +func TestCreateMetrics_err(t *testing.T) { cfg := createDefaultConfig().(*Config) cfg.Endpoint = "" mf := pulsarExporterFactory{metricsMarshalers: metricsMarshalers()} - r, err := mf.createMetricsExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + r, err := mf.createMetricsExporter(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = r.Start(context.Background(), componenttest.NewNopHost()) require.Error(t, err) } -func TestCreateLogsExporter_err(t *testing.T) { +func TestCreateLogs_err(t *testing.T) { cfg := createDefaultConfig().(*Config) cfg.Endpoint = "" mf := pulsarExporterFactory{logsMarshalers: logsMarshalers()} - r, err := mf.createLogsExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + r, err := mf.createLogsExporter(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = r.Start(context.Background(), componenttest.NewNopHost()) require.Error(t, err) diff --git a/exporter/pulsarexporter/generated_component_test.go b/exporter/pulsarexporter/generated_component_test.go index ad68227530d8..baf8216121de 100644 --- a/exporter/pulsarexporter/generated_component_test.go +++ b/exporter/pulsarexporter/generated_component_test.go @@ -32,27 +32,27 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, { name: "metrics", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg) }, }, { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -64,9 +64,9 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) diff --git a/exporter/pulsarexporter/go.mod b/exporter/pulsarexporter/go.mod index 1ff664f8e03b..b95afcac0361 100644 --- a/exporter/pulsarexporter/go.mod +++ b/exporter/pulsarexporter/go.mod @@ -1,94 +1,105 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/pulsarexporter -go 1.21.0 +go 1.22.0 require ( - github.com/apache/pulsar-client-go v0.8.1 + github.com/apache/pulsar-client-go v0.14.0 github.com/cenkalti/backoff/v4 v4.3.0 github.com/gogo/protobuf v1.3.2 - github.com/jaegertracing/jaeger v1.57.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/jaegertracing/jaeger v1.62.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/semconv v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 ) require ( - github.com/99designs/keyring v1.1.6 // indirect + github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect + github.com/99designs/keyring v1.2.1 // indirect github.com/AthenZ/athenz v1.10.39 // indirect github.com/DataDog/zstd v1.5.0 // indirect - github.com/apache/pulsar-client-go/oauth2 v0.0.0-20220120090717-25e59572242e // indirect - github.com/apache/thrift v0.20.0 // indirect + github.com/apache/thrift v0.21.0 // indirect github.com/ardielle/ardielle-go v1.5.2 // indirect github.com/beorn7/perks v1.0.1 // indirect + github.com/bits-and-blooms/bitset v1.4.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/danieljoos/wincred v1.0.2 // indirect + github.com/danieljoos/wincred v1.1.2 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dvsekhvalnov/jose2go v1.6.0 // indirect github.com/frankban/quicktest v1.14.3 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect - github.com/golang-jwt/jwt v3.2.2+incompatible // indirect + github.com/golang-jwt/jwt/v5 v5.2.1 // indirect github.com/golang/protobuf v1.5.4 // indirect - github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.6.0 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect + github.com/hamba/avro/v2 v2.25.1 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/compress v1.17.10 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect - github.com/linkedin/goavro/v2 v2.9.8 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mtibben/percent v0.2.1 // indirect - github.com/nxadm/tail v1.4.8 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pierrec/lz4 v2.6.1+incompatible // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect + github.com/prometheus/client_golang v1.20.4 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect + github.com/prometheus/common v0.60.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/atomic v1.11.0 // indirect - golang.org/x/crypto v0.23.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/oauth2 v0.18.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/term v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/mod v0.20.0 // indirect + golang.org/x/net v0.30.0 // indirect + golang.org/x/oauth2 v0.23.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.25.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/pulsarexporter/go.sum b/exporter/pulsarexporter/go.sum index 4735febbd36a..1deb5dadf95c 100644 --- a/exporter/pulsarexporter/go.sum +++ b/exporter/pulsarexporter/go.sum @@ -1,280 +1,121 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/99designs/keyring v1.1.6 h1:kVDC2uCgVwecxCk+9zoCt2uEL6dt+dfVzMvGgnVcIuM= -github.com/99designs/keyring v1.1.6/go.mod h1:16e0ds7LGQQcT59QqkTg72Hh5ShM51Byv5PEmW6uoRU= +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= +github.com/99designs/keyring v1.2.1 h1:tYLp1ULvO7i3fI5vE21ReQuj99QFSs7lGm0xWyJo87o= +github.com/99designs/keyring v1.2.1/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= github.com/AthenZ/athenz v1.10.39 h1:mtwHTF/v62ewY2Z5KWhuZgVXftBej1/Tn80zx4DcawY= github.com/AthenZ/athenz v1.10.39/go.mod h1:3Tg8HLsiQZp81BJY58JBeU2BR6B/H4/0MQGfCwhHNEA= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/zstd v1.5.0 h1:+K/VEwIAaPcHiMtQvpLD4lqW7f0Gk3xdYZmI1hD+CXo= github.com/DataDog/zstd v1.5.0/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/pulsar-client-go v0.8.1 h1:UZINLbH3I5YtNzqkju7g9vrl4CKrEgYSx2rbpvGufrE= -github.com/apache/pulsar-client-go v0.8.1/go.mod h1:yJNcvn/IurarFDxwmoZvb2Ieylg630ifxeO/iXpk27I= -github.com/apache/pulsar-client-go/oauth2 v0.0.0-20220120090717-25e59572242e h1:EqiJ0Xil8NmcXyupNqXV9oYDBeWntEIegxLahrTr8DY= -github.com/apache/pulsar-client-go/oauth2 v0.0.0-20220120090717-25e59572242e/go.mod h1:Xee4tgYLFpYcPMcTfBYWE1uKRzeciodGTSEDMzsR6i8= -github.com/apache/thrift v0.20.0 h1:631+KvYbsBZxmuJjYwhezVsrfc/TbqtZV4QcxOX1fOI= -github.com/apache/thrift v0.20.0/go.mod h1:hOk1BQqcp2OLzGsyVXdfMk7YFlMxK3aoEVhjD06QhB8= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/apache/pulsar-client-go v0.14.0 h1:P7yfAQhQ52OCAu8yVmtdbNQ81vV8bF54S2MLmCPJC9w= +github.com/apache/pulsar-client-go v0.14.0/go.mod h1:PNUE29x9G1EHMvm41Bs2vcqwgv7N8AEjeej+nEVYbX8= +github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE= +github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw= github.com/ardielle/ardielle-go v1.5.2 h1:TilHTpHIQJ27R1Tl/iITBzMwiUGSlVfiVhwDNGM3Zj4= github.com/ardielle/ardielle-go v1.5.2/go.mod h1:I4hy1n795cUhaVt/ojz83SNVCYIGsAFAONtv2Dr7HUI= github.com/ardielle/ardielle-tools v1.5.4/go.mod h1:oZN+JRMnqGiIhrzkRN9l26Cej9dEx4jeNG6A+AdkShk= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aws/aws-sdk-go v1.32.6/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/beefsack/go-rate v0.0.0-20220214233405-116f4ca011a0/go.mod h1:6YNgTHLutezwnBvyneBbwvB8C82y3dcoOj5EQJIdGXA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= 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/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/bmizerany/perks v0.0.0-20141205001514-d9a9656a3a4b/go.mod h1:ac9efd0D1fsDb3EJvhqgXRbFx7bs2wqZ10HQPeU8U/Q= +github.com/bits-and-blooms/bitset v1.4.0 h1:+YZ8ePm+He2pU3dZlIZiOeAKfrBkXi1lSrXJ/Xzgbu8= +github.com/bits-and-blooms/bitset v1.4.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= +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/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/danieljoos/wincred v1.0.2 h1:zf4bhty2iLuwgjgpraD2E9UbvO+fe54XXGJbOwe23fU= -github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= +github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= +github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dimfeld/httptreemux v5.0.1+incompatible h1:Qj3gVcDNoOthBAqftuD596rm4wg/adLLz5xh5CmpiCA= github.com/dimfeld/httptreemux v5.0.1+incompatible/go.mod h1:rbUlSV+CCpv/SuqUTP/8Bk2O3LyUV436/yaRGkhP6Z0= -github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/docker v27.3.1+incompatible h1:KttF0XoteNTicmUtBO0L2tP+J7FGRFTjaEF4k6WdhfI= +github.com/docker/docker v27.3.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dvsekhvalnov/jose2go v1.6.0 h1:Y9gnSnP4qEI0+/uQkHvFXeD2PLPJeXEL+ySMEA2EjTY= github.com/dvsekhvalnov/jose2go v1.6.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hamba/avro/v2 v2.25.1 h1:t8cOyv0wkNAPF6/khArMtR0nK9HtGa+WKbp9q+KdFZQ= +github.com/hamba/avro/v2 v2.25.1/go.mod h1:I8glyswHnpED3Nlx2ZdUe+4LJnCOOyiCzLMno9i/Uu0= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jaegertracing/jaeger v1.57.0 h1:3wDtUUPs6NRYH7+d+y8MilDkLHdpPrVlQ2wbcsA62bs= -github.com/jaegertracing/jaeger v1.57.0/go.mod h1:p/1fxIU9hKHl7qEhKC72p2ZYVhvvZvNB73y6V7YyuTs= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/jaegertracing/jaeger v1.62.0 h1:YoaJ2e8oVz5sqGGlVAKSUCED8DzJ1q7PojBmZFNKoJA= +github.com/jaegertracing/jaeger v1.62.0/go.mod h1:jhEIHazwyb+a6xlRBi+p96BAvTYTSmGkghcwdQfV7FM= github.com/jawher/mow.cli v1.0.4/go.mod h1:5hQj2V8g+qYmLUVWqu4Wuja1pI57M83EChYLVZ0sMKk= github.com/jawher/mow.cli v1.2.0/go.mod h1:y+pcA3jBAdo/GIZx/0rFjw/K2bVEODP9rfZOfaiq8Ko= github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= 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/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d h1:Z+RDyXzjKE0i2sTjZ/b1uxiGtPhFy34Ou/Tk0qwN0kM= -github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d/go.mod h1:JJNrCn9otv/2QP4D7SMJBgaleKpOf66PnW6F5WGNRIc= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.10.8/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.10 h1:oXAz+Vh0PMUvJczoi+flxpnBEPxoER1IaAnU/NMPtT0= +github.com/klauspost/compress v1.17.10/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= @@ -284,557 +125,226 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/linkedin/goavro/v2 v2.9.8 h1:jN50elxBsGBDGVDEKqUlDuU1cFwJ11K/yrJCBMe/7Wg= -github.com/linkedin/goavro/v2 v2.9.8/go.mod h1:UgQUb2N/pmueQYH9bfqFioWxzYCZXSfF8Jw03O5sjqA= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c h1:VtwQ41oftZwlMnOEbMWQtSEUgU64U4s+GHk7hZK+jtY= +github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c h1:cqn374mizHuIWj+OSJCajGr/phAmuMug9qIX3l9CflE= +github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= +github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= +github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= +github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= +github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= +github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= +github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM= github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c h1:NRoLoZvkBTKvR5gQLgA3e0hqjkY9u1wm+iOL45VN/qI= +github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_golang v1.20.4 h1:Tgh3Yr67PaOv/uTqloMsCEdeuFTatm5zIq5+qNN23vI= +github.com/prometheus/client_golang v1.20.4/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/prometheus/common v0.60.0 h1:+V9PAREWNvJMAuJ1x1BaWl9dewMW4YrHZQbx0sJNllA= +github.com/prometheus/common v0.60.0/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI= +github.com/shirou/gopsutil/v3 v3.24.5/go.mod h1:bsoOS1aStSs9ErQ1WWfxllSeS1K5D+U30r2NfcubMVk= +github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/testcontainers/testcontainers-go v0.34.0 h1:5fbgF0vIN5u+nD3IWabQwRybuB4GY8G2HHgCkbMzMHo= +github.com/testcontainers/testcontainers-go v0.34.0/go.mod h1:6P/kMkQe8yqPHfPWNulFGdFHTD8HB2vLq/231xY2iPQ= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/collector v0.111.0 h1:D3LJTYrrK2ac94E2PXPSbVkArqxbklbCLsE4MAJQdRo= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 h1:ZIg3ZT/aQ7AfKqdwp7ECpOK6vHqquXXuyTjIO8ZdmPs= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0/go.mod h1:DQAwmETtZV00skUwgD6+0U89g80NKsJE3DCKeLLPQMI= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0= +golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= -golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= +golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -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-20191120155948-bd437916bb0e/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= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24= +golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -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-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-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -842,32 +352,17 @@ gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -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/exporter/pulsarexporter/internal/metadata/generated_status.go b/exporter/pulsarexporter/internal/metadata/generated_status.go index bc94fc9eb492..ab93e649d626 100644 --- a/exporter/pulsarexporter/internal/metadata/generated_status.go +++ b/exporter/pulsarexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("pulsar") + Type = component.MustNewType("pulsar") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/pulsarexporter" ) const ( diff --git a/exporter/pulsarexporter/internal/metadata/generated_telemetry.go b/exporter/pulsarexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index 94d35fd7edcc..000000000000 --- a/exporter/pulsarexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/pulsar") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/pulsar") -} diff --git a/exporter/pulsarexporter/internal/metadata/generated_telemetry_test.go b/exporter/pulsarexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 1da39df613f4..000000000000 --- a/exporter/pulsarexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/pulsar", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/pulsar", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/pulsarexporter/jaeger_marshaler.go b/exporter/pulsarexporter/jaeger_marshaler.go index 79a927a12f2e..26f7e449e5da 100644 --- a/exporter/pulsarexporter/jaeger_marshaler.go +++ b/exporter/pulsarexporter/jaeger_marshaler.go @@ -22,10 +22,7 @@ type jaegerMarshaler struct { var _ TracesMarshaler = (*jaegerMarshaler)(nil) func (j jaegerMarshaler) Marshal(traces ptrace.Traces, _ string) ([]*pulsar.ProducerMessage, error) { - batches, err := jaeger.ProtoFromTraces(traces) - if err != nil { - return nil, err - } + batches := jaeger.ProtoFromTraces(traces) var errs error messages := make([]*pulsar.ProducerMessage, 0, len(batches)) @@ -54,8 +51,7 @@ type jaegerBatchMarshaler interface { encoding() string } -type jaegerProtoBatchMarshaler struct { -} +type jaegerProtoBatchMarshaler struct{} var _ jaegerBatchMarshaler = (*jaegerProtoBatchMarshaler)(nil) diff --git a/exporter/pulsarexporter/jaeger_marshaler_test.go b/exporter/pulsarexporter/jaeger_marshaler_test.go index e4fb6d06e948..4df974bac0f2 100644 --- a/exporter/pulsarexporter/jaeger_marshaler_test.go +++ b/exporter/pulsarexporter/jaeger_marshaler_test.go @@ -30,8 +30,7 @@ func buildTraces() ptrace.Traces { func TestJaegerJsonBatchMarshaler(t *testing.T) { ptraces := buildTraces() - batches, err := jaeger.ProtoFromTraces(ptraces) - require.NoError(t, err) + batches := jaeger.ProtoFromTraces(ptraces) jsonMarshaler := &jsonpb.Marshaler{} buffer := new(bytes.Buffer) @@ -43,13 +42,12 @@ func TestJaegerJsonBatchMarshaler(t *testing.T) { } jaegerJSONMessages, err := jaegerJSONMarshaler.Marshal(ptraces, "") require.NoError(t, err) - assert.Equal(t, jaegerJSONMessages[0].Payload, jsonBytes) + assert.JSONEq(t, string(jaegerJSONMessages[0].Payload), string(jsonBytes)) } func TestJaegerProtoBatchMarshaler(t *testing.T) { ptraces := buildTraces() - batches, err := jaeger.ProtoFromTraces(ptraces) - require.NoError(t, err) + batches := jaeger.ProtoFromTraces(ptraces) jaegerProtoBytes, err := batches[0].Marshal() require.NoError(t, err) diff --git a/exporter/pulsarexporter/marshaler_test.go b/exporter/pulsarexporter/marshaler_test.go index 318dd7b580b7..d84f69c89e02 100644 --- a/exporter/pulsarexporter/marshaler_test.go +++ b/exporter/pulsarexporter/marshaler_test.go @@ -13,7 +13,7 @@ import ( "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" ) func TestDefaultTracesMarshalers(t *testing.T) { @@ -102,7 +102,7 @@ func TestOTLPTracesJsonMarshaling(t *testing.T) { // Since marshaling json is not guaranteed to be in order // within a string, using a map to compare that the expected values are there - expectedJSON := map[string]any{ + expectedMap := map[string]any{ "resourceSpans": []any{ map[string]any{ "resource": map[string]any{}, @@ -133,5 +133,5 @@ func TestOTLPTracesJsonMarshaling(t *testing.T) { err = json.Unmarshal(payload, &final) require.NoError(t, err, "Must not error marshaling expected data") - assert.Equal(t, expectedJSON, final, "Must match the expected value") + assert.Equal(t, expectedMap, final, "Must match the expected value") } diff --git a/exporter/pulsarexporter/metadata.yaml b/exporter/pulsarexporter/metadata.yaml index 97491eced1e2..23305097e7b3 100644 --- a/exporter/pulsarexporter/metadata.yaml +++ b/exporter/pulsarexporter/metadata.yaml @@ -1,5 +1,4 @@ type: pulsar -scope_name: otelcol/pulsar status: class: exporter diff --git a/exporter/pulsarexporter/pulsar_exporter.go b/exporter/pulsarexporter/pulsar_exporter.go index 7a473a612235..6d3b8aea956f 100644 --- a/exporter/pulsarexporter/pulsar_exporter.go +++ b/exporter/pulsarexporter/pulsar_exporter.go @@ -37,13 +37,11 @@ func (e *PulsarTracesProducer) tracesPusher(ctx context.Context, td ptrace.Trace var errs error for _, message := range messages { - e.producer.SendAsync(ctx, message, func(_ pulsar.MessageID, _ *pulsar.ProducerMessage, err error) { if err != nil { errs = multierr.Append(errs, err) } }) - } return errs @@ -85,13 +83,11 @@ func (e *PulsarMetricsProducer) metricsDataPusher(ctx context.Context, md pmetri var errs error for _, message := range messages { - e.producer.SendAsync(ctx, message, func(_ pulsar.MessageID, _ *pulsar.ProducerMessage, err error) { if err != nil { errs = multierr.Append(errs, err) } }) - } return errs @@ -133,13 +129,11 @@ func (e *PulsarLogsProducer) logsDataPusher(ctx context.Context, ld plog.Logs) e var errs error for _, message := range messages { - e.producer.SendAsync(ctx, message, func(_ pulsar.MessageID, _ *pulsar.ProducerMessage, err error) { if err != nil { errs = multierr.Append(errs, err) } }) - } return errs @@ -168,7 +162,6 @@ func newPulsarProducer(config Config) (pulsar.Client, pulsar.Producer, error) { options := config.clientOptions() client, err := pulsar.NewClient(options) - if err != nil { return nil, nil, err } @@ -176,7 +169,6 @@ func newPulsarProducer(config Config) (pulsar.Client, pulsar.Producer, error) { producerOptions := config.getProducerOptions() producer, err := client.CreateProducer(producerOptions) - if err != nil { return nil, nil, err } @@ -184,7 +176,7 @@ func newPulsarProducer(config Config) (pulsar.Client, pulsar.Producer, error) { return client, producer, nil } -func newMetricsExporter(config Config, set exporter.CreateSettings, marshalers map[string]MetricsMarshaler) (*PulsarMetricsProducer, error) { +func newMetricsExporter(config Config, set exporter.Settings, marshalers map[string]MetricsMarshaler) (*PulsarMetricsProducer, error) { marshaler := marshalers[config.Encoding] if marshaler == nil { return nil, errUnrecognizedEncoding @@ -196,10 +188,9 @@ func newMetricsExporter(config Config, set exporter.CreateSettings, marshalers m marshaler: marshaler, logger: set.Logger, }, nil - } -func newTracesExporter(config Config, set exporter.CreateSettings, marshalers map[string]TracesMarshaler) (*PulsarTracesProducer, error) { +func newTracesExporter(config Config, set exporter.Settings, marshalers map[string]TracesMarshaler) (*PulsarTracesProducer, error) { marshaler := marshalers[config.Encoding] if marshaler == nil { return nil, errUnrecognizedEncoding @@ -212,7 +203,7 @@ func newTracesExporter(config Config, set exporter.CreateSettings, marshalers ma }, nil } -func newLogsExporter(config Config, set exporter.CreateSettings, marshalers map[string]LogsMarshaler) (*PulsarLogsProducer, error) { +func newLogsExporter(config Config, set exporter.Settings, marshalers map[string]LogsMarshaler) (*PulsarLogsProducer, error) { marshaler := marshalers[config.Encoding] if marshaler == nil { return nil, errUnrecognizedEncoding @@ -224,5 +215,4 @@ func newLogsExporter(config Config, set exporter.CreateSettings, marshalers map[ marshaler: marshaler, logger: set.Logger, }, nil - } diff --git a/exporter/pulsarexporter/pulsar_exporter_test.go b/exporter/pulsarexporter/pulsar_exporter_test.go index e126545c214c..0d37c4602367 100644 --- a/exporter/pulsarexporter/pulsar_exporter_test.go +++ b/exporter/pulsarexporter/pulsar_exporter_test.go @@ -19,29 +19,28 @@ import ( func TestNewMetricsExporter_err_encoding(t *testing.T) { c := Config{Encoding: "bar"} - mexp, err := newMetricsExporter(c, exportertest.NewNopCreateSettings(), metricsMarshalers()) + mexp, err := newMetricsExporter(c, exportertest.NewNopSettings(), metricsMarshalers()) assert.EqualError(t, err, errUnrecognizedEncoding.Error()) assert.Nil(t, mexp) } func TestNewMetricsExporter_err_traces_encoding(t *testing.T) { c := Config{Encoding: "jaeger_proto"} - mexp, err := newMetricsExporter(c, exportertest.NewNopCreateSettings(), metricsMarshalers()) + mexp, err := newMetricsExporter(c, exportertest.NewNopSettings(), metricsMarshalers()) assert.EqualError(t, err, errUnrecognizedEncoding.Error()) assert.Nil(t, mexp) - } func TestNewLogsExporter_err_encoding(t *testing.T) { c := Config{Encoding: "bar"} - mexp, err := newLogsExporter(c, exportertest.NewNopCreateSettings(), logsMarshalers()) + mexp, err := newLogsExporter(c, exportertest.NewNopSettings(), logsMarshalers()) assert.EqualError(t, err, errUnrecognizedEncoding.Error()) assert.Nil(t, mexp) } func TestNewLogsExporter_err_traces_encoding(t *testing.T) { c := Config{Encoding: "jaeger_proto"} - mexp, err := newLogsExporter(c, exportertest.NewNopCreateSettings(), logsMarshalers()) + mexp, err := newLogsExporter(c, exportertest.NewNopSettings(), logsMarshalers()) assert.EqualError(t, err, errUnrecognizedEncoding.Error()) assert.Nil(t, mexp) } @@ -80,6 +79,8 @@ type mockProducer struct { name string } +var _ pulsar.Producer = (*mockProducer)(nil) + func (c *mockProducer) Topic() string { return c.topic } @@ -93,7 +94,6 @@ func (c *mockProducer) Send(context.Context, *pulsar.ProducerMessage) (pulsar.Me } func (c *mockProducer) SendAsync(context.Context, *pulsar.ProducerMessage, func(pulsar.MessageID, *pulsar.ProducerMessage, error)) { - } func (c *mockProducer) LastSequenceID() int64 { @@ -104,5 +104,9 @@ func (c *mockProducer) Flush() error { return nil } +func (c *mockProducer) FlushWithCtx(context.Context) error { + return nil +} + func (c *mockProducer) Close() { } diff --git a/exporter/rabbitmqexporter/README.md b/exporter/rabbitmqexporter/README.md index c2929d117935..ffe73861049b 100644 --- a/exporter/rabbitmqexporter/README.md +++ b/exporter/rabbitmqexporter/README.md @@ -2,12 +2,13 @@ | Status | | | ------------- |-----------| -| Stability | [development]: traces, metrics, logs | -| Distributions | [] | +| Stability | [alpha]: traces, metrics, logs | +| Distributions | [contrib] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Frabbitmq%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Frabbitmq) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Frabbitmq%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Frabbitmq) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@swar8080](https://www.github.com/swar8080), [@atoulme](https://www.github.com/atoulme) | -[development]: https://github.com/open-telemetry/opentelemetry-collector#development +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha +[contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib Exports metrics, traces, and logs to [RabbitMQ](https://www.rabbitmq.com/) using the AMQP 0.9.1 protocol. @@ -20,35 +21,36 @@ This component expects that exchanges, queues, and bindings already exist - they The following settings can be configured: - `connection`: - - `endpoint` (required, ex = amqp://localhost:5672): Endpoint to connect to RabbitMQ - - `vhost` (optional): The RabbitMQ [virtual host](https://www.rabbitmq.com/docs/vhosts) to connect to - - `auth`: - - `plain`: Configuration if using SASL PLAIN authentication - - `username` (required): username for authentication - - `password`: password for authentication - - `tls` (optional): [TLS configuration](https://github.com/open-telemetry/opentelemetry-collector/blob/main/config/configtls/configtls.go#L32) - - `routing`: - - `routing_key` (default = otlp_spans for traces, otlp_metrics for metrics, otlp_logs for logs): Routing key used to route exported messages to RabbitMQ consumers - - `exchange`: Name of the exchange used to route messages. If omitted, the [default exchange](https://www.rabbitmq.com/tutorials/amqp-concepts#exchange-default) is used which routes to a queue with the same as the routing key. Only [direct exchanges](https://www.rabbitmq.com/tutorials/amqp-concepts#exchange-direct) are currently supported. Note that this component does not handle queue creation or binding. - - `durable` (default = true): Whether to instruct RabbitMQ to make messages [durable](https://www.rabbitmq.com/docs/queues#durability) by writing to disk - - `encoding_extension`: (defaults to OTLP protobuf format): ID of the [encoding extension](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/extension/encoding) to use to marshal data - - `retry_on_failure`: - - `enabled` (default = false) + - `endpoint` (required, ex = amqp://localhost:5672): Endpoint to connect to RabbitMQ + - `vhost` (optional): The RabbitMQ [virtual host](https://www.rabbitmq.com/docs/vhosts) to connect to + - `auth`: + - `plain`: Configuration if using SASL PLAIN authentication + - `username` (required): username for authentication + - `password`: password for authentication + - `tls` (optional): [TLS configuration](https://github.com/open-telemetry/opentelemetry-collector/blob/main/config/configtls/configtls.go#L32) + - `name` (optional): The name of the connection, visible in in RabbitMQ management interface +- `routing`: + - `routing_key` (default = otlp_spans for traces, otlp_metrics for metrics, otlp_logs for logs): Routing key used to route exported messages to RabbitMQ consumers + - `exchange`: Name of the exchange used to route messages. If omitted, the [default exchange](https://www.rabbitmq.com/tutorials/amqp-concepts#exchange-default) is used which routes to a queue with the same as the routing key. Only [direct exchanges](https://www.rabbitmq.com/tutorials/amqp-concepts#exchange-direct) are currently supported. Note that this component does not handle queue creation or binding. +- `durable` (default = true): Whether to instruct RabbitMQ to make messages [durable](https://www.rabbitmq.com/docs/queues#durability) by writing to disk +- `encoding_extension`: (defaults to OTLP protobuf format): ID of the [encoding extension](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/extension/encoding) to use to marshal data +- `retry_on_failure`: + - `enabled` (default = false) Example config: ```yaml exporters: rabbitmq: - connection: - endpoint: amqp://localhost:5672 - auth: - plain: - username: user - password: pass - encoding_extension: otlp_encoding/rabbitmq + connection: + endpoint: amqp://localhost:5672 + auth: + plain: + username: user + password: pass + encoding_extension: otlp_encoding/rabbitmq extensions: otlp_encoding/rabbitmq: protocol: otlp_json -``` \ No newline at end of file +``` diff --git a/exporter/rabbitmqexporter/config.go b/exporter/rabbitmqexporter/config.go index f3bd7cdee175..6bc095037caa 100644 --- a/exporter/rabbitmqexporter/config.go +++ b/exporter/rabbitmqexporter/config.go @@ -28,6 +28,7 @@ type ConnectionConfig struct { ConnectionTimeout time.Duration `mapstructure:"connection_timeout"` Heartbeat time.Duration `mapstructure:"heartbeat"` PublishConfirmationTimeout time.Duration `mapstructure:"publish_confirmation_timeout"` + Name string `mapstructure:"name"` } type RoutingConfig struct { diff --git a/exporter/rabbitmqexporter/config_test.go b/exporter/rabbitmqexporter/config_test.go index 1c82b113f1bd..503d971a300a 100644 --- a/exporter/rabbitmqexporter/config_test.go +++ b/exporter/rabbitmqexporter/config_test.go @@ -104,7 +104,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) if tt.expected == nil { err = errors.Join(err, component.ValidateConfig(cfg)) diff --git a/exporter/rabbitmqexporter/factory.go b/exporter/rabbitmqexporter/factory.go index b87ced0fe0ec..cf92f55b765e 100644 --- a/exporter/rabbitmqexporter/factory.go +++ b/exporter/rabbitmqexporter/factory.go @@ -16,6 +16,7 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/rabbitmqexporter/internal/metadata" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/rabbitmqexporter/internal/publisher" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/rabbitmq" ) const ( @@ -27,9 +28,9 @@ const ( metricsRoutingKey = "otlp_metrics" logsRoutingKey = "otlp_logs" - spansConnectionName = "otel-collector-spans" - metricsConnectionName = "otel-collector-metrics" - logsConnectionName = "otel-collector-logs" + defaultSpansConnectionName = "otel-collector-spans" + defaultMetricsConnectionName = "otel-collector-metrics" + defaultLogsConnectionName = "otel-collector-logs" ) func NewFactory() exporter.Factory { @@ -59,15 +60,19 @@ func createDefaultConfig() component.Config { func createTracesExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exporter.Traces, error) { config := cfg.(*Config) routingKey := getRoutingKeyOrDefault(config, spansRoutingKey) - r := newRabbitmqExporter(config, set.TelemetrySettings, newPublisherFactory(set), newTLSFactory(config), routingKey, spansConnectionName) + connectionName := defaultSpansConnectionName + if config.Connection.Name != "" { + connectionName = config.Connection.Name + } + r := newRabbitmqExporter(config, set.TelemetrySettings, newPublisherFactory(set), newTLSFactory(config), routingKey, connectionName) - return exporterhelper.NewTracesExporter( + return exporterhelper.NewTraces( ctx, set, cfg, @@ -81,15 +86,20 @@ func createTracesExporter( func createMetricsExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exporter.Metrics, error) { config := (cfg.(*Config)) routingKey := getRoutingKeyOrDefault(config, metricsRoutingKey) - r := newRabbitmqExporter(config, set.TelemetrySettings, newPublisherFactory(set), newTLSFactory(config), routingKey, metricsConnectionName) - return exporterhelper.NewMetricsExporter( + connectionName := defaultMetricsConnectionName + if config.Connection.Name != "" { + connectionName = config.Connection.Name + } + r := newRabbitmqExporter(config, set.TelemetrySettings, newPublisherFactory(set), newTLSFactory(config), routingKey, connectionName) + + return exporterhelper.NewMetrics( ctx, set, cfg, @@ -103,15 +113,19 @@ func createMetricsExporter( func createLogsExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exporter.Logs, error) { config := (cfg.(*Config)) routingKey := getRoutingKeyOrDefault(config, logsRoutingKey) - r := newRabbitmqExporter(config, set.TelemetrySettings, newPublisherFactory(set), newTLSFactory(config), routingKey, logsConnectionName) + connectionName := defaultLogsConnectionName + if config.Connection.Name != "" { + connectionName = config.Connection.Name + } + r := newRabbitmqExporter(config, set.TelemetrySettings, newPublisherFactory(set), newTLSFactory(config), routingKey, connectionName) - return exporterhelper.NewLogsExporter( + return exporterhelper.NewLogs( ctx, set, cfg, @@ -131,9 +145,9 @@ func getRoutingKeyOrDefault(config *Config, fallback string) string { return routingKey } -func newPublisherFactory(set exporter.CreateSettings) publisherFactory { +func newPublisherFactory(set exporter.Settings) publisherFactory { return func(dialConfig publisher.DialConfig) (publisher.Publisher, error) { - return publisher.NewConnection(set.Logger, publisher.NewAmqpClient(), dialConfig) + return publisher.NewConnection(set.Logger, rabbitmq.NewAmqpClient(set.Logger), dialConfig) } } diff --git a/exporter/rabbitmqexporter/factory_test.go b/exporter/rabbitmqexporter/factory_test.go index 4ea26b28d78b..e4697891d5e7 100644 --- a/exporter/rabbitmqexporter/factory_test.go +++ b/exporter/rabbitmqexporter/factory_test.go @@ -20,29 +20,39 @@ func TestCreateDefaultConfig(t *testing.T) { assert.NoError(t, componenttest.CheckConfigStruct(cfg)) } -func TestCreateTracesExporter(t *testing.T) { +func TestCreateTraces(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() - te, err := factory.CreateTracesExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + te, err := factory.CreateTraces(context.Background(), exportertest.NewNopSettings(), cfg) assert.NoError(t, err) assert.NotNil(t, te) } -func TestCreateMetricsExporter(t *testing.T) { +func TestCreateMetrics(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() - te, err := factory.CreateMetricsExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + te, err := factory.CreateMetrics(context.Background(), exportertest.NewNopSettings(), cfg) assert.NoError(t, err) assert.NotNil(t, te) } -func TestCreateLogsExporter(t *testing.T) { +func TestCreateLogs(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() - te, err := factory.CreateLogsExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + te, err := factory.CreateLogs(context.Background(), exportertest.NewNopSettings(), cfg) + assert.NoError(t, err) + assert.NotNil(t, te) +} + +func TestCreateMetricsWithConnectionName(t *testing.T) { + factory := NewFactory() + cfg := factory.CreateDefaultConfig().(*Config) + cfg.Connection.Name = "my-conn-name" + + te, err := factory.CreateMetrics(context.Background(), exportertest.NewNopSettings(), cfg) assert.NoError(t, err) assert.NotNil(t, te) } @@ -52,7 +62,17 @@ func TestCreateExporterWithCustomRoutingKey(t *testing.T) { cfg := factory.CreateDefaultConfig().(*Config) cfg.Routing.RoutingKey = "custom_routing_key" - te, err := factory.CreateLogsExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + te, err := factory.CreateLogs(context.Background(), exportertest.NewNopSettings(), cfg) + assert.NoError(t, err) + assert.NotNil(t, te) +} + +func TestCreateExporterWithConnectionName(t *testing.T) { + factory := NewFactory() + cfg := factory.CreateDefaultConfig().(*Config) + cfg.Connection.Name = "my-conn-name" + + te, err := factory.CreateLogs(context.Background(), exportertest.NewNopSettings(), cfg) assert.NoError(t, err) assert.NotNil(t, te) } @@ -62,7 +82,17 @@ func TestCreateExporterWithTLSSettings(t *testing.T) { cfg := factory.CreateDefaultConfig().(*Config) cfg.Connection.TLSConfig = &configtls.ClientConfig{} - te, err := factory.CreateLogsExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + te, err := factory.CreateLogs(context.Background(), exportertest.NewNopSettings(), cfg) + assert.NoError(t, err) + assert.NotNil(t, te) +} + +func TestCreateTracesWithConnectionName(t *testing.T) { + factory := NewFactory() + cfg := factory.CreateDefaultConfig().(*Config) + cfg.Connection.Name = "my-conn-name" + + te, err := factory.CreateTraces(context.Background(), exportertest.NewNopSettings(), cfg) assert.NoError(t, err) assert.NotNil(t, te) } diff --git a/exporter/rabbitmqexporter/generated_component_test.go b/exporter/rabbitmqexporter/generated_component_test.go index fc0342f07ca7..79fdd18f72dc 100644 --- a/exporter/rabbitmqexporter/generated_component_test.go +++ b/exporter/rabbitmqexporter/generated_component_test.go @@ -32,27 +32,27 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, { name: "metrics", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg) }, }, { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -64,9 +64,9 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) diff --git a/exporter/rabbitmqexporter/go.mod b/exporter/rabbitmqexporter/go.mod index 7b9f13efc7c4..5d8ac61f534a 100644 --- a/exporter/rabbitmqexporter/go.mod +++ b/exporter/rabbitmqexporter/go.mod @@ -1,21 +1,22 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/rabbitmqexporter -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/rabbitmq v0.116.0 github.com/rabbitmq/amqp091-go v1.10.0 - github.com/stretchr/testify v1.9.0 - github.com/testcontainers/testcontainers-go v0.31.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/collector/config/configtls v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/stretchr/testify v1.10.0 + github.com/testcontainers/testcontainers-go v0.34.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/config/configtls v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) @@ -23,39 +24,39 @@ require ( require ( dario.cat/mergo v1.0.0 // indirect github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/Microsoft/hcsshim v0.11.4 // indirect - github.com/beorn7/perks v1.0.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/containerd/containerd v1.7.15 // indirect github.com/containerd/log v0.1.0 // indirect - github.com/cpuguy83/dockercfg v0.3.1 // indirect + github.com/containerd/platforms v0.2.1 // indirect + github.com/cpuguy83/dockercfg v0.3.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/distribution/reference v0.5.0 // indirect - github.com/docker/docker v25.0.5+incompatible // indirect + github.com/distribution/reference v0.6.0 // indirect + github.com/docker/docker v27.3.1+incompatible // indirect github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.2 // indirect + github.com/klauspost/compress v1.17.9 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/patternmatcher v0.6.0 // indirect github.com/moby/sys/sequential v0.5.0 // indirect github.com/moby/sys/user v0.1.0 // indirect + github.com/moby/sys/userns v0.1.0 // indirect github.com/moby/term v0.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect @@ -65,42 +66,51 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/shirou/gopsutil/v3 v3.24.4 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/shirou/gopsutil/v3 v3.24.5 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configopaque v1.9.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect + go.opentelemetry.io/collector/config/configopaque v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + go.opentelemetry.io/proto/otlp v1.0.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.23.0 // indirect - golang.org/x/mod v0.16.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - golang.org/x/tools v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal => ../../internal/coreinternal +replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/rabbitmq => ../../internal/rabbitmq + replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../../pkg/pdatautil replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest => ../../pkg/pdatatest diff --git a/exporter/rabbitmqexporter/go.sum b/exporter/rabbitmqexporter/go.sum index f75cd5ec44ba..f6893bc675a9 100644 --- a/exporter/rabbitmqexporter/go.sum +++ b/exporter/rabbitmqexporter/go.sum @@ -4,71 +4,68 @@ github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9 github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= -github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w= -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/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/containerd/containerd v1.7.15 h1:afEHXdil9iAm03BmhjzKyXnnEBtjaLJefdU7DV0IFes= -github.com/containerd/containerd v1.7.15/go.mod h1:ISzRRTMF8EXNpJlTzyr2XMhN+j9K302C21/+cr3kUnY= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= -github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= +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/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= -github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= -github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/docker v27.3.1+incompatible h1:KttF0XoteNTicmUtBO0L2tP+J7FGRFTjaEF4k6WdhfI= +github.com/docker/docker v27.3.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4= -github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -81,12 +78,16 @@ github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa1 github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -106,20 +107,12 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rabbitmq/amqp091-go v1.10.0 h1:STpn5XsHlHGcecLmMFCtg7mqq0RnD+zFr4uzukfVhBw= github.com/rabbitmq/amqp091-go v1.10.0/go.mod h1:Hy4jKW5kQART1u+JkDTF9YYOQUHXqMuhrgxOEeS7G4o= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= -github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI= +github.com/shirou/gopsutil/v3 v3.24.5/go.mod h1:bsoOS1aStSs9ErQ1WWfxllSeS1K5D+U30r2NfcubMVk= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= @@ -127,19 +120,14 @@ github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnj github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/testcontainers/testcontainers-go v0.31.0 h1:W0VwIhcEVhRflwL9as3dhY6jXjVCA27AkmbnZ+UTh3U= -github.com/testcontainers/testcontainers-go v0.31.0/go.mod h1:D2lAoA0zUFiSY+eAflqK5mcUx/A5hrrORaEQrd0SefI= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/testcontainers/testcontainers-go v0.34.0 h1:5fbgF0vIN5u+nD3IWabQwRybuB4GY8G2HHgCkbMzMHo= +github.com/testcontainers/testcontainers-go v0.34.0/go.mod h1:6P/kMkQe8yqPHfPWNulFGdFHTD8HB2vLq/231xY2iPQ= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= @@ -148,52 +136,74 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= -go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= -go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 h1:j9+03ymgYhPKmeXGk5Zu+cIZOlVzd9Zv7QIiyItjFBU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0/go.mod h1:Y5+XiUG4Emn1hTfciPzGPJaSI+RpDts6BnCIir0SLqk= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= +go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -203,23 +213,19 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= -golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -229,41 +235,37 @@ golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= -golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 h1:Z0hjGZePRE0ZBWotvtrwxFNrNE9CUAGtplaDK5NNI/g= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 h1:P8OJ/WCl/Xo4E4zoe4/bifHpSmmKwARqyqE4nW6J2GQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= -gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= diff --git a/exporter/rabbitmqexporter/integration_test.go b/exporter/rabbitmqexporter/integration_test.go index c9a354933a51..0c6a0a7e42b4 100644 --- a/exporter/rabbitmqexporter/integration_test.go +++ b/exporter/rabbitmqexporter/integration_test.go @@ -62,7 +62,7 @@ func TestExportWithNetworkIssueRecovery(t *testing.T) { cfg.Connection.Endpoint = endpoint cfg.Connection.VHost = vhost cfg.Connection.Auth = AuthConfig{Plain: PlainAuth{Username: username, Password: password}} - exporter, err := factory.CreateLogsExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + exporter, err := factory.CreateLogs(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = exporter.Start(context.Background(), componenttest.NewNopHost()) require.NoError(t, err) diff --git a/exporter/rabbitmqexporter/internal/metadata/generated_status.go b/exporter/rabbitmqexporter/internal/metadata/generated_status.go index 7a36c7251045..b020d67bdad5 100644 --- a/exporter/rabbitmqexporter/internal/metadata/generated_status.go +++ b/exporter/rabbitmqexporter/internal/metadata/generated_status.go @@ -7,11 +7,12 @@ import ( ) var ( - Type = component.MustNewType("rabbitmq") + Type = component.MustNewType("rabbitmq") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/rabbitmqexporter" ) const ( - TracesStability = component.StabilityLevelDevelopment - MetricsStability = component.StabilityLevelDevelopment - LogsStability = component.StabilityLevelDevelopment + TracesStability = component.StabilityLevelAlpha + MetricsStability = component.StabilityLevelAlpha + LogsStability = component.StabilityLevelAlpha ) diff --git a/exporter/rabbitmqexporter/internal/metadata/generated_telemetry.go b/exporter/rabbitmqexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index 6a88b7e543dc..000000000000 --- a/exporter/rabbitmqexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/rabbitmq") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/rabbitmq") -} diff --git a/exporter/rabbitmqexporter/internal/metadata/generated_telemetry_test.go b/exporter/rabbitmqexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 07ab30386787..000000000000 --- a/exporter/rabbitmqexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,62 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/rabbitmq", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/rabbitmq", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/rabbitmqexporter/internal/publisher/client.go b/exporter/rabbitmqexporter/internal/publisher/client.go deleted file mode 100644 index 905d7da564a1..000000000000 --- a/exporter/rabbitmqexporter/internal/publisher/client.go +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package publisher // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/rabbitmqexporter/internal/publisher" - -import ( - "context" - - amqp "github.com/rabbitmq/amqp091-go" -) - -type AmqpClient interface { - DialConfig(url string, config amqp.Config) (Connection, error) -} - -type Connection interface { - IsClosed() bool - Channel() (Channel, error) - NotifyClose(receiver chan *amqp.Error) chan *amqp.Error - Close() error -} - -type Channel interface { - Confirm(noWait bool) error - PublishWithDeferredConfirmWithContext(ctx context.Context, exchange, key string, mandatory, immediate bool, msg amqp.Publishing) (DeferredConfirmation, error) - IsClosed() bool - Close() error -} - -type DeferredConfirmation interface { - Done() <-chan struct{} - Acked() bool -} - -func NewAmqpClient() AmqpClient { - return &client{} -} - -type client struct{} - -type connectionHolder struct { - connection *amqp.Connection -} - -type channelHolder struct { - channel *amqp.Channel -} - -type deferredConfirmationHolder struct { - confirmation *amqp.DeferredConfirmation -} - -func (*client) DialConfig(url string, config amqp.Config) (Connection, error) { - con, err := amqp.DialConfig(url, config) - if err != nil { - return nil, err - } - - return &connectionHolder{ - connection: con, - }, nil -} - -func (c *connectionHolder) Channel() (Channel, error) { - channel, err := c.connection.Channel() - if err != nil { - return nil, err - } - return &channelHolder{channel: channel}, nil -} - -func (c *connectionHolder) IsClosed() bool { - return c.connection.IsClosed() -} - -func (c *connectionHolder) NotifyClose(receiver chan *amqp.Error) chan *amqp.Error { - return c.connection.NotifyClose(receiver) -} - -func (c *connectionHolder) Close() error { - return c.connection.Close() -} - -func (c *channelHolder) Confirm(noWait bool) error { - return c.channel.Confirm(noWait) -} - -func (c *channelHolder) PublishWithDeferredConfirmWithContext(ctx context.Context, exchange, key string, mandatory, immediate bool, msg amqp.Publishing) (DeferredConfirmation, error) { - confirmation, err := c.channel.PublishWithDeferredConfirmWithContext(ctx, exchange, key, mandatory, immediate, msg) - if err != nil { - return nil, err - } - return &deferredConfirmationHolder{confirmation: confirmation}, nil -} - -func (c *channelHolder) IsClosed() bool { - return c.channel.IsClosed() -} - -func (c *channelHolder) Close() error { - return c.channel.Close() -} - -func (d *deferredConfirmationHolder) Done() <-chan struct{} { - return d.confirmation.Done() -} - -func (d *deferredConfirmationHolder) Acked() bool { - return d.confirmation.Acked() -} diff --git a/exporter/rabbitmqexporter/internal/publisher/publisher.go b/exporter/rabbitmqexporter/internal/publisher/publisher.go index c4a6b994ba74..fa308b96b4fd 100644 --- a/exporter/rabbitmqexporter/internal/publisher/publisher.go +++ b/exporter/rabbitmqexporter/internal/publisher/publisher.go @@ -5,26 +5,20 @@ package publisher // import "github.com/open-telemetry/opentelemetry-collector-c import ( "context" - "crypto/tls" "errors" "fmt" - "sync" "time" amqp "github.com/rabbitmq/amqp091-go" "go.uber.org/zap" + + otelrabbitmq "github.com/open-telemetry/opentelemetry-collector-contrib/internal/rabbitmq" ) type DialConfig struct { - URL string + otelrabbitmq.DialConfig Durable bool - Vhost string - Auth amqp.Authentication - ConnectionTimeout time.Duration - Heartbeat time.Duration PublishConfirmationTimeout time.Duration - TLS *tls.Config - ConnectionName string } type Message struct { @@ -33,20 +27,20 @@ type Message struct { Body []byte } -func NewConnection(logger *zap.Logger, client AmqpClient, config DialConfig) (Publisher, error) { +func NewConnection(logger *zap.Logger, client otelrabbitmq.AmqpClient, config DialConfig) (Publisher, error) { p := publisher{ - logger: logger, - client: client, - config: config, - connLock: &sync.Mutex{}, - connectionErrors: make(chan *amqp.Error, 1), + logger: logger, + client: client, + config: config, } - p.connLock.Lock() - defer p.connLock.Unlock() - err := p.connect() + conn, err := p.client.DialConfig(p.config.DialConfig) + if err != nil { + return &p, err + } + p.connection = conn - return &p, err + return &p, nil } type Publisher interface { @@ -55,16 +49,14 @@ type Publisher interface { } type publisher struct { - logger *zap.Logger - client AmqpClient - config DialConfig - connLock *sync.Mutex - connection Connection - connectionErrors chan *amqp.Error + logger *zap.Logger + client otelrabbitmq.AmqpClient + config DialConfig + connection otelrabbitmq.Connection } func (p *publisher) Publish(ctx context.Context, message Message) error { - err := p.reconnectIfUnhealthy() + err := p.connection.ReconnectIfUnhealthy() if err != nil { return err } @@ -73,7 +65,7 @@ func (p *publisher) Publish(ctx context.Context, message Message) error { // This could later be optimized to re-use channels which avoids repeated network calls to create and close them. // Concurrency-control through something like a resource pool would be necessary since aqmp channels are not thread safe. channel, err := p.connection.Channel() - defer func(channel Channel) { + defer func(channel otelrabbitmq.Channel) { if channel != nil { err2 := channel.Close() if err2 != nil { @@ -101,7 +93,6 @@ func (p *publisher) Publish(ctx context.Context, message Message) error { Body: message.Body, DeliveryMode: deliveryMode, }) - if err != nil { err = errors.Join(errors.New("error publishing message"), err) return err @@ -125,71 +116,9 @@ func (p *publisher) Publish(ctx context.Context, message Message) error { } } -func (p *publisher) reconnectIfUnhealthy() error { - p.connLock.Lock() - defer p.connLock.Unlock() - - hasConnectionError := false - select { - case err := <-p.connectionErrors: - hasConnectionError = true - p.logger.Info("Received connection error, will retry restoring unhealthy connection", zap.Error(err)) - default: - break - } - - if hasConnectionError || !p.isConnected() { - if p.isConnected() { - err := p.connection.Close() - if err != nil { - p.logger.Warn("Error closing unhealthy connection", zap.Error(err)) - } - } - - if err := p.connect(); err != nil { - return errors.Join(errors.New("failed attempt at restoring unhealthy connection"), err) - } - p.logger.Info("Successfully restored unhealthy rabbitmq connection") - } - - return nil -} - -func (p *publisher) connect() error { - p.logger.Debug("Connecting to rabbitmq") - - properties := amqp.Table{} - properties.SetClientConnectionName(p.config.ConnectionName) - - connection, err := p.client.DialConfig(p.config.URL, amqp.Config{ - SASL: []amqp.Authentication{p.config.Auth}, - Vhost: p.config.Vhost, - Heartbeat: p.config.Heartbeat, - Dial: amqp.DefaultDial(p.config.ConnectionTimeout), - Properties: properties, - TLSClientConfig: p.config.TLS, - }) - if connection != nil { - p.connection = connection - } - if err != nil { - return err - } - - // Goal is to lazily restore the connection so this needs to be buffered to avoid blocking on asynchronous amqp errors. - // Also re-create this channel each time because apparently the amqp library can close it - p.connectionErrors = make(chan *amqp.Error, 1) - p.connection.NotifyClose(p.connectionErrors) - return nil -} - func (p *publisher) Close() error { - if p.isConnected() { - return p.connection.Close() + if p.connection == nil { + return nil } - return nil -} - -func (p *publisher) isConnected() bool { - return p.connection != nil && !p.connection.IsClosed() + return p.connection.Close() } diff --git a/exporter/rabbitmqexporter/internal/publisher/publisher_test.go b/exporter/rabbitmqexporter/internal/publisher/publisher_test.go index 5d8b63693e48..96b2c99ad6d6 100644 --- a/exporter/rabbitmqexporter/internal/publisher/publisher_test.go +++ b/exporter/rabbitmqexporter/internal/publisher/publisher_test.go @@ -14,6 +14,8 @@ import ( "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" "go.uber.org/zap" + + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/rabbitmq" ) const ( @@ -23,14 +25,18 @@ const ( ) func TestConnectAndClose(t *testing.T) { - client := mockClient{} connection := mockConnection{} + client := mockClient{ + conn: &connection, + } dialConfig := DialConfig{ - URL: connectURL, + DialConfig: rabbitmq.DialConfig{ + URL: connectURL, + }, } // Start the connection successfully - client.On("DialConfig", connectURL, mock.Anything).Return(&connection, nil) + client.On("DialConfig", mock.Anything).Return(&connection, nil) connection.On("NotifyClose", mock.Anything).Return(make(chan *amqp.Error)) publisher, err := NewConnection(zap.NewNop(), &client, dialConfig) @@ -39,7 +45,6 @@ func TestConnectAndClose(t *testing.T) { client.AssertExpectations(t) // Close the connection - connection.On("IsClosed").Return(false) connection.On("Close").Return(nil) err = publisher.Close() @@ -49,12 +54,18 @@ func TestConnectAndClose(t *testing.T) { } func TestConnectionErrorAndClose(t *testing.T) { - client := mockClient{} + connection := mockConnection{} + client := mockClient{ + conn: &connection, + } dialConfig := DialConfig{ - URL: connectURL, + DialConfig: rabbitmq.DialConfig{ + URL: connectURL, + }, } - client.On("DialConfig", connectURL, mock.Anything).Return(nil, errors.New("simulated connection error")) + connection.On("NotifyClose", mock.Anything).Return(make(chan *amqp.Error)) + client.On("DialConfig", mock.Anything).Return(nil, errors.New("simulated connection error")) publisher, err := NewConnection(zap.NewNop(), &client, dialConfig) assert.EqualError(t, err, "simulated connection error") @@ -82,8 +93,7 @@ func TestPublishAckedWithinTimeout(t *testing.T) { func TestPublishNackedWithinTimeout(t *testing.T) { client, connection, channel, confirmation := setupMocksForSuccessfulPublish() - - resetCall(confirmation.ExpectedCalls, "Acked", t) + resetCall(t, confirmation.ExpectedCalls, "Acked") confirmation.On("Acked").Return(false) publisher, err := NewConnection(zap.NewNop(), client, makeDialConfig()) @@ -101,8 +111,8 @@ func TestPublishNackedWithinTimeout(t *testing.T) { func TestPublishTimeoutBeforeAck(t *testing.T) { client, connection, channel, confirmation := setupMocksForSuccessfulPublish() - resetCall(confirmation.ExpectedCalls, "Done", t) - resetCall(confirmation.ExpectedCalls, "Acked", t) + resetCall(t, confirmation.ExpectedCalls, "Done") + resetCall(t, confirmation.ExpectedCalls, "Acked") emptyConfirmationChan := make(<-chan struct{}) confirmation.On("Done").Return(emptyConfirmationChan) @@ -126,7 +136,7 @@ func TestPublishTwiceReusingSameConnection(t *testing.T) { confirmationChan <- struct{}{} confirmationChan <- struct{}{} var confirmationChanRet <-chan struct{} = confirmationChan - resetCall(confirmation.ExpectedCalls, "Done", t) + resetCall(t, confirmation.ExpectedCalls, "Done") confirmation.On("Done").Return(confirmationChanRet) publisher, err := NewConnection(zap.NewNop(), client, makeDialConfig()) @@ -148,7 +158,7 @@ func TestRestoreUnhealthyConnectionDuringPublish(t *testing.T) { client, connection, channel, confirmation := setupMocksForSuccessfulPublish() // Capture the channel that the amqp library uses to notify about connection issues so that we can simulate the notification - resetCall(connection.ExpectedCalls, "NotifyClose", t) + resetCall(t, connection.ExpectedCalls, "NotifyClose") var connectionErrChan chan *amqp.Error connection.On("NotifyClose", mock.Anything).Return(make(chan *amqp.Error)).Run(func(args mock.Arguments) { connectionErrChan = args.Get(0).(chan *amqp.Error) @@ -163,10 +173,10 @@ func TestRestoreUnhealthyConnectionDuringPublish(t *testing.T) { err = publisher.Publish(context.Background(), makePublishMessage()) require.NoError(t, err) - client.AssertNumberOfCalls(t, "DialConfig", 2) // Connected twice + connection.AssertNumberOfCalls(t, "ReconnectIfUnhealthy", 1) client.AssertExpectations(t) + resetCall(t, connection.ExpectedCalls, "Close") connection.AssertExpectations(t) - connection.AssertNumberOfCalls(t, "Close", 1) channel.AssertExpectations(t) confirmation.AssertExpectations(t) } @@ -178,12 +188,9 @@ func TestRestoreClosedConnectionDuringPublish(t *testing.T) { publisher, err := NewConnection(zap.NewNop(), client, makeDialConfig()) require.NoError(t, err) - resetCall(connection.ExpectedCalls, "IsClosed", t) - connection.On("IsClosed").Return(true) - err = publisher.Publish(context.Background(), makePublishMessage()) require.NoError(t, err) - client.AssertNumberOfCalls(t, "DialConfig", 2) // Connected twice + client.AssertNumberOfCalls(t, "DialConfig", 1) client.AssertExpectations(t) connection.AssertExpectations(t) channel.AssertExpectations(t) @@ -197,21 +204,19 @@ func TestFailRestoreConnectionDuringPublishing(t *testing.T) { require.NoError(t, err) client.AssertNumberOfCalls(t, "DialConfig", 1) - resetCall(connection.ExpectedCalls, "IsClosed", t) connection.On("IsClosed").Return(true) - resetCall(client.ExpectedCalls, "DialConfig", t) + resetCall(t, client.ExpectedCalls, "DialConfig") client.On("DialConfig", connectURL, mock.Anything).Return(nil, errors.New("simulated connection error")) - err = publisher.Publish(context.Background(), makePublishMessage()) - assert.EqualError(t, err, "failed attempt at restoring unhealthy connection\nsimulated connection error") - client.AssertNumberOfCalls(t, "DialConfig", 2) // Tried reconnecting + _ = publisher.Publish(context.Background(), makePublishMessage()) + client.AssertNumberOfCalls(t, "DialConfig", 1) } func TestErrCreatingChannel(t *testing.T) { client, connection, _, _ := setupMocksForSuccessfulPublish() - resetCall(connection.ExpectedCalls, "Channel", t) + resetCall(t, connection.ExpectedCalls, "Channel") connection.On("Channel").Return(nil, errors.New("simulated error creating channel")) publisher, err := NewConnection(zap.NewNop(), client, makeDialConfig()) @@ -224,7 +229,7 @@ func TestErrCreatingChannel(t *testing.T) { func TestErrSettingChannelConfirmMode(t *testing.T) { client, _, channel, _ := setupMocksForSuccessfulPublish() - resetCall(channel.ExpectedCalls, "Confirm", t) + resetCall(t, channel.ExpectedCalls, "Confirm") channel.On("Confirm", false).Return(errors.New("simulated error setting channel confirm mode")) publisher, err := NewConnection(zap.NewNop(), client, makeDialConfig()) @@ -237,12 +242,11 @@ func TestErrSettingChannelConfirmMode(t *testing.T) { func TestErrPublishing(t *testing.T) { client, connection, _, _ := setupMocksForSuccessfulPublish() - // resetCall(channel.ExpectedCalls, "PublishWithDeferredConfirmWithContext") doesn't work so need to recreate the mock channel := mockChannel{} channel.On("Confirm", false).Return(nil) channel.On("PublishWithDeferredConfirmWithContext", mock.Anything, exchange, routingKey, true, false, mock.MatchedBy(isPersistentDeliverMode)).Return(nil, errors.New("simulated error publishing")) channel.On("Close").Return(nil) - resetCall(connection.ExpectedCalls, "Channel", t) + resetCall(t, connection.ExpectedCalls, "Channel") connection.On("Channel").Return(&channel, nil) publisher, err := NewConnection(zap.NewNop(), client, makeDialConfig()) @@ -253,15 +257,17 @@ func TestErrPublishing(t *testing.T) { } func setupMocksForSuccessfulPublish() (*mockClient, *mockConnection, *mockChannel, *mockDeferredConfirmation) { - client := mockClient{} connection := mockConnection{} + client := mockClient{ + conn: &connection, + } channel := mockChannel{} confirmation := mockDeferredConfirmation{} - client.On("DialConfig", mock.Anything, mock.Anything).Return(&connection, nil) + client.On("DialConfig", mock.Anything).Return(&connection, nil) + connection.On("ReconnectIfUnhealthy").Return(nil) connection.On("NotifyClose", mock.Anything).Return(make(chan *amqp.Error)) connection.On("Channel").Return(&channel, nil) - connection.On("IsClosed").Return(false) channel.On("Confirm", false).Return(nil) channel.On("PublishWithDeferredConfirmWithContext", mock.Anything, exchange, routingKey, true, false, mock.MatchedBy(isPersistentDeliverMode)).Return(&confirmation, nil) @@ -280,25 +286,28 @@ func isPersistentDeliverMode(p amqp.Publishing) bool { return p.DeliveryMode == amqp.Persistent } -func resetCall(calls []*mock.Call, methodName string, t *testing.T) { +func resetCall(t *testing.T, calls []*mock.Call, methodName string) { for _, call := range calls { if call.Method == methodName { call.Unset() return } } + t.Errorf("Faild to reset method %s", methodName) t.FailNow() } type mockClient struct { mock.Mock + conn *mockConnection } -func (m *mockClient) DialConfig(url string, config amqp.Config) (Connection, error) { - args := m.Called(url, config) +func (m *mockClient) DialConfig(config rabbitmq.DialConfig) (rabbitmq.Connection, error) { + args := m.Called(config) + m.conn.NotifyClose(make(chan *amqp.Error, 1)) if connection := args.Get(0); connection != nil { - return connection.(Connection), args.Error(1) + return connection.(rabbitmq.Connection), args.Error(1) } return nil, args.Error(1) } @@ -307,15 +316,20 @@ type mockConnection struct { mock.Mock } +func (m *mockConnection) ReconnectIfUnhealthy() error { + args := m.Called() + return args.Error(0) +} + func (m *mockConnection) IsClosed() bool { args := m.Called() return args.Bool(0) } -func (m *mockConnection) Channel() (Channel, error) { +func (m *mockConnection) Channel() (rabbitmq.Channel, error) { args := m.Called() if channel := args.Get(0); channel != nil { - return channel.(Channel), args.Error(1) + return channel.(rabbitmq.Channel), args.Error(1) } return nil, args.Error(1) } @@ -339,10 +353,10 @@ func (m *mockChannel) Confirm(noWait bool) error { return args.Error(0) } -func (m *mockChannel) PublishWithDeferredConfirmWithContext(ctx context.Context, exchange, key string, mandatory, immediate bool, msg amqp.Publishing) (DeferredConfirmation, error) { +func (m *mockChannel) PublishWithDeferredConfirmWithContext(ctx context.Context, exchange, key string, mandatory, immediate bool, msg amqp.Publishing) (rabbitmq.DeferredConfirmation, error) { args := m.Called(ctx, exchange, key, mandatory, immediate, msg) if confirmation := args.Get(0); confirmation != nil { - return confirmation.(DeferredConfirmation), args.Error(1) + return confirmation.(rabbitmq.DeferredConfirmation), args.Error(1) } return nil, args.Error(1) } @@ -381,7 +395,9 @@ func makePublishMessage() Message { func makeDialConfig() DialConfig { return DialConfig{ - URL: connectURL, + DialConfig: rabbitmq.DialConfig{ + URL: connectURL, + }, PublishConfirmationTimeout: time.Millisecond * 20, Durable: true, } diff --git a/exporter/rabbitmqexporter/marshaler_test.go b/exporter/rabbitmqexporter/marshaler_test.go index b28c24d8c701..4253b908a260 100644 --- a/exporter/rabbitmqexporter/marshaler_test.go +++ b/exporter/rabbitmqexporter/marshaler_test.go @@ -39,14 +39,6 @@ type mockEncodingExtension struct { mock.Mock } -func (h *mockHostWithEncodings) GetFactory(component.Kind, component.Type) component.Factory { - return nil -} - -func (h *mockHostWithEncodings) GetExporters() map[component.DataType]map[component.ID]component.Component { - return nil -} - func (h *mockHostWithEncodings) GetExtensions() map[component.ID]component.Component { args := h.Called() return args.Get(0).(map[component.ID]component.Component) diff --git a/exporter/rabbitmqexporter/metadata.yaml b/exporter/rabbitmqexporter/metadata.yaml index 70f260ace0c2..698279715c85 100644 --- a/exporter/rabbitmqexporter/metadata.yaml +++ b/exporter/rabbitmqexporter/metadata.yaml @@ -1,11 +1,10 @@ type: rabbitmq -scope_name: otelcol/rabbitmq status: class: exporter stability: - development: [traces, metrics, logs] - distributions: [] + alpha: [traces, metrics, logs] + distributions: [contrib] codeowners: active: [swar8080, atoulme] diff --git a/exporter/rabbitmqexporter/rabbitmq_exporter.go b/exporter/rabbitmqexporter/rabbitmq_exporter.go index 40d068e3f076..e7ae69ad8c3c 100644 --- a/exporter/rabbitmqexporter/rabbitmq_exporter.go +++ b/exporter/rabbitmqexporter/rabbitmq_exporter.go @@ -14,6 +14,7 @@ import ( "go.opentelemetry.io/collector/pdata/ptrace" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/rabbitmqexporter/internal/publisher" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/rabbitmq" ) type rabbitmqExporter struct { @@ -27,8 +28,10 @@ type rabbitmqExporter struct { publisher publisher.Publisher } -type publisherFactory = func(publisher.DialConfig) (publisher.Publisher, error) -type tlsFactory = func(context.Context) (*tls.Config, error) +type ( + publisherFactory = func(publisher.DialConfig) (publisher.Publisher, error) + tlsFactory = func(context.Context) (*tls.Config, error) +) func newRabbitmqExporter(cfg *Config, set component.TelemetrySettings, publisherFactory publisherFactory, tlsFactory tlsFactory, routingKey string, connectionName string) *rabbitmqExporter { exporter := &rabbitmqExporter{ @@ -50,17 +53,19 @@ func (e *rabbitmqExporter) start(ctx context.Context, host component.Host) error e.marshaler = m dialConfig := publisher.DialConfig{ - URL: e.config.Connection.Endpoint, - Vhost: e.config.Connection.VHost, - Auth: &amqp.PlainAuth{ - Username: e.config.Connection.Auth.Plain.Username, - Password: e.config.Connection.Auth.Plain.Password, - }, Durable: e.config.Durable, - ConnectionName: e.connectionName, - ConnectionTimeout: e.config.Connection.ConnectionTimeout, - Heartbeat: e.config.Connection.Heartbeat, PublishConfirmationTimeout: e.config.Connection.PublishConfirmationTimeout, + DialConfig: rabbitmq.DialConfig{ + URL: e.config.Connection.Endpoint, + Vhost: e.config.Connection.VHost, + Auth: &amqp.PlainAuth{ + Username: e.config.Connection.Auth.Plain.Username, + Password: e.config.Connection.Auth.Plain.Password, + }, + ConnectionName: e.connectionName, + ConnectionTimeout: e.config.Connection.ConnectionTimeout, + Heartbeat: e.config.Connection.Heartbeat, + }, } tlsConfig, err := e.tlsFactory(ctx) diff --git a/exporter/rabbitmqexporter/rabbitmq_exporter_test.go b/exporter/rabbitmqexporter/rabbitmq_exporter_test.go index 7ede372ff1d2..76a9444ea0e7 100644 --- a/exporter/rabbitmqexporter/rabbitmq_exporter_test.go +++ b/exporter/rabbitmqexporter/rabbitmq_exporter_test.go @@ -29,10 +29,10 @@ func TestStartAndShutdown(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig().(*Config) pub := mockPublisher{} - var pubFactory = func(publisher.DialConfig) (publisher.Publisher, error) { + pubFactory := func(publisher.DialConfig) (publisher.Publisher, error) { return &pub, nil } - exporter := newRabbitmqExporter(cfg, exportertest.NewNopCreateSettings().TelemetrySettings, pubFactory, newTLSFactory(cfg), routingKey, connectionName) + exporter := newRabbitmqExporter(cfg, exportertest.NewNopSettings().TelemetrySettings, pubFactory, newTLSFactory(cfg), routingKey, connectionName) err := exporter.start(context.Background(), componenttest.NewNopHost()) require.NoError(t, err) @@ -48,16 +48,15 @@ func TestStart_UnknownMarshallerEncoding(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig().(*Config) pub := mockPublisher{} - var pubFactory = func(publisher.DialConfig) (publisher.Publisher, error) { + pubFactory := func(publisher.DialConfig) (publisher.Publisher, error) { return &pub, nil } unknownExtensionID := component.NewID(component.MustNewType("invalid_encoding")) cfg.EncodingExtensionID = &unknownExtensionID - host := mockHost{} - exporter := newRabbitmqExporter(cfg, exportertest.NewNopCreateSettings().TelemetrySettings, pubFactory, newTLSFactory(cfg), routingKey, connectionName) + exporter := newRabbitmqExporter(cfg, exportertest.NewNopSettings().TelemetrySettings, pubFactory, newTLSFactory(cfg), routingKey, connectionName) - err := exporter.start(context.Background(), host) + err := exporter.start(context.Background(), componenttest.NewNopHost()) assert.EqualError(t, err, "unknown encoding \"invalid_encoding\"") err = exporter.shutdown(context.Background()) @@ -67,10 +66,10 @@ func TestStart_UnknownMarshallerEncoding(t *testing.T) { func TestStart_PublisherCreationErr(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig().(*Config) - var pubFactory = func(publisher.DialConfig) (publisher.Publisher, error) { + pubFactory := func(publisher.DialConfig) (publisher.Publisher, error) { return nil, errors.New("simulating error creating publisher") } - exporter := newRabbitmqExporter(cfg, exportertest.NewNopCreateSettings().TelemetrySettings, pubFactory, newTLSFactory(cfg), routingKey, connectionName) + exporter := newRabbitmqExporter(cfg, exportertest.NewNopSettings().TelemetrySettings, pubFactory, newTLSFactory(cfg), routingKey, connectionName) err := exporter.start(context.Background(), componenttest.NewNopHost()) assert.EqualError(t, err, "simulating error creating publisher") @@ -83,13 +82,13 @@ func TestStart_TLSError(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig().(*Config) pub := mockPublisher{} - var pubFactory = func(publisher.DialConfig) (publisher.Publisher, error) { + pubFactory := func(publisher.DialConfig) (publisher.Publisher, error) { return &pub, nil } tlsFactory := func(context.Context) (*tls.Config, error) { return nil, errors.New("simulating tls config error") } - exporter := newRabbitmqExporter(cfg, exportertest.NewNopCreateSettings().TelemetrySettings, pubFactory, tlsFactory, routingKey, connectionName) + exporter := newRabbitmqExporter(cfg, exportertest.NewNopSettings().TelemetrySettings, pubFactory, tlsFactory, routingKey, connectionName) err := exporter.start(context.Background(), componenttest.NewNopHost()) assert.EqualError(t, err, "simulating tls config error") @@ -138,10 +137,10 @@ func exporterForPublishing(t *testing.T) (*mockPublisher, *rabbitmqExporter) { factory := NewFactory() cfg := factory.CreateDefaultConfig().(*Config) pub := mockPublisher{} - var pubFactory = func(publisher.DialConfig) (publisher.Publisher, error) { + pubFactory := func(publisher.DialConfig) (publisher.Publisher, error) { return &pub, nil } - exporter := newRabbitmqExporter(cfg, exportertest.NewNopCreateSettings().TelemetrySettings, pubFactory, newTLSFactory(cfg), routingKey, connectionName) + exporter := newRabbitmqExporter(cfg, exportertest.NewNopSettings().TelemetrySettings, pubFactory, newTLSFactory(cfg), routingKey, connectionName) err := exporter.start(context.Background(), componenttest.NewNopHost()) require.NoError(t, err) @@ -162,11 +161,3 @@ func (c *mockPublisher) Close() error { args := c.Called() return args.Error(0) } - -type mockHost struct { - component.Host -} - -func (h mockHost) GetExtensions() map[component.ID]component.Component { - return make(map[component.ID]component.Component) -} diff --git a/exporter/sapmexporter/README.md b/exporter/sapmexporter/README.md index e6dc89e9875e..8c391ef71c3a 100644 --- a/exporter/sapmexporter/README.md +++ b/exporter/sapmexporter/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fsapm%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fsapm) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fsapm%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fsapm) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@dmitryax](https://www.github.com/dmitryax), [@atoulme](https://www.github.com/atoulme) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib diff --git a/exporter/sapmexporter/config.go b/exporter/sapmexporter/config.go index 0c34eb7d23df..90107d461f95 100644 --- a/exporter/sapmexporter/config.go +++ b/exporter/sapmexporter/config.go @@ -22,7 +22,6 @@ const ( // Config defines configuration for SAPM exporter. type Config struct { - // Endpoint is the destination to where traces will be sent to in SAPM format. // It must be a full URL and include the scheme, port and path e.g, https://ingest.signalfx.com/v2/trace Endpoint string `mapstructure:"endpoint"` @@ -49,9 +48,9 @@ type Config struct { splunk.AccessTokenPassthroughConfig `mapstructure:",squash"` - exporterhelper.TimeoutSettings `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. - exporterhelper.QueueSettings `mapstructure:"sending_queue"` - configretry.BackOffConfig `mapstructure:"retry_on_failure"` + TimeoutSettings exporterhelper.TimeoutConfig `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` + configretry.BackOffConfig `mapstructure:"retry_on_failure"` } func (c *Config) Validate() error { diff --git a/exporter/sapmexporter/config_test.go b/exporter/sapmexporter/config_test.go index baf3e96463d6..099fbe2e3453 100644 --- a/exporter/sapmexporter/config_test.go +++ b/exporter/sapmexporter/config_test.go @@ -49,7 +49,7 @@ func TestLoadConfig(t *testing.T) { AccessTokenPassthroughConfig: splunk.AccessTokenPassthroughConfig{ AccessTokenPassthrough: false, }, - TimeoutSettings: exporterhelper.TimeoutSettings{ + TimeoutSettings: exporterhelper.TimeoutConfig{ Timeout: 10 * time.Second, }, BackOffConfig: configretry.BackOffConfig{ @@ -60,7 +60,7 @@ func TestLoadConfig(t *testing.T) { RandomizationFactor: backoff.DefaultRandomizationFactor, Multiplier: backoff.DefaultMultiplier, }, - QueueSettings: exporterhelper.QueueSettings{ + QueueSettings: exporterhelper.QueueConfig{ Enabled: true, NumConsumers: 2, QueueSize: 10, @@ -76,7 +76,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) @@ -110,7 +110,7 @@ func TestInvalidConfig(t *testing.T) { invalid = Config{ Endpoint: "abcd1234", - QueueSettings: exporterhelper.QueueSettings{ + QueueSettings: exporterhelper.QueueConfig{ Enabled: true, QueueSize: -1, }, diff --git a/exporter/sapmexporter/examples/signalfx-k8s.yaml b/exporter/sapmexporter/examples/signalfx-k8s.yaml index 25f6497eba85..d660306fe566 100644 --- a/exporter/sapmexporter/examples/signalfx-k8s.yaml +++ b/exporter/sapmexporter/examples/signalfx-k8s.yaml @@ -134,8 +134,6 @@ spec: - command: - "/otelcontribcol" - "--config=/conf/otel-collector-config.yaml" -# Memory Ballast size should be max 1/3 to 1/2 of memory. - - "--mem-ballast-size-mib=683" image: otel/opentelemetry-collector-contrib:0.12.0 name: otel-collector resources: diff --git a/exporter/sapmexporter/exporter.go b/exporter/sapmexporter/exporter.go index fb23755a0724..df56738c9d77 100644 --- a/exporter/sapmexporter/exporter.go +++ b/exporter/sapmexporter/exporter.go @@ -10,6 +10,7 @@ import ( "github.com/jaegertracing/jaeger/model" sapmclient "github.com/signalfx/sapm-proto/client" + "go.opentelemetry.io/collector/client" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/consumer/consumererror" @@ -41,8 +42,7 @@ func (se *sapmExporter) Shutdown(context.Context) error { return nil } -func newSAPMExporter(cfg *Config, params exporter.CreateSettings) (sapmExporter, error) { - +func newSAPMExporter(cfg *Config, params exporter.Settings) (sapmExporter, error) { client, err := sapmclient.New(cfg.clientOptions()...) if err != nil { return sapmExporter{}, err @@ -55,13 +55,13 @@ func newSAPMExporter(cfg *Config, params exporter.CreateSettings) (sapmExporter, }, err } -func newSAPMTracesExporter(cfg *Config, set exporter.CreateSettings) (exporter.Traces, error) { +func newSAPMTracesExporter(cfg *Config, set exporter.Settings) (exporter.Traces, error) { se, err := newSAPMExporter(cfg, set) if err != nil { return nil, err } - te, err := exporterhelper.NewTracesExporter( + te, err := exporterhelper.NewTraces( context.TODO(), set, cfg, @@ -71,7 +71,6 @@ func newSAPMTracesExporter(cfg *Config, set exporter.CreateSettings) (exporter.T exporterhelper.WithRetry(cfg.BackOffConfig), exporterhelper.WithTimeout(cfg.TimeoutSettings), ) - if err != nil { return nil, err } @@ -95,12 +94,9 @@ func (se *sapmExporter) pushTraceData(ctx context.Context, td ptrace.Traces) err return nil } - // All metrics in the pmetric.Metrics will have the same access token because of the BatchPerResourceMetrics. - accessToken := se.retrieveAccessToken(rss.At(0)) - batches, err := jaeger.ProtoFromTraces(td) - if err != nil { - return consumererror.NewPermanent(err) - } + accessToken := se.retrieveAccessToken(ctx, rss.At(0)) + + batches := jaeger.ProtoFromTraces(td) // Cannot remove the access token from the pdata, because exporters required to not modify incoming pdata, // so need to remove that after conversion. @@ -126,12 +122,18 @@ func (se *sapmExporter) pushTraceData(ctx context.Context, td ptrace.Traces) err return nil } -func (se *sapmExporter) retrieveAccessToken(md ptrace.ResourceSpans) string { +func (se *sapmExporter) retrieveAccessToken(ctx context.Context, md ptrace.ResourceSpans) string { if !se.config.AccessTokenPassthrough { // Nothing to do if token is pass through not configured or resource is nil. return "" } + cl := client.FromContext(ctx) + ss := cl.Metadata.Get(splunk.SFxAccessTokenHeader) + if len(ss) > 0 { + return ss[0] + } + attrs := md.Resource().Attributes() if accessToken, ok := attrs.Get(splunk.SFxAccessTokenLabel); ok { return accessToken.Str() diff --git a/exporter/sapmexporter/exporter_test.go b/exporter/sapmexporter/exporter_test.go index 846380839960..10302879acc8 100644 --- a/exporter/sapmexporter/exporter_test.go +++ b/exporter/sapmexporter/exporter_test.go @@ -18,6 +18,7 @@ import ( splunksapm "github.com/signalfx/sapm-proto/gen" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/client" "go.opentelemetry.io/collector/exporter/exportertest" "go.opentelemetry.io/collector/pdata/ptrace" @@ -25,7 +26,7 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger" ) -func TestCreateTracesExporter(t *testing.T) { +func TestCreateTraces(t *testing.T) { cfg := &Config{ Endpoint: "test-endpoint", AccessToken: "abcd1234", @@ -36,7 +37,7 @@ func TestCreateTracesExporter(t *testing.T) { AccessTokenPassthrough: true, }, } - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() te, err := newSAPMTracesExporter(cfg, params) assert.NoError(t, err) @@ -91,8 +92,7 @@ func TestFilterToken(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { traces := buildTestTraces(tt.useToken) - batches, err := jaeger.ProtoFromTraces(traces) - require.NoError(t, err) + batches := jaeger.ProtoFromTraces(traces) assert.Equal(t, tt.useToken, hasToken(batches)) filterToken(batches) assert.False(t, hasToken(batches)) @@ -196,7 +196,7 @@ func TestSAPMClientTokenUsageAndErrorMarshalling(t *testing.T) { AccessTokenPassthrough: tt.accessTokenPassthrough, }, } - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() se, err := newSAPMExporter(cfg, params) assert.NoError(t, err) @@ -215,6 +215,79 @@ func TestSAPMClientTokenUsageAndErrorMarshalling(t *testing.T) { } } +func TestSAPMClientTokenAccess(t *testing.T) { + tests := []struct { + name string + inContext bool + accessTokenPassthrough bool + }{ + { + name: "Token in context with passthrough", + inContext: true, + accessTokenPassthrough: true, + }, + { + name: "Token in attributes with passthrough", + inContext: false, + accessTokenPassthrough: true, + }, + { + name: "Token in config wihout passthrough", + inContext: false, + accessTokenPassthrough: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tracesReceived := false + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + expectedToken := "ClientAccessToken" + if tt.accessTokenPassthrough && tt.inContext { + expectedToken = "SplunkAccessToken" + } else if tt.accessTokenPassthrough && !tt.inContext { + expectedToken = "TraceAccessToken0" + } + assert.Contains(t, r.Header.Get("x-sf-token"), expectedToken) + status := 200 + w.WriteHeader(status) + tracesReceived = true + })) + defer func() { + assert.True(t, tracesReceived, "Test server never received traces.") + }() + defer server.Close() + + cfg := &Config{ + Endpoint: server.URL, + AccessToken: "ClientAccessToken", + AccessTokenPassthroughConfig: splunk.AccessTokenPassthroughConfig{ + AccessTokenPassthrough: tt.accessTokenPassthrough, + }, + } + params := exportertest.NewNopSettings() + + se, err := newSAPMExporter(cfg, params) + assert.NoError(t, err) + assert.NotNil(t, se, "failed to create trace exporter") + + trace, testTraceErr := buildTestTrace() + require.NoError(t, testTraceErr) + + ctx := context.Background() + if tt.inContext { + ctx = client.NewContext( + ctx, + client.Info{Metadata: client.NewMetadata( + map[string][]string{splunk.SFxAccessTokenHeader: {"SplunkAccessToken"}}, + )}, + ) + } + err = se.pushTraceData(ctx, trace) + require.NoError(t, err) + }) + } +} + func decompress(body io.Reader, compression string) ([]byte, error) { switch compression { case "": @@ -291,13 +364,13 @@ func TestCompression(t *testing.T) { assert.EqualValues(t, compression, tt.receivedCompression) payload, err := decompress(r.Body, compression) - require.NoError(t, err) + assert.NoError(t, err) var sapm splunksapm.PostSpansRequest err = sapm.Unmarshal(payload) - require.NoError(t, err) + assert.NoError(t, err) - w.WriteHeader(200) + w.WriteHeader(http.StatusOK) tracesReceived = true }, ), @@ -312,7 +385,7 @@ func TestCompression(t *testing.T) { DisableCompression: tt.configDisableCompression, Compression: tt.configCompression, } - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() se, err := newSAPMExporter(cfg, params) assert.NoError(t, err) diff --git a/exporter/sapmexporter/factory.go b/exporter/sapmexporter/factory.go index 58ef76f720f2..c99a5432801a 100644 --- a/exporter/sapmexporter/factory.go +++ b/exporter/sapmexporter/factory.go @@ -33,15 +33,15 @@ func createDefaultConfig() component.Config { AccessTokenPassthroughConfig: splunk.AccessTokenPassthroughConfig{ AccessTokenPassthrough: true, }, - TimeoutSettings: exporterhelper.NewDefaultTimeoutSettings(), + TimeoutSettings: exporterhelper.NewDefaultTimeoutConfig(), BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), } } func createTracesExporter( _ context.Context, - params exporter.CreateSettings, + params exporter.Settings, cfg component.Config, ) (exporter.Traces, error) { eCfg := cfg.(*Config) diff --git a/exporter/sapmexporter/factory_test.go b/exporter/sapmexporter/factory_test.go index f06670f6c156..b8378c29accc 100644 --- a/exporter/sapmexporter/factory_test.go +++ b/exporter/sapmexporter/factory_test.go @@ -26,13 +26,13 @@ func TestCreateExporter(t *testing.T) { cfg := factory.CreateDefaultConfig() eCfg := cfg.(*Config) eCfg.Endpoint = "http://local" - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() - te, err := factory.CreateTracesExporter(context.Background(), params, eCfg) + te, err := factory.CreateTraces(context.Background(), params, eCfg) assert.NoError(t, err) assert.NotNil(t, te, "failed to create trace exporter") - me, err := factory.CreateMetricsExporter(context.Background(), params, eCfg) + me, err := factory.CreateMetrics(context.Background(), params, eCfg) assert.Error(t, err) assert.Nil(t, me) } diff --git a/exporter/sapmexporter/generated_component_test.go b/exporter/sapmexporter/generated_component_test.go index 23937d3bdf26..eb26430da963 100644 --- a/exporter/sapmexporter/generated_component_test.go +++ b/exporter/sapmexporter/generated_component_test.go @@ -32,13 +32,13 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -50,21 +50,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(exporter.Logs) require.True(t, ok) diff --git a/exporter/sapmexporter/generated_package_test.go b/exporter/sapmexporter/generated_package_test.go index 9aa53997349c..62ae0f36773d 100644 --- a/exporter/sapmexporter/generated_package_test.go +++ b/exporter/sapmexporter/generated_package_test.go @@ -9,5 +9,5 @@ import ( ) func TestMain(m *testing.M) { - goleak.VerifyTestMain(m, goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start")) + goleak.VerifyTestMain(m) } diff --git a/exporter/sapmexporter/go.mod b/exporter/sapmexporter/go.mod index 253a7847e11d..996cfa14d9da 100644 --- a/exporter/sapmexporter/go.mod +++ b/exporter/sapmexporter/go.mod @@ -1,73 +1,78 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sapmexporter -go 1.21.0 +go 1.22.0 require ( github.com/cenkalti/backoff/v4 v4.3.0 - github.com/jaegertracing/jaeger v1.57.0 - github.com/klauspost/compress v1.17.8 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchperresourceattr v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.102.0 - github.com/signalfx/sapm-proto v0.14.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/jaegertracing/jaeger v1.62.0 + github.com/klauspost/compress v1.17.11 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchperresourceattr v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.116.0 + github.com/signalfx/sapm-proto v0.17.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/client v1.22.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) require ( - github.com/apache/thrift v0.20.0 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/apache/thrift v0.21.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/collector/semconv v0.102.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.51.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/collector/semconv v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.30.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/sapmexporter/go.sum b/exporter/sapmexporter/go.sum index e594c6d644c0..03796a44ec09 100644 --- a/exporter/sapmexporter/go.sum +++ b/exporter/sapmexporter/go.sum @@ -1,77 +1,45 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/apache/thrift v0.20.0 h1:631+KvYbsBZxmuJjYwhezVsrfc/TbqtZV4QcxOX1fOI= -github.com/apache/thrift v0.20.0/go.mod h1:hOk1BQqcp2OLzGsyVXdfMk7YFlMxK3aoEVhjD06QhB8= -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/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE= +github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/jaegertracing/jaeger v1.57.0 h1:3wDtUUPs6NRYH7+d+y8MilDkLHdpPrVlQ2wbcsA62bs= -github.com/jaegertracing/jaeger v1.57.0/go.mod h1:p/1fxIU9hKHl7qEhKC72p2ZYVhvvZvNB73y6V7YyuTs= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/jaegertracing/jaeger v1.62.0 h1:YoaJ2e8oVz5sqGGlVAKSUCED8DzJ1q7PojBmZFNKoJA= +github.com/jaegertracing/jaeger v1.62.0/go.mod h1:jhEIHazwyb+a6xlRBi+p96BAvTYTSmGkghcwdQfV7FM= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -88,72 +56,81 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/signalfx/sapm-proto v0.14.0 h1:KWh3I5E4EkelB19aP1/54Ik8khSioC/RVRW/riOfRGg= -github.com/signalfx/sapm-proto v0.14.0/go.mod h1:Km6PskZh966cqNoUn3AmRyGRix5VfwnxVBvn2vjRC9U= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/signalfx/sapm-proto v0.17.0 h1:KY+9zm/yDOq6uzaguI1RmrJcWxzbkGv0zE6GplA3ytc= +github.com/signalfx/sapm-proto v0.17.0/go.mod h1:c8fGx9DjGP7Hqif7g6Zy6E+BCMXK/dERFU2b3faA0gk= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.51.0 h1:Xs2Ncz0gNihqu9iosIZ5SkBbWo5T8JhhLJFMQL1qmLI= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.51.0/go.mod h1:vy+2G/6NvVMpwGX/NyLqcC41fxepnuKHk16E6IZUcJc= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector v0.111.0 h1:D3LJTYrrK2ac94E2PXPSbVkArqxbklbCLsE4MAJQdRo= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 h1:ZIg3ZT/aQ7AfKqdwp7ECpOK6vHqquXXuyTjIO8ZdmPs= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0/go.mod h1:DQAwmETtZV00skUwgD6+0U89g80NKsJE3DCKeLLPQMI= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -163,44 +140,27 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -208,36 +168,14 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/exporter/sapmexporter/internal/metadata/generated_status.go b/exporter/sapmexporter/internal/metadata/generated_status.go index 61919e0e6d61..9e925424f0ed 100644 --- a/exporter/sapmexporter/internal/metadata/generated_status.go +++ b/exporter/sapmexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("sapm") + Type = component.MustNewType("sapm") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sapmexporter" ) const ( diff --git a/exporter/sapmexporter/internal/metadata/generated_telemetry.go b/exporter/sapmexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index f681ad944721..000000000000 --- a/exporter/sapmexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/sapm") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/sapm") -} diff --git a/exporter/sapmexporter/internal/metadata/generated_telemetry_test.go b/exporter/sapmexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index b0f194df9d28..000000000000 --- a/exporter/sapmexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/sapm", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/sapm", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/sapmexporter/metadata.yaml b/exporter/sapmexporter/metadata.yaml index 91eb60ad913d..4bab1554171d 100644 --- a/exporter/sapmexporter/metadata.yaml +++ b/exporter/sapmexporter/metadata.yaml @@ -1,5 +1,4 @@ type: sapm -scope_name: otelcol/sapm status: class: exporter @@ -12,8 +11,3 @@ status: tests: expect_consumer_error: true - goleak: - ignore: - top: - # See https://github.com/census-instrumentation/opencensus-go/issues/1191 for more information. - - "go.opencensus.io/stats/view.(*worker).start" \ No newline at end of file diff --git a/exporter/sentryexporter/README.md b/exporter/sentryexporter/README.md index d8464e8dd487..5a870c2387b9 100644 --- a/exporter/sentryexporter/README.md +++ b/exporter/sentryexporter/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fsentry%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fsentry) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fsentry%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fsentry) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@AbhiPrasad](https://www.github.com/AbhiPrasad) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib diff --git a/exporter/sentryexporter/config_test.go b/exporter/sentryexporter/config_test.go index 14563ed1373b..3769b1f1ca95 100644 --- a/exporter/sentryexporter/config_test.go +++ b/exporter/sentryexporter/config_test.go @@ -45,7 +45,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) diff --git a/exporter/sentryexporter/factory.go b/exporter/sentryexporter/factory.go index 856cd7f77149..7e56f7968edc 100644 --- a/exporter/sentryexporter/factory.go +++ b/exporter/sentryexporter/factory.go @@ -30,7 +30,7 @@ func createDefaultConfig() component.Config { func createTracesExporter( _ context.Context, - params exporter.CreateSettings, + params exporter.Settings, config component.Config, ) (exporter.Traces, error) { sentryConfig, ok := config.(*Config) diff --git a/exporter/sentryexporter/factory_test.go b/exporter/sentryexporter/factory_test.go index 1827e3ad9750..9164cc17fcad 100644 --- a/exporter/sentryexporter/factory_test.go +++ b/exporter/sentryexporter/factory_test.go @@ -27,13 +27,13 @@ func TestCreateExporter(t *testing.T) { cfg := factory.CreateDefaultConfig() eCfg := cfg.(*Config) - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() - te, err := factory.CreateTracesExporter(context.Background(), params, eCfg) + te, err := factory.CreateTraces(context.Background(), params, eCfg) assert.NoError(t, err) assert.NotNil(t, te, "failed to create trace exporter") - me, err := factory.CreateMetricsExporter(context.Background(), params, eCfg) + me, err := factory.CreateMetrics(context.Background(), params, eCfg) assert.Error(t, err) assert.Nil(t, me) } diff --git a/exporter/sentryexporter/generated_component_test.go b/exporter/sentryexporter/generated_component_test.go index 1809ab6cb1f5..ff65ecfc1656 100644 --- a/exporter/sentryexporter/generated_component_test.go +++ b/exporter/sentryexporter/generated_component_test.go @@ -32,13 +32,13 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -50,21 +50,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(exporter.Logs) require.True(t, ok) diff --git a/exporter/sentryexporter/go.mod b/exporter/sentryexporter/go.mod index 0e80858b14a3..7cfa19f26601 100644 --- a/exporter/sentryexporter/go.mod +++ b/exporter/sentryexporter/go.mod @@ -1,63 +1,69 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sentryexporter -go 1.21.0 +go 1.22.0 require ( - github.com/getsentry/sentry-go v0.28.0 + github.com/getsentry/sentry-go v0.30.0 github.com/google/go-cmp v0.6.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/semconv v0.116.0 go.uber.org/goleak v1.3.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configretry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/consumer v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + go.opentelemetry.io/collector/config/configretry v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/consumer v1.22.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/sentryexporter/go.sum b/exporter/sentryexporter/go.sum index 2a79cda703be..228440f6f5f4 100644 --- a/exporter/sentryexporter/go.sum +++ b/exporter/sentryexporter/go.sum @@ -1,30 +1,30 @@ -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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/getsentry/sentry-go v0.28.0 h1:7Rqx9M3ythTKy2J6uZLHmc8Sz9OGgIlseuO1iBX/s0M= -github.com/getsentry/sentry-go v0.28.0/go.mod h1:1fQZ+7l7eeJ3wYi82q5Hg8GqAPgefRq+FP/QhafYVgg= +github.com/getsentry/sentry-go v0.30.0 h1:lWUwDnY7sKHaVIoZ9wYqRHJ5iEmoc0pqcRqFkosKzBo= +github.com/getsentry/sentry-go v0.30.0/go.mod h1:WU9B9/1/sHDqeV8T+3VwwbjeR5MSXs/6aqG3mqZrezA= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -33,8 +33,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -54,58 +54,72 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -121,20 +135,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -143,12 +157,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/exporter/sentryexporter/internal/metadata/generated_status.go b/exporter/sentryexporter/internal/metadata/generated_status.go index 18fd0f4935ea..b38ab9be2d14 100644 --- a/exporter/sentryexporter/internal/metadata/generated_status.go +++ b/exporter/sentryexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("sentry") + Type = component.MustNewType("sentry") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sentryexporter" ) const ( diff --git a/exporter/sentryexporter/internal/metadata/generated_telemetry.go b/exporter/sentryexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index e77e6985c185..000000000000 --- a/exporter/sentryexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/sentry") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/sentry") -} diff --git a/exporter/sentryexporter/internal/metadata/generated_telemetry_test.go b/exporter/sentryexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index c956c12a6f7a..000000000000 --- a/exporter/sentryexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/sentry", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/sentry", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/sentryexporter/metadata.yaml b/exporter/sentryexporter/metadata.yaml index 83375983bd64..c9cfb5d63e59 100644 --- a/exporter/sentryexporter/metadata.yaml +++ b/exporter/sentryexporter/metadata.yaml @@ -1,5 +1,4 @@ type: sentry -scope_name: otelcol/sentry status: class: exporter diff --git a/exporter/sentryexporter/sentry_exporter.go b/exporter/sentryexporter/sentry_exporter.go index 8334aa257d52..430997173089 100644 --- a/exporter/sentryexporter/sentry_exporter.go +++ b/exporter/sentryexporter/sentry_exporter.go @@ -19,7 +19,7 @@ import ( "go.opentelemetry.io/collector/exporter/exporterhelper" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.18.0" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/traceutil" ) @@ -480,7 +480,7 @@ func generateEventID() sentry.EventID { } // createSentryExporter returns a new Sentry Exporter. -func createSentryExporter(config *Config, set exporter.CreateSettings) (exporter.Traces, error) { +func createSentryExporter(config *Config, set exporter.Settings) (exporter.Traces, error) { transport := newSentryTransport() clientOptions := sentry.ClientOptions{ @@ -499,7 +499,7 @@ func createSentryExporter(config *Config, set exporter.CreateSettings) (exporter environment: config.Environment, } - return exporterhelper.NewTracesExporter( + return exporterhelper.NewTraces( context.TODO(), set, config, diff --git a/exporter/sentryexporter/sentry_exporter_test.go b/exporter/sentryexporter/sentry_exporter_test.go index 86f0b50b84b9..032426758d0d 100644 --- a/exporter/sentryexporter/sentry_exporter_test.go +++ b/exporter/sentryexporter/sentry_exporter_test.go @@ -8,6 +8,7 @@ import ( "encoding/hex" "encoding/json" "errors" + "net/http" "testing" "github.com/getsentry/sentry-go" @@ -16,7 +17,7 @@ import ( "github.com/stretchr/testify/assert" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.18.0" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/traceutil" ) @@ -370,7 +371,7 @@ func TestGenerateSpanDescriptors(t *testing.T) { testName: "http-client", name: "/api/users/{user_id}", attrs: map[string]any{ - conventions.AttributeHTTPMethod: "GET", + conventions.AttributeHTTPMethod: http.MethodGet, }, spanKind: ptrace.SpanKindClient, op: "http.client", @@ -380,7 +381,7 @@ func TestGenerateSpanDescriptors(t *testing.T) { testName: "http-server", name: "/api/users/{user_id}", attrs: map[string]any{ - conventions.AttributeHTTPMethod: "POST", + conventions.AttributeHTTPMethod: http.MethodPost, }, spanKind: ptrace.SpanKindServer, op: "http.server", @@ -461,13 +462,13 @@ func TestGenerateTagsFromAttributes(t *testing.T) { tags := generateTagsFromAttributes(attrs) stringVal := tags["string-key"] - assert.Equal(t, stringVal, "string-value") + assert.Equal(t, "string-value", stringVal) boolVal := tags["bool-key"] - assert.Equal(t, boolVal, "true") + assert.Equal(t, "true", boolVal) doubleVal := tags["double-key"] - assert.Equal(t, doubleVal, "123.123") + assert.Equal(t, "123.123", doubleVal) intVal := tags["int-key"] - assert.Equal(t, intVal, "321") + assert.Equal(t, "321", intVal) } type SpanStatusCase struct { @@ -600,7 +601,7 @@ func TestClassifyOrphanSpans(t *testing.T) { transactionMap: generateEmptyTransactionMap(rootSpan1), spans: generateOrphanSpansFromSpans(childChildSpan1, childSpan1, childSpan2), assertion: func(t *testing.T, orphanSpans []*sentry.Span) { - assert.Len(t, orphanSpans, 0) + assert.Empty(t, orphanSpans) }, }, { @@ -628,7 +629,7 @@ func TestClassifyOrphanSpans(t *testing.T) { transactionMap: generateEmptyTransactionMap(rootSpan1, rootSpan2), spans: generateOrphanSpansFromSpans(childChildSpan1, childSpan1, root2childSpan, childSpan2), assertion: func(t *testing.T, orphanSpans []*sentry.Span) { - assert.Len(t, orphanSpans, 0) + assert.Empty(t, orphanSpans) }, }, } diff --git a/exporter/signalfxexporter/README.md b/exporter/signalfxexporter/README.md index d07b5b48a4dc..ad988488ee57 100644 --- a/exporter/signalfxexporter/README.md +++ b/exporter/signalfxexporter/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fsignalfx%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fsignalfx) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fsignalfx%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fsignalfx) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@dmitryax](https://www.github.com/dmitryax), [@crobert-1](https://www.github.com/crobert-1) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib diff --git a/exporter/signalfxexporter/config.go b/exporter/signalfxexporter/config.go index 808af0cf9f23..9703b9313db8 100644 --- a/exporter/signalfxexporter/config.go +++ b/exporter/signalfxexporter/config.go @@ -50,9 +50,9 @@ var _ confmap.Unmarshaler = (*Config)(nil) // Config defines configuration for SignalFx exporter. type Config struct { - exporterhelper.QueueSettings `mapstructure:"sending_queue"` - configretry.BackOffConfig `mapstructure:"retry_on_failure"` - confighttp.ClientConfig `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` + configretry.BackOffConfig `mapstructure:"retry_on_failure"` + confighttp.ClientConfig `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. // AccessToken is the authentication token provided by SignalFx. AccessToken configopaque.String `mapstructure:"access_token"` @@ -131,7 +131,7 @@ type Config struct { // to be used in a dimension key. NonAlphanumericDimensionChars string `mapstructure:"nonalphanumeric_dimension_chars"` - // Whether to drop histogram bucket metrics dispatched to Splunk Observability. + // Whether to drop histogram bucket metrics dispatched to Splunk Observability. // Default value is set to false. DropHistogramBuckets bool `mapstructure:"drop_histogram_buckets"` diff --git a/exporter/signalfxexporter/config_test.go b/exporter/signalfxexporter/config_test.go index 7f9913dc44e4..0a60a9aff521 100644 --- a/exporter/signalfxexporter/config_test.go +++ b/exporter/signalfxexporter/config_test.go @@ -4,6 +4,7 @@ package signalfxexporter import ( + "net/http" "net/url" "path/filepath" "testing" @@ -38,6 +39,10 @@ func TestLoadConfig(t *testing.T) { seventy := 70 hundred := 100 idleConnTimeout := 30 * time.Second + defaultMaxIdleConns := http.DefaultTransport.(*http.Transport).MaxIdleConns + defaultMaxIdleConnsPerHost := http.DefaultTransport.(*http.Transport).MaxIdleConnsPerHost + defaultMaxConnsPerHost := http.DefaultTransport.(*http.Transport).MaxConnsPerHost + defaultIdleConnTimeout := http.DefaultTransport.(*http.Transport).IdleConnTimeout tests := []struct { id component.ID @@ -50,9 +55,10 @@ func TestLoadConfig(t *testing.T) { Realm: "ap0", ClientConfig: confighttp.ClientConfig{ Timeout: 10 * time.Second, - Headers: nil, + Headers: map[string]configopaque.String{}, MaxIdleConns: &hundred, MaxIdleConnsPerHost: &hundred, + MaxConnsPerHost: &defaultMaxConnsPerHost, IdleConnTimeout: &idleConnTimeout, HTTP2ReadIdleTimeout: 10 * time.Second, HTTP2PingTimeout: 10 * time.Second, @@ -65,7 +71,7 @@ func TestLoadConfig(t *testing.T) { RandomizationFactor: backoff.DefaultRandomizationFactor, Multiplier: backoff.DefaultMultiplier, }, - QueueSettings: exporterhelper.NewDefaultQueueSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), AccessTokenPassthroughConfig: splunk.AccessTokenPassthroughConfig{ AccessTokenPassthrough: true, }, @@ -86,8 +92,13 @@ func TestLoadConfig(t *testing.T) { ExcludeProperties: nil, Correlation: &correlation.Config{ ClientConfig: confighttp.ClientConfig{ - Endpoint: "", - Timeout: 5 * time.Second, + Endpoint: "", + Timeout: 5 * time.Second, + Headers: map[string]configopaque.String{}, + MaxIdleConns: &defaultMaxIdleConns, + MaxIdleConnsPerHost: &defaultMaxIdleConnsPerHost, + MaxConnsPerHost: &defaultMaxConnsPerHost, + IdleConnTimeout: &defaultIdleConnTimeout, }, StaleServiceTimeout: 5 * time.Minute, SyncAttributes: map[string]string{ @@ -120,6 +131,7 @@ func TestLoadConfig(t *testing.T) { }, MaxIdleConns: &seventy, MaxIdleConnsPerHost: &seventy, + MaxConnsPerHost: &defaultMaxConnsPerHost, IdleConnTimeout: &idleConnTimeout, HTTP2ReadIdleTimeout: 10 * time.Second, HTTP2PingTimeout: 10 * time.Second, @@ -132,7 +144,7 @@ func TestLoadConfig(t *testing.T) { RandomizationFactor: backoff.DefaultRandomizationFactor, Multiplier: backoff.DefaultMultiplier, }, - QueueSettings: exporterhelper.QueueSettings{ + QueueSettings: exporterhelper.QueueConfig{ Enabled: true, NumConsumers: 2, QueueSize: 10, @@ -246,8 +258,13 @@ func TestLoadConfig(t *testing.T) { }, Correlation: &correlation.Config{ ClientConfig: confighttp.ClientConfig{ - Endpoint: "", - Timeout: 5 * time.Second, + Endpoint: "", + Timeout: 5 * time.Second, + Headers: map[string]configopaque.String{}, + MaxIdleConns: &defaultMaxIdleConns, + MaxIdleConnsPerHost: &defaultMaxIdleConnsPerHost, + MaxConnsPerHost: &defaultMaxConnsPerHost, + IdleConnTimeout: &defaultIdleConnTimeout, }, StaleServiceTimeout: 5 * time.Minute, SyncAttributes: map[string]string{ @@ -507,7 +524,7 @@ func TestConfigValidateErrors(t *testing.T) { cfg: &Config{ Realm: "us0", AccessToken: "access_token", - QueueSettings: exporterhelper.QueueSettings{ + QueueSettings: exporterhelper.QueueConfig{ Enabled: true, QueueSize: -1, }, diff --git a/exporter/signalfxexporter/dpclient.go b/exporter/signalfxexporter/dpclient.go index 82748947f4be..cdb7338c1bf8 100644 --- a/exporter/signalfxexporter/dpclient.go +++ b/exporter/signalfxexporter/dpclient.go @@ -111,7 +111,6 @@ func (s *sfxDPClient) pushMetricsData( } return 0, nil - } func (s *sfxDPClient) postData(ctx context.Context, body io.Reader, headers map[string]string) error { @@ -119,7 +118,7 @@ func (s *sfxDPClient) postData(ctx context.Context, body io.Reader, headers map[ if !strings.HasSuffix(datapointURL.Path, "v2/datapoint") { datapointURL.Path = path.Join(datapointURL.Path, "v2/datapoint") } - req, err := http.NewRequestWithContext(ctx, "POST", datapointURL.String(), body) + req, err := http.NewRequestWithContext(ctx, http.MethodPost, datapointURL.String(), body) if err != nil { return consumererror.NewPermanent(err) } @@ -154,7 +153,6 @@ func (s *sfxDPClient) postData(ctx context.Context, body io.Reader, headers map[ } func (s *sfxDPClient) pushMetricsDataForToken(ctx context.Context, sfxDataPoints []*sfxpb.DataPoint, accessToken string) (int, error) { - if s.logDataPoints { for _, dp := range sfxDataPoints { s.logger.Debug("Dispatching SFx datapoint", zap.Stringer("dp", dp)) @@ -210,7 +208,6 @@ func (s *sfxDPClient) retrieveAccessToken(md pmetric.ResourceMetrics) string { } func (s *sfxDPClient) pushOTLPMetricsDataForToken(ctx context.Context, mh pmetric.Metrics, accessToken string) (int, error) { - dataPointCount := mh.DataPointCount() if s.logDataPoints { s.logger.Debug("Count of metrics to send in OTLP format", @@ -247,7 +244,6 @@ func (s *sfxDPClient) pushOTLPMetricsDataForToken(ctx context.Context, mh pmetri s.logger.Debug("Sending metrics in OTLP format") err = s.postData(ctx, body, headers) - if err != nil { return dataPointCount, consumererror.NewMetrics(err, mh) } @@ -256,11 +252,9 @@ func (s *sfxDPClient) pushOTLPMetricsDataForToken(ctx context.Context, mh pmetri } func (s *sfxDPClient) encodeOTLPBody(md pmetric.Metrics) (bodyReader io.Reader, compressed bool, err error) { - tr := pmetricotlp.NewExportRequestFromMetrics(md) body, err := tr.MarshalProto() - if err != nil { return nil, false, err } diff --git a/exporter/signalfxexporter/eventclient.go b/exporter/signalfxexporter/eventclient.go index 9ba8bab68702..8bb12082cfa1 100644 --- a/exporter/signalfxexporter/eventclient.go +++ b/exporter/signalfxexporter/eventclient.go @@ -58,7 +58,7 @@ func (s *sfxEventClient) pushLogsData(ctx context.Context, ld plog.Logs) (int, e if !strings.HasSuffix(eventURL.Path, "v2/event") { eventURL.Path = path.Join(eventURL.Path, "v2/event") } - req, err := http.NewRequestWithContext(ctx, "POST", eventURL.String(), body) + req, err := http.NewRequestWithContext(ctx, http.MethodPost, eventURL.String(), body) if err != nil { return ld.LogRecordCount(), consumererror.NewPermanent(err) } diff --git a/exporter/signalfxexporter/exporter.go b/exporter/signalfxexporter/exporter.go index ce53b2d2e9cd..eaa3fa361aa7 100644 --- a/exporter/signalfxexporter/exporter.go +++ b/exporter/signalfxexporter/exporter.go @@ -25,9 +25,7 @@ import ( metadata "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata" ) -var ( - errNotStarted = errors.New("exporter has not started") -) +var errNotStarted = errors.New("exporter has not started") // TODO: Find a place for this to be shared. type baseMetricsExporter struct { @@ -60,13 +58,12 @@ type signalfxExporter struct { hostMetadataSyncer *hostmetadata.Syncer converter *translation.MetricsConverter dimClient *dimensions.DimensionClient - cancelFn func() } // newSignalFxExporter returns a new SignalFx exporter. func newSignalFxExporter( config *Config, - createSettings exporter.CreateSettings, + createSettings exporter.Settings, ) (*signalfxExporter, error) { if config == nil { return nil, errors.New("nil config") @@ -100,6 +97,9 @@ func newSignalFxExporter( } func (se *signalfxExporter) start(ctx context.Context, host component.Host) (err error) { + if se.converter != nil { + se.converter.Start() + } ingestURL, err := se.config.getIngestURL() if err != nil { return err @@ -129,8 +129,6 @@ func (se *signalfxExporter) start(ctx context.Context, host component.Host) (err if err != nil { return fmt.Errorf("could not load API TLS config: %w", err) } - cancellable, cancelFn := context.WithCancel(ctx) - se.cancelFn = cancelFn apiURL, err := se.config.getAPIURL() if err != nil { @@ -138,7 +136,6 @@ func (se *signalfxExporter) start(ctx context.Context, host component.Host) (err } dimClient := dimensions.NewDimensionClient( - cancellable, dimensions.DimensionClientOptions{ Token: se.config.AccessToken, APIURL: apiURL, @@ -174,7 +171,7 @@ func newGzipPool() sync.Pool { }} } -func newEventExporter(config *Config, createSettings exporter.CreateSettings) (*signalfxExporter, error) { +func newEventExporter(config *Config, createSettings exporter.Settings) (*signalfxExporter, error) { if config == nil { return nil, errors.New("nil config") } @@ -185,7 +182,6 @@ func newEventExporter(config *Config, createSettings exporter.CreateSettings) (* logger: createSettings.Logger, telemetrySettings: createSettings.TelemetrySettings, }, nil - } func (se *signalfxExporter) startLogs(ctx context.Context, host component.Host) error { @@ -235,8 +231,12 @@ func (se *signalfxExporter) pushLogs(ctx context.Context, ld plog.Logs) error { } func (se *signalfxExporter) shutdown(_ context.Context) error { - if se.cancelFn != nil { - se.cancelFn() + if se.dimClient != nil { + se.dimClient.Shutdown() + } + + if se.converter != nil { + se.converter.Shutdown() } return nil } diff --git a/exporter/signalfxexporter/exporter_test.go b/exporter/signalfxexporter/exporter_test.go index 093f9fbb8222..5da4d7109eb8 100644 --- a/exporter/signalfxexporter/exporter_test.go +++ b/exporter/signalfxexporter/exporter_test.go @@ -86,7 +86,7 @@ func TestNew(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := newSignalFxExporter(tt.config, exportertest.NewNopCreateSettings()) + got, err := newSignalFxExporter(tt.config, exportertest.NewNopSettings()) if tt.wantErr { require.Error(t, err) if tt.wantErrMessage != "" { @@ -187,7 +187,7 @@ func TestConsumeMetrics(t *testing.T) { }, } - client, err := cfg.ToClient(context.Background(), componenttest.NewNopHost(), exportertest.NewNopCreateSettings().TelemetrySettings) + client, err := cfg.ToClient(context.Background(), componenttest.NewNopHost(), exportertest.NewNopSettings().TelemetrySettings) require.NoError(t, err) c, err := translation.NewMetricsConverter(zap.NewNop(), nil, nil, nil, "", false, true) @@ -218,7 +218,7 @@ func TestConsumeMetrics(t *testing.T) { assert.Error(t, err) assert.True(t, consumererror.IsPermanent(err)) assert.True(t, strings.HasPrefix(err.Error(), tt.expectedErrorMsg)) - assert.Contains(t, err.Error(), "response content") + assert.ErrorContains(t, err, "response content") return } @@ -545,7 +545,7 @@ func TestConsumeMetricsWithAccessTokenPassthrough(t *testing.T) { cfg.AccessToken = configopaque.String(fromHeaders) cfg.AccessTokenPassthrough = tt.accessTokenPassthrough cfg.SendOTLPHistograms = tt.sendOTLPHistograms - sfxExp, err := NewFactory().CreateMetricsExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + sfxExp, err := NewFactory().CreateMetrics(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, sfxExp.Start(context.Background(), componenttest.NewNopHost())) defer func() { @@ -568,11 +568,11 @@ func TestConsumeMetricsWithAccessTokenPassthrough(t *testing.T) { } func TestNewEventExporter(t *testing.T) { - got, err := newEventExporter(nil, exportertest.NewNopCreateSettings()) + got, err := newEventExporter(nil, exportertest.NewNopSettings()) assert.EqualError(t, err, "nil config") assert.Nil(t, got) - got, err = newEventExporter(nil, exportertest.NewNopCreateSettings()) + got, err = newEventExporter(nil, exportertest.NewNopSettings()) assert.Error(t, err) assert.Nil(t, got) @@ -582,7 +582,7 @@ func TestNewEventExporter(t *testing.T) { ClientConfig: confighttp.ClientConfig{Timeout: 1 * time.Second}, } - got, err = newEventExporter(cfg, exportertest.NewNopCreateSettings()) + got, err = newEventExporter(cfg, exportertest.NewNopSettings()) assert.NoError(t, err) require.NotNil(t, got) @@ -699,7 +699,7 @@ func TestConsumeEventData(t *testing.T) { }, } - client, err := cfg.ToClient(context.Background(), componenttest.NewNopHost(), exportertest.NewNopCreateSettings().TelemetrySettings) + client, err := cfg.ToClient(context.Background(), componenttest.NewNopHost(), exportertest.NewNopSettings().TelemetrySettings) require.NoError(t, err) eventClient := &sfxEventClient{ @@ -793,7 +793,7 @@ func TestConsumeLogsDataWithAccessTokenPassthrough(t *testing.T) { cfg.Headers["test_header_"] = configopaque.String(tt.name) cfg.AccessToken = configopaque.String(fromHeaders) cfg.AccessTokenPassthrough = tt.accessTokenPassthrough - sfxExp, err := NewFactory().CreateLogsExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + sfxExp, err := NewFactory().CreateLogs(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, sfxExp.Start(context.Background(), componenttest.NewNopHost())) defer func() { @@ -807,7 +807,7 @@ func TestConsumeLogsDataWithAccessTokenPassthrough(t *testing.T) { defer receivedTokens.Unlock() return len(receivedTokens.tokens) == 1 }, 1*time.Second, 10*time.Millisecond) - assert.Equal(t, receivedTokens.tokens[0], tt.expectedToken) + assert.Equal(t, tt.expectedToken, receivedTokens.tokens[0]) }) } } @@ -1169,7 +1169,6 @@ func TestConsumeMetadata(t *testing.T) { logger := zap.NewNop() dimClient := dimensions.NewDimensionClient( - context.Background(), dimensions.DimensionClientOptions{ Token: "foo", APIURL: serverURL, @@ -1203,6 +1202,10 @@ func TestConsumeMetadata(t *testing.T) { case <-c: // wait 500ms longer than send delay case <-time.After(tt.sendDelay + 500*time.Millisecond): + // If no updates are supposed to be sent, the server doesn't update dimensions, and + // doesn't call Done. This is correct behavior, so the test needs to account for it here, + // or a goroutine will be leaked. + defer wg.Done() require.True(t, tt.shouldNotSendUpdate, "timeout waiting for response") } @@ -1257,7 +1260,7 @@ func TestSignalFxExporterConsumeMetadata(t *testing.T) { rCfg := cfg.(*Config) rCfg.AccessToken = "token" rCfg.Realm = "realm" - exp, err := f.CreateMetricsExporter(context.Background(), exportertest.NewNopCreateSettings(), rCfg) + exp, err := f.CreateMetrics(context.Background(), exportertest.NewNopSettings(), rCfg) require.NoError(t, err) kme, ok := exp.(metadata.MetadataExporter) @@ -1328,9 +1331,10 @@ func TestTLSExporterInit(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - sfx, err := newSignalFxExporter(tt.config, exportertest.NewNopCreateSettings()) + sfx, err := newSignalFxExporter(tt.config, exportertest.NewNopSettings()) assert.NoError(t, err) err = sfx.start(context.Background(), componenttest.NewNopHost()) + defer func() { require.NoError(t, sfx.shutdown(context.Background())) }() if tt.wantErr { require.Error(t, err) if tt.wantErrMessage != "" { @@ -1398,10 +1402,11 @@ func TestTLSIngestConnection(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - sfx, err := newSignalFxExporter(tt.config, exportertest.NewNopCreateSettings()) + sfx, err := newSignalFxExporter(tt.config, exportertest.NewNopSettings()) assert.NoError(t, err) err = sfx.start(context.Background(), componenttest.NewNopHost()) assert.NoError(t, err) + defer func() { assert.NoError(t, sfx.shutdown(context.Background())) }() _, err = sfx.pushMetricsData(context.Background(), metricsPayload) if tt.wantErr { @@ -1441,7 +1446,7 @@ func TestDefaultSystemCPUTimeExcludedAndTranslated(t *testing.T) { for _, dp := range dps { if dp.Metric == "cpu.num_processors" || dp.Metric == "cpu.idle" { intVal := dp.Value.IntValue - require.NotNil(t, intVal, fmt.Sprintf("unexpected nil IntValue for %q", dp.Metric)) + require.NotNilf(t, intVal, "unexpected nil IntValue for %q", dp.Metric) found[dp.Metric] = *intVal } else { // account for unexpected w/ test-failing placeholder @@ -1526,10 +1531,7 @@ func TestTLSAPIConnection(t *testing.T) { require.NoError(t, err) serverURL, err := url.Parse(tt.config.APIURL) assert.NoError(t, err) - cancellable, cancelFn := context.WithCancel(context.Background()) - defer cancelFn() dimClient := dimensions.NewDimensionClient( - cancellable, dimensions.DimensionClientOptions{ Token: "", APIURL: serverURL, @@ -1541,6 +1543,7 @@ func TestTLSAPIConnection(t *testing.T) { APITLSConfig: apiTLSCfg, }) dimClient.Start() + defer func() { dimClient.Shutdown() }() se := &signalfxExporter{ dimClient: dimClient, @@ -1808,7 +1811,7 @@ func TestConsumeMixedMetrics(t *testing.T) { }, } - client, err := cfg.ToClient(context.Background(), componenttest.NewNopHost(), exportertest.NewNopCreateSettings().TelemetrySettings) + client, err := cfg.ToClient(context.Background(), componenttest.NewNopHost(), exportertest.NewNopSettings().TelemetrySettings) require.NoError(t, err) c, err := translation.NewMetricsConverter(zap.NewNop(), nil, nil, nil, "", false, false) @@ -1840,7 +1843,7 @@ func TestConsumeMixedMetrics(t *testing.T) { assert.Error(t, err) assert.True(t, consumererror.IsPermanent(err)) assert.True(t, strings.HasPrefix(err.Error(), tt.expectedErrorMsg)) - assert.Contains(t, err.Error(), "response content") + assert.ErrorContains(t, err, "response content") return } diff --git a/exporter/signalfxexporter/factory.go b/exporter/signalfxexporter/factory.go index cabf701a9387..65a3d891371e 100644 --- a/exporter/signalfxexporter/factory.go +++ b/exporter/signalfxexporter/factory.go @@ -50,18 +50,18 @@ func createDefaultConfig() component.Config { maxConnCount := defaultMaxConns idleConnTimeout := 30 * time.Second timeout := 10 * time.Second + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Timeout = defaultHTTPTimeout + clientConfig.MaxIdleConns = &maxConnCount + clientConfig.MaxIdleConnsPerHost = &maxConnCount + clientConfig.IdleConnTimeout = &idleConnTimeout + clientConfig.HTTP2ReadIdleTimeout = defaultHTTP2ReadIdleTimeout + clientConfig.HTTP2PingTimeout = defaultHTTP2PingTimeout return &Config{ BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), - ClientConfig: confighttp.ClientConfig{ - Timeout: defaultHTTPTimeout, - MaxIdleConns: &maxConnCount, - MaxIdleConnsPerHost: &maxConnCount, - IdleConnTimeout: &idleConnTimeout, - HTTP2ReadIdleTimeout: defaultHTTP2ReadIdleTimeout, - HTTP2PingTimeout: defaultHTTP2PingTimeout, - }, + QueueSettings: exporterhelper.NewDefaultQueueConfig(), + ClientConfig: clientConfig, AccessTokenPassthroughConfig: splunk.AccessTokenPassthroughConfig{ AccessTokenPassthrough: true, }, @@ -82,7 +82,7 @@ func createDefaultConfig() component.Config { func createTracesExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, eCfg component.Config, ) (exporter.Traces, error) { cfg := eCfg.(*Config) @@ -101,7 +101,7 @@ func createTracesExporter( set.Logger.Info("Correlation tracking enabled", zap.String("endpoint", corrCfg.ClientConfig.Endpoint)) tracker := correlation.NewTracker(corrCfg, cfg.AccessToken, set) - return exporterhelper.NewTracesExporter( + return exporterhelper.NewTraces( ctx, set, cfg, @@ -112,7 +112,7 @@ func createTracesExporter( func createMetricsExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, config component.Config, ) (exporter.Metrics, error) { cfg := config.(*Config) @@ -122,18 +122,17 @@ func createMetricsExporter( return nil, err } - me, err := exporterhelper.NewMetricsExporter( + me, err := exporterhelper.NewMetrics( ctx, set, cfg, exp.pushMetrics, // explicitly disable since we rely on http.Client timeout logic. - exporterhelper.WithTimeout(exporterhelper.TimeoutSettings{Timeout: 0}), + exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}), exporterhelper.WithRetry(cfg.BackOffConfig), exporterhelper.WithQueue(cfg.QueueSettings), exporterhelper.WithStart(exp.start), exporterhelper.WithShutdown(exp.shutdown)) - if err != nil { return nil, err } @@ -155,7 +154,7 @@ func createMetricsExporter( func createLogsExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exporter.Logs, error) { expCfg := cfg.(*Config) @@ -165,17 +164,16 @@ func createLogsExporter( return nil, err } - le, err := exporterhelper.NewLogsExporter( + le, err := exporterhelper.NewLogs( ctx, set, cfg, exp.pushLogs, // explicitly disable since we rely on http.Client timeout logic. - exporterhelper.WithTimeout(exporterhelper.TimeoutSettings{Timeout: 0}), + exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}), exporterhelper.WithRetry(expCfg.BackOffConfig), exporterhelper.WithQueue(expCfg.QueueSettings), exporterhelper.WithStart(exp.startLogs)) - if err != nil { return nil, err } diff --git a/exporter/signalfxexporter/factory_test.go b/exporter/signalfxexporter/factory_test.go index fd35b3a3905e..4c120f2c505e 100644 --- a/exporter/signalfxexporter/factory_test.go +++ b/exporter/signalfxexporter/factory_test.go @@ -6,7 +6,6 @@ package signalfxexporter import ( "context" "encoding/json" - "fmt" "os" "path/filepath" "testing" @@ -33,32 +32,32 @@ func TestCreateDefaultConfig(t *testing.T) { assert.NoError(t, componenttest.CheckConfigStruct(cfg)) } -func TestCreateMetricsExporter(t *testing.T) { +func TestCreateMetrics(t *testing.T) { cfg := createDefaultConfig() c := cfg.(*Config) c.AccessToken = "access_token" c.Realm = "us0" - _, err := createMetricsExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + _, err := createMetricsExporter(context.Background(), exportertest.NewNopSettings(), cfg) assert.NoError(t, err) } -func TestCreateTracesExporter(t *testing.T) { +func TestCreateTraces(t *testing.T) { cfg := createDefaultConfig() c := cfg.(*Config) c.AccessToken = "access_token" c.Realm = "us0" - _, err := createTracesExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + _, err := createTracesExporter(context.Background(), exportertest.NewNopSettings(), cfg) assert.NoError(t, err) } -func TestCreateTracesExporterNoAccessToken(t *testing.T) { +func TestCreateTracesNoAccessToken(t *testing.T) { cfg := createDefaultConfig() c := cfg.(*Config) c.Realm = "us0" - _, err := createTracesExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + _, err := createTracesExporter(context.Background(), exportertest.NewNopSettings(), cfg) assert.EqualError(t, err, "access_token is required") } @@ -70,9 +69,9 @@ func TestCreateInstanceViaFactory(t *testing.T) { c.AccessToken = "access_token" c.Realm = "us0" - exp, err := factory.CreateMetricsExporter( + exp, err := factory.CreateMetrics( context.Background(), - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg) assert.NoError(t, err) assert.NotNil(t, exp) @@ -81,16 +80,16 @@ func TestCreateInstanceViaFactory(t *testing.T) { expCfg := cfg.(*Config) expCfg.AccessToken = "testToken" expCfg.Realm = "us1" - exp, err = factory.CreateMetricsExporter( + exp, err = factory.CreateMetrics( context.Background(), - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg) assert.NoError(t, err) require.NotNil(t, exp) - logExp, err := factory.CreateLogsExporter( + logExp, err := factory.CreateLogs( context.Background(), - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), cfg) assert.NoError(t, err) require.NotNil(t, logExp) @@ -98,7 +97,7 @@ func TestCreateInstanceViaFactory(t *testing.T) { assert.NoError(t, exp.Shutdown(context.Background())) } -func TestCreateMetricsExporter_CustomConfig(t *testing.T) { +func TestCreateMetrics_CustomConfig(t *testing.T) { config := &Config{ AccessToken: "testToken", Realm: "us1", @@ -111,7 +110,7 @@ func TestCreateMetricsExporter_CustomConfig(t *testing.T) { }, } - te, err := createMetricsExporter(context.Background(), exportertest.NewNopCreateSettings(), config) + te, err := createMetricsExporter(context.Background(), exportertest.NewNopSettings(), config) assert.NoError(t, err) assert.NotNil(t, te) } @@ -143,13 +142,13 @@ func TestDefaultTranslationRules(t *testing.T) { dps, ok = metrics["system.disk.operations.total"] require.True(t, ok, "system.disk.operations.total metrics not found") require.Len(t, dps, 4) - require.Equal(t, 2, len(dps[0].Dimensions)) + require.Len(t, dps[0].Dimensions, 2) // system.disk.io.total new metric calculation dps, ok = metrics["system.disk.io.total"] require.True(t, ok, "system.disk.io.total metrics not found") require.Len(t, dps, 2) - require.Equal(t, 2, len(dps[0].Dimensions)) + require.Len(t, dps[0].Dimensions, 2) for _, dp := range dps { var directionFound bool for _, dim := range dp.Dimensions { @@ -173,20 +172,20 @@ func TestDefaultTranslationRules(t *testing.T) { require.True(t, ok, "disk_ops.total metrics not found") require.Len(t, dps, 1) require.Equal(t, int64(8e3), *dps[0].Value.IntValue) - require.Equal(t, 1, len(dps[0].Dimensions)) + require.Len(t, dps[0].Dimensions, 1) requireDimension(t, dps[0].Dimensions, "host", "host0") // system.network.io.total new metric calculation dps, ok = metrics["system.network.io.total"] require.True(t, ok, "system.network.io.total metrics not found") require.Len(t, dps, 2) - require.Equal(t, 4, len(dps[0].Dimensions)) + require.Len(t, dps[0].Dimensions, 4) // system.network.packets.total new metric calculation dps, ok = metrics["system.network.packets.total"] require.True(t, ok, "system.network.packets.total metrics not found") require.Len(t, dps, 1) - require.Equal(t, 4, len(dps[0].Dimensions)) + require.Len(t, dps[0].Dimensions, 4) require.Equal(t, int64(350), *dps[0].Value.IntValue) requireDimension(t, dps[0].Dimensions, "direction", "receive") @@ -194,7 +193,7 @@ func TestDefaultTranslationRules(t *testing.T) { dps, ok = metrics["network.total"] require.True(t, ok, "network.total metrics not found") require.Len(t, dps, 1) - require.Equal(t, 3, len(dps[0].Dimensions)) + require.Len(t, dps[0].Dimensions, 3) require.Equal(t, int64(10e9), *dps[0].Value.IntValue) } @@ -462,14 +461,14 @@ func TestDefaultDiskTranslations(t *testing.T) { du, ok := m["disk.utilization"] require.True(t, ok) - require.Equal(t, 4, len(du[0].Dimensions)) + require.Len(t, du[0].Dimensions, 4) // cheap test for pct conversion - require.True(t, *du[0].Value.DoubleValue > 1) + require.Greater(t, *du[0].Value.DoubleValue, 1.0) dsu, ok := m["disk.summary_utilization"] require.True(t, ok) - require.Equal(t, 3, len(dsu[0].Dimensions)) - require.True(t, *dsu[0].Value.DoubleValue > 1) + require.Len(t, dsu[0].Dimensions, 3) + require.Greater(t, *dsu[0].Value.DoubleValue, 1.0) } func testGetTranslator(t *testing.T) *translation.MetricTranslator { @@ -506,21 +505,21 @@ func TestDefaultCPUTranslations(t *testing.T) { } cpuUtil := m["cpu.utilization"] - require.Equal(t, 1, len(cpuUtil)) + require.Len(t, cpuUtil, 1) for _, pt := range cpuUtil { require.Equal(t, 66, int(*pt.Value.DoubleValue)) } cpuUtilPerCore := m["cpu.utilization_per_core"] - require.Equal(t, 8, len(cpuUtilPerCore)) + require.Len(t, cpuUtilPerCore, 8) cpuNumProcessors := m["cpu.num_processors"] - require.Equal(t, 1, len(cpuNumProcessors)) + require.Len(t, cpuNumProcessors, 1) cpuStateMetrics := []string{"cpu.idle", "cpu.interrupt", "cpu.system", "cpu.user"} for _, metric := range cpuStateMetrics { dps, ok := m[metric] - require.True(t, ok, fmt.Sprintf("%s metrics not found", metric)) + require.Truef(t, ok, "%s metrics not found", metric) require.Len(t, dps, 9) } } @@ -583,9 +582,8 @@ func TestDefaultExcludesTranslated(t *testing.T) { // the default cpu.utilization metric is added after applying the default translations // (because cpu.utilization_per_core is supplied) and should not be excluded - require.Equal(t, 1, len(dps)) + require.Len(t, dps, 1) require.Equal(t, "cpu.utilization", dps[0].Metric) - } func TestDefaultExcludes_not_translated(t *testing.T) { @@ -601,9 +599,9 @@ func TestDefaultExcludes_not_translated(t *testing.T) { require.NoError(t, err) md := getMetrics(metrics) - require.Equal(t, 69, md.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics().Len()) + require.Equal(t, 54, md.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics().Len()) dps := converter.MetricsToSignalFxV2(md) - require.Equal(t, 0, len(dps)) + require.Empty(t, dps) } // Benchmark test for default translation rules on an example hostmetrics dataset. diff --git a/exporter/signalfxexporter/generated_component_test.go b/exporter/signalfxexporter/generated_component_test.go index ff730a12f2d9..8bb74ca14531 100644 --- a/exporter/signalfxexporter/generated_component_test.go +++ b/exporter/signalfxexporter/generated_component_test.go @@ -32,27 +32,27 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, { name: "metrics", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg) }, }, { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -64,21 +64,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(exporter.Logs) require.True(t, ok) diff --git a/exporter/signalfxexporter/generated_package_test.go b/exporter/signalfxexporter/generated_package_test.go index 914fdb307101..05bce43252c3 100644 --- a/exporter/signalfxexporter/generated_package_test.go +++ b/exporter/signalfxexporter/generated_package_test.go @@ -3,11 +3,11 @@ package signalfxexporter import ( - "os" "testing" + + "go.uber.org/goleak" ) func TestMain(m *testing.M) { - // skipping goleak test as per metadata.yml configuration - os.Exit(m.Run()) + goleak.VerifyTestMain(m) } diff --git a/exporter/signalfxexporter/go.mod b/exporter/signalfxexporter/go.mod index 8da76556b68d..9ad3c743abce 100644 --- a/exporter/signalfxexporter/go.mod +++ b/exporter/signalfxexporter/go.mod @@ -1,96 +1,104 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/signalfxexporter -go 1.21.0 +go 1.22.0 require ( github.com/cenkalti/backoff/v4 v4.3.0 github.com/gobwas/glob v0.2.3 github.com/gogo/protobuf v1.3.2 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchperresourceattr v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/signalfx v0.102.0 - github.com/shirou/gopsutil/v3 v3.24.4 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchperresourceattr v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/signalfx v0.116.0 + github.com/shirou/gopsutil/v4 v4.24.10 github.com/signalfx/com_signalfx_metrics_protobuf v0.0.3 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/confighttp v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/collector/config/configtls v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/confighttp v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/config/configtls v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/semconv v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 - golang.org/x/sys v0.20.0 + golang.org/x/sys v0.28.0 gopkg.in/yaml.v3 v3.0.1 ) require ( - github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/ebitengine/purego v0.8.1 // indirect + github.com/elastic/lunes v0.1.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/magefile/mage v1.15.0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/rs/cors v1.10.1 // indirect - github.com/shoenig/go-m1cpu v0.1.6 // indirect + github.com/rs/cors v1.11.1 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect ) replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/common => ../../internal/common diff --git a/exporter/signalfxexporter/go.sum b/exporter/signalfxexporter/go.sum index d57825b7037b..85248b3613c5 100644 --- a/exporter/signalfxexporter/go.sum +++ b/exporter/signalfxexporter/go.sum @@ -1,5 +1,3 @@ -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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= @@ -7,19 +5,23 @@ github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/BE= +github.com/ebitengine/purego v0.8.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/elastic/lunes v0.1.0 h1:amRtLPjwkWtzDF/RKzcEPMvSsSseLDLW+bnhfNSLRe4= +github.com/elastic/lunes v0.1.0/go.mod h1:xGphYIt3XdZRtyWosHQTErsQTd4OP1p9wsbVoHelrd4= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -38,7 +40,6 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -50,20 +51,22 @@ 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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= +github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= @@ -73,41 +76,25 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= -github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= -github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= -github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= -github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= -github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/shirou/gopsutil/v4 v4.24.10 h1:7VOzPtfw/5YDU+jLEoBwXwxJbQetULywoSV4RYY7HkM= +github.com/shirou/gopsutil/v4 v4.24.10/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8= github.com/signalfx/com_signalfx_metrics_protobuf v0.0.3 h1:32k2QLgsKhcEs55q4REPKyIadvid5FPy2+VMgvbmKJ0= github.com/signalfx/com_signalfx_metrics_protobuf v0.0.3/go.mod h1:gJrXWi7wSGXfiC7+VheQaz+ypdCt5SmZNL+BRxUe7y4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= @@ -116,60 +103,84 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -185,8 +196,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -197,13 +208,12 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -212,18 +222,18 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/exporter/signalfxexporter/internal/apm/correlations/client.go b/exporter/signalfxexporter/internal/apm/correlations/client.go index ba86baf9a6c2..95f418ee01ff 100644 --- a/exporter/signalfxexporter/internal/apm/correlations/client.go +++ b/exporter/signalfxexporter/internal/apm/correlations/client.go @@ -21,10 +21,12 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/signalfxexporter/internal/apm/requests/requestcounter" ) -var ErrChFull = errors.New("request channel full") -var errRetryChFull = errors.New("retry channel full") -var errMaxAttempts = errors.New("maximum attempts exceeded") -var errRequestCancelled = errors.New("request cancelled") +var ( + ErrChFull = errors.New("request channel full") + errRetryChFull = errors.New("retry channel full") + errMaxAttempts = errors.New("maximum attempts exceeded") + errRequestCancelled = errors.New("request cancelled") +) // ErrMaxEntries is an error returned when the correlation endpoint returns a 418 http status // code indicating that the set of services or environments is too large to add another value @@ -199,7 +201,8 @@ func (cc *Client) Correlate(cor *Correlation, cb CorrelateCB) { cor.Logger(cc.log).WithError(err).WithFields(log.Fields{"method": http.MethodPut}).Error("Unable to update dimension, not retrying") } cb(cor, err) - }}) + }, + }) if err != nil { cor.Logger(cc.log).WithError(err).WithFields(log.Fields{"method": http.MethodPut}).Debug("Unable to update dimension, not retrying") } @@ -223,7 +226,8 @@ func (cc *Client) Delete(cor *Correlation, callback SuccessfulDeleteCB) { default: cc.log.WithError(err).Error("Unable to update dimension, not retrying") } - }}) + }, + }) if err != nil { cor.Logger(cc.log).WithError(err).WithFields(log.Fields{"method": http.MethodDelete}).Debug("Unable to update dimension, not retrying") } @@ -243,7 +247,7 @@ func (cc *Client) Get(dimName string, dimValue string, callback SuccessfulGetCB) callback: func(body []byte, statuscode int, err error) { switch statuscode { case http.StatusOK: - var response = map[string][]string{} + response := map[string][]string{} err = json.Unmarshal(body, &response) if err != nil { cc.log.WithError(err).WithFields(log.Fields{"dim": dimName, "value": dimValue}).Error("Unable to unmarshall correlations for dimension") diff --git a/exporter/signalfxexporter/internal/apm/correlations/client_test.go b/exporter/signalfxexporter/internal/apm/correlations/client_test.go index 87ff12866cb6..95d737f280f3 100644 --- a/exporter/signalfxexporter/internal/apm/correlations/client_test.go +++ b/exporter/signalfxexporter/internal/apm/correlations/client_test.go @@ -24,9 +24,11 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/signalfxexporter/internal/apm/log" ) -var getPathRegexp = regexp.MustCompile(`/v2/apm/correlate/([^/]+)/([^/]+)`) // /dimName/dimVal -var putPathRegexp = regexp.MustCompile(`/v2/apm/correlate/([^/]+)/([^/]+)/([^/]+)`) // /dimName/dimVal/{service,environment} -var deletePathRegexp = regexp.MustCompile(`/v2/apm/correlate/([^/]+)/([^/]+)/([^/]+)/([^/]+)`) // /dimName/dimValue/{service,environment}/value +var ( + getPathRegexp = regexp.MustCompile(`/v2/apm/correlate/([^/]+)/([^/]+)`) // /dimName/dimVal + putPathRegexp = regexp.MustCompile(`/v2/apm/correlate/([^/]+)/([^/]+)/([^/]+)`) // /dimName/dimVal/{service,environment} + deletePathRegexp = regexp.MustCompile(`/v2/apm/correlate/([^/]+)/([^/]+)/([^/]+)/([^/]+)`) // /dimName/dimValue/{service,environment}/value +) func waitForCors(corCh <-chan *request, count, waitSeconds int) []*request { // nolint: unparam cors := make([]*request, 0, count) @@ -63,8 +65,8 @@ func makeHandler(t *testing.T, corCh chan<- *request, forcedRespCode *atomic.Val switch r.Method { case http.MethodGet: match := getPathRegexp.FindStringSubmatch(r.URL.Path) - if match == nil || len(match) < 3 { - rw.WriteHeader(404) + if len(match) < 3 { + rw.WriteHeader(http.StatusNotFound) return } corCh <- &request{ @@ -78,14 +80,14 @@ func makeHandler(t *testing.T, corCh chan<- *request, forcedRespCode *atomic.Val return case http.MethodPut: match := putPathRegexp.FindStringSubmatch(r.URL.Path) - if match == nil || len(match) < 4 { - rw.WriteHeader(404) + if len(match) < 4 { + rw.WriteHeader(http.StatusNotFound) return } body, err := io.ReadAll(r.Body) if err != nil { - rw.WriteHeader(400) + rw.WriteHeader(http.StatusBadRequest) return } cor = &request{ @@ -100,8 +102,8 @@ func makeHandler(t *testing.T, corCh chan<- *request, forcedRespCode *atomic.Val case http.MethodDelete: match := deletePathRegexp.FindStringSubmatch(r.URL.Path) - if match == nil || len(match) < 5 { - rw.WriteHeader(404) + if len(match) < 5 { + rw.WriteHeader(http.StatusNotFound) return } cor = &request{ @@ -114,13 +116,13 @@ func makeHandler(t *testing.T, corCh chan<- *request, forcedRespCode *atomic.Val }, } default: - rw.WriteHeader(404) + rw.WriteHeader(http.StatusNotFound) return } corCh <- cor - rw.WriteHeader(200) + rw.WriteHeader(http.StatusOK) }) } @@ -208,7 +210,7 @@ func TestCorrelationClient(t *testing.T) { forcedRespCode.Store(200) respPayload := map[string][]string{"sf_services": {"testService1"}} respJSON, err := json.Marshal(&respPayload) - require.Nil(t, err, "json marshaling failed in test") + require.NoError(t, err, "json marshaling failed in test") forcedRespPayload.Store(respJSON) var wg sync.WaitGroup @@ -232,11 +234,11 @@ func TestCorrelationClient(t *testing.T) { client.Correlate(testData, CorrelateCB(func(_ *Correlation, _ error) {})) cors := waitForCors(serverCh, 1, 3) - require.Len(t, cors, 0) + require.Empty(t, cors) forcedRespCode.Store(200) cors = waitForCors(serverCh, 1, 3) - require.Len(t, cors, 0) + require.Empty(t, cors) }) t.Run("does retry 500 responses", func(t *testing.T) { forcedRespCode.Store(500) @@ -249,7 +251,7 @@ func TestCorrelationClient(t *testing.T) { client.Correlate(testData, CorrelateCB(func(_ *Correlation, _ error) {})) cors := waitForCors(serverCh, 1, 4) - require.Len(t, cors, 0) + require.Empty(t, cors) require.Equal(t, uint32(5), client.(*Client).maxAttempts) require.Equal(t, int64(5), atomic.LoadInt64(&client.(*Client).TotalRetriedUpdates)) diff --git a/exporter/signalfxexporter/internal/apm/correlations/dedup.go b/exporter/signalfxexporter/internal/apm/correlations/dedup.go index f5e51dcffcb6..28e26dc483fe 100644 --- a/exporter/signalfxexporter/internal/apm/correlations/dedup.go +++ b/exporter/signalfxexporter/internal/apm/correlations/dedup.go @@ -21,7 +21,7 @@ type deduplicator struct { } func (d *deduplicator) purgeCreates() { - var elem = d.pendingCreates.Front() + elem := d.pendingCreates.Front() for { if elem == nil { return @@ -38,7 +38,7 @@ func (d *deduplicator) purgeCreates() { } func (d *deduplicator) purgeDeletes() { - var elem = d.pendingDeletes.Front() + elem := d.pendingDeletes.Front() for { if elem == nil { return @@ -60,7 +60,7 @@ func (d *deduplicator) purge() { } func (d *deduplicator) evictPendingDelete() { - var elem = d.pendingDeletes.Back() + elem := d.pendingDeletes.Back() if elem != nil { req, ok := elem.Value.(*request) if ok { @@ -72,14 +72,13 @@ func (d *deduplicator) evictPendingDelete() { } func (d *deduplicator) evictPendingCreate() { - var elem = d.pendingCreates.Back() + elem := d.pendingCreates.Back() if elem != nil { req, ok := elem.Value.(*request) if ok { req.cancel() d.pendingCreates.Remove(elem) delete(d.pendingCreateKeys, *req.Correlation) - } } } diff --git a/exporter/signalfxexporter/internal/apm/log/log.go b/exporter/signalfxexporter/internal/apm/log/log.go index 0924d8ce955a..3709ddd5d72b 100644 --- a/exporter/signalfxexporter/internal/apm/log/log.go +++ b/exporter/signalfxexporter/internal/apm/log/log.go @@ -7,8 +7,7 @@ package log // import "github.com/open-telemetry/opentelemetry-collector-contrib // Fields is a map that is used to populated logging context. type Fields map[string]any -type nilLogger struct { -} +type nilLogger struct{} func (n nilLogger) Debug(string) { } diff --git a/exporter/signalfxexporter/internal/apm/requests/requestcounter/counter.go b/exporter/signalfxexporter/internal/apm/requests/requestcounter/counter.go index ca7d597eb426..bdadb51de0cb 100644 --- a/exporter/signalfxexporter/internal/apm/requests/requestcounter/counter.go +++ b/exporter/signalfxexporter/internal/apm/requests/requestcounter/counter.go @@ -17,9 +17,11 @@ const ( resetRequestCountKey key = 3 ) -type getRequestCount func() uint32 -type incrementRequestCount func() -type resetRequestCount func() +type ( + getRequestCount func() uint32 + incrementRequestCount func() + resetRequestCount func() +) // checks if a counter already exists on the context func counterExists(ctx context.Context) (exists bool) { diff --git a/exporter/signalfxexporter/internal/apm/requests/sender.go b/exporter/signalfxexporter/internal/apm/requests/sender.go index 708f00571655..93d691ff1167 100644 --- a/exporter/signalfxexporter/internal/apm/requests/sender.go +++ b/exporter/signalfxexporter/internal/apm/requests/sender.go @@ -99,11 +99,15 @@ func (rs *ReqSender) sendRequest(req *http.Request) error { type key int -const RequestFailedCallbackKey key = 1 -const RequestSuccessCallbackKey key = 2 +const ( + RequestFailedCallbackKey key = 1 + RequestSuccessCallbackKey key = 2 +) -type RequestFailedCallback func(body []byte, statusCode int, err error) -type RequestSuccessCallback func([]byte) +type ( + RequestFailedCallback func(body []byte, statusCode int, err error) + RequestSuccessCallback func([]byte) +) func onRequestSuccess(req *http.Request, body []byte) { ctx := req.Context() @@ -113,6 +117,7 @@ func onRequestSuccess(req *http.Request, body []byte) { } cb(body) } + func onRequestFailed(req *http.Request, body []byte, statusCode int, err error) { ctx := req.Context() cb, ok := ctx.Value(RequestFailedCallbackKey).(RequestFailedCallback) @@ -124,7 +129,6 @@ func onRequestFailed(req *http.Request, body []byte, statusCode int, err error) func sendRequest(client *http.Client, req *http.Request) ([]byte, int, error) { resp, err := client.Do(req) - if err != nil { return nil, 0, err } diff --git a/exporter/signalfxexporter/internal/apm/tracetracker/tracker.go b/exporter/signalfxexporter/internal/apm/tracetracker/tracker.go index 9637d111549f..03adce7b9240 100644 --- a/exporter/signalfxexporter/internal/apm/tracetracker/tracker.go +++ b/exporter/signalfxexporter/internal/apm/tracetracker/tracker.go @@ -11,7 +11,7 @@ import ( "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.26.0" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/signalfxexporter/internal/apm/correlations" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/signalfxexporter/internal/apm/log" diff --git a/exporter/signalfxexporter/internal/apm/tracetracker/tracker_test.go b/exporter/signalfxexporter/internal/apm/tracetracker/tracker_test.go index b7fb27695550..24a366de1727 100644 --- a/exporter/signalfxexporter/internal/apm/tracetracker/tracker_test.go +++ b/exporter/signalfxexporter/internal/apm/tracetracker/tracker_test.go @@ -14,7 +14,7 @@ import ( "github.com/stretchr/testify/assert" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.26.0" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/signalfxexporter/internal/apm/correlations" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/signalfxexporter/internal/apm/log" @@ -96,6 +96,7 @@ func (c *correlationTestClient) Get(_ string, dimValue string, cb correlations.S } }() } + func (c *correlationTestClient) Correlate(cl *correlations.Correlation, cb correlations.CorrelateCB) { c.Lock() defer c.Unlock() @@ -103,6 +104,7 @@ func (c *correlationTestClient) Correlate(cl *correlations.Correlation, cb corre cb(cl, nil) atomic.AddInt64(&c.correlateCounter, 1) } + func (c *correlationTestClient) Delete(cl *correlations.Correlation, cb correlations.SuccessfulDeleteCB) { c.Lock() defer c.Unlock() @@ -110,6 +112,7 @@ func (c *correlationTestClient) Delete(cl *correlations.Correlation, cb correlat cb(cl) atomic.AddInt64(&c.deleteCounter, 1) } + func (c *correlationTestClient) getCorrelations() []*correlations.Correlation { c.Lock() defer c.Unlock() @@ -150,7 +153,7 @@ func TestCorrelationEmptyEnvironment(t *testing.T) { a.ProcessTraces(context.Background(), fakeTraces) cors := correlationClient.getCorrelations() - assert.Equal(t, 4, len(cors), "expected 4 correlations to be made") + assert.Len(t, cors, 4, "expected 4 correlations to be made") for _, c := range cors { assert.Contains(t, []string{"container_id", "kubernetes_pod_uid", "host", "AWSUniqueId"}, c.DimName) assert.Contains(t, []string{"test", "randomAWSUniqueId", "testk8sPodUID", "testContainerID"}, c.DimValue) @@ -206,5 +209,5 @@ func TestCorrelationUpdates(t *testing.T) { numHostIDDimCorrelations := len(hostIDDims)*(numEnvironments+numServices) + 4 /* 4 deletes for service & environment fetched at startup */ numContainerLevelCorrelations := 2 * len(containerLevelIDDims) totalExpectedCorrelations := numHostIDDimCorrelations + numContainerLevelCorrelations - assert.Equal(t, totalExpectedCorrelations, len(correlationClient.getCorrelations()), "# of correlation requests do not match") + assert.Len(t, correlationClient.getCorrelations(), totalExpectedCorrelations, "# of correlation requests do not match") } diff --git a/exporter/signalfxexporter/internal/correlation/config.go b/exporter/signalfxexporter/internal/correlation/config.go index 72e20ffa6854..0c69af3749a0 100644 --- a/exporter/signalfxexporter/internal/correlation/config.go +++ b/exporter/signalfxexporter/internal/correlation/config.go @@ -9,15 +9,17 @@ import ( "time" "go.opentelemetry.io/collector/config/confighttp" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.26.0" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/signalfxexporter/internal/apm/correlations" ) // DefaultConfig returns default configuration correlation values. func DefaultConfig() *Config { + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Timeout = 5 * time.Second return &Config{ - ClientConfig: confighttp.ClientConfig{Timeout: 5 * time.Second}, + ClientConfig: clientConfig, StaleServiceTimeout: 5 * time.Minute, SyncAttributes: map[string]string{ conventions.AttributeK8SPodUID: conventions.AttributeK8SPodUID, diff --git a/exporter/signalfxexporter/internal/correlation/correlation.go b/exporter/signalfxexporter/internal/correlation/correlation.go index 38ce7dd0970e..5b3ac9c66fde 100644 --- a/exporter/signalfxexporter/internal/correlation/correlation.go +++ b/exporter/signalfxexporter/internal/correlation/correlation.go @@ -26,7 +26,7 @@ type Tracker struct { once sync.Once log *zap.Logger cfg *Config - params exporter.CreateSettings + params exporter.Settings traceTracker *tracetracker.ActiveServiceTracker pTicker timeutils.TTicker correlation *correlationContext @@ -39,7 +39,7 @@ type correlationContext struct { } // NewTracker creates a new tracker instance for correlation. -func NewTracker(cfg *Config, accessToken configopaque.String, params exporter.CreateSettings) *Tracker { +func NewTracker(cfg *Config, accessToken configopaque.String, params exporter.Settings) *Tracker { return &Tracker{ log: params.Logger, cfg: cfg, @@ -48,7 +48,7 @@ func NewTracker(cfg *Config, accessToken configopaque.String, params exporter.Cr } } -func newCorrelationClient(ctx context.Context, cfg *Config, accessToken configopaque.String, params exporter.CreateSettings, host component.Host) ( +func newCorrelationClient(ctx context.Context, cfg *Config, accessToken configopaque.String, params exporter.Settings, host component.Host) ( *correlationContext, error, ) { corrURL, err := url.Parse(cfg.ClientConfig.Endpoint) @@ -68,7 +68,6 @@ func newCorrelationClient(ctx context.Context, cfg *Config, accessToken configop AccessToken: string(accessToken), URL: corrURL, }) - if err != nil { cancel() return nil, fmt.Errorf("failed to create correlation client: %w", err) diff --git a/exporter/signalfxexporter/internal/correlation/correlation_test.go b/exporter/signalfxexporter/internal/correlation/correlation_test.go index 74d688af9366..4d7efc0f4651 100644 --- a/exporter/signalfxexporter/internal/correlation/correlation_test.go +++ b/exporter/signalfxexporter/internal/correlation/correlation_test.go @@ -20,7 +20,7 @@ func TestTrackerAddSpans(t *testing.T) { tracker := NewTracker( DefaultConfig(), "abcd", - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), ) err := tracker.Start(context.Background(), componenttest.NewNopHost()) @@ -44,7 +44,6 @@ func TestTrackerAddSpans(t *testing.T) { } func TestTrackerStart(t *testing.T) { - tests := []struct { name string config *Config @@ -73,7 +72,7 @@ func TestTrackerStart(t *testing.T) { tracker := NewTracker( tt.config, "abcd", - exportertest.NewNopCreateSettings(), + exportertest.NewNopSettings(), ) err := tracker.Start(context.Background(), componenttest.NewNopHost()) @@ -81,7 +80,7 @@ func TestTrackerStart(t *testing.T) { if tt.wantErr { require.Error(t, err) if tt.errMsg != "" { - require.Contains(t, err.Error(), tt.errMsg) + require.ErrorContains(t, err, tt.errMsg) } } else { require.NoError(t, err) diff --git a/exporter/signalfxexporter/internal/correlation/logshims_test.go b/exporter/signalfxexporter/internal/correlation/logshims_test.go index 6d975cc2cc7b..3e337dc0dcd9 100644 --- a/exporter/signalfxexporter/internal/correlation/logshims_test.go +++ b/exporter/signalfxexporter/internal/correlation/logshims_test.go @@ -48,7 +48,7 @@ func TestZapShim_Debug(t *testing.T) { e := logs[0] assert.Equal(t, "debug message", e.Message) assert.Equal(t, zap.DebugLevel, e.Level) - assert.Len(t, e.Context, 0) + assert.Empty(t, e.Context) } func TestZapShim_Warn(t *testing.T) { @@ -60,7 +60,7 @@ func TestZapShim_Warn(t *testing.T) { e := logs[0] assert.Equal(t, "warn message", e.Message) assert.Equal(t, zap.WarnLevel, e.Level) - assert.Len(t, e.Context, 0) + assert.Empty(t, e.Context) } func TestZapShim_Info(t *testing.T) { @@ -72,7 +72,7 @@ func TestZapShim_Info(t *testing.T) { e := logs[0] assert.Equal(t, "info message", e.Message) assert.Equal(t, zap.InfoLevel, e.Level) - assert.Len(t, e.Context, 0) + assert.Empty(t, e.Context) } func TestZapShim_Panic(t *testing.T) { @@ -86,7 +86,7 @@ func TestZapShim_Panic(t *testing.T) { e := logs[0] assert.Equal(t, "panic message", e.Message) assert.Equal(t, zap.PanicLevel, e.Level) - assert.Len(t, e.Context, 0) + assert.Empty(t, e.Context) } func TestZapShim_Fields(t *testing.T) { @@ -102,5 +102,5 @@ func TestZapShim_Fields(t *testing.T) { c := e.Context[0] assert.Equal(t, "field", c.Key) require.Equal(t, zapcore.StringType, c.Type) - assert.Equal(t, c.String, "field value") + assert.Equal(t, "field value", c.String) } diff --git a/exporter/signalfxexporter/internal/dimensions/dimclient.go b/exporter/signalfxexporter/internal/dimensions/dimclient.go index 98ca7c6b102c..71e6dd00ca9a 100644 --- a/exporter/signalfxexporter/internal/dimensions/dimclient.go +++ b/exporter/signalfxexporter/internal/dimensions/dimclient.go @@ -32,7 +32,7 @@ import ( // updates are currently not done by this port. type DimensionClient struct { sync.RWMutex - ctx context.Context + cancel context.CancelFunc Token configopaque.String APIURL *url.URL client *http.Client @@ -84,7 +84,7 @@ type DimensionClientOptions struct { } // NewDimensionClient returns a new client -func NewDimensionClient(ctx context.Context, options DimensionClientOptions) *DimensionClient { +func NewDimensionClient(options DimensionClientOptions) *DimensionClient { client := &http.Client{ Timeout: options.Timeout, Transport: &http.Transport{ @@ -102,10 +102,9 @@ func NewDimensionClient(ctx context.Context, options DimensionClientOptions) *Di TLSClientConfig: options.APITLSConfig, }, } - sender := NewReqSender(ctx, client, 20, map[string]string{"client": "dimension"}) + sender := NewReqSender(client, 20, map[string]string{"client": "dimension"}) return &DimensionClient{ - ctx: ctx, Token: options.Token, APIURL: options.APIURL, sendDelay: options.SendDelay, @@ -123,7 +122,18 @@ func NewDimensionClient(ctx context.Context, options DimensionClientOptions) *Di // Start the client's processing queue func (dc *DimensionClient) Start() { - go dc.processQueue() + var ctx context.Context + // The dimension client is started during the exporter's startup functionality. + // The collector spec states that for long-running operations, components should + // use the background context, rather than the passed in context. + ctx, dc.cancel = context.WithCancel(context.Background()) + go dc.processQueue(ctx) +} + +func (dc *DimensionClient) Shutdown() { + if dc.cancel != nil { + dc.cancel() + } } // acceptDimension to be sent to the API. This will return fairly quickly and @@ -185,10 +195,10 @@ func mergeTags(tagSets ...map[string]bool) map[string]bool { return out } -func (dc *DimensionClient) processQueue() { +func (dc *DimensionClient) processQueue(ctx context.Context) { for { select { - case <-dc.ctx.Done(): + case <-ctx.Done(): return case delayedDimUpdate := <-dc.delayedQueue: now := dc.now() @@ -201,7 +211,7 @@ func (dc *DimensionClient) processQueue() { delete(dc.delayedSet, delayedDimUpdate.Key()) dc.Unlock() - if err := dc.handleDimensionUpdate(delayedDimUpdate.DimensionUpdate); err != nil { + if err := dc.handleDimensionUpdate(ctx, delayedDimUpdate.DimensionUpdate); err != nil { dc.logger.Error( "Could not send dimension update", zap.Error(err), @@ -213,44 +223,45 @@ func (dc *DimensionClient) processQueue() { } // handleDimensionUpdate will set custom properties on a specific dimension value. -func (dc *DimensionClient) handleDimensionUpdate(dimUpdate *DimensionUpdate) error { +func (dc *DimensionClient) handleDimensionUpdate(ctx context.Context, dimUpdate *DimensionUpdate) error { var ( req *http.Request err error ) - req, err = dc.makePatchRequest(dimUpdate) - + req, err = dc.makePatchRequest(ctx, dimUpdate) if err != nil { return err } req = req.WithContext( context.WithValue(req.Context(), RequestFailedCallbackKey, RequestFailedCallback(func(statusCode int, err error) { - if statusCode >= 400 && statusCode < 500 && statusCode != 404 { - dc.logger.Error( - "Unable to update dimension, not retrying", - zap.Error(err), - zap.String("URL", sanitize.URL(req.URL)), - zap.String("dimensionUpdate", dimUpdate.String()), - zap.Int("statusCode", statusCode), - ) - - // Don't retry if it is a 4xx error (except 404) since these - // imply an input/auth error, which is not going to be remedied - // by retrying. - // 404 errors are special because they can occur due to races - // within the dimension patch endpoint. - return + retry := false + retryMsg := "not retrying" + if statusCode == 400 && len(dimUpdate.Tags) > 0 { + // It's possible that number of tags is too large. In this case, + // we should retry the request without tags to update the dimension properties at least. + dimUpdate.Tags = nil + retry = true + retryMsg = "retrying without tags" + } else if statusCode == 404 || statusCode >= 500 { + // Retry on 5xx server errors or 404s which can occur due to races within the dimension patch endpoint. + retry = true + retryMsg = "retrying" } dc.logger.Error( - "Unable to update dimension, retrying", + "Unable to update dimension, "+retryMsg, zap.Error(err), zap.String("URL", sanitize.URL(req.URL)), zap.String("dimensionUpdate", dimUpdate.String()), zap.Int("statusCode", statusCode), ) + + if !retry { + return + } + // The retry is meant to provide some measure of robustness against // temporary API failures. If the API is down for significant // periods of time, dimension updates will probably eventually back @@ -276,7 +287,7 @@ func (dc *DimensionClient) handleDimensionUpdate(dimUpdate *DimensionUpdate) err } }))) - dc.requestSender.Send(req) + dc.requestSender.Send(ctx, req) return nil } @@ -290,7 +301,7 @@ func (dc *DimensionClient) makeDimURL(key, value string) (*url.URL, error) { return url, nil } -func (dc *DimensionClient) makePatchRequest(dim *DimensionUpdate) (*http.Request, error) { +func (dc *DimensionClient) makePatchRequest(ctx context.Context, dim *DimensionUpdate) (*http.Request, error) { var ( tagsToAdd []string tagsToRemove []string @@ -319,8 +330,8 @@ func (dc *DimensionClient) makePatchRequest(dim *DimensionUpdate) (*http.Request } req, err := http.NewRequestWithContext( - context.Background(), - "PATCH", + ctx, + http.MethodPatch, strings.TrimRight(url.String(), "/")+"/_/sfxagent", bytes.NewReader(json)) if err != nil { diff --git a/exporter/signalfxexporter/internal/dimensions/dimclient_test.go b/exporter/signalfxexporter/internal/dimensions/dimclient_test.go index 83db79effe35..e82fbb9dfcab 100644 --- a/exporter/signalfxexporter/internal/dimensions/dimclient_test.go +++ b/exporter/signalfxexporter/internal/dimensions/dimclient_test.go @@ -4,9 +4,7 @@ package dimensions import ( - "context" "encoding/json" - "log" "net/http" "net/http/httptest" "net/url" @@ -30,95 +28,106 @@ type dim struct { TagsToRemove []string `json:"tagsToRemove"` } -func waitForDims(dimCh <-chan dim, count, waitSeconds int) []dim { // nolint: unparam - var dims []dim - timeout := time.After(time.Duration(waitSeconds) * time.Second) - -loop: - for { - select { - case d := <-dimCh: - dims = append(dims, d) - if len(dims) >= count { - break loop - } - case <-timeout: - break loop - } - } - - return dims +type testServer struct { + startCh chan struct{} + finishCh chan struct{} + acceptedDims []dim + server *httptest.Server + respCode int + requestCount *atomic.Int32 } -func makeHandler(dimCh chan<- dim, forcedResp *atomic.Int32) http.HandlerFunc { - forcedResp.Store(200) +func (ts *testServer) ServeHTTP(rw http.ResponseWriter, r *http.Request) { + ts.requestCount.Add(1) + <-ts.startCh - return func(rw http.ResponseWriter, r *http.Request) { - forcedRespInt := int(forcedResp.Load()) - if forcedRespInt != 200 { - rw.WriteHeader(forcedRespInt) - return - } + if ts.respCode != http.StatusOK { + rw.WriteHeader(ts.respCode) + ts.finishCh <- struct{}{} + return + } - log.Printf("Test server got request: %s", r.URL.Path) + match := patchPathRegexp.FindStringSubmatch(r.URL.Path) + if match == nil { + rw.WriteHeader(http.StatusNotFound) + ts.finishCh <- struct{}{} + return + } - if r.Method != "PATCH" { - rw.WriteHeader(404) - return - } + var bodyDim dim + if err := json.NewDecoder(r.Body).Decode(&bodyDim); err != nil { + rw.WriteHeader(http.StatusBadRequest) + ts.finishCh <- struct{}{} + return + } + bodyDim.Key = match[1] + bodyDim.Value = match[2] - match := patchPathRegexp.FindStringSubmatch(r.URL.Path) - if match == nil { - rw.WriteHeader(404) - return - } + ts.acceptedDims = append(ts.acceptedDims, bodyDim) - var bodyDim dim - if err := json.NewDecoder(r.Body).Decode(&bodyDim); err != nil { - rw.WriteHeader(400) - return - } - bodyDim.Key = match[1] - bodyDim.Value = match[2] + ts.finishCh <- struct{}{} + rw.WriteHeader(http.StatusOK) +} - dimCh <- bodyDim +// startHandling unblocks the server to handle the request and waits until the request is processed. +func (ts *testServer) handleRequest() { + ts.startCh <- struct{}{} + <-ts.finishCh +} - rw.WriteHeader(200) +func (ts *testServer) shutdown() { + ts.reset() + if ts.server != nil { + ts.server.Close() } } -func setup(t *testing.T) (*DimensionClient, chan dim, *atomic.Int32, context.CancelFunc) { - dimCh := make(chan dim) +func (ts *testServer) reset() { + if ts.startCh != nil { + close(ts.startCh) + ts.startCh = make(chan struct{}) + } + if ts.finishCh != nil { + close(ts.finishCh) + ts.finishCh = make(chan struct{}) + } + ts.acceptedDims = nil + ts.respCode = http.StatusOK + ts.requestCount.Store(0) +} - forcedResp := &atomic.Int32{} - server := httptest.NewServer(makeHandler(dimCh, forcedResp)) +func setupTestClientServer(t *testing.T) (*DimensionClient, *testServer) { + ts := &testServer{ + startCh: make(chan struct{}), + finishCh: make(chan struct{}), + respCode: http.StatusOK, + requestCount: new(atomic.Int32), + } + ts.server = httptest.NewServer(ts) - serverURL, err := url.Parse(server.URL) + serverURL, err := url.Parse(ts.server.URL) require.NoError(t, err, "failed to get server URL", err) - ctx, cancel := context.WithCancel(context.Background()) - go func() { - <-ctx.Done() - server.Close() - }() - - client := NewDimensionClient(ctx, DimensionClientOptions{ - APIURL: serverURL, - LogUpdates: true, - Logger: zap.NewNop(), - SendDelay: time.Second, - MaxBuffered: 10, - }) + client := NewDimensionClient( + DimensionClientOptions{ + APIURL: serverURL, + LogUpdates: true, + Logger: zap.NewNop(), + SendDelay: 100 * time.Millisecond, + MaxBuffered: 10, + }) client.Start() - return client, dimCh, forcedResp, cancel + return client, ts } func TestDimensionClient(t *testing.T) { - client, dimCh, forcedResp, cancel := setup(t) - defer cancel() + client, server := setupTestClientServer(t) + defer server.shutdown() + defer client.Shutdown() t.Run("send dimension update with properties and tags", func(t *testing.T) { + server.reset() require.NoError(t, client.acceptDimension(&DimensionUpdate{ Name: "host", Value: "test-box", @@ -133,8 +142,8 @@ func TestDimensionClient(t *testing.T) { }, })) - dims := waitForDims(dimCh, 1, 3) - require.Equal(t, dims, []dim{ + server.handleRequest() + require.Equal(t, []dim{ { Key: "host", Value: "test-box", @@ -146,10 +155,12 @@ func TestDimensionClient(t *testing.T) { Tags: []string{"active"}, TagsToRemove: []string{"terminated"}, }, - }) + }, server.acceptedDims) + require.EqualValues(t, 1, server.requestCount.Load()) }) t.Run("same dimension with different values", func(t *testing.T) { + server.reset() require.NoError(t, client.acceptDimension(&DimensionUpdate{ Name: "host", Value: "test-box", @@ -161,8 +172,8 @@ func TestDimensionClient(t *testing.T) { }, })) - dims := waitForDims(dimCh, 1, 3) - require.Equal(t, dims, []dim{ + server.handleRequest() + require.Equal(t, []dim{ { Key: "host", Value: "test-box", @@ -171,11 +182,13 @@ func TestDimensionClient(t *testing.T) { }, TagsToRemove: []string{"active"}, }, - }) + }, server.acceptedDims) + require.EqualValues(t, 1, server.requestCount.Load()) }) t.Run("send a distinct prop/tag set for existing dim with server error", func(t *testing.T) { - forcedResp.Store(500) + server.reset() + server.respCode = http.StatusInternalServerError // send a distinct prop/tag set for same dim with an error require.NoError(t, client.acceptDimension(&DimensionUpdate{ @@ -188,14 +201,14 @@ func TestDimensionClient(t *testing.T) { "running": true, }, })) - dims := waitForDims(dimCh, 1, 3) - require.Len(t, dims, 0) + server.handleRequest() + require.Empty(t, server.acceptedDims) - forcedResp.Store(200) - dims = waitForDims(dimCh, 1, 3) + server.respCode = http.StatusOK + server.handleRequest() // After the server recovers the dim should be resent. - require.Equal(t, dims, []dim{ + require.Equal(t, []dim{ { Key: "AWSUniqueID", Value: "abcd", @@ -204,11 +217,13 @@ func TestDimensionClient(t *testing.T) { }, Tags: []string{"running"}, }, - }) + }, server.acceptedDims) + require.EqualValues(t, 2, server.requestCount.Load()) }) t.Run("does not retry 4xx responses", func(t *testing.T) { - forcedResp.Store(400) + server.reset() + server.respCode = http.StatusBadRequest // send a distinct prop/tag set for same dim with an error require.NoError(t, client.acceptDimension(&DimensionUpdate{ @@ -218,16 +233,19 @@ func TestDimensionClient(t *testing.T) { "z": newString("y"), }, })) - dims := waitForDims(dimCh, 1, 3) - require.Len(t, dims, 0) + server.handleRequest() + + require.Empty(t, server.acceptedDims) - forcedResp.Store(200) - dims = waitForDims(dimCh, 1, 3) - require.Len(t, dims, 0) + server.respCode = http.StatusOK + + // there should be no retries + require.EqualValues(t, 1, server.requestCount.Load()) }) t.Run("does retry 404 responses", func(t *testing.T) { - forcedResp.Store(404) + server.reset() + server.respCode = http.StatusNotFound // send a distinct prop/tag set for same dim with an error require.NoError(t, client.acceptDimension(&DimensionUpdate{ @@ -238,12 +256,12 @@ func TestDimensionClient(t *testing.T) { }, })) - dims := waitForDims(dimCh, 1, 3) - require.Len(t, dims, 0) + server.handleRequest() + require.Empty(t, server.acceptedDims) - forcedResp.Store(200) - dims = waitForDims(dimCh, 1, 3) - require.Equal(t, dims, []dim{ + server.respCode = http.StatusOK + server.handleRequest() + require.Equal(t, []dim{ { Key: "AWSUniqueID", Value: "id404", @@ -251,10 +269,70 @@ func TestDimensionClient(t *testing.T) { "z": newString("x"), }, }, - }) + }, server.acceptedDims) + require.EqualValues(t, 2, server.requestCount.Load()) + }) + + t.Run("successful retry without tags on 400 response", func(t *testing.T) { + server.reset() + server.respCode = http.StatusBadRequest + + require.NoError(t, client.acceptDimension(&DimensionUpdate{ + Name: "AWSUniqueID", + Value: "abcd", + Properties: map[string]*string{ + "c": newString("d"), + }, + Tags: map[string]bool{ + "running": true, + }, + })) + server.handleRequest() + require.Empty(t, server.acceptedDims) + + // The next successful request should be sent without tags. + server.respCode = http.StatusOK + server.handleRequest() + require.Equal(t, []dim{ + { + Key: "AWSUniqueID", + Value: "abcd", + Properties: map[string]*string{ + "c": newString("d"), + }, + }, + }, server.acceptedDims) + require.EqualValues(t, 2, server.requestCount.Load()) + }) + + t.Run("retry without tags only once", func(t *testing.T) { + server.reset() + server.respCode = http.StatusBadRequest + + require.NoError(t, client.acceptDimension(&DimensionUpdate{ + Name: "AWSUniqueID", + Value: "abcd", + Properties: map[string]*string{ + "c": newString("d"), + }, + Tags: map[string]bool{ + "running": true, + }, + })) + server.handleRequest() + require.Empty(t, server.acceptedDims) + + // handle retry + server.handleRequest() + + // ensure no more retries + time.Sleep(100 * time.Millisecond) + require.EqualValues(t, 2, server.requestCount.Load()) }) t.Run("send successive quick updates to same dim", func(t *testing.T) { + server.reset() + require.NoError(t, client.acceptDimension(&DimensionUpdate{ Name: "AWSUniqueID", Value: "abcd", @@ -290,9 +368,9 @@ func TestDimensionClient(t *testing.T) { }, })) - dims := waitForDims(dimCh, 1, 3) + server.handleRequest() - require.Equal(t, dims, []dim{ + require.Equal(t, []dim{ { Key: "AWSUniqueID", Value: "abcd", @@ -303,13 +381,15 @@ func TestDimensionClient(t *testing.T) { Tags: []string{"dev"}, TagsToRemove: []string{"running"}, }, - }) + }, server.acceptedDims) + require.EqualValues(t, 1, server.requestCount.Load()) }) } func TestFlappyUpdates(t *testing.T) { - client, dimCh, _, cancel := setup(t) - defer cancel() + client, server := setupTestClientServer(t) + defer server.shutdown() + defer client.Shutdown() // Do some flappy updates for i := 0; i < 5; i++ { @@ -330,7 +410,10 @@ func TestFlappyUpdates(t *testing.T) { })) } - dims := waitForDims(dimCh, 2, 3) + // handle 2 requests + server.handleRequest() + server.handleRequest() + require.ElementsMatch(t, []dim{ { Key: "pod_uid", @@ -342,12 +425,16 @@ func TestFlappyUpdates(t *testing.T) { Value: "efgh", Properties: map[string]*string{"index": newString("4")}, }, - }, dims) + }, server.acceptedDims) + require.EqualValues(t, 2, server.requestCount.Load()) } +// TODO: Update the dimension update client to never send empty dimension key or value func TestInvalidUpdatesNotSent(t *testing.T) { - client, dimCh, _, cancel := setup(t) - defer cancel() + t.Skip("This test causes data race because empty dimension key or value result in 404s which causes infinite retries") + client, server := setupTestClientServer(t) + defer server.shutdown() + defer client.Shutdown() require.NoError(t, client.acceptDimension(&DimensionUpdate{ Name: "host", Value: "", @@ -359,6 +446,8 @@ func TestInvalidUpdatesNotSent(t *testing.T) { "active": true, }, })) + server.handleRequest() + require.NoError(t, client.acceptDimension(&DimensionUpdate{ Name: "", Value: "asdf", @@ -370,9 +459,10 @@ func TestInvalidUpdatesNotSent(t *testing.T) { "active": true, }, })) + server.handleRequest() - dims := waitForDims(dimCh, 2, 3) - require.Len(t, dims, 0) + require.EqualValues(t, 2, server.requestCount.Load()) + require.Empty(t, server.acceptedDims) } func newString(s string) *string { diff --git a/exporter/signalfxexporter/internal/dimensions/metadata.go b/exporter/signalfxexporter/internal/dimensions/metadata.go index 188fb4047872..9ccf16933abe 100644 --- a/exporter/signalfxexporter/internal/dimensions/metadata.go +++ b/exporter/signalfxexporter/internal/dimensions/metadata.go @@ -20,7 +20,8 @@ type MetadataUpdateClient interface { func getDimensionUpdateFromMetadata( metadata metadata.MetadataUpdate, - metricsConverter translation.MetricsConverter) *DimensionUpdate { + metricsConverter translation.MetricsConverter, +) *DimensionUpdate { properties, tags := getPropertiesAndTags(metadata) return &DimensionUpdate{ diff --git a/exporter/signalfxexporter/internal/dimensions/metadata_test.go b/exporter/signalfxexporter/internal/dimensions/metadata_test.go index d2ac7454b7cc..7e656672099f 100644 --- a/exporter/signalfxexporter/internal/dimensions/metadata_test.go +++ b/exporter/signalfxexporter/internal/dimensions/metadata_test.go @@ -197,7 +197,6 @@ func TestGetDimensionUpdateFromMetadata(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - converter, err := translation.NewMetricsConverter( zap.NewNop(), tt.args.metricTranslator, diff --git a/exporter/signalfxexporter/internal/dimensions/package_test.go b/exporter/signalfxexporter/internal/dimensions/package_test.go new file mode 100644 index 000000000000..5b69b4ac3787 --- /dev/null +++ b/exporter/signalfxexporter/internal/dimensions/package_test.go @@ -0,0 +1,14 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package dimensions + +import ( + "testing" + + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + goleak.VerifyTestMain(m) +} diff --git a/exporter/signalfxexporter/internal/dimensions/requests.go b/exporter/signalfxexporter/internal/dimensions/requests.go index ed957ddd014e..4722f063d0e6 100644 --- a/exporter/signalfxexporter/internal/dimensions/requests.go +++ b/exporter/signalfxexporter/internal/dimensions/requests.go @@ -1,9 +1,6 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - package dimensions // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/signalfxexporter/internal/dimensions" import ( @@ -20,49 +17,54 @@ type ReqSender struct { client *http.Client requests chan *http.Request workerCount uint - ctx context.Context additionalDimensions map[string]string runningWorkers *atomic.Int64 } -func NewReqSender(ctx context.Context, client *http.Client, - workerCount uint, diagnosticDimensions map[string]string) *ReqSender { +func NewReqSender(client *http.Client, + workerCount uint, diagnosticDimensions map[string]string, +) *ReqSender { return &ReqSender{ client: client, additionalDimensions: diagnosticDimensions, // Unbuffered so that it blocks clients requests: make(chan *http.Request), workerCount: workerCount, - ctx: ctx, runningWorkers: &atomic.Int64{}, } } // Send sends the request. Not thread-safe. -func (rs *ReqSender) Send(req *http.Request) { +func (rs *ReqSender) Send(ctx context.Context, req *http.Request) { // Slight optimization to avoid spinning up unnecessary workers if there // aren't ever that many dim updates. Once workers start, they remain for the // duration of the agent. select { + case <-ctx.Done(): + return case rs.requests <- req: return default: if rs.runningWorkers.Load() < int64(rs.workerCount) { - go rs.processRequests() + go rs.processRequests(ctx) } - // Block until we can get through a request - rs.requests <- req + // Block until we can get through a request, unless context has been cancelled. + select { + case <-ctx.Done(): + return + case rs.requests <- req: + } } } -func (rs *ReqSender) processRequests() { +func (rs *ReqSender) processRequests(ctx context.Context) { rs.runningWorkers.Add(1) defer rs.runningWorkers.Add(-1) for { select { - case <-rs.ctx.Done(): + case <-ctx.Done(): return case req := <-rs.requests: if err := rs.sendRequest(req); err != nil { @@ -93,11 +95,15 @@ func (rs *ReqSender) sendRequest(req *http.Request) error { type key int -const RequestFailedCallbackKey key = 1 -const RequestSuccessCallbackKey key = 2 +const ( + RequestFailedCallbackKey key = 1 + RequestSuccessCallbackKey key = 2 +) -type RequestFailedCallback func(statusCode int, err error) -type RequestSuccessCallback func([]byte) +type ( + RequestFailedCallback func(statusCode int, err error) + RequestSuccessCallback func([]byte) +) func onRequestSuccess(req *http.Request, body []byte) { ctx := req.Context() @@ -107,6 +113,7 @@ func onRequestSuccess(req *http.Request, body []byte) { } cb(body) } + func onRequestFailed(req *http.Request, statusCode int, err error) { ctx := req.Context() cb, ok := ctx.Value(RequestFailedCallbackKey).(RequestFailedCallback) @@ -118,7 +125,6 @@ func onRequestFailed(req *http.Request, statusCode int, err error) { func sendRequest(client *http.Client, req *http.Request) ([]byte, int, error) { resp, err := client.Do(req) - if err != nil { return nil, 0, err } diff --git a/exporter/signalfxexporter/internal/hostmetadata/host.go b/exporter/signalfxexporter/internal/hostmetadata/host.go index 9dbd7b5d6fb3..2e9558f41800 100644 --- a/exporter/signalfxexporter/internal/hostmetadata/host.go +++ b/exporter/signalfxexporter/internal/hostmetadata/host.go @@ -15,9 +15,9 @@ import ( "strconv" "time" - "github.com/shirou/gopsutil/v3/cpu" - "github.com/shirou/gopsutil/v3/host" - "github.com/shirou/gopsutil/v3/mem" + "github.com/shirou/gopsutil/v4/cpu" + "github.com/shirou/gopsutil/v4/host" + "github.com/shirou/gopsutil/v4/mem" ) // etcPath is the path to host etc and can be set using the env var "HOST_ETC" @@ -32,10 +32,12 @@ var etcPath = func() string { const cpuStatsTimeout = 10 * time.Second // Map library functions to unexported package variables for testing purposes. -var cpuInfo = cpu.InfoWithContext -var cpuCounts = cpu.CountsWithContext -var memVirtualMemory = mem.VirtualMemory -var hostInfo = host.Info +var ( + cpuInfo = cpu.InfoWithContext + cpuCounts = cpu.CountsWithContext + memVirtualMemory = mem.VirtualMemory + hostInfo = host.Info +) // hostCPU information about the host type hostCPU struct { @@ -179,7 +181,7 @@ func getMemory() (*Memory, error) { func getStringFromFile(pattern string, path string) (string, error) { var err error var file []byte - var reg = regexp.MustCompile(pattern) + reg := regexp.MustCompile(pattern) if file, err = os.ReadFile(path); err == nil { if match := reg.FindSubmatch(file); len(match) > 1 { return string(match[1]), nil diff --git a/exporter/signalfxexporter/internal/hostmetadata/host_linux_test.go b/exporter/signalfxexporter/internal/hostmetadata/host_linux_test.go index 5b662cfdcdf1..6e90c1304f2a 100644 --- a/exporter/signalfxexporter/internal/hostmetadata/host_linux_test.go +++ b/exporter/signalfxexporter/internal/hostmetadata/host_linux_test.go @@ -32,11 +32,13 @@ func TestFillOSSpecificData(t *testing.T) { args: args{ etc: "./testdata/lsb-release", syscallUname: func(in *unix.Utsname) error { - in.Version = [65]byte{35, 57, 45, 85, 98, 117, 110, 116, + in.Version = [65]byte{ + 35, 57, 45, 85, 98, 117, 110, 116, 117, 32, 83, 77, 80, 32, 87, 101, 100, 32, 77, 97, 121, 32, 49, 54, 32, 49, 53, 58, 50, 50, 58, 53, 52, 32, 85, - 84, 67, 32, 50, 48, 49, 56} + 84, 67, 32, 50, 48, 49, 56, + } return nil }, }, diff --git a/exporter/signalfxexporter/internal/hostmetadata/host_test.go b/exporter/signalfxexporter/internal/hostmetadata/host_test.go index 3b661aa3d31e..7085b104559c 100644 --- a/exporter/signalfxexporter/internal/hostmetadata/host_test.go +++ b/exporter/signalfxexporter/internal/hostmetadata/host_test.go @@ -11,9 +11,9 @@ import ( "errors" "testing" - "github.com/shirou/gopsutil/v3/cpu" - "github.com/shirou/gopsutil/v3/host" - "github.com/shirou/gopsutil/v3/mem" + "github.com/shirou/gopsutil/v4/cpu" + "github.com/shirou/gopsutil/v4/host" + "github.com/shirou/gopsutil/v4/mem" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -274,5 +274,4 @@ func TestEtcPath(t *testing.T) { assert.Equal(t, tt.want, etcPath()) }) } - } diff --git a/exporter/signalfxexporter/internal/hostmetadata/metadata_test.go b/exporter/signalfxexporter/internal/hostmetadata/metadata_test.go index 00a101aa5619..95d39e6fca81 100644 --- a/exporter/signalfxexporter/internal/hostmetadata/metadata_test.go +++ b/exporter/signalfxexporter/internal/hostmetadata/metadata_test.go @@ -9,13 +9,13 @@ import ( "sync" "testing" - "github.com/shirou/gopsutil/v3/cpu" - "github.com/shirou/gopsutil/v3/host" - "github.com/shirou/gopsutil/v3/mem" + "github.com/shirou/gopsutil/v4/cpu" + "github.com/shirou/gopsutil/v4/host" + "github.com/shirou/gopsutil/v4/mem" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/pdata/pmetric" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.26.0" "go.uber.org/zap" "go.uber.org/zap/zapcore" "go.uber.org/zap/zaptest/observer" @@ -255,17 +255,16 @@ func TestSyncMetadata(t *testing.T) { syncer.Sync(tt.metricsData) if tt.wantMetadataUpdate != nil { - require.Equal(t, 1, len(dimClient.getMetadataUpdates())) + require.Len(t, dimClient.getMetadataUpdates(), 1) require.EqualValues(t, tt.wantMetadataUpdate, dimClient.getMetadataUpdates()[0]) } else { - require.Equal(t, 0, len(dimClient.getMetadataUpdates())) + require.Empty(t, dimClient.getMetadataUpdates()) } require.Equal(t, len(tt.wantLogs), logs.Len()) for i, log := range logs.All() { assert.Equal(t, tt.wantLogs[i], log.Message) } - }) } } diff --git a/exporter/signalfxexporter/internal/metadata/generated_status.go b/exporter/signalfxexporter/internal/metadata/generated_status.go index c33c58f3375e..4254d1b2c571 100644 --- a/exporter/signalfxexporter/internal/metadata/generated_status.go +++ b/exporter/signalfxexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("signalfx") + Type = component.MustNewType("signalfx") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/signalfxexporter" ) const ( diff --git a/exporter/signalfxexporter/internal/metadata/generated_telemetry.go b/exporter/signalfxexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index e8c0535e27d9..000000000000 --- a/exporter/signalfxexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/signalfx") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/signalfx") -} diff --git a/exporter/signalfxexporter/internal/metadata/generated_telemetry_test.go b/exporter/signalfxexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index c818edd6e775..000000000000 --- a/exporter/signalfxexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/signalfx", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/signalfx", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/signalfxexporter/internal/translation/converter.go b/exporter/signalfxexporter/internal/translation/converter.go index 9a63c8815e12..27d1930fa51f 100644 --- a/exporter/signalfxexporter/internal/translation/converter.go +++ b/exporter/signalfxexporter/internal/translation/converter.go @@ -49,7 +49,8 @@ func NewMetricsConverter( includes []dpfilters.MetricFilter, nonAlphanumericDimChars string, dropHistogramBuckets bool, - processHistograms bool) (*MetricsConverter, error) { + processHistograms bool, +) (*MetricsConverter, error) { fs, err := dpfilters.NewFilterSet(excludes, includes) if err != nil { return nil, err @@ -65,6 +66,12 @@ func NewMetricsConverter( }, nil } +func (c *MetricsConverter) Start() { + if c.metricTranslator != nil { + c.metricTranslator.Start() + } +} + // MetricsToSignalFxV2 converts the passed in MetricsData to SFx datapoints // and if processHistograms is set, histogram metrics are not converted to SFx format. // It returns those datapoints and the number of time series that had to be @@ -161,6 +168,12 @@ func (c *MetricsConverter) ConvertDimension(dim string) string { return filterKeyChars(res, c.datapointValidator.nonAlphanumericDimChars) } +func (c *MetricsConverter) Shutdown() { + if c.metricTranslator != nil { + c.metricTranslator.Shutdown() + } +} + // Values obtained from https://dev.splunk.com/observability/docs/datamodel/ingest#Criteria-for-metric-and-dimension-names-and-values const ( maxMetricNameLength = 256 diff --git a/exporter/signalfxexporter/internal/translation/converter_test.go b/exporter/signalfxexporter/internal/translation/converter_test.go index aecb3858c2e4..ce1c7edaa757 100644 --- a/exporter/signalfxexporter/internal/translation/converter_test.go +++ b/exporter/signalfxexporter/internal/translation/converter_test.go @@ -15,7 +15,7 @@ import ( "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.26.0" "go.uber.org/zap" "go.uber.org/zap/zapcore" "go.uber.org/zap/zaptest/observer" @@ -1094,7 +1094,7 @@ func Test_MetricDataToSignalFxV2WithHistogramBuckets(t *testing.T) { // of those is not deterministic. sortDimensions(tt.wantSfxDataPoints) sortDimensions(gotSfxDataPoints) - assert.Equal(t, tt.wantCount, len(gotSfxDataPoints)) + assert.Len(t, gotSfxDataPoints, tt.wantCount) assert.Equal(t, tt.wantSfxDataPoints, gotSfxDataPoints) }) } @@ -1176,7 +1176,6 @@ func TestDimensionKeyCharsWithPeriod(t *testing.T) { c, err := NewMetricsConverter(zap.NewNop(), translator, nil, nil, "_-.", false, true) require.NoError(t, err) assert.EqualValues(t, expected, c.MetricsToSignalFxV2(md)) - } func TestInvalidNumberOfDimensions(t *testing.T) { @@ -1193,7 +1192,7 @@ func TestInvalidNumberOfDimensions(t *testing.T) { } c, err := NewMetricsConverter(logger, nil, nil, nil, "_-.", false, true) require.NoError(t, err) - assert.EqualValues(t, 1, len(c.MetricsToSignalFxV2(md))) + assert.Len(t, c.MetricsToSignalFxV2(md), 1) // No log message should be printed require.Equal(t, 0, observedLogs.Len()) @@ -1216,7 +1215,7 @@ func TestInvalidNumberOfDimensions(t *testing.T) { Value: fmt.Sprint("dim_val_", i), }) } - assert.EqualValues(t, 0, len(c.MetricsToSignalFxV2(mdInvalid))) + assert.Empty(t, c.MetricsToSignalFxV2(mdInvalid)) require.Equal(t, 1, observedLogs.Len()) assert.Equal(t, "dropping datapoint", observedLogs.All()[0].Message) assert.ElementsMatch(t, []zap.Field{ @@ -1359,9 +1358,8 @@ func TestMetricsConverter_ConvertDimension(t *testing.T) { t.Run(tt.name, func(t *testing.T) { c, err := NewMetricsConverter(zap.NewNop(), tt.fields.metricTranslator, nil, nil, tt.fields.nonAlphanumericDimChars, false, true) require.NoError(t, err) - if got := c.ConvertDimension(tt.args.dim); got != tt.want { - t.Errorf("ConvertDimension() = %v, want %v", got, tt.want) - } + got := c.ConvertDimension(tt.args.dim) + assert.Equal(t, tt.want, got, "ConvertDimension() = %v, want %v", got, tt.want) }) } } diff --git a/exporter/signalfxexporter/internal/translation/default_metrics.go b/exporter/signalfxexporter/internal/translation/default_metrics.go index d0d5fc71156b..9b7534f8b479 100644 --- a/exporter/signalfxexporter/internal/translation/default_metrics.go +++ b/exporter/signalfxexporter/internal/translation/default_metrics.go @@ -85,21 +85,6 @@ exclude_metrics: # k8s metrics. - metric_names: - - k8s.cronjob.active_jobs - - k8s.job.active_pods - - k8s.job.desired_successful_pods - - k8s.job.failed_pods - - k8s.job.max_parallel_pods - - k8s.job.successful_pods - - k8s.statefulset.desired_pods - - k8s.statefulset.current_pods - - k8s.statefulset.ready_pods - - k8s.statefulset.updated_pods - - k8s.hpa.max_replicas - - k8s.hpa.min_replicas - - k8s.hpa.current_replicas - - k8s.hpa.desired_replicas - # matches all container limit metrics but k8s.container.cpu_limit and k8s.container.memory_limit - /^k8s\.container\..+_limit$/ - '!k8s.container.memory_limit' @@ -121,7 +106,7 @@ exclude_metrics: - /^(?i:(container)|(k8s\.node)|(k8s\.pod))\.memory\.page_faults$/ - /^(?i:(container)|(k8s\.node)|(k8s\.pod))\.memory\.rss$/ - /^(?i:(k8s\.node)|(k8s\.pod))\.memory\.usage$/ - - /^(?i:(container)|(k8s\.node)|(k8s\.pod))\.memory\.working_set$/ + - /^(?i:(k8s\.node)|(k8s\.pod))\.memory\.working_set$/ # matches (k8s.node|k8s.pod).filesystem... - /^k8s\.(?i:(node)|(pod))\.filesystem\.available$/ diff --git a/exporter/signalfxexporter/internal/translation/delta_translator.go b/exporter/signalfxexporter/internal/translation/delta_translator.go index 26f19c06a419..f7d1912681b5 100644 --- a/exporter/signalfxexporter/internal/translation/delta_translator.go +++ b/exporter/signalfxexporter/internal/translation/delta_translator.go @@ -20,10 +20,15 @@ func newDeltaTranslator(ttl int64, done chan struct{}) *deltaTranslator { sweepIntervalSeconds = 1 } m := ttlmap.New(sweepIntervalSeconds, ttl, done) - m.Start() return &deltaTranslator{prevPts: m} } +func (t *deltaTranslator) start() { + if t.prevPts != nil { + t.prevPts.Start() + } +} + func (t *deltaTranslator) translate(pts []*sfxpb.DataPoint, tr Rule) []*sfxpb.DataPoint { for _, currPt := range pts { deltaMetricName, ok := tr.Mapping[currPt.Metric] @@ -64,6 +69,12 @@ func (t *deltaTranslator) deltaPt(deltaMetricName string, currPt *sfxpb.DataPoin return deltaPt } +func (t *deltaTranslator) shutdown() { + if t.prevPts != nil { + t.prevPts.Shutdown() + } +} + func doubleDeltaPt(currPt *sfxpb.DataPoint, prevPt *sfxpb.DataPoint, deltaMetricName string) *sfxpb.DataPoint { delta := *currPt.Value.DoubleValue - *prevPt.Value.DoubleValue if delta < 0 { diff --git a/exporter/signalfxexporter/internal/translation/dpfilters/datapoint.go b/exporter/signalfxexporter/internal/translation/dpfilters/datapoint.go index 9afd30ab357a..1b7068d56011 100644 --- a/exporter/signalfxexporter/internal/translation/dpfilters/datapoint.go +++ b/exporter/signalfxexporter/internal/translation/dpfilters/datapoint.go @@ -51,5 +51,4 @@ func (f *dataPointFilter) Matches(dp *sfxpb.DataPoint) bool { return f.dimensionsFilter == nil || f.dimensionsFilter.Matches(dp.Dimensions) } return false - } diff --git a/exporter/signalfxexporter/internal/translation/dpfilters/filterset_test.go b/exporter/signalfxexporter/internal/translation/dpfilters/filterset_test.go index 64293030ee2c..4125c7f45335 100644 --- a/exporter/signalfxexporter/internal/translation/dpfilters/filterset_test.go +++ b/exporter/signalfxexporter/internal/translation/dpfilters/filterset_test.go @@ -101,7 +101,8 @@ func TestFilterSet(t *testing.T) { excludes: []MetricFilter{{ Dimensions: map[string]any{ "container_name": "PO", - }}}, + }, + }}, expectedMatches: []*sfxpb.DataPoint{ { Metric: "cpu.utilization", @@ -120,7 +121,8 @@ func TestFilterSet(t *testing.T) { excludes: []MetricFilter{{ Dimensions: map[string]any{ "container_name": []any{"PO"}, - }}}, + }, + }}, expectedMatches: []*sfxpb.DataPoint{ { Metric: "cpu.utilization", @@ -139,7 +141,8 @@ func TestFilterSet(t *testing.T) { excludes: []MetricFilter{{ Dimensions: map[string]any{ "container_name": []any{`/^[A-Z][A-Z]$/`}, - }}}, + }, + }}, expectedMatches: []*sfxpb.DataPoint{ { Metric: "cpu.utilization", @@ -158,7 +161,8 @@ func TestFilterSet(t *testing.T) { excludes: []MetricFilter{{ Dimensions: map[string]any{ "container_name": []any{`/.+/`}, - }}}, + }, + }}, expectedMatches: []*sfxpb.DataPoint{ { Metric: "cpu.utilization", @@ -177,7 +181,8 @@ func TestFilterSet(t *testing.T) { excludes: []MetricFilter{{ Dimensions: map[string]any{ "container_name": []any{`*O*`}, - }}}, + }, + }}, expectedMatches: []*sfxpb.DataPoint{ { Metric: "cpu.utilization", @@ -234,7 +239,8 @@ func TestFilterSet(t *testing.T) { excludes: []MetricFilter{{ Dimensions: map[string]any{ "container_name": []any{"mycontainer"}, - }}}, + }, + }}, expectedNonMatches: []*sfxpb.DataPoint{ { Metric: "cpu.utilization", @@ -247,7 +253,8 @@ func TestFilterSet(t *testing.T) { Dimensions: map[string]any{ "host": []any{"localhost"}, "system": []any{"r4"}, - }}}, + }, + }}, expectedNonMatches: []*sfxpb.DataPoint{ { Metric: "cpu.utilization", @@ -266,7 +273,8 @@ func TestFilterSet(t *testing.T) { Dimensions: map[string]any{ "host": []any{"localhost"}, "system": []any{"r4"}, - }}}, + }, + }}, expectedMatches: []*sfxpb.DataPoint{ { Metric: "cpu.utilization", @@ -282,7 +290,8 @@ func TestFilterSet(t *testing.T) { Dimensions: map[string]any{ "host": []any{"localhost"}, "system": []any{"r4"}, - }}}, + }, + }}, expectedMatches: []*sfxpb.DataPoint{ { Metric: "cpu.utilization", @@ -307,7 +316,8 @@ func TestFilterSet(t *testing.T) { excludes: []MetricFilter{{ Dimensions: map[string]any{ "container_name": []any{"*", "!pause", "!/.*idle/"}, - }}}, + }, + }}, expectedMatches: []*sfxpb.DataPoint{ { Metric: "cpu.utilization", @@ -345,7 +355,8 @@ func TestFilterSet(t *testing.T) { excludes: []MetricFilter{{ Dimensions: map[string]any{ "dim": []any{}, - }}}, + }, + }}, wantErr: true, wantErrMsg: "string map value in filter cannot be empty", }, @@ -360,7 +371,8 @@ func TestFilterSet(t *testing.T) { excludes: []MetricFilter{{ Dimensions: map[string]any{ "container_name": []any{"cpu.*["}, - }}}, + }, + }}, wantErr: true, wantErrMsg: "unexpected end of input", }, @@ -369,7 +381,8 @@ func TestFilterSet(t *testing.T) { excludes: []MetricFilter{{ Dimensions: map[string]any{ "host": 1, - }}}, + }, + }}, wantErr: true, wantErrMsg: "1 should be either a string or string list", }, diff --git a/exporter/signalfxexporter/internal/translation/dpfilters/propertyfilter_test.go b/exporter/signalfxexporter/internal/translation/dpfilters/propertyfilter_test.go index 736bb856960d..eb394409f673 100644 --- a/exporter/signalfxexporter/internal/translation/dpfilters/propertyfilter_test.go +++ b/exporter/signalfxexporter/internal/translation/dpfilters/propertyfilter_test.go @@ -57,12 +57,12 @@ property_value: '!/property.value/'`, { name: "invalid regex", yaml: "dimension_name: '/(?=not.in.re2)/'", - expectedError: "1 error(s) decoding:\n\n* error decoding 'dimension_name': error parsing regexp: invalid or unsupported Perl syntax: `(?=`", + expectedError: "'dimension_name': error parsing regexp: invalid or unsupported Perl syntax: `(?=`", }, { name: "invalid glob", yaml: "dimension_value: '*[c-a]'", - expectedError: "1 error(s) decoding:\n\n* error decoding 'dimension_value': hi character 'a' should be greater than lo 'c'", + expectedError: "'dimension_value': hi character 'a' should be greater than lo 'c'", }, } { t.Run(test.name, func(t *testing.T) { @@ -74,7 +74,7 @@ property_value: '!/property.value/'`, pf := &PropertyFilter{} err = cm.Unmarshal(pf) if test.expectedError != "" { - require.EqualError(t, err, test.expectedError) + require.ErrorContains(t, err, test.expectedError) } else { require.NoError(t, err) require.Equal(t, test.expectedPropertyFilter, *pf) diff --git a/exporter/signalfxexporter/internal/translation/dpfilters/string.go b/exporter/signalfxexporter/internal/translation/dpfilters/string.go index ee971708cd8f..093139ef8198 100644 --- a/exporter/signalfxexporter/internal/translation/dpfilters/string.go +++ b/exporter/signalfxexporter/internal/translation/dpfilters/string.go @@ -33,7 +33,6 @@ func NewStringFilter(items []string) (*StringFilter, error) { reText := stripSlashes(m) re, err = regexp.Compile(reText) - if err != nil { return nil, err } diff --git a/exporter/signalfxexporter/internal/translation/logdata_to_signalfxv2.go b/exporter/signalfxexporter/internal/translation/logdata_to_signalfxv2.go index 9c542c7dbb45..70a6c31344f7 100644 --- a/exporter/signalfxexporter/internal/translation/logdata_to_signalfxv2.go +++ b/exporter/signalfxexporter/internal/translation/logdata_to_signalfxv2.go @@ -84,6 +84,8 @@ func convertLogRecord(lr plog.LogRecord, resourceAttrs pcommon.Map, logger *zap. return true case splunk.SFxEventPropertiesKey: return true + case splunk.SFxAccessTokenLabel: + return true case splunk.SFxEventType: if v.Type() == pcommon.ValueTypeStr { event.EventType = v.Str() diff --git a/exporter/signalfxexporter/internal/translation/logdata_to_signalfxv2_test.go b/exporter/signalfxexporter/internal/translation/logdata_to_signalfxv2_test.go index 42daba690590..24652373341c 100644 --- a/exporter/signalfxexporter/internal/translation/logdata_to_signalfxv2_test.go +++ b/exporter/signalfxexporter/internal/translation/logdata_to_signalfxv2_test.go @@ -48,6 +48,7 @@ func TestLogDataToSignalFxEvents(t *testing.T) { resourceLog.Resource().Attributes().PutStr("k0", "should use ILL attr value instead") resourceLog.Resource().Attributes().PutStr("k3", "v3") resourceLog.Resource().Attributes().PutInt("k4", 123) + resourceLog.Resource().Attributes().PutStr("com.splunk.signalfx.access_token", "hunter2") ilLogs := resourceLog.ScopeLogs() logSlice := ilLogs.AppendEmpty().LogRecords() diff --git a/exporter/signalfxexporter/internal/translation/package_test.go b/exporter/signalfxexporter/internal/translation/package_test.go new file mode 100644 index 000000000000..82f4ca268e8f --- /dev/null +++ b/exporter/signalfxexporter/internal/translation/package_test.go @@ -0,0 +1,14 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package translation + +import ( + "testing" + + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + goleak.VerifyTestMain(m) +} diff --git a/exporter/signalfxexporter/internal/translation/translator.go b/exporter/signalfxexporter/internal/translation/translator.go index b899de0dc86e..324188e820ee 100644 --- a/exporter/signalfxexporter/internal/translation/translator.go +++ b/exporter/signalfxexporter/internal/translation/translator.go @@ -391,6 +391,12 @@ func getMetricNamesAsSlice(metricName string, metricNames map[string]bool) []str return out } +func (mp *MetricTranslator) Start() { + if mp.deltaTranslator != nil { + mp.deltaTranslator.start() + } +} + // TranslateDataPoints transforms datapoints to a format compatible with signalfx backend // sfxDataPoints represents one metric converted to signalfx protobuf datapoints func (mp *MetricTranslator) TranslateDataPoints(logger *zap.Logger, sfxDataPoints []*sfxpb.DataPoint) []*sfxpb.DataPoint { @@ -424,7 +430,6 @@ func (mp *MetricTranslator) TranslateDataPoints(logger *zap.Logger, sfxDataPoint for _, d := range dp.Dimensions { if k, ok := tr.CopyDimensions[d.Key]; ok { dp.Dimensions = append(dp.Dimensions, &sfxpb.Dimension{Key: k, Value: d.Value}) - } } } @@ -540,6 +545,12 @@ func (mp *MetricTranslator) TranslateDataPoints(logger *zap.Logger, sfxDataPoint return processedDataPoints } +func (mp *MetricTranslator) Shutdown() { + if mp.deltaTranslator != nil { + mp.deltaTranslator.shutdown() + } +} + func calcNewMetricInputPairs(processedDataPoints []*sfxpb.DataPoint, tr Rule) [][2]*sfxpb.DataPoint { var operand1Pts, operand2Pts []*sfxpb.DataPoint for _, dp := range processedDataPoints { @@ -737,7 +748,7 @@ func aggregateDatapoints( // generate map keys. func stringifyDimensions(dimensions []*sfxpb.Dimension, exclusions []string) string { const aggregationKeyDelimiter = "//" - var aggregationKeyParts = make([]string, 0, len(dimensions)) + aggregationKeyParts := make([]string, 0, len(dimensions)) for _, d := range dimensions { if !dimensionIn(d, exclusions) { aggregationKeyParts = append(aggregationKeyParts, fmt.Sprintf("%s:%s", d.Key, d.Value)) @@ -812,7 +823,7 @@ func convertMetricValue(logger *zap.Logger, dp *sfxpb.DataPoint, newType MetricV zap.String("metric", dp.Metric)) return } - var intVal = int64(*val) + intVal := int64(*val) dp.Value = sfxpb.Datum{IntValue: &intVal} case MetricValueTypeDouble: val := dp.GetValue().IntValue @@ -821,7 +832,7 @@ func convertMetricValue(logger *zap.Logger, dp *sfxpb.DataPoint, newType MetricV zap.String("metric", dp.Metric)) return } - var floatVal = float64(*val) + floatVal := float64(*val) dp.Value = sfxpb.Datum{DoubleValue: &floatVal} } } @@ -858,7 +869,8 @@ func dropDimensions(dp *sfxpb.DataPoint, rule Rule) { func filterDimensionsByValues( dimensions []*sfxpb.Dimension, - dimensionPairs map[string]map[string]bool) []*sfxpb.Dimension { + dimensionPairs map[string]map[string]bool, +) []*sfxpb.Dimension { if len(dimensions) == 0 { return nil } diff --git a/exporter/signalfxexporter/internal/translation/translator_test.go b/exporter/signalfxexporter/internal/translation/translator_test.go index f59bbc6477db..23fa4194074f 100644 --- a/exporter/signalfxexporter/internal/translation/translator_test.go +++ b/exporter/signalfxexporter/internal/translation/translator_test.go @@ -553,8 +553,10 @@ func TestNewMetricTranslator(t *testing.T) { } } -var msec = time.Now().Unix() * 1e3 -var gaugeType = sfxpb.MetricType_GAUGE +var ( + msec = time.Now().Unix() * 1e3 + gaugeType = sfxpb.MetricType_GAUGE +) func TestTranslateDataPoints(t *testing.T) { tests := []struct { @@ -2027,7 +2029,7 @@ func TestNewCalculateNewMetricErrors(t *testing.T) { }}, 1, make(chan struct{})) require.NoError(t, err) tr := mt.TranslateDataPoints(logger, dps) - require.Equal(t, 2, len(tr)) + require.Len(t, tr, 2) if test.wantErr == "" { require.Equal(t, 0, observedLogs.Len()) } else { @@ -2086,7 +2088,7 @@ func TestCalcNewMetricInputPairs_SameDims(t *testing.T) { }, } pairs := calcNewMetricInputPairs(pts, rule) - require.Equal(t, 1, len(pairs)) + require.Len(t, pairs, 1) pair := pairs[0] require.Equal(t, "m1", pair[0].Metric) require.Equal(t, "m2", pair[1].Metric) @@ -2149,7 +2151,7 @@ func TestNewMetricInputPairs_MultiPairs(t *testing.T) { }, } pairs := calcNewMetricInputPairs(pts, rule) - require.Equal(t, 2, len(pairs)) + require.Len(t, pairs, 2) pair1 := pairs[0] require.EqualValues(t, 1, *pair1[0].Value.IntValue) require.EqualValues(t, 2, *pair1[1].Value.IntValue) @@ -2395,12 +2397,12 @@ func TestCalculateNewMetric_Double(t *testing.T) { } func generateIntPtr(i int) *int64 { - var iPtr = int64(i) + iPtr := int64(i) return &iPtr } func generateFloatPtr(i float64) *float64 { - var iPtr = i + iPtr := i return &iPtr } @@ -2528,7 +2530,7 @@ func TestDeltaTranslatorNoMatchingMapping(t *testing.T) { c := testConverter(t, map[string]string{"foo": "bar"}) md := intMD(1, 1) idx := indexPts(c.MetricsToSignalFxV2(md)) - require.Equal(t, 1, len(idx)) + require.Len(t, idx, 1) } func TestDeltaTranslatorMismatchedValueTypes(t *testing.T) { @@ -2541,7 +2543,7 @@ func TestDeltaTranslatorMismatchedValueTypes(t *testing.T) { dblTS("cpu0", "user", 1, 1, 1, md2.SetEmptySum().DataPoints().AppendEmpty()) pts := c.MetricsToSignalFxV2(wrapMetric(md2)) idx := indexPts(pts) - require.Equal(t, 1, len(idx)) + require.Len(t, idx, 1) } func requireDeltaMetricOk(t *testing.T, md1, md2, md3 pmetric.Metrics) ( @@ -2551,11 +2553,11 @@ func requireDeltaMetricOk(t *testing.T, md1, md2, md3 pmetric.Metrics) ( dp1 := c.MetricsToSignalFxV2(md1) m1 := indexPts(dp1) - require.Equal(t, 1, len(m1)) + require.Len(t, m1, 1) dp2 := c.MetricsToSignalFxV2(md2) m2 := indexPts(dp2) - require.Equal(t, 2, len(m2)) + require.Len(t, m2, 2) origPts, ok := m2["system.cpu.time"] require.True(t, ok) @@ -2570,7 +2572,7 @@ func requireDeltaMetricOk(t *testing.T, md1, md2, md3 pmetric.Metrics) ( dp3 := c.MetricsToSignalFxV2(md3) m3 := indexPts(dp3) - require.Equal(t, 2, len(m3)) + require.Len(t, m3, 2) deltaPts2, ok := m3["system.cpu.delta"] require.True(t, ok) @@ -2884,7 +2886,8 @@ func TestDropDimensions(t *testing.T) { }, }, }, - }, { + }, + { name: "No op when dimensions do not exist on dp", rules: []Rule{ { diff --git a/exporter/signalfxexporter/internal/utils/histogram_utils_test.go b/exporter/signalfxexporter/internal/utils/histogram_utils_test.go index 03d7f366a2c9..3a2426968ee3 100644 --- a/exporter/signalfxexporter/internal/utils/histogram_utils_test.go +++ b/exporter/signalfxexporter/internal/utils/histogram_utils_test.go @@ -220,7 +220,8 @@ func TestHistogramsAreRetrieved(t *testing.T) { ilm1.Metrics().AppendEmpty() buildHistogram(ilm1.Metrics().At(1), "histogram_2_s2", ts, 2) return out - }}, + }, + }, { name: "mixed_type_multiple_resources", inMetricsFunc: func() pmetric.Metrics { @@ -292,7 +293,8 @@ func TestHistogramsAreRetrieved(t *testing.T) { buildHistogram(ilm0r1.Metrics().At(0), "histogram_s0_r2", ts, 1) return out - }}, + }, + }, { name: "remove_access_token", inMetricsFunc: func() pmetric.Metrics { diff --git a/exporter/signalfxexporter/internal/utils/package_test.go b/exporter/signalfxexporter/internal/utils/package_test.go new file mode 100644 index 000000000000..832862afb888 --- /dev/null +++ b/exporter/signalfxexporter/internal/utils/package_test.go @@ -0,0 +1,14 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package utils + +import ( + "testing" + + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + goleak.VerifyTestMain(m) +} diff --git a/exporter/signalfxexporter/metadata.yaml b/exporter/signalfxexporter/metadata.yaml index fbc5bb90b455..8b95a12ae0f6 100644 --- a/exporter/signalfxexporter/metadata.yaml +++ b/exporter/signalfxexporter/metadata.yaml @@ -1,5 +1,4 @@ type: signalfx -scope_name: otelcol/signalfx status: class: exporter @@ -18,5 +17,3 @@ tests: retry_on_failure: enabled: false expect_consumer_error: true - goleak: - skip: true diff --git a/exporter/signalfxexporter/testdata/hostmetrics.yaml b/exporter/signalfxexporter/testdata/hostmetrics.yaml index 54265d1722c3..c9ca307b44fe 100644 --- a/exporter/signalfxexporter/testdata/hostmetrics.yaml +++ b/exporter/signalfxexporter/testdata/hostmetrics.yaml @@ -28,7 +28,7 @@ resourceMetrics: name: system.cpu.load_average.5m unit: "1" scope: - name: otelcol/hostmetricsreceiver/load + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/loadscraper version: v0.55.0-341-gf787ff695 - resource: {} schemaUrl: https://opentelemetry.io/schemas/1.9.0 @@ -62,7 +62,7 @@ resourceMetrics: timeUnixNano: "1660943983792184000" unit: By scope: - name: otelcol/hostmetricsreceiver/memory + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/memoryscraper version: v0.55.0-341-gf787ff695 - resource: {} schemaUrl: https://opentelemetry.io/schemas/1.9.0 @@ -1583,7 +1583,7 @@ resourceMetrics: isMonotonic: true unit: '{packets}' scope: - name: otelcol/hostmetricsreceiver/network + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/networkscraper version: v0.55.0-341-gf787ff695 - resource: {} schemaUrl: https://opentelemetry.io/schemas/1.9.0 @@ -1694,7 +1694,7 @@ resourceMetrics: timeUnixNano: "1660943984119168000" unit: By scope: - name: otelcol/hostmetricsreceiver/paging + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/pagingscraper version: v0.55.0-341-gf787ff695 - resource: {} schemaUrl: https://opentelemetry.io/schemas/1.9.0 @@ -2378,5 +2378,5 @@ resourceMetrics: timeUnixNano: "1660943984125836000" unit: By scope: - name: otelcol/hostmetricsreceiver/filesystem + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/filesystemscraper version: v0.55.0-341-gf787ff695 diff --git a/exporter/signalfxexporter/testdata/hostmetrics_system_cpu_time_1.yaml b/exporter/signalfxexporter/testdata/hostmetrics_system_cpu_time_1.yaml index 56446bdb6a45..18da8bcdf664 100644 --- a/exporter/signalfxexporter/testdata/hostmetrics_system_cpu_time_1.yaml +++ b/exporter/signalfxexporter/testdata/hostmetrics_system_cpu_time_1.yaml @@ -91,5 +91,5 @@ resourceMetrics: isMonotonic: true unit: s scope: - name: otelcol/hostmetricsreceiver/cpu + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/cpuscraper version: latest diff --git a/exporter/signalfxexporter/testdata/hostmetrics_system_cpu_time_2.yaml b/exporter/signalfxexporter/testdata/hostmetrics_system_cpu_time_2.yaml index 064f37499377..7ed418f61c88 100644 --- a/exporter/signalfxexporter/testdata/hostmetrics_system_cpu_time_2.yaml +++ b/exporter/signalfxexporter/testdata/hostmetrics_system_cpu_time_2.yaml @@ -91,5 +91,5 @@ resourceMetrics: isMonotonic: true unit: s scope: - name: otelcol/hostmetricsreceiver/cpu + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/cpuscraper version: latest diff --git a/exporter/signalfxexporter/testdata/json/non_default_metrics_otel_convention.json b/exporter/signalfxexporter/testdata/json/non_default_metrics_otel_convention.json index e9ea9839db75..e3a7e8336497 100644 --- a/exporter/signalfxexporter/testdata/json/non_default_metrics_otel_convention.json +++ b/exporter/signalfxexporter/testdata/json/non_default_metrics_otel_convention.json @@ -59,48 +59,6 @@ { "system.network.tcp_connections": null }, - { - "k8s.cronjob.active_jobs": null - }, - { - "k8s.job.active_pods": null - }, - { - "k8s.job.desired_successful_pods": null - }, - { - "k8s.job.failed_pods": null - }, - { - "k8s.job.max_parallel_pods": null - }, - { - "k8s.job.successful_pods": null - }, - { - "k8s.statefulset.desired_pods": null - }, - { - "k8s.statefulset.current_pods": null - }, - { - "k8s.statefulset.ready_pods": null - }, - { - "k8s.statefulset.updated_pods": null - }, - { - "k8s.hpa.max_replicas": null - }, - { - "k8s.hpa.min_replicas": null - }, - { - "k8s.hpa.current_replicas": null - }, - { - "k8s.hpa.desired_replicas": null - }, { "k8s.container.ephemeral-storage_limit": null }, @@ -131,9 +89,6 @@ { "container.memory.rss": null }, - { - "container.memory.working_set": null - }, { "k8s.pod.memory.available": null }, diff --git a/exporter/skywalkingexporter/README.md b/exporter/skywalkingexporter/README.md deleted file mode 100644 index 8168be3a5919..000000000000 --- a/exporter/skywalkingexporter/README.md +++ /dev/null @@ -1,65 +0,0 @@ -# SkyWalking gRPC Exporter - - -| Status | | -| ------------- |-----------| -| Stability | [unmaintained]: metrics, logs | -| Distributions | [contrib] | -| Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fskywalking%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fskywalking) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fskywalking%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fskywalking) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | | -| Emeritus | [@liqiangz](https://www.github.com/liqiangz) | - -[unmaintained]: https://github.com/open-telemetry/opentelemetry-collector#unmaintained -[contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib - - -Exports data via gRPC using [skywalking-data-collect-protocol](https://github.com/apache/skywalking-data-collect-protocol) format. By default, this exporter requires TLS and offers queued retry capabilities. - -## Getting Started - -The following settings are required: - -- `endpoint` (no default): host:port to which the exporter is going to send SkyWalking log data, -using the gRPC protocol. The valid syntax is described -[here](https://github.com/grpc/grpc/blob/master/doc/naming.md). -If a scheme of `https` is used then client transport security is enabled and overrides the `insecure` setting. - -- `num_streams` (default = `2`): the number of grpc streams that send the gRPC requests. - -By default, TLS is enabled and must be configured under `tls:`: - -- `insecure` (default = `false`): whether to enable client transport security for - the exporter's connection. - -As a result, the following parameters are also required under `tls:`: - -- `cert_file` (no default): path to the TLS cert to use for TLS required connections. Should - only be used if `insecure` is set to false. -- `key_file` (no default): path to the TLS key to use for TLS required connections. Should - only be used if `insecure` is set to false. - -Example: - -```yaml -exporters: - skywalking: - endpoint: "192.168.1.5:11800" - tls: - insecure: true - num_streams: 5 - skywalking/2: - endpoint: "10.18.7.4:11800" - compression: "gzip" - tls: - cert_file: file.cert - key_file: file.key - timeout: 10s -``` - -## Advanced Configuration - -Several helper files are leveraged to provide additional capabilities automatically: - -- [gRPC settings](https://github.com/open-telemetry/opentelemetry-collector/blob/main/config/configgrpc/README.md) -- [TLS and mTLS settings](https://github.com/open-telemetry/opentelemetry-collector/blob/main/config/configtls/README.md) -- [Queuing, retry and timeout settings](https://github.com/open-telemetry/opentelemetry-collector/blob/main/exporter/exporterhelper/README.md) diff --git a/exporter/skywalkingexporter/config.go b/exporter/skywalkingexporter/config.go deleted file mode 100644 index dbe20d0c43bf..000000000000 --- a/exporter/skywalkingexporter/config.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package skywalkingexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/skywalkingexporter" - -import ( - "errors" - - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/config/configgrpc" - "go.opentelemetry.io/collector/config/configretry" - "go.opentelemetry.io/collector/exporter/exporterhelper" -) - -// Config defines configuration for SkyWalking exporter. -type Config struct { - configgrpc.ClientConfig `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. - exporterhelper.QueueSettings `mapstructure:"sending_queue"` - configretry.BackOffConfig `mapstructure:"retry_on_failure"` - exporterhelper.TimeoutSettings `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. - - // The number of grpc streams that send the gRPC requests. - NumStreams int `mapstructure:"num_streams"` -} - -var _ component.Config = (*Config)(nil) - -// Validate checks if the exporter configuration is valid -func (cfg *Config) Validate() error { - if cfg.Endpoint == "" { - return errors.New("Skywalking exporter cfg requires an Endpoint") - } - - if cfg.NumStreams <= 0 { - return errors.New("Skywalking exporter cfg requires at least one stream") - } - return nil -} diff --git a/exporter/skywalkingexporter/config_test.go b/exporter/skywalkingexporter/config_test.go deleted file mode 100644 index 5f28d24bccb9..000000000000 --- a/exporter/skywalkingexporter/config_test.go +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package skywalkingexporter - -import ( - "path/filepath" - "testing" - "time" - - "github.com/cenkalti/backoff/v4" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/config/configgrpc" - "go.opentelemetry.io/collector/config/configopaque" - "go.opentelemetry.io/collector/config/configretry" - "go.opentelemetry.io/collector/config/configtls" - "go.opentelemetry.io/collector/confmap/confmaptest" - "go.opentelemetry.io/collector/exporter/exporterhelper" - - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/skywalkingexporter/internal/metadata" -) - -func TestLoadConfig(t *testing.T) { - t.Parallel() - - cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml")) - require.NoError(t, err) - - defaultCfg := createDefaultConfig().(*Config) - defaultCfg.Endpoint = "1.2.3.4:11800" - - tests := []struct { - id component.ID - expected component.Config - }{ - { - id: component.NewIDWithName(metadata.Type, ""), - expected: defaultCfg, - }, - { - id: component.NewIDWithName(metadata.Type, "2"), - expected: &Config{ - BackOffConfig: configretry.BackOffConfig{ - Enabled: true, - InitialInterval: 10 * time.Second, - MaxInterval: 1 * time.Minute, - MaxElapsedTime: 10 * time.Minute, - RandomizationFactor: backoff.DefaultRandomizationFactor, - Multiplier: backoff.DefaultMultiplier, - }, - QueueSettings: exporterhelper.QueueSettings{ - Enabled: true, - NumConsumers: 2, - QueueSize: 10, - }, - TimeoutSettings: exporterhelper.TimeoutSettings{ - Timeout: 10 * time.Second, - }, - ClientConfig: configgrpc.ClientConfig{ - Headers: map[string]configopaque.String{ - "can you have a . here?": "F0000000-0000-0000-0000-000000000000", - "header1": "234", - "another": "somevalue", - }, - Endpoint: "1.2.3.4:11800", - Compression: "gzip", - TLSSetting: configtls.ClientConfig{ - Config: configtls.Config{ - CAFile: "/var/lib/mycert.pem", - }, - Insecure: false, - }, - Keepalive: &configgrpc.KeepaliveClientConfig{ - Time: 20, - PermitWithoutStream: true, - Timeout: 30, - }, - WriteBufferSize: 512 * 1024, - BalancerName: "round_robin", - }, - NumStreams: 233, - }, - }, - } - - for _, tt := range tests { - t.Run(tt.id.String(), func(t *testing.T) { - factory := NewFactory() - cfg := factory.CreateDefaultConfig() - - sub, err := cm.Sub(tt.id.String()) - require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) - - assert.NoError(t, component.ValidateConfig(cfg)) - assert.Equal(t, tt.expected, cfg) - }) - } -} - -func TestValidate(t *testing.T) { - c1 := &Config{ - ClientConfig: configgrpc.ClientConfig{ - Endpoint: "", - }, - NumStreams: 3, - } - err := c1.Validate() - assert.Error(t, err) - c2 := &Config{ - ClientConfig: configgrpc.ClientConfig{ - Endpoint: "", - }, - NumStreams: 0, - } - err2 := c2.Validate() - assert.Error(t, err2) -} diff --git a/exporter/skywalkingexporter/doc.go b/exporter/skywalkingexporter/doc.go deleted file mode 100644 index 1c0553141e52..000000000000 --- a/exporter/skywalkingexporter/doc.go +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -//go:generate mdatagen metadata.yaml - -// Package skywalkingexporter exports data by using SkyWalking data collect protocol to a gPRC endpoint. -package skywalkingexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/skywalkingexporter" diff --git a/exporter/skywalkingexporter/factory.go b/exporter/skywalkingexporter/factory.go deleted file mode 100644 index 61f1758e8d32..000000000000 --- a/exporter/skywalkingexporter/factory.go +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package skywalkingexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/skywalkingexporter" - -import ( - "context" - - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/config/configgrpc" - "go.opentelemetry.io/collector/config/configretry" - "go.opentelemetry.io/collector/consumer" - "go.opentelemetry.io/collector/exporter" - "go.opentelemetry.io/collector/exporter/exporterhelper" - - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/skywalkingexporter/internal/metadata" -) - -// NewFactory creates a factory for Skywalking exporter. -func NewFactory() exporter.Factory { - return exporter.NewFactory( - metadata.Type, - createDefaultConfig, - exporter.WithLogs(createLogsExporter, metadata.LogsStability), - exporter.WithMetrics(createMetricsExporter, metadata.MetricsStability)) -} - -func createDefaultConfig() component.Config { - return &Config{ - BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), - TimeoutSettings: exporterhelper.NewDefaultTimeoutSettings(), - ClientConfig: configgrpc.ClientConfig{ - // We almost read 0 bytes, so no need to tune ReadBufferSize. - WriteBufferSize: 512 * 1024, - }, - NumStreams: 2, - } -} - -func createLogsExporter( - ctx context.Context, - set exporter.CreateSettings, - cfg component.Config, -) (exporter.Logs, error) { - oCfg := cfg.(*Config) - oce := newLogsExporter(ctx, oCfg, set.TelemetrySettings) - return exporterhelper.NewLogsExporter( - ctx, - set, - cfg, - oce.pushLogs, - exporterhelper.WithCapabilities(consumer.Capabilities{MutatesData: false}), - exporterhelper.WithRetry(oCfg.BackOffConfig), - exporterhelper.WithQueue(oCfg.QueueSettings), - exporterhelper.WithTimeout(oCfg.TimeoutSettings), - exporterhelper.WithStart(oce.start), - exporterhelper.WithShutdown(oce.shutdown), - ) -} - -func createMetricsExporter(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (exporter.Metrics, error) { - oCfg := cfg.(*Config) - oce := newMetricsExporter(ctx, oCfg, set.TelemetrySettings) - return exporterhelper.NewMetricsExporter( - ctx, - set, - cfg, - oce.pushMetrics, - exporterhelper.WithCapabilities(consumer.Capabilities{MutatesData: false}), - exporterhelper.WithRetry(oCfg.BackOffConfig), - exporterhelper.WithQueue(oCfg.QueueSettings), - exporterhelper.WithTimeout(oCfg.TimeoutSettings), - exporterhelper.WithStart(oce.start), - exporterhelper.WithShutdown(oce.shutdown)) -} diff --git a/exporter/skywalkingexporter/factory_test.go b/exporter/skywalkingexporter/factory_test.go deleted file mode 100644 index 948dc6b5d65d..000000000000 --- a/exporter/skywalkingexporter/factory_test.go +++ /dev/null @@ -1,157 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package skywalkingexporter - -import ( - "context" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/component/componenttest" - "go.opentelemetry.io/collector/config/configgrpc" - "go.opentelemetry.io/collector/config/configopaque" - "go.opentelemetry.io/collector/config/configtls" - "go.opentelemetry.io/collector/exporter/exportertest" - - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/testutil" -) - -func TestCreateDefaultConfig(t *testing.T) { - cfg := createDefaultConfig() - assert.NotNil(t, cfg, "failed to create default config") - assert.NoError(t, componenttest.CheckConfigStruct(cfg)) -} - -func TestCreateTracesExporter(t *testing.T) { - endpoint := testutil.GetAvailableLocalAddress(t) - tests := []struct { - name string - config *Config - mustFailOnCreate bool - mustFailOnStart bool - }{ - { - name: "UseSecure", - config: &Config{ - ClientConfig: configgrpc.ClientConfig{ - Endpoint: endpoint, - TLSSetting: configtls.ClientConfig{ - Insecure: false, - }, - }, - NumStreams: 3, - }, - }, - { - name: "Keepalive", - config: &Config{ - ClientConfig: configgrpc.ClientConfig{ - Endpoint: endpoint, - Keepalive: &configgrpc.KeepaliveClientConfig{ - Time: 30 * time.Second, - Timeout: 25 * time.Second, - PermitWithoutStream: true, - }, - }, - NumStreams: 3, - }, - }, - { - name: "Compression", - config: &Config{ - ClientConfig: configgrpc.ClientConfig{ - Endpoint: endpoint, - Compression: "gzip", - }, - NumStreams: 3, - }, - }, - { - name: "Headers", - config: &Config{ - ClientConfig: configgrpc.ClientConfig{ - Endpoint: endpoint, - Headers: map[string]configopaque.String{ - "hdr1": "val1", - "hdr2": "val2", - }, - }, - NumStreams: 3, - }, - }, - { - name: "CompressionError", - config: &Config{ - ClientConfig: configgrpc.ClientConfig{ - Endpoint: endpoint, - Compression: "unknown compression", - }, - NumStreams: 3, - }, - mustFailOnCreate: false, - mustFailOnStart: true, - }, - { - name: "CaCert", - config: &Config{ - ClientConfig: configgrpc.ClientConfig{ - Endpoint: endpoint, - TLSSetting: configtls.ClientConfig{ - Config: configtls.Config{ - CAFile: "testdata/test_cert.pem", - }, - Insecure: false, - }, - }, - NumStreams: 3, - }, - }, - { - name: "CertPemFileError", - config: &Config{ - ClientConfig: configgrpc.ClientConfig{ - Endpoint: endpoint, - TLSSetting: configtls.ClientConfig{ - Config: configtls.Config{ - CAFile: "nosuchfile", - }, - }, - }, - NumStreams: 3, - }, - mustFailOnCreate: false, - mustFailOnStart: true, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - set := exportertest.NewNopCreateSettings() - tExporter, tErr := createLogsExporter(context.Background(), set, tt.config) - checkErrorsAndStartAndShutdown(t, tExporter, tErr, tt.mustFailOnCreate, tt.mustFailOnStart) - tExporter2, tErr2 := createMetricsExporter(context.Background(), set, tt.config) - checkErrorsAndStartAndShutdown(t, tExporter2, tErr2, tt.mustFailOnCreate, tt.mustFailOnStart) - }) - } -} - -func checkErrorsAndStartAndShutdown(t *testing.T, exporter component.Component, err error, mustFailOnCreate, mustFailOnStart bool) { - if mustFailOnCreate { - assert.Error(t, err) - return - } - assert.NoError(t, err) - assert.NotNil(t, exporter) - - sErr := exporter.Start(context.Background(), componenttest.NewNopHost()) - if mustFailOnStart { - require.Error(t, sErr) - return - } - require.NoError(t, sErr) - require.NoError(t, exporter.Shutdown(context.Background())) -} diff --git a/exporter/skywalkingexporter/generated_component_test.go b/exporter/skywalkingexporter/generated_component_test.go deleted file mode 100644 index 7f2d9f7e05d3..000000000000 --- a/exporter/skywalkingexporter/generated_component_test.go +++ /dev/null @@ -1,103 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package skywalkingexporter - -import ( - "context" - "testing" - "time" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/component/componenttest" - "go.opentelemetry.io/collector/confmap/confmaptest" - "go.opentelemetry.io/collector/exporter" - "go.opentelemetry.io/collector/exporter/exportertest" - "go.opentelemetry.io/collector/pdata/pcommon" - "go.opentelemetry.io/collector/pdata/plog" - "go.opentelemetry.io/collector/pdata/pmetric" - "go.opentelemetry.io/collector/pdata/ptrace" -) - -func TestComponentFactoryType(t *testing.T) { - require.Equal(t, "skywalking", NewFactory().Type().String()) -} - -func TestComponentConfigStruct(t *testing.T) { - require.NoError(t, componenttest.CheckConfigStruct(NewFactory().CreateDefaultConfig())) -} - -func TestComponentLifecycle(t *testing.T) { - factory := NewFactory() - - tests := []struct { - name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) - }{ - - { - name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) - }, - }, - - { - name: "metrics", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsExporter(ctx, set, cfg) - }, - }, - } - - cm, err := confmaptest.LoadConf("metadata.yaml") - require.NoError(t, err) - cfg := factory.CreateDefaultConfig() - sub, err := cm.Sub("tests::config") - require.NoError(t, err) - require.NoError(t, sub.Unmarshal(&cfg)) - - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) - require.NoError(t, err) - err = c.Shutdown(context.Background()) - require.NoError(t, err) - }) - } -} - -func generateLifecycleTestLogs() plog.Logs { - logs := plog.NewLogs() - rl := logs.ResourceLogs().AppendEmpty() - rl.Resource().Attributes().PutStr("resource", "R1") - l := rl.ScopeLogs().AppendEmpty().LogRecords().AppendEmpty() - l.Body().SetStr("test log message") - l.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) - return logs -} - -func generateLifecycleTestMetrics() pmetric.Metrics { - metrics := pmetric.NewMetrics() - rm := metrics.ResourceMetrics().AppendEmpty() - rm.Resource().Attributes().PutStr("resource", "R1") - m := rm.ScopeMetrics().AppendEmpty().Metrics().AppendEmpty() - m.SetName("test_metric") - dp := m.SetEmptyGauge().DataPoints().AppendEmpty() - dp.Attributes().PutStr("test_attr", "value_1") - dp.SetIntValue(123) - dp.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) - return metrics -} - -func generateLifecycleTestTraces() ptrace.Traces { - traces := ptrace.NewTraces() - rs := traces.ResourceSpans().AppendEmpty() - rs.Resource().Attributes().PutStr("resource", "R1") - span := rs.ScopeSpans().AppendEmpty().Spans().AppendEmpty() - span.Attributes().PutStr("test_attr", "value_1") - span.SetName("test_span") - span.SetStartTimestamp(pcommon.NewTimestampFromTime(time.Now().Add(-1 * time.Second))) - span.SetEndTimestamp(pcommon.NewTimestampFromTime(time.Now())) - return traces -} diff --git a/exporter/skywalkingexporter/generated_package_test.go b/exporter/skywalkingexporter/generated_package_test.go deleted file mode 100644 index db1644c18bb3..000000000000 --- a/exporter/skywalkingexporter/generated_package_test.go +++ /dev/null @@ -1,13 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package skywalkingexporter - -import ( - "os" - "testing" -) - -func TestMain(m *testing.M) { - // skipping goleak test as per metadata.yml configuration - os.Exit(m.Run()) -} diff --git a/exporter/skywalkingexporter/go.mod b/exporter/skywalkingexporter/go.mod deleted file mode 100644 index ad9877b72bb0..000000000000 --- a/exporter/skywalkingexporter/go.mod +++ /dev/null @@ -1,92 +0,0 @@ -module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/skywalkingexporter - -go 1.21.0 - -require ( - github.com/cenkalti/backoff/v4 v4.3.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configgrpc v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/collector/config/configtls v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 - google.golang.org/grpc v1.64.0 - skywalking.apache.org/repo/goapi v0.0.0-20240104145220-ba7202308dd4 -) - -require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect - github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/snappy v0.0.4 // indirect - github.com/google/uuid v1.6.0 // indirect - github.com/hashicorp/go-version v1.7.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.2 // indirect - github.com/knadh/koanf/maps v0.1.1 // indirect - github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect - github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/reflectwalk v1.0.2 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/mostynb/go-grpc-compression v1.2.2 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/confignet v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.27.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/protobuf v1.34.1 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect -) - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/common => ../../internal/common - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal => ../../internal/coreinternal - -retract ( - v0.76.2 - v0.76.1 - v0.65.0 -) - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../../pkg/pdatautil - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest => ../../pkg/pdatatest - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden => ../../pkg/golden diff --git a/exporter/skywalkingexporter/go.sum b/exporter/skywalkingexporter/go.sum deleted file mode 100644 index e45b5efec034..000000000000 --- a/exporter/skywalkingexporter/go.sum +++ /dev/null @@ -1,321 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= -github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= -github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4= -github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= -github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= -github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= -github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mostynb/go-grpc-compression v1.2.2 h1:XaDbnRvt2+1vgr0b/l0qh4mJAfIxE0bKXtz2Znl3GGI= -github.com/mostynb/go-grpc-compression v1.2.2/go.mod h1:GOCr2KBxXcblCuczg3YdLQlcin1/NfyDA348ckuCH6w= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/configgrpc v0.102.0 h1:cQi5HwpkHvrZJUxZjoGXkWpAuK+gEyp/1Zjn0BrkvmQ= -go.opentelemetry.io/collector/config/configgrpc v0.102.0/go.mod h1:ASpBXzDWLiDGlG8iRFovU5R4LhAefoC4ajm+qIdslOw= -go.opentelemetry.io/collector/config/confignet v0.102.0 h1:+wQevJ/iBnPxL+roY7WWnAjMxB8v4M5QrS3+0iEmauw= -go.opentelemetry.io/collector/config/confignet v0.102.0/go.mod h1:pfOrCTfSZEB6H2rKtx41/3RN4dKs+X2EKQbw3MGRh0E= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 h1:vS1Ao/R55RNV4O7TA2Qopok8yN+X0LIP6RVWLFkprck= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0/go.mod h1:BMsdeOxN04K0L5FNUBfjFdvwWGNe/rkmSwH4Aelu/X0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= -go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= -go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= -go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -skywalking.apache.org/repo/goapi v0.0.0-20240104145220-ba7202308dd4 h1:3YIFmsshgsU6FzHgnkG9Z24CkXkgoexBN5O0aSzK79g= -skywalking.apache.org/repo/goapi v0.0.0-20240104145220-ba7202308dd4/go.mod h1:oD2dxcDAHVIt95Ee7kJHgZ5f64QNhrqTjQYARwfafc4= diff --git a/exporter/skywalkingexporter/internal/metadata/generated_status.go b/exporter/skywalkingexporter/internal/metadata/generated_status.go deleted file mode 100644 index 81883e96e479..000000000000 --- a/exporter/skywalkingexporter/internal/metadata/generated_status.go +++ /dev/null @@ -1,16 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" -) - -var ( - Type = component.MustNewType("skywalking") -) - -const ( - MetricsStability = component.StabilityLevelUnmaintained - LogsStability = component.StabilityLevelUnmaintained -) diff --git a/exporter/skywalkingexporter/internal/metadata/generated_telemetry.go b/exporter/skywalkingexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index e56c26ef01a9..000000000000 --- a/exporter/skywalkingexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/skywalking") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/skywalking") -} diff --git a/exporter/skywalkingexporter/internal/metadata/generated_telemetry_test.go b/exporter/skywalkingexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 5e8e3e90ebe8..000000000000 --- a/exporter/skywalkingexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/skywalking", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/skywalking", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/skywalkingexporter/logrecord_to_logdata.go b/exporter/skywalkingexporter/logrecord_to_logdata.go deleted file mode 100644 index d592e1847841..000000000000 --- a/exporter/skywalkingexporter/logrecord_to_logdata.go +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package skywalkingexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/skywalkingexporter" - -import ( - "encoding/hex" - "strconv" - "time" - - "go.opentelemetry.io/collector/pdata/pcommon" - "go.opentelemetry.io/collector/pdata/plog" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" - common "skywalking.apache.org/repo/goapi/collect/common/v3" - logpb "skywalking.apache.org/repo/goapi/collect/logging/v3" -) - -const ( - spanIDField = "spanID" - severityNumber = "severityNumber" - severityText = "severityText" - flags = "flags" - instrumentationName = "otlp.name" - instrumentationVersion = "otlp.version" - defaultServiceName = "otel-collector" -) - -func logRecordToLogData(ld plog.Logs) []*logpb.LogData { - var lds []*logpb.LogData - rls := ld.ResourceLogs() - for i := 0; i < rls.Len(); i++ { - rl := rls.At(i) - ills := rl.ScopeLogs() - resource := rl.Resource() - for j := 0; j < ills.Len(); j++ { - ils := ills.At(j) - logs := ils.LogRecords() - for k := 0; k < logs.Len(); k++ { - logData := &logpb.LogData{} - logData.Tags = &logpb.LogTags{} - resourceToLogData(resource, logData) - instrumentationLibraryToLogData(ils.Scope(), logData) - mapLogRecordToLogData(logs.At(k), logData) - lds = append(lds, logData) - } - } - } - return lds -} - -func resourceToLogData(resource pcommon.Resource, logData *logpb.LogData) { - attrs := resource.Attributes() - - if serviceName, ok := attrs.Get(conventions.AttributeServiceName); ok { - logData.Service = serviceName.AsString() - } else { - logData.Service = defaultServiceName - } - - if serviceInstanceID, ok := attrs.Get(conventions.AttributeServiceInstanceID); ok { - logData.ServiceInstance = serviceInstanceID.AsString() - } - - attrs.Range(func(k string, v pcommon.Value) bool { - logData.Tags.Data = append(logData.Tags.Data, &common.KeyStringValuePair{ - Key: k, - Value: v.AsString(), - }) - return true - }) -} - -func instrumentationLibraryToLogData(scope pcommon.InstrumentationScope, logData *logpb.LogData) { - if nameValue := scope.Name(); nameValue != "" { - logData.Tags.Data = append(logData.Tags.Data, &common.KeyStringValuePair{ - Key: instrumentationName, - Value: nameValue, - }) - } - if version := scope.Version(); version != "" { - logData.Tags.Data = append(logData.Tags.Data, &common.KeyStringValuePair{ - Key: instrumentationVersion, - Value: version, - }) - } -} - -func mapLogRecordToLogData(lr plog.LogRecord, logData *logpb.LogData) { - if lr.Body().Type() == pcommon.ValueTypeEmpty { - return - } - - if timestamp := lr.Timestamp(); timestamp > 0 { - logData.Timestamp = lr.Timestamp().AsTime().UnixNano() / int64(time.Millisecond) - } - - if sn := strconv.FormatInt(int64(lr.SeverityNumber()), 10); sn != "" { - logData.Tags.Data = append(logData.Tags.Data, &common.KeyStringValuePair{ - Key: severityNumber, - Value: sn, - }) - } - - if st := lr.SeverityText(); st != "" { - logData.Tags.Data = append(logData.Tags.Data, &common.KeyStringValuePair{ - Key: severityText, - Value: st, - }) - } - - lr.Attributes().Range(func(k string, v pcommon.Value) bool { - logData.Tags.Data = append(logData.Tags.Data, &common.KeyStringValuePair{ - Key: k, - Value: v.AsString(), - }) - return true - }) - - logData.Body = &logpb.LogDataBody{ - Type: "body-type", - Content: &logpb.LogDataBody_Text{ - Text: &logpb.TextLog{ - Text: lr.Body().AsString(), - }}, - } - - if flag := strconv.FormatUint(uint64(lr.Flags()), 16); flag != "" { - logData.Tags.Data = append(logData.Tags.Data, &common.KeyStringValuePair{ - Key: flags, - Value: flag, - }) - } - - if traceID := lr.TraceID(); !traceID.IsEmpty() { - logData.TraceContext = &logpb.TraceContext{TraceId: hex.EncodeToString(traceID[:])} - } - - if spanID := lr.SpanID(); !spanID.IsEmpty() { - logData.Tags.Data = append(logData.Tags.Data, &common.KeyStringValuePair{ - Key: spanIDField, - Value: hex.EncodeToString(spanID[:]), - }) - } -} diff --git a/exporter/skywalkingexporter/logrecord_to_logdata_test.go b/exporter/skywalkingexporter/logrecord_to_logdata_test.go deleted file mode 100644 index c3c12c95ecf8..000000000000 --- a/exporter/skywalkingexporter/logrecord_to_logdata_test.go +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package skywalkingexporter - -import ( - "testing" - "time" - - "github.com/stretchr/testify/assert" - "go.opentelemetry.io/collector/pdata/pcommon" - "go.opentelemetry.io/collector/pdata/plog" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" - logpb "skywalking.apache.org/repo/goapi/collect/logging/v3" -) - -func fillComplexAttributeValueMap(m pcommon.Map) { - m.PutBool("result", true) - m.PutStr("status", "ok") - m.PutDouble("value", 1.3) - m.PutInt("code", 200) - m.PutEmpty("null") - m.PutEmptySlice("array").AppendEmpty().SetStr("array") - m.PutEmptyMap("map").PutStr("data", "hello world") - m.PutStr("status", "ok") -} - -func createLogData(numberOfLogs int) plog.Logs { - logs := plog.NewLogs() - logs.ResourceLogs().AppendEmpty() - rl := logs.ResourceLogs().AppendEmpty() - rl.Resource().Attributes().PutStr("resourceKey", "resourceValue") - rl.Resource().Attributes().PutStr(conventions.AttributeServiceName, "test-service") - rl.Resource().Attributes().PutStr(conventions.AttributeHostName, "test-host") - rl.Resource().Attributes().PutStr(conventions.AttributeServiceInstanceID, "test-instance") - sl := rl.ScopeLogs().AppendEmpty() - sl.Scope().SetName("collector") - sl.Scope().SetVersion("v0.1.0") - - for i := 0; i < numberOfLogs; i++ { - ts := pcommon.Timestamp(int64(i) * time.Millisecond.Nanoseconds()) - logRecord := sl.LogRecords().AppendEmpty() - logRecord.SetTraceID([16]byte{1, 2, 3, 4, 5, 6, 7, 8, 8, 7, 6, 5, 4, 3, 2, 1}) - logRecord.SetSpanID([8]byte{1, 2, 3, 4, 5, 6, 7, 8}) - logRecord.SetFlags(plog.DefaultLogRecordFlags.WithIsSampled(true)) - logRecord.SetSeverityText("INFO") - logRecord.SetSeverityNumber(plog.SeverityNumberInfo) - logRecord.SetTimestamp(ts) - switch i { - case 0: - case 1: - logRecord.Body().SetBool(true) - case 2: - logRecord.Body().SetInt(2.0) - case 3: - logRecord.Body().SetDouble(3.0) - case 4: - logRecord.Body().SetStr("4") - case 5: - fillComplexAttributeValueMap(logRecord.Attributes().PutEmptyMap("map-value")) - logRecord.Body().SetStr("log contents") - case 6: - logRecord.Attributes().PutEmptySlice("array-value").AppendEmpty().SetStr("array") - logRecord.Body().SetStr("log contents") - default: - logRecord.Body().SetStr("log contents") - } - logRecord.Attributes().PutStr("custom", "custom") - } - - return logs -} - -func TestLogsDataToLogService(t *testing.T) { - gotLogs := logRecordToLogData(createLogData(10)) - assert.Equal(t, len(gotLogs), 10) - for i := 0; i < 10; i++ { - log := gotLogs[i] - - if i != 0 { - assert.Equal(t, log.TraceContext.TraceId, "01020304050607080807060504030201") - assert.Equal(t, searchLogTag(spanIDField, log), "0102030405060708") - assert.Equal(t, searchLogTag(flags, log), "1") - assert.Equal(t, searchLogTag(severityText, log), "INFO") - assert.Equal(t, searchLogTag(severityNumber, log), "9") - assert.Equal(t, log.Timestamp, pcommon.Timestamp(int64(i)*time.Millisecond.Nanoseconds()).AsTime().UnixMilli()) - switch i { - case 1: - assert.Equal(t, log.GetBody().GetText().GetText(), "true") - case 2: - assert.Equal(t, log.GetBody().GetText().GetText(), "2") - case 3: - assert.Equal(t, log.GetBody().GetText().GetText(), "3") - case 4: - assert.Equal(t, log.GetBody().GetText().GetText(), "4") - case 5: - assert.Equal(t, log.GetBody().GetText().GetText(), "log contents") - assert.Equal(t, searchLogTag("map-value", log), "{\"array\":[\"array\"],\"code\":200,\"map\":{\"data\":\"hello world\"},\"null\":null,\"result\":true,\"status\":\"ok\",\"value\":1.3}") - case 6: - assert.Equal(t, log.GetBody().GetText().GetText(), "log contents") - assert.Equal(t, searchLogTag("array-value", log), "[\"array\"]") - default: - assert.Equal(t, log.GetBody().GetText().GetText(), "log contents") - } - } else { - assert.Equal(t, log.TraceContext, (*logpb.TraceContext)(nil)) - assert.Equal(t, log.Body, (*logpb.LogDataBody)(nil)) - } - assert.Equal(t, log.Service, "test-service") - assert.Equal(t, log.ServiceInstance, "test-instance") - assert.Equal(t, searchLogTag("resourceKey", log), "resourceValue") - assert.Equal(t, searchLogTag(conventions.AttributeHostName, log), "test-host") - assert.Equal(t, searchLogTag(instrumentationName, log), "collector") - assert.Equal(t, searchLogTag(instrumentationVersion, log), "v0.1.0") - - if i != 0 { - assert.Equal(t, searchLogTag("custom", log), "custom") - } - } -} - -func searchLogTag(key string, record *logpb.LogData) string { - for _, tag := range record.GetTags().GetData() { - if tag.Key == key { - return tag.GetValue() - } - } - return "" -} diff --git a/exporter/skywalkingexporter/metadata.yaml b/exporter/skywalkingexporter/metadata.yaml deleted file mode 100644 index e822e1eb11ed..000000000000 --- a/exporter/skywalkingexporter/metadata.yaml +++ /dev/null @@ -1,16 +0,0 @@ -type: skywalking -scope_name: otelcol/skywalking - -status: - class: exporter - stability: - unmaintained: [metrics, logs] - distributions: [contrib] - codeowners: - active: [] - emeritus: [liqiangz] - -tests: - skip_lifecycle: true - goleak: - skip: true diff --git a/exporter/skywalkingexporter/metricrecord_to_metricdata.go b/exporter/skywalkingexporter/metricrecord_to_metricdata.go deleted file mode 100644 index 93fcc9a8a950..000000000000 --- a/exporter/skywalkingexporter/metricrecord_to_metricdata.go +++ /dev/null @@ -1,235 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package skywalkingexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/skywalkingexporter" - -import ( - "strconv" - - "go.opentelemetry.io/collector/pdata/pcommon" - "go.opentelemetry.io/collector/pdata/pmetric" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" - metricpb "skywalking.apache.org/repo/goapi/collect/language/agent/v3" -) - -const ( - defaultServiceInstance = "otel-collector-instance" -) - -func resourceToMetricLabels(resource pcommon.Resource) []*metricpb.Label { - attrs := resource.Attributes() - labels := make([]*metricpb.Label, 0, attrs.Len()) - attrs.Range(func(k string, v pcommon.Value) bool { - labels = append(labels, - &metricpb.Label{ - Name: k, - Value: v.AsString(), - }) - return true - }) - return labels -} - -func resourceToServiceInfo(resource pcommon.Resource) (service string, serviceInstance string) { - attrs := resource.Attributes() - if serviceName, ok := attrs.Get(conventions.AttributeServiceName); ok { - service = serviceName.AsString() - } else { - service = defaultServiceName - } - if serviceInstanceID, ok := attrs.Get(conventions.AttributeServiceInstanceID); ok { - serviceInstance = serviceInstanceID.AsString() - } else { - serviceInstance = defaultServiceInstance - } - return service, serviceInstance -} - -func numberMetricsToData(name string, data pmetric.NumberDataPointSlice, defaultLabels []*metricpb.Label) (metrics []*metricpb.MeterData) { - metrics = make([]*metricpb.MeterData, 0, data.Len()) - for i := 0; i < data.Len(); i++ { - dataPoint := data.At(i) - attributeMap := dataPoint.Attributes() - labels := make([]*metricpb.Label, 0, attributeMap.Len()+len(defaultLabels)) - attributeMap.Range(func(k string, v pcommon.Value) bool { - labels = append(labels, &metricpb.Label{Name: k, Value: v.AsString()}) - return true - }) - - for _, label := range defaultLabels { - labels = append(labels, &metricpb.Label{Name: label.Name, Value: label.Value}) - } - meterData := &metricpb.MeterData{} - sv := &metricpb.MeterData_SingleValue{SingleValue: &metricpb.MeterSingleValue{}} - sv.SingleValue.Labels = labels - meterData.Timestamp = dataPoint.Timestamp().AsTime().UnixMilli() - sv.SingleValue.Name = name - switch dataPoint.ValueType() { - case pmetric.NumberDataPointValueTypeInt: - sv.SingleValue.Value = float64(dataPoint.IntValue()) - case pmetric.NumberDataPointValueTypeDouble: - sv.SingleValue.Value = dataPoint.DoubleValue() - } - meterData.Metric = sv - metrics = append(metrics, meterData) - } - return metrics -} - -func doubleHistogramMetricsToData(name string, data pmetric.HistogramDataPointSlice, defaultLabels []*metricpb.Label) (metrics []*metricpb.MeterData) { - metrics = make([]*metricpb.MeterData, 0, 3*data.Len()) - for i := 0; i < data.Len(); i++ { - dataPoint := data.At(i) - attributeMap := dataPoint.Attributes() - labels := make([]*metricpb.Label, 0, attributeMap.Len()+len(defaultLabels)) - attributeMap.Range(func(k string, v pcommon.Value) bool { - labels = append(labels, &metricpb.Label{Name: k, Value: v.AsString()}) - return true - }) - - for _, label := range defaultLabels { - labels = append(labels, &metricpb.Label{Name: label.Name, Value: label.Value}) - } - - meterData := &metricpb.MeterData{} - hg := &metricpb.MeterData_Histogram{Histogram: &metricpb.MeterHistogram{}} - hg.Histogram.Labels = labels - hg.Histogram.Name = name - bounds := dataPoint.ExplicitBounds() - bucketCount := dataPoint.BucketCounts().Len() - - if bucketCount > 0 { - hg.Histogram.Values = append(hg.Histogram.Values, - &metricpb.MeterBucketValue{Count: int64(dataPoint.BucketCounts().At(0)), IsNegativeInfinity: true}) - } - for i := 1; i < bucketCount && i-1 < bounds.Len(); i++ { - hg.Histogram.Values = append(hg.Histogram.Values, &metricpb.MeterBucketValue{Bucket: bounds.At(i - 1), - Count: int64(dataPoint.BucketCounts().At(i))}) - } - - meterData.Metric = hg - meterData.Timestamp = dataPoint.Timestamp().AsTime().UnixMilli() - metrics = append(metrics, meterData) - - meterDataSum := &metricpb.MeterData{} - svs := &metricpb.MeterData_SingleValue{SingleValue: &metricpb.MeterSingleValue{}} - svs.SingleValue.Labels = labels - svs.SingleValue.Name = name + "_sum" - svs.SingleValue.Value = dataPoint.Sum() - meterDataSum.Metric = svs - meterDataSum.Timestamp = dataPoint.Timestamp().AsTime().UnixMilli() - metrics = append(metrics, meterDataSum) - - meterDataCount := &metricpb.MeterData{} - svc := &metricpb.MeterData_SingleValue{SingleValue: &metricpb.MeterSingleValue{}} - svc.SingleValue.Labels = labels - meterDataCount.Timestamp = dataPoint.Timestamp().AsTime().UnixMilli() - svc.SingleValue.Name = name + "_count" - svc.SingleValue.Value = float64(dataPoint.Count()) - meterDataCount.Metric = svc - metrics = append(metrics, meterDataCount) - } - return metrics -} - -func doubleSummaryMetricsToData(name string, data pmetric.SummaryDataPointSlice, defaultLabels []*metricpb.Label) (metrics []*metricpb.MeterData) { - metrics = make([]*metricpb.MeterData, 0, 3*data.Len()) - for i := 0; i < data.Len(); i++ { - dataPoint := data.At(i) - attributeMap := dataPoint.Attributes() - labels := make([]*metricpb.Label, 0, attributeMap.Len()+len(defaultLabels)) - attributeMap.Range(func(k string, v pcommon.Value) bool { - labels = append(labels, &metricpb.Label{Name: k, Value: v.AsString()}) - return true - }) - - for _, label := range defaultLabels { - labels = append(labels, &metricpb.Label{Name: label.Name, Value: label.Value}) - } - - values := dataPoint.QuantileValues() - for i := 0; i < values.Len(); i++ { - value := values.At(i) - meterData := &metricpb.MeterData{} - sv := &metricpb.MeterData_SingleValue{SingleValue: &metricpb.MeterSingleValue{}} - svLabels := make([]*metricpb.Label, 0, len(labels)+1) - svLabels = append(svLabels, labels...) - svLabels = append(svLabels, &metricpb.Label{Name: "quantile", Value: strconv.FormatFloat(value.Quantile(), 'g', -1, 64)}) - sv.SingleValue.Labels = svLabels - meterData.Timestamp = dataPoint.Timestamp().AsTime().UnixMilli() - sv.SingleValue.Name = name - sv.SingleValue.Value = value.Value() - meterData.Metric = sv - metrics = append(metrics, meterData) - } - - meterDataSum := &metricpb.MeterData{} - svs := &metricpb.MeterData_SingleValue{SingleValue: &metricpb.MeterSingleValue{}} - svs.SingleValue.Labels = labels - svs.SingleValue.Name = name + "_sum" - svs.SingleValue.Value = dataPoint.Sum() - meterDataSum.Metric = svs - meterDataSum.Timestamp = dataPoint.Timestamp().AsTime().UnixMilli() - metrics = append(metrics, meterDataSum) - - meterDataCount := &metricpb.MeterData{} - svc := &metricpb.MeterData_SingleValue{SingleValue: &metricpb.MeterSingleValue{}} - svc.SingleValue.Labels = labels - meterDataCount.Timestamp = dataPoint.Timestamp().AsTime().UnixMilli() - svc.SingleValue.Name = name + "_count" - svc.SingleValue.Value = float64(dataPoint.Count()) - meterDataCount.Metric = svc - metrics = append(metrics, meterDataCount) - } - return metrics -} - -func metricDataToSwMetricData(md pmetric.Metric, defaultLabels []*metricpb.Label) (metrics []*metricpb.MeterData) { - //exhaustive:enforce - switch md.Type() { - case pmetric.MetricTypeEmpty: - break - case pmetric.MetricTypeGauge: - return numberMetricsToData(md.Name(), md.Gauge().DataPoints(), defaultLabels) - case pmetric.MetricTypeSum: - return numberMetricsToData(md.Name(), md.Sum().DataPoints(), defaultLabels) - case pmetric.MetricTypeHistogram: - return doubleHistogramMetricsToData(md.Name(), md.Histogram().DataPoints(), defaultLabels) - case pmetric.MetricTypeSummary: - return doubleSummaryMetricsToData(md.Name(), md.Summary().DataPoints(), defaultLabels) - case pmetric.MetricTypeExponentialHistogram: - return nil - } - return nil -} - -func metricsRecordToMetricData( - md pmetric.Metrics, -) (metrics *metricpb.MeterDataCollection) { - resMetrics := md.ResourceMetrics() - for i := 0; i < resMetrics.Len(); i++ { - resMetricSlice := resMetrics.At(i) - labels := resourceToMetricLabels(resMetricSlice.Resource()) - service, serviceInstance := resourceToServiceInfo(resMetricSlice.Resource()) - insMetricSlice := resMetricSlice.ScopeMetrics() - metrics = &metricpb.MeterDataCollection{} - for j := 0; j < insMetricSlice.Len(); j++ { - insMetrics := insMetricSlice.At(j) - // ignore insMetrics.Scope() - metricSlice := insMetrics.Metrics() - for k := 0; k < metricSlice.Len(); k++ { - oneMetric := metricSlice.At(k) - ms := metricDataToSwMetricData(oneMetric, labels) - if ms == nil { - continue - } - for _, m := range ms { - m.Service = service - m.ServiceInstance = serviceInstance - } - metrics.MeterData = append(metrics.MeterData, ms...) - } - } - } - return metrics -} diff --git a/exporter/skywalkingexporter/metricrecord_to_metricdata_test.go b/exporter/skywalkingexporter/metricrecord_to_metricdata_test.go deleted file mode 100644 index 2dd2e1a91695..000000000000 --- a/exporter/skywalkingexporter/metricrecord_to_metricdata_test.go +++ /dev/null @@ -1,197 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package skywalkingexporter - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "go.opentelemetry.io/collector/pdata/pcommon" - "go.opentelemetry.io/collector/pdata/pmetric" - metricpb "skywalking.apache.org/repo/goapi/collect/language/agent/v3" -) - -func TestMetricDataToLogService(t *testing.T) { - md := pmetric.NewMetrics() - md.ResourceMetrics().AppendEmpty() // Add an empty ResourceMetrics - rm := md.ResourceMetrics().AppendEmpty() - - rm.Resource().Attributes().PutStr("labelB", "valueB") - rm.Resource().Attributes().PutStr("labelA", "valueA") - rm.Resource().Attributes().PutStr("a", "b") - ilms := rm.ScopeMetrics() - ilms.AppendEmpty() // Add an empty ScopeMetrics - ilm := ilms.AppendEmpty() - - metrics := ilm.Metrics() - - badNameMetric := metrics.AppendEmpty() - badNameMetric.SetName("") - - noneMetric := metrics.AppendEmpty() - noneMetric.SetName("none") - - intGaugeMetric := metrics.AppendEmpty() - intGaugeMetric.SetName("int_gauge") - intGauge := intGaugeMetric.SetEmptyGauge() - intGaugeDataPoints := intGauge.DataPoints() - intGaugeDataPoint := intGaugeDataPoints.AppendEmpty() - intGaugeDataPoint.Attributes().PutStr("innerLabel", "innerValue") - intGaugeDataPoint.Attributes().PutStr("testa", "test") - intGaugeDataPoint.SetIntValue(10) - intGaugeDataPoint.SetTimestamp(pcommon.Timestamp(100_000_000)) - - doubleGaugeMetric := metrics.AppendEmpty() - doubleGaugeMetric.SetName("double_gauge") - doubleGauge := doubleGaugeMetric.SetEmptyGauge() - doubleGaugeDataPoints := doubleGauge.DataPoints() - doubleGaugeDataPoint := doubleGaugeDataPoints.AppendEmpty() - doubleGaugeDataPoint.Attributes().PutStr("innerLabel", "innerValue") - doubleGaugeDataPoint.SetDoubleValue(10.1) - doubleGaugeDataPoint.SetTimestamp(pcommon.Timestamp(100_000_000)) - - intSumMetric := metrics.AppendEmpty() - intSumMetric.SetName("int_sum") - intSum := intSumMetric.SetEmptySum() - intSumDataPoints := intSum.DataPoints() - intSumDataPoint := intSumDataPoints.AppendEmpty() - intSumDataPoint.Attributes().PutStr("innerLabel", "innerValue") - intSumDataPoint.SetIntValue(11) - intSumDataPoint.SetTimestamp(pcommon.Timestamp(100_000_000)) - - doubleSumMetric := metrics.AppendEmpty() - doubleSumMetric.SetName("double_sum") - doubleSum := doubleSumMetric.SetEmptySum() - doubleSumDataPoints := doubleSum.DataPoints() - doubleSumDataPoint := doubleSumDataPoints.AppendEmpty() - doubleSumDataPoint.Attributes().PutStr("innerLabel", "innerValue") - doubleSumDataPoint.SetDoubleValue(10.1) - doubleSumDataPoint.SetTimestamp(pcommon.Timestamp(100_000_000)) - - doubleHistogramMetric := metrics.AppendEmpty() - doubleHistogramMetric.SetName("double_$histogram") - doubleHistogram := doubleHistogramMetric.SetEmptyHistogram() - doubleHistogramDataPoints := doubleHistogram.DataPoints() - doubleHistogramDataPoint := doubleHistogramDataPoints.AppendEmpty() - doubleHistogramDataPoint.Attributes().PutStr("innerLabel", "innerValue") - doubleHistogramDataPoint.Attributes().PutStr("innerLabelH", "innerValueH") - doubleHistogramDataPoint.SetCount(5) - doubleHistogramDataPoint.SetSum(10.1) - doubleHistogramDataPoint.SetTimestamp(pcommon.Timestamp(100_000_000)) - doubleHistogramDataPoint.BucketCounts().FromRaw([]uint64{1, 2, 2}) - doubleHistogramDataPoint.ExplicitBounds().FromRaw([]float64{1, 2}) - - doubleSummaryMetric := metrics.AppendEmpty() - doubleSummaryMetric.SetName("double-summary") - doubleSummary := doubleSummaryMetric.SetEmptySummary() - doubleSummaryDataPoints := doubleSummary.DataPoints() - doubleSummaryDataPoint := doubleSummaryDataPoints.AppendEmpty() - doubleSummaryDataPoint.SetCount(2) - doubleSummaryDataPoint.SetSum(10.1) - doubleSummaryDataPoint.SetTimestamp(pcommon.Timestamp(100_000_000)) - doubleSummaryDataPoint.Attributes().PutStr("innerLabel", "innerValue") - doubleSummaryDataPoint.Attributes().PutStr("innerLabelS", "innerValueS") - quantileVal := doubleSummaryDataPoint.QuantileValues().AppendEmpty() - quantileVal.SetValue(10.2) - quantileVal.SetQuantile(0.9) - quantileVal2 := doubleSummaryDataPoint.QuantileValues().AppendEmpty() - quantileVal2.SetValue(10.5) - quantileVal2.SetQuantile(0.95) - - gotLogs := metricsRecordToMetricData(md) - - assert.Equal(t, 11, len(gotLogs.MeterData)) - - for i, meterData := range gotLogs.MeterData { - assert.Equal(t, "valueB", searchMetricTag("labelB", meterData)) - assert.Equal(t, "valueA", searchMetricTag("labelA", meterData)) - assert.Equal(t, "b", searchMetricTag("a", meterData)) - assert.Equal(t, "innerValue", searchMetricTag("innerLabel", meterData)) - assert.Equal(t, defaultServiceName, meterData.GetService()) - assert.Equal(t, defaultServiceInstance, meterData.GetServiceInstance()) - switch i { - case 0: - assert.Equal(t, "int_gauge", meterData.GetSingleValue().GetName()) - assert.Equal(t, float64(10), meterData.GetSingleValue().GetValue()) - assert.Equal(t, int64(100), meterData.GetTimestamp()) - assert.Equal(t, "test", searchMetricTag("testa", meterData)) - case 1: - assert.Equal(t, "double_gauge", meterData.GetSingleValue().GetName()) - assert.Equal(t, 10.1, meterData.GetSingleValue().GetValue()) - assert.Equal(t, int64(100), meterData.GetTimestamp()) - case 2: - assert.Equal(t, "int_sum", meterData.GetSingleValue().GetName()) - assert.Equal(t, float64(11), meterData.GetSingleValue().GetValue()) - assert.Equal(t, int64(100), meterData.GetTimestamp()) - case 3: - assert.Equal(t, "double_sum", meterData.GetSingleValue().GetName()) - assert.Equal(t, 10.1, meterData.GetSingleValue().GetValue()) - assert.Equal(t, int64(100), meterData.GetTimestamp()) - case 4: - assert.Equal(t, "double_$histogram", meterData.GetHistogram().GetName()) - assert.Equal(t, 3, len(meterData.GetHistogram().GetValues())) - assert.Equal(t, int64(1), meterData.GetHistogram().GetValues()[0].Count) - assert.Equal(t, true, meterData.GetHistogram().GetValues()[0].IsNegativeInfinity) - assert.Equal(t, int64(2), meterData.GetHistogram().GetValues()[1].Count) - assert.Equal(t, false, meterData.GetHistogram().GetValues()[1].IsNegativeInfinity) - assert.Equal(t, float64(1), meterData.GetHistogram().GetValues()[1].GetBucket()) - assert.Equal(t, int64(2), meterData.GetHistogram().GetValues()[2].Count) - assert.Equal(t, false, meterData.GetHistogram().GetValues()[2].IsNegativeInfinity) - assert.Equal(t, float64(2), meterData.GetHistogram().GetValues()[2].GetBucket()) - assert.Equal(t, int64(100), meterData.GetTimestamp()) - assert.Equal(t, "innerValueH", searchMetricTag("innerLabelH", meterData)) - case 5: - assert.Equal(t, "double_$histogram_sum", meterData.GetSingleValue().GetName()) - assert.Equal(t, 10.1, meterData.GetSingleValue().GetValue()) - assert.Equal(t, int64(100), meterData.GetTimestamp()) - assert.Equal(t, "innerValueH", searchMetricTag("innerLabelH", meterData)) - case 6: - assert.Equal(t, "double_$histogram_count", meterData.GetSingleValue().GetName()) - assert.Equal(t, float64(5), meterData.GetSingleValue().GetValue()) - assert.Equal(t, int64(100), meterData.GetTimestamp()) - assert.Equal(t, "innerValueH", searchMetricTag("innerLabelH", meterData)) - case 7: - assert.Equal(t, "double-summary", meterData.GetSingleValue().GetName()) - assert.Equal(t, 10.2, meterData.GetSingleValue().GetValue()) - assert.Equal(t, int64(100), meterData.GetTimestamp()) - assert.Equal(t, "innerValueS", searchMetricTag("innerLabelS", meterData)) - assert.Equal(t, "0.9", searchMetricTag("quantile", meterData)) - case 8: - assert.Equal(t, "double-summary", meterData.GetSingleValue().GetName()) - assert.Equal(t, 10.5, meterData.GetSingleValue().GetValue()) - assert.Equal(t, int64(100), meterData.GetTimestamp()) - assert.Equal(t, "innerValueS", searchMetricTag("innerLabelS", meterData)) - assert.Equal(t, "0.95", searchMetricTag("quantile", meterData)) - case 9: - assert.Equal(t, "double-summary_sum", meterData.GetSingleValue().GetName()) - assert.Equal(t, 10.1, meterData.GetSingleValue().GetValue()) - assert.Equal(t, int64(100), meterData.GetTimestamp()) - assert.Equal(t, "innerValueS", searchMetricTag("innerLabelS", meterData)) - case 10: - assert.Equal(t, "double-summary_count", meterData.GetSingleValue().GetName()) - assert.Equal(t, float64(2), meterData.GetSingleValue().GetValue()) - assert.Equal(t, int64(100), meterData.GetTimestamp()) - assert.Equal(t, "innerValueS", searchMetricTag("innerLabelS", meterData)) - } - } -} - -func searchMetricTag(name string, record *metricpb.MeterData) string { - if _, ok := record.GetMetric().(*metricpb.MeterData_SingleValue); ok { - for _, tag := range record.GetSingleValue().GetLabels() { - if tag.Name == name { - return tag.GetValue() - } - } - } - - if _, ok := record.GetMetric().(*metricpb.MeterData_Histogram); ok { - for _, tag := range record.GetHistogram().GetLabels() { - if tag.Name == name { - return tag.GetValue() - } - } - } - return "" -} diff --git a/exporter/skywalkingexporter/skywalking.go b/exporter/skywalkingexporter/skywalking.go deleted file mode 100644 index a61b761fde2f..000000000000 --- a/exporter/skywalkingexporter/skywalking.go +++ /dev/null @@ -1,206 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package skywalkingexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/skywalkingexporter" - -import ( - "context" - "errors" - "fmt" - - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/pdata/plog" - "go.opentelemetry.io/collector/pdata/pmetric" - "google.golang.org/grpc" - "google.golang.org/grpc/metadata" - metricpb "skywalking.apache.org/repo/goapi/collect/language/agent/v3" - logpb "skywalking.apache.org/repo/goapi/collect/logging/v3" -) - -// See https://godoc.org/google.golang.org/grpc#ClientConn.NewStream -// why we need to keep the cancel func to cancel the stream -type logsClientWithCancel struct { - cancel context.CancelFunc - tsec logpb.LogReportService_CollectClient -} - -type metricsClientWithCancel struct { - cancel context.CancelFunc - tsec metricpb.MeterReportService_CollectBatchClient -} - -type swExporter struct { - cfg *Config - // gRPC clients and connection. - logSvcClient logpb.LogReportServiceClient - metricSvcClient metricpb.MeterReportServiceClient - // In any of the channels we keep always NumStreams object (sometimes nil), - // to make sure we don't open more than NumStreams RPCs at any moment. - logsClients chan *logsClientWithCancel - metricsClients chan *metricsClientWithCancel - grpcClientConn *grpc.ClientConn - metadata metadata.MD - - settings component.TelemetrySettings -} - -func newSwExporter(_ context.Context, cfg *Config, settings component.TelemetrySettings) *swExporter { - oce := &swExporter{ - cfg: cfg, - metadata: metadata.New(nil), - settings: settings, - } - for k, v := range cfg.ClientConfig.Headers { - oce.metadata.Set(k, string(v)) - } - return oce -} - -// start creates the gRPC client Connection -func (oce *swExporter) start(ctx context.Context, host component.Host) error { - clientConn, err := oce.cfg.ClientConfig.ToClientConn(ctx, host, oce.settings) - if err != nil { - return err - } - - oce.grpcClientConn = clientConn - - if oce.logsClients != nil { - oce.logSvcClient = logpb.NewLogReportServiceClient(oce.grpcClientConn) - // Try to create rpc clients now. - for i := 0; i < oce.cfg.NumStreams; i++ { - // Populate the channel with NumStreams nil RPCs to keep the number of streams - // constant in the channel. - oce.logsClients <- nil - } - } - - if oce.metricsClients != nil { - oce.metricSvcClient = metricpb.NewMeterReportServiceClient(oce.grpcClientConn) - // Try to create rpc clients now. - for i := 0; i < oce.cfg.NumStreams; i++ { - // Populate the channel with NumStreams nil RPCs to keep the number of streams - // constant in the channel. - oce.metricsClients <- nil - } - } - return nil -} - -func (oce *swExporter) shutdown(context.Context) error { - if oce.grpcClientConn == nil { - return nil - } - if oce.logsClients != nil { - // First remove all the clients from the channel. - for i := 0; i < oce.cfg.NumStreams; i++ { - <-oce.logsClients - } - // Now close the channel - close(oce.logsClients) - } - return oce.grpcClientConn.Close() -} - -func newLogsExporter(ctx context.Context, cfg *Config, settings component.TelemetrySettings) *swExporter { - oce := newSwExporter(ctx, cfg, settings) - oce.logsClients = make(chan *logsClientWithCancel, oce.cfg.NumStreams) - return oce -} - -func newMetricsExporter(ctx context.Context, cfg *Config, settings component.TelemetrySettings) *swExporter { - oce := newSwExporter(ctx, cfg, settings) - oce.metricsClients = make(chan *metricsClientWithCancel, oce.cfg.NumStreams) - return oce -} - -func (oce *swExporter) pushLogs(_ context.Context, td plog.Logs) error { - // Get first available log Client. - tClient, ok := <-oce.logsClients - if !ok { - return errors.New("failed to push logs, Skywalking exporter was already stopped") - } - - if tClient == nil { - var err error - tClient, err = oce.createLogServiceRPC() - if err != nil { - // Cannot create an RPC, put back nil to keep the number of streams constant. - oce.logsClients <- nil - return err - } - } - - for _, logData := range logRecordToLogData(td) { - err := tClient.tsec.Send(logData) - if err != nil { - // Error received, cancel the context used to create the RPC to free all resources, - // put back nil to keep the number of streams constant. - tClient.cancel() - oce.logsClients <- nil - return err - } - } - - oce.logsClients <- tClient - return nil -} - -func (oce *swExporter) pushMetrics(_ context.Context, td pmetric.Metrics) error { - // Get first available metric Client. - tClient, ok := <-oce.metricsClients - if !ok { - return errors.New("failed to push metrics, Skywalking exporter was already stopped") - } - - if tClient == nil { - var err error - tClient, err = oce.createMetricServiceRPC() - if err != nil { - // Cannot create an RPC, put back nil to keep the number of streams constant. - oce.metricsClients <- nil - return err - } - } - - err := tClient.tsec.Send(metricsRecordToMetricData(td)) - if err != nil { - // Error received, cancel the context used to create the RPC to free all resources, - // put back nil to keep the number of streams constant. - tClient.cancel() - oce.metricsClients <- nil - return err - } - oce.metricsClients <- tClient - return nil -} - -func (oce *swExporter) createLogServiceRPC() (*logsClientWithCancel, error) { - // Initiate the log service by sending over node identifier info. - ctx, cancel := context.WithCancel(context.Background()) - if len(oce.cfg.Headers) > 0 { - ctx = metadata.NewOutgoingContext(ctx, oce.metadata.Copy()) - } - // Cannot use grpc.WaitForReady(cfg.WaitForReady) because will block forever. - logClient, err := oce.logSvcClient.Collect(ctx) - if err != nil { - cancel() - return nil, fmt.Errorf("LogServiceClient: %w", err) - } - return &logsClientWithCancel{cancel: cancel, tsec: logClient}, nil -} - -func (oce *swExporter) createMetricServiceRPC() (*metricsClientWithCancel, error) { - // Initiate the metric service by sending over node identifier info. - ctx, cancel := context.WithCancel(context.Background()) - if len(oce.cfg.Headers) > 0 { - ctx = metadata.NewOutgoingContext(ctx, oce.metadata.Copy()) - } - // Cannot use grpc.WaitForReady(cfg.WaitForReady) because will block forever. - metricClient, err := oce.metricSvcClient.CollectBatch(ctx) - if err != nil { - cancel() - return nil, fmt.Errorf("MetricServiceClient: %w", err) - } - return &metricsClientWithCancel{cancel: cancel, tsec: metricClient}, nil -} diff --git a/exporter/skywalkingexporter/skywalking_benchmark_test.go b/exporter/skywalkingexporter/skywalking_benchmark_test.go deleted file mode 100644 index 4a232bbb19ad..000000000000 --- a/exporter/skywalkingexporter/skywalking_benchmark_test.go +++ /dev/null @@ -1,204 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package skywalkingexporter - -import ( - "context" - "errors" - "io" - "net" - "strconv" - "sync" - "sync/atomic" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "go.opentelemetry.io/collector/component/componenttest" - "go.opentelemetry.io/collector/config/configgrpc" - "go.opentelemetry.io/collector/config/configtls" - "go.opentelemetry.io/collector/consumer" - "go.opentelemetry.io/collector/exporter/exporterhelper" - "go.opentelemetry.io/collector/exporter/exportertest" - "google.golang.org/grpc" - v3 "skywalking.apache.org/repo/goapi/collect/common/v3" - logpb "skywalking.apache.org/repo/goapi/collect/logging/v3" - - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/testdata" -) - -var ( - consumerNum = &atomic.Int32{} - sumNum = 10000 -) - -func TestSkywalking(t *testing.T) { - - test(1, 1, t) - test(1, 2, t) - test(1, 3, t) - test(1, 4, t) - test(1, 5, t) - test(1, 10, t) - - println() - test(2, 1, t) - test(2, 2, t) - test(2, 3, t) - test(2, 4, t) - test(2, 5, t) - test(2, 10, t) - - println() - test(4, 1, t) - test(4, 2, t) - test(4, 3, t) - test(4, 4, t) - test(4, 5, t) - test(4, 10, t) - - println() - test(5, 1, t) - test(5, 2, t) - test(5, 3, t) - test(5, 4, t) - test(5, 5, t) - test(5, 10, t) - - println() - test(10, 1, t) - test(10, 2, t) - test(10, 3, t) - test(10, 4, t) - test(10, 5, t) - test(10, 10, t) - test(10, 15, t) - test(10, 20, t) -} - -func test(nGoroutine int, nStream int, t *testing.T) { - exporter, server, m := doInit(nStream, t) - consumerNum.Store(-int32(nStream)) - l := testdata.GenerateLogsOneLogRecordNoResource() - l.ResourceLogs().At(0).ScopeLogs().At(0).LogRecords().At(0).Body().SetInt(0) - - for i := 0; i < nStream; i++ { - err := exporter.pushLogs(context.Background(), l) - assert.NoError(t, err) - } - - workers := nGoroutine - w := &sync.WaitGroup{} - start := time.Now().UnixMilli() - for i := 0; i < workers; i++ { - w.Add(1) - go func() { - defer w.Done() - for i := 0; i < sumNum/workers; i++ { - err := exporter.pushLogs(context.Background(), l) - assert.NoError(t, err) - } - }() - } - w.Wait() - end := time.Now().UnixMilli() - print("The number of goroutines:") - print(nGoroutine) - print(", The number of streams:") - print(nStream) - print(", Sent: " + strconv.Itoa(sumNum) + " items (" + strconv.Itoa(sumNum/int(end-start)) + "/millisecond)") - end = <-m.stopChan - assert.NotEqual(t, end, -1) - println(", Receive: " + strconv.Itoa(sumNum) + " items (" + strconv.Itoa(sumNum/(int(end-start))) + "/millisecond)") - - server.Stop() - err := exporter.shutdown(context.Background()) - assert.NoError(t, err) -} - -func doInit(numStream int, t *testing.T) (*swExporter, *grpc.Server, *mockLogHandler2) { - server, addr, m := initializeGRPC(grpc.MaxConcurrentStreams(100)) - tt := &Config{ - NumStreams: numStream, - QueueSettings: exporterhelper.QueueSettings{ - Enabled: true, - NumConsumers: 1, - QueueSize: 1000, - }, - ClientConfig: configgrpc.ClientConfig{ - Endpoint: addr.String(), - TLSSetting: configtls.ClientConfig{ - Insecure: true, - }, - }, - } - - oce := newLogsExporter(context.Background(), tt, componenttest.NewNopTelemetrySettings()) - got, err := exporterhelper.NewLogsExporter( - context.Background(), - exportertest.NewNopCreateSettings(), - tt, - oce.pushLogs, - exporterhelper.WithCapabilities(consumer.Capabilities{MutatesData: false}), - exporterhelper.WithRetry(tt.BackOffConfig), - exporterhelper.WithQueue(tt.QueueSettings), - exporterhelper.WithTimeout(tt.TimeoutSettings), - exporterhelper.WithStart(oce.start), - exporterhelper.WithShutdown(oce.shutdown), - ) - - if err != nil { - t.Errorf("error") - } - - err = got.Start(context.Background(), componenttest.NewNopHost()) - assert.NoError(t, err) - return oce, server, m -} - -func initializeGRPC(opts ...grpc.ServerOption) (*grpc.Server, net.Addr, *mockLogHandler2) { - server := grpc.NewServer(opts...) - lis, _ := net.Listen("tcp", "localhost:0") - m := &mockLogHandler2{ - stopChan: make(chan int64), - } - logpb.RegisterLogReportServiceServer( - server, - m, - ) - go func() { - err := server.Serve(lis) - if err != nil { - return - } - }() - return server, lis.Addr(), m -} - -type mockLogHandler2 struct { - stopChan chan int64 - logpb.UnimplementedLogReportServiceServer -} - -func (h *mockLogHandler2) Collect(stream logpb.LogReportService_CollectServer) error { - for { - _, err := stream.Recv() - if errors.Is(err, io.EOF) { - h.stopChan <- -1 - return stream.SendAndClose(&v3.Commands{}) - } - if err == nil { - consumerNum.Add(1) - if consumerNum.Load() >= int32(sumNum) { - end := time.Now().UnixMilli() - h.stopChan <- end - return nil - } - } else { - err := stream.SendAndClose(&v3.Commands{}) - h.stopChan <- -1 - return err - } - } -} diff --git a/exporter/skywalkingexporter/skywalking_test.go b/exporter/skywalkingexporter/skywalking_test.go deleted file mode 100644 index e75c957b621c..000000000000 --- a/exporter/skywalkingexporter/skywalking_test.go +++ /dev/null @@ -1,241 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package skywalkingexporter - -import ( - "context" - "errors" - "io" - "net" - "sync" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component/componenttest" - "go.opentelemetry.io/collector/config/configgrpc" - "go.opentelemetry.io/collector/config/configtls" - "go.opentelemetry.io/collector/consumer" - "go.opentelemetry.io/collector/exporter/exporterhelper" - "go.opentelemetry.io/collector/exporter/exportertest" - "google.golang.org/grpc" - v3 "skywalking.apache.org/repo/goapi/collect/common/v3" - metricpb "skywalking.apache.org/repo/goapi/collect/language/agent/v3" - logpb "skywalking.apache.org/repo/goapi/collect/logging/v3" - - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/testdata" -) - -func TestSwExporter(t *testing.T) { - server, addr, handler := initializeGRPCTestServer(t, grpc.MaxConcurrentStreams(10)) - tt := &Config{ - NumStreams: 10, - ClientConfig: configgrpc.ClientConfig{ - Endpoint: addr.String(), - TLSSetting: configtls.ClientConfig{ - Insecure: true, - }, - }, - } - - oce := newLogsExporter(context.Background(), tt, componenttest.NewNopTelemetrySettings()) - got, err := exporterhelper.NewLogsExporter( - context.Background(), - exportertest.NewNopCreateSettings(), - tt, - oce.pushLogs, - exporterhelper.WithCapabilities(consumer.Capabilities{MutatesData: false}), - exporterhelper.WithRetry(tt.BackOffConfig), - exporterhelper.WithQueue(tt.QueueSettings), - exporterhelper.WithTimeout(tt.TimeoutSettings), - exporterhelper.WithStart(oce.start), - exporterhelper.WithShutdown(oce.shutdown), - ) - assert.NoError(t, err) - assert.NotNil(t, got) - - t.Cleanup(func() { - require.NoError(t, got.Shutdown(context.Background())) - }) - - err = got.Start(context.Background(), componenttest.NewNopHost()) - - assert.NoError(t, err) - - w1 := &sync.WaitGroup{} - var i int64 - for i = 0; i < 200; i++ { - w1.Add(1) - go func() { - defer w1.Done() - l := testdata.GenerateLogsOneLogRecordNoResource() - l.ResourceLogs().At(0).ScopeLogs().At(0).LogRecords().At(0).Body().SetInt(0) - e := got.ConsumeLogs(context.Background(), l) - assert.NoError(t, e) - }() - } - w1.Wait() - var logs []*logpb.LogData - for i := 0; i < 200; i++ { - logs = append(logs, <-handler.logChan) - } - assert.Equal(t, 200, len(logs)) - assert.Equal(t, 10, len(oce.logsClients)) - - // when grpc server stops - server.Stop() - w2 := &sync.WaitGroup{} - for i = 0; i < 200; i++ { - w2.Add(1) - go func() { - defer w2.Done() - l := testdata.GenerateLogsOneLogRecordNoResource() - l.ResourceLogs().At(0).ScopeLogs().At(0).LogRecords().At(0).Body().SetInt(0) - e := got.ConsumeLogs(context.Background(), l) - if e != nil { - return - } - }() - } - w2.Wait() - assert.Equal(t, 10, len(oce.logsClients)) - - server, addr, handler2 := initializeGRPCTestServerMetric(t, grpc.MaxConcurrentStreams(10)) - tt = &Config{ - NumStreams: 10, - ClientConfig: configgrpc.ClientConfig{ - Endpoint: addr.String(), - TLSSetting: configtls.ClientConfig{ - Insecure: true, - }, - }, - } - - oce = newMetricsExporter(context.Background(), tt, componenttest.NewNopTelemetrySettings()) - got2, err2 := exporterhelper.NewMetricsExporter( - context.Background(), - exportertest.NewNopCreateSettings(), - tt, - oce.pushMetrics, - exporterhelper.WithCapabilities(consumer.Capabilities{MutatesData: false}), - exporterhelper.WithRetry(tt.BackOffConfig), - exporterhelper.WithQueue(tt.QueueSettings), - exporterhelper.WithTimeout(tt.TimeoutSettings), - exporterhelper.WithStart(oce.start), - exporterhelper.WithShutdown(oce.shutdown), - ) - assert.NoError(t, err2) - assert.NotNil(t, got2) - - t.Cleanup(func() { - require.NoError(t, got2.Shutdown(context.Background())) - }) - - err = got2.Start(context.Background(), componenttest.NewNopHost()) - - assert.NoError(t, err) - - w1 = &sync.WaitGroup{} - for i = 0; i < 200; i++ { - w1.Add(1) - go func() { - defer w1.Done() - l := testdata.GenerateMetricsOneMetric() - e := got2.ConsumeMetrics(context.Background(), l) - assert.NoError(t, e) - }() - } - w1.Wait() - var metrics []*metricpb.MeterDataCollection - for i := 0; i < 200; i++ { - metrics = append(metrics, <-handler2.metricChan) - } - assert.Equal(t, 200, len(metrics)) - assert.Equal(t, 10, len(oce.metricsClients)) - - // when grpc server stops - server.Stop() - w3 := &sync.WaitGroup{} - for i = 0; i < 200; i++ { - w3.Add(1) - go func() { - defer w3.Done() - l := testdata.GenerateMetricsOneMetric() - e := got2.ConsumeMetrics(context.Background(), l) - if e != nil { - return - } - }() - } - w3.Wait() - assert.Equal(t, 10, len(oce.metricsClients)) -} - -func initializeGRPCTestServer(t *testing.T, opts ...grpc.ServerOption) (*grpc.Server, net.Addr, *mockLogHandler) { - server := grpc.NewServer(opts...) - lis, err := net.Listen("tcp", "localhost:0") - require.NoError(t, err) - m := &mockLogHandler{ - logChan: make(chan *logpb.LogData, 200), - } - logpb.RegisterLogReportServiceServer( - server, - m, - ) - go func() { - require.NoError(t, server.Serve(lis)) - }() - return server, lis.Addr(), m -} - -func initializeGRPCTestServerMetric(t *testing.T, opts ...grpc.ServerOption) (*grpc.Server, net.Addr, *mockMetricHandler) { - server := grpc.NewServer(opts...) - lis, err := net.Listen("tcp", "localhost:0") - require.NoError(t, err) - m := &mockMetricHandler{ - metricChan: make(chan *metricpb.MeterDataCollection, 200), - } - metricpb.RegisterMeterReportServiceServer( - server, - m, - ) - go func() { - require.NoError(t, server.Serve(lis)) - }() - return server, lis.Addr(), m -} - -type mockLogHandler struct { - logChan chan *logpb.LogData - logpb.UnimplementedLogReportServiceServer -} - -func (h *mockLogHandler) Collect(stream logpb.LogReportService_CollectServer) error { - for { - r, err := stream.Recv() - if errors.Is(err, io.EOF) { - return stream.SendAndClose(&v3.Commands{}) - } - if err == nil { - h.logChan <- r - } - } -} - -type mockMetricHandler struct { - metricChan chan *metricpb.MeterDataCollection - metricpb.UnimplementedMeterReportServiceServer -} - -func (h *mockMetricHandler) CollectBatch(stream metricpb.MeterReportService_CollectBatchServer) error { - for { - r, err := stream.Recv() - if errors.Is(err, io.EOF) { - return stream.SendAndClose(&v3.Commands{}) - } - if err == nil { - h.metricChan <- r - } - } -} diff --git a/exporter/skywalkingexporter/testdata/config.yaml b/exporter/skywalkingexporter/testdata/config.yaml deleted file mode 100644 index 052b63c4a206..000000000000 --- a/exporter/skywalkingexporter/testdata/config.yaml +++ /dev/null @@ -1,27 +0,0 @@ -skywalking: - endpoint: "1.2.3.4:11800" -skywalking/2: - endpoint: "1.2.3.4:11800" - compression: "gzip" - num_streams: 233 - tls: - ca_file: /var/lib/mycert.pem - timeout: 10s - headers: - "can you have a . here?": "F0000000-0000-0000-0000-000000000000" - header1: 234 - another: "somevalue" - balancer_name: "round_robin" - keepalive: - time: 20 - timeout: 30 - permit_without_stream: true - sending_queue: - enabled: true - num_consumers: 2 - queue_size: 10 - retry_on_failure: - enabled: true - initial_interval: 10s - max_interval: 60s - max_elapsed_time: 10m diff --git a/exporter/skywalkingexporter/testdata/test_cert.pem b/exporter/skywalkingexporter/testdata/test_cert.pem deleted file mode 100644 index b3842e597a23..000000000000 --- a/exporter/skywalkingexporter/testdata/test_cert.pem +++ /dev/null @@ -1,17 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICpDCCAYwCCQC5oaFsqLW3GTANBgkqhkiG9w0BAQsFADAUMRIwEAYDVQQDDAls -b2NhbGhvc3QwHhcNMjEwNzE0MDAxMzU2WhcNMzEwNzEyMDAxMzU2WjAUMRIwEAYD -VQQDDAlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDO -mKaE1qg5VLMwaUnSzufT23rRJFbuy/HDXwsH63yZVSsISQkGjkBYBgrqAMtVnsI/ -l4gXtBWkZtJFs68Sbo9ps3W0PdB5+d12R5NUNA1rkZtx3jtEN33dpGhifug/TIZe -7Zr0G1z6gNoaEezk0Jpg4KsH7QpIeHPRhIZMyWeqddgD/qL4/ukaU4NOORuF3WoT -oo2LpI3jUq66mz2N2Inq0V/OX7BYB4Ur6EtjWh2baiUuw9fq+oLUlgZd6ypnugC/ -+YfgYqvWtRntmEr0Z+O4Kz81P2IpH/0h1RFhWyK6thVGa9cx6aseCp3V2cMXfGfc -z4n3Uvz87v+bZvGbcse/AgMBAAEwDQYJKoZIhvcNAQELBQADggEBAAlvNBNoqXUQ -ohR0eozIHGeJ94U7WK5zXf2NSvmRlwHzHXvUq6GKd+8Bv1foMjI6OpSOZmjtRGsc -rWET1WjSyQddRfqYazhWp1IyYu5LfATwPS+RXJAkWixKVfG+Ta2x6u+aT/bSZwEg -NwRerc6pyqv5UG8Z7Pe1kAxbgOwZv5KXAewIgTSbEkmIp1Dg8GhGeWD5pjYNCkJV -Na2KMAUWP3PeQzdSBKmBNpsRUALuSTxb5u7pl+PA7FLInTtDeyZn8xpO1GPBhbJE -trDbmTbj5YexOXEaQtGtZ6fwRw2jnUm8nqtXozxIomnVTBO8vLmZAUgyJ71trRw0 -gE9tH5Ndlug= ------END CERTIFICATE----- diff --git a/exporter/skywalkingexporter/testdata/test_key.pem b/exporter/skywalkingexporter/testdata/test_key.pem deleted file mode 100644 index dedfad3df6e3..000000000000 --- a/exporter/skywalkingexporter/testdata/test_key.pem +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDOmKaE1qg5VLMw -aUnSzufT23rRJFbuy/HDXwsH63yZVSsISQkGjkBYBgrqAMtVnsI/l4gXtBWkZtJF -s68Sbo9ps3W0PdB5+d12R5NUNA1rkZtx3jtEN33dpGhifug/TIZe7Zr0G1z6gNoa -Eezk0Jpg4KsH7QpIeHPRhIZMyWeqddgD/qL4/ukaU4NOORuF3WoToo2LpI3jUq66 -mz2N2Inq0V/OX7BYB4Ur6EtjWh2baiUuw9fq+oLUlgZd6ypnugC/+YfgYqvWtRnt -mEr0Z+O4Kz81P2IpH/0h1RFhWyK6thVGa9cx6aseCp3V2cMXfGfcz4n3Uvz87v+b -ZvGbcse/AgMBAAECggEADeR39iDVKR3H+u5pl3JwZm+w35V4/w/ZzxB6FmtAcrMm -dKUspTM1onWtkDTDd5t4ZnxTG3zxo5+Cbkt571xd6na16Ivrk/g4aza+8n+Zk200 -LcEK7ThqD1h56H2uMmt78bA6pkWcx/+YKv6flndsmi0hcyP+eAcZirJFsa4teWna -P6rhI9zThc9OcecqGZIlmzJQ4cLbIO86QqkWW6yjKYg6riOb2g+i3e97ZngMCTcV -lni+sksLlXBNKPqh1AkiUFe4pInRBh4LGQ5rNSYswEqlQY0iW0u4Hs3HNou0On+8 -1T8m5wzKQ+23AN+vVRJ/MHssQiB/TPK92jXVgEz6eQKBgQD2GEb7NzDIxsAQZBQo -tt3jYitNcAEqMWeT7wxCMMue4wIrT6Fp6NuG5NMVqLglzx72m6TXg7YzZxPrAnlH -jblWI4sxwVC8BjjYyGud7qMuhUIZmI8aS9HuYW0ODSxkcpVVXd4HDUYKg7PafAkl -cj745E5KGD+qW44KASTTQ1SwRQKBgQDW6WLp/nPVPO5YEK4nzS7b1RRC8ypHiKd6 -LzhA2izgcsmO3F3Y5ZZ5rzeFbjgZiGFTUB/r1mgomI8kZyIGP1AN6o8oY9I89gHY -/DEEagIsFK5jAEoMeN0qbgqasOXpi+uUHCNidWa7OWOL9Rsh7dyVT54xcqMC2Qak -Vpoy5miiMwKBgQDuOHH9nF9M+5fQRhB9mQcRpWXlgBagkVKCkVR8fl+dXoIrCtpl -e1OGMNtki/42G1kNv3zCYm1tNMrDI5HjAf32tFF5yHguipdcwiXqq6aq0bQ6ssNT -4TFGYGkAwR/H3GNST5stmFvEsdjYFlmENiNfKyHd97spXZcReCn9l5/TQQKBgDRG -PpYWG4zBrmPjYskxonU8ZhpG1YDi34Hb3H4B06qgoSBLv9QTPD/K++FLxv+G6c1/ -DtSpqVo+iYrcPy1v1wQbisjTRv8nA5oI9c9SDcc1HJneJyTTfVBlxdSMtM/TBfFX -ys+XKO7fbbRMYVYmamIzJJJ4hOgba/8rRYSeANN7AoGBAMDdrT+ig3aDMratbAvY -lqsfN3AtxoZ+ZVQYyUbzTSZPZ/to9eNuBzhRKcQ3QfG95nrHb7OnWHa7+1kc4p/Q -jMgzJgRpajlES+F3CCMPgJIJg7Ev+yiSCJLP9ZOsC+E96bK265hUcDyCXwb3Wzmg -4L9sc1QsQW80QO/RnaEzGO51 ------END PRIVATE KEY----- diff --git a/exporter/splunkhecexporter/README.md b/exporter/splunkhecexporter/README.md index 51065bd7fd24..29a25f8ac7fe 100644 --- a/exporter/splunkhecexporter/README.md +++ b/exporter/splunkhecexporter/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fsplunkhec%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fsplunkhec) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fsplunkhec%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fsplunkhec) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@atoulme](https://www.github.com/atoulme), [@dmitryax](https://www.github.com/dmitryax) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib @@ -54,10 +54,18 @@ The following configuration options can also be configured: - `health_path` (default = '/services/collector/health'): The path reporting [health checks](https://docs.splunk.com/Documentation/Splunk/9.0.1/RESTREF/RESTinput#services.2Fcollector.2Fhealth). - `health_check_enabled` (default = false): Whether to perform Splunk HEC Health Check during the exporter's startup. - `export_raw` (default = false): send only the log's body, targeting a Splunk HEC raw endpoint. +- `otel_attrs_to_hec_metadata/source` (default = 'com.splunk.source'): Specifies the mapping of a specific unified model attribute value to the standard source field of a HEC event. +- `otel_attrs_to_hec_metadata/sourcetype` (default = 'com.splunk.sourcetype'): Specifies the mapping of a specific unified model attribute value to the standard sourcetype field of a HEC event. +- `otel_attrs_to_hec_metadata/index` (default = 'com.splunk.index'): Specifies the mapping of a specific unified model attribute value to the standard index field of a HEC event. +- `otel_attrs_to_hec_metadata/host` (default = 'host.name'): Specifies the mapping of a specific unified model attribute value to the standard host field and the `host.name` field of a HEC event. - `hec_metadata_to_otel_attrs/source` (default = 'com.splunk.source'): Specifies the mapping of a specific unified model attribute value to the standard source field of a HEC event. + **Deprecated** (v0.116.0): prefer `otel_attrs_to_hec_metadata/source`. - `hec_metadata_to_otel_attrs/sourcetype` (default = 'com.splunk.sourcetype'): Specifies the mapping of a specific unified model attribute value to the standard sourcetype field of a HEC event. + **Deprecated** (v0.116.0): prefer `otel_attrs_to_hec_metadata/sourcetype`. - `hec_metadata_to_otel_attrs/index` (default = 'com.splunk.index'): Specifies the mapping of a specific unified model attribute value to the standard index field of a HEC event. + **Deprecated** (v0.116.0): prefer `otel_attrs_to_hec_metadata/index`. - `hec_metadata_to_otel_attrs/host` (default = 'host.name'): Specifies the mapping of a specific unified model attribute value to the standard host field and the `host.name` field of a HEC event. + **Deprecated** (v0.116.0): prefer `otel_attrs_to_hec_metadata/host`. - `otel_to_hec_fields/severity_text` (default = `otel.log.severity.text`): Specifies the name of the field to map the severity text field of log events. - `otel_to_hec_fields/severity_number` (default = `otel.log.severity.number`): Specifies the name of the field to map the severity number field of log events. - `otel_to_hec_fields/name` (default = `"otel.log.name`): Specifies the name of the field to map the name field of log events. diff --git a/exporter/splunkhecexporter/batchperscope.go b/exporter/splunkhecexporter/batchperscope.go index 0c0c51361a7a..388ad525f84a 100644 --- a/exporter/splunkhecexporter/batchperscope.go +++ b/exporter/splunkhecexporter/batchperscope.go @@ -20,8 +20,9 @@ type perScopeBatcher struct { next consumer.Logs } +// Capabilities returns capabilities of the next consumer because perScopeBatcher doesn't mutate data itself. func (rb *perScopeBatcher) Capabilities() consumer.Capabilities { - return consumer.Capabilities{MutatesData: false} + return rb.next.Capabilities() } func (rb *perScopeBatcher) ConsumeLogs(ctx context.Context, logs plog.Logs) error { diff --git a/exporter/splunkhecexporter/buffer.go b/exporter/splunkhecexporter/buffer.go index 592e62b6ea6d..8c134043614b 100644 --- a/exporter/splunkhecexporter/buffer.go +++ b/exporter/splunkhecexporter/buffer.go @@ -11,9 +11,7 @@ import ( "sync" ) -var ( - errOverCapacity = errors.New("over capacity") -) +var errOverCapacity = errors.New("over capacity") type buffer interface { io.Writer @@ -22,6 +20,7 @@ type buffer interface { Reset() Len() int Empty() bool + Bytes() []byte } type cancellableBytesWriter struct { @@ -59,6 +58,10 @@ func (c *cancellableBytesWriter) Empty() bool { return c.innerWriter.Len() == 0 } +func (c *cancellableBytesWriter) Bytes() []byte { + return c.innerWriter.Bytes() +} + type cancellableGzipWriter struct { innerBuffer *bytes.Buffer innerWriter *gzip.Writer @@ -125,6 +128,10 @@ func (c *cancellableGzipWriter) Empty() bool { return c.rawLen == 0 } +func (c *cancellableGzipWriter) Bytes() []byte { + return c.innerBuffer.Bytes() +} + // bufferPool is a pool of buffer objects. type bufferPool struct { pool *sync.Pool diff --git a/exporter/splunkhecexporter/client.go b/exporter/splunkhecexporter/client.go index 3ae5259fae1a..70e2e11bb659 100644 --- a/exporter/splunkhecexporter/client.go +++ b/exporter/splunkhecexporter/client.go @@ -12,16 +12,18 @@ import ( "net/url" "sync" - jsoniter "github.com/json-iterator/go" + "github.com/goccy/go-json" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/consumer/consumererror" "go.opentelemetry.io/collector/exporter" "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" + "go.opentelemetry.io/otel/metric" "go.uber.org/multierr" "go.uber.org/zap" + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter/internal/metadata" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk" ) @@ -53,15 +55,10 @@ type client struct { heartbeater *heartbeater bufferPool bufferPool exporterName string + meter metric.Meter } -var jsonStreamPool = sync.Pool{ - New: func() any { - return jsoniter.NewStream(jsoniter.ConfigDefault, nil, 512) - }, -} - -func newClient(set exporter.CreateSettings, cfg *Config, maxContentLength uint) *client { +func newClient(set exporter.Settings, cfg *Config, maxContentLength uint) *client { return &client{ config: cfg, logger: set.Logger, @@ -69,18 +66,19 @@ func newClient(set exporter.CreateSettings, cfg *Config, maxContentLength uint) buildInfo: set.BuildInfo, bufferPool: newBufferPool(maxContentLength, !cfg.DisableCompression), exporterName: set.ID.String(), + meter: metadata.Meter(set.TelemetrySettings), } } -func newLogsClient(set exporter.CreateSettings, cfg *Config) *client { +func newLogsClient(set exporter.Settings, cfg *Config) *client { return newClient(set, cfg, cfg.MaxContentLengthLogs) } -func newTracesClient(set exporter.CreateSettings, cfg *Config) *client { +func newTracesClient(set exporter.Settings, cfg *Config) *client { return newClient(set, cfg, cfg.MaxContentLengthTraces) } -func newMetricsClient(set exporter.CreateSettings, cfg *Config) *client { +func newMetricsClient(set exporter.Settings, cfg *Config) *client { return newClient(set, cfg, cfg.MaxContentLengthMetrics) } @@ -156,9 +154,11 @@ func (c *client) pushLogData(ctx context.Context, ld plog.Logs) error { // A guesstimated value > length of bytes of a single event. // Added to buffer capacity so that buffer is likely to grow by reslicing when buf.Len() > bufCap. -const bufCapPadding = uint(4096) -const libraryHeaderName = "X-Splunk-Instrumentation-Library" -const profilingLibraryName = "otel.profiling" +const ( + bufCapPadding = uint(4096) + libraryHeaderName = "X-Splunk-Instrumentation-Library" + profilingLibraryName = "otel.profiling" +) func isProfilingData(sl plog.ScopeLogs) bool { return sl.Scope().Name() == profilingLibraryName @@ -192,8 +192,6 @@ func (c *client) pushLogDataInBatches(ctx context.Context, ld plog.Logs, headers func (c *client) fillLogsBuffer(logs plog.Logs, buf buffer, is iterState) (iterState, []error) { var b []byte var permanentErrors []error - jsonStream := jsonStreamPool.Get().(*jsoniter.Stream) - defer jsonStreamPool.Put(jsonStream) for i := is.resource; i < logs.ResourceLogs().Len(); i++ { rl := logs.ResourceLogs().At(i) @@ -209,10 +207,14 @@ func (c *client) fillLogsBuffer(logs plog.Logs, buf buffer, is iterState) (iterS } else { // Parsing log record to Splunk event. event := mapLogRecordToSplunkEvent(rl.Resource(), logRecord, c.config) + if event == nil { + // TODO record this drop as a metric + continue + } // JSON encoding event and writing to buffer. var err error - b, err = marshalEvent(event, c.config.MaxEventSize, jsonStream) + b, err = marshalEvent(event, c.config.MaxEventSize) if err != nil { permanentErrors = append(permanentErrors, consumererror.NewPermanent(fmt.Errorf( "dropped log event: %v, error: %w", event, err))) @@ -245,8 +247,6 @@ func (c *client) fillLogsBuffer(logs plog.Logs, buf buffer, is iterState) (iterS func (c *client) fillMetricsBuffer(metrics pmetric.Metrics, buf buffer, is iterState) (iterState, []error) { var permanentErrors []error - jsonStream := jsonStreamPool.Get().(*jsoniter.Stream) - defer jsonStreamPool.Put(jsonStream) tempBuf := bytes.NewBuffer(make([]byte, 0, c.config.MaxContentLengthMetrics)) for i := is.resource; i < metrics.ResourceMetrics().Len(); i++ { @@ -263,7 +263,7 @@ func (c *client) fillMetricsBuffer(metrics pmetric.Metrics, buf buffer, is iterS tempBuf.Reset() for _, event := range events { // JSON encoding event and writing to buffer. - b, err := marshalEvent(event, c.config.MaxEventSize, jsonStream) + b, err := marshalEvent(event, c.config.MaxEventSize) if err != nil { permanentErrors = append(permanentErrors, consumererror.NewPermanent(fmt.Errorf("dropped metric event: %v, error: %w", event, err))) continue @@ -297,13 +297,11 @@ func (c *client) fillMetricsBuffer(metrics pmetric.Metrics, buf buffer, is iterS func (c *client) fillMetricsBufferMultiMetrics(events []*splunk.Event, buf buffer, is iterState) (iterState, []error) { var permanentErrors []error - jsonStream := jsonStreamPool.Get().(*jsoniter.Stream) - defer jsonStreamPool.Put(jsonStream) for i := is.record; i < len(events); i++ { event := events[i] // JSON encoding event and writing to buffer. - b, jsonErr := marshalEvent(event, c.config.MaxEventSize, jsonStream) + b, jsonErr := marshalEvent(event, c.config.MaxEventSize) if jsonErr != nil { permanentErrors = append(permanentErrors, consumererror.NewPermanent(fmt.Errorf("dropped metric event: %v, error: %w", event, jsonErr))) continue @@ -334,8 +332,6 @@ func (c *client) fillMetricsBufferMultiMetrics(events []*splunk.Event, buf buffe func (c *client) fillTracesBuffer(traces ptrace.Traces, buf buffer, is iterState) (iterState, []error) { var permanentErrors []error - jsonStream := jsonStreamPool.Get().(*jsoniter.Stream) - defer jsonStreamPool.Put(jsonStream) for i := is.resource; i < traces.ResourceSpans().Len(); i++ { rs := traces.ResourceSpans().At(i) @@ -350,7 +346,7 @@ func (c *client) fillTracesBuffer(traces ptrace.Traces, buf buffer, is iterState event := mapSpanToSplunkEvent(rs.Resource(), span, c.config) // JSON encoding event and writing to buffer. - b, err := marshalEvent(event, c.config.MaxEventSize, jsonStream) + b, err := marshalEvent(event, c.config.MaxEventSize) if err != nil { permanentErrors = append(permanentErrors, consumererror.NewPermanent(fmt.Errorf("dropped span events: %v, error: %w", event, err))) continue @@ -617,7 +613,6 @@ func (c *client) stop(context.Context) error { } func (c *client) start(ctx context.Context, host component.Host) (err error) { - httpClient, err := buildHTTPClient(ctx, c.config, host, c.telemetrySettings) if err != nil { return err @@ -632,7 +627,7 @@ func (c *client) start(ctx context.Context, host component.Host) (err error) { } url, _ := c.config.getURL() c.hecWorker = &defaultHecWorker{url, httpClient, buildHTTPHeaders(c.config, c.buildInfo), c.logger} - c.heartbeater = newHeartbeater(c.config, c.buildInfo, getPushLogFn(c)) + c.heartbeater = newHeartbeater(c.config, c.buildInfo, getPushLogFn(c), c.meter) if c.config.Heartbeat.Startup { if err := c.heartbeater.sendHeartbeat(c.config, c.buildInfo, getPushLogFn(c)); err != nil { return fmt.Errorf("%s: heartbeat on startup failed: %w", c.exporterName, err) @@ -642,7 +637,6 @@ func (c *client) start(ctx context.Context, host component.Host) (err error) { } func checkHecHealth(ctx context.Context, client *http.Client, healthCheckURL *url.URL) error { - req, err := http.NewRequestWithContext(ctx, http.MethodGet, healthCheckURL.String(), nil) if err != nil { return consumererror.NewPermanent(err) @@ -683,16 +677,14 @@ func buildHTTPHeaders(config *Config, buildInfo component.BuildInfo) map[string] } } -// marshalEvent marshals an event to JSON using a reusable jsoniter stream. -func marshalEvent(event *splunk.Event, sizeLimit uint, stream *jsoniter.Stream) ([]byte, error) { - stream.Reset(nil) - stream.Error = nil - stream.WriteVal(event) - if stream.Error != nil { - return nil, stream.Error +// marshalEvent marshals an event to JSON +func marshalEvent(event *splunk.Event, sizeLimit uint) ([]byte, error) { + b, err := json.Marshal(event) + if err != nil { + return nil, err } - if uint(stream.Buffered()) > sizeLimit { - return nil, fmt.Errorf("event size %d exceeds limit %d", stream.Buffered(), sizeLimit) + if uint(len(b)) > sizeLimit { + return nil, fmt.Errorf("event size %d exceeds limit %d", len(b), sizeLimit) } - return stream.Buffer(), nil + return b, nil } diff --git a/exporter/splunkhecexporter/client_test.go b/exporter/splunkhecexporter/client_test.go index 777d8e5d142c..24f611458dda 100644 --- a/exporter/splunkhecexporter/client_test.go +++ b/exporter/splunkhecexporter/client_test.go @@ -21,7 +21,7 @@ import ( "testing" "time" - jsoniter "github.com/json-iterator/go" + "github.com/goccy/go-json" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component" @@ -33,7 +33,7 @@ import ( "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk" @@ -132,7 +132,7 @@ func createLogData(numResources int, numLibraries int, numRecords int) plog.Logs } func repeat(what int, times int) []int { - var result = make([]int, times) + result := make([]int, times) for i := range result { result[i] = what } @@ -194,8 +194,8 @@ type capturingData struct { func (c *capturingData) ServeHTTP(w http.ResponseWriter, r *http.Request) { body, err := io.ReadAll(r.Body) - if c.checkCompression && r.Header.Get("Content-Encoding") != "gzip" { - c.testing.Fatal("No compression") + if c.checkCompression { + assert.Equal(c.testing, "gzip", r.Header.Get("Content-Encoding"), "No compression") } if err != nil { @@ -209,7 +209,7 @@ func (c *capturingData) ServeHTTP(w http.ResponseWriter, r *http.Request) { w.WriteHeader(c.statusCode) } -func runMetricsExport(cfg *Config, metrics pmetric.Metrics, expectedBatchesNum int, useMultiMetricsFormat bool, t *testing.T) ([]receivedRequest, error) { +func runMetricsExport(t *testing.T, cfg *Config, metrics pmetric.Metrics, expectedBatchesNum int, useMultiMetricsFormat bool) ([]receivedRequest, error) { listener, err := net.Listen("tcp", "127.0.0.1:0") if err != nil { panic(err) @@ -229,12 +229,12 @@ func runMetricsExport(cfg *Config, metrics pmetric.Metrics, expectedBatchesNum i defer s.Close() go func() { if e := s.Serve(listener); e != http.ErrServerClosed { - require.NoError(t, e) + assert.NoError(t, e) } }() - params := exportertest.NewNopCreateSettings() - exporter, err := factory.CreateMetricsExporter(context.Background(), params, cfg) + params := exportertest.NewNopSettings() + exporter, err := factory.CreateMetrics(context.Background(), params, cfg) assert.NoError(t, err) assert.NoError(t, exporter.Start(context.Background(), componenttest.NewNopHost())) defer func() { @@ -260,7 +260,7 @@ func runMetricsExport(cfg *Config, metrics pmetric.Metrics, expectedBatchesNum i } } -func runTraceExport(testConfig *Config, traces ptrace.Traces, expectedBatchesNum int, t *testing.T) ([]receivedRequest, error) { +func runTraceExport(t *testing.T, testConfig *Config, traces ptrace.Traces, expectedBatchesNum int) ([]receivedRequest, error) { listener, err := net.Listen("tcp", "127.0.0.1:0") if err != nil { panic(err) @@ -282,12 +282,12 @@ func runTraceExport(testConfig *Config, traces ptrace.Traces, expectedBatchesNum defer s.Close() go func() { if e := s.Serve(listener); e != http.ErrServerClosed { - require.NoError(t, e) + assert.NoError(t, e) } }() - params := exportertest.NewNopCreateSettings() - exporter, err := factory.CreateTracesExporter(context.Background(), params, cfg) + params := exportertest.NewNopSettings() + exporter, err := factory.CreateTraces(context.Background(), params, cfg) assert.NoError(t, err) assert.NoError(t, exporter.Start(context.Background(), componenttest.NewNopHost())) defer func() { @@ -324,7 +324,7 @@ func runTraceExport(testConfig *Config, traces ptrace.Traces, expectedBatchesNum } } -func runLogExport(cfg *Config, ld plog.Logs, expectedBatchesNum int, t *testing.T) ([]receivedRequest, error) { +func runLogExport(t *testing.T, cfg *Config, ld plog.Logs, expectedBatchesNum int) ([]receivedRequest, error) { listener, err := net.Listen("tcp", "127.0.0.1:0") if err != nil { panic(err) @@ -342,12 +342,12 @@ func runLogExport(cfg *Config, ld plog.Logs, expectedBatchesNum int, t *testing. defer s.Close() go func() { if e := s.Serve(listener); e != http.ErrServerClosed { - require.NoError(t, e) + assert.NoError(t, e) } }() - params := exportertest.NewNopCreateSettings() - exporter, err := NewFactory().CreateLogsExporter(context.Background(), params, cfg) + params := exportertest.NewNopSettings() + exporter, err := NewFactory().CreateLogs(context.Background(), params, cfg) assert.NoError(t, err) assert.NoError(t, exporter.Start(context.Background(), componenttest.NewNopHost())) defer func() { @@ -397,10 +397,12 @@ func TestReceiveTracesBatches(t *testing.T) { }(), want: wantType{ batches: [][]string{ - {`"start_time":1`, + { + `"start_time":1`, `"start_time":2`, `start_time":3`, - `start_time":4`}, + `start_time":4`, + }, }, numBatches: 1, }, @@ -500,7 +502,7 @@ func TestReceiveTracesBatches(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { - got, err := runTraceExport(test.conf, test.traces, test.want.numBatches, t) + got, err := runTraceExport(t, test.conf, test.traces, test.want.numBatches) require.NoError(t, err) require.Len(t, got, test.want.numBatches, "expected exact number of batches") @@ -508,7 +510,7 @@ func TestReceiveTracesBatches(t *testing.T) { for i, batch := range test.want.batches { require.NotZero(t, got[i]) if test.conf.MaxContentLengthTraces != 0 { - require.True(t, int(test.conf.MaxContentLengthTraces) > len(got[i].body)) + require.Greater(t, int(test.conf.MaxContentLengthTraces), len(got[i].body)) } if test.conf.DisableCompression { for _, expected := range batch { @@ -533,9 +535,7 @@ func TestReceiveTracesBatches(t *testing.T) { } timeStr := fmt.Sprintf(`"time":%d,`, i+1) if strings.Contains(string(batchBody), timeStr) { - if eventFound { - t.Errorf("span event %d found in multiple batches", i) - } + assert.False(t, eventFound, "span event %d found in multiple batches", i) eventFound = true } } @@ -570,10 +570,12 @@ func TestReceiveLogs(t *testing.T) { }(), want: wantType{ batches: [][]string{ - {`"otel.log.name":"0_0_0"`, + { + `"otel.log.name":"0_0_0"`, `"otel.log.name":"0_0_1"`, `otel.log.name":"0_0_2`, - `otel.log.name":"0_0_3`}, + `otel.log.name":"0_0_3`, + }, }, numBatches: 1, }, @@ -780,18 +782,18 @@ func TestReceiveLogs(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { - got, err := runLogExport(test.conf, test.logs, test.want.numBatches, t) + got, err := runLogExport(t, test.conf, test.logs, test.want.numBatches) if test.want.wantErr != "" { require.EqualError(t, err, test.want.wantErr) return } require.NoError(t, err) - require.Equal(t, test.want.numBatches, len(got)) + require.Len(t, got, test.want.numBatches) for i, wantBatch := range test.want.batches { require.NotZero(t, got[i]) if test.conf.MaxContentLengthLogs != 0 { - require.True(t, int(test.conf.MaxContentLengthLogs) > len(got[i].body)) + require.Greater(t, int(test.conf.MaxContentLengthLogs), len(got[i].body)) } if test.conf.DisableCompression { for _, expected := range wantBatch { @@ -823,9 +825,7 @@ func TestReceiveLogs(t *testing.T) { require.NoError(t, err) } if strings.Contains(string(batchBody), fmt.Sprintf(`"%s"`, attrVal.Str())) { - if eventFound { - t.Errorf("log event %s found in multiple batches", attrVal.Str()) - } + assert.False(t, eventFound, "log event %s found in multiple batches", attrVal.Str()) eventFound = true droppedCount-- } @@ -933,7 +933,7 @@ func TestReceiveRaw(t *testing.T) { } for _, test := range tests { t.Run(test.name, func(t *testing.T) { - got, err := runLogExport(test.conf, test.logs, 1, t) + got, err := runLogExport(t, test.conf, test.logs, 1) require.NoError(t, err) req := got[0] assert.Equal(t, test.text, string(req.body)) @@ -946,7 +946,7 @@ func TestReceiveLogEvent(t *testing.T) { cfg := NewFactory().CreateDefaultConfig().(*Config) cfg.DisableCompression = true - actual, err := runLogExport(cfg, logs, 1, t) + actual, err := runLogExport(t, cfg, logs, 1) assert.Len(t, actual, 1) assert.NoError(t, err) @@ -958,7 +958,7 @@ func TestReceiveMetricEvent(t *testing.T) { cfg := NewFactory().CreateDefaultConfig().(*Config) cfg.DisableCompression = true - actual, err := runMetricsExport(cfg, metrics, 1, false, t) + actual, err := runMetricsExport(t, cfg, metrics, 1, false) assert.Len(t, actual, 1) assert.NoError(t, err) @@ -970,7 +970,7 @@ func TestReceiveSpanEvent(t *testing.T) { cfg := NewFactory().CreateDefaultConfig().(*Config) cfg.DisableCompression = true - actual, err := runTraceExport(cfg, traces, 1, t) + actual, err := runTraceExport(t, cfg, traces, 1) assert.Len(t, actual, 1) assert.NoError(t, err) @@ -978,16 +978,15 @@ func TestReceiveSpanEvent(t *testing.T) { } // compareWithTestData compares hec output with a json file using maps instead of strings to avoid key ordering -// issues (jsoniter doesn't sort the keys). func compareWithTestData(t *testing.T, actual []byte, file string) { wantStr, err := os.ReadFile(file) require.NoError(t, err) wantMap := map[string]any{} - err = jsoniter.Unmarshal(wantStr, &wantMap) + err = json.Unmarshal(wantStr, &wantMap) require.NoError(t, err) gotMap := map[string]any{} - err = jsoniter.Unmarshal(actual, &gotMap) + err = json.Unmarshal(actual, &gotMap) require.NoError(t, err) assert.Equal(t, wantMap, gotMap) } @@ -996,7 +995,7 @@ func TestReceiveMetrics(t *testing.T) { md := createMetricsData(1, 3) cfg := NewFactory().CreateDefaultConfig().(*Config) cfg.DisableCompression = true - actual, err := runMetricsExport(cfg, md, 1, false, t) + actual, err := runMetricsExport(t, cfg, md, 1, false) assert.Len(t, actual, 1) assert.NoError(t, err) msg := string(actual[0].body) @@ -1156,7 +1155,7 @@ func TestReceiveBatchedMetrics(t *testing.T) { for _, test := range tests { testFn := func(multiMetric bool) func(*testing.T) { return func(t *testing.T) { - got, err := runMetricsExport(test.conf, test.metrics, test.want.numBatches, multiMetric, t) + got, err := runMetricsExport(t, test.conf, test.metrics, test.want.numBatches, multiMetric) require.NoError(t, err) require.Len(t, got, test.want.numBatches) @@ -1164,7 +1163,7 @@ func TestReceiveBatchedMetrics(t *testing.T) { for i, batch := range test.want.batches { require.NotZero(t, got[i]) if test.conf.MaxContentLengthMetrics != 0 { - require.True(t, int(test.conf.MaxContentLengthMetrics) > len(got[i].body)) + require.Greater(t, int(test.conf.MaxContentLengthMetrics), len(got[i].body)) } if test.want.compressed { validateCompressedContains(t, batch, got[i].body) @@ -1182,7 +1181,7 @@ func TestReceiveBatchedMetrics(t *testing.T) { } if test.want.numBatches == 0 { - assert.Equal(t, 0, len(got)) + assert.Empty(t, got) return } @@ -1200,9 +1199,7 @@ func TestReceiveBatchedMetrics(t *testing.T) { } time := float64(i) + 0.001*float64(i) if strings.Contains(string(batchBody), fmt.Sprintf(`"time":%g`, time)) { - if eventFound { - t.Errorf("metric event %d found in multiple batches", i) - } + assert.False(t, eventFound, "metric event %d found in multiple batches", i) eventFound = true } } @@ -1212,7 +1209,6 @@ func TestReceiveBatchedMetrics(t *testing.T) { } t.Run(test.name, testFn(false)) t.Run(test.name+"_MultiMetric", testFn(true)) - } } @@ -1225,7 +1221,7 @@ func Test_PushMetricsData_Histogram_NaN_Sum(t *testing.T) { dp := histogram.SetEmptyHistogram().DataPoints().AppendEmpty() dp.SetSum(math.NaN()) - c := newMetricsClient(exportertest.NewNopCreateSettings(), NewFactory().CreateDefaultConfig().(*Config)) + c := newMetricsClient(exportertest.NewNopSettings(), NewFactory().CreateDefaultConfig().(*Config)) c.hecWorker = &mockHecWorker{} permanentErrors := c.pushMetricsDataInBatches(context.Background(), metrics, map[string]string{}) @@ -1242,7 +1238,7 @@ func Test_PushMetricsData_Histogram_NaN_Sum_MultiMetric(t *testing.T) { dp.SetSum(math.NaN()) cfg := NewFactory().CreateDefaultConfig().(*Config) cfg.UseMultiMetricFormat = true - c := newMetricsClient(exportertest.NewNopCreateSettings(), cfg) + c := newMetricsClient(exportertest.NewNopSettings(), cfg) c.hecWorker = &mockHecWorker{} permanentErrors := c.pushMetricsDataInBatches(context.Background(), metrics, map[string]string{}) @@ -1258,7 +1254,7 @@ func Test_PushMetricsData_Summary_NaN_Sum(t *testing.T) { dp := summary.SetEmptySummary().DataPoints().AppendEmpty() dp.SetSum(math.NaN()) - c := newMetricsClient(exportertest.NewNopCreateSettings(), NewFactory().CreateDefaultConfig().(*Config)) + c := newMetricsClient(exportertest.NewNopSettings(), NewFactory().CreateDefaultConfig().(*Config)) c.hecWorker = &mockHecWorker{} permanentErrors := c.pushMetricsDataInBatches(context.Background(), metrics, map[string]string{}) @@ -1268,7 +1264,7 @@ func Test_PushMetricsData_Summary_NaN_Sum(t *testing.T) { func TestReceiveMetricsWithCompression(t *testing.T) { cfg := NewFactory().CreateDefaultConfig().(*Config) cfg.MaxContentLengthMetrics = 1800 - request, err := runMetricsExport(cfg, createMetricsData(1, 100), 2, false, t) + request, err := runMetricsExport(t, cfg, createMetricsData(1, 100), 2, false) assert.NoError(t, err) assert.Equal(t, "gzip", request[0].headers.Get("Content-Encoding")) assert.NotEqual(t, "", request) @@ -1288,7 +1284,7 @@ func TestErrorReceived(t *testing.T) { defer s.Close() go func() { if e := s.Serve(listener); e != http.ErrServerClosed { - require.NoError(t, e) + assert.NoError(t, e) } }() @@ -1303,8 +1299,8 @@ func TestErrorReceived(t *testing.T) { cfg.DisableCompression = true cfg.Token = "1234-1234" - params := exportertest.NewNopCreateSettings() - exporter, err := factory.CreateTracesExporter(context.Background(), params, cfg) + params := exportertest.NewNopSettings() + exporter, err := factory.CreateTraces(context.Background(), params, cfg) assert.NoError(t, err) assert.NoError(t, exporter.Start(context.Background(), componenttest.NewNopHost())) defer func() { @@ -1325,19 +1321,19 @@ func TestErrorReceived(t *testing.T) { func TestInvalidLogs(t *testing.T) { config := NewFactory().CreateDefaultConfig().(*Config) config.DisableCompression = false - _, err := runLogExport(config, createLogData(1, 1, 0), 1, t) + _, err := runLogExport(t, config, createLogData(1, 1, 0), 1) assert.Error(t, err) } func TestInvalidMetrics(t *testing.T) { cfg := NewFactory().CreateDefaultConfig().(*Config) - _, err := runMetricsExport(cfg, pmetric.NewMetrics(), 1, false, t) + _, err := runMetricsExport(t, cfg, pmetric.NewMetrics(), 1, false) assert.Error(t, err) } func TestInvalidMetricsMultiMetric(t *testing.T) { cfg := NewFactory().CreateDefaultConfig().(*Config) - _, err := runMetricsExport(cfg, pmetric.NewMetrics(), 1, true, t) + _, err := runMetricsExport(t, cfg, pmetric.NewMetrics(), 1, true) assert.Error(t, err) } @@ -1351,8 +1347,8 @@ func TestInvalidURL(t *testing.T) { cfg.BackOffConfig.Enabled = false cfg.ClientConfig.Endpoint = "ftp://example.com:134" cfg.Token = "1234-1234" - params := exportertest.NewNopCreateSettings() - exporter, err := factory.CreateTracesExporter(context.Background(), params, cfg) + params := exportertest.NewNopSettings() + exporter, err := factory.CreateTraces(context.Background(), params, cfg) assert.NoError(t, err) assert.NoError(t, exporter.Start(context.Background(), componenttest.NewNopHost())) defer func() { @@ -1377,7 +1373,7 @@ func TestHeartbeatStartupFailed(t *testing.T) { defer s.Close() go func() { if e := s.Serve(listener); e != http.ErrServerClosed { - require.NoError(t, e) + assert.NoError(t, e) } }() factory := NewFactory() @@ -1392,8 +1388,8 @@ func TestHeartbeatStartupFailed(t *testing.T) { cfg.Token = "1234-1234" cfg.Heartbeat.Startup = true - params := exportertest.NewNopCreateSettings() - exporter, err := factory.CreateTracesExporter(context.Background(), params, cfg) + params := exportertest.NewNopSettings() + exporter, err := factory.CreateTraces(context.Background(), params, cfg) assert.NoError(t, err) assert.EqualError(t, exporter.Start(context.Background(), componenttest.NewNopHost()), @@ -1416,7 +1412,7 @@ func TestHeartbeatStartupPass_Disabled(t *testing.T) { defer s.Close() go func() { if e := s.Serve(listener); e != http.ErrServerClosed { - require.NoError(t, e) + assert.NoError(t, e) } }() factory := NewFactory() @@ -1431,8 +1427,8 @@ func TestHeartbeatStartupPass_Disabled(t *testing.T) { cfg.Token = "1234-1234" cfg.Heartbeat.Startup = false - params := exportertest.NewNopCreateSettings() - exporter, err := factory.CreateTracesExporter(context.Background(), params, cfg) + params := exportertest.NewNopSettings() + exporter, err := factory.CreateTraces(context.Background(), params, cfg) assert.NoError(t, err) assert.NoError(t, exporter.Start(context.Background(), componenttest.NewNopHost())) assert.NoError(t, exporter.Shutdown(context.Background())) @@ -1451,7 +1447,7 @@ func TestHeartbeatStartupPass(t *testing.T) { defer s.Close() go func() { if e := s.Serve(listener); e != http.ErrServerClosed { - require.NoError(t, e) + assert.NoError(t, e) } }() factory := NewFactory() @@ -1466,8 +1462,8 @@ func TestHeartbeatStartupPass(t *testing.T) { cfg.Token = "1234-1234" cfg.Heartbeat.Startup = true - params := exportertest.NewNopCreateSettings() - exporter, err := factory.CreateTracesExporter(context.Background(), params, cfg) + params := exportertest.NewNopSettings() + exporter, err := factory.CreateTraces(context.Background(), params, cfg) assert.NoError(t, err) assert.NoError(t, exporter.Start(context.Background(), componenttest.NewNopHost())) assert.NoError(t, exporter.Shutdown(context.Background())) @@ -1481,7 +1477,7 @@ func TestInvalidJson(t *testing.T) { badEvent := badJSON{ Foo: math.Inf(1), } - _, err := jsoniter.Marshal(badEvent) + _, err := json.Marshal(badEvent) assert.Error(t, err) } @@ -1510,7 +1506,7 @@ func Test_pushLogData_nil_Logs(t *testing.T) { return logs }(), requires: func(t *testing.T, logs plog.Logs) { - require.Equal(t, logs.ResourceLogs().Len(), 1) + require.Equal(t, 1, logs.ResourceLogs().Len()) require.Zero(t, logs.ResourceLogs().At(0).ScopeLogs().Len()) }, }, @@ -1524,14 +1520,14 @@ func Test_pushLogData_nil_Logs(t *testing.T) { return logs }(), requires: func(t *testing.T, logs plog.Logs) { - require.Equal(t, logs.ResourceLogs().Len(), 1) - require.Equal(t, logs.ResourceLogs().At(0).ScopeLogs().Len(), 1) + require.Equal(t, 1, logs.ResourceLogs().Len()) + require.Equal(t, 1, logs.ResourceLogs().At(0).ScopeLogs().Len()) require.Zero(t, logs.ResourceLogs().At(0).ScopeLogs().At(0).LogRecords().Len()) }, }, } - c := newLogsClient(exportertest.NewNopCreateSettings(), NewFactory().CreateDefaultConfig().(*Config)) + c := newLogsClient(exportertest.NewNopSettings(), NewFactory().CreateDefaultConfig().(*Config)) for _, test := range tests { for _, disabled := range []bool{true, false} { @@ -1542,11 +1538,10 @@ func Test_pushLogData_nil_Logs(t *testing.T) { }) } } - } func Test_pushLogData_InvalidLog(t *testing.T) { - c := newLogsClient(exportertest.NewNopCreateSettings(), NewFactory().CreateDefaultConfig().(*Config)) + c := newLogsClient(exportertest.NewNopSettings(), NewFactory().CreateDefaultConfig().(*Config)) logs := plog.NewLogs() log := logs.ResourceLogs().AppendEmpty().ScopeLogs().AppendEmpty().LogRecords().AppendEmpty() @@ -1559,7 +1554,7 @@ func Test_pushLogData_InvalidLog(t *testing.T) { } func Test_pushLogData_PostError(t *testing.T) { - c := newLogsClient(exportertest.NewNopCreateSettings(), NewFactory().CreateDefaultConfig().(*Config)) + c := newLogsClient(exportertest.NewNopSettings(), NewFactory().CreateDefaultConfig().(*Config)) c.hecWorker = &defaultHecWorker{url: &url.URL{Host: "in va lid"}, logger: zap.NewNop()} // 2000 log records -> ~371888 bytes when JSON encoded. @@ -1598,7 +1593,7 @@ func Test_pushLogData_PostError(t *testing.T) { func Test_pushLogData_ShouldAddResponseTo400Error(t *testing.T) { config := NewFactory().CreateDefaultConfig().(*Config) url := &url.URL{Scheme: "http", Host: "splunk"} - splunkClient := newLogsClient(exportertest.NewNopCreateSettings(), NewFactory().CreateDefaultConfig().(*Config)) + splunkClient := newLogsClient(exportertest.NewNopSettings(), NewFactory().CreateDefaultConfig().(*Config)) logs := createLogData(1, 1, 1) responseBody := `some error occurred` @@ -1609,9 +1604,9 @@ func Test_pushLogData_ShouldAddResponseTo400Error(t *testing.T) { // Sending logs using the client. err := splunkClient.pushLogData(context.Background(), logs) require.True(t, consumererror.IsPermanent(err), "Expecting permanent error") - require.Contains(t, err.Error(), "HTTP/0.0 400") + require.ErrorContains(t, err, "HTTP/0.0 400") // The returned error should contain the response body responseBody. - assert.Contains(t, err.Error(), responseBody) + assert.ErrorContains(t, err, responseBody) // An HTTP client that returns some other status code other than 400 and response body responseBody. httpClient, _ = newTestClient(500, responseBody) @@ -1619,7 +1614,7 @@ func Test_pushLogData_ShouldAddResponseTo400Error(t *testing.T) { // Sending logs using the client. err = splunkClient.pushLogData(context.Background(), logs) require.False(t, consumererror.IsPermanent(err), "Expecting non-permanent error") - require.Contains(t, err.Error(), "HTTP 500") + require.ErrorContains(t, err, "HTTP 500") // The returned error should not contain the response body responseBody. assert.NotContains(t, err.Error(), responseBody) } @@ -1631,7 +1626,7 @@ func Test_pushLogData_ShouldReturnUnsentLogsOnly(t *testing.T) { config.MaxContentLengthLogs, config.DisableCompression = 250, true url := &url.URL{Scheme: "http", Host: "splunk"} - c := newLogsClient(exportertest.NewNopCreateSettings(), config) + c := newLogsClient(exportertest.NewNopSettings(), config) // Just two records logs := createLogData(2, 1, 1) @@ -1657,7 +1652,7 @@ func Test_pushLogData_ShouldAddHeadersForProfilingData(t *testing.T) { // A 300-byte buffer only fits one record (around 200 bytes), so each record will be sent separately config.MaxContentLengthLogs, config.DisableCompression = 300, true - c := newLogsClient(exportertest.NewNopCreateSettings(), config) + c := newLogsClient(exportertest.NewNopSettings(), config) logs := createLogDataWithCustomLibraries(1, []string{"otel.logs"}, []int{10}) profilingData := createLogDataWithCustomLibraries(1, []string{"otel.profiling"}, []int{20}) @@ -1671,7 +1666,7 @@ func Test_pushLogData_ShouldAddHeadersForProfilingData(t *testing.T) { require.NoError(t, err) err = c.pushLogData(context.Background(), profilingData) require.NoError(t, err) - assert.Equal(t, 30, len(*headers)) + assert.Len(t, *headers, 30) profilingCount, nonProfilingCount := 0, 0 for i := range *headers { @@ -1750,9 +1745,9 @@ func benchPushLogData(b *testing.B, numResources int, numRecords int, bufSize ui config := NewFactory().CreateDefaultConfig().(*Config) config.MaxContentLengthLogs = bufSize config.DisableCompression = !compressionEnabled - c := newLogsClient(exportertest.NewNopCreateSettings(), config) + c := newLogsClient(exportertest.NewNopSettings(), config) c.hecWorker = &mockHecWorker{} - exp, err := exporterhelper.NewLogsExporter(context.Background(), exportertest.NewNopCreateSettings(), config, + exp, err := exporterhelper.NewLogs(context.Background(), exportertest.NewNopSettings(), config, c.pushLogData) require.NoError(b, err) exp = &baseLogsExporter{ @@ -1900,9 +1895,9 @@ func benchPushMetricData(b *testing.B, numResources int, numRecords int, bufSize config.MaxContentLengthMetrics = bufSize config.DisableCompression = !compressionEnabled config.UseMultiMetricFormat = useMultiMetricFormat - c := newLogsClient(exportertest.NewNopCreateSettings(), config) + c := newLogsClient(exportertest.NewNopSettings(), config) c.hecWorker = &mockHecWorker{} - exp, err := exporterhelper.NewMetricsExporter(context.Background(), exportertest.NewNopCreateSettings(), config, + exp, err := exporterhelper.NewMetrics(context.Background(), exportertest.NewNopSettings(), config, c.pushMetricsData) require.NoError(b, err) @@ -1920,10 +1915,10 @@ func benchPushMetricData(b *testing.B, numResources int, numRecords int, bufSize func BenchmarkConsumeLogsRejected(b *testing.B) { config := NewFactory().CreateDefaultConfig().(*Config) config.DisableCompression = true - c := newLogsClient(exportertest.NewNopCreateSettings(), config) + c := newLogsClient(exportertest.NewNopSettings(), config) c.hecWorker = &mockHecWorker{failSend: true} - exp, err := exporterhelper.NewLogsExporter(context.Background(), exportertest.NewNopCreateSettings(), config, + exp, err := exporterhelper.NewLogs(context.Background(), exportertest.NewNopSettings(), config, c.pushLogData) require.NoError(b, err) @@ -1947,14 +1942,14 @@ func Test_pushLogData_Small_MaxContentLength(t *testing.T) { for _, disable := range []bool{true, false} { config.DisableCompression = disable - c := newLogsClient(exportertest.NewNopCreateSettings(), config) + c := newLogsClient(exportertest.NewNopSettings(), config) c.hecWorker = &defaultHecWorker{&url.URL{Scheme: "http", Host: "splunk"}, http.DefaultClient, buildHTTPHeaders(config, component.NewDefaultBuildInfo()), zap.NewNop()} err := c.pushLogData(context.Background(), logs) require.Error(t, err) assert.True(t, consumererror.IsPermanent(err)) - assert.Contains(t, err.Error(), "dropped log event") + assert.ErrorContains(t, err, "dropped log event") } } @@ -1993,7 +1988,7 @@ func TestAllowedLogDataTypes(t *testing.T) { numBatches = 2 } - requests, err := runLogExport(cfg, logs, numBatches, t) + requests, err := runLogExport(t, cfg, logs, numBatches) assert.NoError(t, err) seenLogs := false @@ -2055,7 +2050,7 @@ func TestPushLogsPartialSuccess(t *testing.T) { cfg := NewFactory().CreateDefaultConfig().(*Config) cfg.ExportRaw = true cfg.MaxContentLengthLogs = 6 - c := newLogsClient(exportertest.NewNopCreateSettings(), cfg) + c := newLogsClient(exportertest.NewNopSettings(), cfg) // The first request succeeds, the second fails. httpClient, _ := newTestClientWithPresetResponses([]int{200, 503}, []string{"OK", "NOK"}) @@ -2077,7 +2072,7 @@ func TestPushLogsPartialSuccess(t *testing.T) { } func TestPushLogsRetryableFailureMultipleResources(t *testing.T) { - c := newLogsClient(exportertest.NewNopCreateSettings(), NewFactory().CreateDefaultConfig().(*Config)) + c := newLogsClient(exportertest.NewNopSettings(), NewFactory().CreateDefaultConfig().(*Config)) httpClient, _ := newTestClientWithPresetResponses([]int{503}, []string{"NOK"}) url := &url.URL{Scheme: "http", Host: "splunk"} @@ -2106,5 +2101,4 @@ func validateCompressedContains(t *testing.T, expected []string, got []byte) { for _, e := range expected { assert.Contains(t, string(p), e) } - } diff --git a/exporter/splunkhecexporter/config.go b/exporter/splunkhecexporter/config.go index 168fb6aced26..9e435af573fb 100644 --- a/exporter/splunkhecexporter/config.go +++ b/exporter/splunkhecexporter/config.go @@ -65,9 +65,9 @@ type HecTelemetry struct { // Config defines configuration for Splunk exporter. type Config struct { - confighttp.ClientConfig `mapstructure:",squash"` - exporterhelper.QueueSettings `mapstructure:"sending_queue"` - configretry.BackOffConfig `mapstructure:"retry_on_failure"` + confighttp.ClientConfig `mapstructure:",squash"` + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` + configretry.BackOffConfig `mapstructure:"retry_on_failure"` // Experimental: This configuration is at the early stage of development and may change without backward compatibility // until https://github.com/open-telemetry/opentelemetry-collector/issues/8122 is resolved. @@ -116,7 +116,12 @@ type Config struct { // App version is used to track telemetry information for Splunk App's using HEC by App version. Defaults to the current OpenTelemetry Collector Contrib build version. SplunkAppVersion string `mapstructure:"splunk_app_version"` + + // OtelAttrsToHec creates a mapping from attributes to HEC specific metadata: source, sourcetype, index and host. + OtelAttrsToHec splunk.HecToOtelAttrs `mapstructure:"otel_attrs_to_hec_metadata"` + // HecToOtelAttrs creates a mapping from attributes to HEC specific metadata: source, sourcetype, index and host. + // Deprecated: [v0.113.0] Use OtelAttrsToHec instead. HecToOtelAttrs splunk.HecToOtelAttrs `mapstructure:"hec_metadata_to_otel_attrs"` // HecFields creates a mapping from attributes to HEC fields. HecFields OtelToHecFields `mapstructure:"otel_to_hec_fields"` @@ -141,7 +146,6 @@ type Config struct { } func (cfg *Config) getURL() (out *url.URL, err error) { - out, err = url.Parse(cfg.ClientConfig.Endpoint) if err != nil { return out, err diff --git a/exporter/splunkhecexporter/config_test.go b/exporter/splunkhecexporter/config_test.go index 5fcfd021cd18..a9a2959f4a00 100644 --- a/exporter/splunkhecexporter/config_test.go +++ b/exporter/splunkhecexporter/config_test.go @@ -37,6 +37,23 @@ func TestLoadConfig(t *testing.T) { hundred := 100 idleConnTimeout := 10 * time.Second + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Timeout = 10 * time.Second + clientConfig.Endpoint = "https://splunk:8088/services/collector" + clientConfig.TLSSetting = configtls.ClientConfig{ + Config: configtls.Config{ + CAFile: "", + CertFile: "", + KeyFile: "", + }, + InsecureSkipVerify: false, + } + clientConfig.HTTP2PingTimeout = 10 * time.Second + clientConfig.HTTP2ReadIdleTimeout = 10 * time.Second + clientConfig.MaxIdleConns = &hundred + clientConfig.MaxIdleConnsPerHost = &hundred + clientConfig.IdleConnTimeout = &idleConnTimeout + tests := []struct { id component.ID expected component.Config @@ -61,23 +78,7 @@ func TestLoadConfig(t *testing.T) { MaxContentLengthLogs: 2 * 1024 * 1024, MaxContentLengthMetrics: 2 * 1024 * 1024, MaxContentLengthTraces: 2 * 1024 * 1024, - ClientConfig: confighttp.ClientConfig{ - Timeout: 10 * time.Second, - Endpoint: "https://splunk:8088/services/collector", - TLSSetting: configtls.ClientConfig{ - Config: configtls.Config{ - CAFile: "", - CertFile: "", - KeyFile: "", - }, - InsecureSkipVerify: false, - }, - MaxIdleConns: &hundred, - MaxIdleConnsPerHost: &hundred, - IdleConnTimeout: &idleConnTimeout, - HTTP2ReadIdleTimeout: 10 * time.Second, - HTTP2PingTimeout: 10 * time.Second, - }, + ClientConfig: clientConfig, BackOffConfig: configretry.BackOffConfig{ Enabled: true, InitialInterval: 10 * time.Second, @@ -86,7 +87,7 @@ func TestLoadConfig(t *testing.T) { RandomizationFactor: backoff.DefaultRandomizationFactor, Multiplier: backoff.DefaultMultiplier, }, - QueueSettings: exporterhelper.QueueSettings{ + QueueSettings: exporterhelper.QueueConfig{ Enabled: true, NumConsumers: 2, QueueSize: 10, @@ -101,6 +102,12 @@ func TestLoadConfig(t *testing.T) { MaxSizeItems: 10, }, }, + OtelAttrsToHec: splunk.HecToOtelAttrs{ + Source: "mysource", + SourceType: "mysourcetype", + Index: "myindex", + Host: "myhost", + }, HecToOtelAttrs: splunk.HecToOtelAttrs{ Source: "mysource", SourceType: "mysourcetype", @@ -137,7 +144,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) diff --git a/exporter/splunkhecexporter/example/Dockerfile b/exporter/splunkhecexporter/example/Dockerfile index 29289f483359..d0d5ee5fe1aa 100644 --- a/exporter/splunkhecexporter/example/Dockerfile +++ b/exporter/splunkhecexporter/example/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.22 AS build +FROM golang:1.23 AS build WORKDIR /src ADD . /src diff --git a/exporter/splunkhecexporter/factory.go b/exporter/splunkhecexporter/factory.go index 56435c64ef6f..38f8d570d147 100644 --- a/exporter/splunkhecexporter/factory.go +++ b/exporter/splunkhecexporter/factory.go @@ -14,7 +14,7 @@ import ( "go.opentelemetry.io/collector/exporter" "go.opentelemetry.io/collector/exporter/exporterbatcher" "go.opentelemetry.io/collector/exporter/exporterhelper" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter/internal/metadata" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk" @@ -64,26 +64,34 @@ func createDefaultConfig() component.Config { defaultMaxConns := defaultMaxIdleCons defaultIdleConnTimeout := defaultIdleConnTimeout + + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Timeout = defaultHTTPTimeout + clientConfig.IdleConnTimeout = &defaultIdleConnTimeout + clientConfig.MaxIdleConnsPerHost = &defaultMaxConns + clientConfig.MaxIdleConns = &defaultMaxConns + clientConfig.HTTP2ReadIdleTimeout = defaultHTTP2ReadIdleTimeout + clientConfig.HTTP2PingTimeout = defaultHTTP2PingTimeout + return &Config{ - LogDataEnabled: true, - ProfilingDataEnabled: true, - ClientConfig: confighttp.ClientConfig{ - Timeout: defaultHTTPTimeout, - IdleConnTimeout: &defaultIdleConnTimeout, - MaxIdleConnsPerHost: &defaultMaxConns, - MaxIdleConns: &defaultMaxConns, - HTTP2ReadIdleTimeout: defaultHTTP2ReadIdleTimeout, - HTTP2PingTimeout: defaultHTTP2PingTimeout, - }, + LogDataEnabled: true, + ProfilingDataEnabled: true, + ClientConfig: clientConfig, SplunkAppName: defaultSplunkAppName, BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), BatcherConfig: batcherCfg, DisableCompression: false, MaxContentLengthLogs: defaultContentLengthLogsLimit, MaxContentLengthMetrics: defaultContentLengthMetricsLimit, MaxContentLengthTraces: defaultContentLengthTracesLimit, MaxEventSize: defaultMaxEventSize, + OtelAttrsToHec: splunk.HecToOtelAttrs{ + Source: splunk.DefaultSourceLabel, + SourceType: splunk.DefaultSourceTypeLabel, + Index: splunk.DefaultIndexLabel, + Host: conventions.AttributeHostName, + }, HecToOtelAttrs: splunk.HecToOtelAttrs{ Source: splunk.DefaultSourceLabel, SourceType: splunk.DefaultSourceTypeLabel, @@ -107,27 +115,26 @@ func createDefaultConfig() component.Config { func createTracesExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, config component.Config, ) (exporter.Traces, error) { cfg := config.(*Config) c := newTracesClient(set, cfg) - e, err := exporterhelper.NewTracesExporter( + e, err := exporterhelper.NewTraces( ctx, set, cfg, c.pushTraceData, // explicitly disable since we rely on http.Client timeout logic. - exporterhelper.WithTimeout(exporterhelper.TimeoutSettings{Timeout: 0}), + exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}), exporterhelper.WithRetry(cfg.BackOffConfig), exporterhelper.WithQueue(cfg.QueueSettings), exporterhelper.WithStart(c.start), exporterhelper.WithShutdown(c.stop), exporterhelper.WithBatcher(cfg.BatcherConfig), ) - if err != nil { return nil, err } @@ -142,20 +149,20 @@ func createTracesExporter( func createMetricsExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, config component.Config, ) (exporter.Metrics, error) { cfg := config.(*Config) c := newMetricsClient(set, cfg) - e, err := exporterhelper.NewMetricsExporter( + e, err := exporterhelper.NewMetrics( ctx, set, cfg, c.pushMetricsData, // explicitly disable since we rely on http.Client timeout logic. - exporterhelper.WithTimeout(exporterhelper.TimeoutSettings{Timeout: 0}), + exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}), exporterhelper.WithRetry(cfg.BackOffConfig), exporterhelper.WithQueue(cfg.QueueSettings), exporterhelper.WithStart(c.start), @@ -176,27 +183,26 @@ func createMetricsExporter( func createLogsExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, config component.Config, ) (exporter exporter.Logs, err error) { cfg := config.(*Config) c := newLogsClient(set, cfg) - logsExporter, err := exporterhelper.NewLogsExporter( + logsExporter, err := exporterhelper.NewLogs( ctx, set, cfg, c.pushLogData, // explicitly disable since we rely on http.Client timeout logic. - exporterhelper.WithTimeout(exporterhelper.TimeoutSettings{Timeout: 0}), + exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}), exporterhelper.WithRetry(cfg.BackOffConfig), exporterhelper.WithQueue(cfg.QueueSettings), exporterhelper.WithStart(c.start), exporterhelper.WithShutdown(c.stop), exporterhelper.WithBatcher(cfg.BatcherConfig), ) - if err != nil { return nil, err } diff --git a/exporter/splunkhecexporter/factory_test.go b/exporter/splunkhecexporter/factory_test.go index 0ae3358958b8..14bf76454d46 100644 --- a/exporter/splunkhecexporter/factory_test.go +++ b/exporter/splunkhecexporter/factory_test.go @@ -11,6 +11,7 @@ import ( "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/config/confighttp" + "go.opentelemetry.io/collector/exporter/exporterbatcher" "go.opentelemetry.io/collector/exporter/exportertest" ) @@ -20,32 +21,32 @@ func TestCreateDefaultConfig(t *testing.T) { assert.NoError(t, componenttest.CheckConfigStruct(cfg)) } -func TestCreateMetricsExporter(t *testing.T) { +func TestCreateMetrics(t *testing.T) { cfg := createDefaultConfig().(*Config) cfg.ClientConfig.Endpoint = "https://example.com:8088/services/collector" cfg.Token = "1234-1234" - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() _, err := createMetricsExporter(context.Background(), params, cfg) assert.NoError(t, err) } -func TestCreateTracesExporter(t *testing.T) { +func TestCreateTraces(t *testing.T) { cfg := createDefaultConfig().(*Config) cfg.ClientConfig.Endpoint = "https://example.com:8088/services/collector" cfg.Token = "1234-1234" - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() _, err := createTracesExporter(context.Background(), params, cfg) assert.NoError(t, err) } -func TestCreateLogsExporter(t *testing.T) { +func TestCreateLogs(t *testing.T) { cfg := createDefaultConfig().(*Config) cfg.ClientConfig.Endpoint = "https://example.com:8088/services/collector" cfg.Token = "1234-1234" - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() _, err := createLogsExporter(context.Background(), params, cfg) assert.NoError(t, err) } @@ -56,8 +57,8 @@ func TestCreateInstanceViaFactory(t *testing.T) { cfg := factory.CreateDefaultConfig().(*Config) cfg.ClientConfig.Endpoint = "https://example.com:8088/services/collector" cfg.Token = "1234-1234" - params := exportertest.NewNopCreateSettings() - exp, err := factory.CreateMetricsExporter( + params := exportertest.NewNopSettings() + exp, err := factory.CreateMetrics( context.Background(), params, cfg) assert.NoError(t, err) @@ -66,7 +67,7 @@ func TestCreateInstanceViaFactory(t *testing.T) { // Set values that don't have a valid default. cfg.Token = "testToken" cfg.ClientConfig.Endpoint = "https://example.com" - exp, err = factory.CreateMetricsExporter( + exp, err = factory.CreateMetrics( context.Background(), params, cfg) assert.NoError(t, err) @@ -75,16 +76,48 @@ func TestCreateInstanceViaFactory(t *testing.T) { assert.NoError(t, exp.Shutdown(context.Background())) } -func TestFactory_CreateMetricsExporter(t *testing.T) { +func TestFactory_CreateMetrics(t *testing.T) { + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Endpoint = "https://example.com:8000" config := &Config{ - Token: "testToken", - ClientConfig: confighttp.ClientConfig{ - Endpoint: "https://example.com:8000", - }, + Token: "testToken", + ClientConfig: clientConfig, } - params := exportertest.NewNopCreateSettings() + params := exportertest.NewNopSettings() te, err := createMetricsExporter(context.Background(), params, config) assert.NoError(t, err) assert.NotNil(t, te) } + +func TestFactory_EnabledBatchingMakesExporterMutable(t *testing.T) { + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Endpoint = "https://example.com:8000" + + config := &Config{ + Token: "testToken", + ClientConfig: clientConfig, + } + + me, err := createMetricsExporter(context.Background(), exportertest.NewNopSettings(), config) + require.NoError(t, err) + assert.False(t, me.Capabilities().MutatesData) + te, err := createTracesExporter(context.Background(), exportertest.NewNopSettings(), config) + require.NoError(t, err) + assert.False(t, te.Capabilities().MutatesData) + le, err := createLogsExporter(context.Background(), exportertest.NewNopSettings(), config) + require.NoError(t, err) + assert.False(t, le.Capabilities().MutatesData) + + config.BatcherConfig = exporterbatcher.NewDefaultConfig() + + me, err = createMetricsExporter(context.Background(), exportertest.NewNopSettings(), config) + require.NoError(t, err) + assert.True(t, me.Capabilities().MutatesData) + te, err = createTracesExporter(context.Background(), exportertest.NewNopSettings(), config) + require.NoError(t, err) + assert.True(t, te.Capabilities().MutatesData) + le, err = createLogsExporter(context.Background(), exportertest.NewNopSettings(), config) + require.NoError(t, err) + assert.True(t, le.Capabilities().MutatesData) +} diff --git a/exporter/splunkhecexporter/generated_component_test.go b/exporter/splunkhecexporter/generated_component_test.go index 3fa771b59992..5bcf78ecff3f 100644 --- a/exporter/splunkhecexporter/generated_component_test.go +++ b/exporter/splunkhecexporter/generated_component_test.go @@ -32,27 +32,27 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, { name: "metrics", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg) }, }, { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -64,21 +64,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(exporter.Logs) require.True(t, ok) diff --git a/exporter/splunkhecexporter/generated_package_test.go b/exporter/splunkhecexporter/generated_package_test.go index ec07f1aa7306..b28b53f2ab8a 100644 --- a/exporter/splunkhecexporter/generated_package_test.go +++ b/exporter/splunkhecexporter/generated_package_test.go @@ -9,5 +9,5 @@ import ( ) func TestMain(m *testing.M) { - goleak.VerifyTestMain(m, goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start")) + goleak.VerifyTestMain(m) } diff --git a/exporter/splunkhecexporter/go.mod b/exporter/splunkhecexporter/go.mod index c1935ba1e1c8..dba3f823ade0 100644 --- a/exporter/splunkhecexporter/go.mod +++ b/exporter/splunkhecexporter/go.mod @@ -1,30 +1,35 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter -go 1.21.0 +go 1.22.0 require ( github.com/cenkalti/backoff/v4 v4.3.0 - github.com/json-iterator/go v1.1.12 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchperresourceattr v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.102.0 - github.com/stretchr/testify v1.9.0 - github.com/testcontainers/testcontainers-go v0.31.0 - go.opencensus.io v0.24.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/confighttp v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/collector/config/configtls v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/goccy/go-json v0.10.4 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchperresourceattr v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.116.0 + github.com/stretchr/testify v1.10.0 + github.com/testcontainers/testcontainers-go v0.34.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/confighttp v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/config/configtls v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/semconv v0.116.0 + go.opentelemetry.io/otel v1.32.0 + go.opentelemetry.io/otel/metric v1.32.0 + go.opentelemetry.io/otel/sdk/metric v1.32.0 + go.opentelemetry.io/otel/trace v1.32.0 go.uber.org/goleak v1.3.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 @@ -34,83 +39,85 @@ require ( require ( dario.cat/mergo v1.0.0 // indirect github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/Microsoft/hcsshim v0.11.4 // indirect - github.com/beorn7/perks v1.0.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/containerd/containerd v1.7.15 // indirect github.com/containerd/log v0.1.0 // indirect - github.com/cpuguy83/dockercfg v0.3.1 // indirect + github.com/containerd/platforms v0.2.1 // indirect + github.com/cpuguy83/dockercfg v0.3.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/distribution/reference v0.5.0 // indirect - github.com/docker/docker v25.0.5+incompatible // indirect + github.com/distribution/reference v0.6.0 // indirect + github.com/docker/docker v27.3.1+incompatible // indirect github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/patternmatcher v0.6.0 // indirect github.com/moby/sys/sequential v0.5.0 // indirect github.com/moby/sys/user v0.1.0 // indirect + github.com/moby/sys/userns v0.1.0 // indirect github.com/moby/term v0.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/morikuni/aec v1.0.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/rs/cors v1.10.1 // indirect - github.com/shirou/gopsutil/v3 v3.24.4 // indirect + github.com/rs/cors v1.11.1 // indirect + github.com/shirou/gopsutil/v3 v3.24.5 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - golang.org/x/crypto v0.23.0 // indirect - golang.org/x/mod v0.16.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - golang.org/x/tools v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/proto/otlp v1.0.0 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect ) replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal => ../../internal/coreinternal diff --git a/exporter/splunkhecexporter/go.sum b/exporter/splunkhecexporter/go.sum index 6a9e95b86ac3..3ce59a02989d 100644 --- a/exporter/splunkhecexporter/go.sum +++ b/exporter/splunkhecexporter/go.sum @@ -1,108 +1,77 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= -github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w= -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/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/containerd/containerd v1.7.15 h1:afEHXdil9iAm03BmhjzKyXnnEBtjaLJefdU7DV0IFes= -github.com/containerd/containerd v1.7.15/go.mod h1:ISzRRTMF8EXNpJlTzyr2XMhN+j9K302C21/+cr3kUnY= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= -github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= +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/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= -github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= -github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/docker v27.3.1+incompatible h1:KttF0XoteNTicmUtBO0L2tP+J7FGRFTjaEF4k6WdhfI= +github.com/docker/docker v27.3.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= +github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -115,12 +84,16 @@ github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa1 github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -134,27 +107,20 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= -github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI= +github.com/shirou/gopsutil/v3 v3.24.5/go.mod h1:bsoOS1aStSs9ErQ1WWfxllSeS1K5D+U30r2NfcubMVk= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= @@ -162,19 +128,14 @@ github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnj github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/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 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/testcontainers/testcontainers-go v0.31.0 h1:W0VwIhcEVhRflwL9as3dhY6jXjVCA27AkmbnZ+UTh3U= -github.com/testcontainers/testcontainers-go v0.31.0/go.mod h1:D2lAoA0zUFiSY+eAflqK5mcUx/A5hrrORaEQrd0SefI= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/testcontainers/testcontainers-go v0.34.0 h1:5fbgF0vIN5u+nD3IWabQwRybuB4GY8G2HHgCkbMzMHo= +github.com/testcontainers/testcontainers-go v0.34.0/go.mod h1:6P/kMkQe8yqPHfPWNulFGdFHTD8HB2vLq/231xY2iPQ= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= @@ -183,68 +144,90 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= -go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= -go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 h1:j9+03ymgYhPKmeXGk5Zu+cIZOlVzd9Zv7QIiyItjFBU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0/go.mod h1:Y5+XiUG4Emn1hTfciPzGPJaSI+RpDts6BnCIir0SLqk= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= +go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -254,36 +237,19 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= -golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -293,66 +259,37 @@ golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= -golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 h1:Z0hjGZePRE0ZBWotvtrwxFNrNE9CUAGtplaDK5NNI/g= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 h1:P8OJ/WCl/Xo4E4zoe4/bifHpSmmKwARqyqE4nW6J2GQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= -gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= diff --git a/exporter/splunkhecexporter/heartbeat.go b/exporter/splunkhecexporter/heartbeat.go index 3ce88fdaae4f..4319289eeff4 100644 --- a/exporter/splunkhecexporter/heartbeat.go +++ b/exporter/splunkhecexporter/heartbeat.go @@ -10,11 +10,10 @@ import ( "runtime" "time" - "go.opencensus.io/stats" - "go.opencensus.io/stats/view" - "go.opencensus.io/tag" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/pdata/plog" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk" ) @@ -36,52 +35,38 @@ func getMetricsName(overrides map[string]string, metricName string) string { return metricName } -func newHeartbeater(config *Config, buildInfo component.BuildInfo, pushLogFn func(ctx context.Context, ld plog.Logs) error) *heartbeater { +func newHeartbeater(config *Config, buildInfo component.BuildInfo, pushLogFn func(ctx context.Context, ld plog.Logs) error, meter metric.Meter) *heartbeater { interval := config.Heartbeat.Interval if interval == 0 { return nil } - var heartbeatsSent, heartbeatsFailed *stats.Int64Measure - var tagMutators []tag.Mutator + var heartbeatsSent, heartbeatsFailed metric.Int64Counter + var attrs attribute.Set if config.Telemetry.Enabled { overrides := config.Telemetry.OverrideMetricsNames extraAttributes := config.Telemetry.ExtraAttributes - var tags []tag.Key - tagMutators = []tag.Mutator{} + var tags []attribute.KeyValue for key, val := range extraAttributes { - newTag, _ := tag.NewKey(key) - tags = append(tags, newTag) - tagMutators = append(tagMutators, tag.Insert(newTag, val)) + tags = append(tags, attribute.String(key, val)) } - - heartbeatsSent = stats.Int64( + attrs = attribute.NewSet(tags...) + var err error + heartbeatsSent, err = meter.Int64Counter( getMetricsName(overrides, defaultHBSentMetricsName), - "number of heartbeats sent", - stats.UnitDimensionless) - - heartbeatsSentView := &view.View{ - Name: heartbeatsSent.Name(), - Description: heartbeatsSent.Description(), - TagKeys: tags, - Measure: heartbeatsSent, - Aggregation: view.Sum(), + metric.WithDescription("number of heartbeats sent"), + metric.WithUnit("1"), + ) + if err != nil { + return nil } - heartbeatsFailed = stats.Int64( + heartbeatsFailed, err = meter.Int64Counter( getMetricsName(overrides, defaultHBFailedMetricsName), - "number of heartbeats failed", - stats.UnitDimensionless) - - heartbeatsFailedView := &view.View{ - Name: heartbeatsFailed.Name(), - Description: heartbeatsFailed.Description(), - TagKeys: tags, - Measure: heartbeatsFailed, - Aggregation: view.Sum(), - } - - if err := view.Register(heartbeatsSentView, heartbeatsFailedView); err != nil { + metric.WithDescription("number of heartbeats failed"), + metric.WithUnit("1"), + ) + if err != nil { return nil } } @@ -99,7 +84,7 @@ func newHeartbeater(config *Config, buildInfo component.BuildInfo, pushLogFn fun case <-ticker.C: err := hbter.sendHeartbeat(config, buildInfo, pushLogFn) if config.Telemetry.Enabled { - observe(heartbeatsSent, heartbeatsFailed, tagMutators, err) + observe(heartbeatsSent, heartbeatsFailed, attrs, err) } } } @@ -116,14 +101,12 @@ func (h *heartbeater) sendHeartbeat(config *Config, buildInfo component.BuildInf } // there is only use case for open census metrics recording for now. Extend to use open telemetry in the future. -func observe(heartbeatsSent *stats.Int64Measure, heartbeatsFailed *stats.Int64Measure, tagMutators []tag.Mutator, err error) { - var counter *stats.Int64Measure +func observe(heartbeatsSent, heartbeatsFailed metric.Int64Counter, attrs attribute.Set, err error) { if err == nil { - counter = heartbeatsSent + heartbeatsSent.Add(context.Background(), 1, metric.WithAttributeSet(attrs)) } else { - counter = heartbeatsFailed + heartbeatsFailed.Add(context.Background(), 1, metric.WithAttributeSet(attrs)) } - _ = stats.RecordWithTags(context.Background(), tagMutators, counter.M(1)) } func generateHeartbeatLog(hecToOtelAttrs splunk.HecToOtelAttrs, buildInfo component.BuildInfo) plog.Logs { diff --git a/exporter/splunkhecexporter/heartbeat_test.go b/exporter/splunkhecexporter/heartbeat_test.go index c17177231d8b..67312c6d6071 100644 --- a/exporter/splunkhecexporter/heartbeat_test.go +++ b/exporter/splunkhecexporter/heartbeat_test.go @@ -10,10 +10,13 @@ import ( "time" "github.com/stretchr/testify/assert" - "go.opencensus.io/stats/view" - "go.opencensus.io/tag" + "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/pdata/plog" + "go.opentelemetry.io/otel/attribute" + metricnoop "go.opentelemetry.io/otel/metric/noop" + sdkmetric "go.opentelemetry.io/otel/sdk/metric" + "go.opentelemetry.io/otel/sdk/metric/metricdata" ) const ( @@ -36,9 +39,9 @@ func createTestConfig(metricsOverrides map[string]string, enableMetrics bool) *C return config } -func initHeartbeater(t *testing.T, metricsOverrides map[string]string, enableMetrics bool, consumeFn func(ctx context.Context, ld plog.Logs) error) { +func initHeartbeater(t *testing.T, metricsOverrides map[string]string, enableMetrics bool, consumeFn func(ctx context.Context, ld plog.Logs) error, mp *sdkmetric.MeterProvider) { config := createTestConfig(metricsOverrides, enableMetrics) - hbter := newHeartbeater(config, component.NewDefaultBuildInfo(), consumeFn) + hbter := newHeartbeater(config, component.NewDefaultBuildInfo(), consumeFn, mp.Meter("test")) t.Cleanup(func() { hbter.shutdown() }) @@ -49,34 +52,34 @@ func assertHeartbeatInfoLog(t *testing.T, l plog.Logs) { assert.Contains(t, l.ResourceLogs().At(0).ScopeLogs().At(0).LogRecords().At(0).Body().AsString(), "HeartbeatInfo") } -func getMetricValue(metricName string) []float64 { - viewData, _ := view.RetrieveData(metricName) - var ret []float64 - if len(viewData) > 0 { - for _, data := range viewData { - ret = append(ret, data.Data.(*view.SumData).Value) +func getMetricValue(reader *sdkmetric.ManualReader, name string) ([]int64, error) { + var md metricdata.ResourceMetrics + err := reader.Collect(context.Background(), &md) + var ret []int64 + for _, sm := range md.ScopeMetrics { + for _, m := range sm.Metrics { + if m.Name == name { + g := m.Data.(metricdata.Sum[int64]) + ret = append(ret, g.DataPoints[0].Value) + } } } - return ret + return ret, err } -func getTags(metricName string) [][]tag.Tag { - viewData, _ := view.RetrieveData(metricName) - var ret [][]tag.Tag - if len(viewData) > 0 { - for _, data := range viewData { - ret = append(ret, data.Tags) - } - } - return ret -} - -func resetMetrics(metricsNames ...string) { - for _, metricsName := range metricsNames { - if v := view.Find(metricsName); v != nil { - view.Unregister(v) +func getAttributes(reader *sdkmetric.ManualReader, name string) ([]attribute.Set, error) { + var md metricdata.ResourceMetrics + err := reader.Collect(context.Background(), &md) + var ret []attribute.Set + for _, sm := range md.ScopeMetrics { + for _, m := range sm.Metrics { + if m.Name == name { + g := m.Data.(metricdata.Sum[int64]) + ret = append(ret, g.DataPoints[0].Attributes) + } } } + return ret, err } func Test_newHeartbeater_disabled(t *testing.T) { @@ -84,7 +87,7 @@ func Test_newHeartbeater_disabled(t *testing.T) { config.Heartbeat.Interval = 0 hb := newHeartbeater(config, component.NewDefaultBuildInfo(), func(_ context.Context, _ plog.Logs) error { return nil - }) + }, metricnoop.NewMeterProvider().Meter("test")) assert.Nil(t, hb) } @@ -115,7 +118,9 @@ func Test_Heartbeat_success(t *testing.T) { consumeLogsChan <- ld return nil } - initHeartbeater(t, tt.metricsOverrides, true, consumeFn) + reader := sdkmetric.NewManualReader() + meterProvider := sdkmetric.NewMeterProvider(sdkmetric.WithReader(reader)) + initHeartbeater(t, tt.metricsOverrides, true, consumeFn, meterProvider) assert.Eventually(t, func() bool { return len(consumeLogsChan) != 0 @@ -126,31 +131,38 @@ func Test_Heartbeat_success(t *testing.T) { if tt.enableMetrics { sentMetricsName := getMetricsName(tt.metricsOverrides, defaultHBSentMetricsName) - failedMetricsName := getMetricsName(tt.metricsOverrides, defaultHBFailedMetricsName) - + var got []int64 + var err error assert.Eventually(t, func() bool { - return len(getMetricValue(sentMetricsName)) != 0 + got, err = getMetricValue(reader, sentMetricsName) + require.NoError(t, err) + return len(got) != 0 }, time.Second, 10*time.Millisecond) - assert.Greater(t, getMetricValue(sentMetricsName)[0], float64(0), "there should be at least one success metric datapoint") - metricLabelKeyTag, _ := tag.NewKey(metricLabelKey) - assert.Equal(t, []tag.Tag{{Key: metricLabelKeyTag, Value: metricLabelVal}}, getTags(sentMetricsName)[0]) - - resetMetrics(sentMetricsName, failedMetricsName) + assert.Positive(t, got[0], "there should be at least one success metric datapoint") + attrs, err := getAttributes(reader, sentMetricsName) + require.NoError(t, err) + assert.Equal(t, attribute.NewSet(attribute.String(metricLabelKey, metricLabelVal)), attrs[0]) } } } func Test_Heartbeat_failure(t *testing.T) { - resetMetrics() consumeFn := func(_ context.Context, _ plog.Logs) error { return errors.New("always error") } - initHeartbeater(t, map[string]string{}, true, consumeFn) + reader := sdkmetric.NewManualReader() + meterProvider := sdkmetric.NewMeterProvider(sdkmetric.WithReader(reader)) + initHeartbeater(t, map[string]string{}, true, consumeFn, meterProvider) + var got []int64 + var err error assert.Eventually(t, func() bool { - return len(getMetricValue(defaultHBFailedMetricsName)) != 0 + got, err = getMetricValue(reader, defaultHBFailedMetricsName) + require.NoError(t, err) + return len(got) != 0 }, time.Second, 10*time.Millisecond) - assert.Greater(t, getMetricValue(defaultHBFailedMetricsName)[0], float64(0), "there should be at least one failure metric datapoint") - metricLabelKeyTag, _ := tag.NewKey(metricLabelKey) - assert.Equal(t, []tag.Tag{{Key: metricLabelKeyTag, Value: metricLabelVal}}, getTags(defaultHBFailedMetricsName)[0]) + assert.Positive(t, got[0], "there should be at least one failure metric datapoint") + attrs, err := getAttributes(reader, defaultHBFailedMetricsName) + require.NoError(t, err) + assert.Equal(t, attribute.NewSet(attribute.String(metricLabelKey, metricLabelVal)), attrs[0]) } diff --git a/exporter/splunkhecexporter/hec_worker.go b/exporter/splunkhecexporter/hec_worker.go index 64ff98738932..f17ca8d5ee3a 100644 --- a/exporter/splunkhecexporter/hec_worker.go +++ b/exporter/splunkhecexporter/hec_worker.go @@ -4,9 +4,10 @@ package splunkhecexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter" import ( + "bytes" "context" + "io" "net/http" - "net/http/httputil" "net/url" "go.opentelemetry.io/collector/consumer/consumererror" @@ -27,7 +28,11 @@ type defaultHecWorker struct { } func (hec *defaultHecWorker) send(ctx context.Context, buf buffer, headers map[string]string) error { - req, err := http.NewRequestWithContext(ctx, "POST", hec.url.String(), buf) + // We copy the bytes to a new buffer to avoid corruption. This is a workaround to avoid hitting https://github.com/golang/go/issues/51907. + nb := make([]byte, buf.Len()) + copy(nb, buf.Bytes()) + bodyBuf := bytes.NewReader(nb) + req, err := http.NewRequestWithContext(ctx, http.MethodPost, hec.url.String(), bodyBuf) if err != nil { return consumererror.NewPermanent(err) } @@ -66,7 +71,7 @@ func (hec *defaultHecWorker) send(ctx context.Context, buf buffer, headers map[s // HTTP client will not reuse the same connection unless it is drained. // See https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/18281 for more details. if resp.StatusCode != http.StatusTooManyRequests && resp.StatusCode != http.StatusBadGateway { - if _, errCopy := httputil.DumpResponse(resp, true); errCopy != nil { + if _, errCopy := io.Copy(io.Discard, resp.Body); errCopy != nil { return errCopy } } diff --git a/exporter/splunkhecexporter/integration_test.go b/exporter/splunkhecexporter/integration_test.go index 2a8af5480838..288ffd2435d2 100644 --- a/exporter/splunkhecexporter/integration_test.go +++ b/exporter/splunkhecexporter/integration_test.go @@ -28,7 +28,7 @@ import ( "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "go.uber.org/zap" "go.uber.org/zap/zaptest" @@ -105,7 +105,7 @@ func startSplunk() SplunkContainerConfig { { HostFilePath: filepath.Join("testdata", "splunk.yaml"), ContainerFilePath: "/tmp/defaults/default.yml", - FileMode: 0644, + FileMode: 0o644, }, }, WaitingFor: wait.ForHealthCheck().WithStartupTimeout(5 * time.Minute), @@ -115,7 +115,6 @@ func startSplunk() SplunkContainerConfig { ContainerRequest: req, Started: true, }) - if err != nil { logger.Info("Error while creating container") panic(err) @@ -223,9 +222,11 @@ type cfg struct { type telemetryType string -var metricsType = telemetryType("metrics") -var logsType = telemetryType("logs") -var tracesType = telemetryType("traces") +var ( + metricsType = telemetryType("metrics") + logsType = telemetryType("logs") + tracesType = telemetryType("traces") +) type testCfg struct { name string @@ -235,7 +236,7 @@ type testCfg struct { } func logsTest(t *testing.T, config *Config, url *url.URL, test testCfg) { - settings := exportertest.NewNopCreateSettings() + settings := exportertest.NewNopSettings() c := newLogsClient(settings, config) var logs plog.Logs if test.config.index != "main" { @@ -252,7 +253,7 @@ func logsTest(t *testing.T, config *Config, url *url.URL, test testCfg) { waitForEventToBeIndexed() events := integrationtestutils.CheckEventsFromSplunk("index="+test.config.index+" *", test.startTime) - assert.Equal(t, len(events), 1) + assert.Len(t, events, 1) // check events fields data, ok := events[0].(map[string]any) assert.True(t, ok, "Invalid event format") @@ -263,7 +264,7 @@ func logsTest(t *testing.T, config *Config, url *url.URL, test testCfg) { } func metricsTest(t *testing.T, config *Config, url *url.URL, test testCfg) { - settings := exportertest.NewNopCreateSettings() + settings := exportertest.NewNopSettings() c := newMetricsClient(settings, config) metricData := prepareMetricsData(test.config.event) @@ -275,11 +276,11 @@ func metricsTest(t *testing.T, config *Config, url *url.URL, test testCfg) { waitForEventToBeIndexed() events := integrationtestutils.CheckMetricsFromSplunk(test.config.index, test.config.event) - assert.Equal(t, len(events), 1, "Events length is less than 1. No metrics found") + assert.Len(t, events, 1, "Events length is less than 1. No metrics found") } func tracesTest(t *testing.T, config *Config, url *url.URL, test testCfg) { - settings := exportertest.NewNopCreateSettings() + settings := exportertest.NewNopSettings() c := newTracesClient(settings, config) tracesData := prepareTracesData(test.config.index, test.config.source, test.config.sourcetype) @@ -291,7 +292,7 @@ func tracesTest(t *testing.T, config *Config, url *url.URL, test testCfg) { waitForEventToBeIndexed() events := integrationtestutils.CheckEventsFromSplunk("index="+test.config.index+" *", test.startTime) - assert.Equal(t, len(events), 1) + assert.Len(t, events, 1) // check fields data, ok := events[0].(map[string]any) assert.True(t, ok, "Invalid event format") diff --git a/exporter/splunkhecexporter/internal/integrationtestutils/config_helper.go b/exporter/splunkhecexporter/internal/integrationtestutils/config_helper.go index 24a99af6b949..86c0685e4c4d 100644 --- a/exporter/splunkhecexporter/internal/integrationtestutils/config_helper.go +++ b/exporter/splunkhecexporter/internal/integrationtestutils/config_helper.go @@ -102,12 +102,11 @@ func SetConfigVariable(key string, value string) { } // Write yaml file - err = os.WriteFile(configFilePth, newData, 0600) + err = os.WriteFile(configFilePth, newData, 0o600) if err != nil { fmt.Printf("Error writing file: %v", err) return } fmt.Println("Host value updated successfully!") - } diff --git a/exporter/splunkhecexporter/internal/integrationtestutils/splunk.go b/exporter/splunkhecexporter/internal/integrationtestutils/splunk.go index 4d5e47cf1676..36199d2abd4a 100644 --- a/exporter/splunkhecexporter/internal/integrationtestutils/splunk.go +++ b/exporter/splunkhecexporter/internal/integrationtestutils/splunk.go @@ -47,7 +47,7 @@ func getSplunkSearchResults(user string, password string, baseURL string, jobID logger := log.New(os.Stdout, "", log.LstdFlags) eventURL := fmt.Sprintf("%s/services/search/jobs/%s/events?output_mode=json", baseURL, jobID) logger.Println("URL: " + eventURL) - reqEvents, err := http.NewRequest("GET", eventURL, nil) + reqEvents, err := http.NewRequest(http.MethodGet, eventURL, nil) if err != nil { panic(err) } @@ -89,7 +89,7 @@ func checkSearchJobStatusCode(user string, password string, baseURL string, jobI TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, } client := &http.Client{Transport: tr} - checkReqEvents, err := http.NewRequest("GET", checkEventURL, nil) + checkReqEvents, err := http.NewRequest(http.MethodGet, checkEventURL, nil) if err != nil { panic(err) } @@ -115,6 +115,7 @@ func checkSearchJobStatusCode(user string, password string, baseURL string, jobI logger.Printf("Is Splunk Search completed [isDone flag]: %v\n", isDone) return isDone } + func postSearchRequest(user string, password string, baseURL string, searchQuery string, startTime string, endTime string) string { logger := log.New(os.Stdout, "", log.LstdFlags) searchURL := fmt.Sprintf("%s/services/search/jobs?output_mode=json", baseURL) @@ -129,7 +130,7 @@ func postSearchRequest(user string, password string, baseURL string, searchQuery TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, } client := &http.Client{Transport: tr} - req, err := http.NewRequest("POST", searchURL, strings.NewReader(data.Encode())) + req, err := http.NewRequest(http.MethodPost, searchURL, strings.NewReader(data.Encode())) if err != nil { logger.Printf("Error while preparing POST request") panic(err) @@ -172,7 +173,7 @@ func CheckMetricsFromSplunk(index string, metricName string) []any { TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, } client := &http.Client{Transport: tr, Timeout: 10 * time.Second} - req, err := http.NewRequest("GET", apiURL, nil) + req, err := http.NewRequest(http.MethodGet, apiURL, nil) if err != nil { panic(err) } @@ -209,7 +210,7 @@ func CreateAnIndexInSplunk(index string, indexType string) { TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, } client := &http.Client{Transport: tr} - req, err := http.NewRequest("POST", indexURL, strings.NewReader(data.Encode())) + req, err := http.NewRequest(http.MethodPost, indexURL, strings.NewReader(data.Encode())) if err != nil { logger.Printf("Error while preparing POST request") panic(err) diff --git a/exporter/splunkhecexporter/internal/metadata/generated_status.go b/exporter/splunkhecexporter/internal/metadata/generated_status.go index b8852d1f650c..275d2250a6f5 100644 --- a/exporter/splunkhecexporter/internal/metadata/generated_status.go +++ b/exporter/splunkhecexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("splunk_hec") + Type = component.MustNewType("splunk_hec") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter" ) const ( diff --git a/exporter/splunkhecexporter/internal/metadata/generated_telemetry.go b/exporter/splunkhecexporter/internal/metadata/generated_telemetry.go index a507863b3c6a..c4977efe54db 100644 --- a/exporter/splunkhecexporter/internal/metadata/generated_telemetry.go +++ b/exporter/splunkhecexporter/internal/metadata/generated_telemetry.go @@ -9,9 +9,9 @@ import ( ) func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/splunkhec") + return settings.MeterProvider.Meter("github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter") } func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/splunkhec") + return settings.TracerProvider.Tracer("github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter") } diff --git a/exporter/splunkhecexporter/internal/metadata/generated_telemetry_test.go b/exporter/splunkhecexporter/internal/metadata/generated_telemetry_test.go index ad6e7a995c71..e1d0d3866490 100644 --- a/exporter/splunkhecexporter/internal/metadata/generated_telemetry_test.go +++ b/exporter/splunkhecexporter/internal/metadata/generated_telemetry_test.go @@ -49,14 +49,14 @@ func TestProviders(t *testing.T) { meter := Meter(set) if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/splunkhec", m.name) + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter", m.name) } else { require.Fail(t, "returned Meter not mockMeter") } tracer := Tracer(set) if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/splunkhec", m.name) + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter", m.name) } else { require.Fail(t, "returned Meter not mockTracer") } diff --git a/exporter/splunkhecexporter/logdata_to_splunk.go b/exporter/splunkhecexporter/logdata_to_splunk.go index b28c4b783a1b..96ad419a2a5b 100644 --- a/exporter/splunkhecexporter/logdata_to_splunk.go +++ b/exporter/splunkhecexporter/logdata_to_splunk.go @@ -8,7 +8,7 @@ import ( "fmt" "time" - jsoniter "github.com/json-iterator/go" + "github.com/goccy/go-json" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" @@ -23,16 +23,53 @@ const ( traceIDFieldKey = "trace_id" ) +// copyOtelAttrs copies values from HecToOtelAttrs to OtelAttrsToHec struct. +func copyOtelAttrs(config *Config) { + defaultCfg := createDefaultConfig().(*Config) + if config.OtelAttrsToHec.Equal(defaultCfg.OtelAttrsToHec) { + if !config.HecToOtelAttrs.Equal(defaultCfg.HecToOtelAttrs) { + // Copy settings to ease deprecation of HecToOtelAttrs. + config.OtelAttrsToHec = config.HecToOtelAttrs + } + } else { + if !config.HecToOtelAttrs.Equal(defaultCfg.HecToOtelAttrs) { + // Replace all default fields in OtelAttrsToHec. + if config.OtelAttrsToHec.Source == defaultCfg.OtelAttrsToHec.Source { + config.OtelAttrsToHec.Source = config.HecToOtelAttrs.Source + } + if config.OtelAttrsToHec.SourceType == defaultCfg.OtelAttrsToHec.SourceType { + config.OtelAttrsToHec.SourceType = config.HecToOtelAttrs.SourceType + } + if config.OtelAttrsToHec.Index == defaultCfg.OtelAttrsToHec.Index { + config.OtelAttrsToHec.Index = config.HecToOtelAttrs.Index + } + if config.OtelAttrsToHec.Host == defaultCfg.OtelAttrsToHec.Host { + config.OtelAttrsToHec.Host = config.HecToOtelAttrs.Host + } + } + } +} + func mapLogRecordToSplunkEvent(res pcommon.Resource, lr plog.LogRecord, config *Config) *splunk.Event { + body := lr.Body().AsRaw() + if body == nil || body == "" { + // events with no body are rejected by Splunk. + return nil + } + + // Manage the deprecation of HecToOtelAttrs config parameters. + // TODO: remove this once HecToOtelAttrs is removed from Config. + copyOtelAttrs(config) + host := unknownHostName source := config.Source sourcetype := config.SourceType index := config.Index fields := map[string]any{} - sourceKey := config.HecToOtelAttrs.Source - sourceTypeKey := config.HecToOtelAttrs.SourceType - indexKey := config.HecToOtelAttrs.Index - hostKey := config.HecToOtelAttrs.Host + sourceKey := config.OtelAttrsToHec.Source + sourceTypeKey := config.OtelAttrsToHec.SourceType + indexKey := config.OtelAttrsToHec.Index + hostKey := config.OtelAttrsToHec.Host severityTextKey := config.HecFields.SeverityText severityNumberKey := config.HecFields.SeverityNumber if spanID := lr.SpanID(); !spanID.IsEmpty() { @@ -83,11 +120,6 @@ func mapLogRecordToSplunkEvent(res pcommon.Resource, lr plog.LogRecord, config * return true }) - body := lr.Body().AsRaw() - if body == nil { - body = "" - } - return &splunk.Event{ Time: nanoTimestampToEpochMilliseconds(lr.Timestamp()), Host: host, @@ -110,15 +142,14 @@ func mergeValue(dst map[string]any, k string, v any) { if isArrayFlat(element) { dst[k] = v } else { - jsonStr, _ := jsoniter.MarshalToString(element) - dst[k] = jsonStr + b, _ := json.Marshal(element) + dst[k] = string(b) } case map[string]any: flattenAndMergeMap(element, dst, k) default: dst[k] = v } - } func isArrayFlat(array []any) bool { @@ -141,8 +172,8 @@ func flattenAndMergeMap(src, dst map[string]any, key string) { if isArrayFlat(element) { dst[current] = element } else { - jsonStr, _ := jsoniter.MarshalToString(element) - dst[current] = jsonStr + b, _ := json.Marshal(element) + dst[current] = string(b) } default: diff --git a/exporter/splunkhecexporter/logdata_to_splunk_test.go b/exporter/splunkhecexporter/logdata_to_splunk_test.go index 7896affb4cbb..a8bd780c4fbb 100644 --- a/exporter/splunkhecexporter/logdata_to_splunk_test.go +++ b/exporter/splunkhecexporter/logdata_to_splunk_test.go @@ -9,11 +9,105 @@ import ( "github.com/stretchr/testify/assert" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk" ) +func Test_copyOtelAttrs(t *testing.T) { + tests := []struct { + name string + configDataFn func() *Config + wantConfigDataFn func() *Config + }{ + { + name: "defaults", + configDataFn: func() *Config { + return createDefaultConfig().(*Config) + }, + wantConfigDataFn: func() *Config { + return createDefaultConfig().(*Config) + }, + }, + { + name: "override hec_metadata_to_otel_attrs", + configDataFn: func() *Config { + cfg := createDefaultConfig().(*Config) + + cfg.HecToOtelAttrs.Index = "testIndex" + cfg.HecToOtelAttrs.Source = "testSource" + cfg.HecToOtelAttrs.SourceType = "testSourceType" + cfg.HecToOtelAttrs.Host = "testHost" + + return cfg + }, + wantConfigDataFn: func() *Config { + cfg := createDefaultConfig().(*Config) + + cfg.HecToOtelAttrs.Index = "testIndex" + cfg.HecToOtelAttrs.Source = "testSource" + cfg.HecToOtelAttrs.SourceType = "testSourceType" + cfg.HecToOtelAttrs.Host = "testHost" + + cfg.OtelAttrsToHec.Index = "testIndex" + cfg.OtelAttrsToHec.Source = "testSource" + cfg.OtelAttrsToHec.SourceType = "testSourceType" + cfg.OtelAttrsToHec.Host = "testHost" + + return cfg + }, + }, + { + name: "partial otel_attrs_to_hec_metadata", + configDataFn: func() *Config { + cfg := createDefaultConfig().(*Config) + + cfg.OtelAttrsToHec.Source = "testSource" + cfg.OtelAttrsToHec.Index = "testIndex" + + return cfg + }, + wantConfigDataFn: func() *Config { + cfg := createDefaultConfig().(*Config) + + cfg.OtelAttrsToHec.Source = "testSource" + cfg.OtelAttrsToHec.Index = "testIndex" + + return cfg + }, + }, + { + name: "prefer otel_attrs_to_hec_metadata", + configDataFn: func() *Config { + cfg := createDefaultConfig().(*Config) + + cfg.HecToOtelAttrs.Index = "hecIndex" + + cfg.OtelAttrsToHec.Index = "otelIndex" + + return cfg + }, + wantConfigDataFn: func() *Config { + cfg := createDefaultConfig().(*Config) + + cfg.HecToOtelAttrs.Index = "hecIndex" + + cfg.OtelAttrsToHec.Index = "otelIndex" + + return cfg + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cfg := tt.configDataFn() + copyOtelAttrs(cfg) + assert.Equal(t, tt.wantConfigDataFn(), cfg) + }) + } +} + func Test_mapLogRecordToSplunkEvent(t *testing.T) { ts := pcommon.Timestamp(123) @@ -153,18 +247,18 @@ func Test_mapLogRecordToSplunkEvent(t *testing.T) { }, logResourceFn: pcommon.NewResource, configDataFn: func() *Config { - return &Config{ - HecToOtelAttrs: splunk.HecToOtelAttrs{ - Source: "mysource", - SourceType: "mysourcetype", - Index: "myindex", - Host: "myhost", - }, - HecFields: OtelToHecFields{ - SeverityNumber: "myseveritynum", - SeverityText: "myseverity", - }, + config := createDefaultConfig().(*Config) + config.HecToOtelAttrs = splunk.HecToOtelAttrs{ + Source: "mysource", + SourceType: "mysourcetype", + Index: "myindex", + Host: "myhost", + } + config.HecFields = OtelToHecFields{ + SeverityNumber: "myseveritynum", + SeverityText: "myseverity", } + return config }, wantSplunkEvents: []*splunk.Event{ func() *splunk.Event { @@ -187,14 +281,13 @@ func Test_mapLogRecordToSplunkEvent(t *testing.T) { config.SourceType = "sourcetype" return config }, - wantSplunkEvents: []*splunk.Event{ - commonLogSplunkEvent("", 0, map[string]any{}, "unknown", "source", "sourcetype"), - }, + wantSplunkEvents: []*splunk.Event{}, }, { name: "with span and trace id", logRecordFn: func() plog.LogRecord { logRecord := plog.NewLogRecord() + logRecord.Body().SetStr("foo") logRecord.SetSpanID([8]byte{0, 0, 0, 0, 0, 0, 0, 50}) logRecord.SetTraceID([16]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100}) return logRecord @@ -207,7 +300,7 @@ func Test_mapLogRecordToSplunkEvent(t *testing.T) { return config }, wantSplunkEvents: func() []*splunk.Event { - event := commonLogSplunkEvent("", 0, map[string]any{}, "unknown", "source", "sourcetype") + event := commonLogSplunkEvent("foo", 0, map[string]any{}, "unknown", "source", "sourcetype") event.Fields["span_id"] = "0000000000000032" event.Fields["trace_id"] = "00000000000000000000000000000064" return []*splunk.Event{event} @@ -329,10 +422,7 @@ func Test_mapLogRecordToSplunkEvent(t *testing.T) { config.SourceType = "sourcetype" return config }, - wantSplunkEvents: []*splunk.Event{ - commonLogSplunkEvent("", ts, map[string]any{"custom": "custom"}, - "myhost", "myapp", "myapp-type"), - }, + wantSplunkEvents: []*splunk.Event{}, }, { name: "with array body", @@ -449,13 +539,7 @@ func commonLogSplunkEvent( func Test_emptyLogRecord(t *testing.T) { event := mapLogRecordToSplunkEvent(pcommon.NewResource(), plog.NewLogRecord(), &Config{}) - assert.Zero(t, event.Time) - assert.Equal(t, event.Host, "unknown") - assert.Zero(t, event.Source) - assert.Zero(t, event.SourceType) - assert.Zero(t, event.Index) - assert.Equal(t, "", event.Event) - assert.Empty(t, event.Fields) + assert.Nil(t, event) } func Test_nanoTimestampToEpochMilliseconds(t *testing.T) { @@ -531,5 +615,4 @@ func Test_mergeValue(t *testing.T) { assert.Equal(t, tt.expected, fields) }) } - } diff --git a/exporter/splunkhecexporter/metadata.yaml b/exporter/splunkhecexporter/metadata.yaml index 3fb45f7cd2ee..aba7dde1cf0a 100644 --- a/exporter/splunkhecexporter/metadata.yaml +++ b/exporter/splunkhecexporter/metadata.yaml @@ -1,5 +1,4 @@ type: splunk_hec -scope_name: otelcol/splunkhec status: class: exporter @@ -17,8 +16,3 @@ tests: retry_on_failure: enabled: false expect_consumer_error: true - goleak: - ignore: - top: - # See https://github.com/census-instrumentation/opencensus-go/issues/1191 for more information. - - "go.opencensus.io/stats/view.(*worker).start" diff --git a/exporter/splunkhecexporter/metricdata_to_splunk.go b/exporter/splunkhecexporter/metricdata_to_splunk.go index d982c958896f..ec95f98aa4d5 100644 --- a/exporter/splunkhecexporter/metricdata_to_splunk.go +++ b/exporter/splunkhecexporter/metricdata_to_splunk.go @@ -9,7 +9,7 @@ import ( "strconv" "strings" - jsoniter "github.com/json-iterator/go" + "github.com/goccy/go-json" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" "go.uber.org/zap" @@ -284,12 +284,11 @@ func mergeEventsToMultiMetricFormat(events []*splunk.Event) ([]*splunk.Event, er hashes := map[uint32]*splunk.Event{} hasher := fnv.New32a() var merged []*splunk.Event - marshaler := jsoniter.ConfigCompatibleWithStandardLibrary for _, e := range events { cloned := copyEventWithoutValues(e) - data, err := marshaler.Marshal(cloned) + data, err := json.Marshal(cloned) if err != nil { return nil, err } diff --git a/exporter/splunkhecexporter/metricdata_to_splunk_test.go b/exporter/splunkhecexporter/metricdata_to_splunk_test.go index 4146814ec6cc..c1f6600690ea 100644 --- a/exporter/splunkhecexporter/metricdata_to_splunk_test.go +++ b/exporter/splunkhecexporter/metricdata_to_splunk_test.go @@ -4,14 +4,13 @@ package splunkhecexporter import ( - "encoding/json" "fmt" "io" "math" "testing" "time" - jsoniter "github.com/json-iterator/go" + "github.com/goccy/go-json" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/pdata/pcommon" @@ -216,7 +215,6 @@ func Test_metricDataToSplunk(t *testing.T) { return res }, metricsDataFn: func() pmetric.Metric { - doubleGauge := pmetric.NewMetric() doubleGauge.SetName("gauge_double_with_dims") doubleDataPt := doubleGauge.SetEmptyGauge().DataPoints().AppendEmpty() @@ -706,18 +704,18 @@ func TestMergeEvents(t *testing.T) { json1 := `{"event":"metric","fields":{"IF-Azure":"azure-env","k8s.cluster.name":"devops-uat","k8s.namespace.name":"splunk-collector-tests","k8s.node.name":"myk8snodename","k8s.pod.name":"my-otel-collector-pod","metric_type":"Gauge","metricsIndex":"test_metrics","metricsPlatform":"unset","resourceAttrs":"NO","testNumber":"number42","testRun":"42","metric_name:otel.collector.test":3411}}` json2 := `{"event":"metric","fields":{"IF-Azure":"azure-env","k8s.cluster.name":"devops-uat","k8s.namespace.name":"splunk-collector-tests","k8s.node.name":"myk8snodename","k8s.pod.name":"my-otel-collector-pod","metric_type":"Gauge","metricsIndex":"test_metrics","metricsPlatform":"unset","resourceAttrs":"NO","testNumber":"number42","testRun":"42","metric_name:otel.collector.test2":26059}}` ev1 := &splunk.Event{} - err := jsoniter.Unmarshal([]byte(json1), ev1) + err := json.Unmarshal([]byte(json1), ev1) require.NoError(t, err) ev2 := &splunk.Event{} - err = jsoniter.Unmarshal([]byte(json2), ev2) + err = json.Unmarshal([]byte(json2), ev2) require.NoError(t, err) events := []*splunk.Event{ev1, ev2} merged, err := mergeEventsToMultiMetricFormat(events) require.NoError(t, err) require.Len(t, merged, 1) - b, err := jsoniter.ConfigCompatibleWithStandardLibrary.Marshal(merged[0]) + b, err := json.Marshal(merged[0]) require.NoError(t, err) - require.Equal(t, `{"host":"","event":"metric","fields":{"IF-Azure":"azure-env","k8s.cluster.name":"devops-uat","k8s.namespace.name":"splunk-collector-tests","k8s.node.name":"myk8snodename","k8s.pod.name":"my-otel-collector-pod","metric_name:otel.collector.test":3411,"metric_name:otel.collector.test2":26059,"metric_type":"Gauge","metricsIndex":"test_metrics","metricsPlatform":"unset","resourceAttrs":"NO","testNumber":"number42","testRun":"42"}}`, string(b)) + require.JSONEq(t, `{"host":"","event":"metric","fields":{"IF-Azure":"azure-env","k8s.cluster.name":"devops-uat","k8s.namespace.name":"splunk-collector-tests","k8s.node.name":"myk8snodename","k8s.pod.name":"my-otel-collector-pod","metric_name:otel.collector.test":3411,"metric_name:otel.collector.test2":26059,"metric_type":"Gauge","metricsIndex":"test_metrics","metricsPlatform":"unset","resourceAttrs":"NO","testNumber":"number42","testRun":"42"}}`, string(b)) } func newMetricsWithResources() pcommon.Resource { diff --git a/exporter/splunkhecexporter/testdata/config.yaml b/exporter/splunkhecexporter/testdata/config.yaml index 54b7040dbf8d..5e6afc0e058b 100644 --- a/exporter/splunkhecexporter/testdata/config.yaml +++ b/exporter/splunkhecexporter/testdata/config.yaml @@ -33,6 +33,11 @@ splunk_hec/allsettings: max_size_items: 10 splunk_app_name: "OpenTelemetry-Collector Splunk Exporter" splunk_app_version: "v0.0.1" + otel_attrs_to_hec_metadata: + source: "mysource" + sourcetype: "mysourcetype" + index: "myindex" + host: "myhost" hec_metadata_to_otel_attrs: source: "mysource" sourcetype: "mysourcetype" diff --git a/exporter/splunkhecexporter/tracedata_to_splunk_test.go b/exporter/splunkhecexporter/tracedata_to_splunk_test.go index 377970076f19..491d66147771 100644 --- a/exporter/splunkhecexporter/tracedata_to_splunk_test.go +++ b/exporter/splunkhecexporter/tracedata_to_splunk_test.go @@ -122,7 +122,8 @@ func commonSplunkEvent( Source: "myservice", SourceType: "mysourcetype", Index: "myindex", - Event: hecSpan{Name: name, StartTime: ts, + Event: hecSpan{ + Name: name, StartTime: ts, TraceID: "", SpanID: "", ParentSpan: "", diff --git a/exporter/sumologicexporter/README.md b/exporter/sumologicexporter/README.md index 477069565565..0eac361cd157 100644 --- a/exporter/sumologicexporter/README.md +++ b/exporter/sumologicexporter/README.md @@ -6,9 +6,10 @@ | Stability | [beta]: metrics, logs, traces | | Distributions | [contrib] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fsumologic%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fsumologic) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fsumologic%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fsumologic) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@aboguszewski-sumo](https://www.github.com/aboguszewski-sumo), [@kkujawa-sumo](https://www.github.com/kkujawa-sumo), [@mat-rumian](https://www.github.com/mat-rumian), [@rnishtala-sumo](https://www.github.com/rnishtala-sumo), [@sumo-drosiek](https://www.github.com/sumo-drosiek), [@swiatekm-sumo](https://www.github.com/swiatekm-sumo) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@rnishtala-sumo](https://www.github.com/rnishtala-sumo), [@chan-tim-sumo](https://www.github.com/chan-tim-sumo) | +| Emeritus | [@aboguszewski-sumo](https://www.github.com/aboguszewski-sumo), [@kasia-kujawa](https://www.github.com/kasia-kujawa), [@mat-rumian](https://www.github.com/mat-rumian), [@sumo-drosiek](https://www.github.com/sumo-drosiek) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib @@ -80,7 +81,7 @@ exporters: # unique URL generated for your HTTP Source, this is the address to send data to endpoint: # Compression encoding format, empty string means no compression, default = gzip - compress_encoding: {gzip, deflate, ""} + compression: {gzip, deflate, zstd, ""} # max HTTP request body size in bytes before compression (if applied), # default = 1_048_576 (1MB) max_request_body_size: diff --git a/exporter/sumologicexporter/config.go b/exporter/sumologicexporter/config.go index 0623f4eca338..061761c8b36c 100644 --- a/exporter/sumologicexporter/config.go +++ b/exporter/sumologicexporter/config.go @@ -21,14 +21,15 @@ import ( // Config defines configuration for Sumo Logic exporter. type Config struct { - confighttp.ClientConfig `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. - exporterhelper.QueueSettings `mapstructure:"sending_queue"` - configretry.BackOffConfig `mapstructure:"retry_on_failure"` + confighttp.ClientConfig `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` + configretry.BackOffConfig `mapstructure:"retry_on_failure"` // Compression encoding format, either empty string, gzip or deflate (default gzip) // Empty string means no compression // NOTE: CompressEncoding is deprecated and will be removed in an upcoming release - CompressEncoding configcompression.Type `mapstructure:"compress_encoding"` + CompressEncoding *configcompression.Type `mapstructure:"compress_encoding"` + // Max HTTP request body size in bytes before compression (if applied). // By default 1MB is recommended. MaxRequestBodySize int `mapstructure:"max_request_body_size"` @@ -62,24 +63,22 @@ type Config struct { // createDefaultClientConfig returns default http client settings func createDefaultClientConfig() confighttp.ClientConfig { - return confighttp.ClientConfig{ - Timeout: defaultTimeout, - Compression: DefaultCompressEncoding, - Auth: &configauth.Authentication{ - AuthenticatorID: component.NewID(sumologicextension.NewFactory().Type()), - }, + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Timeout = defaultTimeout + clientConfig.Compression = DefaultCompressEncoding + clientConfig.Auth = &configauth.Authentication{ + AuthenticatorID: component.NewID(sumologicextension.NewFactory().Type()), } + return clientConfig } func (cfg *Config) Validate() error { + if cfg.CompressEncoding != nil { + return errors.New("support for compress_encoding configuration has been removed, in favor of compression") + } - switch cfg.CompressEncoding { - case configcompression.TypeGzip: - case configcompression.TypeDeflate: - case NoCompression: - - default: - return fmt.Errorf("invalid compression encoding type: %v", cfg.CompressEncoding) + if cfg.ClientConfig.Timeout < 1 || cfg.ClientConfig.Timeout > maxTimeout { + return fmt.Errorf("timeout must be between 1 and 55 seconds, got %v", cfg.ClientConfig.Timeout) } switch cfg.ClientConfig.Compression { @@ -92,10 +91,6 @@ func (cfg *Config) Validate() error { return fmt.Errorf("invalid compression encoding type: %v", cfg.ClientConfig.Compression) } - if cfg.CompressEncoding != NoCompression && cfg.ClientConfig.Compression != DefaultCompressEncoding { - return fmt.Errorf("compress_encoding is deprecated and should not be used when compression is set to a non-default value") - } - switch cfg.LogFormat { case OTLPLogFormat: case JSONFormat: @@ -171,6 +166,8 @@ const ( TracesPipeline PipelineType = "traces" // defaultTimeout defaultTimeout time.Duration = 30 * time.Second + // maxTimeout + maxTimeout time.Duration = 55 * time.Second // DefaultCompress defines default Compress DefaultCompress bool = true // DefaultCompressEncoding defines default CompressEncoding diff --git a/exporter/sumologicexporter/config_test.go b/exporter/sumologicexporter/config_test.go index c182c0b47c19..03e74efcbf2b 100644 --- a/exporter/sumologicexporter/config_test.go +++ b/exporter/sumologicexporter/config_test.go @@ -6,6 +6,7 @@ package sumologicexporter // import "github.com/open-telemetry/opentelemetry-col import ( "errors" "testing" + "time" "github.com/stretchr/testify/assert" "go.opentelemetry.io/collector/component" @@ -13,6 +14,15 @@ import ( ) func TestInitExporterInvalidConfiguration(t *testing.T) { + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Endpoint = "test_endpoint" + clientConfig.Timeout = defaultTimeout + + clientConfigGzip := confighttp.NewDefaultClientConfig() + clientConfigGzip.Endpoint = "test_endpoint" + clientConfigGzip.Timeout = defaultTimeout + clientConfigGzip.Compression = "gzip" + testcases := []struct { name string cfg *Config @@ -24,10 +34,7 @@ func TestInitExporterInvalidConfiguration(t *testing.T) { cfg: &Config{ LogFormat: "test_format", MetricFormat: "otlp", - ClientConfig: confighttp.ClientConfig{ - Timeout: defaultTimeout, - Endpoint: "test_endpoint", - }, + ClientConfig: clientConfig, }, }, { @@ -36,11 +43,7 @@ func TestInitExporterInvalidConfiguration(t *testing.T) { cfg: &Config{ LogFormat: "json", MetricFormat: "test_format", - ClientConfig: confighttp.ClientConfig{ - Timeout: defaultTimeout, - Endpoint: "test_endpoint", - Compression: "gzip", - }, + ClientConfig: clientConfigGzip, }, }, { @@ -49,11 +52,7 @@ func TestInitExporterInvalidConfiguration(t *testing.T) { cfg: &Config{ LogFormat: "json", MetricFormat: "carbon2", - ClientConfig: confighttp.ClientConfig{ - Timeout: defaultTimeout, - Endpoint: "test_endpoint", - Compression: "gzip", - }, + ClientConfig: clientConfigGzip, }, }, { @@ -62,11 +61,7 @@ func TestInitExporterInvalidConfiguration(t *testing.T) { cfg: &Config{ LogFormat: "json", MetricFormat: "graphite", - ClientConfig: confighttp.ClientConfig{ - Timeout: defaultTimeout, - Endpoint: "test_endpoint", - Compression: "gzip", - }, + ClientConfig: clientConfigGzip, }, }, } @@ -84,3 +79,44 @@ func TestInitExporterInvalidConfiguration(t *testing.T) { }) } } + +func TestConfigInvalidTimeout(t *testing.T) { + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Timeout = 56 * time.Second + + clientConfigZeroTimeout := confighttp.NewDefaultClientConfig() + clientConfigZeroTimeout.Timeout = 0 * time.Second + testcases := []struct { + name string + expectedError error + cfg *Config + }{ + { + name: "over the limit timeout", + expectedError: errors.New("timeout must be between 1 and 55 seconds, got 56s"), + cfg: &Config{ + ClientConfig: clientConfig, + }, + }, + { + name: "less than 1 timeout", + expectedError: errors.New("timeout must be between 1 and 55 seconds, got 0s"), + cfg: &Config{ + ClientConfig: clientConfigZeroTimeout, + }, + }, + } + + for _, tc := range testcases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + err := tc.cfg.Validate() + + if tc.expectedError != nil { + assert.EqualError(t, err, tc.expectedError.Error()) + } else { + assert.NoError(t, err) + } + }) + } +} diff --git a/exporter/sumologicexporter/documentation.md b/exporter/sumologicexporter/documentation.md new file mode 100644 index 000000000000..895776e944fe --- /dev/null +++ b/exporter/sumologicexporter/documentation.md @@ -0,0 +1,39 @@ +[comment]: <> (Code generated by mdatagen. DO NOT EDIT.) + +# sumologic + +## Internal Telemetry + +The following telemetry is emitted by this component. + +### otelcol_exporter_requests_bytes + +Total size of requests (in bytes) + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| By | Sum | Int | true | + +### otelcol_exporter_requests_duration + +Duration of HTTP requests (in milliseconds) + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| ms | Sum | Int | true | + +### otelcol_exporter_requests_records + +Total size of requests (in number of records) + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| {records} | Sum | Int | true | + +### otelcol_exporter_requests_sent + +Number of requests + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| 1 | Sum | Int | true | diff --git a/exporter/sumologicexporter/exporter.go b/exporter/sumologicexporter/exporter.go index 29df62456ba8..9659b5f240f1 100644 --- a/exporter/sumologicexporter/exporter.go +++ b/exporter/sumologicexporter/exporter.go @@ -14,6 +14,7 @@ import ( "sync" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/consumer/consumererror" "go.opentelemetry.io/collector/exporter" "go.opentelemetry.io/collector/exporter/exporterhelper" @@ -21,8 +22,10 @@ import ( "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" + "go.opentelemetry.io/collector/pipeline" "go.uber.org/zap" + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sumologicexporter/internal/metadata" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/sumologicextension" ) @@ -55,17 +58,24 @@ type sumologicexporter struct { stickySessionCookieLock sync.RWMutex stickySessionCookie string - id component.ID + id component.ID + sender *sender + telemetryBuilder *metadata.TelemetryBuilder } -func initExporter(cfg *Config, createSettings exporter.CreateSettings) *sumologicexporter { +func initExporter(cfg *Config, set exporter.Settings) (*sumologicexporter, error) { + telemetryBuilder, err := metadata.NewTelemetryBuilder(set.TelemetrySettings) + if err != nil { + return nil, err + } se := &sumologicexporter{ config: cfg, - logger: createSettings.Logger, + logger: set.Logger, // NOTE: client is now set in start() prometheusFormatter: newPrometheusFormatter(), - id: createSettings.ID, + id: set.ID, foundSumologicExtension: false, + telemetryBuilder: telemetryBuilder, } se.logger.Info( @@ -74,24 +84,27 @@ func initExporter(cfg *Config, createSettings exporter.CreateSettings) *sumologi zap.String("metric_format", string(cfg.MetricFormat)), ) - return se + return se, nil } func newLogsExporter( ctx context.Context, - params exporter.CreateSettings, + params exporter.Settings, cfg *Config, ) (exporter.Logs, error) { - se := initExporter(cfg, params) + se, err := initExporter(cfg, params) + if err != nil { + return nil, err + } - return exporterhelper.NewLogsExporter( + return exporterhelper.NewLogs( ctx, params, cfg, se.pushLogsData, // Disable exporterhelper Timeout, since we are using a custom mechanism // within exporter itself - exporterhelper.WithTimeout(exporterhelper.TimeoutSettings{Timeout: 0}), + exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}), exporterhelper.WithRetry(cfg.BackOffConfig), exporterhelper.WithQueue(cfg.QueueSettings), exporterhelper.WithStart(se.start), @@ -101,19 +114,22 @@ func newLogsExporter( func newMetricsExporter( ctx context.Context, - params exporter.CreateSettings, + params exporter.Settings, cfg *Config, ) (exporter.Metrics, error) { - se := initExporter(cfg, params) + se, err := initExporter(cfg, params) + if err != nil { + return nil, err + } - return exporterhelper.NewMetricsExporter( + return exporterhelper.NewMetrics( ctx, params, cfg, se.pushMetricsData, // Disable exporterhelper Timeout, since we are using a custom mechanism // within exporter itself - exporterhelper.WithTimeout(exporterhelper.TimeoutSettings{Timeout: 0}), + exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}), exporterhelper.WithRetry(cfg.BackOffConfig), exporterhelper.WithQueue(cfg.QueueSettings), exporterhelper.WithStart(se.start), @@ -123,19 +139,22 @@ func newMetricsExporter( func newTracesExporter( ctx context.Context, - params exporter.CreateSettings, + params exporter.Settings, cfg *Config, ) (exporter.Traces, error) { - se := initExporter(cfg, params) + se, err := initExporter(cfg, params) + if err != nil { + return nil, err + } - return exporterhelper.NewTracesExporter( + return exporterhelper.NewTraces( ctx, params, cfg, se.pushTracesData, // Disable exporterhelper Timeout, since we are using a custom mechanism // within exporter itself - exporterhelper.WithTimeout(exporterhelper.TimeoutSettings{Timeout: 0}), + exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}), exporterhelper.WithRetry(cfg.BackOffConfig), exporterhelper.WithQueue(cfg.QueueSettings), exporterhelper.WithStart(se.start), @@ -155,10 +174,6 @@ func (se *sumologicexporter) configure(ctx context.Context) error { foundSumoExt bool ) - if se.config.CompressEncoding != NoCompression { - se.config.ClientConfig.Compression = se.config.CompressEncoding - } - httpSettings := se.config.ClientConfig for _, e := range se.host.GetExtensions() { @@ -204,15 +219,15 @@ func (se *sumologicexporter) configure(ctx context.Context) error { se.setDataURLs(logsURL.String(), metricsURL.String(), tracesURL.String()) case httpSettings.Endpoint != "": - logsURL, err := getSignalURL(se.config, httpSettings.Endpoint, component.DataTypeLogs) + logsURL, err := getSignalURL(se.config, httpSettings.Endpoint, pipeline.SignalLogs) if err != nil { return err } - metricsURL, err := getSignalURL(se.config, httpSettings.Endpoint, component.DataTypeMetrics) + metricsURL, err := getSignalURL(se.config, httpSettings.Endpoint, pipeline.SignalMetrics) if err != nil { return err } - tracesURL, err := getSignalURL(se.config, httpSettings.Endpoint, component.DataTypeTraces) + tracesURL, err := getSignalURL(se.config, httpSettings.Endpoint, pipeline.SignalTraces) if err != nil { return err } @@ -227,12 +242,28 @@ func (se *sumologicexporter) configure(ctx context.Context) error { return fmt.Errorf("no auth extension and no endpoint specified") } - client, err := httpSettings.ToClient(ctx, se.host, component.TelemetrySettings{}) + client, err := httpSettings.ToClient(ctx, se.host, componenttest.NewNopTelemetrySettings()) if err != nil { return fmt.Errorf("failed to create HTTP Client: %w", err) } se.setHTTPClient(client) + + logsURL, metricsURL, tracesURL := se.getDataURLs() + se.sender = newSender( + se.logger, + se.config, + se.getHTTPClient(), + se.prometheusFormatter, + metricsURL, + logsURL, + tracesURL, + se.StickySessionCookie, + se.SetStickySessionCookie, + se.id, + se.telemetryBuilder, + ) + return nil } @@ -269,23 +300,9 @@ func (se *sumologicexporter) shutdown(context.Context) error { // It returns the number of unsent logs and an error which contains a list of dropped records // so they can be handled by OTC retry mechanism func (se *sumologicexporter) pushLogsData(ctx context.Context, ld plog.Logs) error { - logsURL, metricsURL, tracesURL := se.getDataURLs() - sdr := newSender( - se.logger, - se.config, - se.getHTTPClient(), - se.prometheusFormatter, - metricsURL, - logsURL, - tracesURL, - se.StickySessionCookie, - se.SetStickySessionCookie, - se.id, - ) - // Follow different execution path for OTLP format - if sdr.config.LogFormat == OTLPLogFormat { - if err := sdr.sendOTLPLogs(ctx, ld); err != nil { + if se.sender.config.LogFormat == OTLPLogFormat { + if err := se.sender.sendOTLPLogs(ctx, ld); err != nil { se.handleUnauthorizedErrors(ctx, err) return consumererror.NewLogs(err, ld) } @@ -308,7 +325,7 @@ func (se *sumologicexporter) pushLogsData(ctx context.Context, ld plog.Logs) err currentMetadata := newFields(rl.Resource().Attributes()) - if droppedRecords, err := sdr.sendNonOTLPLogs(ctx, rl, currentMetadata); err != nil { + if droppedRecords, err := se.sender.sendNonOTLPLogs(ctx, rl, currentMetadata); err != nil { dropped = append(dropped, droppedResourceRecords{ resource: rl.Resource(), records: droppedRecords, @@ -346,29 +363,15 @@ func (se *sumologicexporter) pushLogsData(ctx context.Context, ld plog.Logs) err // it returns number of unsent metrics and error which contains list of dropped records // so they can be handle by the OTC retry mechanism func (se *sumologicexporter) pushMetricsData(ctx context.Context, md pmetric.Metrics) error { - logsURL, metricsURL, tracesURL := se.getDataURLs() - sdr := newSender( - se.logger, - se.config, - se.getHTTPClient(), - se.prometheusFormatter, - metricsURL, - logsURL, - tracesURL, - se.StickySessionCookie, - se.SetStickySessionCookie, - se.id, - ) - var droppedMetrics pmetric.Metrics var errs []error - if sdr.config.MetricFormat == OTLPMetricFormat { - if err := sdr.sendOTLPMetrics(ctx, md); err != nil { + if se.sender.config.MetricFormat == OTLPMetricFormat { + if err := se.sender.sendOTLPMetrics(ctx, md); err != nil { droppedMetrics = md errs = []error{err} } } else { - droppedMetrics, errs = sdr.sendNonOTLPMetrics(ctx, md) + droppedMetrics, errs = se.sender.sendNonOTLPMetrics(ctx, md) } if len(errs) > 0 { @@ -398,21 +401,7 @@ func (se *sumologicexporter) handleUnauthorizedErrors(ctx context.Context, errs } func (se *sumologicexporter) pushTracesData(ctx context.Context, td ptrace.Traces) error { - logsURL, metricsURL, tracesURL := se.getDataURLs() - sdr := newSender( - se.logger, - se.config, - se.getHTTPClient(), - se.prometheusFormatter, - metricsURL, - logsURL, - tracesURL, - se.StickySessionCookie, - se.SetStickySessionCookie, - se.id, - ) - - err := sdr.sendTraces(ctx, td) + err := se.sender.sendTraces(ctx, td) se.handleUnauthorizedErrors(ctx, err) return err } @@ -440,22 +429,22 @@ func (se *sumologicexporter) SetStickySessionCookie(stickySessionCookie string) // get the destination url for a given signal type // this mostly adds signal-specific suffixes if the format is otlp -func getSignalURL(oCfg *Config, endpointURL string, signal component.DataType) (string, error) { +func getSignalURL(oCfg *Config, endpointURL string, signal pipeline.Signal) (string, error) { url, err := url.Parse(endpointURL) if err != nil { return "", err } switch signal { - case component.DataTypeLogs: + case pipeline.SignalLogs: if oCfg.LogFormat != "otlp" { return url.String(), nil } - case component.DataTypeMetrics: + case pipeline.SignalMetrics: if oCfg.MetricFormat != "otlp" { return url.String(), nil } - case component.DataTypeTraces: + case pipeline.SignalTraces: default: return "", fmt.Errorf("unknown signal type: %s", signal) } diff --git a/exporter/sumologicexporter/exporter_test.go b/exporter/sumologicexporter/exporter_test.go index 596d4d85c81a..3347deb7e1a9 100644 --- a/exporter/sumologicexporter/exporter_test.go +++ b/exporter/sumologicexporter/exporter_test.go @@ -5,7 +5,6 @@ package sumologicexporter import ( "context" - "errors" "net/http" "net/http/httptest" "sync" @@ -15,17 +14,17 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/config/configcompression" "go.opentelemetry.io/collector/config/confighttp" + "go.opentelemetry.io/collector/config/configtls" "go.opentelemetry.io/collector/consumer/consumererror" - "go.opentelemetry.io/collector/exporter" + "go.opentelemetry.io/collector/exporter/exportertest" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" - "go.uber.org/zap" + "go.opentelemetry.io/collector/pipeline" ) func logRecordsToLogs(records []plog.LogRecord) plog.Logs { @@ -53,14 +52,6 @@ func createTestConfig() *Config { return config } -func createExporterCreateSettings() exporter.CreateSettings { - return exporter.CreateSettings{ - TelemetrySettings: component.TelemetrySettings{ - Logger: zap.NewNop(), - }, - } -} - // prepareExporterTest prepares an exporter test object using provided config // and a slice of callbacks to be called for subsequent requests coming being // sent to the server. @@ -90,7 +81,8 @@ func prepareExporterTest(t *testing.T, cfg *Config, cb []func(w http.ResponseWri cfg.ClientConfig.Endpoint = testServer.URL cfg.ClientConfig.Auth = nil - exp := initExporter(cfg, createExporterCreateSettings()) + exp, err := initExporter(cfg, exportertest.NewNopSettings()) + require.NoError(t, err) require.NoError(t, exp.start(context.Background(), componenttest.NewNopHost())) @@ -174,7 +166,7 @@ func TestLogsResourceAttributesSentAsFields(t *testing.T) { func TestAllFailed(t *testing.T) { test := prepareExporterTest(t, createTestConfig(), []func(w http.ResponseWriter, req *http.Request){ func(w http.ResponseWriter, req *http.Request) { - w.WriteHeader(500) + w.WriteHeader(http.StatusInternalServerError) body := extractBody(t, req) assert.Equal(t, "Example log\nAnother example log", body) @@ -199,7 +191,7 @@ func TestAllFailed(t *testing.T) { assert.EqualError(t, err, "failed sending data: status: 500 Internal Server Error") var partial consumererror.Logs - require.True(t, errors.As(err, &partial)) + require.ErrorAs(t, err, &partial) assert.Equal(t, logsExpected, partial.Data()) } @@ -212,7 +204,7 @@ func TestPartiallyFailed(t *testing.T) { assert.Empty(t, req.Header.Get("X-Sumo-Fields")) }, func(w http.ResponseWriter, req *http.Request) { - w.WriteHeader(500) + w.WriteHeader(http.StatusInternalServerError) body := extractBody(t, req) assert.Equal(t, "Another example log", body) @@ -238,23 +230,26 @@ func TestPartiallyFailed(t *testing.T) { assert.EqualError(t, err, "failed sending data: status: 500 Internal Server Error") var partial consumererror.Logs - require.True(t, errors.As(err, &partial)) + require.ErrorAs(t, err, &partial) assert.Equal(t, logsExpected, partial.Data()) } func TestInvalidHTTPCLient(t *testing.T) { - exp := initExporter(&Config{ - ClientConfig: confighttp.ClientConfig{ - Endpoint: "test_endpoint", - CustomRoundTripper: func(_ http.RoundTripper) (http.RoundTripper, error) { - return nil, errors.New("roundTripperException") - }, + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Endpoint = "test_endpoint" + clientConfig.TLSSetting = configtls.ClientConfig{ + Config: configtls.Config{ + MinVersion: "invalid", }, - }, createExporterCreateSettings()) + } + exp, err := initExporter(&Config{ + ClientConfig: clientConfig, + }, exportertest.NewNopSettings()) + require.NoError(t, err) assert.EqualError(t, exp.start(context.Background(), componenttest.NewNopHost()), - "failed to create HTTP Client: roundTripperException", + "failed to create HTTP Client: failed to load TLS config: invalid TLS min_version: unsupported TLS version: \"invalid\"", ) } @@ -400,7 +395,7 @@ func TestAllMetricsFailed(t *testing.T) { name: "sent together when metrics under the same resource", callbacks: []func(w http.ResponseWriter, req *http.Request){ func(w http.ResponseWriter, req *http.Request) { - w.WriteHeader(500) + w.WriteHeader(http.StatusInternalServerError) body := extractBody(t, req) expected := `test.metric.data{test="test_value",test2="second_value"} 14500 1605534165000 @@ -426,7 +421,7 @@ gauge_metric_name{test="test_value",test2="second_value",remote_name="156955",ur name: "sent together when metrics under different resources", callbacks: []func(w http.ResponseWriter, req *http.Request){ func(w http.ResponseWriter, req *http.Request) { - w.WriteHeader(500) + w.WriteHeader(http.StatusInternalServerError) body := extractBody(t, req) expected := `test.metric.data{test="test_value",test2="second_value"} 14500 1605534165000 @@ -466,7 +461,7 @@ gauge_metric_name{foo="bar",remote_name="156955",url="http://another_url"} 245 1 assert.EqualError(t, err, tc.expectedError) var partial consumererror.Metrics - require.True(t, errors.As(err, &partial)) + require.ErrorAs(t, err, &partial) // TODO fix // assert.Equal(t, metrics, partial.GetMetrics()) }) @@ -513,7 +508,8 @@ func Benchmark_ExporterPushLogs(b *testing.B) { cfg := createConfig() cfg.ClientConfig.Endpoint = testServer.URL - exp := initExporter(cfg, createExporterCreateSettings()) + exp, err := initExporter(cfg, exportertest.NewNopSettings()) + require.NoError(b, err) require.NoError(b, exp.start(context.Background(), componenttest.NewNopHost())) defer func() { require.NoError(b, exp.shutdown(context.Background())) @@ -577,7 +573,7 @@ func TestSendEmptyTraces(t *testing.T) { func TestGetSignalURL(t *testing.T) { testCases := []struct { description string - signalType component.Type + signalType pipeline.Signal cfg Config endpointURL string expected string @@ -585,55 +581,55 @@ func TestGetSignalURL(t *testing.T) { }{ { description: "no change if log format not otlp", - signalType: component.DataTypeLogs, + signalType: pipeline.SignalLogs, cfg: Config{LogFormat: TextFormat}, endpointURL: "http://localhost", expected: "http://localhost", }, { description: "no change if metric format not otlp", - signalType: component.DataTypeMetrics, + signalType: pipeline.SignalMetrics, cfg: Config{MetricFormat: PrometheusFormat}, endpointURL: "http://localhost", expected: "http://localhost", }, { description: "always add suffix for traces if not present", - signalType: component.DataTypeTraces, + signalType: pipeline.SignalTraces, endpointURL: "http://localhost", expected: "http://localhost/v1/traces", }, { description: "always add suffix for logs if not present", - signalType: component.DataTypeLogs, + signalType: pipeline.SignalLogs, cfg: Config{LogFormat: OTLPLogFormat}, endpointURL: "http://localhost", expected: "http://localhost/v1/logs", }, { description: "always add suffix for metrics if not present", - signalType: component.DataTypeMetrics, + signalType: pipeline.SignalMetrics, cfg: Config{MetricFormat: OTLPMetricFormat}, endpointURL: "http://localhost", expected: "http://localhost/v1/metrics", }, { description: "no change if suffix already present", - signalType: component.DataTypeTraces, + signalType: pipeline.SignalTraces, endpointURL: "http://localhost/v1/traces", expected: "http://localhost/v1/traces", }, { description: "error if url invalid", - signalType: component.DataTypeTraces, + signalType: pipeline.SignalTraces, endpointURL: ":", errorMessage: `parse ":": missing protocol scheme`, }, { description: "error if signal type is unknown", - signalType: component.MustNewType("unknown"), + signalType: pipeline.Signal{}, endpointURL: "http://localhost", - errorMessage: `unknown signal type: unknown`, + errorMessage: `unknown signal type: `, }, } for _, tC := range testCases { diff --git a/exporter/sumologicexporter/factory.go b/exporter/sumologicexporter/factory.go index daab2a3c6800..ae1002883374 100644 --- a/exporter/sumologicexporter/factory.go +++ b/exporter/sumologicexporter/factory.go @@ -29,7 +29,7 @@ func NewFactory() exporter.Factory { } func createDefaultConfig() component.Config { - qs := exporterhelper.NewDefaultQueueSettings() + qs := exporterhelper.NewDefaultQueueConfig() qs.Enabled = false return &Config{ @@ -47,7 +47,7 @@ func createDefaultConfig() component.Config { func createLogsExporter( ctx context.Context, - params exporter.CreateSettings, + params exporter.Settings, cfg component.Config, ) (exporter.Logs, error) { exp, err := newLogsExporter(ctx, params, cfg.(*Config)) @@ -60,7 +60,7 @@ func createLogsExporter( func createMetricsExporter( ctx context.Context, - params exporter.CreateSettings, + params exporter.Settings, cfg component.Config, ) (exporter.Metrics, error) { exp, err := newMetricsExporter(ctx, params, cfg.(*Config)) @@ -73,7 +73,7 @@ func createMetricsExporter( func createTracesExporter( ctx context.Context, - params exporter.CreateSettings, + params exporter.Settings, cfg component.Config, ) (exporter.Traces, error) { exp, err := newTracesExporter(ctx, params, cfg.(*Config)) diff --git a/exporter/sumologicexporter/factory_test.go b/exporter/sumologicexporter/factory_test.go index 53bfac1b4241..7c04db07663e 100644 --- a/exporter/sumologicexporter/factory_test.go +++ b/exporter/sumologicexporter/factory_test.go @@ -26,25 +26,24 @@ func TestType(t *testing.T) { func TestCreateDefaultConfig(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() - qs := exporterhelper.NewDefaultQueueSettings() + qs := exporterhelper.NewDefaultQueueConfig() qs.Enabled = false - - assert.Equal(t, cfg, &Config{ + clientConfig := confighttp.NewDefaultClientConfig() + clientConfig.Timeout = 30 * time.Second + clientConfig.Compression = "gzip" + clientConfig.Auth = &configauth.Authentication{ + AuthenticatorID: component.NewID(metadata.Type), + } + assert.Equal(t, &Config{ MaxRequestBodySize: 1_048_576, LogFormat: "otlp", MetricFormat: "otlp", Client: "otelcol", - ClientConfig: confighttp.ClientConfig{ - Timeout: 30 * time.Second, - Compression: "gzip", - Auth: &configauth.Authentication{ - AuthenticatorID: component.NewID(metadata.Type), - }, - }, + ClientConfig: clientConfig, BackOffConfig: configretry.NewDefaultBackOffConfig(), QueueSettings: qs, - }) + }, cfg) assert.NoError(t, component.ValidateConfig(cfg)) } diff --git a/exporter/sumologicexporter/generated_component_telemetry_test.go b/exporter/sumologicexporter/generated_component_telemetry_test.go new file mode 100644 index 000000000000..a6f70aa059c4 --- /dev/null +++ b/exporter/sumologicexporter/generated_component_telemetry_test.go @@ -0,0 +1,84 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package sumologicexporter + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + sdkmetric "go.opentelemetry.io/otel/sdk/metric" + "go.opentelemetry.io/otel/sdk/metric/metricdata" + "go.opentelemetry.io/otel/sdk/metric/metricdata/metricdatatest" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/config/configtelemetry" + "go.opentelemetry.io/collector/exporter" + "go.opentelemetry.io/collector/exporter/exportertest" +) + +type componentTestTelemetry struct { + reader *sdkmetric.ManualReader + meterProvider *sdkmetric.MeterProvider +} + +func (tt *componentTestTelemetry) NewSettings() exporter.Settings { + set := exportertest.NewNopSettings() + set.ID = component.NewID(component.MustNewType("sumologic")) + set.TelemetrySettings = tt.newTelemetrySettings() + return set +} + +func (tt *componentTestTelemetry) newTelemetrySettings() component.TelemetrySettings { + set := componenttest.NewNopTelemetrySettings() + set.MeterProvider = tt.meterProvider + set.MetricsLevel = configtelemetry.LevelDetailed + return set +} + +func setupTestTelemetry() componentTestTelemetry { + reader := sdkmetric.NewManualReader() + return componentTestTelemetry{ + reader: reader, + meterProvider: sdkmetric.NewMeterProvider(sdkmetric.WithReader(reader)), + } +} + +func (tt *componentTestTelemetry) assertMetrics(t *testing.T, expected []metricdata.Metrics) { + var md metricdata.ResourceMetrics + require.NoError(t, tt.reader.Collect(context.Background(), &md)) + // ensure all required metrics are present + for _, want := range expected { + got := tt.getMetric(want.Name, md) + metricdatatest.AssertEqual(t, want, got, metricdatatest.IgnoreTimestamp()) + } + + // ensure no additional metrics are emitted + require.Equal(t, len(expected), tt.len(md)) +} + +func (tt *componentTestTelemetry) getMetric(name string, got metricdata.ResourceMetrics) metricdata.Metrics { + for _, sm := range got.ScopeMetrics { + for _, m := range sm.Metrics { + if m.Name == name { + return m + } + } + } + + return metricdata.Metrics{} +} + +func (tt *componentTestTelemetry) len(got metricdata.ResourceMetrics) int { + metricsCount := 0 + for _, sm := range got.ScopeMetrics { + metricsCount += len(sm.Metrics) + } + + return metricsCount +} + +func (tt *componentTestTelemetry) Shutdown(ctx context.Context) error { + return tt.meterProvider.Shutdown(ctx) +} diff --git a/exporter/sumologicexporter/generated_component_test.go b/exporter/sumologicexporter/generated_component_test.go index b3e3b420ec3b..168372548791 100644 --- a/exporter/sumologicexporter/generated_component_test.go +++ b/exporter/sumologicexporter/generated_component_test.go @@ -32,27 +32,27 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, { name: "metrics", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg) }, }, { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -64,9 +64,9 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) diff --git a/exporter/sumologicexporter/generated_package_test.go b/exporter/sumologicexporter/generated_package_test.go index f18b099d8cd7..06d9480a812b 100644 --- a/exporter/sumologicexporter/generated_package_test.go +++ b/exporter/sumologicexporter/generated_package_test.go @@ -9,5 +9,5 @@ import ( ) func TestMain(m *testing.M) { - goleak.VerifyTestMain(m, goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start")) + goleak.VerifyTestMain(m) } diff --git a/exporter/sumologicexporter/go.mod b/exporter/sumologicexporter/go.mod index c43e0e10ea46..a48d73635aea 100644 --- a/exporter/sumologicexporter/go.mod +++ b/exporter/sumologicexporter/go.mod @@ -1,23 +1,29 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sumologicexporter -go 1.21.0 +go 1.22.0 require ( - github.com/klauspost/compress v1.17.8 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/sumologicextension v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opencensus.io v0.24.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configauth v0.102.0 - go.opentelemetry.io/collector/config/configcompression v1.9.0 - go.opentelemetry.io/collector/config/confighttp v0.102.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/klauspost/compress v1.17.11 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/sumologicextension v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configauth v0.116.0 + go.opentelemetry.io/collector/config/configcompression v1.22.0 + go.opentelemetry.io/collector/config/confighttp v0.116.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 + go.opentelemetry.io/collector/config/configtls v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/pipeline v0.116.0 + go.opentelemetry.io/otel v1.32.0 + go.opentelemetry.io/otel/metric v1.32.0 + go.opentelemetry.io/otel/sdk/metric v1.32.0 + go.opentelemetry.io/otel/trace v1.32.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 @@ -25,64 +31,60 @@ require ( require ( github.com/Showmax/go-fqdn v1.0.0 // indirect - github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/ebitengine/purego v0.8.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/go-ps v1.0.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/rs/cors v1.10.1 // indirect - github.com/shirou/gopsutil/v3 v3.24.4 // indirect - github.com/shoenig/go-m1cpu v0.1.6 // indirect + github.com/rs/cors v1.11.1 // indirect + github.com/shirou/gopsutil/v4 v4.24.10 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configopaque v1.9.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/config/configopaque v1.22.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/consumer v1.22.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/sumologicexporter/go.sum b/exporter/sumologicexporter/go.sum index c14bf63512c9..618b0cdcada1 100644 --- a/exporter/sumologicexporter/go.sum +++ b/exporter/sumologicexporter/go.sum @@ -1,65 +1,35 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/Showmax/go-fqdn v1.0.0 h1:0rG5IbmVliNT5O19Mfuvna9LL7zlHyRfsSvBPZmF9tM= github.com/Showmax/go-fqdn v1.0.0/go.mod h1:SfrFBzmDCtCGrnHhoDjuvFnKsWjEQX/Q9ARZvOrJAko= -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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/BE= +github.com/ebitengine/purego v0.8.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= @@ -68,14 +38,14 @@ 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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -84,8 +54,6 @@ github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= -github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -93,40 +61,22 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= -github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= -github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= -github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= -github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= -github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/shirou/gopsutil/v4 v4.24.10 h1:7VOzPtfw/5YDU+jLEoBwXwxJbQetULywoSV4RYY7HkM= +github.com/shirou/gopsutil/v4 v4.24.10/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/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 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= @@ -135,60 +85,82 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -198,32 +170,19 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -231,18 +190,13 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -250,36 +204,14 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/exporter/sumologicexporter/internal/metadata/generated_status.go b/exporter/sumologicexporter/internal/metadata/generated_status.go index c80070ecf870..28a640f407d9 100644 --- a/exporter/sumologicexporter/internal/metadata/generated_status.go +++ b/exporter/sumologicexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("sumologic") + Type = component.MustNewType("sumologic") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sumologicexporter" ) const ( diff --git a/exporter/sumologicexporter/internal/metadata/generated_telemetry.go b/exporter/sumologicexporter/internal/metadata/generated_telemetry.go index 569f0d965551..262cfd33c0e0 100644 --- a/exporter/sumologicexporter/internal/metadata/generated_telemetry.go +++ b/exporter/sumologicexporter/internal/metadata/generated_telemetry.go @@ -3,15 +3,84 @@ package metadata import ( - "go.opentelemetry.io/collector/component" + "errors" + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/metric/noop" "go.opentelemetry.io/otel/trace" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configtelemetry" ) func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/sumologic") + return settings.MeterProvider.Meter("github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sumologicexporter") } func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/sumologic") + return settings.TracerProvider.Tracer("github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sumologicexporter") +} + +// TelemetryBuilder provides an interface for components to report telemetry +// as defined in metadata and user config. +type TelemetryBuilder struct { + meter metric.Meter + ExporterRequestsBytes metric.Int64Counter + ExporterRequestsDuration metric.Int64Counter + ExporterRequestsRecords metric.Int64Counter + ExporterRequestsSent metric.Int64Counter +} + +// TelemetryBuilderOption applies changes to default builder. +type TelemetryBuilderOption interface { + apply(*TelemetryBuilder) +} + +type telemetryBuilderOptionFunc func(mb *TelemetryBuilder) + +func (tbof telemetryBuilderOptionFunc) apply(mb *TelemetryBuilder) { + tbof(mb) +} + +// NewTelemetryBuilder provides a struct with methods to update all internal telemetry +// for a component +func NewTelemetryBuilder(settings component.TelemetrySettings, options ...TelemetryBuilderOption) (*TelemetryBuilder, error) { + builder := TelemetryBuilder{} + for _, op := range options { + op.apply(&builder) + } + builder.meter = Meter(settings) + var err, errs error + builder.ExporterRequestsBytes, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_exporter_requests_bytes", + metric.WithDescription("Total size of requests (in bytes)"), + metric.WithUnit("By"), + ) + errs = errors.Join(errs, err) + builder.ExporterRequestsDuration, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_exporter_requests_duration", + metric.WithDescription("Duration of HTTP requests (in milliseconds)"), + metric.WithUnit("ms"), + ) + errs = errors.Join(errs, err) + builder.ExporterRequestsRecords, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_exporter_requests_records", + metric.WithDescription("Total size of requests (in number of records)"), + metric.WithUnit("{records}"), + ) + errs = errors.Join(errs, err) + builder.ExporterRequestsSent, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_exporter_requests_sent", + metric.WithDescription("Number of requests"), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + return &builder, errs +} + +func getLeveledMeter(meter metric.Meter, cfgLevel, srvLevel configtelemetry.Level) metric.Meter { + if cfgLevel <= srvLevel { + return meter + } + return noop.Meter{} } diff --git a/exporter/sumologicexporter/internal/metadata/generated_telemetry_test.go b/exporter/sumologicexporter/internal/metadata/generated_telemetry_test.go index 9c43a5be65fc..56f300a2abe0 100644 --- a/exporter/sumologicexporter/internal/metadata/generated_telemetry_test.go +++ b/exporter/sumologicexporter/internal/metadata/generated_telemetry_test.go @@ -14,6 +14,7 @@ import ( nooptrace "go.opentelemetry.io/otel/trace/noop" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" ) type mockMeter struct { @@ -49,15 +50,25 @@ func TestProviders(t *testing.T) { meter := Meter(set) if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/sumologic", m.name) + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sumologicexporter", m.name) } else { require.Fail(t, "returned Meter not mockMeter") } tracer := Tracer(set) if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/sumologic", m.name) + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sumologicexporter", m.name) } else { require.Fail(t, "returned Meter not mockTracer") } } + +func TestNewTelemetryBuilder(t *testing.T) { + set := componenttest.NewNopTelemetrySettings() + applied := false + _, err := NewTelemetryBuilder(set, telemetryBuilderOptionFunc(func(b *TelemetryBuilder) { + applied = true + })) + require.NoError(t, err) + require.True(t, applied) +} diff --git a/exporter/sumologicexporter/internal/observability/observability.go b/exporter/sumologicexporter/internal/observability/observability.go deleted file mode 100644 index 8476713bd2c7..000000000000 --- a/exporter/sumologicexporter/internal/observability/observability.go +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package observability // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sumologicexporter/internal/observability" - -import ( - "context" - "fmt" - "time" - - "go.opencensus.io/stats" - "go.opencensus.io/stats/view" - "go.opencensus.io/tag" -) - -func init() { - err := view.Register( - viewRequestsSent, - viewRequestsDuration, - viewRequestsBytes, - viewRequestsRecords, - ) - if err != nil { - fmt.Printf("Failed to register sumologic exporter's views: %v\n", err) - } -} - -var ( - mRequestsSent = stats.Int64("exporter/requests/sent", "Number of requests", "1") - mRequestsDuration = stats.Int64("exporter/requests/duration", "Duration of HTTP requests (in milliseconds)", "0") - mRequestsBytes = stats.Int64("exporter/requests/bytes", "Total size of requests (in bytes)", "0") - mRequestsRecords = stats.Int64("exporter/requests/records", "Total size of requests (in number of records)", "0") - - statusKey, _ = tag.NewKey("status_code") // nolint:errcheck - endpointKey, _ = tag.NewKey("endpoint") // nolint:errcheck - pipelineKey, _ = tag.NewKey("pipeline") // nolint:errcheck - exporterKey, _ = tag.NewKey("exporter") // nolint:errcheck -) - -var viewRequestsSent = &view.View{ - Name: mRequestsSent.Name(), - Description: mRequestsSent.Description(), - Measure: mRequestsSent, - TagKeys: []tag.Key{statusKey, endpointKey, pipelineKey, exporterKey}, - Aggregation: view.Count(), -} - -var viewRequestsDuration = &view.View{ - Name: mRequestsDuration.Name(), - Description: mRequestsDuration.Description(), - Measure: mRequestsDuration, - TagKeys: []tag.Key{statusKey, endpointKey, pipelineKey, exporterKey}, - Aggregation: view.Sum(), -} - -var viewRequestsBytes = &view.View{ - Name: mRequestsBytes.Name(), - Description: mRequestsBytes.Description(), - Measure: mRequestsBytes, - TagKeys: []tag.Key{statusKey, endpointKey, pipelineKey, exporterKey}, - Aggregation: view.Sum(), -} - -var viewRequestsRecords = &view.View{ - Name: mRequestsRecords.Name(), - Description: mRequestsRecords.Description(), - Measure: mRequestsRecords, - TagKeys: []tag.Key{statusKey, endpointKey, pipelineKey, exporterKey}, - Aggregation: view.Sum(), -} - -// RecordRequestsSent increments the metric that records sent requests -func RecordRequestsSent(statusCode int, endpoint string, pipeline string, exporter string) error { - return stats.RecordWithTags( - context.Background(), - []tag.Mutator{ - tag.Insert(statusKey, fmt.Sprint(statusCode)), - tag.Insert(endpointKey, endpoint), - tag.Insert(pipelineKey, pipeline), - tag.Insert(exporterKey, exporter), - }, - mRequestsSent.M(int64(1)), - ) -} - -// RecordRequestsDuration update metric which records request duration -func RecordRequestsDuration(duration time.Duration, statusCode int, endpoint string, pipeline string, exporter string) error { - return stats.RecordWithTags( - context.Background(), - []tag.Mutator{ - tag.Insert(statusKey, fmt.Sprint(statusCode)), - tag.Insert(endpointKey, endpoint), - tag.Insert(pipelineKey, pipeline), - tag.Insert(exporterKey, exporter), - }, - mRequestsDuration.M(duration.Milliseconds()), - ) -} - -// RecordRequestsBytes update metric which records number of send bytes -func RecordRequestsBytes(bytes int64, statusCode int, endpoint string, pipeline string, exporter string) error { - return stats.RecordWithTags( - context.Background(), - []tag.Mutator{ - tag.Insert(statusKey, fmt.Sprint(statusCode)), - tag.Insert(endpointKey, endpoint), - tag.Insert(pipelineKey, pipeline), - tag.Insert(exporterKey, exporter), - }, - mRequestsBytes.M(bytes), - ) -} - -// RecordRequestsRecords update metric which records number of sent records -func RecordRequestsRecords(records int64, statusCode int, endpoint string, pipeline string, exporter string) error { - return stats.RecordWithTags( - context.Background(), - []tag.Mutator{ - tag.Insert(statusKey, fmt.Sprint(statusCode)), - tag.Insert(endpointKey, endpoint), - tag.Insert(pipelineKey, pipeline), - tag.Insert(exporterKey, exporter), - }, - mRequestsRecords.M(records), - ) -} diff --git a/exporter/sumologicexporter/internal/observability/observability_test.go b/exporter/sumologicexporter/internal/observability/observability_test.go deleted file mode 100644 index 321394115ac8..000000000000 --- a/exporter/sumologicexporter/internal/observability/observability_test.go +++ /dev/null @@ -1,177 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package observability // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sumologicexporter/internal/observability" - -import ( - "context" - "sort" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "go.opencensus.io/metric/metricdata" - "go.opencensus.io/metric/metricexport" -) - -type exporter struct { - pipe chan *metricdata.Metric -} - -func newExporter() *exporter { - return &exporter{ - make(chan *metricdata.Metric), - } -} - -// Run goroutine which is going to receive `after` metrics. -// Goroutine is writing to returned chan -func (e *exporter) ReturnAfter(after int) chan []*metricdata.Metric { - ch := make(chan []*metricdata.Metric) - go func() { - received := []*metricdata.Metric{} - for m := range e.pipe { - received = append(received, m) - if len(received) >= after { - break - } - } - ch <- received - }() - return ch -} - -// Write received metrics to data channel -func (e *exporter) ExportMetrics(_ context.Context, data []*metricdata.Metric) error { - for _, m := range data { - e.pipe <- m - } - return nil -} - -// Creates metrics reader and forward metrics from it to chData -// Sens empty structs to fail chan afterwards -func metricReader(chData chan []*metricdata.Metric, fail chan struct{}, count int) { - - // Add a manual retry mechanism in case there's a hiccup reading the - // metrics from producers in ReadAndExport(): we can wait for the metrics - // to come instead of failing because they didn't come right away. - for i := 0; i < 10; i++ { - e := newExporter() - ch := e.ReturnAfter(count) - go metricexport.NewReader().ReadAndExport(e) - - select { - case <-time.After(500 * time.Millisecond): - - case data := <-ch: - chData <- data - return - } - } - - fail <- struct{}{} -} - -// NOTE: -// This test can only be run with -count 1 because of static -// metricproducer.GlobalManager() used in metricexport.NewReader(). -func TestMetrics(t *testing.T) { - const ( - statusCode = 200 - endpoint = "some/uri" - pipeline = "metrics" - exporter = "sumologic/my-name" - bytesFunc = "bytes" - recordsFunc = "records" - durationFunc = "duration" - sentFunc = "sent" - ) - type testCase struct { - name string - bytes int64 - records int64 - recordFunc string - duration time.Duration - } - tests := []testCase{ - { - name: "exporter/requests/sent", - recordFunc: sentFunc, - }, - { - name: "exporter/requests/duration", - recordFunc: durationFunc, - duration: time.Millisecond, - }, - { - name: "exporter/requests/bytes", - recordFunc: bytesFunc, - bytes: 1, - }, - { - name: "exporter/requests/records", - recordFunc: recordsFunc, - records: 1, - }, - } - - var ( - fail = make(chan struct{}) - chData = make(chan []*metricdata.Metric) - ) - - go metricReader(chData, fail, len(tests)) - - for _, tt := range tests { - switch tt.recordFunc { - case sentFunc: - require.NoError(t, RecordRequestsSent(statusCode, endpoint, pipeline, exporter)) - case durationFunc: - require.NoError(t, RecordRequestsDuration(tt.duration, statusCode, endpoint, pipeline, exporter)) - case bytesFunc: - require.NoError(t, RecordRequestsBytes(tt.bytes, statusCode, endpoint, pipeline, exporter)) - case recordsFunc: - require.NoError(t, RecordRequestsRecords(tt.records, statusCode, endpoint, pipeline, exporter)) - } - } - - var data []*metricdata.Metric - select { - case <-fail: - t.Fatalf("timedout waiting for metrics to arrive") - case data = <-chData: - } - - sort.Slice(tests, func(i, j int) bool { - return tests[i].name < tests[j].name - }) - - sort.Slice(data, func(i, j int) bool { - return data[i].Descriptor.Name < data[j].Descriptor.Name - }) - - for i, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - require.Len(t, data, len(tests)) - d := data[i] - assert.Equal(t, tt.name, d.Descriptor.Name, "Expected %v at index %v, but got %v.", tt.name, i, d.Descriptor.Name) - require.Len(t, d.TimeSeries, 1) - require.Len(t, d.TimeSeries[0].Points, 1) - assert.Equal(t, d.TimeSeries[0].Points[0].Value, int64(1)) - - require.Len(t, d.TimeSeries[0].LabelValues, 4) - - require.True(t, d.TimeSeries[0].LabelValues[0].Present) - require.True(t, d.TimeSeries[0].LabelValues[1].Present) - require.True(t, d.TimeSeries[0].LabelValues[2].Present) - require.True(t, d.TimeSeries[0].LabelValues[3].Present) - - assert.Equal(t, d.TimeSeries[0].LabelValues[0].Value, "some/uri") - assert.Equal(t, d.TimeSeries[0].LabelValues[1].Value, "sumologic/my-name") - assert.Equal(t, d.TimeSeries[0].LabelValues[2].Value, "metrics") - assert.Equal(t, d.TimeSeries[0].LabelValues[3].Value, "200") - }) - } -} diff --git a/exporter/sumologicexporter/metadata.yaml b/exporter/sumologicexporter/metadata.yaml index b9347ba9334e..67a29974bfb4 100644 --- a/exporter/sumologicexporter/metadata.yaml +++ b/exporter/sumologicexporter/metadata.yaml @@ -1,5 +1,4 @@ type: sumologic -scope_name: otelcol/sumologic status: class: exporter @@ -7,13 +6,40 @@ status: beta: [metrics, logs, traces] distributions: [contrib] codeowners: - active: [aboguszewski-sumo, kkujawa-sumo, mat-rumian, rnishtala-sumo, sumo-drosiek, swiatekm-sumo] + active: [rnishtala-sumo, chan-tim-sumo] + emeritus: [aboguszewski-sumo, kasia-kujawa, mat-rumian, sumo-drosiek] # TODO: Update the exporter to pass the tests tests: skip_lifecycle: true - goleak: - ignore: - top: - # See https://github.com/census-instrumentation/opencensus-go/issues/1191 for more information. - - "go.opencensus.io/stats/view.(*worker).start" + +telemetry: + metrics: + exporter_requests_sent: + enabled: true + description: Number of requests + unit: "1" + sum: + value_type: int + monotonic: true + exporter_requests_duration: + enabled: true + description: Duration of HTTP requests (in milliseconds) + unit: ms + sum: + value_type: int + monotonic: true + exporter_requests_bytes: + enabled: true + description: Total size of requests (in bytes) + unit: By + sum: + value_type: int + monotonic: true + exporter_requests_records: + enabled: true + description: Total size of requests (in number of records) + unit: "{records}" + sum: + value_type: int + monotonic: true diff --git a/exporter/sumologicexporter/otlp_test.go b/exporter/sumologicexporter/otlp_test.go index 59ced8679518..3b77622147be 100644 --- a/exporter/sumologicexporter/otlp_test.go +++ b/exporter/sumologicexporter/otlp_test.go @@ -166,5 +166,4 @@ func addExpectedHistogramBuckets(metrics pmetric.MetricSlice) { dataPoint.SetTimestamp(timestamp2) dataPoint.SetIntValue(bucketCount) } - } diff --git a/exporter/sumologicexporter/sender.go b/exporter/sumologicexporter/sender.go index 65dc4b2f91a8..d52cfcbcdb3f 100644 --- a/exporter/sumologicexporter/sender.go +++ b/exporter/sumologicexporter/sender.go @@ -21,9 +21,11 @@ import ( "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric" "go.uber.org/zap" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sumologicexporter/internal/observability" + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sumologicexporter/internal/metadata" ) var ( @@ -122,6 +124,7 @@ type sender struct { stickySessionCookieFunc func() string setStickySessionCookieFunc func(string) id component.ID + telemetryBuilder *metadata.TelemetryBuilder } const ( @@ -153,6 +156,7 @@ func newSender( stickySessionCookieFunc func() string, setStickySessionCookieFunc func(string), id component.ID, + telemetryBuilder *metadata.TelemetryBuilder, ) *sender { return &sender{ logger: logger, @@ -165,6 +169,7 @@ func newSender( stickySessionCookieFunc: stickySessionCookieFunc, setStickySessionCookieFunc: setStickySessionCookieFunc, id: id, + telemetryBuilder: telemetryBuilder, } } @@ -210,7 +215,7 @@ func (s *sender) handleReceiverResponse(resp *http.Response) error { // API responds with a 200 or 204 with ConentLength set to 0 when all data // has been successfully ingested. - if resp.ContentLength == 0 && (resp.StatusCode == 200 || resp.StatusCode == 204) { + if resp.ContentLength == 0 && (resp.StatusCode == http.StatusOK || resp.StatusCode == http.StatusNoContent) { return nil } @@ -224,7 +229,7 @@ func (s *sender) handleReceiverResponse(resp *http.Response) error { // API responds with a 200 or 204 with a JSON body describing what issues // were encountered when processing the sent data. switch resp.StatusCode { - case 200, 204: + case http.StatusOK, http.StatusNoContent: if resp.ContentLength < 0 { s.logger.Warn("Unknown length of server response") return nil @@ -254,7 +259,7 @@ func (s *sender) handleReceiverResponse(resp *http.Response) error { l.Warn("There was an issue sending data") return nil - case 401: + case http.StatusUnauthorized: return errUnauthorized default: @@ -349,7 +354,6 @@ func (s *sender) logToJSON(record plog.LogRecord) (string, error) { enc := json.NewEncoder(nextLine) enc.SetEscapeHTML(false) err := enc.Encode(recordCopy.Attributes().AsRaw()) - if err != nil { return "", err } @@ -480,7 +484,6 @@ func (s *sender) sendNonOTLPMetrics(ctx context.Context, md pmetric.Metrics) (pm previousFields := newFields(rms.At(i - 1).Resource().Attributes()) previousSourceHeaders := getSourcesHeaders(previousFields) if !reflect.DeepEqual(previousSourceHeaders, currentSourceHeaders) && body.Len() > 0 { - if err := s.send(ctx, MetricsPipeline, body.toCountingReader(), previousFields); err != nil { errs = append(errs, err) for _, resource := range currentResources { @@ -532,7 +535,6 @@ func (s *sender) sendNonOTLPMetrics(ctx context.Context, md pmetric.Metrics) (pm } currentResources = append(currentResources, rm) - } if body.Len() > 0 { @@ -575,7 +577,6 @@ func (s *sender) appendAndMaybeSend( body *bodyBuilder, flds fields, ) (sent bool, err error) { - linesTotalLength := 0 for _, line := range lines { linesTotalLength += len(line) + 1 // count the newline as well @@ -698,6 +699,7 @@ func (s *sender) addRequestHeaders(req *http.Request, pipeline PipelineType, fld } return nil } + func (s *sender) recordMetrics(duration time.Duration, count int64, req *http.Request, resp *http.Response, pipeline PipelineType) { statusCode := 0 @@ -707,21 +709,16 @@ func (s *sender) recordMetrics(duration time.Duration, count int64, req *http.Re id := s.id.String() - if err := observability.RecordRequestsDuration(duration, statusCode, req.URL.String(), string(pipeline), id); err != nil { - s.logger.Debug("error for recording metric for request duration", zap.Error(err)) - } - - if err := observability.RecordRequestsBytes(req.ContentLength, statusCode, req.URL.String(), string(pipeline), id); err != nil { - s.logger.Debug("error for recording metric for sent bytes", zap.Error(err)) - } - - if err := observability.RecordRequestsRecords(count, statusCode, req.URL.String(), string(pipeline), id); err != nil { - s.logger.Debug("error for recording metric for sent records", zap.Error(err)) - } - - if err := observability.RecordRequestsSent(statusCode, req.URL.String(), string(pipeline), id); err != nil { - s.logger.Debug("error for recording metric for sent request", zap.Error(err)) - } + attrs := attribute.NewSet( + attribute.String("status_code", fmt.Sprint(statusCode)), + attribute.String("endpoint", req.URL.String()), + attribute.String("pipeline", string(pipeline)), + attribute.String("exporter", id), + ) + s.telemetryBuilder.ExporterRequestsDuration.Add(context.Background(), duration.Milliseconds(), metric.WithAttributeSet(attrs)) + s.telemetryBuilder.ExporterRequestsBytes.Add(context.Background(), req.ContentLength, metric.WithAttributeSet(attrs)) + s.telemetryBuilder.ExporterRequestsRecords.Add(context.Background(), count, metric.WithAttributeSet(attrs)) + s.telemetryBuilder.ExporterRequestsSent.Add(context.Background(), 1, metric.WithAttributeSet(attrs)) } func (s *sender) addStickySessionCookie(req *http.Request) { diff --git a/exporter/sumologicexporter/sender_test.go b/exporter/sumologicexporter/sender_test.go index d451e78d056e..ea7ada4f09d2 100644 --- a/exporter/sumologicexporter/sender_test.go +++ b/exporter/sumologicexporter/sender_test.go @@ -30,6 +30,8 @@ import ( "go.opentelemetry.io/collector/pdata/ptrace" "go.uber.org/zap" "go.uber.org/zap/zapcore" + + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sumologicexporter/internal/metadata" ) type senderTest struct { @@ -69,12 +71,12 @@ func prepareSenderTest(t *testing.T, compression configcompression.Type, cb []fu case configcompression.TypeDeflate: cfg.ClientConfig.Compression = configcompression.TypeDeflate default: - cfg.CompressEncoding = configcompression.TypeGzip + cfg.ClientConfig.Compression = configcompression.TypeGzip } cfg.ClientConfig.Auth = nil httpSettings := cfg.ClientConfig host := componenttest.NewNopHost() - client, err := httpSettings.ToClient(context.Background(), host, component.TelemetrySettings{}) + client, err := httpSettings.ToClient(context.Background(), host, componenttest.NewNopTelemetrySettings()) require.NoError(t, err) if err != nil { return nil @@ -91,6 +93,9 @@ func prepareSenderTest(t *testing.T, compression configcompression.Type, cb []fu logger, err := zap.NewDevelopment() require.NoError(t, err) + telemetryBuilder, err := metadata.NewTelemetryBuilder(componenttest.NewNopTelemetrySettings()) + require.NoError(t, err) + return &senderTest{ reqCounter: &reqCounter, srv: testServer, @@ -105,6 +110,7 @@ func prepareSenderTest(t *testing.T, compression configcompression.Type, cb []fu func() string { return "" }, func(string) {}, component.ID{}, + telemetryBuilder, ), } } @@ -323,13 +329,13 @@ func TestSendLogsSplit(t *testing.T) { func TestSendLogsSplitFailedOne(t *testing.T) { test := prepareSenderTest(t, NoCompression, []func(w http.ResponseWriter, req *http.Request){ func(w http.ResponseWriter, req *http.Request) { - w.WriteHeader(500) + w.WriteHeader(http.StatusInternalServerError) _, err := fmt.Fprintf( w, `{"id":"1TIRY-KGIVX-TPQRJ","errors":[{"code":"internal.error","message":"Internal server error."}]}`, ) - require.NoError(t, err) + assert.NoError(t, err) body := extractBody(t, req) assert.Equal(t, "Example log", body) @@ -362,13 +368,13 @@ func TestSendLogsSplitFailedOne(t *testing.T) { func TestSendLogsSplitFailedAll(t *testing.T) { test := prepareSenderTest(t, NoCompression, []func(w http.ResponseWriter, req *http.Request){ func(w http.ResponseWriter, req *http.Request) { - w.WriteHeader(500) + w.WriteHeader(http.StatusInternalServerError) body := extractBody(t, req) assert.Equal(t, "Example log", body) }, func(w http.ResponseWriter, req *http.Request) { - w.WriteHeader(404) + w.WriteHeader(http.StatusNotFound) body := extractBody(t, req) assert.Equal(t, "Another example log", body) @@ -681,7 +687,7 @@ func TestSendLogsJsonSplit(t *testing.T) { func TestSendLogsJsonSplitFailedOne(t *testing.T) { test := prepareSenderTest(t, NoCompression, []func(w http.ResponseWriter, req *http.Request){ func(w http.ResponseWriter, req *http.Request) { - w.WriteHeader(500) + w.WriteHeader(http.StatusInternalServerError) body := extractBody(t, req) @@ -726,7 +732,7 @@ func TestSendLogsJsonSplitFailedOne(t *testing.T) { func TestSendLogsJsonSplitFailedAll(t *testing.T) { test := prepareSenderTest(t, NoCompression, []func(w http.ResponseWriter, req *http.Request){ func(w http.ResponseWriter, req *http.Request) { - w.WriteHeader(500) + w.WriteHeader(http.StatusInternalServerError) body := extractBody(t, req) @@ -735,7 +741,7 @@ func TestSendLogsJsonSplitFailedAll(t *testing.T) { assert.Regexp(t, regex, body) }, func(w http.ResponseWriter, req *http.Request) { - w.WriteHeader(404) + w.WriteHeader(http.StatusNotFound) body := extractBody(t, req) @@ -978,10 +984,10 @@ func TestInvalidPipeline(t *testing.T) { func TestSendCompressGzip(t *testing.T) { test := prepareSenderTest(t, configcompression.TypeGzip, []func(res http.ResponseWriter, req *http.Request){ func(res http.ResponseWriter, req *http.Request) { - res.WriteHeader(200) + res.WriteHeader(http.StatusOK) if _, err := res.Write([]byte("")); err != nil { res.WriteHeader(http.StatusInternalServerError) - assert.FailNow(t, "err: %v", err) + assert.Fail(t, "err: %v", err) return } body := decodeGzip(t, req.Body) @@ -999,10 +1005,10 @@ func TestSendCompressGzip(t *testing.T) { func TestSendCompressGzipDeprecated(t *testing.T) { test := prepareSenderTest(t, "default", []func(res http.ResponseWriter, req *http.Request){ func(res http.ResponseWriter, req *http.Request) { - res.WriteHeader(200) + res.WriteHeader(http.StatusOK) if _, err := res.Write([]byte("")); err != nil { res.WriteHeader(http.StatusInternalServerError) - assert.FailNow(t, "err: %v", err) + assert.Fail(t, "err: %v", err) return } body := decodeGzip(t, req.Body) @@ -1020,10 +1026,10 @@ func TestSendCompressGzipDeprecated(t *testing.T) { func TestSendCompressZstd(t *testing.T) { test := prepareSenderTest(t, configcompression.TypeZstd, []func(res http.ResponseWriter, req *http.Request){ func(res http.ResponseWriter, req *http.Request) { - res.WriteHeader(200) + res.WriteHeader(http.StatusOK) if _, err := res.Write([]byte("")); err != nil { res.WriteHeader(http.StatusInternalServerError) - assert.FailNow(t, "err: %v", err) + assert.Fail(t, "err: %v", err) return } body := decodeZstd(t, req.Body) @@ -1041,10 +1047,10 @@ func TestSendCompressZstd(t *testing.T) { func TestSendCompressDeflate(t *testing.T) { test := prepareSenderTest(t, configcompression.TypeDeflate, []func(res http.ResponseWriter, req *http.Request){ func(res http.ResponseWriter, req *http.Request) { - res.WriteHeader(200) + res.WriteHeader(http.StatusOK) if _, err := res.Write([]byte("")); err != nil { res.WriteHeader(http.StatusInternalServerError) - assert.FailNow(t, "err: %v", err) + assert.Fail(t, "err: %v", err) return } body := decodeZlib(t, req.Body) @@ -1120,9 +1126,9 @@ func TestSendOTLPHistogram(t *testing.T) { func(_ http.ResponseWriter, req *http.Request) { unmarshaler := pmetric.ProtoUnmarshaler{} body, err := io.ReadAll(req.Body) - require.NoError(t, err) + assert.NoError(t, err) metrics, err := unmarshaler.UnmarshalMetrics(body) - require.NoError(t, err) + assert.NoError(t, err) assert.Equal(t, 3, metrics.MetricCount()) assert.Equal(t, 16, metrics.DataPointCount()) }, @@ -1186,7 +1192,7 @@ func TestSendMetricsSplitBySource(t *testing.T) { func TestSendMetricsSplitFailedOne(t *testing.T) { test := prepareSenderTest(t, NoCompression, []func(w http.ResponseWriter, req *http.Request){ func(w http.ResponseWriter, req *http.Request) { - w.WriteHeader(500) + w.WriteHeader(http.StatusInternalServerError) body := extractBody(t, req) expected := `test.metric.data{test="test_value",test2="second_value"} 14500 1605534165000` @@ -1227,14 +1233,14 @@ func TestSendMetricsSplitFailedOne(t *testing.T) { func TestSendMetricsSplitFailedAll(t *testing.T) { test := prepareSenderTest(t, NoCompression, []func(w http.ResponseWriter, req *http.Request){ func(w http.ResponseWriter, req *http.Request) { - w.WriteHeader(500) + w.WriteHeader(http.StatusInternalServerError) body := extractBody(t, req) expected := `test.metric.data{test="test_value",test2="second_value"} 14500 1605534165000` assert.Equal(t, expected, body) }, func(w http.ResponseWriter, req *http.Request) { - w.WriteHeader(404) + w.WriteHeader(http.StatusNotFound) body := extractBody(t, req) expected := `` + @@ -1296,7 +1302,7 @@ func TestSendMetricsUnexpectedFormat(t *testing.T) { func TestBadRequestCausesPermanentError(t *testing.T) { test := prepareSenderTest(t, NoCompression, []func(w http.ResponseWriter, req *http.Request){ func(res http.ResponseWriter, _ *http.Request) { - res.WriteHeader(400) + res.WriteHeader(http.StatusBadRequest) }, }) test.s.config.MetricFormat = OTLPMetricFormat diff --git a/exporter/syslogexporter/README.md b/exporter/syslogexporter/README.md index 580a085f3086..da84b645e1ff 100644 --- a/exporter/syslogexporter/README.md +++ b/exporter/syslogexporter/README.md @@ -6,9 +6,9 @@ | Stability | [alpha]: logs | | Distributions | [contrib] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fsyslog%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fsyslog) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fsyslog%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fsyslog) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@kkujawa-sumo](https://www.github.com/kkujawa-sumo), [@rnishtala-sumo](https://www.github.com/rnishtala-sumo), [@andrzej-stencel](https://www.github.com/andrzej-stencel) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@kasia-kujawa](https://www.github.com/kasia-kujawa), [@rnishtala-sumo](https://www.github.com/rnishtala-sumo), [@andrzej-stencel](https://www.github.com/andrzej-stencel) | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib diff --git a/exporter/syslogexporter/config.go b/exporter/syslogexporter/config.go index 237278ef2c79..a07526d3d565 100644 --- a/exporter/syslogexporter/config.go +++ b/exporter/syslogexporter/config.go @@ -40,9 +40,9 @@ type Config struct { // TLSSetting struct exposes TLS client configuration. TLSSetting configtls.ClientConfig `mapstructure:"tls"` - exporterhelper.QueueSettings `mapstructure:"sending_queue"` - configretry.BackOffConfig `mapstructure:"retry_on_failure"` - exporterhelper.TimeoutSettings `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` + configretry.BackOffConfig `mapstructure:"retry_on_failure"` + TimeoutSettings exporterhelper.TimeoutConfig `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct } // Validate the configuration for errors. This is required by component.Config. diff --git a/exporter/syslogexporter/config_test.go b/exporter/syslogexporter/config_test.go index 870a83b96786..16d973c42bc1 100644 --- a/exporter/syslogexporter/config_test.go +++ b/exporter/syslogexporter/config_test.go @@ -10,7 +10,6 @@ import ( ) func TestValidate(t *testing.T) { - tests := []struct { name string cfg *Config diff --git a/exporter/syslogexporter/exporter.go b/exporter/syslogexporter/exporter.go index 566f2190e59b..99d69a9b01b3 100644 --- a/exporter/syslogexporter/exporter.go +++ b/exporter/syslogexporter/exporter.go @@ -25,7 +25,7 @@ type syslogexporter struct { formatter formatter } -func initExporter(cfg *Config, createSettings exporter.CreateSettings) (*syslogexporter, error) { +func initExporter(cfg *Config, createSettings exporter.Settings) (*syslogexporter, error) { var loadedTLSConfig *tls.Config if cfg.Network == string(confignet.TransportTypeTCP) { var err error @@ -54,7 +54,7 @@ func initExporter(cfg *Config, createSettings exporter.CreateSettings) (*sysloge func newLogsExporter( ctx context.Context, - params exporter.CreateSettings, + params exporter.Settings, cfg *Config, ) (exporter.Logs, error) { s, err := initExporter(cfg, params) @@ -62,7 +62,7 @@ func newLogsExporter( return nil, fmt.Errorf("failed to initialize the logs exporter: %w", err) } - return exporterhelper.NewLogsExporter( + return exporterhelper.NewLogs( ctx, params, cfg, @@ -73,18 +73,18 @@ func newLogsExporter( ) } -func (se *syslogexporter) pushLogsData(_ context.Context, logs plog.Logs) error { +func (se *syslogexporter) pushLogsData(ctx context.Context, logs plog.Logs) error { batchMessages := se.config.Network == string(confignet.TransportTypeTCP) var err error if batchMessages { - err = se.exportBatch(logs) + err = se.exportBatch(ctx, logs) } else { - err = se.exportNonBatch(logs) + err = se.exportNonBatch(ctx, logs) } return err } -func (se *syslogexporter) exportBatch(logs plog.Logs) error { +func (se *syslogexporter) exportBatch(ctx context.Context, logs plog.Logs) error { var payload strings.Builder for i := 0; i < logs.ResourceLogs().Len(); i++ { resourceLogs := logs.ResourceLogs().At(i) @@ -99,12 +99,12 @@ func (se *syslogexporter) exportBatch(logs plog.Logs) error { } if payload.Len() > 0 { - sender, err := connect(se.logger, se.config, se.tlsConfig) + sender, err := connect(ctx, se.logger, se.config, se.tlsConfig) if err != nil { return consumererror.NewLogs(err, logs) } defer sender.close() - err = sender.Write(payload.String()) + err = sender.Write(ctx, payload.String()) if err != nil { return consumererror.NewLogs(err, logs) } @@ -112,8 +112,8 @@ func (se *syslogexporter) exportBatch(logs plog.Logs) error { return nil } -func (se *syslogexporter) exportNonBatch(logs plog.Logs) error { - sender, err := connect(se.logger, se.config, se.tlsConfig) +func (se *syslogexporter) exportNonBatch(ctx context.Context, logs plog.Logs) error { + sender, err := connect(ctx, se.logger, se.config, se.tlsConfig) if err != nil { return consumererror.NewLogs(err, logs) } @@ -130,7 +130,7 @@ func (se *syslogexporter) exportNonBatch(logs plog.Logs) error { for k := 0; k < scopeLogs.LogRecords().Len(); k++ { logRecord := scopeLogs.LogRecords().At(k) formatted := se.formatter.format(logRecord) - err = sender.Write(formatted) + err = sender.Write(ctx, formatted) if err != nil { errs = append(errs, err) droppedLogRecord := droppedScopeLogs.LogRecords().AppendEmpty() diff --git a/exporter/syslogexporter/exporter_test.go b/exporter/syslogexporter/exporter_test.go index 189e89e73f40..3fc4691379a3 100644 --- a/exporter/syslogexporter/exporter_test.go +++ b/exporter/syslogexporter/exporter_test.go @@ -24,8 +24,10 @@ import ( "go.uber.org/zap" ) -var expectedForm = "<165>1 2003-08-24T12:14:15Z 192.0.2.1 myproc 8710 - - It's time to make the do-nuts.\n" -var originalForm = "<165>1 2003-08-24T05:14:15-07:00 192.0.2.1 myproc 8710 - - It's time to make the do-nuts." +var ( + expectedForm = "<165>1 2003-08-24T12:14:15Z 192.0.2.1 myproc 8710 - - It's time to make the do-nuts.\n" + originalForm = "<165>1 2003-08-24T05:14:15-07:00 192.0.2.1 myproc 8710 - - It's time to make the do-nuts." +) type exporterTest struct { srv net.TCPListener @@ -37,12 +39,14 @@ func exampleLog(t *testing.T) plog.LogRecord { buffer.Body().SetStr(originalForm) timestamp := "2003-08-24T05:14:15-07:00" timeStr, err := time.Parse(time.RFC3339, timestamp) - require.NoError(t, err, "failed to start test syslog server") + assert.NoError(t, err, "failed to start test syslog server") ts := pcommon.NewTimestampFromTime(timeStr) buffer.SetTimestamp(ts) - attrMap := map[string]any{"proc_id": "8710", "message": "It's time to make the do-nuts.", + attrMap := map[string]any{ + "proc_id": "8710", "message": "It's time to make the do-nuts.", "appname": "myproc", "hostname": "192.0.2.1", "priority": int64(165), - "version": int64(1)} + "version": int64(1), + } for k, v := range attrMap { if _, ok := v.(string); ok { buffer.Attributes().PutStr(k, v.(string)) @@ -61,8 +65,8 @@ func logRecordsToLogs(record plog.LogRecord) plog.Logs { return logs } -func createExporterCreateSettings() exporter.CreateSettings { - return exporter.CreateSettings{ +func createExporterCreateSettings() exporter.Settings { + return exporter.Settings{ TelemetrySettings: component.TelemetrySettings{ Logger: zap.NewNop(), }, @@ -70,10 +74,12 @@ func createExporterCreateSettings() exporter.CreateSettings { } func TestInitExporter(t *testing.T) { - _, err := initExporter(&Config{Endpoint: "test.com", + _, err := initExporter(&Config{ + Endpoint: "test.com", Network: "tcp", Port: 514, - Protocol: "rfc5424"}, createExporterCreateSettings()) + Protocol: "rfc5424", + }, createExporterCreateSettings()) assert.NoError(t, err) } @@ -130,7 +136,6 @@ func prepareExporterTest(t *testing.T, cfg *Config, invalidExporter bool) *expor srv: testServer, exp: exp, } - } func createTestConfig() *Config { @@ -148,7 +153,7 @@ func TestSyslogExportSuccess(t *testing.T) { buffer := exampleLog(t) logs := logRecordsToLogs(buffer) err := test.exp.pushLogsData(context.Background(), logs) - require.NoError(t, err, "could not send message") + assert.NoError(t, err, "could not send message") }() err := test.srv.SetDeadline(time.Now().Add(time.Second * 1)) require.NoError(t, err, "cannot set deadline") @@ -157,7 +162,7 @@ func TestSyslogExportSuccess(t *testing.T) { defer conn.Close() b, err := io.ReadAll(conn) require.NoError(t, err, "could not read all") - assert.Equal(t, string(b), expectedForm) + assert.Equal(t, expectedForm, string(b)) } func TestSyslogExportFail(t *testing.T) { @@ -168,7 +173,7 @@ func TestSyslogExportFail(t *testing.T) { consumerErr := test.exp.pushLogsData(context.Background(), logs) var consumerErrorLogs consumererror.Logs ok := errors.As(consumerErr, &consumerErrorLogs) - assert.Equal(t, ok, true) + assert.True(t, ok) consumerLogs := consumererror.Logs.Data(consumerErrorLogs) rls := consumerLogs.ResourceLogs() require.Equal(t, 1, rls.Len()) @@ -187,29 +192,32 @@ func TestSyslogExportFail(t *testing.T) { } func TestTLSConfig(t *testing.T) { - tests := []struct { name string network string tlsSettings configtls.ClientConfig tlsConfig *tls.Config }{ - {name: "TCP with TLS configuration", + { + name: "TCP with TLS configuration", network: "tcp", tlsSettings: configtls.ClientConfig{}, tlsConfig: &tls.Config{}, }, - {name: "TCP insecure", + { + name: "TCP insecure", network: "tcp", tlsSettings: configtls.ClientConfig{Insecure: true}, tlsConfig: nil, }, - {name: "UDP with TLS configuration", + { + name: "UDP with TLS configuration", network: "udp", tlsSettings: configtls.ClientConfig{}, tlsConfig: nil, }, - {name: "UDP insecure", + { + name: "UDP insecure", network: "udp", tlsSettings: configtls.ClientConfig{Insecure: true}, tlsConfig: nil, @@ -218,13 +226,14 @@ func TestTLSConfig(t *testing.T) { for _, testInstance := range tests { t.Run(testInstance.name, func(t *testing.T) { - exporter, err := initExporter( - &Config{Endpoint: "test.com", + &Config{ + Endpoint: "test.com", Network: testInstance.network, Port: 514, Protocol: "rfc5424", - TLSSetting: testInstance.tlsSettings}, + TLSSetting: testInstance.tlsSettings, + }, createExporterCreateSettings()) assert.NoError(t, err) @@ -233,7 +242,6 @@ func TestTLSConfig(t *testing.T) { } else { assert.Nil(t, exporter.tlsConfig) } - }) } } diff --git a/exporter/syslogexporter/factory.go b/exporter/syslogexporter/factory.go index 6234c41347de..a339aaa6e25b 100644 --- a/exporter/syslogexporter/factory.go +++ b/exporter/syslogexporter/factory.go @@ -25,7 +25,7 @@ func NewFactory() exporter.Factory { } func createDefaultConfig() component.Config { - qs := exporterhelper.NewDefaultQueueSettings() + qs := exporterhelper.NewDefaultQueueConfig() qs.Enabled = false return &Config{ @@ -34,13 +34,13 @@ func createDefaultConfig() component.Config { Protocol: DefaultProtocol, BackOffConfig: configretry.NewDefaultBackOffConfig(), QueueSettings: qs, - TimeoutSettings: exporterhelper.NewDefaultTimeoutSettings(), + TimeoutSettings: exporterhelper.NewDefaultTimeoutConfig(), } } func createLogsExporter( ctx context.Context, - params exporter.CreateSettings, + params exporter.Settings, cfg component.Config, ) (exporter.Logs, error) { exp, err := newLogsExporter(ctx, params, cfg.(*Config)) diff --git a/exporter/syslogexporter/factory_test.go b/exporter/syslogexporter/factory_test.go index 47cfc42a35d2..a511b1c2be97 100644 --- a/exporter/syslogexporter/factory_test.go +++ b/exporter/syslogexporter/factory_test.go @@ -24,11 +24,11 @@ func TestType(t *testing.T) { func TestCreateDefaultConfig(t *testing.T) { cfg := createDefaultConfig() - assert.Equal(t, cfg, &Config{ + assert.Equal(t, &Config{ Port: 514, Network: "tcp", Protocol: "rfc5424", - QueueSettings: exporterhelper.QueueSettings{ + QueueSettings: exporterhelper.QueueConfig{ Enabled: false, NumConsumers: 10, QueueSize: 1000, @@ -41,8 +41,8 @@ func TestCreateDefaultConfig(t *testing.T) { MaxInterval: 30 * time.Second, MaxElapsedTime: 5 * time.Minute, }, - TimeoutSettings: exporterhelper.TimeoutSettings{ + TimeoutSettings: exporterhelper.TimeoutConfig{ Timeout: 5 * time.Second, }, - }) + }, cfg) } diff --git a/exporter/syslogexporter/generated_component_test.go b/exporter/syslogexporter/generated_component_test.go index 0ca1b5a84049..3d42410075af 100644 --- a/exporter/syslogexporter/generated_component_test.go +++ b/exporter/syslogexporter/generated_component_test.go @@ -32,13 +32,13 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, } @@ -50,9 +50,9 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) diff --git a/exporter/syslogexporter/go.mod b/exporter/syslogexporter/go.mod index d2e12a1313d1..053178679a37 100644 --- a/exporter/syslogexporter/go.mod +++ b/exporter/syslogexporter/go.mod @@ -1,43 +1,49 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter -go 1.21.0 +go 1.22.0 require ( - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/confignet v0.102.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/collector/config/configtls v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/confignet v1.22.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/config/configtls v1.22.0 + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configopaque v1.9.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + go.opentelemetry.io/collector/config/configopaque v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect ) require ( @@ -50,16 +56,16 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/syslogexporter/go.sum b/exporter/syslogexporter/go.sum index b75b3c2081c5..e9e1b7ae5abf 100644 --- a/exporter/syslogexporter/go.sum +++ b/exporter/syslogexporter/go.sum @@ -1,28 +1,28 @@ -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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -31,8 +31,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -48,62 +48,76 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/confignet v0.102.0 h1:+wQevJ/iBnPxL+roY7WWnAjMxB8v4M5QrS3+0iEmauw= -go.opentelemetry.io/collector/config/confignet v0.102.0/go.mod h1:pfOrCTfSZEB6H2rKtx41/3RN4dKs+X2EKQbw3MGRh0E= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/confignet v1.22.0 h1:SBEMHJZWD8J4qgFw1O+BEkXW9AWldDi6Fz5YeDeoU58= +go.opentelemetry.io/collector/config/confignet v1.22.0/go.mod h1:ZppUH1hgUJOubawEsxsQ9MzEYFytqo2GnVSS7d4CVxc= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -119,20 +133,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -141,12 +155,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/exporter/syslogexporter/internal/metadata/generated_status.go b/exporter/syslogexporter/internal/metadata/generated_status.go index bc7d5416e680..cab66b9e64a2 100644 --- a/exporter/syslogexporter/internal/metadata/generated_status.go +++ b/exporter/syslogexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("syslog") + Type = component.MustNewType("syslog") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter" ) const ( diff --git a/exporter/syslogexporter/internal/metadata/generated_telemetry.go b/exporter/syslogexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index 168c564c6d1a..000000000000 --- a/exporter/syslogexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/syslog") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/syslog") -} diff --git a/exporter/syslogexporter/internal/metadata/generated_telemetry_test.go b/exporter/syslogexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index b196ba85a729..000000000000 --- a/exporter/syslogexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/syslog", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/syslog", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/syslogexporter/metadata.yaml b/exporter/syslogexporter/metadata.yaml index 27c15adc3dce..ddb18a13715e 100644 --- a/exporter/syslogexporter/metadata.yaml +++ b/exporter/syslogexporter/metadata.yaml @@ -1,5 +1,4 @@ type: syslog -scope_name: otelcol/syslog status: class: exporter @@ -7,7 +6,7 @@ status: alpha: [logs] distributions: [contrib] codeowners: - active: [kkujawa-sumo, rnishtala-sumo, andrzej-stencel] + active: [kasia-kujawa, rnishtala-sumo, andrzej-stencel] # TODO: Update the exporter to pass the tests tests: diff --git a/exporter/syslogexporter/rfc3164_formatter.go b/exporter/syslogexporter/rfc3164_formatter.go index 4298a2cb8406..17fa24ebb3ac 100644 --- a/exporter/syslogexporter/rfc3164_formatter.go +++ b/exporter/syslogexporter/rfc3164_formatter.go @@ -10,8 +10,7 @@ import ( "go.opentelemetry.io/collector/pdata/plog" ) -type rfc3164Formatter struct { -} +type rfc3164Formatter struct{} func newRFC3164Formatter() *rfc3164Formatter { return &rfc3164Formatter{} diff --git a/exporter/syslogexporter/rfc5424_formatter.go b/exporter/syslogexporter/rfc5424_formatter.go index f13398f84703..2efda82a3732 100644 --- a/exporter/syslogexporter/rfc5424_formatter.go +++ b/exporter/syslogexporter/rfc5424_formatter.go @@ -94,7 +94,6 @@ func (f *rfc5424Formatter) formatStructuredData(logRecord plog.LogRecord) string } } return fmt.Sprint(sdElements) - } func (f *rfc5424Formatter) formatMessage(logRecord plog.LogRecord) string { diff --git a/exporter/syslogexporter/rfc5424_formatter_test.go b/exporter/syslogexporter/rfc5424_formatter_test.go index e74a052e2e13..edf4e157ffc8 100644 --- a/exporter/syslogexporter/rfc5424_formatter_test.go +++ b/exporter/syslogexporter/rfc5424_formatter_test.go @@ -6,7 +6,6 @@ package syslogexporter import ( "fmt" "regexp" - "strings" "testing" "time" @@ -80,11 +79,11 @@ func TestRFC5424Formatter(t *testing.T) { assert.NoError(t, err) matched, err := regexp.MatchString(expectedRegex, actual) assert.NoError(t, err) - assert.True(t, matched, fmt.Sprintf("unexpected form of formatted message, formatted message: %s, regexp: %s", actual, expectedRegex)) - assert.True(t, strings.Contains(actual, "Realm=\"SecureAuth0\"")) - assert.True(t, strings.Contains(actual, "UserHostAddress=\"192.168.2.132\"")) - assert.True(t, strings.Contains(actual, "UserID=\"Tester2\"")) - assert.True(t, strings.Contains(actual, "PEN=\"27389\"")) + assert.Truef(t, matched, "unexpected form of formatted message, formatted message: %s, regexp: %s", actual, expectedRegex) + assert.Contains(t, actual, "Realm=\"SecureAuth0\"") + assert.Contains(t, actual, "UserHostAddress=\"192.168.2.132\"") + assert.Contains(t, actual, "UserID=\"Tester2\"") + assert.Contains(t, actual, "PEN=\"27389\"") // Test defaults expected = "<165>1 2003-08-24T12:14:15.000003Z - - - - -\n" diff --git a/exporter/syslogexporter/sender.go b/exporter/syslogexporter/sender.go index c807613a7001..60b08bf37027 100644 --- a/exporter/syslogexporter/sender.go +++ b/exporter/syslogexporter/sender.go @@ -4,6 +4,7 @@ package syslogexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter" import ( + "context" "crypto/tls" "fmt" "net" @@ -14,23 +15,31 @@ import ( "go.uber.org/zap" ) -const defaultPriority = 165 -const versionRFC5424 = 1 +const ( + defaultPriority = 165 + versionRFC5424 = 1 +) -const protocolRFC5424Str = "rfc5424" -const protocolRFC3164Str = "rfc3164" +const ( + protocolRFC5424Str = "rfc5424" + protocolRFC3164Str = "rfc3164" +) -const priority = "priority" -const version = "version" -const hostname = "hostname" -const app = "appname" -const pid = "proc_id" -const msgID = "msg_id" -const structuredData = "structured_data" -const message = "message" +const ( + priority = "priority" + version = "version" + hostname = "hostname" + app = "appname" + pid = "proc_id" + msgID = "msg_id" + structuredData = "structured_data" + message = "message" +) -const emptyValue = "-" -const emptyMessage = "" +const ( + emptyValue = "-" + emptyMessage = "" +) type sender struct { network string @@ -42,7 +51,7 @@ type sender struct { conn net.Conn } -func connect(logger *zap.Logger, cfg *Config, tlsConfig *tls.Config) (*sender, error) { +func connect(ctx context.Context, logger *zap.Logger, cfg *Config, tlsConfig *tls.Config) (*sender, error) { s := &sender{ logger: logger, network: cfg.Network, @@ -54,7 +63,7 @@ func connect(logger *zap.Logger, cfg *Config, tlsConfig *tls.Config) (*sender, e s.mu.Lock() defer s.mu.Unlock() - err := s.dial() + err := s.dial(ctx) if err != nil { return nil, err } @@ -73,21 +82,23 @@ func (s *sender) close() error { return nil } -func (s *sender) dial() error { +func (s *sender) dial(ctx context.Context) error { if s.conn != nil { s.conn.Close() s.conn = nil } var err error if s.tlsConfig != nil && s.network == string(confignet.TransportTypeTCP) { - s.conn, err = tls.Dial(s.network, s.addr, s.tlsConfig) + dialer := tls.Dialer{Config: s.tlsConfig} + s.conn, err = dialer.DialContext(ctx, s.network, s.addr) } else { - s.conn, err = net.Dial(s.network, s.addr) + dialer := new(net.Dialer) + s.conn, err = dialer.DialContext(ctx, s.network, s.addr) } return err } -func (s *sender) Write(msgStr string) error { +func (s *sender) Write(ctx context.Context, msgStr string) error { s.mu.Lock() defer s.mu.Unlock() @@ -96,12 +107,13 @@ func (s *sender) Write(msgStr string) error { return nil } } - if err := s.dial(); err != nil { + if err := s.dial(ctx); err != nil { return err } return s.write(msgStr) } + func (s *sender) write(msg string) error { // check if logs contains new line character at the end, if not add it if !strings.HasSuffix(msg, "\n") { diff --git a/exporter/tencentcloudlogserviceexporter/README.md b/exporter/tencentcloudlogserviceexporter/README.md index ba0d42d18ff2..14109e83a1f6 100644 --- a/exporter/tencentcloudlogserviceexporter/README.md +++ b/exporter/tencentcloudlogserviceexporter/README.md @@ -6,9 +6,10 @@ | Stability | [beta]: logs | | Distributions | [contrib] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Ftencentcloudlogservice%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Ftencentcloudlogservice) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Ftencentcloudlogservice%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Ftencentcloudlogservice) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@wgliang](https://www.github.com/wgliang), [@yiyang5055](https://www.github.com/yiyang5055) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@wgliang](https://www.github.com/wgliang) | +| Emeritus | [@yiyang5055](https://www.github.com/yiyang5055) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib diff --git a/exporter/tencentcloudlogserviceexporter/config_test.go b/exporter/tencentcloudlogserviceexporter/config_test.go index bf91735835bb..0136ab86923a 100644 --- a/exporter/tencentcloudlogserviceexporter/config_test.go +++ b/exporter/tencentcloudlogserviceexporter/config_test.go @@ -44,7 +44,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) diff --git a/exporter/tencentcloudlogserviceexporter/factory.go b/exporter/tencentcloudlogserviceexporter/factory.go index 532484f0f359..361bcce96d36 100644 --- a/exporter/tencentcloudlogserviceexporter/factory.go +++ b/exporter/tencentcloudlogserviceexporter/factory.go @@ -29,7 +29,7 @@ func createDefaultConfig() component.Config { func createLogsExporter( _ context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exp exporter.Logs, err error) { return newLogsExporter(set, cfg) diff --git a/exporter/tencentcloudlogserviceexporter/generated_component_test.go b/exporter/tencentcloudlogserviceexporter/generated_component_test.go index 94770ec39018..417e8a518289 100644 --- a/exporter/tencentcloudlogserviceexporter/generated_component_test.go +++ b/exporter/tencentcloudlogserviceexporter/generated_component_test.go @@ -32,13 +32,13 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg) }, }, } @@ -50,9 +50,9 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) diff --git a/exporter/tencentcloudlogserviceexporter/go.mod b/exporter/tencentcloudlogserviceexporter/go.mod index 7cf5cbc6e8d6..7cea55ca2ee9 100644 --- a/exporter/tencentcloudlogserviceexporter/go.mod +++ b/exporter/tencentcloudlogserviceexporter/go.mod @@ -1,64 +1,70 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/tencentcloudlogserviceexporter -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 github.com/pierrec/lz4 v2.6.1+incompatible - github.com/stretchr/testify v1.9.0 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.931 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/stretchr/testify v1.10.0 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1057 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/semconv v0.116.0 go.uber.org/zap v1.27.0 - google.golang.org/protobuf v1.34.1 + google.golang.org/protobuf v1.35.2 ) require ( - github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/frankban/quicktest v1.14.6 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configretry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/consumer v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + go.opentelemetry.io/collector/config/configretry v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/consumer v1.22.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/tencentcloudlogserviceexporter/go.sum b/exporter/tencentcloudlogserviceexporter/go.sum index ea15cae55ee9..9813840c3068 100644 --- a/exporter/tencentcloudlogserviceexporter/go.sum +++ b/exporter/tencentcloudlogserviceexporter/go.sum @@ -1,9 +1,5 @@ -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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -11,20 +7,24 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -33,8 +33,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -53,63 +53,77 @@ github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.931 h1:3kcyl2ZLEWH5pHlUfw1lNXbJ95WUJN1pzfYoOhAajZc= -github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.931/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1057 h1:By8G8urgbsLUyxSESOD037Kdl0Iy6j4btDINS06CNO0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1057/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -125,20 +139,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -147,12 +161,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/exporter/tencentcloudlogserviceexporter/internal/metadata/generated_status.go b/exporter/tencentcloudlogserviceexporter/internal/metadata/generated_status.go index 4b4ecbf8617b..e673c823227c 100644 --- a/exporter/tencentcloudlogserviceexporter/internal/metadata/generated_status.go +++ b/exporter/tencentcloudlogserviceexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("tencentcloud_logservice") + Type = component.MustNewType("tencentcloud_logservice") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/tencentcloudlogserviceexporter" ) const ( diff --git a/exporter/tencentcloudlogserviceexporter/internal/metadata/generated_telemetry.go b/exporter/tencentcloudlogserviceexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index 07f3e2fff9f1..000000000000 --- a/exporter/tencentcloudlogserviceexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/tencentcloudlogservice") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/tencentcloudlogservice") -} diff --git a/exporter/tencentcloudlogserviceexporter/internal/metadata/generated_telemetry_test.go b/exporter/tencentcloudlogserviceexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index a855de86a058..000000000000 --- a/exporter/tencentcloudlogserviceexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/tencentcloudlogservice", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/tencentcloudlogservice", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/tencentcloudlogserviceexporter/logs_exporter.go b/exporter/tencentcloudlogserviceexporter/logs_exporter.go index d427a7d8d5e9..98dad552308c 100644 --- a/exporter/tencentcloudlogserviceexporter/logs_exporter.go +++ b/exporter/tencentcloudlogserviceexporter/logs_exporter.go @@ -14,14 +14,14 @@ import ( ) // newLogsExporter return a new LogService logs exporter. -func newLogsExporter(set exporter.CreateSettings, cfg component.Config) (exporter.Logs, error) { +func newLogsExporter(set exporter.Settings, cfg component.Config) (exporter.Logs, error) { l := &logServiceLogsSender{ logger: set.Logger, } l.client = newLogServiceClient(cfg.(*Config), set.Logger) - return exporterhelper.NewLogsExporter( + return exporterhelper.NewLogs( context.TODO(), set, cfg, @@ -35,7 +35,8 @@ type logServiceLogsSender struct { func (s *logServiceLogsSender) pushLogsData( _ context.Context, - md plog.Logs) error { + md plog.Logs, +) error { var err error clsLogs := convertLogs(md) if len(clsLogs) > 0 { diff --git a/exporter/tencentcloudlogserviceexporter/logs_exporter_test.go b/exporter/tencentcloudlogserviceexporter/logs_exporter_test.go index 1306c9d4207b..a5dd952a2cbd 100644 --- a/exporter/tencentcloudlogserviceexporter/logs_exporter_test.go +++ b/exporter/tencentcloudlogserviceexporter/logs_exporter_test.go @@ -13,7 +13,7 @@ import ( "go.opentelemetry.io/collector/exporter/exportertest" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" ) func createSimpleLogData(numberOfLogs int) plog.Logs { @@ -39,7 +39,7 @@ func createSimpleLogData(numberOfLogs int) plog.Logs { } func TestNewLogsExporter(t *testing.T) { - got, err := newLogsExporter(exportertest.NewNopCreateSettings(), &Config{ + got, err := newLogsExporter(exportertest.NewNopSettings(), &Config{ Region: "ap-beijing", LogSet: "demo-logset", Topic: "demo-topic", @@ -53,7 +53,7 @@ func TestNewLogsExporter(t *testing.T) { } func TestNewFailsWithEmptyLogsExporterName(t *testing.T) { - got, err := newLogsExporter(exportertest.NewNopCreateSettings(), &Config{}) + got, err := newLogsExporter(exportertest.NewNopSettings(), &Config{}) assert.NoError(t, err) require.NotNil(t, got) } diff --git a/exporter/tencentcloudlogserviceexporter/logsdata_to_logservice.go b/exporter/tencentcloudlogserviceexporter/logsdata_to_logservice.go index 766ed741486d..4d16b95a9a3d 100644 --- a/exporter/tencentcloudlogserviceexporter/logsdata_to_logservice.go +++ b/exporter/tencentcloudlogserviceexporter/logsdata_to_logservice.go @@ -10,7 +10,7 @@ import ( "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "google.golang.org/protobuf/proto" cls "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/tencentcloudlogserviceexporter/proto" @@ -116,7 +116,8 @@ func instrumentationLibraryToLogContents(scope pcommon.InstrumentationScope) []* func mapLogRecordToLogService(lr plog.LogRecord, resourceContents, - instrumentationLibraryContents []*cls.Log_Content) *cls.Log { + instrumentationLibraryContents []*cls.Log_Content, +) *cls.Log { if lr.Body().Type() == pcommon.ValueTypeEmpty { return nil } diff --git a/exporter/tencentcloudlogserviceexporter/logsdata_to_logservice_test.go b/exporter/tencentcloudlogserviceexporter/logsdata_to_logservice_test.go index 3c388dc9dbcc..d8e57c495527 100644 --- a/exporter/tencentcloudlogserviceexporter/logsdata_to_logservice_test.go +++ b/exporter/tencentcloudlogserviceexporter/logsdata_to_logservice_test.go @@ -14,7 +14,7 @@ import ( "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" ) type logKeyValuePair struct { @@ -89,7 +89,7 @@ func TestConvertLogs(t *testing.T) { totalLogCount := 10 validLogCount := totalLogCount - 1 gotLogs := convertLogs(createLogData(10)) - assert.Equal(t, len(gotLogs), 9) + assert.Len(t, gotLogs, 9) gotLogPairs := make([][]logKeyValuePair, 0, len(gotLogs)) @@ -102,7 +102,6 @@ func TestConvertLogs(t *testing.T) { }) } gotLogPairs = append(gotLogPairs, pairs) - } wantLogs := make([][]logKeyValuePair, 0, validLogCount) diff --git a/exporter/tencentcloudlogserviceexporter/metadata.yaml b/exporter/tencentcloudlogserviceexporter/metadata.yaml index bc09f1221191..b63ded8b4d9a 100644 --- a/exporter/tencentcloudlogserviceexporter/metadata.yaml +++ b/exporter/tencentcloudlogserviceexporter/metadata.yaml @@ -1,5 +1,4 @@ type: tencentcloud_logservice -scope_name: otelcol/tencentcloudlogservice status: class: exporter @@ -7,7 +6,8 @@ status: beta: [logs] distributions: [contrib] codeowners: - active: [wgliang, yiyang5055] + active: [wgliang] + emeritus: [yiyang5055] # TODO: Update the exporter to pass the tests tests: diff --git a/exporter/zipkinexporter/README.md b/exporter/zipkinexporter/README.md index 97b53cd0172c..ce07fcf541be 100644 --- a/exporter/zipkinexporter/README.md +++ b/exporter/zipkinexporter/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fzipkin%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fzipkin) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fzipkin%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fzipkin) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@MovieStoreGuy](https://www.github.com/MovieStoreGuy), [@andrzej-stencel](https://www.github.com/andrzej-stencel), [@crobert-1](https://www.github.com/crobert-1) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [core]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib diff --git a/exporter/zipkinexporter/config.go b/exporter/zipkinexporter/config.go index 5f18554fa174..a4202794c38f 100644 --- a/exporter/zipkinexporter/config.go +++ b/exporter/zipkinexporter/config.go @@ -14,8 +14,8 @@ import ( // Config defines configuration settings for the Zipkin exporter. type Config struct { - exporterhelper.QueueSettings `mapstructure:"sending_queue"` - configretry.BackOffConfig `mapstructure:"retry_on_failure"` + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` + configretry.BackOffConfig `mapstructure:"retry_on_failure"` // Configures the exporter client. // The Endpoint to send the Zipkin trace data to (e.g.: http://some.url:9411/api/v2/spans). diff --git a/exporter/zipkinexporter/config_test.go b/exporter/zipkinexporter/config_test.go index db89e0619f7a..262f6e0c86d2 100644 --- a/exporter/zipkinexporter/config_test.go +++ b/exporter/zipkinexporter/config_test.go @@ -52,21 +52,21 @@ func TestLoadConfig(t *testing.T) { RandomizationFactor: backoff.DefaultRandomizationFactor, Multiplier: backoff.DefaultMultiplier, }, - QueueSettings: exporterhelper.QueueSettings{ + QueueSettings: exporterhelper.QueueConfig{ Enabled: true, NumConsumers: 2, QueueSize: 10, }, - ClientConfig: confighttp.ClientConfig{ - Endpoint: "https://somedest:1234/api/v2/spans", - WriteBufferSize: 524288, - Timeout: 5 * time.Second, - TLSSetting: configtls.ClientConfig{ + ClientConfig: withDefaultHTTPClientConfig(func(config *confighttp.ClientConfig) { + config.Endpoint = "https://somedest:1234/api/v2/spans" + config.WriteBufferSize = 524288 + config.Timeout = 5 * time.Second + config.TLSSetting = configtls.ClientConfig{ InsecureSkipVerify: true, - }, - MaxIdleConns: &maxIdleConns, - IdleConnTimeout: &idleConnTimeout, - }, + } + config.MaxIdleConns = &maxIdleConns + config.IdleConnTimeout = &idleConnTimeout + }), Format: "proto", DefaultServiceName: "test_name", }, @@ -80,10 +80,18 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) }) } } + +func withDefaultHTTPClientConfig(fns ...func(config *confighttp.ClientConfig)) confighttp.ClientConfig { + cfg := confighttp.NewDefaultClientConfig() + for _, fn := range fns { + fn(&cfg) + } + return cfg +} diff --git a/exporter/zipkinexporter/factory.go b/exporter/zipkinexporter/factory.go index d3d7f423f226..b853cbcb310e 100644 --- a/exporter/zipkinexporter/factory.go +++ b/exporter/zipkinexporter/factory.go @@ -38,7 +38,7 @@ func createDefaultConfig() component.Config { defaultClientHTTPSettings.WriteBufferSize = 512 * 1024 return &Config{ BackOffConfig: configretry.NewDefaultBackOffConfig(), - QueueSettings: exporterhelper.NewDefaultQueueSettings(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), ClientConfig: defaultClientHTTPSettings, Format: defaultFormat, DefaultServiceName: defaultServiceName, @@ -47,7 +47,7 @@ func createDefaultConfig() component.Config { func createTracesExporter( ctx context.Context, - set exporter.CreateSettings, + set exporter.Settings, cfg component.Config, ) (exporter.Traces, error) { zc := cfg.(*Config) @@ -56,14 +56,14 @@ func createTracesExporter( if err != nil { return nil, err } - return exporterhelper.NewTracesExporter( + return exporterhelper.NewTraces( ctx, set, cfg, ze.pushTraces, exporterhelper.WithStart(ze.start), // explicitly disable since we rely on http.Client timeout logic. - exporterhelper.WithTimeout(exporterhelper.TimeoutSettings{Timeout: 0}), + exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}), exporterhelper.WithQueue(zc.QueueSettings), exporterhelper.WithRetry(zc.BackOffConfig)) } diff --git a/exporter/zipkinexporter/factory_test.go b/exporter/zipkinexporter/factory_test.go index 808e02eef52d..e6c3db3dbdce 100644 --- a/exporter/zipkinexporter/factory_test.go +++ b/exporter/zipkinexporter/factory_test.go @@ -24,7 +24,7 @@ func TestCreateInstanceViaFactory(t *testing.T) { // URL doesn't have a default value so set it directly. zeCfg := cfg.(*Config) zeCfg.Endpoint = "http://some.location.org:9411/api/v2/spans" - ze, err := createTracesExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + ze, err := createTracesExporter(context.Background(), exportertest.NewNopSettings(), cfg) assert.NoError(t, err) assert.NotNil(t, ze) } diff --git a/exporter/zipkinexporter/generated_component_test.go b/exporter/zipkinexporter/generated_component_test.go index d8e7bb38f790..1ec6b97b44b5 100644 --- a/exporter/zipkinexporter/generated_component_test.go +++ b/exporter/zipkinexporter/generated_component_test.go @@ -32,13 +32,13 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) }{ { name: "traces", - createFn: func(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesExporter(ctx, set, cfg) + createFn: func(ctx context.Context, set exporter.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg) }, }, } @@ -50,21 +50,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), exportertest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(exporter.Logs) require.True(t, ok) diff --git a/exporter/zipkinexporter/go.mod b/exporter/zipkinexporter/go.mod index 8003487e28ab..23def9fc3d95 100644 --- a/exporter/zipkinexporter/go.mod +++ b/exporter/zipkinexporter/go.mod @@ -1,82 +1,88 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter -go 1.21.0 +go 1.22.0 require ( github.com/cenkalti/backoff/v4 v4.3.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.102.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.116.0 github.com/openzipkin/zipkin-go v0.4.3 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/confighttp v0.102.0 - go.opentelemetry.io/collector/config/configretry v0.102.0 - go.opentelemetry.io/collector/config/configtls v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/receiver v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/confighttp v0.116.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/config/configtls v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 go.uber.org/goleak v1.3.0 ) require ( - github.com/apache/thrift v0.20.0 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/apache/thrift v0.21.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect - github.com/jaegertracing/jaeger v1.57.0 // indirect + github.com/jaegertracing/jaeger v1.62.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/rs/cors v1.10.1 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/configopaque v1.9.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/semconv v0.102.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + github.com/rs/cors v1.11.1 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/component/componentstatus v0.116.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/configopaque v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/consumer v1.22.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/collector/semconv v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/exporter/zipkinexporter/go.sum b/exporter/zipkinexporter/go.sum index ef40db3c6325..21e1ef611969 100644 --- a/exporter/zipkinexporter/go.sum +++ b/exporter/zipkinexporter/go.sum @@ -1,28 +1,26 @@ -github.com/apache/thrift v0.20.0 h1:631+KvYbsBZxmuJjYwhezVsrfc/TbqtZV4QcxOX1fOI= -github.com/apache/thrift v0.20.0/go.mod h1:hOk1BQqcp2OLzGsyVXdfMk7YFlMxK3aoEVhjD06QhB8= -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/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE= +github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= @@ -32,20 +30,20 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/jaegertracing/jaeger v1.57.0 h1:3wDtUUPs6NRYH7+d+y8MilDkLHdpPrVlQ2wbcsA62bs= -github.com/jaegertracing/jaeger v1.57.0/go.mod h1:p/1fxIU9hKHl7qEhKC72p2ZYVhvvZvNB73y6V7YyuTs= +github.com/jaegertracing/jaeger v1.62.0 h1:YoaJ2e8oVz5sqGGlVAKSUCED8DzJ1q7PojBmZFNKoJA= +github.com/jaegertracing/jaeger v1.62.0/go.mod h1:jhEIHazwyb+a6xlRBi+p96BAvTYTSmGkghcwdQfV7FM= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -61,81 +59,102 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/openzipkin/zipkin-go v0.4.3 h1:9EGwpqkgnwdEIJ+Od7QVSEIH+ocmm5nPat0G7sjsSdg= github.com/openzipkin/zipkin-go v0.4.3/go.mod h1:M9wCJZFWCo2RiY+o1eBCEMe0Dp2S5LDHcMZmk3RmK7c= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector v0.111.0 h1:D3LJTYrrK2ac94E2PXPSbVkArqxbklbCLsE4MAJQdRo= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -151,20 +170,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -173,12 +192,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/exporter/zipkinexporter/internal/metadata/generated_status.go b/exporter/zipkinexporter/internal/metadata/generated_status.go index 9c236a37f600..ee966007d28d 100644 --- a/exporter/zipkinexporter/internal/metadata/generated_status.go +++ b/exporter/zipkinexporter/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("zipkin") + Type = component.MustNewType("zipkin") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter" ) const ( diff --git a/exporter/zipkinexporter/internal/metadata/generated_telemetry.go b/exporter/zipkinexporter/internal/metadata/generated_telemetry.go deleted file mode 100644 index 8a3acfd214ed..000000000000 --- a/exporter/zipkinexporter/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/zipkin") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/zipkin") -} diff --git a/exporter/zipkinexporter/internal/metadata/generated_telemetry_test.go b/exporter/zipkinexporter/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 2c30f80ce2c6..000000000000 --- a/exporter/zipkinexporter/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/zipkin", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/zipkin", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/exporter/zipkinexporter/metadata.yaml b/exporter/zipkinexporter/metadata.yaml index 61a9ba824a73..2d12aa880dbe 100644 --- a/exporter/zipkinexporter/metadata.yaml +++ b/exporter/zipkinexporter/metadata.yaml @@ -1,5 +1,4 @@ type: zipkin -scope_name: otelcol/zipkin status: class: exporter diff --git a/exporter/zipkinexporter/zipkin.go b/exporter/zipkinexporter/zipkin.go index 23e45bb13527..825a00277a69 100644 --- a/exporter/zipkinexporter/zipkin.go +++ b/exporter/zipkinexporter/zipkin.go @@ -74,7 +74,7 @@ func (ze *zipkinExporter) pushTraces(ctx context.Context, td ptrace.Traces) erro return consumererror.NewPermanent(fmt.Errorf("failed to push trace data via Zipkin exporter: %w", err)) } - req, err := http.NewRequestWithContext(ctx, "POST", ze.url, bytes.NewReader(body)) + req, err := http.NewRequestWithContext(ctx, http.MethodPost, ze.url, bytes.NewReader(body)) if err != nil { return fmt.Errorf("failed to push trace data via Zipkin exporter: %w", err) } diff --git a/exporter/zipkinexporter/zipkin_test.go b/exporter/zipkinexporter/zipkin_test.go index ac1753ab9f93..f42423aaf6a9 100644 --- a/exporter/zipkinexporter/zipkin_test.go +++ b/exporter/zipkinexporter/zipkin_test.go @@ -53,7 +53,7 @@ func TestZipkinExporter_roundtripJSON(t *testing.T) { }, Format: "json", } - zexp, err := NewFactory().CreateTracesExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + zexp, err := NewFactory().CreateTraces(context.Background(), exportertest.NewNopSettings(), cfg) assert.NoError(t, err) require.NotNil(t, zexp) @@ -70,7 +70,7 @@ func TestZipkinExporter_roundtripJSON(t *testing.T) { Endpoint: addr, }, } - zi, err := zipkinreceiver.NewFactory().CreateTracesReceiver(context.Background(), receivertest.NewNopCreateSettings(), recvCfg, zexp) + zi, err := zipkinreceiver.NewFactory().CreateTraces(context.Background(), receivertest.NewNopSettings(), recvCfg, zexp) assert.NoError(t, err) require.NotNil(t, zi) @@ -150,6 +150,7 @@ var _ zipkinreporter.Reporter = (*mockZipkinReporter)(nil) func (r *mockZipkinReporter) Send(span zipkinmodel.SpanModel) { r.batch = append(r.batch, &span) } + func (r *mockZipkinReporter) Close() error { return nil } @@ -175,7 +176,7 @@ func (r *mockZipkinReporter) Flush() error { return err } - req, err := http.NewRequest("POST", r.url, bytes.NewReader(body)) + req, err := http.NewRequest(http.MethodPost, r.url, bytes.NewReader(body)) if err != nil { return err } @@ -277,8 +278,8 @@ func TestZipkinExporter_invalidFormat(t *testing.T) { Format: "foobar", } f := NewFactory() - set := exportertest.NewNopCreateSettings() - _, err := f.CreateTracesExporter(context.Background(), set, config) + set := exportertest.NewNopSettings() + _, err := f.CreateTraces(context.Background(), set, config) require.Error(t, err) } @@ -300,7 +301,7 @@ func TestZipkinExporter_roundtripProto(t *testing.T) { }, Format: "proto", } - zexp, err := NewFactory().CreateTracesExporter(context.Background(), exportertest.NewNopCreateSettings(), cfg) + zexp, err := NewFactory().CreateTraces(context.Background(), exportertest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, zexp.Start(context.Background(), componenttest.NewNopHost())) @@ -318,7 +319,7 @@ func TestZipkinExporter_roundtripProto(t *testing.T) { Endpoint: addr, }, } - zi, err := zipkinreceiver.NewFactory().CreateTracesReceiver(context.Background(), receivertest.NewNopCreateSettings(), recvCfg, zexp) + zi, err := zipkinreceiver.NewFactory().CreateTraces(context.Background(), receivertest.NewNopSettings(), recvCfg, zexp) require.NoError(t, err) err = zi.Start(context.Background(), componenttest.NewNopHost()) diff --git a/extension/ackextension/README.md b/extension/ackextension/README.md index 5b21daae3812..4b6d1cf86e8b 100644 --- a/extension/ackextension/README.md +++ b/extension/ackextension/README.md @@ -3,12 +3,13 @@ | Status | | | ------------- |-----------| | Stability | [alpha] | -| Distributions | [contrib] | +| Distributions | [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fack%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fack) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fack%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fack) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@zpzhuSplunk](https://www.github.com/zpzhuSplunk), [@splunkericl](https://www.github.com/splunkericl) | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s This extension allows acking of data upon successful processing. The upstream agent can choose to send event again diff --git a/extension/ackextension/factory.go b/extension/ackextension/factory.go index 048d754423d2..e5d454c2776e 100644 --- a/extension/ackextension/factory.go +++ b/extension/ackextension/factory.go @@ -37,7 +37,7 @@ func createDefaultConfig() component.Config { } } -func createExtension(_ context.Context, _ extension.CreateSettings, cfg component.Config) (extension.Extension, error) { +func createExtension(_ context.Context, _ extension.Settings, cfg component.Config) (extension.Extension, error) { if cfg.(*Config).StorageID == nil { return newInMemoryAckExtension(cfg.(*Config)), nil } diff --git a/extension/ackextension/go.mod b/extension/ackextension/go.mod index 32ddddf10782..b8d386e833f0 100644 --- a/extension/ackextension/go.mod +++ b/extension/ackextension/go.mod @@ -1,49 +1,37 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension -go 1.21.0 +go 1.22.0 require ( github.com/hashicorp/golang-lru/v2 v2.0.7 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/extension v0.116.0 go.uber.org/goleak v1.3.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/knadh/koanf/maps v0.1.1 // indirect - github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect - github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/confmap v0.102.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/ackextension/go.sum b/extension/ackextension/go.sum index 7e42d57712a3..be093611b38a 100644 --- a/extension/ackextension/go.sum +++ b/extension/ackextension/go.sum @@ -1,76 +1,54 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= -github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= -github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= -github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -86,20 +64,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -108,12 +86,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/extension/ackextension/inmemory_test.go b/extension/ackextension/inmemory_test.go index 8e893866a5f7..1b9dc1fe0ee5 100644 --- a/extension/ackextension/inmemory_test.go +++ b/extension/ackextension/inmemory_test.go @@ -83,7 +83,7 @@ func TestExtensionAck_ProcessEvents_Concurrency(t *testing.T) { maps.Copy(map1, map2) maps.Copy(map1, map3) - require.Equal(t, len(map1), 300) + require.Len(t, map1, 300) } func TestExtensionAck_ProcessEvents_EventsUnAcked(t *testing.T) { @@ -104,10 +104,10 @@ func TestExtensionAck_ProcessEvents_EventsUnAcked(t *testing.T) { // non-acked events should be return false for i := 0; i < 100; i++ { result := ext.QueryAcks(fmt.Sprintf("part-%d", i), []uint64{0, 1, 2}) - require.Equal(t, len(result), 3) - require.Equal(t, result[0], false) - require.Equal(t, result[1], false) - require.Equal(t, result[2], false) + require.Len(t, result, 3) + require.False(t, result[0]) + require.False(t, result[1]) + require.False(t, result[2]) } } @@ -140,16 +140,16 @@ func TestExtensionAck_ProcessEvents_EventsAcked(t *testing.T) { for i := 0; i < 100; i++ { if i%2 == 0 { result := ext.QueryAcks(fmt.Sprintf("part-%d", i), []uint64{1, 2, 3}) - require.Equal(t, len(result), 3) - require.Equal(t, result[1], false) - require.Equal(t, result[2], true) - require.Equal(t, result[3], false) + require.Len(t, result, 3) + require.False(t, result[1]) + require.True(t, result[2]) + require.False(t, result[3]) } else { result := ext.QueryAcks(fmt.Sprintf("part-%d", i), []uint64{1, 2, 3}) - require.Equal(t, len(result), 3) - require.Equal(t, result[1], true) - require.Equal(t, result[2], false) - require.Equal(t, result[3], true) + require.Len(t, result, 3) + require.True(t, result[1]) + require.False(t, result[2]) + require.True(t, result[3]) } } } @@ -183,26 +183,26 @@ func TestExtensionAck_QueryAcks_Unidempotent(t *testing.T) { for i := 0; i < 100; i++ { if i%2 == 0 { result := ext.QueryAcks(fmt.Sprintf("part-%d", i), []uint64{1, 2, 3}) - require.Equal(t, len(result), 3) - require.Equal(t, result[1], false) - require.Equal(t, result[2], true) - require.Equal(t, result[3], false) + require.Len(t, result, 3) + require.False(t, result[1]) + require.True(t, result[2]) + require.False(t, result[3]) } else { result := ext.QueryAcks(fmt.Sprintf("part-%d", i), []uint64{1, 2, 3}) - require.Equal(t, len(result), 3) - require.Equal(t, result[1], true) - require.Equal(t, result[2], false) - require.Equal(t, result[3], true) + require.Len(t, result, 3) + require.True(t, result[1]) + require.False(t, result[2]) + require.True(t, result[3]) } } // querying the same acked events should result in false for i := 0; i < 100; i++ { result := ext.QueryAcks(fmt.Sprintf("part-%d", i), []uint64{1, 2, 3}) - require.Equal(t, len(result), 3) - require.Equal(t, result[1], false) - require.Equal(t, result[2], false) - require.Equal(t, result[3], false) + require.Len(t, result, 3) + require.False(t, result[1]) + require.False(t, result[2]) + require.False(t, result[3]) } } @@ -233,10 +233,10 @@ func TestExtensionAckAsync(t *testing.T) { // non-acked events should be return false for i := 0; i < partitionCount; i++ { result := ext.QueryAcks(fmt.Sprintf("part-%d", i), []uint64{1, 2, 3}) - require.Equal(t, len(result), 3) - require.Equal(t, result[1], false) - require.Equal(t, result[2], false) - require.Equal(t, result[3], false) + require.Len(t, result, 3) + require.False(t, result[1]) + require.False(t, result[2]) + require.False(t, result[3]) } wg.Add(partitionCount) @@ -259,16 +259,16 @@ func TestExtensionAckAsync(t *testing.T) { for i := 0; i < partitionCount; i++ { if i%2 == 0 { result := ext.QueryAcks(fmt.Sprintf("part-%d", i), []uint64{1, 2, 3}) - require.Equal(t, len(result), 3) - require.Equal(t, result[1], false) - require.Equal(t, result[2], true) - require.Equal(t, result[3], false) + require.Len(t, result, 3) + require.False(t, result[1]) + require.True(t, result[2]) + require.False(t, result[3]) } else { result := ext.QueryAcks(fmt.Sprintf("part-%d", i), []uint64{1, 2, 3}) - require.Equal(t, len(result), 3) - require.Equal(t, result[1], true) - require.Equal(t, result[2], false) - require.Equal(t, result[3], true) + require.Len(t, result, 3) + require.True(t, result[1]) + require.False(t, result[2]) + require.True(t, result[3]) } } wg.Add(100) @@ -285,9 +285,9 @@ func TestExtensionAckAsync(t *testing.T) { for i := 0; i < partitionCount; i++ { result := <-resultChan - require.Equal(t, len(result), 3) - require.Equal(t, result[1], false) - require.Equal(t, result[2], false) - require.Equal(t, result[3], false) + require.Len(t, result, 3) + require.False(t, result[1]) + require.False(t, result[2]) + require.False(t, result[3]) } } diff --git a/extension/ackextension/internal/metadata/generated_status.go b/extension/ackextension/internal/metadata/generated_status.go index 7838711aa2c4..0defabe04264 100644 --- a/extension/ackextension/internal/metadata/generated_status.go +++ b/extension/ackextension/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("ack") + Type = component.MustNewType("ack") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension" ) const ( diff --git a/extension/ackextension/internal/metadata/generated_telemetry.go b/extension/ackextension/internal/metadata/generated_telemetry.go deleted file mode 100644 index 1f5a4c110122..000000000000 --- a/extension/ackextension/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/ack") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/ack") -} diff --git a/extension/ackextension/internal/metadata/generated_telemetry_test.go b/extension/ackextension/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 291a1b117a95..000000000000 --- a/extension/ackextension/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/ack", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/ack", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/ackextension/metadata.yaml b/extension/ackextension/metadata.yaml index 6a5e6f5c3c5e..7bd6cbade047 100644 --- a/extension/ackextension/metadata.yaml +++ b/extension/ackextension/metadata.yaml @@ -1,11 +1,10 @@ type: ack -scope_name: otelcol/ack status: class: extension stability: alpha: [extension] - distributions: [contrib] + distributions: [contrib, k8s] codeowners: active: [zpzhuSplunk, splunkericl] diff --git a/extension/asapauthextension/README.md b/extension/asapauthextension/README.md index 2496ce6549b4..3da1a3c9d648 100644 --- a/extension/asapauthextension/README.md +++ b/extension/asapauthextension/README.md @@ -7,7 +7,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fasapauth%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fasapauth) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fasapauth%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fasapauth) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@jamesmoessis](https://www.github.com/jamesmoessis), [@MovieStoreGuy](https://www.github.com/MovieStoreGuy) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib diff --git a/extension/asapauthextension/config_test.go b/extension/asapauthextension/config_test.go index 4ac3950f4f40..e92a2636990f 100644 --- a/extension/asapauthextension/config_test.go +++ b/extension/asapauthextension/config_test.go @@ -69,7 +69,7 @@ func TestLoadConfig(t *testing.T) { cfg := factory.CreateDefaultConfig() sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) if tt.expectedErr != nil { assert.ErrorIs(t, component.ValidateConfig(cfg), tt.expectedErr) return diff --git a/extension/asapauthextension/extension_test.go b/extension/asapauthextension/extension_test.go index ea136105f4e4..865a1a76ec25 100644 --- a/extension/asapauthextension/extension_test.go +++ b/extension/asapauthextension/extension_test.go @@ -53,7 +53,7 @@ func TestRoundTripper(t *testing.T) { assert.NoError(t, err) assert.NotNil(t, roundTripper) - req := &http.Request{Method: "Get", Header: map[string][]string{}} + req := &http.Request{Method: http.MethodGet, Header: map[string][]string{}} resp, err := roundTripper.RoundTrip(req) assert.NoError(t, err) authHeaderValue := resp.Header.Get("Authorization") diff --git a/extension/asapauthextension/factory.go b/extension/asapauthextension/factory.go index a898276f402b..78dee116205f 100644 --- a/extension/asapauthextension/factory.go +++ b/extension/asapauthextension/factory.go @@ -22,7 +22,7 @@ func NewFactory() extension.Factory { ) } -func createExtension(_ context.Context, _ extension.CreateSettings, cfg component.Config) (extension.Extension, error) { +func createExtension(_ context.Context, _ extension.Settings, cfg component.Config) (extension.Extension, error) { return createASAPClientAuthenticator(cfg.(*Config)) } diff --git a/extension/asapauthextension/factory_test.go b/extension/asapauthextension/factory_test.go index 03af51dba516..f83e3320d275 100644 --- a/extension/asapauthextension/factory_test.go +++ b/extension/asapauthextension/factory_test.go @@ -29,7 +29,7 @@ func TestNewFactory(t *testing.T) { assert.NotNil(t, f) } -func TestCreateExtension(t *testing.T) { +func TestCreate(t *testing.T) { cfg := createDefaultConfig().(*Config) testKey := privateKey @@ -72,7 +72,7 @@ func TestCreateExtension(t *testing.T) { cfg.PrivateKey = testcase.settings.PrivateKey // validate extension creation - ext, err := createExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + ext, err := createExtension(context.Background(), extensiontest.NewNopSettings(), cfg) if testcase.shouldError { assert.Error(t, err) } else { diff --git a/extension/asapauthextension/go.mod b/extension/asapauthextension/go.mod index 90a6e6a45267..5b427d4ab538 100644 --- a/extension/asapauthextension/go.mod +++ b/extension/asapauthextension/go.mod @@ -1,55 +1,50 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/asapauthextension -go 1.21.0 +go 1.22.0 require ( - bitbucket.org/atlassian/go-asap/v2 v2.8.0 + bitbucket.org/atlassian/go-asap/v2 v2.9.0 github.com/SermoDigital/jose v0.9.2-0.20180104203859-803625baeddc - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/collector/extension/auth v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/auth v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 go.uber.org/multierr v1.11.0 - google.golang.org/grpc v1.64.0 + google.golang.org/grpc v1.68.1 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/pquerna/cachecontrol v0.1.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect github.com/vincent-petithory/dataurl v1.0.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/asapauthextension/go.sum b/extension/asapauthextension/go.sum index 6e6998863809..200b8a897800 100644 --- a/extension/asapauthextension/go.sum +++ b/extension/asapauthextension/go.sum @@ -1,24 +1,22 @@ -bitbucket.org/atlassian/go-asap/v2 v2.8.0 h1:JL4jktrZT3H8GHkkeJ1RCdhJ5YcOyVccA/2TJ4ae3I0= -bitbucket.org/atlassian/go-asap/v2 v2.8.0/go.mod h1:cuRgWb7eeGtsocKmqY2kPlMMlwpkeNh+QOIkjAMlUBc= +bitbucket.org/atlassian/go-asap/v2 v2.9.0 h1:ANKtdq/Q8w8RqTaJKIJitS+INbsOKeVv38iArFHWx0Q= +bitbucket.org/atlassian/go-asap/v2 v2.9.0/go.mod h1:cuRgWb7eeGtsocKmqY2kPlMMlwpkeNh+QOIkjAMlUBc= github.com/SermoDigital/jose v0.9.2-0.20161205224733-f6df55f235c2/go.mod h1:ARgCUhI1MHQH+ONky/PAtmVHQrP5JlGY0F3poXOp/fA= github.com/SermoDigital/jose v0.9.2-0.20180104203859-803625baeddc h1:MhBvG7RLaLqlyjxMR6of35vt6MVQ+eXMcgn9X/sy0FE= github.com/SermoDigital/jose v0.9.2-0.20180104203859-803625baeddc/go.mod h1:ARgCUhI1MHQH+ONky/PAtmVHQrP5JlGY0F3poXOp/fA= -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -30,8 +28,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -44,50 +42,44 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8cTqKc= github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/vincent-petithory/dataurl v1.0.0 h1:cXw+kPto8NLuJtlMsI152irrVw9fRDX8AbShPRpg2CI= github.com/vincent-petithory/dataurl v1.0.0/go.mod h1:FHafX5vmDzyP+1CQATJn7WFKc9CvnvxyvZy6I1MrG/U= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -103,23 +95,23 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -128,12 +120,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/extension/asapauthextension/internal/metadata/generated_status.go b/extension/asapauthextension/internal/metadata/generated_status.go index 61ca1dcf974a..cfd214c170ba 100644 --- a/extension/asapauthextension/internal/metadata/generated_status.go +++ b/extension/asapauthextension/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("asapclient") + Type = component.MustNewType("asapclient") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/asapauthextension" ) const ( diff --git a/extension/asapauthextension/internal/metadata/generated_telemetry.go b/extension/asapauthextension/internal/metadata/generated_telemetry.go deleted file mode 100644 index 594fecbd5c2d..000000000000 --- a/extension/asapauthextension/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/asapauth") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/asapauth") -} diff --git a/extension/asapauthextension/internal/metadata/generated_telemetry_test.go b/extension/asapauthextension/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index cf5caf17cb4b..000000000000 --- a/extension/asapauthextension/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/asapauth", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/asapauth", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/asapauthextension/metadata.yaml b/extension/asapauthextension/metadata.yaml index 293fc17253e7..d4ee4faac4f9 100644 --- a/extension/asapauthextension/metadata.yaml +++ b/extension/asapauthextension/metadata.yaml @@ -1,5 +1,4 @@ type: asapclient -scope_name: otelcol/asapauth status: class: extension diff --git a/extension/awsproxy/README.md b/extension/awsproxy/README.md index 02ac527f9932..103eef258750 100644 --- a/extension/awsproxy/README.md +++ b/extension/awsproxy/README.md @@ -7,7 +7,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fawsproxy%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fawsproxy) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fawsproxy%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fawsproxy) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@Aneurysm9](https://www.github.com/Aneurysm9), [@mxiamxia](https://www.github.com/mxiamxia) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib @@ -39,9 +39,9 @@ extensions: ### endpoint (Optional) The TCP address and port on which this proxy listens for requests. -Default: `0.0.0.0:2000` +Default: `localhost:2000` -The `component.UseLocalHostAsDefaultHost` feature gate changes this to localhost:2000. This will become the default in a future release. +See our [security best practices doc](https://opentelemetry.io/docs/security/config-best-practices/#protect-against-denial-of-service-attacks) to understand how to set the endpoint in different environments. ### proxy_address (Optional) diff --git a/extension/awsproxy/config.go b/extension/awsproxy/config.go index a2d0f5f0c9f3..a568feaf5caa 100644 --- a/extension/awsproxy/config.go +++ b/extension/awsproxy/config.go @@ -9,7 +9,6 @@ import ( // Config defines the configuration for an AWS X-Ray proxy. type Config struct { - // ProxyServer defines configurations related to the local TCP proxy server. ProxyConfig proxy.Config `mapstructure:",squash"` } diff --git a/extension/awsproxy/config_test.go b/extension/awsproxy/config_test.go index a6171a652990..9c105525a819 100644 --- a/extension/awsproxy/config_test.go +++ b/extension/awsproxy/config_test.go @@ -57,7 +57,7 @@ func TestLoadConfig(t *testing.T) { cfg := factory.CreateDefaultConfig() sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) diff --git a/extension/awsproxy/extension.go b/extension/awsproxy/extension.go index 8d8517fa51ba..dddaf7700b6e 100644 --- a/extension/awsproxy/extension.go +++ b/extension/awsproxy/extension.go @@ -9,6 +9,7 @@ import ( "net/http" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componentstatus" "go.opentelemetry.io/collector/extension" "go.uber.org/zap" @@ -24,16 +25,15 @@ type xrayProxy struct { var _ extension.Extension = (*xrayProxy)(nil) -func (x *xrayProxy) Start(_ context.Context, _ component.Host) error { +func (x *xrayProxy) Start(_ context.Context, host component.Host) error { srv, err := proxy.NewServer(&x.config.ProxyConfig, x.settings.Logger) - if err != nil { return err } x.server = srv go func() { if err := x.server.ListenAndServe(); !errors.Is(err, http.ErrServerClosed) && err != nil { - x.settings.ReportStatus(component.NewFatalErrorEvent(err)) + componentstatus.ReportStatus(host, componentstatus.NewFatalErrorEvent(err)) } }() x.logger.Info("X-Ray proxy server started on " + x.config.ProxyConfig.Endpoint) diff --git a/extension/awsproxy/factory.go b/extension/awsproxy/factory.go index 9c56133faceb..3c35cd3f4cba 100644 --- a/extension/awsproxy/factory.go +++ b/extension/awsproxy/factory.go @@ -13,7 +13,7 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy/internal/metadata" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/proxy" - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/localhostgate" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/testutil" ) const ( @@ -34,15 +34,13 @@ func createDefaultConfig() component.Config { return &Config{ ProxyConfig: proxy.Config{ TCPAddrConfig: confignet.TCPAddrConfig{ - Endpoint: localhostgate.EndpointForPort(defaultPort), - }, - TLSSetting: configtls.ClientConfig{ - Insecure: false, + Endpoint: testutil.EndpointForPort(defaultPort), }, + TLSSetting: configtls.NewDefaultClientConfig(), }, } } -func createExtension(_ context.Context, params extension.CreateSettings, cfg component.Config) (extension.Extension, error) { +func createExtension(_ context.Context, params extension.Settings, cfg component.Config) (extension.Extension, error) { return newXrayProxy(cfg.(*Config), params.TelemetrySettings) } diff --git a/extension/awsproxy/factory_test.go b/extension/awsproxy/factory_test.go index 79b5e8de33f9..ab26d5ace6aa 100644 --- a/extension/awsproxy/factory_test.go +++ b/extension/awsproxy/factory_test.go @@ -15,6 +15,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componentstatus" "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/config/confignet" "go.opentelemetry.io/collector/extension/extensiontest" @@ -28,7 +29,7 @@ func TestFactory_CreateDefaultConfig(t *testing.T) { assert.Equal(t, &Config{ ProxyConfig: proxy.Config{ TCPAddrConfig: confignet.TCPAddrConfig{ - Endpoint: "0.0.0.0:2000", + Endpoint: "localhost:2000", }, }, }, cfg) @@ -36,7 +37,7 @@ func TestFactory_CreateDefaultConfig(t *testing.T) { assert.NoError(t, componenttest.CheckConfigStruct(cfg)) } -func TestFactory_CreateExtension(t *testing.T) { +func TestFactory_Create(t *testing.T) { backend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { auth := r.Header.Get("Authorization") // Verify a signature was added, indicating the reverse proxy is doing its job. @@ -61,15 +62,18 @@ func TestFactory_CreateExtension(t *testing.T) { t.Setenv("AWS_SECRET_ACCESS_KEY", "fakeSecretAccessKey") ctx := context.Background() - cs := extensiontest.NewNopCreateSettings() - cs.ReportStatus = func(event *component.StatusEvent) { - assert.NoError(t, event.Err()) - } + cs := extensiontest.NewNopSettings() ext, err := createExtension(ctx, cs, cfg) assert.NoError(t, err) assert.NotNil(t, ext) - err = ext.Start(ctx, componenttest.NewNopHost()) + host := &nopHost{ + reportFunc: func(event *componentstatus.Event) { + assert.NoError(t, event.Err()) + }, + } + + err = ext.Start(ctx, host) assert.NoError(t, err) var resp *http.Response @@ -89,3 +93,17 @@ func TestFactory_CreateExtension(t *testing.T) { err = ext.Shutdown(ctx) assert.NoError(t, err) } + +var _ componentstatus.Reporter = (*nopHost)(nil) + +type nopHost struct { + reportFunc func(event *componentstatus.Event) +} + +func (nh *nopHost) GetExtensions() map[component.ID]component.Component { + return nil +} + +func (nh *nopHost) Report(event *componentstatus.Event) { + nh.reportFunc(event) +} diff --git a/extension/awsproxy/generated_component_test.go b/extension/awsproxy/generated_component_test.go index 642e736788a6..ed1ae4d09ff5 100644 --- a/extension/awsproxy/generated_component_test.go +++ b/extension/awsproxy/generated_component_test.go @@ -30,7 +30,7 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) t.Run("shutdown", func(t *testing.T) { - e, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + e, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) err = e.Shutdown(context.Background()) require.NoError(t, err) diff --git a/extension/awsproxy/go.mod b/extension/awsproxy/go.mod index eef1c102a125..e8e220f10cdb 100644 --- a/extension/awsproxy/go.mod +++ b/extension/awsproxy/go.mod @@ -1,59 +1,56 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/proxy v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/confignet v0.102.0 - go.opentelemetry.io/collector/config/configtls v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/proxy v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componentstatus v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/confignet v1.22.0 + go.opentelemetry.io/collector/config/configtls v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 go.uber.org/zap v1.27.0 ) require ( - github.com/aws/aws-sdk-go v1.53.11 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/aws/aws-sdk-go v1.55.5 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector/config/configopaque v1.9.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/config/configopaque v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/awsproxy/go.sum b/extension/awsproxy/go.sum index af20e0750697..39ba5fd19faf 100644 --- a/extension/awsproxy/go.sum +++ b/extension/awsproxy/go.sum @@ -1,23 +1,21 @@ -github.com/aws/aws-sdk-go v1.53.11 h1:KcmduYvX15rRqt4ZU/7jKkmDxU/G87LJ9MUI0yQJh00= -github.com/aws/aws-sdk-go v1.53.11/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= +github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -34,8 +32,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -46,51 +44,49 @@ github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zx github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/confignet v0.102.0 h1:+wQevJ/iBnPxL+roY7WWnAjMxB8v4M5QrS3+0iEmauw= -go.opentelemetry.io/collector/config/confignet v0.102.0/go.mod h1:pfOrCTfSZEB6H2rKtx41/3RN4dKs+X2EKQbw3MGRh0E= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/confignet v1.22.0 h1:SBEMHJZWD8J4qgFw1O+BEkXW9AWldDi6Fz5YeDeoU58= +go.opentelemetry.io/collector/config/confignet v1.22.0/go.mod h1:ZppUH1hgUJOubawEsxsQ9MzEYFytqo2GnVSS7d4CVxc= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -106,20 +102,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -128,12 +124,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/extension/awsproxy/internal/metadata/generated_status.go b/extension/awsproxy/internal/metadata/generated_status.go index 577abdfeba74..25ee091393f9 100644 --- a/extension/awsproxy/internal/metadata/generated_status.go +++ b/extension/awsproxy/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("awsproxy") + Type = component.MustNewType("awsproxy") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy" ) const ( diff --git a/extension/awsproxy/internal/metadata/generated_telemetry.go b/extension/awsproxy/internal/metadata/generated_telemetry.go deleted file mode 100644 index 3dcb08e7c38c..000000000000 --- a/extension/awsproxy/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/awsproxy") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/awsproxy") -} diff --git a/extension/awsproxy/internal/metadata/generated_telemetry_test.go b/extension/awsproxy/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index d818377f887a..000000000000 --- a/extension/awsproxy/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/awsproxy", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/awsproxy", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/awsproxy/metadata.yaml b/extension/awsproxy/metadata.yaml index 502d14e8104a..205c27c72bbd 100644 --- a/extension/awsproxy/metadata.yaml +++ b/extension/awsproxy/metadata.yaml @@ -1,5 +1,4 @@ type: awsproxy -scope_name: otelcol/awsproxy status: class: extension diff --git a/extension/basicauthextension/README.md b/extension/basicauthextension/README.md index 08d6e99bbd46..bc26a8316877 100644 --- a/extension/basicauthextension/README.md +++ b/extension/basicauthextension/README.md @@ -3,13 +3,14 @@ | Status | | | ------------- |-----------| | Stability | [beta] | -| Distributions | [contrib] | +| Distributions | [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fbasicauth%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fbasicauth) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fbasicauth%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fbasicauth) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@jpkrohling](https://www.github.com/jpkrohling), [@frzifus](https://www.github.com/frzifus) | | Emeritus | [@svrakitin](https://www.github.com/svrakitin) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s This extension implements both `configauth.ServerAuthenticator` and `configauth.ClientAuthenticator` to authenticate clients and servers using Basic Authentication. The authenticator type has to be set to `basicauth`. diff --git a/extension/basicauthextension/config.go b/extension/basicauthextension/config.go index 2a1cb40891fd..62aab9be2780 100644 --- a/extension/basicauthextension/config.go +++ b/extension/basicauthextension/config.go @@ -28,7 +28,6 @@ type ClientAuthSettings struct { Password configopaque.String `mapstructure:"password"` } type Config struct { - // Htpasswd settings. Htpasswd *HtpasswdSettings `mapstructure:"htpasswd,omitempty"` diff --git a/extension/basicauthextension/config_test.go b/extension/basicauthextension/config_test.go index c2dfa6f0f5fa..cd2d843f0afe 100644 --- a/extension/basicauthextension/config_test.go +++ b/extension/basicauthextension/config_test.go @@ -57,7 +57,7 @@ func TestLoadConfig(t *testing.T) { cfg := factory.CreateDefaultConfig() sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) if tt.expectedErr { assert.Error(t, component.ValidateConfig(cfg)) return diff --git a/extension/basicauthextension/extension.go b/extension/basicauthextension/extension.go index 08114aae258b..b1a24d2ab068 100644 --- a/extension/basicauthextension/extension.go +++ b/extension/basicauthextension/extension.go @@ -44,7 +44,6 @@ func newClientAuthExtension(cfg *Config) auth.Client { } func newServerAuthExtension(cfg *Config) (auth.Server, error) { - if cfg.Htpasswd == nil || (cfg.Htpasswd.File == "" && cfg.Htpasswd.Inline == "") { return nil, errNoCredentialSource } diff --git a/extension/basicauthextension/extension_test.go b/extension/basicauthextension/extension_test.go index 265689d0b6c6..2dab5cc5b8c7 100644 --- a/extension/basicauthextension/extension_test.go +++ b/extension/basicauthextension/extension_test.go @@ -17,33 +17,31 @@ import ( "go.opentelemetry.io/collector/component/componenttest" ) -var ( - credentials = [][]string{ - {"htpasswd-md5", "$apr1$FVVioVP7$ZdIWPG1p4E/ErujO7kA2n0"}, - {"openssl-apr1", "$apr1$peiE49Vv$lo.z77Z.6.a.Lm7GMjzQh0"}, - {"openssl-md5", "$1$mvmz31IB$U9KpHBLegga2doA0e3s3N0"}, - {"htpasswd-sha", "{SHA}vFznddje0Ht4+pmO0FaxwrUKN/M="}, - {"htpasswd-bcrypt", "$2y$10$Q6GeMFPd0dAxhQULPDdAn.DFy6NDmLaU0A7e2XoJz7PFYAEADFKbC"}, - {"", "$2a$06$DCq7YPn5Rq63x1Lad4cll.TV4S6ytwfsfvkgY8jIucDrjc8deX1s."}, - {"", "$2a$08$HqWuK6/Ng6sg9gQzbLrgb.Tl.ZHfXLhvt/SgVyWhQqgqcZ7ZuUtye"}, - {"", "$2a$10$k1wbIrmNyFAPwPVPSVa/zecw2BCEnBwVS2GbrmgzxFUOqW9dk4TCW"}, - {"", "$2a$12$k42ZFHFWqBp3vWli.nIn8uYyIkbvYRvodzbfbK18SSsY.CsIQPlxO"}, - {"a", "$2a$06$m0CrhHm10qJ3lXRY.5zDGO3rS2KdeeWLuGmsfGlMfOxih58VYVfxe"}, - {"a", "$2a$08$cfcvVd2aQ8CMvoMpP2EBfeodLEkkFJ9umNEfPD18.hUF62qqlC/V."}, - {"a", "$2a$10$k87L/MF28Q673VKh8/cPi.SUl7MU/rWuSiIDDFayrKk/1tBsSQu4u"}, - {"a", "$2a$12$8NJH3LsPrANStV6XtBakCez0cKHXVxmvxIlcz785vxAIZrihHZpeS"}, - {"abc", "$2a$06$If6bvum7DFjUnE9p2uDeDu0YHzrHM6tf.iqN8.yx.jNN1ILEf7h0i"}, - {"abcdefghijklmnopqrstuvwxyz", "$2a$06$.rCVZVOThsIa97pEDOxvGuRRgzG64bvtJ0938xuqzv18d3ZpQhstC"}, - {"abcdefghijklmnopqrstuvwxyz", "$2a$08$aTsUwsyowQuzRrDqFflhgekJ8d9/7Z3GV3UcgvzQW3J5zMyrTvlz."}, - {"abcdefghijklmnopqrstuvwxyz", "$2a$10$fVH8e28OQRj9tqiDXs1e1uxpsjN0c7II7YPKXua2NAKYvM6iQk7dq"}, - {"abcdefghijklmnopqrstuvwxyz", "$2a$12$D4G5f18o7aMMfwasBL7GpuQWuP3pkrZrOAnqP.bmezbMng.QwJ/pG"}, - {"~!@#$%^&*() ~!@#$%^&*()PNBFRD", "$2a$06$fPIsBO8qRqkjj273rfaOI.HtSV9jLDpTbZn782DC6/t7qT67P6FfO"}, - {"~!@#$%^&*() ~!@#$%^&*()PNBFRD", "$2a$08$Eq2r4G/76Wv39MzSX262huzPz612MZiYHVUJe/OcOql2jo4.9UxTW"}, - {"~!@#$%^&*() ~!@#$%^&*()PNBFRD", "$2a$10$LgfYWkbzEvQ4JakH7rOvHe0y8pHKF9OaFgwUZ2q7W2FFZmZzJYlfS"}, - {"~!@#$%^&*() ~!@#$%^&*()PNBFRD", "$2a$12$WApznUOJfkEGSmYRfnkrPOr466oFDCaj4b6HY3EXGvfxm43seyhgC"}, - {"ππππππππ", "$2a$10$.TtQJ4Jr6isd4Hp.mVfZeuh6Gws4rOQ/vdBczhDx.19NFK0Y84Dle"}, - } -) +var credentials = [][]string{ + {"htpasswd-md5", "$apr1$FVVioVP7$ZdIWPG1p4E/ErujO7kA2n0"}, + {"openssl-apr1", "$apr1$peiE49Vv$lo.z77Z.6.a.Lm7GMjzQh0"}, + {"openssl-md5", "$1$mvmz31IB$U9KpHBLegga2doA0e3s3N0"}, + {"htpasswd-sha", "{SHA}vFznddje0Ht4+pmO0FaxwrUKN/M="}, + {"htpasswd-bcrypt", "$2y$10$Q6GeMFPd0dAxhQULPDdAn.DFy6NDmLaU0A7e2XoJz7PFYAEADFKbC"}, + {"", "$2a$06$DCq7YPn5Rq63x1Lad4cll.TV4S6ytwfsfvkgY8jIucDrjc8deX1s."}, + {"", "$2a$08$HqWuK6/Ng6sg9gQzbLrgb.Tl.ZHfXLhvt/SgVyWhQqgqcZ7ZuUtye"}, + {"", "$2a$10$k1wbIrmNyFAPwPVPSVa/zecw2BCEnBwVS2GbrmgzxFUOqW9dk4TCW"}, + {"", "$2a$12$k42ZFHFWqBp3vWli.nIn8uYyIkbvYRvodzbfbK18SSsY.CsIQPlxO"}, + {"a", "$2a$06$m0CrhHm10qJ3lXRY.5zDGO3rS2KdeeWLuGmsfGlMfOxih58VYVfxe"}, + {"a", "$2a$08$cfcvVd2aQ8CMvoMpP2EBfeodLEkkFJ9umNEfPD18.hUF62qqlC/V."}, + {"a", "$2a$10$k87L/MF28Q673VKh8/cPi.SUl7MU/rWuSiIDDFayrKk/1tBsSQu4u"}, + {"a", "$2a$12$8NJH3LsPrANStV6XtBakCez0cKHXVxmvxIlcz785vxAIZrihHZpeS"}, + {"abc", "$2a$06$If6bvum7DFjUnE9p2uDeDu0YHzrHM6tf.iqN8.yx.jNN1ILEf7h0i"}, + {"abcdefghijklmnopqrstuvwxyz", "$2a$06$.rCVZVOThsIa97pEDOxvGuRRgzG64bvtJ0938xuqzv18d3ZpQhstC"}, + {"abcdefghijklmnopqrstuvwxyz", "$2a$08$aTsUwsyowQuzRrDqFflhgekJ8d9/7Z3GV3UcgvzQW3J5zMyrTvlz."}, + {"abcdefghijklmnopqrstuvwxyz", "$2a$10$fVH8e28OQRj9tqiDXs1e1uxpsjN0c7II7YPKXua2NAKYvM6iQk7dq"}, + {"abcdefghijklmnopqrstuvwxyz", "$2a$12$D4G5f18o7aMMfwasBL7GpuQWuP3pkrZrOAnqP.bmezbMng.QwJ/pG"}, + {"~!@#$%^&*() ~!@#$%^&*()PNBFRD", "$2a$06$fPIsBO8qRqkjj273rfaOI.HtSV9jLDpTbZn782DC6/t7qT67P6FfO"}, + {"~!@#$%^&*() ~!@#$%^&*()PNBFRD", "$2a$08$Eq2r4G/76Wv39MzSX262huzPz612MZiYHVUJe/OcOql2jo4.9UxTW"}, + {"~!@#$%^&*() ~!@#$%^&*()PNBFRD", "$2a$10$LgfYWkbzEvQ4JakH7rOvHe0y8pHKF9OaFgwUZ2q7W2FFZmZzJYlfS"}, + {"~!@#$%^&*() ~!@#$%^&*()PNBFRD", "$2a$12$WApznUOJfkEGSmYRfnkrPOr466oFDCaj4b6HY3EXGvfxm43seyhgC"}, + {"ππππππππ", "$2a$10$.TtQJ4Jr6isd4Hp.mVfZeuh6Gws4rOQ/vdBczhDx.19NFK0Y84Dle"}, +} func TestBasicAuth_Valid(t *testing.T) { t.Parallel() @@ -172,7 +170,7 @@ func TestBasicAuth_HtpasswdInlinePrecedence(t *testing.T) { auth = base64.StdEncoding.EncodeToString([]byte("username:fromfile")) _, err = ext.Authenticate(context.Background(), map[string][]string{"authorization": {"Basic " + auth}}) - assert.Error(t, errInvalidCredentials, err) + assert.ErrorIs(t, errInvalidCredentials, err) } func TestBasicAuth_SupportedHeaders(t *testing.T) { @@ -265,7 +263,7 @@ func TestBasicAuth_ClientValid(t *testing.T) { expectedMd := map[string]string{ "authorization": fmt.Sprintf("Basic %s", authCreds), } - assert.Equal(t, md, expectedMd) + assert.Equal(t, expectedMd, md) assert.NoError(t, err) assert.True(t, credential.RequireTransportSecurity()) @@ -273,7 +271,6 @@ func TestBasicAuth_ClientValid(t *testing.T) { } func TestBasicAuth_ClientInvalid(t *testing.T) { - t.Run("invalid username format", func(t *testing.T) { ext := newClientAuthExtension(&Config{ ClientAuth: &ClientAuthSettings{ diff --git a/extension/basicauthextension/factory.go b/extension/basicauthextension/factory.go index b58e6b1dda5f..7e2750f56bcd 100644 --- a/extension/basicauthextension/factory.go +++ b/extension/basicauthextension/factory.go @@ -26,7 +26,7 @@ func createDefaultConfig() component.Config { return &Config{} } -func createExtension(_ context.Context, _ extension.CreateSettings, cfg component.Config) (extension.Extension, error) { +func createExtension(_ context.Context, _ extension.Settings, cfg component.Config) (extension.Extension, error) { // check if config is a server auth(Htpasswd should be set) if cfg.(*Config).Htpasswd != nil { return newServerAuthExtension(cfg.(*Config)) diff --git a/extension/basicauthextension/factory_test.go b/extension/basicauthextension/factory_test.go index 29511d05e31d..7f88bdd63dad 100644 --- a/extension/basicauthextension/factory_test.go +++ b/extension/basicauthextension/factory_test.go @@ -28,7 +28,7 @@ func TestCreateExtension_ValidConfig(t *testing.T) { }, } - ext, err := createExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + ext, err := createExtension(context.Background(), extensiontest.NewNopSettings(), cfg) assert.NoError(t, err) assert.NotNil(t, ext) } diff --git a/extension/basicauthextension/generated_component_test.go b/extension/basicauthextension/generated_component_test.go index 44ea88873a9d..889974108da8 100644 --- a/extension/basicauthextension/generated_component_test.go +++ b/extension/basicauthextension/generated_component_test.go @@ -30,18 +30,18 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) t.Run("shutdown", func(t *testing.T) { - e, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + e, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) err = e.Shutdown(context.Background()) require.NoError(t, err) }) t.Run("lifecycle", func(t *testing.T) { - firstExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + firstExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, firstExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, firstExt.Shutdown(context.Background())) - secondExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + secondExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, secondExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, secondExt.Shutdown(context.Background())) diff --git a/extension/basicauthextension/go.mod b/extension/basicauthextension/go.mod index 6fefd73a3128..197dec96d35b 100644 --- a/extension/basicauthextension/go.mod +++ b/extension/basicauthextension/go.mod @@ -1,56 +1,51 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/basicauthextension -go 1.21.0 +go 1.22.0 require ( - github.com/stretchr/testify v1.9.0 - github.com/tg123/go-htpasswd v1.2.2 - go.opentelemetry.io/collector v0.102.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/collector/extension/auth v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/stretchr/testify v1.10.0 + github.com/tg123/go-htpasswd v1.2.3 + go.opentelemetry.io/collector/client v1.22.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/auth v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 go.uber.org/goleak v1.3.0 - google.golang.org/grpc v1.64.0 + google.golang.org/grpc v1.68.1 ) require ( github.com/GehirnInc/crypt v0.0.0-20200316065508-bb7000b8a962 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.23.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/basicauthextension/go.sum b/extension/basicauthextension/go.sum index 25cb3f373c83..9caa1d61a267 100644 --- a/extension/basicauthextension/go.sum +++ b/extension/basicauthextension/go.sum @@ -1,20 +1,18 @@ github.com/GehirnInc/crypt v0.0.0-20200316065508-bb7000b8a962 h1:KeNholpO2xKjgaaSyd+DyQRrsQjhbSeS7qe4nEw8aQw= github.com/GehirnInc/crypt v0.0.0-20200316065508-bb7000b8a962/go.mod h1:kC29dT1vFpj7py2OvG1khBdQpo3kInWP+6QipLbdngo= -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -27,8 +25,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -43,52 +41,46 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/tg123/go-htpasswd v1.2.2 h1:tmNccDsQ+wYsoRfiONzIhDm5OkVHQzN3w4FOBAlN6BY= -github.com/tg123/go-htpasswd v1.2.2/go.mod h1:FcIrK0J+6zptgVwK1JDlqyajW/1B4PtuJ/FLWl7nx8A= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tg123/go-htpasswd v1.2.3 h1:ALR6ZBIc2m9u70m+eAWUFt5p43ISbIvAvRFYzZPTOY8= +github.com/tg123/go-htpasswd v1.2.3/go.mod h1:FcIrK0J+6zptgVwK1JDlqyajW/1B4PtuJ/FLWl7nx8A= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -98,28 +90,28 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -128,12 +120,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/extension/basicauthextension/internal/metadata/generated_status.go b/extension/basicauthextension/internal/metadata/generated_status.go index ff166f85899d..a757972013c3 100644 --- a/extension/basicauthextension/internal/metadata/generated_status.go +++ b/extension/basicauthextension/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("basicauth") + Type = component.MustNewType("basicauth") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/basicauthextension" ) const ( diff --git a/extension/basicauthextension/internal/metadata/generated_telemetry.go b/extension/basicauthextension/internal/metadata/generated_telemetry.go deleted file mode 100644 index a28c34faa493..000000000000 --- a/extension/basicauthextension/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/basicauth") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/basicauth") -} diff --git a/extension/basicauthextension/internal/metadata/generated_telemetry_test.go b/extension/basicauthextension/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index d25bcde2090d..000000000000 --- a/extension/basicauthextension/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/basicauth", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/basicauth", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/basicauthextension/metadata.yaml b/extension/basicauthextension/metadata.yaml index ffdcd2cf47b7..80247953b680 100644 --- a/extension/basicauthextension/metadata.yaml +++ b/extension/basicauthextension/metadata.yaml @@ -1,12 +1,10 @@ type: basicauth -scope_name: otelcol/basicauth status: class: extension stability: beta: [extension] - distributions: - - contrib + distributions: [contrib, k8s] codeowners: active: [jpkrohling, frzifus] emeritus: [svrakitin] diff --git a/extension/bearertokenauthextension/README.md b/extension/bearertokenauthextension/README.md index 44683de5786a..a70c4d226b61 100644 --- a/extension/bearertokenauthextension/README.md +++ b/extension/bearertokenauthextension/README.md @@ -3,18 +3,19 @@ | Status | | | ------------- |-----------| | Stability | [beta] | -| Distributions | [contrib] | +| Distributions | [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fbearertokenauth%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fbearertokenauth) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fbearertokenauth%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fbearertokenauth) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@jpkrohling](https://www.github.com/jpkrohling), [@frzifus](https://www.github.com/frzifus) | | Emeritus | [@pavankrish123](https://www.github.com/pavankrish123) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s -This extension implements both `configauth.ServerAuthenticator` and `configauth.ClientAuthenticator`. It can be used in both http and gRPC exporters inside the `auth` settings, as a means to embed a static token for every RPC call that will be made. +This extension implements both `configauth.ServerAuthenticator` and `configauth.ClientAuthenticator`. It can be used in both http and gRPC exporters inside the `auth` settings, as a means to embed a static token for every RPC call that will be made. The authenticator type has to be set to `bearertokenauth`. diff --git a/extension/bearertokenauthextension/bearertokenauth.go b/extension/bearertokenauthextension/bearertokenauth.go index b41521925142..e7a8ad3e4212 100644 --- a/extension/bearertokenauthextension/bearertokenauth.go +++ b/extension/bearertokenauthextension/bearertokenauth.go @@ -5,11 +5,12 @@ package bearertokenauthextension // import "github.com/open-telemetry/openteleme import ( "context" + "crypto/subtle" "errors" "fmt" "net/http" "os" - "sync" + "sync/atomic" "github.com/fsnotify/fsnotify" "go.opentelemetry.io/collector/component" @@ -42,9 +43,8 @@ var ( // BearerTokenAuth is an implementation of auth.Client. It embeds a static authorization "bearer" token in every rpc call. type BearerTokenAuth struct { - muTokenString sync.RWMutex - scheme string - tokenString string + scheme string + authorizationValueAtomic atomic.Value shutdownCH chan struct{} @@ -58,12 +58,13 @@ func newBearerTokenAuth(cfg *Config, logger *zap.Logger) *BearerTokenAuth { if cfg.Filename != "" && cfg.BearerToken != "" { logger.Warn("a filename is specified. Configured token is ignored!") } - return &BearerTokenAuth{ - scheme: cfg.Scheme, - tokenString: string(cfg.BearerToken), - filename: cfg.Filename, - logger: logger, + a := &BearerTokenAuth{ + scheme: cfg.Scheme, + filename: cfg.Filename, + logger: logger, } + a.setAuthorizationValue(string(cfg.BearerToken)) + return a } // Start of BearerTokenAuth does nothing and returns nil if no filename @@ -135,9 +136,21 @@ func (b *BearerTokenAuth) refreshToken() { b.logger.Error(err.Error()) return } - b.muTokenString.Lock() - b.tokenString = string(token) - b.muTokenString.Unlock() + b.setAuthorizationValue(string(token)) +} + +func (b *BearerTokenAuth) setAuthorizationValue(token string) { + value := token + if b.scheme != "" { + value = b.scheme + " " + value + } + b.authorizationValueAtomic.Store(value) +} + +// authorizationValue returns the Authorization header/metadata value +// to set for client auth, and expected value for server auth. +func (b *BearerTokenAuth) authorizationValue() string { + return b.authorizationValueAtomic.Load().(string) } // Shutdown of BearerTokenAuth does nothing and returns nil @@ -158,22 +171,15 @@ func (b *BearerTokenAuth) Shutdown(_ context.Context) error { // PerRPCCredentials returns PerRPCAuth an implementation of credentials.PerRPCCredentials that func (b *BearerTokenAuth) PerRPCCredentials() (credentials.PerRPCCredentials, error) { return &PerRPCAuth{ - metadata: map[string]string{"authorization": b.bearerToken()}, + metadata: map[string]string{"authorization": b.authorizationValue()}, }, nil } -func (b *BearerTokenAuth) bearerToken() string { - b.muTokenString.RLock() - token := fmt.Sprintf("%s %s", b.scheme, b.tokenString) - b.muTokenString.RUnlock() - return token -} - // RoundTripper is not implemented by BearerTokenAuth func (b *BearerTokenAuth) RoundTripper(base http.RoundTripper) (http.RoundTripper, error) { return &BearerAuthRoundTripper{ - baseTransport: base, - bearerTokenFunc: b.bearerToken, + baseTransport: base, + auth: b, }, nil } @@ -184,14 +190,11 @@ func (b *BearerTokenAuth) Authenticate(ctx context.Context, headers map[string][ auth, ok = headers["Authorization"] } if !ok || len(auth) == 0 { - return ctx, errors.New("authentication didn't succeed") + return ctx, errors.New("missing or empty authorization header") } token := auth[0] - expect := b.tokenString - if len(b.scheme) != 0 { - expect = fmt.Sprintf("%s %s", b.scheme, expect) - } - if expect != token { + expect := b.authorizationValue() + if subtle.ConstantTimeCompare([]byte(expect), []byte(token)) == 0 { return ctx, fmt.Errorf("scheme or token does not match: %s", token) } return ctx, nil @@ -199,8 +202,8 @@ func (b *BearerTokenAuth) Authenticate(ctx context.Context, headers map[string][ // BearerAuthRoundTripper intercepts and adds Bearer token Authorization headers to each http request. type BearerAuthRoundTripper struct { - baseTransport http.RoundTripper - bearerTokenFunc func() string + baseTransport http.RoundTripper + auth *BearerTokenAuth } // RoundTrip modifies the original request and adds Bearer token Authorization headers. @@ -209,6 +212,6 @@ func (interceptor *BearerAuthRoundTripper) RoundTrip(req *http.Request) (*http.R if req2.Header == nil { req2.Header = make(http.Header) } - req2.Header.Set("Authorization", interceptor.bearerTokenFunc()) + req2.Header.Set("Authorization", interceptor.auth.authorizationValue()) return interceptor.baseTransport.RoundTrip(req2) } diff --git a/extension/bearertokenauthextension/bearertokenauth_test.go b/extension/bearertokenauthextension/bearertokenauth_test.go index 0a92de80d952..a6257a8511bd 100644 --- a/extension/bearertokenauthextension/bearertokenauth_test.go +++ b/extension/bearertokenauthextension/bearertokenauth_test.go @@ -8,6 +8,7 @@ import ( "fmt" "net/http" "os" + "path/filepath" "testing" "time" @@ -56,12 +57,11 @@ func TestBearerAuthenticatorHttp(t *testing.T) { assert.NoError(t, err) assert.NotNil(t, c) - request := &http.Request{Method: "Get"} + request := &http.Request{Method: http.MethodGet} resp, err := c.RoundTrip(request) assert.NoError(t, err) authHeaderValue := resp.Header.Get("Authorization") assert.Equal(t, authHeaderValue, fmt.Sprintf("%s %s", scheme, string(cfg.BearerToken))) - } func TestBearerAuthenticator(t *testing.T) { @@ -71,7 +71,7 @@ func TestBearerAuthenticator(t *testing.T) { bauth := newBearerTokenAuth(cfg, nil) assert.NotNil(t, bauth) - assert.Nil(t, bauth.Start(context.Background(), componenttest.NewNopHost())) + assert.NoError(t, bauth.Start(context.Background(), componenttest.NewNopHost())) credential, err := bauth.PerRPCCredentials() assert.NoError(t, err) @@ -81,7 +81,7 @@ func TestBearerAuthenticator(t *testing.T) { expectedMd := map[string]string{ "authorization": fmt.Sprintf("Bearer %s", string(cfg.BearerToken)), } - assert.Equal(t, md, expectedMd) + assert.Equal(t, expectedMd, md) assert.NoError(t, err) assert.True(t, credential.RequireTransportSecurity()) @@ -91,23 +91,23 @@ func TestBearerAuthenticator(t *testing.T) { } expectedHeaders := http.Header{ "Foo": {"bar"}, - "Authorization": {bauth.bearerToken()}, + "Authorization": {"Bearer " + string(cfg.BearerToken)}, } resp, err := roundTripper.RoundTrip(&http.Request{Header: orgHeaders}) assert.NoError(t, err) assert.Equal(t, expectedHeaders, resp.Header) - assert.Nil(t, bauth.Shutdown(context.Background())) + assert.NoError(t, bauth.Shutdown(context.Background())) } func TestBearerStartWatchStop(t *testing.T) { cfg := createDefaultConfig().(*Config) - cfg.Filename = "test.token" + cfg.Filename = filepath.Join("testdata", t.Name()+".token") bauth := newBearerTokenAuth(cfg, zaptest.NewLogger(t)) assert.NotNil(t, bauth) - assert.Nil(t, bauth.Start(context.Background(), componenttest.NewNopHost())) + assert.NoError(t, bauth.Start(context.Background(), componenttest.NewNopHost())) assert.Error(t, bauth.Start(context.Background(), componenttest.NewNopHost())) credential, err := bauth.PerRPCCredentials() @@ -122,43 +122,43 @@ func TestBearerStartWatchStop(t *testing.T) { expectedMd := map[string]string{ "authorization": tokenStr, } - assert.Equal(t, md, expectedMd) + assert.Equal(t, expectedMd, md) assert.NoError(t, err) assert.True(t, credential.RequireTransportSecurity()) // change file content once - assert.Nil(t, os.WriteFile(bauth.filename, []byte(fmt.Sprintf("%stest", token)), 0600)) + assert.NoError(t, os.WriteFile(bauth.filename, []byte(fmt.Sprintf("%stest", token)), 0o600)) time.Sleep(5 * time.Second) credential, _ = bauth.PerRPCCredentials() md, err = credential.GetRequestMetadata(context.Background()) expectedMd["authorization"] = tokenStr + "test" - assert.Equal(t, md, expectedMd) + assert.Equal(t, expectedMd, md) assert.NoError(t, err) // change file content back - assert.Nil(t, os.WriteFile(bauth.filename, token, 0600)) + assert.NoError(t, os.WriteFile(bauth.filename, token, 0o600)) time.Sleep(5 * time.Second) credential, _ = bauth.PerRPCCredentials() md, err = credential.GetRequestMetadata(context.Background()) expectedMd["authorization"] = tokenStr time.Sleep(5 * time.Second) - assert.Equal(t, md, expectedMd) + assert.Equal(t, expectedMd, md) assert.NoError(t, err) - assert.Nil(t, bauth.Shutdown(context.Background())) + assert.NoError(t, bauth.Shutdown(context.Background())) assert.Nil(t, bauth.shutdownCH) } func TestBearerTokenFileContentUpdate(t *testing.T) { scheme := "TestScheme" cfg := createDefaultConfig().(*Config) - cfg.Filename = "test.token" + cfg.Filename = filepath.Join("testdata", t.Name()+".token") cfg.Scheme = scheme bauth := newBearerTokenAuth(cfg, zaptest.NewLogger(t)) assert.NotNil(t, bauth) - assert.Nil(t, bauth.Start(context.Background(), componenttest.NewNopHost())) + assert.NoError(t, bauth.Start(context.Background(), componenttest.NewNopHost())) assert.Error(t, bauth.Start(context.Background(), componenttest.NewNopHost())) defer func() { assert.NoError(t, bauth.Shutdown(context.Background())) }() @@ -170,32 +170,32 @@ func TestBearerTokenFileContentUpdate(t *testing.T) { assert.NoError(t, err) assert.NotNil(t, rt) - request := &http.Request{Method: "Get"} + request := &http.Request{Method: http.MethodGet} resp, err := rt.RoundTrip(request) assert.NoError(t, err) authHeaderValue := resp.Header.Get("Authorization") assert.Equal(t, authHeaderValue, fmt.Sprintf("%s %s", scheme, string(token))) // change file content once - assert.Nil(t, os.WriteFile(bauth.filename, []byte(fmt.Sprintf("%stest", token)), 0600)) + assert.NoError(t, os.WriteFile(bauth.filename, []byte(fmt.Sprintf("%stest", token)), 0o600)) time.Sleep(5 * time.Second) tokenNew, err := os.ReadFile(bauth.filename) assert.NoError(t, err) // check if request is updated with the new token - request = &http.Request{Method: "Get"} + request = &http.Request{Method: http.MethodGet} resp, err = rt.RoundTrip(request) assert.NoError(t, err) authHeaderValue = resp.Header.Get("Authorization") assert.Equal(t, authHeaderValue, fmt.Sprintf("%s %s", scheme, string(tokenNew))) // change file content back - assert.Nil(t, os.WriteFile(bauth.filename, token, 0600)) + assert.NoError(t, os.WriteFile(bauth.filename, token, 0o600)) time.Sleep(5 * time.Second) // check if request is updated with the old token - request = &http.Request{Method: "Get"} + request = &http.Request{Method: http.MethodGet} resp, err = rt.RoundTrip(request) assert.NoError(t, err) authHeaderValue = resp.Header.Get("Authorization") @@ -212,7 +212,7 @@ func TestBearerServerAuthenticateWithScheme(t *testing.T) { assert.NotNil(t, bauth) ctx := context.Background() - assert.Nil(t, bauth.Start(ctx, componenttest.NewNopHost())) + assert.NoError(t, bauth.Start(ctx, componenttest.NewNopHost())) _, err := bauth.Authenticate(ctx, map[string][]string{"authorization": {"Bearer " + token}}) assert.NoError(t, err) @@ -223,7 +223,7 @@ func TestBearerServerAuthenticateWithScheme(t *testing.T) { _, err = bauth.Authenticate(ctx, map[string][]string{"authorization": {"" + token}}) assert.Error(t, err) - assert.Nil(t, bauth.Shutdown(context.Background())) + assert.NoError(t, bauth.Shutdown(context.Background())) } func TestBearerServerAuthenticate(t *testing.T) { @@ -236,7 +236,7 @@ func TestBearerServerAuthenticate(t *testing.T) { assert.NotNil(t, bauth) ctx := context.Background() - assert.Nil(t, bauth.Start(ctx, componenttest.NewNopHost())) + assert.NoError(t, bauth.Start(ctx, componenttest.NewNopHost())) _, err := bauth.Authenticate(ctx, map[string][]string{"authorization": {"Bearer " + token}}) assert.Error(t, err) @@ -250,5 +250,5 @@ func TestBearerServerAuthenticate(t *testing.T) { _, err = bauth.Authenticate(ctx, map[string][]string{"authorization": {token}}) assert.NoError(t, err) - assert.Nil(t, bauth.Shutdown(context.Background())) + assert.NoError(t, bauth.Shutdown(context.Background())) } diff --git a/extension/bearertokenauthextension/config.go b/extension/bearertokenauthextension/config.go index f8513c1ef011..f136d635ea32 100644 --- a/extension/bearertokenauthextension/config.go +++ b/extension/bearertokenauthextension/config.go @@ -12,7 +12,6 @@ import ( // Config specifies how the Per-RPC bearer token based authentication data should be obtained. type Config struct { - // Scheme specifies the auth-scheme for the token. Defaults to "Bearer" Scheme string `mapstructure:"scheme,omitempty"` @@ -23,8 +22,10 @@ type Config struct { Filename string `mapstructure:"filename,omitempty"` } -var _ component.Config = (*Config)(nil) -var errNoTokenProvided = errors.New("no bearer token provided") +var ( + _ component.Config = (*Config)(nil) + errNoTokenProvided = errors.New("no bearer token provided") +) // Validate checks if the extension configuration is valid func (cfg *Config) Validate() error { diff --git a/extension/bearertokenauthextension/config_test.go b/extension/bearertokenauthextension/config_test.go index 5143bf6bd60b..d739fcf86825 100644 --- a/extension/bearertokenauthextension/config_test.go +++ b/extension/bearertokenauthextension/config_test.go @@ -50,7 +50,7 @@ func TestLoadConfig(t *testing.T) { cfg := factory.CreateDefaultConfig() sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) if tt.expectedErr { assert.Error(t, component.ValidateConfig(cfg)) return diff --git a/extension/bearertokenauthextension/factory.go b/extension/bearertokenauthextension/factory.go index 8af24b8d16ab..8f3e66602885 100644 --- a/extension/bearertokenauthextension/factory.go +++ b/extension/bearertokenauthextension/factory.go @@ -32,6 +32,6 @@ func createDefaultConfig() component.Config { } } -func createExtension(_ context.Context, set extension.CreateSettings, cfg component.Config) (extension.Extension, error) { +func createExtension(_ context.Context, set extension.Settings, cfg component.Config) (extension.Extension, error) { return newBearerTokenAuth(cfg.(*Config), set.Logger), nil } diff --git a/extension/bearertokenauthextension/factory_test.go b/extension/bearertokenauthextension/factory_test.go index 94aae7da1ead..88810f9da091 100644 --- a/extension/bearertokenauthextension/factory_test.go +++ b/extension/bearertokenauthextension/factory_test.go @@ -19,10 +19,10 @@ func TestFactory_CreateDefaultConfig(t *testing.T) { assert.NoError(t, componenttest.CheckConfigStruct(cfg)) } -func TestFactory_CreateExtension(t *testing.T) { +func TestFactory_Create(t *testing.T) { cfg := createDefaultConfig().(*Config) cfg.BearerToken = "somerandometoken" - ext, err := createExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + ext, err := createExtension(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NotNil(t, ext) } diff --git a/extension/bearertokenauthextension/generated_component_test.go b/extension/bearertokenauthextension/generated_component_test.go index b955559fac20..1bc6783688f0 100644 --- a/extension/bearertokenauthextension/generated_component_test.go +++ b/extension/bearertokenauthextension/generated_component_test.go @@ -30,18 +30,18 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) t.Run("shutdown", func(t *testing.T) { - e, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + e, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) err = e.Shutdown(context.Background()) require.NoError(t, err) }) t.Run("lifecycle", func(t *testing.T) { - firstExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + firstExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, firstExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, firstExt.Shutdown(context.Background())) - secondExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + secondExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, secondExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, secondExt.Shutdown(context.Background())) diff --git a/extension/bearertokenauthextension/go.mod b/extension/bearertokenauthextension/go.mod index cd991dc17499..3b4941000f03 100644 --- a/extension/bearertokenauthextension/go.mod +++ b/extension/bearertokenauthextension/go.mod @@ -1,53 +1,48 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/bearertokenauthextension -go 1.21.0 +go 1.22.0 require ( - github.com/fsnotify/fsnotify v1.7.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/collector/extension/auth v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/fsnotify/fsnotify v1.8.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/auth v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 - google.golang.org/grpc v1.64.0 + google.golang.org/grpc v1.68.1 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/bearertokenauthextension/go.sum b/extension/bearertokenauthextension/go.sum index 9fa03099eb3c..ce98298373b0 100644 --- a/extension/bearertokenauthextension/go.sum +++ b/extension/bearertokenauthextension/go.sum @@ -1,20 +1,18 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -25,8 +23,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -37,46 +35,40 @@ github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zx github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -92,20 +84,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -114,12 +106,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/extension/bearertokenauthextension/internal/metadata/generated_status.go b/extension/bearertokenauthextension/internal/metadata/generated_status.go index c85807648817..bc0b19b02797 100644 --- a/extension/bearertokenauthextension/internal/metadata/generated_status.go +++ b/extension/bearertokenauthextension/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("bearertokenauth") + Type = component.MustNewType("bearertokenauth") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/bearertokenauthextension" ) const ( diff --git a/extension/bearertokenauthextension/internal/metadata/generated_telemetry.go b/extension/bearertokenauthextension/internal/metadata/generated_telemetry.go deleted file mode 100644 index 4caf9c3c6f66..000000000000 --- a/extension/bearertokenauthextension/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/bearertokenauth") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/bearertokenauth") -} diff --git a/extension/bearertokenauthextension/internal/metadata/generated_telemetry_test.go b/extension/bearertokenauthextension/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 5edd492c03dd..000000000000 --- a/extension/bearertokenauthextension/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/bearertokenauth", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/bearertokenauth", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/bearertokenauthextension/metadata.yaml b/extension/bearertokenauthextension/metadata.yaml index f32f31ad1a0e..e14cf2f91d58 100644 --- a/extension/bearertokenauthextension/metadata.yaml +++ b/extension/bearertokenauthextension/metadata.yaml @@ -1,12 +1,10 @@ type: bearertokenauth -scope_name: otelcol/bearertokenauth status: class: extension stability: beta: [extension] - distributions: - - contrib + distributions: [contrib, k8s] codeowners: active: [jpkrohling, frzifus] emeritus: [pavankrish123] diff --git a/extension/bearertokenauthextension/test.token b/extension/bearertokenauthextension/test.token deleted file mode 100644 index 92ff978b0bf6..000000000000 --- a/extension/bearertokenauthextension/test.token +++ /dev/null @@ -1 +0,0 @@ -eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...+file+ diff --git a/extension/bearertokenauthextension/testdata/TestBearerStartWatchStop.token b/extension/bearertokenauthextension/testdata/TestBearerStartWatchStop.token new file mode 100644 index 000000000000..a26f78eecc34 --- /dev/null +++ b/extension/bearertokenauthextension/testdata/TestBearerStartWatchStop.token @@ -0,0 +1 @@ +eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...+file+ \ No newline at end of file diff --git a/extension/bearertokenauthextension/testdata/TestBearerTokenFileContentUpdate.token b/extension/bearertokenauthextension/testdata/TestBearerTokenFileContentUpdate.token new file mode 100644 index 000000000000..124d667862fc --- /dev/null +++ b/extension/bearertokenauthextension/testdata/TestBearerTokenFileContentUpdate.token @@ -0,0 +1 @@ +eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...+file \ No newline at end of file diff --git a/receiver/gitproviderreceiver/Makefile b/extension/cgroupruntimeextension/Makefile similarity index 100% rename from receiver/gitproviderreceiver/Makefile rename to extension/cgroupruntimeextension/Makefile diff --git a/extension/cgroupruntimeextension/README.md b/extension/cgroupruntimeextension/README.md new file mode 100644 index 000000000000..f7d79099d6c1 --- /dev/null +++ b/extension/cgroupruntimeextension/README.md @@ -0,0 +1,42 @@ +# Cgroup Go runtime extension + + + +| Status | | +| ------------- |-----------| +| Stability | [development] | +| Distributions | [contrib] | +| Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fcgroupruntime%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fcgroupruntime) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fcgroupruntime%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fcgroupruntime) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@mx-psi](https://www.github.com/mx-psi), [@rogercoll](https://www.github.com/rogercoll) | + +[development]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#development +[contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib + + +## Overview + +The OpenTelemetry Cgroup Auto-Config Extension is designed to optimize Go runtime performance in containerized environments by automatically configuring GOMAXPROCS and GOMEMLIMIT based on the Linux cgroup filesystem. This extension leverages [automaxprocs](https://github.com/uber-go/automaxprocs) and [automemlimit](https://github.com/KimMachineGun/automemlimit) packages to dynamically adjust Go runtime variables, ensuring efficient resource usage aligned with container limits. + +## Configuration + +The following settings can be configured: + +- `gomaxprocs`: Configures the behavior of setting `GOMAXPROCS`, the maximum number of CPUs for Go runtime. Options: + - `enabled`: A boolean value to enable or disable automatic configuration of `GOMAXPROCS` based on the system’s cgroup settings (default: true). + +- `gomemlimit`: Configures the behavior of setting `GOMEMLIMIT`, the maximum memory limit for Go runtime. Options: + - `enabled`: A boolean value to enable or disable automatic configuration of `GOMEMLIMIT` (default: true). + - `ratio`: A floating-point value between 0 and 1 that represents the fraction of the detected memory limit to allocate for the Go runtime (default: 0.9). + +## Examples + +```yaml +extension: + # processor name: cgroupruntime + cgroupruntime: + gomaxprocs: + enabled: true + gomemlimit: + enabled: true + ratio: 0.8 +``` diff --git a/extension/cgroupruntimeextension/config.go b/extension/cgroupruntimeextension/config.go new file mode 100644 index 000000000000..b9f3807b0c32 --- /dev/null +++ b/extension/cgroupruntimeextension/config.go @@ -0,0 +1,28 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package cgroupruntimeextension // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/cgroupruntimeextension" + +import "errors" // Config contains the configuration for the cgroup runtime extension. + +type Config struct { + GoMaxProcs GoMaxProcsConfig `mapstructure:"gomaxprocs"` + GoMemLimit GoMemLimitConfig `mapstructure:"gomemlimit"` +} + +type GoMaxProcsConfig struct { + Enabled bool `mapstructure:"enabled"` +} + +type GoMemLimitConfig struct { + Enabled bool `mapstructure:"enabled"` + Ratio float64 `mapstructure:"ratio"` +} + +// Validate checks if the extension configuration is valid +func (cfg *Config) Validate() error { + if cfg.GoMemLimit.Ratio <= 0 || cfg.GoMemLimit.Ratio > 1 { + return errors.New("gomemlimit ratio must be in the (0.0,1.0] range") + } + return nil +} diff --git a/extension/cgroupruntimeextension/config_test.go b/extension/cgroupruntimeextension/config_test.go new file mode 100644 index 000000000000..653102e0601b --- /dev/null +++ b/extension/cgroupruntimeextension/config_test.go @@ -0,0 +1,81 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package cgroupruntimeextension + +import ( + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/confmap/confmaptest" + + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/cgroupruntimeextension/internal/metadata" +) + +func TestLoadConfig(t *testing.T) { + t.Parallel() + + tests := []struct { + id component.ID + expected component.Config + unmarshalErrorMessage string + validateErrorMessage string + }{ + { + id: component.NewID(metadata.Type), + expected: &Config{ + GoMaxProcs: GoMaxProcsConfig{Enabled: true}, + GoMemLimit: GoMemLimitConfig{ + Enabled: true, + Ratio: 0.9, + }, + }, + }, + { + id: component.NewIDWithName(metadata.Type, "invalid_ratio"), + validateErrorMessage: "gomemlimit ratio must be in the (0.0,1.0] range", + }, + { + id: component.NewIDWithName(metadata.Type, "invalid_ratio_disabled"), + validateErrorMessage: "gomemlimit ratio must be in the (0.0,1.0] range", + }, + { + id: component.NewIDWithName(metadata.Type, "invalid_ratio_negative"), + validateErrorMessage: "gomemlimit ratio must be in the (0.0,1.0] range", + }, + { + id: component.NewIDWithName(metadata.Type, "invalid_ratio_type"), + unmarshalErrorMessage: "decoding failed due to the following error(s):\n\n'gomemlimit.ratio' expected type 'float64', got unconvertible type 'string', value: 'not_valid'", + }, + } + + for _, tt := range tests { + t.Run(tt.id.String(), func(t *testing.T) { + cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml")) + require.NoError(t, err) + + factory := NewFactory() + cfg := factory.CreateDefaultConfig() + + sub, err := cm.Sub(tt.id.String()) + require.NoError(t, err) + + if tt.unmarshalErrorMessage != "" { + assert.ErrorContains(t, sub.Unmarshal(cfg), tt.unmarshalErrorMessage) + return + } + require.NoError(t, sub.Unmarshal(cfg)) + + if tt.validateErrorMessage != "" { + assert.EqualError(t, component.ValidateConfig(cfg), tt.validateErrorMessage) + return + } + + assert.NoError(t, component.ValidateConfig(cfg)) + assert.Equal(t, tt.expected, cfg) + }) + } +} diff --git a/extension/cgroupruntimeextension/doc.go b/extension/cgroupruntimeextension/doc.go new file mode 100644 index 000000000000..5832bf5a06f1 --- /dev/null +++ b/extension/cgroupruntimeextension/doc.go @@ -0,0 +1,6 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +//go:generate mdatagen metadata.yaml + +package cgroupruntimeextension // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/cgroupruntimeextension" diff --git a/extension/cgroupruntimeextension/extension.go b/extension/cgroupruntimeextension/extension.go new file mode 100644 index 000000000000..78fc2c370f5f --- /dev/null +++ b/extension/cgroupruntimeextension/extension.go @@ -0,0 +1,77 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package cgroupruntimeextension // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/cgroupruntimeextension" + +import ( + "context" + "runtime" + "runtime/debug" + + "go.opentelemetry.io/collector/component" + "go.uber.org/zap" +) + +type ( + undoFunc func() + maxProcsFn func() (undoFunc, error) + memLimitWithRatioFn func(float64) (undoFunc, error) +) + +type cgroupRuntimeExtension struct { + config *Config + logger *zap.Logger + + // runtime modifiers + maxProcsFn + undoMaxProcsFn undoFunc + + memLimitWithRatioFn + undoMemLimitFn undoFunc +} + +func newCgroupRuntime(cfg *Config, logger *zap.Logger, maxProcsFn maxProcsFn, memLimitFn memLimitWithRatioFn) *cgroupRuntimeExtension { + return &cgroupRuntimeExtension{ + config: cfg, + logger: logger, + maxProcsFn: maxProcsFn, + memLimitWithRatioFn: memLimitFn, + } +} + +func (c *cgroupRuntimeExtension) Start(_ context.Context, _ component.Host) error { + var err error + if c.config.GoMaxProcs.Enabled { + c.undoMaxProcsFn, err = c.maxProcsFn() + if err != nil { + return err + } + + c.logger.Info("GOMAXPROCS has been set", + zap.Int("GOMAXPROCS", runtime.GOMAXPROCS(-1)), + ) + } + + if c.config.GoMemLimit.Enabled { + c.undoMemLimitFn, err = c.memLimitWithRatioFn(c.config.GoMemLimit.Ratio) + if err != nil { + return err + } + + c.logger.Info("GOMEMLIMIT has been set", + zap.Int64("GOMEMLIMIT", debug.SetMemoryLimit(-1)), + ) + } + return nil +} + +func (c *cgroupRuntimeExtension) Shutdown(_ context.Context) error { + if c.undoMaxProcsFn != nil { + c.undoMaxProcsFn() + } + if c.undoMemLimitFn != nil { + c.undoMemLimitFn() + } + + return nil +} diff --git a/extension/cgroupruntimeextension/extension_test.go b/extension/cgroupruntimeextension/extension_test.go new file mode 100644 index 000000000000..733478c735eb --- /dev/null +++ b/extension/cgroupruntimeextension/extension_test.go @@ -0,0 +1,67 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package cgroupruntimeextension + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/extension/extensiontest" +) + +func TestExtension(t *testing.T) { + tests := []struct { + name string + config *Config + expectedCalls int + }{ + { + name: "all enabled", + config: &Config{ + GoMaxProcs: GoMaxProcsConfig{ + Enabled: true, + }, + GoMemLimit: GoMemLimitConfig{ + Enabled: true, + Ratio: 0.5, + }, + }, + expectedCalls: 4, + }, + { + name: "everything disabled", + config: &Config{ + GoMaxProcs: GoMaxProcsConfig{ + Enabled: false, + }, + GoMemLimit: GoMemLimitConfig{ + Enabled: false, + }, + }, + expectedCalls: 0, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + allCalls := 0 + var _err error + setterMock := func() (undoFunc, error) { + allCalls++ + return func() { allCalls++ }, _err + } + settings := extensiontest.NewNopSettings() + cg := newCgroupRuntime(test.config, settings.Logger, setterMock, func(_ float64) (undoFunc, error) { return setterMock() }) + ctx := context.Background() + + err := cg.Start(ctx, componenttest.NewNopHost()) + require.NoError(t, err) + + require.NoError(t, cg.Shutdown(ctx)) + require.Equal(t, test.expectedCalls, allCalls) + }) + } +} diff --git a/extension/cgroupruntimeextension/factory.go b/extension/cgroupruntimeextension/factory.go new file mode 100644 index 000000000000..1905811dc3b8 --- /dev/null +++ b/extension/cgroupruntimeextension/factory.go @@ -0,0 +1,54 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package cgroupruntimeextension // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/cgroupruntimeextension" + +import ( + "context" + "fmt" + "runtime/debug" + + "github.com/KimMachineGun/automemlimit/memlimit" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/extension" + "go.uber.org/automaxprocs/maxprocs" + + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/cgroupruntimeextension/internal/metadata" +) + +func NewFactory() extension.Factory { + return extension.NewFactory( + metadata.Type, + createDefaultConfig, + createExtension, + metadata.ExtensionStability, + ) +} + +func createDefaultConfig() component.Config { + return &Config{ + GoMaxProcs: GoMaxProcsConfig{ + Enabled: true, + }, + GoMemLimit: GoMemLimitConfig{ + Enabled: true, + // By default, it sets `GOMEMLIMIT` to 90% of cgroup's memory limit. + Ratio: 0.9, + }, + } +} + +func createExtension(_ context.Context, set extension.Settings, cfg component.Config) (extension.Extension, error) { + cgroupConfig := cfg.(*Config) + return newCgroupRuntime(cgroupConfig, set.Logger, + func() (undoFunc, error) { + undo, err := maxprocs.Set(maxprocs.Logger(func(str string, params ...any) { + set.Logger.Debug(fmt.Sprintf(str, params)) + })) + return undoFunc(undo), err + }, + func(ratio float64) (undoFunc, error) { + initial, err := memlimit.SetGoMemLimitWithOpts(memlimit.WithRatio(ratio)) + return func() { debug.SetMemoryLimit(initial) }, err + }), nil +} diff --git a/extension/cgroupruntimeextension/generated_component_test.go b/extension/cgroupruntimeextension/generated_component_test.go new file mode 100644 index 000000000000..5c3334b208f1 --- /dev/null +++ b/extension/cgroupruntimeextension/generated_component_test.go @@ -0,0 +1,49 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package cgroupruntimeextension + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/confmap/confmaptest" + "go.opentelemetry.io/collector/extension/extensiontest" +) + +func TestComponentFactoryType(t *testing.T) { + require.Equal(t, "cgroupruntime", NewFactory().Type().String()) +} + +func TestComponentConfigStruct(t *testing.T) { + require.NoError(t, componenttest.CheckConfigStruct(NewFactory().CreateDefaultConfig())) +} + +func TestComponentLifecycle(t *testing.T) { + factory := NewFactory() + + cm, err := confmaptest.LoadConf("metadata.yaml") + require.NoError(t, err) + cfg := factory.CreateDefaultConfig() + sub, err := cm.Sub("tests::config") + require.NoError(t, err) + require.NoError(t, sub.Unmarshal(&cfg)) + t.Run("shutdown", func(t *testing.T) { + e, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) + require.NoError(t, err) + err = e.Shutdown(context.Background()) + require.NoError(t, err) + }) + t.Run("lifecycle", func(t *testing.T) { + firstExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) + require.NoError(t, err) + require.NoError(t, firstExt.Start(context.Background(), componenttest.NewNopHost())) + require.NoError(t, firstExt.Shutdown(context.Background())) + + secondExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) + require.NoError(t, err) + require.NoError(t, secondExt.Start(context.Background(), componenttest.NewNopHost())) + require.NoError(t, secondExt.Shutdown(context.Background())) + }) +} diff --git a/extension/cgroupruntimeextension/generated_package_test.go b/extension/cgroupruntimeextension/generated_package_test.go new file mode 100644 index 000000000000..8ad0aa57804f --- /dev/null +++ b/extension/cgroupruntimeextension/generated_package_test.go @@ -0,0 +1,13 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package cgroupruntimeextension + +import ( + "testing" + + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + goleak.VerifyTestMain(m) +} diff --git a/extension/cgroupruntimeextension/go.mod b/extension/cgroupruntimeextension/go.mod new file mode 100644 index 000000000000..5885af88a4eb --- /dev/null +++ b/extension/cgroupruntimeextension/go.mod @@ -0,0 +1,54 @@ +module github.com/open-telemetry/opentelemetry-collector-contrib/extension/cgroupruntimeextension + +go 1.22.0 + +require ( + github.com/KimMachineGun/automemlimit v0.6.1 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 + go.uber.org/automaxprocs v1.6.0 + go.uber.org/goleak v1.3.0 + go.uber.org/zap v1.27.0 +) + +require ( + github.com/cilium/ebpf v0.9.1 // indirect + github.com/containerd/cgroups/v3 v3.0.1 // indirect + github.com/coreos/go-systemd/v22 v22.3.2 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/docker/go-units v0.4.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/godbus/dbus/v5 v5.0.4 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/knadh/koanf/maps v0.1.1 // indirect + github.com/knadh/koanf/providers/confmap v0.1.0 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/opencontainers/runtime-spec v1.0.2 // indirect + github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/sirupsen/logrus v1.8.1 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/extension/cgroupruntimeextension/go.sum b/extension/cgroupruntimeextension/go.sum new file mode 100644 index 000000000000..f9bdfad7584e --- /dev/null +++ b/extension/cgroupruntimeextension/go.sum @@ -0,0 +1,139 @@ +github.com/KimMachineGun/automemlimit v0.6.1 h1:ILa9j1onAAMadBsyyUJv5cack8Y1WT26yLj/V+ulKp8= +github.com/KimMachineGun/automemlimit v0.6.1/go.mod h1:T7xYht7B8r6AG/AqFcUdc7fzd2bIdBKmepfP2S1svPY= +github.com/cilium/ebpf v0.9.1 h1:64sn2K3UKw8NbP/blsixRpF3nXuyhz/VjRlRzvlBRu4= +github.com/cilium/ebpf v0.9.1/go.mod h1:+OhNOIXx/Fnu1IE8bJz2dzOA+VSfyTfdNUVdlQnxUFY= +github.com/containerd/cgroups/v3 v3.0.1 h1:4hfGvu8rfGIwVIDd+nLzn/B9ZXx4BcCjzt5ToenJRaE= +github.com/containerd/cgroups/v3 v3.0.1/go.mod h1:/vtwk1VXrtoa5AaZLkypuOJgA/6DyPMZHJPGQNtlHnw= +github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss= +github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= +github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= +github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= +github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0= +github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= +github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= +github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= +go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/extension/cgroupruntimeextension/internal/metadata/generated_status.go b/extension/cgroupruntimeextension/internal/metadata/generated_status.go new file mode 100644 index 000000000000..172087ad81c5 --- /dev/null +++ b/extension/cgroupruntimeextension/internal/metadata/generated_status.go @@ -0,0 +1,16 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "go.opentelemetry.io/collector/component" +) + +var ( + Type = component.MustNewType("cgroupruntime") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/cgroupruntimeextension" +) + +const ( + ExtensionStability = component.StabilityLevelDevelopment +) diff --git a/extension/cgroupruntimeextension/metadata.yaml b/extension/cgroupruntimeextension/metadata.yaml new file mode 100644 index 000000000000..6f1e7b9988ab --- /dev/null +++ b/extension/cgroupruntimeextension/metadata.yaml @@ -0,0 +1,12 @@ +type: cgroupruntime + +status: + class: extension + stability: + development: [extension] + distributions: [contrib] + codeowners: + active: [mx-psi, rogercoll] + +tests: + config: diff --git a/extension/cgroupruntimeextension/testdata/config.yaml b/extension/cgroupruntimeextension/testdata/config.yaml new file mode 100644 index 000000000000..228842e008ff --- /dev/null +++ b/extension/cgroupruntimeextension/testdata/config.yaml @@ -0,0 +1,13 @@ +cgroupruntime: +cgroupruntime/invalid_ratio: + gomemlimit: + ratio: 1.1 +cgroupruntime/invalid_ratio_disabled: + gomemlimit: + ratio: 0 +cgroupruntime/invalid_ratio_negative: + gomemlimit: + ratio: -12.5 +cgroupruntime/invalid_ratio_type: + gomemlimit: + ratio: "not_valid" diff --git a/extension/encoding/avrologencodingextension/README.md b/extension/encoding/avrologencodingextension/README.md index 30b725d8e784..e20855e9c3d4 100644 --- a/extension/encoding/avrologencodingextension/README.md +++ b/extension/encoding/avrologencodingextension/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Favrologencoding%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Favrologencoding) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Favrologencoding%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Favrologencoding) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@thmshmm](https://www.github.com/thmshmm) | -[development]: https://github.com/open-telemetry/opentelemetry-collector#development +[development]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#development The `avrolog` encoding extension is used to unmarshal AVRO and insert it into the body of a log record. Marshalling is not supported. diff --git a/extension/encoding/avrologencodingextension/avro_test.go b/extension/encoding/avrologencodingextension/avro_test.go index aa947845c828..1893f21d211b 100644 --- a/extension/encoding/avrologencodingextension/avro_test.go +++ b/extension/encoding/avrologencodingextension/avro_test.go @@ -8,20 +8,17 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestNewAvroLogsUnmarshaler(t *testing.T) { schema, data := createAVROTestData(t) deserializer, err := newAVROStaticSchemaDeserializer(schema) - if err != nil { - t.Errorf("Did not expect an error, got %q", err.Error()) - } + require.NoError(t, err, "Did not expect an error") logMap, err := deserializer.Deserialize(data) - if err != nil { - t.Fatalf("Did not expect an error, got %q", err.Error()) - } + require.NoError(t, err, "Did not expect an error") assert.Equal(t, int64(1697187201488000000), logMap["timestamp"].(time.Time).UnixNano()) assert.Equal(t, "host1", logMap["hostname"]) diff --git a/extension/encoding/avrologencodingextension/extension.go b/extension/encoding/avrologencodingextension/extension.go index 522421823cec..32a2886d64ef 100644 --- a/extension/encoding/avrologencodingextension/extension.go +++ b/extension/encoding/avrologencodingextension/extension.go @@ -15,9 +15,7 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding" ) -var ( - _ encoding.LogsUnmarshalerExtension = (*avroLogExtension)(nil) -) +var _ encoding.LogsUnmarshalerExtension = (*avroLogExtension)(nil) type avroLogExtension struct { deserializer avroDeserializer diff --git a/extension/encoding/avrologencodingextension/extension_test.go b/extension/encoding/avrologencodingextension/extension_test.go index c8b44021dc47..86bb0158fc0f 100644 --- a/extension/encoding/avrologencodingextension/extension_test.go +++ b/extension/encoding/avrologencodingextension/extension_test.go @@ -34,16 +34,15 @@ func TestUnmarshal(t *testing.T) { logRecord := logs.ResourceLogs().At(0).ScopeLogs().At(0).LogRecords().At(0) assert.NoError(t, err) - assert.Equal(t, "{\"count\":5,\"hostname\":\"host1\",\"level\":\"warn\",\"levelEnum\":\"INFO\",\"mapField\":{},\"message\":\"log message\",\"nestedRecord\":{\"field1\":12,\"field2\":\"val2\"},\"properties\":[\"prop1\",\"prop2\"],\"severity\":1,\"timestamp\":1697187201488000000}", logRecord.Body().AsString()) + assert.JSONEq(t, "{\"count\":5,\"hostname\":\"host1\",\"level\":\"warn\",\"levelEnum\":\"INFO\",\"mapField\":{},\"message\":\"log message\",\"nestedRecord\":{\"field1\":12,\"field2\":\"val2\"},\"properties\":[\"prop1\",\"prop2\"],\"severity\":1,\"timestamp\":1697187201488000000}", logRecord.Body().AsString()) } func TestInvalidUnmarshal(t *testing.T) { t.Parallel() schema, err := loadAVROSchemaFromFile("testdata/schema1.avro") - if err != nil { - t.Fatalf("Failed to read avro schema file: %q", err.Error()) - } + + require.NoError(t, err, "Failed to read avro schema file") e, err := newExtension(&Config{Schema: string(schema)}) assert.NoError(t, err) diff --git a/extension/encoding/avrologencodingextension/factory.go b/extension/encoding/avrologencodingextension/factory.go index 898a2a884796..0d1a1890000a 100644 --- a/extension/encoding/avrologencodingextension/factory.go +++ b/extension/encoding/avrologencodingextension/factory.go @@ -21,7 +21,7 @@ func NewFactory() extension.Factory { ) } -func createExtension(_ context.Context, _ extension.CreateSettings, config component.Config) (extension.Extension, error) { +func createExtension(_ context.Context, _ extension.Settings, config component.Config) (extension.Extension, error) { return newExtension(config.(*Config)) } diff --git a/extension/encoding/avrologencodingextension/generated_component_test.go b/extension/encoding/avrologencodingextension/generated_component_test.go index 79dd96d3e0bd..70406133696a 100644 --- a/extension/encoding/avrologencodingextension/generated_component_test.go +++ b/extension/encoding/avrologencodingextension/generated_component_test.go @@ -30,18 +30,18 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) t.Run("shutdown", func(t *testing.T) { - e, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + e, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) err = e.Shutdown(context.Background()) require.NoError(t, err) }) t.Run("lifecycle", func(t *testing.T) { - firstExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + firstExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, firstExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, firstExt.Shutdown(context.Background())) - secondExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + secondExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, secondExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, secondExt.Shutdown(context.Background())) diff --git a/extension/encoding/avrologencodingextension/go.mod b/extension/encoding/avrologencodingextension/go.mod index 25c55226a8cb..ee7a187c7863 100644 --- a/extension/encoding/avrologencodingextension/go.mod +++ b/extension/encoding/avrologencodingextension/go.mod @@ -1,56 +1,52 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/avrologencodingextension -go 1.21.0 +go 1.22.0 require ( github.com/linkedin/goavro/v2 v2.13.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 go.uber.org/goleak v1.3.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/snappy v0.0.1 // indirect github.com/google/uuid v1.6.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/encoding/avrologencodingextension/go.sum b/extension/encoding/avrologencodingextension/go.sum index 78b3d146df88..148c3cfe3a78 100644 --- a/extension/encoding/avrologencodingextension/go.sum +++ b/extension/encoding/avrologencodingextension/go.sum @@ -1,20 +1,18 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= @@ -30,8 +28,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -50,14 +48,6 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -65,32 +55,36 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -106,20 +100,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -128,12 +122,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/extension/encoding/avrologencodingextension/internal/metadata/generated_status.go b/extension/encoding/avrologencodingextension/internal/metadata/generated_status.go index 9bcab3d3cc37..ebf134a6a1c7 100644 --- a/extension/encoding/avrologencodingextension/internal/metadata/generated_status.go +++ b/extension/encoding/avrologencodingextension/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("avro_log_encoding") + Type = component.MustNewType("avro_log_encoding") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/avrologencodingextension" ) const ( diff --git a/extension/encoding/avrologencodingextension/internal/metadata/generated_telemetry.go b/extension/encoding/avrologencodingextension/internal/metadata/generated_telemetry.go deleted file mode 100644 index dd0f955145b3..000000000000 --- a/extension/encoding/avrologencodingextension/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/avrologencoding") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/avrologencoding") -} diff --git a/extension/encoding/avrologencodingextension/internal/metadata/generated_telemetry_test.go b/extension/encoding/avrologencodingextension/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index cb84538ae23b..000000000000 --- a/extension/encoding/avrologencodingextension/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/avrologencoding", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/avrologencoding", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/encoding/avrologencodingextension/metadata.yaml b/extension/encoding/avrologencodingextension/metadata.yaml index 4ddfa9f57b3e..2b6f9236cc62 100644 --- a/extension/encoding/avrologencodingextension/metadata.yaml +++ b/extension/encoding/avrologencodingextension/metadata.yaml @@ -1,5 +1,4 @@ type: avro_log_encoding -scope_name: otelcol/avrologencoding status: class: extension diff --git a/extension/encoding/avrologencodingextension/testutil.go b/extension/encoding/avrologencodingextension/testutil.go index d2a1944a24b4..9082f5ff7dbc 100644 --- a/extension/encoding/avrologencodingextension/testutil.go +++ b/extension/encoding/avrologencodingextension/testutil.go @@ -10,6 +10,7 @@ import ( "testing" "github.com/linkedin/goavro/v2" + "github.com/stretchr/testify/require" ) func encodeAVROLogTestData(codec *goavro.Codec, data string) []byte { @@ -41,14 +42,10 @@ func createAVROTestData(t *testing.T) (string, []byte) { t.Helper() schema, err := loadAVROSchemaFromFile("testdata/schema1.avro") - if err != nil { - t.Fatalf("Failed to read avro schema file: %q", err.Error()) - } + require.NoError(t, err, "Failed to read avro schema file") codec, err := goavro.NewCodec(string(schema)) - if err != nil { - t.Fatalf("Failed to create avro code from schema: %q", err.Error()) - } + require.NoError(t, err, "Failed to create avro code from schema") data := encodeAVROLogTestData(codec, `{ "timestamp": 1697187201488, diff --git a/extension/encoding/encoding.go b/extension/encoding/encoding.go index 1981420a0130..189466d50de0 100644 --- a/extension/encoding/encoding.go +++ b/extension/encoding/encoding.go @@ -7,6 +7,7 @@ import ( "go.opentelemetry.io/collector/extension" "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/pmetric" + "go.opentelemetry.io/collector/pdata/pprofile" "go.opentelemetry.io/collector/pdata/ptrace" ) @@ -45,3 +46,15 @@ type TracesUnmarshalerExtension interface { extension.Extension ptrace.Unmarshaler } + +// ProfilesMarshalerExtension is an extension that marshals profiles. +type ProfilesMarshalerExtension interface { + extension.Extension + pprofile.Marshaler +} + +// ProfilesUnmarshalerExtension is an extension that unmarshals Profiles. +type ProfilesUnmarshalerExtension interface { + extension.Extension + pprofile.Unmarshaler +} diff --git a/extension/encoding/go.mod b/extension/encoding/go.mod index fbc9879878ab..dc67048fefc8 100644 --- a/extension/encoding/go.mod +++ b/extension/encoding/go.mod @@ -1,37 +1,31 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding -go 1.21.0 +go 1.22.0 require ( - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 ) require ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/knadh/koanf/maps v0.1.1 // indirect - github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect - github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - go.opentelemetry.io/collector/component v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/confmap v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/metric v1.27.0 // indirect - go.opentelemetry.io/otel/trace v1.27.0 // indirect + go.opentelemetry.io/collector/component v0.116.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect ) diff --git a/extension/encoding/go.sum b/extension/encoding/go.sum index 643428dd46c5..2b96a91e02d3 100644 --- a/extension/encoding/go.sum +++ b/extension/encoding/go.sum @@ -1,19 +1,15 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -21,16 +17,6 @@ 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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= -github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= -github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= -github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -39,42 +25,28 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -90,20 +62,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -112,11 +84,11 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/extension/encoding/jaegerencodingextension/README.md b/extension/encoding/jaegerencodingextension/README.md index f008de9db89e..afc3d89fd6fe 100644 --- a/extension/encoding/jaegerencodingextension/README.md +++ b/extension/encoding/jaegerencodingextension/README.md @@ -8,5 +8,5 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fjaegerencoding%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fjaegerencoding) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fjaegerencoding%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fjaegerencoding) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@MovieStoreGuy](https://www.github.com/MovieStoreGuy), [@atoulme](https://www.github.com/atoulme) | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha \ No newline at end of file diff --git a/extension/encoding/jaegerencodingextension/extension.go b/extension/encoding/jaegerencodingextension/extension.go index a035a589b970..97af945e3736 100644 --- a/extension/encoding/jaegerencodingextension/extension.go +++ b/extension/encoding/jaegerencodingextension/extension.go @@ -13,8 +13,10 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding" ) -var _ encoding.TracesUnmarshalerExtension = &jaegerExtension{} -var _ ptrace.Unmarshaler = &jaegerExtension{} +var ( + _ encoding.TracesUnmarshalerExtension = &jaegerExtension{} + _ ptrace.Unmarshaler = &jaegerExtension{} +) type jaegerExtension struct { config *Config diff --git a/extension/encoding/jaegerencodingextension/extension_test.go b/extension/encoding/jaegerencodingextension/extension_test.go index 735f8d79c63c..76e389356a42 100644 --- a/extension/encoding/jaegerencodingextension/extension_test.go +++ b/extension/encoding/jaegerencodingextension/extension_test.go @@ -23,7 +23,7 @@ func TestExtension_Start(t *testing.T) { name: "jaegerProtobuf", getExtension: func() (extension.Extension, error) { factory := NewFactory() - return factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), factory.CreateDefaultConfig()) + return factory.Create(context.Background(), extensiontest.NewNopSettings(), factory.CreateDefaultConfig()) }, }, { @@ -32,7 +32,7 @@ func TestExtension_Start(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() cfg.(*Config).Protocol = "xyz" - return factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + return factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) }, expectedErr: "unsupported protocol: \"xyz\"", }, diff --git a/extension/encoding/jaegerencodingextension/factory.go b/extension/encoding/jaegerencodingextension/factory.go index d4cfdc31e5db..615850740c61 100644 --- a/extension/encoding/jaegerencodingextension/factory.go +++ b/extension/encoding/jaegerencodingextension/factory.go @@ -21,7 +21,7 @@ func NewFactory() extension.Factory { ) } -func createExtension(_ context.Context, _ extension.CreateSettings, config component.Config) (extension.Extension, error) { +func createExtension(_ context.Context, _ extension.Settings, config component.Config) (extension.Extension, error) { return &jaegerExtension{ config: config.(*Config), }, nil diff --git a/extension/encoding/jaegerencodingextension/generated_component_test.go b/extension/encoding/jaegerencodingextension/generated_component_test.go index 90a57bc20a66..23d823450082 100644 --- a/extension/encoding/jaegerencodingextension/generated_component_test.go +++ b/extension/encoding/jaegerencodingextension/generated_component_test.go @@ -30,18 +30,18 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) t.Run("shutdown", func(t *testing.T) { - e, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + e, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) err = e.Shutdown(context.Background()) require.NoError(t, err) }) t.Run("lifecycle", func(t *testing.T) { - firstExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + firstExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, firstExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, firstExt.Shutdown(context.Background())) - secondExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + secondExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, secondExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, secondExt.Shutdown(context.Background())) diff --git a/extension/encoding/jaegerencodingextension/go.mod b/extension/encoding/jaegerencodingextension/go.mod index 2cad2816a55c..07e658edc942 100644 --- a/extension/encoding/jaegerencodingextension/go.mod +++ b/extension/encoding/jaegerencodingextension/go.mod @@ -1,59 +1,55 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/jaegerencodingextension -go 1.21.0 +go 1.22.7 require ( github.com/gogo/protobuf v1.3.2 - github.com/jaegertracing/jaeger v1.57.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/jaegertracing/jaeger v1.63.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 go.uber.org/goleak v1.3.0 ) require ( - github.com/apache/thrift v0.20.0 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/apache/thrift v0.21.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/google/uuid v1.6.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/semconv v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/semconv v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/encoding/jaegerencodingextension/go.sum b/extension/encoding/jaegerencodingextension/go.sum index 43ee5d5749e6..ad739ab79da3 100644 --- a/extension/encoding/jaegerencodingextension/go.sum +++ b/extension/encoding/jaegerencodingextension/go.sum @@ -1,29 +1,27 @@ -github.com/apache/thrift v0.20.0 h1:631+KvYbsBZxmuJjYwhezVsrfc/TbqtZV4QcxOX1fOI= -github.com/apache/thrift v0.20.0/go.mod h1:hOk1BQqcp2OLzGsyVXdfMk7YFlMxK3aoEVhjD06QhB8= -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE= +github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/jaegertracing/jaeger v1.57.0 h1:3wDtUUPs6NRYH7+d+y8MilDkLHdpPrVlQ2wbcsA62bs= -github.com/jaegertracing/jaeger v1.57.0/go.mod h1:p/1fxIU9hKHl7qEhKC72p2ZYVhvvZvNB73y6V7YyuTs= +github.com/jaegertracing/jaeger v1.63.0 h1:4p1lg4DyZ1rZl5gCt6nnQ0nllcXVLJ96sTSbd+rnOEo= +github.com/jaegertracing/jaeger v1.63.0/go.mod h1:ZCqGiUdcAPC8HwqQGOjl89HDNEqseArdWcH+yoZxRtk= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -32,8 +30,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -50,46 +48,42 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -105,20 +99,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -127,12 +121,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 h1:QCqS/PdaHTSWGvupk2F/ehwHtGc0/GYkT+3GAcR1CCc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/extension/encoding/jaegerencodingextension/internal/metadata/generated_status.go b/extension/encoding/jaegerencodingextension/internal/metadata/generated_status.go index eb48100797fb..1496463008ae 100644 --- a/extension/encoding/jaegerencodingextension/internal/metadata/generated_status.go +++ b/extension/encoding/jaegerencodingextension/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("jaeger_encoding") + Type = component.MustNewType("jaeger_encoding") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/jaegerencodingextension" ) const ( diff --git a/extension/encoding/jaegerencodingextension/internal/metadata/generated_telemetry.go b/extension/encoding/jaegerencodingextension/internal/metadata/generated_telemetry.go deleted file mode 100644 index efa1938e528a..000000000000 --- a/extension/encoding/jaegerencodingextension/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/jaegerencoding") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/jaegerencoding") -} diff --git a/extension/encoding/jaegerencodingextension/internal/metadata/generated_telemetry_test.go b/extension/encoding/jaegerencodingextension/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index f35418572ae4..000000000000 --- a/extension/encoding/jaegerencodingextension/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/jaegerencoding", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/jaegerencoding", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/encoding/jaegerencodingextension/jaeger.go b/extension/encoding/jaegerencodingextension/jaeger.go index c3321882a9ff..3f56a723cdd1 100644 --- a/extension/encoding/jaegerencodingextension/jaeger.go +++ b/extension/encoding/jaegerencodingextension/jaeger.go @@ -13,8 +13,7 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger" ) -type jaegerProtobufTrace struct { -} +type jaegerProtobufTrace struct{} func (j jaegerProtobufTrace) UnmarshalTraces(buf []byte) (ptrace.Traces, error) { span := &jaegerproto.Span{} @@ -25,8 +24,7 @@ func (j jaegerProtobufTrace) UnmarshalTraces(buf []byte) (ptrace.Traces, error) return jaegerSpanToTraces(span) } -type jaegerJSONTrace struct { -} +type jaegerJSONTrace struct{} func (j jaegerJSONTrace) UnmarshalTraces(buf []byte) (ptrace.Traces, error) { span := &jaegerproto.Span{} diff --git a/extension/encoding/jaegerencodingextension/jaeger_test.go b/extension/encoding/jaegerencodingextension/jaeger_test.go index 674b0c0ba82f..a1888a434c36 100644 --- a/extension/encoding/jaegerencodingextension/jaeger_test.go +++ b/extension/encoding/jaegerencodingextension/jaeger_test.go @@ -24,8 +24,7 @@ func TestUnmarshalJaeger(t *testing.T) { span.SetEndTimestamp(pcommon.Timestamp(20)) span.SetTraceID([16]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}) span.SetSpanID([8]byte{1, 2, 3, 4, 5, 6, 7, 8}) - batches, err := jaeger.ProtoFromTraces(td) - require.NoError(t, err) + batches := jaeger.ProtoFromTraces(td) protoBytes, err := batches[0].Spans[0].Marshal() require.NoError(t, err) diff --git a/extension/encoding/jaegerencodingextension/metadata.yaml b/extension/encoding/jaegerencodingextension/metadata.yaml index 794cd260c960..09c2fd0708c4 100644 --- a/extension/encoding/jaegerencodingextension/metadata.yaml +++ b/extension/encoding/jaegerencodingextension/metadata.yaml @@ -1,5 +1,4 @@ type: jaeger_encoding -scope_name: otelcol/jaegerencoding status: class: extension diff --git a/extension/encoding/jsonlogencodingextension/README.md b/extension/encoding/jsonlogencodingextension/README.md index 29d0a6c42518..03722c68d27a 100644 --- a/extension/encoding/jsonlogencodingextension/README.md +++ b/extension/encoding/jsonlogencodingextension/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fjsonlogencoding%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fjsonlogencoding) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fjsonlogencoding%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fjsonlogencoding) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@VihasMakwana](https://www.github.com/VihasMakwana), [@atoulme](https://www.github.com/atoulme) | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha ## Configuration diff --git a/extension/encoding/jsonlogencodingextension/extension.go b/extension/encoding/jsonlogencodingextension/extension.go index 1b3f10c01564..18575859ce7f 100644 --- a/extension/encoding/jsonlogencodingextension/extension.go +++ b/extension/encoding/jsonlogencodingextension/extension.go @@ -6,9 +6,8 @@ package jsonlogencodingextension // import "github.com/open-telemetry/openteleme import ( "context" "fmt" - "time" - jsoniter "github.com/json-iterator/go" + "github.com/goccy/go-json" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" @@ -29,38 +28,45 @@ func (e *jsonLogExtension) MarshalLogs(ld plog.Logs) ([]byte, error) { if e.config.(*Config).Mode == JSONEncodingModeBodyWithInlineAttributes { return e.logProcessor(ld) } - logRecord := ld.ResourceLogs().At(0).ScopeLogs().At(0).LogRecords().At(0).Body() - var raw map[string]any - switch logRecord.Type() { - case pcommon.ValueTypeMap: - raw = logRecord.Map().AsRaw() - default: - return nil, fmt.Errorf("Marshal: Expected 'Map' found '%v'", logRecord.Type().String()) - } - buf, err := jsoniter.Marshal(raw) - if err != nil { - return nil, err + logs := make([]map[string]any, 0, ld.LogRecordCount()) + + rls := ld.ResourceLogs() + for i := 0; i < rls.Len(); i++ { + rl := rls.At(i) + sls := rl.ScopeLogs() + for j := 0; j < sls.Len(); j++ { + sl := sls.At(j) + logSlice := sl.LogRecords() + for k := 0; k < logSlice.Len(); k++ { + log := logSlice.At(k) + switch log.Body().Type() { + case pcommon.ValueTypeMap: + logs = append(logs, log.Body().Map().AsRaw()) + default: + return nil, fmt.Errorf("marshal: expected 'Map' found '%v'", log.Body().Type()) + } + } + } } - return buf, nil + return json.Marshal(logs) } func (e *jsonLogExtension) UnmarshalLogs(buf []byte) (plog.Logs, error) { p := plog.NewLogs() // get json logs from the buffer - jsonVal := map[string]any{} - if err := jsoniter.Unmarshal(buf, &jsonVal); err != nil { + var jsonVal []map[string]any + if err := json.Unmarshal(buf, &jsonVal); err != nil { return p, err } - // create a new log record - logRecords := p.ResourceLogs().AppendEmpty().ScopeLogs().AppendEmpty().LogRecords().AppendEmpty() - logRecords.SetObservedTimestamp(pcommon.NewTimestampFromTime(time.Now())) - - // Set the unmarshaled jsonVal as the body of the log record - if err := logRecords.Body().SetEmptyMap().FromRaw(jsonVal); err != nil { - return p, err + sl := p.ResourceLogs().AppendEmpty().ScopeLogs().AppendEmpty() + for _, r := range jsonVal { + if err := sl.LogRecords().AppendEmpty().Body().SetEmptyMap().FromRaw(r); err != nil { + return p, err + } } + return p, nil } @@ -73,7 +79,7 @@ func (e *jsonLogExtension) Shutdown(_ context.Context) error { } func (e *jsonLogExtension) logProcessor(ld plog.Logs) ([]byte, error) { - logs := make([]logBody, ld.ResourceLogs().Len()-1) + logs := make([]logBody, 0, ld.LogRecordCount()) rls := ld.ResourceLogs() for i := 0; i < rls.Len(); i++ { @@ -96,7 +102,7 @@ func (e *jsonLogExtension) logProcessor(ld plog.Logs) ([]byte, error) { } } - return jsoniter.Marshal(logs) + return json.Marshal(logs) } type logBody struct { diff --git a/extension/encoding/jsonlogencodingextension/factory.go b/extension/encoding/jsonlogencodingextension/factory.go index e83d27234b5b..8a2136270c63 100644 --- a/extension/encoding/jsonlogencodingextension/factory.go +++ b/extension/encoding/jsonlogencodingextension/factory.go @@ -21,7 +21,7 @@ func NewFactory() extension.Factory { ) } -func createExtension(_ context.Context, _ extension.CreateSettings, config component.Config) (extension.Extension, error) { +func createExtension(_ context.Context, _ extension.Settings, config component.Config) (extension.Extension, error) { return &jsonLogExtension{ config: config, }, nil diff --git a/extension/encoding/jsonlogencodingextension/generated_component_test.go b/extension/encoding/jsonlogencodingextension/generated_component_test.go index 2aec423296cd..4f2d06da86b9 100644 --- a/extension/encoding/jsonlogencodingextension/generated_component_test.go +++ b/extension/encoding/jsonlogencodingextension/generated_component_test.go @@ -30,18 +30,18 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) t.Run("shutdown", func(t *testing.T) { - e, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + e, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) err = e.Shutdown(context.Background()) require.NoError(t, err) }) t.Run("lifecycle", func(t *testing.T) { - firstExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + firstExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, firstExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, firstExt.Shutdown(context.Background())) - secondExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + secondExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, secondExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, secondExt.Shutdown(context.Background())) diff --git a/extension/encoding/jsonlogencodingextension/go.mod b/extension/encoding/jsonlogencodingextension/go.mod index be5227624dcd..8d11d92c86e4 100644 --- a/extension/encoding/jsonlogencodingextension/go.mod +++ b/extension/encoding/jsonlogencodingextension/go.mod @@ -1,54 +1,51 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/jsonlogencodingextension -go 1.21.0 +go 1.22.0 require ( - github.com/json-iterator/go v1.1.12 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/goccy/go-json v0.10.4 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 go.uber.org/goleak v1.3.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/encoding/jsonlogencodingextension/go.sum b/extension/encoding/jsonlogencodingextension/go.sum index c0b1fee666b1..bde0845169ce 100644 --- a/extension/encoding/jsonlogencodingextension/go.sum +++ b/extension/encoding/jsonlogencodingextension/go.sum @@ -1,20 +1,20 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= +github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -28,8 +28,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -46,44 +46,40 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -99,20 +95,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -121,12 +117,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/extension/encoding/jsonlogencodingextension/internal/metadata/generated_status.go b/extension/encoding/jsonlogencodingextension/internal/metadata/generated_status.go index 983ca924583e..de0de5152599 100644 --- a/extension/encoding/jsonlogencodingextension/internal/metadata/generated_status.go +++ b/extension/encoding/jsonlogencodingextension/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("json_log_encoding") + Type = component.MustNewType("json_log_encoding") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/jsonlogencodingextension" ) const ( diff --git a/extension/encoding/jsonlogencodingextension/internal/metadata/generated_telemetry.go b/extension/encoding/jsonlogencodingextension/internal/metadata/generated_telemetry.go deleted file mode 100644 index 11bcc36d9c1b..000000000000 --- a/extension/encoding/jsonlogencodingextension/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/jsonlogencoding") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/jsonlogencoding") -} diff --git a/extension/encoding/jsonlogencodingextension/internal/metadata/generated_telemetry_test.go b/extension/encoding/jsonlogencodingextension/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index c83485bfb893..000000000000 --- a/extension/encoding/jsonlogencodingextension/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/jsonlogencoding", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/jsonlogencoding", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/encoding/jsonlogencodingextension/json_test.go b/extension/encoding/jsonlogencodingextension/json_test.go index f463cc182609..38daf73916dc 100644 --- a/extension/encoding/jsonlogencodingextension/json_test.go +++ b/extension/encoding/jsonlogencodingextension/json_test.go @@ -17,15 +17,15 @@ func TestMarshalUnmarshal(t *testing.T) { Mode: JSONEncodingModeBody, }, } - json := `{"example":"example valid json to test that the unmarshaler is correctly returning a plog value"}` + json := `[{"example":"example valid json to test that the unmarshaler is correctly returning a plog value"}]` ld, err := e.UnmarshalLogs([]byte(json)) assert.NoError(t, err) assert.Equal(t, 1, ld.LogRecordCount()) buf, err := e.MarshalLogs(ld) assert.NoError(t, err) - assert.True(t, len(buf) > 0) - assert.Equal(t, json, string(buf)) + assert.NotEmpty(t, buf) + assert.JSONEq(t, json, string(buf)) } func TestInvalidMarshal(t *testing.T) { @@ -37,7 +37,7 @@ func TestInvalidMarshal(t *testing.T) { p := plog.NewLogs() p.ResourceLogs().AppendEmpty().ScopeLogs().AppendEmpty().LogRecords().AppendEmpty().Body().SetStr("NOT A MAP") _, err := e.MarshalLogs(p) - assert.ErrorContains(t, err, "Marshal: Expected 'Map' found 'Str'") + assert.ErrorContains(t, err, "marshal: expected 'Map' found 'Str'") } func TestInvalidUnmarshal(t *testing.T) { @@ -47,7 +47,7 @@ func TestInvalidUnmarshal(t *testing.T) { }, } _, err := e.UnmarshalLogs([]byte("NOT A JSON")) - assert.ErrorContains(t, err, "ReadMapCB: expect { or n, but found N") + assert.ErrorContains(t, err, "json: slice unexpected end of JSON input") } func TestPrettyLogProcessor(t *testing.T) { @@ -59,7 +59,7 @@ func TestPrettyLogProcessor(t *testing.T) { lp, err := j.logProcessor(sampleLog()) assert.NoError(t, err) assert.NotNil(t, lp) - assert.Equal(t, string(lp), `[{"body":{"log":"test"},"logAttributes":{"foo":"bar"},"resourceAttributes":{"test":"logs-test"}},{"body":"log testing","resourceAttributes":{"test":"logs-test"}}]`) + assert.JSONEq(t, `[{"body":{"log":"test"},"logAttributes":{"foo":"bar"},"resourceAttributes":{"test":"logs-test"}},{"body":"log testing","resourceAttributes":{"test":"logs-test"}}]`, string(lp)) } func sampleLog() plog.Logs { diff --git a/extension/encoding/jsonlogencodingextension/metadata.yaml b/extension/encoding/jsonlogencodingextension/metadata.yaml index 62e34f14a700..d2856dbc2349 100644 --- a/extension/encoding/jsonlogencodingextension/metadata.yaml +++ b/extension/encoding/jsonlogencodingextension/metadata.yaml @@ -1,5 +1,4 @@ type: json_log_encoding -scope_name: otelcol/jsonlogencoding status: class: extension diff --git a/extension/encoding/otlpencodingextension/README.md b/extension/encoding/otlpencodingextension/README.md index 8d7d4db81b7f..9be1c70a0726 100644 --- a/extension/encoding/otlpencodingextension/README.md +++ b/extension/encoding/otlpencodingextension/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fotlpencoding%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fotlpencoding) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fotlpencoding%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fotlpencoding) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@dao-jun](https://www.github.com/dao-jun), [@VihasMakwana](https://www.github.com/VihasMakwana) | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha This extension unmarshals and marshals data encoded according to the [OTLP specification](https://opentelemetry.io/docs/specs/otlp/). diff --git a/extension/encoding/otlpencodingextension/extension.go b/extension/encoding/otlpencodingextension/extension.go index 748f0a536e5a..375180d11d37 100644 --- a/extension/encoding/otlpencodingextension/extension.go +++ b/extension/encoding/otlpencodingextension/extension.go @@ -10,6 +10,7 @@ import ( "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/pmetric" + "go.opentelemetry.io/collector/pdata/pprofile" "go.opentelemetry.io/collector/pdata/ptrace" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding" @@ -21,22 +22,26 @@ const ( ) var ( - _ encoding.TracesMarshalerExtension = (*otlpExtension)(nil) - _ encoding.TracesUnmarshalerExtension = (*otlpExtension)(nil) - _ encoding.LogsMarshalerExtension = (*otlpExtension)(nil) - _ encoding.LogsUnmarshalerExtension = (*otlpExtension)(nil) - _ encoding.MetricsMarshalerExtension = (*otlpExtension)(nil) - _ encoding.MetricsUnmarshalerExtension = (*otlpExtension)(nil) + _ encoding.TracesMarshalerExtension = (*otlpExtension)(nil) + _ encoding.TracesUnmarshalerExtension = (*otlpExtension)(nil) + _ encoding.LogsMarshalerExtension = (*otlpExtension)(nil) + _ encoding.LogsUnmarshalerExtension = (*otlpExtension)(nil) + _ encoding.MetricsMarshalerExtension = (*otlpExtension)(nil) + _ encoding.MetricsUnmarshalerExtension = (*otlpExtension)(nil) + _ encoding.ProfilesMarshalerExtension = (*otlpExtension)(nil) + _ encoding.ProfilesUnmarshalerExtension = (*otlpExtension)(nil) ) type otlpExtension struct { - config *Config - traceMarshaler ptrace.Marshaler - traceUnmarshaler ptrace.Unmarshaler - logMarshaler plog.Marshaler - logUnmarshaler plog.Unmarshaler - metricMarshaler pmetric.Marshaler - metricUnmarshaler pmetric.Unmarshaler + config *Config + traceMarshaler ptrace.Marshaler + traceUnmarshaler ptrace.Unmarshaler + logMarshaler plog.Marshaler + logUnmarshaler plog.Unmarshaler + metricMarshaler pmetric.Marshaler + metricUnmarshaler pmetric.Unmarshaler + profileMarshaler pprofile.Marshaler + profileUnmarshaler pprofile.Unmarshaler } func newExtension(config *Config) (*otlpExtension, error) { @@ -46,23 +51,27 @@ func newExtension(config *Config) (*otlpExtension, error) { switch protocol { case otlpProto: ex = &otlpExtension{ - config: config, - traceMarshaler: &ptrace.ProtoMarshaler{}, - traceUnmarshaler: &ptrace.ProtoUnmarshaler{}, - logMarshaler: &plog.ProtoMarshaler{}, - logUnmarshaler: &plog.ProtoUnmarshaler{}, - metricMarshaler: &pmetric.ProtoMarshaler{}, - metricUnmarshaler: &pmetric.ProtoUnmarshaler{}, + config: config, + traceMarshaler: &ptrace.ProtoMarshaler{}, + traceUnmarshaler: &ptrace.ProtoUnmarshaler{}, + logMarshaler: &plog.ProtoMarshaler{}, + logUnmarshaler: &plog.ProtoUnmarshaler{}, + metricMarshaler: &pmetric.ProtoMarshaler{}, + metricUnmarshaler: &pmetric.ProtoUnmarshaler{}, + profileMarshaler: &pprofile.ProtoMarshaler{}, + profileUnmarshaler: &pprofile.ProtoUnmarshaler{}, } case otlpJSON: ex = &otlpExtension{ - config: config, - traceMarshaler: &ptrace.JSONMarshaler{}, - traceUnmarshaler: &ptrace.JSONUnmarshaler{}, - logMarshaler: &plog.JSONMarshaler{}, - logUnmarshaler: &plog.JSONUnmarshaler{}, - metricMarshaler: &pmetric.JSONMarshaler{}, - metricUnmarshaler: &pmetric.JSONUnmarshaler{}, + config: config, + traceMarshaler: &ptrace.JSONMarshaler{}, + traceUnmarshaler: &ptrace.JSONUnmarshaler{}, + logMarshaler: &plog.JSONMarshaler{}, + logUnmarshaler: &plog.JSONUnmarshaler{}, + metricMarshaler: &pmetric.JSONMarshaler{}, + metricUnmarshaler: &pmetric.JSONUnmarshaler{}, + profileMarshaler: &pprofile.JSONMarshaler{}, + profileUnmarshaler: &pprofile.JSONUnmarshaler{}, } default: err = fmt.Errorf("unsupported protocol: %q", protocol) @@ -95,6 +104,16 @@ func (ex *otlpExtension) MarshalLogs(logs plog.Logs) ([]byte, error) { return ex.logMarshaler.MarshalLogs(logs) } +// UnmarshalProfiles implements encoding.ProfilesUnmarshalerExtension. +func (ex *otlpExtension) UnmarshalProfiles(buf []byte) (pprofile.Profiles, error) { + return ex.profileUnmarshaler.UnmarshalProfiles(buf) +} + +// MarshalProfiles implements encoding.ProfilesMarshalerExtension. +func (ex *otlpExtension) MarshalProfiles(profiles pprofile.Profiles) ([]byte, error) { + return ex.profileMarshaler.MarshalProfiles(profiles) +} + func (ex *otlpExtension) Start(_ context.Context, _ component.Host) error { return nil } diff --git a/extension/encoding/otlpencodingextension/extension_test.go b/extension/encoding/otlpencodingextension/extension_test.go index f4a9a082ea39..44d6aa5fa1f0 100644 --- a/extension/encoding/otlpencodingextension/extension_test.go +++ b/extension/encoding/otlpencodingextension/extension_test.go @@ -14,6 +14,7 @@ import ( "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/pmetric" + "go.opentelemetry.io/collector/pdata/pprofile" "go.opentelemetry.io/collector/pdata/ptrace" ) @@ -29,7 +30,7 @@ func TestExtension_Start(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() cfg.(*Config).Protocol = "otlp_json" - return factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + return factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) }, }, @@ -39,7 +40,7 @@ func TestExtension_Start(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() cfg.(*Config).Protocol = "otlp_proto" - return factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + return factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) }, }, } @@ -61,7 +62,7 @@ func TestExtension_Start(t *testing.T) { } } -func testOTLPMarshal(ex *otlpExtension, t *testing.T) { +func testOTLPMarshal(t *testing.T, ex *otlpExtension) { traces := generateTraces() _, err := ex.MarshalTraces(traces) require.NoError(t, err) @@ -73,12 +74,17 @@ func testOTLPMarshal(ex *otlpExtension, t *testing.T) { metrics := generateMetrics() _, err = ex.MarshalMetrics(metrics) require.NoError(t, err) + + profiles := generateProfiles() + _, err = ex.MarshalProfiles(profiles) + require.NoError(t, err) } -func testOTLPUnmarshal(ex *otlpExtension, t *testing.T) { +func testOTLPUnmarshal(t *testing.T, ex *otlpExtension) { traces := generateTraces() logs := generateLogs() metrics := generateMetrics() + profiles := generateProfiles() traceBuf, err := ex.MarshalTraces(traces) require.NoError(t, err) @@ -86,6 +92,8 @@ func testOTLPUnmarshal(ex *otlpExtension, t *testing.T) { require.NoError(t, err) metricBuf, err := ex.MarshalMetrics(metrics) require.NoError(t, err) + profileBuf, err := ex.MarshalProfiles(profiles) + require.NoError(t, err) traces0, err := ex.UnmarshalTraces(traceBuf) require.NoError(t, err) @@ -93,41 +101,44 @@ func testOTLPUnmarshal(ex *otlpExtension, t *testing.T) { require.NoError(t, err) metrics0, err := ex.UnmarshalMetrics(metricBuf) require.NoError(t, err) + profiles0, err := ex.UnmarshalProfiles(profileBuf) + require.NoError(t, err) require.Equal(t, traces0.ResourceSpans().Len(), traces.ResourceSpans().Len()) require.Equal(t, logs0.ResourceLogs().Len(), logs.ResourceLogs().Len()) require.Equal(t, metrics0.ResourceMetrics().Len(), metrics.ResourceMetrics().Len()) + require.Equal(t, profiles0.ResourceProfiles().Len(), profiles.ResourceProfiles().Len()) } func TestOTLPJSONMarshal(t *testing.T) { conf := &Config{Protocol: otlpJSON} - ex := createAndExtension0(conf, t) + ex := createAndExtension0(t, conf) - testOTLPMarshal(ex, t) + testOTLPMarshal(t, ex) } func TestOTLPProtoMarshal(t *testing.T) { conf := &Config{Protocol: otlpProto} - ex := createAndExtension0(conf, t) + ex := createAndExtension0(t, conf) - testOTLPMarshal(ex, t) + testOTLPMarshal(t, ex) } func TestOTLPJSONUnmarshal(t *testing.T) { conf := &Config{Protocol: otlpJSON} - ex := createAndExtension0(conf, t) - testOTLPUnmarshal(ex, t) + ex := createAndExtension0(t, conf) + testOTLPUnmarshal(t, ex) } func TestOTLPProtoUnmarshal(t *testing.T) { conf := &Config{Protocol: otlpProto} - ex := createAndExtension0(conf, t) + ex := createAndExtension0(t, conf) - testOTLPUnmarshal(ex, t) + testOTLPUnmarshal(t, ex) } // createAndExtension0 Create extension -func createAndExtension0(c *Config, t *testing.T) *otlpExtension { +func createAndExtension0(t *testing.T, c *Config) *otlpExtension { ex, err := newExtension(c) require.NoError(t, err) err = ex.Start(context.TODO(), nil) @@ -136,7 +147,7 @@ func createAndExtension0(c *Config, t *testing.T) *otlpExtension { } func generateTraces() ptrace.Traces { - var num = 10 + num := 10 now := time.Now() md := ptrace.NewTraces() ilm := md.ResourceSpans().AppendEmpty().ScopeSpans().AppendEmpty() @@ -151,7 +162,7 @@ func generateTraces() ptrace.Traces { } func generateLogs() plog.Logs { - var num = 10 + num := 10 md := plog.NewLogs() ilm := md.ResourceLogs().AppendEmpty().ScopeLogs().AppendEmpty() ilm.LogRecords().EnsureCapacity(num) @@ -163,7 +174,7 @@ func generateLogs() plog.Logs { } func generateMetrics() pmetric.Metrics { - var num = 10 + num := 10 now := time.Now() startTime := pcommon.NewTimestampFromTime(now.Add(-10 * time.Second)) endTime := pcommon.NewTimestampFromTime(now) @@ -181,3 +192,18 @@ func generateMetrics() pmetric.Metrics { } return md } + +func generateProfiles() pprofile.Profiles { + num := 10 + now := time.Now() + pd := pprofile.NewProfiles() + ilm := pd.ResourceProfiles().AppendEmpty().ScopeProfiles().AppendEmpty() + ilm.Profiles().EnsureCapacity(num) + for i := 0; i < num; i++ { + im := ilm.Profiles().AppendEmpty() + im.SetProfileID([16]byte{0x01, 0x02, 0x03, 0x04}) + im.SetStartTime(pcommon.NewTimestampFromTime(now)) + im.SetDuration(pcommon.NewTimestampFromTime(time.Now())) + } + return pd +} diff --git a/extension/encoding/otlpencodingextension/factory.go b/extension/encoding/otlpencodingextension/factory.go index 14202bc8b68e..ff2bb5c797d0 100644 --- a/extension/encoding/otlpencodingextension/factory.go +++ b/extension/encoding/otlpencodingextension/factory.go @@ -21,7 +21,7 @@ func NewFactory() extension.Factory { ) } -func createExtension(_ context.Context, _ extension.CreateSettings, config component.Config) (extension.Extension, error) { +func createExtension(_ context.Context, _ extension.Settings, config component.Config) (extension.Extension, error) { return newExtension(config.(*Config)) } diff --git a/extension/encoding/otlpencodingextension/generated_component_test.go b/extension/encoding/otlpencodingextension/generated_component_test.go index 7b9289bead37..a67570aaf07e 100644 --- a/extension/encoding/otlpencodingextension/generated_component_test.go +++ b/extension/encoding/otlpencodingextension/generated_component_test.go @@ -30,18 +30,18 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) t.Run("shutdown", func(t *testing.T) { - e, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + e, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) err = e.Shutdown(context.Background()) require.NoError(t, err) }) t.Run("lifecycle", func(t *testing.T) { - firstExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + firstExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, firstExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, firstExt.Shutdown(context.Background())) - secondExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + secondExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, secondExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, secondExt.Shutdown(context.Background())) diff --git a/extension/encoding/otlpencodingextension/go.mod b/extension/encoding/otlpencodingextension/go.mod index 16b6c5b36281..6bf7a5f71b98 100644 --- a/extension/encoding/otlpencodingextension/go.mod +++ b/extension/encoding/otlpencodingextension/go.mod @@ -1,54 +1,50 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/otlpencodingextension -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 go.uber.org/goleak v1.3.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/encoding/otlpencodingextension/go.sum b/extension/encoding/otlpencodingextension/go.sum index c0b1fee666b1..0973be202107 100644 --- a/extension/encoding/otlpencodingextension/go.sum +++ b/extension/encoding/otlpencodingextension/go.sum @@ -1,20 +1,18 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -28,8 +26,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -46,44 +44,40 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -99,20 +93,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -121,12 +115,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/extension/encoding/otlpencodingextension/internal/metadata/generated_status.go b/extension/encoding/otlpencodingextension/internal/metadata/generated_status.go index 52879c3c7049..259c18ce7226 100644 --- a/extension/encoding/otlpencodingextension/internal/metadata/generated_status.go +++ b/extension/encoding/otlpencodingextension/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("otlp_encoding") + Type = component.MustNewType("otlp_encoding") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/otlpencodingextension" ) const ( diff --git a/extension/encoding/otlpencodingextension/internal/metadata/generated_telemetry.go b/extension/encoding/otlpencodingextension/internal/metadata/generated_telemetry.go deleted file mode 100644 index 7765a595edbc..000000000000 --- a/extension/encoding/otlpencodingextension/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/otlpencoding") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/otlpencoding") -} diff --git a/extension/encoding/otlpencodingextension/internal/metadata/generated_telemetry_test.go b/extension/encoding/otlpencodingextension/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 34c0280a8e2b..000000000000 --- a/extension/encoding/otlpencodingextension/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/otlpencoding", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/otlpencoding", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/encoding/otlpencodingextension/metadata.yaml b/extension/encoding/otlpencodingextension/metadata.yaml index 10c703d30743..b7497519e4aa 100644 --- a/extension/encoding/otlpencodingextension/metadata.yaml +++ b/extension/encoding/otlpencodingextension/metadata.yaml @@ -1,5 +1,4 @@ type: otlp_encoding -scope_name: otelcol/otlpencoding status: class: extension diff --git a/extension/encoding/textencodingextension/README.md b/extension/encoding/textencodingextension/README.md index 1c74dbc8815c..924a29f66eb6 100644 --- a/extension/encoding/textencodingextension/README.md +++ b/extension/encoding/textencodingextension/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Ftextencoding%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Ftextencoding) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Ftextencoding%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Ftextencoding) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@MovieStoreGuy](https://www.github.com/MovieStoreGuy), [@atoulme](https://www.github.com/atoulme) | -[development]: https://github.com/open-telemetry/opentelemetry-collector#development +[development]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#development The `text_encoding` extension is an encoding extension that can unmarshal and marshal logs. diff --git a/extension/encoding/textencodingextension/extension_test.go b/extension/encoding/textencodingextension/extension_test.go index 26141dd8b0ac..cbe144405300 100644 --- a/extension/encoding/textencodingextension/extension_test.go +++ b/extension/encoding/textencodingextension/extension_test.go @@ -23,7 +23,7 @@ func TestExtension_Start(t *testing.T) { name: "text", getExtension: func() (extension.Extension, error) { factory := NewFactory() - return factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), factory.CreateDefaultConfig()) + return factory.Create(context.Background(), extensiontest.NewNopSettings(), factory.CreateDefaultConfig()) }, }, { @@ -32,7 +32,7 @@ func TestExtension_Start(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() cfg.(*Config).Encoding = "gbk" - return factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + return factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) }, }, { @@ -41,7 +41,7 @@ func TestExtension_Start(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() cfg.(*Config).Encoding = "blabla" - return factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + return factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) }, expectedErr: "unsupported encoding 'blabla'", }, diff --git a/extension/encoding/textencodingextension/factory.go b/extension/encoding/textencodingextension/factory.go index dc5c59a7d869..8e847f1e9129 100644 --- a/extension/encoding/textencodingextension/factory.go +++ b/extension/encoding/textencodingextension/factory.go @@ -21,7 +21,7 @@ func NewFactory() extension.Factory { ) } -func createExtension(_ context.Context, _ extension.CreateSettings, config component.Config) (extension.Extension, error) { +func createExtension(_ context.Context, _ extension.Settings, config component.Config) (extension.Extension, error) { return &textExtension{ config: config.(*Config), }, nil diff --git a/extension/encoding/textencodingextension/generated_component_test.go b/extension/encoding/textencodingextension/generated_component_test.go index 61502700b6a2..27b9fade7d41 100644 --- a/extension/encoding/textencodingextension/generated_component_test.go +++ b/extension/encoding/textencodingextension/generated_component_test.go @@ -30,18 +30,18 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) t.Run("shutdown", func(t *testing.T) { - e, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + e, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) err = e.Shutdown(context.Background()) require.NoError(t, err) }) t.Run("lifecycle", func(t *testing.T) { - firstExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + firstExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, firstExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, firstExt.Shutdown(context.Background())) - secondExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + secondExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, secondExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, secondExt.Shutdown(context.Background())) diff --git a/extension/encoding/textencodingextension/go.mod b/extension/encoding/textencodingextension/go.mod index 4debaa570829..2d585794c6b9 100644 --- a/extension/encoding/textencodingextension/go.mod +++ b/extension/encoding/textencodingextension/go.mod @@ -1,55 +1,51 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/textencodingextension -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 go.uber.org/goleak v1.3.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/encoding/textencodingextension/go.sum b/extension/encoding/textencodingextension/go.sum index db46d2b1e72a..c5fe45202fd8 100644 --- a/extension/encoding/textencodingextension/go.sum +++ b/extension/encoding/textencodingextension/go.sum @@ -1,20 +1,18 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -28,8 +26,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -46,44 +44,40 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -99,20 +93,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -121,12 +115,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/extension/encoding/textencodingextension/internal/metadata/generated_status.go b/extension/encoding/textencodingextension/internal/metadata/generated_status.go index a819b09de273..b70825d97852 100644 --- a/extension/encoding/textencodingextension/internal/metadata/generated_status.go +++ b/extension/encoding/textencodingextension/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("text_encoding") + Type = component.MustNewType("text_encoding") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/textencodingextension" ) const ( diff --git a/extension/encoding/textencodingextension/internal/metadata/generated_telemetry.go b/extension/encoding/textencodingextension/internal/metadata/generated_telemetry.go deleted file mode 100644 index 07968d99078a..000000000000 --- a/extension/encoding/textencodingextension/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/textencoding") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/textencoding") -} diff --git a/extension/encoding/textencodingextension/internal/metadata/generated_telemetry_test.go b/extension/encoding/textencodingextension/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index bab2d3c5140a..000000000000 --- a/extension/encoding/textencodingextension/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/textencoding", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/textencoding", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/encoding/textencodingextension/metadata.yaml b/extension/encoding/textencodingextension/metadata.yaml index 3de7e84d16c5..5956055718d2 100644 --- a/extension/encoding/textencodingextension/metadata.yaml +++ b/extension/encoding/textencodingextension/metadata.yaml @@ -1,5 +1,4 @@ type: text_encoding -scope_name: otelcol/textencoding status: class: extension diff --git a/extension/encoding/zipkinencodingextension/README.md b/extension/encoding/zipkinencodingextension/README.md index f6b8326c8238..c37e59d6fb6b 100644 --- a/extension/encoding/zipkinencodingextension/README.md +++ b/extension/encoding/zipkinencodingextension/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fzipkinencoding%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fzipkinencoding) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fzipkinencoding%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fzipkinencoding) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@MovieStoreGuy](https://www.github.com/MovieStoreGuy), [@dao-jun](https://www.github.com/dao-jun) | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha This extension supports marshaling and unmarshaling Zipkin data representing traces. diff --git a/extension/encoding/zipkinencodingextension/extension_test.go b/extension/encoding/zipkinencodingextension/extension_test.go index 5bd7d511b9e6..8a8f45fc13eb 100644 --- a/extension/encoding/zipkinencodingextension/extension_test.go +++ b/extension/encoding/zipkinencodingextension/extension_test.go @@ -25,7 +25,7 @@ func TestExtension_Start(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() cfg.(*Config).Protocol = "zipkin_json" - return factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + return factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) }, }, { @@ -34,7 +34,7 @@ func TestExtension_Start(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() cfg.(*Config).Protocol = "zipkin_proto" - return factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + return factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) }, }, { @@ -44,7 +44,7 @@ func TestExtension_Start(t *testing.T) { cfg := factory.CreateDefaultConfig() cfg.(*Config).Protocol = "zipkin_thrift" cfg.(*Config).Version = "v1" - return factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + return factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) }, }, { @@ -54,7 +54,7 @@ func TestExtension_Start(t *testing.T) { cfg := factory.CreateDefaultConfig() cfg.(*Config).Protocol = "zipkin_thrift" cfg.(*Config).Version = "v2" - return factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + return factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) }, expectedErr: "unsupported version: \"v2\"", }, diff --git a/extension/encoding/zipkinencodingextension/factory.go b/extension/encoding/zipkinencodingextension/factory.go index d762a6778e42..6552c5b83879 100644 --- a/extension/encoding/zipkinencodingextension/factory.go +++ b/extension/encoding/zipkinencodingextension/factory.go @@ -21,7 +21,7 @@ func NewFactory() extension.Factory { ) } -func createExtension(_ context.Context, _ extension.CreateSettings, config component.Config) (extension.Extension, error) { +func createExtension(_ context.Context, _ extension.Settings, config component.Config) (extension.Extension, error) { return newExtension(config.(*Config)) } diff --git a/extension/encoding/zipkinencodingextension/generated_component_test.go b/extension/encoding/zipkinencodingextension/generated_component_test.go index 02b931b59c5b..a9234cacd114 100644 --- a/extension/encoding/zipkinencodingextension/generated_component_test.go +++ b/extension/encoding/zipkinencodingextension/generated_component_test.go @@ -30,18 +30,18 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) t.Run("shutdown", func(t *testing.T) { - e, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + e, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) err = e.Shutdown(context.Background()) require.NoError(t, err) }) t.Run("lifecycle", func(t *testing.T) { - firstExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + firstExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, firstExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, firstExt.Shutdown(context.Background())) - secondExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + secondExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, secondExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, secondExt.Shutdown(context.Background())) diff --git a/extension/encoding/zipkinencodingextension/go.mod b/extension/encoding/zipkinencodingextension/go.mod index f1da477a7546..cd06224cc0fb 100644 --- a/extension/encoding/zipkinencodingextension/go.mod +++ b/extension/encoding/zipkinencodingextension/go.mod @@ -1,60 +1,56 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/zipkinencodingextension -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 go.uber.org/goleak v1.3.0 ) require ( - github.com/apache/thrift v0.20.0 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/apache/thrift v0.21.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/jaegertracing/jaeger v1.57.0 // indirect + github.com/jaegertracing/jaeger v1.62.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 // indirect github.com/openzipkin/zipkin-go v0.4.3 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/semconv v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/semconv v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.30.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/encoding/zipkinencodingextension/go.sum b/extension/encoding/zipkinencodingextension/go.sum index 77f93f2aecad..ae9a8ebf610a 100644 --- a/extension/encoding/zipkinencodingextension/go.sum +++ b/extension/encoding/zipkinencodingextension/go.sum @@ -1,29 +1,27 @@ -github.com/apache/thrift v0.20.0 h1:631+KvYbsBZxmuJjYwhezVsrfc/TbqtZV4QcxOX1fOI= -github.com/apache/thrift v0.20.0/go.mod h1:hOk1BQqcp2OLzGsyVXdfMk7YFlMxK3aoEVhjD06QhB8= -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE= +github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/jaegertracing/jaeger v1.57.0 h1:3wDtUUPs6NRYH7+d+y8MilDkLHdpPrVlQ2wbcsA62bs= -github.com/jaegertracing/jaeger v1.57.0/go.mod h1:p/1fxIU9hKHl7qEhKC72p2ZYVhvvZvNB73y6V7YyuTs= +github.com/jaegertracing/jaeger v1.62.0 h1:YoaJ2e8oVz5sqGGlVAKSUCED8DzJ1q7PojBmZFNKoJA= +github.com/jaegertracing/jaeger v1.62.0/go.mod h1:jhEIHazwyb+a6xlRBi+p96BAvTYTSmGkghcwdQfV7FM= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -32,8 +30,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -52,46 +50,42 @@ github.com/openzipkin/zipkin-go v0.4.3/go.mod h1:M9wCJZFWCo2RiY+o1eBCEMe0Dp2S5LD github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -107,20 +101,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -129,12 +123,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/extension/encoding/zipkinencodingextension/internal/metadata/generated_status.go b/extension/encoding/zipkinencodingextension/internal/metadata/generated_status.go index f3324a57dad4..7463fe7b285a 100644 --- a/extension/encoding/zipkinencodingextension/internal/metadata/generated_status.go +++ b/extension/encoding/zipkinencodingextension/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("zipkin_encoding") + Type = component.MustNewType("zipkin_encoding") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/zipkinencodingextension" ) const ( diff --git a/extension/encoding/zipkinencodingextension/internal/metadata/generated_telemetry.go b/extension/encoding/zipkinencodingextension/internal/metadata/generated_telemetry.go deleted file mode 100644 index e36f6ff04bd3..000000000000 --- a/extension/encoding/zipkinencodingextension/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/zipkinencoding") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/zipkinencoding") -} diff --git a/extension/encoding/zipkinencodingextension/internal/metadata/generated_telemetry_test.go b/extension/encoding/zipkinencodingextension/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index c813d18401d8..000000000000 --- a/extension/encoding/zipkinencodingextension/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/zipkinencoding", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/zipkinencoding", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/encoding/zipkinencodingextension/metadata.yaml b/extension/encoding/zipkinencodingextension/metadata.yaml index 53815faf4315..beb11f7caac7 100644 --- a/extension/encoding/zipkinencodingextension/metadata.yaml +++ b/extension/encoding/zipkinencodingextension/metadata.yaml @@ -1,5 +1,4 @@ type: zipkin_encoding -scope_name: otelcol/zipkinencoding status: class: extension diff --git a/extension/googleclientauthextension/README.md b/extension/googleclientauthextension/README.md index 88ff3bd933b2..7de0785b857c 100644 --- a/extension/googleclientauthextension/README.md +++ b/extension/googleclientauthextension/README.md @@ -5,9 +5,9 @@ | Stability | [alpha] | | Distributions | [] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fgoogleclientauth%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fgoogleclientauth) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fgoogleclientauth%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fgoogleclientauth) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@dashpole](https://www.github.com/dashpole), [@damemi](https://www.github.com/damemi), [@aabmass](https://www.github.com/aabmass), [@jsuereth](https://www.github.com/jsuereth), [@punya](https://www.github.com/punya), [@psx95](https://www.github.com/psx95) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@dashpole](https://www.github.com/dashpole), [@aabmass](https://www.github.com/aabmass), [@jsuereth](https://www.github.com/jsuereth), [@punya](https://www.github.com/punya), [@psx95](https://www.github.com/psx95) | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha This extension provides Google OAuth2 Client Credentials and Metadata for gRPC and http based exporters. @@ -43,3 +43,7 @@ The following optional config fields are available: - `project` - The Google Cloud Project telemetry is sent to if the `gcp.project.id` resource attribute is not set. If unspecified, this is determined using application default credentials. - `scopes` - The oauth 2.0 [scopes](https://datatracker.ietf.org/doc/html/rfc6749#section-3.3) requested by the extension. - `quota_project` - The [project](https://cloud.google.com/apis/docs/system-parameters) for quota and billing purposes. The caller must have `serviceusage.services.use` permission on the project. +- `token_type` - The type of generated token. Default: `access_token` + - `access_token`: [OAuth 2.0 access token](https://cloud.google.com/docs/authentication/token-types#access) will be generated. + - `id_token`: Google-signed [ID token](https://cloud.google.com/docs/authentication/token-types#id) will be generated. +- `audience` - The audience claim used for generating ID token diff --git a/extension/googleclientauthextension/config_test.go b/extension/googleclientauthextension/config_test.go index f5106f3ae7ea..46d47ca4f9fd 100644 --- a/extension/googleclientauthextension/config_test.go +++ b/extension/googleclientauthextension/config_test.go @@ -24,19 +24,21 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.Equal(t, cfg.(*Config), factory.CreateDefaultConfig().(*Config)) sub, err = cm.Sub(component.NewIDWithName(metadata.Type, "customname").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.Equal(t, &Config{ Config: googleclientauthextension.Config{ Project: "my-project", Scopes: []string{"https://www.something.com/hello", "https://www.something.com/world"}, QuotaProject: "other-project", + TokenType: "access_token", + Audience: "my-audience", }, }, cfg) } diff --git a/extension/googleclientauthextension/factory.go b/extension/googleclientauthextension/factory.go index bde0ea0965be..3b22d4d24244 100644 --- a/extension/googleclientauthextension/factory.go +++ b/extension/googleclientauthextension/factory.go @@ -24,7 +24,7 @@ func NewFactory() extension.Factory { ) } -func createExtension(ctx context.Context, set extension.CreateSettings, cfg component.Config) (component.Component, error) { +func createExtension(ctx context.Context, set extension.Settings, cfg component.Config) (component.Component, error) { eCfg := cfg.(*Config) return googleclientauthextension.CreateExtension(ctx, set, &eCfg.Config) } diff --git a/extension/googleclientauthextension/generated_component_test.go b/extension/googleclientauthextension/generated_component_test.go index 0b7eebf5f537..9519b80101ee 100644 --- a/extension/googleclientauthextension/generated_component_test.go +++ b/extension/googleclientauthextension/generated_component_test.go @@ -30,7 +30,7 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) t.Run("shutdown", func(t *testing.T) { - e, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + e, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) err = e.Shutdown(context.Background()) require.NoError(t, err) diff --git a/extension/googleclientauthextension/generated_package_test.go b/extension/googleclientauthextension/generated_package_test.go index 71194f6a8d52..cceca0471f66 100644 --- a/extension/googleclientauthextension/generated_package_test.go +++ b/extension/googleclientauthextension/generated_package_test.go @@ -9,5 +9,5 @@ import ( ) func TestMain(m *testing.M) { - goleak.VerifyTestMain(m) + goleak.VerifyTestMain(m, goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start")) } diff --git a/extension/googleclientauthextension/go.mod b/extension/googleclientauthextension/go.mod index a2c231e5dd4c..c97212b818c6 100644 --- a/extension/googleclientauthextension/go.mod +++ b/extension/googleclientauthextension/go.mod @@ -1,57 +1,59 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/googleclientauthextension -go 1.21.0 +go 1.22.0 exclude github.com/knadh/koanf v1.5.0 require ( - github.com/GoogleCloudPlatform/opentelemetry-operations-go/extension/googleclientauthextension v0.47.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/GoogleCloudPlatform/opentelemetry-operations-go/extension/googleclientauthextension v0.49.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 go.uber.org/goleak v1.3.0 ) require ( - cloud.google.com/go/compute v1.25.1 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect + cloud.google.com/go/auth v0.10.0 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.5 // indirect + cloud.google.com/go/compute/metadata v0.5.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/google/s2a-go v0.1.8 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/oauth2 v0.18.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/net v0.30.0 // indirect + golang.org/x/oauth2 v0.23.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/api v0.204.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/googleclientauthextension/go.sum b/extension/googleclientauthextension/go.sum index 9f50c1dbadc0..d61d397dc7ee 100644 --- a/extension/googleclientauthextension/go.sum +++ b/extension/googleclientauthextension/go.sum @@ -1,41 +1,75 @@ -cloud.google.com/go/compute v1.25.1 h1:ZRpHJedLtTpKgr3RV1Fx23NuaAEN1Zfx9hw1u4aJdjU= -cloud.google.com/go/compute v1.25.1/go.mod h1:oopOIR53ly6viBYxaDhBfJwzUAxf1zE//uf3IB011ls= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/extension/googleclientauthextension v0.47.0 h1:brqsR0YSucfnOCqzhhrcigJOcjpa0kcVDWuoxGZ9NYY= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/extension/googleclientauthextension v0.47.0/go.mod h1:uBZ1COkHkA29NwckOOEQVlYc5nP6QNH3KYFd3lAUeeo= -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go/auth v0.10.0 h1:tWlkvFAh+wwTOzXIjrwM64karR1iTBZ/GRr0S/DULYo= +cloud.google.com/go/auth v0.10.0/go.mod h1:xxA5AqpDrvS+Gkmo9RqrGGRh6WSNKKOXhY3zNOr38tI= +cloud.google.com/go/auth/oauth2adapt v0.2.5 h1:2p29+dePqsCHPP1bqDJcKj4qxRyYCcbzKpFyKGt3MTk= +cloud.google.com/go/auth/oauth2adapt v0.2.5/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8= +cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo= +cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/extension/googleclientauthextension v0.49.0 h1:USbRDbF90Zcy1RcVqulgHmPRBjF04/jUTaZYGz6M8ms= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/extension/googleclientauthextension v0.49.0/go.mod h1:DccQRMl19vXUJxGceQh1X21K3uVl61m+JWSmDnqWfOs= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= +github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= +github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= +github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s= +github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -46,43 +80,49 @@ github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zx github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -92,62 +132,91 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= -golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= +golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ= +golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/api v0.204.0 h1:3PjmQQEDkR/ENVZZwIYB4W/KzYtN8OrqnNcHWpeR8E4= +google.golang.org/api v0.204.0/go.mod h1:69y8QSoKIbL9F94bWgWAq6wGqGwyjBgi2y8rAK8zLag= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 h1:zciRKQ4kBpFgpfC5QQCVtnnNAcLIqweL7plyZRQHVpI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/extension/googleclientauthextension/internal/metadata/generated_status.go b/extension/googleclientauthextension/internal/metadata/generated_status.go index d0619ef8c316..eaef8bf682ea 100644 --- a/extension/googleclientauthextension/internal/metadata/generated_status.go +++ b/extension/googleclientauthextension/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("googleclientauth") + Type = component.MustNewType("googleclientauth") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/googleclientauthextension" ) const ( diff --git a/extension/googleclientauthextension/internal/metadata/generated_telemetry.go b/extension/googleclientauthextension/internal/metadata/generated_telemetry.go deleted file mode 100644 index b48411c7648e..000000000000 --- a/extension/googleclientauthextension/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("github.com/open-telemetry/opentelemetry-collector-contrib/extension/googleclientauthextension") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("github.com/open-telemetry/opentelemetry-collector-contrib/extension/googleclientauthextension") -} diff --git a/extension/googleclientauthextension/internal/metadata/generated_telemetry_test.go b/extension/googleclientauthextension/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index a219e0bff260..000000000000 --- a/extension/googleclientauthextension/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/extension/googleclientauthextension", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/extension/googleclientauthextension", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/googleclientauthextension/metadata.yaml b/extension/googleclientauthextension/metadata.yaml index 3dcc81a1c0f5..5c165472ec50 100644 --- a/extension/googleclientauthextension/metadata.yaml +++ b/extension/googleclientauthextension/metadata.yaml @@ -5,7 +5,12 @@ status: stability: alpha: [extension] codeowners: - active: [dashpole, damemi, aabmass, jsuereth, punya, psx95] + active: [dashpole, aabmass, jsuereth, punya, psx95] tests: skip_lifecycle: true + goleak: + ignore: + top: + # See https://github.com/census-instrumentation/opencensus-go/issues/1191 for more information. + - "go.opencensus.io/stats/view.(*worker).start" diff --git a/extension/googleclientauthextension/testdata/config.yaml b/extension/googleclientauthextension/testdata/config.yaml index 93098cced6f5..2db163b7b12f 100644 --- a/extension/googleclientauthextension/testdata/config.yaml +++ b/extension/googleclientauthextension/testdata/config.yaml @@ -4,4 +4,5 @@ googleclientauth/customname: scopes: - "https://www.something.com/hello" - "https://www.something.com/world" - quota_project: other-project \ No newline at end of file + quota_project: other-project + audience: my-audience diff --git a/extension/headerssetterextension/README.md b/extension/headerssetterextension/README.md index 98fb3d5e93a9..ebad2c471056 100644 --- a/extension/headerssetterextension/README.md +++ b/extension/headerssetterextension/README.md @@ -3,12 +3,13 @@ | Status | | | ------------- |-----------| | Stability | [alpha] | -| Distributions | [contrib] | +| Distributions | [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fheaderssetter%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fheaderssetter) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fheaderssetter%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fheaderssetter) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@jpkrohling](https://www.github.com/jpkrohling) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | \| Seeking more code owners! | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s The `headers_setter` extension implements `ClientAuthenticator` and is used to @@ -34,11 +35,12 @@ The following settings are required: - `delete`: Deletes the header. - `value`: The header value is looked up from the `value` property of the extension configuration. + - `default_value`: (Optional) Value used if no entry for header key specified in `from_context` is present in request metadata. - `from_context`: The header value is looked up from the request metadata, such as HTTP headers, using the property value as the key (likely a header name). -The `value` and `from_context` properties are mutually exclusive. +The `value` and `from_context,default_value` properties are mutually exclusive. In order for `from_context` to work, other components in the pipeline also need to be configured appropriately: * If a [batch processor][batch-processor] is present in the pipeline, it must be configured to [preserve client metadata][batch-processor-preserve-metadata]. @@ -54,6 +56,7 @@ extensions: - action: insert key: X-Scope-OrgID from_context: tenant_id + default_value: Org-ID - action: upsert key: User-ID value: user_id diff --git a/extension/headerssetterextension/config.go b/extension/headerssetterextension/config.go index 5b73e9912f8f..55fe9cb07d1e 100644 --- a/extension/headerssetterextension/config.go +++ b/extension/headerssetterextension/config.go @@ -19,10 +19,11 @@ type Config struct { } type HeaderConfig struct { - Action ActionValue `mapstructure:"action"` - Key *string `mapstructure:"key"` - Value *string `mapstructure:"value"` - FromContext *string `mapstructure:"from_context"` + Action ActionValue `mapstructure:"action"` + Key *string `mapstructure:"key"` + Value *string `mapstructure:"value"` + FromContext *string `mapstructure:"from_context"` + DefaultValue *string `mapstructure:"default_value"` } // ActionValue is the enum to capture the four types of actions to perform on a header @@ -45,7 +46,7 @@ const ( // Validate checks if the extension configuration is valid func (cfg *Config) Validate() error { - if cfg.HeadersConfig == nil || len(cfg.HeadersConfig) == 0 { + if len(cfg.HeadersConfig) == 0 { return errMissingHeadersConfig } for _, header := range cfg.HeadersConfig { diff --git a/extension/headerssetterextension/config_test.go b/extension/headerssetterextension/config_test.go index 2403c919f01f..cfdef96f024c 100644 --- a/extension/headerssetterextension/config_test.go +++ b/extension/headerssetterextension/config_test.go @@ -37,6 +37,13 @@ func TestLoadConfig(t *testing.T) { FromContext: stringp("tenant_id"), Value: nil, }, + { + Key: stringp("X-Scope-OrgID"), + Action: INSERT, + FromContext: stringp("tenant_id"), + DefaultValue: stringp("some_id"), + Value: nil, + }, { Key: stringp("User-ID"), Action: UPDATE, @@ -66,10 +73,10 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) if tt.expectedError != nil { - assert.Error(t, component.ValidateConfig(cfg), tt.expectedError) + assert.ErrorIs(t, component.ValidateConfig(cfg), tt.expectedError) return } assert.NoError(t, component.ValidateConfig(cfg)) @@ -148,6 +155,18 @@ func TestValidateConfig(t *testing.T) { }, errMissingSource, }, + { + "header value source is missing snd default value set", + []HeaderConfig{ + { + Key: stringp("name"), + Action: INSERT, + FromContext: stringp("from context"), + DefaultValue: stringp("default"), + }, + }, + nil, + }, { "delete header action", []HeaderConfig{ diff --git a/extension/headerssetterextension/extension.go b/extension/headerssetterextension/extension.go index ae2c0afbb752..f9e3118d1946 100644 --- a/extension/headerssetterextension/extension.go +++ b/extension/headerssetterextension/extension.go @@ -35,8 +35,13 @@ func newHeadersSetterExtension(cfg *Config, logger *zap.Logger) (auth.Client, er Value: *header.Value, } } else if header.FromContext != nil { + defaultValue := "" + if header.DefaultValue != nil { + defaultValue = *header.DefaultValue + } s = &source.ContextSource{ - Key: *header.FromContext, + Key: *header.FromContext, + DefaultValue: defaultValue, } } @@ -70,7 +75,6 @@ func newHeadersSetterExtension(cfg *Config, logger *zap.Logger) (auth.Client, er return &headersPerRPC{headers: headers}, nil }), ), nil - } // headersPerRPC is a gRPC credentials.PerRPCCredentials implementation sets @@ -84,7 +88,6 @@ func (h *headersPerRPC) GetRequestMetadata( ctx context.Context, _ ...string, ) (map[string]string, error) { - metadata := make(map[string]string, len(h.headers)) for _, header := range h.headers { value, err := header.source.Get(ctx) diff --git a/extension/headerssetterextension/extension_test.go b/extension/headerssetterextension/extension_test.go index 409bfd70829e..865966aee21d 100644 --- a/extension/headerssetterextension/extension_test.go +++ b/extension/headerssetterextension/extension_test.go @@ -39,7 +39,7 @@ func TestRoundTripper(t *testing.T) { Metadata: tt.metadata, }, ) - req, err := http.NewRequestWithContext(ctx, "GET", "", nil) + req, err := http.NewRequestWithContext(ctx, http.MethodGet, "", nil) assert.NoError(t, err) assert.NotNil(t, req) @@ -218,6 +218,42 @@ var ( "header_name": "", }, }, + { + cfg: &Config{ + HeadersConfig: []HeaderConfig{ + { + Key: &header, + Action: INSERT, + FromContext: stringp("tenant"), + DefaultValue: stringp("default_tenant"), + }, + }, + }, + metadata: client.NewMetadata( + map[string][]string{}, + ), + expectedHeaders: map[string]string{ + "header_name": "default_tenant", + }, + }, + { + cfg: &Config{ + HeadersConfig: []HeaderConfig{ + { + Key: &header, + Action: INSERT, + FromContext: stringp("tenant"), + DefaultValue: stringp("default_tenant"), + }, + }, + }, + metadata: client.NewMetadata( + map[string][]string{"tenant": {"acme"}}, + ), + expectedHeaders: map[string]string{ + "header_name": "acme", + }, + }, } ) diff --git a/extension/headerssetterextension/factory.go b/extension/headerssetterextension/factory.go index 1704a7d0b71f..538b92a67883 100644 --- a/extension/headerssetterextension/factory.go +++ b/extension/headerssetterextension/factory.go @@ -28,7 +28,7 @@ func createDefaultConfig() component.Config { func createExtension( _ context.Context, - settings extension.CreateSettings, + settings extension.Settings, cfg component.Config, ) (extension.Extension, error) { return newHeadersSetterExtension(cfg.(*Config), settings.Logger) diff --git a/extension/headerssetterextension/factory_test.go b/extension/headerssetterextension/factory_test.go index bfb14aca7168..77dda9b17a93 100644 --- a/extension/headerssetterextension/factory_test.go +++ b/extension/headerssetterextension/factory_test.go @@ -21,10 +21,10 @@ func TestCreateDefaultConfig(t *testing.T) { assert.NoError(t, componenttest.CheckConfigStruct(cfg)) } -func TestCreateExtension(t *testing.T) { +func TestCreate(t *testing.T) { cfg := createDefaultConfig().(*Config) - ext, err := createExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + ext, err := createExtension(context.Background(), extensiontest.NewNopSettings(), cfg) assert.NoError(t, err) assert.NotNil(t, ext) } diff --git a/extension/headerssetterextension/generated_component_test.go b/extension/headerssetterextension/generated_component_test.go index 42523d5e2a69..bce0b7e1d3d4 100644 --- a/extension/headerssetterextension/generated_component_test.go +++ b/extension/headerssetterextension/generated_component_test.go @@ -30,18 +30,18 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) t.Run("shutdown", func(t *testing.T) { - e, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + e, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) err = e.Shutdown(context.Background()) require.NoError(t, err) }) t.Run("lifecycle", func(t *testing.T) { - firstExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + firstExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, firstExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, firstExt.Shutdown(context.Background())) - secondExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + secondExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, secondExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, secondExt.Shutdown(context.Background())) diff --git a/extension/headerssetterextension/go.mod b/extension/headerssetterextension/go.mod index 950fca0061d8..dd064ffd0f0c 100644 --- a/extension/headerssetterextension/go.mod +++ b/extension/headerssetterextension/go.mod @@ -1,52 +1,47 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension -go 1.21.0 +go 1.22.0 require ( - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector v0.102.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/collector/extension/auth v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/client v1.22.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/auth v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 - google.golang.org/grpc v1.64.0 + google.golang.org/grpc v1.68.1 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/headerssetterextension/go.sum b/extension/headerssetterextension/go.sum index 7a1870c66305..3e1ed6167182 100644 --- a/extension/headerssetterextension/go.sum +++ b/extension/headerssetterextension/go.sum @@ -1,18 +1,16 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -25,8 +23,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -41,48 +39,42 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -98,20 +90,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -120,12 +112,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/extension/headerssetterextension/internal/metadata/generated_status.go b/extension/headerssetterextension/internal/metadata/generated_status.go index bc78c49cf22b..e73e2a9d3457 100644 --- a/extension/headerssetterextension/internal/metadata/generated_status.go +++ b/extension/headerssetterextension/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("headers_setter") + Type = component.MustNewType("headers_setter") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension" ) const ( diff --git a/extension/headerssetterextension/internal/metadata/generated_telemetry.go b/extension/headerssetterextension/internal/metadata/generated_telemetry.go deleted file mode 100644 index cf881fb00df3..000000000000 --- a/extension/headerssetterextension/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/headerssetter") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/headerssetter") -} diff --git a/extension/headerssetterextension/internal/metadata/generated_telemetry_test.go b/extension/headerssetterextension/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 1e7b19766742..000000000000 --- a/extension/headerssetterextension/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/headerssetter", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/headerssetter", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/headerssetterextension/internal/source/context.go b/extension/headerssetterextension/internal/source/context.go index 7cd40b7dadb2..20b15fb2f7eb 100644 --- a/extension/headerssetterextension/internal/source/context.go +++ b/extension/headerssetterextension/internal/source/context.go @@ -13,7 +13,8 @@ import ( var _ Source = (*ContextSource)(nil) type ContextSource struct { - Key string + Key string + DefaultValue string } func (ts *ContextSource) Get(ctx context.Context) (string, error) { @@ -21,7 +22,7 @@ func (ts *ContextSource) Get(ctx context.Context) (string, error) { ss := cl.Metadata.Get(ts.Key) if len(ss) == 0 { - return "", nil + return ts.DefaultValue, nil } if len(ss) > 1 { diff --git a/extension/headerssetterextension/metadata.yaml b/extension/headerssetterextension/metadata.yaml index e207984e3db2..0b8141bfb2a4 100644 --- a/extension/headerssetterextension/metadata.yaml +++ b/extension/headerssetterextension/metadata.yaml @@ -1,13 +1,12 @@ type: headers_setter -scope_name: otelcol/headerssetter status: class: extension stability: alpha: [extension] - distributions: - - contrib + distributions: [contrib, k8s] codeowners: - active: [jpkrohling] + active: [] + seeking_new: true tests: config: diff --git a/extension/headerssetterextension/testdata/config.yaml b/extension/headerssetterextension/testdata/config.yaml index 05dfe5403773..4762f609d97f 100644 --- a/extension/headerssetterextension/testdata/config.yaml +++ b/extension/headerssetterextension/testdata/config.yaml @@ -4,6 +4,10 @@ headers_setter/1: - key: X-Scope-OrgID action: insert from_context: "tenant_id" + - key: X-Scope-OrgID + action: insert + from_context: "tenant_id" + default_value: "some_id" - key: User-ID action: update from_context: "user_id" diff --git a/extension/healthcheckextension/README.md b/extension/healthcheckextension/README.md index 27112d9acf5d..615129115ef5 100644 --- a/extension/healthcheckextension/README.md +++ b/extension/healthcheckextension/README.md @@ -13,35 +13,25 @@ | Status | | | ------------- |-----------| | Stability | [beta] | -| Distributions | [core], [contrib] | +| Distributions | [core], [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fhealthcheck%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fhealthcheck) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fhealthcheck%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fhealthcheck) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@jpkrohling](https://www.github.com/jpkrohling) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [core]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s Health Check extension enables an HTTP url that can be probed to check the status of the OpenTelemetry Collector. This extension can be used as a liveness and/or readiness probe on Kubernetes. -There is an optional configuration `check_collector_pipeline` which allows -users to enable health check for the collector pipeline. This feature can -monitor the number of times that components failed send data to the destinations. -It only supports monitoring exporter failures and will support receivers and -processors in the future. - The following settings are required: -- `endpoint` (default = 0.0.0.0:13133): Address to publish the health check status. For full list of `ServerConfig` refer [here](https://github.com/open-telemetry/opentelemetry-collector/tree/main/config/confighttp). The `component.UseLocalHostAsDefaultHost` feature gate changes this to localhost:13133. This will become the default in a future release. +- `endpoint` (default = localhost:13133): Address to publish the health check status. For full list of `ServerConfig` refer [here](https://github.com/open-telemetry/opentelemetry-collector/tree/main/config/confighttp). See our [security best practices doc](https://opentelemetry.io/docs/security/config-best-practices/#protect-against-denial-of-service-attacks) to understand how to set the endpoint in different environments. - `path` (default = "/"): Specifies the path to be configured for the health check server. - `response_body` (default = ""): Specifies a static body that overrides the default response returned by the health check service. -- `check_collector_pipeline:` (optional): Settings of collector pipeline health check - - `enabled` (default = false): Whether enable collector pipeline check or not - - `interval` (default = "5m"): Time interval to check the number of failures - - `exporter_failure_threshold` (default = 5): The failure number threshold to mark - containers as healthy. Example: @@ -55,10 +45,6 @@ extensions: cert_file: "/path/to/cert.crt" key_file: "/path/to/key.key" path: "/health/status" - check_collector_pipeline: - enabled: true - interval: "5m" - exporter_failure_threshold: 5 ``` The full list of settings exposed for this exporter is documented [here](./config.go) diff --git a/extension/healthcheckextension/config_test.go b/extension/healthcheckextension/config_test.go index 2b9515b95f27..ba4fb69d0fb2 100644 --- a/extension/healthcheckextension/config_test.go +++ b/extension/healthcheckextension/config_test.go @@ -68,7 +68,7 @@ func TestLoadConfig(t *testing.T) { cfg := factory.CreateDefaultConfig() sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) if tt.expectedErr != nil { assert.ErrorIs(t, component.ValidateConfig(cfg), tt.expectedErr) return diff --git a/extension/healthcheckextension/exporter.go b/extension/healthcheckextension/exporter.go deleted file mode 100644 index 7ec03077ec38..000000000000 --- a/extension/healthcheckextension/exporter.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package healthcheckextension // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension" - -import ( - "sync" - "time" - - "go.opencensus.io/stats/view" -) - -const ( - exporterFailureView = "exporter/send_failed_requests" -) - -// healthCheckExporter is a struct implement the exporter interface in open census that could export metrics -type healthCheckExporter struct { - mu sync.Mutex - exporterFailureQueue []*view.Data -} - -func newHealthCheckExporter() *healthCheckExporter { - return &healthCheckExporter{} -} - -// ExportView function could export the failure view to the queue -func (e *healthCheckExporter) ExportView(vd *view.Data) { - e.mu.Lock() - defer e.mu.Unlock() - - if vd.View.Name == exporterFailureView { - e.exporterFailureQueue = append(e.exporterFailureQueue, vd) - } -} - -func (e *healthCheckExporter) checkHealthStatus(exporterFailureThreshold int) bool { - e.mu.Lock() - defer e.mu.Unlock() - - return exporterFailureThreshold >= len(e.exporterFailureQueue) -} - -// rotate function could rotate the error logs that expired the time interval -func (e *healthCheckExporter) rotate(interval time.Duration) { - e.mu.Lock() - defer e.mu.Unlock() - - viewNum := len(e.exporterFailureQueue) - currentTime := time.Now() - for i := 0; i < viewNum; i++ { - vd := e.exporterFailureQueue[0] - if vd.Start.Add(interval).After(currentTime) { - e.exporterFailureQueue = append(e.exporterFailureQueue, vd) - } - e.exporterFailureQueue = e.exporterFailureQueue[1:] - } -} diff --git a/extension/healthcheckextension/exporter_test.go b/extension/healthcheckextension/exporter_test.go deleted file mode 100644 index a138fa2d9cb1..000000000000 --- a/extension/healthcheckextension/exporter_test.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package healthcheckextension - -import ( - "testing" - "time" - - "github.com/stretchr/testify/assert" - "go.opencensus.io/stats/view" -) - -func TestHealthCheckExporter_ExportView(t *testing.T) { - exporter := &healthCheckExporter{} - newView := view.View{Name: exporterFailureView} - vd := &view.Data{ - View: &newView, - Start: time.Time{}, - End: time.Time{}, - Rows: nil, - } - exporter.ExportView(vd) - assert.Equal(t, 1, len(exporter.exporterFailureQueue)) -} - -func TestHealthCheckExporter_rotate(t *testing.T) { - exporter := &healthCheckExporter{} - currentTime := time.Now() - time1 := currentTime.Add(-10 * time.Minute) - time2 := currentTime.Add(-3 * time.Minute) - newView := view.View{Name: exporterFailureView} - vd1 := &view.Data{ - View: &newView, - Start: time1, - End: currentTime, - Rows: nil, - } - vd2 := &view.Data{ - View: &newView, - Start: time2, - End: currentTime, - Rows: nil, - } - exporter.ExportView(vd1) - exporter.ExportView(vd2) - assert.Equal(t, 2, len(exporter.exporterFailureQueue)) - exporter.rotate(5 * time.Minute) - assert.Equal(t, 1, len(exporter.exporterFailureQueue)) -} diff --git a/extension/healthcheckextension/factory.go b/extension/healthcheckextension/factory.go index 0ebbd1726b78..9303fa9be2cd 100644 --- a/extension/healthcheckextension/factory.go +++ b/extension/healthcheckextension/factory.go @@ -11,7 +11,7 @@ import ( "go.opentelemetry.io/collector/extension" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension/internal/metadata" - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/localhostgate" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/testutil" ) const defaultPort = 13133 @@ -29,14 +29,14 @@ func NewFactory() extension.Factory { func createDefaultConfig() component.Config { return &Config{ ServerConfig: confighttp.ServerConfig{ - Endpoint: localhostgate.EndpointForPort(defaultPort), + Endpoint: testutil.EndpointForPort(defaultPort), }, CheckCollectorPipeline: defaultCheckCollectorPipelineSettings(), Path: "/", } } -func createExtension(_ context.Context, set extension.CreateSettings, cfg component.Config) (extension.Extension, error) { +func createExtension(_ context.Context, set extension.Settings, cfg component.Config) (extension.Extension, error) { config := cfg.(*Config) return newServer(*config, set.TelemetrySettings), nil diff --git a/extension/healthcheckextension/factory_test.go b/extension/healthcheckextension/factory_test.go index e0c3a83982d1..676015bfcb4e 100644 --- a/extension/healthcheckextension/factory_test.go +++ b/extension/healthcheckextension/factory_test.go @@ -20,23 +20,23 @@ func TestFactory_CreateDefaultConfig(t *testing.T) { cfg := createDefaultConfig() assert.Equal(t, &Config{ ServerConfig: confighttp.ServerConfig{ - Endpoint: "0.0.0.0:13133", + Endpoint: "localhost:13133", }, CheckCollectorPipeline: defaultCheckCollectorPipelineSettings(), Path: "/", }, cfg) assert.NoError(t, componenttest.CheckConfigStruct(cfg)) - ext, err := createExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + ext, err := createExtension(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NotNil(t, ext) } -func TestFactory_CreateExtension(t *testing.T) { +func TestFactory_Create(t *testing.T) { cfg := createDefaultConfig().(*Config) cfg.Endpoint = testutil.GetAvailableLocalAddress(t) - ext, err := createExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + ext, err := createExtension(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NotNil(t, ext) } diff --git a/extension/healthcheckextension/generated_component_test.go b/extension/healthcheckextension/generated_component_test.go index f37baff156df..15961ad8e2f3 100644 --- a/extension/healthcheckextension/generated_component_test.go +++ b/extension/healthcheckextension/generated_component_test.go @@ -30,18 +30,18 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) t.Run("shutdown", func(t *testing.T) { - e, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + e, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) err = e.Shutdown(context.Background()) require.NoError(t, err) }) t.Run("lifecycle", func(t *testing.T) { - firstExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + firstExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, firstExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, firstExt.Shutdown(context.Background())) - secondExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + secondExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, secondExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, secondExt.Shutdown(context.Background())) diff --git a/extension/healthcheckextension/generated_package_test.go b/extension/healthcheckextension/generated_package_test.go index 59d15d82418e..1dfd9697fac6 100644 --- a/extension/healthcheckextension/generated_package_test.go +++ b/extension/healthcheckextension/generated_package_test.go @@ -9,5 +9,5 @@ import ( ) func TestMain(m *testing.M) { - goleak.VerifyTestMain(m, goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start")) + goleak.VerifyTestMain(m) } diff --git a/extension/healthcheckextension/go.mod b/extension/healthcheckextension/go.mod index add3c1caf713..6ca1337e97da 100644 --- a/extension/healthcheckextension/go.mod +++ b/extension/healthcheckextension/go.mod @@ -1,70 +1,66 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opencensus.io v0.24.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/confighttp v0.102.0 - go.opentelemetry.io/collector/config/configtls v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componentstatus v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/confighttp v0.116.0 + go.opentelemetry.io/collector/config/configtls v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/rogpeppe/go-internal v1.11.0 // indirect - github.com/rs/cors v1.10.1 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/configopaque v1.9.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + github.com/rs/cors v1.11.1 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/configopaque v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/healthcheckextension/go.sum b/extension/healthcheckextension/go.sum index 55b365937097..e0ff9651f82f 100644 --- a/extension/healthcheckextension/go.sum +++ b/extension/healthcheckextension/go.sum @@ -1,58 +1,24 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -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/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= @@ -61,14 +27,14 @@ 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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -81,78 +47,72 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0 h1:bXDgoiDiwFfrO5S6q1Wpe0su303CW4Qxthoy4CxG6eg= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0/go.mod h1:uFZlAPxk2+s6zk1W+u22DgxxSDugWy0QaY5kQzjNy7Q= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -162,44 +122,27 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -207,36 +150,14 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/extension/healthcheckextension/healthcheckextension.go b/extension/healthcheckextension/healthcheckextension.go index 91ce98b5ed06..e0745b459b34 100644 --- a/extension/healthcheckextension/healthcheckextension.go +++ b/extension/healthcheckextension/healthcheckextension.go @@ -8,11 +8,10 @@ import ( "errors" "fmt" "net/http" - "time" - "go.opencensus.io/stats/view" "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/extension" + "go.opentelemetry.io/collector/component/componentstatus" + "go.opentelemetry.io/collector/extension/extensioncapabilities" "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension/internal/healthcheck" @@ -24,14 +23,12 @@ type healthCheckExtension struct { state *healthcheck.HealthCheck server *http.Server stopCh chan struct{} - exporter *healthCheckExporter settings component.TelemetrySettings } -var _ extension.PipelineWatcher = (*healthCheckExtension)(nil) +var _ extensioncapabilities.PipelineWatcher = (*healthCheckExtension)(nil) func (hc *healthCheckExtension) Start(ctx context.Context, host component.Host) error { - hc.logger.Info("Starting health_check extension", zap.Any("config", hc.config)) ln, err := hc.config.ToListener(ctx) if err != nil { @@ -43,58 +40,19 @@ func (hc *healthCheckExtension) Start(ctx context.Context, host component.Host) return err } - if !hc.config.CheckCollectorPipeline.Enabled { - // Mount HC handler - mux := http.NewServeMux() - mux.Handle(hc.config.Path, hc.baseHandler()) - hc.server.Handler = mux - hc.stopCh = make(chan struct{}) - go func() { - defer close(hc.stopCh) - - // The listener ownership goes to the server. - if err = hc.server.Serve(ln); !errors.Is(err, http.ErrServerClosed) && err != nil { - hc.settings.ReportStatus(component.NewFatalErrorEvent(err)) - } - }() - } else { - // collector pipeline health check - hc.exporter = newHealthCheckExporter() - view.RegisterExporter(hc.exporter) - - interval, err := time.ParseDuration(hc.config.CheckCollectorPipeline.Interval) - if err != nil { - return err + // Mount HC handler + mux := http.NewServeMux() + mux.Handle(hc.config.Path, hc.baseHandler()) + hc.server.Handler = mux + hc.stopCh = make(chan struct{}) + go func() { + defer close(hc.stopCh) + + // The listener ownership goes to the server. + if err = hc.server.Serve(ln); !errors.Is(err, http.ErrServerClosed) && err != nil { + componentstatus.ReportStatus(host, componentstatus.NewFatalErrorEvent(err)) } - - // ticker used by collector pipeline health check for rotation - ticker := time.NewTicker(time.Second) - - mux := http.NewServeMux() - mux.Handle(hc.config.Path, hc.checkCollectorPipelineHandler()) - hc.server.Handler = mux - hc.stopCh = make(chan struct{}) - go func() { - defer close(hc.stopCh) - defer view.UnregisterExporter(hc.exporter) - - go func() { - for { - select { - case <-ticker.C: - hc.exporter.rotate(interval) - case <-hc.stopCh: - return - } - } - }() - - if errHTTP := hc.server.Serve(ln); !errors.Is(errHTTP, http.ErrServerClosed) && errHTTP != nil { - hc.settings.ReportStatus(component.NewFatalErrorEvent(errHTTP)) - } - - }() - } + }() return nil } @@ -115,27 +73,6 @@ func (hc *healthCheckExtension) baseHandler() http.Handler { return hc.state.Handler() } -// new handler function used for check collector pipeline -func (hc *healthCheckExtension) checkCollectorPipelineHandler() http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { - if hc.check() && hc.state.Get() == healthcheck.Ready { - w.WriteHeader(http.StatusOK) - if hc.config.ResponseBody != nil { - _, _ = w.Write([]byte(hc.config.ResponseBody.Healthy)) - } - } else { - w.WriteHeader(http.StatusInternalServerError) - if hc.config.ResponseBody != nil { - _, _ = w.Write([]byte(hc.config.ResponseBody.Unhealthy)) - } - } - }) -} - -func (hc *healthCheckExtension) check() bool { - return hc.exporter.checkHealthStatus(hc.config.CheckCollectorPipeline.ExporterFailureThreshold) -} - func (hc *healthCheckExtension) Shutdown(context.Context) error { if hc.server == nil { return nil diff --git a/extension/healthcheckextension/healthcheckextension_test.go b/extension/healthcheckextension/healthcheckextension_test.go index eb094ad82a09..3d7d78855200 100644 --- a/extension/healthcheckextension/healthcheckextension_test.go +++ b/extension/healthcheckextension/healthcheckextension_test.go @@ -13,7 +13,6 @@ import ( "time" "github.com/stretchr/testify/require" - "go.opencensus.io/stats/view" "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/config/confighttp" @@ -175,134 +174,6 @@ func TestHealthCheckExtensionUsage(t *testing.T) { }, }, }, - { - name: "WithCheckCollectorPipeline", - config: Config{ - ServerConfig: confighttp.ServerConfig{ - Endpoint: testutil.GetAvailableLocalAddress(t), - }, - CheckCollectorPipeline: checkCollectorPipelineSettings{ - Enabled: true, - Interval: "5m", - ExporterFailureThreshold: 1, - }, - Path: "/", - }, - teststeps: []teststep{ - { - expectedStatusCode: http.StatusInternalServerError, - }, - { - step: func(hcExt *healthCheckExtension) error { - hcExt.exporter.mu.Lock() - defer hcExt.exporter.mu.Unlock() - hcExt.exporter.exporterFailureQueue = append(hcExt.exporter.exporterFailureQueue, viewData()) - return hcExt.Ready() - }, - expectedStatusCode: http.StatusOK, - }, - { - step: func(hcExt *healthCheckExtension) error { return hcExt.NotReady() }, - expectedStatusCode: http.StatusInternalServerError, - }, - { - step: func(hcExt *healthCheckExtension) error { - hcExt.exporter.mu.Lock() - defer hcExt.exporter.mu.Unlock() - hcExt.exporter.exporterFailureQueue = append(hcExt.exporter.exporterFailureQueue, viewData()) - return hcExt.Ready() - }, - expectedStatusCode: http.StatusInternalServerError, - }, - }, - }, - { - name: "WithCustomPathWithCheckCollectorPipeline", - config: Config{ - ServerConfig: confighttp.ServerConfig{ - Endpoint: testutil.GetAvailableLocalAddress(t), - }, - CheckCollectorPipeline: checkCollectorPipelineSettings{ - Enabled: true, - Interval: "5m", - ExporterFailureThreshold: 1, - }, - Path: "/health", - }, - teststeps: []teststep{ - { - expectedStatusCode: http.StatusInternalServerError, - }, - { - step: func(hcExt *healthCheckExtension) error { - hcExt.exporter.mu.Lock() - defer hcExt.exporter.mu.Unlock() - hcExt.exporter.exporterFailureQueue = append(hcExt.exporter.exporterFailureQueue, viewData()) - return hcExt.Ready() - }, - expectedStatusCode: http.StatusOK, - }, - { - step: func(hcExt *healthCheckExtension) error { return hcExt.NotReady() }, - expectedStatusCode: http.StatusInternalServerError, - }, - { - step: func(hcExt *healthCheckExtension) error { - hcExt.exporter.mu.Lock() - defer hcExt.exporter.mu.Unlock() - hcExt.exporter.exporterFailureQueue = append(hcExt.exporter.exporterFailureQueue, viewData()) - return hcExt.Ready() - }, - expectedStatusCode: http.StatusInternalServerError, - }, - }, - }, - { - name: "WithCustomStaticResponseBodyWithCheckCollectorPipeline", - config: Config{ - ServerConfig: confighttp.ServerConfig{ - Endpoint: testutil.GetAvailableLocalAddress(t), - }, - CheckCollectorPipeline: checkCollectorPipelineSettings{ - Enabled: true, - Interval: "5m", - ExporterFailureThreshold: 1, - }, - Path: "/", - ResponseBody: &ResponseBodySettings{Healthy: "ALL OK", Unhealthy: "NOT OK"}, - }, - teststeps: []teststep{ - { - expectedStatusCode: http.StatusInternalServerError, - expectedBody: "NOT OK", - }, - { - step: func(hcExt *healthCheckExtension) error { - hcExt.exporter.mu.Lock() - defer hcExt.exporter.mu.Unlock() - hcExt.exporter.exporterFailureQueue = append(hcExt.exporter.exporterFailureQueue, viewData()) - return hcExt.Ready() - }, - expectedStatusCode: http.StatusOK, - expectedBody: "ALL OK", - }, - { - step: func(hcExt *healthCheckExtension) error { return hcExt.NotReady() }, - expectedStatusCode: http.StatusInternalServerError, - expectedBody: "NOT OK", - }, - { - step: func(hcExt *healthCheckExtension) error { - hcExt.exporter.mu.Lock() - defer hcExt.exporter.mu.Unlock() - hcExt.exporter.exporterFailureQueue = append(hcExt.exporter.exporterFailureQueue, viewData()) - return hcExt.Ready() - }, - expectedStatusCode: http.StatusInternalServerError, - expectedBody: "NOT OK", - }, - }, - }, } for _, tt := range tests { @@ -412,14 +283,3 @@ func TestHealthCheckShutdownWithoutStart(t *testing.T) { require.NoError(t, hcExt.Shutdown(context.Background())) } - -func viewData() *view.Data { - currentTime := time.Now() - vd := &view.Data{ - View: &view.View{Name: exporterFailureView}, - Start: currentTime.Add(-1 * time.Minute), - End: currentTime, - Rows: nil, - } - return vd -} diff --git a/extension/healthcheckextension/integration_test.go b/extension/healthcheckextension/integration_test.go index 83df1ced7968..7ccc325b0632 100644 --- a/extension/healthcheckextension/integration_test.go +++ b/extension/healthcheckextension/integration_test.go @@ -24,7 +24,7 @@ func Test_SimpleHealthCheck(t *testing.T) { port := testutil.GetAvailablePort(t) cfg := f.CreateDefaultConfig().(*Config) cfg.Endpoint = fmt.Sprintf("localhost:%d", port) - e, err := f.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + e, err := f.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) err = e.Start(context.Background(), componenttest.NewNopHost()) require.NoError(t, err) @@ -37,7 +37,7 @@ func Test_SimpleHealthCheck(t *testing.T) { var buf bytes.Buffer _, err = io.Copy(&buf, resp.Body) require.NoError(t, err) - assert.Equal(t, `{"status":"Server not available","upSince":"0001-01-01T00:00:00Z","uptime":""}`, buf.String()) + assert.JSONEq(t, `{"status":"Server not available","upSince":"0001-01-01T00:00:00Z","uptime":""}`, buf.String()) err = e.(*healthCheckExtension).Ready() require.NoError(t, err) resp, err = http.DefaultClient.Get(fmt.Sprintf("http://localhost:%d/", port)) diff --git a/extension/healthcheckextension/internal/metadata/generated_status.go b/extension/healthcheckextension/internal/metadata/generated_status.go index dce6a551333e..b1af7e9b4f25 100644 --- a/extension/healthcheckextension/internal/metadata/generated_status.go +++ b/extension/healthcheckextension/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("health_check") + Type = component.MustNewType("health_check") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension" ) const ( diff --git a/extension/healthcheckextension/internal/metadata/generated_telemetry.go b/extension/healthcheckextension/internal/metadata/generated_telemetry.go deleted file mode 100644 index e193abbb6b45..000000000000 --- a/extension/healthcheckextension/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/healthcheck") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/healthcheck") -} diff --git a/extension/healthcheckextension/internal/metadata/generated_telemetry_test.go b/extension/healthcheckextension/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index cec9cec8052d..000000000000 --- a/extension/healthcheckextension/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/healthcheck", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/healthcheck", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/healthcheckextension/metadata.yaml b/extension/healthcheckextension/metadata.yaml index 1e200d1122d0..30e83b2d97a1 100644 --- a/extension/healthcheckextension/metadata.yaml +++ b/extension/healthcheckextension/metadata.yaml @@ -1,19 +1,13 @@ type: health_check -scope_name: otelcol/healthcheck status: class: extension stability: beta: [extension] - distributions: [core, contrib] + distributions: [core, contrib, k8s] codeowners: - active: [jpkrohling] + active: [] tests: config: endpoint: localhost:0 - goleak: - ignore: - top: - # See https://github.com/census-instrumentation/opencensus-go/issues/1191 for more information. - - "go.opencensus.io/stats/view.(*worker).start" diff --git a/extension/healthcheckv2extension/README.md b/extension/healthcheckv2extension/README.md index 638093e8dff7..86192094d093 100644 --- a/extension/healthcheckv2extension/README.md +++ b/extension/healthcheckv2extension/README.md @@ -1,15 +1,12 @@ -# Health Check Extension +# Health Check Extension V2 -> ⚠️⚠️⚠️ **Warning** ⚠️⚠️⚠️ -> This extension is not ready for use. The code is written, but the -[original PR](https://github.com/open-telemetry/opentelemetry-collector-contrib/pull/30673) -is being sliced up into smaller PRs that are being reviewed and merged -incrementally. - -## Forward Looking README - -The remainder of this README is forward looking and serves as a reference for -the future functionality that will be provided and how it will be configured. +This is an experimental extension that is intended to replace the existing +health check extension. As the stability level is currently development, users +wishing to experiment with this extension will have to build a custom collector +binary using the [OpenTelemetry Collector Builder](https://github.com/open-telemetry/opentelemetry-collector/tree/main/cmd/builder). +Health check extension V2 has new functionality that can be opted-in to, and +also supports original healthcheck extension functionality with the exception +of the `check_collector_pipeline` feature. See the warning below. > ⚠️⚠️⚠️ **Warning** ⚠️⚠️⚠️ > @@ -27,7 +24,7 @@ the future functionality that will be provided and how it will be configured. | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fhealthcheckv2%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fhealthcheckv2) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fhealthcheckv2%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fhealthcheckv2) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@jpkrohling](https://www.github.com/jpkrohling), [@mwear](https://www.github.com/mwear) | -[development]: https://github.com/open-telemetry/opentelemetry-collector#development +[development]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#development ## V1 @@ -38,7 +35,7 @@ liveness and/or readiness probe on Kubernetes. The following settings are required: -- `endpoint` (default = 0.0.0.0:13133): Address to publish the health check status. For full list of `ServerConfig` refer [here](https://github.com/open-telemetry/opentelemetry-collector/tree/main/config/confighttp). The `component.UseLocalHostAsDefaultHost` feature gate changes this to localhost:13133. This will become the default in a future release. +- `endpoint` (default = localhost:13133): Address to publish the health check status. For full list of `ServerConfig` refer [here](https://github.com/open-telemetry/opentelemetry-collector/tree/main/config/confighttp). See our [security best practices doc](https://opentelemetry.io/docs/security/config-best-practices/#protect-against-denial-of-service-attacks) to understand how to set the endpoint in different environments. - `path` (default = "/"): Specifies the path to be configured for the health check server. - `response_body` (default = ""): Specifies a static body that overrides the default response returned by the health check service. - `check_collector_pipeline:` (deprecated and ignored): Settings of collector pipeline health check @@ -425,4 +422,4 @@ begin streaming. There are plans to provide the ability to export status events as OTLP logs adhering to the event semantic conventions. -[grpc_health_v1 service]: https://github.com/grpc/grpc-proto/blob/master/grpc/health/v1/health.proto \ No newline at end of file +[grpc_health_v1 service]: https://github.com/grpc/grpc-proto/blob/master/grpc/health/v1/health.proto diff --git a/extension/healthcheckv2extension/config_test.go b/extension/healthcheckv2extension/config_test.go index c1a0a06cf369..82904769dd93 100644 --- a/extension/healthcheckv2extension/config_test.go +++ b/extension/healthcheckv2extension/config_test.go @@ -21,7 +21,7 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension/internal/grpc" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension/internal/http" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension/internal/metadata" - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/localhostgate" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/testutil" ) func TestLoadConfig(t *testing.T) { @@ -37,7 +37,7 @@ func TestLoadConfig(t *testing.T) { expected: &Config{ LegacyConfig: http.LegacyConfig{ ServerConfig: confighttp.ServerConfig{ - Endpoint: localhostgate.EndpointForPort(defaultHTTPPort), + Endpoint: testutil.EndpointForPort(defaultHTTPPort), }, Path: "/", }, @@ -81,13 +81,13 @@ func TestLoadConfig(t *testing.T) { LegacyConfig: http.LegacyConfig{ UseV2: true, ServerConfig: confighttp.ServerConfig{ - Endpoint: localhostgate.EndpointForPort(defaultHTTPPort), + Endpoint: testutil.EndpointForPort(defaultHTTPPort), }, Path: "/", }, HTTPConfig: &http.Config{ ServerConfig: confighttp.ServerConfig{ - Endpoint: localhostgate.EndpointForPort(defaultHTTPPort), + Endpoint: testutil.EndpointForPort(defaultHTTPPort), }, Status: http.PathConfig{ Enabled: true, @@ -101,7 +101,7 @@ func TestLoadConfig(t *testing.T) { GRPCConfig: &grpc.Config{ ServerConfig: configgrpc.ServerConfig{ NetAddr: confignet.AddrConfig{ - Endpoint: localhostgate.EndpointForPort(defaultGRPCPort), + Endpoint: testutil.EndpointForPort(defaultGRPCPort), Transport: "tcp", }, }, @@ -119,7 +119,7 @@ func TestLoadConfig(t *testing.T) { LegacyConfig: http.LegacyConfig{ UseV2: true, ServerConfig: confighttp.ServerConfig{ - Endpoint: localhostgate.EndpointForPort(defaultHTTPPort), + Endpoint: testutil.EndpointForPort(defaultHTTPPort), }, Path: "/", }, @@ -148,7 +148,7 @@ func TestLoadConfig(t *testing.T) { LegacyConfig: http.LegacyConfig{ UseV2: true, ServerConfig: confighttp.ServerConfig{ - Endpoint: localhostgate.EndpointForPort(defaultHTTPPort), + Endpoint: testutil.EndpointForPort(defaultHTTPPort), }, Path: "/", }, @@ -180,7 +180,7 @@ func TestLoadConfig(t *testing.T) { cfg := factory.CreateDefaultConfig() sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) if tt.expectedErr != nil { assert.ErrorIs(t, component.ValidateConfig(cfg), tt.expectedErr) return diff --git a/extension/healthcheckv2extension/extension.go b/extension/healthcheckv2extension/extension.go index cb58a30add88..ba3594b2fa40 100644 --- a/extension/healthcheckv2extension/extension.go +++ b/extension/healthcheckv2extension/extension.go @@ -7,36 +7,205 @@ import ( "context" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componentstatus" + "go.opentelemetry.io/collector/confmap" "go.opentelemetry.io/collector/extension" + "go.opentelemetry.io/collector/extension/extensioncapabilities" + "go.uber.org/multierr" "go.uber.org/zap" + + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension/internal/grpc" + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension/internal/http" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status" ) +type eventSourcePair struct { + source *componentstatus.InstanceID + event *componentstatus.Event +} + type healthCheckExtension struct { - config Config - telemetry component.TelemetrySettings + config Config + telemetry component.TelemetrySettings + aggregator *status.Aggregator + subcomponents []component.Component + eventCh chan *eventSourcePair + readyCh chan struct{} + host component.Host } -var _ component.Component = (*healthCheckExtension)(nil) +var ( + _ component.Component = (*healthCheckExtension)(nil) + _ extensioncapabilities.ConfigWatcher = (*healthCheckExtension)(nil) + _ extensioncapabilities.PipelineWatcher = (*healthCheckExtension)(nil) +) func newExtension( - _ context.Context, + ctx context.Context, config Config, - set extension.CreateSettings, + set extension.Settings, ) *healthCheckExtension { - return &healthCheckExtension{ - config: config, - telemetry: set.TelemetrySettings, + var comps []component.Component + + errPriority := status.PriorityPermanent + if config.ComponentHealthConfig != nil && + config.ComponentHealthConfig.IncludeRecoverable && + !config.ComponentHealthConfig.IncludePermanent { + errPriority = status.PriorityRecoverable + } + + aggregator := status.NewAggregator(errPriority) + + if config.UseV2 && config.GRPCConfig != nil { + grpcServer := grpc.NewServer( + config.GRPCConfig, + config.ComponentHealthConfig, + set.TelemetrySettings, + aggregator, + ) + comps = append(comps, grpcServer) + } + + if !config.UseV2 || config.UseV2 && config.HTTPConfig != nil { + httpServer := http.NewServer( + config.HTTPConfig, + config.LegacyConfig, + config.ComponentHealthConfig, + set.TelemetrySettings, + aggregator, + ) + comps = append(comps, httpServer) } + + hc := &healthCheckExtension{ + config: config, + subcomponents: comps, + telemetry: set.TelemetrySettings, + aggregator: aggregator, + eventCh: make(chan *eventSourcePair), + readyCh: make(chan struct{}), + } + + // Start processing events in the background so that our status watcher doesn't + // block others before the extension starts. + go hc.eventLoop(ctx) + + return hc } // Start implements the component.Component interface. -func (hc *healthCheckExtension) Start(context.Context, component.Host) error { +func (hc *healthCheckExtension) Start(ctx context.Context, host component.Host) error { hc.telemetry.Logger.Debug("Starting health check extension V2", zap.Any("config", hc.config)) + hc.host = host + + for _, comp := range hc.subcomponents { + if err := comp.Start(ctx, host); err != nil { + return err + } + } + return nil } // Shutdown implements the component.Component interface. -func (hc *healthCheckExtension) Shutdown(context.Context) error { +func (hc *healthCheckExtension) Shutdown(ctx context.Context) error { + // Preemptively send the stopped event, so it can be exported before shutdown + componentstatus.ReportStatus(hc.host, componentstatus.NewEvent(componentstatus.StatusStopped)) + + close(hc.eventCh) + hc.aggregator.Close() + + var err error + for _, comp := range hc.subcomponents { + err = multierr.Append(err, comp.Shutdown(ctx)) + } + + return err +} + +// ComponentStatusChanged implements the extension.StatusWatcher interface. +func (hc *healthCheckExtension) ComponentStatusChanged( + source *componentstatus.InstanceID, + event *componentstatus.Event, +) { + // There can be late arriving events after shutdown. We need to close + // the event channel so that this function doesn't block and we release all + // goroutines, but attempting to write to a closed channel will panic; log + // and recover. + defer func() { + if r := recover(); r != nil { + hc.telemetry.Logger.Info( + "discarding event received after shutdown", + zap.Any("source", source), + zap.Any("event", event), + ) + } + }() + hc.eventCh <- &eventSourcePair{source: source, event: event} +} + +// NotifyConfig implements the extensioncapabilities.ConfigWatcher interface. +func (hc *healthCheckExtension) NotifyConfig(ctx context.Context, conf *confmap.Conf) error { + var err error + for _, comp := range hc.subcomponents { + if cw, ok := comp.(extensioncapabilities.ConfigWatcher); ok { + err = multierr.Append(err, cw.NotifyConfig(ctx, conf)) + } + } + return err +} + +// Ready implements the extension.PipelineWatcher interface. +func (hc *healthCheckExtension) Ready() error { + close(hc.readyCh) return nil } + +// NotReady implements the extension.PipelineWatcher interface. +func (hc *healthCheckExtension) NotReady() error { + return nil +} + +func (hc *healthCheckExtension) eventLoop(ctx context.Context) { + // Record events with component.StatusStarting, but queue other events until + // PipelineWatcher.Ready is called. This prevents aggregate statuses from + // flapping between StatusStarting and StatusOK as components are started + // individually by the service. + var eventQueue []*eventSourcePair + + for loop := true; loop; { + select { + case esp, ok := <-hc.eventCh: + if !ok { + return + } + if esp.event.Status() != componentstatus.StatusStarting { + eventQueue = append(eventQueue, esp) + continue + } + hc.aggregator.RecordStatus(esp.source, esp.event) + case <-hc.readyCh: + for _, esp := range eventQueue { + hc.aggregator.RecordStatus(esp.source, esp.event) + } + eventQueue = nil + loop = false + case <-ctx.Done(): + return + } + } + + // After PipelineWatcher.Ready, record statuses as they are received. + for { + select { + case esp, ok := <-hc.eventCh: + if !ok { + return + } + hc.aggregator.RecordStatus(esp.source, esp.event) + case <-ctx.Done(): + return + } + } +} diff --git a/extension/healthcheckv2extension/extension_test.go b/extension/healthcheckv2extension/extension_test.go new file mode 100644 index 000000000000..57ba700e7e31 --- /dev/null +++ b/extension/healthcheckv2extension/extension_test.go @@ -0,0 +1,135 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package healthcheckv2extension + +import ( + "context" + "fmt" + "io" + "net/http" + "os" + "path/filepath" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component/componentstatus" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/confmap/confmaptest" + "go.opentelemetry.io/collector/extension/extensiontest" + + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/testutil" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status/testhelpers" +) + +func TestComponentStatus(t *testing.T) { + cfg := createDefaultConfig().(*Config) + cfg.HTTPConfig.Endpoint = testutil.GetAvailableLocalAddress(t) + cfg.GRPCConfig.NetAddr.Endpoint = testutil.GetAvailableLocalAddress(t) + cfg.UseV2 = true + ext := newExtension(context.Background(), *cfg, extensiontest.NewNopSettings()) + + // Status before Start will be StatusNone + st, ok := ext.aggregator.AggregateStatus(status.ScopeAll, status.Concise) + require.True(t, ok) + assert.Equal(t, componentstatus.StatusNone, st.Status()) + + require.NoError(t, ext.Start(context.Background(), componenttest.NewNopHost())) + + traces := testhelpers.NewPipelineMetadata("traces") + + // StatusStarting will be sent immediately. + for _, id := range traces.InstanceIDs() { + ext.ComponentStatusChanged(id, componentstatus.NewEvent(componentstatus.StatusStarting)) + } + + // StatusOK will be queued until the PipelineWatcher Ready method is called. + for _, id := range traces.InstanceIDs() { + ext.ComponentStatusChanged(id, componentstatus.NewEvent(componentstatus.StatusOK)) + } + + // Note the use of assert.Eventually here and throughout this test is because + // status events are processed asynchronously in the background. + assert.Eventually(t, func() bool { + st, ok = ext.aggregator.AggregateStatus(status.ScopeAll, status.Concise) + require.True(t, ok) + return st.Status() == componentstatus.StatusStarting + }, time.Second, 10*time.Millisecond) + + require.NoError(t, ext.Ready()) + + assert.Eventually(t, func() bool { + st, ok = ext.aggregator.AggregateStatus(status.ScopeAll, status.Concise) + require.True(t, ok) + return st.Status() == componentstatus.StatusOK + }, time.Second, 10*time.Millisecond) + + // StatusStopping will be sent immediately. + for _, id := range traces.InstanceIDs() { + ext.ComponentStatusChanged(id, componentstatus.NewEvent(componentstatus.StatusStopping)) + } + + assert.Eventually(t, func() bool { + st, ok = ext.aggregator.AggregateStatus(status.ScopeAll, status.Concise) + require.True(t, ok) + return st.Status() == componentstatus.StatusStopping + }, time.Second, 10*time.Millisecond) + + require.NoError(t, ext.NotReady()) + require.NoError(t, ext.Shutdown(context.Background())) + + // Events sent after shutdown will be discarded + for _, id := range traces.InstanceIDs() { + ext.ComponentStatusChanged(id, componentstatus.NewEvent(componentstatus.StatusStopped)) + } + + st, ok = ext.aggregator.AggregateStatus(status.ScopeAll, status.Concise) + require.True(t, ok) + assert.Equal(t, componentstatus.StatusStopping, st.Status()) +} + +func TestNotifyConfig(t *testing.T) { + confMap, err := confmaptest.LoadConf( + filepath.Join("internal", "http", "testdata", "config.yaml"), + ) + require.NoError(t, err) + confJSON, err := os.ReadFile( + filepath.Clean(filepath.Join("internal", "http", "testdata", "config.json")), + ) + require.NoError(t, err) + + endpoint := testutil.GetAvailableLocalAddress(t) + + cfg := createDefaultConfig().(*Config) + cfg.UseV2 = true + cfg.HTTPConfig.Endpoint = endpoint + cfg.HTTPConfig.Config.Enabled = true + cfg.HTTPConfig.Config.Path = "/config" + + ext := newExtension(context.Background(), *cfg, extensiontest.NewNopSettings()) + + require.NoError(t, ext.Start(context.Background(), componenttest.NewNopHost())) + t.Cleanup(func() { require.NoError(t, ext.Shutdown(context.Background())) }) + + client := &http.Client{} + url := fmt.Sprintf("http://%s/config", endpoint) + + var resp *http.Response + + resp, err = client.Get(url) + require.NoError(t, err) + assert.Equal(t, http.StatusServiceUnavailable, resp.StatusCode) + + require.NoError(t, ext.NotifyConfig(context.Background(), confMap)) + + resp, err = client.Get(url) + require.NoError(t, err) + assert.Equal(t, http.StatusOK, resp.StatusCode) + + body, err := io.ReadAll(resp.Body) + require.NoError(t, err) + assert.JSONEq(t, string(confJSON), string(body)) +} diff --git a/extension/healthcheckv2extension/factory.go b/extension/healthcheckv2extension/factory.go index bd15b7e83fe4..e074afac5320 100644 --- a/extension/healthcheckv2extension/factory.go +++ b/extension/healthcheckv2extension/factory.go @@ -17,7 +17,7 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension/internal/grpc" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension/internal/http" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension/internal/metadata" - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/localhostgate" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/testutil" ) const ( @@ -39,13 +39,13 @@ func createDefaultConfig() component.Config { return &Config{ LegacyConfig: http.LegacyConfig{ ServerConfig: confighttp.ServerConfig{ - Endpoint: localhostgate.EndpointForPort(defaultHTTPPort), + Endpoint: testutil.EndpointForPort(defaultHTTPPort), }, Path: "/", }, HTTPConfig: &http.Config{ ServerConfig: confighttp.ServerConfig{ - Endpoint: localhostgate.EndpointForPort(defaultHTTPPort), + Endpoint: testutil.EndpointForPort(defaultHTTPPort), }, Status: http.PathConfig{ Enabled: true, @@ -59,7 +59,7 @@ func createDefaultConfig() component.Config { GRPCConfig: &grpc.Config{ ServerConfig: configgrpc.ServerConfig{ NetAddr: confignet.AddrConfig{ - Endpoint: localhostgate.EndpointForPort(defaultGRPCPort), + Endpoint: testutil.EndpointForPort(defaultGRPCPort), Transport: "tcp", }, }, @@ -67,7 +67,7 @@ func createDefaultConfig() component.Config { } } -func createExtension(ctx context.Context, set extension.CreateSettings, cfg component.Config) (extension.Extension, error) { +func createExtension(ctx context.Context, set extension.Settings, cfg component.Config) (extension.Extension, error) { config := cfg.(*Config) return newExtension(ctx, *config, set), nil } diff --git a/extension/healthcheckv2extension/factory_test.go b/extension/healthcheckv2extension/factory_test.go index 540a0346a00a..eaf97966b373 100644 --- a/extension/healthcheckv2extension/factory_test.go +++ b/extension/healthcheckv2extension/factory_test.go @@ -17,7 +17,6 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension/internal/grpc" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension/internal/http" - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/localhostgate" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/testutil" ) @@ -26,13 +25,13 @@ func TestCreateDefaultConfig(t *testing.T) { assert.Equal(t, &Config{ LegacyConfig: http.LegacyConfig{ ServerConfig: confighttp.ServerConfig{ - Endpoint: localhostgate.EndpointForPort(defaultHTTPPort), + Endpoint: testutil.EndpointForPort(defaultHTTPPort), }, Path: "/", }, HTTPConfig: &http.Config{ ServerConfig: confighttp.ServerConfig{ - Endpoint: localhostgate.EndpointForPort(defaultHTTPPort), + Endpoint: testutil.EndpointForPort(defaultHTTPPort), }, Status: http.PathConfig{ Enabled: true, @@ -46,7 +45,7 @@ func TestCreateDefaultConfig(t *testing.T) { GRPCConfig: &grpc.Config{ ServerConfig: configgrpc.ServerConfig{ NetAddr: confignet.AddrConfig{ - Endpoint: localhostgate.EndpointForPort(defaultGRPCPort), + Endpoint: testutil.EndpointForPort(defaultGRPCPort), Transport: "tcp", }, }, @@ -54,16 +53,19 @@ func TestCreateDefaultConfig(t *testing.T) { }, cfg) assert.NoError(t, componenttest.CheckConfigStruct(cfg)) - ext, err := createExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + ext, err := createExtension(ctx, extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NotNil(t, ext) } -func TestCreateExtension(t *testing.T) { +func TestCreate(t *testing.T) { cfg := createDefaultConfig().(*Config) cfg.Endpoint = testutil.GetAvailableLocalAddress(t) - - ext, err := createExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + ext, err := createExtension(ctx, extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NotNil(t, ext) } diff --git a/extension/healthcheckv2extension/generated_component_test.go b/extension/healthcheckv2extension/generated_component_test.go index 38ff404d82dc..59348ec77571 100644 --- a/extension/healthcheckv2extension/generated_component_test.go +++ b/extension/healthcheckv2extension/generated_component_test.go @@ -30,18 +30,18 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) t.Run("shutdown", func(t *testing.T) { - e, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + e, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) err = e.Shutdown(context.Background()) require.NoError(t, err) }) t.Run("lifecycle", func(t *testing.T) { - firstExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + firstExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, firstExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, firstExt.Shutdown(context.Background())) - secondExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + secondExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, secondExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, secondExt.Shutdown(context.Background())) diff --git a/extension/healthcheckv2extension/go.mod b/extension/healthcheckv2extension/go.mod index b30ce09af6b4..fefb82d23968 100644 --- a/extension/healthcheckv2extension/go.mod +++ b/extension/healthcheckv2extension/go.mod @@ -1,72 +1,74 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configgrpc v0.102.0 - go.opentelemetry.io/collector/config/confighttp v0.102.0 - go.opentelemetry.io/collector/config/confignet v0.102.0 - go.opentelemetry.io/collector/config/configtls v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componentstatus v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configgrpc v0.116.0 + go.opentelemetry.io/collector/config/confighttp v0.116.0 + go.opentelemetry.io/collector/config/confignet v1.22.0 + go.opentelemetry.io/collector/config/configtls v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 go.uber.org/goleak v1.3.0 + go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 + google.golang.org/grpc v1.68.1 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect - github.com/mostynb/go-grpc-compression v1.2.2 // indirect + github.com/mostynb/go-grpc-compression v1.2.3 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/rs/cors v1.10.1 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/configopaque v1.9.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + github.com/rs/cors v1.11.1 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/configopaque v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/common => ../../internal/common + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status => ../../pkg/status diff --git a/extension/healthcheckv2extension/go.sum b/extension/healthcheckv2extension/go.sum index fe1d0d2fa4ae..5fa0d25cd11a 100644 --- a/extension/healthcheckv2extension/go.sum +++ b/extension/healthcheckv2extension/go.sum @@ -1,22 +1,20 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= @@ -29,14 +27,14 @@ 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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -49,78 +47,84 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mostynb/go-grpc-compression v1.2.2 h1:XaDbnRvt2+1vgr0b/l0qh4mJAfIxE0bKXtz2Znl3GGI= -github.com/mostynb/go-grpc-compression v1.2.2/go.mod h1:GOCr2KBxXcblCuczg3YdLQlcin1/NfyDA348ckuCH6w= +github.com/mostynb/go-grpc-compression v1.2.3 h1:42/BKWMy0KEJGSdWvzqIyOZ95YcR9mLPqKctH7Uo//I= +github.com/mostynb/go-grpc-compression v1.2.3/go.mod h1:AghIxF3P57umzqM9yz795+y1Vjs47Km/Y2FE6ouQ7Lg= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/configgrpc v0.102.0 h1:cQi5HwpkHvrZJUxZjoGXkWpAuK+gEyp/1Zjn0BrkvmQ= -go.opentelemetry.io/collector/config/configgrpc v0.102.0/go.mod h1:ASpBXzDWLiDGlG8iRFovU5R4LhAefoC4ajm+qIdslOw= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/confignet v0.102.0 h1:+wQevJ/iBnPxL+roY7WWnAjMxB8v4M5QrS3+0iEmauw= -go.opentelemetry.io/collector/config/confignet v0.102.0/go.mod h1:pfOrCTfSZEB6H2rKtx41/3RN4dKs+X2EKQbw3MGRh0E= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 h1:vS1Ao/R55RNV4O7TA2Qopok8yN+X0LIP6RVWLFkprck= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0/go.mod h1:BMsdeOxN04K0L5FNUBfjFdvwWGNe/rkmSwH4Aelu/X0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/configgrpc v0.116.0 h1:O8Y1X9wDH5dDdqDJ9kqoaMrxEauaDSJBg9aNC6QgB7g= +go.opentelemetry.io/collector/config/configgrpc v0.116.0/go.mod h1:RPrSQrr6xhIaAK2DdcECi142NjSo0npQfVQB3nommSo= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/confignet v1.22.0 h1:SBEMHJZWD8J4qgFw1O+BEkXW9AWldDi6Fz5YeDeoU58= +go.opentelemetry.io/collector/config/confignet v1.22.0/go.mod h1:ZppUH1hgUJOubawEsxsQ9MzEYFytqo2GnVSS7d4CVxc= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0 h1:bXDgoiDiwFfrO5S6q1Wpe0su303CW4Qxthoy4CxG6eg= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0/go.mod h1:uFZlAPxk2+s6zk1W+u22DgxxSDugWy0QaY5kQzjNy7Q= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 h1:yMkBS9yViCc7U7yeLzJPM2XizlfdVvBRSmsQDWu6qc0= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0/go.mod h1:n8MR6/liuGB5EmTETUBeU5ZgqMOlqKRxUaqPQBOANZ8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -136,20 +140,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -158,12 +162,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 h1:QCqS/PdaHTSWGvupk2F/ehwHtGc0/GYkT+3GAcR1CCc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/extension/healthcheckv2extension/internal/grpc/grpc.go b/extension/healthcheckv2extension/internal/grpc/grpc.go new file mode 100644 index 000000000000..2f8ad037c490 --- /dev/null +++ b/extension/healthcheckv2extension/internal/grpc/grpc.go @@ -0,0 +1,137 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package grpc // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension/internal/grpc" + +import ( + "context" + "time" + + "go.opentelemetry.io/collector/component/componentstatus" + "google.golang.org/grpc/codes" + healthpb "google.golang.org/grpc/health/grpc_health_v1" + grpcstatus "google.golang.org/grpc/status" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status" +) + +var ( + errNotFound = grpcstatus.Error(codes.NotFound, "Service not found.") + errShuttingDown = grpcstatus.Error(codes.Canceled, "Server shutting down.") + errStreamSend = grpcstatus.Error(codes.Canceled, "Error sending; stream terminated.") + errStreamEnded = grpcstatus.Error(codes.Canceled, "Stream has ended.") + + statusToServingStatusMap = map[componentstatus.Status]healthpb.HealthCheckResponse_ServingStatus{ + componentstatus.StatusNone: healthpb.HealthCheckResponse_NOT_SERVING, + componentstatus.StatusStarting: healthpb.HealthCheckResponse_NOT_SERVING, + componentstatus.StatusOK: healthpb.HealthCheckResponse_SERVING, + componentstatus.StatusRecoverableError: healthpb.HealthCheckResponse_SERVING, + componentstatus.StatusPermanentError: healthpb.HealthCheckResponse_SERVING, + componentstatus.StatusFatalError: healthpb.HealthCheckResponse_NOT_SERVING, + componentstatus.StatusStopping: healthpb.HealthCheckResponse_NOT_SERVING, + componentstatus.StatusStopped: healthpb.HealthCheckResponse_NOT_SERVING, + } +) + +func (s *Server) Check( + _ context.Context, + req *healthpb.HealthCheckRequest, +) (*healthpb.HealthCheckResponse, error) { + st, ok := s.aggregator.AggregateStatus(status.Scope(req.Service), status.Concise) + if !ok { + return nil, errNotFound + } + + return &healthpb.HealthCheckResponse{ + Status: s.toServingStatus(st.Event), + }, nil +} + +func (s *Server) Watch(req *healthpb.HealthCheckRequest, stream healthpb.Health_WatchServer) error { + sub, unsub := s.aggregator.Subscribe(status.Scope(req.Service), status.Concise) + defer unsub() + + var lastServingStatus healthpb.HealthCheckResponse_ServingStatus = -1 + var failureTimer *time.Timer + failureCh := make(chan struct{}) + + for { + select { + case st, ok := <-sub: + if !ok { + return errShuttingDown + } + var sst healthpb.HealthCheckResponse_ServingStatus + + switch { + case st == nil: + sst = healthpb.HealthCheckResponse_SERVICE_UNKNOWN + case s.componentHealthConfig.IncludeRecoverable && + s.componentHealthConfig.RecoveryDuration > 0 && + st.Status() == componentstatus.StatusRecoverableError: + if failureTimer == nil { + failureTimer = time.AfterFunc( + s.componentHealthConfig.RecoveryDuration, + func() { failureCh <- struct{}{} }, + ) + } + sst = lastServingStatus + if lastServingStatus == -1 { + sst = healthpb.HealthCheckResponse_SERVING + } + default: + if failureTimer != nil { + if !failureTimer.Stop() { + <-failureTimer.C + } + failureTimer = nil + } + sst = s.toServingStatus(st.Event) + } + + if lastServingStatus == sst { + continue + } + + lastServingStatus = sst + + err := stream.Send(&healthpb.HealthCheckResponse{Status: sst}) + if err != nil { + return errStreamSend + } + case <-failureCh: + failureTimer.Stop() + failureTimer = nil + if lastServingStatus == healthpb.HealthCheckResponse_NOT_SERVING { + continue + } + lastServingStatus = healthpb.HealthCheckResponse_NOT_SERVING + err := stream.Send( + &healthpb.HealthCheckResponse{ + Status: healthpb.HealthCheckResponse_NOT_SERVING, + }, + ) + if err != nil { + return errStreamSend + } + case <-stream.Context().Done(): + return errStreamEnded + } + } +} + +func (s *Server) toServingStatus( + ev status.Event, +) healthpb.HealthCheckResponse_ServingStatus { + if s.componentHealthConfig.IncludeRecoverable && + ev.Status() == componentstatus.StatusRecoverableError && + time.Now().After(ev.Timestamp().Add(s.componentHealthConfig.RecoveryDuration)) { + return healthpb.HealthCheckResponse_NOT_SERVING + } + + if s.componentHealthConfig.IncludePermanent && ev.Status() == componentstatus.StatusPermanentError { + return healthpb.HealthCheckResponse_NOT_SERVING + } + + return statusToServingStatusMap[ev.Status()] +} diff --git a/extension/healthcheckv2extension/internal/grpc/grpc_test.go b/extension/healthcheckv2extension/internal/grpc/grpc_test.go new file mode 100644 index 000000000000..6294d14d8963 --- /dev/null +++ b/extension/healthcheckv2extension/internal/grpc/grpc_test.go @@ -0,0 +1,1599 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package grpc + +import ( + "context" + "sync" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component/componentstatus" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/config/configgrpc" + "go.opentelemetry.io/collector/config/confignet" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/credentials/insecure" + healthpb "google.golang.org/grpc/health/grpc_health_v1" + grpcstatus "google.golang.org/grpc/status" + + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension/internal/common" + internalhelpers "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension/internal/testhelpers" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/testutil" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status/testhelpers" +) + +func TestCheck(t *testing.T) { + addr := testutil.GetAvailableLocalAddress(t) + config := &Config{ + ServerConfig: configgrpc.ServerConfig{ + NetAddr: confignet.AddrConfig{ + Endpoint: addr, + Transport: "tcp", + }, + }, + } + var server *Server + traces := testhelpers.NewPipelineMetadata("traces") + metrics := testhelpers.NewPipelineMetadata("metrics") + + type teststep struct { + step func() + eventually bool + service string + expectedStatus healthpb.HealthCheckResponse_ServingStatus + expectedErr error + } + + tests := []struct { + name string + config *Config + componentHealthSettings *common.ComponentHealthConfig + teststeps []teststep + }{ + { + name: "exclude recoverable and permanent errors", + config: config, + teststeps: []teststep{ + { + service: "", + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedErr: grpcstatus.Error(codes.NotFound, "Service not found."), + }, + { + service: metrics.PipelineID.String(), + expectedErr: grpcstatus.Error(codes.NotFound, "Service not found."), + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStarting, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStarting, + ) + }, + service: "", + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusOK, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + service: "", + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + step: func() { + // errors will be ignored + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewRecoverableErrorEvent(assert.AnError), + ) + }, + service: "", + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewEvent(componentstatus.StatusOK), + ) + }, + service: "", + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopping, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStopping, + ) + }, + service: "", + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopped, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStopped, + ) + }, + service: "", + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + }, + }, + { + name: "include recoverable and exclude permanent errors", + config: config, + componentHealthSettings: &common.ComponentHealthConfig{ + IncludePermanent: false, + IncludeRecoverable: true, + RecoveryDuration: 2 * time.Millisecond, + }, + teststeps: []teststep{ + { + service: "", + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedErr: grpcstatus.Error(codes.NotFound, "Service not found."), + }, + { + service: metrics.PipelineID.String(), + expectedErr: grpcstatus.Error(codes.NotFound, "Service not found."), + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStarting, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStarting, + ) + }, + service: "", + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusOK, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + service: "", + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + step: func() { + // metrics and overall status will be NOT_SERVING + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewRecoverableErrorEvent(assert.AnError), + ) + }, + service: "", + eventually: true, + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + // metrics and overall status will recover and resume SERVING + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewEvent(componentstatus.StatusOK), + ) + }, + service: "", + eventually: true, + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + step: func() { + // permament error will be ignored + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewPermanentErrorEvent(assert.AnError), + ) + }, + service: "", + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopping, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStopping, + ) + }, + service: "", + eventually: true, + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopped, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStopped, + ) + }, + service: "", + eventually: true, + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + }, + }, + { + name: "include permanent and exclude recoverable errors", + config: config, + componentHealthSettings: &common.ComponentHealthConfig{ + IncludePermanent: true, + }, + teststeps: []teststep{ + { + service: "", + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedErr: grpcstatus.Error(codes.NotFound, "Service not found."), + }, + { + service: metrics.PipelineID.String(), + expectedErr: grpcstatus.Error(codes.NotFound, "Service not found."), + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStarting, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStarting, + ) + }, + service: "", + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusOK, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + service: "", + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + step: func() { + // recoverable will be ignored + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewRecoverableErrorEvent(assert.AnError), + ) + }, + service: "", + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + step: func() { + // permament error included + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewPermanentErrorEvent(assert.AnError), + ) + }, + service: "", + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopping, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStopping, + ) + }, + service: "", + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopped, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStopped, + ) + }, + service: "", + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + }, + }, + { + name: "include permanent and recoverable errors", + config: config, + componentHealthSettings: &common.ComponentHealthConfig{ + IncludePermanent: true, + IncludeRecoverable: true, + RecoveryDuration: 2 * time.Millisecond, + }, + teststeps: []teststep{ + { + service: "", + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedErr: grpcstatus.Error(codes.NotFound, "Service not found."), + }, + { + service: metrics.PipelineID.String(), + expectedErr: grpcstatus.Error(codes.NotFound, "Service not found."), + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStarting, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStarting, + ) + }, + service: "", + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusOK, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + service: "", + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + step: func() { + // metrics and overall status will be NOT_SERVING + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewRecoverableErrorEvent(assert.AnError), + ) + }, + service: "", + eventually: true, + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + // metrics and overall status will recover and resume SERVING + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewEvent(componentstatus.StatusOK), + ) + }, + service: "", + eventually: true, + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopping, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStopping, + ) + }, + service: "", + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopped, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStopped, + ) + }, + service: "", + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + }, + }, + } + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + server = NewServer( + config, + tc.componentHealthSettings, + componenttest.NewNopTelemetrySettings(), + status.NewAggregator(internalhelpers.ErrPriority(tc.componentHealthSettings)), + ) + require.NoError(t, server.Start(context.Background(), componenttest.NewNopHost())) + t.Cleanup(func() { require.NoError(t, server.Shutdown(context.Background())) }) + + cc, err := grpc.NewClient( + addr, + grpc.WithTransportCredentials(insecure.NewCredentials()), + ) + require.NoError(t, err) + defer func() { + assert.NoError(t, cc.Close()) + }() + + client := healthpb.NewHealthClient(cc) + + for _, ts := range tc.teststeps { + if ts.step != nil { + ts.step() + } + + if ts.eventually { + assert.Eventually(t, func() bool { + resp, err := client.Check( + context.Background(), + &healthpb.HealthCheckRequest{Service: ts.service}, + ) + require.NoError(t, err) + return ts.expectedStatus == resp.Status + }, time.Second, 10*time.Millisecond) + continue + } + + resp, err := client.Check( + context.Background(), + &healthpb.HealthCheckRequest{Service: ts.service}, + ) + require.Equal(t, ts.expectedErr, err) + if ts.expectedErr != nil { + continue + } + assert.Equal(t, ts.expectedStatus, resp.Status) + } + }) + } +} + +func TestWatch(t *testing.T) { + addr := testutil.GetAvailableLocalAddress(t) + config := &Config{ + ServerConfig: configgrpc.ServerConfig{ + NetAddr: confignet.AddrConfig{ + Endpoint: addr, + Transport: "tcp", + }, + }, + } + var server *Server + traces := testhelpers.NewPipelineMetadata("traces") + metrics := testhelpers.NewPipelineMetadata("metrics") + + // statusUnchanged is a sentinel value to signal that a step does not result + // in a status change. This is important, because checking for a status + // change is blocking. + var statusUnchanged healthpb.HealthCheckResponse_ServingStatus = -1 + + type teststep struct { + step func() + service string + expectedStatus healthpb.HealthCheckResponse_ServingStatus + } + + tests := []struct { + name string + config *Config + componentHealthSettings *common.ComponentHealthConfig + teststeps []teststep + }{ + { + name: "exclude recoverable and permanent errors", + config: config, + teststeps: []teststep{ + { + service: "", + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVICE_UNKNOWN, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVICE_UNKNOWN, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStarting, + ) + }, + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStarting, + ) + }, + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + service: "", + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + step: func() { + // errors will be ignored + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewRecoverableErrorEvent(assert.AnError), + ) + }, + service: metrics.PipelineID.String(), + expectedStatus: statusUnchanged, + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewPermanentErrorEvent(assert.AnError), + ) + }, + service: metrics.PipelineID.String(), + expectedStatus: statusUnchanged, + }, + { + step: func() { + // This will be the last status change for traces (stopping changes to NOT_SERVING) + // Stopped results in the same serving status, and repeat statuses are not streamed. + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopping, + ) + }, + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: "", + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + // This will be the last status change for metrics (stopping changes to NOT_SERVING) + // Stopped results in the same serving status, and repeat statuses are not streamed. + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStopping, + ) + }, + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + }, + }, + { + name: "include recoverable and exclude permanent errors", + config: config, + componentHealthSettings: &common.ComponentHealthConfig{ + IncludePermanent: false, + IncludeRecoverable: true, + RecoveryDuration: 2 * time.Millisecond, + }, + teststeps: []teststep{ + { + service: "", + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVICE_UNKNOWN, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVICE_UNKNOWN, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStarting, + ) + }, + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStarting, + ) + }, + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + service: "", + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + step: func() { + // metrics and overall status will be NOT_SERVING + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewRecoverableErrorEvent(assert.AnError), + ) + }, + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: "", + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + // metrics and overall status will recover and resume SERVING + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewEvent(componentstatus.StatusOK), + ) + }, + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + service: "", + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + step: func() { + // permanent error will be ignored + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewPermanentErrorEvent(assert.AnError), + ) + }, + service: metrics.PipelineID.String(), + expectedStatus: statusUnchanged, + }, + }, + }, + { + name: "exclude permanent errors", + config: config, + componentHealthSettings: &common.ComponentHealthConfig{ + IncludePermanent: false, + IncludeRecoverable: true, + RecoveryDuration: 2 * time.Millisecond, + }, + teststeps: []teststep{ + { + service: "", + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVICE_UNKNOWN, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVICE_UNKNOWN, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStarting, + ) + }, + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStarting, + ) + }, + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + service: "", + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + step: func() { + // permanent error will be ignored + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewPermanentErrorEvent(assert.AnError), + ) + }, + service: metrics.PipelineID.String(), + expectedStatus: statusUnchanged, + }, + }, + }, + { + name: "include recoverable 0s recovery duration", + config: config, + componentHealthSettings: &common.ComponentHealthConfig{ + IncludePermanent: false, + IncludeRecoverable: true, + RecoveryDuration: 2 * time.Millisecond, + }, + teststeps: []teststep{ + { + service: "", + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVICE_UNKNOWN, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVICE_UNKNOWN, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStarting, + ) + }, + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStarting, + ) + }, + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + service: "", + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + step: func() { + // metrics and overall status will be NOT_SERVING + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewRecoverableErrorEvent(assert.AnError), + ) + }, + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: "", + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + // metrics and overall status will recover and resume SERVING + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewEvent(componentstatus.StatusOK), + ) + }, + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + service: "", + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + step: func() { + // This will be the last status change for traces (stopping changes to NOT_SERVING) + // Stopped results in the same serving status, and repeat statuses are not streamed. + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopping, + ) + }, + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: "", + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + // This will be the last status change for metrics (stopping changes to NOT_SERVING) + // Stopped results in the same serving status, and repeat statuses are not streamed. + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStopping, + ) + }, + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + }, + }, + { + name: "include permanent and exclude recoverable errors", + config: config, + componentHealthSettings: &common.ComponentHealthConfig{ + IncludePermanent: true, + IncludeRecoverable: false, + RecoveryDuration: 2 * time.Millisecond, + }, + teststeps: []teststep{ + { + service: "", + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVICE_UNKNOWN, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVICE_UNKNOWN, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStarting, + ) + }, + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStarting, + ) + }, + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + service: "", + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + step: func() { + // recoverable will be ignored + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewRecoverableErrorEvent(assert.AnError), + ) + }, + service: metrics.PipelineID.String(), + expectedStatus: statusUnchanged, + }, + { + step: func() { + // metrics and overall status will recover and resume SERVING + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewPermanentErrorEvent(assert.AnError), + ) + }, + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: "", + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + // This will be the last status change for traces (stopping changes to NOT_SERVING) + // Stopped results in the same serving status, and repeat statuses are not streamed. + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopping, + ) + }, + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + }, + }, + { + name: "exclude recoverable errors", + config: config, + componentHealthSettings: &common.ComponentHealthConfig{ + IncludePermanent: true, + IncludeRecoverable: false, + RecoveryDuration: 2 * time.Millisecond, + }, + teststeps: []teststep{ + { + service: "", + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVICE_UNKNOWN, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVICE_UNKNOWN, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStarting, + ) + }, + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStarting, + ) + }, + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + service: "", + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + step: func() { + // recoverable will be ignored + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewRecoverableErrorEvent(assert.AnError), + ) + }, + service: metrics.PipelineID.String(), + expectedStatus: statusUnchanged, + }, + }, + }, + { + name: "include recoverable and permanent errors", + config: config, + componentHealthSettings: &common.ComponentHealthConfig{ + IncludePermanent: true, + IncludeRecoverable: true, + RecoveryDuration: 2 * time.Millisecond, + }, + teststeps: []teststep{ + { + service: "", + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVICE_UNKNOWN, + }, + { + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVICE_UNKNOWN, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStarting, + ) + }, + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStarting, + ) + }, + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + service: traces.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + service: "", + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + step: func() { + // metrics and overall status will be NOT_SERVING + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewRecoverableErrorEvent(assert.AnError), + ) + }, + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: "", + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + step: func() { + // metrics and overall status will recover and resume SERVING + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewEvent(componentstatus.StatusOK), + ) + }, + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + service: "", + expectedStatus: healthpb.HealthCheckResponse_SERVING, + }, + { + step: func() { + // metrics and overall status will be NOT_SERVING + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewPermanentErrorEvent(assert.AnError), + ) + }, + service: metrics.PipelineID.String(), + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + { + service: "", + expectedStatus: healthpb.HealthCheckResponse_NOT_SERVING, + }, + }, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + server = NewServer( + config, + tc.componentHealthSettings, + componenttest.NewNopTelemetrySettings(), + status.NewAggregator(internalhelpers.ErrPriority(tc.componentHealthSettings)), + ) + require.NoError(t, server.Start(context.Background(), componenttest.NewNopHost())) + t.Cleanup(func() { require.NoError(t, server.Shutdown(context.Background())) }) + + cc, err := grpc.NewClient( + addr, + grpc.WithTransportCredentials(insecure.NewCredentials()), + ) + require.NoError(t, err) + defer func() { + assert.NoError(t, cc.Close()) + }() + + client := healthpb.NewHealthClient(cc) + watchers := make(map[string]healthpb.Health_WatchClient) + + for _, ts := range tc.teststeps { + if ts.step != nil { + ts.step() + } + + if statusUnchanged == ts.expectedStatus { + continue + } + + watcher, ok := watchers[ts.service] + if !ok { + watcher, err = client.Watch( + context.Background(), + &healthpb.HealthCheckRequest{Service: ts.service}, + ) + require.NoError(t, err) + watchers[ts.service] = watcher + } + + var resp *healthpb.HealthCheckResponse + // Note Recv blocks until there is a new item in the stream + resp, err = watcher.Recv() + require.NoError(t, err) + assert.Equal(t, ts.expectedStatus, resp.Status) + } + + wg := sync.WaitGroup{} + wg.Add(len(watchers)) + + for svc, watcher := range watchers { + svc := svc + watcher := watcher + go func() { + resp, err := watcher.Recv() + // Ensure there are not any unread messages + assert.Nil(t, resp, "%s: had unread messages", svc) + // Ensure watchers receive the cancelation when streams are closed by the server + assert.Equal(t, grpcstatus.Error(codes.Canceled, "Server shutting down."), err) + wg.Done() + }() + } + + // closing the aggregator will gracefully terminate streams of status events + server.aggregator.Close() + wg.Wait() + }) + } +} diff --git a/extension/healthcheckv2extension/internal/grpc/package_test.go b/extension/healthcheckv2extension/internal/grpc/package_test.go new file mode 100644 index 000000000000..0a083f58c642 --- /dev/null +++ b/extension/healthcheckv2extension/internal/grpc/package_test.go @@ -0,0 +1,14 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package grpc // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension/internal/grpc" + +import ( + "testing" + + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + goleak.VerifyTestMain(m) +} diff --git a/extension/healthcheckv2extension/internal/grpc/server.go b/extension/healthcheckv2extension/internal/grpc/server.go new file mode 100644 index 000000000000..2c69e5fb9e61 --- /dev/null +++ b/extension/healthcheckv2extension/internal/grpc/server.go @@ -0,0 +1,83 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package grpc // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension/internal/grpc" + +import ( + "context" + "errors" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componentstatus" + "google.golang.org/grpc" + healthpb "google.golang.org/grpc/health/grpc_health_v1" + + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension/internal/common" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status" +) + +type Server struct { + healthpb.UnimplementedHealthServer + grpcServer *grpc.Server + aggregator *status.Aggregator + config *Config + componentHealthConfig *common.ComponentHealthConfig + telemetry component.TelemetrySettings + doneCh chan struct{} +} + +var _ component.Component = (*Server)(nil) + +func NewServer( + config *Config, + componentHealthConfig *common.ComponentHealthConfig, + telemetry component.TelemetrySettings, + aggregator *status.Aggregator, +) *Server { + srv := &Server{ + config: config, + componentHealthConfig: componentHealthConfig, + telemetry: telemetry, + aggregator: aggregator, + doneCh: make(chan struct{}), + } + if srv.componentHealthConfig == nil { + srv.componentHealthConfig = &common.ComponentHealthConfig{} + } + return srv +} + +// Start implements the component.Component interface. +func (s *Server) Start(ctx context.Context, host component.Host) error { + var err error + s.grpcServer, err = s.config.ToServer(ctx, host, s.telemetry) + if err != nil { + return err + } + + healthpb.RegisterHealthServer(s.grpcServer, s) + ln, err := s.config.NetAddr.Listen(context.Background()) + if err != nil { + return err + } + + go func() { + defer close(s.doneCh) + + if err = s.grpcServer.Serve(ln); err != nil && !errors.Is(err, grpc.ErrServerStopped) { + componentstatus.ReportStatus(host, componentstatus.NewPermanentErrorEvent(err)) + } + }() + + return nil +} + +// Shutdown implements the component.Component interface. +func (s *Server) Shutdown(context.Context) error { + if s.grpcServer == nil { + return nil + } + s.grpcServer.GracefulStop() + <-s.doneCh + return nil +} diff --git a/extension/healthcheckv2extension/internal/http/handlers.go b/extension/healthcheckv2extension/internal/http/handlers.go new file mode 100644 index 000000000000..2ae041558038 --- /dev/null +++ b/extension/healthcheckv2extension/internal/http/handlers.go @@ -0,0 +1,44 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package http // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension/internal/http" + +import ( + "net/http" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status" +) + +func (s *Server) statusHandler() http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + pipeline := r.URL.Query().Get("pipeline") + verbose := r.URL.Query().Has("verbose") && r.URL.Query().Get("verbose") != "false" + st, ok := s.aggregator.AggregateStatus(status.Scope(pipeline), status.Verbosity(verbose)) + + if !ok { + w.WriteHeader(http.StatusNotFound) + return + } + + if err := s.responder.respond(st, w); err != nil { + s.telemetry.Logger.Warn(err.Error()) + } + }) +} + +func (s *Server) configHandler() http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + conf := s.colconf.Load() + + if conf == nil { + w.WriteHeader(http.StatusServiceUnavailable) + return + } + + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + if _, err := w.Write(conf.([]byte)); err != nil { + s.telemetry.Logger.Warn(err.Error()) + } + }) +} diff --git a/extension/healthcheckv2extension/internal/http/package_test.go b/extension/healthcheckv2extension/internal/http/package_test.go new file mode 100644 index 000000000000..9f1f2d2d2c7a --- /dev/null +++ b/extension/healthcheckv2extension/internal/http/package_test.go @@ -0,0 +1,14 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package http // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension/internal/http" + +import ( + "testing" + + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + goleak.VerifyTestMain(m) +} diff --git a/extension/healthcheckv2extension/internal/http/responders.go b/extension/healthcheckv2extension/internal/http/responders.go new file mode 100644 index 000000000000..5dfc3b2cfe09 --- /dev/null +++ b/extension/healthcheckv2extension/internal/http/responders.go @@ -0,0 +1,156 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package http // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension/internal/http" + +import ( + "encoding/json" + "fmt" + "net/http" + "time" + + "go.opentelemetry.io/collector/component/componentstatus" + + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension/internal/common" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status" +) + +var responseCodes = map[componentstatus.Status]int{ + componentstatus.StatusNone: http.StatusServiceUnavailable, + componentstatus.StatusStarting: http.StatusServiceUnavailable, + componentstatus.StatusOK: http.StatusOK, + componentstatus.StatusRecoverableError: http.StatusOK, + componentstatus.StatusPermanentError: http.StatusOK, + componentstatus.StatusFatalError: http.StatusInternalServerError, + componentstatus.StatusStopping: http.StatusServiceUnavailable, + componentstatus.StatusStopped: http.StatusServiceUnavailable, +} + +type serializationErr struct { + ErrorMessage string `json:"error_message"` +} + +type responder interface { + respond(*status.AggregateStatus, http.ResponseWriter) error +} + +type responderFunc func(*status.AggregateStatus, http.ResponseWriter) error + +func (f responderFunc) respond(st *status.AggregateStatus, w http.ResponseWriter) error { + return f(st, w) +} + +func respondWithJSON(code int, content any, w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(code) + + body, mErr := json.Marshal(content) + if mErr != nil { + body, _ = json.Marshal(&serializationErr{ErrorMessage: mErr.Error()}) + } + _, wErr := w.Write(body) + return wErr +} + +func defaultResponder(startTimestamp *time.Time) responderFunc { + return func(st *status.AggregateStatus, w http.ResponseWriter) error { + code := responseCodes[st.Status()] + sst := toSerializableStatus(st, &serializationOptions{ + includeStartTime: true, + startTimestamp: startTimestamp, + }) + return respondWithJSON(code, sst, w) + } +} + +func componentHealthResponder( + startTimestamp *time.Time, + config *common.ComponentHealthConfig, +) responderFunc { + healthyFunc := func(now *time.Time) func(status.Event) bool { + return func(ev status.Event) bool { + if ev.Status() == componentstatus.StatusPermanentError { + return !config.IncludePermanent + } + + if ev.Status() == componentstatus.StatusRecoverableError && config.IncludeRecoverable { + return now.Before(ev.Timestamp().Add(config.RecoveryDuration)) + } + + return ev.Status() != componentstatus.StatusFatalError + } + } + return func(st *status.AggregateStatus, w http.ResponseWriter) error { + now := time.Now() + sst := toSerializableStatus( + st, + &serializationOptions{ + includeStartTime: true, + startTimestamp: startTimestamp, + healthyFunc: healthyFunc(&now), + }, + ) + + code := responseCodes[st.Status()] + if !sst.Healthy { + code = http.StatusInternalServerError + } + + return respondWithJSON(code, sst, w) + } +} + +// Below are responders ported from the original healthcheck extension. We will +// keep them for backwards compatibility, but eventually deprecate and remove +// them. + +// legacyResponseCodes match the current response code mapping with the exception +// of FatalError, which maps to 503 instead of 500. +var legacyResponseCodes = map[componentstatus.Status]int{ + componentstatus.StatusNone: http.StatusServiceUnavailable, + componentstatus.StatusStarting: http.StatusServiceUnavailable, + componentstatus.StatusOK: http.StatusOK, + componentstatus.StatusRecoverableError: http.StatusOK, + componentstatus.StatusPermanentError: http.StatusOK, + componentstatus.StatusFatalError: http.StatusServiceUnavailable, + componentstatus.StatusStopping: http.StatusServiceUnavailable, + componentstatus.StatusStopped: http.StatusServiceUnavailable, +} + +func legacyDefaultResponder(startTimestamp *time.Time) responderFunc { + type healthCheckResponse struct { + StatusMsg string `json:"status"` + UpSince time.Time `json:"upSince"` + Uptime string `json:"uptime"` + } + + codeToMsgMap := map[int]string{ + http.StatusOK: "Server available", + http.StatusServiceUnavailable: "Server not available", + } + + return func(st *status.AggregateStatus, w http.ResponseWriter) error { + code := legacyResponseCodes[st.Status()] + resp := healthCheckResponse{ + StatusMsg: codeToMsgMap[code], + } + if code == http.StatusOK { + resp.UpSince = *startTimestamp + resp.Uptime = fmt.Sprintf("%v", time.Since(*startTimestamp)) + } + return respondWithJSON(code, resp, w) + } +} + +func legacyCustomResponder(config *ResponseBodyConfig) responderFunc { + codeToMsgMap := map[int][]byte{ + http.StatusOK: []byte(config.Healthy), + http.StatusServiceUnavailable: []byte(config.Unhealthy), + } + return func(st *status.AggregateStatus, w http.ResponseWriter) error { + code := legacyResponseCodes[st.Status()] + w.WriteHeader(code) + _, err := w.Write(codeToMsgMap[code]) + return err + } +} diff --git a/extension/healthcheckv2extension/internal/http/responders_test.go b/extension/healthcheckv2extension/internal/http/responders_test.go new file mode 100644 index 000000000000..c2bef14a1706 --- /dev/null +++ b/extension/healthcheckv2extension/internal/http/responders_test.go @@ -0,0 +1,37 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package http + +import ( + "errors" + "io" + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// var errUnserializable = errors.New("cannot marshal JSON") +var unserializableErrString = "cannot marshal unserializable" + +type unserializable struct{} + +func (*unserializable) MarshalJSON() ([]byte, error) { + return nil, errors.New(unserializableErrString) +} + +func TestRespondWithJSON(t *testing.T) { + content := &unserializable{} + w := httptest.NewRecorder() + require.NoError(t, respondWithJSON(http.StatusOK, content, w)) + resp := w.Result() + assert.Equal(t, http.StatusOK, resp.StatusCode) + assert.Equal(t, "application/json", resp.Header.Get("Content-Type")) + + body, err := io.ReadAll(resp.Body) + require.NoError(t, err) + assert.Contains(t, string(body), unserializableErrString) +} diff --git a/extension/healthcheckv2extension/internal/http/serialization.go b/extension/healthcheckv2extension/internal/http/serialization.go new file mode 100644 index 000000000000..a1a61c72ebfc --- /dev/null +++ b/extension/healthcheckv2extension/internal/http/serialization.go @@ -0,0 +1,95 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package http // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension/internal/http" + +import ( + "time" + + "go.opentelemetry.io/collector/component/componentstatus" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status" +) + +type healthyFunc func(status.Event) bool + +func (f healthyFunc) isHealthy(ev status.Event) bool { + if f != nil { + return f(ev) + } + return true +} + +type serializationOptions struct { + includeStartTime bool + startTimestamp *time.Time + healthyFunc healthyFunc +} + +type serializableStatus struct { + StartTimestamp *time.Time `json:"start_time,omitempty"` + *SerializableEvent + ComponentStatuses map[string]*serializableStatus `json:"components,omitempty"` +} + +// SerializableEvent is exported for json.Unmarshal +type SerializableEvent struct { + Healthy bool `json:"healthy"` + StatusString string `json:"status"` + Error string `json:"error,omitempty"` + Timestamp time.Time `json:"status_time"` +} + +var stringToStatusMap = map[string]componentstatus.Status{ + "StatusNone": componentstatus.StatusNone, + "StatusStarting": componentstatus.StatusStarting, + "StatusOK": componentstatus.StatusOK, + "StatusRecoverableError": componentstatus.StatusRecoverableError, + "StatusPermanentError": componentstatus.StatusPermanentError, + "StatusFatalError": componentstatus.StatusFatalError, + "StatusStopping": componentstatus.StatusStopping, + "StatusStopped": componentstatus.StatusStopped, +} + +func (ev *SerializableEvent) Status() componentstatus.Status { + if st, ok := stringToStatusMap[ev.StatusString]; ok { + return st + } + return componentstatus.StatusNone +} + +func toSerializableEvent(ev status.Event, isHealthy bool) *SerializableEvent { + se := &SerializableEvent{ + Healthy: isHealthy, + StatusString: ev.Status().String(), + Timestamp: ev.Timestamp(), + } + if ev.Err() != nil { + se.Error = ev.Err().Error() + } + return se +} + +func toSerializableStatus( + st *status.AggregateStatus, + opts *serializationOptions, +) *serializableStatus { + s := &serializableStatus{ + SerializableEvent: toSerializableEvent( + st.Event, + opts.healthyFunc.isHealthy(st.Event), + ), + ComponentStatuses: make(map[string]*serializableStatus), + } + + if opts.includeStartTime { + s.StartTimestamp = opts.startTimestamp + opts.includeStartTime = false + } + + for k, cs := range st.ComponentStatusMap { + s.ComponentStatuses[k] = toSerializableStatus(cs, opts) + } + + return s +} diff --git a/extension/healthcheckv2extension/internal/http/server.go b/extension/healthcheckv2extension/internal/http/server.go new file mode 100644 index 000000000000..0d14bdd6e966 --- /dev/null +++ b/extension/healthcheckv2extension/internal/http/server.go @@ -0,0 +1,128 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package http // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension/internal/http" + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "net/http" + "sync/atomic" + "time" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componentstatus" + "go.opentelemetry.io/collector/config/confighttp" + "go.opentelemetry.io/collector/confmap" + "go.opentelemetry.io/collector/extension/extensioncapabilities" + "go.uber.org/zap" + + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension/internal/common" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status" +) + +type Server struct { + telemetry component.TelemetrySettings + httpConfig confighttp.ServerConfig + httpServer *http.Server + mux *http.ServeMux + responder responder + colconf atomic.Value + aggregator *status.Aggregator + startTimestamp time.Time + doneCh chan struct{} +} + +var ( + _ component.Component = (*Server)(nil) + _ extensioncapabilities.ConfigWatcher = (*Server)(nil) +) + +func NewServer( + config *Config, + legacyConfig LegacyConfig, + componentHealthConfig *common.ComponentHealthConfig, + telemetry component.TelemetrySettings, + aggregator *status.Aggregator, +) *Server { + now := time.Now() + srv := &Server{ + telemetry: telemetry, + mux: http.NewServeMux(), + aggregator: aggregator, + doneCh: make(chan struct{}), + } + + if legacyConfig.UseV2 { + srv.httpConfig = config.ServerConfig + if componentHealthConfig != nil { + srv.responder = componentHealthResponder(&now, componentHealthConfig) + } else { + srv.responder = defaultResponder(&now) + } + if config.Status.Enabled { + srv.mux.Handle(config.Status.Path, srv.statusHandler()) + } + if config.Config.Enabled { + srv.mux.Handle(config.Config.Path, srv.configHandler()) + } + } else { + srv.httpConfig = legacyConfig.ServerConfig + if legacyConfig.ResponseBody != nil { + srv.responder = legacyCustomResponder(legacyConfig.ResponseBody) + } else { + srv.responder = legacyDefaultResponder(&now) + } + srv.mux.Handle(legacyConfig.Path, srv.statusHandler()) + } + + return srv +} + +// Start implements the component.Component interface. +func (s *Server) Start(ctx context.Context, host component.Host) error { + var err error + s.startTimestamp = time.Now() + + s.httpServer, err = s.httpConfig.ToServer(ctx, host, s.telemetry, s.mux) + if err != nil { + return err + } + + ln, err := s.httpConfig.ToListener(ctx) + if err != nil { + return fmt.Errorf("failed to bind to address %s: %w", s.httpConfig.Endpoint, err) + } + + go func() { + defer close(s.doneCh) + if err = s.httpServer.Serve(ln); !errors.Is(err, http.ErrServerClosed) && err != nil { + componentstatus.ReportStatus(host, componentstatus.NewPermanentErrorEvent(err)) + } + }() + + return nil +} + +// Shutdown implements the component.Component interface. +func (s *Server) Shutdown(context.Context) error { + if s.httpServer == nil { + return nil + } + s.httpServer.Close() + <-s.doneCh + return nil +} + +// NotifyConfig implements the extension.ConfigWatcher interface. +func (s *Server) NotifyConfig(_ context.Context, conf *confmap.Conf) error { + confBytes, err := json.Marshal(conf.ToStringMap()) + if err != nil { + s.telemetry.Logger.Warn("could not marshal config", zap.Error(err)) + return err + } + s.colconf.Store(confBytes) + return nil +} diff --git a/extension/healthcheckv2extension/internal/http/server_test.go b/extension/healthcheckv2extension/internal/http/server_test.go new file mode 100644 index 000000000000..2f390ef4ec65 --- /dev/null +++ b/extension/healthcheckv2extension/internal/http/server_test.go @@ -0,0 +1,3146 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package http + +import ( + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "os" + "path/filepath" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component/componentstatus" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/config/confighttp" + "go.opentelemetry.io/collector/confmap/confmaptest" + + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension/internal/common" + internalhelpers "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension/internal/testhelpers" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/testutil" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status/testhelpers" +) + +// These are used for the legacy test assertions +const ( + expectedBodyNotReady = "{\"status\":\"Server not available\",\"upSince\":" + expectedBodyReady = "{\"status\":\"Server available\",\"upSince\":" +) + +var ( + componentStatusOK = &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusOK, + } + componentStatusPipelineMetricsStarting = map[string]*componentStatusExpectation{ + "receiver:metrics/in": { + healthy: true, + status: componentstatus.StatusStarting, + }, + "processor:batch": { + healthy: true, + status: componentstatus.StatusStarting, + }, + "exporter:metrics/out": { + healthy: true, + status: componentstatus.StatusStarting, + }, + } + componentStatusPipelineMetricsOK = map[string]*componentStatusExpectation{ + "receiver:metrics/in": componentStatusOK, + "processor:batch": componentStatusOK, + "exporter:metrics/out": componentStatusOK, + } + componentStatusPipelineMetricsStopping = map[string]*componentStatusExpectation{ + "receiver:metrics/in": { + healthy: true, + status: componentstatus.StatusStopping, + }, + "processor:batch": { + healthy: true, + status: componentstatus.StatusStopping, + }, + "exporter:metrics/out": { + healthy: true, + status: componentstatus.StatusStopping, + }, + } + componentStatusPipelineMetricsStopped = map[string]*componentStatusExpectation{ + "receiver:metrics/in": { + healthy: true, + status: componentstatus.StatusStopped, + }, + "processor:batch": { + healthy: true, + status: componentstatus.StatusStopped, + }, + "exporter:metrics/out": { + healthy: true, + status: componentstatus.StatusStopped, + }, + } + componentStatusPipelineTracesStarting = map[string]*componentStatusExpectation{ + "receiver:traces/in": { + healthy: true, + status: componentstatus.StatusStarting, + }, + "processor:batch": { + healthy: true, + status: componentstatus.StatusStarting, + }, + "exporter:traces/out": { + healthy: true, + status: componentstatus.StatusStarting, + }, + } + componentStatusPipelineTracesOK = map[string]*componentStatusExpectation{ + "receiver:traces/in": componentStatusOK, + "processor:batch": componentStatusOK, + "exporter:traces/out": componentStatusOK, + } + componentStatusPipelineTracesStopping = map[string]*componentStatusExpectation{ + "receiver:traces/in": { + healthy: true, + status: componentstatus.StatusStopping, + }, + "processor:batch": { + healthy: true, + status: componentstatus.StatusStopping, + }, + "exporter:traces/out": { + healthy: true, + status: componentstatus.StatusStopping, + }, + } + componentStatusPipelineTracesStopped = map[string]*componentStatusExpectation{ + "receiver:traces/in": { + healthy: true, + status: componentstatus.StatusStopped, + }, + "processor:batch": { + healthy: true, + status: componentstatus.StatusStopped, + }, + "exporter:traces/out": { + healthy: true, + status: componentstatus.StatusStopped, + }, + } +) + +type componentStatusExpectation struct { + healthy bool + status componentstatus.Status + err error + nestedStatus map[string]*componentStatusExpectation +} + +type teststep struct { + step func() + queryParams string + eventually bool + expectedStatusCode int + expectedBody string + expectedComponentStatus *componentStatusExpectation +} + +func TestStatus(t *testing.T) { + var server *Server + traces := testhelpers.NewPipelineMetadata("traces") + metrics := testhelpers.NewPipelineMetadata("metrics") + + tests := []struct { + name string + config *Config + legacyConfig LegacyConfig + componentHealthConfig *common.ComponentHealthConfig + pipelines map[string]*testhelpers.PipelineMetadata + teststeps []teststep + }{ + { + name: "exclude recoverable and permanent errors", + legacyConfig: LegacyConfig{UseV2: true}, + config: &Config{ + ServerConfig: confighttp.ServerConfig{ + Endpoint: testutil.GetAvailableLocalAddress(t), + }, + Config: PathConfig{Enabled: false}, + Status: PathConfig{ + Enabled: true, + Path: "/status", + }, + }, + teststeps: []teststep{ + { + step: func() { + testhelpers.SeedAggregator(server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStarting, + ) + testhelpers.SeedAggregator(server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStarting, + ) + }, + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStarting, + }, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStarting, + }, + }, + { + queryParams: "pipeline=traces", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: componentStatusOK, + }, + { + queryParams: "pipeline=metrics", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStarting, + }, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + expectedStatusCode: http.StatusOK, + expectedComponentStatus: componentStatusOK, + }, + { + queryParams: "pipeline=metrics", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: componentStatusOK, + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewRecoverableErrorEvent(assert.AnError), + ) + }, + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusRecoverableError, + err: assert.AnError, + }, + }, + { + queryParams: "pipeline=metrics", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusRecoverableError, + err: assert.AnError, + }, + }, + { + queryParams: "pipeline=traces", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: componentStatusOK, + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewEvent(componentstatus.StatusOK), + ) + }, + expectedStatusCode: http.StatusOK, + expectedComponentStatus: componentStatusOK, + }, + { + queryParams: "pipeline=metrics", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: componentStatusOK, + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewPermanentErrorEvent(assert.AnError), + ) + }, + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusPermanentError, + err: assert.AnError, + }, + }, + { + queryParams: "pipeline=metrics", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusPermanentError, + err: assert.AnError, + }, + }, + { + queryParams: "pipeline=traces", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: componentStatusOK, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopping, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStopping, + ) + }, + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopping, + }, + }, + { + queryParams: "pipeline=traces", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopping, + }, + }, + { + queryParams: "pipeline=metrics", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopping, + }, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopped, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStopped, + ) + }, + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopped, + }, + }, + { + queryParams: "pipeline=traces", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopped, + }, + }, + { + queryParams: "pipeline=metrics", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopped, + }, + }, + }, + }, + { + name: "exclude recoverable and permanent errors - verbose", + legacyConfig: LegacyConfig{UseV2: true}, + config: &Config{ + ServerConfig: confighttp.ServerConfig{ + Endpoint: testutil.GetAvailableLocalAddress(t), + }, + Config: PathConfig{Enabled: false}, + Status: PathConfig{ + Enabled: true, + Path: "/status", + }, + }, + teststeps: []teststep{ + { + step: func() { + testhelpers.SeedAggregator(server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStarting, + ) + testhelpers.SeedAggregator(server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStarting, + ) + }, + queryParams: "verbose", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStarting, + nestedStatus: map[string]*componentStatusExpectation{ + "pipeline:traces": { + healthy: true, + status: componentstatus.StatusStarting, + nestedStatus: componentStatusPipelineTracesStarting, + }, + "pipeline:metrics": { + healthy: true, + status: componentstatus.StatusStarting, + nestedStatus: componentStatusPipelineMetricsStarting, + }, + }, + }, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + queryParams: "verbose", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStarting, + nestedStatus: map[string]*componentStatusExpectation{ + "pipeline:traces": { + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineTracesOK, + }, + "pipeline:metrics": { + healthy: true, + status: componentstatus.StatusStarting, + nestedStatus: componentStatusPipelineMetricsStarting, + }, + }, + }, + }, + { + queryParams: "pipeline=traces&verbose", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineTracesOK, + }, + }, + { + queryParams: "pipeline=metrics&verbose", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStarting, + nestedStatus: map[string]*componentStatusExpectation{ + "receiver:metrics/in": { + healthy: true, + status: componentstatus.StatusStarting, + }, + "processor:batch": { + healthy: true, + status: componentstatus.StatusStarting, + }, + "exporter:metrics/out": { + healthy: true, + status: componentstatus.StatusStarting, + }, + }, + }, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + queryParams: "verbose", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: map[string]*componentStatusExpectation{ + "pipeline:traces": { + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineTracesOK, + }, + "pipeline:metrics": { + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineMetricsOK, + }, + }, + }, + }, + { + queryParams: "pipeline=metrics&verbose", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineMetricsOK, + }, + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewRecoverableErrorEvent(assert.AnError), + ) + }, + queryParams: "verbose", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusRecoverableError, + err: assert.AnError, + nestedStatus: map[string]*componentStatusExpectation{ + "pipeline:traces": { + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineTracesOK, + }, + "pipeline:metrics": { + healthy: true, + status: componentstatus.StatusRecoverableError, + nestedStatus: map[string]*componentStatusExpectation{ + "receiver:metrics/in": { + healthy: true, + status: componentstatus.StatusOK, + }, + "processor:batch": { + healthy: true, + status: componentstatus.StatusOK, + }, + "exporter:metrics/out": { + healthy: true, + status: componentstatus.StatusRecoverableError, + err: assert.AnError, + }, + }, + }, + }, + }, + }, + { + queryParams: "pipeline=metrics&verbose", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusRecoverableError, + err: assert.AnError, + nestedStatus: map[string]*componentStatusExpectation{ + "receiver:metrics/in": { + healthy: true, + status: componentstatus.StatusOK, + }, + "processor:batch": { + healthy: true, + status: componentstatus.StatusOK, + }, + "exporter:metrics/out": { + healthy: true, + status: componentstatus.StatusRecoverableError, + err: assert.AnError, + }, + }, + }, + }, + { + queryParams: "pipeline=traces&verbose", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineTracesOK, + }, + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewEvent(componentstatus.StatusOK), + ) + }, + queryParams: "verbose", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: map[string]*componentStatusExpectation{ + "pipeline:traces": { + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineTracesOK, + }, + "pipeline:metrics": { + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineMetricsOK, + }, + }, + }, + }, + { + queryParams: "pipeline=metrics&verbose", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineMetricsOK, + }, + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewPermanentErrorEvent(assert.AnError), + ) + }, + queryParams: "verbose", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusPermanentError, + err: assert.AnError, + nestedStatus: map[string]*componentStatusExpectation{ + "pipeline:traces": { + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineTracesOK, + }, + "pipeline:metrics": { + healthy: true, + status: componentstatus.StatusPermanentError, + nestedStatus: map[string]*componentStatusExpectation{ + "receiver:metrics/in": { + healthy: true, + status: componentstatus.StatusOK, + }, + "processor:batch": { + healthy: true, + status: componentstatus.StatusOK, + }, + "exporter:metrics/out": { + healthy: true, + status: componentstatus.StatusPermanentError, + err: assert.AnError, + }, + }, + }, + }, + }, + }, + { + queryParams: "pipeline=metrics&verbose", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusPermanentError, + err: assert.AnError, + nestedStatus: map[string]*componentStatusExpectation{ + "receiver:metrics/in": { + healthy: true, + status: componentstatus.StatusOK, + }, + "processor:batch": { + healthy: true, + status: componentstatus.StatusOK, + }, + "exporter:metrics/out": { + healthy: true, + status: componentstatus.StatusPermanentError, + }, + }, + }, + }, + { + queryParams: "pipeline=traces&verbose", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineTracesOK, + }, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopping, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStopping, + ) + }, + queryParams: "verbose", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopping, + nestedStatus: map[string]*componentStatusExpectation{ + "pipeline:traces": { + healthy: true, + status: componentstatus.StatusStopping, + nestedStatus: componentStatusPipelineTracesStopping, + }, + "pipeline:metrics": { + healthy: true, + status: componentstatus.StatusStopping, + nestedStatus: componentStatusPipelineMetricsStopping, + }, + }, + }, + }, + { + queryParams: "pipeline=traces&verbose", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopping, + nestedStatus: componentStatusPipelineTracesStopping, + }, + }, + { + queryParams: "pipeline=metrics&verbose", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopping, + nestedStatus: componentStatusPipelineMetricsStopping, + }, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopped, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStopped, + ) + }, + queryParams: "verbose", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopped, + nestedStatus: map[string]*componentStatusExpectation{ + "pipeline:traces": { + healthy: true, + status: componentstatus.StatusStopped, + nestedStatus: componentStatusPipelineTracesStopped, + }, + "pipeline:metrics": { + healthy: true, + status: componentstatus.StatusStopped, + nestedStatus: componentStatusPipelineMetricsStopped, + }, + }, + }, + }, + { + queryParams: "pipeline=traces&verbose", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopped, + nestedStatus: componentStatusPipelineTracesStopped, + }, + }, + { + queryParams: "pipeline=metrics&verbose", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopped, + nestedStatus: componentStatusPipelineMetricsStopped, + }, + }, + }, + }, + { + name: "include recoverable and exclude permanent errors", + legacyConfig: LegacyConfig{UseV2: true}, + config: &Config{ + ServerConfig: confighttp.ServerConfig{ + Endpoint: testutil.GetAvailableLocalAddress(t), + }, + Config: PathConfig{Enabled: false}, + Status: PathConfig{ + Enabled: true, + Path: "/status", + }, + }, + componentHealthConfig: &common.ComponentHealthConfig{ + IncludePermanent: false, + IncludeRecoverable: true, + RecoveryDuration: 2 * time.Millisecond, + }, + teststeps: []teststep{ + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStarting, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStarting, + ) + }, + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStarting, + }, + }, + { + queryParams: "pipeline=traces", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStarting, + }, + }, + { + queryParams: "pipeline=metrics", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStarting, + }, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusOK, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + expectedStatusCode: http.StatusOK, + expectedComponentStatus: componentStatusOK, + }, + { + queryParams: "pipeline=traces", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: componentStatusOK, + }, + { + queryParams: "pipeline=metrics", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: componentStatusOK, + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewRecoverableErrorEvent(assert.AnError), + ) + }, + eventually: true, + expectedStatusCode: http.StatusInternalServerError, + expectedComponentStatus: &componentStatusExpectation{ + healthy: false, + status: componentstatus.StatusRecoverableError, + err: assert.AnError, + }, + }, + { + queryParams: "pipeline=metrics", + expectedStatusCode: http.StatusInternalServerError, + expectedComponentStatus: &componentStatusExpectation{ + healthy: false, + status: componentstatus.StatusRecoverableError, + err: assert.AnError, + }, + }, + { + queryParams: "pipeline=traces", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: componentStatusOK, + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewEvent(componentstatus.StatusOK), + ) + }, + expectedStatusCode: http.StatusOK, + expectedComponentStatus: componentStatusOK, + }, + { + queryParams: "pipeline=metrics", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: componentStatusOK, + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewPermanentErrorEvent(assert.AnError), + ) + }, + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusPermanentError, + err: assert.AnError, + }, + }, + { + queryParams: "pipeline=metrics", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusPermanentError, + err: assert.AnError, + }, + }, + { + queryParams: "pipeline=traces", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: componentStatusOK, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopping, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStopping, + ) + }, + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopping, + }, + }, + { + queryParams: "pipeline=traces", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopping, + }, + }, + { + queryParams: "pipeline=metrics", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopping, + }, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopped, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStopped, + ) + }, + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopped, + }, + }, + { + queryParams: "pipeline=traces", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopped, + }, + }, + { + queryParams: "pipeline=metrics", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopped, + }, + }, + }, + }, + { + name: "include recoverable and exclude permanent errors - verbose", + legacyConfig: LegacyConfig{UseV2: true}, + config: &Config{ + ServerConfig: confighttp.ServerConfig{ + Endpoint: testutil.GetAvailableLocalAddress(t), + }, + Config: PathConfig{Enabled: false}, + Status: PathConfig{ + Enabled: true, + Path: "/status", + }, + }, + componentHealthConfig: &common.ComponentHealthConfig{ + IncludePermanent: false, + IncludeRecoverable: true, + RecoveryDuration: 2 * time.Millisecond, + }, + teststeps: []teststep{ + { + step: func() { + testhelpers.SeedAggregator(server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStarting, + ) + testhelpers.SeedAggregator(server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStarting, + ) + }, + queryParams: "verbose", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStarting, + nestedStatus: map[string]*componentStatusExpectation{ + "pipeline:traces": { + healthy: true, + status: componentstatus.StatusStarting, + nestedStatus: componentStatusPipelineTracesStarting, + }, + "pipeline:metrics": { + healthy: true, + status: componentstatus.StatusStarting, + nestedStatus: componentStatusPipelineMetricsStarting, + }, + }, + }, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusOK, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + queryParams: "verbose", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: map[string]*componentStatusExpectation{ + "pipeline:traces": { + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineTracesOK, + }, + "pipeline:metrics": { + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineMetricsOK, + }, + }, + }, + }, + { + queryParams: "pipeline=metrics&verbose", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineMetricsOK, + }, + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewRecoverableErrorEvent(assert.AnError), + ) + }, + eventually: true, + queryParams: "verbose", + expectedStatusCode: http.StatusInternalServerError, + expectedComponentStatus: &componentStatusExpectation{ + healthy: false, + status: componentstatus.StatusRecoverableError, + err: assert.AnError, + nestedStatus: map[string]*componentStatusExpectation{ + "pipeline:traces": { + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineTracesOK, + }, + "pipeline:metrics": { + healthy: false, + status: componentstatus.StatusRecoverableError, + nestedStatus: map[string]*componentStatusExpectation{ + "receiver:metrics/in": { + healthy: true, + status: componentstatus.StatusOK, + }, + "processor:batch": { + healthy: true, + status: componentstatus.StatusOK, + }, + "exporter:metrics/out": { + healthy: false, + status: componentstatus.StatusRecoverableError, + err: assert.AnError, + }, + }, + }, + }, + }, + }, + { + queryParams: "pipeline=metrics&verbose", + expectedStatusCode: http.StatusInternalServerError, + expectedComponentStatus: &componentStatusExpectation{ + healthy: false, + status: componentstatus.StatusRecoverableError, + err: assert.AnError, + nestedStatus: map[string]*componentStatusExpectation{ + "receiver:metrics/in": { + healthy: true, + status: componentstatus.StatusOK, + }, + "processor:batch": { + healthy: true, + status: componentstatus.StatusOK, + }, + "exporter:metrics/out": { + healthy: false, + status: componentstatus.StatusRecoverableError, + err: assert.AnError, + }, + }, + }, + }, + { + queryParams: "pipeline=traces&verbose", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineTracesOK, + }, + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewEvent(componentstatus.StatusOK), + ) + }, + queryParams: "verbose", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: map[string]*componentStatusExpectation{ + "pipeline:traces": { + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineTracesOK, + }, + "pipeline:metrics": { + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineMetricsOK, + }, + }, + }, + }, + { + queryParams: "pipeline=metrics&verbose", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineMetricsOK, + }, + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewPermanentErrorEvent(assert.AnError), + ) + }, + queryParams: "verbose", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusPermanentError, + err: assert.AnError, + nestedStatus: map[string]*componentStatusExpectation{ + "pipeline:traces": { + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineTracesOK, + }, + "pipeline:metrics": { + healthy: true, + status: componentstatus.StatusPermanentError, + nestedStatus: map[string]*componentStatusExpectation{ + "receiver:metrics/in": { + healthy: true, + status: componentstatus.StatusOK, + }, + "processor:batch": { + healthy: true, + status: componentstatus.StatusOK, + }, + "exporter:metrics/out": { + healthy: true, + status: componentstatus.StatusPermanentError, + err: assert.AnError, + }, + }, + }, + }, + }, + }, + { + queryParams: "pipeline=metrics&verbose", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusPermanentError, + err: assert.AnError, + nestedStatus: map[string]*componentStatusExpectation{ + "receiver:metrics/in": { + healthy: true, + status: componentstatus.StatusOK, + }, + "processor:batch": { + healthy: true, + status: componentstatus.StatusOK, + }, + "exporter:metrics/out": { + healthy: true, + status: componentstatus.StatusPermanentError, + }, + }, + }, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopping, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStopping, + ) + }, + queryParams: "verbose", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopping, + nestedStatus: map[string]*componentStatusExpectation{ + "pipeline:traces": { + healthy: true, + status: componentstatus.StatusStopping, + nestedStatus: componentStatusPipelineTracesStopping, + }, + "pipeline:metrics": { + healthy: true, + status: componentstatus.StatusStopping, + nestedStatus: componentStatusPipelineMetricsStopping, + }, + }, + }, + }, + { + queryParams: "pipeline=traces&verbose", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopping, + nestedStatus: componentStatusPipelineTracesStopping, + }, + }, + { + queryParams: "pipeline=metrics&verbose", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopping, + nestedStatus: componentStatusPipelineMetricsStopping, + }, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopped, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStopped, + ) + }, + queryParams: "verbose", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopped, + nestedStatus: map[string]*componentStatusExpectation{ + "pipeline:traces": { + healthy: true, + status: componentstatus.StatusStopped, + nestedStatus: componentStatusPipelineTracesStopped, + }, + "pipeline:metrics": { + healthy: true, + status: componentstatus.StatusStopped, + nestedStatus: componentStatusPipelineMetricsStopped, + }, + }, + }, + }, + { + queryParams: "pipeline=traces&verbose", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopped, + nestedStatus: componentStatusPipelineTracesStopped, + }, + }, + { + queryParams: "pipeline=metrics&verbose", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopped, + nestedStatus: componentStatusPipelineMetricsStopped, + }, + }, + }, + }, + { + name: "include permanent and exclude recoverable errors", + legacyConfig: LegacyConfig{UseV2: true}, + config: &Config{ + ServerConfig: confighttp.ServerConfig{ + Endpoint: testutil.GetAvailableLocalAddress(t), + }, + Config: PathConfig{Enabled: false}, + Status: PathConfig{ + Enabled: true, + Path: "/status", + }, + }, + componentHealthConfig: &common.ComponentHealthConfig{ + IncludePermanent: true, + }, + teststeps: []teststep{ + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStarting, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStarting, + ) + }, + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStarting, + }, + }, + { + queryParams: "pipeline=traces", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStarting, + }, + }, + { + queryParams: "pipeline=metrics", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStarting, + }, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusOK, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + expectedStatusCode: http.StatusOK, + expectedComponentStatus: componentStatusOK, + }, + { + queryParams: "pipeline=traces", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: componentStatusOK, + }, + { + queryParams: "pipeline=metrics", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: componentStatusOK, + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewRecoverableErrorEvent(assert.AnError), + ) + }, + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusRecoverableError, + err: assert.AnError, + }, + }, + { + queryParams: "pipeline=metrics", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusRecoverableError, + err: assert.AnError, + }, + }, + { + queryParams: "pipeline=traces", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: componentStatusOK, + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewEvent(componentstatus.StatusOK), + ) + }, + expectedStatusCode: http.StatusOK, + expectedComponentStatus: componentStatusOK, + }, + { + queryParams: "pipeline=metrics", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: componentStatusOK, + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewPermanentErrorEvent(assert.AnError), + ) + }, + expectedStatusCode: http.StatusInternalServerError, + expectedComponentStatus: &componentStatusExpectation{ + healthy: false, + status: componentstatus.StatusPermanentError, + err: assert.AnError, + }, + }, + { + queryParams: "pipeline=metrics", + expectedStatusCode: http.StatusInternalServerError, + expectedComponentStatus: &componentStatusExpectation{ + healthy: false, + status: componentstatus.StatusPermanentError, + err: assert.AnError, + }, + }, + { + queryParams: "pipeline=traces", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: componentStatusOK, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopping, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStopping, + ) + }, + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopping, + }, + }, + { + queryParams: "pipeline=traces", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopping, + }, + }, + { + queryParams: "pipeline=metrics", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopping, + }, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopped, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStopped, + ) + }, + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopped, + }, + }, + { + queryParams: "pipeline=traces", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopped, + }, + }, + { + queryParams: "pipeline=metrics", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopped, + }, + }, + }, + }, + { + name: "include permanent and exclude recoverable errors - verbose", + legacyConfig: LegacyConfig{UseV2: true}, + config: &Config{ + ServerConfig: confighttp.ServerConfig{ + Endpoint: testutil.GetAvailableLocalAddress(t), + }, + Config: PathConfig{Enabled: false}, + Status: PathConfig{ + Enabled: true, + Path: "/status", + }, + }, + componentHealthConfig: &common.ComponentHealthConfig{ + IncludePermanent: true, + }, + teststeps: []teststep{ + { + step: func() { + testhelpers.SeedAggregator(server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStarting, + ) + testhelpers.SeedAggregator(server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStarting, + ) + }, + queryParams: "verbose", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStarting, + nestedStatus: map[string]*componentStatusExpectation{ + "pipeline:traces": { + healthy: true, + status: componentstatus.StatusStarting, + nestedStatus: componentStatusPipelineTracesStarting, + }, + "pipeline:metrics": { + healthy: true, + status: componentstatus.StatusStarting, + nestedStatus: componentStatusPipelineMetricsStarting, + }, + }, + }, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusOK, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + queryParams: "verbose", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: map[string]*componentStatusExpectation{ + "pipeline:traces": { + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineTracesOK, + }, + "pipeline:metrics": { + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineMetricsOK, + }, + }, + }, + }, + { + queryParams: "pipeline=metrics&verbose", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineMetricsOK, + }, + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewRecoverableErrorEvent(assert.AnError), + ) + }, + eventually: true, + queryParams: "verbose", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusRecoverableError, + err: assert.AnError, + nestedStatus: map[string]*componentStatusExpectation{ + "pipeline:traces": { + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineTracesOK, + }, + "pipeline:metrics": { + healthy: true, + status: componentstatus.StatusRecoverableError, + nestedStatus: map[string]*componentStatusExpectation{ + "receiver:metrics/in": { + healthy: true, + status: componentstatus.StatusOK, + }, + "processor:batch": { + healthy: true, + status: componentstatus.StatusOK, + }, + "exporter:metrics/out": { + healthy: true, + status: componentstatus.StatusRecoverableError, + err: assert.AnError, + }, + }, + }, + }, + }, + }, + { + queryParams: "pipeline=metrics&verbose", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusRecoverableError, + err: assert.AnError, + nestedStatus: map[string]*componentStatusExpectation{ + "receiver:metrics/in": { + healthy: true, + status: componentstatus.StatusOK, + }, + "processor:batch": { + healthy: true, + status: componentstatus.StatusOK, + }, + "exporter:metrics/out": { + healthy: true, + status: componentstatus.StatusRecoverableError, + err: assert.AnError, + }, + }, + }, + }, + { + queryParams: "pipeline=traces&verbose", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineTracesOK, + }, + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewEvent(componentstatus.StatusOK), + ) + }, + queryParams: "verbose", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: map[string]*componentStatusExpectation{ + "pipeline:traces": { + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineTracesOK, + }, + "pipeline:metrics": { + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineMetricsOK, + }, + }, + }, + }, + { + queryParams: "pipeline=metrics&verbose", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineMetricsOK, + }, + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewPermanentErrorEvent(assert.AnError), + ) + }, + queryParams: "verbose", + expectedStatusCode: http.StatusInternalServerError, + expectedComponentStatus: &componentStatusExpectation{ + healthy: false, + status: componentstatus.StatusPermanentError, + err: assert.AnError, + nestedStatus: map[string]*componentStatusExpectation{ + "pipeline:traces": { + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineTracesOK, + }, + "pipeline:metrics": { + healthy: false, + status: componentstatus.StatusPermanentError, + nestedStatus: map[string]*componentStatusExpectation{ + "receiver:metrics/in": { + healthy: true, + status: componentstatus.StatusOK, + }, + "processor:batch": { + healthy: true, + status: componentstatus.StatusOK, + }, + "exporter:metrics/out": { + healthy: false, + status: componentstatus.StatusPermanentError, + err: assert.AnError, + }, + }, + }, + }, + }, + }, + { + queryParams: "pipeline=metrics&verbose", + expectedStatusCode: http.StatusInternalServerError, + expectedComponentStatus: &componentStatusExpectation{ + healthy: false, + status: componentstatus.StatusPermanentError, + err: assert.AnError, + nestedStatus: map[string]*componentStatusExpectation{ + "receiver:metrics/in": { + healthy: true, + status: componentstatus.StatusOK, + }, + "processor:batch": { + healthy: true, + status: componentstatus.StatusOK, + }, + "exporter:metrics/out": { + healthy: false, + status: componentstatus.StatusPermanentError, + }, + }, + }, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopping, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStopping, + ) + }, + queryParams: "verbose", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopping, + nestedStatus: map[string]*componentStatusExpectation{ + "pipeline:traces": { + healthy: true, + status: componentstatus.StatusStopping, + nestedStatus: componentStatusPipelineTracesStopping, + }, + "pipeline:metrics": { + healthy: true, + status: componentstatus.StatusStopping, + nestedStatus: componentStatusPipelineMetricsStopping, + }, + }, + }, + }, + { + queryParams: "pipeline=traces&verbose", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopping, + nestedStatus: componentStatusPipelineTracesStopping, + }, + }, + { + queryParams: "pipeline=metrics&verbose", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopping, + nestedStatus: componentStatusPipelineMetricsStopping, + }, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopped, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStopped, + ) + }, + queryParams: "verbose", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopped, + nestedStatus: map[string]*componentStatusExpectation{ + "pipeline:traces": { + healthy: true, + status: componentstatus.StatusStopped, + nestedStatus: componentStatusPipelineTracesStopped, + }, + "pipeline:metrics": { + healthy: true, + status: componentstatus.StatusStopped, + nestedStatus: componentStatusPipelineMetricsStopped, + }, + }, + }, + }, + { + queryParams: "pipeline=traces&verbose", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopped, + nestedStatus: componentStatusPipelineTracesStopped, + }, + }, + { + queryParams: "pipeline=metrics&verbose", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopped, + nestedStatus: componentStatusPipelineMetricsStopped, + }, + }, + }, + }, + { + name: "include permanent and recoverable errors", + legacyConfig: LegacyConfig{UseV2: true}, + config: &Config{ + ServerConfig: confighttp.ServerConfig{ + Endpoint: testutil.GetAvailableLocalAddress(t), + }, + Config: PathConfig{Enabled: false}, + Status: PathConfig{ + Enabled: true, + Path: "/status", + }, + }, + componentHealthConfig: &common.ComponentHealthConfig{ + IncludePermanent: true, + IncludeRecoverable: true, + RecoveryDuration: 2 * time.Millisecond, + }, + teststeps: []teststep{ + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStarting, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStarting, + ) + }, + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStarting, + }, + }, + { + queryParams: "pipeline=traces", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStarting, + }, + }, + { + queryParams: "pipeline=metrics", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStarting, + }, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusOK, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + expectedStatusCode: http.StatusOK, + expectedComponentStatus: componentStatusOK, + }, + { + queryParams: "pipeline=traces", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: componentStatusOK, + }, + { + queryParams: "pipeline=metrics", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: componentStatusOK, + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewRecoverableErrorEvent(assert.AnError), + ) + }, + eventually: true, + expectedStatusCode: http.StatusInternalServerError, + expectedComponentStatus: &componentStatusExpectation{ + healthy: false, + status: componentstatus.StatusRecoverableError, + err: assert.AnError, + }, + }, + { + queryParams: "pipeline=metrics", + expectedStatusCode: http.StatusInternalServerError, + expectedComponentStatus: &componentStatusExpectation{ + healthy: false, + status: componentstatus.StatusRecoverableError, + err: assert.AnError, + }, + }, + { + queryParams: "pipeline=traces", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: componentStatusOK, + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewEvent(componentstatus.StatusOK), + ) + }, + expectedStatusCode: http.StatusOK, + expectedComponentStatus: componentStatusOK, + }, + { + queryParams: "pipeline=metrics", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: componentStatusOK, + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewPermanentErrorEvent(assert.AnError), + ) + }, + expectedStatusCode: http.StatusInternalServerError, + expectedComponentStatus: &componentStatusExpectation{ + healthy: false, + status: componentstatus.StatusPermanentError, + err: assert.AnError, + }, + }, + { + queryParams: "pipeline=metrics", + expectedStatusCode: http.StatusInternalServerError, + expectedComponentStatus: &componentStatusExpectation{ + healthy: false, + status: componentstatus.StatusPermanentError, + err: assert.AnError, + }, + }, + { + queryParams: "pipeline=traces", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: componentStatusOK, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopping, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStopping, + ) + }, + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopping, + }, + }, + { + queryParams: "pipeline=traces", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopping, + }, + }, + { + queryParams: "pipeline=metrics", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopping, + }, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopped, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStopped, + ) + }, + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopped, + }, + }, + { + queryParams: "pipeline=traces", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopped, + }, + }, + { + queryParams: "pipeline=metrics", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopped, + }, + }, + }, + }, + { + name: "include permanent and recoverable errors - verbose", + legacyConfig: LegacyConfig{UseV2: true}, + config: &Config{ + ServerConfig: confighttp.ServerConfig{ + Endpoint: testutil.GetAvailableLocalAddress(t), + }, + Config: PathConfig{Enabled: false}, + Status: PathConfig{ + Enabled: true, + Path: "/status", + }, + }, + componentHealthConfig: &common.ComponentHealthConfig{ + IncludePermanent: true, + IncludeRecoverable: true, + RecoveryDuration: 2 * time.Millisecond, + }, + teststeps: []teststep{ + { + step: func() { + testhelpers.SeedAggregator(server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStarting, + ) + testhelpers.SeedAggregator(server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStarting, + ) + }, + queryParams: "verbose", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStarting, + nestedStatus: map[string]*componentStatusExpectation{ + "pipeline:traces": { + healthy: true, + status: componentstatus.StatusStarting, + nestedStatus: componentStatusPipelineTracesStarting, + }, + "pipeline:metrics": { + healthy: true, + status: componentstatus.StatusStarting, + nestedStatus: componentStatusPipelineMetricsStarting, + }, + }, + }, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusOK, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + queryParams: "verbose", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: map[string]*componentStatusExpectation{ + "pipeline:traces": { + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineTracesOK, + }, + "pipeline:metrics": { + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineMetricsOK, + }, + }, + }, + }, + { + queryParams: "pipeline=metrics&verbose", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineMetricsOK, + }, + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewRecoverableErrorEvent(assert.AnError), + ) + }, + eventually: true, + queryParams: "verbose", + expectedStatusCode: http.StatusInternalServerError, + expectedComponentStatus: &componentStatusExpectation{ + healthy: false, + status: componentstatus.StatusRecoverableError, + err: assert.AnError, + nestedStatus: map[string]*componentStatusExpectation{ + "pipeline:traces": { + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineTracesOK, + }, + "pipeline:metrics": { + healthy: false, + status: componentstatus.StatusRecoverableError, + nestedStatus: map[string]*componentStatusExpectation{ + "receiver:metrics/in": { + healthy: true, + status: componentstatus.StatusOK, + }, + "processor:batch": { + healthy: true, + status: componentstatus.StatusOK, + }, + "exporter:metrics/out": { + healthy: false, + status: componentstatus.StatusRecoverableError, + err: assert.AnError, + }, + }, + }, + }, + }, + }, + { + queryParams: "pipeline=metrics&verbose", + expectedStatusCode: http.StatusInternalServerError, + expectedComponentStatus: &componentStatusExpectation{ + healthy: false, + status: componentstatus.StatusRecoverableError, + err: assert.AnError, + nestedStatus: map[string]*componentStatusExpectation{ + "receiver:metrics/in": { + healthy: true, + status: componentstatus.StatusOK, + }, + "processor:batch": { + healthy: true, + status: componentstatus.StatusOK, + }, + "exporter:metrics/out": { + healthy: false, + status: componentstatus.StatusRecoverableError, + err: assert.AnError, + }, + }, + }, + }, + { + queryParams: "pipeline=traces&verbose", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineTracesOK, + }, + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewEvent(componentstatus.StatusOK), + ) + }, + queryParams: "verbose", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: map[string]*componentStatusExpectation{ + "pipeline:traces": { + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineTracesOK, + }, + "pipeline:metrics": { + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineMetricsOK, + }, + }, + }, + }, + { + queryParams: "pipeline=metrics&verbose", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineMetricsOK, + }, + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewPermanentErrorEvent(assert.AnError), + ) + }, + queryParams: "verbose", + expectedStatusCode: http.StatusInternalServerError, + expectedComponentStatus: &componentStatusExpectation{ + healthy: false, + status: componentstatus.StatusPermanentError, + err: assert.AnError, + nestedStatus: map[string]*componentStatusExpectation{ + "pipeline:traces": { + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineTracesOK, + }, + "pipeline:metrics": { + healthy: false, + status: componentstatus.StatusPermanentError, + nestedStatus: map[string]*componentStatusExpectation{ + "receiver:metrics/in": { + healthy: true, + status: componentstatus.StatusOK, + }, + "processor:batch": { + healthy: true, + status: componentstatus.StatusOK, + }, + "exporter:metrics/out": { + healthy: false, + status: componentstatus.StatusPermanentError, + err: assert.AnError, + }, + }, + }, + }, + }, + }, + { + queryParams: "pipeline=metrics&verbose", + expectedStatusCode: http.StatusInternalServerError, + expectedComponentStatus: &componentStatusExpectation{ + healthy: false, + status: componentstatus.StatusPermanentError, + err: assert.AnError, + nestedStatus: map[string]*componentStatusExpectation{ + "receiver:metrics/in": { + healthy: true, + status: componentstatus.StatusOK, + }, + "processor:batch": { + healthy: true, + status: componentstatus.StatusOK, + }, + "exporter:metrics/out": { + healthy: false, + status: componentstatus.StatusPermanentError, + }, + }, + }, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopping, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStopping, + ) + }, + queryParams: "verbose", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopping, + nestedStatus: map[string]*componentStatusExpectation{ + "pipeline:traces": { + healthy: true, + status: componentstatus.StatusStopping, + nestedStatus: componentStatusPipelineTracesStopping, + }, + "pipeline:metrics": { + healthy: true, + status: componentstatus.StatusStopping, + nestedStatus: componentStatusPipelineMetricsStopping, + }, + }, + }, + }, + { + queryParams: "pipeline=traces&verbose", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopping, + nestedStatus: componentStatusPipelineTracesStopping, + }, + }, + { + queryParams: "pipeline=metrics&verbose", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopping, + nestedStatus: componentStatusPipelineMetricsStopping, + }, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopped, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStopped, + ) + }, + queryParams: "verbose", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopped, + nestedStatus: map[string]*componentStatusExpectation{ + "pipeline:traces": { + healthy: true, + status: componentstatus.StatusStopped, + nestedStatus: componentStatusPipelineTracesStopped, + }, + "pipeline:metrics": { + healthy: true, + status: componentstatus.StatusStopped, + nestedStatus: componentStatusPipelineMetricsStopped, + }, + }, + }, + }, + { + queryParams: "pipeline=traces&verbose", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopped, + nestedStatus: componentStatusPipelineTracesStopped, + }, + }, + { + queryParams: "pipeline=metrics&verbose", + expectedStatusCode: http.StatusServiceUnavailable, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusStopped, + nestedStatus: componentStatusPipelineMetricsStopped, + }, + }, + }, + }, + { + name: "pipeline non-existent", + legacyConfig: LegacyConfig{UseV2: true}, + config: &Config{ + ServerConfig: confighttp.ServerConfig{ + Endpoint: testutil.GetAvailableLocalAddress(t), + }, + Config: PathConfig{Enabled: false}, + Status: PathConfig{ + Enabled: true, + Path: "/status", + }, + }, + pipelines: testhelpers.NewPipelines("traces"), + teststeps: []teststep{ + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + queryParams: "pipeline=nonexistent", + expectedStatusCode: http.StatusNotFound, + }, + }, + }, + { + name: "verbose explicitly false", + legacyConfig: LegacyConfig{UseV2: true}, + config: &Config{ + ServerConfig: confighttp.ServerConfig{ + Endpoint: testutil.GetAvailableLocalAddress(t), + }, + Config: PathConfig{Enabled: false}, + Status: PathConfig{ + Enabled: true, + Path: "/status", + }, + }, + teststeps: []teststep{ + { + step: func() { + testhelpers.SeedAggregator(server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusOK, + ) + testhelpers.SeedAggregator(server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + queryParams: "verbose=false", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusOK, + }, + }, + }, + }, + { + name: "verbose explicitly true", + legacyConfig: LegacyConfig{UseV2: true}, + config: &Config{ + ServerConfig: confighttp.ServerConfig{ + Endpoint: testutil.GetAvailableLocalAddress(t), + }, + Config: PathConfig{Enabled: false}, + Status: PathConfig{ + Enabled: true, + Path: "/status", + }, + }, + teststeps: []teststep{ + { + step: func() { + testhelpers.SeedAggregator(server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusOK, + ) + testhelpers.SeedAggregator(server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + queryParams: "verbose=true", + expectedStatusCode: http.StatusOK, + expectedComponentStatus: &componentStatusExpectation{ + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: map[string]*componentStatusExpectation{ + "pipeline:traces": { + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineTracesOK, + }, + "pipeline:metrics": { + healthy: true, + status: componentstatus.StatusOK, + nestedStatus: componentStatusPipelineMetricsOK, + }, + }, + }, + }, + }, + }, + { + name: "status disabled", + legacyConfig: LegacyConfig{UseV2: true}, + config: &Config{ + ServerConfig: confighttp.ServerConfig{ + Endpoint: testutil.GetAvailableLocalAddress(t), + }, + Config: PathConfig{Enabled: false}, + Status: PathConfig{ + Enabled: false, + }, + }, + teststeps: []teststep{ + { + expectedStatusCode: http.StatusNotFound, + }, + }, + }, + { + name: "legacy - default response", + legacyConfig: LegacyConfig{ + ServerConfig: confighttp.ServerConfig{ + Endpoint: testutil.GetAvailableLocalAddress(t), + }, + Path: "/status", + }, + teststeps: []teststep{ + { + step: func() { + testhelpers.SeedAggregator(server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStarting, + ) + testhelpers.SeedAggregator(server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStarting, + ) + }, + expectedStatusCode: http.StatusServiceUnavailable, + expectedBody: expectedBodyNotReady, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + expectedStatusCode: http.StatusServiceUnavailable, + expectedBody: expectedBodyNotReady, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + expectedStatusCode: http.StatusOK, + expectedBody: expectedBodyReady, + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewRecoverableErrorEvent(assert.AnError), + ) + }, + expectedStatusCode: http.StatusOK, + expectedBody: expectedBodyReady, + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewEvent(componentstatus.StatusOK), + ) + }, + expectedStatusCode: http.StatusOK, + expectedBody: expectedBodyReady, + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewPermanentErrorEvent(assert.AnError), + ) + }, + expectedStatusCode: http.StatusOK, + expectedBody: expectedBodyReady, + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewFatalErrorEvent(assert.AnError), + ) + }, + expectedStatusCode: http.StatusServiceUnavailable, + expectedBody: expectedBodyNotReady, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopping, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStopping, + ) + }, + expectedStatusCode: http.StatusServiceUnavailable, + expectedBody: expectedBodyNotReady, + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopped, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStopped, + ) + }, + expectedStatusCode: http.StatusServiceUnavailable, + expectedBody: expectedBodyNotReady, + }, + }, + }, + { + name: "legacy - custom response", + legacyConfig: LegacyConfig{ + ServerConfig: confighttp.ServerConfig{ + Endpoint: testutil.GetAvailableLocalAddress(t), + }, + Path: "/status", + ResponseBody: &ResponseBodyConfig{Healthy: "ALL OK", Unhealthy: "NOT OK"}, + }, + teststeps: []teststep{ + { + step: func() { + testhelpers.SeedAggregator(server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStarting, + ) + testhelpers.SeedAggregator(server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStarting, + ) + }, + expectedStatusCode: http.StatusServiceUnavailable, + expectedBody: "NOT OK", + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + expectedStatusCode: http.StatusServiceUnavailable, + expectedBody: "NOT OK", + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusOK, + ) + }, + expectedStatusCode: http.StatusOK, + expectedBody: "ALL OK", + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewRecoverableErrorEvent(assert.AnError), + ) + }, + expectedStatusCode: http.StatusOK, + expectedBody: "ALL OK", + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewEvent(componentstatus.StatusOK), + ) + }, + expectedStatusCode: http.StatusOK, + expectedBody: "ALL OK", + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewPermanentErrorEvent(assert.AnError), + ) + }, + expectedStatusCode: http.StatusOK, + expectedBody: "ALL OK", + }, + { + step: func() { + server.aggregator.RecordStatus( + metrics.ExporterID, + componentstatus.NewFatalErrorEvent(assert.AnError), + ) + }, + expectedStatusCode: http.StatusServiceUnavailable, + expectedBody: "NOT OK", + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopping, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStopping, + ) + }, + expectedStatusCode: http.StatusServiceUnavailable, + expectedBody: "NOT OK", + }, + { + step: func() { + testhelpers.SeedAggregator( + server.aggregator, + traces.InstanceIDs(), + componentstatus.StatusStopped, + ) + testhelpers.SeedAggregator( + server.aggregator, + metrics.InstanceIDs(), + componentstatus.StatusStopped, + ) + }, + expectedStatusCode: http.StatusServiceUnavailable, + expectedBody: "NOT OK", + }, + }, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + server = NewServer( + tc.config, + tc.legacyConfig, + tc.componentHealthConfig, + componenttest.NewNopTelemetrySettings(), + status.NewAggregator(internalhelpers.ErrPriority(tc.componentHealthConfig)), + ) + + require.NoError(t, server.Start(context.Background(), componenttest.NewNopHost())) + defer func() { require.NoError(t, server.Shutdown(context.Background())) }() + + var url string + if tc.legacyConfig.UseV2 { + url = fmt.Sprintf("http://%s%s", tc.config.Endpoint, tc.config.Status.Path) + } else { + url = fmt.Sprintf("http://%s%s", tc.legacyConfig.Endpoint, tc.legacyConfig.Path) + } + + client := &http.Client{} + + for _, ts := range tc.teststeps { + if ts.step != nil { + ts.step() + } + + stepURL := url + if ts.queryParams != "" { + stepURL = fmt.Sprintf("%s?%s", stepURL, ts.queryParams) + } + + var err error + var resp *http.Response + + if ts.eventually { + assert.Eventually(t, func() bool { + resp, err = client.Get(stepURL) + require.NoError(t, err) + return ts.expectedStatusCode == resp.StatusCode + }, time.Second, 10*time.Millisecond) + } else { + resp, err = client.Get(stepURL) + require.NoError(t, err) + assert.Equal(t, ts.expectedStatusCode, resp.StatusCode) + } + + body, err := io.ReadAll(resp.Body) + require.NoError(t, err) + + assert.Contains(t, string(body), ts.expectedBody) + + if ts.expectedComponentStatus != nil { + st := &serializableStatus{} + require.NoError(t, json.Unmarshal(body, st)) + if strings.Contains(ts.queryParams, "verbose") && !strings.Contains(ts.queryParams, "verbose=false") { + assertStatusDetailed(t, ts.expectedComponentStatus, st) + continue + } + assertStatusSimple(t, ts.expectedComponentStatus, st) + } + } + }) + } +} + +func assertStatusDetailed( + t *testing.T, + expected *componentStatusExpectation, + actual *serializableStatus, +) { + assert.Equal(t, expected.healthy, actual.Healthy) + assert.Equal(t, expected.status, actual.Status(), + "want: %s, got: %s", expected.status, actual.Status()) + if expected.err != nil { + assert.Equal(t, expected.err.Error(), actual.Error) + } + assertNestedStatus(t, expected.nestedStatus, actual.ComponentStatuses) +} + +func assertNestedStatus( + t *testing.T, + expected map[string]*componentStatusExpectation, + actual map[string]*serializableStatus, +) { + for k, expectation := range expected { + st, ok := actual[k] + require.True(t, ok, "status for key: %s not found", k) + assert.Equal(t, expectation.healthy, st.Healthy) + assert.Equal(t, expectation.status, st.Status(), + "want: %s, got: %s", expectation.status, st.Status()) + if expectation.err != nil { + assert.Equal(t, expectation.err.Error(), st.Error) + } + assertNestedStatus(t, expectation.nestedStatus, st.ComponentStatuses) + } +} + +func assertStatusSimple( + t *testing.T, + expected *componentStatusExpectation, + actual *serializableStatus, +) { + assert.Equal(t, expected.status, actual.Status()) + assert.Equal(t, expected.healthy, actual.Healthy) + if expected.err != nil { + assert.Equal(t, expected.err.Error(), actual.Error) + } + assert.Nil(t, actual.ComponentStatuses) +} + +func TestConfig(t *testing.T) { + var server *Server + confMap, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml")) + require.NoError(t, err) + confJSON, err := os.ReadFile(filepath.Clean(filepath.Join("testdata", "config.json"))) + require.NoError(t, err) + + for _, tc := range []struct { + name string + config *Config + setup func() + expectedStatusCode int + expectedBody []byte + }{ + { + name: "config not notified", + config: &Config{ + ServerConfig: confighttp.ServerConfig{ + Endpoint: testutil.GetAvailableLocalAddress(t), + }, + Config: PathConfig{ + Enabled: true, + Path: "/config", + }, + Status: PathConfig{ + Enabled: false, + }, + }, + expectedStatusCode: http.StatusServiceUnavailable, + expectedBody: []byte{}, + }, + { + name: "config notified", + config: &Config{ + ServerConfig: confighttp.ServerConfig{ + Endpoint: testutil.GetAvailableLocalAddress(t), + }, + Config: PathConfig{ + Enabled: true, + Path: "/config", + }, + Status: PathConfig{ + Enabled: false, + }, + }, + setup: func() { + require.NoError(t, server.NotifyConfig(context.Background(), confMap)) + }, + expectedStatusCode: http.StatusOK, + expectedBody: confJSON, + }, + { + name: "config disabled", + config: &Config{ + ServerConfig: confighttp.ServerConfig{ + Endpoint: testutil.GetAvailableLocalAddress(t), + }, + Config: PathConfig{ + Enabled: false, + }, + Status: PathConfig{ + Enabled: false, + }, + }, + expectedStatusCode: http.StatusNotFound, + expectedBody: []byte("404 page not found\n"), + }, + } { + t.Run(tc.name, func(t *testing.T) { + server = NewServer( + tc.config, + LegacyConfig{UseV2: true}, + &common.ComponentHealthConfig{}, + componenttest.NewNopTelemetrySettings(), + status.NewAggregator(status.PriorityPermanent), + ) + + require.NoError(t, server.Start(context.Background(), componenttest.NewNopHost())) + defer func() { require.NoError(t, server.Shutdown(context.Background())) }() + + client := &http.Client{} + url := fmt.Sprintf("http://%s%s", tc.config.Endpoint, tc.config.Config.Path) + + if tc.setup != nil { + tc.setup() + } + + resp, err := client.Get(url) + require.NoError(t, err) + assert.Equal(t, tc.expectedStatusCode, resp.StatusCode) + + body, err := io.ReadAll(resp.Body) + require.NoError(t, err) + assert.Equal(t, tc.expectedBody, body) + }) + } +} diff --git a/extension/healthcheckv2extension/internal/http/testdata/config.json b/extension/healthcheckv2extension/internal/http/testdata/config.json new file mode 100644 index 000000000000..55dc317f7c4d --- /dev/null +++ b/extension/healthcheckv2extension/internal/http/testdata/config.json @@ -0,0 +1 @@ +{"exporters":{"nop":null,"nop/myexporter":null},"extensions":{"nop":null,"nop/myextension":null},"processors":{"nop":null,"nop/myprocessor":null},"receivers":{"nop":null,"nop/myreceiver":null},"service":{"extensions":["nop"],"pipelines":{"traces":{"exporters":["nop"],"processors":["nop"],"receivers":["nop"]}}}} \ No newline at end of file diff --git a/extension/healthcheckv2extension/internal/http/testdata/config.yaml b/extension/healthcheckv2extension/internal/http/testdata/config.yaml new file mode 100644 index 000000000000..38227d7a68bc --- /dev/null +++ b/extension/healthcheckv2extension/internal/http/testdata/config.yaml @@ -0,0 +1,23 @@ +receivers: + nop: + nop/myreceiver: + +processors: + nop: + nop/myprocessor: + +exporters: + nop: + nop/myexporter: + +extensions: + nop: + nop/myextension: + +service: + extensions: [nop] + pipelines: + traces: + receivers: [nop] + processors: [nop] + exporters: [nop] diff --git a/extension/healthcheckv2extension/internal/metadata/generated_status.go b/extension/healthcheckv2extension/internal/metadata/generated_status.go index 8650b25352cc..4b2b2a489900 100644 --- a/extension/healthcheckv2extension/internal/metadata/generated_status.go +++ b/extension/healthcheckv2extension/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("healthcheckv2") + Type = component.MustNewType("healthcheckv2") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension" ) const ( diff --git a/extension/healthcheckv2extension/internal/metadata/generated_telemetry.go b/extension/healthcheckv2extension/internal/metadata/generated_telemetry.go deleted file mode 100644 index b0107af58efa..000000000000 --- a/extension/healthcheckv2extension/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension") -} diff --git a/extension/healthcheckv2extension/internal/metadata/generated_telemetry_test.go b/extension/healthcheckv2extension/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 2104fcd9d06a..000000000000 --- a/extension/healthcheckv2extension/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/healthcheckv2extension/internal/testhelpers/helpers.go b/extension/healthcheckv2extension/internal/testhelpers/helpers.go new file mode 100644 index 000000000000..1377c040d84f --- /dev/null +++ b/extension/healthcheckv2extension/internal/testhelpers/helpers.go @@ -0,0 +1,16 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package testhelpers // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension/internal/testhelpers" + +import ( + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension/internal/common" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status" +) + +func ErrPriority(config *common.ComponentHealthConfig) status.ErrorPriority { + if config != nil && config.IncludeRecoverable && !config.IncludePermanent { + return status.PriorityRecoverable + } + return status.PriorityPermanent +} diff --git a/extension/httpforwarderextension/README.md b/extension/httpforwarderextension/README.md index bde8f0f080db..0992d17e1604 100644 --- a/extension/httpforwarderextension/README.md +++ b/extension/httpforwarderextension/README.md @@ -3,11 +3,14 @@ | Status | | | ------------- |-----------| | Stability | [beta] | -| Distributions | [] | +| Distributions | [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fhttpforwarder%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fhttpforwarder) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fhttpforwarder%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fhttpforwarder) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@atoulme](https://www.github.com/atoulme), [@rmfitzpatrick](https://www.github.com/rmfitzpatrick) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@atoulme](https://www.github.com/atoulme) | +| Emeritus | [@rmfitzpatrick](https://www.github.com/rmfitzpatrick) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta +[contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s This extension accepts HTTP requests, optionally adds headers to them and forwards them. diff --git a/extension/httpforwarderextension/config.go b/extension/httpforwarderextension/config.go index 96d5b3f0a155..0ca9b602358f 100644 --- a/extension/httpforwarderextension/config.go +++ b/extension/httpforwarderextension/config.go @@ -9,7 +9,6 @@ import ( // Config defines configuration for http forwarder extension. type Config struct { - // Ingress holds config settings for HTTP server listening for requests. Ingress confighttp.ServerConfig `mapstructure:"ingress"` diff --git a/extension/httpforwarderextension/config_test.go b/extension/httpforwarderextension/config_test.go index 9837e27f84bc..62ac93e2cecf 100644 --- a/extension/httpforwarderextension/config_test.go +++ b/extension/httpforwarderextension/config_test.go @@ -23,6 +23,15 @@ func TestLoadConfig(t *testing.T) { maxIdleConns := 42 idleConnTimeout := 80 * time.Second + egressCfg := confighttp.NewDefaultClientConfig() + egressCfg.Endpoint = "http://target/" + egressCfg.Headers = map[string]configopaque.String{ + "otel_http_forwarder": "dev", + } + egressCfg.MaxIdleConns = &maxIdleConns + egressCfg.IdleConnTimeout = &idleConnTimeout + egressCfg.Timeout = 5 * time.Second + tests := []struct { id component.ID expected component.Config @@ -37,15 +46,7 @@ func TestLoadConfig(t *testing.T) { Ingress: confighttp.ServerConfig{ Endpoint: "http://localhost:7070", }, - Egress: confighttp.ClientConfig{ - Endpoint: "http://target/", - Headers: map[string]configopaque.String{ - "otel_http_forwarder": "dev", - }, - MaxIdleConns: &maxIdleConns, - IdleConnTimeout: &idleConnTimeout, - Timeout: 5 * time.Second, - }, + Egress: egressCfg, }, }, } @@ -57,7 +58,7 @@ func TestLoadConfig(t *testing.T) { cfg := factory.CreateDefaultConfig() sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) }) diff --git a/extension/httpforwarderextension/extension.go b/extension/httpforwarderextension/extension.go index def2a4a5ec07..daa0e99ae1a7 100644 --- a/extension/httpforwarderextension/extension.go +++ b/extension/httpforwarderextension/extension.go @@ -12,6 +12,7 @@ import ( "net/url" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componentstatus" "go.opentelemetry.io/collector/extension" "go.uber.org/zap" ) @@ -48,7 +49,7 @@ func (h *httpForwarder) Start(ctx context.Context, host component.Host) error { go func() { if errHTTP := h.server.Serve(listener); !errors.Is(errHTTP, http.ErrServerClosed) && errHTTP != nil { - h.settings.ReportStatus(component.NewFatalErrorEvent(errHTTP)) + componentstatus.ReportStatus(host, componentstatus.NewFatalErrorEvent(errHTTP)) } }() @@ -115,7 +116,7 @@ func newHTTPForwarder(config *Config, settings component.TelemetrySettings) (ext return nil, errors.New("'egress.endpoint' config option cannot be empty") } - var url, err = url.Parse(config.Egress.Endpoint) + url, err := url.Parse(config.Egress.Endpoint) if err != nil { return nil, fmt.Errorf("enter a valid URL for 'egress.endpoint': %w", err) } diff --git a/extension/httpforwarderextension/extension_test.go b/extension/httpforwarderextension/extension_test.go index 7e3563bf6fe8..c398a70595bc 100644 --- a/extension/httpforwarderextension/extension_test.go +++ b/extension/httpforwarderextension/extension_test.go @@ -57,7 +57,7 @@ func TestExtension(t *testing.T) { "header": "value", }, clientRequestArgs: clientRequestArgs{ - method: "GET", + method: http.MethodGet, url: fmt.Sprintf("http://%s/api/dosomething", listenAt), headers: map[string]string{ "client_header": "val1", @@ -83,7 +83,7 @@ func TestExtension(t *testing.T) { "header": "value", }, clientRequestArgs: clientRequestArgs{ - method: "PUT", + method: http.MethodPut, url: fmt.Sprintf("http://%s/api/dosomething", listenAt), }, }, @@ -123,7 +123,7 @@ func TestExtension(t *testing.T) { expectedBackendResponseBody: []byte("\n"), requestErrorAtForwarder: true, clientRequestArgs: clientRequestArgs{ - method: "GET", + method: http.MethodGet, url: fmt.Sprintf("http://%s/api/dosomething", listenAt), }, }, @@ -205,7 +205,7 @@ func TestExtension(t *testing.T) { if test.startUpError { err = hf.Start(ctx, componenttest.NewNopHost()) if test.startUpErrorMessage != "" { - require.True(t, strings.Contains(err.Error(), test.startUpErrorMessage)) + require.Contains(t, err.Error(), test.startUpErrorMessage) } require.Error(t, err) @@ -266,7 +266,7 @@ func readBody(body io.ReadCloser) []byte { } func getParsedURL(t *testing.T, rawURL string) *url.URL { - var url, err = url.Parse(rawURL) + url, err := url.Parse(rawURL) require.NoError(t, err) return url } diff --git a/extension/httpforwarderextension/factory.go b/extension/httpforwarderextension/factory.go index 57ce1eb3a576..33c225993cba 100644 --- a/extension/httpforwarderextension/factory.go +++ b/extension/httpforwarderextension/factory.go @@ -41,7 +41,7 @@ func createDefaultConfig() component.Config { func createExtension( _ context.Context, - params extension.CreateSettings, + params extension.Settings, cfg component.Config, ) (extension.Extension, error) { return newHTTPForwarder(cfg.(*Config), params.TelemetrySettings) diff --git a/extension/httpforwarderextension/factory_test.go b/extension/httpforwarderextension/factory_test.go index 3eef3c3330f2..b1678a5ff47a 100644 --- a/extension/httpforwarderextension/factory_test.go +++ b/extension/httpforwarderextension/factory_test.go @@ -5,7 +5,6 @@ package httpforwarderextension import ( "context" - "strings" "testing" "time" @@ -50,14 +49,14 @@ func TestFactory(t *testing.T) { } for _, test := range tests { t.Run(test.name, func(t *testing.T) { - e, err := f.CreateExtension( + e, err := f.Create( context.Background(), - extensiontest.NewNopCreateSettings(), + extensiontest.NewNopSettings(), test.config, ) if test.wantErr { if test.wantErrMessage != "" { - require.True(t, strings.Contains(err.Error(), test.wantErrMessage)) + require.Contains(t, err.Error(), test.wantErrMessage) } require.Error(t, err) require.Nil(t, e) diff --git a/extension/httpforwarderextension/generated_component_test.go b/extension/httpforwarderextension/generated_component_test.go index 68cf7cf1878e..96a6da67a3f0 100644 --- a/extension/httpforwarderextension/generated_component_test.go +++ b/extension/httpforwarderextension/generated_component_test.go @@ -30,18 +30,18 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) t.Run("shutdown", func(t *testing.T) { - e, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + e, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) err = e.Shutdown(context.Background()) require.NoError(t, err) }) t.Run("lifecycle", func(t *testing.T) { - firstExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + firstExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, firstExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, firstExt.Shutdown(context.Background())) - secondExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + secondExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, secondExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, secondExt.Shutdown(context.Background())) diff --git a/extension/httpforwarderextension/go.mod b/extension/httpforwarderextension/go.mod index 2e66c111b812..a122055b41a2 100644 --- a/extension/httpforwarderextension/go.mod +++ b/extension/httpforwarderextension/go.mod @@ -1,67 +1,65 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/httpforwarderextension -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/confighttp v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/config/configtls v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componentstatus v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/confighttp v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/config/configtls v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/rs/cors v1.10.1 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + github.com/rs/cors v1.11.1 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/httpforwarderextension/go.sum b/extension/httpforwarderextension/go.sum index d81aa2bc1dce..f63572bba8b4 100644 --- a/extension/httpforwarderextension/go.sum +++ b/extension/httpforwarderextension/go.sum @@ -1,22 +1,20 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= @@ -29,14 +27,14 @@ 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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -49,68 +47,70 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -126,20 +126,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -148,12 +148,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/extension/httpforwarderextension/internal/metadata/generated_status.go b/extension/httpforwarderextension/internal/metadata/generated_status.go index 60e2b9000221..2f4dafa261d1 100644 --- a/extension/httpforwarderextension/internal/metadata/generated_status.go +++ b/extension/httpforwarderextension/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("http_forwarder") + Type = component.MustNewType("http_forwarder") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/httpforwarderextension" ) const ( diff --git a/extension/httpforwarderextension/internal/metadata/generated_telemetry.go b/extension/httpforwarderextension/internal/metadata/generated_telemetry.go deleted file mode 100644 index 7717d57a5bfd..000000000000 --- a/extension/httpforwarderextension/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/httpforwarder") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/httpforwarder") -} diff --git a/extension/httpforwarderextension/internal/metadata/generated_telemetry_test.go b/extension/httpforwarderextension/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 6520f97df602..000000000000 --- a/extension/httpforwarderextension/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/httpforwarder", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/httpforwarder", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/httpforwarderextension/metadata.yaml b/extension/httpforwarderextension/metadata.yaml index 566cda76d1e3..8079b23d2023 100644 --- a/extension/httpforwarderextension/metadata.yaml +++ b/extension/httpforwarderextension/metadata.yaml @@ -1,13 +1,13 @@ type: http_forwarder -scope_name: otelcol/httpforwarder status: class: extension stability: beta: [extension] - distributions: [] + distributions: [contrib, k8s] codeowners: - active: [atoulme, rmfitzpatrick] + active: [atoulme] + emeritus: [rmfitzpatrick] tests: config: diff --git a/extension/jaegerremotesampling/README.md b/extension/jaegerremotesampling/README.md index 74b45961535e..a152cef1ff89 100644 --- a/extension/jaegerremotesampling/README.md +++ b/extension/jaegerremotesampling/README.md @@ -7,17 +7,17 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fjaegerremotesampling%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fjaegerremotesampling) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fjaegerremotesampling%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fjaegerremotesampling) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@yurishkuro](https://www.github.com/yurishkuro), [@frzifus](https://www.github.com/frzifus) | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib This extension allows serving sampling strategies following the Jaeger's remote sampling API. This extension can be configured to proxy requests to a backing remote sampling server, which could potentially be a Jaeger Collector down the pipeline, or a static JSON file from the local file system. By default, two listeners are made available: -- `0.0.0.0:5778`, following the legacy remote sampling endpoint as defined by Jaeger -- `0.0.0.0:14250`, following the gRPC remote sampling endpoint, also defined by Jaeger +- `localhost:5778`, following the legacy remote sampling endpoint as defined by Jaeger +- `localhost:14250`, following the gRPC remote sampling endpoint, also defined by Jaeger -The `component.UseLocalHostAsDefaultHost` feature gate changes this to localhost:9943. This will become the default in a future release. +See our [security best practices doc](https://opentelemetry.io/docs/security/config-best-practices/#protect-against-denial-of-service-attacks) to understand how to set the endpoint in different environments. Note that the port `14250` will clash with the Jaeger Receiver. When both are used, it's recommended to change this extension to use another port. diff --git a/extension/jaegerremotesampling/config_test.go b/extension/jaegerremotesampling/config_test.go index cd9ef017e888..22ccf9bf08a7 100644 --- a/extension/jaegerremotesampling/config_test.go +++ b/extension/jaegerremotesampling/config_test.go @@ -29,9 +29,9 @@ func TestLoadConfig(t *testing.T) { { id: component.NewID(metadata.Type), expected: &Config{ - HTTPServerConfig: &confighttp.ServerConfig{Endpoint: "0.0.0.0:5778"}, + HTTPServerConfig: &confighttp.ServerConfig{Endpoint: "localhost:5778"}, GRPCServerConfig: &configgrpc.ServerConfig{NetAddr: confignet.AddrConfig{ - Endpoint: "0.0.0.0:14250", + Endpoint: "localhost:14250", Transport: confignet.TransportTypeTCP, }}, Source: Source{ @@ -44,9 +44,9 @@ func TestLoadConfig(t *testing.T) { { id: component.NewIDWithName(metadata.Type, "1"), expected: &Config{ - HTTPServerConfig: &confighttp.ServerConfig{Endpoint: "0.0.0.0:5778"}, + HTTPServerConfig: &confighttp.ServerConfig{Endpoint: "localhost:5778"}, GRPCServerConfig: &configgrpc.ServerConfig{NetAddr: confignet.AddrConfig{ - Endpoint: "0.0.0.0:14250", + Endpoint: "localhost:14250", Transport: confignet.TransportTypeTCP, }}, Source: Source{ @@ -64,7 +64,7 @@ func TestLoadConfig(t *testing.T) { cfg := factory.CreateDefaultConfig() sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) }) @@ -72,7 +72,6 @@ func TestLoadConfig(t *testing.T) { } func TestValidate(t *testing.T) { - testCases := []struct { desc string cfg Config diff --git a/extension/jaegerremotesampling/extension.go b/extension/jaegerremotesampling/extension.go index 0b3577a7d270..74f7d9467b99 100644 --- a/extension/jaegerremotesampling/extension.go +++ b/extension/jaegerremotesampling/extension.go @@ -7,8 +7,8 @@ import ( "context" "fmt" - "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/strategystore" - "github.com/jaegertracing/jaeger/plugin/sampling/strategystore/static" + "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/samplingstrategy" + "github.com/jaegertracing/jaeger/plugin/sampling/strategyprovider/static" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/extension" "go.uber.org/zap" @@ -24,7 +24,7 @@ type jrsExtension struct { httpServer component.Component grpcServer component.Component - samplingStore strategystore.StrategyStore + samplingStore samplingstrategy.Provider closers []func() error } @@ -48,7 +48,7 @@ func (jrse *jrsExtension) Start(ctx context.Context, host component.Host) error StrategiesFile: jrse.cfg.Source.File, ReloadInterval: jrse.cfg.Source.ReloadInterval, } - ss, err := static.NewStrategyStore(opts, jrse.telemetry.Logger) + ss, err := static.NewProvider(opts, jrse.telemetry.Logger) if err != nil { return fmt.Errorf("failed to create the local file strategy store: %w", err) } diff --git a/extension/jaegerremotesampling/extension_test.go b/extension/jaegerremotesampling/extension_test.go index 072b45268e76..39ace820f1d9 100644 --- a/extension/jaegerremotesampling/extension_test.go +++ b/extension/jaegerremotesampling/extension_test.go @@ -92,7 +92,7 @@ func TestRemote(t *testing.T) { go func() { err = server.Serve(lis) - require.NoError(t, err) + assert.NoError(t, err) }() defer func() { server.Stop() }() diff --git a/extension/jaegerremotesampling/factory.go b/extension/jaegerremotesampling/factory.go index a952674da6ef..6cd5ce005b3f 100644 --- a/extension/jaegerremotesampling/factory.go +++ b/extension/jaegerremotesampling/factory.go @@ -16,7 +16,7 @@ import ( "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/jaegerremotesampling/internal/metadata" - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/localhostgate" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/testutil" ) // NewFactory creates a factory for the jaeger remote sampling extension. @@ -32,11 +32,11 @@ func NewFactory() extension.Factory { func createDefaultConfig() component.Config { return &Config{ HTTPServerConfig: &confighttp.ServerConfig{ - Endpoint: localhostgate.EndpointForPort(5778), + Endpoint: testutil.EndpointForPort(5778), }, GRPCServerConfig: &configgrpc.ServerConfig{ NetAddr: confignet.AddrConfig{ - Endpoint: localhostgate.EndpointForPort(14250), + Endpoint: testutil.EndpointForPort(14250), Transport: confignet.TransportTypeTCP, }, }, @@ -62,7 +62,7 @@ var protoGate = featuregate.GlobalRegistry().MustRegister( featuregate.WithRegisterToVersion("0.92.0"), ) -func createExtension(_ context.Context, set extension.CreateSettings, cfg component.Config) (extension.Extension, error) { +func createExtension(_ context.Context, set extension.Settings, cfg component.Config) (extension.Extension, error) { logDeprecation(set.Logger) return newExtension(cfg.(*Config), set.TelemetrySettings), nil } diff --git a/extension/jaegerremotesampling/factory_test.go b/extension/jaegerremotesampling/factory_test.go index 10b37cec0f09..32ce17c5010a 100644 --- a/extension/jaegerremotesampling/factory_test.go +++ b/extension/jaegerremotesampling/factory_test.go @@ -18,9 +18,9 @@ import ( func TestCreateDefaultConfig(t *testing.T) { // prepare and test expected := &Config{ - HTTPServerConfig: &confighttp.ServerConfig{Endpoint: "0.0.0.0:5778"}, + HTTPServerConfig: &confighttp.ServerConfig{Endpoint: "localhost:5778"}, GRPCServerConfig: &configgrpc.ServerConfig{NetAddr: confignet.AddrConfig{ - Endpoint: "0.0.0.0:14250", + Endpoint: "localhost:14250", Transport: confignet.TransportTypeTCP, }}, } @@ -33,10 +33,10 @@ func TestCreateDefaultConfig(t *testing.T) { assert.NoError(t, componenttest.CheckConfigStruct(cfg)) } -func TestCreateExtension(t *testing.T) { +func TestCreate(t *testing.T) { cfg := createDefaultConfig().(*Config) - ext, err := createExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + ext, err := createExtension(context.Background(), extensiontest.NewNopSettings(), cfg) assert.NoError(t, err) assert.NotNil(t, ext) } diff --git a/extension/jaegerremotesampling/generated_component_test.go b/extension/jaegerremotesampling/generated_component_test.go index 6dd9b7d4dfb6..cb517d93ce2f 100644 --- a/extension/jaegerremotesampling/generated_component_test.go +++ b/extension/jaegerremotesampling/generated_component_test.go @@ -30,7 +30,7 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) t.Run("shutdown", func(t *testing.T) { - e, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + e, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) err = e.Shutdown(context.Background()) require.NoError(t, err) diff --git a/extension/jaegerremotesampling/go.mod b/extension/jaegerremotesampling/go.mod index e40fec917ca4..283fdf65c181 100644 --- a/extension/jaegerremotesampling/go.mod +++ b/extension/jaegerremotesampling/go.mod @@ -1,89 +1,87 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/jaegerremotesampling -go 1.21.0 +go 1.22.0 require ( github.com/fortytw2/leaktest v1.3.0 - github.com/jaegertracing/jaeger v1.57.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 - github.com/stretchr/testify v1.9.0 - github.com/tilinna/clock v1.1.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configgrpc v0.102.0 - go.opentelemetry.io/collector/config/confighttp v0.102.0 - go.opentelemetry.io/collector/config/confignet v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/config/configtls v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/collector/featuregate v1.9.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/jaegertracing/jaeger v1.62.0 + github.com/jonboulle/clockwork v0.4.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componentstatus v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configgrpc v0.116.0 + go.opentelemetry.io/collector/config/confighttp v0.116.0 + go.opentelemetry.io/collector/config/confignet v1.22.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/config/configtls v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 + go.opentelemetry.io/collector/featuregate v1.22.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 - google.golang.org/grpc v1.64.0 + google.golang.org/grpc v1.68.1 ) require ( - github.com/apache/thrift v0.20.0 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/apache/thrift v0.21.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect - github.com/mostynb/go-grpc-compression v1.2.2 // indirect - github.com/pelletier/go-toml/v2 v2.1.0 // indirect + github.com/mostynb/go-grpc-compression v1.2.3 // indirect + github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/rs/cors v1.10.1 // indirect + github.com/rs/cors v1.11.1 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.11.0 // indirect github.com/spf13/cast v1.6.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.18.2 // indirect + github.com/spf13/viper v1.19.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/exp v0.0.0-20240119083558-1b970713d09a // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/jaegerremotesampling/go.sum b/extension/jaegerremotesampling/go.sum index c5941ca61953..65f2b88a6601 100644 --- a/extension/jaegerremotesampling/go.sum +++ b/extension/jaegerremotesampling/go.sum @@ -1,11 +1,7 @@ github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/apache/thrift v0.20.0 h1:631+KvYbsBZxmuJjYwhezVsrfc/TbqtZV4QcxOX1fOI= -github.com/apache/thrift v0.20.0/go.mod h1:hOk1BQqcp2OLzGsyVXdfMk7YFlMxK3aoEVhjD06QhB8= -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE= +github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -16,19 +12,21 @@ github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8 github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= @@ -41,20 +39,22 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jaegertracing/jaeger v1.57.0 h1:3wDtUUPs6NRYH7+d+y8MilDkLHdpPrVlQ2wbcsA62bs= -github.com/jaegertracing/jaeger v1.57.0/go.mod h1:p/1fxIU9hKHl7qEhKC72p2ZYVhvvZvNB73y6V7YyuTs= +github.com/jaegertracing/jaeger v1.62.0 h1:YoaJ2e8oVz5sqGGlVAKSUCED8DzJ1q7PojBmZFNKoJA= +github.com/jaegertracing/jaeger v1.62.0/go.mod h1:jhEIHazwyb+a6xlRBi+p96BAvTYTSmGkghcwdQfV7FM= +github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -71,25 +71,19 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mostynb/go-grpc-compression v1.2.2 h1:XaDbnRvt2+1vgr0b/l0qh4mJAfIxE0bKXtz2Znl3GGI= -github.com/mostynb/go-grpc-compression v1.2.2/go.mod h1:GOCr2KBxXcblCuczg3YdLQlcin1/NfyDA348ckuCH6w= -github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= -github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +github.com/mostynb/go-grpc-compression v1.2.3 h1:42/BKWMy0KEJGSdWvzqIyOZ95YcR9mLPqKctH7Uo//I= +github.com/mostynb/go-grpc-compression v1.2.3/go.mod h1:AghIxF3P57umzqM9yz795+y1Vjs47Km/Y2FE6ouQ7Lg= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= @@ -100,78 +94,89 @@ github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= -github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= +github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= +github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/tilinna/clock v1.1.0 h1:6IQQQCo6KoBxVudv6gwtY8o4eDfhHo8ojA5dP0MfhSs= -github.com/tilinna/clock v1.1.0/go.mod h1:ZsP7BcY7sEEz7ktc0IVy8Us6boDrK8VradlKRUGfOao= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/configgrpc v0.102.0 h1:cQi5HwpkHvrZJUxZjoGXkWpAuK+gEyp/1Zjn0BrkvmQ= -go.opentelemetry.io/collector/config/configgrpc v0.102.0/go.mod h1:ASpBXzDWLiDGlG8iRFovU5R4LhAefoC4ajm+qIdslOw= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/confignet v0.102.0 h1:+wQevJ/iBnPxL+roY7WWnAjMxB8v4M5QrS3+0iEmauw= -go.opentelemetry.io/collector/config/confignet v0.102.0/go.mod h1:pfOrCTfSZEB6H2rKtx41/3RN4dKs+X2EKQbw3MGRh0E= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 h1:vS1Ao/R55RNV4O7TA2Qopok8yN+X0LIP6RVWLFkprck= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0/go.mod h1:BMsdeOxN04K0L5FNUBfjFdvwWGNe/rkmSwH4Aelu/X0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector v0.111.0 h1:D3LJTYrrK2ac94E2PXPSbVkArqxbklbCLsE4MAJQdRo= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/configgrpc v0.116.0 h1:O8Y1X9wDH5dDdqDJ9kqoaMrxEauaDSJBg9aNC6QgB7g= +go.opentelemetry.io/collector/config/configgrpc v0.116.0/go.mod h1:RPrSQrr6xhIaAK2DdcECi142NjSo0npQfVQB3nommSo= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/confignet v1.22.0 h1:SBEMHJZWD8J4qgFw1O+BEkXW9AWldDi6Fz5YeDeoU58= +go.opentelemetry.io/collector/config/confignet v1.22.0/go.mod h1:ZppUH1hgUJOubawEsxsQ9MzEYFytqo2GnVSS7d4CVxc= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 h1:yMkBS9yViCc7U7yeLzJPM2XizlfdVvBRSmsQDWu6qc0= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0/go.mod h1:n8MR6/liuGB5EmTETUBeU5ZgqMOlqKRxUaqPQBOANZ8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -181,28 +186,28 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20240119083558-1b970713d09a h1:Q8/wZp0KX97QFTc2ywcOE0YRjZPVIx+MXInMzdvQqcA= -golang.org/x/exp v0.0.0-20240119083558-1b970713d09a/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -211,12 +216,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 h1:QCqS/PdaHTSWGvupk2F/ehwHtGc0/GYkT+3GAcR1CCc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/extension/jaegerremotesampling/internal/grpc.go b/extension/jaegerremotesampling/internal/grpc.go index d3afc1b7e9d3..5b614f90fae4 100644 --- a/extension/jaegerremotesampling/internal/grpc.go +++ b/extension/jaegerremotesampling/internal/grpc.go @@ -10,7 +10,7 @@ import ( "net" "github.com/jaegertracing/jaeger/cmd/collector/app/sampling" - "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/strategystore" + "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/samplingstrategy" "github.com/jaegertracing/jaeger/proto-gen/api_v2" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/config/configgrpc" @@ -34,7 +34,7 @@ type grpcServer interface { func NewGRPC( telemetry component.TelemetrySettings, settings configgrpc.ServerConfig, - strategyStore strategystore.StrategyStore, + strategyStore samplingstrategy.Provider, ) (*SamplingGRPCServer, error) { if strategyStore == nil { return nil, errMissingStrategyStore @@ -51,7 +51,7 @@ func NewGRPC( type SamplingGRPCServer struct { telemetry component.TelemetrySettings settings configgrpc.ServerConfig - strategyStore strategystore.StrategyStore + strategyStore samplingstrategy.Provider grpcServer grpcServer } diff --git a/extension/jaegerremotesampling/internal/grpc_test.go b/extension/jaegerremotesampling/internal/grpc_test.go index 931a88b08af0..40cc01de9998 100644 --- a/extension/jaegerremotesampling/internal/grpc_test.go +++ b/extension/jaegerremotesampling/internal/grpc_test.go @@ -94,9 +94,11 @@ func (g *grpcServerMock) Serve(_ net.Listener) error { g.quit = make(chan bool) return nil } + func (g *grpcServerMock) Stop() { g.quit <- true } + func (g *grpcServerMock) GracefulStop() { select { case <-g.quit: diff --git a/extension/jaegerremotesampling/internal/http.go b/extension/jaegerremotesampling/internal/http.go index e66091dfadbb..6ab9f75cba78 100644 --- a/extension/jaegerremotesampling/internal/http.go +++ b/extension/jaegerremotesampling/internal/http.go @@ -12,28 +12,27 @@ import ( "net/http" "sync" - "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/strategystore" + "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/samplingstrategy" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componentstatus" "go.opentelemetry.io/collector/config/confighttp" ) -var ( - errMissingStrategyStore = errors.New("the strategy store has not been provided") -) +var errMissingStrategyStore = errors.New("the strategy store has not been provided") var _ component.Component = (*SamplingHTTPServer)(nil) type SamplingHTTPServer struct { telemetry component.TelemetrySettings settings confighttp.ServerConfig - strategyStore strategystore.StrategyStore + strategyStore samplingstrategy.Provider mux *http.ServeMux srv *http.Server shutdownWG *sync.WaitGroup } -func NewHTTP(telemetry component.TelemetrySettings, settings confighttp.ServerConfig, strategyStore strategystore.StrategyStore) (*SamplingHTTPServer, error) { +func NewHTTP(telemetry component.TelemetrySettings, settings confighttp.ServerConfig, strategyStore samplingstrategy.Provider) (*SamplingHTTPServer, error) { if strategyStore == nil { return nil, errMissingStrategyStore } @@ -72,7 +71,7 @@ func (h *SamplingHTTPServer) Start(ctx context.Context, host component.Host) err defer h.shutdownWG.Done() if err := h.srv.Serve(hln); err != nil && !errors.Is(err, http.ErrServerClosed) { - h.telemetry.ReportStatus(component.NewFatalErrorEvent(err)) + componentstatus.ReportStatus(host, componentstatus.NewFatalErrorEvent(err)) } }() diff --git a/extension/jaegerremotesampling/internal/http_test.go b/extension/jaegerremotesampling/internal/http_test.go index 0ad7a113e9a5..075073d82215 100644 --- a/extension/jaegerremotesampling/internal/http_test.go +++ b/extension/jaegerremotesampling/internal/http_test.go @@ -80,7 +80,7 @@ func TestEndpointsAreWired(t *testing.T) { resp.Body.Close() body := string(samplingStrategiesBytes) - assert.Equal(t, `{"probabilisticSampling":{"samplingRate":1}}`, body) + assert.JSONEq(t, `{"probabilisticSampling":{"samplingRate":1}}`, body) }) } } diff --git a/extension/jaegerremotesampling/internal/metadata/generated_status.go b/extension/jaegerremotesampling/internal/metadata/generated_status.go index 9c56d915e8f7..68d9c37f0120 100644 --- a/extension/jaegerremotesampling/internal/metadata/generated_status.go +++ b/extension/jaegerremotesampling/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("jaegerremotesampling") + Type = component.MustNewType("jaegerremotesampling") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/jaegerremotesampling" ) const ( diff --git a/extension/jaegerremotesampling/internal/metadata/generated_telemetry.go b/extension/jaegerremotesampling/internal/metadata/generated_telemetry.go deleted file mode 100644 index c2da72bf8f78..000000000000 --- a/extension/jaegerremotesampling/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/jaegerremotesampling") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/jaegerremotesampling") -} diff --git a/extension/jaegerremotesampling/internal/metadata/generated_telemetry_test.go b/extension/jaegerremotesampling/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 2b911849ab53..000000000000 --- a/extension/jaegerremotesampling/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/jaegerremotesampling", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/jaegerremotesampling", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/jaegerremotesampling/internal/remote_strategy_cache.go b/extension/jaegerremotesampling/internal/remote_strategy_cache.go index 16129055072c..cb6375c2ce0b 100644 --- a/extension/jaegerremotesampling/internal/remote_strategy_cache.go +++ b/extension/jaegerremotesampling/internal/remote_strategy_cache.go @@ -9,7 +9,7 @@ import ( "time" "github.com/jaegertracing/jaeger/proto-gen/api_v2" - "github.com/tilinna/clock" + "github.com/jonboulle/clockwork" ) type serviceStrategyCache interface { @@ -78,7 +78,7 @@ func (c *serviceStrategyTTLCache) put( defer c.rw.Unlock() c.items[serviceName] = serviceStrategyCacheEntry{ strategyResponse: response, - retrievedAt: clock.Now(ctx), + retrievedAt: clockwork.FromContext(ctx).Now(), } } @@ -89,10 +89,10 @@ func (c *serviceStrategyTTLCache) periodicallyClearCache( ctx context.Context, schedulingPeriod time.Duration, ) { - ticker := clock.NewTicker(ctx, schedulingPeriod) + ticker := clockwork.FromContext(ctx).NewTicker(schedulingPeriod) for { select { - case <-ticker.C: + case <-ticker.Chan(): c.rw.Lock() newItems := make(map[string]serviceStrategyCacheEntry, initialRemoteResponseCacheSize) for serviceName, item := range c.items { @@ -115,7 +115,7 @@ func (c *serviceStrategyTTLCache) Close() error { } func (c *serviceStrategyTTLCache) staleItem(ctx context.Context, item serviceStrategyCacheEntry) bool { - return clock.Now(ctx).After(item.retrievedAt.Add(c.itemTTL)) + return clockwork.FromContext(ctx).Now().After(item.retrievedAt.Add(c.itemTTL)) } type noopStrategyCache struct{} diff --git a/extension/jaegerremotesampling/internal/remote_strategy_cache_test.go b/extension/jaegerremotesampling/internal/remote_strategy_cache_test.go index 7bd6c4fa767c..22f03b30a076 100644 --- a/extension/jaegerremotesampling/internal/remote_strategy_cache_test.go +++ b/extension/jaegerremotesampling/internal/remote_strategy_cache_test.go @@ -12,8 +12,8 @@ import ( "github.com/fortytw2/leaktest" "github.com/jaegertracing/jaeger/proto-gen/api_v2" + "github.com/jonboulle/clockwork" "github.com/stretchr/testify/assert" - "github.com/tilinna/clock" ) const cacheTestItemTTL = 50 * time.Millisecond @@ -48,9 +48,11 @@ var testStrategyResponseB = &api_v2.SamplingStrategyResponse{ func Test_serviceStrategyCache_ReadWriteSequence(t *testing.T) { testTime := time.Date(2023, 1, 1, 10, 0, 0, 0, time.UTC) - mock := clock.NewMock(testTime) - ctx, cfn := mock.DeadlineContext(context.Background(), testTime.Add(3*time.Minute)) - defer cfn() + mock := clockwork.NewFakeClockAt(testTime) + _ = mock.After(3 * time.Minute) + + ctx, cancel := context.WithCancel(clockwork.AddToContext(context.Background(), mock)) + defer cancel() cache := newServiceStrategyCache(cacheTestItemTTL).(*serviceStrategyTTLCache) defer func() { @@ -91,7 +93,7 @@ func Test_serviceStrategyCache_ReadWriteSequence(t *testing.T) { }, cache.items["fooSvc"]) // advance time (still within TTL time range) - mock.Add(20 * time.Millisecond) + mock.Advance(20 * time.Millisecond) // the written item is still available result, ok = cache.get(ctx, "fooSvc") @@ -102,7 +104,7 @@ func Test_serviceStrategyCache_ReadWriteSequence(t *testing.T) { assert.Nil(t, result) // advance time (just before end of TTL time range) - mock.Add(30 * time.Millisecond) + mock.Advance(30 * time.Millisecond) // the written item is still available result, ok = cache.get(ctx, "fooSvc") @@ -113,7 +115,7 @@ func Test_serviceStrategyCache_ReadWriteSequence(t *testing.T) { assert.Nil(t, result) // advance time (across TTL range) - mock.Add(1 * time.Millisecond) + mock.Advance(1 * time.Millisecond) // the (now stale) cached item is no longer available result, ok = cache.get(ctx, "fooSvc") @@ -131,9 +133,11 @@ func Test_serviceStrategyCache_ReadWriteSequence(t *testing.T) { func Test_serviceStrategyCache_WritesUpdateTimestamp(t *testing.T) { startTime := time.Date(2023, 1, 1, 10, 0, 0, 0, time.UTC) - mock := clock.NewMock(startTime) - ctx, cfn := mock.DeadlineContext(context.Background(), startTime.Add(3*time.Minute)) - defer cfn() + mock := clockwork.NewFakeClockAt(startTime) + _ = mock.After(3 * time.Minute) + + ctx, cancel := context.WithCancel(clockwork.AddToContext(context.Background(), mock)) + defer cancel() cache := newServiceStrategyCache(cacheTestItemTTL).(*serviceStrategyTTLCache) defer func() { @@ -149,12 +153,12 @@ func Test_serviceStrategyCache_WritesUpdateTimestamp(t *testing.T) { assert.Nil(t, result) // perform a write for barSvc at startTime + 10ms - firstWriteTime := mock.Add(10 * time.Millisecond) + mock.Advance(10 * time.Millisecond) cache.put(ctx, "barSvc", testStrategyResponseA) // whitebox assert for internal timestamp tracking assert.Equal(t, serviceStrategyCacheEntry{ - retrievedAt: firstWriteTime, + retrievedAt: mock.Now(), strategyResponse: testStrategyResponseA, }, cache.items["barSvc"]) @@ -167,7 +171,7 @@ func Test_serviceStrategyCache_WritesUpdateTimestamp(t *testing.T) { assert.Equal(t, testStrategyResponseA, result) // advance time (still within TTL time range) - mock.Add(10 * time.Millisecond) + mock.Advance(10 * time.Millisecond) // the written item is still available result, ok = cache.get(ctx, "fooSvc") @@ -178,8 +182,9 @@ func Test_serviceStrategyCache_WritesUpdateTimestamp(t *testing.T) { assert.Equal(t, testStrategyResponseA, result) // perform a write for barSvc at startTime + 30ms (still within TTL, but we retain this more recent data) - secondWriteTime := mock.Add(10 * time.Millisecond) + mock.Advance(10 * time.Millisecond) cache.put(ctx, "barSvc", testStrategyResponseB) + secondWriteTime := mock.Now() // whitebox assert for internal timestamp tracking (post-write, still-fresh cache entry replaced with newer data) assert.Equal(t, serviceStrategyCacheEntry{ @@ -196,7 +201,7 @@ func Test_serviceStrategyCache_WritesUpdateTimestamp(t *testing.T) { assert.Equal(t, testStrategyResponseB, result) // advance time (to end of what is now a new/full TTL for the new fresh item) - mock.Add(cacheTestItemTTL) + mock.Advance(cacheTestItemTTL) result, ok = cache.get(ctx, "fooSvc") assert.False(t, ok) @@ -206,7 +211,7 @@ func Test_serviceStrategyCache_WritesUpdateTimestamp(t *testing.T) { assert.Equal(t, testStrategyResponseB, result) // advance time beyond the newer item's TTL - mock.Add(1) + mock.Advance(1) // the (now stale) cached item is no longer available result, ok = cache.get(ctx, "fooSvc") diff --git a/extension/jaegerremotesampling/internal/remote_strategy_store.go b/extension/jaegerremotesampling/internal/remote_strategy_store.go index 2f452ec364c3..68ce1be8843b 100644 --- a/extension/jaegerremotesampling/internal/remote_strategy_store.go +++ b/extension/jaegerremotesampling/internal/remote_strategy_store.go @@ -10,7 +10,7 @@ import ( "time" grpcstore "github.com/jaegertracing/jaeger/cmd/agent/app/configmanager/grpc" - "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/strategystore" + "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/samplingstrategy" "github.com/jaegertracing/jaeger/proto-gen/api_v2" "go.opentelemetry.io/collector/config/configgrpc" "go.opentelemetry.io/collector/config/configopaque" @@ -32,7 +32,7 @@ func NewRemoteStrategyStore( conn *grpc.ClientConn, grpcClientSettings *configgrpc.ClientConfig, reloadInterval time.Duration, -) (strategystore.StrategyStore, io.Closer) { +) (samplingstrategy.Provider, io.Closer) { cache := newNoopStrategyCache() if reloadInterval > 0 { cache = newServiceStrategyCache(reloadInterval) diff --git a/extension/jaegerremotesampling/metadata.yaml b/extension/jaegerremotesampling/metadata.yaml index f1b9a3350faf..b9e859ca7cf3 100644 --- a/extension/jaegerremotesampling/metadata.yaml +++ b/extension/jaegerremotesampling/metadata.yaml @@ -1,5 +1,4 @@ type: jaegerremotesampling -scope_name: otelcol/jaegerremotesampling status: class: extension diff --git a/extension/oauth2clientauthextension/README.md b/extension/oauth2clientauthextension/README.md index 28fc4a916313..5d3bed1f375e 100644 --- a/extension/oauth2clientauthextension/README.md +++ b/extension/oauth2clientauthextension/README.md @@ -3,12 +3,13 @@ | Status | | | ------------- |-----------| | Stability | [beta] | -| Distributions | [contrib] | +| Distributions | [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Foauth2clientauth%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Foauth2clientauth) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Foauth2clientauth%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Foauth2clientauth) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@pavankrish123](https://www.github.com/pavankrish123), [@jpkrohling](https://www.github.com/jpkrohling) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s diff --git a/extension/oauth2clientauthextension/config.go b/extension/oauth2clientauthextension/config.go index ea99916f4d73..ad4758052d2f 100644 --- a/extension/oauth2clientauthextension/config.go +++ b/extension/oauth2clientauthextension/config.go @@ -21,7 +21,6 @@ var ( // Config stores the configuration for OAuth2 Client Credentials (2-legged OAuth2 flow) setup. type Config struct { - // ClientID is the application's ID. // See https://datatracker.ietf.org/doc/html/rfc6749#section-2.2 ClientID string `mapstructure:"client_id"` diff --git a/extension/oauth2clientauthextension/config_test.go b/extension/oauth2clientauthextension/config_test.go index 2d2a9b73fa84..29bb97401169 100644 --- a/extension/oauth2clientauthextension/config_test.go +++ b/extension/oauth2clientauthextension/config_test.go @@ -78,7 +78,7 @@ func TestLoadConfig(t *testing.T) { cfg := factory.CreateDefaultConfig() sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) if tt.expectedErr != nil { assert.ErrorIs(t, component.ValidateConfig(cfg), tt.expectedErr) return diff --git a/extension/oauth2clientauthextension/extension_test.go b/extension/oauth2clientauthextension/extension_test.go index 7a20a24616c0..0444f370728e 100644 --- a/extension/oauth2clientauthextension/extension_test.go +++ b/extension/oauth2clientauthextension/extension_test.go @@ -11,8 +11,7 @@ import ( "testing" "github.com/stretchr/testify/assert" - "go.opentelemetry.io/collector/component/componenttest" - "go.opentelemetry.io/collector/config/confighttp" + "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/config/configtls" "go.uber.org/zap" "golang.org/x/oauth2" @@ -83,8 +82,7 @@ func TestOAuthClientSettings(t *testing.T) { t.Run(test.name, func(t *testing.T) { rc, err := newClientAuthenticator(test.settings, zap.NewNop()) if test.shouldError { - assert.Error(t, err) - assert.Contains(t, err.Error(), test.expectedError) + assert.ErrorContains(t, err, test.expectedError) return } assert.NoError(t, err) @@ -117,7 +115,7 @@ func TestOAuthClientSettingsCredsConfig(t *testing.T) { settings *Config expectedClientConfig *clientcredentials.Config shouldError bool - expectedError *error + expectedError error }{ { name: "client_id_file", @@ -152,7 +150,7 @@ func TestOAuthClientSettingsCredsConfig(t *testing.T) { ClientSecret: "testsecret", }, shouldError: true, - expectedError: &errNoClientIDProvided, + expectedError: errNoClientIDProvided, }, { name: "missing_client_creds_file", @@ -161,7 +159,7 @@ func TestOAuthClientSettingsCredsConfig(t *testing.T) { ClientSecretFile: testCredsMissingFile, }, shouldError: true, - expectedError: &errNoClientSecretProvided, + expectedError: errNoClientSecretProvided, }, } @@ -171,7 +169,7 @@ func TestOAuthClientSettingsCredsConfig(t *testing.T) { cfg, err := rc.clientCredentials.createConfig() if test.shouldError { assert.Error(t, err) - assert.ErrorAs(t, err, test.expectedError) + assert.ErrorIs(t, err, test.expectedError) return } assert.NoError(t, err) @@ -275,42 +273,42 @@ func TestOAuth2PerRPCCredentials(t *testing.T) { func TestFailContactingOAuth(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { - w.WriteHeader(200) + w.WriteHeader(http.StatusOK) _, err := w.Write([]byte("not-json")) assert.NoError(t, err) })) defer server.Close() serverURL, err := url.Parse(server.URL) - assert.NoError(t, err) + require.NoError(t, err) oauth2Authenticator, err := newClientAuthenticator(&Config{ ClientID: "dummy", ClientSecret: "ABC", TokenURL: serverURL.String(), }, zap.NewNop()) - assert.NoError(t, err) + require.NoError(t, err) // Test for gRPC connections credential, err := oauth2Authenticator.perRPCCredentials() - assert.NoError(t, err) + require.NoError(t, err) _, err = credential.GetRequestMetadata(context.Background()) assert.ErrorIs(t, err, errFailedToGetSecurityToken) - assert.Contains(t, err.Error(), serverURL.String()) + assert.ErrorContains(t, err, serverURL.String()) - // Test for HTTP connections - setting := confighttp.ClientConfig{ - Endpoint: "http://example.com/", - CustomRoundTripper: func(next http.RoundTripper) (http.RoundTripper, error) { - return oauth2Authenticator.roundTripper(next) - }, + transport := http.DefaultTransport.(*http.Transport).Clone() + baseRoundTripper := (http.RoundTripper)(transport) + roundTripper, err := oauth2Authenticator.roundTripper(baseRoundTripper) + require.NoError(t, err) + + client := &http.Client{ + Transport: roundTripper, } - client, _ := setting.ToClient(context.Background(), componenttest.NewNopHost(), componenttest.NewNopTelemetrySettings()) - req, err := http.NewRequest("POST", setting.Endpoint, nil) - assert.NoError(t, err) + req, err := http.NewRequest(http.MethodPost, "http://example.com/", nil) + require.NoError(t, err) _, err = client.Do(req) assert.ErrorIs(t, err, errFailedToGetSecurityToken) - assert.Contains(t, err.Error(), serverURL.String()) + assert.ErrorContains(t, err, serverURL.String()) } diff --git a/extension/oauth2clientauthextension/factory.go b/extension/oauth2clientauthextension/factory.go index ea799d42cb58..a33f6f44a67a 100644 --- a/extension/oauth2clientauthextension/factory.go +++ b/extension/oauth2clientauthextension/factory.go @@ -27,7 +27,7 @@ func createDefaultConfig() component.Config { return &Config{} } -func createExtension(_ context.Context, set extension.CreateSettings, cfg component.Config) (extension.Extension, error) { +func createExtension(_ context.Context, set extension.Settings, cfg component.Config) (extension.Extension, error) { ca, err := newClientAuthenticator(cfg.(*Config), set.Logger) if err != nil { return nil, err diff --git a/extension/oauth2clientauthextension/factory_test.go b/extension/oauth2clientauthextension/factory_test.go index 76a23f690d46..92aa278d253d 100644 --- a/extension/oauth2clientauthextension/factory_test.go +++ b/extension/oauth2clientauthextension/factory_test.go @@ -24,7 +24,7 @@ func TestCreateDefaultConfig(t *testing.T) { assert.NoError(t, componenttest.CheckConfigStruct(cfg)) } -func TestCreateExtension(t *testing.T) { +func TestCreate(t *testing.T) { cfg := createDefaultConfig().(*Config) tests := []struct { @@ -51,7 +51,7 @@ func TestCreateExtension(t *testing.T) { cfg.ClientSecret = testcase.settings.ClientSecret cfg.TokenURL = testcase.settings.TokenURL cfg.Scopes = testcase.settings.Scopes - ext, err := createExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + ext, err := createExtension(context.Background(), extensiontest.NewNopSettings(), cfg) if testcase.shouldError { assert.Error(t, err) assert.Nil(t, ext) diff --git a/extension/oauth2clientauthextension/generated_component_test.go b/extension/oauth2clientauthextension/generated_component_test.go index ecc65348c2c9..c43b00dd26b8 100644 --- a/extension/oauth2clientauthextension/generated_component_test.go +++ b/extension/oauth2clientauthextension/generated_component_test.go @@ -30,18 +30,18 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) t.Run("shutdown", func(t *testing.T) { - e, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + e, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) err = e.Shutdown(context.Background()) require.NoError(t, err) }) t.Run("lifecycle", func(t *testing.T) { - firstExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + firstExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, firstExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, firstExt.Shutdown(context.Background())) - secondExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + secondExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, secondExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, secondExt.Shutdown(context.Background())) diff --git a/extension/oauth2clientauthextension/go.mod b/extension/oauth2clientauthextension/go.mod index fce779bbf101..c0ce3154af7b 100644 --- a/extension/oauth2clientauthextension/go.mod +++ b/extension/oauth2clientauthextension/go.mod @@ -1,68 +1,51 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/oauth2clientauthextension -go 1.21.0 +go 1.22.0 require ( - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/confighttp v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/config/configtls v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/collector/extension/auth v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/config/configtls v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/auth v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 - golang.org/x/oauth2 v0.20.0 - google.golang.org/grpc v1.64.0 + golang.org/x/oauth2 v0.24.0 + google.golang.org/grpc v1.68.1 ) require ( - cloud.google.com/go/compute/metadata v0.3.0 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect + cloud.google.com/go/compute/metadata v0.5.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/hashicorp/go-version v1.7.0 // indirect - github.com/klauspost/compress v1.17.8 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/rs/cors v1.10.1 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/protobuf v1.34.1 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/oauth2clientauthextension/go.sum b/extension/oauth2clientauthextension/go.sum index 0ef7c96322f5..a211c57ff0b0 100644 --- a/extension/oauth2clientauthextension/go.sum +++ b/extension/oauth2clientauthextension/go.sum @@ -1,44 +1,32 @@ -cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= -cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY= +cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= -github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= -github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -47,72 +35,44 @@ github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa1 github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -128,22 +88,22 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= -golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -152,12 +112,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/extension/oauth2clientauthextension/internal/metadata/generated_status.go b/extension/oauth2clientauthextension/internal/metadata/generated_status.go index dbb12e16ddc1..36e36ea45f4b 100644 --- a/extension/oauth2clientauthextension/internal/metadata/generated_status.go +++ b/extension/oauth2clientauthextension/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("oauth2client") + Type = component.MustNewType("oauth2client") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/oauth2clientauthextension" ) const ( diff --git a/extension/oauth2clientauthextension/internal/metadata/generated_telemetry.go b/extension/oauth2clientauthextension/internal/metadata/generated_telemetry.go deleted file mode 100644 index ed3d8c196bb3..000000000000 --- a/extension/oauth2clientauthextension/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/oauth2clientauth") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/oauth2clientauth") -} diff --git a/extension/oauth2clientauthextension/internal/metadata/generated_telemetry_test.go b/extension/oauth2clientauthextension/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index b4111fbcbaf3..000000000000 --- a/extension/oauth2clientauthextension/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/oauth2clientauth", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/oauth2clientauth", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/oauth2clientauthextension/metadata.yaml b/extension/oauth2clientauthextension/metadata.yaml index a3cc07c1a3d7..24bf3b0f8739 100644 --- a/extension/oauth2clientauthextension/metadata.yaml +++ b/extension/oauth2clientauthextension/metadata.yaml @@ -1,12 +1,10 @@ type: oauth2client -scope_name: otelcol/oauth2clientauth status: class: extension stability: beta: [extension] - distributions: - - contrib + distributions: [contrib, k8s] codeowners: active: [pavankrish123, jpkrohling] diff --git a/extension/observer/cfgardenobserver/Makefile b/extension/observer/cfgardenobserver/Makefile new file mode 100644 index 000000000000..bdd863a203be --- /dev/null +++ b/extension/observer/cfgardenobserver/Makefile @@ -0,0 +1 @@ +include ../../../Makefile.Common diff --git a/extension/observer/cfgardenobserver/README.md b/extension/observer/cfgardenobserver/README.md new file mode 100644 index 000000000000..787ca386fdd0 --- /dev/null +++ b/extension/observer/cfgardenobserver/README.md @@ -0,0 +1,76 @@ +# Cloud Foundry Garden Observer Extension + + +| Status | | +| ------------- |-----------| +| Stability | [development] | +| Distributions | [] | +| Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fcfgardenobserver%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fcfgardenobserver) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fcfgardenobserver%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fcfgardenobserver) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@crobert-1](https://www.github.com/crobert-1), [@cemdk](https://www.github.com/cemdk), [@m1rp](https://www.github.com/m1rp), [@jriguera](https://www.github.com/jriguera) | + +[development]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#development + + +Cloud Foundry (CF) is a platform as a service (PaaS) which has implemented their own container technology. The component in charge of providing a local API in each node (also known as "diego-cell") is named Garden. + +The `cfgarden_observer` looks at the current host to discover Garden containers. + +## Example Config + +```yaml +extensions: + cfgarden_observer: + refresh_interval: 30s + cache_sync_interval: 10m + include_app_labels: true + garden: + endpoint: my/path/to/garden.sock + cloud_foundry: + endpoint: https://api.cf.mydomain.com + auth: + type: client_credentials + client_id: myclientid + client_secret: myclientsecret + +receivers: + receiver_creator: + watch_observers: [cfgarden_observer] + receivers: + prometheus_simple: + rule: type == "container" && labels["prometheus.io/scrape"] == "true" + config: + metrics_path: /metrics + endpoint: '`endpoint`' +``` + +### Configuration + +| Name | Type | Default | Description | +| -------------------------------- | ------ | --------------------------------------------------------- | ------------------------------------------------------------------ | +| refresh_interval | string | 1m | Determines how often to look for changes in endpoints. | +| cache_sync_interval | string | 5m | Determines how often app metadata cache is refreshed | +| include_app_labels | bool | false | Determines whether or not app labels get added to container labels | +| garden.endpoint | string | /var/vcap/data/garden/garden.sock | Path to garden socket. | +| cloud_foundry.endpoint | string | none. required when `include_app_labels` is set to `true` | CloudFoundry API endpoint | +| cloud_foundry.auth.type | string | none. required when `include_app_labels` is set to `true` | Authentication type, one of: user_pass, client_credentials, token | +| cloud_foundry.auth.username | string | none | Username (auth.type: user_pass) | +| cloud_foundry.auth.password | string | none | Password (auth.type: user_pass) | +| cloud_foundry.auth.client_id | string | none | Client ID (auth.type: client_credentials) | +| cloud_foundry.auth.client_secret | string | none | Client Secret (auth.type: client_credentials) | +| cloud_foundry.auth.access_token | string | none | Access Token (auth.type: token) | +| cloud_foundry.auth.refresh_token | string | none | Refresh Token (auth.type: token) | + + +### Endpoint Variables + +Endpoint variables exposed by this observer are as follows. + +| Variable | Description | +| ------------ | --------------------------------------------------------------------------------- | +| type | This value is always `container` | +| name | Name of the Garden container associated to the port | +| labels | map[string]string with labels set on the log_config tags and application resource | +| port | Exposed port of the container | +| container_id | ID of the container | +| host | Hostname or IP of the underlying host the container is running on | +| transport | Transport protocol used by the endpoint (TCP or UDP) | diff --git a/extension/observer/cfgardenobserver/config.go b/extension/observer/cfgardenobserver/config.go new file mode 100644 index 000000000000..67085def9fe3 --- /dev/null +++ b/extension/observer/cfgardenobserver/config.go @@ -0,0 +1,124 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package cfgardenobserver // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/cfgardenobserver" + +import ( + "errors" + "fmt" + "time" +) + +// Config defines configuration for CF Garden observer. +type Config struct { + // CloudFoundry API Configuration + CloudFoundry CfConfig `mapstructure:"cloud_foundry"` + + // Garden API Configuration + Garden GardenConfig `mapstructure:"garden"` + + // RefreshInterval determines the frequency at which the observer + // needs to poll for collecting information about new processes. + // Default: "1m" + RefreshInterval time.Duration `mapstructure:"refresh_interval"` + + // The time to wait before resyncing app information on cached containers + // using the CloudFoundry API. + // Default: "5m" + CacheSyncInterval time.Duration `mapstructure:"cache_sync_interval"` + + // Determines whether or not Application labels get added to the Endpoint labels. + // This requires cloud_foundry to be configured, such that API calls can be made + // Default: false + IncludeAppLabels bool `mapstructure:"include_app_labels"` +} + +// Validate overrides the embedded noop validation so that load config can trigger +// our own validation logic. +func (config *Config) Validate() error { + if !config.IncludeAppLabels { + return nil + } + + c := config.CloudFoundry + if c.Endpoint == "" { + return errors.New("CloudFoundry.Endpoint must be specified when IncludeAppLabels is set to true") + } + if c.Auth.Type == "" { + return errors.New("CloudFoundry.Auth.Type must be specified when IncludeAppLabels is set to true") + } + + switch c.Auth.Type { + case authTypeUserPass: + if c.Auth.Username == "" { + return fieldError(authTypeUserPass, "username") + } + if c.Auth.Password == "" { + return fieldError(authTypeUserPass, "password") + } + case authTypeClientCredentials: + if c.Auth.ClientID == "" { + return fieldError(authTypeClientCredentials, "client_id") + } + if c.Auth.ClientSecret == "" { + return fieldError(authTypeClientCredentials, "client_secret") + } + case authTypeToken: + if c.Auth.AccessToken == "" { + return fieldError(authTypeToken, "access_token") + } + if c.Auth.RefreshToken == "" { + return fieldError(authTypeToken, "refresh_token") + } + default: + return fmt.Errorf("configuration option `auth_type` must be set to one of the following values: [user_pass, client_credentials, token]. Specified value: %s", c.Auth.Type) + } + + return nil +} + +func fieldError(authType authType, param string) error { + return fmt.Errorf("%s is required when using auth_type: %s", param, authType) +} + +type GardenConfig struct { + // The URL of the CF Garden api. Default is "/var/vcap/data/garden/garden.sock" + Endpoint string `mapstructure:"endpoint"` +} + +type CfConfig struct { + // The URL of the CloudFoundry API + Endpoint string `mapstructure:"endpoint"` + + // Authentication details + Auth CfAuth `mapstructure:"auth"` +} + +type CfAuth struct { + // Authentication method, there are 3 options + Type authType `mapstructure:"type"` + + // Used for user_pass authentication method + Username string `mapstructure:"username"` + Password string `mapstructure:"password"` + + // Used for token authentication method + AccessToken string `mapstructure:"access_token"` + RefreshToken string `mapstructure:"refresh_token"` + + // Used for client_credentials authentication method + ClientID string `mapstructure:"client_id"` + ClientSecret string `mapstructure:"client_secret"` +} + +// authType describes the type of authentication to use for the CloudFoundry API +type authType string + +const ( + // authTypeClientCredentials uses a client ID and client secret to authenticate + authTypeClientCredentials authType = "client_credentials" + // authTypeUserPass uses username and password to authenticate + authTypeUserPass authType = "user_pass" + // authTypeToken uses access token and refresh token to authenticate + authTypeToken authType = "token" +) diff --git a/extension/observer/cfgardenobserver/config_test.go b/extension/observer/cfgardenobserver/config_test.go new file mode 100644 index 000000000000..e747d003c218 --- /dev/null +++ b/extension/observer/cfgardenobserver/config_test.go @@ -0,0 +1,223 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package cfgardenobserver + +import ( + "path/filepath" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/confmap" + "go.opentelemetry.io/collector/confmap/confmaptest" + + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/cfgardenobserver/internal/metadata" +) + +func TestLoadConfig(t *testing.T) { + t.Parallel() + + tests := []struct { + id component.ID + expected component.Config + }{ + { + id: component.NewID(metadata.Type), + expected: &Config{ + RefreshInterval: 1 * time.Minute, + CacheSyncInterval: 5 * time.Minute, + IncludeAppLabels: false, + Garden: GardenConfig{ + Endpoint: "/var/vcap/data/garden/garden.sock", + }, + }, + }, + { + id: component.NewIDWithName(metadata.Type, "all_settings"), + expected: &Config{ + RefreshInterval: 20 * time.Second, + CacheSyncInterval: 5 * time.Second, + IncludeAppLabels: true, + Garden: GardenConfig{ + Endpoint: "/var/vcap/data/garden/custom.sock", + }, + CloudFoundry: CfConfig{ + Endpoint: "https://api.cf.mydomain.com", + Auth: CfAuth{ + Type: "user_pass", + Username: "myuser", + Password: "mypass", + }, + }, + }, + }, + { + id: component.NewIDWithName(metadata.Type, "user_pass"), + expected: &Config{ + Garden: GardenConfig{ + Endpoint: "/var/vcap/data/garden/garden.sock", + }, + RefreshInterval: 1 * time.Minute, + CacheSyncInterval: 5 * time.Minute, + IncludeAppLabels: true, + CloudFoundry: CfConfig{ + Endpoint: "https://api.cf.mydomain.com", + Auth: CfAuth{ + Type: "user_pass", + Username: "myuser", + Password: "mypass", + }, + }, + }, + }, + { + id: component.NewIDWithName(metadata.Type, "client_credentials"), + expected: &Config{ + Garden: GardenConfig{ + Endpoint: "/var/vcap/data/garden/garden.sock", + }, + RefreshInterval: 1 * time.Minute, + CacheSyncInterval: 5 * time.Minute, + IncludeAppLabels: true, + CloudFoundry: CfConfig{ + Endpoint: "https://api.cf.mydomain.com", + Auth: CfAuth{ + Type: "client_credentials", + ClientID: "myclientid", + ClientSecret: "myclientsecret", + }, + }, + }, + }, + { + id: component.NewIDWithName(metadata.Type, "token"), + expected: &Config{ + Garden: GardenConfig{ + Endpoint: "/var/vcap/data/garden/garden.sock", + }, + RefreshInterval: 1 * time.Minute, + CacheSyncInterval: 5 * time.Minute, + IncludeAppLabels: true, + CloudFoundry: CfConfig{ + Endpoint: "https://api.cf.mydomain.com", + Auth: CfAuth{ + Type: "token", + AccessToken: "myaccesstoken", + RefreshToken: "myrefreshtoken", + }, + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.id.String(), func(t *testing.T) { + cfg := loadConfig(t, tt.id) + assert.NoError(t, component.ValidateConfig(cfg)) + assert.Equal(t, tt.expected, cfg) + }) + } +} + +func TestConfigValidate(t *testing.T) { + cases := []struct { + reason string + cfg Config + msg string + }{ + { + reason: "missing endpoint", + cfg: Config{ + IncludeAppLabels: true, + }, + msg: "CloudFoundry.Endpoint must be specified when IncludeAppLabels is set to true", + }, + { + reason: "missing cloud_foundry.auth.type", + cfg: Config{ + IncludeAppLabels: true, + CloudFoundry: CfConfig{ + Endpoint: "https://api.cf.mydomain.com", + }, + }, + msg: "CloudFoundry.Auth.Type must be specified when IncludeAppLabels is set to true", + }, + { + reason: "unknown cloud_foundry.auth.type", + cfg: Config{ + IncludeAppLabels: true, + CloudFoundry: CfConfig{ + Endpoint: "https://api.cf.mydomain.com", + Auth: CfAuth{ + Type: "unknown", + }, + }, + }, + msg: "configuration option `auth_type` must be set to one of the following values: [user_pass, client_credentials, token]. Specified value: unknown", + }, + { + reason: "missing username", + cfg: Config{ + IncludeAppLabels: true, + CloudFoundry: CfConfig{ + Endpoint: "https://api.cf.mydomain.com", + Auth: CfAuth{ + Type: authTypeUserPass, + }, + }, + }, + msg: fieldError(authTypeUserPass, "username").Error(), + }, + { + reason: "missing clientID", + cfg: Config{ + IncludeAppLabels: true, + CloudFoundry: CfConfig{ + Endpoint: "https://api.cf.mydomain.com", + Auth: CfAuth{ + Type: authTypeClientCredentials, + }, + }, + }, + msg: fieldError(authTypeClientCredentials, "client_id").Error(), + }, + { + reason: "missing AccessToken", + cfg: Config{ + IncludeAppLabels: true, + CloudFoundry: CfConfig{ + Endpoint: "https://api.cf.mydomain.com", + Auth: CfAuth{ + Type: authTypeToken, + }, + }, + }, + msg: fieldError(authTypeToken, "access_token").Error(), + }, + } + + for _, tCase := range cases { + t.Run(tCase.reason, func(t *testing.T) { + err := tCase.cfg.Validate() + require.EqualError(t, err, tCase.msg) + }) + } +} + +func loadRawConf(tb testing.TB, path string, id component.ID) *confmap.Conf { + cm, err := confmaptest.LoadConf(filepath.Join("testdata", path)) + require.NoError(tb, err) + sub, err := cm.Sub(id.String()) + require.NoError(tb, err) + return sub +} + +func loadConfig(tb testing.TB, id component.ID) *Config { + factory := NewFactory() + cfg := factory.CreateDefaultConfig() + sub := loadRawConf(tb, "config.yaml", id) + require.NoError(tb, sub.Unmarshal(cfg)) + return cfg.(*Config) +} diff --git a/extension/observer/cfgardenobserver/doc.go b/extension/observer/cfgardenobserver/doc.go new file mode 100644 index 000000000000..f82e31763d3a --- /dev/null +++ b/extension/observer/cfgardenobserver/doc.go @@ -0,0 +1,6 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +//go:generate mdatagen metadata.yaml + +package cfgardenobserver // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/cfgardenobserver" diff --git a/extension/observer/cfgardenobserver/extension.go b/extension/observer/cfgardenobserver/extension.go new file mode 100644 index 000000000000..5e247ab19a1e --- /dev/null +++ b/extension/observer/cfgardenobserver/extension.go @@ -0,0 +1,333 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package cfgardenobserver // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/cfgardenobserver" + +import ( + "context" + "encoding/json" + "fmt" + "strconv" + "strings" + "sync" + "time" + + "code.cloudfoundry.org/garden" + gardenClient "code.cloudfoundry.org/garden/client" + gardenConnection "code.cloudfoundry.org/garden/client/connection" + "github.com/cloudfoundry/go-cfclient/v3/client" + "github.com/cloudfoundry/go-cfclient/v3/config" + "github.com/cloudfoundry/go-cfclient/v3/resource" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/extension" + "go.uber.org/zap" + + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer" +) + +const ( + propertiesAppIDKey = "network.app_id" + propertiesPortsKey = "network.ports" + propertiesLogConfigKey = "log_config" + logConfigTagsKey = "tags" + containerStateActive = "active" +) + +type cfGardenObserver struct { + *observer.EndpointsWatcher + config *Config + doneChan chan struct{} + logger *zap.Logger + once *sync.Once + + garden garden.Client + cf *client.Client + + containerMu sync.RWMutex + containers map[string]garden.ContainerInfo + + appMu sync.RWMutex + apps map[string]*resource.App +} + +var _ extension.Extension = (*cfGardenObserver)(nil) + +func newObserver(config *Config, logger *zap.Logger) (extension.Extension, error) { + g := &cfGardenObserver{ + config: config, + logger: logger, + once: &sync.Once{}, + containers: make(map[string]garden.ContainerInfo), + apps: make(map[string]*resource.App), + doneChan: make(chan struct{}), + } + g.EndpointsWatcher = observer.NewEndpointsWatcher(g, config.RefreshInterval, logger) + return g, nil +} + +func (g *cfGardenObserver) SyncApps() error { + g.containerMu.RLock() + containers := g.containers + g.containerMu.RUnlock() + + g.appMu.Lock() + defer g.appMu.Unlock() + g.apps = make(map[string]*resource.App) + for _, info := range containers { + appID, ok := info.Properties[propertiesAppIDKey] + if !ok { + return fmt.Errorf("container properties do not have a `%s` field, required to fetch application labels", propertiesAppIDKey) + } + + if _, ok := g.apps[appID]; ok { + continue + } + + app, err := g.cf.Applications.Get(context.Background(), appID) + if err != nil { + return fmt.Errorf("error fetching application: %w", err) + } + g.apps[appID] = app + } + + return nil +} + +func (g *cfGardenObserver) App(info garden.ContainerInfo) (*resource.App, error) { + appID, ok := info.Properties[propertiesAppIDKey] + if !ok { + return nil, fmt.Errorf("container properties do not have a `%s` field, required to fetch application labels", propertiesAppIDKey) + } + + g.appMu.Lock() + defer g.appMu.Unlock() + app, ok := g.apps[appID] + if ok { + return app, nil + } + + app, err := g.cf.Applications.Get(context.Background(), appID) + if err != nil { + return nil, err + } + g.apps[appID] = app + + return app, nil +} + +func (g *cfGardenObserver) Start(_ context.Context, _ component.Host) error { + g.garden = gardenClient.New(gardenConnection.New("unix", g.config.Garden.Endpoint)) + + var err error + g.cf, err = newCfClient(g.config.CloudFoundry) + if err != nil { + return err + } + + if g.config.IncludeAppLabels { + g.once.Do( + func() { + go func() { + cacheRefreshTicker := time.NewTicker(g.config.CacheSyncInterval) + defer cacheRefreshTicker.Stop() + + for { + select { + case <-g.doneChan: + return + case <-cacheRefreshTicker.C: + err = g.SyncApps() + if err != nil { + g.logger.Error("could not sync app cache", zap.Error(err)) + } + } + } + }() + }, + ) + } + + return nil +} + +func (g *cfGardenObserver) Shutdown(_ context.Context) error { + close(g.doneChan) + return nil +} + +func (g *cfGardenObserver) ListEndpoints() []observer.Endpoint { + var endpoints []observer.Endpoint + + containers, err := g.garden.Containers(garden.Properties{}) + if err != nil { + g.logger.Error("could not list containers", zap.Error(err)) + return endpoints + } + + infos := make(map[string]garden.ContainerInfo) + for _, c := range containers { + info, err := c.Info() + if err != nil { + g.logger.Error("error getting container info", zap.String("handle", c.Handle()), zap.Error(err)) + continue + } + + if info.State != containerStateActive { + continue + } + + endpoints = append(endpoints, g.containerEndpoints(c.Handle(), info)...) + infos[c.Handle()] = info + } + + go g.updateContainerCache(infos) + return endpoints +} + +// containerEndpoints generates a list of observer.Endpoint for a container, +// this is because a container might have more than one exposed ports +func (g *cfGardenObserver) containerEndpoints(handle string, info garden.ContainerInfo) []observer.Endpoint { + portsProp, ok := info.Properties[propertiesPortsKey] + if !ok { + g.logger.Error("could not discover container ports") + return nil + } + ports := strings.Split(portsProp, ",") + + var app *resource.App + var err error + if g.config.IncludeAppLabels { + app, err = g.App(info) + if err != nil { + g.logger.Error("error fetching application", zap.Error(err)) + return nil + } + } + + endpoints := []observer.Endpoint{} + for _, portString := range ports { + var port uint64 + port, err = strconv.ParseUint(portString, 10, 16) + if err != nil { + g.logger.Error("container port is not valid", zap.Error(err)) + continue + } + + details := &observer.Container{ + Name: handle, + ContainerID: handle, + Host: info.ContainerIP, + Port: uint16(port), + Transport: observer.ProtocolTCP, + Labels: g.containerLabels(info, app), + } + + endpoint := observer.Endpoint{ + ID: observer.EndpointID(fmt.Sprintf("%s:%d", details.ContainerID, details.Port)), + Target: fmt.Sprintf("%s:%d", details.Host, details.Port), + Details: details, + } + endpoints = append(endpoints, endpoint) + } + return endpoints +} + +func (g *cfGardenObserver) containerLabels(info garden.ContainerInfo, app *resource.App) map[string]string { + labels := make(map[string]string) + tags, err := parseTags(info) + if err != nil { + g.logger.Warn("not able to parse container tags into labels", zap.Error(err)) + return nil + } + for k, v := range tags { + labels[k] = v + } + + if app != nil { + for k, v := range app.Metadata.Labels { + labels[k] = *v + } + } + + return labels +} + +// The info.Properties contains a key called "log_config", which +// has contents that look like the following JSON encoded string: +// +// { +// "guid": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", +// "index": 0, +// "source_name": "CELL", +// "tags": { +// "app_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", +// "app_name": "example-app", +// "instance_id": "0", +// "organization_id": "11111111-2222-3333-4444-555555555555", +// "organization_name": "example-org", +// "process_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", +// "process_instance_id": "abcdef12-3456-7890-abcd-ef1234567890", +// "process_type": "web", +// "source_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", +// "space_id": "99999999-8888-7777-6666-555555555555", +// "space_name": "example-space" +// } +// } +// +// We parse only the tags into a map, to be used as labels +func parseTags(info garden.ContainerInfo) (map[string]string, error) { + logConfig, ok := info.Properties[propertiesLogConfigKey] + if !ok { + return nil, fmt.Errorf("container properties do not have a `%s` field", propertiesLogConfigKey) + } + + var data map[string]any + err := json.Unmarshal([]byte(logConfig), &data) + if err != nil { + return nil, fmt.Errorf("error unmarshaling logConfig: %w", err) + } + + tags, ok := data[logConfigTagsKey].(map[string]any) + if !ok { + return nil, fmt.Errorf("expected tags field to be a map. got=%T", data[logConfigTagsKey]) + } + + result := make(map[string]string) + for key, value := range tags { + if strValue, ok := value.(string); ok { + result[key] = strValue + } + } + + return result, nil +} + +func newCfClient(cfConfig CfConfig) (*client.Client, error) { + var cfg *config.Config + var err error + + switch cfConfig.Auth.Type { + case authTypeUserPass: + cfg, err = config.New(cfConfig.Endpoint, config.UserPassword(cfConfig.Auth.Username, cfConfig.Auth.Password)) + case authTypeClientCredentials: + cfg, err = config.New(cfConfig.Endpoint, config.ClientCredentials(cfConfig.Auth.ClientID, cfConfig.Auth.ClientSecret)) + case authTypeToken: + cfg, err = config.New(cfConfig.Endpoint, config.Token(cfConfig.Auth.AccessToken, cfConfig.Auth.RefreshToken)) + } + + if err != nil { + return nil, fmt.Errorf("error creating connection to CloudFoundry API: %w", err) + } + + c, err := client.New(cfg) + if err != nil { + return nil, err + } + return c, nil +} + +func (g *cfGardenObserver) updateContainerCache(infos map[string]garden.ContainerInfo) { + g.containerMu.Lock() + defer g.containerMu.Unlock() + g.containers = infos +} diff --git a/extension/observer/cfgardenobserver/extension_test.go b/extension/observer/cfgardenobserver/extension_test.go new file mode 100644 index 000000000000..5bbdc5cea5d2 --- /dev/null +++ b/extension/observer/cfgardenobserver/extension_test.go @@ -0,0 +1,247 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package cfgardenobserver + +import ( + "fmt" + "testing" + + "code.cloudfoundry.org/garden" + "github.com/cloudfoundry/go-cfclient/v3/resource" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.uber.org/zap" + + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer" + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/cfgardenobserver/internal/metadata" +) + +func strPtr(s string) *string { return &s } + +func TestContainerEndpoints(t *testing.T) { + handle := "14d91d46-6ebd-43a1-8e20-316d8e6a92a4" + ip := "1.2.3.4" + appID := "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" + logConfig := fmt.Sprintf(` +{ + "guid": "%s", + "index": 0, + "source_name": "CELL", + "tags": { + "app_id": "%s", + "app_name": "myapp" + } +} + `, handle, appID) + + tests := []struct { + name string + input garden.ContainerInfo + expected []observer.Endpoint + }{ + { + name: "single port", + input: garden.ContainerInfo{ + ContainerIP: ip, + Properties: map[string]string{ + "log_config": logConfig, + "network.ports": "8080", + "network.app_id": appID, + }, + }, + expected: []observer.Endpoint{ + { + ID: observer.EndpointID(fmt.Sprintf("%s:%d", handle, 8080)), + Target: fmt.Sprintf("%s:%d", ip, 8080), + Details: &observer.Container{ + Name: handle, + ContainerID: handle, + Host: ip, + Port: uint16(8080), + Transport: observer.ProtocolTCP, + Labels: map[string]string{ + "app_id": appID, + "app_name": "myapp", + }, + }, + }, + }, + }, + { + name: "multiple ports", + input: garden.ContainerInfo{ + ContainerIP: ip, + Properties: map[string]string{ + "log_config": logConfig, + "network.ports": "8080,9999", + "network.app_id": appID, + }, + }, + expected: []observer.Endpoint{ + { + ID: observer.EndpointID(fmt.Sprintf("%s:%d", handle, 8080)), + Target: fmt.Sprintf("%s:%d", ip, 8080), + Details: &observer.Container{ + Name: handle, + ContainerID: handle, + Host: ip, + Port: uint16(8080), + Transport: observer.ProtocolTCP, + Labels: map[string]string{ + "app_id": appID, + "app_name": "myapp", + }, + }, + }, + { + ID: observer.EndpointID(fmt.Sprintf("%s:%d", handle, 9999)), + Target: fmt.Sprintf("%s:%d", ip, 9999), + Details: &observer.Container{ + Name: handle, + ContainerID: handle, + Host: ip, + Port: uint16(9999), + Transport: observer.ProtocolTCP, + Labels: map[string]string{ + "app_id": appID, + "app_name": "myapp", + }, + }, + }, + }, + }, + } + + for _, tt := range tests { + config := loadConfig(t, component.NewID(metadata.Type)) + ext, err := newObserver(config, zap.NewNop()) + require.NoError(t, err) + require.NotNil(t, ext) + + obs, ok := ext.(*cfGardenObserver) + require.True(t, ok) + require.Equal(t, tt.expected, obs.containerEndpoints(handle, tt.input)) + } +} + +func TestIncludeAppLabels(t *testing.T) { + handle := "14d91d46-6ebd-43a1-8e20-316d8e6a92a4" + ip := "1.2.3.4" + appID := "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" + logConfig := fmt.Sprintf(` +{ + "guid": "%s", + "index": 0, + "source_name": "CELL", + "tags": { + "app_id": "%s", + "app_name": "myapp" + } +} + `, handle, appID) + input := garden.ContainerInfo{ + ContainerIP: ip, + Properties: map[string]string{ + "log_config": logConfig, + "network.ports": "8080", + "network.app_id": appID, + }, + } + expected := []observer.Endpoint{ + { + ID: observer.EndpointID(fmt.Sprintf("%s:%d", handle, 8080)), + Target: fmt.Sprintf("%s:%d", ip, 8080), + Details: &observer.Container{ + Name: handle, + ContainerID: handle, + Host: ip, + Port: uint16(8080), + Transport: observer.ProtocolTCP, + Labels: map[string]string{ + "app_id": appID, + "app_name": "myapp", + "app_label": "app_value", + "app_label2": "app_value2", + }, + }, + }, + } + + extAllSettings := loadConfig(t, component.NewIDWithName(metadata.Type, "all_settings")) + ext, err := newObserver(extAllSettings, zap.NewNop()) + require.NoError(t, err) + require.NotNil(t, ext) + + obs, ok := ext.(*cfGardenObserver) + obs.apps[appID] = &resource.App{ + Metadata: &resource.Metadata{ + Labels: map[string]*string{ + "app_label": strPtr("app_value"), + "app_label2": strPtr("app_value2"), + }, + }, + } + require.True(t, ok) + require.Equal(t, expected, obs.containerEndpoints(handle, input)) +} + +func TestContainerLabels(t *testing.T) { + info := garden.ContainerInfo{ + Properties: map[string]string{ + "log_config": ` +{ + "guid": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", + "index": 0, + "source_name": "CELL", + "tags": { + "app_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", + "app_name": "example-app", + "instance_id": "0", + "organization_id": "11111111-2222-3333-4444-555555555555", + "organization_name": "example-org", + "process_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", + "process_instance_id": "abcdef12-3456-7890-abcd-ef1234567890", + "process_type": "web", + "source_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", + "space_id": "99999999-8888-7777-6666-555555555555", + "space_name": "example-space" + } +} + `, + }, + } + app := &resource.App{ + Metadata: &resource.Metadata{ + Labels: map[string]*string{ + "key": strPtr("value"), + "key2": strPtr("value2"), + }, + }, + } + expected := map[string]string{ + "app_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", + "app_name": "example-app", + "instance_id": "0", + "organization_id": "11111111-2222-3333-4444-555555555555", + "organization_name": "example-org", + "process_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", + "process_instance_id": "abcdef12-3456-7890-abcd-ef1234567890", + "process_type": "web", + "source_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", + "space_id": "99999999-8888-7777-6666-555555555555", + "space_name": "example-space", + "key": "value", + "key2": "value2", + } + + factory := NewFactory() + ext, err := newObserver(factory.CreateDefaultConfig().(*Config), zap.NewNop()) + require.NoError(t, err) + require.NotNil(t, ext) + + obs, ok := ext.(*cfGardenObserver) + require.True(t, ok) + + require.Equal(t, expected, obs.containerLabels(info, app)) +} diff --git a/extension/observer/cfgardenobserver/factory.go b/extension/observer/cfgardenobserver/factory.go new file mode 100644 index 000000000000..2881e1029f00 --- /dev/null +++ b/extension/observer/cfgardenobserver/factory.go @@ -0,0 +1,48 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package cfgardenobserver // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/cfgardenobserver" + +import ( + "context" + "time" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/extension" + + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/cfgardenobserver/internal/metadata" +) + +const ( + defaultCollectionInterval = 1 * time.Minute + defaultCacheSyncInterval = 5 * time.Minute + defaultEndpoint = "/var/vcap/data/garden/garden.sock" +) + +// NewFactory creates a factory for CfGardenObserver extension. +func NewFactory() extension.Factory { + return extension.NewFactory( + metadata.Type, + createDefaultConfig, + createExtension, + metadata.ExtensionStability, + ) +} + +func createDefaultConfig() component.Config { + return &Config{ + RefreshInterval: defaultCollectionInterval, + CacheSyncInterval: defaultCacheSyncInterval, + Garden: GardenConfig{ + Endpoint: defaultEndpoint, + }, + } +} + +func createExtension( + _ context.Context, + settings extension.Settings, + cfg component.Config, +) (extension.Extension, error) { + return newObserver(cfg.(*Config), settings.Logger) +} diff --git a/extension/observer/cfgardenobserver/factory_test.go b/extension/observer/cfgardenobserver/factory_test.go new file mode 100644 index 000000000000..23b8ead01631 --- /dev/null +++ b/extension/observer/cfgardenobserver/factory_test.go @@ -0,0 +1,28 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package cfgardenobserver + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/extension/extensiontest" +) + +func TestValidConfig(t *testing.T) { + err := componenttest.CheckConfigStruct(createDefaultConfig()) + require.NoError(t, err) +} + +func TestCreateCFGardenObserver(t *testing.T) { + cfGardenObserver, err := createExtension( + context.Background(), + extensiontest.NewNopSettings(), + &Config{}, + ) + require.NoError(t, err) + require.NotNil(t, cfGardenObserver) +} diff --git a/extension/observer/cfgardenobserver/generated_component_test.go b/extension/observer/cfgardenobserver/generated_component_test.go new file mode 100644 index 000000000000..30f52c8571a5 --- /dev/null +++ b/extension/observer/cfgardenobserver/generated_component_test.go @@ -0,0 +1,18 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package cfgardenobserver + +import ( + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component/componenttest" +) + +func TestComponentFactoryType(t *testing.T) { + require.Equal(t, "cfgarden_observer", NewFactory().Type().String()) +} + +func TestComponentConfigStruct(t *testing.T) { + require.NoError(t, componenttest.CheckConfigStruct(NewFactory().CreateDefaultConfig())) +} diff --git a/extension/observer/cfgardenobserver/generated_package_test.go b/extension/observer/cfgardenobserver/generated_package_test.go new file mode 100644 index 000000000000..e3ca7f9b29c1 --- /dev/null +++ b/extension/observer/cfgardenobserver/generated_package_test.go @@ -0,0 +1,13 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package cfgardenobserver + +import ( + "testing" + + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + goleak.VerifyTestMain(m) +} diff --git a/extension/observer/cfgardenobserver/go.mod b/extension/observer/cfgardenobserver/go.mod new file mode 100644 index 000000000000..babd26e88b49 --- /dev/null +++ b/extension/observer/cfgardenobserver/go.mod @@ -0,0 +1,63 @@ +module github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/cfgardenobserver + +go 1.22.0 + +require ( + code.cloudfoundry.org/garden v0.0.0-20241023020423-a21e43a17f84 + github.com/cloudfoundry/go-cfclient/v3 v3.0.0-alpha.9 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 + go.uber.org/goleak v1.3.0 + go.uber.org/zap v1.27.0 +) + +require ( + code.cloudfoundry.org/lager/v3 v3.11.0 // indirect + github.com/bmizerany/pat v0.0.0-20210406213842-e4b6760bdd6f // indirect + github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab // indirect + github.com/go-task/slim-sprig/v3 v3.0.0 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/google/pprof v0.0.0-20241023014458-598669927662 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/knadh/koanf/maps v0.1.1 // indirect + github.com/knadh/koanf/providers/confmap v0.1.0 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect + github.com/martini-contrib/render v0.0.0-20150707142108-ec18f8345a11 // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/nxadm/tail v1.4.11 // indirect + github.com/onsi/ginkgo/v2 v2.20.2 // indirect + github.com/openzipkin/zipkin-go v0.4.3 // indirect + github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/tedsuo/rata v1.0.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/net v0.30.0 // indirect + golang.org/x/oauth2 v0.23.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.19.0 // indirect + golang.org/x/tools v0.26.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer => ../ diff --git a/extension/observer/cfgardenobserver/go.sum b/extension/observer/cfgardenobserver/go.sum new file mode 100644 index 000000000000..cd93288d7eca --- /dev/null +++ b/extension/observer/cfgardenobserver/go.sum @@ -0,0 +1,159 @@ +code.cloudfoundry.org/garden v0.0.0-20241023020423-a21e43a17f84 h1:ceT1k/IxtWDe2tNSbT7THT70MIzguBbdbuo09kTREy4= +code.cloudfoundry.org/garden v0.0.0-20241023020423-a21e43a17f84/go.mod h1:NFRJ0BR30ide5DZ2hgfjiODah9mQStc/Jx3jsMIf+ww= +code.cloudfoundry.org/lager/v3 v3.11.0 h1:YjRSl1USPIz1FFZPVvwFYgXUUodSIWDdXaLVvME3jZg= +code.cloudfoundry.org/lager/v3 v3.11.0/go.mod h1:8Ot/5fRETEzdf9U3N1kCWp00oZteNwew5Cl2Ck3t2ho= +github.com/bmizerany/pat v0.0.0-20210406213842-e4b6760bdd6f h1:gOO/tNZMjjvTKZWpY7YnXC72ULNLErRtp94LountVE8= +github.com/bmizerany/pat v0.0.0-20210406213842-e4b6760bdd6f/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= +github.com/cloudfoundry/go-cfclient/v3 v3.0.0-alpha.9 h1:HK3+nJEPgwlhc5H74aw/V4mVowqWaTKGjHONdVQQ2Vw= +github.com/cloudfoundry/go-cfclient/v3 v3.0.0-alpha.9/go.mod h1:eUjFfpsU3lRv388wKlXMmkQfsJ9pveUHZEia7AoBCPY= +github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 h1:sDMmm+q/3+BukdIpxwO365v/Rbspp2Nt5XntgQRXq8Q= +github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab h1:xveKWz2iaueeTaUgdetzel+U7exyigDYBryyVfV/rZk= +github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/pprof v0.0.0-20241023014458-598669927662 h1:SKMkD83p7FwUqKmBsPdLHF5dNyxq3jOWwu9w9UyH5vA= +github.com/google/pprof v0.0.0-20241023014458-598669927662/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= +github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= +github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= +github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/martini-contrib/render v0.0.0-20150707142108-ec18f8345a11 h1:YFh+sjyJTMQSYjKwM4dFKhJPJC/wfo98tPUc17HdoYw= +github.com/martini-contrib/render v0.0.0-20150707142108-ec18f8345a11/go.mod h1:Ah2dBMoxZEqk118as2T4u4fjfXarE0pPnMJaArZQZsI= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= +github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.20.2 h1:7NVCeyIWROIAheY21RLS+3j2bb52W0W82tkberYytp4= +github.com/onsi/ginkgo/v2 v2.20.2/go.mod h1:K9gyxPIlb+aIvnZ8bd9Ak+YP18w3APlR+5coaZoE2ag= +github.com/onsi/gomega v1.34.2 h1:pNCwDkzrsv7MS9kpaQvVb1aVLahQXyJ/Tv5oAZMI3i8= +github.com/onsi/gomega v1.34.2/go.mod h1:v1xfxRgk0KIsG+QOdm7p8UosrOzPYRo60fd3B/1Dukc= +github.com/openzipkin/zipkin-go v0.4.3 h1:9EGwpqkgnwdEIJ+Od7QVSEIH+ocmm5nPat0G7sjsSdg= +github.com/openzipkin/zipkin-go v0.4.3/go.mod h1:M9wCJZFWCo2RiY+o1eBCEMe0Dp2S5LDHcMZmk3RmK7c= +github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c h1:rp5dCmg/yLR3mgFuSOe4oEnDDmGLROTvMragMUXpTQw= +github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c/go.mod h1:X07ZCGwUbLaax7L0S3Tw4hpejzu63ZrrQiUe6W0hcy0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tedsuo/rata v1.0.0 h1:Sf9aZrYy6ElSTncjnGkyC2yuVvz5YJetBIUKJ4CmeKE= +github.com/tedsuo/rata v1.0.0/go.mod h1:X47ELzhOoLbfFIY0Cql9P6yo3Cdwf2CMX3FVZxRzJPc= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= +golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ= +golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 h1:zciRKQ4kBpFgpfC5QQCVtnnNAcLIqweL7plyZRQHVpI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/extension/observer/cfgardenobserver/internal/metadata/generated_status.go b/extension/observer/cfgardenobserver/internal/metadata/generated_status.go new file mode 100644 index 000000000000..b198899f25a8 --- /dev/null +++ b/extension/observer/cfgardenobserver/internal/metadata/generated_status.go @@ -0,0 +1,16 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "go.opentelemetry.io/collector/component" +) + +var ( + Type = component.MustNewType("cfgarden_observer") + ScopeName = "otelcol/cfgardenobserver" +) + +const ( + ExtensionStability = component.StabilityLevelDevelopment +) diff --git a/extension/observer/cfgardenobserver/metadata.yaml b/extension/observer/cfgardenobserver/metadata.yaml new file mode 100644 index 000000000000..30afcb4e273c --- /dev/null +++ b/extension/observer/cfgardenobserver/metadata.yaml @@ -0,0 +1,14 @@ +type: cfgarden_observer +scope_name: otelcol/cfgardenobserver + +status: + class: extension + stability: + development: [extension] + codeowners: + active: [crobert-1, cemdk, m1rp, jriguera] + +# We don't want to make actual connections to CloudFoundry api in our tests +tests: + skip_lifecycle: true + skip_shutdown: true diff --git a/extension/observer/cfgardenobserver/testdata/config.yaml b/extension/observer/cfgardenobserver/testdata/config.yaml new file mode 100644 index 000000000000..b8d9502727f7 --- /dev/null +++ b/extension/observer/cfgardenobserver/testdata/config.yaml @@ -0,0 +1,36 @@ +cfgarden_observer/all_settings: + cache_sync_interval: 5s + refresh_interval: 20s + include_app_labels: true + garden: + endpoint: /var/vcap/data/garden/custom.sock + cloud_foundry: + endpoint: https://api.cf.mydomain.com + auth: + type: user_pass + username: myuser + password: mypass +cfgarden_observer/user_pass: + include_app_labels: true + cloud_foundry: + endpoint: https://api.cf.mydomain.com + auth: + type: user_pass + username: myuser + password: mypass +cfgarden_observer/client_credentials: + include_app_labels: true + cloud_foundry: + endpoint: https://api.cf.mydomain.com + auth: + type: client_credentials + client_id: myclientid + client_secret: myclientsecret +cfgarden_observer/token: + include_app_labels: true + cloud_foundry: + endpoint: https://api.cf.mydomain.com + auth: + type: token + access_token: myaccesstoken + refresh_token: myrefreshtoken diff --git a/extension/observer/dockerobserver/README.md b/extension/observer/dockerobserver/README.md index 66c77fd5aa64..9289dd6b1e2e 100644 --- a/extension/observer/dockerobserver/README.md +++ b/extension/observer/dockerobserver/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fdockerobserver%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fdockerobserver) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fdockerobserver%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fdockerobserver) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@MovieStoreGuy](https://www.github.com/MovieStoreGuy) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib @@ -19,7 +19,7 @@ This observer watches the Docker engine's stream of events to dynamically create Requires Docker API Version 1.24+. The collector will need permissions to access the Docker Engine API, specifically it will need -read access to the Docker socket (default `unix:///var/run/docker.sock`). +read access to the Docker socket (default `unix:///var/run/docker.sock` on non-Windows and `npipe:////./pipe/docker_engine` on Windows). ## Example Config @@ -27,12 +27,12 @@ read access to the Docker socket (default `unix:///var/run/docker.sock`). ```yaml extensions: docker_observer: - # url of the docker socket, default to unix:///var/run/docker.sock + # url of the docker socket, defaults to unix:///var/run/docker.sock on non-Windows and npipe:////./pipe/docker_engine on Windows endpoint: my/path/to/docker.sock # list of container image names to exclude excluded_images: ['redis', 'another_image_name'] # client API version, default to 1.24 - api_version: 1.25 + api_version: "1.25" # max amount of time to wait for a response from Docker API , default to 5s timeout: 15s @@ -53,7 +53,7 @@ receivers: The URL of the docker server. -default: `unix:///var/run/docker.sock` +default: `unix:///var/run/docker.sock` on non-Windows and `npipe:////./pipe/docker_engine` on Windows ### `timeout` @@ -63,9 +63,9 @@ default: `5s` ### `api_version` -The client API version. If using one with a terminating zero, input as a string to prevent undesired truncation (e.g. `"1.40"` instead of `1.40`, which is parsed as `1.4`). +The client API version. Make sure you input it as a string instead of a float (e.g. `"1.4"` instead of `1.4`). -default: `1.24` +default: `"1.24"` ### `excluded_images` diff --git a/extension/observer/dockerobserver/config.go b/extension/observer/dockerobserver/config.go index 743a7cd9025a..cf7e1e61ee4c 100644 --- a/extension/observer/dockerobserver/config.go +++ b/extension/observer/dockerobserver/config.go @@ -4,24 +4,17 @@ package dockerobserver // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/dockerobserver" import ( - "errors" "fmt" "time" + "go.opentelemetry.io/collector/confmap" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/docker" ) // Config defines configuration for docker observer type Config struct { - - // The URL of the docker server. Default is "unix:///var/run/docker.sock" - Endpoint string `mapstructure:"endpoint"` - - // The maximum amount of time to wait for docker API responses. Default is 5s - Timeout time.Duration `mapstructure:"timeout"` - - // A list of filters whose matching images are to be excluded. Supports literals, globs, and regex. - ExcludedImages []string `mapstructure:"excluded_images"` + docker.Config `mapstructure:",squash"` // If true, the "Config.Hostname" field (if present) of the docker // container will be used as the discovered host that is used to configure @@ -44,15 +37,9 @@ type Config struct { // through the docker event listener example: cache_sync_interval: "20m" // Default: "60m" CacheSyncInterval time.Duration `mapstructure:"cache_sync_interval"` - - // Docker client API version. Default is 1.22 - DockerAPIVersion string `mapstructure:"api_version"` } func (config Config) Validate() error { - if config.Endpoint == "" { - return errors.New("endpoint must be specified") - } if err := docker.VersionIsValidAndGTE(config.DockerAPIVersion, minimumRequiredDockerAPIVersion); err != nil { return err } @@ -64,3 +51,16 @@ func (config Config) Validate() error { } return nil } + +func (config *Config) Unmarshal(conf *confmap.Conf) error { + err := conf.Unmarshal(config) + if err != nil { + return err + } + + if len(config.ExcludedImages) == 0 { + config.ExcludedImages = nil + } + + return err +} diff --git a/extension/observer/dockerobserver/config_test.go b/extension/observer/dockerobserver/config_test.go index 45c47720e063..5a9d9d686571 100644 --- a/extension/observer/dockerobserver/config_test.go +++ b/extension/observer/dockerobserver/config_test.go @@ -11,9 +11,11 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/confmap" "go.opentelemetry.io/collector/confmap/confmaptest" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/dockerobserver/internal/metadata" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/docker" ) var version = "1.40" @@ -33,26 +35,18 @@ func TestLoadConfig(t *testing.T) { { id: component.NewIDWithName(metadata.Type, "all_settings"), expected: &Config{ - Endpoint: "unix:///var/run/docker.sock", + Config: docker.Config{ + Endpoint: "unix:///var/run/docker.sock", + Timeout: 20 * time.Second, + ExcludedImages: []string{"excluded", "image"}, + DockerAPIVersion: version, + }, CacheSyncInterval: 5 * time.Minute, - Timeout: 20 * time.Second, - ExcludedImages: []string{"excluded", "image"}, UseHostnameIfPresent: true, UseHostBindings: true, IgnoreNonHostBindings: true, - DockerAPIVersion: version, }, }, - { - id: component.NewIDWithName(metadata.Type, "unsupported_api_version"), - expected: &Config{ - Endpoint: "unix:///var/run/docker.sock", - CacheSyncInterval: time.Hour, - Timeout: 5 * time.Second, - DockerAPIVersion: "1.4", - }, - expectedError: `"api_version" 1.4 must be at least 1.24`, - }, } for _, tt := range tests { t.Run(tt.id.String(), func(t *testing.T) { @@ -68,30 +62,48 @@ func TestLoadConfig(t *testing.T) { } func TestValidateConfig(t *testing.T) { - cfg := &Config{} + cfg := &Config{Config: docker.Config{DockerAPIVersion: "1.24", Timeout: 5 * time.Second}, CacheSyncInterval: 5 * time.Second} assert.Equal(t, "endpoint must be specified", component.ValidateConfig(cfg).Error()) - cfg = &Config{Endpoint: "someEndpoint", DockerAPIVersion: "1.23"} + cfg = &Config{Config: docker.Config{Endpoint: "someEndpoint", DockerAPIVersion: "1.23"}} assert.Equal(t, `"api_version" 1.23 must be at least 1.24`, component.ValidateConfig(cfg).Error()) - cfg = &Config{Endpoint: "someEndpoint", DockerAPIVersion: version} + cfg = &Config{Config: docker.Config{Endpoint: "someEndpoint", DockerAPIVersion: version}} assert.Equal(t, "timeout must be specified", component.ValidateConfig(cfg).Error()) - cfg = &Config{Endpoint: "someEndpoint", DockerAPIVersion: version, Timeout: 5 * time.Minute} + cfg = &Config{Config: docker.Config{Endpoint: "someEndpoint", DockerAPIVersion: version, Timeout: 5 * time.Minute}} assert.Equal(t, "cache_sync_interval must be specified", component.ValidateConfig(cfg).Error()) - cfg = &Config{Endpoint: "someEndpoint", DockerAPIVersion: version, Timeout: 5 * time.Minute, CacheSyncInterval: 5 * time.Minute} - assert.Nil(t, component.ValidateConfig(cfg)) + cfg = &Config{Config: docker.Config{Endpoint: "someEndpoint", DockerAPIVersion: version, Timeout: 5 * time.Minute}, CacheSyncInterval: 5 * time.Minute} + assert.NoError(t, component.ValidateConfig(cfg)) } -func loadConfig(t testing.TB, id component.ID) *Config { - cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml")) - require.NoError(t, err) - factory := NewFactory() - cfg := factory.CreateDefaultConfig() +func loadConf(tb testing.TB, path string, id component.ID) *confmap.Conf { + cm, err := confmaptest.LoadConf(filepath.Join("testdata", path)) + require.NoError(tb, err) sub, err := cm.Sub(id.String()) - require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(tb, err) + return sub +} +func loadConfig(tb testing.TB, id component.ID) *Config { + factory := NewFactory() + cfg := factory.CreateDefaultConfig() + sub := loadConf(tb, "config.yaml", id) + require.NoError(tb, sub.Unmarshal(cfg)) return cfg.(*Config) } + +func TestApiVersionCustomError(t *testing.T) { + sub := loadConf(t, "api_version_float.yaml", component.NewID(metadata.Type)) + factory := NewFactory() + cfg := factory.CreateDefaultConfig() + err := sub.Unmarshal(cfg) + assert.ErrorContains(t, err, + `Hint: You may want to wrap the 'api_version' value in quotes (api_version: "1.40")`, + ) + + sub = loadConf(t, "api_version_string.yaml", component.NewID(metadata.Type)) + err = sub.Unmarshal(cfg) + require.NoError(t, err) +} diff --git a/extension/observer/dockerobserver/extension.go b/extension/observer/dockerobserver/extension.go index 4d7932f2ddcf..f519ab815213 100644 --- a/extension/observer/dockerobserver/extension.go +++ b/extension/observer/dockerobserver/extension.go @@ -26,9 +26,11 @@ var ( minimumRequiredDockerAPIVersion = docker.MustNewAPIVersion(defaultDockerAPIVersion) ) -var _ extension.Extension = (*dockerObserver)(nil) -var _ observer.EndpointsLister = (*dockerObserver)(nil) -var _ observer.Observable = (*dockerObserver)(nil) +var ( + _ extension.Extension = (*dockerObserver)(nil) + _ observer.EndpointsLister = (*dockerObserver)(nil) + _ observer.Observable = (*dockerObserver)(nil) +) type dockerObserver struct { *observer.EndpointsWatcher @@ -60,11 +62,9 @@ func (d *dockerObserver) Start(ctx context.Context, _ component.Host) error { d.ctx = dCtx // Create new Docker client - dConfig, err := docker.NewConfig(d.config.Endpoint, d.config.Timeout, d.config.ExcludedImages, d.config.DockerAPIVersion) - if err != nil { - return err - } + dConfig := docker.NewConfig(d.config.Endpoint, d.config.Timeout, d.config.ExcludedImages, d.config.DockerAPIVersion) + var err error d.dClient, err = docker.NewDockerClient(dConfig, d.logger) if err != nil { return fmt.Errorf("could not create docker client: %w", err) @@ -104,6 +104,7 @@ func (d *dockerObserver) Start(ctx context.Context, _ component.Host) error { } func (d *dockerObserver) Shutdown(_ context.Context) error { + d.StopListAndWatch() d.cancel() return nil } @@ -119,7 +120,6 @@ func (d *dockerObserver) ListEndpoints() []observer.Endpoint { // containerEndpoints generates a list of observer.Endpoint given a Docker ContainerJSON. // This function will only generate endpoints if a container is in the Running state and not Paused. func (d *dockerObserver) containerEndpoints(c *dtypes.ContainerJSON) []observer.Endpoint { - if !c.State.Running || c.State.Running && c.State.Paused { return nil } diff --git a/extension/observer/dockerobserver/extension_test.go b/extension/observer/dockerobserver/extension_test.go index 0d8808ed79a6..0295e6766b5b 100644 --- a/extension/observer/dockerobserver/extension_test.go +++ b/extension/observer/dockerobserver/extension_test.go @@ -23,10 +23,7 @@ func containerJSON(t *testing.T) dtypes.ContainerJSON { require.NoError(t, err) var container dtypes.ContainerJSON - err = json.Unmarshal(containerRaw, &container) - if err != nil { - t.Fatal(err) - } + require.NoError(t, json.Unmarshal(containerRaw, &container)) return container } diff --git a/extension/observer/dockerobserver/factory.go b/extension/observer/dockerobserver/factory.go index 766098c1b702..20939da92018 100644 --- a/extension/observer/dockerobserver/factory.go +++ b/extension/observer/dockerobserver/factory.go @@ -7,10 +7,12 @@ import ( "context" "time" + "github.com/docker/docker/client" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/extension" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/dockerobserver/internal/metadata" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/docker" ) // NewFactory should be called to create a factory with default values. @@ -25,16 +27,18 @@ func NewFactory() extension.Factory { func createDefaultConfig() component.Config { return &Config{ - Endpoint: "unix:///var/run/docker.sock", - Timeout: 5 * time.Second, + Config: docker.Config{ + Endpoint: client.DefaultDockerHost, + Timeout: 5 * time.Second, + DockerAPIVersion: defaultDockerAPIVersion, + }, CacheSyncInterval: 60 * time.Minute, - DockerAPIVersion: defaultDockerAPIVersion, } } func createExtension( _ context.Context, - settings extension.CreateSettings, + settings extension.Settings, cfg component.Config, ) (extension.Extension, error) { config := cfg.(*Config) diff --git a/extension/observer/dockerobserver/factory_test.go b/extension/observer/dockerobserver/factory_test.go index ec13b819d59b..f18505fc8003 100644 --- a/extension/observer/dockerobserver/factory_test.go +++ b/extension/observer/dockerobserver/factory_test.go @@ -17,10 +17,10 @@ func TestValidConfig(t *testing.T) { require.NoError(t, err) } -func TestCreateExtension(t *testing.T) { +func TestCreate(t *testing.T) { dockerObserver, err := createExtension( context.Background(), - extensiontest.NewNopCreateSettings(), + extensiontest.NewNopSettings(), &Config{}, ) require.NoError(t, err) diff --git a/extension/observer/dockerobserver/generated_package_test.go b/extension/observer/dockerobserver/generated_package_test.go index feed8f51c9e2..219b1d2bfc25 100644 --- a/extension/observer/dockerobserver/generated_package_test.go +++ b/extension/observer/dockerobserver/generated_package_test.go @@ -9,5 +9,5 @@ import ( ) func TestMain(m *testing.M) { - goleak.VerifyTestMain(m) + goleak.VerifyTestMain(m, goleak.IgnoreTopFunction("net/http.(*persistConn).writeLoop"), goleak.IgnoreTopFunction("internal/poll.runtime_pollWait")) } diff --git a/extension/observer/dockerobserver/go.mod b/extension/observer/dockerobserver/go.mod index f112df11da7d..fa234f68ba4a 100644 --- a/extension/observer/dockerobserver/go.mod +++ b/extension/observer/dockerobserver/go.mod @@ -1,57 +1,57 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/dockerobserver -go 1.21.0 +go 1.22.0 require ( - github.com/docker/docker v25.0.5+incompatible + github.com/docker/docker v27.4.0+incompatible github.com/docker/go-connections v0.5.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/docker v0.102.0 - github.com/stretchr/testify v1.9.0 - github.com/testcontainers/testcontainers-go v0.31.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/docker v0.116.0 + github.com/stretchr/testify v1.10.0 + github.com/testcontainers/testcontainers-go v0.34.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) require ( dario.cat/mergo v1.0.0 // indirect + github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/Microsoft/hcsshim v0.11.4 // indirect - github.com/beorn7/perks v1.0.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/containerd/containerd v1.7.15 // indirect github.com/containerd/log v0.1.0 // indirect - github.com/cpuguy83/dockercfg v0.3.1 // indirect + github.com/containerd/platforms v0.2.1 // indirect + github.com/cpuguy83/dockercfg v0.3.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/distribution/reference v0.5.0 // indirect + github.com/distribution/reference v0.6.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gobwas/glob v0.2.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/klauspost/compress v1.17.2 // indirect + github.com/klauspost/compress v1.17.9 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/patternmatcher v0.6.0 // indirect github.com/moby/sys/sequential v0.5.0 // indirect github.com/moby/sys/user v0.1.0 // indirect + github.com/moby/sys/userns v0.1.0 // indirect github.com/moby/term v0.5.0 // indirect github.com/morikuni/aec v1.0.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect @@ -59,33 +59,30 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect github.com/shirou/gopsutil/v3 v3.23.12 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + go.opentelemetry.io/proto/otlp v1.0.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.22.0 // indirect - golang.org/x/mod v0.16.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.14.0 // indirect - golang.org/x/tools v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/observer/dockerobserver/go.sum b/extension/observer/dockerobserver/go.sum index a0960aa1ae95..077c5711c3cd 100644 --- a/extension/observer/dockerobserver/go.sum +++ b/extension/observer/dockerobserver/go.sum @@ -4,31 +4,25 @@ github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9 github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= -github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w= -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/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/containerd/containerd v1.7.15 h1:afEHXdil9iAm03BmhjzKyXnnEBtjaLJefdU7DV0IFes= -github.com/containerd/containerd v1.7.15/go.mod h1:ISzRRTMF8EXNpJlTzyr2XMhN+j9K302C21/+cr3kUnY= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= -github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= +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/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= -github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= -github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/docker v27.4.0+incompatible h1:I9z7sQ5qyzO0BfAb9IMOawRkAGxhYsidKiTMcm0DU+A= +github.com/docker/docker v27.4.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -36,18 +30,20 @@ github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= @@ -58,14 +54,14 @@ github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rH github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4= -github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -78,12 +74,16 @@ github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa1 github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= @@ -98,14 +98,6 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/shirou/gopsutil/v3 v3.23.12 h1:z90NtUkp3bMtmICZKpC4+WaknU1eXtp5vtbQ11DgpE4= @@ -125,10 +117,10 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/testcontainers/testcontainers-go v0.31.0 h1:W0VwIhcEVhRflwL9as3dhY6jXjVCA27AkmbnZ+UTh3U= -github.com/testcontainers/testcontainers-go v0.31.0/go.mod h1:D2lAoA0zUFiSY+eAflqK5mcUx/A5hrrORaEQrd0SefI= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/testcontainers/testcontainers-go v0.34.0 h1:5fbgF0vIN5u+nD3IWabQwRybuB4GY8G2HHgCkbMzMHo= +github.com/testcontainers/testcontainers-go v0.34.0/go.mod h1:6P/kMkQe8yqPHfPWNulFGdFHTD8HB2vLq/231xY2iPQ= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= @@ -137,34 +129,36 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 h1:Xw8U6u2f8DK2XAkGRFV7BBLENgnTGX9i4rQRxJf+/vs= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0/go.mod h1:6KW1Fm6R/s6Z3PGXwSJN2K4eT6wQB3vXX6CVnYX9NmM= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -176,23 +170,19 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= -golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -203,40 +193,37 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.4.0 h1:Z81tqI5ddIoXDPvVQ7/7CC9TnLM7ubaFG2qXYd5BbYY= golang.org/x/time v0.4.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= -golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 h1:Z0hjGZePRE0ZBWotvtrwxFNrNE9CUAGtplaDK5NNI/g= -google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 h1:RFiFrvy37/mpSpdySBDrUdipW/dHwsRwh3J3+A9VgT4= -google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237/go.mod h1:Z5Iiy3jtmioajWHDGFk7CeugTyHtPvMHA4UTmUkyalE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= -gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= diff --git a/extension/observer/dockerobserver/internal/metadata/generated_status.go b/extension/observer/dockerobserver/internal/metadata/generated_status.go index d9c1b08df1ad..f7fe1ce1ffb1 100644 --- a/extension/observer/dockerobserver/internal/metadata/generated_status.go +++ b/extension/observer/dockerobserver/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("docker_observer") + Type = component.MustNewType("docker_observer") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/dockerobserver" ) const ( diff --git a/extension/observer/dockerobserver/internal/metadata/generated_telemetry.go b/extension/observer/dockerobserver/internal/metadata/generated_telemetry.go deleted file mode 100644 index f2cf0f2bcb94..000000000000 --- a/extension/observer/dockerobserver/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/dockerobserver") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/dockerobserver") -} diff --git a/extension/observer/dockerobserver/internal/metadata/generated_telemetry_test.go b/extension/observer/dockerobserver/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 4b9bcbc3a872..000000000000 --- a/extension/observer/dockerobserver/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/dockerobserver", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/dockerobserver", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/observer/dockerobserver/metadata.yaml b/extension/observer/dockerobserver/metadata.yaml index 18524b5d25e8..ddacb2893032 100644 --- a/extension/observer/dockerobserver/metadata.yaml +++ b/extension/observer/dockerobserver/metadata.yaml @@ -1,5 +1,4 @@ type: docker_observer -scope_name: otelcol/dockerobserver status: class: extension @@ -12,4 +11,9 @@ status: # TODO: The tests are not passing on Windows. Either fix them or mark component as not supported on Windows. tests: skip_lifecycle: true - skip_shutdown: true \ No newline at end of file + skip_shutdown: true + goleak: + ignore: + top: + - "net/http.(*persistConn).writeLoop" + - "internal/poll.runtime_pollWait" diff --git a/extension/observer/dockerobserver/testdata/api_version_float.yaml b/extension/observer/dockerobserver/testdata/api_version_float.yaml new file mode 100644 index 000000000000..18f512e32e41 --- /dev/null +++ b/extension/observer/dockerobserver/testdata/api_version_float.yaml @@ -0,0 +1,2 @@ +docker_observer: + api_version: 1.40 diff --git a/extension/observer/dockerobserver/testdata/api_version_string.yaml b/extension/observer/dockerobserver/testdata/api_version_string.yaml new file mode 100644 index 000000000000..7f83b7ba30f7 --- /dev/null +++ b/extension/observer/dockerobserver/testdata/api_version_string.yaml @@ -0,0 +1,2 @@ +docker_observer: + api_version: "1.40" diff --git a/extension/observer/dockerobserver/testdata/config.yaml b/extension/observer/dockerobserver/testdata/config.yaml index 1e27aa54fdf0..1f82c45dfc12 100644 --- a/extension/observer/dockerobserver/testdata/config.yaml +++ b/extension/observer/dockerobserver/testdata/config.yaml @@ -16,6 +16,3 @@ docker_observer/ignore_non_host_bindings: ignore_non_host_bindings: true docker_observer/exclude_nginx: excluded_images: ["nginx"] -docker_observer/unsupported_api_version: - # intentionally a float since it will be parsed as 1.4 - api_version: 1.40 diff --git a/extension/observer/ecsobserver/README.md b/extension/observer/ecsobserver/README.md index 9d0bfc4462c4..b7708e3b7f1c 100644 --- a/extension/observer/ecsobserver/README.md +++ b/extension/observer/ecsobserver/README.md @@ -6,9 +6,10 @@ | Stability | [beta] | | Distributions | [contrib] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fecsobserver%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fecsobserver) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fecsobserver%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fecsobserver) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@dmitryax](https://www.github.com/dmitryax), [@rmfitzpatrick](https://www.github.com/rmfitzpatrick) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@dmitryax](https://www.github.com/dmitryax) | +| Emeritus | [@rmfitzpatrick](https://www.github.com/rmfitzpatrick) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib diff --git a/extension/observer/ecsobserver/config.go b/extension/observer/ecsobserver/config.go index 0633995a25db..15615c1b3770 100644 --- a/extension/observer/ecsobserver/config.go +++ b/extension/observer/ecsobserver/config.go @@ -17,7 +17,6 @@ const ( ) type Config struct { - // ClusterName is the target ECS cluster name for service discovery. ClusterName string `mapstructure:"cluster_name" yaml:"cluster_name"` // ClusterRegion is the target ECS cluster's AWS region. diff --git a/extension/observer/ecsobserver/config_test.go b/extension/observer/ecsobserver/config_test.go index eef16a735570..c838cea10edf 100644 --- a/extension/observer/ecsobserver/config_test.go +++ b/extension/observer/ecsobserver/config_test.go @@ -65,7 +65,7 @@ func TestLoadConfig(t *testing.T) { cfg := factory.CreateDefaultConfig() sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) if tt.expectedErr { assert.Error(t, component.ValidateConfig(cfg)) return diff --git a/extension/observer/ecsobserver/exporter_test.go b/extension/observer/ecsobserver/exporter_test.go index 8ba905c85db9..eb767eaebfda 100644 --- a/extension/observer/ecsobserver/exporter_test.go +++ b/extension/observer/ecsobserver/exporter_test.go @@ -4,7 +4,6 @@ package ecsobserver import ( - "errors" "testing" "github.com/aws/aws-sdk-go/aws" @@ -27,7 +26,7 @@ func TestTaskExporter(t *testing.T) { }) assert.Error(t, err) v := &errPrivateIPNotFound{} - assert.True(t, errors.As(err, &v)) + assert.ErrorAs(t, err, &v) }) awsVpcTask := &ecs.Task{ @@ -118,7 +117,7 @@ func TestTaskExporter(t *testing.T) { merr := multierr.Errors(err) require.Len(t, merr, 1) v := &errMappedPortNotFound{} - assert.True(t, errors.As(merr[0], &v)) + assert.ErrorAs(t, merr[0], &v) assert.Len(t, targets, 2) }) diff --git a/extension/observer/ecsobserver/extension.go b/extension/observer/ecsobserver/extension.go index abb4da7cee7a..e4ef848eba01 100644 --- a/extension/observer/ecsobserver/extension.go +++ b/extension/observer/ecsobserver/extension.go @@ -7,6 +7,7 @@ import ( "context" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componentstatus" "go.opentelemetry.io/collector/extension" "go.uber.org/zap" ) @@ -23,7 +24,7 @@ type ecsObserver struct { } // Start runs the service discovery in background -func (e *ecsObserver) Start(_ context.Context, _ component.Host) error { +func (e *ecsObserver) Start(_ context.Context, host component.Host) error { e.telemetrySettings.Logger.Info("Starting ECSDiscovery") // Ignore the ctx parameter as it is not for long running operation ctx, cancel := context.WithCancel(context.Background()) @@ -31,8 +32,7 @@ func (e *ecsObserver) Start(_ context.Context, _ component.Host) error { go func() { if err := e.sd.runAndWriteFile(ctx); err != nil { e.telemetrySettings.Logger.Error("ECSDiscovery stopped by error", zap.Error(err)) - // Stop the collector - e.telemetrySettings.ReportStatus(component.NewFatalErrorEvent(err)) + componentstatus.ReportStatus(host, componentstatus.NewFatalErrorEvent(err)) } }() return nil diff --git a/extension/observer/ecsobserver/extension_test.go b/extension/observer/ecsobserver/extension_test.go index cbf02b8d5215..491dfc830ae5 100644 --- a/extension/observer/ecsobserver/extension_test.go +++ b/extension/observer/ecsobserver/extension_test.go @@ -11,7 +11,7 @@ import ( "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/component/componentstatus" "go.opentelemetry.io/collector/extension" "go.opentelemetry.io/collector/extension/extensiontest" "go.uber.org/zap" @@ -34,10 +34,7 @@ func TestExtensionStartStop(t *testing.T) { sdCfg := cfg.(*Config) sdCfg.RefreshInterval = refreshInterval sdCfg.ResultFile = output - cs := extensiontest.NewNopCreateSettings() - cs.ReportStatus = func(event *component.StatusEvent) { - require.NoError(t, event.Err()) - } + cs := extensiontest.NewNopSettings() ext, err := createExtensionWithFetcher(cs, sdCfg, f) require.NoError(t, err) return ext @@ -47,7 +44,11 @@ func TestExtensionStartStop(t *testing.T) { c := ecsmock.NewCluster() ext := createTestExt(c, "testdata/ut_ext_noop.actual.yaml") require.IsType(t, &ecsObserver{}, ext) - require.NoError(t, ext.Start(context.TODO(), componenttest.NewNopHost())) + require.NoError(t, ext.Start(context.TODO(), &nopHost{ + reportFunc: func(event *componentstatus.Event) { + require.NoError(t, event.Err()) + }, + })) require.NoError(t, ext.Shutdown(context.TODO())) }) @@ -58,17 +59,32 @@ func TestExtensionStartStop(t *testing.T) { sdCfg := cfg.(*Config) sdCfg.RefreshInterval = 100 * time.Millisecond sdCfg.ResultFile = "testdata/ut_ext_critical_error.actual.yaml" - cs := extensiontest.NewNopCreateSettings() - statusEventChan := make(chan *component.StatusEvent) - cs.TelemetrySettings.ReportStatus = func(e *component.StatusEvent) { - statusEventChan <- e - } + cs := extensiontest.NewNopSettings() + statusEventChan := make(chan *componentstatus.Event) ext, err := createExtensionWithFetcher(cs, sdCfg, f) require.NoError(t, err) - err = ext.Start(context.Background(), componenttest.NewNopHost()) + err = ext.Start(context.Background(), &nopHost{ + reportFunc: func(e *componentstatus.Event) { + statusEventChan <- e + }, + }) require.NoError(t, err) e := <-statusEventChan require.Error(t, e.Err()) require.Error(t, hasCriticalError(zap.NewExample(), e.Err())) }) } + +var _ componentstatus.Reporter = (*nopHost)(nil) + +type nopHost struct { + reportFunc func(event *componentstatus.Event) +} + +func (nh *nopHost) GetExtensions() map[component.ID]component.Component { + return nil +} + +func (nh *nopHost) Report(event *componentstatus.Event) { + nh.reportFunc(event) +} diff --git a/extension/observer/ecsobserver/factory.go b/extension/observer/ecsobserver/factory.go index 615136d0f6f8..18c15e9d0788 100644 --- a/extension/observer/ecsobserver/factory.go +++ b/extension/observer/ecsobserver/factory.go @@ -28,7 +28,7 @@ func createDefaultConfig() component.Config { return &cfg } -func createExtension(_ context.Context, params extension.CreateSettings, cfg component.Config) (extension.Extension, error) { +func createExtension(_ context.Context, params extension.Settings, cfg component.Config) (extension.Extension, error) { sdCfg := cfg.(*Config) fetcher, err := newTaskFetcherFromConfig(*sdCfg, params.Logger) if err != nil { @@ -38,7 +38,7 @@ func createExtension(_ context.Context, params extension.CreateSettings, cfg com } // fetcher is mock in unit test or AWS API client -func createExtensionWithFetcher(params extension.CreateSettings, sdCfg *Config, fetcher *taskFetcher) (extension.Extension, error) { +func createExtensionWithFetcher(params extension.Settings, sdCfg *Config, fetcher *taskFetcher) (extension.Extension, error) { sd, err := newDiscovery(*sdCfg, serviceDiscoveryOptions{Logger: params.Logger, Fetcher: fetcher}) if err != nil { return nil, err diff --git a/extension/observer/ecsobserver/fetcher.go b/extension/observer/ecsobserver/fetcher.go index cf21efafcb4d..f69dcf5223fa 100644 --- a/extension/observer/ecsobserver/fetcher.go +++ b/extension/observer/ecsobserver/fetcher.go @@ -14,7 +14,7 @@ import ( "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/ec2" "github.com/aws/aws-sdk-go/service/ecs" - "github.com/hashicorp/golang-lru/simplelru" + "github.com/hashicorp/golang-lru/v2/simplelru" "go.uber.org/zap" ) @@ -50,8 +50,8 @@ type taskFetcher struct { ecs ecsClient ec2 ec2Client cluster string - taskDefCache simplelru.LRUCache - ec2Cache simplelru.LRUCache + taskDefCache *simplelru.LRU[string, *ecs.TaskDefinition] + ec2Cache *simplelru.LRU[string, *ec2.Instance] serviceNameFilter serviceNameFilter } @@ -81,11 +81,11 @@ func newTaskFetcherFromConfig(cfg Config, logger *zap.Logger) (*taskFetcher, err func newTaskFetcher(opts taskFetcherOptions) (*taskFetcher, error) { // Init cache - taskDefCache, err := simplelru.NewLRU(taskDefCacheSize, nil) + taskDefCache, err := simplelru.NewLRU[string, *ecs.TaskDefinition](taskDefCacheSize, nil) if err != nil { return nil, err } - ec2Cache, err := simplelru.NewLRU(ec2CacheSize, nil) + ec2Cache, err := simplelru.NewLRU[string, *ec2.Instance](ec2CacheSize, nil) if err != nil { return nil, err } @@ -205,7 +205,7 @@ func (f *taskFetcher) attachTaskDefinition(ctx context.Context, tasks []*ecs.Tas } var def *ecs.TaskDefinition if cached, ok := f.taskDefCache.Get(arn); ok { - def = cached.(*ecs.TaskDefinition) + def = cached } else { res, err := svc.DescribeTaskDefinitionWithContext(ctx, &ecs.DescribeTaskDefinitionInput{ TaskDefinition: aws.String(arn), @@ -251,7 +251,7 @@ func (f *taskFetcher) attachContainerInstance(ctx context.Context, tasks []*task for instanceArn := range ciToEC2 { cached, ok := f.ec2Cache.Get(instanceArn) if ok { - ciToEC2[instanceArn] = cached.(*ec2.Instance) // use value from cache + ciToEC2[instanceArn] = cached // use value from cache } else { instanceList = append(instanceList, aws.String(instanceArn)) } @@ -289,7 +289,8 @@ func (f *taskFetcher) attachContainerInstance(ctx context.Context, tasks []*task // Run ecs.DescribeContainerInstances and ec2.DescribeInstances for a batch (less than 100 container instances). func (f *taskFetcher) describeContainerInstances(ctx context.Context, instanceList []*string, - ci2EC2 map[string]*ec2.Instance) error { + ci2EC2 map[string]*ec2.Instance, +) error { // Get container instances res, err := f.ecs.DescribeContainerInstancesWithContext(ctx, &ecs.DescribeContainerInstancesInput{ Cluster: aws.String(f.cluster), diff --git a/extension/observer/ecsobserver/fetcher_test.go b/extension/observer/ecsobserver/fetcher_test.go index 937646415292..38576347553d 100644 --- a/extension/observer/ecsobserver/fetcher_test.go +++ b/extension/observer/ecsobserver/fetcher_test.go @@ -65,7 +65,7 @@ func TestFetcher_FetchAndDecorate(t *testing.T) { ctx := context.Background() tasks, err := f.fetchAndDecorate(ctx) require.NoError(t, err) - assert.Equal(t, nTasks, len(tasks)) + assert.Len(t, tasks, nTasks) assert.Equal(t, "s0", aws.StringValue(tasks[0].Service.ServiceArn)) } @@ -78,7 +78,7 @@ func TestFetcher_GetDiscoverableTasks(t *testing.T) { ctx := context.Background() tasks, err := f.getDiscoverableTasks(ctx) require.NoError(t, err) - assert.Equal(t, nTasks, len(tasks)) + assert.Len(t, tasks, nTasks) }) t.Run("with non discoverable tasks", func(t *testing.T) { @@ -106,7 +106,7 @@ func TestFetcher_GetDiscoverableTasks(t *testing.T) { require.NoError(t, err) // Expect 2 tasks, with LaunchType Fargate and EC2 with non-nil ContainerInstanceArn - assert.Equal(t, 2, len(tasks)) + assert.Len(t, tasks, 2) assert.Equal(t, ecs.LaunchTypeFargate, aws.StringValue(tasks[0].LaunchType)) assert.Equal(t, ecs.LaunchTypeEc2, aws.StringValue(tasks[1].LaunchType)) }) @@ -178,7 +178,7 @@ func TestFetcher_AttachContainerInstance(t *testing.T) { ctx := context.Background() rawTasks, err := f.getDiscoverableTasks(ctx) require.NoError(t, err) - assert.Equal(t, nTasks, len(rawTasks)) + assert.Len(t, rawTasks, nTasks) tasks, err := f.attachTaskDefinition(ctx, rawTasks) require.NoError(t, err) @@ -216,7 +216,7 @@ func TestFetcher_AttachContainerInstance(t *testing.T) { ctx := context.Background() rawTasks, err := f.getDiscoverableTasks(ctx) require.NoError(t, err) - assert.Equal(t, nTasks, len(rawTasks)) + assert.Len(t, rawTasks, nTasks) tasks, err := f.attachTaskDefinition(ctx, rawTasks) require.NoError(t, err) @@ -225,7 +225,7 @@ func TestFetcher_AttachContainerInstance(t *testing.T) { err = f.attachContainerInstance(ctx, tasks) require.NoError(t, err) assert.Nil(t, tasks[0].EC2) - // task instance pattern is 0 1 0 1 ..., nFargateInstances = 3 so the 4th task is running on instance 1 + // task instance pattern is 0 1 0 1 ..., nFargateInstances = 3 so the 4th task is running on instance 1 assert.Equal(t, "i-1", aws.StringValue(tasks[nFargateInstances].EC2.InstanceId)) }) } @@ -238,7 +238,7 @@ func TestFetcher_GetAllServices(t *testing.T) { ctx := context.Background() services, err := f.getAllServices(ctx) require.NoError(t, err) - assert.Equal(t, nServices, len(services)) + assert.Len(t, services, nServices) } func TestFetcher_AttachService(t *testing.T) { @@ -263,7 +263,6 @@ func TestFetcher_AttachService(t *testing.T) { deployID := i % nServices task.TaskDefinitionArn = aws.String(fmt.Sprintf("def%d:1", deployID)) task.StartedBy = aws.String(fmt.Sprintf("deploy%d", deployID)) - })) ctx := context.Background() diff --git a/extension/observer/ecsobserver/go.mod b/extension/observer/ecsobserver/go.mod index cd2b4de37294..dedadc51779d 100644 --- a/extension/observer/ecsobserver/go.mod +++ b/extension/observer/ecsobserver/go.mod @@ -1,16 +1,17 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/ecsobserver -go 1.21.0 +go 1.22.0 require ( - github.com/aws/aws-sdk-go v1.53.11 - github.com/hashicorp/golang-lru v1.0.2 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/aws/aws-sdk-go v1.55.5 + github.com/hashicorp/golang-lru/v2 v2.0.7 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componentstatus v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 @@ -18,37 +19,33 @@ require ( ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/observer/ecsobserver/go.sum b/extension/observer/ecsobserver/go.sum index c89a0a65f32a..1175d1558423 100644 --- a/extension/observer/ecsobserver/go.sum +++ b/extension/observer/ecsobserver/go.sum @@ -1,27 +1,25 @@ -github.com/aws/aws-sdk-go v1.53.11 h1:KcmduYvX15rRqt4ZU/7jKkmDxU/G87LJ9MUI0yQJh00= -github.com/aws/aws-sdk-go v1.53.11/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= +github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= -github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= @@ -32,8 +30,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -44,43 +42,41 @@ github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zx github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -96,20 +92,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -118,12 +114,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/extension/observer/ecsobserver/internal/ecsmock/service.go b/extension/observer/ecsobserver/internal/ecsmock/service.go index 1d9dc1050d74..77ac558cd5e3 100644 --- a/extension/observer/ecsobserver/internal/ecsmock/service.go +++ b/extension/observer/ecsobserver/internal/ecsmock/service.go @@ -26,7 +26,6 @@ type PageLimit struct { DescribeServiceInput int // max 10 DescribeContainerInstanceInput int // max 100 DescribeInstanceOutput int // max 1000 - } func DefaultPageLimit() PageLimit { diff --git a/extension/observer/ecsobserver/internal/ecsmock/service_test.go b/extension/observer/ecsobserver/internal/ecsmock/service_test.go index acaec6b13426..8105596b008e 100644 --- a/extension/observer/ecsobserver/internal/ecsmock/service_test.go +++ b/extension/observer/ecsobserver/internal/ecsmock/service_test.go @@ -5,7 +5,6 @@ package ecsmock import ( "context" - "errors" "fmt" "testing" @@ -28,10 +27,10 @@ func TestCluster_ListTasksWithContext(t *testing.T) { _, err := c.ListTasksWithContext(ctx, req) require.Error(t, err) var aerr awserr.Error - assert.True(t, errors.As(err, &aerr)) + assert.ErrorAs(t, err, &aerr) assert.Equal(t, ecs.ErrCodeClusterNotFoundException, aerr.Code()) assert.Equal(t, "code "+ecs.ErrCodeClusterNotFoundException+" message "+aerr.Message(), aerr.Error()) - assert.Nil(t, aerr.OrigErr()) + assert.NoError(t, aerr.OrigErr()) }) t.Run("get all", func(t *testing.T) { @@ -78,7 +77,7 @@ func TestCluster_DescribeTasksWithContext(t *testing.T) { res, err := c.DescribeTasksWithContext(ctx, req) require.NoError(t, err) assert.Len(t, res.Tasks, 2) - assert.Len(t, res.Failures, 0) + assert.Empty(t, res.Failures) assert.Equal(t, "running", aws.StringValue(res.Tasks[0].LastStatus)) }) @@ -158,7 +157,7 @@ func TestCluster_DescribeInstancesWithContext(t *testing.T) { req := &ec2.DescribeInstancesInput{InstanceIds: ids} res, err := c.DescribeInstancesWithContext(ctx, req) require.NoError(t, err) - assert.Equal(t, nIDs, len(res.Reservations[0].Instances)) + assert.Len(t, res.Reservations[0].Instances, nIDs) }) t.Run("invalid id", func(t *testing.T) { @@ -198,8 +197,8 @@ func TestCluster_DescribeContainerInstancesWithContext(t *testing.T) { req := &ecs.DescribeContainerInstancesInput{ContainerInstances: ids} res, err := c.DescribeContainerInstancesWithContext(ctx, req) require.NoError(t, err) - assert.Equal(t, nIDs, len(res.ContainerInstances)) - assert.Equal(t, 0, len(res.Failures)) + assert.Len(t, res.ContainerInstances, nIDs) + assert.Empty(t, res.Failures) }) t.Run("not found", func(t *testing.T) { @@ -272,7 +271,7 @@ func TestCluster_DescribeServicesWithContext(t *testing.T) { res, err := c.DescribeServicesWithContext(ctx, req) require.NoError(t, err) assert.Len(t, res.Services, 2) - assert.Len(t, res.Failures, 0) + assert.Empty(t, res.Failures) }) t.Run("not found", func(t *testing.T) { diff --git a/extension/observer/ecsobserver/internal/errctx/value_test.go b/extension/observer/ecsobserver/internal/errctx/value_test.go index 09b7bb8771eb..1041122fdaa2 100644 --- a/extension/observer/ecsobserver/internal/errctx/value_test.go +++ b/extension/observer/ecsobserver/internal/errctx/value_test.go @@ -11,7 +11,7 @@ import ( ) func TestWithValue(t *testing.T) { - assert.Nil(t, WithValue(nil, "a", "b")) + assert.NoError(t, WithValue(nil, "a", "b")) assert.Panics(t, func() { _ = WithValue(fmt.Errorf("base"), "", nil) }) @@ -35,7 +35,7 @@ func TestWithValue(t *testing.T) { } func TestWithValues(t *testing.T) { - assert.Nil(t, WithValues(nil, map[string]any{"a": "b"})) + assert.NoError(t, WithValues(nil, map[string]any{"a": "b"})) assert.Panics(t, func() { _ = WithValues(fmt.Errorf("base"), map[string]any{"": "123"}) }) @@ -83,5 +83,4 @@ func TestValueFrom(t *testing.T) { assert.True(t, ok) assert.Equal(t, "e2", v) }) - } diff --git a/extension/observer/ecsobserver/internal/metadata/generated_status.go b/extension/observer/ecsobserver/internal/metadata/generated_status.go index 0e66f707d13d..220326c81a06 100644 --- a/extension/observer/ecsobserver/internal/metadata/generated_status.go +++ b/extension/observer/ecsobserver/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("ecs_observer") + Type = component.MustNewType("ecs_observer") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/ecsobserver" ) const ( diff --git a/extension/observer/ecsobserver/internal/metadata/generated_telemetry.go b/extension/observer/ecsobserver/internal/metadata/generated_telemetry.go deleted file mode 100644 index 33ae3d3994fb..000000000000 --- a/extension/observer/ecsobserver/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/ecsobserver") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/ecsobserver") -} diff --git a/extension/observer/ecsobserver/internal/metadata/generated_telemetry_test.go b/extension/observer/ecsobserver/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 98c68418c6ae..000000000000 --- a/extension/observer/ecsobserver/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/ecsobserver", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/ecsobserver", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/observer/ecsobserver/matcher_test.go b/extension/observer/ecsobserver/matcher_test.go index bcfdeed717f5..11ab05d56401 100644 --- a/extension/observer/ecsobserver/matcher_test.go +++ b/extension/observer/ecsobserver/matcher_test.go @@ -92,7 +92,7 @@ func TestMatchedContainer_MergeTargets(t *testing.T) { } m.MergeTargets(newTargets) assert.Len(t, m.Targets, 4) - assert.Equal(t, m.Targets[3].MetricsPath, "/m1") // order is append + assert.Equal(t, "/m1", m.Targets[3].MetricsPath) // order is append }) t.Run("respect existing targets", func(t *testing.T) { diff --git a/extension/observer/ecsobserver/metadata.yaml b/extension/observer/ecsobserver/metadata.yaml index bcdde84ff919..e99b78c348df 100644 --- a/extension/observer/ecsobserver/metadata.yaml +++ b/extension/observer/ecsobserver/metadata.yaml @@ -1,5 +1,4 @@ type: ecs_observer -scope_name: otelcol/ecsobserver status: class: extension @@ -7,7 +6,8 @@ status: beta: [extension] distributions: [contrib] codeowners: - active: [dmitryax, rmfitzpatrick] + active: [dmitryax] + emeritus: [rmfitzpatrick] # TODO: Update the extension to make the tests pass tests: diff --git a/extension/observer/ecsobserver/sd.go b/extension/observer/ecsobserver/sd.go index cbf49bfa9f6f..234a7e181704 100644 --- a/extension/observer/ecsobserver/sd.go +++ b/extension/observer/ecsobserver/sd.go @@ -83,7 +83,7 @@ func (s *serviceDiscovery) runAndWriteFile(ctx context.Context) error { return err } // NOTE: We assume the folder already exists and does NOT try to create one. - if err := os.WriteFile(s.cfg.ResultFile, b, 0600); err != nil { + if err := os.WriteFile(s.cfg.ResultFile, b, 0o600); err != nil { return err } } diff --git a/extension/observer/ecsobserver/target.go b/extension/observer/ecsobserver/target.go index 70f8d0bb66a3..710ef631a2f7 100644 --- a/extension/observer/ecsobserver/target.go +++ b/extension/observer/ecsobserver/target.go @@ -121,9 +121,7 @@ func trimEmptyValueByKeyPrefix(m map[string]string, prefix string) { } } -var ( - invalidLabelCharRE = regexp.MustCompile(`[^a-zA-Z0-9_]`) -) +var invalidLabelCharRE = regexp.MustCompile(`[^a-zA-Z0-9_]`) // Copied from https://github.com/prometheus/prometheus/blob/8d2a8f493905e46fe6181e8c1b79ccdfcbdb57fc/util/strutil/strconv.go#L40-L44 func sanitizeLabelName(s string) string { diff --git a/extension/observer/ecsobserver/task_test.go b/extension/observer/ecsobserver/task_test.go index 2daea1bdb2a6..2085912b8655 100644 --- a/extension/observer/ecsobserver/task_test.go +++ b/extension/observer/ecsobserver/task_test.go @@ -90,7 +90,7 @@ func TestTask_PrivateIP(t *testing.T) { assert.Equal(t, mode, errPINF.NetworkMode) // doing contains on error message is not good, but this line increase test coverage from 93% to 98% // not sure how the average coverage is calculated ... - assert.Contains(t, err.Error(), mode) + assert.ErrorContains(t, err, mode) } }) } @@ -185,7 +185,7 @@ func TestTask_MappedPort(t *testing.T) { errMPNF := &errMappedPortNotFound{} require.ErrorAs(t, err, &errMPNF) assert.Equal(t, mode, errMPNF.NetworkMode) - assert.Contains(t, err.Error(), mode) // for coverage + assert.ErrorContains(t, err, mode) // for coverage } }) } diff --git a/extension/observer/ecstaskobserver/README.md b/extension/observer/ecstaskobserver/README.md index 2e6c0940a10e..2c8177119437 100644 --- a/extension/observer/ecstaskobserver/README.md +++ b/extension/observer/ecstaskobserver/README.md @@ -3,12 +3,13 @@ | Status | | | ------------- |-----------| -| Stability | [beta] | +| Stability | [unmaintained] | | Distributions | [contrib] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fecstaskobserver%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fecstaskobserver) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fecstaskobserver%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fecstaskobserver) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@rmfitzpatrick](https://www.github.com/rmfitzpatrick) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | | +| Emeritus | [@rmfitzpatrick](https://www.github.com/rmfitzpatrick) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[unmaintained]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#unmaintained [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib @@ -87,7 +88,6 @@ All fields are optional. | write_buffer_size |int| | WriteBufferSize for HTTP client. See http.Transport.WriteBufferSize. | | timeout |[time-Duration](#time-duration)| | Timeout parameter configures `http.Client.Timeout`. | | headers |map[string]string| | Additional headers attached to each HTTP request sent by the client. Existing header values are overwritten if collision happens. | -| customroundtripper |func(http.RoundTripper) (http.RoundTripper, error)| | Custom Round Tripper to allow for individual components to intercept HTTP requests | | auth |[Authentication]| | Auth configuration for outgoing HTTP calls. | | refresh_interval |[time-Duration](#time-duration)| 30s | RefreshInterval determines the frequency at which the observer needs to poll for collecting new information about task containers. | | port_labels |[]string| `[ECS_TASK_OBSERVER_PORT]` | PortLabels is a list of container Docker labels from which to obtain the observed Endpoint port. The first label with valid port found will be used. If no PortLabels provided, default of ECS_TASK_OBSERVER_PORT will be used. | diff --git a/extension/observer/ecstaskobserver/config_test.go b/extension/observer/ecstaskobserver/config_test.go index 4a9da20bf93b..e28ae3af9c7b 100644 --- a/extension/observer/ecstaskobserver/config_test.go +++ b/extension/observer/ecstaskobserver/config_test.go @@ -59,7 +59,7 @@ func TestLoadConfig(t *testing.T) { cfg := factory.CreateDefaultConfig() sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) if tt.expectedErr != "" { assert.EqualError(t, component.ValidateConfig(cfg), tt.expectedErr) return diff --git a/extension/observer/ecstaskobserver/extension.go b/extension/observer/ecstaskobserver/extension.go index c800f86cc389..e74394d22771 100644 --- a/extension/observer/ecstaskobserver/extension.go +++ b/extension/observer/ecstaskobserver/extension.go @@ -19,9 +19,11 @@ import ( const runningStatus = "RUNNING" -var _ extension.Extension = (*ecsTaskObserver)(nil) -var _ observer.EndpointsLister = (*ecsTaskObserver)(nil) -var _ observer.Observable = (*ecsTaskObserver)(nil) +var ( + _ extension.Extension = (*ecsTaskObserver)(nil) + _ observer.EndpointsLister = (*ecsTaskObserver)(nil) + _ observer.Observable = (*ecsTaskObserver)(nil) +) type ecsTaskObserver struct { extension.Extension @@ -97,7 +99,6 @@ func (e *ecsTaskObserver) portFromLabels(labels map[string]string) uint16 { for _, portLabel := range e.config.PortLabels { if p, ok := labels[portLabel]; ok { port, err := strconv.ParseUint(p, 10, 16) - if err != nil { e.telemetry.Logger.Warn("failed parsing port label", zap.String("label", portLabel), zap.Error(err)) continue diff --git a/extension/observer/ecstaskobserver/factory.go b/extension/observer/ecstaskobserver/factory.go index 366b8635d38b..59ffd899368b 100644 --- a/extension/observer/ecstaskobserver/factory.go +++ b/extension/observer/ecstaskobserver/factory.go @@ -38,7 +38,7 @@ type baseExtension struct { func createExtension( _ context.Context, - params extension.CreateSettings, + params extension.Settings, cfg component.Config, ) (extension.Extension, error) { obsCfg := cfg.(*Config) diff --git a/extension/observer/ecstaskobserver/factory_test.go b/extension/observer/ecstaskobserver/factory_test.go index fea3937c5cd0..431c2dfc2396 100644 --- a/extension/observer/ecstaskobserver/factory_test.go +++ b/extension/observer/ecstaskobserver/factory_test.go @@ -18,7 +18,7 @@ func TestFactoryCreatedExtensionIsEndpointsLister(t *testing.T) { cfg := etoFactory.CreateDefaultConfig() cfg.(*Config).Endpoint = "http://localhost:1234/mock/endpoint" - eto, err := etoFactory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + eto, err := etoFactory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NotNil(t, eto) require.Implements(t, (*observer.EndpointsLister)(nil), eto) diff --git a/extension/observer/ecstaskobserver/go.mod b/extension/observer/ecstaskobserver/go.mod index b612aa85ecba..c0ef43a4eba8 100644 --- a/extension/observer/ecstaskobserver/go.mod +++ b/extension/observer/ecstaskobserver/go.mod @@ -1,69 +1,63 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/ecstaskobserver -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/ecsutil v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/confighttp v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/ecsutil v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/confighttp v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/hashicorp/go-version v1.7.0 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/rs/cors v1.10.1 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/configopaque v1.9.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + github.com/rs/cors v1.11.1 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/configopaque v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/configtls v1.22.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/observer/ecstaskobserver/go.sum b/extension/observer/ecstaskobserver/go.sum index 7300d221dfac..df8c2eb73507 100644 --- a/extension/observer/ecstaskobserver/go.sum +++ b/extension/observer/ecstaskobserver/go.sum @@ -1,42 +1,38 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= -github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -49,70 +45,66 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -128,20 +120,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -150,12 +142,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/extension/observer/ecstaskobserver/internal/metadata/generated_status.go b/extension/observer/ecstaskobserver/internal/metadata/generated_status.go index 555d253c0bcc..87b96b49c2c2 100644 --- a/extension/observer/ecstaskobserver/internal/metadata/generated_status.go +++ b/extension/observer/ecstaskobserver/internal/metadata/generated_status.go @@ -7,9 +7,10 @@ import ( ) var ( - Type = component.MustNewType("ecs_task_observer") + Type = component.MustNewType("ecs_task_observer") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/ecstaskobserver" ) const ( - ExtensionStability = component.StabilityLevelBeta + ExtensionStability = component.StabilityLevelUnmaintained ) diff --git a/extension/observer/ecstaskobserver/internal/metadata/generated_telemetry.go b/extension/observer/ecstaskobserver/internal/metadata/generated_telemetry.go deleted file mode 100644 index 3af5580d8236..000000000000 --- a/extension/observer/ecstaskobserver/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/ecstaskobserver") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/ecstaskobserver") -} diff --git a/extension/observer/ecstaskobserver/internal/metadata/generated_telemetry_test.go b/extension/observer/ecstaskobserver/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 276cc92ded27..000000000000 --- a/extension/observer/ecstaskobserver/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/ecstaskobserver", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/ecstaskobserver", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/observer/ecstaskobserver/metadata.yaml b/extension/observer/ecstaskobserver/metadata.yaml index fc96988b8c52..afbc666d24e7 100644 --- a/extension/observer/ecstaskobserver/metadata.yaml +++ b/extension/observer/ecstaskobserver/metadata.yaml @@ -1,13 +1,13 @@ type: ecs_task_observer -scope_name: otelcol/ecstaskobserver status: class: extension stability: - beta: [extension] + unmaintained: [extension] distributions: [contrib] codeowners: - active: [rmfitzpatrick] + active: [] + emeritus: [rmfitzpatrick] # TODO: Update the extension to make the tests pass tests: diff --git a/extension/observer/endpoints.go b/extension/observer/endpoints.go index 89a57b255a89..2f58c6932c26 100644 --- a/extension/observer/endpoints.go +++ b/extension/observer/endpoints.go @@ -6,6 +6,7 @@ package observer // import "github.com/open-telemetry/opentelemetry-collector-co import ( "errors" "fmt" + "net" "reflect" ) @@ -23,8 +24,12 @@ const ( PortType EndpointType = "port" // PodType is a pod endpoint. PodType EndpointType = "pod" + // PodContainerType is a pod's container endpoint. + PodContainerType EndpointType = "pod.container" // K8sServiceType is a service endpoint. K8sServiceType EndpointType = "k8s.service" + // K8sIngressType is a ingress endpoint. + K8sIngressType EndpointType = "k8s.ingress" // K8sNodeType is a Kubernetes Node endpoint. K8sNodeType EndpointType = "k8s.node" // HostPortType is a hostport endpoint. @@ -69,6 +74,27 @@ func (e *Endpoint) Env() (EndpointEnv, error) { env["type"] = string(e.Details.Type()) env["id"] = string(e.ID) + // Exposing the target as a split "host" and "port" enables the receiver creator + // to be able to discover receivers that require these options to be configured + // separately. + const hostKey = "host" + const portKey = "port" + host, port, err := net.SplitHostPort(e.Target) + // An error most likely means there was no port when splitting, so the host + // can simply be the target. + if err != nil { + host = e.Target + } else { + // Only try to set the port if a valid port was found when splitting the target + if _, keyExists := env[portKey]; !keyExists { + env[portKey] = port + } + } + + if _, keyExists := env[hostKey]; !keyExists { + env[hostKey] = host + } + return env, nil } @@ -129,6 +155,43 @@ func (s *K8sService) Type() EndpointType { return K8sServiceType } +// K8sIngress is a discovered k8s ingress. +type K8sIngress struct { + // Name of the ingress. + Name string + // UID is the unique ID in the cluster for the ingress. + UID string + // Labels is a map of user-specified metadata. + Labels map[string]string + // Annotations is a map of user-specified metadata. + Annotations map[string]string + // Namespace must be unique for ingress with same name. + Namespace string + // Scheme represents whether the ingress path is accessible via HTTPS or HTTP. + Scheme string + // Host is the fully qualified domain name of a network host + Host string + // Path that map requests to backends + Path string +} + +func (s *K8sIngress) Env() EndpointEnv { + return map[string]any{ + "uid": s.UID, + "name": s.Name, + "labels": s.Labels, + "annotations": s.Annotations, + "namespace": s.Namespace, + "scheme": s.Scheme, + "host": s.Host, + "path": s.Path, + } +} + +func (s *K8sIngress) Type() EndpointType { + return K8sIngressType +} + // Pod is a discovered k8s pod. type Pod struct { // Name of the pod. @@ -157,6 +220,31 @@ func (p *Pod) Type() EndpointType { return PodType } +// PodContainer is a discovered k8s pod's container +type PodContainer struct { + // Name of the container + Name string `mapstructure:"container_name"` + // Image of the container + Image string `mapstructure:"container_image"` + // ContainerID is the id of the container exposing the Endpoint + ContainerID string `mapstructure:"container_id"` + // Pod is the k8s pod in which the container is running + Pod Pod +} + +func (p *PodContainer) Env() EndpointEnv { + return map[string]any{ + "container_name": p.Name, + "container_id": p.ContainerID, + "container_image": p.Image, + "pod": p.Pod.Env(), + } +} + +func (p *PodContainer) Type() EndpointType { + return PodContainerType +} + // Port is an endpoint that has a target as well as a port. type Port struct { // Name is the name of the container port. diff --git a/extension/observer/endpoints_test.go b/extension/observer/endpoints_test.go index c90be0900d34..619ebe83fcc5 100644 --- a/extension/observer/endpoints_test.go +++ b/extension/observer/endpoints_test.go @@ -46,6 +46,7 @@ func TestEndpointEnv(t *testing.T) { }, "uid": "pod-uid", "namespace": "pod-namespace", + "host": "192.68.73.2", }, }, { @@ -88,6 +89,7 @@ func TestEndpointEnv(t *testing.T) { "namespace": "pod-namespace", }, "transport": ProtocolTCP, + "host": "192.68.73.2", }, }, { @@ -124,6 +126,7 @@ func TestEndpointEnv(t *testing.T) { "namespace": "service-namespace", "cluster_ip": "192.68.73.2", "service_type": "LoadBalancer", + "host": "service.namespace", }, }, { @@ -148,6 +151,7 @@ func TestEndpointEnv(t *testing.T) { "is_ipv6": true, "port": uint16(2379), "transport": ProtocolUDP, + "host": "127.0.0.1", }, }, { @@ -228,6 +232,54 @@ func TestEndpointEnv(t *testing.T) { "labels": map[string]string{ "label_key": "label_val", }, + "host": "127.0.0.1", + "port": "1234", + }, + }, + { + // This is an invalid test case, to ensure "port" keeps the original value and + // isn't overwritten by a port parsed from the "Target". The two ports shouldn't mismatch + // if they're exposed in both places. + name: "K8s pod port - conflicting ports", + endpoint: Endpoint{ + ID: EndpointID("port_id"), + Target: "192.68.73.2:4321", + Details: &Port{ + Name: "port_name", + Pod: Pod{ + Name: "pod_name", + Labels: map[string]string{ + "label_key": "label_val", + }, + Annotations: map[string]string{ + "annotation_1": "value_1", + }, + Namespace: "pod-namespace", + UID: "pod-uid", + }, + Port: 2379, + Transport: ProtocolTCP, + }, + }, + want: EndpointEnv{ + "type": "port", + "endpoint": "192.68.73.2:4321", + "id": "port_id", + "name": "port_name", + "port": uint16(2379), + "pod": EndpointEnv{ + "name": "pod_name", + "labels": map[string]string{ + "label_key": "label_val", + }, + "annotations": map[string]string{ + "annotation_1": "value_1", + }, + "uid": "pod-uid", + "namespace": "pod-namespace", + }, + "transport": ProtocolTCP, + "host": "192.68.73.2", }, }, } diff --git a/extension/observer/endpointswatcher_test.go b/extension/observer/endpointswatcher_test.go index d34dc25284dc..8e4db5ee976b 100644 --- a/extension/observer/endpointswatcher_test.go +++ b/extension/observer/endpointswatcher_test.go @@ -165,21 +165,21 @@ func TestNotifyOfLatestEndpointsMultipleNotify(t *testing.T) { require.Nil(t, existingEndpoints(t, watcher, notifyTwo.ID())) } -func existingEndpoints(t testing.TB, watcher *EndpointsWatcher, id NotifyID) map[EndpointID]Endpoint { +func existingEndpoints(tb testing.TB, watcher *EndpointsWatcher, id NotifyID) map[EndpointID]Endpoint { if existing, ok := watcher.existingEndpoints.Load(id); ok { endpoints, ok := existing.(map[EndpointID]Endpoint) - assert.True(t, ok) + assert.True(tb, ok) return endpoints } return nil } -func setup(t testing.TB) (*mockEndpointsLister, *EndpointsWatcher, *mockNotifier) { +func setup(tb testing.TB) (*mockEndpointsLister, *EndpointsWatcher, *mockNotifier) { ml := &mockEndpointsLister{ endpointsMap: map[EndpointID]Endpoint{}, } - ew := NewEndpointsWatcher(ml, 2*time.Second, zaptest.NewLogger(t)) + ew := NewEndpointsWatcher(ml, 2*time.Second, zaptest.NewLogger(tb)) mn := &mockNotifier{id: "mockNotifier"} return ml, ew, mn diff --git a/extension/observer/go.mod b/extension/observer/go.mod index b2f644debdd9..1b7a73413878 100644 --- a/extension/observer/go.mod +++ b/extension/observer/go.mod @@ -1,19 +1,20 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer -go 1.21.0 +go 1.22.0 require ( - github.com/stretchr/testify v1.9.0 + github.com/stretchr/testify v1.10.0 go.uber.org/zap v1.27.0 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect - github.com/kr/pretty v0.1.0 // indirect + github.com/kr/pretty v0.3.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/rogpeppe/go-internal v1.10.0 // indirect github.com/stretchr/objx v0.5.2 // indirect go.uber.org/multierr v1.11.0 // indirect - gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/observer/go.sum b/extension/observer/go.sum index bc6b92469eb7..b3a5565664bc 100644 --- a/extension/observer/go.sum +++ b/extension/observer/go.sum @@ -1,17 +1,23 @@ +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -19,7 +25,7 @@ go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8 go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/extension/observer/hostobserver/README.md b/extension/observer/hostobserver/README.md index f18e7019e930..be4f4063646d 100644 --- a/extension/observer/hostobserver/README.md +++ b/extension/observer/hostobserver/README.md @@ -4,12 +4,13 @@ | Status | | | ------------- |-----------| | Stability | [beta] | -| Distributions | [contrib] | +| Distributions | [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fhostobserver%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fhostobserver) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fhostobserver%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fhostobserver) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@MovieStoreGuy](https://www.github.com/MovieStoreGuy) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s The `host_observer` looks at the current host for listening network endpoints. diff --git a/extension/observer/hostobserver/config.go b/extension/observer/hostobserver/config.go index 7b955eedc741..73ef12082a13 100644 --- a/extension/observer/hostobserver/config.go +++ b/extension/observer/hostobserver/config.go @@ -9,7 +9,6 @@ import ( // Config defines configuration for host observer. type Config struct { - // RefreshInterval determines how frequency at which the observer // needs to poll for collecting information about new processes. RefreshInterval time.Duration `mapstructure:"refresh_interval"` diff --git a/extension/observer/hostobserver/config_test.go b/extension/observer/hostobserver/config_test.go index 215beed4e86a..12f04b01a925 100644 --- a/extension/observer/hostobserver/config_test.go +++ b/extension/observer/hostobserver/config_test.go @@ -42,7 +42,7 @@ func TestLoadConfig(t *testing.T) { cfg := factory.CreateDefaultConfig() sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) diff --git a/extension/observer/hostobserver/extension.go b/extension/observer/hostobserver/extension.go index 4817ddcd1fa5..b3964720d9ff 100644 --- a/extension/observer/hostobserver/extension.go +++ b/extension/observer/hostobserver/extension.go @@ -9,8 +9,8 @@ import ( "runtime" "syscall" - "github.com/shirou/gopsutil/v3/net" - "github.com/shirou/gopsutil/v3/process" + "github.com/shirou/gopsutil/v4/net" + "github.com/shirou/gopsutil/v4/process" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/extension" "go.uber.org/zap" @@ -34,7 +34,7 @@ type endpointsLister struct { var _ extension.Extension = (*hostObserver)(nil) -func newObserver(params extension.CreateSettings, config *Config) (extension.Extension, error) { +func newObserver(params extension.Settings, config *Config) (extension.Extension, error) { h := &hostObserver{ EndpointsWatcher: observer.NewEndpointsWatcher( endpointsLister{ diff --git a/extension/observer/hostobserver/extension_test.go b/extension/observer/hostobserver/extension_test.go index 2c010619fa2e..964136b84a4b 100644 --- a/extension/observer/hostobserver/extension_test.go +++ b/extension/observer/hostobserver/extension_test.go @@ -15,8 +15,8 @@ import ( "testing" "time" - psnet "github.com/shirou/gopsutil/v3/net" - "github.com/shirou/gopsutil/v3/process" + psnet "github.com/shirou/gopsutil/v4/net" + "github.com/shirou/gopsutil/v4/process" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component/componenttest" @@ -80,11 +80,11 @@ func TestHostObserver(t *testing.T) { t.Run(tt.name, func(t *testing.T) { hostPorts, notifier := tt.setup() if tt.errorListingConnections { - require.Equal(t, len(notifier.endpointsMap), 0) + require.Empty(t, notifier.endpointsMap) return } - require.True(t, len(notifier.endpointsMap) >= len(hostPorts)) + require.GreaterOrEqual(t, len(notifier.endpointsMap), len(hostPorts)) for _, hp := range hostPorts { require.NoError(t, hp.err, "Failed to et host and port") @@ -111,7 +111,6 @@ func TestHostObserver(t *testing.T) { assert.Equal(t, filepath.Base(exe), details.ProcessName) assert.Equal(t, tt.protocol, details.Transport) assert.Equal(t, isIPv6, details.IsIPv6) - } }) } @@ -156,7 +155,8 @@ func getExpectedHost(host string, isIPv6 bool) string { func startAndStopObserver( t *testing.T, - getConnectionsOverride func() (conns []psnet.ConnectionStat, err error)) mockNotifier { + getConnectionsOverride func() (conns []psnet.ConnectionStat, err error), +) mockNotifier { ml := endpointsLister{ logger: zap.NewNop(), observerName: "host_observer/1", diff --git a/extension/observer/hostobserver/factory.go b/extension/observer/hostobserver/factory.go index 9598c48ab767..7e91bb38df97 100644 --- a/extension/observer/hostobserver/factory.go +++ b/extension/observer/hostobserver/factory.go @@ -35,7 +35,7 @@ func createDefaultConfig() component.Config { func createExtension( _ context.Context, - params extension.CreateSettings, + params extension.Settings, cfg component.Config, ) (extension.Extension, error) { return newObserver(params, cfg.(*Config)) diff --git a/extension/observer/hostobserver/factory_test.go b/extension/observer/hostobserver/factory_test.go index 5424294992bd..cf53f0864b8f 100644 --- a/extension/observer/hostobserver/factory_test.go +++ b/extension/observer/hostobserver/factory_test.go @@ -17,10 +17,10 @@ func TestValidConfig(t *testing.T) { require.NoError(t, err) } -func TestCreateMetricsReceiver(t *testing.T) { +func TestCreateMetrics(t *testing.T) { hostObserver, err := createExtension( context.Background(), - extensiontest.NewNopCreateSettings(), + extensiontest.NewNopSettings(), &Config{}, ) require.NoError(t, err) diff --git a/extension/observer/hostobserver/generated_component_test.go b/extension/observer/hostobserver/generated_component_test.go index 46ab01a86efe..8519ef955b16 100644 --- a/extension/observer/hostobserver/generated_component_test.go +++ b/extension/observer/hostobserver/generated_component_test.go @@ -30,18 +30,18 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) t.Run("shutdown", func(t *testing.T) { - e, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + e, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) err = e.Shutdown(context.Background()) require.NoError(t, err) }) t.Run("lifecycle", func(t *testing.T) { - firstExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + firstExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, firstExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, firstExt.Shutdown(context.Background())) - secondExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + secondExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, secondExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, secondExt.Shutdown(context.Background())) diff --git a/extension/observer/hostobserver/go.mod b/extension/observer/hostobserver/go.mod index da4fff89cdd6..016bd879306f 100644 --- a/extension/observer/hostobserver/go.mod +++ b/extension/observer/hostobserver/go.mod @@ -1,59 +1,54 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/hostobserver -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer v0.102.0 - github.com/shirou/gopsutil/v3 v3.24.4 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer v0.116.0 + github.com/shirou/gopsutil/v4 v4.24.10 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/ebitengine/purego v0.8.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/observer/hostobserver/go.sum b/extension/observer/hostobserver/go.sum index 146f1b321e55..ac95032958d3 100644 --- a/extension/observer/hostobserver/go.sum +++ b/extension/observer/hostobserver/go.sum @@ -1,23 +1,21 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/BE= +github.com/ebitengine/purego v0.8.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -28,8 +26,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -44,32 +42,14 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= -github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= -github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= -github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= -github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= -github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/shirou/gopsutil/v4 v4.24.10 h1:7VOzPtfw/5YDU+jLEoBwXwxJbQetULywoSV4RYY7HkM= +github.com/shirou/gopsutil/v4 v4.24.10/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= @@ -78,28 +58,30 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -115,8 +97,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -127,13 +109,12 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -142,15 +123,14 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/extension/observer/hostobserver/internal/metadata/generated_status.go b/extension/observer/hostobserver/internal/metadata/generated_status.go index 4259a9d88e3a..7172b7d48813 100644 --- a/extension/observer/hostobserver/internal/metadata/generated_status.go +++ b/extension/observer/hostobserver/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("host_observer") + Type = component.MustNewType("host_observer") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/hostobserver" ) const ( diff --git a/extension/observer/hostobserver/internal/metadata/generated_telemetry.go b/extension/observer/hostobserver/internal/metadata/generated_telemetry.go deleted file mode 100644 index ebf68e704a5c..000000000000 --- a/extension/observer/hostobserver/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/hostobserver") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/hostobserver") -} diff --git a/extension/observer/hostobserver/internal/metadata/generated_telemetry_test.go b/extension/observer/hostobserver/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 3cb466acd374..000000000000 --- a/extension/observer/hostobserver/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/hostobserver", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/hostobserver", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/observer/hostobserver/metadata.yaml b/extension/observer/hostobserver/metadata.yaml index 31f491184b7b..924da269d629 100644 --- a/extension/observer/hostobserver/metadata.yaml +++ b/extension/observer/hostobserver/metadata.yaml @@ -1,10 +1,9 @@ type: host_observer -scope_name: otelcol/hostobserver status: class: extension stability: beta: [extension] - distributions: [contrib] + distributions: [contrib, k8s] codeowners: active: [MovieStoreGuy] diff --git a/extension/observer/k8sobserver/README.md b/extension/observer/k8sobserver/README.md index ea77d04dc120..c4b2e85fa100 100644 --- a/extension/observer/k8sobserver/README.md +++ b/extension/observer/k8sobserver/README.md @@ -4,16 +4,18 @@ | Status | | | ------------- |-----------| | Stability | [alpha] | -| Distributions | [contrib] | +| Distributions | [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fk8sobserver%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fk8sobserver) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fk8sobserver%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fk8sobserver) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@rmfitzpatrick](https://www.github.com/rmfitzpatrick), [@dmitryax](https://www.github.com/dmitryax) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@dmitryax](https://www.github.com/dmitryax), [@ChrsMark](https://www.github.com/ChrsMark) | +| Emeritus | [@rmfitzpatrick](https://www.github.com/rmfitzpatrick) | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s The `k8s_observer` is a [Receiver Creator](../../../receiver/receivercreator/README.md)-compatible "watch observer" that will detect and report -Kubernetes pod, port, service and node endpoints via the Kubernetes API. +Kubernetes pod, port, container, service, ingress and node endpoints via the Kubernetes API. ## Example Config @@ -25,6 +27,7 @@ extensions: observe_pods: true observe_nodes: true observe_services: true + observe_ingresses: true receivers: receiver_creator: @@ -70,4 +73,173 @@ All fields are optional. | node | string | | The node name to limit the discovery of pod, port, and node endpoints. Providing no value (the default) results in discovering endpoints for all available nodes. | | observe_pods | bool | `true` | Whether to report observer pod and port endpoints. If `true` and `node` is specified it will only discover pod and port endpoints whose `spec.nodeName` matches the provided node name. If `true` and `node` isn't specified, it will discover all available pod and port endpoints. Please note that Collector connectivity to pods from other nodes is dependent on your cluster configuration and isn't guaranteed. | | observe_nodes | bool | `false` | Whether to report observer k8s.node endpoints. If `true` and `node` is specified it will only discover node endpoints whose `metadata.name` matches the provided node name. If `true` and `node` isn't specified, it will discover all available node endpoints. Please note that Collector connectivity to nodes is dependent on your cluster configuration and isn't guaranteed.| -| observe_services | bool | `false` | Whether to report observer k8s.service endpoints.| +| observe_services | bool | `false` | Whether to report observer k8s.service endpoints.| +| observe_ingresses | bool | `false` | Whether to report observer k8s.ingress endpoints.| + +More complete configuration examples on how to use this observer along with the `receiver_creator`, +can be found at the [Receiver Creator](../../../receiver/receivercreator/README.md)'s documentation. + +### Setting up RBAC permissions + +When using the `serviceAccount` `auth_type`, the service account of the pod running the agent needs to have the required permissions to +read the K8s resources it should observe (i.e. pods, nodes, services and ingresses). +Therefore, the service account running the pod needs to have the required `ClusterRole` which grants it the permission to +read those resources from the Kubernetes API. Below is an example of how to set this up: + +1. Create a `ServiceAccount` that the collector should use. + +```bash +< + + service: + pipelines: + metrics: + receivers: [receiver_creator] + exporters: [otlp] +EOF +``` + +4. Create the collector deployment, referring to the service account created earlier + +```bash +< ../ diff --git a/extension/observer/k8sobserver/go.sum b/extension/observer/k8sobserver/go.sum index c51aad3d53c5..c49e8073b673 100644 --- a/extension/observer/k8sobserver/go.sum +++ b/extension/observer/k8sobserver/go.sum @@ -34,19 +34,16 @@ github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb0 github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -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/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= @@ -58,6 +55,8 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -65,9 +64,8 @@ github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7 github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= @@ -82,12 +80,13 @@ github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8 github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= +github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -111,8 +110,6 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -125,7 +122,6 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -139,8 +135,8 @@ github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OI github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af h1:kmjWCqn2qkEml422C2Rrd27c3VGxi6a/6HNq8QmHRKM= +github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -172,8 +168,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -211,12 +207,12 @@ github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= -github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= +github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= +github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg= -github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/openshift/api v0.0.0-20180801171038-322a19404e37 h1:05irGU4HK4IauGGDbsk+ZHrm1wOzMLYjMlfaiqMrBYc= github.com/openshift/api v0.0.0-20180801171038-322a19404e37/go.mod h1:dh9o4Fs58gpFXGSYfnVxGR9PnV53I8TW84pQaJDdGiY= github.com/openshift/api v0.0.0-20210521075222-e273a339932a/go.mod h1:izBmoXbUu3z5kUa4FjZhvekTsyzIWiOoaIgJiZBBMQs= @@ -225,20 +221,13 @@ github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142 h1:ZHRIMCFIJN1 github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142/go.mod h1:fjS8r9mqDVsPb5td3NehsNOAWa4uiFkYEfVZioQ2gH0= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -255,37 +244,40 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -300,7 +292,6 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -332,7 +323,6 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -356,17 +346,15 @@ golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= -golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= +golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= +golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -374,7 +362,6 @@ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -401,27 +388,21 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= +golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -463,9 +444,8 @@ golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= -golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -485,8 +465,6 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -506,8 +484,8 @@ google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -515,8 +493,8 @@ google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -526,10 +504,8 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -558,28 +534,28 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.21.1/go.mod h1:FstGROTmsSHBarKc8bylzXih8BLNYTiS3TZcsoEDg2s= -k8s.io/api v0.29.3 h1:2ORfZ7+bGC3YJqGpV0KSDDEVf8hdGQ6A03/50vj8pmw= -k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80= +k8s.io/api v0.31.3 h1:umzm5o8lFbdN/hIXbrK9oRpOproJO62CV1zqxXrLgk8= +k8s.io/api v0.31.3/go.mod h1:UJrkIp9pnMOI9K2nlL6vwpxRzzEX5sWgn8kGQe92kCE= k8s.io/apimachinery v0.21.1/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY= -k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= -k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= +k8s.io/apimachinery v0.31.3 h1:6l0WhcYgasZ/wk9ktLq5vLaoXJJr5ts6lkaQzgeYPq4= +k8s.io/apimachinery v0.31.3/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= k8s.io/client-go v0.21.1/go.mod h1:/kEw4RgW+3xnBGzvp9IWxKSNA+lXn3A7AuH3gdOAzLs= -k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg= -k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= +k8s.io/client-go v0.31.3 h1:CAlZuM+PH2cm+86LOBemaJI/lQ5linJ6UFxKX/SoG+4= +k8s.io/client-go v0.31.3/go.mod h1:2CgjPUTpv3fE5dNygAr2NcM8nhHzXvxB8KL5gYc3kJs= k8s.io/code-generator v0.21.1/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= -k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= 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= @@ -590,5 +566,5 @@ sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/extension/observer/k8sobserver/handler.go b/extension/observer/k8sobserver/handler.go index 859738a5c9c0..7e1e64c03f21 100644 --- a/extension/observer/k8sobserver/handler.go +++ b/extension/observer/k8sobserver/handler.go @@ -9,13 +9,16 @@ import ( "go.uber.org/zap" v1 "k8s.io/api/core/v1" + networkingv1 "k8s.io/api/networking/v1" "k8s.io/client-go/tools/cache" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer" ) -var _ cache.ResourceEventHandler = (*handler)(nil) -var _ observer.EndpointsLister = (*handler)(nil) +var ( + _ cache.ResourceEventHandler = (*handler)(nil) + _ observer.EndpointsLister = (*handler)(nil) +) // handler handles k8s cache informer callbacks. type handler struct { @@ -49,6 +52,8 @@ func (h *handler) OnAdd(objectInterface any, _ bool) { endpoints = convertPodToEndpoints(h.idNamespace, object) case *v1.Service: endpoints = convertServiceToEndpoints(h.idNamespace, object) + case *networkingv1.Ingress: + endpoints = convertIngressToEndpoints(h.idNamespace, object) case *v1.Node: endpoints = append(endpoints, convertNodeToEndpoint(h.idNamespace, object)) default: // unsupported @@ -92,6 +97,19 @@ func (h *handler) OnUpdate(oldObjectInterface, newObjectInterface any) { newEndpoints[e.ID] = e } + case *networkingv1.Ingress: + newIngress, ok := newObjectInterface.(*networkingv1.Ingress) + if !ok { + h.logger.Warn("skip updating endpoint for ingress as the update is of different type", zap.Any("oldIngress", oldObjectInterface), zap.Any("newObject", newObjectInterface)) + return + } + for _, e := range convertIngressToEndpoints(h.idNamespace, oldObject) { + oldEndpoints[e.ID] = e + } + for _, e := range convertIngressToEndpoints(h.idNamespace, newIngress) { + newEndpoints[e.ID] = e + } + case *v1.Node: newNode, ok := newObjectInterface.(*v1.Node) if !ok { @@ -165,6 +183,10 @@ func (h *handler) OnDelete(objectInterface any) { if object != nil { endpoints = convertServiceToEndpoints(h.idNamespace, object) } + case *networkingv1.Ingress: + if object != nil { + endpoints = convertIngressToEndpoints(h.idNamespace, object) + } case *v1.Node: if object != nil { endpoints = append(endpoints, convertNodeToEndpoint(h.idNamespace, object)) diff --git a/extension/observer/k8sobserver/handler_test.go b/extension/observer/k8sobserver/handler_test.go index 402b5fcc4213..5e74264c1707 100644 --- a/extension/observer/k8sobserver/handler_test.go +++ b/extension/observer/k8sobserver/handler_test.go @@ -36,7 +36,23 @@ func TestPodEndpointsAdded(t *testing.T) { UID: "pod-2-UID", Labels: map[string]string{"env": "prod"}, }, - }, { + }, + { + ID: "test-1/pod-2-UID/container-2", + Target: "1.2.3.4", + Details: &observer.PodContainer{ + Name: "container-2", + Image: "container-image-2", + ContainerID: "a808232bb4a57d421bb16f20dc9ab2a441343cb0aae8c369dc375838c7a49fd7", + Pod: observer.Pod{ + Name: "pod-2", + Namespace: "default", + UID: "pod-2-UID", + Labels: map[string]string{"env": "prod"}, + }, + }, + }, + { ID: "test-1/pod-2-UID/https(443)", Target: "1.2.3.4:443", Details: &observer.Port{ @@ -50,7 +66,8 @@ func TestPodEndpointsAdded(t *testing.T) { Port: 443, Transport: observer.ProtocolTCP, }, - }}, th.ListEndpoints()) + }, + }, th.ListEndpoints()) } func TestPodEndpointsRemoved(t *testing.T) { @@ -73,8 +90,8 @@ func TestPodEndpointsChanged(t *testing.T) { endpoints := th.ListEndpoints() require.ElementsMatch(t, - []observer.EndpointID{"test-1/pod-2-UID", "test-1/pod-2-UID/https(443)"}, - []observer.EndpointID{endpoints[0].ID, endpoints[1].ID}, + []observer.EndpointID{"test-1/pod-2-UID", "test-1/pod-2-UID/container-2", "test-1/pod-2-UID/https(443)"}, + []observer.EndpointID{endpoints[0].ID, endpoints[1].ID, endpoints[2].ID}, ) // Running state changed, one added and one removed. @@ -89,7 +106,24 @@ func TestPodEndpointsChanged(t *testing.T) { Name: "pod-2", Namespace: "default", UID: "pod-2-UID", - Labels: map[string]string{"env": "prod", "updated-label": "true"}}}, + Labels: map[string]string{"env": "prod", "updated-label": "true"}, + }, + }, + { + ID: "test-1/pod-2-UID/container-2", + Target: "1.2.3.4", + Details: &observer.PodContainer{ + Name: "container-2", + Image: "container-image-2", + ContainerID: "a808232bb4a57d421bb16f20dc9ab2a441343cb0aae8c369dc375838c7a49fd7", + Pod: observer.Pod{ + Name: "pod-2", + Namespace: "default", + UID: "pod-2-UID", + Labels: map[string]string{"env": "prod", "updated-label": "true"}, + }, + }, + }, { ID: "test-1/pod-2-UID/https(443)", Target: "1.2.3.4:443", @@ -98,9 +132,12 @@ func TestPodEndpointsChanged(t *testing.T) { Name: "pod-2", Namespace: "default", UID: "pod-2-UID", - Labels: map[string]string{"env": "prod", "updated-label": "true"}}, + Labels: map[string]string{"env": "prod", "updated-label": "true"}, + }, Port: 443, - Transport: observer.ProtocolTCP}}, + Transport: observer.ProtocolTCP, + }, + }, }, th.ListEndpoints()) } @@ -119,7 +156,8 @@ func TestServiceEndpointsAdded(t *testing.T) { ServiceType: "ClusterIP", ClusterIP: "1.2.3.4", }, - }}, th.ListEndpoints()) + }, + }, th.ListEndpoints()) } func TestServiceEndpointsRemoved(t *testing.T) { @@ -161,7 +199,73 @@ func TestServiceEndpointsChanged(t *testing.T) { Labels: map[string]string{"env": "prod", "updated-label": "true"}, ServiceType: "ClusterIP", ClusterIP: "1.2.3.4", - }}, + }, + }, + }, th.ListEndpoints()) +} + +func TestIngressEndpointsAdded(t *testing.T) { + th := newTestHandler() + th.OnAdd(ingress, true) + assert.ElementsMatch(t, []observer.Endpoint{ + { + ID: "test-1/ingress-1-UID/host-1/", + Target: "https://host-1/", + Details: &observer.K8sIngress{ + Name: "application-ingress", + Namespace: "default", + UID: "test-1/ingress-1-UID/host-1/", + Labels: map[string]string{"env": "prod"}, + Scheme: "https", + Host: "host-1", + Path: "/", + }, + }, + }, th.ListEndpoints()) +} + +func TestIngressEndpointsRemoved(t *testing.T) { + th := newTestHandler() + th.OnAdd(ingress, true) + th.OnDelete(ingress) + assert.Empty(t, th.ListEndpoints()) +} + +func TestIngressEndpointsChanged(t *testing.T) { + th := newTestHandler() + // Nothing changed. + th.OnUpdate(ingress, ingress) + require.Empty(t, th.ListEndpoints()) + + // Labels changed. + changedLabels := ingress.DeepCopy() + changedLabels.Labels["new-label"] = "value" + th.OnUpdate(ingress, changedLabels) + + endpoints := th.ListEndpoints() + require.ElementsMatch(t, + []observer.EndpointID{"test-1/ingress-1-UID/host-1/"}, + []observer.EndpointID{endpoints[0].ID}, + ) + + // Running state changed, one added and one removed. + updatedIngress := ingress.DeepCopy() + updatedIngress.Labels["updated-label"] = "true" + th.OnUpdate(ingress, updatedIngress) + require.ElementsMatch(t, []observer.Endpoint{ + { + ID: "test-1/ingress-1-UID/host-1/", + Target: "https://host-1/", + Details: &observer.K8sIngress{ + Name: "application-ingress", + Namespace: "default", + UID: "test-1/ingress-1-UID/host-1/", + Labels: map[string]string{"env": "prod", "updated-label": "true"}, + Scheme: "https", + Host: "host-1", + Path: "/", + }, + }, }, th.ListEndpoints()) } diff --git a/extension/observer/k8sobserver/ingress_endpoint.go b/extension/observer/k8sobserver/ingress_endpoint.go new file mode 100644 index 000000000000..622a7fe1ba4d --- /dev/null +++ b/extension/observer/k8sobserver/ingress_endpoint.go @@ -0,0 +1,102 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package k8sobserver // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/k8sobserver" + +import ( + "fmt" + "net/url" + "strings" + + v1 "k8s.io/api/networking/v1" + + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer" +) + +// convertIngressToEndpoints converts a ingress instance into a slice of endpoints. The endpoints +// include an endpoint for each path that is mapped to an ingress. +func convertIngressToEndpoints(idNamespace string, ingress *v1.Ingress) []observer.Endpoint { + endpoints := []observer.Endpoint{} + + // Loop through every ingress rule to get every defined path. + for _, rule := range ingress.Spec.Rules { + scheme := getScheme(rule.Host, getTLSHosts(ingress)) + + if rule.HTTP != nil { + // Create endpoint for each ingress rule. + for _, path := range rule.HTTP.Paths { + endpointID := observer.EndpointID(fmt.Sprintf("%s/%s/%s%s", idNamespace, ingress.UID, rule.Host, path.Path)) + endpoints = append(endpoints, observer.Endpoint{ + ID: endpointID, + Target: (&url.URL{ + Scheme: scheme, + Host: rule.Host, + Path: path.Path, + }).String(), + Details: &observer.K8sIngress{ + Name: ingress.Name, + UID: string(endpointID), + Labels: ingress.Labels, + Annotations: ingress.Annotations, + Namespace: ingress.Namespace, + Scheme: scheme, + Host: rule.Host, + Path: path.Path, + }, + }) + } + } + } + + return endpoints +} + +// getTLSHosts return a list of tls hosts for an ingress ressource. +func getTLSHosts(i *v1.Ingress) []string { + var hosts []string + + for _, tls := range i.Spec.TLS { + hosts = append(hosts, tls.Hosts...) + } + + return hosts +} + +// matchesHostPattern returns true if the host matches the host pattern or wildcard pattern. +func matchesHostPattern(pattern string, host string) bool { + // if host match the pattern (host pattern). + if pattern == host { + return true + } + + // if string does not contains any dot, don't do the next part as it's for wildcard pattern. + if !strings.Contains(host, ".") { + return false + } + + patternParts := strings.Split(pattern, ".") + hostParts := strings.Split(host, ".") + + // If the first part of the pattern is not a wildcard pattern. + if patternParts[0] != "*" { + return false + } + + // If host and pattern without wildcard part does not match. + if strings.Join(patternParts[1:], ".") != strings.Join(hostParts[1:], ".") { + return false + } + + return true +} + +// getScheme return the scheme of an ingress host based on tls configuration. +func getScheme(host string, tlsHosts []string) string { + for _, pattern := range tlsHosts { + if matchesHostPattern(pattern, host) { + return "https" + } + } + + return "http" +} diff --git a/extension/observer/k8sobserver/ingress_endpoint_test.go b/extension/observer/k8sobserver/ingress_endpoint_test.go new file mode 100644 index 000000000000..dcdb67c1da10 --- /dev/null +++ b/extension/observer/k8sobserver/ingress_endpoint_test.go @@ -0,0 +1,59 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package k8sobserver // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/k8sobserver" + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer" +) + +func TestIngressObjectToPortEndpoint(t *testing.T) { + expectedEndpoints := []observer.Endpoint{ + { + ID: "namespace/ingress-1-UID/host-1/", + Target: "https://host-1/", + Details: &observer.K8sIngress{ + Name: "application-ingress", + Namespace: "default", + UID: "namespace/ingress-1-UID/host-1/", + Labels: map[string]string{"env": "prod"}, + Scheme: "https", + Host: "host-1", + Path: "/", + }, + }, + { + ID: "namespace/ingress-1-UID/host.2.host/", + Target: "https://host.2.host/", + Details: &observer.K8sIngress{ + Name: "application-ingress", + Namespace: "default", + UID: "namespace/ingress-1-UID/host.2.host/", + Labels: map[string]string{"env": "prod"}, + Scheme: "https", + Host: "host.2.host", + Path: "/", + }, + }, + { + ID: "namespace/ingress-1-UID/host.3.host/test", + Target: "http://host.3.host/test", + Details: &observer.K8sIngress{ + Name: "application-ingress", + Namespace: "default", + UID: "namespace/ingress-1-UID/host.3.host/test", + Labels: map[string]string{"env": "prod"}, + Scheme: "http", + Host: "host.3.host", + Path: "/test", + }, + }, + } + + endpoints := convertIngressToEndpoints("namespace", ingressMultipleHost) + require.Equal(t, expectedEndpoints, endpoints) +} diff --git a/extension/observer/k8sobserver/internal/metadata/generated_status.go b/extension/observer/k8sobserver/internal/metadata/generated_status.go index 9d8dd8951e9d..0e2fe0f9991f 100644 --- a/extension/observer/k8sobserver/internal/metadata/generated_status.go +++ b/extension/observer/k8sobserver/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("k8s_observer") + Type = component.MustNewType("k8s_observer") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/k8sobserver" ) const ( diff --git a/extension/observer/k8sobserver/internal/metadata/generated_telemetry.go b/extension/observer/k8sobserver/internal/metadata/generated_telemetry.go deleted file mode 100644 index 242130881545..000000000000 --- a/extension/observer/k8sobserver/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/k8sobserver") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/k8sobserver") -} diff --git a/extension/observer/k8sobserver/internal/metadata/generated_telemetry_test.go b/extension/observer/k8sobserver/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 8cbee39adca3..000000000000 --- a/extension/observer/k8sobserver/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/k8sobserver", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/k8sobserver", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/observer/k8sobserver/k8s_fixtures_test.go b/extension/observer/k8sobserver/k8s_fixtures_test.go index 4f0acd4aa273..4ba6d62ee79e 100644 --- a/extension/observer/k8sobserver/k8s_fixtures_test.go +++ b/extension/observer/k8sobserver/k8s_fixtures_test.go @@ -5,6 +5,7 @@ package k8sobserver import ( v1 "k8s.io/api/core/v1" + networkingv1 "k8s.io/api/networking/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" ) @@ -38,12 +39,14 @@ func newPod(name, host string) *v1.Pod { return pod } -var pod1V1 = newPod("pod1", "localhost") -var pod1V2 = func() *v1.Pod { - pod := pod1V1.DeepCopy() - pod.Labels["pod-version"] = "2" - return pod -}() +var ( + pod1V1 = newPod("pod1", "localhost") + pod1V2 = func() *v1.Pod { + pod := pod1V1.DeepCopy() + pod.Labels["pod-version"] = "2" + return pod + }() +) var container1 = v1.Container{ Name: "container-1", @@ -70,7 +73,7 @@ var container1StatusWaiting = v1.ContainerStatus{ RestartCount: 1, Image: "container-image-1", ImageID: "12345", - ContainerID: "82389", + ContainerID: "containerd://a808232bb4a57d421bb16f20dc9ab2a441343cb0aae8c369dc375838c7a49fd7", Started: nil, } @@ -79,9 +82,10 @@ var container2StatusRunning = v1.ContainerStatus{ State: v1.ContainerState{ Running: &v1.ContainerStateRunning{StartedAt: metav1.Now()}, }, - Ready: true, - Image: "container-image-1", - Started: pointerBool(true), + Ready: true, + Image: "container-image-1", + Started: pointerBool(true), + ContainerID: "containerd://a808232bb4a57d421bb16f20dc9ab2a441343cb0aae8c369dc375838c7a49fd7", } var podWithNamedPorts = func() *v1.Pod { @@ -134,6 +138,103 @@ var serviceWithClusterIPV2 = func() *v1.Service { return service }() +var ingress = &networkingv1.Ingress{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "default", + Name: "application-ingress", + UID: types.UID("ingress-1-UID"), + Labels: map[string]string{ + "env": "prod", + }, + }, + Spec: networkingv1.IngressSpec{ + Rules: []networkingv1.IngressRule{ + { + Host: "host-1", + IngressRuleValue: networkingv1.IngressRuleValue{ + HTTP: &networkingv1.HTTPIngressRuleValue{ + Paths: []networkingv1.HTTPIngressPath{ + { + Path: "/", + }, + }, + }, + }, + }, + }, + TLS: []networkingv1.IngressTLS{ + { + Hosts: []string{"host-1"}, + }, + }, + }, +} + +var ingressV2 = func() *networkingv1.Ingress { + i2 := ingress.DeepCopy() + i2.Labels["env"] = "hardening" + return i2 +}() + +var ingressMultipleHost = &networkingv1.Ingress{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "default", + Name: "application-ingress", + UID: types.UID("ingress-1-UID"), + Labels: map[string]string{ + "env": "prod", + }, + }, + Spec: networkingv1.IngressSpec{ + Rules: []networkingv1.IngressRule{ + { + Host: "host-invalid", + }, + { + Host: "host-1", + IngressRuleValue: networkingv1.IngressRuleValue{ + HTTP: &networkingv1.HTTPIngressRuleValue{ + Paths: []networkingv1.HTTPIngressPath{ + { + Path: "/", + }, + }, + }, + }, + }, + { + Host: "host.2.host", + IngressRuleValue: networkingv1.IngressRuleValue{ + HTTP: &networkingv1.HTTPIngressRuleValue{ + Paths: []networkingv1.HTTPIngressPath{ + { + Path: "/", + }, + }, + }, + }, + }, + { + Host: "host.3.host", + IngressRuleValue: networkingv1.IngressRuleValue{ + HTTP: &networkingv1.HTTPIngressRuleValue{ + Paths: []networkingv1.HTTPIngressPath{ + { + Path: "/test", + }, + }, + }, + }, + }, + }, + TLS: []networkingv1.IngressTLS{ + { + Hosts: []string{"host-1", "*.2.host"}, + }, + }, + }, +} + // newNode is a helper function for creating Nodes for testing. func newNode(name, hostname string) *v1.Node { return &v1.Node{ @@ -177,9 +278,11 @@ func newNode(name, hostname string) *v1.Node { } } -var node1V1 = newNode("node1", "localhost") -var node1V2 = func() *v1.Node { - node := node1V1.DeepCopy() - node.Labels["node-version"] = "2" - return node -}() +var ( + node1V1 = newNode("node1", "localhost") + node1V2 = func() *v1.Node { + node := node1V1.DeepCopy() + node.Labels["node-version"] = "2" + return node + }() +) diff --git a/extension/observer/k8sobserver/metadata.yaml b/extension/observer/k8sobserver/metadata.yaml index c0a1b3e06460..8720c8489c63 100644 --- a/extension/observer/k8sobserver/metadata.yaml +++ b/extension/observer/k8sobserver/metadata.yaml @@ -1,15 +1,19 @@ type: k8s_observer -scope_name: otelcol/k8sobserver status: class: extension stability: alpha: [extension] - distributions: [contrib] + distributions: [contrib, k8s] codeowners: - active: [rmfitzpatrick, dmitryax] + active: [dmitryax, ChrsMark] + emeritus: [rmfitzpatrick] # TODO: Update the extension to make the tests pass tests: skip_lifecycle: true skip_shutdown: true + goleak: + ignore: + top: + - "k8s.io/apimachinery/pkg/watch.(*Broadcaster).loop" diff --git a/extension/observer/k8sobserver/pod_endpoint.go b/extension/observer/k8sobserver/pod_endpoint.go index e926d29a98eb..56653508d8b2 100644 --- a/extension/observer/k8sobserver/pod_endpoint.go +++ b/extension/observer/k8sobserver/pod_endpoint.go @@ -5,6 +5,7 @@ package k8sobserver // import "github.com/open-telemetry/opentelemetry-collector import ( "fmt" + "strings" v1 "k8s.io/api/core/v1" @@ -38,22 +39,41 @@ func convertPodToEndpoints(idNamespace string, pod *v1.Pod) []observer.Endpoint }} // Map of running containers by name. - containerRunning := map[string]bool{} + runningContainers := map[string]RunningContainer{} for _, container := range pod.Status.ContainerStatuses { if container.State.Running != nil { - containerRunning[container.Name] = true + runningContainers[container.Name] = containerIDWithRuntime(container) } } // Create endpoint for each named container port. for _, container := range pod.Spec.Containers { - if !containerRunning[container.Name] { + var runningContainer RunningContainer + var ok bool + if runningContainer, ok = runningContainers[container.Name]; !ok { continue } + endpointID := observer.EndpointID( + fmt.Sprintf( + "%s/%s", podID, container.Name, + ), + ) + endpoints = append(endpoints, observer.Endpoint{ + ID: endpointID, + Target: podIP, + Details: &observer.PodContainer{ + Name: container.Name, + ContainerID: runningContainer.ID, + Image: container.Image, + Pod: podDetails, + }, + }) + + // Create endpoint for each named container port. for _, port := range container.Ports { - endpointID := observer.EndpointID( + endpointID = observer.EndpointID( fmt.Sprintf( "%s/%s(%d)", podID, port.Name, port.ContainerPort, ), @@ -83,3 +103,20 @@ func getTransport(protocol v1.Protocol) observer.Transport { } return observer.ProtocolUnknown } + +// containerIDWithRuntime parses the container ID to get the actual ID string +func containerIDWithRuntime(c v1.ContainerStatus) RunningContainer { + cID := c.ContainerID + if cID != "" { + parts := strings.Split(cID, "://") + if len(parts) == 2 { + return RunningContainer{parts[1], parts[0]} + } + } + return RunningContainer{} +} + +type RunningContainer struct { + ID string + Runtime string +} diff --git a/extension/observer/k8sobserver/pod_endpoint_test.go b/extension/observer/k8sobserver/pod_endpoint_test.go index adf7b0b33353..8adeb20cab8d 100644 --- a/extension/observer/k8sobserver/pod_endpoint_test.go +++ b/extension/observer/k8sobserver/pod_endpoint_test.go @@ -20,7 +20,24 @@ func TestPodObjectToPortEndpoint(t *testing.T) { Name: "pod-2", Namespace: "default", UID: "pod-2-UID", - Labels: map[string]string{"env": "prod"}}}, + Labels: map[string]string{"env": "prod"}, + }, + }, + { + ID: "namespace/pod-2-UID/container-2", + Target: "1.2.3.4", + Details: &observer.PodContainer{ + Name: "container-2", + Image: "container-image-2", + ContainerID: "a808232bb4a57d421bb16f20dc9ab2a441343cb0aae8c369dc375838c7a49fd7", + Pod: observer.Pod{ + Name: "pod-2", + Namespace: "default", + UID: "pod-2-UID", + Labels: map[string]string{"env": "prod"}, + }, + }, + }, { ID: "namespace/pod-2-UID/https(443)", Target: "1.2.3.4:443", @@ -29,12 +46,14 @@ func TestPodObjectToPortEndpoint(t *testing.T) { Name: "pod-2", Namespace: "default", UID: "pod-2-UID", - Labels: map[string]string{"env": "prod"}}, + Labels: map[string]string{"env": "prod"}, + }, Port: 443, - Transport: observer.ProtocolTCP}}, + Transport: observer.ProtocolTCP, + }, + }, } endpoints := convertPodToEndpoints("namespace", podWithNamedPorts) require.Equal(t, expectedEndpoints, endpoints) - } diff --git a/extension/observer/k8sobserver/service_endpoint_test.go b/extension/observer/k8sobserver/service_endpoint_test.go index 391fd448b633..beda83a74c45 100644 --- a/extension/observer/k8sobserver/service_endpoint_test.go +++ b/extension/observer/k8sobserver/service_endpoint_test.go @@ -23,7 +23,8 @@ func TestServiceObjectToEndpoint(t *testing.T) { Labels: map[string]string{"env": "prod"}, ServiceType: "ClusterIP", ClusterIP: "1.2.3.4", - }}, + }, + }, } endpoints := convertServiceToEndpoints("namespace", serviceWithClusterIP) diff --git a/extension/observer/k8sobserver/testdata/config.yaml b/extension/observer/k8sobserver/testdata/config.yaml index 8e6163829025..6ff12eadc1e8 100644 --- a/extension/observer/k8sobserver/testdata/config.yaml +++ b/extension/observer/k8sobserver/testdata/config.yaml @@ -7,9 +7,11 @@ k8s_observer/observe-all: observe_nodes: true observe_pods: true observe_services: true + observe_ingresses: true k8s_observer/invalid_auth: auth_type: not a real auth type k8s_observer/invalid_no_observing: observe_nodes: false observe_pods: false observe_services: false + observe_ingresses: false diff --git a/extension/observer/metadata.yaml b/extension/observer/metadata.yaml index 66a66302e5f1..7509bde48a39 100644 --- a/extension/observer/metadata.yaml +++ b/extension/observer/metadata.yaml @@ -1,3 +1,4 @@ status: codeowners: - active: [dmitryax, rmfitzpatrick] \ No newline at end of file + active: [dmitryax] + emeritus: [rmfitzpatrick] \ No newline at end of file diff --git a/extension/oidcauthextension/README.md b/extension/oidcauthextension/README.md index 7b1ffe46e24e..5a24f22b65ff 100644 --- a/extension/oidcauthextension/README.md +++ b/extension/oidcauthextension/README.md @@ -4,12 +4,13 @@ | Status | | | ------------- |-----------| | Stability | [beta] | -| Distributions | [contrib] | +| Distributions | [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Foidcauth%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Foidcauth) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Foidcauth%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Foidcauth) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@jpkrohling](https://www.github.com/jpkrohling) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s This extension implements a `configauth.ServerAuthenticator`, to be used in receivers inside the `auth` settings. The authenticator type has to be set to `oidc`. diff --git a/extension/oidcauthextension/config.go b/extension/oidcauthextension/config.go index 327baea5365f..ff4ef3cdd42f 100644 --- a/extension/oidcauthextension/config.go +++ b/extension/oidcauthextension/config.go @@ -5,7 +5,6 @@ package oidcauthextension // import "github.com/open-telemetry/opentelemetry-col // Config has the configuration for the OIDC Authenticator extension. type Config struct { - // The attribute (header name) to look for auth data. Optional, default value: "authorization". Attribute string `mapstructure:"attribute"` diff --git a/extension/oidcauthextension/extension.go b/extension/oidcauthextension/extension.go index 52ce78b29154..c79e3231ef3a 100644 --- a/extension/oidcauthextension/extension.go +++ b/extension/oidcauthextension/extension.go @@ -27,10 +27,11 @@ import ( type oidcExtension struct { cfg *Config - provider *oidc.Provider - verifier *oidc.IDTokenVerifier - - logger *zap.Logger + provider *oidc.Provider + verifier *oidc.IDTokenVerifier + client *http.Client + logger *zap.Logger + transport *http.Transport } var ( @@ -53,19 +54,31 @@ func newExtension(cfg *Config, logger *zap.Logger) auth.Server { cfg: cfg, logger: logger, } - return auth.NewServer(auth.WithServerStart(oe.start), auth.WithServerAuthenticate(oe.authenticate)) + return auth.NewServer( + auth.WithServerStart(oe.start), + auth.WithServerAuthenticate(oe.authenticate), + auth.WithServerShutdown(oe.shutdown), + ) } -func (e *oidcExtension) start(context.Context, component.Host) error { - provider, err := getProviderForConfig(e.cfg) +func (e *oidcExtension) start(ctx context.Context, _ component.Host) error { + err := e.setProviderConfig(ctx, e.cfg) if err != nil { return fmt.Errorf("failed to get configuration from the auth server: %w", err) } - e.provider = provider - e.verifier = e.provider.Verifier(&oidc.Config{ ClientID: e.cfg.Audience, }) + return nil +} + +func (e *oidcExtension) shutdown(context.Context) error { + if e.client != nil { + e.client.CloseIdleConnections() + } + if e.transport != nil { + e.transport.CloseIdleConnections() + } return nil } @@ -124,6 +137,44 @@ func (e *oidcExtension) authenticate(ctx context.Context, headers map[string][]s return client.NewContext(ctx, cl), nil } +func (e *oidcExtension) setProviderConfig(ctx context.Context, config *Config) error { + e.transport = &http.Transport{ + Proxy: http.ProxyFromEnvironment, + DialContext: (&net.Dialer{ + Timeout: 5 * time.Second, + KeepAlive: 10 * time.Second, + DualStack: true, + }).DialContext, + ForceAttemptHTTP2: true, + MaxIdleConns: 100, + IdleConnTimeout: 90 * time.Second, + TLSHandshakeTimeout: 5 * time.Second, + ExpectContinueTimeout: 1 * time.Second, + } + + cert, err := getIssuerCACertFromPath(config.IssuerCAPath) + if err != nil { + return err // the errors from this path have enough context already + } + + if cert != nil { + e.transport.TLSClientConfig = &tls.Config{ + RootCAs: x509.NewCertPool(), + } + e.transport.TLSClientConfig.RootCAs.AddCert(cert) + } + + e.client = &http.Client{ + Timeout: 5 * time.Second, + Transport: e.transport, + } + oidcContext := oidc.ClientContext(ctx, e.client) + provider, err := oidc.NewProvider(oidcContext, config.IssuerURL) + e.provider = provider + + return err +} + func getSubjectFromClaims(claims map[string]any, usernameClaim string, fallback string) (string, error) { if len(usernameClaim) > 0 { username, found := claims[usernameClaim] @@ -167,41 +218,6 @@ func getGroupsFromClaims(claims map[string]any, groupsClaim string) ([]string, e return []string{}, nil } -func getProviderForConfig(config *Config) (*oidc.Provider, error) { - t := &http.Transport{ - Proxy: http.ProxyFromEnvironment, - DialContext: (&net.Dialer{ - Timeout: 5 * time.Second, - KeepAlive: 10 * time.Second, - DualStack: true, - }).DialContext, - ForceAttemptHTTP2: true, - MaxIdleConns: 100, - IdleConnTimeout: 90 * time.Second, - TLSHandshakeTimeout: 5 * time.Second, - ExpectContinueTimeout: 1 * time.Second, - } - - cert, err := getIssuerCACertFromPath(config.IssuerCAPath) - if err != nil { - return nil, err // the errors from this path have enough context already - } - - if cert != nil { - t.TLSClientConfig = &tls.Config{ - RootCAs: x509.NewCertPool(), - } - t.TLSClientConfig.RootCAs.AddCert(cert) - } - - client := &http.Client{ - Timeout: 5 * time.Second, - Transport: t, - } - oidcContext := oidc.ClientContext(context.Background(), client) - return oidc.NewProvider(oidcContext, config.IssuerURL) -} - func getIssuerCACertFromPath(path string) (*x509.Certificate, error) { if path == "" { return nil, nil diff --git a/extension/oidcauthextension/extension_test.go b/extension/oidcauthextension/extension_test.go index 72931882a19a..92b72d15fa14 100644 --- a/extension/oidcauthextension/extension_test.go +++ b/extension/oidcauthextension/extension_test.go @@ -112,11 +112,14 @@ func TestOIDCProviderForConfigWithTLS(t *testing.T) { } // test - provider, err := getProviderForConfig(config) + e := &oidcExtension{} + err = e.setProviderConfig(context.Background(), config) // verify assert.NoError(t, err) - assert.NotNil(t, provider) + assert.NotNil(t, e.provider) + assert.NotNil(t, e.client) + assert.NotNil(t, e.transport) } func TestOIDCLoadIssuerCAFromPath(t *testing.T) { @@ -185,11 +188,14 @@ func TestOIDCFailedToLoadIssuerCAFromPathInvalidContent(t *testing.T) { } // test - provider, err := getProviderForConfig(config) // cross test with getIssuerCACertFromPath + e := &oidcExtension{} + err = e.setProviderConfig(context.Background(), config) // verify assert.Error(t, err) - assert.Nil(t, provider) + assert.Nil(t, e.provider) + assert.Nil(t, e.client) + assert.NotNil(t, e.transport) } func TestOIDCInvalidAuthHeader(t *testing.T) { @@ -234,6 +240,9 @@ func TestProviderNotReacheable(t *testing.T) { // verify assert.Error(t, err) + + err = p.Shutdown(context.Background()) + assert.NoError(t, err) } func TestFailedToVerifyToken(t *testing.T) { diff --git a/extension/oidcauthextension/factory.go b/extension/oidcauthextension/factory.go index fee2c4352b6d..4c0f1010113f 100644 --- a/extension/oidcauthextension/factory.go +++ b/extension/oidcauthextension/factory.go @@ -32,6 +32,6 @@ func createDefaultConfig() component.Config { } } -func createExtension(_ context.Context, set extension.CreateSettings, cfg component.Config) (extension.Extension, error) { +func createExtension(_ context.Context, set extension.Settings, cfg component.Config) (extension.Extension, error) { return newExtension(cfg.(*Config), set.Logger), nil } diff --git a/extension/oidcauthextension/factory_test.go b/extension/oidcauthextension/factory_test.go index 02ce986f13d8..80b20293cb54 100644 --- a/extension/oidcauthextension/factory_test.go +++ b/extension/oidcauthextension/factory_test.go @@ -26,12 +26,12 @@ func TestCreateDefaultConfig(t *testing.T) { assert.NoError(t, componenttest.CheckConfigStruct(cfg)) } -func TestCreateExtension(t *testing.T) { +func TestCreate(t *testing.T) { cfg := createDefaultConfig().(*Config) cfg.Audience = "collector" cfg.IssuerURL = "https://auth.example.com" - ext, err := createExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + ext, err := createExtension(context.Background(), extensiontest.NewNopSettings(), cfg) assert.NoError(t, err) assert.NotNil(t, ext) } diff --git a/extension/oidcauthextension/generated_component_test.go b/extension/oidcauthextension/generated_component_test.go index 09ad77f2812d..b9b73ae0f03c 100644 --- a/extension/oidcauthextension/generated_component_test.go +++ b/extension/oidcauthextension/generated_component_test.go @@ -30,7 +30,7 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) t.Run("shutdown", func(t *testing.T) { - e, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + e, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) err = e.Shutdown(context.Background()) require.NoError(t, err) diff --git a/extension/oidcauthextension/generated_package_test.go b/extension/oidcauthextension/generated_package_test.go index 322491bcffe1..195328a56d6e 100644 --- a/extension/oidcauthextension/generated_package_test.go +++ b/extension/oidcauthextension/generated_package_test.go @@ -3,11 +3,11 @@ package oidcauthextension import ( - "os" "testing" + + "go.uber.org/goleak" ) func TestMain(m *testing.M) { - // skipping goleak test as per metadata.yml configuration - os.Exit(m.Run()) + goleak.VerifyTestMain(m) } diff --git a/extension/oidcauthextension/go.mod b/extension/oidcauthextension/go.mod index 1c989b508311..8ffe54dff355 100644 --- a/extension/oidcauthextension/go.mod +++ b/extension/oidcauthextension/go.mod @@ -1,57 +1,51 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/oidcauthextension -go 1.21.0 +go 1.22.0 require ( - github.com/coreos/go-oidc/v3 v3.10.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector v0.102.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/collector/extension/auth v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/coreos/go-oidc/v3 v3.11.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/client v1.22.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/auth v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 + go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-jose/go-jose/v4 v4.0.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-jose/go-jose/v4 v4.0.2 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/protobuf v1.5.4 // indirect github.com/google/uuid v1.6.0 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.23.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/oauth2 v0.18.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/oauth2 v0.23.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/oidcauthextension/go.sum b/extension/oidcauthextension/go.sum index 8f55dc93148e..f43b12b5950e 100644 --- a/extension/oidcauthextension/go.sum +++ b/extension/oidcauthextension/go.sum @@ -1,27 +1,20 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/coreos/go-oidc/v3 v3.10.0 h1:tDnXHnLyiTVyT/2zLDGj09pFPkhND8Gl8lnTRhoEaJU= -github.com/coreos/go-oidc/v3 v3.10.0/go.mod h1:5j11xcw0D3+SGxn6Z/WFADsgcWVMyNAlSQupk0KK3ac= +github.com/coreos/go-oidc/v3 v3.11.0 h1:Ia3MxdwpSw702YW0xgfmP1GVCMA9aEFWu12XUZ3/OtI= +github.com/coreos/go-oidc/v3 v3.11.0/go.mod h1:gE3LgjOgFoHi9a4ce4/tJczr0Ai2/BoDhf0r5lltWI0= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-jose/go-jose/v4 v4.0.1 h1:QVEPDE3OluqXBQZDcnNvQrInro2h0e4eqNbnZSWqS6U= -github.com/go-jose/go-jose/v4 v4.0.1/go.mod h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY= +github.com/go-jose/go-jose/v4 v4.0.2 h1:R3l3kkBds16bO7ZFAEEcofK0MkrAJt3jlJznWZG0nvk= +github.com/go-jose/go-jose/v4 v4.0.2/go.mod h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -34,8 +27,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -50,49 +43,42 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -102,62 +88,44 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= -golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= +golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/extension/oidcauthextension/internal/metadata/generated_status.go b/extension/oidcauthextension/internal/metadata/generated_status.go index a54ffac6ab34..3724fb64a00b 100644 --- a/extension/oidcauthextension/internal/metadata/generated_status.go +++ b/extension/oidcauthextension/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("oidc") + Type = component.MustNewType("oidc") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/oidcauthextension" ) const ( diff --git a/extension/oidcauthextension/internal/metadata/generated_telemetry.go b/extension/oidcauthextension/internal/metadata/generated_telemetry.go deleted file mode 100644 index 9312464b0d0d..000000000000 --- a/extension/oidcauthextension/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/oidcauth") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/oidcauth") -} diff --git a/extension/oidcauthextension/internal/metadata/generated_telemetry_test.go b/extension/oidcauthextension/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index f90bb7cdd313..000000000000 --- a/extension/oidcauthextension/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/oidcauth", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/oidcauth", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/oidcauthextension/metadata.yaml b/extension/oidcauthextension/metadata.yaml index 05f60809af07..775f6424c280 100644 --- a/extension/oidcauthextension/metadata.yaml +++ b/extension/oidcauthextension/metadata.yaml @@ -1,16 +1,13 @@ type: oidc -scope_name: otelcol/oidcauth status: class: extension stability: beta: [extension] - distributions: [contrib] + distributions: [contrib, k8s] codeowners: active: [jpkrohling] tests: config: skip_lifecycle: true - goleak: - skip: true diff --git a/extension/opampcustommessages/go.mod b/extension/opampcustommessages/go.mod index bee8259867ea..ae570bbaf804 100644 --- a/extension/opampcustommessages/go.mod +++ b/extension/opampcustommessages/go.mod @@ -1,7 +1,7 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/opampcustommessages -go 1.21.0 +go 1.22.0 -require github.com/open-telemetry/opamp-go v0.14.0 +require github.com/open-telemetry/opamp-go v0.17.0 -require google.golang.org/protobuf v1.33.0 // indirect +require google.golang.org/protobuf v1.34.2 // indirect diff --git a/extension/opampcustommessages/go.sum b/extension/opampcustommessages/go.sum index 494d37eede31..856df9d69ae9 100644 --- a/extension/opampcustommessages/go.sum +++ b/extension/opampcustommessages/go.sum @@ -1,8 +1,8 @@ github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/open-telemetry/opamp-go v0.14.0 h1:KoziIK+wsFojhUXNTkCSTnCPf0eCMqFAaccOs0HrWIY= -github.com/open-telemetry/opamp-go v0.14.0/go.mod h1:XOGCigljsLSTZ8FfLwvat0M1QDj3conIIgRa77BWrKs= +github.com/open-telemetry/opamp-go v0.17.0 h1:3R4+B/6Sy8mknLBbzO3gqloqwTT02rCSRcr4ac2B124= +github.com/open-telemetry/opamp-go v0.17.0/go.mod h1:SGDhUoAx7uGutO4ENNMQla/tiSujxgZmMPJXIOPGBdk= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= diff --git a/extension/opampcustommessages/metadata.yaml b/extension/opampcustommessages/metadata.yaml index 500fe1925983..5e444ca1560c 100644 --- a/extension/opampcustommessages/metadata.yaml +++ b/extension/opampcustommessages/metadata.yaml @@ -1,3 +1,3 @@ status: codeowners: - active: [BinaryFissionGames, evan-bradley] + active: [evan-bradley] diff --git a/extension/opampextension/README.md b/extension/opampextension/README.md index daf678858f3a..b01400998f44 100644 --- a/extension/opampextension/README.md +++ b/extension/opampextension/README.md @@ -3,12 +3,13 @@ | Status | | | ------------- |-----------| | Stability | [alpha] | -| Distributions | [contrib] | +| Distributions | [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fopamp%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fopamp) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fopamp%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fopamp) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@portertech](https://www.github.com/portertech), [@evan-bradley](https://www.github.com/evan-bradley), [@tigrannajaryan](https://www.github.com/tigrannajaryan) | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s ## Configuration @@ -19,17 +20,31 @@ The following settings are required: - `ws`: The OpAMP websocket transport settings. - `endpoint` (no default): The OpAMP server websocket endpoint (URL). -The following settings are optional: +The following settings are optional for the websocket client: - `server`: The OpAMP server connection settings. - `ws`: The OpAMP websocket transport settings. - `tls`: TLS settings. - `headers`: HTTP headers to set. -- `instance_uid`: A ULID formatted as a 26 character string in canonical + - `auth`: The ID of an auth extension to use for authentication. + +The following settings are optional for the HTTP client: + +- `server`: The OpAMP server connection settings. + - `http`: The OpAMP websocket transport settings. + - `tls`: TLS settings. + - `headers`: HTTP headers to set. + - `polling_interval`: The interval at which the extension will poll the server. Defaults to 30s. + - `auth`: The ID of an auth extension to use for authentication. + +The following settings are optional for both transports: + +- `instance_uid`: A UUIDv7 formatted as a 36 character string in canonical representation. Auto-generated on start if missing. Setting this ensures the instance UID remains constant across process restarts. - `capabilities`: Keys with boolean true/false values that enable a particular OpAMP capability. - `reports_effective_config`: Whether to enable the OpAMP ReportsEffectiveConfig capability. Default is `true`. + - `reports_health`: Whether to enable the OpAMP ReportsHealth capability. Default is `true`. - `agent_description`: Setting that modifies the agent description reported to the OpAMP server. - `non_identifying_attributes`: A map of key value pairs that will be added to the [non-identifying attributes](https://github.com/open-telemetry/opamp-spec/blob/main/specification.md#agentdescriptionnon_identifying_attributes) reported to the OpAMP server. If an attribute collides with the default non-identifying attributes that are automatically added, the ones specified here take precedence. - `ppid`: An optional process ID to monitor. When this process is no longer running, the extension will emit a fatal error, causing the collector to exit. This is meant to be set by the Supervisor or some other parent process, and should not be configured manually. diff --git a/extension/opampextension/auth.go b/extension/opampextension/auth.go new file mode 100644 index 000000000000..b1af4b7af078 --- /dev/null +++ b/extension/opampextension/auth.go @@ -0,0 +1,80 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package opampextension // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/opampextension" + +import ( + "bytes" + "fmt" + "io" + "net/http" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/extension/auth" + "go.uber.org/zap" +) + +// headerCaptureRoundTripper is a RoundTripper that captures the headers of the request +// that passes through it. +type headerCaptureRoundTripper struct { + lastHeader http.Header +} + +func (h *headerCaptureRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + h.lastHeader = req.Header.Clone() + // Dummy response is recorded here + return &http.Response{ + Status: "200 OK", + StatusCode: http.StatusOK, + Proto: "HTTP/1.0", + ProtoMajor: 1, + ProtoMinor: 0, + Body: io.NopCloser(&bytes.Buffer{}), + Request: req, + }, nil +} + +func makeHeadersFunc(logger *zap.Logger, serverCfg *OpAMPServer, host component.Host) (func(http.Header) http.Header, error) { + var emptyComponentID component.ID + if serverCfg == nil || serverCfg.GetAuthExtensionID() == emptyComponentID { + return nil, nil + } + + extID := serverCfg.GetAuthExtensionID() + ext, ok := host.GetExtensions()[extID] + if !ok { + return nil, fmt.Errorf("could not find auth extension %q", extID) + } + + authExt, ok := ext.(auth.Client) + if !ok { + return nil, fmt.Errorf("auth extension %q is not an auth.Client", extID) + } + + hcrt := &headerCaptureRoundTripper{} + rt, err := authExt.RoundTripper(hcrt) + if err != nil { + return nil, fmt.Errorf("could not create roundtripper for authentication: %w", err) + } + + return func(h http.Header) http.Header { + // This is a workaround while websocket authentication is being worked on. + // Currently, we are waiting on the auth module to be stabilized. + // See for more info: https://github.com/open-telemetry/opentelemetry-collector/issues/10864 + dummyReq, err := http.NewRequest(http.MethodGet, "http://example.com", nil) + if err != nil { + logger.Error("Failed to create dummy request for authentication.", zap.Error(err)) + return h + } + + dummyReq.Header = h + + _, err = rt.RoundTrip(dummyReq) + if err != nil { + logger.Error("Error while performing round-trip for authentication.", zap.Error(err)) + return h + } + + return hcrt.lastHeader + }, nil +} diff --git a/extension/opampextension/auth_test.go b/extension/opampextension/auth_test.go new file mode 100644 index 000000000000..e8447d693b06 --- /dev/null +++ b/extension/opampextension/auth_test.go @@ -0,0 +1,136 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package opampextension + +import ( + "context" + "net/http" + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.uber.org/zap" + "google.golang.org/grpc/credentials" +) + +func TestMakeHeadersFunc(t *testing.T) { + t.Run("Nil server config", func(t *testing.T) { + headersFunc, err := makeHeadersFunc(zap.NewNop(), nil, nil) + require.NoError(t, err) + require.Nil(t, headersFunc) + }) + + t.Run("No auth extension specified", func(t *testing.T) { + headersFunc, err := makeHeadersFunc(zap.NewNop(), &OpAMPServer{ + WS: &commonFields{}, + }, nil) + require.NoError(t, err) + require.Nil(t, headersFunc) + }) + + t.Run("Extension does not exist", func(t *testing.T) { + nopHost := componenttest.NewNopHost() + headersFunc, err := makeHeadersFunc(zap.NewNop(), &OpAMPServer{ + WS: &commonFields{ + Auth: component.NewID(component.MustNewType("bearerauth")), + }, + }, nopHost) + require.EqualError(t, err, `could not find auth extension "bearerauth"`) + require.Nil(t, headersFunc) + }) + + t.Run("Extension is not an auth extension", func(t *testing.T) { + authComponent := component.NewID(component.MustNewType("bearerauth")) + host := &mockHost{ + extensions: map[component.ID]component.Component{ + authComponent: mockComponent{}, + }, + } + headersFunc, err := makeHeadersFunc(zap.NewNop(), &OpAMPServer{ + WS: &commonFields{ + Auth: authComponent, + }, + }, host) + + require.EqualError(t, err, `auth extension "bearerauth" is not an auth.Client`) + require.Nil(t, headersFunc) + }) + + t.Run("Headers func extracts headers from extension", func(t *testing.T) { + authComponent := component.NewID(component.MustNewType("bearerauth")) + h := http.Header{} + h.Set("Authorization", "Bearer user:pass") + + host := &mockHost{ + extensions: map[component.ID]component.Component{ + authComponent: mockAuthClient{ + header: h, + }, + }, + } + headersFunc, err := makeHeadersFunc(zap.NewNop(), &OpAMPServer{ + WS: &commonFields{ + Auth: authComponent, + }, + }, host) + + require.NoError(t, err) + headersOut := headersFunc(http.Header{ + "OtherHeader": []string{"OtherValue"}, + }) + + require.Equal(t, http.Header{ + "OtherHeader": []string{"OtherValue"}, + "Authorization": []string{"Bearer user:pass"}, + }, headersOut) + }) +} + +type mockHost struct { + extensions map[component.ID]component.Component +} + +func (m mockHost) GetExtensions() map[component.ID]component.Component { + return m.extensions +} + +type mockComponent struct{} + +func (mockComponent) Start(_ context.Context, _ component.Host) error { return nil } +func (mockComponent) Shutdown(_ context.Context) error { return nil } + +type mockAuthClient struct { + header http.Header +} + +func (mockAuthClient) Start(_ context.Context, _ component.Host) error { return nil } +func (mockAuthClient) Shutdown(_ context.Context) error { return nil } +func (m mockAuthClient) RoundTripper(base http.RoundTripper) (http.RoundTripper, error) { + return mockRoundTripper{ + header: m.header, + base: base, + }, nil +} + +func (mockAuthClient) PerRPCCredentials() (credentials.PerRPCCredentials, error) { + return nil, nil +} + +type mockRoundTripper struct { + header http.Header + base http.RoundTripper +} + +func (m mockRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + reqClone := req.Clone(req.Context()) + + for k, vals := range m.header { + for _, val := range vals { + reqClone.Header.Add(k, val) + } + } + + return m.base.RoundTrip(reqClone) +} diff --git a/extension/opampextension/config.go b/extension/opampextension/config.go index ff141a7ef024..e47ae1894ed0 100644 --- a/extension/opampextension/config.go +++ b/extension/opampextension/config.go @@ -8,20 +8,24 @@ import ( "net/url" "time" - "github.com/oklog/ulid/v2" "github.com/open-telemetry/opamp-go/client" "github.com/open-telemetry/opamp-go/protobufs" + "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/config/configopaque" "go.opentelemetry.io/collector/config/configtls" "go.uber.org/zap" ) +// Default value for HTTP client's polling interval, set to 30 seconds in +// accordance with the OpAMP spec. +const httpPollingIntervalDefault = 30 * time.Second + // Config contains the configuration for the opamp extension. Trying to mirror // the OpAMP supervisor config for some consistency. type Config struct { Server *OpAMPServer `mapstructure:"server"` - // InstanceUID is a ULID formatted as a 26 character string in canonical + // InstanceUID is a UUID formatted as a 36 character string in canonical // representation. Auto-generated on start if missing. InstanceUID string `mapstructure:"instance_uid"` @@ -50,6 +54,8 @@ type AgentDescription struct { type Capabilities struct { // ReportsEffectiveConfig enables the OpAMP ReportsEffectiveConfig Capability. (default: true) ReportsEffectiveConfig bool `mapstructure:"reports_effective_config"` + // ReportsHealth enables the OpAMP ReportsHealth Capability. (default: true) + ReportsHealth bool `mapstructure:"reports_health"` } func (caps Capabilities) toAgentCapabilities() protobufs.AgentCapabilities { @@ -59,6 +65,9 @@ func (caps Capabilities) toAgentCapabilities() protobufs.AgentCapabilities { if caps.ReportsEffectiveConfig { agentCapabilities |= protobufs.AgentCapabilities_AgentCapabilities_ReportsEffectiveConfig } + if caps.ReportsHealth { + agentCapabilities |= protobufs.AgentCapabilities_AgentCapabilities_ReportsHealth + } return agentCapabilities } @@ -67,12 +76,7 @@ type commonFields struct { Endpoint string `mapstructure:"endpoint"` TLSSetting configtls.ClientConfig `mapstructure:"tls,omitempty"` Headers map[string]configopaque.String `mapstructure:"headers,omitempty"` -} - -// OpAMPServer contains the OpAMP transport configuration. -type OpAMPServer struct { - WS *commonFields `mapstructure:"ws,omitempty"` - HTTP *commonFields `mapstructure:"http,omitempty"` + Auth component.ID `mapstructure:"auth,omitempty"` } func (c *commonFields) Scheme() string { @@ -90,11 +94,38 @@ func (c *commonFields) Validate() error { return nil } +type httpFields struct { + commonFields `mapstructure:",squash"` + + PollingInterval time.Duration `mapstructure:"polling_interval"` +} + +func (h *httpFields) Validate() error { + if err := h.commonFields.Validate(); err != nil { + return err + } + + if h.PollingInterval < 0 { + return errors.New("polling interval must be 0 or greater") + } + + return nil +} + +// OpAMPServer contains the OpAMP transport configuration. +type OpAMPServer struct { + WS *commonFields `mapstructure:"ws,omitempty"` + HTTP *httpFields `mapstructure:"http,omitempty"` +} + func (s OpAMPServer) GetClient(logger *zap.Logger) client.OpAMPClient { if s.WS != nil { return client.NewWebSocket(newLoggerFromZap(logger.With(zap.String("client", "ws")))) } - return client.NewHTTP(newLoggerFromZap(logger.With(zap.String("client", "http")))) + + httpClient := client.NewHTTP(newLoggerFromZap(logger.With(zap.String("client", "http")))) + httpClient.SetPollingInterval(s.GetPollingInterval()) + return httpClient } func (s OpAMPServer) GetHeaders() map[string]configopaque.String { @@ -124,6 +155,25 @@ func (s OpAMPServer) GetEndpoint() string { return "" } +func (s OpAMPServer) GetAuthExtensionID() component.ID { + if s.WS != nil { + return s.WS.Auth + } else if s.HTTP != nil { + return s.HTTP.Auth + } + + var emptyComponentID component.ID + return emptyComponentID +} + +func (s OpAMPServer) GetPollingInterval() time.Duration { + if s.HTTP != nil && s.HTTP.PollingInterval > 0 { + return s.HTTP.PollingInterval + } + + return httpPollingIntervalDefault +} + // Validate checks if the extension configuration is valid func (cfg *Config) Validate() error { switch { @@ -142,7 +192,7 @@ func (cfg *Config) Validate() error { } if cfg.InstanceUID != "" { - _, err := ulid.ParseStrict(cfg.InstanceUID) + _, err := parseInstanceIDString(cfg.InstanceUID) if err != nil { return errors.New("opamp instance_uid is invalid") } diff --git a/extension/opampextension/config_test.go b/extension/opampextension/config_test.go index 5702e3fa0f32..7f50970f3184 100644 --- a/extension/opampextension/config_test.go +++ b/extension/opampextension/config_test.go @@ -8,9 +8,9 @@ import ( "testing" "time" + "github.com/open-telemetry/opamp-go/protobufs" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/config/configopaque" "go.opentelemetry.io/collector/config/configtls" "go.opentelemetry.io/collector/confmap" @@ -20,7 +20,7 @@ import ( func TestUnmarshalDefaultConfig(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() - assert.NoError(t, component.UnmarshalConfig(confmap.New(), cfg)) + assert.NoError(t, confmap.New().Unmarshal(cfg)) assert.Equal(t, factory.CreateDefaultConfig(), cfg) } @@ -29,7 +29,7 @@ func TestUnmarshalConfig(t *testing.T) { require.NoError(t, err) factory := NewFactory() cfg := factory.CreateDefaultConfig() - assert.NoError(t, component.UnmarshalConfig(cm, cfg)) + assert.NoError(t, cm.Unmarshal(cfg)) assert.Equal(t, &Config{ Server: &OpAMPServer{ @@ -40,6 +40,7 @@ func TestUnmarshalConfig(t *testing.T) { InstanceUID: "01BX5ZZKBKACTAV9WEVGEMMVRZ", Capabilities: Capabilities{ ReportsEffectiveConfig: true, + ReportsHealth: true, }, PPIDPollInterval: 5 * time.Second, }, cfg) @@ -50,17 +51,21 @@ func TestUnmarshalHttpConfig(t *testing.T) { require.NoError(t, err) factory := NewFactory() cfg := factory.CreateDefaultConfig() - assert.NoError(t, component.UnmarshalConfig(cm, cfg)) + assert.NoError(t, cm.Unmarshal(cfg)) assert.Equal(t, &Config{ Server: &OpAMPServer{ - HTTP: &commonFields{ - Endpoint: "https://127.0.0.1:4320/v1/opamp", + HTTP: &httpFields{ + commonFields: commonFields{ + Endpoint: "https://127.0.0.1:4320/v1/opamp", + }, + PollingInterval: 1 * time.Minute, }, }, InstanceUID: "01BX5ZZKBKACTAV9WEVGEMMVRZ", Capabilities: Capabilities{ ReportsEffectiveConfig: true, + ReportsHealth: true, }, PPIDPollInterval: 5 * time.Second, }, cfg) @@ -116,13 +121,15 @@ func TestConfig_Getters(t *testing.T) { name: "HTTP valid endpoint and valid instance id", fields: fields{ Server: &OpAMPServer{ - HTTP: &commonFields{ - Endpoint: "https://127.0.0.1:4320/v1/opamp", - Headers: map[string]configopaque.String{ - "test": configopaque.String("test"), - }, - TLSSetting: configtls.ClientConfig{ - Insecure: true, + HTTP: &httpFields{ + commonFields: commonFields{ + Endpoint: "https://127.0.0.1:4320/v1/opamp", + Headers: map[string]configopaque.String{ + "test": configopaque.String("test"), + }, + TLSSetting: configtls.ClientConfig{ + Insecure: true, + }, }, }, }, @@ -195,7 +202,7 @@ func TestConfig_Validate(t *testing.T) { name: "HTTP must have endpoint", fields: fields{ Server: &OpAMPServer{ - HTTP: &commonFields{}, + HTTP: &httpFields{}, }, }, wantErr: func(t assert.TestingT, err error, _ ...any) bool { @@ -206,8 +213,10 @@ func TestConfig_Validate(t *testing.T) { name: "HTTP valid endpoint and invalid instance id", fields: fields{ Server: &OpAMPServer{ - HTTP: &commonFields{ - Endpoint: "https://127.0.0.1:4320/v1/opamp", + HTTP: &httpFields{ + commonFields: commonFields{ + Endpoint: "https://127.0.0.1:4320/v1/opamp", + }, }, }, InstanceUID: "01BX5ZZKBKACTAV9WEVGEMMVRZFAIL", @@ -220,14 +229,33 @@ func TestConfig_Validate(t *testing.T) { name: "HTTP valid endpoint and valid instance id", fields: fields{ Server: &OpAMPServer{ - HTTP: &commonFields{ - Endpoint: "https://127.0.0.1:4320/v1/opamp", + HTTP: &httpFields{ + commonFields: commonFields{ + Endpoint: "https://127.0.0.1:4320/v1/opamp", + }, }, }, InstanceUID: "01BX5ZZKBKACTAV9WEVGEMMVRZ", }, wantErr: assert.NoError, }, + { + name: "HTTP invalid polling interval", + fields: fields{ + Server: &OpAMPServer{ + HTTP: &httpFields{ + commonFields: commonFields{ + Endpoint: "https://127.0.0.1:4320/v1/opamp", + }, + PollingInterval: -1, + }, + }, + InstanceUID: "01BX5ZZKBKACTAV9WEVGEMMVRZ", + }, + wantErr: func(t assert.TestingT, err error, _ ...any) bool { + return assert.Equal(t, "polling interval must be 0 or greater", err.Error()) + }, + }, { name: "neither config set", fields: fields{ @@ -242,7 +270,7 @@ func TestConfig_Validate(t *testing.T) { fields: fields{ Server: &OpAMPServer{ WS: &commonFields{}, - HTTP: &commonFields{}, + HTTP: &httpFields{}, }, }, wantErr: func(t assert.TestingT, err error, _ ...any) bool { @@ -261,3 +289,41 @@ func TestConfig_Validate(t *testing.T) { }) } } + +func TestCapabilities_toAgentCapabilities(t *testing.T) { + type fields struct { + ReportsEffectiveConfig bool + ReportsHealth bool + } + tests := []struct { + name string + fields fields + want protobufs.AgentCapabilities + }{ + { + name: "default capabilities", + fields: fields{ + ReportsEffectiveConfig: false, + ReportsHealth: false, + }, + want: protobufs.AgentCapabilities_AgentCapabilities_ReportsStatus, + }, + { + name: "all supported capabilities enabled", + fields: fields{ + ReportsEffectiveConfig: true, + ReportsHealth: true, + }, + want: protobufs.AgentCapabilities_AgentCapabilities_ReportsStatus | protobufs.AgentCapabilities_AgentCapabilities_ReportsEffectiveConfig | protobufs.AgentCapabilities_AgentCapabilities_ReportsHealth, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + caps := Capabilities{ + ReportsEffectiveConfig: tt.fields.ReportsEffectiveConfig, + ReportsHealth: tt.fields.ReportsHealth, + } + assert.Equalf(t, tt.want, caps.toAgentCapabilities(), "toAgentCapabilities()") + }) + } +} diff --git a/extension/opampextension/factory.go b/extension/opampextension/factory.go index 3f06c3a4d764..868c3bc85c65 100644 --- a/extension/opampextension/factory.go +++ b/extension/opampextension/factory.go @@ -27,11 +27,12 @@ func createDefaultConfig() component.Config { Server: &OpAMPServer{}, Capabilities: Capabilities{ ReportsEffectiveConfig: true, + ReportsHealth: true, }, PPIDPollInterval: 5 * time.Second, } } -func createExtension(_ context.Context, set extension.CreateSettings, cfg component.Config) (extension.Extension, error) { +func createExtension(_ context.Context, set extension.Settings, cfg component.Config) (extension.Extension, error) { return newOpampAgent(cfg.(*Config), set) } diff --git a/extension/opampextension/factory_test.go b/extension/opampextension/factory_test.go index 929bea8dcc05..eaa4d40c6d29 100644 --- a/extension/opampextension/factory_test.go +++ b/extension/opampextension/factory_test.go @@ -18,14 +18,16 @@ func TestFactory_CreateDefaultConfig(t *testing.T) { assert.Equal(t, createDefaultConfig().(*Config), cfg) assert.NoError(t, componenttest.CheckConfigStruct(cfg)) - ext, err := createExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + ext, err := createExtension(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NotNil(t, ext) + require.NoError(t, ext.Shutdown(context.Background())) } -func TestFactory_CreateExtension(t *testing.T) { +func TestFactory_Create(t *testing.T) { cfg := NewFactory().CreateDefaultConfig() - ext, err := createExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + ext, err := createExtension(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NotNil(t, ext) + require.NoError(t, ext.Shutdown(context.Background())) } diff --git a/extension/opampextension/generated_component_test.go b/extension/opampextension/generated_component_test.go index 0952bf2be112..6a15f45b7c2b 100644 --- a/extension/opampextension/generated_component_test.go +++ b/extension/opampextension/generated_component_test.go @@ -30,18 +30,18 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) t.Run("shutdown", func(t *testing.T) { - e, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + e, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) err = e.Shutdown(context.Background()) require.NoError(t, err) }) t.Run("lifecycle", func(t *testing.T) { - firstExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + firstExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, firstExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, firstExt.Shutdown(context.Background())) - secondExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + secondExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, secondExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, secondExt.Shutdown(context.Background())) diff --git a/extension/opampextension/go.mod b/extension/opampextension/go.mod index 930a89adb2de..7a15fed7ef3f 100644 --- a/extension/opampextension/go.mod +++ b/extension/opampextension/go.mod @@ -1,70 +1,72 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/opampextension -go 1.21.0 +go 1.22.0 require ( github.com/google/uuid v1.6.0 github.com/oklog/ulid/v2 v2.1.0 - github.com/open-telemetry/opamp-go v0.14.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/opampcustommessages v0.102.0 - github.com/shirou/gopsutil/v3 v3.24.4 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/config/configtls v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opamp-go v0.17.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/opampcustommessages v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status v0.116.0 + github.com/shirou/gopsutil/v4 v4.24.10 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componentstatus v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/config/configtls v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/auth v0.116.0 + go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 + go.opentelemetry.io/collector/semconv v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 + google.golang.org/grpc v1.68.1 gopkg.in/yaml.v3 v3.0.1 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cenkalti/backoff/v4 v4.2.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/ebitengine/purego v0.8.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/gorilla/websocket v1.5.1 // indirect + github.com/gorilla/websocket v1.5.3 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect github.com/rogpeppe/go-internal v1.11.0 // indirect - github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/tklauser/go-sysconf v0.3.14 // indirect github.com/tklauser/numcpus v0.8.0 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.20.0 + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/protobuf v1.35.2 // indirect ) replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/opampcustommessages => ../opampcustommessages + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status => ../../pkg/status diff --git a/extension/opampextension/go.sum b/extension/opampextension/go.sum index f2588c58f593..77dc227a8420 100644 --- a/extension/opampextension/go.sum +++ b/extension/opampextension/go.sum @@ -1,42 +1,39 @@ -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/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= -github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/BE= +github.com/ebitengine/purego v0.8.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= -github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -49,77 +46,65 @@ github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zx github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/oklog/ulid/v2 v2.1.0 h1:+9lhoxAP56we25tyYETBBY1YLA2SaoLvUFgrP2miPJU= github.com/oklog/ulid/v2 v2.1.0/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ= -github.com/open-telemetry/opamp-go v0.14.0 h1:KoziIK+wsFojhUXNTkCSTnCPf0eCMqFAaccOs0HrWIY= -github.com/open-telemetry/opamp-go v0.14.0/go.mod h1:XOGCigljsLSTZ8FfLwvat0M1QDj3conIIgRa77BWrKs= +github.com/open-telemetry/opamp-go v0.17.0 h1:3R4+B/6Sy8mknLBbzO3gqloqwTT02rCSRcr4ac2B124= +github.com/open-telemetry/opamp-go v0.17.0/go.mod h1:SGDhUoAx7uGutO4ENNMQla/tiSujxgZmMPJXIOPGBdk= github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= -github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= -github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= -github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= -github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= -github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/shirou/gopsutil/v4 v4.24.10 h1:7VOzPtfw/5YDU+jLEoBwXwxJbQetULywoSV4RYY7HkM= +github.com/shirou/gopsutil/v4 v4.24.10/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU= github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY= github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0 h1:bXDgoiDiwFfrO5S6q1Wpe0su303CW4Qxthoy4CxG6eg= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0/go.mod h1:uFZlAPxk2+s6zk1W+u22DgxxSDugWy0QaY5kQzjNy7Q= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -137,8 +122,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -147,15 +132,12 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -164,15 +146,14 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/extension/opampextension/internal/metadata/generated_status.go b/extension/opampextension/internal/metadata/generated_status.go index 095ec7f43ea6..4347ef2be2f6 100644 --- a/extension/opampextension/internal/metadata/generated_status.go +++ b/extension/opampextension/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("opamp") + Type = component.MustNewType("opamp") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/opampextension" ) const ( diff --git a/extension/opampextension/internal/metadata/generated_telemetry.go b/extension/opampextension/internal/metadata/generated_telemetry.go deleted file mode 100644 index be301f1ba681..000000000000 --- a/extension/opampextension/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/opamp") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/opamp") -} diff --git a/extension/opampextension/internal/metadata/generated_telemetry_test.go b/extension/opampextension/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 12542207d975..000000000000 --- a/extension/opampextension/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/opamp", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/opamp", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/opampextension/metadata.yaml b/extension/opampextension/metadata.yaml index 99944a1fee1a..14b4319dbdb4 100644 --- a/extension/opampextension/metadata.yaml +++ b/extension/opampextension/metadata.yaml @@ -1,11 +1,10 @@ type: opamp -scope_name: otelcol/opamp status: class: extension stability: alpha: [extension] - distributions: [contrib] + distributions: [contrib, k8s] codeowners: active: [portertech, evan-bradley, tigrannajaryan] diff --git a/extension/opampextension/monitor_ppid.go b/extension/opampextension/monitor_ppid.go index 40214e028741..d502cb54681c 100644 --- a/extension/opampextension/monitor_ppid.go +++ b/extension/opampextension/monitor_ppid.go @@ -8,25 +8,25 @@ import ( "fmt" "time" - "github.com/shirou/gopsutil/v3/process" - "go.opentelemetry.io/collector/component" + "github.com/shirou/gopsutil/v4/process" + "go.opentelemetry.io/collector/component/componentstatus" ) // monitorPPID polls for the existence of ppid. // If the specified ppid no longer exists, a fatal error event is reported via the passed in reportStatus function. -func monitorPPID(ctx context.Context, interval time.Duration, ppid int32, reportStatus func(*component.StatusEvent)) { +func monitorPPID(ctx context.Context, interval time.Duration, ppid int32, reportStatus func(*componentstatus.Event)) { for { exists, err := process.PidExistsWithContext(ctx, ppid) if err != nil { statusErr := fmt.Errorf("collector was orphaned, failed to find process with pid %d: %w", ppid, err) - status := component.NewFatalErrorEvent(statusErr) + status := componentstatus.NewFatalErrorEvent(statusErr) reportStatus(status) return } if !exists { statusErr := fmt.Errorf("collector was orphaned, process with pid %d does not exist", ppid) - status := component.NewFatalErrorEvent(statusErr) + status := componentstatus.NewFatalErrorEvent(statusErr) reportStatus(status) return } diff --git a/extension/opampextension/monitor_ppid_test.go b/extension/opampextension/monitor_ppid_test.go index c44de7501749..f61abeb23fff 100644 --- a/extension/opampextension/monitor_ppid_test.go +++ b/extension/opampextension/monitor_ppid_test.go @@ -12,7 +12,7 @@ import ( "time" "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componentstatus" ) func TestMonitorPPID(t *testing.T) { @@ -30,7 +30,7 @@ func TestMonitorPPID(t *testing.T) { _ = cmd.Wait() }) - statusReportFunc := func(se *component.StatusEvent) { + statusReportFunc := func(se *componentstatus.Event) { t.Logf("Status event error: %s", se.Err()) require.FailNow(t, "status report function should not be called") } @@ -53,8 +53,8 @@ func TestMonitorPPID(t *testing.T) { require.NoError(t, cmd.Start()) cmdPid := cmd.Process.Pid - var status *component.StatusEvent - statusReportFunc := func(evt *component.StatusEvent) { + var status *componentstatus.Event + statusReportFunc := func(evt *componentstatus.Event) { if status != nil { require.FailNow(t, "status report function should not be called twice") } @@ -71,7 +71,7 @@ func TestMonitorPPID(t *testing.T) { monitorPPID(context.Background(), 1*time.Millisecond, int32(cmdPid), statusReportFunc) require.NotNil(t, status) - require.Equal(t, component.StatusFatalError, status.Status()) + require.Equal(t, componentstatus.StatusFatalError, status.Status()) // wait for command stop goroutine to actually finish select { @@ -79,9 +79,7 @@ func TestMonitorPPID(t *testing.T) { case <-time.After(5 * time.Second): t.Fatalf("Timed out waiting for command to stop") } - }) - } func longRunningComand(ctx context.Context) *exec.Cmd { diff --git a/extension/opampextension/opamp_agent.go b/extension/opampextension/opamp_agent.go index f699005851ce..3e26d407fd80 100644 --- a/extension/opampextension/opamp_agent.go +++ b/extension/opampextension/opamp_agent.go @@ -5,6 +5,8 @@ package opampextension // import "github.com/open-telemetry/opentelemetry-collec import ( "context" + "errors" + "fmt" "net/http" "os" "runtime" @@ -17,22 +19,31 @@ import ( "github.com/open-telemetry/opamp-go/client" "github.com/open-telemetry/opamp-go/client/types" "github.com/open-telemetry/opamp-go/protobufs" + "github.com/shirou/gopsutil/v4/host" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componentstatus" "go.opentelemetry.io/collector/confmap" "go.opentelemetry.io/collector/extension" - semconv "go.opentelemetry.io/collector/semconv/v1.18.0" + "go.opentelemetry.io/collector/extension/extensioncapabilities" + semconv "go.opentelemetry.io/collector/semconv/v1.27.0" "go.uber.org/zap" "golang.org/x/exp/maps" + "golang.org/x/text/cases" + "golang.org/x/text/language" "gopkg.in/yaml.v3" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/opampcustommessages" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status" ) -const redactedVal = "[REDACTED]" +type statusAggregator interface { + Subscribe(scope status.Scope, verbosity status.Verbosity) (<-chan *status.AggregateStatus, status.UnsubscribeFunc) + RecordStatus(source *componentstatus.InstanceID, event *componentstatus.Event) +} -// Paths that will not have values redacted when reporting the effective config. -var unredactedPaths = []string{ - "service::pipelines", +type eventSourcePair struct { + source *componentstatus.InstanceID + event *componentstatus.Event } type opampAgent struct { @@ -42,7 +53,7 @@ type opampAgent struct { agentType string agentVersion string - instanceID ulid.ULID + instanceID uuid.UUID eclk sync.RWMutex effectiveConfig *confmap.Conf @@ -51,7 +62,7 @@ type opampAgent struct { lifetimeCtx context.Context lifetimeCtxCancel context.CancelFunc - reportFunc func(*component.StatusEvent) + reportFunc func(*componentstatus.Event) capabilities Capabilities @@ -60,11 +71,28 @@ type opampAgent struct { opampClient client.OpAMPClient customCapabilityRegistry *customCapabilityRegistry + + statusAggregator statusAggregator + statusSubscriptionWg *sync.WaitGroup + componentHealthWg *sync.WaitGroup + startTimeUnixNano uint64 + componentStatusCh chan *eventSourcePair + readyCh chan struct{} } -var _ opampcustommessages.CustomCapabilityRegistry = (*opampAgent)(nil) +var ( + _ opampcustommessages.CustomCapabilityRegistry = (*opampAgent)(nil) + _ extensioncapabilities.Dependent = (*opampAgent)(nil) + _ extensioncapabilities.ConfigWatcher = (*opampAgent)(nil) + _ extensioncapabilities.PipelineWatcher = (*opampAgent)(nil) + _ componentstatus.Watcher = (*opampAgent)(nil) +) + +func (o *opampAgent) Start(ctx context.Context, host component.Host) error { + o.reportFunc = func(event *componentstatus.Event) { + componentstatus.ReportStatus(host, event) + } -func (o *opampAgent) Start(ctx context.Context, _ component.Host) error { header := http.Header{} for k, v := range o.cfg.Server.GetHeaders() { header.Set(k, string(v)) @@ -75,17 +103,21 @@ func (o *opampAgent) Start(ctx context.Context, _ component.Host) error { return err } - o.lifetimeCtx, o.lifetimeCtxCancel = context.WithCancel(context.Background()) - if o.cfg.PPID != 0 { go monitorPPID(o.lifetimeCtx, o.cfg.PPIDPollInterval, o.cfg.PPID, o.reportFunc) } + headerFunc, err := makeHeadersFunc(o.logger, o.cfg.Server, host) + if err != nil { + return err + } + settings := types.StartSettings{ Header: header, + HeaderFunc: headerFunc, TLSConfig: tls, OpAMPServerURL: o.cfg.Server.GetEndpoint(), - InstanceUid: o.instanceID.String(), + InstanceUid: types.InstanceUid(o.instanceID), Callbacks: types.CallbacksStruct{ OnConnectFunc: func(_ context.Context) { o.logger.Debug("Connected to the OpAMP server") @@ -128,10 +160,17 @@ func (o *opampAgent) Shutdown(ctx context.Context) error { o.lifetimeCtxCancel() } + o.statusSubscriptionWg.Wait() + o.componentHealthWg.Wait() + if o.componentStatusCh != nil { + close(o.componentStatusCh) + } + o.logger.Debug("OpAMP agent shutting down...") if o.opampClient == nil { return nil } + o.logger.Debug("Stopping OpAMP client...") err := o.opampClient.Stop(ctx) // Opamp-go considers this an error, but the collector does not. @@ -142,6 +181,21 @@ func (o *opampAgent) Shutdown(ctx context.Context) error { return err } +// Dependencies implements extensioncapabilities.Dependent +func (o *opampAgent) Dependencies() []component.ID { + if o.cfg.Server == nil { + return nil + } + + var emptyComponentID component.ID + authID := o.cfg.Server.GetAuthExtensionID() + if authID == emptyComponentID { + return nil + } + + return []component.ID{authID} +} + func (o *opampAgent) NotifyConfig(ctx context.Context, conf *confmap.Conf) error { if o.capabilities.ReportsEffectiveConfig { o.updateEffectiveConfig(conf) @@ -154,6 +208,38 @@ func (o *opampAgent) Register(capability string, opts ...opampcustommessages.Cus return o.customCapabilityRegistry.Register(capability, opts...) } +func (o *opampAgent) Ready() error { + o.setHealth(&protobufs.ComponentHealth{Healthy: true}) + close(o.readyCh) + return nil +} + +func (o *opampAgent) NotReady() error { + o.setHealth(&protobufs.ComponentHealth{Healthy: false}) + return nil +} + +// ComponentStatusChanged implements the componentstatus.Watcher interface. +func (o *opampAgent) ComponentStatusChanged( + source *componentstatus.InstanceID, + event *componentstatus.Event, +) { + // There can be late arriving events after shutdown. We need to close + // the event channel so that this function doesn't block and we release all + // goroutines, but attempting to write to a closed channel will panic; log + // and recover. + defer func() { + if r := recover(); r != nil { + o.logger.Info( + "discarding event received after shutdown", + zap.Any("source", source), + zap.Any("event", event), + ) + } + }() + o.componentStatusCh <- &eventSourcePair{source: source, event: event} +} + func (o *opampAgent) updateEffectiveConfig(conf *confmap.Conf) { o.eclk.Lock() defer o.eclk.Unlock() @@ -161,7 +247,7 @@ func (o *opampAgent) updateEffectiveConfig(conf *confmap.Conf) { o.effectiveConfig = conf } -func newOpampAgent(cfg *Config, set extension.CreateSettings) (*opampAgent, error) { +func newOpampAgent(cfg *Config, set extension.Settings) (*opampAgent, error) { agentType := set.BuildInfo.Command sn, ok := set.Resource.Attributes().Get(semconv.AttributeServiceName) @@ -176,22 +262,23 @@ func newOpampAgent(cfg *Config, set extension.CreateSettings) (*opampAgent, erro agentVersion = sv.AsString() } - uid := ulid.Make() + uid, err := uuid.NewV7() + if err != nil { + return nil, fmt.Errorf("could not generate uuidv7: %w", err) + } if cfg.InstanceUID != "" { - puid, err := ulid.Parse(cfg.InstanceUID) + uid, err = parseInstanceIDString(cfg.InstanceUID) if err != nil { - return nil, err + return nil, fmt.Errorf("could not parse configured instance id: %w", err) } - uid = puid } else { sid, ok := set.Resource.Attributes().Get(semconv.AttributeServiceInstanceID) if ok { - parsedUUID, err := uuid.Parse(sid.AsString()) + uid, err = uuid.Parse(sid.AsString()) if err != nil { return nil, err } - uid = ulid.ULID(parsedUUID) } } @@ -204,13 +291,35 @@ func newOpampAgent(cfg *Config, set extension.CreateSettings) (*opampAgent, erro instanceID: uid, capabilities: cfg.Capabilities, opampClient: opampClient, + statusSubscriptionWg: &sync.WaitGroup{}, + componentHealthWg: &sync.WaitGroup{}, + readyCh: make(chan struct{}), customCapabilityRegistry: newCustomCapabilityRegistry(set.Logger, opampClient), - reportFunc: set.ReportStatus, + } + + agent.lifetimeCtx, agent.lifetimeCtxCancel = context.WithCancel(context.Background()) + + if agent.capabilities.ReportsHealth { + agent.initHealthReporting() } return agent, nil } +func parseInstanceIDString(instanceUID string) (uuid.UUID, error) { + parsedUUID, uuidParseErr := uuid.Parse(instanceUID) + if uuidParseErr == nil { + return parsedUUID, nil + } + + parsedULID, ulidParseErr := ulid.Parse(instanceUID) + if ulidParseErr == nil { + return uuid.UUID(parsedULID), nil + } + + return uuid.Nil, errors.Join(uuidParseErr, ulidParseErr) +} + func stringKeyValue(key, value string) *protobufs.KeyValue { return &protobufs.KeyValue{ Key: key, @@ -225,6 +334,7 @@ func (o *opampAgent) createAgentDescription() error { if err != nil { return err } + description := getOSDescription(o.logger) ident := []*protobufs.KeyValue{ stringKeyValue(semconv.AttributeServiceInstanceID, o.instanceID.String()), @@ -238,6 +348,7 @@ func (o *opampAgent) createAgentDescription() error { nonIdentifyingAttributeMap[semconv.AttributeOSType] = runtime.GOOS nonIdentifyingAttributeMap[semconv.AttributeHostArch] = runtime.GOARCH nonIdentifyingAttributeMap[semconv.AttributeHostName] = hostname + nonIdentifyingAttributeMap[semconv.AttributeOSDescription] = description for k, v := range o.cfg.AgentDescription.NonIdentifyingAttributes { nonIdentifyingAttributeMap[k] = v @@ -261,53 +372,13 @@ func (o *opampAgent) createAgentDescription() error { return nil } -func (o *opampAgent) updateAgentIdentity(instanceID ulid.ULID) { +func (o *opampAgent) updateAgentIdentity(instanceID uuid.UUID) { o.logger.Debug("OpAMP agent identity is being changed", zap.String("old_id", o.instanceID.String()), zap.String("new_id", instanceID.String())) o.instanceID = instanceID } -func redactConfig(cfg any, parentPath string) { - switch val := cfg.(type) { - case map[string]any: - for k, v := range val { - path := parentPath - if path == "" { - path = k - } else { - path += "::" + k - } - // We don't want to redact certain parts of the config - // that are known not to contain secrets, e.g. pipelines. - for _, p := range unredactedPaths { - if p == path { - return - } - } - switch x := v.(type) { - case map[string]any: - redactConfig(x, path) - case []any: - redactConfig(x, path) - default: - val[k] = redactedVal - } - } - case []any: - for i, v := range val { - switch x := v.(type) { - case map[string]any: - redactConfig(x, parentPath) - case []any: - redactConfig(x, parentPath) - default: - val[i] = redactedVal - } - } - } -} - func (o *opampAgent) composeEffectiveConfig() *protobufs.EffectiveConfig { o.eclk.RLock() defer o.eclk.RUnlock() @@ -317,7 +388,6 @@ func (o *opampAgent) composeEffectiveConfig() *protobufs.EffectiveConfig { } m := o.effectiveConfig.ToStringMap() - redactConfig(m, "") conf, err := yaml.Marshal(m) if err != nil { o.logger.Error("cannot unmarshal effectiveConfig", zap.Any("conf", o.effectiveConfig), zap.Error(err)) @@ -327,7 +397,10 @@ func (o *opampAgent) composeEffectiveConfig() *protobufs.EffectiveConfig { return &protobufs.EffectiveConfig{ ConfigMap: &protobufs.AgentConfigMap{ ConfigMap: map[string]*protobufs.AgentConfigFile{ - "": {Body: conf}, + "": { + Body: conf, + ContentType: "text/yaml", + }, }, }, } @@ -335,16 +408,163 @@ func (o *opampAgent) composeEffectiveConfig() *protobufs.EffectiveConfig { func (o *opampAgent) onMessage(_ context.Context, msg *types.MessageData) { if msg.AgentIdentification != nil { - instanceID, err := ulid.Parse(msg.AgentIdentification.NewInstanceUid) + instanceID, err := uuid.FromBytes(msg.AgentIdentification.NewInstanceUid) if err != nil { - o.logger.Error("Failed to parse a new agent identity", zap.Error(err)) - return + o.logger.Error("Invalid agent ID provided as new instance UID", zap.Error(err)) + } else { + o.updateAgentIdentity(instanceID) } - - o.updateAgentIdentity(instanceID) } if msg.CustomMessage != nil { o.customCapabilityRegistry.ProcessMessage(msg.CustomMessage) } } + +func (o *opampAgent) setHealth(ch *protobufs.ComponentHealth) { + if o.capabilities.ReportsHealth && o.opampClient != nil { + if ch.Healthy && o.startTimeUnixNano == 0 { + ch.StartTimeUnixNano = ch.StatusTimeUnixNano + } else { + ch.StartTimeUnixNano = o.startTimeUnixNano + } + if err := o.opampClient.SetHealth(ch); err != nil { + o.logger.Error("Could not report health to OpAMP server", zap.Error(err)) + } + } +} + +func getOSDescription(logger *zap.Logger) string { + info, err := host.Info() + if err != nil { + logger.Error("failed getting host info", zap.Error(err)) + return runtime.GOOS + } + switch runtime.GOOS { + case "darwin": + return "macOS " + info.PlatformVersion + case "linux": + return cases.Title(language.English).String(info.Platform) + " " + info.PlatformVersion + case "windows": + return info.Platform + " " + info.PlatformVersion + default: + return runtime.GOOS + } +} + +func (o *opampAgent) initHealthReporting() { + if !o.capabilities.ReportsHealth { + return + } + o.setHealth(&protobufs.ComponentHealth{Healthy: false}) + + if o.statusAggregator == nil { + o.statusAggregator = status.NewAggregator(status.PriorityPermanent) + } + statusChan, unsubscribeFunc := o.statusAggregator.Subscribe(status.ScopeAll, status.Verbose) + o.statusSubscriptionWg.Add(1) + go o.statusAggregatorEventLoop(unsubscribeFunc, statusChan) + + // Start processing events in the background so that our status watcher doesn't + // block others before the extension starts. + o.componentStatusCh = make(chan *eventSourcePair) + o.componentHealthWg.Add(1) + go o.componentHealthEventLoop() +} + +func (o *opampAgent) componentHealthEventLoop() { + // Record events with component.StatusStarting, but queue other events until + // PipelineWatcher.Ready is called. This prevents aggregate statuses from + // flapping between StatusStarting and StatusOK as components are started + // individually by the service. + var eventQueue []*eventSourcePair + + defer o.componentHealthWg.Done() + for loop := true; loop; { + select { + case esp, ok := <-o.componentStatusCh: + if !ok { + return + } + if esp.event.Status() != componentstatus.StatusStarting { + eventQueue = append(eventQueue, esp) + continue + } + o.statusAggregator.RecordStatus(esp.source, esp.event) + case <-o.readyCh: + for _, esp := range eventQueue { + o.statusAggregator.RecordStatus(esp.source, esp.event) + } + eventQueue = nil + loop = false + case <-o.lifetimeCtx.Done(): + return + } + } + + // After PipelineWatcher.Ready, record statuses as they are received. + for { + select { + case esp, ok := <-o.componentStatusCh: + if !ok { + return + } + o.statusAggregator.RecordStatus(esp.source, esp.event) + case <-o.lifetimeCtx.Done(): + return + } + } +} + +func (o *opampAgent) statusAggregatorEventLoop(unsubscribeFunc status.UnsubscribeFunc, statusChan <-chan *status.AggregateStatus) { + defer func() { + unsubscribeFunc() + o.statusSubscriptionWg.Done() + }() + for { + select { + case <-o.lifetimeCtx.Done(): + return + case statusUpdate, ok := <-statusChan: + if !ok { + return + } + + if statusUpdate == nil || statusUpdate.Status() == componentstatus.StatusNone { + continue + } + + componentHealth := convertComponentHealth(statusUpdate) + + o.setHealth(componentHealth) + } + } +} + +func convertComponentHealth(statusUpdate *status.AggregateStatus) *protobufs.ComponentHealth { + var isHealthy bool + if statusUpdate.Status() == componentstatus.StatusOK { + isHealthy = true + } else { + isHealthy = false + } + + componentHealth := &protobufs.ComponentHealth{ + Healthy: isHealthy, + Status: statusUpdate.Status().String(), + StatusTimeUnixNano: uint64(statusUpdate.Timestamp().UnixNano()), + } + + if statusUpdate.Err() != nil { + componentHealth.LastError = statusUpdate.Err().Error() + } + + if len(statusUpdate.ComponentStatusMap) > 0 { + componentHealth.ComponentHealthMap = map[string]*protobufs.ComponentHealth{} + for comp, compState := range statusUpdate.ComponentStatusMap { + componentHealth.ComponentHealthMap[comp] = convertComponentHealth(compState) + } + } + + return componentHealth +} diff --git a/extension/opampextension/opamp_agent_test.go b/extension/opampextension/opamp_agent_test.go index 48f76548ff9f..7921bd767470 100644 --- a/extension/opampextension/opamp_agent_test.go +++ b/extension/opampextension/opamp_agent_test.go @@ -5,25 +5,35 @@ package opampextension import ( "context" + "fmt" "os" "path/filepath" "runtime" + "sync" "testing" + "time" - "github.com/oklog/ulid/v2" + "github.com/google/uuid" + "github.com/open-telemetry/opamp-go/client/types" "github.com/open-telemetry/opamp-go/protobufs" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componentstatus" "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/confmap/confmaptest" + "go.opentelemetry.io/collector/extension" "go.opentelemetry.io/collector/extension/extensiontest" - semconv "go.opentelemetry.io/collector/semconv/v1.18.0" + semconv "go.opentelemetry.io/collector/semconv/v1.27.0" + "go.uber.org/zap" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status/testhelpers" ) func TestNewOpampAgent(t *testing.T) { cfg := createDefaultConfig() - set := extensiontest.NewNopCreateSettings() + set := extensiontest.NewNopSettings() set.BuildInfo = component.BuildInfo{Version: "test version", Command: "otelcoltest"} o, err := newOpampAgent(cfg.(*Config), set) assert.NoError(t, err) @@ -31,13 +41,15 @@ func TestNewOpampAgent(t *testing.T) { assert.Equal(t, "test version", o.agentVersion) assert.NotEmpty(t, o.instanceID.String()) assert.True(t, o.capabilities.ReportsEffectiveConfig) + assert.True(t, o.capabilities.ReportsHealth) assert.Empty(t, o.effectiveConfig) assert.Nil(t, o.agentDescription) + assert.NoError(t, o.Shutdown(context.Background())) } func TestNewOpampAgentAttributes(t *testing.T) { cfg := createDefaultConfig() - set := extensiontest.NewNopCreateSettings() + set := extensiontest.NewNopSettings() set.BuildInfo = component.BuildInfo{Version: "test version", Command: "otelcoltest"} set.Resource.Attributes().PutStr(semconv.AttributeServiceName, "otelcol-distro") set.Resource.Attributes().PutStr(semconv.AttributeServiceVersion, "distro.0") @@ -46,17 +58,18 @@ func TestNewOpampAgentAttributes(t *testing.T) { assert.NoError(t, err) assert.Equal(t, "otelcol-distro", o.agentType) assert.Equal(t, "distro.0", o.agentVersion) - assert.Equal(t, "7RK6DW2K4V8RCSQBKZ02EJ84FC", o.instanceID.String()) + assert.Equal(t, "f8999bc1-4c9b-4619-9bae-7f009d2411ec", o.instanceID.String()) + assert.NoError(t, o.Shutdown(context.Background())) } func TestCreateAgentDescription(t *testing.T) { hostname, err := os.Hostname() require.NoError(t, err) + description := getOSDescription(zap.NewNop()) serviceName := "otelcol-distrot" serviceVersion := "distro.0" serviceInstanceUUID := "f8999bc1-4c9b-4619-9bae-7f009d2411ec" - serviceInstanceULID := "7RK6DW2K4V8RCSQBKZ02EJ84FC" testCases := []struct { name string @@ -69,13 +82,14 @@ func TestCreateAgentDescription(t *testing.T) { cfg: func(_ *Config) {}, expected: &protobufs.AgentDescription{ IdentifyingAttributes: []*protobufs.KeyValue{ - stringKeyValue(semconv.AttributeServiceInstanceID, serviceInstanceULID), + stringKeyValue(semconv.AttributeServiceInstanceID, serviceInstanceUUID), stringKeyValue(semconv.AttributeServiceName, serviceName), stringKeyValue(semconv.AttributeServiceVersion, serviceVersion), }, NonIdentifyingAttributes: []*protobufs.KeyValue{ stringKeyValue(semconv.AttributeHostArch, runtime.GOARCH), stringKeyValue(semconv.AttributeHostName, hostname), + stringKeyValue(semconv.AttributeOSDescription, description), stringKeyValue(semconv.AttributeOSType, runtime.GOOS), }, }, @@ -90,7 +104,7 @@ func TestCreateAgentDescription(t *testing.T) { }, expected: &protobufs.AgentDescription{ IdentifyingAttributes: []*protobufs.KeyValue{ - stringKeyValue(semconv.AttributeServiceInstanceID, serviceInstanceULID), + stringKeyValue(semconv.AttributeServiceInstanceID, serviceInstanceUUID), stringKeyValue(semconv.AttributeServiceName, serviceName), stringKeyValue(semconv.AttributeServiceVersion, serviceVersion), }, @@ -99,6 +113,7 @@ func TestCreateAgentDescription(t *testing.T) { stringKeyValue(semconv.AttributeHostArch, runtime.GOARCH), stringKeyValue(semconv.AttributeHostName, hostname), stringKeyValue(semconv.AttributeK8SPodName, "my-very-cool-pod"), + stringKeyValue(semconv.AttributeOSDescription, description), stringKeyValue(semconv.AttributeOSType, runtime.GOOS), }, }, @@ -112,13 +127,14 @@ func TestCreateAgentDescription(t *testing.T) { }, expected: &protobufs.AgentDescription{ IdentifyingAttributes: []*protobufs.KeyValue{ - stringKeyValue(semconv.AttributeServiceInstanceID, serviceInstanceULID), + stringKeyValue(semconv.AttributeServiceInstanceID, serviceInstanceUUID), stringKeyValue(semconv.AttributeServiceName, serviceName), stringKeyValue(semconv.AttributeServiceVersion, serviceVersion), }, NonIdentifyingAttributes: []*protobufs.KeyValue{ stringKeyValue(semconv.AttributeHostArch, runtime.GOARCH), stringKeyValue(semconv.AttributeHostName, "override-host"), + stringKeyValue(semconv.AttributeOSDescription, description), stringKeyValue(semconv.AttributeOSType, runtime.GOOS), }, }, @@ -127,11 +143,10 @@ func TestCreateAgentDescription(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - cfg := createDefaultConfig().(*Config) tc.cfg(cfg) - set := extensiontest.NewNopCreateSettings() + set := extensiontest.NewNopSettings() set.Resource.Attributes().PutStr(semconv.AttributeServiceName, serviceName) set.Resource.Attributes().PutStr(semconv.AttributeServiceVersion, serviceVersion) set.Resource.Attributes().PutStr(semconv.AttributeServiceInstanceID, serviceInstanceUUID) @@ -143,29 +158,31 @@ func TestCreateAgentDescription(t *testing.T) { err = o.createAgentDescription() assert.NoError(t, err) require.Equal(t, tc.expected, o.agentDescription) + assert.NoError(t, o.Shutdown(context.Background())) }) } } func TestUpdateAgentIdentity(t *testing.T) { cfg := createDefaultConfig() - set := extensiontest.NewNopCreateSettings() + set := extensiontest.NewNopSettings() o, err := newOpampAgent(cfg.(*Config), set) assert.NoError(t, err) olduid := o.instanceID assert.NotEmpty(t, olduid.String()) - uid := ulid.Make() + uid := uuid.Must(uuid.NewV7()) assert.NotEqual(t, uid, olduid) o.updateAgentIdentity(uid) assert.Equal(t, o.instanceID, uid) + assert.NoError(t, o.Shutdown(context.Background())) } func TestComposeEffectiveConfig(t *testing.T) { cfg := createDefaultConfig() - set := extensiontest.NewNopCreateSettings() + set := extensiontest.NewNopSettings() o, err := newOpampAgent(cfg.(*Config), set) assert.NoError(t, err) assert.Empty(t, o.effectiveConfig) @@ -176,32 +193,506 @@ func TestComposeEffectiveConfig(t *testing.T) { ecFileName := filepath.Join("testdata", "effective.yaml") cm, err := confmaptest.LoadConf(ecFileName) assert.NoError(t, err) - redactedFileName := filepath.Join("testdata", "effective-redacted.yaml") - expected, err := os.ReadFile(redactedFileName) + expected, err := os.ReadFile(ecFileName) assert.NoError(t, err) o.updateEffectiveConfig(cm) ec = o.composeEffectiveConfig() assert.NotNil(t, ec) assert.YAMLEq(t, string(expected), string(ec.ConfigMap.ConfigMap[""].Body)) + assert.Equal(t, "text/yaml", ec.ConfigMap.ConfigMap[""].ContentType) + + assert.NoError(t, o.Shutdown(context.Background())) } func TestShutdown(t *testing.T) { cfg := createDefaultConfig() - set := extensiontest.NewNopCreateSettings() + set := extensiontest.NewNopSettings() o, err := newOpampAgent(cfg.(*Config), set) assert.NoError(t, err) // Shutdown with no OpAMP client - assert.NoError(t, o.Shutdown(context.TODO())) + assert.NoError(t, o.Shutdown(context.Background())) } func TestStart(t *testing.T) { cfg := createDefaultConfig() - set := extensiontest.NewNopCreateSettings() + set := extensiontest.NewNopSettings() o, err := newOpampAgent(cfg.(*Config), set) assert.NoError(t, err) - assert.NoError(t, o.Start(context.TODO(), componenttest.NewNopHost())) - assert.NoError(t, o.Shutdown(context.TODO())) + assert.NoError(t, o.Start(context.Background(), componenttest.NewNopHost())) + assert.NoError(t, o.Shutdown(context.Background())) +} + +func TestHealthReportingReceiveUpdateFromAggregator(t *testing.T) { + cfg := createDefaultConfig().(*Config) + set := extensiontest.NewNopSettings() + + statusUpdateChannel := make(chan *status.AggregateStatus) + + mtx := &sync.RWMutex{} + now := time.Now() + expectedHealthUpdates := []*protobufs.ComponentHealth{ + { + Healthy: false, + }, + { + Healthy: true, + StartTimeUnixNano: uint64(now.UnixNano()), + Status: "StatusOK", + StatusTimeUnixNano: uint64(now.UnixNano()), + ComponentHealthMap: map[string]*protobufs.ComponentHealth{ + "test-receiver": { + Healthy: true, + Status: "StatusOK", + StatusTimeUnixNano: uint64(now.UnixNano()), + }, + }, + }, + { + Healthy: false, + Status: "StatusPermanentError", + StatusTimeUnixNano: uint64(now.UnixNano()), + LastError: "unexpected error", + ComponentHealthMap: map[string]*protobufs.ComponentHealth{ + "test-receiver": { + Healthy: false, + Status: "StatusPermanentError", + StatusTimeUnixNano: uint64(now.UnixNano()), + LastError: "unexpected error", + }, + }, + }, + } + receivedHealthUpdates := 0 + + mockOpampClient := &mockOpAMPClient{ + setHealthFunc: func(health *protobufs.ComponentHealth) error { + mtx.Lock() + defer mtx.Unlock() + require.Equal(t, expectedHealthUpdates[receivedHealthUpdates], health) + receivedHealthUpdates++ + return nil + }, + } + + sa := &mockStatusAggregator{ + statusChan: statusUpdateChannel, + } + + o := newTestOpampAgent(cfg, set, mockOpampClient, sa) + + o.initHealthReporting() + + assert.NoError(t, o.Start(context.Background(), componenttest.NewNopHost())) + + statusUpdateChannel <- nil + statusUpdateChannel <- &status.AggregateStatus{ + Event: &mockStatusEvent{ + status: componentstatus.StatusOK, + err: nil, + timestamp: now, + }, + ComponentStatusMap: map[string]*status.AggregateStatus{ + "test-receiver": { + Event: &mockStatusEvent{ + status: componentstatus.StatusOK, + err: nil, + timestamp: now, + }, + }, + }, + } + statusUpdateChannel <- &status.AggregateStatus{ + Event: &mockStatusEvent{ + status: componentstatus.StatusPermanentError, + err: fmt.Errorf("unexpected error"), + timestamp: now, + }, + ComponentStatusMap: map[string]*status.AggregateStatus{ + "test-receiver": { + Event: &mockStatusEvent{ + status: componentstatus.StatusPermanentError, + err: fmt.Errorf("unexpected error"), + timestamp: now, + }, + }, + }, + } + + close(statusUpdateChannel) + + require.Eventually(t, func() bool { + mtx.RLock() + defer mtx.RUnlock() + return receivedHealthUpdates == len(expectedHealthUpdates) + }, 1*time.Second, 100*time.Millisecond) + + assert.NoError(t, o.Shutdown(context.Background())) + require.True(t, sa.unsubscribed) +} + +func TestHealthReportingForwardComponentHealthToAggregator(t *testing.T) { + cfg := createDefaultConfig().(*Config) + set := extensiontest.NewNopSettings() + + mtx := &sync.RWMutex{} + + sa := &mockStatusAggregator{ + mtx: mtx, + } + + o := newTestOpampAgent( + cfg, + set, + &mockOpAMPClient{ + setHealthFunc: func(_ *protobufs.ComponentHealth) error { + return nil + }, + }, sa) + + o.initHealthReporting() + + assert.NoError(t, o.Start(context.Background(), componenttest.NewNopHost())) + + traces := testhelpers.NewPipelineMetadata("traces") + + // StatusStarting will be sent immediately. + for _, id := range traces.InstanceIDs() { + o.ComponentStatusChanged(id, componentstatus.NewEvent(componentstatus.StatusStarting)) + } + + // StatusOK will be queued until the PipelineWatcher Ready method is called. + for _, id := range traces.InstanceIDs() { + o.ComponentStatusChanged(id, componentstatus.NewEvent(componentstatus.StatusOK)) + } + + // verify we have received the StatusStarting events + require.Eventually(t, func() bool { + mtx.RLock() + defer mtx.RUnlock() + return len(sa.receivedEvents) == len(traces.InstanceIDs()) + }, 5*time.Second, 100*time.Millisecond) + + for _, event := range sa.receivedEvents { + require.Equal(t, componentstatus.NewEvent(componentstatus.StatusStarting).Status(), event.event.Status()) + } + + // clean the received events of the mocked status aggregator + sa.receivedEvents = nil + + err := o.Ready() + require.NoError(t, err) + + // verify we have received the StatusOK events that have been queued while the agent has not been ready + require.Eventually(t, func() bool { + mtx.RLock() + defer mtx.RUnlock() + return len(sa.receivedEvents) == len(traces.InstanceIDs()) + }, 5*time.Second, 100*time.Millisecond) + + for _, event := range sa.receivedEvents { + require.Equal(t, componentstatus.NewEvent(componentstatus.StatusOK).Status(), event.event.Status()) + } + + // clean the received events of the mocked status aggregator + sa.receivedEvents = nil + + // send another set of events - these should be passed through immediately + for _, id := range traces.InstanceIDs() { + o.ComponentStatusChanged(id, componentstatus.NewEvent(componentstatus.StatusStopping)) + } + + require.Eventually(t, func() bool { + mtx.RLock() + defer mtx.RUnlock() + return len(sa.receivedEvents) == len(traces.InstanceIDs()) + }, 5*time.Second, 100*time.Millisecond) + + for _, event := range sa.receivedEvents { + require.Equal(t, componentstatus.NewEvent(componentstatus.StatusStopping).Status(), event.event.Status()) + } + + assert.NoError(t, o.Shutdown(context.Background())) + require.True(t, sa.unsubscribed) +} + +func TestHealthReportingExitsOnClosedContext(t *testing.T) { + cfg := createDefaultConfig().(*Config) + set := extensiontest.NewNopSettings() + + statusUpdateChannel := make(chan *status.AggregateStatus) + sa := &mockStatusAggregator{ + statusChan: statusUpdateChannel, + } + + mtx := &sync.RWMutex{} + now := time.Now() + expectedHealthUpdates := []*protobufs.ComponentHealth{ + { + Healthy: false, + }, + { + Healthy: true, + StartTimeUnixNano: uint64(now.UnixNano()), + Status: "StatusOK", + StatusTimeUnixNano: uint64(now.UnixNano()), + ComponentHealthMap: map[string]*protobufs.ComponentHealth{ + "test-receiver": { + Healthy: true, + Status: "StatusOK", + StatusTimeUnixNano: uint64(now.UnixNano()), + }, + }, + }, + } + receivedHealthUpdates := 0 + + mockOpampClient := &mockOpAMPClient{ + setHealthFunc: func(health *protobufs.ComponentHealth) error { + mtx.Lock() + defer mtx.Unlock() + require.Equal(t, expectedHealthUpdates[receivedHealthUpdates], health) + receivedHealthUpdates++ + return nil + }, + } + + o := newTestOpampAgent(cfg, set, mockOpampClient, sa) + + o.initHealthReporting() + + assert.NoError(t, o.Start(context.Background(), componenttest.NewNopHost())) + + statusUpdateChannel <- nil + statusUpdateChannel <- &status.AggregateStatus{ + Event: &mockStatusEvent{ + status: componentstatus.StatusOK, + err: nil, + timestamp: now, + }, + ComponentStatusMap: map[string]*status.AggregateStatus{ + "test-receiver": { + Event: &mockStatusEvent{ + status: componentstatus.StatusOK, + err: nil, + timestamp: now, + }, + }, + }, + } + + require.Eventually(t, func() bool { + mtx.RLock() + defer mtx.RUnlock() + return receivedHealthUpdates == len(expectedHealthUpdates) + }, 1*time.Second, 100*time.Millisecond) + + // invoke Shutdown before health update channel has been closed + assert.NoError(t, o.Shutdown(context.Background())) + require.True(t, sa.unsubscribed) +} + +func TestHealthReportingDisabled(t *testing.T) { + cfg := createDefaultConfig() + set := extensiontest.NewNopSettings() + o, err := newOpampAgent(cfg.(*Config), set) + assert.NoError(t, err) + + o.capabilities.ReportsHealth = false + o.opampClient = &mockOpAMPClient{ + setHealthFunc: func(_ *protobufs.ComponentHealth) error { + t.Errorf("setHealth is not supposed to be called with deactivated ReportsHealth capability") + return nil + }, + } + + assert.NoError(t, o.Start(context.Background(), componenttest.NewNopHost())) + assert.NoError(t, o.Shutdown(context.Background())) +} + +func TestParseInstanceIDString(t *testing.T) { + testCases := []struct { + name string + in string + expectedUUID uuid.UUID + expectedErr string + }{ + { + name: "Parses ULID", + in: "7RK6DW2K4V8RCSQBKZ02EJ84FC", + expectedUUID: uuid.MustParse("f8999bc1-4c9b-4619-9bae-7f009d2411ec"), + }, + { + name: "Parses UUID", + in: "f8999bc1-4c9b-4619-9bae-7f009d2411ec", + expectedUUID: uuid.MustParse("f8999bc1-4c9b-4619-9bae-7f009d2411ec"), + }, + { + name: "Fails on invalid format", + in: "not-a-valid-id", + expectedErr: "invalid UUID length: 14\nulid: bad data size when unmarshaling", + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + id, err := parseInstanceIDString(tc.in) + if tc.expectedErr != "" { + require.ErrorContains(t, err, tc.expectedErr) + return + } + + require.Equal(t, tc.expectedUUID, id) + }) + } +} + +func TestOpAMPAgent_Dependencies(t *testing.T) { + t.Run("No server specified", func(t *testing.T) { + o := opampAgent{ + cfg: &Config{}, + } + + require.Nil(t, o.Dependencies()) + }) + + t.Run("No auth extension specified", func(t *testing.T) { + o := opampAgent{ + cfg: &Config{ + Server: &OpAMPServer{ + WS: &commonFields{}, + }, + }, + } + + require.Nil(t, o.Dependencies()) + }) + + t.Run("auth extension specified", func(t *testing.T) { + authID := component.MustNewID("basicauth") + o := opampAgent{ + cfg: &Config{ + Server: &OpAMPServer{ + WS: &commonFields{ + Auth: authID, + }, + }, + }, + } + + require.Equal(t, []component.ID{authID}, o.Dependencies()) + }) +} + +type mockStatusAggregator struct { + statusChan chan *status.AggregateStatus + receivedEvents []eventSourcePair + unsubscribed bool + mtx *sync.RWMutex +} + +func (m *mockStatusAggregator) Subscribe(_ status.Scope, _ status.Verbosity) (<-chan *status.AggregateStatus, status.UnsubscribeFunc) { + return m.statusChan, func() { + m.unsubscribed = true + } +} + +func (m *mockStatusAggregator) RecordStatus(source *componentstatus.InstanceID, event *componentstatus.Event) { + m.mtx.Lock() + defer m.mtx.Unlock() + m.receivedEvents = append(m.receivedEvents, eventSourcePair{ + source: source, + event: event, + }) +} + +type mockOpAMPClient struct { + setHealthFunc func(health *protobufs.ComponentHealth) error +} + +func (m mockOpAMPClient) Start(_ context.Context, _ types.StartSettings) error { + return nil +} + +func (m mockOpAMPClient) Stop(_ context.Context) error { + return nil +} + +func (m mockOpAMPClient) SetAgentDescription(_ *protobufs.AgentDescription) error { + return nil +} + +func (m mockOpAMPClient) AgentDescription() *protobufs.AgentDescription { + return nil +} + +func (m mockOpAMPClient) SetHealth(health *protobufs.ComponentHealth) error { + return m.setHealthFunc(health) +} + +func (m mockOpAMPClient) UpdateEffectiveConfig(_ context.Context) error { + return nil +} + +func (m mockOpAMPClient) SetRemoteConfigStatus(_ *protobufs.RemoteConfigStatus) error { + return nil +} + +func (m mockOpAMPClient) SetPackageStatuses(_ *protobufs.PackageStatuses) error { + return nil +} + +func (m mockOpAMPClient) RequestConnectionSettings(_ *protobufs.ConnectionSettingsRequest) error { + return nil +} + +func (m mockOpAMPClient) SetCustomCapabilities(_ *protobufs.CustomCapabilities) error { + return nil +} + +func (m mockOpAMPClient) SendCustomMessage(_ *protobufs.CustomMessage) (messageSendingChannel chan struct{}, err error) { + return nil, nil +} + +func (m mockOpAMPClient) SetFlags(_ protobufs.AgentToServerFlags) {} + +type mockStatusEvent struct { + status componentstatus.Status + err error + timestamp time.Time +} + +func (m mockStatusEvent) Status() componentstatus.Status { + return m.status +} + +func (m mockStatusEvent) Err() error { + return m.err +} + +func (m mockStatusEvent) Timestamp() time.Time { + return m.timestamp +} + +func newTestOpampAgent(cfg *Config, set extension.Settings, mockOpampClient *mockOpAMPClient, sa *mockStatusAggregator) *opampAgent { + uid := uuid.New() + o := &opampAgent{ + cfg: cfg, + logger: set.Logger, + agentType: set.BuildInfo.Command, + agentVersion: set.BuildInfo.Version, + instanceID: uid, + capabilities: cfg.Capabilities, + opampClient: mockOpampClient, + statusSubscriptionWg: &sync.WaitGroup{}, + componentHealthWg: &sync.WaitGroup{}, + readyCh: make(chan struct{}), + customCapabilityRegistry: newCustomCapabilityRegistry(set.Logger, mockOpampClient), + statusAggregator: sa, + } + + o.lifetimeCtx, o.lifetimeCtxCancel = context.WithCancel(context.Background()) + return o } diff --git a/extension/opampextension/registry_test.go b/extension/opampextension/registry_test.go index 2e395d50e24d..ba8e4b579171 100644 --- a/extension/opampextension/registry_test.go +++ b/extension/opampextension/registry_test.go @@ -52,7 +52,7 @@ func TestRegistry_Register(t *testing.T) { sender, err := registry.Register(capabilityString) require.Nil(t, sender) require.ErrorIs(t, err, capabilityErr) - require.Len(t, registry.capabilityToMsgChannels, 0, "Setting capability failed, but callback ended up in the map anyways") + require.Empty(t, registry.capabilityToMsgChannels, "Setting capability failed, but callback ended up in the map anyways") }) } @@ -101,7 +101,7 @@ func TestRegistry_ProcessMessage(t *testing.T) { // If we did not skip sending on blocked channels, we'd expect this to never return. registry.ProcessMessage(customMessage) - require.Equal(t, 0, len(sender.Message())) + require.Empty(t, sender.Message()) }) t.Run("Callback is called only for its own capability", func(t *testing.T) { diff --git a/extension/opampextension/testdata/config_http.yaml b/extension/opampextension/testdata/config_http.yaml index c97da589a392..cfbfffddef30 100644 --- a/extension/opampextension/testdata/config_http.yaml +++ b/extension/opampextension/testdata/config_http.yaml @@ -1,4 +1,5 @@ server: http: endpoint: https://127.0.0.1:4320/v1/opamp + polling_interval: 1m instance_uid: 01BX5ZZKBKACTAV9WEVGEMMVRZ diff --git a/extension/opampextension/testdata/effective-redacted.yaml b/extension/opampextension/testdata/effective-redacted.yaml deleted file mode 100644 index 60fa731583b5..000000000000 --- a/extension/opampextension/testdata/effective-redacted.yaml +++ /dev/null @@ -1,27 +0,0 @@ -exporters: - otlp: - endpoint: "[REDACTED]" -receivers: - otlp: - protocols: - grpc: {} - http: {} -processors: - transform: - error_mode: "[REDACTED]" - metric_statements: - - context: "[REDACTED]" - conditions: - - "[REDACTED]" - statements: - - "[REDACTED]" -service: - pipelines: - traces: - receivers: [otlp] - processors: [] - exporters: [otlp] - metrics: - receivers: [otlp] - processors: [transform] - exporters: [otlp] diff --git a/extension/pprofextension/README.md b/extension/pprofextension/README.md index d8558017e602..21225dd402fc 100644 --- a/extension/pprofextension/README.md +++ b/extension/pprofextension/README.md @@ -4,13 +4,14 @@ | Status | | | ------------- |-----------| | Stability | [beta] | -| Distributions | [core], [contrib] | +| Distributions | [core], [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fpprof%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fpprof) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fpprof%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fpprof) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@MovieStoreGuy](https://www.github.com/MovieStoreGuy) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [core]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s Performance Profiler extension enables the golang `net/http/pprof` endpoint. diff --git a/extension/pprofextension/config.go b/extension/pprofextension/config.go index b289e2a05b52..0ab9149c6f67 100644 --- a/extension/pprofextension/config.go +++ b/extension/pprofextension/config.go @@ -11,7 +11,6 @@ import ( // Config has the configuration for the extension enabling the golang // net/http/pprof (Performance Profiler) extension. type Config struct { - // TCPAddr is the address and port in which the pprof will be listening to. // Use localhost: to make it available only locally, or ":" to // make it available on all network interfaces. diff --git a/extension/pprofextension/config_test.go b/extension/pprofextension/config_test.go index b3086a366ef1..a46d009b4c49 100644 --- a/extension/pprofextension/config_test.go +++ b/extension/pprofextension/config_test.go @@ -44,7 +44,7 @@ func TestLoadConfig(t *testing.T) { cfg := factory.CreateDefaultConfig() sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) diff --git a/extension/pprofextension/factory.go b/extension/pprofextension/factory.go index e622a3f57720..78b5d7a10311 100644 --- a/extension/pprofextension/factory.go +++ b/extension/pprofextension/factory.go @@ -36,7 +36,7 @@ func createDefaultConfig() component.Config { } } -func createExtension(_ context.Context, set extension.CreateSettings, cfg component.Config) (extension.Extension, error) { +func createExtension(_ context.Context, set extension.Settings, cfg component.Config) (extension.Extension, error) { config := cfg.(*Config) if config.TCPAddr.Endpoint == "" { return nil, errors.New("\"endpoint\" is required when using the \"pprof\" extension") diff --git a/extension/pprofextension/factory_test.go b/extension/pprofextension/factory_test.go index b11a1bb4493c..dd69c2f2d0a2 100644 --- a/extension/pprofextension/factory_test.go +++ b/extension/pprofextension/factory_test.go @@ -24,16 +24,16 @@ func TestFactory_CreateDefaultConfig(t *testing.T) { cfg) assert.NoError(t, componenttest.CheckConfigStruct(cfg)) - ext, err := createExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + ext, err := createExtension(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NotNil(t, ext) } -func TestFactory_CreateExtension(t *testing.T) { +func TestFactory_Create(t *testing.T) { cfg := createDefaultConfig().(*Config) cfg.TCPAddr.Endpoint = testutil.GetAvailableLocalAddress(t) - ext, err := createExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + ext, err := createExtension(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NotNil(t, ext) } diff --git a/extension/pprofextension/generated_component_test.go b/extension/pprofextension/generated_component_test.go index 10984dec9543..a2f17ecb02a6 100644 --- a/extension/pprofextension/generated_component_test.go +++ b/extension/pprofextension/generated_component_test.go @@ -30,18 +30,18 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) t.Run("shutdown", func(t *testing.T) { - e, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + e, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) err = e.Shutdown(context.Background()) require.NoError(t, err) }) t.Run("lifecycle", func(t *testing.T) { - firstExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + firstExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, firstExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, firstExt.Shutdown(context.Background())) - secondExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + secondExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, secondExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, secondExt.Shutdown(context.Background())) diff --git a/extension/pprofextension/go.mod b/extension/pprofextension/go.mod index 81c4e6be136f..22254ceb0ebc 100644 --- a/extension/pprofextension/go.mod +++ b/extension/pprofextension/go.mod @@ -1,54 +1,51 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/confignet v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componentstatus v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/confignet v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/pprofextension/go.sum b/extension/pprofextension/go.sum index 776270fda394..8c4014928a63 100644 --- a/extension/pprofextension/go.sum +++ b/extension/pprofextension/go.sum @@ -1,18 +1,16 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -25,8 +23,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -37,46 +35,44 @@ github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zx github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/confignet v0.102.0 h1:+wQevJ/iBnPxL+roY7WWnAjMxB8v4M5QrS3+0iEmauw= -go.opentelemetry.io/collector/config/confignet v0.102.0/go.mod h1:pfOrCTfSZEB6H2rKtx41/3RN4dKs+X2EKQbw3MGRh0E= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/confignet v1.22.0 h1:SBEMHJZWD8J4qgFw1O+BEkXW9AWldDi6Fz5YeDeoU58= +go.opentelemetry.io/collector/config/confignet v1.22.0/go.mod h1:ZppUH1hgUJOubawEsxsQ9MzEYFytqo2GnVSS7d4CVxc= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -92,20 +88,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -114,12 +110,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/extension/pprofextension/internal/metadata/generated_status.go b/extension/pprofextension/internal/metadata/generated_status.go index 9221e62c1785..a98c35bc4f88 100644 --- a/extension/pprofextension/internal/metadata/generated_status.go +++ b/extension/pprofextension/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("pprof") + Type = component.MustNewType("pprof") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension" ) const ( diff --git a/extension/pprofextension/internal/metadata/generated_telemetry.go b/extension/pprofextension/internal/metadata/generated_telemetry.go deleted file mode 100644 index 96965e8c63aa..000000000000 --- a/extension/pprofextension/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/pprof") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/pprof") -} diff --git a/extension/pprofextension/internal/metadata/generated_telemetry_test.go b/extension/pprofextension/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index f415f03322e6..000000000000 --- a/extension/pprofextension/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/pprof", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/pprof", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/pprofextension/metadata.yaml b/extension/pprofextension/metadata.yaml index 047b5adb49a9..e5a2e11bb57c 100644 --- a/extension/pprofextension/metadata.yaml +++ b/extension/pprofextension/metadata.yaml @@ -1,11 +1,10 @@ type: pprof -scope_name: otelcol/pprof status: class: extension stability: beta: [extension] - distributions: [core, contrib] + distributions: [core, contrib, k8s] codeowners: active: [MovieStoreGuy] diff --git a/extension/pprofextension/pprofextension.go b/extension/pprofextension/pprofextension.go index fcb488d29ffb..830305b49947 100644 --- a/extension/pprofextension/pprofextension.go +++ b/extension/pprofextension/pprofextension.go @@ -15,6 +15,7 @@ import ( "sync/atomic" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componentstatus" "go.uber.org/zap" ) @@ -28,7 +29,7 @@ type pprofExtension struct { telemetrySettings component.TelemetrySettings } -func (p *pprofExtension) Start(_ context.Context, _ component.Host) error { +func (p *pprofExtension) Start(_ context.Context, host component.Host) error { // The runtime settings are global to the application, so while in principle it // is possible to have more than one instance, running multiple will mean that // the settings of the last started instance will prevail. In order to avoid @@ -67,7 +68,7 @@ func (p *pprofExtension) Start(_ context.Context, _ component.Host) error { // The listener ownership goes to the server. if errHTTP := p.server.Serve(ln); !errors.Is(errHTTP, http.ErrServerClosed) && errHTTP != nil { - p.telemetrySettings.ReportStatus(component.NewFatalErrorEvent(errHTTP)) + componentstatus.ReportStatus(host, componentstatus.NewFatalErrorEvent(errHTTP)) } }() diff --git a/extension/remotetapextension/README.md b/extension/remotetapextension/README.md index c27be88469f6..be03161119de 100644 --- a/extension/remotetapextension/README.md +++ b/extension/remotetapextension/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fremotetap%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fremotetap) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fremotetap%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fremotetap) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@atoulme](https://www.github.com/atoulme) | -[development]: https://github.com/open-telemetry/opentelemetry-collector#development +[development]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#development This extension runs as a Web server that loads the remote observers that are registered against it. diff --git a/extension/remotetapextension/extension.go b/extension/remotetapextension/extension.go index 00128b429c70..c63b07aebf61 100644 --- a/extension/remotetapextension/extension.go +++ b/extension/remotetapextension/extension.go @@ -11,6 +11,7 @@ import ( "net/http" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componentstatus" "go.opentelemetry.io/collector/extension" ) @@ -19,12 +20,11 @@ var httpFS embed.FS type remoteObserverExtension struct { config *Config - settings extension.CreateSettings + settings extension.Settings server *http.Server } func (s *remoteObserverExtension) Start(ctx context.Context, host component.Host) error { - htmlContent, err := fs.Sub(httpFS, "html") if err != nil { return err @@ -39,7 +39,7 @@ func (s *remoteObserverExtension) Start(ctx context.Context, host component.Host go func() { err := s.server.ListenAndServe() if err != nil && !errors.Is(err, http.ErrServerClosed) { - s.settings.TelemetrySettings.ReportStatus(component.NewFatalErrorEvent(err)) + componentstatus.ReportStatus(host, componentstatus.NewFatalErrorEvent(err)) } }() return nil diff --git a/extension/remotetapextension/factory.go b/extension/remotetapextension/factory.go index 1d6685b05c68..f990064c5164 100644 --- a/extension/remotetapextension/factory.go +++ b/extension/remotetapextension/factory.go @@ -21,6 +21,6 @@ func NewFactory() extension.Factory { ) } -func createExtension(_ context.Context, settings extension.CreateSettings, config component.Config) (extension.Extension, error) { +func createExtension(_ context.Context, settings extension.Settings, config component.Config) (extension.Extension, error) { return &remoteObserverExtension{config: config.(*Config), settings: settings}, nil } diff --git a/extension/remotetapextension/generated_component_test.go b/extension/remotetapextension/generated_component_test.go index c3bf2d03c2a8..4cb79077b26a 100644 --- a/extension/remotetapextension/generated_component_test.go +++ b/extension/remotetapextension/generated_component_test.go @@ -30,18 +30,18 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) t.Run("shutdown", func(t *testing.T) { - e, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + e, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) err = e.Shutdown(context.Background()) require.NoError(t, err) }) t.Run("lifecycle", func(t *testing.T) { - firstExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + firstExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, firstExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, firstExt.Shutdown(context.Background())) - secondExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + secondExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, secondExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, secondExt.Shutdown(context.Background())) diff --git a/extension/remotetapextension/go.mod b/extension/remotetapextension/go.mod index 9a33da7b70b6..21aa7e743295 100644 --- a/extension/remotetapextension/go.mod +++ b/extension/remotetapextension/go.mod @@ -1,65 +1,61 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/remotetapextension -go 1.21.0 +go 1.22.0 require ( - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/confighttp v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componentstatus v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/confighttp v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 go.uber.org/goleak v1.3.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/hashicorp/go-version v1.7.0 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/rs/cors v1.10.1 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/configopaque v1.9.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + github.com/rs/cors v1.11.1 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/configopaque v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/configtls v1.22.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/remotetapextension/go.sum b/extension/remotetapextension/go.sum index d81aa2bc1dce..68e4bdb75190 100644 --- a/extension/remotetapextension/go.sum +++ b/extension/remotetapextension/go.sum @@ -1,42 +1,38 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= -github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -49,68 +45,68 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -126,20 +122,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -148,12 +144,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/extension/remotetapextension/internal/metadata/generated_status.go b/extension/remotetapextension/internal/metadata/generated_status.go index 27bebd667d28..d36a396f3ee7 100644 --- a/extension/remotetapextension/internal/metadata/generated_status.go +++ b/extension/remotetapextension/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("remotetap") + Type = component.MustNewType("remotetap") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/remotetapextension" ) const ( diff --git a/extension/remotetapextension/internal/metadata/generated_telemetry.go b/extension/remotetapextension/internal/metadata/generated_telemetry.go deleted file mode 100644 index d63a21cd5b67..000000000000 --- a/extension/remotetapextension/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/remotetap") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/remotetap") -} diff --git a/extension/remotetapextension/internal/metadata/generated_telemetry_test.go b/extension/remotetapextension/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 118795fa6b87..000000000000 --- a/extension/remotetapextension/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/remotetap", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/remotetap", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/remotetapextension/metadata.yaml b/extension/remotetapextension/metadata.yaml index 8c0236fbe535..e0396b389485 100644 --- a/extension/remotetapextension/metadata.yaml +++ b/extension/remotetapextension/metadata.yaml @@ -1,5 +1,4 @@ type: remotetap -scope_name: otelcol/remotetap status: class: extension diff --git a/extension/sigv4authextension/README.md b/extension/sigv4authextension/README.md index 2f9134c799ec..ca78fd9ddef8 100644 --- a/extension/sigv4authextension/README.md +++ b/extension/sigv4authextension/README.md @@ -7,7 +7,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fsigv4auth%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fsigv4auth) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fsigv4auth%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fsigv4auth) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@Aneurysm9](https://www.github.com/Aneurysm9), [@erichsueh3](https://www.github.com/erichsueh3) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib diff --git a/extension/sigv4authextension/config_test.go b/extension/sigv4authextension/config_test.go index 803ccce400bc..c5a473c11f0b 100644 --- a/extension/sigv4authextension/config_test.go +++ b/extension/sigv4authextension/config_test.go @@ -29,7 +29,7 @@ func TestLoadConfig(t *testing.T) { cfg := factory.CreateDefaultConfig() sub, err := cm.Sub(component.NewID(metadata.Type).String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, &Config{ @@ -51,6 +51,6 @@ func TestLoadConfigError(t *testing.T) { cfg := factory.CreateDefaultConfig() sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "missing_credentials").String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.Error(t, component.ValidateConfig(cfg)) } diff --git a/extension/sigv4authextension/design.md b/extension/sigv4authextension/design.md index 0613d917a933..795269d5db9b 100644 --- a/extension/sigv4authextension/design.md +++ b/extension/sigv4authextension/design.md @@ -563,6 +563,3 @@ Additionally, a few other files will be modified to reflect changes made, for ex * `go.sum` * `versions.yaml` * `.github/CODEOWNERS` -* `cmd/configschema/go.mod` -* `internal/components/components.go` -* `internal/components/extensions_test.go` diff --git a/extension/sigv4authextension/extension_test.go b/extension/sigv4authextension/extension_test.go index 68a21e9fd3b5..260d6b46ba01 100644 --- a/extension/sigv4authextension/extension_test.go +++ b/extension/sigv4authextension/extension_test.go @@ -44,7 +44,6 @@ func TestRoundTripper(t *testing.T) { assert.Equal(t, cfg.Service, si.service) assert.Equal(t, awsSDKInfo, si.awsSDKInfo) assert.Equal(t, cfg.credsProvider, si.credsProvider) - } func TestPerRPCCredentials(t *testing.T) { @@ -103,10 +102,10 @@ func TestGetCredsProviderFromConfig(t *testing.T) { } func TestCloneRequest(t *testing.T) { - req1, err := http.NewRequest("GET", "https://example.com", nil) + req1, err := http.NewRequest(http.MethodGet, "https://example.com", nil) assert.NoError(t, err) - req2, err := http.NewRequest("GET", "https://example.com", nil) + req2, err := http.NewRequest(http.MethodGet, "https://example.com", nil) assert.NoError(t, err) req2.Header.Add("Header1", "val1") diff --git a/extension/sigv4authextension/factory.go b/extension/sigv4authextension/factory.go index 642f7d5f2881..25a1246711a1 100644 --- a/extension/sigv4authextension/factory.go +++ b/extension/sigv4authextension/factory.go @@ -26,7 +26,7 @@ func createDefaultConfig() component.Config { } // createExtension() calls newSigv4Extension() in extension.go to create the extension. -func createExtension(_ context.Context, set extension.CreateSettings, cfg component.Config) (extension.Extension, error) { +func createExtension(_ context.Context, set extension.Settings, cfg component.Config) (extension.Extension, error) { awsSDKInfo := fmt.Sprintf("%s/%s", aws.SDKName, aws.SDKVersion) return newSigv4Extension(cfg.(*Config), awsSDKInfo, set.Logger), nil } diff --git a/extension/sigv4authextension/factory_test.go b/extension/sigv4authextension/factory_test.go index 74571b0e4410..31762460e0d7 100644 --- a/extension/sigv4authextension/factory_test.go +++ b/extension/sigv4authextension/factory_test.go @@ -19,8 +19,8 @@ func TestNewFactory(t *testing.T) { cfg := createDefaultConfig().(*Config) assert.Equal(t, f.CreateDefaultConfig().(*Config), cfg) - ext, _ := createExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) - fext, _ := f.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + ext, _ := createExtension(context.Background(), extensiontest.NewNopSettings(), cfg) + fext, _ := f.Create(context.Background(), extensiontest.NewNopSettings(), cfg) assert.Equal(t, fext, ext) } @@ -30,11 +30,10 @@ func TestCreateDefaultConfig(t *testing.T) { assert.NoError(t, componenttest.CheckConfigStruct(cfg)) } -func TestCreateExtension(t *testing.T) { +func TestCreate(t *testing.T) { cfg := createDefaultConfig().(*Config) - ext, err := createExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + ext, err := createExtension(context.Background(), extensiontest.NewNopSettings(), cfg) assert.NoError(t, err) assert.NotNil(t, ext) - } diff --git a/extension/sigv4authextension/generated_component_test.go b/extension/sigv4authextension/generated_component_test.go index 584b7a1b0778..88d936026d41 100644 --- a/extension/sigv4authextension/generated_component_test.go +++ b/extension/sigv4authextension/generated_component_test.go @@ -30,18 +30,18 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) t.Run("shutdown", func(t *testing.T) { - e, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + e, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) err = e.Shutdown(context.Background()) require.NoError(t, err) }) t.Run("lifecycle", func(t *testing.T) { - firstExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + firstExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, firstExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, firstExt.Shutdown(context.Background())) - secondExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + secondExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, secondExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, secondExt.Shutdown(context.Background())) diff --git a/extension/sigv4authextension/generated_package_test.go b/extension/sigv4authextension/generated_package_test.go index 8abc67be2c27..c0fd1a7c3d93 100644 --- a/extension/sigv4authextension/generated_package_test.go +++ b/extension/sigv4authextension/generated_package_test.go @@ -9,5 +9,5 @@ import ( ) func TestMain(m *testing.M) { - goleak.VerifyTestMain(m) + goleak.VerifyTestMain(m, goleak.IgnoreTopFunction("net/http.(*persistConn).writeLoop"), goleak.IgnoreTopFunction("internal/poll.runtime_pollWait")) } diff --git a/extension/sigv4authextension/go.mod b/extension/sigv4authextension/go.mod index a9c3c9ffde24..d951bc3c3ca1 100644 --- a/extension/sigv4authextension/go.mod +++ b/extension/sigv4authextension/go.mod @@ -1,64 +1,59 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension -go 1.21.0 +go 1.22.0 require ( - github.com/aws/aws-sdk-go-v2 v1.27.0 - github.com/aws/aws-sdk-go-v2/config v1.27.16 - github.com/aws/aws-sdk-go-v2/credentials v1.17.16 - github.com/aws/aws-sdk-go-v2/service/sts v1.28.10 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/collector/extension/auth v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/aws/aws-sdk-go-v2 v1.32.6 + github.com/aws/aws-sdk-go-v2/config v1.28.6 + github.com/aws/aws-sdk-go-v2/credentials v1.17.47 + github.com/aws/aws-sdk-go-v2/service/sts v1.33.2 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/auth v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 - google.golang.org/grpc v1.64.0 + google.golang.org/grpc v1.68.1 ) require ( - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.20.9 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.3 // indirect - github.com/aws/smithy-go v1.20.2 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.24.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6 // indirect + github.com/aws/smithy-go v1.22.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/sigv4authextension/go.sum b/extension/sigv4authextension/go.sum index 14a6fbf45934..d330ea5815c5 100644 --- a/extension/sigv4authextension/go.sum +++ b/extension/sigv4authextension/go.sum @@ -1,44 +1,42 @@ -github.com/aws/aws-sdk-go-v2 v1.27.0 h1:7bZWKoXhzI+mMR/HjdMx8ZCC5+6fY0lS5tr0bbgiLlo= -github.com/aws/aws-sdk-go-v2 v1.27.0/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= -github.com/aws/aws-sdk-go-v2/config v1.27.16 h1:knpCuH7laFVGYTNd99Ns5t+8PuRjDn4HnnZK48csipM= -github.com/aws/aws-sdk-go-v2/config v1.27.16/go.mod h1:vutqgRhDUktwSge3hrC3nkuirzkJ4E/mLj5GvI0BQas= -github.com/aws/aws-sdk-go-v2/credentials v1.17.16 h1:7d2QxY83uYl0l58ceyiSpxg9bSbStqBC6BeEeHEchwo= -github.com/aws/aws-sdk-go-v2/credentials v1.17.16/go.mod h1:Ae6li/6Yc6eMzysRL2BXlPYvnrLLBg3D11/AmOjw50k= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3 h1:dQLK4TjtnlRGb0czOht2CevZ5l6RSyRWAnKeGd7VAFE= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3/go.mod h1:TL79f2P6+8Q7dTsILpiVST+AL9lkF6PPGI167Ny0Cjw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7 h1:lf/8VTF2cM+N4SLzaYJERKEWAXq8MOMpZfU6wEPWsPk= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7/go.mod h1:4SjkU7QiqK2M9oozyMzfZ/23LmUY+h3oFqhdeP5OMiI= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7 h1:4OYVp0705xu8yjdyoWix0r9wPIRXnIzzOoUpQVHIJ/g= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7/go.mod h1:vd7ESTEvI76T2Na050gODNmNU7+OyKrIKroYTu4ABiI= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2/go.mod h1:5CsjAbs3NlGQyZNFACh+zztPDI7fU6eW9QsxjfnuBKg= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9 h1:Wx0rlZoEJR7JwlSZcHnEa7CNjrSIyVxMFWGAaXy4fJY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9/go.mod h1:aVMHdE0aHO3v+f/iw01fmXV/5DbfQ3Bi9nN7nd9bE9Y= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.9 h1:aD7AGQhvPuAxlSUfo0CWU7s6FpkbyykMhGYMvlqTjVs= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.9/go.mod h1:c1qtZUWtygI6ZdvKppzCSXsDOq5I4luJPZ0Ud3juFCA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.3 h1:Pav5q3cA260Zqez42T9UhIlsd9QeypszRPwC9LdSSsQ= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.3/go.mod h1:9lmoVDVLz/yUZwLaQ676TK02fhCu4+PgRSmMaKR1ozk= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.10 h1:69tpbPED7jKPyzMcrwSvhWcJ9bPnZsZs18NT40JwM0g= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.10/go.mod h1:0Aqn1MnEuitqfsCNyKsdKLhDUOr4txD/g19EfiUqgws= -github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= -github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/aws/aws-sdk-go-v2 v1.32.6 h1:7BokKRgRPuGmKkFMhEg/jSul+tB9VvXhcViILtfG8b4= +github.com/aws/aws-sdk-go-v2 v1.32.6/go.mod h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U= +github.com/aws/aws-sdk-go-v2/config v1.28.6 h1:D89IKtGrs/I3QXOLNTH93NJYtDhm8SYa9Q5CsPShmyo= +github.com/aws/aws-sdk-go-v2/config v1.28.6/go.mod h1:GDzxJ5wyyFSCoLkS+UhGB0dArhb9mI+Co4dHtoTxbko= +github.com/aws/aws-sdk-go-v2/credentials v1.17.47 h1:48bA+3/fCdi2yAwVt+3COvmatZ6jUDNkDTIsqDiMUdw= +github.com/aws/aws-sdk-go-v2/credentials v1.17.47/go.mod h1:+KdckOejLW3Ks3b0E3b5rHsr2f9yuORBum0WPnE5o5w= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21 h1:AmoU1pziydclFT/xRV+xXE/Vb8fttJCLRPv8oAkprc0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21/go.mod h1:AjUdLYe4Tgs6kpH4Bv7uMZo7pottoyHMn4eTcIcneaY= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25 h1:s/fF4+yDQDoElYhfIVvSNyeCydfbuTKzhxSXDXCPasU= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25/go.mod h1:IgPfDv5jqFIzQSNbUEMoitNooSMXjRSDkhXv8jiROvU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25 h1:ZntTCl5EsYnhN/IygQEUugpdwbhdkom9uHcbCftiGgA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25/go.mod h1:DBdPrgeocww+CSl1C8cEV8PN1mHMBhuCDLpXezyvWkE= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6 h1:50+XsN70RS7dwJ2CkVNXzj7U2L1HKP8nqTd3XWEXBN4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6/go.mod h1:WqgLmwY7so32kG01zD8CPTJWVWM+TzJoOVHwTg4aPug= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.7 h1:rLnYAfXQ3YAccocshIH5mzNNwZBkBo+bP6EhIxak6Hw= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.7/go.mod h1:ZHtuQJ6t9A/+YDuxOLnbryAmITtr8UysSny3qcyvJTc= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6 h1:JnhTZR3PiYDNKlXy50/pNeix9aGMo6lLpXwJ1mw8MD4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6/go.mod h1:URronUEGfXZN1VpdktPSD1EkAL9mfrV+2F4sjH38qOY= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.2 h1:s4074ZO1Hk8qv65GqNXqDjmkf4HSQqJukaLuuW0TpDA= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.2/go.mod h1:mVggCnIWoM09jP71Wh+ea7+5gAp53q+49wDFs1SW5z8= +github.com/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro= +github.com/aws/smithy-go v1.22.1/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -49,8 +47,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -61,44 +59,38 @@ github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zx github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -114,20 +106,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -136,12 +128,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/extension/sigv4authextension/internal/metadata/generated_status.go b/extension/sigv4authextension/internal/metadata/generated_status.go index eba38fdc5f7d..64ab52a1bbb6 100644 --- a/extension/sigv4authextension/internal/metadata/generated_status.go +++ b/extension/sigv4authextension/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("sigv4auth") + Type = component.MustNewType("sigv4auth") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension" ) const ( diff --git a/extension/sigv4authextension/internal/metadata/generated_telemetry.go b/extension/sigv4authextension/internal/metadata/generated_telemetry.go deleted file mode 100644 index 5b02f319a54f..000000000000 --- a/extension/sigv4authextension/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/sigv4auth") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/sigv4auth") -} diff --git a/extension/sigv4authextension/internal/metadata/generated_telemetry_test.go b/extension/sigv4authextension/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index cef9c60f2bcc..000000000000 --- a/extension/sigv4authextension/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/sigv4auth", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/sigv4auth", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/sigv4authextension/metadata.yaml b/extension/sigv4authextension/metadata.yaml index 2371597889e0..fadb221d0d2a 100644 --- a/extension/sigv4authextension/metadata.yaml +++ b/extension/sigv4authextension/metadata.yaml @@ -1,5 +1,4 @@ type: sigv4auth -scope_name: otelcol/sigv4auth status: class: extension @@ -11,4 +10,9 @@ status: active: [Aneurysm9, erichsueh3] tests: + goleak: + ignore: + top: + - "net/http.(*persistConn).writeLoop" + - "internal/poll.runtime_pollWait" config: diff --git a/extension/sigv4authextension/signingroundtripper_test.go b/extension/sigv4authextension/signingroundtripper_test.go index 4195faa297e3..89ba2d3d924a 100644 --- a/extension/sigv4authextension/signingroundtripper_test.go +++ b/extension/sigv4authextension/signingroundtripper_test.go @@ -69,7 +69,7 @@ func TestRoundTrip(t *testing.T) { assert.NoError(t, err) assert.Equal(t, body, string(content)) - w.WriteHeader(200) + w.WriteHeader(http.StatusOK) })) defer server.Close() serverURL, _ := url.Parse(server.URL) @@ -79,7 +79,7 @@ func TestRoundTrip(t *testing.T) { assert.NoError(t, err) newBody := strings.NewReader(body) - req, err := http.NewRequest("POST", serverURL.String(), newBody) + req, err := http.NewRequest(http.MethodPost, serverURL.String(), newBody) assert.NoError(t, err) res, err := rt.RoundTrip(req) @@ -89,25 +89,25 @@ func TestRoundTrip(t *testing.T) { return } assert.NoError(t, err) - assert.Equal(t, res.StatusCode, 200) + assert.Equal(t, 200, res.StatusCode) }) } } func TestInferServiceAndRegion(t *testing.T) { - req1, err := http.NewRequest("GET", "https://example.com", nil) + req1, err := http.NewRequest(http.MethodGet, "https://example.com", nil) assert.NoError(t, err) - req2, err := http.NewRequest("GET", "https://aps-workspaces.us-east-1.amazonaws.com/workspaces/ws-XXX/api/v1/remote_write", nil) + req2, err := http.NewRequest(http.MethodGet, "https://aps-workspaces.us-east-1.amazonaws.com/workspaces/ws-XXX/api/v1/remote_write", nil) assert.NoError(t, err) - req3, err := http.NewRequest("GET", "https://search-my-domain.us-east-1.es.amazonaws.com/_search?q=house", nil) + req3, err := http.NewRequest(http.MethodGet, "https://search-my-domain.us-east-1.es.amazonaws.com/_search?q=house", nil) assert.NoError(t, err) - req4, err := http.NewRequest("GET", "https://example.com", nil) + req4, err := http.NewRequest(http.MethodGet, "https://example.com", nil) assert.NoError(t, err) - req5, err := http.NewRequest("GET", "https://aps-workspaces.us-east-1.amazonaws.com/workspaces/ws-XXX/api/v1/remote_write", nil) + req5, err := http.NewRequest(http.MethodGet, "https://aps-workspaces.us-east-1.amazonaws.com/workspaces/ws-XXX/api/v1/remote_write", nil) assert.NoError(t, err) tests := []struct { @@ -172,13 +172,13 @@ func TestInferServiceAndRegion(t *testing.T) { } func TestHashPayload(t *testing.T) { - req1, err := http.NewRequest("GET", "https://example.com", nil) + req1, err := http.NewRequest(http.MethodGet, "https://example.com", nil) assert.NoError(t, err) - req2, err := http.NewRequest("GET", "https://example.com", bytes.NewReader([]byte("This is a test."))) + req2, err := http.NewRequest(http.MethodGet, "https://example.com", bytes.NewReader([]byte("This is a test."))) assert.NoError(t, err) - req3, err := http.NewRequest("GET", "https://example.com", nil) + req3, err := http.NewRequest(http.MethodGet, "https://example.com", nil) assert.NoError(t, err) req3.GetBody = func() (io.ReadCloser, error) { return nil, errors.New("this will always fail") } diff --git a/extension/solarwindsapmsettingsextension/README.md b/extension/solarwindsapmsettingsextension/README.md index 0af3f00168b1..f132e8480019 100644 --- a/extension/solarwindsapmsettingsextension/README.md +++ b/extension/solarwindsapmsettingsextension/README.md @@ -8,11 +8,11 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fsolarwindsapmsettings%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fsolarwindsapmsettings) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fsolarwindsapmsettings%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fsolarwindsapmsettings) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@jerrytfleung](https://www.github.com/jerrytfleung), [@cheempz](https://www.github.com/cheempz) | -[development]: https://github.com/open-telemetry/opentelemetry-collector#development +[development]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#development ## Overview -The Solarwinds APM Settings extension gets Solarwinds APM specific settings from Solarwinds APM collector and `/tmp/solarwinds-apm-settings.json` & `/tmp/solarwinds-apm-settings-raw` periodically. +The Solarwinds APM Settings extension gets Solarwinds APM specific settings from Solarwinds APM collector and `/tmp/solarwinds-apm-settings.json` periodically. ## Configuration diff --git a/extension/solarwindsapmsettingsextension/config.go b/extension/solarwindsapmsettingsextension/config.go index 70011b4e65d8..81b0a01c6dbf 100644 --- a/extension/solarwindsapmsettingsextension/config.go +++ b/extension/solarwindsapmsettingsextension/config.go @@ -10,12 +10,13 @@ import ( "time" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configgrpc" ) type Config struct { - Endpoint string `mapstructure:"endpoint"` - Key string `mapstructure:"key"` - Interval time.Duration `mapstructure:"interval"` + ClientConfig configgrpc.ClientConfig `mapstructure:",squash"` + Key string `mapstructure:"key"` + Interval time.Duration `mapstructure:"interval"` } const ( @@ -27,17 +28,19 @@ const ( func createDefaultConfig() component.Config { return &Config{ - Endpoint: DefaultEndpoint, + ClientConfig: configgrpc.ClientConfig{ + Endpoint: DefaultEndpoint, + }, Interval: DefaultInterval, } } func (cfg *Config) Validate() error { // Endpoint - matched, _ := regexp.MatchString(`apm.collector.[a-z]{2,3}-[0-9]{2}.[a-z\-]*.solarwinds.com:443`, cfg.Endpoint) + matched, _ := regexp.MatchString(`apm.collector.[a-z]{2,3}-[0-9]{2}.[a-z\-]*.solarwinds.com:443`, cfg.ClientConfig.Endpoint) if !matched { // Replaced by the default - cfg.Endpoint = DefaultEndpoint + cfg.ClientConfig.Endpoint = DefaultEndpoint } // Key keyArr := strings.Split(cfg.Key, ":") diff --git a/extension/solarwindsapmsettingsextension/config_test.go b/extension/solarwindsapmsettingsextension/config_test.go index f87fc59c2353..d1ca784893f1 100644 --- a/extension/solarwindsapmsettingsextension/config_test.go +++ b/extension/solarwindsapmsettingsextension/config_test.go @@ -12,6 +12,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configgrpc" "go.opentelemetry.io/collector/confmap/confmaptest" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/solarwindsapmsettingsextension/internal/metadata" @@ -31,7 +32,9 @@ func TestLoadConfig(t *testing.T) { { id: component.NewIDWithName(metadata.Type, "1"), expected: &Config{ - Endpoint: "apm.collector.apj-01.cloud.solarwinds.com:443", + ClientConfig: configgrpc.ClientConfig{ + Endpoint: "apm.collector.na-01.cloud.solarwinds.com:443", + }, Key: "something:name", Interval: time.Duration(10) * time.Second, }, @@ -39,17 +42,221 @@ func TestLoadConfig(t *testing.T) { { id: component.NewIDWithName(metadata.Type, "2"), expected: &Config{ - Endpoint: "apm.collector.na-01.cloud.solarwinds.com:443", - Key: "something", - Interval: time.Duration(5) * time.Second, + ClientConfig: configgrpc.ClientConfig{ + Endpoint: "apm.collector.na-02.cloud.solarwinds.com:443", + }, + Key: "something:name", + Interval: time.Duration(10) * time.Second, }, }, { id: component.NewIDWithName(metadata.Type, "3"), expected: &Config{ - Endpoint: "apm.collector.na-01.cloud.solarwinds.com:443", + ClientConfig: configgrpc.ClientConfig{ + Endpoint: "apm.collector.eu-01.cloud.solarwinds.com:443", + }, + Key: "something:name", + Interval: time.Duration(10) * time.Second, + }, + }, + { + id: component.NewIDWithName(metadata.Type, "4"), + expected: &Config{ + ClientConfig: configgrpc.ClientConfig{ + Endpoint: "apm.collector.apj-01.cloud.solarwinds.com:443", + }, + Key: "something:name", + Interval: time.Duration(10) * time.Second, + }, + }, + { + id: component.NewIDWithName(metadata.Type, "5"), + expected: &Config{ + ClientConfig: configgrpc.ClientConfig{ + Endpoint: "apm.collector.na-01.st-ssp.solarwinds.com:443", + }, + Key: "something:name", + Interval: time.Duration(10) * time.Second, + }, + }, + { + id: component.NewIDWithName(metadata.Type, "6"), + expected: &Config{ + ClientConfig: configgrpc.ClientConfig{ + Endpoint: "apm.collector.na-01.dev-ssp.solarwinds.com:443", + }, + Key: "something:name", + Interval: time.Duration(10) * time.Second, + }, + }, + { + id: component.NewIDWithName(metadata.Type, "7"), + expected: &Config{ + ClientConfig: configgrpc.ClientConfig{ + Endpoint: DefaultEndpoint, + }, + Key: "something:name", + Interval: time.Duration(10) * time.Second, + }, + }, + { + id: component.NewIDWithName(metadata.Type, "8"), + expected: &Config{ + ClientConfig: configgrpc.ClientConfig{ + Endpoint: DefaultEndpoint, + }, + Key: "something:name", + Interval: time.Duration(10) * time.Second, + }, + }, + { + id: component.NewIDWithName(metadata.Type, "9"), + expected: &Config{ + ClientConfig: configgrpc.ClientConfig{ + Endpoint: DefaultEndpoint, + }, + Key: "something:name", + Interval: time.Duration(10) * time.Second, + }, + }, + { + id: component.NewIDWithName(metadata.Type, "10"), + expected: &Config{ + ClientConfig: configgrpc.ClientConfig{ + Endpoint: DefaultEndpoint, + }, + Key: "something:name", + Interval: time.Duration(10) * time.Second, + }, + }, + { + id: component.NewIDWithName(metadata.Type, "11"), + expected: &Config{ + ClientConfig: configgrpc.ClientConfig{ + Endpoint: DefaultEndpoint, + }, + Key: "something:name", + Interval: time.Duration(10) * time.Second, + }, + }, + { + id: component.NewIDWithName(metadata.Type, "12"), + expected: &Config{ + ClientConfig: configgrpc.ClientConfig{ + Endpoint: DefaultEndpoint, + }, Key: "something:name", - Interval: time.Duration(60) * time.Second, + Interval: time.Duration(10) * time.Second, + }, + }, + { + id: component.NewIDWithName(metadata.Type, "13"), + expected: &Config{ + ClientConfig: configgrpc.ClientConfig{ + Endpoint: DefaultEndpoint, + }, + Key: "something:name", + Interval: time.Duration(10) * time.Second, + }, + }, + { + id: component.NewIDWithName(metadata.Type, "14"), + expected: &Config{ + ClientConfig: configgrpc.ClientConfig{ + Endpoint: DefaultEndpoint, + }, + Key: "something:name", + Interval: time.Duration(10) * time.Second, + }, + }, + { + id: component.NewIDWithName(metadata.Type, "15"), + expected: &Config{ + ClientConfig: configgrpc.ClientConfig{ + Endpoint: DefaultEndpoint, + }, + Key: "something:name", + Interval: time.Duration(10) * time.Second, + }, + }, + { + id: component.NewIDWithName(metadata.Type, "16"), + expected: &Config{ + ClientConfig: configgrpc.ClientConfig{ + Endpoint: DefaultEndpoint, + }, + Key: "", + Interval: time.Duration(10) * time.Second, + }, + }, + { + id: component.NewIDWithName(metadata.Type, "17"), + expected: &Config{ + ClientConfig: configgrpc.ClientConfig{ + Endpoint: DefaultEndpoint, + }, + Key: ":", + Interval: time.Duration(10) * time.Second, + }, + }, + { + id: component.NewIDWithName(metadata.Type, "18"), + expected: &Config{ + ClientConfig: configgrpc.ClientConfig{ + Endpoint: DefaultEndpoint, + }, + Key: "::", + Interval: time.Duration(10) * time.Second, + }, + }, + { + id: component.NewIDWithName(metadata.Type, "19"), + expected: &Config{ + ClientConfig: configgrpc.ClientConfig{ + Endpoint: DefaultEndpoint, + }, + Key: ":name", + Interval: time.Duration(10) * time.Second, + }, + }, + { + id: component.NewIDWithName(metadata.Type, "20"), + expected: &Config{ + ClientConfig: configgrpc.ClientConfig{ + Endpoint: DefaultEndpoint, + }, + Key: "token:", + Interval: time.Duration(10) * time.Second, + }, + }, + { + id: component.NewIDWithName(metadata.Type, "21"), + expected: &Config{ + ClientConfig: configgrpc.ClientConfig{ + Endpoint: DefaultEndpoint, + }, + Key: "token:name", + Interval: MinimumInterval, + }, + }, + { + id: component.NewIDWithName(metadata.Type, "22"), + expected: &Config{ + ClientConfig: configgrpc.ClientConfig{ + Endpoint: DefaultEndpoint, + }, + Key: "token:name", + Interval: MaximumInterval, + }, + }, + { + id: component.NewIDWithName(metadata.Type, "23"), + expected: &Config{ + ClientConfig: configgrpc.ClientConfig{ + Endpoint: DefaultEndpoint, + }, + Key: "token:name", + Interval: MinimumInterval, }, }, } @@ -61,7 +268,7 @@ func TestLoadConfig(t *testing.T) { cfg := factory.CreateDefaultConfig() sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) }) diff --git a/extension/solarwindsapmsettingsextension/extension.go b/extension/solarwindsapmsettingsextension/extension.go index 04bd1b75cc56..67804da75bb5 100644 --- a/extension/solarwindsapmsettingsextension/extension.go +++ b/extension/solarwindsapmsettingsextension/extension.go @@ -6,46 +6,62 @@ package solarwindsapmsettingsextension // import "github.com/open-telemetry/open import ( "context" "crypto/tls" + "crypto/x509" + "encoding/binary" + "encoding/json" + "math" + "os" + "path" "time" "github.com/solarwindscloud/apm-proto/go/collectorpb" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configgrpc" "go.opentelemetry.io/collector/extension" "go.uber.org/zap" "google.golang.org/grpc" "google.golang.org/grpc/credentials" ) +const ( + jsonOutputFile = "solarwinds-apm-settings.json" + grpcContextDeadline = 1 * time.Second +) + type solarwindsapmSettingsExtension struct { - logger *zap.Logger - config *Config - cancel context.CancelFunc - conn *grpc.ClientConn - client collectorpb.TraceCollectorClient + config *Config + cancel context.CancelFunc + conn *grpc.ClientConn + client collectorpb.TraceCollectorClient + telemetrySettings component.TelemetrySettings } -func newSolarwindsApmSettingsExtension(extensionCfg *Config, logger *zap.Logger) (extension.Extension, error) { +func newSolarwindsApmSettingsExtension(extensionCfg *Config, settings extension.Settings) (extension.Extension, error) { settingsExtension := &solarwindsapmSettingsExtension{ - config: extensionCfg, - logger: logger, + config: extensionCfg, + telemetrySettings: settings.TelemetrySettings, } return settingsExtension, nil } -func (extension *solarwindsapmSettingsExtension) Start(_ context.Context, _ component.Host) error { - extension.logger.Info("Starting up solarwinds apm settings extension") +func (extension *solarwindsapmSettingsExtension) Start(_ context.Context, host component.Host) error { + extension.telemetrySettings.Logger.Info("starting up solarwinds apm settings extension") ctx := context.Background() ctx, extension.cancel = context.WithCancel(ctx) - var err error - extension.conn, err = grpc.NewClient(extension.config.Endpoint, grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{}))) + systemCertPool, err := x509.SystemCertPool() if err != nil { return err } - extension.logger.Info("Dailed to endpoint", zap.String("endpoint", extension.config.Endpoint)) + extension.conn, err = extension.config.ClientConfig.ToClientConn(ctx, host, extension.telemetrySettings, configgrpc.WithGrpcDialOption(grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{RootCAs: systemCertPool})))) + if err != nil { + return err + } + extension.telemetrySettings.Logger.Info("created a gRPC client", zap.String("endpoint", extension.config.ClientConfig.Endpoint)) extension.client = collectorpb.NewTraceCollectorClient(extension.conn) + outputFile := path.Join(os.TempDir(), jsonOutputFile) // initial refresh - refresh(extension) + refresh(extension, outputFile) go func() { ticker := time.NewTicker(extension.config.Interval) @@ -53,9 +69,9 @@ func (extension *solarwindsapmSettingsExtension) Start(_ context.Context, _ comp for { select { case <-ticker.C: - refresh(extension) + refresh(extension, outputFile) case <-ctx.Done(): - extension.logger.Info("Received ctx.Done() from ticker") + extension.telemetrySettings.Logger.Info("received ctx.Done() from ticker") return } } @@ -65,7 +81,7 @@ func (extension *solarwindsapmSettingsExtension) Start(_ context.Context, _ comp } func (extension *solarwindsapmSettingsExtension) Shutdown(_ context.Context) error { - extension.logger.Info("Shutting down solarwinds apm settings extension") + extension.telemetrySettings.Logger.Info("shutting down solarwinds apm settings extension") if extension.cancel != nil { extension.cancel() } @@ -75,7 +91,92 @@ func (extension *solarwindsapmSettingsExtension) Shutdown(_ context.Context) err return nil } -func refresh(extension *solarwindsapmSettingsExtension) { - // Concrete implementation will be available in later PR - extension.logger.Info("refresh task") +func refresh(extension *solarwindsapmSettingsExtension, filename string) { + extension.telemetrySettings.Logger.Info("time to refresh", zap.String("endpoint", extension.config.ClientConfig.Endpoint)) + hostname, err := os.Hostname() + if err != nil { + extension.telemetrySettings.Logger.Error("unable to call os.Hostname()", zap.Error(err)) + return + } + ctx, cancel := context.WithTimeout(context.Background(), grpcContextDeadline) + defer cancel() + + request := &collectorpb.SettingsRequest{ + ApiKey: extension.config.Key, + Identity: &collectorpb.HostID{ + Hostname: hostname, + }, + ClientVersion: "2", + } + response, err := extension.client.GetSettings(ctx, request) + if err != nil { + extension.telemetrySettings.Logger.Error("unable to get settings", zap.String("endpoint", extension.config.ClientConfig.Endpoint), zap.Error(err)) + return + } + switch result := response.GetResult(); result { + case collectorpb.ResultCode_OK: + if len(response.GetWarning()) > 0 { + extension.telemetrySettings.Logger.Warn("GetSettings succeed", zap.String("result", result.String()), zap.String("warning", response.GetWarning())) + } + var settings []map[string]any + for _, item := range response.GetSettings() { + setting := make(map[string]any) + setting["flags"] = string(item.GetFlags()) + setting["timestamp"] = item.GetTimestamp() + setting["value"] = item.GetValue() + arguments := make(map[string]any) + if value, ok := item.Arguments["BucketCapacity"]; ok { + arguments["BucketCapacity"] = math.Float64frombits(binary.LittleEndian.Uint64(value)) + } + if value, ok := item.Arguments["BucketRate"]; ok { + arguments["BucketRate"] = math.Float64frombits(binary.LittleEndian.Uint64(value)) + } + if value, ok := item.Arguments["TriggerRelaxedBucketCapacity"]; ok { + arguments["TriggerRelaxedBucketCapacity"] = math.Float64frombits(binary.LittleEndian.Uint64(value)) + } + if value, ok := item.Arguments["TriggerRelaxedBucketRate"]; ok { + arguments["TriggerRelaxedBucketRate"] = math.Float64frombits(binary.LittleEndian.Uint64(value)) + } + if value, ok := item.Arguments["TriggerStrictBucketCapacity"]; ok { + arguments["TriggerStrictBucketCapacity"] = math.Float64frombits(binary.LittleEndian.Uint64(value)) + } + if value, ok := item.Arguments["TriggerStrictBucketRate"]; ok { + arguments["TriggerStrictBucketRate"] = math.Float64frombits(binary.LittleEndian.Uint64(value)) + } + if value, ok := item.Arguments["MetricsFlushInterval"]; ok { + arguments["MetricsFlushInterval"] = int32(binary.LittleEndian.Uint32(value)) + } + if value, ok := item.Arguments["MaxTransactions"]; ok { + arguments["MaxTransactions"] = int32(binary.LittleEndian.Uint32(value)) + } + if value, ok := item.Arguments["MaxCustomMetrics"]; ok { + arguments["MaxCustomMetrics"] = int32(binary.LittleEndian.Uint32(value)) + } + if value, ok := item.Arguments["EventsFlushInterval"]; ok { + arguments["EventsFlushInterval"] = int32(binary.LittleEndian.Uint32(value)) + } + if value, ok := item.Arguments["ProfilingInterval"]; ok { + arguments["ProfilingInterval"] = int32(binary.LittleEndian.Uint32(value)) + } + setting["arguments"] = arguments + setting["ttl"] = item.GetTtl() + settings = append(settings, setting) + } + if content, err := json.Marshal(settings); err != nil { + extension.telemetrySettings.Logger.Error("unable to marshal setting JSON[] byte from settings", zap.Error(err)) + } else { + if err := os.WriteFile(filename, content, 0o600); err != nil { + extension.telemetrySettings.Logger.Error("unable to write "+filename, zap.Error(err)) + } else { + if len(response.GetWarning()) > 0 { + extension.telemetrySettings.Logger.Warn(filename + " is refreshed (soft disabled)") + } else { + extension.telemetrySettings.Logger.Info(filename + " is refreshed") + } + extension.telemetrySettings.Logger.Info(string(content)) + } + } + default: + extension.telemetrySettings.Logger.Warn("GetSettings failed", zap.String("result", result.String()), zap.String("warning", response.GetWarning())) + } } diff --git a/extension/solarwindsapmsettingsextension/extension_test.go b/extension/solarwindsapmsettingsextension/extension_test.go index 743f9b89eca7..b553dd7973a3 100644 --- a/extension/solarwindsapmsettingsextension/extension_test.go +++ b/extension/solarwindsapmsettingsextension/extension_test.go @@ -5,15 +5,24 @@ package solarwindsapmsettingsextension import ( "context" + "os" "testing" "time" + "github.com/google/uuid" + "github.com/solarwindscloud/apm-proto/go/collectorpb" + "github.com/solarwindscloud/apm-proto/go/collectorpb/mocks" + "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/config/configgrpc" "go.opentelemetry.io/collector/extension" "go.uber.org/zap" + "go.uber.org/zap/zaptest/observer" ) -func TestCreateExtension(t *testing.T) { +func TestCreate(t *testing.T) { t.Parallel() tests := []struct { @@ -23,14 +32,18 @@ func TestCreateExtension(t *testing.T) { { name: "default", cfg: &Config{ - Endpoint: DefaultEndpoint, + ClientConfig: configgrpc.ClientConfig{ + Endpoint: DefaultEndpoint, + }, Interval: DefaultInterval, }, }, { name: "anything", cfg: &Config{ - Endpoint: "apm.collector.na-02.cloud.solarwinds.com:443", + ClientConfig: configgrpc.ClientConfig{ + Endpoint: "apm.collector.na-02.cloud.solarwinds.com:443", + }, Key: "something:name", Interval: time.Duration(10) * time.Second, }, @@ -38,18 +51,222 @@ func TestCreateExtension(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - ex := createAnExtension(tt.cfg, t) + ex := createAnExtension(t, tt.cfg) require.NoError(t, ex.Shutdown(context.TODO())) }) } } +// newNopSettings returns a new nop settings for extension.Factory Create* functions. +func newNopSettings() extension.Settings { + return extension.Settings{ + ID: component.NewIDWithName(component.MustNewType("nop"), uuid.NewString()), + TelemetrySettings: componenttest.NewNopTelemetrySettings(), + BuildInfo: component.NewDefaultBuildInfo(), + } +} + // create extension -func createAnExtension(c *Config, t *testing.T) extension.Extension { - logger, err := zap.NewProduction() - require.NoError(t, err) - ex, err := newSolarwindsApmSettingsExtension(c, logger) +func createAnExtension(t *testing.T, c *Config) extension.Extension { + ex, err := newSolarwindsApmSettingsExtension(c, newNopSettings()) require.NoError(t, err) require.NoError(t, ex.Start(context.TODO(), nil)) return ex } + +func TestRefresh(t *testing.T) { + t.Parallel() + tests := []struct { + name string + cfg *Config + reply *collectorpb.SettingsResult + filename string + expectedLogMessages []string + fileExist bool + }{ + { + name: "ok", + cfg: &Config{ + ClientConfig: configgrpc.ClientConfig{ + Endpoint: DefaultEndpoint, + }, + }, + reply: &collectorpb.SettingsResult{ + Result: collectorpb.ResultCode_OK, + Settings: []*collectorpb.OboeSetting{ + { + Type: collectorpb.OboeSettingType_DEFAULT_SAMPLE_RATE, + Flags: []byte("flag1,flag2,flag3"), + Timestamp: 123, + Value: 456, + Layer: []byte("layer1"), + Arguments: map[string][]byte{ + "BucketCapacity": {1, 0, 0, 0, 0, 0, 0, 64}, + "BucketRate": {2, 0, 0, 0, 0, 0, 240, 63}, + "TriggerRelaxedBucketCapacity": {3, 0, 0, 0, 0, 0, 52, 64}, + "TriggerRelaxedBucketRate": {4, 0, 0, 0, 0, 0, 240, 63}, + "TriggerStrictBucketCapacity": {0, 0, 0, 0, 0, 0, 24, 64}, + "TriggerStrictBucketRate": {154, 153, 153, 153, 153, 153, 185, 63}, + "MetricsFlushInterval": {60, 0, 0, 0}, + "MaxTransactions": {1, 0, 0, 0}, + "MaxCustomMetrics": {2, 0, 0, 0}, + "EventsFlushInterval": {3, 0, 0, 0}, + "ProfilingInterval": {4, 0, 0, 0}, + "SignatureKey": []byte("key"), + }, + Ttl: 789, + }, + }, + }, + filename: "testdata/refresh_ok.json", + expectedLogMessages: []string{ + "time to refresh", + "testdata/refresh_ok.json is refreshed", + "[{\"arguments\":{\"BucketCapacity\":2.0000000000000004,\"BucketRate\":1.0000000000000004,\"EventsFlushInterval\":3,\"MaxCustomMetrics\":2,\"MaxTransactions\":1,\"MetricsFlushInterval\":60,\"ProfilingInterval\":4,\"TriggerRelaxedBucketCapacity\":20.00000000000001,\"TriggerRelaxedBucketRate\":1.0000000000000009,\"TriggerStrictBucketCapacity\":6,\"TriggerStrictBucketRate\":0.1},\"flags\":\"flag1,flag2,flag3\",\"timestamp\":123,\"ttl\":789,\"value\":456}]", + }, + fileExist: true, + }, + { + name: "ok with warning", + cfg: &Config{ + ClientConfig: configgrpc.ClientConfig{ + Endpoint: DefaultEndpoint, + }, + }, + reply: &collectorpb.SettingsResult{ + Result: collectorpb.ResultCode_OK, + Settings: []*collectorpb.OboeSetting{ + { + Type: collectorpb.OboeSettingType_DEFAULT_SAMPLE_RATE, + Flags: []byte("flags"), + Timestamp: 0, + Value: 0, + Layer: []byte{}, + Arguments: map[string][]byte{ + "BucketCapacity": {0, 0, 0, 0, 0, 0, 0, 0}, + "BucketRate": {2, 0, 0, 0, 0, 0, 0, 0}, + "TriggerRelaxedBucketCapacity": {0, 0, 0, 0, 0, 0, 0, 0}, + "TriggerRelaxedBucketRate": {0, 0, 0, 0, 0, 0, 0, 0}, + "TriggerStrictBucketCapacity": {0, 0, 0, 0, 0, 0, 0, 0}, + "TriggerStrictBucketRate": {0, 0, 0, 0, 0, 0, 0, 0}, + "MetricsFlushInterval": {0, 0, 0, 0}, + "MaxTransactions": {0, 0, 0, 0}, + "MaxCustomMetrics": {0, 0, 0, 0}, + "EventsFlushInterval": {0, 0, 0, 0}, + "ProfilingInterval": {0, 0, 0, 0}, + "SignatureKey": []byte(""), + }, + Ttl: 10, + }, + }, + Warning: "warning", + }, + filename: "testdata/refresh_warning.json", + expectedLogMessages: []string{ + "time to refresh", + "GetSettings succeed", + "testdata/refresh_warning.json is refreshed (soft disabled)", + "[{\"arguments\":{\"BucketCapacity\":0,\"BucketRate\":1e-323,\"EventsFlushInterval\":0,\"MaxCustomMetrics\":0,\"MaxTransactions\":0,\"MetricsFlushInterval\":0,\"ProfilingInterval\":0,\"TriggerRelaxedBucketCapacity\":0,\"TriggerRelaxedBucketRate\":0,\"TriggerStrictBucketCapacity\":0,\"TriggerStrictBucketRate\":0},\"flags\":\"flags\",\"timestamp\":0,\"ttl\":10,\"value\":0}]", + }, + fileExist: true, + }, + { + name: "try later", + cfg: &Config{ + ClientConfig: configgrpc.ClientConfig{ + Endpoint: DefaultEndpoint, + }, + }, + reply: &collectorpb.SettingsResult{ + Result: collectorpb.ResultCode_TRY_LATER, + Warning: "warning", + }, + filename: "testdata/refresh_later.json", + expectedLogMessages: []string{ + "time to refresh", + "GetSettings failed", + }, + fileExist: false, + }, + { + name: "invalid api key", + cfg: &Config{ + ClientConfig: configgrpc.ClientConfig{ + Endpoint: DefaultEndpoint, + }, + }, + reply: &collectorpb.SettingsResult{ + Result: collectorpb.ResultCode_INVALID_API_KEY, + Warning: "warning", + }, + filename: "testdata/refresh_invalid_api_key.json", + expectedLogMessages: []string{ + "time to refresh", + "GetSettings failed", + }, + fileExist: false, + }, + { + name: "limit exceeded", + cfg: &Config{ + ClientConfig: configgrpc.ClientConfig{ + Endpoint: DefaultEndpoint, + }, + }, + reply: &collectorpb.SettingsResult{ + Result: collectorpb.ResultCode_LIMIT_EXCEEDED, + Warning: "warning", + }, + filename: "testdata/refresh_limit.json", + expectedLogMessages: []string{ + "time to refresh", + "GetSettings failed", + }, + fileExist: false, + }, + { + name: "redirect", + cfg: &Config{ + ClientConfig: configgrpc.ClientConfig{ + Endpoint: DefaultEndpoint, + }, + }, + reply: &collectorpb.SettingsResult{ + Result: collectorpb.ResultCode_REDIRECT, + Warning: "warning", + }, + filename: "testdata/refresh_redirect.json", + expectedLogMessages: []string{ + "time to refresh", + "GetSettings failed", + }, + fileExist: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mockTraceCollectorClient := &mocks.TraceCollectorClient{} + mockTraceCollectorClient.On("GetSettings", mock.Anything, mock.Anything).Return(tt.reply, nil) + observedZapCore, observedLogs := observer.New(zap.InfoLevel) + settings := newNopSettings() + settings.TelemetrySettings.Logger = zap.New(observedZapCore) + settingsExtension := &solarwindsapmSettingsExtension{ + config: tt.cfg, + telemetrySettings: settings.TelemetrySettings, + client: mockTraceCollectorClient, + } + refresh(settingsExtension, tt.filename) + require.Equal(t, len(tt.expectedLogMessages), observedLogs.Len()) + for index, observedLog := range observedLogs.All() { + require.Equal(t, tt.expectedLogMessages[index], observedLog.Message) + } + _, err := os.Stat(tt.filename) + if tt.fileExist { + require.NoError(t, err) + require.NoError(t, os.Remove(tt.filename)) + } else { + require.Error(t, err) + } + }) + } +} diff --git a/extension/solarwindsapmsettingsextension/factory.go b/extension/solarwindsapmsettingsextension/factory.go index 371435c32249..c19b218eafec 100644 --- a/extension/solarwindsapmsettingsextension/factory.go +++ b/extension/solarwindsapmsettingsextension/factory.go @@ -12,8 +12,8 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/extension/solarwindsapmsettingsextension/internal/metadata" ) -func createExtension(_ context.Context, settings extension.CreateSettings, cfg component.Config) (extension.Extension, error) { - return newSolarwindsApmSettingsExtension(cfg.(*Config), settings.Logger) +func createExtension(_ context.Context, settings extension.Settings, cfg component.Config) (extension.Extension, error) { + return newSolarwindsApmSettingsExtension(cfg.(*Config), settings) } func NewFactory() extension.Factory { diff --git a/extension/solarwindsapmsettingsextension/factory_test.go b/extension/solarwindsapmsettingsextension/factory_test.go index 48f7ee1e35f8..d328af08ef4d 100644 --- a/extension/solarwindsapmsettingsextension/factory_test.go +++ b/extension/solarwindsapmsettingsextension/factory_test.go @@ -17,7 +17,7 @@ func TestCreateDefaultConfig(t *testing.T) { assert.NoError(t, componenttest.CheckConfigStruct(cfg)) ocfg, ok := factory.CreateDefaultConfig().(*Config) assert.True(t, ok) - assert.Equal(t, ocfg.Endpoint, DefaultEndpoint, "Wrong default endpoint") + assert.Equal(t, DefaultEndpoint, ocfg.ClientConfig.Endpoint, "Wrong default endpoint") assert.Empty(t, ocfg.Key, "There is no default key") - assert.Equal(t, ocfg.Interval, DefaultInterval, "Wrong default interval") + assert.Equal(t, DefaultInterval, ocfg.Interval, "Wrong default interval") } diff --git a/extension/solarwindsapmsettingsextension/generated_component_test.go b/extension/solarwindsapmsettingsextension/generated_component_test.go index 57872759cad1..8ad1f10bfabb 100644 --- a/extension/solarwindsapmsettingsextension/generated_component_test.go +++ b/extension/solarwindsapmsettingsextension/generated_component_test.go @@ -30,18 +30,18 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) t.Run("shutdown", func(t *testing.T) { - e, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + e, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) err = e.Shutdown(context.Background()) require.NoError(t, err) }) t.Run("lifecycle", func(t *testing.T) { - firstExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + firstExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, firstExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, firstExt.Shutdown(context.Background())) - secondExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + secondExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, secondExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, secondExt.Shutdown(context.Background())) diff --git a/extension/solarwindsapmsettingsextension/go.mod b/extension/solarwindsapmsettingsextension/go.mod index 23ed449ca5ba..adf881febdf2 100644 --- a/extension/solarwindsapmsettingsextension/go.mod +++ b/extension/solarwindsapmsettingsextension/go.mod @@ -1,50 +1,60 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/solarwindsapmsettingsextension -go 1.21.0 +go 1.22.0 require ( - github.com/solarwindscloud/apm-proto v1.0.3 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/google/uuid v1.6.0 + github.com/solarwindscloud/apm-proto v1.0.8 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configgrpc v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 - google.golang.org/grpc v1.64.0 + google.golang.org/grpc v1.68.1 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/google/uuid v1.6.0 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/klauspost/compress v1.17.9 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/mostynb/go-grpc-compression v1.2.3 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + github.com/stretchr/objx v0.5.2 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/confignet v1.22.0 // indirect + go.opentelemetry.io/collector/config/configopaque v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/configtls v1.22.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.30.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.19.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/solarwindsapmsettingsextension/go.sum b/extension/solarwindsapmsettingsextension/go.sum index 7acb97df1004..f3136ab02c11 100644 --- a/extension/solarwindsapmsettingsextension/go.sum +++ b/extension/solarwindsapmsettingsextension/go.sum @@ -1,30 +1,36 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -33,46 +39,76 @@ github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa1 github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mostynb/go-grpc-compression v1.2.3 h1:42/BKWMy0KEJGSdWvzqIyOZ95YcR9mLPqKctH7Uo//I= +github.com/mostynb/go-grpc-compression v1.2.3/go.mod h1:AghIxF3P57umzqM9yz795+y1Vjs47Km/Y2FE6ouQ7Lg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/solarwindscloud/apm-proto v1.0.3 h1:fmPwWNrM5kduAqvmH8mCD0E9MASK8m/mtPmw0yXGOBs= -github.com/solarwindscloud/apm-proto v1.0.3/go.mod h1:PIMzXc8HpB0ryT4Oci4pUz8F0m1X7Q/hVXkQE4jGv6Y= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/solarwindscloud/apm-proto v1.0.8 h1:a5A0s+5RmMB6LNBs32qQ+oL26rltw5b2cbUhqhJPne0= +github.com/solarwindscloud/apm-proto v1.0.8/go.mod h1:PIMzXc8HpB0ryT4Oci4pUz8F0m1X7Q/hVXkQE4jGv6Y= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/configgrpc v0.116.0 h1:O8Y1X9wDH5dDdqDJ9kqoaMrxEauaDSJBg9aNC6QgB7g= +go.opentelemetry.io/collector/config/configgrpc v0.116.0/go.mod h1:RPrSQrr6xhIaAK2DdcECi142NjSo0npQfVQB3nommSo= +go.opentelemetry.io/collector/config/confignet v1.22.0 h1:SBEMHJZWD8J4qgFw1O+BEkXW9AWldDi6Fz5YeDeoU58= +go.opentelemetry.io/collector/config/confignet v1.22.0/go.mod h1:ZppUH1hgUJOubawEsxsQ9MzEYFytqo2GnVSS7d4CVxc= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 h1:yMkBS9yViCc7U7yeLzJPM2XizlfdVvBRSmsQDWu6qc0= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0/go.mod h1:n8MR6/liuGB5EmTETUBeU5ZgqMOlqKRxUaqPQBOANZ8= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -88,20 +124,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -110,12 +146,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 h1:QCqS/PdaHTSWGvupk2F/ehwHtGc0/GYkT+3GAcR1CCc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/extension/solarwindsapmsettingsextension/internal/metadata/generated_status.go b/extension/solarwindsapmsettingsextension/internal/metadata/generated_status.go index 2599b9bd76d8..8955bfd01c95 100644 --- a/extension/solarwindsapmsettingsextension/internal/metadata/generated_status.go +++ b/extension/solarwindsapmsettingsextension/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("solarwindsapmsettings") + Type = component.MustNewType("solarwindsapmsettings") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/solarwindsapmsettingsextension" ) const ( diff --git a/extension/solarwindsapmsettingsextension/internal/metadata/generated_telemetry.go b/extension/solarwindsapmsettingsextension/internal/metadata/generated_telemetry.go deleted file mode 100644 index 1145178a9f31..000000000000 --- a/extension/solarwindsapmsettingsextension/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/solarwindsapmsettings") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/solarwindsapmsettings") -} diff --git a/extension/solarwindsapmsettingsextension/internal/metadata/generated_telemetry_test.go b/extension/solarwindsapmsettingsextension/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 29ec711d2dc4..000000000000 --- a/extension/solarwindsapmsettingsextension/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/solarwindsapmsettings", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/solarwindsapmsettings", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/solarwindsapmsettingsextension/metadata.yaml b/extension/solarwindsapmsettingsextension/metadata.yaml index fdd3ca43401a..39f278b4fd81 100644 --- a/extension/solarwindsapmsettingsextension/metadata.yaml +++ b/extension/solarwindsapmsettingsextension/metadata.yaml @@ -1,5 +1,4 @@ type: solarwindsapmsettings -scope_name: otelcol/solarwindsapmsettings status: class: extension diff --git a/extension/solarwindsapmsettingsextension/testdata/config.yaml b/extension/solarwindsapmsettingsextension/testdata/config.yaml index 4fb5cf5c0417..f6e45b2b01f0 100644 --- a/extension/solarwindsapmsettingsextension/testdata/config.yaml +++ b/extension/solarwindsapmsettingsextension/testdata/config.yaml @@ -1,13 +1,93 @@ solarwindsapmsettings: solarwindsapmsettings/1: - endpoint: "apm.collector.apj-01.cloud.solarwinds.com:443" + endpoint: "apm.collector.na-01.cloud.solarwinds.com:443" key: "something:name" interval: 10s solarwindsapmsettings/2: - endpoint: "apm.collector.eu-01.cloud.solarwinds.com" - key: "something" - interval: "4s" + endpoint: "apm.collector.na-02.cloud.solarwinds.com:443" + key: "something:name" + interval: 10s solarwindsapmsettings/3: + endpoint: "apm.collector.eu-01.cloud.solarwinds.com:443" + key: "something:name" + interval: 10s +solarwindsapmsettings/4: + endpoint: "apm.collector.apj-01.cloud.solarwinds.com:443" + key: "something:name" + interval: 10s +solarwindsapmsettings/5: + endpoint: "apm.collector.na-01.st-ssp.solarwinds.com:443" + key: "something:name" + interval: 10s +solarwindsapmsettings/6: + endpoint: "apm.collector.na-01.dev-ssp.solarwinds.com:443" + key: "something:name" + interval: 10s +solarwindsapmsettings/7: + endpoint: "apm.collector.na-01.cloud.solarwinds.com" + key: "something:name" + interval: 10s +solarwindsapmsettings/8: + endpoint: "apm.collector.na-01.cloud.solarwinds.com:a:b" + key: "something:name" + interval: 10s +solarwindsapmsettings/9: + endpoint: "apm.collector.na-01.cloud.solarwinds.com:port" + key: "something:name" + interval: 10s +solarwindsapmsettings/10: + endpoint: "apm.collector..cloud.solarwinds.com:443" + key: "something:name" + interval: 10s +solarwindsapmsettings/11: + endpoint: ":443" + key: "something:name" + interval: 10s +solarwindsapmsettings/12: + endpoint: ":" + key: "something:name" + interval: 10s +solarwindsapmsettings/13: + endpoint: "apm.collector.na-01.cloud.solarwinds.com:" + key: "something:name" + interval: 10s +solarwindsapmsettings/14: + endpoint: "::" + key: "something:name" + interval: 10s +solarwindsapmsettings/15: endpoint: "" key: "something:name" + interval: 10s +solarwindsapmsettings/16: + endpoint: "apm.collector.na-01.cloud.solarwinds.com:443" + key: "" + interval: 10s +solarwindsapmsettings/17: + endpoint: "apm.collector.na-01.cloud.solarwinds.com:443" + key: ":" + interval: 10s +solarwindsapmsettings/18: + endpoint: "apm.collector.na-01.cloud.solarwinds.com:443" + key: "::" + interval: 10s +solarwindsapmsettings/19: + endpoint: "apm.collector.na-01.cloud.solarwinds.com:443" + key: ":name" + interval: 10s +solarwindsapmsettings/20: + endpoint: "apm.collector.na-01.cloud.solarwinds.com:443" + key: "token:" + interval: 10s +solarwindsapmsettings/21: + endpoint: "apm.collector.na-01.cloud.solarwinds.com:443" + key: "token:name" + interval: 4s +solarwindsapmsettings/22: + endpoint: "apm.collector.na-01.cloud.solarwinds.com:443" + key: "token:name" interval: 61s +solarwindsapmsettings/23: + endpoint: "apm.collector.na-01.cloud.solarwinds.com:443" + key: "token:name" + interval: 30 diff --git a/extension/storage/dbstorage/README.md b/extension/storage/dbstorage/README.md index 664fcc852c6b..6e1b2b538df1 100644 --- a/extension/storage/dbstorage/README.md +++ b/extension/storage/dbstorage/README.md @@ -8,7 +8,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fdbstorage%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fdbstorage) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fdbstorage%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fdbstorage) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@dmitryax](https://www.github.com/dmitryax), [@atoulme](https://www.github.com/atoulme) | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib diff --git a/extension/storage/dbstorage/client.go b/extension/storage/dbstorage/client.go index 95366a4d9ca4..edae4ca813b3 100644 --- a/extension/storage/dbstorage/client.go +++ b/extension/storage/dbstorage/client.go @@ -17,10 +17,11 @@ import ( ) const ( - createTable = "create table if not exists %s (key text primary key, value blob)" - getQueryText = "select value from %s where key=?" - setQueryText = "insert into %s(key, value) values(?,?) on conflict(key) do update set value=?" - deleteQueryText = "delete from %s where key=?" + createTableSqlite = "create table if not exists %s (key text primary key, value blob)" + createTable = "create table if not exists %s (key text primary key, value text)" + getQueryText = "select value from %s where key=$1" + setQueryText = "insert into %s(key, value) values($1,$2) on conflict(key) do update set value=$3" + deleteQueryText = "delete from %s where key=$1" ) type dbStorageClient struct { @@ -30,9 +31,13 @@ type dbStorageClient struct { deleteQuery *sql.Stmt } -func newClient(ctx context.Context, db *sql.DB, tableName string) (*dbStorageClient, error) { +func newClient(ctx context.Context, driverName string, db *sql.DB, tableName string) (*dbStorageClient, error) { + createTableSQL := createTable + if driverName == "sqlite" { + createTableSQL = createTableSqlite + } var err error - _, err = db.ExecContext(ctx, fmt.Sprintf(createTable, tableName)) + _, err = db.ExecContext(ctx, fmt.Sprintf(createTableSQL, tableName)) if err != nil { return nil, err } diff --git a/extension/storage/dbstorage/extension.go b/extension/storage/dbstorage/extension.go index a55aef153301..feab6096dbca 100644 --- a/extension/storage/dbstorage/extension.go +++ b/extension/storage/dbstorage/extension.go @@ -64,7 +64,7 @@ func (ds *databaseStorage) GetClient(ctx context.Context, kind component.Kind, e fullName = fmt.Sprintf("%s_%s_%s_%s", kindString(kind), ent.Type(), ent.Name(), name) } fullName = strings.ReplaceAll(fullName, " ", "") - return newClient(ctx, ds.db, fullName) + return newClient(ctx, ds.driverName, ds.db, fullName) } func kindString(k component.Kind) string { diff --git a/extension/storage/dbstorage/extension_test.go b/extension/storage/dbstorage/extension_test.go index e97b52c41068..11210b6ddeb3 100644 --- a/extension/storage/dbstorage/extension_test.go +++ b/extension/storage/dbstorage/extension_test.go @@ -6,20 +6,41 @@ package dbstorage import ( "context" "fmt" + "os" + "runtime" "sync" "testing" + ctypes "github.com/docker/docker/api/types/container" + "github.com/docker/go-connections/nat" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/testcontainers/testcontainers-go" + "github.com/testcontainers/testcontainers-go/wait" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/extension/experimental/storage" "go.opentelemetry.io/collector/extension/extensiontest" ) -func TestExtensionIntegrity(t *testing.T) { +func TestExtensionIntegrityWithSqlite(t *testing.T) { + if runtime.GOOS == "windows" && os.Getenv("GITHUB_ACTIONS") == "true" { + t.Skip("Skipping test on Windows GH runners: test requires Docker to be running Linux containers") + } + + testExtensionIntegrity(t, newSqliteTestExtension(t)) +} + +func TestExtensionIntegrityWithPostgres(t *testing.T) { + if runtime.GOOS == "windows" && os.Getenv("GITHUB_ACTIONS") == "true" { + t.Skip("Skipping test on Windows GH runners: test requires Docker to be running Linux containers") + } + + testExtensionIntegrity(t, newPostgresTestExtension(t)) +} + +func testExtensionIntegrity(t *testing.T, se storage.Extension) { ctx := context.Background() - se := newTestExtension(t) err := se.Start(context.Background(), componenttest.NewNopHost()) assert.NoError(t, err) defer func() { @@ -64,7 +85,6 @@ func TestExtensionIntegrity(t *testing.T) { // Repeatedly thrash client for j := 0; j < 100; j++ { - // Make sure my values are still mine for i := 0; i < len(keys); i++ { v, err := c.Get(ctx, keys[i]) @@ -97,13 +117,55 @@ func TestExtensionIntegrity(t *testing.T) { wg.Wait() } -func newTestExtension(t *testing.T) storage.Extension { +func newSqliteTestExtension(t *testing.T) storage.Extension { f := NewFactory() cfg := f.CreateDefaultConfig().(*Config) cfg.DriverName = "sqlite3" cfg.DataSource = fmt.Sprintf("file:%s/foo.db?_busy_timeout=10000&_journal=WAL&_sync=NORMAL", t.TempDir()) - extension, err := f.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + extension, err := f.Create(context.Background(), extensiontest.NewNopSettings(), cfg) + require.NoError(t, err) + + se, ok := extension.(storage.Extension) + require.True(t, ok) + + return se +} + +func newPostgresTestExtension(t *testing.T) storage.Extension { + req := testcontainers.GenericContainerRequest{ + ContainerRequest: testcontainers.ContainerRequest{ + Image: "postgres:14", + HostConfigModifier: func(config *ctypes.HostConfig) { + ports := nat.PortMap{} + ports[nat.Port("5432")] = []nat.PortBinding{ + {HostPort: "5432"}, + } + config.PortBindings = ports + }, + Env: map[string]string{ + "POSTGRES_PASSWORD": "passwd", + "POSTGRES_USER": "root", + "POSTGRES_DB": "db", + }, + WaitingFor: wait.ForListeningPort("5432"), + }, + Started: true, + } + + ctr, err := testcontainers.GenericContainer(context.Background(), req) + require.NoError(t, err) + port, err := ctr.MappedPort(context.Background(), "5432") + require.NoError(t, err) + t.Cleanup(func() { + require.NoError(t, ctr.Terminate(context.Background())) + }) + f := NewFactory() + cfg := f.CreateDefaultConfig().(*Config) + cfg.DriverName = "pgx" + cfg.DataSource = fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=disable", "127.0.0.1", port.Port(), "root", "passwd", "db") + + extension, err := f.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) se, ok := extension.(storage.Extension) diff --git a/extension/storage/dbstorage/factory.go b/extension/storage/dbstorage/factory.go index 39064bd3446f..61e74e61c826 100644 --- a/extension/storage/dbstorage/factory.go +++ b/extension/storage/dbstorage/factory.go @@ -30,7 +30,7 @@ func createDefaultConfig() component.Config { func createExtension( _ context.Context, - params extension.CreateSettings, + params extension.Settings, cfg component.Config, ) (extension.Extension, error) { return newDBStorage(params.Logger, cfg.(*Config)) diff --git a/extension/storage/dbstorage/generated_component_test.go b/extension/storage/dbstorage/generated_component_test.go index b313f97d6864..44bc999620df 100644 --- a/extension/storage/dbstorage/generated_component_test.go +++ b/extension/storage/dbstorage/generated_component_test.go @@ -30,7 +30,7 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) t.Run("shutdown", func(t *testing.T) { - e, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + e, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) err = e.Shutdown(context.Background()) require.NoError(t, err) diff --git a/extension/storage/dbstorage/go.mod b/extension/storage/dbstorage/go.mod index a7d021ae5103..a6a9901999b4 100644 --- a/extension/storage/dbstorage/go.mod +++ b/extension/storage/dbstorage/go.mod @@ -1,56 +1,90 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/dbstorage -go 1.21.0 +go 1.22.0 require ( - github.com/jackc/pgx/v5 v5.6.0 - github.com/mattn/go-sqlite3 v1.14.22 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/docker/docker v27.4.0+incompatible + github.com/docker/go-connections v0.5.0 + github.com/jackc/pgx/v5 v5.7.1 + github.com/mattn/go-sqlite3 v1.14.24 + github.com/stretchr/testify v1.10.0 + github.com/testcontainers/testcontainers-go v0.33.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect + dario.cat/mergo v1.0.0 // indirect + github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect + github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v4 v4.2.1 // indirect + github.com/containerd/log v0.1.0 // indirect + github.com/containerd/platforms v0.2.1 // indirect + github.com/cpuguy83/dockercfg v0.3.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/distribution/reference v0.6.0 // indirect + github.com/docker/go-units v0.5.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect - github.com/jackc/puddle/v2 v2.2.1 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/puddle/v2 v2.2.2 // indirect + github.com/klauspost/compress v1.17.4 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect + github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/magiconair/properties v1.8.7 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect + github.com/moby/patternmatcher v0.6.0 // indirect + github.com/moby/sys/sequential v0.5.0 // indirect + github.com/moby/sys/user v0.1.0 // indirect + github.com/moby/sys/userns v0.1.0 // indirect + github.com/moby/term v0.5.0 // indirect + github.com/morikuni/aec v1.0.0 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.1.0 // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/shirou/gopsutil/v3 v3.23.12 // indirect + github.com/shoenig/go-m1cpu v0.1.6 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect + github.com/yusufpapurcu/wmi v1.2.3 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.21.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/storage/dbstorage/go.sum b/extension/storage/dbstorage/go.sum index 552f56f0582a..071a87faa0b8 100644 --- a/extension/storage/dbstorage/go.sum +++ b/extension/storage/dbstorage/go.sum @@ -1,90 +1,175 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= +github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= +github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= +github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= +github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/docker v27.4.0+incompatible h1:I9z7sQ5qyzO0BfAb9IMOawRkAGxhYsidKiTMcm0DU+A= +github.com/docker/docker v27.4.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.6.0 h1:SWJzexBzPL5jb0GEsrPMLIsi/3jOo7RHlzTjcAeDrPY= -github.com/jackc/pgx/v5 v5.6.0/go.mod h1:DNZ/vlrUnhWCoFGxHAG8U2ljioxukquj7utPDgtQdTw= -github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= -github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.7.1 h1:x7SYsPBYDkHDksogeSmZZ5xzThcTgRz++I5E+ePFUcs= +github.com/jackc/pgx/v5 v5.7.1/go.mod h1:e7O26IywZZ+naJtWWos6i6fvWK+29etgITqrqHLfoZA= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= +github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= -github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= +github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= +github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= +github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= +github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= +github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= +github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= +github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/shirou/gopsutil/v3 v3.23.12 h1:z90NtUkp3bMtmICZKpC4+WaknU1eXtp5vtbQ11DgpE4= +github.com/shirou/gopsutil/v3 v3.23.12/go.mod h1:1FrWgea594Jp7qmjHUUPlJDTPgcsb9mGnXDxavtikzM= +github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= +github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/testcontainers/testcontainers-go v0.33.0 h1:zJS9PfXYT5O0ZFXM2xxXfk4J5UMw/kRiISng037Gxdw= +github.com/testcontainers/testcontainers-go v0.33.0/go.mod h1:W80YpTa8D5C3Yy16icheD01UTDu+LmXIA2Keo+jWtT8= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= +github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= +go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -94,30 +179,41 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -126,15 +222,19 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= diff --git a/extension/storage/dbstorage/internal/metadata/generated_status.go b/extension/storage/dbstorage/internal/metadata/generated_status.go index 6d4272cf8cc1..f589b5b0454c 100644 --- a/extension/storage/dbstorage/internal/metadata/generated_status.go +++ b/extension/storage/dbstorage/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("db_storage") + Type = component.MustNewType("db_storage") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/dbstorage" ) const ( diff --git a/extension/storage/dbstorage/internal/metadata/generated_telemetry.go b/extension/storage/dbstorage/internal/metadata/generated_telemetry.go deleted file mode 100644 index 4e5f3c724e3a..000000000000 --- a/extension/storage/dbstorage/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/dbstorage") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/dbstorage") -} diff --git a/extension/storage/dbstorage/internal/metadata/generated_telemetry_test.go b/extension/storage/dbstorage/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 660d6b1a12e4..000000000000 --- a/extension/storage/dbstorage/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/dbstorage", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/dbstorage", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/storage/dbstorage/metadata.yaml b/extension/storage/dbstorage/metadata.yaml index 24ed6d33a993..e1672617e9c6 100644 --- a/extension/storage/dbstorage/metadata.yaml +++ b/extension/storage/dbstorage/metadata.yaml @@ -1,5 +1,4 @@ type: db_storage -scope_name: otelcol/dbstorage status: class: extension diff --git a/extension/storage/filestorage/README.md b/extension/storage/filestorage/README.md index ee41b647fb88..9691f18937de 100644 --- a/extension/storage/filestorage/README.md +++ b/extension/storage/filestorage/README.md @@ -4,12 +4,13 @@ | Status | | | ------------- |-----------| | Stability | [beta] | -| Distributions | [contrib] | +| Distributions | [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Ffilestorage%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Ffilestorage) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Ffilestorage%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Ffilestorage) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@djaglowski](https://www.github.com/djaglowski) \| Seeking more code owners! | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s The File Storage extension can persist state to the local file system. @@ -22,7 +23,10 @@ The default directory is `%ProgramData%\Otelcol\FileStorage` on Windows and `/va `timeout` is the maximum time to wait for a file lock. This value does not need to be modified in most circumstances. The default timeout is `1s`. -`fsync` when set, will force the database to perform an fsync after each write. This helps to ensure database integretity if there is an interruption to the database process, but at the cost of performance. See [DB.NoSync](https://pkg.go.dev/go.etcd.io/bbolt#DB) for more information. +`fsync` when set, will force the database to perform an fsync after each write. This helps to ensure database integrity if there is an interruption to the database process, but at the cost of performance. See [DB.NoSync](https://pkg.go.dev/go.etcd.io/bbolt#DB) for more information. + +`create_directory` when set, will create the data storage and compaction directory if it does not already exist. The directory will be created with `0750 (rwxr-x--)` permissions, by default. Use `directory_permissions` to customize directory creation permissions. + ## Compaction `compaction` defines how and when files should be compacted. There are two modes of compaction available (both of which can be set concurrently): @@ -103,12 +107,12 @@ exporters: ## Replacing unsafe characters in component names The extension uses the type and name of the component using the extension to create a file where the component's data is stored. -For example, if a Filelog receiver named `filelog/logs` uses the extension, its data is stored in a file named `receiver_filelog_logs`. +For example, if a file log receiver named `filelog/logs` uses the extension, its data is stored in a file named `receiver_filelog_logs`. Sometimes the component name contains characters that either have special meaning in paths - like `/` - or are problematic or even forbidden in file names (depending on the host operating system), like `?` or `|`. To prevent surprising or erroneous behavior, some characters in the component names are replaced before creating the file name to store data by the extension. -For example, for a Filelog receiver named `filelog/logs/container`, the component name `logs/container` is sanitized into `logs~007Econtainer` and the data is stored in a file named `receiver_filelog_logs~007Econtainer`. +For example, for a file log receiver named `filelog/logs/container`, the component name `logs/container` is sanitized into `logs~007Econtainer` and the data is stored in a file named `receiver_filelog_logs~007Econtainer`. Every unsafe character is replaced with a tilde `~` and the character's [Unicode number][unicode_chars] in hex. The only safe characters are: uppercase and lowercase ASCII letters `A-Z` and `a-z`, digits `0-9`, dot `.`, hyphen `-`, underscore `_`. @@ -124,7 +128,7 @@ following troubleshooting method works for bbolt-managed files. As such, there i When troubleshooting components that use the File Storage extension, it is sometimes helpful to read the raw contents of files created by the extension for the component. The simplest way to read files -created by the File Storage extension is to use the strings utility ([Linux](https://linux.die.net/man/1/strings), +created by the File Storage extension is to use the strings utility ([Linux](https://man7.org/linux/man-pages/man1/strings.1.html), [Windows](https://learn.microsoft.com/en-us/sysinternals/downloads/strings)). For example, here are the contents of the file created by the File Storage extension when it's configured as the storage diff --git a/extension/storage/filestorage/client.go b/extension/storage/filestorage/client.go index b97cad73c044..bff4b03d283d 100644 --- a/extension/storage/filestorage/client.go +++ b/extension/storage/filestorage/client.go @@ -50,7 +50,7 @@ func bboltOptions(timeout time.Duration, noSync bool) *bbolt.Options { func newClient(logger *zap.Logger, filePath string, timeout time.Duration, compactionCfg *CompactionConfig, noSync bool) (*fileStorageClient, error) { options := bboltOptions(timeout, noSync) - db, err := bbolt.Open(filePath, 0600, options) + db, err := bbolt.Open(filePath, 0o600, options) if err != nil { return nil, err } @@ -188,7 +188,7 @@ func (c *fileStorageClient) Compact(compactionDirectory string, timeout time.Dur zap.String(tempDirectoryKey, file.Name())) // cannot reuse newClient as db shouldn't contain any bucket - compactedDb, err = bbolt.Open(file.Name(), 0600, options) + compactedDb, err = bbolt.Open(file.Name(), 0o600, options) if err != nil { return err } @@ -209,7 +209,7 @@ func (c *fileStorageClient) Compact(compactionDirectory string, timeout time.Dur // replace current db file with compacted db file // we reopen the DB file irrespective of the success of the replace, as we can't leave it closed moveErr := moveFileWithFallback(compactedDbPath, dbPath) - c.db, openErr = bbolt.Open(dbPath, 0600, options) + c.db, openErr = bbolt.Open(dbPath, 0o600, options) // if we got errors for both rename and open, we'd rather return the open one // this should not happen in any kind of normal circumstance - maybe we should panic instead? @@ -337,7 +337,7 @@ func moveFileWithFallback(src string, dest string) error { return err } - if err = os.WriteFile(dest, data, 0600); err != nil { + if err = os.WriteFile(dest, data, 0o600); err != nil { return err } diff --git a/extension/storage/filestorage/client_test.go b/extension/storage/filestorage/client_test.go index 8717f553b90e..09c97469f7ad 100644 --- a/extension/storage/filestorage/client_test.go +++ b/extension/storage/filestorage/client_test.go @@ -79,7 +79,6 @@ func TestClientBatchOperations(t *testing.T) { // Make sure nothing is there err = client.Batch(ctx, testGetEntries...) require.NoError(t, err) - require.Equal(t, testGetEntries, testGetEntries) // Set it err = client.Batch(ctx, testSetEntries...) @@ -123,7 +122,6 @@ func TestClientBatchOperations(t *testing.T) { for i := range testGetEntries { require.Equal(t, testGetEntries[i].Key, testEntriesDelete[i].Key) require.Nil(t, testGetEntries[i].Value) - } } @@ -176,7 +174,6 @@ func TestNewClientTransactionErrors(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - tempDir := t.TempDir() dbFile := filepath.Join(tempDir, "my_db") diff --git a/extension/storage/filestorage/config.go b/extension/storage/filestorage/config.go index 19e288a7655b..ef842a93b616 100644 --- a/extension/storage/filestorage/config.go +++ b/extension/storage/filestorage/config.go @@ -8,9 +8,15 @@ import ( "fmt" "io/fs" "os" + "strconv" "time" ) +var ( + errInvalidOctal = errors.New("directory_permissions value must be a valid octal representation") + errInvalidPermissionBits = errors.New("directory_permissions contain invalid bits for file access") +) + // Config defines configuration for file storage extension. type Config struct { Directory string `mapstructure:"directory,omitempty"` @@ -20,6 +26,11 @@ type Config struct { // FSync specifies that fsync should be called after each database write FSync bool `mapstructure:"fsync,omitempty"` + + // CreateDirectory specifies that the directory should be created automatically by the extension on start + CreateDirectory bool `mapstructure:"create_directory,omitempty"` + DirectoryPermissions string `mapstructure:"directory_permissions,omitempty"` + directoryPermissionsParsed int64 `mapstructure:"-,omitempty"` } // CompactionConfig defines configuration for optional file storage compaction. @@ -53,24 +64,22 @@ type CompactionConfig struct { func (cfg *Config) Validate() error { var dirs []string - if cfg.Compaction.OnStart { + if cfg.Compaction.OnStart || cfg.Compaction.OnRebound { dirs = []string{cfg.Directory, cfg.Compaction.Directory} } else { dirs = []string{cfg.Directory} } for _, dir := range dirs { - info, err := os.Stat(dir) - if err != nil { - if os.IsNotExist(err) { - return fmt.Errorf("directory must exist: %w", err) + if info, err := os.Stat(dir); err != nil { + if !cfg.CreateDirectory && os.IsNotExist(err) { + return fmt.Errorf("directory must exist: %w. You can enable the create_directory option to automatically create it", err) } fsErr := &fs.PathError{} - if errors.As(err, &fsErr) { + if errors.As(err, &fsErr) && !os.IsNotExist(err) { return fmt.Errorf("problem accessing configured directory: %s, err: %w", dir, fsErr) } - } - if !info.IsDir() { + } else if !info.IsDir() { return fmt.Errorf("%s is not a directory", dir) } } @@ -83,5 +92,15 @@ func (cfg *Config) Validate() error { return errors.New("compaction check interval must be positive when rebound compaction is set") } + if cfg.CreateDirectory { + permissions, err := strconv.ParseInt(cfg.DirectoryPermissions, 8, 32) + if err != nil { + return errInvalidOctal + } else if permissions&int64(os.ModePerm) != permissions { + return errInvalidPermissionBits + } + cfg.directoryPermissionsParsed = permissions + } + return nil } diff --git a/extension/storage/filestorage/config_test.go b/extension/storage/filestorage/config_test.go index 67decc8dbed5..8fad1509698f 100644 --- a/extension/storage/filestorage/config_test.go +++ b/extension/storage/filestorage/config_test.go @@ -10,10 +10,12 @@ import ( "testing" "time" + "github.com/google/uuid" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/confmap/confmaptest" + "go.opentelemetry.io/collector/extension" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/filestorage/internal/metadata" ) @@ -47,8 +49,10 @@ func TestLoadConfig(t *testing.T) { CheckInterval: time.Second * 5, CleanupOnStart: true, }, - Timeout: 2 * time.Second, - FSync: true, + Timeout: 2 * time.Second, + FSync: true, + CreateDirectory: false, + DirectoryPermissions: "0750", }, }, } @@ -60,7 +64,7 @@ func TestLoadConfig(t *testing.T) { cfg := factory.CreateDefaultConfig() sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) @@ -95,3 +99,175 @@ func TestHandleProvidingFilePathAsDirWithAnError(t *testing.T) { require.Error(t, err) require.EqualError(t, err, file.Name()+" is not a directory") } + +func TestDirectoryCreateConfig(t *testing.T) { + tests := []struct { + name string + config func(*testing.T, extension.Factory) *Config + err error + }{ + { + name: "create directory true - no error", + config: func(t *testing.T, f extension.Factory) *Config { + storageDir := filepath.Join(t.TempDir(), uuid.NewString()) + cfg := f.CreateDefaultConfig().(*Config) + cfg.Directory = storageDir + cfg.CreateDirectory = true + return cfg + }, + err: nil, + }, + { + name: "create directory true - no error - 0700 permissions", + config: func(t *testing.T, f extension.Factory) *Config { + storageDir := filepath.Join(t.TempDir(), uuid.NewString()) + cfg := f.CreateDefaultConfig().(*Config) + cfg.Directory = storageDir + cfg.CreateDirectory = true + cfg.DirectoryPermissions = "0700" + return cfg + }, + err: nil, + }, + { + name: "create directory false - error", + config: func(t *testing.T, f extension.Factory) *Config { + storageDir := filepath.Join(t.TempDir(), uuid.NewString()) + cfg := f.CreateDefaultConfig().(*Config) + cfg.Directory = storageDir + cfg.CreateDirectory = false + return cfg + }, + err: os.ErrNotExist, + }, + { + name: "create directory true - invalid permissions", + config: func(t *testing.T, f extension.Factory) *Config { + storageDir := filepath.Join(t.TempDir(), uuid.NewString()) + cfg := f.CreateDefaultConfig().(*Config) + cfg.Directory = storageDir + cfg.CreateDirectory = true + cfg.DirectoryPermissions = "invalid string" + return cfg + }, + err: errInvalidOctal, + }, + { + name: "create directory true - rwxr--r-- (should be octal string)", + config: func(t *testing.T, f extension.Factory) *Config { + storageDir := filepath.Join(t.TempDir(), uuid.NewString()) + cfg := f.CreateDefaultConfig().(*Config) + cfg.Directory = storageDir + cfg.CreateDirectory = true + cfg.DirectoryPermissions = "rwxr--r--" + return cfg + }, + err: errInvalidOctal, + }, + { + name: "create directory true - 0778 (invalid octal)", + config: func(t *testing.T, f extension.Factory) *Config { + storageDir := filepath.Join(t.TempDir(), uuid.NewString()) + cfg := f.CreateDefaultConfig().(*Config) + cfg.Directory = storageDir + cfg.CreateDirectory = true + cfg.DirectoryPermissions = "0778" + return cfg + }, + err: errInvalidOctal, + }, + { + name: "create directory true - 07771 (invalid permission bits)", + config: func(t *testing.T, f extension.Factory) *Config { + storageDir := filepath.Join(t.TempDir(), uuid.NewString()) + cfg := f.CreateDefaultConfig().(*Config) + cfg.Directory = storageDir + cfg.CreateDirectory = true + cfg.DirectoryPermissions = "07771" + return cfg + }, + err: errInvalidPermissionBits, + }, + { + name: "create directory false - 07771 (invalid string) - no error", + config: func(t *testing.T, f extension.Factory) *Config { + cfg := f.CreateDefaultConfig().(*Config) + cfg.Directory = t.TempDir() + cfg.CreateDirectory = false + cfg.DirectoryPermissions = "07771" + return cfg + }, + err: nil, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + f := NewFactory() + config := tt.config(t, f) + require.ErrorIs(t, config.Validate(), tt.err) + }) + } +} + +func TestCompactionDirectory(t *testing.T) { + f := NewFactory() + tests := []struct { + name string + config func(*testing.T) *Config + err error + }{ + { + name: "directory-must-exists-error", + config: func(t *testing.T) *Config { + cfg := f.CreateDefaultConfig().(*Config) + cfg.Directory = t.TempDir() // actual directory + cfg.Compaction.Directory = "/not/a/dir" // not a directory + cfg.Compaction.OnRebound = true + cfg.Compaction.OnStart = true + return cfg + }, + err: os.ErrNotExist, + }, + { + name: "directory-must-exists-error-on-start", + config: func(t *testing.T) *Config { + cfg := f.CreateDefaultConfig().(*Config) + cfg.Directory = t.TempDir() // actual directory + cfg.Compaction.Directory = "/not/a/dir" // not a directory + cfg.Compaction.OnRebound = false + cfg.Compaction.OnStart = true + return cfg + }, + err: os.ErrNotExist, + }, + { + name: "directory-must-exists-error-on-rebound", + config: func(t *testing.T) *Config { + cfg := f.CreateDefaultConfig().(*Config) + cfg.Directory = t.TempDir() // actual directory + cfg.Compaction.Directory = "/not/a/dir" // not a directory + cfg.Compaction.OnRebound = true + cfg.Compaction.OnStart = false + return cfg + }, + err: os.ErrNotExist, + }, + { + name: "compaction-disabled-no-error", + config: func(t *testing.T) *Config { + cfg := f.CreateDefaultConfig().(*Config) + cfg.Directory = t.TempDir() // actual directory + cfg.Compaction.Directory = "/not/a/dir" // not a directory + cfg.Compaction.OnRebound = false + cfg.Compaction.OnStart = false + return cfg + }, + err: nil, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + require.ErrorIs(t, component.ValidateConfig(test.config(t)), test.err) + }) + } +} diff --git a/extension/storage/filestorage/extension.go b/extension/storage/filestorage/extension.go index f9d0467accbf..f26474e936c9 100644 --- a/extension/storage/filestorage/extension.go +++ b/extension/storage/filestorage/extension.go @@ -26,6 +26,19 @@ type localFileStorage struct { var _ storage.Extension = (*localFileStorage)(nil) func newLocalFileStorage(logger *zap.Logger, config *Config) (extension.Extension, error) { + if config.CreateDirectory { + var dirs []string + if config.Compaction.OnStart || config.Compaction.OnRebound { + dirs = []string{config.Directory, config.Compaction.Directory} + } else { + dirs = []string{config.Directory} + } + for _, dir := range dirs { + if err := ensureDirectoryExists(dir, os.FileMode(config.directoryPermissionsParsed)); err != nil { + return nil, err + } + } + } return &localFileStorage{ cfg: config, logger: logger, @@ -59,7 +72,6 @@ func (lfs *localFileStorage) GetClient(_ context.Context, kind component.Kind, e rawName = sanitize(rawName) absoluteName := filepath.Join(lfs.cfg.Directory, rawName) client, err := newClient(lfs.logger, absoluteName, lfs.cfg.Timeout, lfs.cfg.Compaction, !lfs.cfg.FSync) - if err != nil { return nil, err } @@ -129,6 +141,14 @@ func isSafe(character rune) bool { return false } +func ensureDirectoryExists(path string, perm os.FileMode) error { + if _, err := os.Stat(path); os.IsNotExist(err) { + return os.MkdirAll(path, perm) + } + // we already handled other errors in config.Validate(), so it's okay to return nil + return nil +} + // cleanup left compaction temporary files from previous killed process func (lfs *localFileStorage) cleanup(compactionDirectory string) error { pattern := filepath.Join(compactionDirectory, fmt.Sprintf("%s*", TempDbPrefix)) diff --git a/extension/storage/filestorage/extension_test.go b/extension/storage/filestorage/extension_test.go index 578a52bd3f44..10f9b9a473a2 100644 --- a/extension/storage/filestorage/extension_test.go +++ b/extension/storage/filestorage/extension_test.go @@ -8,15 +8,20 @@ import ( "fmt" "os" "path/filepath" + "runtime" "sync" "testing" + "github.com/google/uuid" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/extension" "go.opentelemetry.io/collector/extension/experimental/storage" "go.opentelemetry.io/collector/extension/extensiontest" + "go.uber.org/zap" + "go.uber.org/zap/zaptest/observer" ) func TestExtensionIntegrity(t *testing.T) { @@ -64,7 +69,6 @@ func TestExtensionIntegrity(t *testing.T) { // Repeatedly thrash client for j := 0; j < 100; j++ { - // Make sure my values are still mine for i := 0; i < len(keys); i++ { v, err := c.Get(ctx, keys[i]) @@ -138,7 +142,6 @@ func TestClientHandlesSimpleCases(t *testing.T) { data, err = client.Get(ctx, "key") require.NoError(t, err) require.Nil(t, data) - } func TestTwoClientsWithDifferentNames(t *testing.T) { @@ -229,7 +232,7 @@ func TestComponentNameWithUnsafeCharacters(t *testing.T) { cfg := f.CreateDefaultConfig().(*Config) cfg.Directory = tempDir - extension, err := f.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + extension, err := f.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) se, ok := extension.(storage.Extension) @@ -257,7 +260,7 @@ func TestGetClientErrorsOnDeletedDirectory(t *testing.T) { cfg := f.CreateDefaultConfig().(*Config) cfg.Directory = tempDir - extension, err := f.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + extension, err := f.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) se, ok := extension.(storage.Extension) @@ -283,7 +286,7 @@ func newTestExtension(t *testing.T) storage.Extension { cfg := f.CreateDefaultConfig().(*Config) cfg.Directory = t.TempDir() - extension, err := f.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + extension, err := f.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) se, ok := extension.(storage.Extension) @@ -305,7 +308,7 @@ func TestCompaction(t *testing.T) { cfg := f.CreateDefaultConfig().(*Config) cfg.Directory = tempDir - extension, err := f.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + extension, err := f.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) se, ok := extension.(storage.Extension) @@ -324,7 +327,7 @@ func TestCompaction(t *testing.T) { files, err := os.ReadDir(tempDir) require.NoError(t, err) - require.Equal(t, 1, len(files)) + require.Len(t, files, 1) file := files[0] path := filepath.Join(tempDir, file.Name()) @@ -395,7 +398,7 @@ func TestCompactionRemoveTemp(t *testing.T) { cfg := f.CreateDefaultConfig().(*Config) cfg.Directory = tempDir - extension, err := f.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + extension, err := f.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) se, ok := extension.(storage.Extension) @@ -415,7 +418,7 @@ func TestCompactionRemoveTemp(t *testing.T) { // check if only db exists in tempDir files, err := os.ReadDir(tempDir) require.NoError(t, err) - require.Equal(t, 1, len(files)) + require.Len(t, files, 1) fileName := files[0].Name() // perform compaction in the same directory @@ -430,7 +433,7 @@ func TestCompactionRemoveTemp(t *testing.T) { // check if only db exists in tempDir files, err = os.ReadDir(tempDir) require.NoError(t, err) - require.Equal(t, 1, len(files)) + require.Len(t, files, 1) require.Equal(t, fileName, files[0].Name()) // perform compaction in different directory @@ -447,7 +450,7 @@ func TestCompactionRemoveTemp(t *testing.T) { // check if emptyTempDir is empty after compaction files, err = os.ReadDir(emptyTempDir) require.NoError(t, err) - require.Equal(t, 0, len(files)) + require.Empty(t, files) } func TestCleanupOnStart(t *testing.T) { @@ -463,7 +466,7 @@ func TestCleanupOnStart(t *testing.T) { cfg.Directory = tempDir cfg.Compaction.Directory = tempDir cfg.Compaction.CleanupOnStart = true - extension, err := f.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + extension, err := f.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) se, ok := extension.(storage.Extension) @@ -483,5 +486,129 @@ func TestCleanupOnStart(t *testing.T) { files, err := os.ReadDir(tempDir) require.NoError(t, err) - require.Equal(t, 1, len(files)) + require.Len(t, files, 1) +} + +func TestCompactionOnStart(t *testing.T) { + ctx := context.Background() + + logCore, logObserver := observer.New(zap.DebugLevel) + logger := zap.New(logCore) + set := extensiontest.NewNopSettings() + set.Logger = logger + + tempDir := t.TempDir() + temp, _ := os.CreateTemp(tempDir, TempDbPrefix) + temp.Close() + + f := NewFactory() + cfg := f.CreateDefaultConfig().(*Config) + cfg.Directory = tempDir + cfg.Compaction.Directory = tempDir + cfg.Compaction.OnStart = true + extension, err := f.Create(context.Background(), set, cfg) + require.NoError(t, err) + + se, ok := extension.(storage.Extension) + require.True(t, ok) + require.NoError(t, se.Start(ctx, componenttest.NewNopHost())) + + client, err := se.GetClient( + ctx, + component.KindReceiver, + newTestEntity("my_component"), + "", + ) + require.NoError(t, err) + t.Cleanup(func() { + // At least one compaction should have happened on start + require.GreaterOrEqual(t, len(logObserver.FilterMessage("finished compaction").All()), 1) + require.NoError(t, client.Close(context.TODO())) + }) +} + +func TestDirectoryCreation(t *testing.T) { + tests := []struct { + name string + config func(*testing.T, extension.Factory) *Config + validate func(*testing.T, *Config) + }{ + { + name: "create directory true - no error", + config: func(t *testing.T, f extension.Factory) *Config { + tempDir := t.TempDir() + storageDir := filepath.Join(tempDir, uuid.NewString()) + cfg := f.CreateDefaultConfig().(*Config) + cfg.Directory = storageDir + cfg.CreateDirectory = true + cfg.DirectoryPermissions = "0750" + require.NoError(t, cfg.Validate()) + return cfg + }, + validate: func(t *testing.T, cfg *Config) { + require.DirExists(t, cfg.Directory) + s, err := os.Stat(cfg.Directory) + require.NoError(t, err) + var expectedFileMode os.FileMode + if runtime.GOOS == "windows" { // on Windows, we get 0777 for writable directories + expectedFileMode = os.FileMode(0o777) + } else { + expectedFileMode = os.FileMode(0o750) + } + require.Equal(t, expectedFileMode, s.Mode()&os.ModePerm) + }, + }, + { + name: "create directory true - no error - 0700 permissions", + config: func(t *testing.T, f extension.Factory) *Config { + tempDir := t.TempDir() + storageDir := filepath.Join(tempDir, uuid.NewString()) + cfg := f.CreateDefaultConfig().(*Config) + cfg.Directory = storageDir + cfg.DirectoryPermissions = "0700" + cfg.CreateDirectory = true + require.NoError(t, cfg.Validate()) + return cfg + }, + validate: func(t *testing.T, cfg *Config) { + require.DirExists(t, cfg.Directory) + s, err := os.Stat(cfg.Directory) + require.NoError(t, err) + var expectedFileMode os.FileMode + if runtime.GOOS == "windows" { // on Windows, we get 0777 for writable directories + expectedFileMode = os.FileMode(0o777) + } else { + expectedFileMode = os.FileMode(0o700) + } + require.Equal(t, expectedFileMode, s.Mode()&os.ModePerm) + }, + }, + { + name: "create directory false - error", + config: func(t *testing.T, f extension.Factory) *Config { + tempDir := t.TempDir() + storageDir := filepath.Join(tempDir, uuid.NewString()) + cfg := f.CreateDefaultConfig().(*Config) + cfg.Directory = storageDir + cfg.CreateDirectory = false + require.ErrorIs(t, cfg.Validate(), os.ErrNotExist) + return cfg + }, + validate: func(t *testing.T, cfg *Config) { + require.NoDirExists(t, cfg.Directory) + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + f := NewFactory() + config := tt.config(t, f) + if config != nil { + ext, err := f.Create(context.Background(), extensiontest.NewNopSettings(), config) + require.NoError(t, err) + require.NotNil(t, ext) + tt.validate(t, config) + } + }) + } } diff --git a/extension/storage/filestorage/factory.go b/extension/storage/filestorage/factory.go index 18178c54a4ea..68bc845e680e 100644 --- a/extension/storage/filestorage/factory.go +++ b/extension/storage/filestorage/factory.go @@ -47,14 +47,16 @@ func createDefaultConfig() component.Config { CheckInterval: defaultCompactionInterval, CleanupOnStart: false, }, - Timeout: time.Second, - FSync: false, + Timeout: time.Second, + FSync: false, + CreateDirectory: false, + DirectoryPermissions: "0750", } } func createExtension( _ context.Context, - params extension.CreateSettings, + params extension.Settings, cfg component.Config, ) (extension.Extension, error) { return newLocalFileStorage(params.Logger, cfg.(*Config)) diff --git a/extension/storage/filestorage/factory_test.go b/extension/storage/filestorage/factory_test.go index c022d76ba921..a770df0ef669 100644 --- a/extension/storage/filestorage/factory_test.go +++ b/extension/storage/filestorage/factory_test.go @@ -29,7 +29,7 @@ func TestFactory(t *testing.T) { require.Equal(t, expected, cfg.Directory) } require.Equal(t, time.Second, cfg.Timeout) - require.Equal(t, false, cfg.FSync) + require.False(t, cfg.FSync) tests := []struct { name string @@ -50,9 +50,9 @@ func TestFactory(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { - e, err := f.CreateExtension( + e, err := f.Create( context.Background(), - extensiontest.NewNopCreateSettings(), + extensiontest.NewNopSettings(), test.config, ) if test.wantErr { diff --git a/extension/storage/filestorage/generated_component_test.go b/extension/storage/filestorage/generated_component_test.go index f6a28bc77c7f..4527048a7be4 100644 --- a/extension/storage/filestorage/generated_component_test.go +++ b/extension/storage/filestorage/generated_component_test.go @@ -30,18 +30,18 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) t.Run("shutdown", func(t *testing.T) { - e, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + e, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) err = e.Shutdown(context.Background()) require.NoError(t, err) }) t.Run("lifecycle", func(t *testing.T) { - firstExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + firstExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, firstExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, firstExt.Shutdown(context.Background())) - secondExt, err := factory.CreateExtension(context.Background(), extensiontest.NewNopCreateSettings(), cfg) + secondExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) require.NoError(t, err) require.NoError(t, secondExt.Start(context.Background(), componenttest.NewNopHost())) require.NoError(t, secondExt.Shutdown(context.Background())) diff --git a/extension/storage/filestorage/go.mod b/extension/storage/filestorage/go.mod index 9df819d73d43..26ace7d56f19 100644 --- a/extension/storage/filestorage/go.mod +++ b/extension/storage/filestorage/go.mod @@ -1,51 +1,47 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/filestorage -go 1.21.0 +go 1.22.0 require ( - github.com/stretchr/testify v1.9.0 - go.etcd.io/bbolt v1.3.10 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/google/uuid v1.6.0 + github.com/stretchr/testify v1.10.0 + go.etcd.io/bbolt v1.3.11 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) -require github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect +require github.com/go-viper/mapstructure/v2 v2.2.1 // indirect require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/google/uuid v1.6.0 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/storage/filestorage/go.sum b/extension/storage/filestorage/go.sum index 36c4642cf7e6..e7a4b5be918b 100644 --- a/extension/storage/filestorage/go.sum +++ b/extension/storage/filestorage/go.sum @@ -1,18 +1,16 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -23,8 +21,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -35,44 +33,40 @@ github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zx github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.etcd.io/bbolt v1.3.10 h1:+BqfJTcCzTItrop8mq/lbzL8wSGtj94UO/3U31shqG0= -go.etcd.io/bbolt v1.3.10/go.mod h1:bK3UQLPJZly7IlNmV7uVHJDxfe5aK9Ll93e/74Y9oEQ= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.etcd.io/bbolt v1.3.11 h1:yGEzV1wPz2yVCLsD8ZAiGHhHVlczyC9d1rP43/VCRJ0= +go.etcd.io/bbolt v1.3.11/go.mod h1:dksAq7YMXoljX0xu6VF5DMZGbhYYoLUalEiSySYAS4I= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -88,22 +82,22 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -112,12 +106,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/extension/storage/filestorage/internal/metadata/generated_status.go b/extension/storage/filestorage/internal/metadata/generated_status.go index f1831d98fa32..f50b3745729b 100644 --- a/extension/storage/filestorage/internal/metadata/generated_status.go +++ b/extension/storage/filestorage/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("file_storage") + Type = component.MustNewType("file_storage") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/filestorage" ) const ( diff --git a/extension/storage/filestorage/internal/metadata/generated_telemetry.go b/extension/storage/filestorage/internal/metadata/generated_telemetry.go deleted file mode 100644 index 6a985245444a..000000000000 --- a/extension/storage/filestorage/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/filestorage") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/filestorage") -} diff --git a/extension/storage/filestorage/internal/metadata/generated_telemetry_test.go b/extension/storage/filestorage/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 7f92dac8fafc..000000000000 --- a/extension/storage/filestorage/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/filestorage", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/filestorage", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/storage/filestorage/metadata.yaml b/extension/storage/filestorage/metadata.yaml index 6707480d428a..6953a45f1019 100644 --- a/extension/storage/filestorage/metadata.yaml +++ b/extension/storage/filestorage/metadata.yaml @@ -1,11 +1,10 @@ type: file_storage -scope_name: otelcol/filestorage status: class: extension stability: beta: [extension] - distributions: [contrib] + distributions: [contrib, k8s] codeowners: active: [djaglowski] seeking_new: true diff --git a/extension/storage/go.mod b/extension/storage/go.mod index 2715edabb58e..0a3bd98ef0d1 100644 --- a/extension/storage/go.mod +++ b/extension/storage/go.mod @@ -1,48 +1,37 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage -go 1.21.0 +go 1.22.0 require ( - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/knadh/koanf/maps v0.1.1 // indirect - github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect - github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/confmap v0.102.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/metric v1.27.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - go.opentelemetry.io/otel/trace v1.27.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/storage/go.sum b/extension/storage/go.sum index f4c39c4b2679..57c7389c36b3 100644 --- a/extension/storage/go.sum +++ b/extension/storage/go.sum @@ -1,74 +1,54 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= -github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= -github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= -github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -84,20 +64,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -106,12 +86,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/extension/storage/redisstorageextension/Makefile b/extension/storage/redisstorageextension/Makefile new file mode 100644 index 000000000000..bdd863a203be --- /dev/null +++ b/extension/storage/redisstorageextension/Makefile @@ -0,0 +1 @@ +include ../../../Makefile.Common diff --git a/extension/storage/redisstorageextension/README.md b/extension/storage/redisstorageextension/README.md new file mode 100644 index 000000000000..7addf02cd1a2 --- /dev/null +++ b/extension/storage/redisstorageextension/README.md @@ -0,0 +1,48 @@ +# File Storage + + +| Status | | +| ------------- |-----------| +| Stability | [development] | +| Distributions | [] | +| Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fredisstorage%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fredisstorage) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fredisstorage%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fredisstorage) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@atoulme](https://www.github.com/atoulme) \| Seeking more code owners! | + +[development]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#development + + +The Redis Storage extension can persist state to a Redis cluster. + +The extension requires read and write access to a Redis cluster. + +## Config +- `endpoint` (required): The endpoint of the redis instance to connect to. Default: `localhost:6379` +- `password` (optional): the password to connect to the redis instance. Default: `` +- `db` (optional): Database to be selected after connecting to the server. Default: 0 +- `expiration` (optional): TTL for all storage entries. Default TTL means the key has no expiration time. Default: 0 + +## Example + +``` +extensions: + redis_storage: + redis_storage/all_settings: + endpoint: localhost:6379 + password: "" + db: 0 + expiration: 5m + +service: + extensions: [redis_storage, redis_storage/all_settings] + pipelines: + traces: + receivers: [nop] + processors: [nop] + exporters: [nop] + +# Data pipeline is required to load the config. +receivers: + nop: +exporters: + nop: +``` diff --git a/extension/storage/redisstorageextension/config.go b/extension/storage/redisstorageextension/config.go new file mode 100644 index 000000000000..34257ddcc3c3 --- /dev/null +++ b/extension/storage/redisstorageextension/config.go @@ -0,0 +1,18 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package redisstorageextension // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/redisstorageextension" + +import ( + "time" + + "go.opentelemetry.io/collector/config/configopaque" +) + +// Config defines configuration for the Redis storage extension. +type Config struct { + Endpoint string `mapstructure:"endpoint"` + Password configopaque.String `mapstructure:"password"` + DB int `mapstructure:"db"` + Expiration time.Duration `mapstructure:"expiration"` +} diff --git a/extension/storage/redisstorageextension/config_test.go b/extension/storage/redisstorageextension/config_test.go new file mode 100644 index 000000000000..6ea05a88535c --- /dev/null +++ b/extension/storage/redisstorageextension/config_test.go @@ -0,0 +1,58 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package redisstorageextension + +import ( + "path/filepath" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/confmap/confmaptest" + + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/redisstorageextension/internal/metadata" +) + +func TestLoadConfig(t *testing.T) { + t.Parallel() + + tests := []struct { + id component.ID + expected component.Config + }{ + { + id: component.NewID(metadata.Type), + expected: func() component.Config { + ret := NewFactory().CreateDefaultConfig() + ret.(*Config).Endpoint = "localhost:1234" + return ret + }(), + }, + { + id: component.NewIDWithName(metadata.Type, "all_settings"), + expected: &Config{ + Endpoint: "localhost:1234", + Password: "passwd", + DB: 1, + Expiration: 3 * time.Hour, + }, + }, + } + for _, tt := range tests { + t.Run(tt.id.String(), func(t *testing.T) { + cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml")) + require.NoError(t, err) + factory := NewFactory() + cfg := factory.CreateDefaultConfig() + sub, err := cm.Sub(tt.id.String()) + require.NoError(t, err) + require.NoError(t, sub.Unmarshal(&cfg)) + + assert.NoError(t, component.ValidateConfig(cfg)) + assert.Equal(t, tt.expected, cfg) + }) + } +} diff --git a/extension/storage/redisstorageextension/doc.go b/extension/storage/redisstorageextension/doc.go new file mode 100644 index 000000000000..d5e64941ee7f --- /dev/null +++ b/extension/storage/redisstorageextension/doc.go @@ -0,0 +1,5 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +//go:generate mdatagen metadata.yaml +package redisstorageextension // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/redisstorageextension" diff --git a/extension/storage/redisstorageextension/extension.go b/extension/storage/redisstorageextension/extension.go new file mode 100644 index 000000000000..660ea3c418e4 --- /dev/null +++ b/extension/storage/redisstorageextension/extension.go @@ -0,0 +1,131 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package redisstorageextension // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/redisstorageextension" + +import ( + "context" + "errors" + "fmt" + "time" + + "github.com/redis/go-redis/v9" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/extension" + "go.opentelemetry.io/collector/extension/experimental/storage" + "go.uber.org/zap" +) + +type redisStorage struct { + cfg *Config + logger *zap.Logger + client *redis.Client +} + +// Ensure this storage extension implements the appropriate interface +var _ storage.Extension = (*redisStorage)(nil) + +func newRedisStorage(logger *zap.Logger, config *Config) (extension.Extension, error) { + return &redisStorage{ + cfg: config, + logger: logger, + }, nil +} + +// Start runs cleanup if configured +func (rs *redisStorage) Start(context.Context, component.Host) error { + c := redis.NewClient(&redis.Options{ + Addr: rs.cfg.Endpoint, + Password: string(rs.cfg.Password), + DB: rs.cfg.DB, + }) + rs.client = c + return nil +} + +// Shutdown will close any open databases +func (rs *redisStorage) Shutdown(context.Context) error { + if rs.client == nil { + return nil + } + return rs.client.Close() +} + +type redisClient struct { + client *redis.Client + prefix string + expiration time.Duration +} + +var _ storage.Client = redisClient{} + +func (rc redisClient) Get(ctx context.Context, key string) ([]byte, error) { + b, err := rc.client.Get(ctx, rc.prefix+key).Bytes() + if errors.Is(err, redis.Nil) { + return nil, nil + } + return b, err +} + +func (rc redisClient) Set(ctx context.Context, key string, value []byte) error { + _, err := rc.client.Set(ctx, rc.prefix+key, value, rc.expiration).Result() + return err +} + +func (rc redisClient) Delete(ctx context.Context, key string) error { + _, err := rc.client.Del(ctx, rc.prefix+key).Result() + return err +} + +func (rc redisClient) Batch(ctx context.Context, ops ...storage.Operation) error { + p := rc.client.Pipeline() + for _, op := range ops { + switch op.Type { + case storage.Delete: + p.Del(ctx, op.Key) + case storage.Get: + p.Get(ctx, op.Key) + case storage.Set: + p.Set(ctx, op.Key, op.Value, rc.expiration) + } + } + _, err := p.Exec(ctx) + return err +} + +func (rc redisClient) Close(_ context.Context) error { + return nil +} + +// GetClient returns a storage client for an individual component +func (rs *redisStorage) GetClient(_ context.Context, kind component.Kind, ent component.ID, name string) (storage.Client, error) { + var rawName string + if name == "" { + rawName = fmt.Sprintf("%s_%s_%s", kindString(kind), ent.Type(), ent.Name()) + } else { + rawName = fmt.Sprintf("%s_%s_%s_%s", kindString(kind), ent.Type(), ent.Name(), name) + } + + return redisClient{ + client: rs.client, + prefix: rawName, + expiration: rs.cfg.Expiration, + }, nil +} + +func kindString(k component.Kind) string { + switch k { + case component.KindReceiver: + return "receiver" + case component.KindProcessor: + return "processor" + case component.KindExporter: + return "exporter" + case component.KindExtension: + return "extension" + case component.KindConnector: + return "connector" + default: + return "other" // not expected + } +} diff --git a/extension/storage/redisstorageextension/extension_test.go b/extension/storage/redisstorageextension/extension_test.go new file mode 100644 index 000000000000..4f24e0ec91cd --- /dev/null +++ b/extension/storage/redisstorageextension/extension_test.go @@ -0,0 +1,203 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package redisstorageextension + +import ( + "context" + "sync" + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/extension/experimental/storage" + "go.opentelemetry.io/collector/extension/extensiontest" +) + +func TestExtensionIntegrity(t *testing.T) { + t.Skip("Requires a Redis cluster to be present at localhost:6379") + ctx := context.Background() + se := newTestExtension(t) + + type mockComponent struct { + kind component.Kind + name component.ID + } + + components := []mockComponent{ + {kind: component.KindReceiver, name: newTestEntity("receiver_one")}, + {kind: component.KindReceiver, name: newTestEntity("receiver_two")}, + {kind: component.KindProcessor, name: newTestEntity("processor_one")}, + {kind: component.KindProcessor, name: newTestEntity("processor_two")}, + {kind: component.KindExporter, name: newTestEntity("exporter_one")}, + {kind: component.KindExporter, name: newTestEntity("exporter_two")}, + {kind: component.KindExtension, name: newTestEntity("extension_one")}, + {kind: component.KindExtension, name: newTestEntity("extension_two")}, + } + + // Make a client for each component + clients := make(map[component.ID]storage.Client) + for _, c := range components { + client, err := se.GetClient(ctx, c.kind, c.name, "") + require.NoError(t, err) + t.Cleanup(func() { + require.NoError(t, client.Close(ctx)) + }) + + clients[c.name] = client + } + + thrashClient := func(wg *sync.WaitGroup, n component.ID, c storage.Client) { + // keys and values + keys := []string{"a", "b", "c", "d", "e"} + myBytes := []byte(n.Name()) + + // Set my values + for i := 0; i < len(keys); i++ { + err := c.Set(ctx, keys[i], myBytes) + require.NoError(t, err) + } + + // Repeatedly thrash client + for j := 0; j < 100; j++ { + // Make sure my values are still mine + for i := 0; i < len(keys); i++ { + v, err := c.Get(ctx, keys[i]) + require.NoError(t, err) + require.Equal(t, myBytes, v) + } + + // Delete my values + for i := 0; i < len(keys); i++ { + err := c.Delete(ctx, keys[i]) + require.NoError(t, err) + } + + // Reset my values + for i := 0; i < len(keys); i++ { + err := c.Set(ctx, keys[i], myBytes) + require.NoError(t, err) + } + } + wg.Done() + } + + // Use clients concurrently + var wg sync.WaitGroup + for name, client := range clients { + wg.Add(1) + go thrashClient(&wg, name, client) + } + wg.Wait() +} + +func TestClientHandlesSimpleCases(t *testing.T) { + t.Skip("Requires a Redis cluster to be present at localhost:6379") + ctx := context.Background() + se := newTestExtension(t) + + client, err := se.GetClient( + ctx, + component.KindReceiver, + newTestEntity("my_component"), + "", + ) + + myBytes := []byte("value") + require.NoError(t, err) + t.Cleanup(func() { + require.NoError(t, client.Close(ctx)) + }) + + // Set the data + err = client.Set(ctx, "key", myBytes) + require.NoError(t, err) + + // Set it again (nop does not error) + err = client.Set(ctx, "key", myBytes) + require.NoError(t, err) + + // Get actual data + data, err := client.Get(ctx, "key") + require.NoError(t, err) + require.Equal(t, myBytes, data) + + // Delete the data + err = client.Delete(ctx, "key") + require.NoError(t, err) + + // Delete it again (nop does not error) + err = client.Delete(ctx, "key") + require.NoError(t, err) + + // Get missing data + data, err = client.Get(ctx, "key") + require.NoError(t, err) + require.Nil(t, data) +} + +func TestTwoClientsWithDifferentNames(t *testing.T) { + t.Skip("Requires a Redis cluster to be present at localhost:6379") + ctx := context.Background() + se := newTestExtension(t) + + client1, err := se.GetClient( + ctx, + component.KindReceiver, + newTestEntity("my_component"), + "foo", + ) + require.NoError(t, err) + t.Cleanup(func() { + require.NoError(t, client1.Close(ctx)) + }) + + client2, err := se.GetClient( + ctx, + component.KindReceiver, + newTestEntity("my_component"), + "bar", + ) + require.NoError(t, err) + t.Cleanup(func() { + require.NoError(t, client2.Close(ctx)) + }) + + myBytes1 := []byte("value1") + myBytes2 := []byte("value2") + + // Set the data + err = client1.Set(ctx, "key", myBytes1) + require.NoError(t, err) + + err = client2.Set(ctx, "key", myBytes2) + require.NoError(t, err) + + // Check it was associated accordingly + data, err := client1.Get(ctx, "key") + require.NoError(t, err) + require.Equal(t, myBytes1, data) + + data, err = client2.Get(ctx, "key") + require.NoError(t, err) + require.Equal(t, myBytes2, data) +} + +func newTestExtension(t *testing.T) storage.Extension { + f := NewFactory() + cfg := f.CreateDefaultConfig().(*Config) + + extension, err := f.Create(context.Background(), extensiontest.NewNopSettings(), cfg) + require.NoError(t, err) + + se, ok := extension.(storage.Extension) + require.True(t, ok) + require.NoError(t, se.Start(context.Background(), componenttest.NewNopHost())) + + return se +} + +func newTestEntity(name string) component.ID { + return component.MustNewIDWithName("nop", name) +} diff --git a/extension/storage/redisstorageextension/factory.go b/extension/storage/redisstorageextension/factory.go new file mode 100644 index 000000000000..9e8f685f6392 --- /dev/null +++ b/extension/storage/redisstorageextension/factory.go @@ -0,0 +1,36 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package redisstorageextension // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/redisstorageextension" + +import ( + "context" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/extension" + + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/redisstorageextension/internal/metadata" +) + +func NewFactory() extension.Factory { + return extension.NewFactory( + metadata.Type, + createDefaultConfig, + createExtension, + metadata.ExtensionStability, + ) +} + +func createDefaultConfig() component.Config { + return &Config{ + Endpoint: "localhost:6379", + } +} + +func createExtension( + _ context.Context, + params extension.Settings, + cfg component.Config, +) (extension.Extension, error) { + return newRedisStorage(params.Logger, cfg.(*Config)) +} diff --git a/extension/storage/redisstorageextension/factory_test.go b/extension/storage/redisstorageextension/factory_test.go new file mode 100644 index 000000000000..3494cd85fa04 --- /dev/null +++ b/extension/storage/redisstorageextension/factory_test.go @@ -0,0 +1,46 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package redisstorageextension + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/extension/extensiontest" +) + +func TestFactory(t *testing.T) { + f := NewFactory() + + tests := []struct { + name string + config *Config + }{ + { + name: "Default", + config: func() *Config { + return &Config{ + Endpoint: "localhost:6379", + } + }(), + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + e, err := f.Create( + context.Background(), + extensiontest.NewNopSettings(), + test.config, + ) + require.NoError(t, err) + require.NotNil(t, e) + ctx := context.Background() + require.NoError(t, e.Start(ctx, componenttest.NewNopHost())) + require.NoError(t, e.Shutdown(ctx)) + }) + } +} diff --git a/extension/storage/redisstorageextension/generated_component_test.go b/extension/storage/redisstorageextension/generated_component_test.go new file mode 100644 index 000000000000..354ba991ed7e --- /dev/null +++ b/extension/storage/redisstorageextension/generated_component_test.go @@ -0,0 +1,49 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package redisstorageextension + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/confmap/confmaptest" + "go.opentelemetry.io/collector/extension/extensiontest" +) + +func TestComponentFactoryType(t *testing.T) { + require.Equal(t, "redis_storage", NewFactory().Type().String()) +} + +func TestComponentConfigStruct(t *testing.T) { + require.NoError(t, componenttest.CheckConfigStruct(NewFactory().CreateDefaultConfig())) +} + +func TestComponentLifecycle(t *testing.T) { + factory := NewFactory() + + cm, err := confmaptest.LoadConf("metadata.yaml") + require.NoError(t, err) + cfg := factory.CreateDefaultConfig() + sub, err := cm.Sub("tests::config") + require.NoError(t, err) + require.NoError(t, sub.Unmarshal(&cfg)) + t.Run("shutdown", func(t *testing.T) { + e, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) + require.NoError(t, err) + err = e.Shutdown(context.Background()) + require.NoError(t, err) + }) + t.Run("lifecycle", func(t *testing.T) { + firstExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) + require.NoError(t, err) + require.NoError(t, firstExt.Start(context.Background(), componenttest.NewNopHost())) + require.NoError(t, firstExt.Shutdown(context.Background())) + + secondExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(), cfg) + require.NoError(t, err) + require.NoError(t, secondExt.Start(context.Background(), componenttest.NewNopHost())) + require.NoError(t, secondExt.Shutdown(context.Background())) + }) +} diff --git a/extension/storage/redisstorageextension/generated_package_test.go b/extension/storage/redisstorageextension/generated_package_test.go new file mode 100644 index 000000000000..5378f0ceecbe --- /dev/null +++ b/extension/storage/redisstorageextension/generated_package_test.go @@ -0,0 +1,13 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package redisstorageextension + +import ( + "testing" + + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + goleak.VerifyTestMain(m) +} diff --git a/extension/storage/redisstorageextension/go.mod b/extension/storage/redisstorageextension/go.mod new file mode 100644 index 000000000000..8695181843eb --- /dev/null +++ b/extension/storage/redisstorageextension/go.mod @@ -0,0 +1,49 @@ +module github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/redisstorageextension + +go 1.22.0 + +require ( + github.com/redis/go-redis/v9 v9.7.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 + go.uber.org/goleak v1.3.0 + go.uber.org/zap v1.27.0 +) + +require ( + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/knadh/koanf/maps v0.1.1 // indirect + github.com/knadh/koanf/providers/confmap v0.1.0 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/extension/storage/redisstorageextension/go.sum b/extension/storage/redisstorageextension/go.sum new file mode 100644 index 000000000000..c1408d954940 --- /dev/null +++ b/extension/storage/redisstorageextension/go.sum @@ -0,0 +1,127 @@ +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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= +github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= +github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= +github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E= +github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/extension/storage/redisstorageextension/internal/metadata/generated_status.go b/extension/storage/redisstorageextension/internal/metadata/generated_status.go new file mode 100644 index 000000000000..f421f6241af8 --- /dev/null +++ b/extension/storage/redisstorageextension/internal/metadata/generated_status.go @@ -0,0 +1,16 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "go.opentelemetry.io/collector/component" +) + +var ( + Type = component.MustNewType("redis_storage") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/redisstorageextension" +) + +const ( + ExtensionStability = component.StabilityLevelDevelopment +) diff --git a/extension/storage/redisstorageextension/metadata.yaml b/extension/storage/redisstorageextension/metadata.yaml new file mode 100644 index 000000000000..ac41d96b4a17 --- /dev/null +++ b/extension/storage/redisstorageextension/metadata.yaml @@ -0,0 +1,10 @@ +type: redis_storage + +status: + class: extension + stability: + development: [extension] + distributions: [] + codeowners: + active: [atoulme] + seeking_new: true diff --git a/extension/storage/redisstorageextension/testdata/config.yaml b/extension/storage/redisstorageextension/testdata/config.yaml new file mode 100644 index 000000000000..3bbbbcecc8cf --- /dev/null +++ b/extension/storage/redisstorageextension/testdata/config.yaml @@ -0,0 +1,7 @@ +redis_storage: + endpoint: localhost:1234 +redis_storage/all_settings: + endpoint: localhost:1234 + password: passwd + db: 1 + expiration: 3h diff --git a/extension/storage/storagetest/client.go b/extension/storage/storagetest/client.go index 0b1a173fd836..97b99de4cfe4 100644 --- a/extension/storage/storagetest/client.go +++ b/extension/storage/storagetest/client.go @@ -16,9 +16,7 @@ import ( "go.opentelemetry.io/collector/extension/experimental/storage" ) -var ( - errClientClosed = errors.New("client closed") -) +var errClientClosed = errors.New("client closed") type TestClient struct { cache map[string][]byte @@ -139,7 +137,7 @@ func (p *TestClient) Close(_ context.Context) error { return err } - return os.WriteFile(p.storageFile, contents, os.FileMode(0600)) + return os.WriteFile(p.storageFile, contents, os.FileMode(0o600)) } const clientCreatorID = "client_creator_id" diff --git a/extension/storage/storagetest/host_test.go b/extension/storage/storagetest/host_test.go index ab55eef6948e..89215c30dfb7 100644 --- a/extension/storage/storagetest/host_test.go +++ b/extension/storage/storagetest/host_test.go @@ -11,7 +11,7 @@ import ( ) func TestStorageHostWithNone(t *testing.T) { - require.Equal(t, 0, len(NewStorageHost().GetExtensions())) + require.Empty(t, NewStorageHost().GetExtensions()) } func TestStorageHostWithOne(t *testing.T) { @@ -20,7 +20,7 @@ func TestStorageHostWithOne(t *testing.T) { host := NewStorageHost().WithInMemoryStorageExtension("one") exts := host.GetExtensions() - require.Equal(t, 1, len(exts)) + require.Len(t, exts, 1) extOne, exists := exts[storageID] require.True(t, exists) @@ -39,7 +39,7 @@ func TestStorageHostWithTwo(t *testing.T) { WithFileBackedStorageExtension("two", t.TempDir()) exts := host.GetExtensions() - require.Equal(t, 2, len(exts)) + require.Len(t, exts, 2) extOne, exists := exts[storageOneID] require.True(t, exists) @@ -67,7 +67,7 @@ func TestStorageHostWithMixed(t *testing.T) { WithNonStorageExtension("non-storage") exts := host.GetExtensions() - require.Equal(t, 3, len(exts)) + require.Len(t, exts, 3) extOne, exists := exts[storageOneID] require.True(t, exists) diff --git a/extension/sumologicextension/README.md b/extension/sumologicextension/README.md index 3d40c002686d..36e55f91a2e2 100644 --- a/extension/sumologicextension/README.md +++ b/extension/sumologicextension/README.md @@ -5,9 +5,10 @@ | Stability | [alpha] | | Distributions | [] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fsumologic%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fsumologic) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fsumologic%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fsumologic) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@aboguszewski-sumo](https://www.github.com/aboguszewski-sumo), [@kkujawa-sumo](https://www.github.com/kkujawa-sumo), [@mat-rumian](https://www.github.com/mat-rumian), [@rnishtala-sumo](https://www.github.com/rnishtala-sumo), [@sumo-drosiek](https://www.github.com/sumo-drosiek), [@swiatekm-sumo](https://www.github.com/swiatekm-sumo) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@rnishtala-sumo](https://www.github.com/rnishtala-sumo), [@chan-tim-sumo](https://www.github.com/chan-tim-sumo) | +| Emeritus | [@aboguszewski-sumo](https://www.github.com/aboguszewski-sumo), [@kasia-kujawa](https://www.github.com/kasia-kujawa), [@mat-rumian](https://www.github.com/mat-rumian), [@sumo-drosiek](https://www.github.com/sumo-drosiek) | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha This extension is to be used in conjunction with diff --git a/extension/sumologicextension/credentials/credentialsstore_localfs.go b/extension/sumologicextension/credentials/credentialsstore_localfs.go index 4d6283681582..1210d2abb1c0 100644 --- a/extension/sumologicextension/credentials/credentialsstore_localfs.go +++ b/extension/sumologicextension/credentials/credentialsstore_localfs.go @@ -133,7 +133,6 @@ func (cr LocalFsStore) Get(key string) (CollectorCredentials, error) { } creds, err := f(_getHasher(), key) - if err != nil { return CollectorCredentials{}, err } @@ -170,7 +169,7 @@ func (cr LocalFsStore) Store(key string, creds CollectorCredentials) error { return err } - if err = os.WriteFile(path, encryptedCreds, 0600); err != nil { + if err = os.WriteFile(path, encryptedCreds, 0o600); err != nil { return fmt.Errorf("failed to save credentials file '%s': %w", path, err, ) @@ -239,7 +238,7 @@ func (cr LocalFsStore) Validate() error { func ensureDir(path string) error { fi, err := os.Stat(path) if err != nil { - if err := os.Mkdir(path, 0700); err != nil { + if err := os.Mkdir(path, 0o700); err != nil { return err } return nil @@ -247,8 +246,8 @@ func ensureDir(path string) error { // If the directory doesn't have the execution bit then // set it so that we can 'exec' into it. - if fi.Mode().Perm() != 0700 { - if err := os.Chmod(path, 0700); err != nil { + if fi.Mode().Perm() != 0o700 { + if err := os.Chmod(path, 0o700); err != nil { return err } } diff --git a/extension/sumologicextension/credentials/credentialsstore_localfs_test.go b/extension/sumologicextension/credentials/credentialsstore_localfs_test.go index c64599df7591..2f857894e69f 100644 --- a/extension/sumologicextension/credentials/credentialsstore_localfs_test.go +++ b/extension/sumologicextension/credentials/credentialsstore_localfs_test.go @@ -62,18 +62,18 @@ func TestCredentialsStoreLocalFs(t *testing.T) { }, ), ) - require.EqualValues(t, fileCounter, 0) + require.EqualValues(t, 0, fileCounter) } func TestCredentialsStoreValidate(t *testing.T) { var expectedFileMode fs.FileMode dir := filepath.Join(t.TempDir(), "store") if runtime.GOOS == "windows" { // on Windows, we get 0777 for writable directories - expectedFileMode = fs.FileMode(0777) + expectedFileMode = fs.FileMode(0o777) } else { - expectedFileMode = fs.FileMode(0700) + expectedFileMode = fs.FileMode(0o700) } - err := os.Mkdir(dir, 0400) + err := os.Mkdir(dir, 0o400) require.NoError(t, err) store, err := NewLocalFsStore(WithCredentialsDirectory(dir), WithLogger(zap.NewNop())) diff --git a/extension/sumologicextension/credentials/encrypt.go b/extension/sumologicextension/credentials/encrypt.go index 986e1aa8a094..8a9dd35412ab 100644 --- a/extension/sumologicextension/credentials/encrypt.go +++ b/extension/sumologicextension/credentials/encrypt.go @@ -83,7 +83,6 @@ func encrypt(data []byte, encryptionKey []byte) ([]byte, error) { } ret, err := f(_getHasher(), data, encryptionKey) - if err != nil { return ret, err } @@ -115,7 +114,6 @@ func decrypt(data []byte, encryptionKey []byte) ([]byte, error) { } ret, err := f(_getHasher(), data, encryptionKey) - if err != nil { return ret, err } diff --git a/extension/sumologicextension/extension.go b/extension/sumologicextension/extension.go index 3144a0b7dc72..6c1681bb5643 100644 --- a/extension/sumologicextension/extension.go +++ b/extension/sumologicextension/extension.go @@ -15,15 +15,17 @@ import ( "net/http" "net/url" "os" + "runtime" "strings" "sync" "time" "github.com/Showmax/go-fqdn" "github.com/cenkalti/backoff/v4" - ps "github.com/mitchellh/go-ps" - "github.com/shirou/gopsutil/v3/host" + "github.com/shirou/gopsutil/v4/host" + "github.com/shirou/gopsutil/v4/process" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/config/confighttp" "go.opentelemetry.io/collector/extension/auth" "go.opentelemetry.io/collector/featuregate" @@ -75,6 +77,11 @@ const ( collectorCredentialIDField = "collector_credential_id" stickySessionKey = "AWSALB" + + activeMQJavaProcess = "activemq.jar" + cassandraJavaProcess = "org.apache.cassandra.service.CassandraDaemon" + dockerDesktopJavaProcess = "com.docker.backend" + jmxJavaProcess = "com.sun.management.jmxremote" ) const ( @@ -296,7 +303,7 @@ func (se *SumologicExtension) getHTTPClient( httpClient, err := httpClientSettings.ToClient( ctx, se.host, - component.TelemetrySettings{}, + componenttest.NewNopTelemetrySettings(), ) if err != nil { return nil, fmt.Errorf("couldn't create HTTP client: %w", err) @@ -458,8 +465,8 @@ func (se *SumologicExtension) registerCollector(ctx context.Context, collectorNa defer res.Body.Close() if res.StatusCode < 200 || res.StatusCode >= 400 { - return se.handleRegistrationError(res) - } else if res.StatusCode == 301 { + return credentials.CollectorCredentials{}, se.handleRegistrationError(res) + } else if res.StatusCode == http.StatusMovedPermanently { // Use the URL from Location header for subsequent requests. u := strings.TrimSuffix(res.Header.Get("Location"), "/") se.SetBaseURL(u) @@ -487,17 +494,17 @@ func (se *SumologicExtension) registerCollector(ctx context.Context, collectorNa // handleRegistrationError handles the collector registration errors and returns // appropriate error for backoff handling and logging purposes. -func (se *SumologicExtension) handleRegistrationError(res *http.Response) (credentials.CollectorCredentials, error) { +func (se *SumologicExtension) handleRegistrationError(res *http.Response) error { var errResponse api.ErrorResponsePayload if err := json.NewDecoder(res.Body).Decode(&errResponse); err != nil { var buff bytes.Buffer if _, errCopy := io.Copy(&buff, res.Body); errCopy != nil { - return credentials.CollectorCredentials{}, fmt.Errorf( + return fmt.Errorf( "failed to read the collector registration response body, status code: %d, err: %w", res.StatusCode, errCopy, ) } - return credentials.CollectorCredentials{}, fmt.Errorf( + return fmt.Errorf( "failed to decode collector registration response body: %s, status code: %d, err: %w", buff.String(), res.StatusCode, err, ) @@ -510,14 +517,14 @@ func (se *SumologicExtension) handleRegistrationError(res *http.Response) (crede ) // Return unrecoverable error for 4xx status codes except 429 - if res.StatusCode >= 400 && res.StatusCode < 500 && res.StatusCode != 429 { - return credentials.CollectorCredentials{}, backoff.Permanent(fmt.Errorf( + if res.StatusCode >= 400 && res.StatusCode < 500 && res.StatusCode != http.StatusTooManyRequests { + return backoff.Permanent(fmt.Errorf( "failed to register the collector, got HTTP status code: %d", res.StatusCode, )) } - return credentials.CollectorCredentials{}, fmt.Errorf( + return fmt.Errorf( "failed to register the collector, got HTTP status code: %d", res.StatusCode, ) } @@ -603,7 +610,6 @@ func (se *SumologicExtension) heartbeatLoop() { zap.String(collectorNameField, colCreds.Credentials.CollectorName), zap.String(collectorIDField, colCreds.Credentials.CollectorID), ) - } else { se.logger.Error("Heartbeat error", zap.Error(err)) } @@ -617,13 +623,14 @@ func (se *SumologicExtension) heartbeatLoop() { timer.Reset(se.conf.HeartBeatInterval) case <-se.closeChan: } - } } } -var errUnauthorizedHeartbeat = errors.New("heartbeat unauthorized") -var errUnauthorizedMetadata = errors.New("metadata update unauthorized") +var ( + errUnauthorizedHeartbeat = errors.New("heartbeat unauthorized") + errUnauthorizedMetadata = errors.New("metadata update unauthorized") +) type ErrorAPI struct { status int @@ -699,7 +706,7 @@ var sumoAppProcesses = map[string]string{ "apache": "apache", "apache2": "apache", "httpd": "apache", - "docker": "docker", + "docker": "docker", // docker cli "elasticsearch": "elasticsearch", "mysql-server": "mysql", "mysqld": "mysql", @@ -710,32 +717,78 @@ var sumoAppProcesses = map[string]string{ "redis": "redis", "tomcat": "tomcat", "kafka-server-start.sh": "kafka", // Need to test this, most common shell wrapper. + "redis-server": "redis", + "mongod": "mongodb", + "cassandra": "cassandra", + "jmx": "jmx", + "activemq": "activemq", + "memcached": "memcached", + "haproxy": "haproxy", + "dockerd": "docker-ce", // docker engine, for when process runs natively + "com.docker.backend": "docker-ce", // docker daemon runs on a VM in Docker Desktop, process doesn't show on mac + "sqlservr": "mssql", // linux SQL Server process } -func filteredProcessList() ([]string, error) { +func (se *SumologicExtension) filteredProcessList() ([]string, error) { var pl []string - p, err := ps.Processes() + processes, err := process.Processes() if err != nil { return pl, err } - for _, v := range p { - e := strings.ToLower(v.Executable()) + for _, v := range processes { + e, err := v.Name() + if err != nil { + if runtime.GOOS == "windows" { + // On Windows, if we can't get a process name, it is likely a zombie process, assume that and skip them. + se.logger.Warn( + "Failed to get executable name, it is likely a zombie process, skipping it", + zap.Int32("pid", v.Pid), + zap.Error(err)) + continue + } + + return nil, fmt.Errorf("Error getting executable name: %w", err) + } + e = strings.ToLower(e) + if a, i := sumoAppProcesses[e]; i { pl = append(pl, a) } + + // handling for Docker Desktop + if e == dockerDesktopJavaProcess { + pl = append(pl, "docker-ce") + } + + // handling Java background processes + if e == "java" { + cmdline, err := v.Cmdline() + if err != nil { + return nil, fmt.Errorf("error getting executable name for PID %d: %w", v.Pid, err) + } + + switch { + case strings.Contains(cmdline, cassandraJavaProcess): + pl = append(pl, "cassandra") + case strings.Contains(cmdline, jmxJavaProcess): + pl = append(pl, "jmx") + case strings.Contains(cmdline, activeMQJavaProcess): + pl = append(pl, "activemq") + } + } } return pl, nil } -func discoverTags() (map[string]any, error) { +func (se *SumologicExtension) discoverTags() (map[string]any, error) { t := map[string]any{ "sumo.disco.enabled": "true", } - pl, err := filteredProcessList() + pl, err := se.filteredProcessList() if err != nil { return t, err } @@ -771,7 +824,7 @@ func (se *SumologicExtension) updateMetadataWithHTTPClient(ctx context.Context, td := map[string]any{} if se.conf.DiscoverCollectorTags { - td, err = discoverTags() + td, err = se.discoverTags() if err != nil { return err } diff --git a/extension/sumologicextension/extension_test.go b/extension/sumologicextension/extension_test.go index 2e22649d5f7d..5ea1377a654f 100644 --- a/extension/sumologicextension/extension_test.go +++ b/extension/sumologicextension/extension_test.go @@ -31,7 +31,6 @@ import ( func setupTestMain(m *testing.M) { // Enable the feature gates before all tests to avoid flaky tests. err := featuregate.GlobalRegistry().Set(updateCollectorMetadataID, true) - if err != nil { panic("unable to set feature gates") } @@ -97,10 +96,9 @@ func TestBasicStart(t *testing.T) { reqNum := atomic.AddInt32(&reqCount, 1) switch reqNum { - // register case 1: - require.Equal(t, registerURL, req.URL.Path) + assert.Equal(t, registerURL, req.URL.Path) _, err := w.Write([]byte(`{ "collectorCredentialID": "collectorId", "collectorCredentialKey": "collectorKey", @@ -113,12 +111,12 @@ func TestBasicStart(t *testing.T) { // metadata case 2: assert.Equal(t, metadataURL, req.URL.Path) - w.WriteHeader(200) + w.WriteHeader(http.StatusOK) // heartbeat case 3: assert.Equal(t, heartbeatURL, req.URL.Path) - w.WriteHeader(204) + w.WriteHeader(http.StatusNoContent) // should not produce any more requests default: @@ -159,10 +157,9 @@ func TestStoreCredentials(t *testing.T) { reqNum := atomic.AddInt32(&reqCount, 1) switch reqNum { - // register case 1: - require.Equal(t, registerURL, req.URL.Path) + assert.Equal(t, registerURL, req.URL.Path) _, err := w.Write([]byte(`{ "collectorCredentialID": "collectorId", "collectorCredentialKey": "collectorKey", @@ -175,12 +172,12 @@ func TestStoreCredentials(t *testing.T) { // metadata case 2: assert.Equal(t, metadataURL, req.URL.Path) - w.WriteHeader(200) + w.WriteHeader(http.StatusOK) // heartbeat case 3: assert.Equal(t, heartbeatURL, req.URL.Path) - w.WriteHeader(204) + w.WriteHeader(http.StatusNoContent) // should not produce any more requests default: @@ -238,7 +235,7 @@ func TestStoreCredentials(t *testing.T) { cfg.CollectorCredentialsDirectory = dir // Ensure the directory has 600 permissions - require.NoError(t, os.Chmod(dir, 0600)) + require.NoError(t, os.Chmod(dir, 0o600)) se, err := newSumologicExtension(cfg, zap.NewNop(), component.NewID(metadata.Type), "1.0.0") require.NoError(t, err) @@ -263,7 +260,7 @@ func TestStoreCredentials(t *testing.T) { cfg.CollectorCredentialsDirectory = dir // Ensure the directory has 700 permissions - require.NoError(t, os.Chmod(dir, 0700)) + require.NoError(t, os.Chmod(dir, 0o700)) se, err := newSumologicExtension(cfg, zap.NewNop(), component.NewID(metadata.Type), "1.0.0") require.NoError(t, err) @@ -317,13 +314,13 @@ func TestStoreCredentials_PreexistingCredentialsAreUsed(t *testing.T) { switch reqNum { // heartbeat case 1: - require.Equal(t, heartbeatURL, req.URL.Path) - w.WriteHeader(204) + assert.Equal(t, heartbeatURL, req.URL.Path) + w.WriteHeader(http.StatusNoContent) // metadata case 2: - require.Equal(t, metadataURL, req.URL.Path) - w.WriteHeader(200) + assert.Equal(t, metadataURL, req.URL.Path) + w.WriteHeader(http.StatusOK) // should not produce any more requests default: @@ -387,7 +384,7 @@ func TestStoreCredentials_PreexistingCredentialsAreUsed(t *testing.T) { require.NoError(t, se.Shutdown(context.Background())) require.FileExists(t, credsPath) - require.EqualValues(t, atomic.LoadInt32(&reqCount), 2) + require.EqualValues(t, 2, atomic.LoadInt32(&reqCount)) } func TestLocalFSCredentialsStore_WorkCorrectlyForMultipleExtensions(t *testing.T) { @@ -402,10 +399,9 @@ func TestLocalFSCredentialsStore_WorkCorrectlyForMultipleExtensions(t *testing.T reqNum := atomic.AddInt32(&reqCount, 1) switch reqNum { - // register case 1: - require.Equal(t, registerURL, req.URL.Path) + assert.Equal(t, registerURL, req.URL.Path) _, err := w.Write([]byte(`{ "collectorCredentialID": "collectorId", "collectorCredentialKey": "collectorKey", @@ -418,12 +414,12 @@ func TestLocalFSCredentialsStore_WorkCorrectlyForMultipleExtensions(t *testing.T // metadata case 2: assert.Equal(t, metadataURL, req.URL.Path) - w.WriteHeader(200) + w.WriteHeader(http.StatusOK) // heartbeat case 3: assert.Equal(t, heartbeatURL, req.URL.Path) - w.WriteHeader(204) + w.WriteHeader(http.StatusNoContent) // should not produce any more requests default: @@ -506,10 +502,9 @@ func TestRegisterEmptyCollectorName(t *testing.T) { reqNum := atomic.AddInt32(&reqCount, 1) switch reqNum { - // register case 1: - require.Equal(t, registerURL, req.URL.Path) + assert.Equal(t, registerURL, req.URL.Path) authHeader := req.Header.Get("Authorization") assert.Equal(t, "Bearer dummy_install_token", authHeader, @@ -527,12 +522,12 @@ func TestRegisterEmptyCollectorName(t *testing.T) { // metadata case 2: assert.Equal(t, metadataURL, req.URL.Path) - w.WriteHeader(200) + w.WriteHeader(http.StatusOK) // heartbeat case 3: assert.Equal(t, heartbeatURL, req.URL.Path) - w.WriteHeader(204) + w.WriteHeader(http.StatusNoContent) // should not produce any more requests default: @@ -575,10 +570,9 @@ func TestRegisterEmptyCollectorNameForceRegistration(t *testing.T) { reqNum := atomic.AddInt32(&reqCount, 1) switch reqNum { - // register case 1: - require.Equal(t, registerURL, req.URL.Path) + assert.Equal(t, registerURL, req.URL.Path) authHeader := req.Header.Get("Authorization") assert.Equal(t, "Bearer dummy_install_token", authHeader, @@ -597,11 +591,11 @@ func TestRegisterEmptyCollectorNameForceRegistration(t *testing.T) { // metadata case 2: assert.Equal(t, metadataURL, req.URL.Path) - w.WriteHeader(200) + w.WriteHeader(http.StatusOK) // register again because force registration was set case 3: - require.Equal(t, registerURL, req.URL.Path) + assert.Equal(t, registerURL, req.URL.Path) authHeader := req.Header.Get("Authorization") assert.Equal(t, "Bearer dummy_install_token", authHeader, @@ -620,7 +614,7 @@ func TestRegisterEmptyCollectorNameForceRegistration(t *testing.T) { // metadata case 4: assert.Equal(t, metadataURL, req.URL.Path) - w.WriteHeader(200) + w.WriteHeader(http.StatusOK) // should not produce any more requests default: @@ -669,10 +663,9 @@ func TestCollectorSendsBasicAuthHeadersOnRegistration(t *testing.T) { reqNum := atomic.AddInt32(&reqCount, 1) switch reqNum { - // register case 1: - require.Equal(t, registerURL, req.URL.Path) + assert.Equal(t, registerURL, req.URL.Path) authHeader := req.Header.Get("Authorization") assert.Equal(t, "Bearer dummy_install_token", authHeader, @@ -690,12 +683,12 @@ func TestCollectorSendsBasicAuthHeadersOnRegistration(t *testing.T) { // metadata case 2: assert.Equal(t, metadataURL, req.URL.Path) - w.WriteHeader(200) + w.WriteHeader(http.StatusOK) // heartbeat case 3: assert.Equal(t, heartbeatURL, req.URL.Path) - w.WriteHeader(204) + w.WriteHeader(http.StatusNoContent) // should not produce any more requests default: @@ -773,10 +766,9 @@ func TestCollectorCheckingCredentialsFoundInLocalStorage(t *testing.T) { reqNum := atomic.AddInt32(&reqCount, 1) switch reqNum { - // heatbeat case 1: - require.NotEqual(t, registerURL, req.URL.Path, + assert.NotEqual(t, registerURL, req.URL.Path, "collector shouldn't call the register API when credentials locally retrieved") assert.Equal(t, heartbeatURL, req.URL.Path) @@ -788,12 +780,12 @@ func TestCollectorCheckingCredentialsFoundInLocalStorage(t *testing.T) { assert.Equal(t, "Basic "+token, authHeader, "collector didn't send correct Authorization header with heartbeat request") - w.WriteHeader(204) + w.WriteHeader(http.StatusNoContent) // metadata case 2: assert.Equal(t, metadataURL, req.URL.Path) - w.WriteHeader(200) + w.WriteHeader(http.StatusOK) // should not produce any more requests default: @@ -821,10 +813,9 @@ func TestCollectorCheckingCredentialsFoundInLocalStorage(t *testing.T) { reqNum := atomic.AddInt32(&reqCount, 1) switch reqNum { - // failing heatbeat case 1: - require.NotEqual(t, registerURL, req.URL.Path, + assert.NotEqual(t, registerURL, req.URL.Path, "collector shouldn't call the register API when credentials locally retrieved") assert.Equal(t, heartbeatURL, req.URL.Path) @@ -840,7 +831,7 @@ func TestCollectorCheckingCredentialsFoundInLocalStorage(t *testing.T) { // successful heatbeat case 2: - require.NotEqual(t, registerURL, req.URL.Path, + assert.NotEqual(t, registerURL, req.URL.Path, "collector shouldn't call the register API when credentials locally retrieved") assert.Equal(t, heartbeatURL, req.URL.Path) @@ -852,12 +843,12 @@ func TestCollectorCheckingCredentialsFoundInLocalStorage(t *testing.T) { assert.Equal(t, "Basic "+token, authHeader, "collector didn't send correct Authorization header with heartbeat request") - w.WriteHeader(204) + w.WriteHeader(http.StatusNoContent) // metadata case 3: assert.Equal(t, metadataURL, req.URL.Path) - w.WriteHeader(200) + w.WriteHeader(http.StatusOK) // should not produce any more requests default: @@ -885,10 +876,9 @@ func TestCollectorCheckingCredentialsFoundInLocalStorage(t *testing.T) { reqNum := atomic.AddInt32(&reqCount, 1) switch reqNum { - // failing heatbeat case 1: - require.NotEqual(t, registerURL, req.URL.Path, + assert.NotEqual(t, registerURL, req.URL.Path, "collector shouldn't call the register API when credentials locally retrieved") assert.Equal(t, heartbeatURL, req.URL.Path) @@ -904,7 +894,7 @@ func TestCollectorCheckingCredentialsFoundInLocalStorage(t *testing.T) { // register case 2: - require.Equal(t, registerURL, req.URL.Path) + assert.Equal(t, registerURL, req.URL.Path) authHeader := req.Header.Get("Authorization") assert.Equal(t, "Bearer dummy_install_token", authHeader, @@ -921,11 +911,11 @@ func TestCollectorCheckingCredentialsFoundInLocalStorage(t *testing.T) { // metadata case 3: - w.WriteHeader(200) + w.WriteHeader(http.StatusOK) // heartbeat case 4: - w.WriteHeader(204) + w.WriteHeader(http.StatusNoContent) // should not produce any more requests default: @@ -953,10 +943,9 @@ func TestCollectorCheckingCredentialsFoundInLocalStorage(t *testing.T) { reqNum := atomic.AddInt32(&reqCount, 1) switch reqNum { - // register case 1: - require.Equal(t, registerURL, req.URL.Path) + assert.Equal(t, registerURL, req.URL.Path) authHeader := req.Header.Get("Authorization") assert.Equal(t, "Bearer dummy_install_token", authHeader, @@ -973,11 +962,11 @@ func TestCollectorCheckingCredentialsFoundInLocalStorage(t *testing.T) { // metadata case 2: - w.WriteHeader(200) + w.WriteHeader(http.StatusOK) // heartbeat case 3: - w.WriteHeader(204) + w.WriteHeader(http.StatusNoContent) // should not produce any more requests default: @@ -1044,10 +1033,9 @@ func TestRegisterEmptyCollectorNameWithBackoff(t *testing.T) { reqNum := atomic.AddInt32(&reqCount, 1) switch { - // register case reqNum <= retriesLimit: - require.Equal(t, registerURL, req.URL.Path) + assert.Equal(t, registerURL, req.URL.Path) authHeader := req.Header.Get("Authorization") assert.Equal(t, "Bearer dummy_install_token", authHeader, @@ -1056,7 +1044,6 @@ func TestRegisterEmptyCollectorNameWithBackoff(t *testing.T) { if reqCount < retriesLimit { w.WriteHeader(http.StatusTooManyRequests) } else { - _, err = w.Write([]byte(`{ "collectorCredentialID": "aaaaaaaaaaaaaaaaaaaa", "collectorCredentialKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", @@ -1070,12 +1057,12 @@ func TestRegisterEmptyCollectorNameWithBackoff(t *testing.T) { // metadata case reqNum == retriesLimit+1: assert.Equal(t, metadataURL, req.URL.Path) - w.WriteHeader(200) + w.WriteHeader(http.StatusOK) // heartbeat case reqNum == retriesLimit+2: assert.Equal(t, heartbeatURL, req.URL.Path) - w.WriteHeader(204) + w.WriteHeader(http.StatusNoContent) // should not produce any more requests default: @@ -1113,7 +1100,7 @@ func TestRegisterEmptyCollectorNameUnrecoverableError(t *testing.T) { srv := httptest.NewServer(func() http.HandlerFunc { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { // TODO Add payload verification - verify if collectorName is set properly - require.Equal(t, registerURL, req.URL.Path) + assert.Equal(t, registerURL, req.URL.Path) authHeader := req.Header.Get("Authorization") assert.Equal(t, "Bearer dummy_install_token", authHeader, @@ -1129,7 +1116,7 @@ func TestRegisterEmptyCollectorNameUnrecoverableError(t *testing.T) { } ] }`)) - require.NoError(t, err) + assert.NoError(t, err) }) }()) @@ -1163,10 +1150,9 @@ func TestRegistrationRedirect(t *testing.T) { destSrv := httptest.NewServer(http.HandlerFunc( func(w http.ResponseWriter, req *http.Request) { switch atomic.AddInt32(&destReqCount, 1) { - // register case 1: - require.Equal(t, registerURL, req.URL.Path) + assert.Equal(t, registerURL, req.URL.Path) authHeader := req.Header.Get("Authorization") @@ -1185,31 +1171,31 @@ func TestRegistrationRedirect(t *testing.T) { // metadata case 2: assert.Equal(t, metadataURL, req.URL.Path) - w.WriteHeader(200) + w.WriteHeader(http.StatusOK) // heartbeat case 3: assert.Equal(t, heartbeatURL, req.URL.Path) - w.WriteHeader(204) + w.WriteHeader(http.StatusNoContent) // heartbeat case 4: assert.Equal(t, heartbeatURL, req.URL.Path) - w.WriteHeader(204) + w.WriteHeader(http.StatusNoContent) // metadata case 5: assert.Equal(t, metadataURL, req.URL.Path) - w.WriteHeader(200) + w.WriteHeader(http.StatusOK) // heartbeat case 6: assert.Equal(t, heartbeatURL, req.URL.Path) - w.WriteHeader(204) + w.WriteHeader(http.StatusNoContent) // should not produce any more requests default: - require.Fail(t, + assert.Fail(t, "extension should not make more than 5 requests to the destination server", ) } @@ -1221,15 +1207,14 @@ func TestRegistrationRedirect(t *testing.T) { origSrv := httptest.NewServer(http.HandlerFunc( func(w http.ResponseWriter, req *http.Request) { switch atomic.AddInt32(&origReqCount, 1) { - // register case 1: - require.Equal(t, registerURL, req.URL.Path) + assert.Equal(t, registerURL, req.URL.Path) http.Redirect(w, req, destSrv.URL, http.StatusMovedPermanently) // should not produce any more requests default: - require.Fail(t, + assert.Fail(t, "extension should not make more than 1 request to the original server", ) } @@ -1325,12 +1310,12 @@ func TestCollectorReregistersAfterHTTPUnathorizedFromHeartbeat(t *testing.T) { // metadata case 2: assert.Equal(t, metadataURL, req.URL.Path) - w.WriteHeader(200) + w.WriteHeader(http.StatusOK) // heartbeat case 3: assert.Equal(t, heartbeatURL, req.URL.Path) - w.WriteHeader(204) + w.WriteHeader(http.StatusNoContent) // heartbeat case 4: @@ -1345,7 +1330,7 @@ func TestCollectorReregistersAfterHTTPUnathorizedFromHeartbeat(t *testing.T) { default: assert.Equal(t, heartbeatURL, req.URL.Path) - w.WriteHeader(204) + w.WriteHeader(http.StatusNoContent) } }) }()) @@ -1398,22 +1383,22 @@ func TestRegistrationRequestPayload(t *testing.T) { switch reqNum { // register case 1: - require.Equal(t, registerURL, req.URL.Path) + assert.Equal(t, registerURL, req.URL.Path) var reqPayload api.OpenRegisterRequestPayload - require.NoError(t, json.NewDecoder(req.Body).Decode(&reqPayload)) - require.True(t, reqPayload.Clobber) - require.Equal(t, hostname, reqPayload.Hostname) - require.Equal(t, "my description", reqPayload.Description) - require.Equal(t, "my category/", reqPayload.Category) - require.EqualValues(t, + assert.NoError(t, json.NewDecoder(req.Body).Decode(&reqPayload)) + assert.True(t, reqPayload.Clobber) + assert.Equal(t, hostname, reqPayload.Hostname) + assert.Equal(t, "my description", reqPayload.Description) + assert.Equal(t, "my category/", reqPayload.Category) + assert.EqualValues(t, map[string]any{ "field1": "value1", "field2": "value2", }, reqPayload.Fields, ) - require.Equal(t, "PST", reqPayload.TimeZone) + assert.Equal(t, "PST", reqPayload.TimeZone) authHeader := req.Header.Get("Authorization") assert.Equal(t, "Bearer dummy_install_token", authHeader, @@ -1425,13 +1410,12 @@ func TestRegistrationRequestPayload(t *testing.T) { "collectorId": "0000000001231231", "collectorName": "otc-test-123456123123" }`)) - require.NoError(t, err) + assert.NoError(t, err) // metadata case 2: assert.Equal(t, metadataURL, req.URL.Path) - w.WriteHeader(200) + w.WriteHeader(http.StatusOK) } - }) }()) @@ -1476,10 +1460,10 @@ func TestWatchCredentialKey(t *testing.T) { ctxc, cancel := context.WithCancel(ctx) cancel() v := se.WatchCredentialKey(ctxc, "") - require.Equal(t, v, "") + require.Equal(t, "", v) v = se.WatchCredentialKey(context.Background(), "foobar") - require.Equal(t, v, "") + require.Equal(t, "", v) go func() { time.Sleep(time.Millisecond * 100) @@ -1490,7 +1474,7 @@ func TestWatchCredentialKey(t *testing.T) { }() v = se.WatchCredentialKey(context.Background(), "") - require.Equal(t, v, "test-credential-key") + require.Equal(t, "test-credential-key", v) } func TestCreateCredentialsHeader(t *testing.T) { @@ -1526,24 +1510,24 @@ func TestUpdateMetadataRequestPayload(t *testing.T) { srv := httptest.NewServer(func() http.HandlerFunc { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - require.Equal(t, metadataURL, req.URL.Path) + assert.Equal(t, metadataURL, req.URL.Path) var reqPayload api.OpenMetadataRequestPayload - require.NoError(t, json.NewDecoder(req.Body).Decode(&reqPayload)) - require.NotEmpty(t, reqPayload.HostDetails.Name) - require.NotEmpty(t, reqPayload.HostDetails.OsName) + assert.NoError(t, json.NewDecoder(req.Body).Decode(&reqPayload)) + assert.NotEmpty(t, reqPayload.HostDetails.Name) + assert.NotEmpty(t, reqPayload.HostDetails.OsName) // @sumo-drosiek: It happened to be empty OsVersion on my machine // require.NotEmpty(t, reqPayload.HostDetails.OsVersion) - require.NotEmpty(t, reqPayload.NetworkDetails.HostIPAddress) - require.EqualValues(t, reqPayload.HostDetails.Environment, "EKS-1.20.2") - require.EqualValues(t, reqPayload.CollectorDetails.RunningVersion, "1.0.0") - require.EqualValues(t, reqPayload.TagDetails["team"], "A") - require.EqualValues(t, reqPayload.TagDetails["app"], "linux") - require.EqualValues(t, reqPayload.TagDetails["sumo.disco.enabled"], "true") + assert.NotEmpty(t, reqPayload.NetworkDetails.HostIPAddress) + assert.EqualValues(t, "EKS-1.20.2", reqPayload.HostDetails.Environment) + assert.EqualValues(t, "1.0.0", reqPayload.CollectorDetails.RunningVersion) + assert.EqualValues(t, "A", reqPayload.TagDetails["team"]) + assert.EqualValues(t, "linux", reqPayload.TagDetails["app"]) + assert.EqualValues(t, "true", reqPayload.TagDetails["sumo.disco.enabled"]) _, err := w.Write([]byte(``)) - require.NoError(t, err) + assert.NoError(t, err) }) }()) diff --git a/extension/sumologicextension/factory.go b/extension/sumologicextension/factory.go index eb951bcac875..d38ae7075264 100644 --- a/extension/sumologicextension/factory.go +++ b/extension/sumologicextension/factory.go @@ -55,7 +55,7 @@ func createDefaultConfig() component.Config { } } -func createExtension(_ context.Context, params extension.CreateSettings, cfg component.Config) (extension.Extension, error) { +func createExtension(_ context.Context, params extension.Settings, cfg component.Config) (extension.Extension, error) { config := cfg.(*Config) return newSumologicExtension(config, params.Logger, params.ID, params.BuildInfo.Version) } diff --git a/extension/sumologicextension/factory_test.go b/extension/sumologicextension/factory_test.go index d5078fd3018d..b5b4972c88c5 100644 --- a/extension/sumologicextension/factory_test.go +++ b/extension/sumologicextension/factory_test.go @@ -43,7 +43,7 @@ func TestFactory_CreateDefaultConfig(t *testing.T) { ccfg.Credentials.InstallationToken = "dummy_install_token" ext, err := createExtension(context.Background(), - extension.CreateSettings{ + extension.Settings{ TelemetrySettings: componenttest.NewNopTelemetrySettings(), }, cfg, @@ -52,13 +52,13 @@ func TestFactory_CreateDefaultConfig(t *testing.T) { require.NotNil(t, ext) } -func TestFactory_CreateExtension(t *testing.T) { +func TestFactory_Create(t *testing.T) { cfg := createDefaultConfig().(*Config) cfg.CollectorName = "test_collector" cfg.Credentials.InstallationToken = "dummy_install_token" ext, err := createExtension(context.Background(), - extension.CreateSettings{ + extension.Settings{ TelemetrySettings: componenttest.NewNopTelemetrySettings(), }, cfg, diff --git a/extension/sumologicextension/go.mod b/extension/sumologicextension/go.mod index 143b21745385..c52199e478e6 100644 --- a/extension/sumologicextension/go.mod +++ b/extension/sumologicextension/go.mod @@ -1,75 +1,63 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/sumologicextension -go 1.21.0 +go 1.22.0 require ( github.com/Showmax/go-fqdn v1.0.0 github.com/cenkalti/backoff/v4 v4.3.0 - github.com/mitchellh/go-ps v1.0.0 - github.com/shirou/gopsutil/v3 v3.24.4 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/confighttp v0.102.0 - go.opentelemetry.io/collector/config/configopaque v1.9.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/collector/extension/auth v0.102.0 - go.opentelemetry.io/collector/featuregate v1.9.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/shirou/gopsutil/v4 v4.24.10 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/confighttp v0.116.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 + go.opentelemetry.io/collector/extension/auth v0.116.0 + go.opentelemetry.io/collector/featuregate v1.22.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 - google.golang.org/grpc v1.64.0 + google.golang.org/grpc v1.68.1 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/ebitengine/purego v0.8.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/snappy v0.0.4 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect - github.com/klauspost/compress v1.17.8 // indirect - github.com/knadh/koanf/maps v0.1.1 // indirect - github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect - github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/rs/cors v1.10.1 // indirect - github.com/shoenig/go-m1cpu v0.1.6 // indirect + github.com/rs/cors v1.11.1 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/confmap v0.102.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/configtls v1.22.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/extension/sumologicextension/go.sum b/extension/sumologicextension/go.sum index e1e7f0d32e17..285849ea8fbc 100644 --- a/extension/sumologicextension/go.sum +++ b/extension/sumologicextension/go.sum @@ -1,96 +1,65 @@ github.com/Showmax/go-fqdn v1.0.0 h1:0rG5IbmVliNT5O19Mfuvna9LL7zlHyRfsSvBPZmF9tM= github.com/Showmax/go-fqdn v1.0.0/go.mod h1:SfrFBzmDCtCGrnHhoDjuvFnKsWjEQX/Q9ARZvOrJAko= -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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/BE= +github.com/ebitengine/purego v0.8.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= -github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= -github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= -github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= -github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= -github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= -github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= -github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= -github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= -github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/shirou/gopsutil/v4 v4.24.10 h1:7VOzPtfw/5YDU+jLEoBwXwxJbQetULywoSV4RYY7HkM= +github.com/shirou/gopsutil/v4 v4.24.10/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= @@ -99,50 +68,50 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -158,8 +127,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -170,13 +139,12 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -185,15 +153,14 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/extension/sumologicextension/internal/metadata/generated_status.go b/extension/sumologicextension/internal/metadata/generated_status.go index 4b1516d46356..e4aa83d58afe 100644 --- a/extension/sumologicextension/internal/metadata/generated_status.go +++ b/extension/sumologicextension/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("sumologic") + Type = component.MustNewType("sumologic") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/sumologicextension" ) const ( diff --git a/extension/sumologicextension/internal/metadata/generated_telemetry.go b/extension/sumologicextension/internal/metadata/generated_telemetry.go deleted file mode 100644 index 569f0d965551..000000000000 --- a/extension/sumologicextension/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/sumologic") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/sumologic") -} diff --git a/extension/sumologicextension/internal/metadata/generated_telemetry_test.go b/extension/sumologicextension/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 9c43a5be65fc..000000000000 --- a/extension/sumologicextension/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/sumologic", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/sumologic", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/extension/sumologicextension/metadata.yaml b/extension/sumologicextension/metadata.yaml index e91434bdcf69..c60d0c8c0839 100644 --- a/extension/sumologicextension/metadata.yaml +++ b/extension/sumologicextension/metadata.yaml @@ -1,5 +1,4 @@ type: sumologic -scope_name: otelcol/sumologic status: class: extension @@ -7,7 +6,8 @@ status: alpha: [extension] distributions: [] codeowners: - active: [aboguszewski-sumo, kkujawa-sumo, mat-rumian, rnishtala-sumo, sumo-drosiek, swiatekm-sumo] + active: [rnishtala-sumo, chan-tim-sumo] + emeritus: [aboguszewski-sumo, kasia-kujawa, mat-rumian, sumo-drosiek] # TODO: Update the extension to make the tests pass tests: diff --git a/go.mod b/go.mod index a5dedf5dd4f3..9bcf98dce455 100644 --- a/go.mod +++ b/go.mod @@ -1,1181 +1,21 @@ module github.com/open-telemetry/opentelemetry-collector-contrib -go 1.21.0 +// NOTE: +// This go.mod is NOT used to build any official binary. +// To see the builder manifests used for official binaries, +// check https://github.com/open-telemetry/opentelemetry-collector-releases +// +// For the OpenTelemetry Collector Contrib distribution specifically, see +// https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib -require ( - github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/connector/datadogconnector v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/connector/exceptionsconnector v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/connector/grafanacloudconnector v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/connector/servicegraphconnector v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/alibabacloudlogserviceexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awscloudwatchlogsexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsemfexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awskinesisexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsxrayexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/azuredataexplorerexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/azuremonitorexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/carbonexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/cassandraexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/clickhouseexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/coralogixexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datasetexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlecloudexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlecloudpubsubexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlemanagedprometheusexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/influxdbexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/logicmonitorexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/logzioexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/lokiexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/mezmoexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opensearchexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/pulsarexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sapmexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sentryexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/signalfxexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/skywalkingexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sumologicexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/tencentcloudlogserviceexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/asapauthextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/basicauthextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/bearertokenauthextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/jaegerremotesampling v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/oauth2clientauthextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/dockerobserver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/ecstaskobserver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/hostobserver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/k8sobserver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/oidcauthextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/dbstorage v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/filestorage v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricsgenerationprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricstransformprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/routingprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/spanprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/activedirectorydsreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/apachereceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/apachesparkreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awscloudwatchreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awscontainerinsightreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsecscontainermetricsreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsfirehosereceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsxrayreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azureblobreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azureeventhubreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azuremonitorreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/bigipreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/carbonreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/chronyreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/cloudfoundryreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/collectdreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/couchdbreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/datadogreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/dockerstatsreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/elasticsearchreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/expvarreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/flinkmetricsreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/fluentforwardreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/googlecloudpubsubreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/googlecloudspannerreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/haproxyreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/httpcheckreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/iisreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/influxdbreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jmxreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/journaldreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8seventsreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sobjectsreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkametricsreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kubeletstatsreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/lokireceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/memcachedreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mongodbatlasreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mongodbreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mysqlreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nginxreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nsxtreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/oracledbreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/otlpjsonfilereceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/podmanreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/postgresqlreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/pulsarreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/purefareceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/purefbreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/rabbitmqreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/receivercreator v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/redisreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/riakreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/saphanareceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sapmreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/signalfxreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/simpleprometheusreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/skywalkingreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/snmpreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/snowflakereceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/solacereceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkenterprisereceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkhecreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sqlqueryreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sqlserverreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sshcheckreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/statsdreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/tcplogreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/udplogreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/vcenterreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/wavefrontreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/webhookeventreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/windowseventlogreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/windowsperfcountersreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver v0.102.0 - go.opentelemetry.io/collector/connector v0.102.0 - go.opentelemetry.io/collector/connector/forwardconnector v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/exporter/debugexporter v0.102.0 - go.opentelemetry.io/collector/exporter/loggingexporter v0.102.0 - go.opentelemetry.io/collector/exporter/otlpexporter v0.102.0 - go.opentelemetry.io/collector/exporter/otlphttpexporter v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/collector/extension/ballastextension v0.102.0 - go.opentelemetry.io/collector/extension/zpagesextension v0.102.0 - go.opentelemetry.io/collector/otelcol v0.102.0 - go.opentelemetry.io/collector/processor v0.102.0 - go.opentelemetry.io/collector/processor/batchprocessor v0.102.0 - go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.102.0 - go.opentelemetry.io/collector/receiver v0.102.0 - go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0 -) - -require ( - bitbucket.org/atlassian/go-asap/v2 v2.8.0 // indirect - cloud.google.com/go v0.114.0 // indirect - cloud.google.com/go/auth v0.4.2 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.2 // indirect - cloud.google.com/go/compute/metadata v0.3.0 // indirect - cloud.google.com/go/iam v1.1.8 // indirect - cloud.google.com/go/logging v1.10.0 // indirect - cloud.google.com/go/longrunning v0.5.7 // indirect - cloud.google.com/go/monitoring v1.19.0 // indirect - cloud.google.com/go/pubsub v1.38.0 // indirect - cloud.google.com/go/spanner v1.63.0 // indirect - cloud.google.com/go/trace v1.10.7 // indirect - code.cloudfoundry.org/clock v1.0.0 // indirect - code.cloudfoundry.org/go-diodes v0.0.0-20211115184647-b584dd5df32c // indirect - code.cloudfoundry.org/go-loggregator v7.4.0+incompatible // indirect - code.cloudfoundry.org/rfc5424 v0.0.0-20201103192249-000122071b78 // indirect - filippo.io/edwards25519 v1.1.0 // indirect - github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect - github.com/99designs/keyring v1.2.2 // indirect - github.com/AthenZ/athenz v1.10.39 // indirect - github.com/Azure/azure-amqp-common-go/v4 v4.2.0 // indirect - github.com/Azure/azure-event-hubs-go/v3 v3.6.2 // indirect - github.com/Azure/azure-kusto-go v0.15.2 // indirect - github.com/Azure/azure-pipeline-go v0.2.3 // indirect - github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.6.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.5.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor v0.11.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2 // indirect - github.com/Azure/azure-storage-queue-go v0.0.0-20230531184854-c06a8eff66fe // indirect - github.com/Azure/go-amqp v1.0.5 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.29 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.23 // indirect - github.com/Azure/go-autorest/autorest/azure/auth v0.5.12 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect - github.com/Azure/go-autorest/autorest/validation v0.3.1 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect - github.com/ClickHouse/ch-go v0.61.5 // indirect - github.com/ClickHouse/clickhouse-go/v2 v2.23.0 // indirect - github.com/Code-Hex/go-generics-cache v1.3.1 // indirect - github.com/DataDog/agent-payload/v5 v5.0.119 // indirect - github.com/DataDog/datadog-agent/comp/core/config v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/core/hostname/hostnameinterface v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/core/log v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/core/secrets v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/core/telemetry v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/def v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/logs/agent/config v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline/logsagentpipelineimpl v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/exporter/logsagentexporter v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/metricsclient v0.0.0-20240525065430-d0b647bcb646 // indirect - github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/statsprocessor v0.0.0-20240525065430-d0b647bcb646 // indirect - github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/config/env v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/config/model v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/config/setup v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/config/utils v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/auditor v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/client v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/diagnostic v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/message v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/metrics v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/pipeline v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/processor v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/sds v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/sender v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/sources v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/status/statusinterface v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/logs/status/utils v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/obfuscate v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/proto v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/status/health v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/telemetry v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/trace v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/backoff v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/cgroups v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/executable v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/filesystem v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/fxutil v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/http v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/log v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/optional v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/pointer v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/scrubber v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/startstop v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/statstracker v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/system v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/system/socket v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/util/winutil v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-agent/pkg/version v0.54.0-rc.5 // indirect - github.com/DataDog/datadog-api-client-go/v2 v2.26.0 // indirect - github.com/DataDog/datadog-go/v5 v5.5.0 // indirect - github.com/DataDog/dd-sensitive-data-scanner/sds-go/go v0.0.0-20240419161837-f1b2f553edfe // indirect - github.com/DataDog/go-sqllexer v0.0.9 // indirect - github.com/DataDog/go-tuf v1.1.0-0.5.2 // indirect - github.com/DataDog/gohai v0.0.0-20230524154621-4316413895ee // indirect - github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata v0.16.1 // indirect - github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.16.1 // indirect - github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/logs v0.16.1 // indirect - github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics v0.16.1 // indirect - github.com/DataDog/opentelemetry-mapping-go/pkg/quantile v0.16.1 // indirect - github.com/DataDog/sketches-go v1.4.5 // indirect - github.com/DataDog/viper v1.13.3 // indirect - github.com/DataDog/zstd v1.5.2 // indirect - github.com/GehirnInc/crypt v0.0.0-20200316065508-bb7000b8a962 // indirect - github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.23.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector v0.47.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector/googlemanagedprometheus v0.47.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.23.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.47.0 // indirect - github.com/IBM/sarama v1.43.2 // indirect - github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/ReneKroon/ttlcache/v2 v2.11.0 // indirect - github.com/SAP/go-hdb v1.9.5 // indirect - github.com/SermoDigital/jose v0.9.2-0.20180104203859-803625baeddc // indirect - github.com/Showmax/go-fqdn v1.0.0 // indirect - github.com/aerospike/aerospike-client-go/v6 v6.13.0 // indirect - github.com/alecthomas/participle/v2 v2.1.1 // indirect - github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 // indirect - github.com/aliyun/aliyun-log-go-sdk v0.1.75 // indirect - github.com/andybalholm/brotli v1.1.0 // indirect - github.com/apache/arrow/go/v15 v15.0.0 // indirect - github.com/apache/pulsar-client-go v0.8.1 // indirect - github.com/apache/pulsar-client-go/oauth2 v0.0.0-20220120090717-25e59572242e // indirect - github.com/apache/thrift v0.20.0 // indirect - github.com/ardielle/ardielle-go v1.5.2 // indirect - github.com/armon/go-metrics v0.4.1 // indirect - github.com/armon/go-radix v1.0.0 // indirect - github.com/aws/aws-sdk-go v1.53.11 // indirect - github.com/aws/aws-sdk-go-v2 v1.27.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 // indirect - github.com/aws/aws-sdk-go-v2/config v1.27.16 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.16 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3 // indirect - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.15 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.7 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5 // indirect - github.com/aws/aws-sdk-go-v2/service/kinesis v1.27.8 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1 // indirect - github.com/aws/aws-sdk-go-v2/service/servicediscovery v1.29.10 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.20.9 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.28.10 // indirect - github.com/aws/smithy-go v1.20.2 // indirect - github.com/benbjohnson/clock v1.3.5 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/blang/semver/v4 v4.0.0 // indirect - github.com/bmatcuk/doublestar/v4 v4.6.1 // indirect - github.com/briandowns/spinner v1.23.0 // indirect - github.com/buger/jsonparser v1.1.1 // indirect - github.com/cenkalti/backoff v2.2.1+incompatible // indirect - github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/checkpoint-restore/go-criu/v5 v5.3.0 // indirect - github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect - github.com/cilium/ebpf v0.11.0 // indirect - github.com/cloudfoundry-incubator/uaago v0.0.0-20190307164349-8136b7bbe76e // indirect - github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50 // indirect - github.com/containerd/cgroups/v3 v3.0.3 // indirect - github.com/containerd/console v1.0.3 // indirect - github.com/containerd/ttrpc v1.2.2 // indirect - github.com/coreos/go-oidc/v3 v3.10.0 // indirect - github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/cskr/pubsub v1.0.2 // indirect - github.com/cyphar/filepath-securejoin v0.2.4 // indirect - github.com/danieljoos/wincred v1.1.2 // indirect - github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/dennwc/varint v1.0.0 // indirect - github.com/devigned/tab v0.1.1 // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/digitalocean/godo v1.109.0 // indirect - github.com/distribution/reference v0.5.0 // indirect - github.com/docker/docker v25.0.5+incompatible // indirect - github.com/docker/go-connections v0.5.0 // indirect - github.com/docker/go-units v0.5.0 // indirect - github.com/dustin/go-humanize v1.0.1 // indirect - github.com/dvsekhvalnov/jose2go v1.6.0 // indirect - github.com/eapache/go-resiliency v1.6.0 // indirect - github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 // indirect - github.com/eapache/queue v1.1.0 // indirect - github.com/elastic/elastic-transport-go/v8 v8.5.0 // indirect - github.com/elastic/go-docappender/v2 v2.1.2 // indirect - github.com/elastic/go-elasticsearch/v7 v7.17.10 // indirect - github.com/elastic/go-elasticsearch/v8 v8.13.1 // indirect - github.com/elastic/go-structform v0.0.10 // indirect - github.com/elastic/go-sysinfo v1.7.1 // indirect - github.com/elastic/go-windows v1.0.1 // indirect - github.com/emicklei/go-restful/v3 v3.11.0 // indirect - github.com/envoyproxy/go-control-plane v0.12.0 // indirect - github.com/envoyproxy/protoc-gen-validate v1.0.4 // indirect - github.com/euank/go-kmsg-parser v2.0.0+incompatible // indirect - github.com/expr-lang/expr v1.16.9 // indirect - github.com/facebook/time v0.0.0-20240510113249-fa89cc575891 // indirect - github.com/fatih/color v1.16.0 // indirect - github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/gabriel-vasile/mimetype v1.4.2 // indirect - github.com/getsentry/sentry-go v0.28.0 // indirect - github.com/go-faster/city v1.0.1 // indirect - github.com/go-faster/errors v0.7.1 // indirect - github.com/go-jose/go-jose/v4 v4.0.1 // indirect - github.com/go-kit/kit v0.13.0 // indirect - github.com/go-kit/log v0.2.1 // indirect - github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect - github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect - github.com/go-openapi/jsonpointer v0.20.2 // indirect - github.com/go-openapi/jsonreference v0.20.4 // indirect - github.com/go-openapi/swag v0.22.9 // indirect - github.com/go-resty/resty/v2 v2.12.0 // indirect - github.com/go-sql-driver/mysql v1.8.1 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect - github.com/go-zookeeper/zk v1.0.3 // indirect - github.com/gobwas/glob v0.2.3 // indirect - github.com/goccy/go-json v0.10.2 // indirect - github.com/gocql/gocql v1.6.0 // indirect - github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect - github.com/godbus/dbus/v5 v5.1.0 // indirect - github.com/gofrs/uuid v4.4.0+incompatible // indirect - github.com/gogo/googleapis v1.4.1 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt v3.2.2+incompatible // indirect - github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang-jwt/jwt/v5 v5.2.1 // indirect - github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect - github.com/golang-sql/sqlexp v0.1.0 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/mock v1.6.0 // indirect - github.com/golang/protobuf v1.5.4 // indirect - github.com/golang/snappy v0.0.4 // indirect - github.com/google/btree v1.1.2 // indirect - github.com/google/cadvisor v0.49.0 // indirect - github.com/google/flatbuffers v23.5.26+incompatible // indirect - github.com/google/gnostic-models v0.6.8 // indirect - github.com/google/go-cmp v0.6.0 // indirect - github.com/google/go-querystring v1.1.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/s2a-go v0.1.7 // indirect - github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.4 // indirect - github.com/gophercloud/gophercloud v1.8.0 // indirect - github.com/gorilla/mux v1.8.1 // indirect - github.com/gorilla/websocket v1.5.0 // indirect - github.com/gosnmp/gosnmp v1.37.0 // indirect - github.com/grafana/loki/pkg/push v0.0.0-20240514112848-a1b1eeb09583 // indirect - github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd // indirect - github.com/grobie/gomemcache v0.0.0-20230213081705-239240bbc445 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect - github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect - github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect - github.com/hashicorp/consul/api v1.28.3 // indirect - github.com/hashicorp/cronexpr v1.1.2 // indirect - github.com/hashicorp/errwrap v1.1.0 // indirect - github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-hclog v1.6.3 // indirect - github.com/hashicorp/go-immutable-radix v1.3.1 // indirect - github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-retryablehttp v0.7.4 // indirect - github.com/hashicorp/go-rootcerts v1.0.2 // indirect - github.com/hashicorp/go-uuid v1.0.3 // indirect - github.com/hashicorp/go-version v1.7.0 // indirect - github.com/hashicorp/golang-lru v1.0.2 // indirect - github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hashicorp/nomad/api v0.0.0-20240306004928-3e7191ccb702 // indirect - github.com/hashicorp/serf v0.10.1 // indirect - github.com/hectane/go-acl v0.0.0-20190604041725-da78bae5fc95 // indirect - github.com/hetznercloud/hcloud-go/v2 v2.6.0 // indirect - github.com/iancoleman/strcase v0.3.0 // indirect - github.com/imdario/mergo v0.3.16 // indirect - github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/influxdata/influxdb-observability/common v0.5.12 // indirect - github.com/influxdata/influxdb-observability/influx2otel v0.5.12 // indirect - github.com/influxdata/influxdb-observability/otel2influx v0.5.12 // indirect - github.com/influxdata/line-protocol/v2 v2.2.1 // indirect - github.com/ionos-cloud/sdk-go/v6 v6.1.11 // indirect - github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect - github.com/jackc/pgx/v5 v5.6.0 // indirect - github.com/jackc/puddle/v2 v2.2.1 // indirect - github.com/jaegertracing/jaeger v1.57.0 // indirect - github.com/jcmturner/aescts/v2 v2.0.0 // indirect - github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect - github.com/jcmturner/gofork v1.7.6 // indirect - github.com/jcmturner/goidentity/v6 v6.0.1 // indirect - github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect - github.com/jcmturner/rpc/v2 v2.0.3 // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 // indirect - github.com/josharian/intern v1.0.0 // indirect - github.com/jpillora/backoff v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/julienschmidt/httprouter v1.3.0 // indirect - github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect - github.com/karrick/godirwalk v1.17.0 // indirect - github.com/klauspost/compress v1.17.8 // indirect - github.com/klauspost/cpuid/v2 v2.2.5 // indirect - github.com/knadh/koanf/maps v0.1.1 // indirect - github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect - github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b // indirect - github.com/kr/fs v0.1.0 // indirect - github.com/kylelemons/godebug v1.1.0 // indirect - github.com/leodido/go-syslog/v4 v4.1.0 // indirect - github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b // indirect - github.com/leoluk/perflib_exporter v0.2.1 // indirect - github.com/lestrrat-go/strftime v1.0.6 // indirect - github.com/lib/pq v1.10.9 // indirect - github.com/lightstep/go-expohisto v1.0.0 // indirect - github.com/linkedin/goavro/v2 v2.9.8 // indirect - github.com/linode/linodego v1.33.0 // indirect - github.com/logicmonitor/lm-data-sdk-go v1.3.0 // indirect - github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c // indirect - github.com/magiconair/properties v1.8.7 // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-ieproxy v0.0.11 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-sqlite3 v1.14.22 // indirect - github.com/microsoft/ApplicationInsights-Go v0.4.4 // indirect - github.com/microsoft/go-mssqldb v1.7.1 // indirect - github.com/miekg/dns v1.1.58 // indirect - github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible // indirect - github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/go-ps v1.0.0 // indirect - github.com/mitchellh/hashstructure v1.1.0 // indirect - github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect - github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c // indirect - github.com/mitchellh/reflectwalk v1.0.2 // indirect - github.com/moby/sys/mountinfo v0.6.2 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect - github.com/mongodb-forks/digest v1.1.0 // indirect - github.com/montanaflynn/stats v0.7.0 // indirect - github.com/mostynb/go-grpc-compression v1.2.2 // indirect - github.com/mrunalp/fileutils v0.5.1 // indirect - github.com/mtibben/percent v0.2.1 // indirect - github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect - github.com/nginxinc/nginx-prometheus-exporter v0.11.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/extension/sumologicextension v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutil v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/containerinsight v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/cwlogs v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/ecsutil v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/k8s v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/metrics v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/proxy v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/xray v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/collectd v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/docker v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/kubelet v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/sqlquery v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchperresourceattr v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/azure v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/loki v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/signalfx v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/skywalking v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.102.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/winperfcounters v0.102.0 // indirect - github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.1.0 // indirect - github.com/opencontainers/runc v1.1.12 // indirect - github.com/opencontainers/runtime-spec v1.1.0-rc.3 // indirect - github.com/opencontainers/selinux v1.11.0 // indirect - github.com/opensearch-project/opensearch-go/v2 v2.3.0 // indirect - github.com/openshift/api v3.9.0+incompatible // indirect - github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142 // indirect - github.com/openzipkin/zipkin-go v0.4.3 // indirect - github.com/outcaste-io/ristretto v0.2.1 // indirect - github.com/ovh/go-ovh v1.4.3 // indirect - github.com/patrickmn/go-cache v2.1.0+incompatible // indirect - github.com/paulmach/orb v0.11.1 // indirect - github.com/pelletier/go-toml v1.9.3 // indirect - github.com/pelletier/go-toml/v2 v2.1.0 // indirect - github.com/philhofer/fwd v1.1.2 // indirect - github.com/pierrec/lz4 v2.6.1+incompatible // indirect - github.com/pierrec/lz4/v4 v4.1.21 // indirect - github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/pkg/sftp v1.13.6 // indirect - github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c // indirect - github.com/pquerna/cachecontrol v0.1.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/common/sigv4 v0.1.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e // indirect - github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect - github.com/redis/go-redis/v9 v9.5.1 // indirect - github.com/relvacode/iso8601 v1.4.0 // indirect - github.com/rs/cors v1.11.0 // indirect - github.com/sagikazarmark/locafero v0.4.0 // indirect - github.com/sagikazarmark/slog-shim v0.1.0 // indirect - github.com/samber/lo v1.38.1 // indirect - github.com/scaleway/scaleway-sdk-go v1.0.0-beta.25 // indirect - github.com/scalyr/dataset-go v0.18.0 // indirect - github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646 // indirect - github.com/secure-systems-lab/go-securesystemslib v0.7.0 // indirect - github.com/segmentio/asm v1.2.0 // indirect - github.com/shirou/gopsutil/v3 v3.24.4 // indirect - github.com/shoenig/go-m1cpu v0.1.6 // indirect - github.com/shopspring/decimal v1.3.1 // indirect - github.com/signalfx/com_signalfx_metrics_protobuf v0.0.3 // indirect - github.com/signalfx/sapm-proto v0.14.0 // indirect - github.com/sijms/go-ora/v2 v2.8.19 // indirect - github.com/sirupsen/logrus v1.9.3 // indirect - github.com/snowflakedb/gosnowflake v1.10.1-0.20240509141315-5570db2126fe // indirect - github.com/soheilhy/cmux v0.1.5 // indirect - github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spaolacci/murmur3 v1.1.0 // indirect - github.com/spf13/afero v1.11.0 // indirect - github.com/spf13/cast v1.6.0 // indirect - github.com/spf13/cobra v1.8.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.18.2 // indirect - github.com/stormcat24/protodep v0.1.8 // indirect - github.com/stretchr/objx v0.5.2 // indirect - github.com/stretchr/testify v1.9.0 // indirect - github.com/subosito/gotenv v1.6.0 // indirect - github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 // indirect - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.931 // indirect - github.com/tg123/go-htpasswd v1.2.2 // indirect - github.com/tidwall/gjson v1.14.3 // indirect - github.com/tidwall/match v1.1.1 // indirect - github.com/tidwall/pretty v1.2.0 // indirect - github.com/tidwall/tinylru v1.1.0 // indirect - github.com/tidwall/wal v1.1.7 // indirect - github.com/tilinna/clock v1.1.0 // indirect - github.com/tinylib/msgp v1.1.9 // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect - github.com/valyala/fastjson v1.6.4 // indirect - github.com/vincent-petithory/dataurl v1.0.0 // indirect - github.com/vishvananda/netlink v1.2.1-beta.2 // indirect - github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f // indirect - github.com/vmware/go-vmware-nsxt v0.0.0-20230223012718-d31b8a1ca05e // indirect - github.com/vmware/govmomi v0.36.3 // indirect - github.com/vultr/govultr/v2 v2.17.2 // indirect - github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.1.2 // indirect - github.com/xdg-go/stringprep v1.0.4 // indirect - github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - github.com/yuin/gopher-lua v0.0.0-20220504180219-658193537a64 // indirect - github.com/yusufpapurcu/wmi v1.2.4 // indirect - github.com/zeebo/xxh3 v1.0.2 // indirect - go.elastic.co/apm/module/apmzap/v2 v2.6.0 // indirect - go.elastic.co/apm/v2 v2.6.0 // indirect - go.elastic.co/fastjson v1.3.0 // indirect - go.etcd.io/bbolt v1.3.10 // indirect - go.mongodb.org/atlas v0.36.0 // indirect - go.mongodb.org/mongo-driver v1.15.0 // indirect - go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/component v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/configgrpc v0.102.0 // indirect - go.opentelemetry.io/collector/config/confighttp v0.102.0 // indirect - go.opentelemetry.io/collector/config/confignet v0.102.0 // indirect - go.opentelemetry.io/collector/config/configopaque v1.9.0 // indirect - go.opentelemetry.io/collector/config/configretry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/confmap v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0 // indirect - go.opentelemetry.io/collector/consumer v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/filter v0.102.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/collector/semconv v0.102.0 // indirect - go.opentelemetry.io/collector/service v0.102.0 // indirect - go.opentelemetry.io/contrib/config v0.7.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/contrib/propagators/b3 v1.27.0 // indirect - go.opentelemetry.io/contrib/zpages v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/bridge/opencensus v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 // indirect - go.opentelemetry.io/otel/metric v1.27.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - go.opentelemetry.io/otel/trace v1.27.0 // indirect - go.opentelemetry.io/proto/otlp v1.2.0 // indirect - go.uber.org/atomic v1.11.0 // indirect - go.uber.org/dig v1.17.0 // indirect - go.uber.org/fx v1.18.2 // indirect - go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.23.0 // indirect - golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/mod v0.17.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/oauth2 v0.20.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/term v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.21.0 // indirect - golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect - gonum.org/v1/gonum v0.15.0 // indirect - google.golang.org/api v0.182.0 // indirect - google.golang.org/genproto v0.0.0-20240521202816-d264139d666e // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240521202816-d264139d666e // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - gopkg.in/zorkian/go-datadog-api.v2 v2.30.0 // indirect - gotest.tools/v3 v3.5.0 // indirect - howett.net/plist v1.0.0 // indirect - k8s.io/api v0.29.3 // indirect - k8s.io/apimachinery v0.29.3 // indirect - k8s.io/client-go v0.29.3 // indirect - k8s.io/klog/v2 v2.120.1 // indirect - k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect - k8s.io/kubelet v0.29.3 // indirect - k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0 // indirect - sigs.k8s.io/controller-runtime v0.17.3 // indirect - sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect - sigs.k8s.io/yaml v1.4.0 // indirect - skywalking.apache.org/repo/goapi v0.0.0-20240104145220-ba7202308dd4 // indirect -) +go 1.22.0 // Replace references to modules that are in this repository with their relateive paths // so that we always build with current (latest) version of the source code. -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutil => ./internal/aws/awsutil - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/containerinsight => ./internal/aws/containerinsight - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/cwlogs => ./internal/aws/cwlogs - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/ecsutil => ./internal/aws/ecsutil - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/k8s => ./internal/aws/k8s - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/metrics => ./internal/aws/metrics - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/proxy => ./internal/aws/proxy - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/xray => ./internal/aws/xray - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/common => ./internal/common - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal => ./internal/coreinternal - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/docker => ./internal/docker - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter => ./internal/filter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig => ./internal/k8sconfig - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8stest => ./internal/k8stest - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka => ./internal/kafka - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/kubelet => ./internal/kubelet - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders => ./internal/metadataproviders - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent => ./internal/sharedcomponent - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk => ./internal/splunk - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/alibabacloudlogserviceexporter => ./exporter/alibabacloudlogserviceexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awscloudwatchlogsexporter => ./exporter/awscloudwatchlogsexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsemfexporter => ./exporter/awsemfexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awskinesisexporter => ./exporter/awskinesisexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsxrayexporter => ./exporter/awsxrayexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/azuredataexplorerexporter => ./exporter/azuredataexplorerexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/azuremonitorexporter => ./exporter/azuremonitorexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/carbonexporter => ./exporter/carbonexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/clickhouseexporter => ./exporter/clickhouseexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/cassandraexporter => ./exporter/cassandraexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/coralogixexporter => ./exporter/coralogixexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter => ./exporter/datadogexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datasetexporter => ./exporter/datasetexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter => ./exporter/fileexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlecloudexporter => ./exporter/googlecloudexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlemanagedprometheusexporter => ./exporter/googlemanagedprometheusexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlecloudpubsubexporter => ./exporter/googlecloudpubsubexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/influxdbexporter => ./exporter/influxdbexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter => ./exporter/instanaexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter => ./exporter/kafkaexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter => ./exporter/loadbalancingexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/logicmonitorexporter => ./exporter/logicmonitorexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/logzioexporter => ./exporter/logzioexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/lokiexporter => ./exporter/lokiexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/mezmoexporter => ./exporter/mezmoexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter => ./exporter/opencensusexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opensearchexporter => ./exporter/opensearchexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter => ./exporter/prometheusexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter => ./exporter/prometheusremotewriteexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/pulsarexporter => ./exporter/pulsarexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sapmexporter => ./exporter/sapmexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sentryexporter => ./exporter/sentryexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/signalfxexporter => ./exporter/signalfxexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/skywalkingexporter => ./exporter/skywalkingexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter => ./exporter/splunkhecexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sumologicexporter => ./exporter/sumologicexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/tencentcloudlogserviceexporter => ./exporter/tencentcloudlogserviceexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter => ./exporter/elasticsearchexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter => ./exporter/zipkinexporter - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/asapauthextension => ./extension/asapauthextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy => ./extension/awsproxy - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/basicauthextension => ./extension/basicauthextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/bearertokenauthextension => ./extension/bearertokenauthextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension => ./extension/headerssetterextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension => ./extension/healthcheckextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/oauth2clientauthextension => ./extension/oauth2clientauthextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer => ./extension/observer - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/ecstaskobserver => ./extension/observer/ecstaskobserver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/hostobserver => ./extension/observer/hostobserver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/k8sobserver => ./extension/observer/k8sobserver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/oidcauthextension => ./extension/oidcauthextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension => ./extension/pprofextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension => ./extension/sigv4authextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage => ./extension/storage - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/dbstorage => ./extension/storage/dbstorage - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/filestorage => ./extension/storage/filestorage - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/sumologicextension => ./extension/sumologicextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchperresourceattr => ./pkg/batchperresourceattr - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal => ./pkg/batchpersignal - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/winperfcounters => ./pkg/winperfcounters - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata => ./pkg/experimentalmetricmetadata - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl => ./pkg/ottl - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest => ./pkg/pdatatest - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ./pkg/pdatautil - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry => ./pkg/resourcetotelemetry - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza => ./pkg/stanza - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/azure => ./pkg/translator/azure - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger => ./pkg/translator/jaeger - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/loki => ./pkg/translator/loki - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus => ./pkg/translator/opencensus - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus => ./pkg/translator/prometheus - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite => ./pkg/translator/prometheusremotewrite - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/signalfx => ./pkg/translator/signalfx - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/skywalking => ./pkg/translator/skywalking - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin => ./pkg/translator/zipkin - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor => ./processor/attributesprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor => ./processor/cumulativetodeltaprocessor/ - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor => ./processor/deltatorateprocessor/ - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor => ./processor/filterprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor => ./processor/groupbyattrsprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor => ./processor/groupbytraceprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor => ./processor/k8sattributesprocessor/ - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricsgenerationprocessor => ./processor/metricsgenerationprocessor/ - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricstransformprocessor => ./processor/metricstransformprocessor/ - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor => ./processor/probabilisticsamplerprocessor/ - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor => ./processor/resourcedetectionprocessor/ - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor => ./processor/resourceprocessor/ - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/routingprocessor => ./processor/routingprocessor/ - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/spanprocessor => ./processor/spanprocessor/ - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor => ./processor/tailsamplingprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor => ./processor/transformprocessor - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/activedirectorydsreceiver => ./receiver/activedirectorydsreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver => ./receiver/aerospikereceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/apachereceiver => ./receiver/apachereceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/apachesparkreceiver => ./receiver/apachesparkreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awscloudwatchreceiver => ./receiver/awscloudwatchreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awscontainerinsightreceiver => ./receiver/awscontainerinsightreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsecscontainermetricsreceiver => ./receiver/awsecscontainermetricsreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsfirehosereceiver => ./receiver/awsfirehosereceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsxrayreceiver => ./receiver/awsxrayreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azureblobreceiver => ./receiver/azureblobreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azuremonitorreceiver => ./receiver/azuremonitorreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/bigipreceiver => ./receiver/bigipreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/carbonreceiver => ./receiver/carbonreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/chronyreceiver => ./receiver/chronyreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/cloudfoundryreceiver => ./receiver/cloudfoundryreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/collectdreceiver => ./receiver/collectdreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/couchdbreceiver => ./receiver/couchdbreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/datadogreceiver => ./receiver/datadogreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/flinkmetricsreceiver => ./receiver/flinkmetricsreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/dockerstatsreceiver => ./receiver/dockerstatsreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/elasticsearchreceiver => ./receiver/elasticsearchreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/expvarreceiver => ./receiver/expvarreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver => ./receiver/filelogreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/googlecloudspannerreceiver => ./receiver/googlecloudspannerreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/googlecloudpubsubreceiver => ./receiver/googlecloudpubsubreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/haproxyreceiver => ./receiver/haproxyreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver => ./receiver/hostmetricsreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/httpcheckreceiver => ./receiver/httpcheckreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/influxdbreceiver => ./receiver/influxdbreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/iisreceiver => ./receiver/iisreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver => ./receiver/jaegerreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jmxreceiver => ./receiver/jmxreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/journaldreceiver => ./receiver/journaldreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver => ./receiver/k8sclusterreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8seventsreceiver => ./receiver/k8seventsreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sobjectsreceiver => ./receiver/k8sobjectsreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/fluentforwardreceiver => ./receiver/fluentforwardreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkametricsreceiver => ./receiver/kafkametricsreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver => ./receiver/kafkareceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kubeletstatsreceiver => ./receiver/kubeletstatsreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/lokireceiver => ./receiver/lokireceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/memcachedreceiver => ./receiver/memcachedreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mongodbreceiver => ./receiver/mongodbreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mongodbatlasreceiver => ./receiver/mongodbatlasreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mysqlreceiver => ./receiver/mysqlreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nginxreceiver => ./receiver/nginxreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nsxtreceiver => ./receiver/nsxtreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver => ./receiver/opencensusreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/oracledbreceiver => ./receiver/oracledbreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/otlpjsonfilereceiver => ./receiver/otlpjsonfilereceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/podmanreceiver => ./receiver/podmanreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/postgresqlreceiver => ./receiver/postgresqlreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver => ./receiver/prometheusreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/pulsarreceiver => ./receiver/pulsarreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/purefareceiver => ./receiver/purefareceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/purefbreceiver => ./receiver/purefbreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/rabbitmqreceiver => ./receiver/rabbitmqreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/receivercreator => ./receiver/receivercreator - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/redisreceiver => ./receiver/redisreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/riakreceiver => ./receiver/riakreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/saphanareceiver => ./receiver/saphanareceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sapmreceiver => ./receiver/sapmreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/signalfxreceiver => ./receiver/signalfxreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/simpleprometheusreceiver => ./receiver/simpleprometheusreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/skywalkingreceiver => ./receiver/skywalkingreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/snmpreceiver => ./receiver/snmpreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/solacereceiver => ./receiver/solacereceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkhecreceiver => ./receiver/splunkhecreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sqlqueryreceiver => ./receiver/sqlqueryreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sqlserverreceiver => ./receiver/sqlserverreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sshcheckreceiver => ./receiver/sshcheckreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/statsdreceiver => ./receiver/statsdreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver => ./receiver/syslogreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/tcplogreceiver => ./receiver/tcplogreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/udplogreceiver => ./receiver/udplogreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/vcenterreceiver => ./receiver/vcenterreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/wavefrontreceiver => ./receiver/wavefrontreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/windowseventlogreceiver => ./receiver/windowseventlogreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/webhookeventreceiver => ./receiver/webhookeventreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/windowsperfcountersreceiver => ./receiver/windowsperfcountersreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver => ./receiver/zipkinreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver => ./receiver/zookeeperreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/dockerobserver => ./extension/observer/dockerobserver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/jaegerremotesampling => ./extension/jaegerremotesampling - // see https://github.com/google/gnostic/issues/262 replace github.com/googleapis/gnostic v0.5.6 => github.com/googleapis/gnostic v0.5.5 -// see https://github.com/open-telemetry/opentelemetry-collector-contrib/pull/12322#issuecomment-1185029670 -replace github.com/docker/go-connections v0.4.1-0.20210727194412-58542c764a11 => github.com/docker/go-connections v0.4.0 - retract ( v0.76.2 v0.76.1 @@ -1189,42 +29,5 @@ exclude github.com/docker/distribution v2.8.0+incompatible // see https://github.com/DataDog/agent-payload/issues/218 exclude github.com/DataDog/agent-payload/v5 v5.0.59 -// see https://github.com/mattn/go-ieproxy/issues/45 -replace github.com/mattn/go-ieproxy => github.com/mattn/go-ieproxy v0.0.1 - // openshift removed all tags from their repo, use the pseudoversion from the release-3.9 branch HEAD replace github.com/openshift/api v3.9.0+incompatible => github.com/openshift/api v0.0.0-20180801171038-322a19404e37 - -// It appears that the v0.2.0 tag was modified. Replacing with v0.2.1 -replace github.com/outcaste-io/ristretto v0.2.0 => github.com/outcaste-io/ristretto v0.2.1 - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/snowflakereceiver => ./receiver/snowflakereceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azureeventhubreceiver => ./receiver/azureeventhubreceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden => ./pkg/golden - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/collectd => ./internal/collectd - -replace ( - github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector => ./connector/countconnector - github.com/open-telemetry/opentelemetry-collector-contrib/connector/datadogconnector => ./connector/datadogconnector - github.com/open-telemetry/opentelemetry-collector-contrib/connector/exceptionsconnector => ./connector/exceptionsconnector - github.com/open-telemetry/opentelemetry-collector-contrib/connector/grafanacloudconnector => ./connector/grafanacloudconnector - github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector => ./connector/routingconnector - github.com/open-telemetry/opentelemetry-collector-contrib/connector/servicegraphconnector => ./connector/servicegraphconnector - github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector => ./connector/spanmetricsconnector - -) - -replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/sqlquery => ./internal/sqlquery - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding => ./extension/encoding - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/otlpencodingextension => ./extension/encoding/otlpencodingextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/extension/ackextension => ./extension/ackextension - -replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkenterprisereceiver => ./receiver/splunkenterprisereceiver - -replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling => ./pkg/sampling diff --git a/go.sum b/go.sum deleted file mode 100644 index bafa14aebf3f..000000000000 --- a/go.sum +++ /dev/null @@ -1,3357 +0,0 @@ -bitbucket.org/atlassian/go-asap/v2 v2.8.0 h1:JL4jktrZT3H8GHkkeJ1RCdhJ5YcOyVccA/2TJ4ae3I0= -bitbucket.org/atlassian/go-asap/v2 v2.8.0/go.mod h1:cuRgWb7eeGtsocKmqY2kPlMMlwpkeNh+QOIkjAMlUBc= -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= -cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= -cloud.google.com/go v0.114.0 h1:OIPFAdfrFDFO2ve2U7r/H5SwSbBzEdrBdE7xkgwc+kY= -cloud.google.com/go v0.114.0/go.mod h1:ZV9La5YYxctro1HTPug5lXH/GefROyW8PPD4T8n9J8E= -cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= -cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= -cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= -cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= -cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= -cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= -cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= -cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= -cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= -cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= -cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= -cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= -cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= -cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= -cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= -cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= -cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= -cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= -cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= -cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= -cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= -cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= -cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= -cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= -cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= -cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= -cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= -cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= -cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= -cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= -cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= -cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= -cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= -cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= -cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= -cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= -cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= -cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= -cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= -cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= -cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= -cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= -cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= -cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= -cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= -cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= -cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= -cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= -cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= -cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= -cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= -cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= -cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= -cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= -cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= -cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= -cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= -cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= -cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= -cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= -cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= -cloud.google.com/go/auth v0.4.2 h1:sb0eyLkhRtpq5jA+a8KWw0W70YcdVca7KJ8TM0AFYDg= -cloud.google.com/go/auth v0.4.2/go.mod h1:Kqvlz1cf1sNA0D+sYJnkPQOP+JMHkuHeIgVmCRtZOLc= -cloud.google.com/go/auth/oauth2adapt v0.2.2 h1:+TTV8aXpjeChS9M+aTtN/TjdQnzJvmzKFt//oWu7HX4= -cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q= -cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= -cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= -cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= -cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= -cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= -cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= -cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= -cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= -cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= -cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= -cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= -cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= -cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= -cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= -cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= -cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= -cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= -cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= -cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= -cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= -cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= -cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= -cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= -cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= -cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= -cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= -cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= -cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= -cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= -cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= -cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= -cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= -cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= -cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= -cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= -cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= -cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= -cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= -cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= -cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= -cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= -cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= -cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= -cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= -cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= -cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= -cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= -cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= -cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= -cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= -cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= -cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= -cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= -cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= -cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= -cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= -cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= -cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= -cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= -cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= -cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= -cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= -cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= -cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= -cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= -cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= -cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= -cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= -cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= -cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= -cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= -cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= -cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= -cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= -cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= -cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= -cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= -cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= -cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= -cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= -cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= -cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= -cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= -cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= -cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= -cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= -cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= -cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= -cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= -cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= -cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= -cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= -cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= -cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= -cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= -cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= -cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= -cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= -cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= -cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= -cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= -cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= -cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= -cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= -cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= -cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= -cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= -cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= -cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= -cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= -cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= -cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= -cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= -cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= -cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= -cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= -cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= -cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= -cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= -cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= -cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= -cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= -cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= -cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= -cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= -cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= -cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= -cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= -cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= -cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= -cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= -cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= -cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= -cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= -cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= -cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= -cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= -cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= -cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= -cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= -cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= -cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= -cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= -cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= -cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= -cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= -cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= -cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= -cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= -cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= -cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= -cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= -cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= -cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= -cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= -cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= -cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= -cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= -cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= -cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= -cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= -cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= -cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= -cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= -cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= -cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= -cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= -cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= -cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= -cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= -cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= -cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= -cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= -cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= -cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= -cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= -cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= -cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= -cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= -cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= -cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= -cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= -cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= -cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= -cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= -cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/iam v1.1.8 h1:r7umDwhj+BQyz0ScZMp4QrGXjSTI3ZINnpgU2nlB/K0= -cloud.google.com/go/iam v1.1.8/go.mod h1:GvE6lyMmfxXauzNq8NbgJbeVQNspG+tcdL/W8QO1+zE= -cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= -cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= -cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= -cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= -cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= -cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= -cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= -cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= -cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= -cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= -cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= -cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= -cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= -cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= -cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= -cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= -cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= -cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= -cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= -cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= -cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= -cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= -cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= -cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= -cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= -cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= -cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= -cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= -cloud.google.com/go/logging v1.10.0 h1:f+ZXMqyrSJ5vZ5pE/zr0xC8y/M9BLNzQeLBwfeZ+wY4= -cloud.google.com/go/logging v1.10.0/go.mod h1:EHOwcxlltJrYGqMGfghSet736KR3hX1MAj614mrMk9I= -cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= -cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= -cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= -cloud.google.com/go/longrunning v0.5.7 h1:WLbHekDbjK1fVFD3ibpFFVoyizlLRl73I7YKuAKilhU= -cloud.google.com/go/longrunning v0.5.7/go.mod h1:8GClkudohy1Fxm3owmBGid8W0pSgodEMwEAztp38Xng= -cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= -cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= -cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= -cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= -cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= -cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= -cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= -cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= -cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= -cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= -cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= -cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= -cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= -cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= -cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= -cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= -cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= -cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= -cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= -cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= -cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= -cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= -cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= -cloud.google.com/go/monitoring v1.19.0 h1:NCXf8hfQi+Kmr56QJezXRZ6GPb80ZI7El1XztyUuLQI= -cloud.google.com/go/monitoring v1.19.0/go.mod h1:25IeMR5cQ5BoZ8j1eogHE5VPJLlReQ7zFp5OiLgiGZw= -cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= -cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= -cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= -cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= -cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= -cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= -cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= -cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= -cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= -cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= -cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= -cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= -cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= -cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= -cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= -cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= -cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= -cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= -cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= -cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= -cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= -cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= -cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= -cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= -cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= -cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= -cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= -cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= -cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= -cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= -cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= -cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= -cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= -cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= -cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= -cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= -cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= -cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= -cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= -cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= -cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= -cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= -cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= -cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= -cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= -cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= -cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= -cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= -cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= -cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= -cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= -cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= -cloud.google.com/go/pubsub v1.38.0 h1:J1OT7h51ifATIedjqk/uBNPh+1hkvUaH4VKbz4UuAsc= -cloud.google.com/go/pubsub v1.38.0/go.mod h1:IPMJSWSus/cu57UyR01Jqa/bNOQA+XnPF6Z4dKW4fAA= -cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= -cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= -cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= -cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= -cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= -cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= -cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= -cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= -cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= -cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= -cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= -cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= -cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= -cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= -cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= -cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= -cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= -cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= -cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= -cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= -cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= -cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= -cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= -cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= -cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= -cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= -cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= -cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= -cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= -cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= -cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= -cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= -cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= -cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= -cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= -cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= -cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= -cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= -cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= -cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= -cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= -cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= -cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= -cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= -cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= -cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= -cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= -cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= -cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= -cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= -cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= -cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= -cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= -cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= -cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= -cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= -cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= -cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= -cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= -cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= -cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= -cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= -cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= -cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= -cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= -cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= -cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= -cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= -cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= -cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= -cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= -cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= -cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= -cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= -cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= -cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= -cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= -cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= -cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= -cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= -cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= -cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= -cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= -cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= -cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= -cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= -cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= -cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= -cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= -cloud.google.com/go/spanner v1.63.0 h1:P6+BY70Wtol4MtryBgnXZVTZfsdySEvWfz0EpyLwHi4= -cloud.google.com/go/spanner v1.63.0/go.mod h1:iqDx7urZpgD7RekZ+CFvBRH6kVTW1ZSEb2HMDKOp5Cc= -cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= -cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= -cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= -cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= -cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= -cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= -cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= -cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= -cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= -cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= -cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= -cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= -cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= -cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= -cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= -cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= -cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= -cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= -cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= -cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= -cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= -cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= -cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= -cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= -cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= -cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= -cloud.google.com/go/trace v1.10.7 h1:gK8z2BIJQ3KIYGddw9RJLne5Fx0FEXkrEQzPaeEYVvk= -cloud.google.com/go/trace v1.10.7/go.mod h1:qk3eiKmZX0ar2dzIJN/3QhY2PIFh1eqcIdaN5uEjQPM= -cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= -cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= -cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= -cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= -cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= -cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= -cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= -cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= -cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= -cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= -cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= -cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= -cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= -cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= -cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= -cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= -cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= -cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= -cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= -cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= -cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= -cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= -cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= -cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= -cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= -cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= -cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= -cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= -cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= -cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= -cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= -cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= -cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= -cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= -cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= -cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= -cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= -cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= -cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= -cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= -cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= -cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= -cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= -code.cloudfoundry.org/clock v0.0.0-20180518195852-02e53af36e6c/go.mod h1:QD9Lzhd/ux6eNQVUDVRJX/RKTigpewimNYBi7ivZKY8= -code.cloudfoundry.org/clock v1.0.0 h1:kFXWQM4bxYvdBw2X8BbBeXwQNgfoWv1vqAk2ZZyBN2o= -code.cloudfoundry.org/clock v1.0.0/go.mod h1:QD9Lzhd/ux6eNQVUDVRJX/RKTigpewimNYBi7ivZKY8= -code.cloudfoundry.org/go-diodes v0.0.0-20211115184647-b584dd5df32c h1:N2GMlHc/SJQk7BkaME/kDHaciVTy4NuRmxVJLhnqKK8= -code.cloudfoundry.org/go-diodes v0.0.0-20211115184647-b584dd5df32c/go.mod h1:o7lq/SmHshDVxHdRJ/fMT3VPcoXyE1HcRXbG8QibO3k= -code.cloudfoundry.org/go-loggregator v7.4.0+incompatible h1:KqZYloMQWM5Zg/BQKunOIA4OODh7djZbk48qqbowNFI= -code.cloudfoundry.org/go-loggregator v7.4.0+incompatible/go.mod h1:KPBTRqj+y738Nhf1+g4JHFaBU8j7dedirR5ETNHvMXU= -code.cloudfoundry.org/rfc5424 v0.0.0-20201103192249-000122071b78 h1:mrZQaZmuDIPhSp6b96b+CRKC2uH44ifa5cjDV2epKis= -code.cloudfoundry.org/rfc5424 v0.0.0-20201103192249-000122071b78/go.mod h1:tkZo8GtzBjySJ7USvxm4E36lNQw1D3xM6oKHGqdaAJ4= -dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= -dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= -filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= -git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= -github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= -github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= -github.com/99designs/keyring v1.1.6/go.mod h1:16e0ds7LGQQcT59QqkTg72Hh5ShM51Byv5PEmW6uoRU= -github.com/99designs/keyring v1.2.2 h1:pZd3neh/EmUzWONb35LxQfvuY7kiSXAq3HQd97+XBn0= -github.com/99designs/keyring v1.2.2/go.mod h1:wes/FrByc8j7lFOAGLGSNEg8f/PaI3cgTBqhFkHUrPk= -github.com/AthenZ/athenz v1.10.39 h1:mtwHTF/v62ewY2Z5KWhuZgVXftBej1/Tn80zx4DcawY= -github.com/AthenZ/athenz v1.10.39/go.mod h1:3Tg8HLsiQZp81BJY58JBeU2BR6B/H4/0MQGfCwhHNEA= -github.com/Azure/azure-amqp-common-go/v4 v4.2.0 h1:q/jLx1KJ8xeI8XGfkOWMN9XrXzAfVTkyvCxPvHCjd2I= -github.com/Azure/azure-amqp-common-go/v4 v4.2.0/go.mod h1:GD3m/WPPma+621UaU6KNjKEo5Hl09z86viKwQjTpV0Q= -github.com/Azure/azure-event-hubs-go/v3 v3.6.2 h1:7rNj1/iqS/i3mUKokA2n2eMYO72TB7lO7OmpbKoakKY= -github.com/Azure/azure-event-hubs-go/v3 v3.6.2/go.mod h1:n+ocYr9j2JCLYqUqz9eI+lx/TEAtL/g6rZzyTFSuIpc= -github.com/Azure/azure-kusto-go v0.15.2 h1:OlABJilic9TythSgWW6i8Fd0SgNTg0t9jBu6WVsaixM= -github.com/Azure/azure-kusto-go v0.15.2/go.mod h1:9F2zvXH8B6eWzgI1S4k1ZXAIufnBZ1bv1cW1kB1n3D0= -github.com/Azure/azure-pipeline-go v0.1.8/go.mod h1:XA1kFWRVhSK+KNFiOhfv83Fv8L9achrP7OxIzeTn1Yg= -github.com/Azure/azure-pipeline-go v0.2.3 h1:7U9HBg1JFK3jHl5qmo4CTZKFTVgMwdFHMVtCdfBE21U= -github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= -github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU= -github.com/Azure/azure-sdk-for-go v68.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqbjDYsgN+RzP4q16yV5eM= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2 h1:FDif4R1+UUR+00q6wquyX90K7A8dN+R5E8GEadoP7sU= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2/go.mod h1:aiYBYui4BJ/BJCAIKs92XiPyQfTaBWqvHujDwKb6CBU= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.6.0 h1:sUFnFjzDUie80h24I7mrKtwCKgLY9L8h5Tp2x9+TWqk= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.6.0/go.mod h1:52JbnQTp15qg5mRkMBHwp0j0ZFwHJ42Sx3zVV5RE9p0= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.5.0 h1:MxA59PGoCFb+vCwRQi3PhQEwHj4+r2dhuv9HG+vM7iM= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.5.0/go.mod h1:uYt4CfhkJA9o0FN7jfE5minm/i4nUE4MjGUJkzB6Zs8= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0 h1:PTFGRSlMKCQelWwxUyYVEUqseBJVemLyqWJjvMyt0do= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0/go.mod h1:LRr2FzBTQlONPPa5HREE5+RjSCTXl7BwOvYOaWTqCaI= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managementgroups/armmanagementgroups v1.0.0 h1:pPvTJ1dY0sA35JOeFq6TsY2xj6Z85Yo23Pj4wCCvu4o= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managementgroups/armmanagementgroups v1.0.0/go.mod h1:mLfWfj8v3jfWKsL9G4eoBoXVcsqcIUTapmdKy7uGOp0= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor v0.11.0 h1:Ds0KRF8ggpEGg4Vo42oX1cIt/IfOhHWJBikksZbVxeg= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor v0.11.0/go.mod h1:jj6P8ybImR+5topJ+eH6fgcemSFBmU6/6bFF8KkwuDI= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 h1:bXwSugBiSbgtz7rOtbfGf+woewp4f06orW9OP5BjHLA= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0/go.mod h1:Y/HgrePTmGy9HjdSGTqZNa+apUpTVIEVKXJyARP2lrk= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 h1:Dd+RhdJn0OTtVGaeDLZpcumkIVCtA/3/Fo42+eoYvVM= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0/go.mod h1:5kakwfW5CjC9KK+Q4wjXAg+ShuIm2mBMua0ZFj2C8PE= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.5.0 h1:AifHbc4mg0x9zW52WOpKbsHaDKuRhlI7TVl47thgQ70= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.5.0/go.mod h1:T5RfihdXtBDxt1Ch2wobif3TvzTdumDy29kahv6AV9A= -github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1 h1:MyVTgWR8qd/Jw1Le0NZebGBUCLbtak3bJ3z1OlqZBpw= -github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1/go.mod h1:GpPjLhVR9dnUoJMyHWSPy71xY9/lcmpzIPZXmF0FCVY= -github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0 h1:D3occbWoio4EBLkbkevetNMAVX197GkzbUMtqjGWn80= -github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0/go.mod h1:bTSOgj05NGRuHHhQwAdPnYr9TOdNmKlZTgGLL6nyAdI= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2 h1:YUUxeiOWgdAQE3pXt2H7QXzZs0q8UBjgRbl56qo8GYM= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2/go.mod h1:dmXQgZuiSubAecswZE+Sm8jkvEa7kQgTPVRvwL/nd0E= -github.com/Azure/azure-storage-queue-go v0.0.0-20230531184854-c06a8eff66fe h1:HGuouUM1533rBXmMtR7qh5pYNSSjUZG90b/MgJAnb/A= -github.com/Azure/azure-storage-queue-go v0.0.0-20230531184854-c06a8eff66fe/go.mod h1:K6am8mT+5iFXgingS9LUc7TmbsW6XBw3nxaRyaMyWc8= -github.com/Azure/go-amqp v1.0.5 h1:po5+ljlcNSU8xtapHTe8gIc8yHxCzC03E8afH2g1ftU= -github.com/Azure/go-amqp v1.0.5/go.mod h1:vZAogwdrkbyK3Mla8m/CxSc/aKdnTZ4IbPxl51Y5WZE= -github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= -github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= -github.com/Azure/go-autorest/autorest v0.11.24/go.mod h1:G6kyRlFnTuSbEYkQGawPfsCswgme4iYf6rfSKUDzbCc= -github.com/Azure/go-autorest/autorest v0.11.29 h1:I4+HL/JDvErx2LjyzaVxllw2lRDB5/BT2Bm4g20iqYw= -github.com/Azure/go-autorest/autorest v0.11.29/go.mod h1:ZtEzC4Jy2JDrZLxvWs8LrBWEBycl1hbT1eknI8MtfAs= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/adal v0.9.22/go.mod h1:XuAbAEUv2Tta//+voMI038TrJBqjKam0me7qR+L8Cmk= -github.com/Azure/go-autorest/autorest/adal v0.9.23 h1:Yepx8CvFxwNKpH6ja7RZ+sKX+DWYNldbLiALMC3BTz8= -github.com/Azure/go-autorest/autorest/adal v0.9.23/go.mod h1:5pcMqFkdPhviJdlEy3kC/v1ZLnQl0MH6XA5YCcMhy4c= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.12 h1:wkAZRgT/pn8HhFyzfe9UnqOjJYqlembgCTi72Bm/xKk= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.12/go.mod h1:84w/uV8E37feW2NCJ08uT9VBfjfUHpgLVnG2InYD6cg= -github.com/Azure/go-autorest/autorest/azure/cli v0.4.5 h1:0W/yGmFdTIT77fvdlGZ0LMISoLHFJ7Tx4U0yeB+uFs4= -github.com/Azure/go-autorest/autorest/azure/cli v0.4.5/go.mod h1:ADQAXrkgm7acgWVUNamOgh8YNrv4p27l3Wc55oVfpzg= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw= -github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU= -github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.3.1 h1:AgyqjAd94fwNAoTjl/WQXg4VvFeRFpO+UhNyRXqF1ac= -github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/ClickHouse/ch-go v0.61.5 h1:zwR8QbYI0tsMiEcze/uIMK+Tz1D3XZXLdNrlaOpeEI4= -github.com/ClickHouse/ch-go v0.61.5/go.mod h1:s1LJW/F/LcFs5HJnuogFMta50kKDO0lf9zzfrbl0RQg= -github.com/ClickHouse/clickhouse-go/v2 v2.23.0 h1:srmRrkS0BR8gEut87u8jpcZ7geOob6nGj9ifrb+aKmg= -github.com/ClickHouse/clickhouse-go/v2 v2.23.0/go.mod h1:tBhdF3f3RdP7sS59+oBAtTyhWpy0024ZxDMhgxra0QE= -github.com/Code-Hex/go-generics-cache v1.3.1 h1:i8rLwyhoyhaerr7JpjtYjJZUcCbWOdiYO3fZXLiEC4g= -github.com/Code-Hex/go-generics-cache v1.3.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4= -github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= -github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= -github.com/DataDog/agent-payload/v5 v5.0.119 h1:PgeA41P3BE4z+b0j61B6yXnZDw7tB7bxl5EIHyGVG14= -github.com/DataDog/agent-payload/v5 v5.0.119/go.mod h1:FgVQKmVdqdmZTbxIptqJC/l+xEzdiXsaAOs/vGAvWzs= -github.com/DataDog/datadog-agent/cmd/agent/common/path v0.54.0-rc.5 h1:nLwtiYCoD+yb4HfhcJ3hmD9pczYLveOJexH5OHVQWsk= -github.com/DataDog/datadog-agent/cmd/agent/common/path v0.54.0-rc.5/go.mod h1:wJQkyIKR2epsYERgVRrO55fgda+oS5ZyBy2neJFXXGM= -github.com/DataDog/datadog-agent/comp/core/config v0.54.0-rc.5 h1:DKefO1N2aGtsUWRxyziQh3cHS3LuqdFjd+QmHR/qLNk= -github.com/DataDog/datadog-agent/comp/core/config v0.54.0-rc.5/go.mod h1:nDpszL8YD58OU/w2uFtN6oHv0cDDZrRNufYgBDtleVw= -github.com/DataDog/datadog-agent/comp/core/flare/types v0.54.0-rc.5 h1:GTYjjIV8YupcNqcNgcAnrNkbofcb6w7JFVdtfv9On9Q= -github.com/DataDog/datadog-agent/comp/core/flare/types v0.54.0-rc.5/go.mod h1:aChd0OV9bB534m+H4IPglCAs441s/1R+Tau5USeSM+Q= -github.com/DataDog/datadog-agent/comp/core/hostname/hostnameinterface v0.54.0-rc.5 h1:yz7efcj2vC0N0bcRwVItXXsFUl4JFgEzsqe3lDhdu7s= -github.com/DataDog/datadog-agent/comp/core/hostname/hostnameinterface v0.54.0-rc.5/go.mod h1:GhQb1d4Z4Z/E/WnUpmtSKADJSwziEIz0jwU0/MvNTic= -github.com/DataDog/datadog-agent/comp/core/log v0.54.0-rc.5 h1:2tvd3K+Bat8hT2jJBpIAfH/8J9k7v+s+IQcoyVVQitU= -github.com/DataDog/datadog-agent/comp/core/log v0.54.0-rc.5/go.mod h1:mtMxZiwg13b4bHgDf8xE6FHgTcadzI5Cc0lx2MSY1mE= -github.com/DataDog/datadog-agent/comp/core/secrets v0.54.0-rc.5 h1:hhkI7EtQwvhrKXO+oNo7V2ZhlSJ2Pt3uj9rOUeVrlSs= -github.com/DataDog/datadog-agent/comp/core/secrets v0.54.0-rc.5/go.mod h1:Bx0rH0jqLkDzQCBeDsgKGmcehYoQjuO6fE8aGjiQe2A= -github.com/DataDog/datadog-agent/comp/core/telemetry v0.54.0-rc.5 h1:v8WyP8srS/5EfD7OKZCm1aRPT56AXaQ2QqQRO2+fwUM= -github.com/DataDog/datadog-agent/comp/core/telemetry v0.54.0-rc.5/go.mod h1:ZpND0xZO2YVm7FNbPOrVoRMbPFhVRbZC40Vb5xsgyQc= -github.com/DataDog/datadog-agent/comp/def v0.54.0-rc.5 h1:pVYCT2SztEIcF03BdbrDgPfT7C/Pc2earv9YB4/2lU0= -github.com/DataDog/datadog-agent/comp/def v0.54.0-rc.5/go.mod h1:ts1c7j9tfa/BaoBH/gdQPt1LTeLeSh0b7IHMqm7ylDE= -github.com/DataDog/datadog-agent/comp/logs/agent/config v0.54.0-rc.5 h1:V4zdArRqhlZWT0tWj8mJE/pDRcAs4IkBC7Y5N+Gjr7U= -github.com/DataDog/datadog-agent/comp/logs/agent/config v0.54.0-rc.5/go.mod h1:88zmScug+KuG8EEuyaf3CAw5idi7XFMDTq66u6UPW4A= -github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline v0.54.0-rc.5 h1:FAZQ6viOK9CiU8x7aW2PJMlI4nq3bmNnOT642ASUxxc= -github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline v0.54.0-rc.5/go.mod h1:c+WZvnTktqP8inoph1/wvxvfLx9rV/cKoR/zvoEpu6E= -github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline/logsagentpipelineimpl v0.54.0-rc.5 h1:dtJiztozoBiltjE0382hAMtDeEfRnEov186xGZ4TGB0= -github.com/DataDog/datadog-agent/comp/otelcol/logsagentpipeline/logsagentpipelineimpl v0.54.0-rc.5/go.mod h1:yMYGvbt3AAXiXoadUxEbxWl6C3/Ub2t8dn2UG7Y54SM= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/exporter/logsagentexporter v0.54.0-rc.5 h1:5HcA9XYLdI0Z81o5p7SppdVCYjKoshv9GBrqZfeLvC4= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/exporter/logsagentexporter v0.54.0-rc.5/go.mod h1:R2jDIkQpwYzy4AturN73oJB2X32jtivHW9TvdeN7BAQ= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/metricsclient v0.0.0-20240525065430-d0b647bcb646 h1:KeIeWDAjzQxL6/ruBQmFlT/FRstEz11z/UT3LH+8sAA= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/metricsclient v0.0.0-20240525065430-d0b647bcb646/go.mod h1:TIf/0Kb3DAYAtYbhhxmZ72etu+IKSqy66mcIGBuioik= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/statsprocessor v0.0.0-20240525065430-d0b647bcb646 h1:dyGnQr1QVLhwLdKzCTMsDsnYYUOkOXU4JWT2HuS1LJ4= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/statsprocessor v0.0.0-20240525065430-d0b647bcb646/go.mod h1:m7gt1CfJ/8FgnidFPk2lENaxO9m0mOnWWJQylgJkMzw= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.54.0-rc.5 h1:GuGbndVAnhNa6JOtDsDEWXmZFJB0fp4iCnJ3OO1JSks= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.54.0-rc.5/go.mod h1:6ydg+CWz9UlcBkV4pptOdQXTLNc/8YkTqta6VJFGg1M= -github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.54.0-rc.5 h1:YEvetFgYjf3oZsliKn0ddrz1t4ZvOzzlvOxJ100szlI= -github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.54.0-rc.5/go.mod h1:Mpe5lBwTlmLsu1WwIx8uRbj+Bi8+9gW8rWDfXPRwQVQ= -github.com/DataDog/datadog-agent/pkg/config/env v0.54.0-rc.5 h1:D4e5j805YtqmdhSeCXax020Nht6arNUvuvX4AKDMfu8= -github.com/DataDog/datadog-agent/pkg/config/env v0.54.0-rc.5/go.mod h1:9FPuluS8k4LEpfvlz7KQ6iHmqyTVfvuKxhwZkEUeoI4= -github.com/DataDog/datadog-agent/pkg/config/logs v0.54.0-rc.5 h1:xJ6u0OftjMYixmaDlb5yba3T72kyo/rpI7iuOYiAgJE= -github.com/DataDog/datadog-agent/pkg/config/logs v0.54.0-rc.5/go.mod h1:uo77w0taiJfXk3RV4N71t3WmoHhu6wJ782YmGeV6Ynk= -github.com/DataDog/datadog-agent/pkg/config/model v0.54.0-rc.5 h1:6HhxZQzS2edPF9ZevjWtstu6y17lj4a4fsRiTJ3ObHI= -github.com/DataDog/datadog-agent/pkg/config/model v0.54.0-rc.5/go.mod h1:X6U3mq0dErErZUIQx3GMmrO0jdp7aGN656iSDUW8sfw= -github.com/DataDog/datadog-agent/pkg/config/setup v0.54.0-rc.5 h1:+kl+DEK320zyWZBoFzTofgwN0AzUKpJByf8KdJ7WpJQ= -github.com/DataDog/datadog-agent/pkg/config/setup v0.54.0-rc.5/go.mod h1:2qnUs+85QVGqdK4DOpEaox6MKbfKFo3v2MXl9W8zP9Y= -github.com/DataDog/datadog-agent/pkg/config/utils v0.54.0-rc.5 h1:FQmC8qbWoaH4GFzuSuGFtJCR3kleh6xBmQXISiE8/Ho= -github.com/DataDog/datadog-agent/pkg/config/utils v0.54.0-rc.5/go.mod h1:pWPWng1HBqWccXoYJXfmWgpr+pujCpe4XYtGbiH4IOU= -github.com/DataDog/datadog-agent/pkg/logs/auditor v0.54.0-rc.5 h1:dQIi1vw2MaBmrT0kQv0qE5csFecCzaoPGY8m8KTEiqA= -github.com/DataDog/datadog-agent/pkg/logs/auditor v0.54.0-rc.5/go.mod h1:7w1fYTvDKwfk2J08P3vKEieeULSFASfZ0IgCjEoIF2E= -github.com/DataDog/datadog-agent/pkg/logs/client v0.54.0-rc.5 h1:YMYTquLk0uzYxvyRR1ew1QBf5dMtz3b/uBuwQzVODs4= -github.com/DataDog/datadog-agent/pkg/logs/client v0.54.0-rc.5/go.mod h1:YZbEwh9sPrDqxj02BHUHN6ljR+wohaN5QkkTdNZBLxY= -github.com/DataDog/datadog-agent/pkg/logs/diagnostic v0.54.0-rc.5 h1:klt8iysuxBuycyDu6lE51oCcAzZLJpvA7HiAKyQv9GM= -github.com/DataDog/datadog-agent/pkg/logs/diagnostic v0.54.0-rc.5/go.mod h1:93tXt/40ar1666Kk83CDOsb35xhAhQiPSqEH24zZ164= -github.com/DataDog/datadog-agent/pkg/logs/message v0.54.0-rc.5 h1:tX7zHQ6bmLJTfcRTcGY+91VXCZPEY2/OxKlVg/P4Tec= -github.com/DataDog/datadog-agent/pkg/logs/message v0.54.0-rc.5/go.mod h1:SGUmU3Fz/AtmdJvfos5EokpT4CN9YVi50DbYYZX0q4w= -github.com/DataDog/datadog-agent/pkg/logs/metrics v0.54.0-rc.5 h1:tzzzy68wHmQLIrpbJbmo9ZYqm8pHTlWvjUYnQUMBsUU= -github.com/DataDog/datadog-agent/pkg/logs/metrics v0.54.0-rc.5/go.mod h1:vcMlIQfRoHkafZFAHtHrkmeCSQzGpXtE2iyLkaObnUk= -github.com/DataDog/datadog-agent/pkg/logs/pipeline v0.54.0-rc.5 h1:yJ3W4/CQwlEifXz1FDCehvoVvGwaH4LXuJ6A/TbRMdc= -github.com/DataDog/datadog-agent/pkg/logs/pipeline v0.54.0-rc.5/go.mod h1:WsysKMxzTLQHn75WAUwHHw/SyhGQr+m8fYE3iMYl2gA= -github.com/DataDog/datadog-agent/pkg/logs/processor v0.54.0-rc.5 h1:RqKUVfSHrw5D8nRMIhOaAKQThk7pHRbyDVo2CylYtAY= -github.com/DataDog/datadog-agent/pkg/logs/processor v0.54.0-rc.5/go.mod h1:LwAwQKHHSsOC0sspi58vpN2h4tFEI1ZNtU69OUVFBxc= -github.com/DataDog/datadog-agent/pkg/logs/sds v0.54.0-rc.5 h1:u8dgzzSluJx7WMk3J834CxCP7FCo+z0PU9d1vj7K1HU= -github.com/DataDog/datadog-agent/pkg/logs/sds v0.54.0-rc.5/go.mod h1:+octueIX19RzWrarAkKNIAtFTfETavn6Ku4s217EcSY= -github.com/DataDog/datadog-agent/pkg/logs/sender v0.54.0-rc.5 h1:n5UMZvF+5L3XekeS5bkR0adwcOsogIT9uEtq2vHMhtU= -github.com/DataDog/datadog-agent/pkg/logs/sender v0.54.0-rc.5/go.mod h1:dj51DKlSkf10tqsdfuE4NMZaD2PSzau3G8Le8UmXerA= -github.com/DataDog/datadog-agent/pkg/logs/sources v0.54.0-rc.5 h1:wpvvYERlZsBmdoVMIYFxd2XlvSjBh5en06WkKgWRYk4= -github.com/DataDog/datadog-agent/pkg/logs/sources v0.54.0-rc.5/go.mod h1:bBzxEwKqZRKlkizVUViWjGNkjjF58njl+YiZNLxD/ZI= -github.com/DataDog/datadog-agent/pkg/logs/status/statusinterface v0.54.0-rc.5 h1:KuPBZTbwVJqDMa9ATfg0YWpGl3CxgGJcJZzSmsGVNdI= -github.com/DataDog/datadog-agent/pkg/logs/status/statusinterface v0.54.0-rc.5/go.mod h1:xsyGZLKEr6dZaJlC9QWuyYVXqMnHRwZzn641O3bfB98= -github.com/DataDog/datadog-agent/pkg/logs/status/utils v0.54.0-rc.5 h1:GAai92l2sX1rOQqGzPzE0IGMzS442xTLrHF/EwTywnw= -github.com/DataDog/datadog-agent/pkg/logs/status/utils v0.54.0-rc.5/go.mod h1:TsFFZ6y2/brcnkXLZhfp0k2xrewdyqhXnjxVpkOWIvE= -github.com/DataDog/datadog-agent/pkg/logs/util/testutils v0.54.0-rc.5 h1:9mAiLISlZcol07wCndWd5ErjItibOClx+N2Oyo3lG+A= -github.com/DataDog/datadog-agent/pkg/logs/util/testutils v0.54.0-rc.5/go.mod h1:J5lpbKKJzxPE2i5dsBYJnxbHlFvzPkfxNlhh2p3s18s= -github.com/DataDog/datadog-agent/pkg/obfuscate v0.54.0-rc.5 h1:qZg/3r8lLIgwzpHkqNBdnDKCdHexSxjgkb6FbPBaMnY= -github.com/DataDog/datadog-agent/pkg/obfuscate v0.54.0-rc.5/go.mod h1:4/9D8y6pQo5a/Tg8GAQN8SaRIRWxxyl5QHzPRuu8D0k= -github.com/DataDog/datadog-agent/pkg/proto v0.54.0-rc.5 h1:0HdqgTFchLs6ElI9cVrfjsT/gOF8A7PiY/VI2JMDFJc= -github.com/DataDog/datadog-agent/pkg/proto v0.54.0-rc.5/go.mod h1:gHkSUTn6H6UEZQHY3XWBIGNjfI3Tdi0IxlrxIFBWDwU= -github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.54.0-rc.5 h1:wM6w1HtUOxrn/sgMW00jx+0p4rNzPv+NhPqmIpboyV0= -github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.54.0-rc.5/go.mod h1:3yFk56PJ57yS1GqI9HAsS4PSlAeGCC9RQA7jxKzYj6g= -github.com/DataDog/datadog-agent/pkg/status/health v0.54.0-rc.5 h1:WgoyD4RkoGI3JDy+79SyiPc0AJGyCO5c2toOfxWwW1E= -github.com/DataDog/datadog-agent/pkg/status/health v0.54.0-rc.5/go.mod h1:sNLVlyEtkYal/+kTj+mTp239DdwVuYBYOnpS90RKk5E= -github.com/DataDog/datadog-agent/pkg/telemetry v0.54.0-rc.5 h1:iXZEgoYil4VaadjDsK+GbCkY7rBQyjsnlNJwXr6BwCY= -github.com/DataDog/datadog-agent/pkg/telemetry v0.54.0-rc.5/go.mod h1:4GCwM87F7u9HzugAODVTwS05MFMKC+NoJu6E4Zd/8pY= -github.com/DataDog/datadog-agent/pkg/trace v0.54.0-rc.5 h1:il5yFFe5CubI+bSfHolKr0077dQw0R+U5B9/iwW8aBg= -github.com/DataDog/datadog-agent/pkg/trace v0.54.0-rc.5/go.mod h1:63uSQX6TVeJzl1cFbIp8MkXlF4kUMJs8iUfGhrSgUHY= -github.com/DataDog/datadog-agent/pkg/util/backoff v0.54.0-rc.5 h1:eq+OaYTZ0rzQt1SpC2Tl+szJjUTX2nOC4N0glSzuWQ0= -github.com/DataDog/datadog-agent/pkg/util/backoff v0.54.0-rc.5/go.mod h1:HcSwqoxWLfevi1vuDZuFeRHfSuHGakTN6/u42WbxQHE= -github.com/DataDog/datadog-agent/pkg/util/cgroups v0.54.0-rc.5 h1:z5NnMMxKxO+cExUt0QCCSF7E+wX8LdD3nuL9LlDpR3Y= -github.com/DataDog/datadog-agent/pkg/util/cgroups v0.54.0-rc.5/go.mod h1:40rjMMqmvglVjktjWVUIk3o5W2zAtek0JU4FCsf7bsM= -github.com/DataDog/datadog-agent/pkg/util/executable v0.54.0-rc.5 h1:kxGwRdBPbiEx9mplVMA/rdLKMWcaKJMqO1pIyg56sLk= -github.com/DataDog/datadog-agent/pkg/util/executable v0.54.0-rc.5/go.mod h1:hUJvBzOKfasYzSvlar10ZkrB8I1CR8PhtyGxmlMv/cU= -github.com/DataDog/datadog-agent/pkg/util/filesystem v0.54.0-rc.5 h1:2A1/eg6zwNlUOjdAgaSgXR8eFR0HYLyqpvqLjlxKEP4= -github.com/DataDog/datadog-agent/pkg/util/filesystem v0.54.0-rc.5/go.mod h1:DfBDL+EjOiLI+HYR2N5zw1an1q7oCJQT6lY4oTCZxZ4= -github.com/DataDog/datadog-agent/pkg/util/fxutil v0.54.0-rc.5 h1:Fv7vJj/7qoEIV+ppI257ncx8IVQkDrUyjKSyeE56oTs= -github.com/DataDog/datadog-agent/pkg/util/fxutil v0.54.0-rc.5/go.mod h1:xqWrlGtjVu2ZMoCW9e3R7f13/Qg0IQBzO5AX7J1dC9I= -github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.54.0-rc.5 h1:1buVvWK8DXUveIpZMDc7Rn59mCDWZkQ9OGHjQRKdcas= -github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.54.0-rc.5/go.mod h1:FqMWIncd1TJJdlUYyiQQGJHWe+ZDKAjJSSPlrUBvHHk= -github.com/DataDog/datadog-agent/pkg/util/http v0.54.0-rc.5 h1:81sBly4SXW5Bvt3DHiUuuLpQnEUjhgdVDK69bk0g+58= -github.com/DataDog/datadog-agent/pkg/util/http v0.54.0-rc.5/go.mod h1:hZRz30Xaqm+UiR/KjO6gAo1Qa7v+tsxVqqaWgUkBjxE= -github.com/DataDog/datadog-agent/pkg/util/log v0.54.0-rc.5 h1:BcA7+MK04/HRCFlX5Pn/sQzZu/gF4qA3DOF880Jy/oo= -github.com/DataDog/datadog-agent/pkg/util/log v0.54.0-rc.5/go.mod h1:MFVWM0DMaxEXhCnHLWnh6axtwubmKRn7C+w2xiL+atI= -github.com/DataDog/datadog-agent/pkg/util/optional v0.54.0-rc.5 h1:3+7PwCbvtkOf63fPOzzMGVxNzlaZofPAg6ExPKn72hc= -github.com/DataDog/datadog-agent/pkg/util/optional v0.54.0-rc.5/go.mod h1:wa1JIWnzo9EvOBwzDOeff8HeqgOq9JQANRb99/nKg3A= -github.com/DataDog/datadog-agent/pkg/util/pointer v0.54.0-rc.5 h1:3zfbAoA9HSCJ/RsR/kP2MzntIvoI4szoReu4j3gpJrY= -github.com/DataDog/datadog-agent/pkg/util/pointer v0.54.0-rc.5/go.mod h1:ahpEhdpkifOLy0/XLHas+SseEmMQnwMgV1CMVkSuXL0= -github.com/DataDog/datadog-agent/pkg/util/scrubber v0.54.0-rc.5 h1:Sob3M0CylnKxZ9FX8Ewjka5VRFYZUQLN2J0kyOGYnMM= -github.com/DataDog/datadog-agent/pkg/util/scrubber v0.54.0-rc.5/go.mod h1:8ASCNWHQtcmUedxL+WjbCPSIcGIM8LeVzil7JCzx0js= -github.com/DataDog/datadog-agent/pkg/util/startstop v0.54.0-rc.5 h1:wo+LiNCZ9RQNNuYzCavbgjARHO3OmcqpFw4Mo6J5R+s= -github.com/DataDog/datadog-agent/pkg/util/startstop v0.54.0-rc.5/go.mod h1:F9ysDtw4BnbZIuKdwOdiHranjG9QMv2o7PMVreIhFzI= -github.com/DataDog/datadog-agent/pkg/util/statstracker v0.54.0-rc.5 h1:hU+Zvh4IL/HOEAjDzyIhYMQa4ibbX+dM4p5wWWpZ34U= -github.com/DataDog/datadog-agent/pkg/util/statstracker v0.54.0-rc.5/go.mod h1:KkiJi2f4mcxAJA00ArYw4zTfs0oWMU1bNXqKhymRVZg= -github.com/DataDog/datadog-agent/pkg/util/system v0.54.0-rc.5 h1:b7GZ1xAbkCtw5/hHwkRJoRiheAd9e+T2slJlD34lXbE= -github.com/DataDog/datadog-agent/pkg/util/system v0.54.0-rc.5/go.mod h1:gIg9d09X6uFqDFo7Dd48OCOCAtTLTWIE44+f/e35C3c= -github.com/DataDog/datadog-agent/pkg/util/system/socket v0.54.0-rc.5 h1:alEMYfYHYju+poG90phbdrpg4RYEyK/oFLAi8MM++HU= -github.com/DataDog/datadog-agent/pkg/util/system/socket v0.54.0-rc.5/go.mod h1:RKqan/bns7z9tqZBWSkshY1e6VisZJaU0b/XQcIDyAQ= -github.com/DataDog/datadog-agent/pkg/util/testutil v0.54.0-rc.5 h1:+nmZ4SFAHoskytj/q8+ewx7UtvbKGdDzcbPU0rhxIzU= -github.com/DataDog/datadog-agent/pkg/util/testutil v0.54.0-rc.5/go.mod h1:AyiUcueiQeqBXn60wbVOo3dPYRDNg0Gsfh/GkhatyxE= -github.com/DataDog/datadog-agent/pkg/util/winutil v0.54.0-rc.5 h1:0eWM/VJT1YPFf+nE5u0QdX1CiCiH2LWuvr4cCJ+nC3M= -github.com/DataDog/datadog-agent/pkg/util/winutil v0.54.0-rc.5/go.mod h1:m/wWejBoF6cuPzogMq2sgm86vvsnR1bAkw+Fgxq4vns= -github.com/DataDog/datadog-agent/pkg/version v0.54.0-rc.5 h1:aQEEvgBxk6Vk6ePMldw3fQUYTrl0AaYfUbrT1Ko6bjE= -github.com/DataDog/datadog-agent/pkg/version v0.54.0-rc.5/go.mod h1:EHeMJExE74SMdRoRCEuLOxbRgjfQwCVngMqFBiz1VN8= -github.com/DataDog/datadog-api-client-go/v2 v2.26.0 h1:bZr0hu+hx8L91+yU5EGw8wK3FlCVEIashpx+cylWsf0= -github.com/DataDog/datadog-api-client-go/v2 v2.26.0/go.mod h1:QKOu6vscsh87fMY1lHfLEmNSunyXImj8BUaUWJXOehc= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/DataDog/datadog-go/v5 v5.5.0 h1:G5KHeB8pWBNXT4Jtw0zAkhdxEAWSpWH00geHI6LDrKU= -github.com/DataDog/datadog-go/v5 v5.5.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= -github.com/DataDog/dd-sensitive-data-scanner/sds-go/go v0.0.0-20240419161837-f1b2f553edfe h1:efzxujZ7VHWFxjmWjcJyUEpPrN8qdiZPYb+dBw547Wo= -github.com/DataDog/dd-sensitive-data-scanner/sds-go/go v0.0.0-20240419161837-f1b2f553edfe/go.mod h1:TX7CTOQ3LbQjfAi4SwqUoR5gY1zfUk7VRBDTuArjaDc= -github.com/DataDog/go-sqllexer v0.0.9 h1:Cx2Cu1S0hfj4coCCA8hzjM9+UNFRkcu1avIV//RU5Qw= -github.com/DataDog/go-sqllexer v0.0.9/go.mod h1:nB4Ea2YNsqMwtbWMc4Fm/oP98IIrSPapqwOwPioMspY= -github.com/DataDog/go-tuf v1.1.0-0.5.2 h1:4CagiIekonLSfL8GMHRHcHudo1fQnxELS9g4tiAupQ4= -github.com/DataDog/go-tuf v1.1.0-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= -github.com/DataDog/gohai v0.0.0-20230524154621-4316413895ee h1:tXibLZk3G6HncIFJKaNItsdzcrk4YqILNDZlXPTNt4k= -github.com/DataDog/gohai v0.0.0-20230524154621-4316413895ee/go.mod h1:nTot/Iy0kW16bXgXr6blEc8gFeAS7vTqYlhAxh+dbc0= -github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata v0.16.1 h1:WD5hPS/KfDaYcWxa636972pQ8iOBN9MC/6Is5aSNZc8= -github.com/DataDog/opentelemetry-mapping-go/pkg/inframetadata v0.16.1/go.mod h1:P/l++2cDCeeq21KSmCEdXdMH9/WMdXP7uA/vjnxhtz8= -github.com/DataDog/opentelemetry-mapping-go/pkg/internal/sketchtest v0.16.0 h1:VJT1Jjlz/ca999FEqaAS+He7S4eB14a+PJjczgRdgAY= -github.com/DataDog/opentelemetry-mapping-go/pkg/internal/sketchtest v0.16.0/go.mod h1:66XlN7QpQKqIvw8e2UbCXV5X8wGnEw851nT9BjJ75dY= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.16.1 h1:ZI8u3CgdMXpDplrf9/gIr13+/g/tUzUcBMk2ZhXgzLE= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.16.1/go.mod h1:dvIWN9pA2zWNTw5rhDWZgzZnhcfpH++d+8d1SWW6xkY= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/logs v0.16.1 h1:px2+7svK86oeCGd+sT1x/9f0pqIJdApGFnWI0AOPXwA= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/logs v0.16.1/go.mod h1:+LijQ2LdlocAQ4WB+7KsoIGe90bfogkRslubd9swVow= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics v0.16.1 h1:Qm3M3A7/tkYG8JYeF9Mxp3oNEz23EQzvnV0MZR8mJKQ= -github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics v0.16.1/go.mod h1:HPwVoMccTFfyV94bE29ffwAYnsPykAH7Iso8/5ucLSs= -github.com/DataDog/opentelemetry-mapping-go/pkg/quantile v0.16.1 h1:sQoxh5RytdEFYFLGw3JUwFFhS/A1InFFVldpWAS/Z3g= -github.com/DataDog/opentelemetry-mapping-go/pkg/quantile v0.16.1/go.mod h1:6eYyd+lJYH+uRuZqhyW/u+9ykaXBWetDGj44+txz6jU= -github.com/DataDog/sketches-go v1.4.5 h1:ki7VfeNz7IcNafq7yI/j5U/YCkO3LJiMDtXz9OMQbyE= -github.com/DataDog/sketches-go v1.4.5/go.mod h1:7Y8GN8Jf66DLyDhc94zuWA3uHEt/7ttt8jHOBWWrSOg= -github.com/DataDog/viper v1.13.3 h1:0++798wZLEenL1JbF8dMmwFl6WMlAVxLtzVuws/LlVc= -github.com/DataDog/viper v1.13.3/go.mod h1:wDdUVJ2SHaMaPrCZrlRCObwkubsX8j5sme3LaR/SGTc= -github.com/DataDog/zstd v1.5.0/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= -github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/GehirnInc/crypt v0.0.0-20200316065508-bb7000b8a962 h1:KeNholpO2xKjgaaSyd+DyQRrsQjhbSeS7qe4nEw8aQw= -github.com/GehirnInc/crypt v0.0.0-20200316065508-bb7000b8a962/go.mod h1:kC29dT1vFpj7py2OvG1khBdQpo3kInWP+6QipLbdngo= -github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0 h1:oVLqHXhnYtUwM89y9T1fXGaK9wTkXHgNp8/ZNMQzUxE= -github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.23.0 h1:yRhWveg9NbJcJYoJL4FoSauT2dxnt4N9MIAJ7tvU/mQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.23.0/go.mod h1:p2puVVSKjQ84Qb1gzw2XHLs34WQyHTYFZLaVxypAFYs= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector v0.47.0 h1:riVd60yiSVM8oTZEnM/nscvZ2o4mcol45ZPv62zlu/M= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector v0.47.0/go.mod h1:LoJOu8+DY6cbxXF753iWmZ88nHEudiySwpQg//6mU/0= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector/googlemanagedprometheus v0.47.0 h1:qXG3UhUqfpjCbaFDTW03giIZa4PUMQ6nRoUDEDOhLWI= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector/googlemanagedprometheus v0.47.0/go.mod h1:VkkA3E9i8gTBNBIsAjypbvpwei4dSokmLdHsXLzwHOk= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.23.0 h1:5A4O4OdC7yzkIEPl4GrS+PRYV15zsboaWBT52g3Hc0k= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.23.0/go.mod h1:zO73rmlwRYxQF/6Nul4PA/UIAYJo9BtDAMgPfMthXnw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.47.0 h1:h3GAq9n95A6IYOGqAucbp+tGBxAQul2vj5ORkmRrGxg= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.47.0/go.mod h1:PdB0wkmILI+phhoBhWdrrB4LfORT9tHc03OOn+q3dWU= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.47.0 h1:TOjDcFzPkoglwb5sa6+704TXwYgs+XsN5HYc98ksK+M= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.47.0/go.mod h1:ZC7rjqRzdhRKDK223jQ7Tsz89ZtrSSLH/VFzf7k5Sb0= -github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= -github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/IBM/sarama v1.43.2 h1:HABeEqRUh32z8yzY2hGB/j8mHSzC/HA9zlEjqFNCzSw= -github.com/IBM/sarama v1.43.2/go.mod h1:Kyo4WkF24Z+1nz7xeVUFWIuKVV8RS3wM8mkvPKMdXFQ= -github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:RGWPOewvKIROun94nF7v2cua9qP+thov/7M50KEoeSU= -github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= -github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= -github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/Netflix/go-env v0.0.0-20220526054621-78278af1949d h1:wvStE9wLpws31NiWUx+38wny1msZ/tm+eL5xmm4Y7So= -github.com/Netflix/go-env v0.0.0-20220526054621-78278af1949d/go.mod h1:9XMFaCeRyW7fC9XJOWQ+NdAv8VLG7ys7l3x4ozEGLUQ= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/ReneKroon/ttlcache/v2 v2.11.0 h1:OvlcYFYi941SBN3v9dsDcC2N8vRxyHcCmJb3Vl4QMoM= -github.com/ReneKroon/ttlcache/v2 v2.11.0/go.mod h1:mBxvsNY+BT8qLLd6CuAJubbKo6r0jh3nb5et22bbfGY= -github.com/SAP/go-hdb v1.9.5 h1:rLp9rgs4n0Lvsxi3uTNiUpTM+KpA8tOgbQhcjksmdaA= -github.com/SAP/go-hdb v1.9.5/go.mod h1:eKGk33q3PZ41Lgua4lmqtKgIXpSEYs0teXePqMAcwBg= -github.com/SermoDigital/jose v0.9.2-0.20161205224733-f6df55f235c2/go.mod h1:ARgCUhI1MHQH+ONky/PAtmVHQrP5JlGY0F3poXOp/fA= -github.com/SermoDigital/jose v0.9.2-0.20180104203859-803625baeddc h1:MhBvG7RLaLqlyjxMR6of35vt6MVQ+eXMcgn9X/sy0FE= -github.com/SermoDigital/jose v0.9.2-0.20180104203859-803625baeddc/go.mod h1:ARgCUhI1MHQH+ONky/PAtmVHQrP5JlGY0F3poXOp/fA= -github.com/Showmax/go-fqdn v1.0.0 h1:0rG5IbmVliNT5O19Mfuvna9LL7zlHyRfsSvBPZmF9tM= -github.com/Showmax/go-fqdn v1.0.0/go.mod h1:SfrFBzmDCtCGrnHhoDjuvFnKsWjEQX/Q9ARZvOrJAko= -github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/aerospike/aerospike-client-go/v6 v6.13.0 h1:9V5qKtdF2t9hDUKRKU8POUMKtOyw6pkfhHlVI6L32cU= -github.com/aerospike/aerospike-client-go/v6 v6.13.0/go.mod h1:2Syy0n4FKdgJxn0ZCfLfggVdaTXgMaGW6EOlPV6MGG4= -github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= -github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= -github.com/alecthomas/assert/v2 v2.3.0 h1:mAsH2wmvjsuvyBvAmCtm7zFsBlb8mIHx5ySLVdDZXL0= -github.com/alecthomas/assert/v2 v2.3.0/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= -github.com/alecthomas/participle/v2 v2.1.1 h1:hrjKESvSqGHzRb4yW1ciisFJ4p3MGYih6icjJvbsmV8= -github.com/alecthomas/participle/v2 v2.1.1/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= -github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= -github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 h1:ez/4by2iGztzR4L0zgAOR8lTQK9VlyBVVd7G4omaOQs= -github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4 h1:iC9YFYKDGEy3n/FtqJnOkZsene9olVspKmkX5A2YBEo= -github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4/go.mod h1:sCavSAvdzOjul4cEqeVtvlSaSScfNsTQ+46HwlTL1hc= -github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.4 h1:7Q2FEyqxeZeIkwYMwRC3uphxV4i7O2eV4ETe21d6lS4= -github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.4/go.mod h1:5JHVmnHvGzR2wNdgaW1zDLQG8kOC4Uec8ubkMogW7OQ= -github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68 h1:NqugFkGxx1TXSh/pBcU00Y6bljgDPaFdh5MUSeJ7e50= -github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68/go.mod h1:6pb/Qy8c+lqua8cFpEy7g39NRRqOWc3rOwAy8m5Y2BY= -github.com/alibabacloud-go/endpoint-util v1.1.0 h1:r/4D3VSw888XGaeNpP994zDUaxdgTSHBbVfZlzf6b5Q= -github.com/alibabacloud-go/endpoint-util v1.1.0/go.mod h1:O5FuCALmCKs2Ff7JFJMudHs0I5EBgecXXxZRyswlEjE= -github.com/alibabacloud-go/openapi-util v0.1.0 h1:0z75cIULkDrdEhkLWgi9tnLe+KhAFE/r5Pb3312/eAY= -github.com/alibabacloud-go/openapi-util v0.1.0/go.mod h1:sQuElr4ywwFRlCCberQwKRFhRzIyG4QTP/P4y1CJ6Ws= -github.com/alibabacloud-go/sts-20150401/v2 v2.0.1 h1:CevZp0VdG7Q+1J3qwNj+JL7ztKxsL27+tknbdTK9Y6M= -github.com/alibabacloud-go/sts-20150401/v2 v2.0.1/go.mod h1:8wJW1xC4mVcdRXzOvWJYfCCxmvFzZ0VB9iilVjBeWBc= -github.com/alibabacloud-go/tea v1.1.19 h1:Xroq0M+pr0mC834Djj3Fl4ZA8+GGoA0i7aWse1vmgf4= -github.com/alibabacloud-go/tea v1.1.19/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A= -github.com/alibabacloud-go/tea-utils v1.3.1 h1:iWQeRzRheqCMuiF3+XkfybB3kTgUXkXX+JMrqfLeB2I= -github.com/alibabacloud-go/tea-utils v1.3.1/go.mod h1:EI/o33aBfj3hETm4RLiAxF/ThQdSngxrpF8rKUDJjPE= -github.com/alibabacloud-go/tea-utils/v2 v2.0.1 h1:K6kwgo+UiYx+/kr6CO0PN5ACZDzE3nnn9d77215AkTs= -github.com/alibabacloud-go/tea-utils/v2 v2.0.1/go.mod h1:U5MTY10WwlquGPS34DOeomUGBB0gXbLueiq5Trwu0C4= -github.com/alibabacloud-go/tea-xml v1.1.2 h1:oLxa7JUXm2EDFzMg+7oRsYc+kutgCVwm+bZlhhmvW5M= -github.com/alibabacloud-go/tea-xml v1.1.2/go.mod h1:Rq08vgCcCAjHyRi/M7xlHKUykZCEtyBy9+DPF6GgEu8= -github.com/aliyun/aliyun-log-go-sdk v0.1.75 h1:asM0c8NViqoCx6ULqaldE4YnyRq42rU1eqP6/ditzSg= -github.com/aliyun/aliyun-log-go-sdk v0.1.75/go.mod h1:dcQd3FhFu8UI1H48L+YW49ATTWgzGqWz/S/7Bm07gpY= -github.com/aliyun/credentials-go v1.1.2 h1:qU1vwGIBb3UJ8BwunHDRFtAhS6jnQLnde/yk0+Ih2GY= -github.com/aliyun/credentials-go v1.1.2/go.mod h1:ozcZaMR5kLM7pwtCMEpVmQ242suV6qTJya2bDq4X1Tw= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= -github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= -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/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= -github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= -github.com/apache/arrow/go/v15 v15.0.0 h1:1zZACWf85oEZY5/kd9dsQS7i+2G5zVQcbKTHgslqHNA= -github.com/apache/arrow/go/v15 v15.0.0/go.mod h1:DGXsR3ajT524njufqf95822i+KTh+yea1jass9YXgjA= -github.com/apache/pulsar-client-go v0.8.1 h1:UZINLbH3I5YtNzqkju7g9vrl4CKrEgYSx2rbpvGufrE= -github.com/apache/pulsar-client-go v0.8.1/go.mod h1:yJNcvn/IurarFDxwmoZvb2Ieylg630ifxeO/iXpk27I= -github.com/apache/pulsar-client-go/oauth2 v0.0.0-20220120090717-25e59572242e h1:EqiJ0Xil8NmcXyupNqXV9oYDBeWntEIegxLahrTr8DY= -github.com/apache/pulsar-client-go/oauth2 v0.0.0-20220120090717-25e59572242e/go.mod h1:Xee4tgYLFpYcPMcTfBYWE1uKRzeciodGTSEDMzsR6i8= -github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= -github.com/apache/thrift v0.20.0 h1:631+KvYbsBZxmuJjYwhezVsrfc/TbqtZV4QcxOX1fOI= -github.com/apache/thrift v0.20.0/go.mod h1:hOk1BQqcp2OLzGsyVXdfMk7YFlMxK3aoEVhjD06QhB8= -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/ardielle/ardielle-go v1.5.2 h1:TilHTpHIQJ27R1Tl/iITBzMwiUGSlVfiVhwDNGM3Zj4= -github.com/ardielle/ardielle-go v1.5.2/go.mod h1:I4hy1n795cUhaVt/ojz83SNVCYIGsAFAONtv2Dr7HUI= -github.com/ardielle/ardielle-tools v1.5.4/go.mod h1:oZN+JRMnqGiIhrzkRN9l26Cej9dEx4jeNG6A+AdkShk= -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= -github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= -github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aws/aws-sdk-go v1.32.6/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.44.263/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= -github.com/aws/aws-sdk-go v1.53.11 h1:KcmduYvX15rRqt4ZU/7jKkmDxU/G87LJ9MUI0yQJh00= -github.com/aws/aws-sdk-go v1.53.11/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= -github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.27.0 h1:7bZWKoXhzI+mMR/HjdMx8ZCC5+6fY0lS5tr0bbgiLlo= -github.com/aws/aws-sdk-go-v2 v1.27.0/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 h1:x6xsQXGSmW6frevwDA+vi/wqhp1ct18mVXYN08/93to= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2/go.mod h1:lPprDr1e6cJdyYeGXnRaJoP4Md+cDBvi2eOj00BlGmg= -github.com/aws/aws-sdk-go-v2/config v1.18.25/go.mod h1:dZnYpD5wTW/dQF0rRNLVypB396zWCcPiBIvdvSWHEg4= -github.com/aws/aws-sdk-go-v2/config v1.27.16 h1:knpCuH7laFVGYTNd99Ns5t+8PuRjDn4HnnZK48csipM= -github.com/aws/aws-sdk-go-v2/config v1.27.16/go.mod h1:vutqgRhDUktwSge3hrC3nkuirzkJ4E/mLj5GvI0BQas= -github.com/aws/aws-sdk-go-v2/credentials v1.13.24/go.mod h1:jYPYi99wUOPIFi0rhiOvXeSEReVOzBqFNOX5bXYoG2o= -github.com/aws/aws-sdk-go-v2/credentials v1.17.16 h1:7d2QxY83uYl0l58ceyiSpxg9bSbStqBC6BeEeHEchwo= -github.com/aws/aws-sdk-go-v2/credentials v1.17.16/go.mod h1:Ae6li/6Yc6eMzysRL2BXlPYvnrLLBg3D11/AmOjw50k= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3/go.mod h1:4Q0UFP0YJf0NrsEuEYHpM9fTSEVnD16Z3uyEF7J9JGM= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3 h1:dQLK4TjtnlRGb0czOht2CevZ5l6RSyRWAnKeGd7VAFE= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3/go.mod h1:TL79f2P6+8Q7dTsILpiVST+AL9lkF6PPGI167Ny0Cjw= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.15 h1:7Zwtt/lP3KNRkeZre7soMELMGNoBrutx8nobg1jKWmo= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.15/go.mod h1:436h2adoHb57yd+8W+gYPrrA9U/R/SuAuOO42Ushzhw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33/go.mod h1:7i0PF1ME/2eUPFcjkVIwq+DOygHEoK92t5cDqNgYbIw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7 h1:lf/8VTF2cM+N4SLzaYJERKEWAXq8MOMpZfU6wEPWsPk= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7/go.mod h1:4SjkU7QiqK2M9oozyMzfZ/23LmUY+h3oFqhdeP5OMiI= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27/go.mod h1:UrHnn3QV/d0pBZ6QBAEQcqFLf8FAzLmoUfPVIueOvoM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7 h1:4OYVp0705xu8yjdyoWix0r9wPIRXnIzzOoUpQVHIJ/g= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7/go.mod h1:vd7ESTEvI76T2Na050gODNmNU7+OyKrIKroYTu4ABiI= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34/go.mod h1:Etz2dj6UHYuw+Xw830KfzCfWGMzqvUTCjUj5b76GVDc= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5 h1:81KE7vaZzrl7yHBYHVEzYB8sypz11NMOZ40YlWvPxsU= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5/go.mod h1:LIt2rg7Mcgn09Ygbdh/RdIm0rQ+3BNkbP1gyVMFtRK0= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2/go.mod h1:5CsjAbs3NlGQyZNFACh+zztPDI7fU6eW9QsxjfnuBKg= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.7 h1:ZMeFZ5yk+Ek+jNr1+uwCd2tG89t6oTS5yVWpa6yy2es= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.7/go.mod h1:mxV05U+4JiHqIpGqqYXOHLPKUC6bDXC44bsUhNjOEwY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27/go.mod h1:EOwBD4J4S5qYszS5/3DpkejfuK+Z5/1uzICfPaZLtqw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9 h1:Wx0rlZoEJR7JwlSZcHnEa7CNjrSIyVxMFWGAaXy4fJY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9/go.mod h1:aVMHdE0aHO3v+f/iw01fmXV/5DbfQ3Bi9nN7nd9bE9Y= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5 h1:f9RyWNtS8oH7cZlbn+/JNPpjUk5+5fLd5lM9M0i49Ys= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5/go.mod h1:h5CoMZV2VF297/VLhRhO1WF+XYWOzXo+4HsObA4HjBQ= -github.com/aws/aws-sdk-go-v2/service/kinesis v1.27.8 h1:U1X1JiulWfr3lyIpdx0YCVANbF2UoMVhfv3DiDKBKwc= -github.com/aws/aws-sdk-go-v2/service/kinesis v1.27.8/go.mod h1:YxRRhvHMl4YR2OZR3369QQUc2iLqTc3KUCv9ayD8758= -github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1 h1:6cnno47Me9bRykw9AEv9zkXE+5or7jz8TsskTTccbgc= -github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1/go.mod h1:qmdkIIAC+GCLASF7R2whgNrJADz0QZPX+Seiw/i4S3o= -github.com/aws/aws-sdk-go-v2/service/servicediscovery v1.29.10 h1:MNECBvcQiQxwBsVwZKShXRc1mrYawtj39jIxPXWeAQY= -github.com/aws/aws-sdk-go-v2/service/servicediscovery v1.29.10/go.mod h1:/tT3hQYAj8aGFmy4hYqeR8I5R1uFVaIlHwj6jNU+ohs= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.10/go.mod h1:ouy2P4z6sJN70fR3ka3wD3Ro3KezSxU6eKGQI2+2fjI= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.9 h1:aD7AGQhvPuAxlSUfo0CWU7s6FpkbyykMhGYMvlqTjVs= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.9/go.mod h1:c1qtZUWtygI6ZdvKppzCSXsDOq5I4luJPZ0Ud3juFCA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.10/go.mod h1:AFvkxc8xfBe8XA+5St5XIHHrQQtkxqrRincx4hmMHOk= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.3 h1:Pav5q3cA260Zqez42T9UhIlsd9QeypszRPwC9LdSSsQ= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.3/go.mod h1:9lmoVDVLz/yUZwLaQ676TK02fhCu4+PgRSmMaKR1ozk= -github.com/aws/aws-sdk-go-v2/service/sts v1.19.0/go.mod h1:BgQOMsg8av8jset59jelyPW7NoZcZXLVpDsXunGDrk8= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.10 h1:69tpbPED7jKPyzMcrwSvhWcJ9bPnZsZs18NT40JwM0g= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.10/go.mod h1:0Aqn1MnEuitqfsCNyKsdKLhDUOr4txD/g19EfiUqgws= -github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= -github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= -github.com/basgys/goxml2json v1.1.0 h1:4ln5i4rseYfXNd86lGEB+Vi652IsIXIvggKM/BhUKVw= -github.com/basgys/goxml2json v1.1.0/go.mod h1:wH7a5Np/Q4QoECFIU8zTQlZwZkrilY0itPfecMw41Dw= -github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 h1:6df1vn4bBlDDo4tARvBm7l6KA9iVMnE3NWizDeWSrps= -github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3/go.mod h1:CIWtjkly68+yqLPbvwwR/fjNJA/idrtULjZWh2v1ys0= -github.com/beefsack/go-rate v0.0.0-20220214233405-116f4ca011a0/go.mod h1:6YNgTHLutezwnBvyneBbwvB8C82y3dcoOj5EQJIdGXA= -github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= -github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -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-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= -github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/bmatcuk/doublestar/v4 v4.6.1 h1:FH9SifrbvJhnlQpztAx++wlkk70QBf0iBWDwNy7PA4I= -github.com/bmatcuk/doublestar/v4 v4.6.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/bmizerany/perks v0.0.0-20141205001514-d9a9656a3a4b/go.mod h1:ac9efd0D1fsDb3EJvhqgXRbFx7bs2wqZ10HQPeU8U/Q= -github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/briandowns/spinner v1.23.0 h1:alDF2guRWqa/FOZZYWjlMIx2L6H0wyewPxo/CH4Pt2A= -github.com/briandowns/spinner v1.23.0/go.mod h1:rPG4gmXeN3wQV/TsAY4w8lPdIM6RX3yqeBQJSrbXjuE= -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/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= -github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= -github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/checkpoint-restore/go-criu/v5 v5.3.0 h1:wpFFOoomK3389ue2lAb0Boag6XPht5QYpipxmSNL4d8= -github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cihub/seelog v0.0.0-20151216151435-d2c6e5aa9fbf/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= -github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= -github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= -github.com/cilium/ebpf v0.11.0 h1:V8gS/bTCCjX9uUnkUFUpPsksM8n1lXBAvHcpiFk1X2Y= -github.com/cilium/ebpf v0.11.0/go.mod h1:WE7CZAnqOL2RouJ4f1uyNhqr2P4CCvXFIqdRDUgWsVs= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/clbanning/mxj v1.8.4 h1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I= -github.com/clbanning/mxj/v2 v2.5.5 h1:oT81vUeEiQQ/DcHbzSytRngP6Ky9O+L+0Bw0zSJag9E= -github.com/clbanning/mxj/v2 v2.5.5/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 h1:F1EaeKL/ta07PY/k9Os/UFtwERei2/XzGemhpGnBKNg= -github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80= -github.com/cloudfoundry-incubator/uaago v0.0.0-20190307164349-8136b7bbe76e h1:DFYA2+zpeaTPEOizAJuaee2O7YX3UP5tOMjkeXL8iLo= -github.com/cloudfoundry-incubator/uaago v0.0.0-20190307164349-8136b7bbe76e/go.mod h1:8wJCVaTSjT8phXCkbZWAKIB9JU8BEVHbnSbLgkr8WfY= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50 h1:DBmgJDC9dTfkVyGgipamEh2BpGYxScCH1TOF1LL1cXc= -github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50/go.mod h1:5e1+Vvlzido69INQaVO6d87Qn543Xr6nooe9Kz7oBFM= -github.com/containerd/cgroups/v3 v3.0.3 h1:S5ByHZ/h9PMe5IOQoN7E+nMc2UcLEM/V48DGDJ9kip0= -github.com/containerd/cgroups/v3 v3.0.3/go.mod h1:8HBe7V3aWGLFPd/k03swSIsGjZhHI2WzJmticMgVuz0= -github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= -github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= -github.com/containerd/containerd v1.7.15 h1:afEHXdil9iAm03BmhjzKyXnnEBtjaLJefdU7DV0IFes= -github.com/containerd/containerd v1.7.15/go.mod h1:ISzRRTMF8EXNpJlTzyr2XMhN+j9K302C21/+cr3kUnY= -github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= -github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/containerd/ttrpc v1.2.2 h1:9vqZr0pxwOF5koz6N0N3kJ0zDHokrcPxIR/ZR2YFtOs= -github.com/containerd/ttrpc v1.2.2/go.mod h1:sIT6l32Ph/H9cvnJsfXM5drIVzTr5A2flTf1G5tYZak= -github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY= -github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-oidc/v3 v3.10.0 h1:tDnXHnLyiTVyT/2zLDGj09pFPkhND8Gl8lnTRhoEaJU= -github.com/coreos/go-oidc/v3 v3.10.0/go.mod h1:5j11xcw0D3+SGxn6Z/WFADsgcWVMyNAlSQupk0KK3ac= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= -github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= -github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= -github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= -github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= -github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= -github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= -github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE= -github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= -github.com/devigned/tab v0.1.1 h1:3mD6Kb1mUOYeLpJvTVSDwSg5ZsfSxfvxGRTxRsJsITA= -github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= -github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/digitalocean/godo v1.109.0 h1:4W97RJLJSUQ3veRZDNbp1Ol3Rbn6Lmt9bKGvfqYI5SU= -github.com/digitalocean/godo v1.109.0/go.mod h1:R6EmmWI8CT1+fCtjWY9UCB+L5uufuZH13wk3YhxycCs= -github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= -github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= -github.com/dimfeld/httptreemux v5.0.1+incompatible h1:Qj3gVcDNoOthBAqftuD596rm4wg/adLLz5xh5CmpiCA= -github.com/dimfeld/httptreemux v5.0.1+incompatible/go.mod h1:rbUlSV+CCpv/SuqUTP/8Bk2O3LyUV436/yaRGkhP6Z0= -github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= -github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docker/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= -github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= -github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= -github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= -github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= -github.com/dvsekhvalnov/jose2go v1.6.0 h1:Y9gnSnP4qEI0+/uQkHvFXeD2PLPJeXEL+ySMEA2EjTY= -github.com/dvsekhvalnov/jose2go v1.6.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= -github.com/eapache/go-resiliency v1.6.0 h1:CqGDTLtpwuWKn6Nj3uNUdflaq+/kIPsg0gfNzHton30= -github.com/eapache/go-resiliency v1.6.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= -github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 h1:Oy0F4ALJ04o5Qqpdz8XLIpNA3WM/iSIXqxtqo7UGVws= -github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= -github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/elastic/elastic-transport-go/v8 v8.5.0 h1:v5membAl7lvQgBTexPRDBO/RdnlQX+FM9fUVDyXxvH0= -github.com/elastic/elastic-transport-go/v8 v8.5.0/go.mod h1:YLHer5cj0csTzNFXoNQ8qhtGY1GTvSqPnKWKaqQE3Hk= -github.com/elastic/go-docappender/v2 v2.1.2 h1:zkEh+g/CxpJdQR6BqdcApa/A4oRQiiG3iFiIhNCoovs= -github.com/elastic/go-docappender/v2 v2.1.2/go.mod h1:oHi6MsHriWaG8W6T9iyJ/PkEo2+182HIzq+0RRAzzgA= -github.com/elastic/go-elasticsearch/v7 v7.17.10 h1:TCQ8i4PmIJuBunvBS6bwT2ybzVFxxUhhltAs3Gyu1yo= -github.com/elastic/go-elasticsearch/v7 v7.17.10/go.mod h1:OJ4wdbtDNk5g503kvlHLyErCgQwwzmDtaFC4XyOxXA4= -github.com/elastic/go-elasticsearch/v8 v8.13.1 h1:du5F8IzUUyCkzxyHdrO9AtopcG95I/qwi2WK8Kf1xlg= -github.com/elastic/go-elasticsearch/v8 v8.13.1/go.mod h1:DIn7HopJs4oZC/w0WoJR13uMUxtHeq92eI5bqv5CRfI= -github.com/elastic/go-structform v0.0.10 h1:oy08o/Ih2hHTkNcRY/1HhaYvIp5z6t8si8gnCJPDo1w= -github.com/elastic/go-structform v0.0.10/go.mod h1:CZWf9aIRYY5SuKSmOhtXScE5uQiLZNqAFnwKR4OrIM4= -github.com/elastic/go-sysinfo v1.7.1 h1:Wx4DSARcKLllpKT2TnFVdSUJOsybqMYCNQZq1/wO+s0= -github.com/elastic/go-sysinfo v1.7.1/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= -github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= -github.com/elastic/go-windows v1.0.1 h1:AlYZOldA+UJ0/2nBuqWdo90GFCgG9xuyw9SYzGUtJm0= -github.com/elastic/go-windows v1.0.1/go.mod h1:FoVvqWSun28vaDQPbj2Elfc0JahhPB7WQEGa3c814Ss= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= -github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= -github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= -github.com/envoyproxy/go-control-plane v0.12.0 h1:4X+VP1GHd1Mhj6IB5mMeGbLCleqxjletLK6K0rbxyZI= -github.com/envoyproxy/go-control-plane v0.12.0/go.mod h1:ZBTaoJ23lqITozF0M6G4/IragXCQKCnYbmlmtHvwRG0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= -github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= -github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= -github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= -github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= -github.com/euank/go-kmsg-parser v2.0.0+incompatible h1:cHD53+PLQuuQyLZeriD1V/esuG4MuU0Pjs5y6iknohY= -github.com/euank/go-kmsg-parser v2.0.0+incompatible/go.mod h1:MhmAMZ8V4CYH4ybgdRwPr2TU5ThnS43puaKEMpja1uw= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.8.0 h1:lRj6N9Nci7MvzrXuX6HFzU8XjmhPiXPlsKEy1u0KQro= -github.com/evanphx/json-patch/v5 v5.8.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= -github.com/expr-lang/expr v1.16.9 h1:WUAzmR0JNI9JCiF0/ewwHB1gmcGw5wW7nWt8gc6PpCI= -github.com/expr-lang/expr v1.16.9/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= -github.com/facebook/time v0.0.0-20240510113249-fa89cc575891 h1:x6T9k2Jw0IPzSdM2i4tVWmnJ3KJ1fEKwWJ++IzDvPDU= -github.com/facebook/time v0.0.0-20240510113249-fa89cc575891/go.mod h1:2UFAomOuD2vAK1x68czUtCVjAqmyWCEnAXOlmGqf+G0= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= -github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= -github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= -github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/frankban/quicktest v1.11.0/go.mod h1:K+q6oSqb0W0Ininfk863uOk1lMy69l/P6txr3mVT54s= -github.com/frankban/quicktest v1.11.2/go.mod h1:K+q6oSqb0W0Ininfk863uOk1lMy69l/P6txr3mVT54s= -github.com/frankban/quicktest v1.13.0/go.mod h1:qLE0fzW0VuyUAJgPU19zByoIr0HtCHN/r/VLSOOIySU= -github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= -github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= -github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= -github.com/getsentry/sentry-go v0.28.0 h1:7Rqx9M3ythTKy2J6uZLHmc8Sz9OGgIlseuO1iBX/s0M= -github.com/getsentry/sentry-go v0.28.0/go.mod h1:1fQZ+7l7eeJ3wYi82q5Hg8GqAPgefRq+FP/QhafYVgg= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= -github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-faster/city v1.0.1 h1:4WAxSZ3V2Ws4QRDrscLEDcibJY8uf41H6AhXDrNDcGw= -github.com/go-faster/city v1.0.1/go.mod h1:jKcUJId49qdW3L1qKHH/3wPeUstCVpVSXTM6vO3VcTw= -github.com/go-faster/errors v0.7.1 h1:MkJTnDoEdi9pDabt1dpWf7AA8/BaSYZqibYyhZ20AYg= -github.com/go-faster/errors v0.7.1/go.mod h1:5ySTjWFiphBs07IKuiL69nxdfd5+fzh1u7FPGZP2quo= -github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= -github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= -github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-jose/go-jose/v4 v4.0.1 h1:QVEPDE3OluqXBQZDcnNvQrInro2h0e4eqNbnZSWqS6U= -github.com/go-jose/go-jose/v4 v4.0.1/go.mod h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.13.0 h1:OoneCcHKHQ03LfBpoQCUfCluwd2Vt3ohz+kvbJneZAU= -github.com/go-kit/kit v0.13.0/go.mod h1:phqEHMMUbyrCFCTgH48JueqrM3md2HcAZ8N3XE4FKDg= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= -github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= -github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= -github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= -github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= -github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= -github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.22.9 h1:XX2DssF+mQKM2DHsbgZK74y/zj4mo9I99+89xUmuZCE= -github.com/go-openapi/swag v0.22.9/go.mod h1:3/OXnFfnMAwBD099SwYRk7GD3xOrr1iL7d/XNLXVVwE= -github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-resty/resty/v2 v2.12.0 h1:rsVL8P90LFvkUYq/V5BTVe203WfRIU4gvcf+yfzJzGA= -github.com/go-resty/resty/v2 v2.12.0/go.mod h1:o0yGPrkS3lOe1+eFajk6kBW8ScXzwU3hD69/gt2yB/0= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= -github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg= -github.com/go-test/deep v1.1.0/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg= -github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= -github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/gocql/gocql v1.6.0 h1:IdFdOTbnpbd0pDhl4REKQDM+Q0SzKXQ1Yh+YZZ8T/qU= -github.com/gocql/gocql v1.6.0/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8= -github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= -github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= -github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= -github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= -github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= -github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= -github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= -github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= -github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= -github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/cadvisor v0.49.0 h1:1PYeiORXmcFYi609M4Qvq5IzcvcVaWgYxDt78uH8jYA= -github.com/google/cadvisor v0.49.0/go.mod h1:s6Fqwb2KiWG6leCegVhw4KW40tf9f7m+SF1aXiE8Wsk= -github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/flatbuffers v23.5.26+incompatible h1:M9dgRyhJemaM4Sw8+66GHBu8ioaQmyPLg1b8VwK5WJg= -github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= -github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= -github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7 h1:y3N7Bm7Y9/CtpiVkw/ZWj6lSlDF3F74SfKwfTCer72Q= -github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= -github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= -github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.12.4 h1:9gWcmF85Wvq4ryPFvGFaOgPIs1AQX0d0bcbGw4Z96qg= -github.com/googleapis/gax-go/v2 v2.12.4/go.mod h1:KYEYLorsnIGDi/rPC8b5TdlB9kbKoFubselGIoBMCwI= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gophercloud/gophercloud v1.8.0 h1:TM3Jawprb2NrdOnvcHhWJalmKmAmOGgfZElM/3oBYCk= -github.com/gophercloud/gophercloud v1.8.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= -github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= -github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= -github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= -github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= -github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI= -github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gosnmp/gosnmp v1.37.0 h1:/Tf8D3b9wrnNuf/SfbvO+44mPrjVphBhRtcGg22V07Y= -github.com/gosnmp/gosnmp v1.37.0/go.mod h1:GDH9vNqpsD7f2HvZhKs5dlqSEcAS6s6Qp099oZRCR+M= -github.com/grafana/loki/pkg/push v0.0.0-20240514112848-a1b1eeb09583 h1:dN3eF1S5fvVu2l9WoqYSvmNmPK8Uh2vjE4yUsBq80l4= -github.com/grafana/loki/pkg/push v0.0.0-20240514112848-a1b1eeb09583/go.mod h1:lJEF/Wh5MYlmBem6tOYAFObkLsuikfrEf8Iy9AdMPiQ= -github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= -github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grobie/gomemcache v0.0.0-20230213081705-239240bbc445 h1:FlKQKUYPZ5yDCN248M3R7x8yu2E3yEZ0H7aLomE4EoE= -github.com/grobie/gomemcache v0.0.0-20230213081705-239240bbc445/go.mod h1:L69/dBlPQlWkcnU76WgcppK5e4rrxzQdi6LhLnK/ytA= -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 v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= -github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.13.0/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= -github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= -github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= -github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= -github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.28.3 h1:IE06LST/knnCQ+cxcvzyXRF/DetkgGhJoaOFd4l9xkk= -github.com/hashicorp/consul/api v1.28.3/go.mod h1:7AGcUFu28HkgOKD/GmsIGIFzRTmN0L02AE9Thsr2OhU= -github.com/hashicorp/consul/proto-public v0.6.1 h1:+uzH3olCrksXYWAYHKqK782CtK9scfqH+Unlw3UHhCg= -github.com/hashicorp/consul/proto-public v0.6.1/go.mod h1:cXXbOg74KBNGajC+o8RlA502Esf0R9prcoJgiOX/2Tg= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU= -github.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo= -github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= -github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= -github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= -github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-retryablehttp v0.7.4 h1:ZQgVdpTdAL7WpMIwLzCfbalOcSUdkDZnpUv3/+BxzFA= -github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= -github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= -github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= -github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= -github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= -github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= -github.com/hashicorp/nomad/api v0.0.0-20240306004928-3e7191ccb702 h1:fI1LXuBaS1d9z1kmb++Og6YD8uMRwadXorCwE+xgOFA= -github.com/hashicorp/nomad/api v0.0.0-20240306004928-3e7191ccb702/go.mod h1:z71gkJdrkAt/Rl6C7Q79VE7AwJ5lUF+M+fzFTyIHYB0= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= -github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/hectane/go-acl v0.0.0-20190604041725-da78bae5fc95 h1:S4qyfL2sEm5Budr4KVMyEniCy+PbS55651I/a+Kn/NQ= -github.com/hectane/go-acl v0.0.0-20190604041725-da78bae5fc95/go.mod h1:QiyDdbZLaJ/mZP4Zwc9g2QsfaEA4o7XvvgZegSci5/E= -github.com/hetznercloud/hcloud-go/v2 v2.6.0 h1:RJOA2hHZ7rD1pScA4O1NF6qhkHyUdbbxjHgFNot8928= -github.com/hetznercloud/hcloud-go/v2 v2.6.0/go.mod h1:4J1cSE57+g0WS93IiHLV7ubTHItcp+awzeBp5bM9mfA= -github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= -github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= -github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= -github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/influxdata/influxdb-client-go/v2 v2.13.0 h1:ioBbLmR5NMbAjP4UVA5r9b5xGjpABD7j65pI8kFphDM= -github.com/influxdata/influxdb-client-go/v2 v2.13.0/go.mod h1:k+spCbt9hcvqvUiz0sr5D8LolXHqAAOfPw9v/RIRHl4= -github.com/influxdata/influxdb-observability/common v0.5.12 h1:4YwZ+vsodz6VfoiX+ZqVotmnyCa9vCCPksSBK/WLjBs= -github.com/influxdata/influxdb-observability/common v0.5.12/go.mod h1:u+CABnGO/F1IK51pDlZQroh4+igJNo695XrbLGDBhVc= -github.com/influxdata/influxdb-observability/influx2otel v0.5.12 h1:u0lNE3+63rILk4mtmCYsNyczH/1wEXnM+1aBzBe5akk= -github.com/influxdata/influxdb-observability/influx2otel v0.5.12/go.mod h1:bM407XIJYnrJYJ9Q3q2ytDSOyFhiYmGm0Sz1Qf48RPk= -github.com/influxdata/influxdb-observability/otel2influx v0.5.12 h1:t9gmVOOHbZyEAvIYSoO97Tde1KArVtiYdM0/0Dhmuio= -github.com/influxdata/influxdb-observability/otel2influx v0.5.12/go.mod h1:YGsb8xYfjHvcr2y0+Nj7kOHMTw7fWDbAA4g/qJKkvaU= -github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c h1:qSHzRbhzK8RdXOsAdfDgO49TtqC1oZ+acxPrkfTxcCs= -github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU= -github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/influxdata/line-protocol-corpus v0.0.0-20210519164801-ca6fa5da0184/go.mod h1:03nmhxzZ7Xk2pdG+lmMd7mHDfeVOYFyhOgwO61qWU98= -github.com/influxdata/line-protocol-corpus v0.0.0-20210922080147-aa28ccfb8937 h1:MHJNQ+p99hFATQm6ORoLmpUCF7ovjwEFshs/NHzAbig= -github.com/influxdata/line-protocol-corpus v0.0.0-20210922080147-aa28ccfb8937/go.mod h1:BKR9c0uHSmRgM/se9JhFHtTT7JTO67X23MtKMHtZcpo= -github.com/influxdata/line-protocol/v2 v2.0.0-20210312151457-c52fdecb625a/go.mod h1:6+9Xt5Sq1rWx+glMgxhcg2c0DUaehK+5TDcPZ76GypY= -github.com/influxdata/line-protocol/v2 v2.1.0/go.mod h1:QKw43hdUBg3GTk2iC3iyCxksNj7PX9aUSeYOYE/ceHY= -github.com/influxdata/line-protocol/v2 v2.2.1 h1:EAPkqJ9Km4uAxtMRgUubJyqAr6zgWM0dznKMLRauQRE= -github.com/influxdata/line-protocol/v2 v2.2.1/go.mod h1:DmB3Cnh+3oxmG6LOBIxce4oaL4CPj3OmMPgvauXh+tM= -github.com/ionos-cloud/sdk-go/v6 v6.1.11 h1:J/uRN4UWO3wCyGOeDdMKv8LWRzKu6UIkLEaes38Kzh8= -github.com/ionos-cloud/sdk-go/v6 v6.1.11/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= -github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= -github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.6.0 h1:SWJzexBzPL5jb0GEsrPMLIsi/3jOo7RHlzTjcAeDrPY= -github.com/jackc/pgx/v5 v5.6.0/go.mod h1:DNZ/vlrUnhWCoFGxHAG8U2ljioxukquj7utPDgtQdTw= -github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= -github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= -github.com/jaegertracing/jaeger v1.57.0 h1:3wDtUUPs6NRYH7+d+y8MilDkLHdpPrVlQ2wbcsA62bs= -github.com/jaegertracing/jaeger v1.57.0/go.mod h1:p/1fxIU9hKHl7qEhKC72p2ZYVhvvZvNB73y6V7YyuTs= -github.com/jarcoal/httpmock v1.3.1 h1:iUx3whfZWVf3jT01hQTO/Eo5sAYtB2/rqaUuOtpInww= -github.com/jarcoal/httpmock v1.3.1/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg= -github.com/jawher/mow.cli v1.0.4/go.mod h1:5hQj2V8g+qYmLUVWqu4Wuja1pI57M83EChYLVZ0sMKk= -github.com/jawher/mow.cli v1.2.0/go.mod h1:y+pcA3jBAdo/GIZx/0rFjw/K2bVEODP9rfZOfaiq8Ko= -github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= -github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= -github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= -github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= -github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= -github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= -github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= -github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= -github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8= -github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= -github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= -github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= -github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= -github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4= -github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= -github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -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/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA= -github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= -github.com/karrick/godirwalk v1.17.0 h1:b4kY7nqDdioR/6qnbHQyDvmA17u5G1cZ6J+CZXwSWoI= -github.com/karrick/godirwalk v1.17.0/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d/go.mod h1:JJNrCn9otv/2QP4D7SMJBgaleKpOf66PnW6F5WGNRIc= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= -github.com/klauspost/compress v1.10.8/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= -github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= -github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= -github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= -github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= -github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00= -github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leodido/go-syslog/v4 v4.1.0 h1:Wsl194qyWXr7V6DrGWC3xmxA9Ra6XgWO+toNt2fmCaI= -github.com/leodido/go-syslog/v4 v4.1.0/go.mod h1:eJ8rUfDN5OS6dOkCOBYlg2a+hbAg6pJa99QXXgMrd98= -github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b h1:11UHH39z1RhZ5dc4y4r/4koJo6IYFgTRMe/LlwRTEw0= -github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b/go.mod h1:WZxr2/6a/Ar9bMDc2rN/LJrE/hF6bXE4LPyDSIxwAfg= -github.com/leoluk/perflib_exporter v0.2.1 h1:/3/ut1k/jFt5p4ypjLZKDHDqlXAK6ERZPVWtwdI389I= -github.com/leoluk/perflib_exporter v0.2.1/go.mod h1:MinSWm88jguXFFrGsP56PtleUb4Qtm4tNRH/wXNXRTI= -github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2ttpEmkA4aQ3j4u9dStX2t4M8UM6qqNsG8= -github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is= -github.com/lestrrat-go/strftime v1.0.6 h1:CFGsDEt1pOpFNU+TJB0nhz9jl+K0hZSLE205AhTIGQQ= -github.com/lestrrat-go/strftime v1.0.6/go.mod h1:f7jQKgV5nnJpYgdEasS+/y7EsTb8ykN2z68n3TtcTaw= -github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= -github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lightstep/go-expohisto v1.0.0 h1:UPtTS1rGdtehbbAF7o/dhkWLTDI73UifG8LbfQI7cA4= -github.com/lightstep/go-expohisto v1.0.0/go.mod h1:xDXD0++Mu2FOaItXtdDfksfgxfV0z1TMPa+e/EUd0cs= -github.com/linkedin/goavro/v2 v2.9.8 h1:jN50elxBsGBDGVDEKqUlDuU1cFwJ11K/yrJCBMe/7Wg= -github.com/linkedin/goavro/v2 v2.9.8/go.mod h1:UgQUb2N/pmueQYH9bfqFioWxzYCZXSfF8Jw03O5sjqA= -github.com/linode/linodego v1.33.0 h1:cX2FYry7r6CA1ujBMsdqiM4VhvIQtnWsOuVblzfBhCw= -github.com/linode/linodego v1.33.0/go.mod h1:dSJJgIwqZCF5wnpuC6w5cyIbRtcexAm7uVvuJopGB40= -github.com/logicmonitor/lm-data-sdk-go v1.3.0 h1:Obrexk35IKupFQezngkesR/kMfHQdAEUR1zYbJrOrzg= -github.com/logicmonitor/lm-data-sdk-go v1.3.0/go.mod h1:nIHr4uOPfg6AM7mG1rewg3L4O3rfge34o7UYB7joBM4= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c h1:VtwQ41oftZwlMnOEbMWQtSEUgU64U4s+GHk7hZK+jtY= -github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE= -github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= -github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-ieproxy v0.0.1 h1:qiyop7gCflfhwCzGyeT0gro3sF9AIg9HU98JORTkqfI= -github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= -github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04nTH68g= -github.com/maxatome/go-testdeep v1.12.0/go.mod h1:lPZc/HAcJMP92l7yI6TRz1aZN5URwUBUAfUNvrclaNM= -github.com/microsoft/ApplicationInsights-Go v0.4.4 h1:G4+H9WNs6ygSCe6sUyxRc2U81TI5Es90b2t/MwX5KqY= -github.com/microsoft/ApplicationInsights-Go v0.4.4/go.mod h1:fKRUseBqkw6bDiXTs3ESTiU/4YTIHsQS4W3fP2ieF4U= -github.com/microsoft/go-mssqldb v1.7.1 h1:KU/g8aWeM3Hx7IMOFpiwYiUkU+9zeISb4+tx3ScVfsM= -github.com/microsoft/go-mssqldb v1.7.1/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.58 h1:ca2Hdkz+cDg/7eNF6V56jjzuZ4aCAE+DbVkILdQWG/4= -github.com/miekg/dns v1.1.58/go.mod h1:Ypv+3b/KadlvW9vJfXOTf300O4UqaHFzFCuHz+rPkBY= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible h1:aKW/4cBs+yK6gpqU3K/oIwk9Q/XICqd3zOX/UFuvqmk= -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= -github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= -github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/hashstructure v1.1.0 h1:P6P1hdjqAAknpY/M1CGipelZgp+4y9ja9kmUZPXP+H0= -github.com/mitchellh/hashstructure v1.1.0/go.mod h1:xUDAozZz0Wmdiufv0uyhnHkUTN6/6d8ulp4AwfLKrmA= -github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4= -github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c h1:cqn374mizHuIWj+OSJCajGr/phAmuMug9qIX3l9CflE= -github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= -github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= -github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= -github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= -github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= -github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= -github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= -github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= -github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= -github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/mongodb-forks/digest v1.1.0 h1:7eUdsR1BtqLv0mdNm4OXs6ddWvR4X2/OsLwdKksrOoc= -github.com/mongodb-forks/digest v1.1.0/go.mod h1:rb+EX8zotClD5Dj4NdgxnJXG9nwrlx3NWKJ8xttz1Dg= -github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/montanaflynn/stats v0.7.0 h1:r3y12KyNxj/Sb/iOE46ws+3mS1+MZca1wlHQFPsY/JU= -github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mostynb/go-grpc-compression v1.2.2 h1:XaDbnRvt2+1vgr0b/l0qh4mJAfIxE0bKXtz2Znl3GGI= -github.com/mostynb/go-grpc-compression v1.2.2/go.mod h1:GOCr2KBxXcblCuczg3YdLQlcin1/NfyDA348ckuCH6w= -github.com/mrunalp/fileutils v0.5.1 h1:F+S7ZlNKnrwHfSwdlgNSkKo67ReVf8o9fel6C3dkm/Q= -github.com/mrunalp/fileutils v0.5.1/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= -github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= -github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nginxinc/nginx-prometheus-exporter v0.11.0 h1:21xjnqNgxtni2jDgAQ90bl15uDnrTreO9sIlu1YsX/U= -github.com/nginxinc/nginx-prometheus-exporter v0.11.0/go.mod h1:GdyHnWAb8q8OW1Pssrrqbcqra0SH0Vn6UXICMmyWkw8= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= -github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= -github.com/oapi-codegen/runtime v1.0.0 h1:P4rqFX5fMFWqRzY9M/3YF9+aPSPPB06IzP2P7oOxrWo= -github.com/oapi-codegen/runtime v1.0.0/go.mod h1:LmCUMQuPB4M/nLXilQXhHw+BLZdDb18B34OO356yJ/A= -github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.14.0 h1:vSmGj2Z5YPb9JwCWT6z6ihcUvDhuXLc3sJiqd3jMKAY= -github.com/onsi/ginkgo/v2 v2.14.0/go.mod h1:JkUdW7JkN0V6rFvsHcJ478egV3XH9NxpD27Hal/PhZw= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= -github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= -github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= -github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= -github.com/opencontainers/runc v1.1.12 h1:BOIssBaW1La0/qbNZHXOOa71dZfZEQOzW7dqQf3phss= -github.com/opencontainers/runc v1.1.12/go.mod h1:S+lQwSfncpBha7XTy/5lBwWgm5+y5Ma/O44Ekby9FK8= -github.com/opencontainers/runtime-spec v1.1.0-rc.3 h1:l04uafi6kxByhbxev7OWiuUv0LZxEsYUfDWZ6bztAuU= -github.com/opencontainers/runtime-spec v1.1.0-rc.3/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/selinux v1.11.0 h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaLpt7tQ7oU= -github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec= -github.com/opensearch-project/opensearch-go/v2 v2.3.0 h1:nQIEMr+A92CkhHrZgUhcfsrZjibvB3APXf2a1VwCmMQ= -github.com/opensearch-project/opensearch-go/v2 v2.3.0/go.mod h1:8LDr9FCgUTVoT+5ESjc2+iaZuldqE+23Iq0r1XeNue8= -github.com/openshift/api v0.0.0-20180801171038-322a19404e37 h1:05irGU4HK4IauGGDbsk+ZHrm1wOzMLYjMlfaiqMrBYc= -github.com/openshift/api v0.0.0-20180801171038-322a19404e37/go.mod h1:dh9o4Fs58gpFXGSYfnVxGR9PnV53I8TW84pQaJDdGiY= -github.com/openshift/api v0.0.0-20210521075222-e273a339932a/go.mod h1:izBmoXbUu3z5kUa4FjZhvekTsyzIWiOoaIgJiZBBMQs= -github.com/openshift/build-machinery-go v0.0.0-20210423112049-9415d7ebd33e/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE= -github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142 h1:ZHRIMCFIJN1p9LsJt4HQ+akDrys4PrYnXzOWI5LK03I= -github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142/go.mod h1:fjS8r9mqDVsPb5td3NehsNOAWa4uiFkYEfVZioQ2gH0= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/openzipkin/zipkin-go v0.4.3 h1:9EGwpqkgnwdEIJ+Od7QVSEIH+ocmm5nPat0G7sjsSdg= -github.com/openzipkin/zipkin-go v0.4.3/go.mod h1:M9wCJZFWCo2RiY+o1eBCEMe0Dp2S5LDHcMZmk3RmK7c= -github.com/outcaste-io/ristretto v0.2.1 h1:KCItuNIGJZcursqHr3ghO7fc5ddZLEHspL9UR0cQM64= -github.com/outcaste-io/ristretto v0.2.1/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= -github.com/ovh/go-ovh v1.4.3 h1:Gs3V823zwTFpzgGLZNI6ILS4rmxZgJwJCz54Er9LwD0= -github.com/ovh/go-ovh v1.4.3/go.mod h1:AkPXVtgwB6xlKblMjRKJJmjRp+ogrE7fz2lVgcQY8SY= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= -github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= -github.com/paulmach/orb v0.11.1 h1:3koVegMC4X/WeiXYz9iswopaTwMem53NzTJuTF20JzU= -github.com/paulmach/orb v0.11.1/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU= -github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= -github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= -github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= -github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= -github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM= -github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= -github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= -github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= -github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pkg/sftp v1.13.6 h1:JFZT4XbOU7l77xGSpOdW+pwIMqP044IyjXX6FGyEKFo= -github.com/pkg/sftp v1.13.6/go.mod h1:tz1ryNURKu77RL+GuCzmoJYxQczL3wLNNpPWagdg4Qk= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c h1:NRoLoZvkBTKvR5gQLgA3e0hqjkY9u1wm+iOL45VN/qI= -github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8cTqKc= -github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.31.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= -github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e h1:UmqAuY2OyDoog8+l5FybViJE5B2r+UxVGCUwFTsY5AA= -github.com/prometheus/prometheus v0.51.2-0.20240405174432-b4a973753c6e/go.mod h1:+0ld+ozir7zWFcHA2vVpWAKxXakIioEjPPNOqH+J3ZA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/redis/go-redis/v9 v9.5.1 h1:H1X4D3yHPaYrkL5X06Wh6xNVM/pX0Ft4RV0vMGvLBh8= -github.com/redis/go-redis/v9 v9.5.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M= -github.com/relvacode/iso8601 v1.4.0 h1:GsInVSEJfkYuirYFxa80nMLbH2aydgZpIf52gYZXUJs= -github.com/relvacode/iso8601 v1.4.0/go.mod h1:FlNp+jz+TXpyRqgmM7tnzHHzBnz776kmAH2h3sZCn0I= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= -github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= -github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= -github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= -github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= -github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= -github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= -github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM= -github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.25 h1:/8rfZAdFfafRXOgz+ZpMZZWZ5pYggCY9t7e/BvjaBHM= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.25/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= -github.com/scalyr/dataset-go v0.18.0 h1:CTv7kk/FGdiicTWo3h1brFusHD1yjhVGINFamP8uukw= -github.com/scalyr/dataset-go v0.18.0/go.mod h1:4x0JK5X0UdhZ2TEO3kHu9pTELDRc3WsrBBwQfkOPZKc= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646 h1:RpforrEYXWkmGwJHIGnLZ3tTWStkjVVstwzNGqxX2Ds= -github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= -github.com/secure-systems-lab/go-securesystemslib v0.7.0 h1:OwvJ5jQf9LnIAS83waAjPbcMsODrTQUpJ02eNLUoxBg= -github.com/secure-systems-lab/go-securesystemslib v0.7.0/go.mod h1:/2gYnlnHVQ6xeGtfIqFy7Do03K4cdCY0A/GlJLDKLHI= -github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= -github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= -github.com/shirou/gopsutil/v3 v3.22.12/go.mod h1:Xd7P1kwZcp5VW52+9XsirIKd/BROzbb2wdX3Kqlz9uI= -github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= -github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= -github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= -github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= -github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= -github.com/shoenig/test v1.7.1 h1:UJcjSAI3aUKx52kfcfhblgyhZceouhvvs3OYdWgn+PY= -github.com/shoenig/test v1.7.1/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI= -github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= -github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/signalfx/com_signalfx_metrics_protobuf v0.0.3 h1:32k2QLgsKhcEs55q4REPKyIadvid5FPy2+VMgvbmKJ0= -github.com/signalfx/com_signalfx_metrics_protobuf v0.0.3/go.mod h1:gJrXWi7wSGXfiC7+VheQaz+ypdCt5SmZNL+BRxUe7y4= -github.com/signalfx/sapm-proto v0.14.0 h1:KWh3I5E4EkelB19aP1/54Ik8khSioC/RVRW/riOfRGg= -github.com/signalfx/sapm-proto v0.14.0/go.mod h1:Km6PskZh966cqNoUn3AmRyGRix5VfwnxVBvn2vjRC9U= -github.com/sijms/go-ora/v2 v2.8.19 h1:7LoKZatDYGi18mkpQTR/gQvG9yOdtc7hPAex96Bqisc= -github.com/sijms/go-ora/v2 v2.8.19/go.mod h1:EHxlY6x7y9HAsdfumurRfTd+v8NrEOTR3Xl4FWlH6xk= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/snowflakedb/gosnowflake v1.10.1-0.20240509141315-5570db2126fe h1:tyqmtuppkCBKehjrsrGgcO7xsNBEGWgIlgm9fq/4X4U= -github.com/snowflakedb/gosnowflake v1.10.1-0.20240509141315-5570db2126fe/go.mod h1:hvc58mU03qg78mSz5z17/qnzI56hOdYYK2txWbM0hN0= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= -github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= -github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= -github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= -github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= -github.com/stormcat24/protodep v0.1.8 h1:FOycjjkjZiastf21aRoCjtoVdhsoBE8mZ0RvY6AHqFE= -github.com/stormcat24/protodep v0.1.8/go.mod h1:6OoSZD5GGomKfmH1LvfJxNIRvYhewFXH5+eNv8h4wOM= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= -github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/tedsuo/ifrit v0.0.0-20180802180643-bea94bb476cc/go.mod h1:eyZnKCc955uh98WQvzOm0dgAeLnf2O0Rz0LPoC5ze+0= -github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.931 h1:3kcyl2ZLEWH5pHlUfw1lNXbJ95WUJN1pzfYoOhAajZc= -github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.931/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= -github.com/testcontainers/testcontainers-go v0.31.0 h1:W0VwIhcEVhRflwL9as3dhY6jXjVCA27AkmbnZ+UTh3U= -github.com/testcontainers/testcontainers-go v0.31.0/go.mod h1:D2lAoA0zUFiSY+eAflqK5mcUx/A5hrrORaEQrd0SefI= -github.com/tg123/go-htpasswd v1.2.2 h1:tmNccDsQ+wYsoRfiONzIhDm5OkVHQzN3w4FOBAlN6BY= -github.com/tg123/go-htpasswd v1.2.2/go.mod h1:FcIrK0J+6zptgVwK1JDlqyajW/1B4PtuJ/FLWl7nx8A= -github.com/tidwall/gjson v1.10.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.14.3 h1:9jvXn7olKEHU1S9vwoMGliaT8jq1vJ7IH/n9zD9Dnlw= -github.com/tidwall/gjson v1.14.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= -github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tidwall/tinylru v1.1.0 h1:XY6IUfzVTU9rpwdhKUF6nQdChgCdGjkMfLzbWyiau6I= -github.com/tidwall/tinylru v1.1.0/go.mod h1:3+bX+TJ2baOLMWTnlyNWHh4QMnFyARg2TLTQ6OFbzw8= -github.com/tidwall/wal v1.1.7 h1:emc1TRjIVsdKKSnpwGBAcsAGg0767SvUk8+ygx7Bb+4= -github.com/tidwall/wal v1.1.7/go.mod h1:r6lR1j27W9EPalgHiB7zLJDYu3mzW5BQP5KrzBpYY/E= -github.com/tilinna/clock v1.1.0 h1:6IQQQCo6KoBxVudv6gwtY8o4eDfhHo8ojA5dP0MfhSs= -github.com/tilinna/clock v1.1.0/go.mod h1:ZsP7BcY7sEEz7ktc0IVy8Us6boDrK8VradlKRUGfOao= -github.com/tinylib/msgp v1.1.9 h1:SHf3yoO2sGA0veCJeCBYLHuttAVFHGm2RHgNodW7wQU= -github.com/tinylib/msgp v1.1.9/go.mod h1:BCXGB54lDD8qUEPmiG0cQQUANC4IUQyB2ItS2UDlO/k= -github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= -github.com/tj/assert v0.0.3/go.mod h1:Ne6X72Q+TB1AteidzQncjw9PabbMp4PBMZ1k+vd1Pvk= -github.com/tjfoc/gmsm v1.3.2 h1:7JVkAn5bvUJ7HtU08iW6UiD+UTmJTIToHCfeFzkcCxM= -github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w= -github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20200122045848-3419fae592fc/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ= -github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= -github.com/vincent-petithory/dataurl v1.0.0 h1:cXw+kPto8NLuJtlMsI152irrVw9fRDX8AbShPRpg2CI= -github.com/vincent-petithory/dataurl v1.0.0/go.mod h1:FHafX5vmDzyP+1CQATJn7WFKc9CvnvxyvZy6I1MrG/U= -github.com/vishvananda/netlink v1.2.1-beta.2 h1:Llsql0lnQEbHj0I1OuKyp8otXp0r3q0mPkuhwHfStVs= -github.com/vishvananda/netlink v1.2.1-beta.2/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA= -github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= -github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= -github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= -github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= -github.com/vmware/go-vmware-nsxt v0.0.0-20230223012718-d31b8a1ca05e h1:Vu41Q0Pv3yMdd+tcDW6QeEUIK2L+9ZrPrq8NAMrKSLc= -github.com/vmware/go-vmware-nsxt v0.0.0-20230223012718-d31b8a1ca05e/go.mod h1:aRq5pxwgdJpAuP97SCjX1+Db32z/b0dggQ07FDF+fqE= -github.com/vmware/govmomi v0.36.3 h1:1Ng3CBNQVbFjCQbKtfsewy5o3dFa+EoTjqeThVISUBc= -github.com/vmware/govmomi v0.36.3/go.mod h1:mtGWtM+YhTADHlCgJBiskSRPOZRsN9MSjPzaZLte/oQ= -github.com/vultr/govultr/v2 v2.17.2 h1:gej/rwr91Puc/tgh+j33p/BLR16UrIPnSr+AIwYWZQs= -github.com/vultr/govultr/v2 v2.17.2/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI= -github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= -github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= -github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= -github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= -github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= -github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= -github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yuin/gopher-lua v0.0.0-20220504180219-658193537a64 h1:5mLPGnFdSsevFRFc9q3yYbBkB6tsm4aCwwQV/j1JQAQ= -github.com/yuin/gopher-lua v0.0.0-20220504180219-658193537a64/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= -github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= -github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= -github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -github.com/zorkian/go-datadog-api v2.30.0+incompatible h1:R4ryGocppDqZZbnNc5EDR8xGWF/z/MxzWnqTUijDQes= -github.com/zorkian/go-datadog-api v2.30.0+incompatible/go.mod h1:PkXwHX9CUQa/FpB9ZwAD45N1uhCW4MT/Wj7m36PbKss= -go.einride.tech/aip v0.67.1 h1:d/4TW92OxXBngkSOwWS2CH5rez869KpKMaN44mdxkFI= -go.einride.tech/aip v0.67.1/go.mod h1:ZGX4/zKw8dcgzdLsrvpOOGxfxI2QSk12SlP7d6c0/XI= -go.elastic.co/apm/module/apmelasticsearch/v2 v2.6.0 h1:ukMcwyMaDXsS1dRK2qRYXT2AsfwaUy74TOOYCqkWJow= -go.elastic.co/apm/module/apmelasticsearch/v2 v2.6.0/go.mod h1:YpfiTTrqX5LB/CKBwX89oDCBAxuLJTFv40gcfxJyehM= -go.elastic.co/apm/module/apmhttp/v2 v2.6.0 h1:s8UeNFQmVBCNd4eoz7KDD9rEFhQC0HeUFXz3z9gpAmQ= -go.elastic.co/apm/module/apmhttp/v2 v2.6.0/go.mod h1:D0GLppLuI0Ddwvtl595GUxRgn6Z8L5KaDFVMv2H3GK0= -go.elastic.co/apm/module/apmzap/v2 v2.6.0 h1:R/iVORzGu3F9uM43iEVHD0nwiRo59O0bIXdayKsgayQ= -go.elastic.co/apm/module/apmzap/v2 v2.6.0/go.mod h1:B3i/8xRkqLgi6zNuV+Bp7Pt4cutaOObvrVSa7wUTAPw= -go.elastic.co/apm/v2 v2.6.0 h1:VieBMLQFtXua2YxpYxaSdYGnmmxhLT46gosI5yErJgY= -go.elastic.co/apm/v2 v2.6.0/go.mod h1:33rOXgtHwbgZcDgi6I/GtCSMZQqgxkHC0IQT3gudKvo= -go.elastic.co/fastjson v1.3.0 h1:hJO3OsYIhiqiT4Fgu0ZxAECnKASbwgiS+LMW5oCopKs= -go.elastic.co/fastjson v1.3.0/go.mod h1:K9vDh7O0ODsVKV2B5e2XYLY277QZaCbB3tS1SnARvko= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.10 h1:+BqfJTcCzTItrop8mq/lbzL8wSGtj94UO/3U31shqG0= -go.etcd.io/bbolt v1.3.10/go.mod h1:bK3UQLPJZly7IlNmV7uVHJDxfe5aK9Ll93e/74Y9oEQ= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.mongodb.org/atlas v0.36.0 h1:m05S3AO7zkl+bcG1qaNsEKBnAqnKx2FDwLooHpIG3j4= -go.mongodb.org/atlas v0.36.0/go.mod h1:nfPldE9dSama6G2IbIzmEza02Ly7yFZjMMVscaM0uEc= -go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= -go.mongodb.org/mongo-driver v1.15.0 h1:rJCKC8eEliewXjZGf0ddURtl7tTVy1TK3bfl0gkUSLc= -go.mongodb.org/mongo-driver v1.15.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/configgrpc v0.102.0 h1:cQi5HwpkHvrZJUxZjoGXkWpAuK+gEyp/1Zjn0BrkvmQ= -go.opentelemetry.io/collector/config/configgrpc v0.102.0/go.mod h1:ASpBXzDWLiDGlG8iRFovU5R4LhAefoC4ajm+qIdslOw= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/confignet v0.102.0 h1:+wQevJ/iBnPxL+roY7WWnAjMxB8v4M5QrS3+0iEmauw= -go.opentelemetry.io/collector/config/confignet v0.102.0/go.mod h1:pfOrCTfSZEB6H2rKtx41/3RN4dKs+X2EKQbw3MGRh0E= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0 h1:8Ne/oL6M4kMWK0P3FKV9EduQa+1UOGyVAnFHfSo4c1A= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.0/go.mod h1:Xj4Ld/RriP/Bj+5oPpaYJsLNs2wWRDN2TvzX3Lbi6+M= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0 h1:o1iKqN+oM+TZqHoGdnKw1Am2BQlIGCYbxCRzU8T3jbM= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.0/go.mod h1:JpCemLtL/sXQ2Rk3Bx7OPPA7Qt/9NVH91q0bR655gSo= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0 h1:SfASE6lxXjrmYj/UibcWdOiFWvRG0zt4hJgenloEhlY= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0/go.mod h1:+Ku0Fvdb5f6e9UkfqJXAV5FaUJVxxg6Ykfx7Js8y+V4= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0 h1:GwJQTXs7pYPUv/fVf+0nBgsJdlrTuY/PfwQ/TRA/sIk= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.0/go.mod h1:PGE3DcRgqYWWC2cq2hYZoET1d3Q8JZyPNmgvqXPFWEU= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0 h1:zdYZLiHHtDf4Kk9WU7mW9dW6WAXtBF54I5jmTMRJtiw= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.0/go.mod h1:yFsgUM0PbUJkPlbpJfOG6da+YiF0Z80tv7YcnL3qwv4= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0 h1:Y4H+GaCQl2URp9mEJMV5CYOhw+erONqNyvtFoKQfIoA= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.0/go.mod h1:g1RjfVD0gHAf/mPOIs3zBoKBeuDsN+rc5x0lZtgA8tI= -go.opentelemetry.io/collector/connector v0.102.0 h1:IvAsVfYRxP0ajmKbUovF8qugkcUtHq6RuYNtjcMa63E= -go.opentelemetry.io/collector/connector v0.102.0/go.mod h1:f4M7wZ/9+XtgTE0fivBFH3WlwntaEd0qFFA0giFkdnY= -go.opentelemetry.io/collector/connector/forwardconnector v0.102.0 h1:g68oHc8sRQ34gIWkq4S/zYS3x0x4PCC3SpC3f3BsM0M= -go.opentelemetry.io/collector/connector/forwardconnector v0.102.0/go.mod h1:ZqgFEDwgdRvoDkA5wH3A/d4ox2KTk+UNKLAHLTvGmPI= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/exporter/debugexporter v0.102.0 h1:b8z8EHdb3Q4f1A/lr6zP9aVv+7HTsouV0XCR8zb+R4w= -go.opentelemetry.io/collector/exporter/debugexporter v0.102.0/go.mod h1:fuFR9OIDtNe/ZGUp1YwrO2t0jy1/AIi4P93e+OoMCWA= -go.opentelemetry.io/collector/exporter/loggingexporter v0.102.0 h1:wtRMOD8m4vJGRc8DNwzEp+q7cc37/VIgxLO4Gguq6c4= -go.opentelemetry.io/collector/exporter/loggingexporter v0.102.0/go.mod h1:SA2/8sJ/T9g6Sk444oUOoyw2KhERrie8mvRM3z6fC8k= -go.opentelemetry.io/collector/exporter/otlpexporter v0.102.0 h1:Nz2ULE5JfDj/houoV+VYSXTWP3/54/kCXH26WjJUNjI= -go.opentelemetry.io/collector/exporter/otlpexporter v0.102.0/go.mod h1:jaMS+3T8lwFc0jEjbqqOC+ArTwpGzR5De8u/jPncyKM= -go.opentelemetry.io/collector/exporter/otlphttpexporter v0.102.0 h1:ayoDBhSkXPrHO/L9MQKhZA/OCDZaOMEfosm+KMw4LBA= -go.opentelemetry.io/collector/exporter/otlphttpexporter v0.102.0/go.mod h1:9SN1giFZMQD0cWqYaBbUIjTnAI7/pWfEBwLosfHwWuY= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/extension/ballastextension v0.102.0 h1:p4gIucFZlTbV4VJ0zxUi8bkQFHnBCimYCe+nZwuPoHk= -go.opentelemetry.io/collector/extension/ballastextension v0.102.0/go.mod h1:hymqiVdV2Fu40lrXk8jm3uQsIFiUu2Fb8ptSzl5Emzw= -go.opentelemetry.io/collector/extension/zpagesextension v0.102.0 h1:BPq98py8nwzaV7KAsxt4ZZAF9LiSRu7ZjHNGavFNyKo= -go.opentelemetry.io/collector/extension/zpagesextension v0.102.0/go.mod h1:P86HW3x3epDS5F4yP0gAvsZiw4xxP1OupTEx2o6UqjY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/filter v0.102.0 h1:2K4Q/l4b+tglMAQmxpscuCr/juyozyPx17Q6Dfm2FwU= -go.opentelemetry.io/collector/filter v0.102.0/go.mod h1:zDVjFCeeVct7hYwejzx+aRC1dbHaPsvv/Ob1SvCiQjE= -go.opentelemetry.io/collector/otelcol v0.102.0 h1:HuE+ok4iUjOrmYhQBSWpG5kBTVhcA24ljPL4pBERZ5E= -go.opentelemetry.io/collector/otelcol v0.102.0/go.mod h1:w8pCRu2nM/jAkLlEAS6ccKtJv5ylUQe6Ugl98zzTfyE= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/processor v0.102.0 h1:JsjTlpBRmoSYxcu3cAbKBchOmL6aNUxLa03ZkWIqZr8= -go.opentelemetry.io/collector/processor v0.102.0/go.mod h1:IaCSDcfy75uQTaOM+LgR1bMf/bUw2eFfzn20uvWYfLQ= -go.opentelemetry.io/collector/processor/batchprocessor v0.102.0 h1:lJSIMwip+Po5jOF/4dpx6c/3N45KJTr/UZoT086T4mI= -go.opentelemetry.io/collector/processor/batchprocessor v0.102.0/go.mod h1:e71Y6SnrCjD19dPjxWWi/kXa5tb0J8rC+9xl/72mLo4= -go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.102.0 h1:osoITPX0RITC8gJkyaNC6rqSKFl9wCeOqagjdNZUL70= -go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.102.0/go.mod h1:2OVM2IJOWVdxkOOt0WCyQSMv2T19OSKNIy1KCqHGXyY= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0 h1:eLc+AK0IQDDysrMt3SLwKaOFIjEwdO8ipwSck3+TUXE= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0/go.mod h1:p9yeFJktNrpwV9ATvaWeZwCMvVkVWnrfbJ4RHI/RS/I= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/collector/service v0.102.0 h1:B5nfyQZF7eB/y+yucl9G/7VsusbXixYXWingXn7VszM= -go.opentelemetry.io/collector/service v0.102.0/go.mod h1:c+0n0DfQeCjgrdplNHYwYbG/5aupTZVYU/50nMQraoc= -go.opentelemetry.io/contrib/config v0.7.0 h1:b1rK5tGTuhhPirJiMxOcyQfZs76j2VapY6ODn3b2Dbs= -go.opentelemetry.io/contrib/config v0.7.0/go.mod h1:8tdiFd8N5etOi3XzBmAoMxplEzI3TcL8dU5rM5/xcOQ= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 h1:vS1Ao/R55RNV4O7TA2Qopok8yN+X0LIP6RVWLFkprck= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0/go.mod h1:BMsdeOxN04K0L5FNUBfjFdvwWGNe/rkmSwH4Aelu/X0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/contrib/propagators/b3 v1.27.0 h1:IjgxbomVrV9za6bRi8fWCNXENs0co37SZedQilP2hm0= -go.opentelemetry.io/contrib/propagators/b3 v1.27.0/go.mod h1:Dv9obQz25lCisDvvs4dy28UPh974CxkahRDUPsY7y9E= -go.opentelemetry.io/contrib/zpages v0.52.0 h1:MPgkMy0Cp3O5EdfVXP0ss3ujhEibysTM4eszx7E7d+E= -go.opentelemetry.io/contrib/zpages v0.52.0/go.mod h1:fqG5AFdoYru3A3DnhibVuaaEfQV2WKxE7fYE1jgDRwk= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/bridge/opencensus v1.27.0 h1:ao9aGGHd+G4YfjBpGs6vbkvt5hoC67STlJA9fCnOAcs= -go.opentelemetry.io/otel/bridge/opencensus v1.27.0/go.mod h1:uRvWtAAXzyVOST0WMPX5JHGBaAvBws+2F8PcC5gMnTk= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 h1:bFgvUr3/O4PHj3VQcFEuYKvRZJX1SJDQ+11JXuSB3/w= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0/go.mod h1:xJntEd2KL6Qdg5lwp97HMLQDVeAhrYxmzFseAMDPQ8I= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 h1:CIHWikMsN3wO+wq1Tp5VGdVRTcON+DmOJSfDjXypKOc= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0/go.mod h1:TNupZ6cxqyFEpLXAZW7On+mLFL0/g0TE3unIYL91xWc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0 h1:/jlt1Y8gXWiHG9FBx6cJaIC5hYx5Fe64nC8w5Cylt/0= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0/go.mod h1:bmToOGOBZ4hA9ghphIc1PAf66VA8KOtsuy3+ScStG20= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 h1:/0YaXu3755A/cFbtXp+21lkXgI0QE5avTWA2HjU9/WE= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0/go.mod h1:m7SFxp0/7IxmJPLIY3JhOcU9CoFzDaCPL6xxQIxhA+o= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= -go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= -go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/dig v1.17.0 h1:5Chju+tUvcC+N7N6EV08BJz41UZuO3BmHcN4A287ZLI= -go.uber.org/dig v1.17.0/go.mod h1:rTxpf7l5I0eBTlE6/9RL+lDybC7WFwY2QH55ZSjy1mU= -go.uber.org/fx v1.18.2 h1:bUNI6oShr+OVFQeU8cDNbnN7VFsu+SsjHzUF51V/GAU= -go.uber.org/fx v1.18.2/go.mod h1:g0V1KMQ66zIRk8bLu3Ea5Jt2w/cHlOIp4wdRsgh0JaY= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= -go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= -go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.14.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= -go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= -golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= -golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= -golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= -golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190529164535-6a60838ec259/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -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-20191025021431-6c3a3bfe00ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/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= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -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-20190614205625-5aca471b1d59/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-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-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210112230658-8b4aab62c064/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= -golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= -gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= -gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= -gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= -gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= -google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= -google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= -google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= -google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= -google.golang.org/api v0.182.0 h1:if5fPvudRQ78GeRx3RayIoiuV7modtErPIZC/T2bIvE= -google.golang.org/api v0.182.0/go.mod h1:cGhjy4caqA5yXRzEhkHI8Y9mfyC2VLTlER2l08xaqtM= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= -google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= -google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= -google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= -google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/genproto v0.0.0-20240521202816-d264139d666e h1:axIBUGXSVho2zB+3tJj8l9Qvm/El5vVYPYqhGA5PmJM= -google.golang.org/genproto v0.0.0-20240521202816-d264139d666e/go.mod h1:gOvX/2dWTqh+u3+IHjFeCxinlz5AZ5qhOufbQPub/dE= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 h1:P8OJ/WCl/Xo4E4zoe4/bifHpSmmKwARqyqE4nW6J2GQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240521202816-d264139d666e h1:Elxv5MwEkCI9f5SkoL6afed6NTdxaGoAo39eANBwHL8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240521202816-d264139d666e/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= -google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= -google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= -google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= -google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= -gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/zorkian/go-datadog-api.v2 v2.30.0 h1:umQdVO0Ytx+kYadhuJNjFtDgIsIEBnKrOTvNuu8ClKI= -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.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= -gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= -howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM= -howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= -k8s.io/api v0.21.1/go.mod h1:FstGROTmsSHBarKc8bylzXih8BLNYTiS3TZcsoEDg2s= -k8s.io/api v0.29.3 h1:2ORfZ7+bGC3YJqGpV0KSDDEVf8hdGQ6A03/50vj8pmw= -k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80= -k8s.io/apimachinery v0.21.1/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY= -k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= -k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= -k8s.io/client-go v0.21.1/go.mod h1:/kEw4RgW+3xnBGzvp9IWxKSNA+lXn3A7AuH3gdOAzLs= -k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg= -k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= -k8s.io/code-generator v0.21.1/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= -k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= -k8s.io/kubelet v0.29.3 h1:X9h0ZHzc+eUeNTaksbN0ItHyvGhQ7Z0HPjnQD2oHdwU= -k8s.io/kubelet v0.29.3/go.mod h1:jDiGuTkFOUynyBKzOoC1xRSWlgAZ9UPcTYeFyjr6vas= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0 h1:jgGTlFYnhF1PM1Ax/lAlxUPE+KfCIXHaathvJg1C3ak= -k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= -modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= -modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= -modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= -modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= -modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= -modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= -modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= -modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= -modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= -modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= -modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= -modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= -modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= -modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= -modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/controller-runtime v0.17.3 h1:65QmN7r3FWgTxDMz9fvGnO1kbf2nu+acg9p2R9oYYYk= -sigs.k8s.io/controller-runtime v0.17.3/go.mod h1:N0jpP5Lo7lMTF9aL56Z/B2oWBJjey6StQM0jRbKQXtY= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= -skywalking.apache.org/repo/goapi v0.0.0-20240104145220-ba7202308dd4 h1:3YIFmsshgsU6FzHgnkG9Z24CkXkgoexBN5O0aSzK79g= -skywalking.apache.org/repo/goapi v0.0.0-20240104145220-ba7202308dd4/go.mod h1:oD2dxcDAHVIt95Ee7kJHgZ5f64QNhrqTjQYARwfafc4= diff --git a/internal/aws/awsutil/conn.go b/internal/aws/awsutil/conn.go index 4933a1bf9ccd..32963e811128 100644 --- a/internal/aws/awsutil/conn.go +++ b/internal/aws/awsutil/conn.go @@ -45,7 +45,8 @@ const ( // newHTTPClient returns new HTTP client instance with provided configuration. func newHTTPClient(logger *zap.Logger, maxIdle int, requestTimeout int, noVerify bool, - proxyAddress string) (*http.Client, error) { + proxyAddress string, +) (*http.Client, error) { logger.Debug("Using proxy address: ", zap.String("proxyAddr", proxyAddress), ) @@ -137,7 +138,6 @@ func GetAWSConfigSession(logger *zap.Logger, cn ConnAttr, cfg *AWSSessionSetting logger.Debug("Fetch region from ec2 metadata", zap.String("region", awsRegion)) } } - } if awsRegion == "" { @@ -207,7 +207,6 @@ func (c *Conn) newAWSSession(logger *zap.Logger, roleArn string, region string) s, err = session.NewSession(&aws.Config{ Credentials: stsCreds, }) - if err != nil { logger.Error("Error in creating session object : ", zap.Error(err)) return s, err @@ -246,7 +245,8 @@ func getSTSCreds(logger *zap.Logger, region string, roleArn string) (*credential // AWS STS recommends that you provide both the Region and endpoint when you make calls to a Regional endpoint. // Reference: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html#id_credentials_temp_enable-regions_writing_code func getSTSCredsFromRegionEndpoint(logger *zap.Logger, sess *session.Session, region string, - roleArn string) *credentials.Credentials { + roleArn string, +) *credentials.Credentials { regionalEndpoint := getSTSRegionalEndpoint(region) // if regionalEndpoint is "", the STS endpoint is Global endpoint for classic regions except ap-east-1 - (HKG) // for other opt-in regions, region value will create STS regional endpoint. @@ -260,7 +260,8 @@ func getSTSCredsFromRegionEndpoint(logger *zap.Logger, sess *session.Session, re // getSTSCredsFromPrimaryRegionEndpoint fetches STS credentials for provided roleARN from primary region endpoint in // the respective partition. func getSTSCredsFromPrimaryRegionEndpoint(logger *zap.Logger, t *session.Session, roleArn string, - region string) *credentials.Credentials { + region string, +) *credentials.Credentials { logger.Info("Credentials for provided RoleARN being fetched from STS primary region endpoint.") partitionID := getPartition(region) switch partitionID { diff --git a/internal/aws/awsutil/conn_test.go b/internal/aws/awsutil/conn_test.go index 56d6228e38d4..5946b36ff2b8 100644 --- a/internal/aws/awsutil/conn_test.go +++ b/internal/aws/awsutil/conn_test.go @@ -46,7 +46,7 @@ func TestEC2Session(t *testing.T) { expectedSession, _ = session.NewSession() m.sn = expectedSession cfg, s, err := GetAWSConfigSession(logger, m, &sessionCfg) - assert.Equal(t, s, expectedSession, "Expect the session object is not overridden") + assert.Equal(t, expectedSession, s, "Expect the session object is not overridden") assert.Equal(t, *cfg.Region, ec2Region, "Region value fetched from ec2-metadata service") assert.NoError(t, err) } @@ -58,12 +58,12 @@ func TestRegionEnv(t *testing.T) { region := "us-east-1" t.Setenv("AWS_REGION", region) - var m = &mockConn{} + m := &mockConn{} var expectedSession *session.Session expectedSession, _ = session.NewSession() m.sn = expectedSession cfg, s, err := GetAWSConfigSession(logger, m, &sessionCfg) - assert.Equal(t, s, expectedSession, "Expect the session object is not overridden") + assert.Equal(t, expectedSession, s, "Expect the session object is not overridden") assert.Equal(t, *cfg.Region, region, "Region value fetched from environment") assert.NoError(t, err) } diff --git a/internal/aws/awsutil/go.mod b/internal/aws/awsutil/go.mod index 4f7ba389ae5a..3aab89b5cf8c 100644 --- a/internal/aws/awsutil/go.mod +++ b/internal/aws/awsutil/go.mod @@ -1,13 +1,13 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutil -go 1.21.0 +go 1.22.0 require ( - github.com/aws/aws-sdk-go v1.53.11 - github.com/stretchr/testify v1.9.0 + github.com/aws/aws-sdk-go v1.55.5 + github.com/stretchr/testify v1.10.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 - golang.org/x/net v0.25.0 + golang.org/x/net v0.31.0 ) require ( @@ -16,7 +16,7 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/stretchr/objx v0.5.2 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/text v0.15.0 // indirect + golang.org/x/text v0.20.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/internal/aws/awsutil/go.sum b/internal/aws/awsutil/go.sum index 909e0538805b..292c87936724 100644 --- a/internal/aws/awsutil/go.sum +++ b/internal/aws/awsutil/go.sum @@ -1,5 +1,5 @@ -github.com/aws/aws-sdk-go v1.53.11 h1:KcmduYvX15rRqt4ZU/7jKkmDxU/G87LJ9MUI0yQJh00= -github.com/aws/aws-sdk-go v1.53.11/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= +github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -18,18 +18,18 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/internal/aws/containerinsight/go.mod b/internal/aws/containerinsight/go.mod index 940b28281c78..7258bdf42765 100644 --- a/internal/aws/containerinsight/go.mod +++ b/internal/aws/containerinsight/go.mod @@ -1,10 +1,10 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/containerinsight -go 1.21.0 +go 1.22.0 require ( - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/pdata v1.9.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/pdata v1.22.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) @@ -17,12 +17,12 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/internal/aws/containerinsight/go.sum b/internal/aws/containerinsight/go.sum index 96db3e9af2fa..8ab6def50554 100644 --- a/internal/aws/containerinsight/go.sum +++ b/internal/aws/containerinsight/go.sum @@ -3,6 +3,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -25,12 +27,12 @@ github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjR github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -46,20 +48,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -68,12 +70,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/internal/aws/containerinsight/utils_test.go b/internal/aws/containerinsight/utils_test.go index 457cb7350b5c..0a702d7f5d76 100644 --- a/internal/aws/containerinsight/utils_test.go +++ b/internal/aws/containerinsight/utils_test.go @@ -69,32 +69,32 @@ func TestMetricName(t *testing.T) { } func TestIsNode(t *testing.T) { - assert.Equal(t, true, IsNode(TypeNode)) - assert.Equal(t, true, IsNode(TypeNodeNet)) - assert.Equal(t, true, IsNode(TypeNodeFS)) - assert.Equal(t, true, IsNode(TypeNodeDiskIO)) - assert.Equal(t, false, IsNode(TypePod)) + assert.True(t, IsNode(TypeNode)) + assert.True(t, IsNode(TypeNodeNet)) + assert.True(t, IsNode(TypeNodeFS)) + assert.True(t, IsNode(TypeNodeDiskIO)) + assert.False(t, IsNode(TypePod)) } func TestIsInstance(t *testing.T) { - assert.Equal(t, true, IsInstance(TypeInstance)) - assert.Equal(t, true, IsInstance(TypeInstanceNet)) - assert.Equal(t, true, IsInstance(TypeInstanceFS)) - assert.Equal(t, true, IsInstance(TypeInstanceDiskIO)) - assert.Equal(t, false, IsInstance(TypePod)) + assert.True(t, IsInstance(TypeInstance)) + assert.True(t, IsInstance(TypeInstanceNet)) + assert.True(t, IsInstance(TypeInstanceFS)) + assert.True(t, IsInstance(TypeInstanceDiskIO)) + assert.False(t, IsInstance(TypePod)) } func TestIsContainer(t *testing.T) { - assert.Equal(t, true, IsContainer(TypeContainer)) - assert.Equal(t, true, IsContainer(TypeContainerDiskIO)) - assert.Equal(t, true, IsContainer(TypeContainerFS)) - assert.Equal(t, false, IsContainer(TypePod)) + assert.True(t, IsContainer(TypeContainer)) + assert.True(t, IsContainer(TypeContainerDiskIO)) + assert.True(t, IsContainer(TypeContainerFS)) + assert.False(t, IsContainer(TypePod)) } func TestIsPod(t *testing.T) { - assert.Equal(t, true, IsPod(TypePod)) - assert.Equal(t, true, IsPod(TypePodNet)) - assert.Equal(t, false, IsPod(TypeInstance)) + assert.True(t, IsPod(TypePod)) + assert.True(t, IsPod(TypePodNet)) + assert.False(t, IsPod(TypeInstance)) } func convertToInt64(value any) int64 { @@ -132,8 +132,8 @@ func convertToFloat64(value any) float64 { } func checkMetricsAreExpected(t *testing.T, md pmetric.Metrics, fields map[string]any, tags map[string]string, - expectedUnits map[string]string) { - + expectedUnits map[string]string, +) { rms := md.ResourceMetrics() assert.Equal(t, 1, rms.Len()) @@ -145,7 +145,7 @@ func checkMetricsAreExpected(t *testing.T, md pmetric.Metrics, fields map[string for key, val := range tags { log.Printf("key=%v value=%v", key, val) attr, ok := attributes.Get(key) - assert.Equal(t, true, ok) + assert.True(t, ok) if key == Timestamp { timeUnixNano, _ = strconv.ParseUint(val, 10, 64) val = strconv.FormatUint(timeUnixNano/uint64(time.Millisecond), 10) @@ -265,7 +265,6 @@ func TestConvertToOTLPMetricsForClusterMetrics(t *testing.T) { } md = ConvertToOTLPMetrics(fields, tags, zap.NewNop()) checkMetricsAreExpected(t, md, fields, tags, expectedUnits) - } func TestConvertToOTLPMetricsForContainerMetrics(t *testing.T) { diff --git a/internal/aws/cwlogs/cwlog_client.go b/internal/aws/cwlogs/cwlog_client.go index 07da718a3fb3..a8a17e243b52 100644 --- a/internal/aws/cwlogs/cwlog_client.go +++ b/internal/aws/cwlogs/cwlog_client.go @@ -26,6 +26,8 @@ const ( errCodeThrottlingException = "ThrottlingException" ) +var containerInsightsRegexPattern = regexp.MustCompile(`^/aws/.*containerinsights/.*/(performance|prometheus)$`) + // Possible exceptions are combination of common errors (https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/CommonErrors.html) // and API specific erros (e.g. https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutLogEvents.html#API_PutLogEvents_Errors) type Client struct { @@ -35,20 +37,43 @@ type Client struct { logger *zap.Logger } +type ClientOption func(*cwLogClientConfig) + +type cwLogClientConfig struct { + userAgentExtras []string +} + +func WithUserAgentExtras(userAgentExtras ...string) ClientOption { + return func(config *cwLogClientConfig) { + config.userAgentExtras = append(config.userAgentExtras, userAgentExtras...) + } +} + // Create a log client based on the actual cloudwatch logs client. func newCloudWatchLogClient(svc cloudwatchlogsiface.CloudWatchLogsAPI, logRetention int64, tags map[string]*string, logger *zap.Logger) *Client { - logClient := &Client{svc: svc, + logClient := &Client{ + svc: svc, logRetention: logRetention, tags: tags, - logger: logger} + logger: logger, + } return logClient } // NewClient create Client -func NewClient(logger *zap.Logger, awsConfig *aws.Config, buildInfo component.BuildInfo, logGroupName string, logRetention int64, tags map[string]*string, sess *session.Session, componentName string) *Client { +func NewClient(logger *zap.Logger, awsConfig *aws.Config, buildInfo component.BuildInfo, logGroupName string, logRetention int64, tags map[string]*string, sess *session.Session, componentName string, opts ...ClientOption) *Client { client := cloudwatchlogs.New(sess, awsConfig) client.Handlers.Build.PushBackNamed(handler.RequestStructuredLogHandler) - client.Handlers.Build.PushFrontNamed(newCollectorUserAgentHandler(buildInfo, logGroupName, componentName)) + + // Loop through each option + option := &cwLogClientConfig{ + userAgentExtras: []string{}, + } + for _, opt := range opts { + opt(option) + } + + client.Handlers.Build.PushFrontNamed(newCollectorUserAgentHandler(buildInfo, logGroupName, componentName, option)) return newCloudWatchLogClient(client, logRetention, tags, logger) } @@ -97,10 +122,9 @@ func (client *Client) PutLogEvents(input *cloudwatchlogs.PutLogEventsInput, retr client.logger.Error("cwlog_client: Error occurs in PutLogEvents", zap.Error(awsErr)) return err } - } - //TODO: Should have metrics to provide visibility of these failures + // TODO: Should have metrics to provide visibility of these failures if response != nil { if response.RejectedLogEventsInfo != nil { rejectedLogEventsInfo := response.RejectedLogEventsInfo @@ -175,19 +199,18 @@ func (client *Client) CreateStream(logGroup, streamName *string) error { return nil } -func newCollectorUserAgentHandler(buildInfo component.BuildInfo, logGroupName string, componentName string) request.NamedHandler { - fn := request.MakeAddToUserAgentHandler(buildInfo.Command, buildInfo.Version, componentName) - if matchContainerInsightsPattern(logGroupName) { - fn = request.MakeAddToUserAgentHandler(buildInfo.Command, buildInfo.Version, componentName, "ContainerInsights") +func newCollectorUserAgentHandler(buildInfo component.BuildInfo, logGroupName string, componentName string, clientConfig *cwLogClientConfig) request.NamedHandler { + extraStrs := []string{componentName} + extraStrs = append(extraStrs, clientConfig.userAgentExtras...) + + if containerInsightsRegexPattern.MatchString(logGroupName) { + extraStrs = append(extraStrs, "ContainerInsights") } + + fn := request.MakeAddToUserAgentHandler(buildInfo.Command, buildInfo.Version, extraStrs...) + return request.NamedHandler{ Name: "otel.collector.UserAgentHandler", Fn: fn, } } - -func matchContainerInsightsPattern(logGroupName string) bool { - regexP := "^/aws/.*containerinsights/.*/(performance|prometheus)$" - r, _ := regexp.Compile(regexP) - return r.MatchString(logGroupName) -} diff --git a/internal/aws/cwlogs/cwlog_client_test.go b/internal/aws/cwlogs/cwlog_client_test.go index 919d1f59607f..f44c3d0cfd13 100644 --- a/internal/aws/cwlogs/cwlog_client_test.go +++ b/internal/aws/cwlogs/cwlog_client_test.go @@ -6,6 +6,7 @@ package cwlogs import ( "errors" "fmt" + "net/http" "testing" "github.com/aws/aws-sdk-go/aws" @@ -27,7 +28,8 @@ func newAlwaysPassMockLogClient(putLogEventsFunc func(args mock.Arguments)) *Cli svc.On("PutLogEvents", mock.Anything).Return( &cloudwatchlogs.PutLogEventsOutput{ - NextSequenceToken: &expectedNextSequenceToken}, + NextSequenceToken: &expectedNextSequenceToken, + }, nil).Run(putLogEventsFunc) svc.On("CreateLogGroup", mock.Anything).Return(new(cloudwatchlogs.CreateLogGroupOutput), nil) @@ -36,7 +38,8 @@ func newAlwaysPassMockLogClient(putLogEventsFunc func(args mock.Arguments)) *Cli svc.On("DescribeLogStreams", mock.Anything).Return( &cloudwatchlogs.DescribeLogStreamsOutput{ - LogStreams: []*cloudwatchlogs.LogStream{{UploadSequenceToken: &expectedNextSequenceToken}}}, + LogStreams: []*cloudwatchlogs.LogStream{{UploadSequenceToken: &expectedNextSequenceToken}}, + }, nil) return newCloudWatchLogClient(svc, 0, nil, logger) } @@ -77,11 +80,13 @@ func (svc *mockCloudWatchLogsClient) TagResource(input *cloudwatchlogs.TagResour } // Tests -var previousSequenceToken = "0000" -var expectedNextSequenceToken = "1111" -var logGroup = "logGroup" -var logStreamName = "logStream" -var emptySequenceToken = "" +var ( + previousSequenceToken = "0000" + expectedNextSequenceToken = "1111" + logGroup = "logGroup" + logStreamName = "logStream" + emptySequenceToken = "" +) func TestPutLogEvents_HappyCase(t *testing.T) { logger := zap.NewNop() @@ -92,7 +97,8 @@ func TestPutLogEvents_HappyCase(t *testing.T) { SequenceToken: &previousSequenceToken, } putLogEventsOutput := &cloudwatchlogs.PutLogEventsOutput{ - NextSequenceToken: &expectedNextSequenceToken} + NextSequenceToken: &expectedNextSequenceToken, + } svc.On("PutLogEvents", putLogEventsInput).Return(putLogEventsOutput, nil) @@ -114,7 +120,8 @@ func TestPutLogEvents_HappyCase_SomeRejectedInfo(t *testing.T) { rejectedLogEventsInfo := &cloudwatchlogs.RejectedLogEventsInfo{ ExpiredLogEventEndIndex: aws.Int64(1), TooNewLogEventStartIndex: aws.Int64(2), - TooOldLogEventEndIndex: aws.Int64(3)} + TooOldLogEventEndIndex: aws.Int64(3), + } putLogEventsOutput := &cloudwatchlogs.PutLogEventsOutput{ NextSequenceToken: &expectedNextSequenceToken, RejectedLogEventsInfo: rejectedLogEventsInfo, @@ -138,7 +145,8 @@ func TestPutLogEvents_NonAWSError(t *testing.T) { SequenceToken: &previousSequenceToken, } putLogEventsOutput := &cloudwatchlogs.PutLogEventsOutput{ - NextSequenceToken: &expectedNextSequenceToken} + NextSequenceToken: &expectedNextSequenceToken, + } svc.On("PutLogEvents", putLogEventsInput).Return(putLogEventsOutput, errors.New("some random error")).Once() @@ -158,7 +166,8 @@ func TestPutLogEvents_InvalidParameterException(t *testing.T) { SequenceToken: &previousSequenceToken, } putLogEventsOutput := &cloudwatchlogs.PutLogEventsOutput{ - NextSequenceToken: &expectedNextSequenceToken} + NextSequenceToken: &expectedNextSequenceToken, + } invalidParameterException := &cloudwatchlogs.InvalidParameterException{} svc.On("PutLogEvents", putLogEventsInput).Return(putLogEventsOutput, invalidParameterException).Once() @@ -179,7 +188,8 @@ func TestPutLogEvents_OperationAbortedException(t *testing.T) { SequenceToken: &previousSequenceToken, } putLogEventsOutput := &cloudwatchlogs.PutLogEventsOutput{ - NextSequenceToken: &expectedNextSequenceToken} + NextSequenceToken: &expectedNextSequenceToken, + } operationAbortedException := &cloudwatchlogs.OperationAbortedException{} svc.On("PutLogEvents", putLogEventsInput).Return(putLogEventsOutput, operationAbortedException).Once() @@ -200,7 +210,8 @@ func TestPutLogEvents_ServiceUnavailableException(t *testing.T) { SequenceToken: &previousSequenceToken, } putLogEventsOutput := &cloudwatchlogs.PutLogEventsOutput{ - NextSequenceToken: &expectedNextSequenceToken} + NextSequenceToken: &expectedNextSequenceToken, + } serviceUnavailableException := &cloudwatchlogs.ServiceUnavailableException{} svc.On("PutLogEvents", putLogEventsInput).Return(putLogEventsOutput, serviceUnavailableException).Once() @@ -221,7 +232,8 @@ func TestPutLogEvents_UnknownException(t *testing.T) { SequenceToken: &previousSequenceToken, } putLogEventsOutput := &cloudwatchlogs.PutLogEventsOutput{ - NextSequenceToken: &expectedNextSequenceToken} + NextSequenceToken: &expectedNextSequenceToken, + } unknownException := awserr.New("unknownException", "", nil) svc.On("PutLogEvents", putLogEventsInput).Return(putLogEventsOutput, unknownException).Once() @@ -242,7 +254,8 @@ func TestPutLogEvents_ThrottlingException(t *testing.T) { SequenceToken: &previousSequenceToken, } putLogEventsOutput := &cloudwatchlogs.PutLogEventsOutput{ - NextSequenceToken: &expectedNextSequenceToken} + NextSequenceToken: &expectedNextSequenceToken, + } throttlingException := awserr.New(errCodeThrottlingException, "", nil) svc.On("PutLogEvents", putLogEventsInput).Return(putLogEventsOutput, throttlingException).Once() @@ -264,7 +277,8 @@ func TestPutLogEvents_ResourceNotFoundException(t *testing.T) { } putLogEventsOutput := &cloudwatchlogs.PutLogEventsOutput{ - NextSequenceToken: &expectedNextSequenceToken} + NextSequenceToken: &expectedNextSequenceToken, + } awsErr := &cloudwatchlogs.ResourceNotFoundException{} svc.On("PutLogEvents", putLogEventsInput).Return(putLogEventsOutput, awsErr).Once() @@ -291,7 +305,8 @@ func TestLogRetention_NeverExpire(t *testing.T) { } putLogEventsOutput := &cloudwatchlogs.PutLogEventsOutput{ - NextSequenceToken: &expectedNextSequenceToken} + NextSequenceToken: &expectedNextSequenceToken, + } awsErr := &cloudwatchlogs.ResourceNotFoundException{} svc.On("PutLogEvents", putLogEventsInput).Return(putLogEventsOutput, awsErr).Once() @@ -326,7 +341,8 @@ func TestLogRetention_RetentionDaysInputted(t *testing.T) { } putLogEventsOutput := &cloudwatchlogs.PutLogEventsOutput{ - NextSequenceToken: &expectedNextSequenceToken} + NextSequenceToken: &expectedNextSequenceToken, + } awsErr := &cloudwatchlogs.ResourceNotFoundException{} svc.On("PutLogEvents", putLogEventsInput).Return(putLogEventsOutput, awsErr).Once() @@ -362,7 +378,8 @@ func TestSetTags_NotCalled(t *testing.T) { } putLogEventsOutput := &cloudwatchlogs.PutLogEventsOutput{ - NextSequenceToken: &expectedNextSequenceToken} + NextSequenceToken: &expectedNextSequenceToken, + } awsErr := &cloudwatchlogs.ResourceNotFoundException{} svc.On("PutLogEvents", putLogEventsInput).Return(putLogEventsOutput, awsErr).Once() @@ -397,7 +414,8 @@ func TestSetTags_Called(t *testing.T) { } putLogEventsOutput := &cloudwatchlogs.PutLogEventsOutput{ - NextSequenceToken: &expectedNextSequenceToken} + NextSequenceToken: &expectedNextSequenceToken, + } awsErr := &cloudwatchlogs.ResourceNotFoundException{} avalue := "avalue" @@ -433,7 +451,8 @@ func TestPutLogEvents_AllRetriesFail(t *testing.T) { } putLogEventsOutput := &cloudwatchlogs.PutLogEventsOutput{ - NextSequenceToken: nil} + NextSequenceToken: nil, + } awsErr := &cloudwatchlogs.ResourceNotFoundException{} svc.On("PutLogEvents", putLogEventsInput).Return(putLogEventsOutput, awsErr).Twice() @@ -538,54 +557,103 @@ func TestUserAgent(t *testing.T) { name string buildInfo component.BuildInfo logGroupName string + clientOptions []ClientOption expectedUserAgentStr string }{ { - "emptyLogGroup", + "emptyLogGroupAndEmptyClientOptions", + component.BuildInfo{Command: "opentelemetry-collector-contrib", Version: "1.0"}, + "", + []ClientOption{}, + fmt.Sprintf("opentelemetry-collector-contrib/1.0 (%s)", expectedComponentName), + }, + { + "emptyLogGroupWithEmptyUserAgentExtras", component.BuildInfo{Command: "opentelemetry-collector-contrib", Version: "1.0"}, "", + []ClientOption{WithUserAgentExtras()}, fmt.Sprintf("opentelemetry-collector-contrib/1.0 (%s)", expectedComponentName), }, { "buildInfoCommandUsed", component.BuildInfo{Command: "test-collector-contrib", Version: "1.0"}, "", + []ClientOption{}, + fmt.Sprintf("test-collector-contrib/1.0 (%s)", expectedComponentName), + }, + { + "buildInfoCommandUsedWithEmptyUserAgentExtras", + component.BuildInfo{Command: "test-collector-contrib", Version: "1.0"}, + "", + []ClientOption{WithUserAgentExtras()}, fmt.Sprintf("test-collector-contrib/1.0 (%s)", expectedComponentName), }, { - "non container insights", + "nonContainerInsights", component.BuildInfo{Command: "opentelemetry-collector-contrib", Version: "1.1"}, "test-group", + []ClientOption{}, fmt.Sprintf("opentelemetry-collector-contrib/1.1 (%s)", expectedComponentName), }, { - "container insights EKS", + "containerInsightsEKS", component.BuildInfo{Command: "opentelemetry-collector-contrib", Version: "1.0"}, "/aws/containerinsights/eks-cluster-name/performance", + []ClientOption{}, fmt.Sprintf("opentelemetry-collector-contrib/1.0 (%s; ContainerInsights)", expectedComponentName), }, { - "container insights ECS", + "containerInsightsECS", component.BuildInfo{Command: "opentelemetry-collector-contrib", Version: "1.0"}, "/aws/ecs/containerinsights/ecs-cluster-name/performance", + []ClientOption{}, fmt.Sprintf("opentelemetry-collector-contrib/1.0 (%s; ContainerInsights)", expectedComponentName), }, { - "container insights prometheus", + "containerInsightsPrometheus", component.BuildInfo{Command: "opentelemetry-collector-contrib", Version: "1.0"}, "/aws/containerinsights/cluster-name/prometheus", + []ClientOption{}, fmt.Sprintf("opentelemetry-collector-contrib/1.0 (%s; ContainerInsights)", expectedComponentName), }, + { + "validAppSignalsLogGroupAndAgentString", + component.BuildInfo{Command: "opentelemetry-collector-contrib", Version: "1.0"}, + "/aws/application-signals", + []ClientOption{WithUserAgentExtras("AppSignals")}, + fmt.Sprintf("opentelemetry-collector-contrib/1.0 (%s; AppSignals)", expectedComponentName), + }, + { + "multipleAgentStringExtras", + component.BuildInfo{Command: "opentelemetry-collector-contrib", Version: "1.0"}, + "/aws/application-signals", + []ClientOption{WithUserAgentExtras("abcde", "vwxyz", "12345")}, + fmt.Sprintf("opentelemetry-collector-contrib/1.0 (%s; abcde; vwxyz; 12345)", expectedComponentName), + }, + { + "containerInsightsEKSWithMultipleAgentStringExtras", + component.BuildInfo{Command: "opentelemetry-collector-contrib", Version: "1.0"}, + "/aws/containerinsights/eks-cluster-name/performance", + []ClientOption{WithUserAgentExtras("extra0", "extra1", "extra2")}, + fmt.Sprintf("opentelemetry-collector-contrib/1.0 (%s; extra0; extra1; extra2; ContainerInsights)", expectedComponentName), + }, + { + "validAppSignalsEMFEnabled", + component.BuildInfo{Command: "opentelemetry-collector-contrib", Version: "1.0"}, + "/aws/application-signals", + []ClientOption{WithUserAgentExtras("AppSignals")}, + fmt.Sprintf("opentelemetry-collector-contrib/1.0 (%s; AppSignals)", expectedComponentName), + }, } testSession, _ := session.NewSession() for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { - cwlog := NewClient(logger, &aws.Config{}, tc.buildInfo, tc.logGroupName, 0, map[string]*string{}, testSession, expectedComponentName) + cwlog := NewClient(logger, &aws.Config{}, tc.buildInfo, tc.logGroupName, 0, map[string]*string{}, testSession, expectedComponentName, tc.clientOptions...) logClient := cwlog.svc.(*cloudwatchlogs.CloudWatchLogs) req := request.New(aws.Config{}, metadata.ClientInfo{}, logClient.Handlers, nil, &request.Operation{ - HTTPMethod: "GET", + HTTPMethod: http.MethodGet, HTTPPath: "/", }, nil, nil) diff --git a/internal/aws/cwlogs/go.mod b/internal/aws/cwlogs/go.mod index 3380675c43e3..6c855bb6cfd1 100644 --- a/internal/aws/cwlogs/go.mod +++ b/internal/aws/cwlogs/go.mod @@ -1,40 +1,33 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/cwlogs -go 1.21.0 +go 1.22.0 require ( - github.com/aws/aws-sdk-go v1.53.11 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 + github.com/aws/aws-sdk-go v1.55.5 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/knadh/koanf/maps v0.1.1 // indirect - github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect - github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/stretchr/objx v0.5.2 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/confmap v0.102.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/metric v1.27.0 // indirect - go.opentelemetry.io/otel/trace v1.27.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.26.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/internal/aws/cwlogs/go.sum b/internal/aws/cwlogs/go.sum index d3f9dde82cd8..4cbba8008565 100644 --- a/internal/aws/cwlogs/go.sum +++ b/internal/aws/cwlogs/go.sum @@ -1,16 +1,16 @@ -github.com/aws/aws-sdk-go v1.53.11 h1:KcmduYvX15rRqt4ZU/7jKkmDxU/G87LJ9MUI0yQJh00= -github.com/aws/aws-sdk-go v1.53.11/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= +github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= @@ -19,20 +19,10 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGw github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= -github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= -github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= -github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= @@ -40,24 +30,22 @@ github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncj github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -73,20 +61,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -95,12 +83,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/internal/aws/cwlogs/pusher.go b/internal/aws/cwlogs/pusher.go index cee16a6941bb..af8417dc8aab 100644 --- a/internal/aws/cwlogs/pusher.go +++ b/internal/aws/cwlogs/pusher.go @@ -29,9 +29,7 @@ const ( evenTimestampLimitInFuture = -2 * time.Hour // None of the log events in the batch can be more than 2 hours in the future. ) -var ( - maxEventPayloadBytes = defaultMaxEventPayloadBytes -) +var maxEventPayloadBytes = defaultMaxEventPayloadBytes // Event struct to present a log event. type Event struct { @@ -48,7 +46,8 @@ func NewEvent(timestampMs int64, message string) *Event { event := &Event{ InputLogEvent: &cloudwatchlogs.InputLogEvent{ Timestamp: aws.Int64(timestampMs), - Message: aws.String(message)}, + Message: aws.String(message), + }, } return event } @@ -115,7 +114,8 @@ func newEventBatch(key StreamKey) *eventBatch { putLogEventsInput: &cloudwatchlogs.PutLogEventsInput{ LogGroupName: aws.String(key.LogGroupName), LogStreamName: aws.String(key.LogStreamName), - LogEvents: make([]*cloudwatchlogs.InputLogEvent, 0, maxRequestEventCount)}, + LogEvents: make([]*cloudwatchlogs.InputLogEvent, 0, maxRequestEventCount), + }, } } @@ -194,8 +194,8 @@ type logPusher struct { // NewPusher creates a logPusher instance func NewPusher(streamKey StreamKey, retryCnt int, - svcStructuredLog Client, logger *zap.Logger) Pusher { - + svcStructuredLog Client, logger *zap.Logger, +) Pusher { pusher := newLogPusher(streamKey, svcStructuredLog, logger) pusher.retryCnt = defaultRetryCount @@ -208,7 +208,8 @@ func NewPusher(streamKey StreamKey, retryCnt int, // Only create a logPusher, but not start the instance. func newLogPusher(streamKey StreamKey, - svcStructuredLog Client, logger *zap.Logger) *logPusher { + svcStructuredLog Client, logger *zap.Logger, +) *logPusher { pusher := &logPusher{ logGroupName: aws.String(streamKey.LogGroupName), logStreamName: aws.String(streamKey.LogStreamName), @@ -250,7 +251,6 @@ func (p *logPusher) ForceFlush() error { } func (p *logPusher) pushEventBatch(req any) error { - // http://docs.aws.amazon.com/goto/SdkForGoV1/logs-2014-03-28/PutLogEvents // The log events in the batch must be in chronological ordered by their // timestamp (the time the event occurred, expressed as the number of milliseconds @@ -262,7 +262,6 @@ func (p *logPusher) pushEventBatch(req any) error { startTime := time.Now() err := p.svcStructuredLog.PutLogEvents(putLogEventsInput, p.retryCnt) - if err != nil { return err } @@ -296,7 +295,6 @@ func (p *logPusher) addLogEvent(logEvent *Event) *eventBatch { } func (p *logPusher) renewEventBatch() *eventBatch { - var prevBatch *eventBatch if len(p.logEventBatch.putLogEventsInput.LogEvents) > 0 { prevBatch = p.logEventBatch diff --git a/internal/aws/cwlogs/pusher_test.go b/internal/aws/cwlogs/pusher_test.go index 9b4369798530..acd79d697a7c 100644 --- a/internal/aws/cwlogs/pusher_test.go +++ b/internal/aws/cwlogs/pusher_test.go @@ -14,6 +14,7 @@ import ( "github.com/aws/aws-sdk-go/service/cloudwatchlogs" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" "go.uber.org/zap" ) @@ -31,8 +32,8 @@ func TestValidateLogEventWithMutating(t *testing.T) { logEvent.GeneratedTime = time.Now() err := logEvent.Validate(zap.NewNop()) assert.NoError(t, err) - assert.True(t, *logEvent.InputLogEvent.Timestamp > int64(0)) - assert.Equal(t, 64-perEventHeaderBytes, len(*logEvent.InputLogEvent.Message)) + assert.Positive(t, *logEvent.InputLogEvent.Timestamp) + assert.Len(t, *logEvent.InputLogEvent.Message, 64-perEventHeaderBytes) maxEventPayloadBytes = defaultMaxEventPayloadBytes } @@ -83,7 +84,9 @@ func TestLogEventBatch_sortLogEvents(t *testing.T) { totalEvents := 10 logEventBatch := &eventBatch{ putLogEventsInput: &cloudwatchlogs.PutLogEventsInput{ - LogEvents: make([]*cloudwatchlogs.InputLogEvent, 0, totalEvents)}} + LogEvents: make([]*cloudwatchlogs.InputLogEvent, 0, totalEvents), + }, + } for i := 0; i < totalEvents; i++ { timestamp := rand.Int() @@ -99,7 +102,7 @@ func TestLogEventBatch_sortLogEvents(t *testing.T) { logEvents := logEventBatch.putLogEventsInput.LogEvents for i := 1; i < totalEvents; i++ { fmt.Printf("logEvents[%d].Timestamp=%d, logEvents[%d].Timestamp=%d.\n", i-1, *logEvents[i-1].Timestamp, i, *logEvents[i].Timestamp) - assert.True(t, *logEvents[i-1].Timestamp < *logEvents[i].Timestamp, "timestamp is not sorted correctly") + assert.Less(t, *logEvents[i-1].Timestamp, *logEvents[i].Timestamp, "timestamp is not sorted correctly") } } @@ -120,8 +123,10 @@ func newMockPusher() *logPusher { // pusher Tests // -var timestampMs = time.Now().UnixNano() / 1e6 -var msg = "test log message" +var ( + timestampMs = time.Now().UnixNano() / 1e6 + msg = "test log message" +) func TestPusher_newLogEventBatch(t *testing.T) { p := newMockPusher() @@ -133,7 +138,7 @@ func TestPusher_newLogEventBatch(t *testing.T) { assert.Equal(t, int64(0), logEventBatch.maxTimestampMs) assert.Equal(t, int64(0), logEventBatch.minTimestampMs) assert.Equal(t, 0, logEventBatch.byteTotal) - assert.Equal(t, 0, len(logEventBatch.putLogEventsInput.LogEvents)) + assert.Empty(t, logEventBatch.putLogEventsInput.LogEvents) assert.Equal(t, p.logStreamName, logEventBatch.putLogEventsInput.LogStreamName) assert.Equal(t, p.logGroupName, logEventBatch.putLogEventsInput.LogGroupName) assert.Equal(t, (*string)(nil), logEventBatch.putLogEventsInput.SequenceToken) @@ -149,30 +154,29 @@ func TestPusher_addLogEventBatch(t *testing.T) { p.logEventBatch.putLogEventsInput.LogEvents = append(p.logEventBatch.putLogEventsInput.LogEvents, logEvent.InputLogEvent) } - assert.Equal(t, c, len(p.logEventBatch.putLogEventsInput.LogEvents)) + assert.Len(t, p.logEventBatch.putLogEventsInput.LogEvents, c) assert.NotNil(t, p.addLogEvent(logEvent)) // the actual log event add operation happens after the func newLogEventBatchIfNeeded - assert.Equal(t, 1, len(p.logEventBatch.putLogEventsInput.LogEvents)) + assert.Len(t, p.logEventBatch.putLogEventsInput.LogEvents, 1) p.logEventBatch.byteTotal = maxRequestPayloadBytes - logEvent.eventPayloadBytes() + 1 assert.NotNil(t, p.addLogEvent(logEvent)) - assert.Equal(t, 1, len(p.logEventBatch.putLogEventsInput.LogEvents)) + assert.Len(t, p.logEventBatch.putLogEventsInput.LogEvents, 1) p.logEventBatch.minTimestampMs, p.logEventBatch.maxTimestampMs = timestampMs, timestampMs assert.NotNil(t, p.addLogEvent(NewEvent(timestampMs+(time.Hour*24+time.Millisecond*1).Nanoseconds()/1e6, msg))) - assert.Equal(t, 1, len(p.logEventBatch.putLogEventsInput.LogEvents)) + assert.Len(t, p.logEventBatch.putLogEventsInput.LogEvents, 1) assert.Nil(t, p.addLogEvent(nil)) - assert.Equal(t, 1, len(p.logEventBatch.putLogEventsInput.LogEvents)) + assert.Len(t, p.logEventBatch.putLogEventsInput.LogEvents, 1) assert.NotNil(t, p.addLogEvent(logEvent)) - assert.Equal(t, 1, len(p.logEventBatch.putLogEventsInput.LogEvents)) + assert.Len(t, p.logEventBatch.putLogEventsInput.LogEvents, 1) p.logEventBatch.byteTotal = 1 assert.Nil(t, p.addLogEvent(nil)) - assert.Equal(t, 1, len(p.logEventBatch.putLogEventsInput.LogEvents)) - + assert.Len(t, p.logEventBatch.putLogEventsInput.LogEvents, 1) } func TestAddLogEventWithValidation(t *testing.T) { @@ -182,10 +186,7 @@ func TestAddLogEventWithValidation(t *testing.T) { logEvent := NewEvent(timestampMs, largeEventContent) expectedTruncatedContent := (*logEvent.InputLogEvent.Message)[0:(defaultMaxEventPayloadBytes-perEventHeaderBytes-len(truncatedSuffix))] + truncatedSuffix - err := p.AddLogEntry(logEvent) - if err != nil { - t.Errorf("Error adding log entry: %v", err) - } + require.NoError(t, p.AddLogEntry(logEvent), "Error adding log entry") assert.Equal(t, expectedTruncatedContent, *logEvent.InputLogEvent.Message) logEvent = NewEvent(timestampMs, "") @@ -198,7 +199,7 @@ func TestStreamManager(t *testing.T) { manager := NewLogStreamManager(*svc) // Verify that the stream is created in the first time - assert.Nil(t, manager.InitStream(StreamKey{ + assert.NoError(t, manager.InitStream(StreamKey{ LogGroupName: "foo", LogStreamName: "bar", })) @@ -207,7 +208,7 @@ func TestStreamManager(t *testing.T) { mockCwAPI.AssertNumberOfCalls(t, "CreateLogStream", 1) // Verify that the stream is not created in the second time - assert.Nil(t, manager.InitStream(StreamKey{ + assert.NoError(t, manager.InitStream(StreamKey{ LogGroupName: "foo", LogStreamName: "bar", })) @@ -215,7 +216,7 @@ func TestStreamManager(t *testing.T) { mockCwAPI.AssertNumberOfCalls(t, "CreateLogStream", 1) // Verify that a different stream is created - assert.Nil(t, manager.InitStream(StreamKey{ + assert.NoError(t, manager.InitStream(StreamKey{ LogGroupName: "foo", LogStreamName: "bar2", })) @@ -248,16 +249,16 @@ func TestMultiStreamPusher(t *testing.T) { event.StreamKey.LogStreamName = "bar" event.GeneratedTime = time.Now() - assert.Nil(t, pusher.AddLogEntry(event)) - assert.Nil(t, pusher.AddLogEntry(event)) + assert.NoError(t, pusher.AddLogEntry(event)) + assert.NoError(t, pusher.AddLogEntry(event)) mockCwAPI.AssertNumberOfCalls(t, "PutLogEvents", 0) - assert.Nil(t, pusher.ForceFlush()) + assert.NoError(t, pusher.ForceFlush()) mockCwAPI.AssertNumberOfCalls(t, "CreateLogStream", 1) mockCwAPI.AssertNumberOfCalls(t, "PutLogEvents", 1) - assert.Equal(t, 1, len(inputs)) - assert.Equal(t, 2, len(inputs[0].LogEvents)) + assert.Len(t, inputs, 1) + assert.Len(t, inputs[0].LogEvents, 2) assert.Equal(t, "foo", *inputs[0].LogGroupName) assert.Equal(t, "bar", *inputs[0].LogStreamName) @@ -266,14 +267,14 @@ func TestMultiStreamPusher(t *testing.T) { event2.StreamKey.LogStreamName = "bar2" event2.GeneratedTime = time.Now() - assert.Nil(t, pusher.AddLogEntry(event2)) - assert.Nil(t, pusher.ForceFlush()) + assert.NoError(t, pusher.AddLogEntry(event2)) + assert.NoError(t, pusher.ForceFlush()) mockCwAPI.AssertNumberOfCalls(t, "CreateLogStream", 2) mockCwAPI.AssertNumberOfCalls(t, "PutLogEvents", 2) - assert.Equal(t, 2, len(inputs)) - assert.Equal(t, 1, len(inputs[1].LogEvents)) + assert.Len(t, inputs, 2) + assert.Len(t, inputs[1].LogEvents, 1) assert.Equal(t, "foo", *inputs[1].LogGroupName) assert.Equal(t, "bar2", *inputs[1].LogStreamName) } diff --git a/internal/aws/cwlogs/utils.go b/internal/aws/cwlogs/utils.go index 1f1adc53960b..0210eff623ba 100644 --- a/internal/aws/cwlogs/utils.go +++ b/internal/aws/cwlogs/utils.go @@ -5,7 +5,6 @@ package cwlogs // import "github.com/open-telemetry/opentelemetry-collector-cont import ( "errors" - "fmt" "regexp" ) @@ -43,26 +42,26 @@ func ValidateRetentionValue(input int64) error { // Check if the tags input is valid func ValidateTagsInput(input map[string]*string) error { if input != nil && len(input) < 1 { - return fmt.Errorf("invalid amount of items. Please input at least 1 tag or remove the tag field") + return errors.New("invalid amount of items. Please input at least 1 tag or remove the tag field") } if len(input) > 50 { - return fmt.Errorf("invalid amount of items. Please input at most 50 tags") + return errors.New("invalid amount of items. Please input at most 50 tags") } // The regex for the Key and Value requires "alphanumerics, whitespace, and _.:/=+-!" as noted here: https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateLogGroup.html#:~:text=%5E(%5B%5Cp%7BL%7D%5Cp%7BZ%7D%5Cp%7BN%7D_.%3A/%3D%2B%5C%2D%40%5D%2B)%24 validKeyPattern := regexp.MustCompile(`^([\p{L}\p{Z}\p{N}_.:/=+\-@]+)$`) validValuePattern := regexp.MustCompile(`^([\p{L}\p{Z}\p{N}_.:/=+\-@]*)$`) for key, value := range input { if len(key) < 1 || len(key) > 128 { - return fmt.Errorf("key - " + key + " has an invalid length. Please use keys with a length of 1 to 128 characters") + return errors.New("key - " + key + " has an invalid length. Please use keys with a length of 1 to 128 characters") } if len(*value) < 1 || len(*value) > 256 { - return fmt.Errorf("value - " + *value + " has an invalid length. Please use values with a length of 1 to 256 characters") + return errors.New("value - " + *value + " has an invalid length. Please use values with a length of 1 to 256 characters") } if !validKeyPattern.MatchString(key) { - return fmt.Errorf("key - " + key + " does not follow the regex pattern" + `^([\p{L}\p{Z}\p{N}_.:/=+\-@]+)$`) + return errors.New("key - " + key + " does not follow the regex pattern" + `^([\p{L}\p{Z}\p{N}_.:/=+\-@]+)$`) } if !validValuePattern.MatchString(*value) { - return fmt.Errorf("value - " + *value + " does not follow the regex pattern" + `^([\p{L}\p{Z}\p{N}_.:/=+\-@]*)$`) + return errors.New("value - " + *value + " does not follow the regex pattern" + `^([\p{L}\p{Z}\p{N}_.:/=+\-@]*)$`) } } diff --git a/internal/aws/ecsutil/client_test.go b/internal/aws/ecsutil/client_test.go index 1a4c0e3d9ff9..a015de4ee92d 100644 --- a/internal/aws/ecsutil/client_test.go +++ b/internal/aws/ecsutil/client_test.go @@ -30,14 +30,14 @@ func TestClient(t *testing.T) { require.Equal(t, "hello", string(resp)) require.True(t, tr.closed) require.Equal(t, baseURL.String()+"/stats", tr.url) - require.Equal(t, 1, len(tr.header)) + require.Len(t, tr.header, 1) require.Equal(t, "application/json", tr.header["Content-Type"][0]) - require.Equal(t, "GET", tr.method) + require.Equal(t, http.MethodGet, tr.method) } func TestNewClientProvider(t *testing.T) { baseURL, _ := url.Parse("http://localhost:8080") - provider := NewClientProvider(*baseURL, confighttp.ClientConfig{}, componenttest.NewNopHost(), componenttest.NewNopTelemetrySettings()) + provider := NewClientProvider(*baseURL, confighttp.NewDefaultClientConfig(), componenttest.NewNopHost(), componenttest.NewNopTelemetrySettings()) require.NotNil(t, provider) _, ok := provider.(*defaultClientProvider) require.True(t, ok) @@ -49,7 +49,7 @@ func TestNewClientProvider(t *testing.T) { func TestDefaultClient(t *testing.T) { endpoint, _ := url.Parse("http://localhost:8080") - client, err := defaultClient(context.Background(), *endpoint, confighttp.ClientConfig{}, componenttest.NewNopHost(), componenttest.NewNopTelemetrySettings()) + client, err := defaultClient(context.Background(), *endpoint, confighttp.NewDefaultClientConfig(), componenttest.NewNopHost(), componenttest.NewNopTelemetrySettings()) require.NoError(t, err) require.NotNil(t, client.httpClient.Transport) require.Equal(t, "http://localhost:8080", client.baseURL.String()) diff --git a/internal/aws/ecsutil/go.mod b/internal/aws/ecsutil/go.mod index 6bf3c72524cc..3e8a83b9ae03 100644 --- a/internal/aws/ecsutil/go.mod +++ b/internal/aws/ecsutil/go.mod @@ -1,66 +1,53 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/ecsutil -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/confighttp v0.102.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/confighttp v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/snappy v0.0.4 // indirect - github.com/hashicorp/go-version v1.7.0 // indirect - github.com/klauspost/compress v1.17.8 // indirect - github.com/knadh/koanf/maps v0.1.1 // indirect - github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect - github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/klauspost/compress v1.17.11 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/rs/cors v1.10.1 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/configopaque v1.9.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/confmap v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/metric v1.27.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - go.opentelemetry.io/otel/trace v1.27.0 // indirect + github.com/rs/cors v1.11.1 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/configopaque v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/configtls v1.22.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/internal/aws/ecsutil/go.sum b/internal/aws/ecsutil/go.sum index 7596a5a83f89..02de984311c9 100644 --- a/internal/aws/ecsutil/go.sum +++ b/internal/aws/ecsutil/go.sum @@ -1,114 +1,92 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= -github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= -github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= -github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= -github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -124,20 +102,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -146,12 +124,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/internal/aws/ecsutil/metadata_provider.go b/internal/aws/ecsutil/metadata_provider.go index 34b814aba246..75698eedd26b 100644 --- a/internal/aws/ecsutil/metadata_provider.go +++ b/internal/aws/ecsutil/metadata_provider.go @@ -42,7 +42,7 @@ func NewDetectedTaskMetadataProvider(set component.TelemetrySettings) (MetadataP return nil, fmt.Errorf("unable to detect task metadata endpoint") } - clientSettings := confighttp.ClientConfig{} + clientSettings := confighttp.NewDefaultClientConfig() client, err := NewRestClient(*endpoint, clientSettings, set) if err != nil { return nil, err @@ -64,7 +64,6 @@ func (md *ecsMetadataProviderImpl) FetchTaskMetadata() (*TaskMetadata, error) { taskMetadata := &TaskMetadata{} err = json.NewDecoder(bytes.NewReader(resp)).Decode(taskMetadata) - if err != nil { return nil, fmt.Errorf("encountered unexpected error reading response from ECS Task Metadata Endpoint: %w", err) } @@ -82,7 +81,6 @@ func (md *ecsMetadataProviderImpl) FetchContainerMetadata() (*ContainerMetadata, containerMetadata := &ContainerMetadata{} err = json.NewDecoder(bytes.NewReader(resp)).Decode(containerMetadata) - if err != nil { return nil, fmt.Errorf("encountered unexpected error reading response from ECS Container Metadata Endpoint: %w", err) } diff --git a/internal/aws/ecsutil/metadata_provider_test.go b/internal/aws/ecsutil/metadata_provider_test.go index 5cf34e233df4..a3418d75002d 100644 --- a/internal/aws/ecsutil/metadata_provider_test.go +++ b/internal/aws/ecsutil/metadata_provider_test.go @@ -41,7 +41,7 @@ func Test_ecsMetadata_fetchTask(t *testing.T) { assert.Equal(t, "ec2", fetchResp.LaunchType) assert.Equal(t, "us-west-2a", fetchResp.AvailabilityZone) assert.Equal(t, "1", fetchResp.Revision) - assert.Equal(t, 3, len(fetchResp.Containers)) + assert.Len(t, fetchResp.Containers, 3) } func Test_ecsMetadata_fetchContainer(t *testing.T) { diff --git a/internal/aws/ecsutil/rest_client_test.go b/internal/aws/ecsutil/rest_client_test.go index d971fa439e30..d715223e7ba3 100644 --- a/internal/aws/ecsutil/rest_client_test.go +++ b/internal/aws/ecsutil/rest_client_test.go @@ -23,7 +23,7 @@ func (f *fakeClient) Get(path string) ([]byte, error) { func TestRestClient(t *testing.T) { u, _ := url.Parse("http://www.test.com") - rest, err := NewRestClient(*u, confighttp.ClientConfig{}, componenttest.NewNopTelemetrySettings()) + rest, err := NewRestClient(*u, confighttp.NewDefaultClientConfig(), componenttest.NewNopTelemetrySettings()) require.NoError(t, err) require.NotNil(t, rest) } diff --git a/internal/aws/k8s/go.mod b/internal/aws/k8s/go.mod index 5d4d7f24ab5e..1b75351a79f3 100644 --- a/internal/aws/k8s/go.mod +++ b/internal/aws/k8s/go.mod @@ -1,31 +1,31 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/k8s -go 1.21.0 +go 1.22.0 require ( - github.com/aws/aws-sdk-go v1.53.11 - github.com/stretchr/testify v1.9.0 + github.com/aws/aws-sdk-go v1.55.5 + github.com/stretchr/testify v1.10.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 - k8s.io/api v0.29.3 - k8s.io/apimachinery v0.29.3 - k8s.io/client-go v0.29.3 + k8s.io/api v0.31.3 + k8s.io/apimachinery v0.31.3 + k8s.io/client-go v0.31.3 ) require ( - github.com/davecgh/go-spew v1.1.1 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect - github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/go-logr/logr v1.3.0 // indirect + github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/swag v0.22.3 // indirect + github.com/go-openapi/swag v0.22.4 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.4.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/imdario/mergo v0.3.6 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect @@ -35,26 +35,27 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/spf13/pflag v1.0.5 // indirect + github.com/x448/float16 v0.8.4 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/oauth2 v0.14.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/term v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/net v0.26.0 // indirect + golang.org/x/oauth2 v0.21.0 // indirect + golang.org/x/sys v0.21.0 // indirect + golang.org/x/term v0.21.0 // indirect + golang.org/x/text v0.16.0 // indirect golang.org/x/time v0.4.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.33.0 // indirect + google.golang.org/protobuf v1.34.2 // indirect + gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/klog/v2 v2.110.1 // indirect - k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect - k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect + k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) retract ( diff --git a/internal/aws/k8s/go.sum b/internal/aws/k8s/go.sum index 9933c70a0602..c01fd806a31a 100644 --- a/internal/aws/k8s/go.sum +++ b/internal/aws/k8s/go.sum @@ -1,26 +1,27 @@ -github.com/aws/aws-sdk-go v1.53.11 h1:KcmduYvX15rRqt4ZU/7jKkmDxU/G87LJ9MUI0yQJh00= -github.com/aws/aws-sdk-go v1.53.11/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= +github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= -github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= +github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= @@ -31,10 +32,10 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af h1:kmjWCqn2qkEml422C2Rrd27c3VGxi6a/6HNq8QmHRKM= +github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= @@ -63,16 +64,17 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= -github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= -github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg= -github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= +github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= +github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -82,8 +84,10 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -98,48 +102,46 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= -golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= +golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= +golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/time v0.4.0 h1:Z81tqI5ddIoXDPvVQ7/7CC9TnLM7ubaFG2qXYd5BbYY= golang.org/x/time v0.4.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= -golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= +gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -148,21 +150,21 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/api v0.29.3 h1:2ORfZ7+bGC3YJqGpV0KSDDEVf8hdGQ6A03/50vj8pmw= -k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80= -k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= -k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= -k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg= -k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= -k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= -k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/api v0.31.3 h1:umzm5o8lFbdN/hIXbrK9oRpOproJO62CV1zqxXrLgk8= +k8s.io/api v0.31.3/go.mod h1:UJrkIp9pnMOI9K2nlL6vwpxRzzEX5sWgn8kGQe92kCE= +k8s.io/apimachinery v0.31.3 h1:6l0WhcYgasZ/wk9ktLq5vLaoXJJr5ts6lkaQzgeYPq4= +k8s.io/apimachinery v0.31.3/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= +k8s.io/client-go v0.31.3 h1:CAlZuM+PH2cm+86LOBemaJI/lQ5linJ6UFxKX/SoG+4= +k8s.io/client-go v0.31.3/go.mod h1:2CgjPUTpv3fE5dNygAr2NcM8nhHzXvxB8KL5gYc3kJs= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/internal/aws/k8s/k8sclient/clientset_test.go b/internal/aws/k8s/k8sclient/clientset_test.go index e6b91a4aae7e..0b64a1b483af 100644 --- a/internal/aws/k8s/k8sclient/clientset_test.go +++ b/internal/aws/k8s/k8sclient/clientset_test.go @@ -19,7 +19,7 @@ func TestGetShutdown(t *testing.T) { InitSyncPollInterval(10*time.Nanosecond), InitSyncPollTimeout(20*time.Nanosecond), ) - assert.Equal(t, 1, len(optionsToK8sClient)) + assert.Len(t, optionsToK8sClient, 1) assert.NotNil(t, k8sClient.GetClientSet()) assert.NotNil(t, k8sClient.GetEpClient()) assert.NotNil(t, k8sClient.GetJobClient()) @@ -32,6 +32,6 @@ func TestGetShutdown(t *testing.T) { assert.Nil(t, k8sClient.node) assert.Nil(t, k8sClient.pod) assert.Nil(t, k8sClient.replicaSet) - assert.Equal(t, 0, len(optionsToK8sClient)) + assert.Empty(t, optionsToK8sClient) removeTempKubeConfig() } diff --git a/internal/aws/k8s/k8sclient/helpers_test.go b/internal/aws/k8s/k8sclient/helpers_test.go index cce65edac1f5..3e26ca8c87f2 100644 --- a/internal/aws/k8s/k8sclient/helpers_test.go +++ b/internal/aws/k8s/k8sclient/helpers_test.go @@ -7,14 +7,13 @@ import ( "os" "testing" + "github.com/stretchr/testify/require" "k8s.io/apimachinery/pkg/runtime" ) -type mockReflectorSyncChecker struct { -} +type mockReflectorSyncChecker struct{} func (m *mockReflectorSyncChecker) Check(_ cacheReflector, _ string) { - } var kubeConfigPath string @@ -51,12 +50,8 @@ users: provideClusterInfo: true ` tmpfile, err := os.CreateTemp("", "kubeconfig") - if err != nil { - t.Error(err) - } - if err := os.WriteFile(tmpfile.Name(), []byte(content), 0600); err != nil { - t.Error(err) - } + require.NoError(t, err) + require.NoError(t, os.WriteFile(tmpfile.Name(), []byte(content), 0o600)) // overwrite the default kube config path kubeConfigPath = tmpfile.Name() return kubeConfigPath diff --git a/internal/aws/k8s/k8sclient/job.go b/internal/aws/k8s/k8sclient/job.go index 3076e3546433..b565482285bd 100644 --- a/internal/aws/k8s/k8sclient/job.go +++ b/internal/aws/k8s/k8sclient/job.go @@ -27,8 +27,7 @@ type JobClient interface { JobToCronJob() map[string]string } -type noOpJobClient struct { -} +type noOpJobClient struct{} func (nc *noOpJobClient) JobToCronJob() map[string]string { return map[string]string{} diff --git a/internal/aws/k8s/k8sclient/node_test.go b/internal/aws/k8s/k8sclient/node_test.go index 6ffbaa363992..b10a32e32184 100644 --- a/internal/aws/k8s/k8sclient/node_test.go +++ b/internal/aws/k8s/k8sclient/node_test.go @@ -302,8 +302,8 @@ func TestNodeClient(t *testing.T) { clusterFailedNodeCount := client.ClusterFailedNodeCount() log.Printf("clusterNodeCount: %v, clusterFailedNodeCount: %v", clusterNodeCount, clusterFailedNodeCount) - assert.Equal(t, clusterNodeCount, expectedClusterNodeCount) - assert.Equal(t, clusterFailedNodeCount, expectedClusterFailedNodeCount) + assert.Equal(t, expectedClusterNodeCount, clusterNodeCount) + assert.Equal(t, expectedClusterFailedNodeCount, clusterFailedNodeCount) client.shutdown() assert.True(t, client.stopped) } diff --git a/internal/aws/k8s/k8sclient/obj_store.go b/internal/aws/k8s/k8sclient/obj_store.go index 8f51bd5bf185..288e6eb26f84 100644 --- a/internal/aws/k8s/k8sclient/obj_store.go +++ b/internal/aws/k8s/k8sclient/obj_store.go @@ -80,7 +80,6 @@ func (s *ObjStore) Update(obj any) error { // Delete implements the Delete method of the store interface. // Delete deletes an existing entry in the ObjStore. func (s *ObjStore) Delete(obj any) error { - o, err := meta.Accessor(obj) if err != nil { return err diff --git a/internal/aws/k8s/k8sclient/obj_store_test.go b/internal/aws/k8s/k8sclient/obj_store_test.go index 8ffb06fd9b59..f0405c81e330 100644 --- a/internal/aws/k8s/k8sclient/obj_store_test.go +++ b/internal/aws/k8s/k8sclient/obj_store_test.go @@ -25,7 +25,7 @@ var transformFuncWithError = func(v any) (any, error) { func TestResync(t *testing.T) { o := NewObjStore(transformFunc, zap.NewNop()) - assert.Nil(t, o.Resync()) + assert.NoError(t, o.Resync()) } func TestGet(t *testing.T) { @@ -68,7 +68,7 @@ func TestGetList(t *testing.T) { "20036b33-cb03-489b-b778-e516b4dae519": "a", } val := o.List() - assert.Equal(t, 1, len(val)) + assert.Len(t, val, 1) expected := o.objs["20036b33-cb03-489b-b778-e516b4dae519"] assert.Equal(t, expected, val[0]) } @@ -119,7 +119,7 @@ func TestDelete(t *testing.T) { assert.True(t, o.refreshed) keys := o.ListKeys() - assert.Equal(t, 1, len(keys)) + assert.Len(t, keys, 1) assert.Equal(t, "75ab40d2-552a-4c05-82c9-0ddcb3008657", keys[0]) } @@ -174,11 +174,11 @@ func TestUpdate(t *testing.T) { assert.NoError(t, err) keys := o.ListKeys() - assert.Equal(t, 1, len(keys)) + assert.Len(t, keys, 1) assert.Equal(t, "bc5f5839-f62e-44b9-a79e-af250d92dcb1", keys[0]) values := o.List() - assert.Equal(t, 1, len(values)) + assert.Len(t, values, 1) assert.Equal(t, updatedObj, values[0]) } diff --git a/internal/aws/k8s/k8sclient/replicaset.go b/internal/aws/k8s/k8sclient/replicaset.go index cfa73d773e67..7d911c6a6532 100644 --- a/internal/aws/k8s/k8sclient/replicaset.go +++ b/internal/aws/k8s/k8sclient/replicaset.go @@ -27,8 +27,7 @@ type ReplicaSetClient interface { ReplicaSetToDeployment() map[string]string } -type noOpReplicaSetClient struct { -} +type noOpReplicaSetClient struct{} func (nc *noOpReplicaSetClient) ReplicaSetToDeployment() map[string]string { return map[string]string{} diff --git a/internal/aws/metrics/go.mod b/internal/aws/metrics/go.mod index d5820f019e92..e42da870540b 100644 --- a/internal/aws/metrics/go.mod +++ b/internal/aws/metrics/go.mod @@ -1,10 +1,10 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/metrics -go 1.21.0 +go 1.22.0 require ( - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/otel v1.27.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/otel v1.32.0 go.uber.org/goleak v1.3.0 ) diff --git a/internal/aws/metrics/go.sum b/internal/aws/metrics/go.sum index ae3fc7feb663..335b9a039af8 100644 --- a/internal/aws/metrics/go.sum +++ b/internal/aws/metrics/go.sum @@ -11,10 +11,10 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/internal/aws/metrics/metric_calculator.go b/internal/aws/metrics/metric_calculator.go index 098b673fbded..16435ef7f754 100644 --- a/internal/aws/metrics/metric_calculator.go +++ b/internal/aws/metrics/metric_calculator.go @@ -122,7 +122,7 @@ type MapWithExpiry struct { // NewMapWithExpiry automatically starts a sweeper to enforce the maps TTL. ShutDown() must be called to ensure that these // go routines are properly cleaned up ShutDown() must be called. func NewMapWithExpiry(ttl time.Duration) *MapWithExpiry { - m := &MapWithExpiry{lock: &sync.Mutex{}, ttl: ttl, entries: make(map[any]*MetricValue), doneChan: make(chan struct{})} + m := &MapWithExpiry{lock: &sync.Mutex{}, ttl: ttl, entries: make(map[any]*MetricValue), doneChan: make(chan struct{}, 1000)} go m.sweep(m.CleanUp) return m } @@ -157,7 +157,6 @@ func (m *MapWithExpiry) Shutdown() error { return errors.New("shutdown called on an already closed channel") default: close(m.doneChan) - } return nil } diff --git a/internal/aws/metrics/metric_calculator_test.go b/internal/aws/metrics/metric_calculator_test.go index 27a32d0f62ae..759d15ee4835 100644 --- a/internal/aws/metrics/metric_calculator_test.go +++ b/internal/aws/metrics/metric_calculator_test.go @@ -106,14 +106,14 @@ func TestMapWithExpiryAdd(t *testing.T) { store.Set(Key{MetricMetadata: "key1"}, MetricValue{RawValue: value1}) val, ok := store.Get(Key{MetricMetadata: "key1"}) store.Unlock() - assert.Equal(t, true, ok) + assert.True(t, ok) assert.Equal(t, value1, val.RawValue) store.Lock() defer store.Unlock() val, ok = store.Get(Key{MetricMetadata: "key2"}) - assert.Equal(t, false, ok) - assert.True(t, val == nil) + assert.False(t, ok) + assert.Nil(t, val) require.NoError(t, store.Shutdown()) } @@ -134,7 +134,7 @@ func TestMapWithExpiryCleanup(t *testing.T) { val, ok := store.Get(Key{MetricMetadata: "key1"}) - assert.Equal(t, true, ok) + assert.True(t, ok) assert.Equal(t, value1, val.RawValue.(float64)) assert.Equal(t, 1, store.Size()) store.Unlock() @@ -143,8 +143,8 @@ func TestMapWithExpiryCleanup(t *testing.T) { store.CleanUp(time.Now()) store.Lock() val, ok = store.Get(Key{MetricMetadata: "key1"}) - assert.Equal(t, false, ok) - assert.True(t, val == nil) + assert.False(t, ok) + assert.Nil(t, val) assert.Equal(t, 0, store.Size()) store.Unlock() } @@ -278,7 +278,5 @@ func TestSweep(t *testing.T) { require.NoError(t, mwe.Shutdown()) for range sweepEvent { // nolint } - if !closed.Load() { - t.Errorf("Sweeper did not terminate.") - } + assert.True(t, closed.Load(), "Sweeper did not terminate.") } diff --git a/internal/aws/proxy/cfg.go b/internal/aws/proxy/cfg.go index 2d352d58f742..77aad63cceab 100644 --- a/internal/aws/proxy/cfg.go +++ b/internal/aws/proxy/cfg.go @@ -7,7 +7,7 @@ import ( "go.opentelemetry.io/collector/config/confignet" "go.opentelemetry.io/collector/config/configtls" - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/localhostgate" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/testutil" ) // Config is the configuration for the local TCP proxy server. @@ -49,7 +49,7 @@ type Config struct { func DefaultConfig() *Config { return &Config{ TCPAddrConfig: confignet.TCPAddrConfig{ - Endpoint: localhostgate.EndpointForPort(2000), + Endpoint: testutil.EndpointForPort(2000), }, ProxyAddress: "", TLSSetting: configtls.ClientConfig{ diff --git a/internal/aws/proxy/conn.go b/internal/aws/proxy/conn.go index e0e850428b10..c9eb13f2e34a 100644 --- a/internal/aws/proxy/conn.go +++ b/internal/aws/proxy/conn.go @@ -60,7 +60,6 @@ var newAWSSession = func(roleArn string, region string, log *zap.Logger) (*sessi sess, err := session.NewSession(&aws.Config{ Credentials: stsCreds, }) - if err != nil { return nil, err } diff --git a/internal/aws/proxy/conn_test.go b/internal/aws/proxy/conn_test.go index fec2f9328573..6be4d76f6655 100644 --- a/internal/aws/proxy/conn_test.go +++ b/internal/aws/proxy/conn_test.go @@ -43,7 +43,8 @@ func logSetup() (*zap.Logger, *observer.ObservedLogs) { } func setupMock(sess *session.Session) (f1 func(s *session.Session) (string, error), - f2 func(roleArn string, region string, logger *zap.Logger) (*session.Session, error)) { + f2 func(roleArn string, region string, logger *zap.Logger) (*session.Session, error), +) { f1 = getEC2Region f2 = newAWSSession m := mock{sn: sess} @@ -174,7 +175,7 @@ func TestRegionFromEC2(t *testing.T) { logs := recordedLogs.All() lastEntry := logs[len(logs)-1] assert.Contains(t, lastEntry.Message, "Fetched region from EC2 metadata", "expected log message") - assert.Equal(t, lastEntry.Context[0].Key, "region", "expected log key") + assert.Equal(t, "region", lastEntry.Context[0].Key, "expected log key") assert.Equal(t, lastEntry.Context[0].String, ec2Region) } @@ -255,8 +256,7 @@ func TestLoadEnvConfigCreds(t *testing.T) { assert.Equal(t, cases.Val, value, "Expect the credentials value to match") _, err = newAWSSession("ROLEARN", "TEST", zap.NewNop()) - assert.Error(t, err, "expected error") - assert.Contains(t, err.Error(), "unable to handle AWS error", "expected error message") + assert.ErrorContains(t, err, "unable to handle AWS error", "expected error message") } func TestGetProxyUrlProxyAddressNotValid(t *testing.T) { @@ -339,8 +339,7 @@ func TestProxyServerTransportInvalidProxyAddr(t *testing.T) { _, err := proxyServerTransport(&Config{ ProxyAddress: "invalid\n", }) - assert.Error(t, err, "expected error") - assert.Contains(t, err.Error(), "invalid control character in URL") + assert.ErrorContains(t, err, "invalid control character in URL") } func TestProxyServerTransportHappyCase(t *testing.T) { @@ -356,8 +355,8 @@ func TestGetSTSCredsFromPrimaryRegionEndpoint(t *testing.T) { fake := &stsCalls{ log: zap.NewNop(), getSTSCredsFromRegionEndpoint: func(_ *zap.Logger, _ *session.Session, region, roleArn string) *credentials.Credentials { - assert.Equal(t, region, endpoints.UsEast1RegionID, "expected region differs") - assert.Equal(t, roleArn, expectedRoleARN, "expected role ARN differs") + assert.Equal(t, endpoints.UsEast1RegionID, region, "expected region differs") + assert.Equal(t, expectedRoleARN, roleArn, "expected role ARN differs") called = true return nil }, @@ -368,8 +367,8 @@ func TestGetSTSCredsFromPrimaryRegionEndpoint(t *testing.T) { called = false fake.getSTSCredsFromRegionEndpoint = func(_ *zap.Logger, _ *session.Session, region, roleArn string) *credentials.Credentials { - assert.Equal(t, region, endpoints.CnNorth1RegionID, "expected region differs") - assert.Equal(t, roleArn, expectedRoleARN, "expected role ARN differs") + assert.Equal(t, endpoints.CnNorth1RegionID, region, "expected region differs") + assert.Equal(t, expectedRoleARN, roleArn, "expected role ARN differs") called = true return nil } @@ -379,8 +378,8 @@ func TestGetSTSCredsFromPrimaryRegionEndpoint(t *testing.T) { called = false fake.getSTSCredsFromRegionEndpoint = func(_ *zap.Logger, _ *session.Session, region, roleArn string) *credentials.Credentials { - assert.Equal(t, region, endpoints.UsGovWest1RegionID, "expected region differs") - assert.Equal(t, roleArn, expectedRoleARN, "expected role ARN differs") + assert.Equal(t, endpoints.UsGovWest1RegionID, region, "expected region differs") + assert.Equal(t, expectedRoleARN, roleArn, "expected role ARN differs") called = true return nil } @@ -401,8 +400,7 @@ func TestGetSTSCredsFromPrimaryRegionEndpoint(t *testing.T) { "expected error message") } -type mockAWSErr struct { -} +type mockAWSErr struct{} func (m *mockAWSErr) Error() string { return "mockAWSErr" @@ -435,6 +433,7 @@ func (m *mockProvider) Retrieve() (credentials.Value, error) { func (m *mockProvider) IsExpired() bool { return true } + func TestSTSRegionalEndpointDisabled(t *testing.T) { logger, recordedLogs := logSetup() @@ -461,8 +460,7 @@ func TestSTSRegionalEndpointDisabled(t *testing.T) { "STS regional endpoint disabled. Credentials for provided RoleARN will be fetched from STS primary region endpoint instead", "expected log message") assert.Equal(t, - lastEntry.Context[0].String, - expectedRegion, "expected error") + expectedRegion, lastEntry.Context[0].String, "expected error") assert.EqualError(t, lastEntry.Context[1].Interface.(error), expectedErr.Error(), "expected error") diff --git a/internal/aws/proxy/go.mod b/internal/aws/proxy/go.mod index ffb9d6585ee2..f51ee3f1aa39 100644 --- a/internal/aws/proxy/go.mod +++ b/internal/aws/proxy/go.mod @@ -1,24 +1,24 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/proxy -go 1.21.0 +go 1.22.0 require ( - github.com/aws/aws-sdk-go v1.53.11 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/config/confignet v0.102.0 - go.opentelemetry.io/collector/config/configtls v0.102.0 + github.com/aws/aws-sdk-go v1.55.5 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/config/confignet v1.22.0 + go.opentelemetry.io/collector/config/configtls v1.22.0 go.uber.org/zap v1.27.0 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - go.opentelemetry.io/collector/config/configopaque v1.9.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect + go.opentelemetry.io/collector/config/configopaque v1.22.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/sys v0.14.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/internal/aws/proxy/go.sum b/internal/aws/proxy/go.sum index 98db9ae86156..436c21c0f79b 100644 --- a/internal/aws/proxy/go.sum +++ b/internal/aws/proxy/go.sum @@ -1,49 +1,35 @@ -github.com/aws/aws-sdk-go v1.53.11 h1:KcmduYvX15rRqt4ZU/7jKkmDxU/G87LJ9MUI0yQJh00= -github.com/aws/aws-sdk-go v1.53.11/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= +github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= -github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= -github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= -github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -go.opentelemetry.io/collector/config/confignet v0.102.0 h1:+wQevJ/iBnPxL+roY7WWnAjMxB8v4M5QrS3+0iEmauw= -go.opentelemetry.io/collector/config/confignet v0.102.0/go.mod h1:pfOrCTfSZEB6H2rKtx41/3RN4dKs+X2EKQbw3MGRh0E= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.opentelemetry.io/collector/config/confignet v1.22.0 h1:SBEMHJZWD8J4qgFw1O+BEkXW9AWldDi6Fz5YeDeoU58= +go.opentelemetry.io/collector/config/confignet v1.22.0/go.mod h1:ZppUH1hgUJOubawEsxsQ9MzEYFytqo2GnVSS7d4CVxc= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= diff --git a/internal/aws/proxy/server_test.go b/internal/aws/proxy/server_test.go index 664684bb33f5..f515c59e71da 100644 --- a/internal/aws/proxy/server_test.go +++ b/internal/aws/proxy/server_test.go @@ -73,7 +73,7 @@ func TestHandlerHappyCase(t *testing.T) { assert.NoError(t, err, "NewServer should succeed") handler := srv.(*http.Server).Handler.ServeHTTP - req := httptest.NewRequest("POST", + req := httptest.NewRequest(http.MethodPost, "https://xray.us-west-2.amazonaws.com/GetSamplingRules", strings.NewReader(`{"NextToken": null}`)) rec := httptest.NewRecorder() handler(rec, req) @@ -99,7 +99,7 @@ func TestHandlerIoReadSeekerCreationFailed(t *testing.T) { expectedErr := errors.New("expected mockReadCloser error") handler := srv.(*http.Server).Handler.ServeHTTP - req := httptest.NewRequest("POST", + req := httptest.NewRequest(http.MethodPost, "https://xray.us-west-2.amazonaws.com/GetSamplingRules", &mockReadCloser{ readErr: expectedErr, }) @@ -127,7 +127,7 @@ func TestHandlerNilBodyIsOk(t *testing.T) { assert.NoError(t, err, "NewServer should succeed") handler := srv.(*http.Server).Handler.ServeHTTP - req := httptest.NewRequest("POST", + req := httptest.NewRequest(http.MethodPost, "https://xray.us-west-2.amazonaws.com/GetSamplingRules", nil) rec := httptest.NewRecorder() handler(rec, req) @@ -151,7 +151,7 @@ func TestHandlerSignerErrorsOut(t *testing.T) { assert.NoError(t, err, "NewServer should succeed") handler := srv.(*http.Server).Handler.ServeHTTP - req := httptest.NewRequest("POST", + req := httptest.NewRequest(http.MethodPost, "https://xray.us-west-2.amazonaws.com/GetSamplingRules", strings.NewReader(`{}`)) rec := httptest.NewRecorder() handler(rec, req) @@ -207,7 +207,7 @@ func TestCantGetServiceEndpoint(t *testing.T) { _, err := NewServer(cfg, logger) assert.Error(t, err, "NewServer should fail") - assert.Contains(t, err.Error(), "invalid region") + assert.ErrorContains(t, err, "invalid region") } func TestAWSEndpointInvalid(t *testing.T) { @@ -222,7 +222,7 @@ func TestAWSEndpointInvalid(t *testing.T) { _, err := NewServer(cfg, logger) assert.Error(t, err, "NewServer should fail") - assert.Contains(t, err.Error(), "unable to parse AWS service endpoint") + assert.ErrorContains(t, err, "unable to parse AWS service endpoint") } func TestCanCreateTransport(t *testing.T) { @@ -237,7 +237,7 @@ func TestCanCreateTransport(t *testing.T) { _, err := NewServer(cfg, logger) assert.Error(t, err, "NewServer should fail") - assert.Contains(t, err.Error(), "failed to parse proxy URL") + assert.ErrorContains(t, err, "failed to parse proxy URL") } func TestGetServiceEndpointInvalidAWSConfig(t *testing.T) { diff --git a/internal/aws/xray/go.mod b/internal/aws/xray/go.mod index 37e3783fac0b..7f282a05f326 100644 --- a/internal/aws/xray/go.mod +++ b/internal/aws/xray/go.mod @@ -1,41 +1,34 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/xray -go 1.21.0 +go 1.22.0 require ( - github.com/aws/aws-sdk-go v1.53.11 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutil v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 + github.com/aws/aws-sdk-go v1.55.5 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutil v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/knadh/koanf/maps v0.1.1 // indirect - github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect - github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/stretchr/objx v0.5.2 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/confmap v0.102.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/metric v1.27.0 // indirect - go.opentelemetry.io/otel/trace v1.27.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.20.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/internal/aws/xray/go.sum b/internal/aws/xray/go.sum index 19010333dad5..9b949072118f 100644 --- a/internal/aws/xray/go.sum +++ b/internal/aws/xray/go.sum @@ -1,16 +1,16 @@ -github.com/aws/aws-sdk-go v1.53.11 h1:KcmduYvX15rRqt4ZU/7jKkmDxU/G87LJ9MUI0yQJh00= -github.com/aws/aws-sdk-go v1.53.11/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= +github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= @@ -19,20 +19,10 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGw github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= -github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= -github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= -github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= @@ -40,24 +30,22 @@ github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncj github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -73,20 +61,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -95,12 +83,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/internal/aws/xray/telemetry/nop_sender.go b/internal/aws/xray/telemetry/nop_sender.go index c87ac6edcaf5..698967e99657 100644 --- a/internal/aws/xray/telemetry/nop_sender.go +++ b/internal/aws/xray/telemetry/nop_sender.go @@ -12,8 +12,7 @@ func NewNopSender() Sender { var nopSenderInstance Sender = &nopSender{} -type nopSender struct { -} +type nopSender struct{} func (n nopSender) Rotate() *xray.TelemetryRecord { return nil diff --git a/internal/aws/xray/telemetry/sender_test.go b/internal/aws/xray/telemetry/sender_test.go index 9ec4a54cec6e..877b1ccf33d0 100644 --- a/internal/aws/xray/telemetry/sender_test.go +++ b/internal/aws/xray/telemetry/sender_test.go @@ -113,10 +113,10 @@ func TestQueueOverflow(t *testing.T) { } // number of dropped records assert.Equal(t, 5, logs.Len()) - assert.Equal(t, 20, len(sender.queue)) + assert.Len(t, sender.queue, 20) sender.send() // only one batch succeeded - assert.Equal(t, 15, len(sender.queue)) + assert.Len(t, sender.queue, 15) // verify that sent back of queue for _, record := range sender.queue { assert.Greater(t, *record.SegmentsSentCount, int64(5)) diff --git a/internal/aws/xray/testdata/sampleapp/go.mod b/internal/aws/xray/testdata/sampleapp/go.mod index 9c59ca80cbbb..b40eeecf2972 100644 --- a/internal/aws/xray/testdata/sampleapp/go.mod +++ b/internal/aws/xray/testdata/sampleapp/go.mod @@ -1,26 +1,24 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/xray/testdata/sampleapp -go 1.21.0 +go 1.22.0 require ( - github.com/aws/aws-sdk-go v1.53.11 - github.com/aws/aws-xray-sdk-go v1.8.4 + github.com/aws/aws-sdk-go v1.55.5 + github.com/aws/aws-xray-sdk-go v1.8.5 ) require ( - github.com/andybalholm/brotli v1.0.6 // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/andybalholm/brotli v1.1.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/klauspost/compress v1.17.2 // indirect + github.com/klauspost/compress v1.17.6 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/stretchr/testify v1.8.4 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/fasthttp v1.50.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect - google.golang.org/grpc v1.59.0 // indirect + github.com/valyala/fasthttp v1.52.0 // indirect + golang.org/x/net v0.26.0 // indirect + golang.org/x/sys v0.21.0 // indirect + golang.org/x/text v0.16.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect + google.golang.org/grpc v1.64.1 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect ) diff --git a/internal/aws/xray/testdata/sampleapp/go.sum b/internal/aws/xray/testdata/sampleapp/go.sum index fc7eee6f1cd3..e7c97fb5a52f 100644 --- a/internal/aws/xray/testdata/sampleapp/go.sum +++ b/internal/aws/xray/testdata/sampleapp/go.sum @@ -1,28 +1,24 @@ github.com/DATA-DOG/go-sqlmock v1.5.1 h1:FK6RCIUSfmbnI/imIICmboyQBkOckutaa6R5YYlLZyo= github.com/DATA-DOG/go-sqlmock v1.5.1/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= -github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI= -github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/aws/aws-sdk-go v1.53.11 h1:KcmduYvX15rRqt4ZU/7jKkmDxU/G87LJ9MUI0yQJh00= -github.com/aws/aws-sdk-go v1.53.11/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= -github.com/aws/aws-xray-sdk-go v1.8.4 h1:5D631fWhs5hdBFW/8ALjWam+alm4tW42UGAuMJ1WAUI= -github.com/aws/aws-xray-sdk-go v1.8.4/go.mod h1:mbN1uxWCue9WjS2Oj2FWg7TGIsLikxMOscD0qtEjFFY= +github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= +github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= +github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= +github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/aws/aws-xray-sdk-go v1.8.5 h1:A/Gc733PHvARkjcAk+fw+0k2RT3O4VSZ+x/3YvAREfc= +github.com/aws/aws-xray-sdk-go v1.8.5/go.mod h1:tDkyLXjXQ+9j49uUrFXhO9cPnpH7qp7PWkEON+KbbKs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 h1:pRhl55Yx1eC7BZ1N+BBWwnKaMyD8uC+34TLdndZMAKk= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ/U4HP0zS2Z9Fh8Ps9a+6X26m/tmI= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4= -github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.6 h1:60eq2E/jlfwQXtvZEeBUYADs+BwKBWURIY+Gj2eRGjI= +github.com/klauspost/compress v1.17.6/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -32,21 +28,18 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.50.0 h1:H7fweIlBm0rXLs2q0XbalvJ6r0CUPFWK3/bB4N13e9M= -github.com/valyala/fasthttp v1.50.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= -google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= -google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +github.com/valyala/fasthttp v1.52.0 h1:wqBQpxH71XW0e2g+Og4dzQM8pk34aFYlA1Ga8db7gU0= +github.com/valyala/fasthttp v1.52.0/go.mod h1:hf5C4QnVMkNXMspnsUlfM3WitlgYflyhHYoKol/szxQ= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/grpc v1.64.1 h1:LKtvyfbX3UGVPFcGqJ9ItpVWW6oN/2XqTxfAnwRRXiA= +google.golang.org/grpc v1.64.1/go.mod h1:hiQF4LFZelK2WKaP6W0L92zGHtiQdZxk8CrSdvyjeP0= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/internal/aws/xray/testdata/sampleapp/sample.go b/internal/aws/xray/testdata/sampleapp/sample.go index ab0bd311dd7d..7510a660dddc 100644 --- a/internal/aws/xray/testdata/sampleapp/sample.go +++ b/internal/aws/xray/testdata/sampleapp/sample.go @@ -28,7 +28,8 @@ type Record struct { func main() { dynamo = dynamodb.New(session.Must(session.NewSession( &aws.Config{ - Region: aws.String("us-west-2")}, + Region: aws.String("us-west-2"), + }, ))) xray.AWS(dynamo.Client) diff --git a/internal/aws/xray/testdata/sampleserver/go.mod b/internal/aws/xray/testdata/sampleserver/go.mod index 1b7ebb411f5c..784c618d4bc5 100644 --- a/internal/aws/xray/testdata/sampleserver/go.mod +++ b/internal/aws/xray/testdata/sampleserver/go.mod @@ -1,24 +1,22 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/xray/testdata/sampleserver -go 1.21.0 +go 1.22.0 -require github.com/aws/aws-xray-sdk-go v1.8.4 +require github.com/aws/aws-xray-sdk-go v1.8.5 require ( - github.com/andybalholm/brotli v1.0.6 // indirect + github.com/andybalholm/brotli v1.1.0 // indirect github.com/aws/aws-sdk-go v1.47.10 // indirect - github.com/golang/protobuf v1.5.3 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/klauspost/compress v1.17.2 // indirect + github.com/klauspost/compress v1.17.6 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/stretchr/testify v1.8.4 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/fasthttp v1.50.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect - google.golang.org/grpc v1.59.0 // indirect + github.com/valyala/fasthttp v1.52.0 // indirect + golang.org/x/net v0.26.0 // indirect + golang.org/x/sys v0.21.0 // indirect + golang.org/x/text v0.16.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect + google.golang.org/grpc v1.64.1 // indirect google.golang.org/protobuf v1.33.0 // indirect ) diff --git a/internal/aws/xray/testdata/sampleserver/go.sum b/internal/aws/xray/testdata/sampleserver/go.sum index b53e7e19785f..2517f40e0880 100644 --- a/internal/aws/xray/testdata/sampleserver/go.sum +++ b/internal/aws/xray/testdata/sampleserver/go.sum @@ -1,28 +1,24 @@ github.com/DATA-DOG/go-sqlmock v1.5.1 h1:FK6RCIUSfmbnI/imIICmboyQBkOckutaa6R5YYlLZyo= github.com/DATA-DOG/go-sqlmock v1.5.1/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= -github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI= -github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= +github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= github.com/aws/aws-sdk-go v1.47.10 h1:cvufN7WkD1nlOgpRopsmxKQlFp5X1MfyAw4r7BBORQc= github.com/aws/aws-sdk-go v1.47.10/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= -github.com/aws/aws-xray-sdk-go v1.8.4 h1:5D631fWhs5hdBFW/8ALjWam+alm4tW42UGAuMJ1WAUI= -github.com/aws/aws-xray-sdk-go v1.8.4/go.mod h1:mbN1uxWCue9WjS2Oj2FWg7TGIsLikxMOscD0qtEjFFY= +github.com/aws/aws-xray-sdk-go v1.8.5 h1:A/Gc733PHvARkjcAk+fw+0k2RT3O4VSZ+x/3YvAREfc= +github.com/aws/aws-xray-sdk-go v1.8.5/go.mod h1:tDkyLXjXQ+9j49uUrFXhO9cPnpH7qp7PWkEON+KbbKs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 h1:pRhl55Yx1eC7BZ1N+BBWwnKaMyD8uC+34TLdndZMAKk= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ/U4HP0zS2Z9Fh8Ps9a+6X26m/tmI= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4= -github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.6 h1:60eq2E/jlfwQXtvZEeBUYADs+BwKBWURIY+Gj2eRGjI= +github.com/klauspost/compress v1.17.6/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -32,21 +28,18 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.50.0 h1:H7fweIlBm0rXLs2q0XbalvJ6r0CUPFWK3/bB4N13e9M= -github.com/valyala/fasthttp v1.50.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= -google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= -google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +github.com/valyala/fasthttp v1.52.0 h1:wqBQpxH71XW0e2g+Og4dzQM8pk34aFYlA1Ga8db7gU0= +github.com/valyala/fasthttp v1.52.0/go.mod h1:hf5C4QnVMkNXMspnsUlfM3WitlgYflyhHYoKol/szxQ= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/grpc v1.64.1 h1:LKtvyfbX3UGVPFcGqJ9ItpVWW6oN/2XqTxfAnwRRXiA= +google.golang.org/grpc v1.64.1/go.mod h1:hiQF4LFZelK2WKaP6W0L92zGHtiQdZxk8CrSdvyjeP0= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/internal/aws/xray/tracesegment_test.go b/internal/aws/xray/tracesegment_test.go index 6edffec73b2b..c5daf8156f28 100644 --- a/internal/aws/xray/tracesegment_test.go +++ b/internal/aws/xray/tracesegment_test.go @@ -6,6 +6,7 @@ package awsxray import ( "encoding/json" "fmt" + "net/http" "os" "path/filepath" "testing" @@ -501,7 +502,7 @@ var rawExpectedSegmentForInstrumentedServer = Segment{ EndTime: aws.Float64(1596648396.6401389), HTTP: &HTTPData{ Request: &RequestData{ - Method: String("GET"), + Method: String(http.MethodGet), URL: String("http://localhost:8000/"), ClientIP: String("127.0.0.1"), UserAgent: String("Go-http-client/1.1"), @@ -598,7 +599,6 @@ func TestTraceBodyUnMarshalling(t *testing.T) { ExceptionID: String("abcdefghijklmnop"), }, }, actualSeg, testCase+": unmarshalled segment is different from the expected") - }, }, { @@ -627,9 +627,9 @@ func TestTraceBodyUnMarshalling(t *testing.T) { for _, tc := range tests { content, err := os.ReadFile(tc.samplePath) - assert.NoError(t, err, fmt.Sprintf("[%s] can not read raw segment", tc.testCase)) + assert.NoErrorf(t, err, "[%s] can not read raw segment", tc.testCase) - assert.True(t, len(content) > 0, fmt.Sprintf("[%s] content length is 0", tc.testCase)) + assert.NotEmptyf(t, content, "[%s] content length is 0", tc.testCase) var actualSeg Segment err = json.Unmarshal(content, &actualSeg) diff --git a/internal/aws/xray/xray_client.go b/internal/aws/xray/xray_client.go index adb8d0ba7262..072d267a0c5c 100644 --- a/internal/aws/xray/xray_client.go +++ b/internal/aws/xray/xray_client.go @@ -20,9 +20,11 @@ import ( ) // Constant prefixes used to identify information in user-agent -const agentPrefix = "xray-otel-exporter/" -const execEnvPrefix = " exec-env/" -const osPrefix = " OS/" +const ( + agentPrefix = "xray-otel-exporter/" + execEnvPrefix = " exec-env/" + osPrefix = " OS/" +) // XRayClient represents X-Ray client. type XRayClient interface { diff --git a/internal/aws/xray/xray_client_test.go b/internal/aws/xray/xray_client_test.go index 9fba5394434a..e51af276d0a2 100644 --- a/internal/aws/xray/xray_client_test.go +++ b/internal/aws/xray/xray_client_test.go @@ -4,6 +4,7 @@ package awsxray import ( + "net/http" "testing" "github.com/aws/aws-sdk-go/aws" @@ -30,7 +31,7 @@ func TestUserAgent(t *testing.T) { x := xray.xRay req := request.New(aws.Config{}, metadata.ClientInfo{}, x.Handlers, nil, &request.Operation{ - HTTPMethod: "GET", + HTTPMethod: http.MethodGet, HTTPPath: "/", }, nil, nil) @@ -39,5 +40,4 @@ func TestUserAgent(t *testing.T) { assert.Contains(t, req.HTTPRequest.UserAgent(), "xray-otel-exporter/") assert.Contains(t, req.HTTPRequest.UserAgent(), "exec-env/") assert.Contains(t, req.HTTPRequest.UserAgent(), "OS/") - } diff --git a/internal/buildscripts/modules b/internal/buildscripts/modules index 883e88ae50b1..eca1c79d4985 100644 --- a/internal/buildscripts/modules +++ b/internal/buildscripts/modules @@ -1,40 +1,67 @@ #!/bin/bash beta_modules=( + "go.opentelemetry.io/collector" "go.opentelemetry.io/collector/cmd/builder" + "go.opentelemetry.io/collector/cmd/mdatagen" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componentstatus" + "go.opentelemetry.io/collector/component/componentprofiles" + "go.opentelemetry.io/collector/confmap/converter/expandconverter" "go.opentelemetry.io/collector/config/configauth" "go.opentelemetry.io/collector/config/configgrpc" "go.opentelemetry.io/collector/config/confighttp" - "go.opentelemetry.io/collector/config/confignet" "go.opentelemetry.io/collector/config/configtelemetry" - "go.opentelemetry.io/collector/config/configtls" - "go.opentelemetry.io/collector/config/internal" - "go.opentelemetry.io/collector/confmap" "go.opentelemetry.io/collector/connector" + "go.opentelemetry.io/collector/connector/connectorprofiles" "go.opentelemetry.io/collector/connector/forwardconnector" - "go.opentelemetry.io/collector/consumer" + "go.opentelemetry.io/collector/consumer/consumerprofiles" + "go.opentelemetry.io/collector/consumer/consumertest" "go.opentelemetry.io/collector/exporter" "go.opentelemetry.io/collector/exporter/debugexporter" + "go.opentelemetry.io/collector/exporter/exporterprofiles" "go.opentelemetry.io/collector/exporter/loggingexporter" + "go.opentelemetry.io/collector/exporter/nopexporter" "go.opentelemetry.io/collector/exporter/otlpexporter" "go.opentelemetry.io/collector/exporter/otlphttpexporter" "go.opentelemetry.io/collector/extension" + "go.opentelemetry.io/collector/extension/extensioncapabilities" "go.opentelemetry.io/collector/extension/auth" - "go.opentelemetry.io/collector/extension/ballastextension" + "go.opentelemetry.io/collector/extension/experimental/storage" "go.opentelemetry.io/collector/extension/zpagesextension" + "go.opentelemetry.io/collector/extension/memorylimiterextension" "go.opentelemetry.io/collector/otelcol" + "go.opentelemetry.io/collector/otelcol/otelcoltest" + "go.opentelemetry.io/collector/pdata/pprofile" + "go.opentelemetry.io/collector/pdata/testdata" + "go.opentelemetry.io/collector/pipeline" "go.opentelemetry.io/collector/processor" "go.opentelemetry.io/collector/processor/batchprocessor" "go.opentelemetry.io/collector/processor/memorylimiterprocessor" + "go.opentelemetry.io/collector/processor/processorprofiles" "go.opentelemetry.io/collector/receiver" + "go.opentelemetry.io/collector/receiver/nopreceiver" "go.opentelemetry.io/collector/receiver/otlpreceiver" + "go.opentelemetry.io/collector/receiver/receiverprofiles" "go.opentelemetry.io/collector/semconv" + "go.opentelemetry.io/collector/service" + "go.opentelemetry.io/collector/filter" ) stable_modules=( + "go.opentelemetry.io/collector/client" + "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/featuregate" "go.opentelemetry.io/collector/pdata" - "go.opentelemetry.io/collector/config/configcompression" + "go.opentelemetry.io/collector/confmap" + "go.opentelemetry.io/collector/confmap/provider/envprovider" + "go.opentelemetry.io/collector/confmap/provider/fileprovider" + "go.opentelemetry.io/collector/confmap/provider/httpprovider" + "go.opentelemetry.io/collector/confmap/provider/httpsprovider" + "go.opentelemetry.io/collector/confmap/provider/yamlprovider" "go.opentelemetry.io/collector/config/configopaque" + "go.opentelemetry.io/collector/config/configcompression" + "go.opentelemetry.io/collector/config/configretry" + "go.opentelemetry.io/collector/config/configtls" + "go.opentelemetry.io/collector/config/confignet" ) diff --git a/internal/buildscripts/packaging/fpm/Dockerfile b/internal/buildscripts/packaging/fpm/Dockerfile deleted file mode 100644 index 000a4d3e9879..000000000000 --- a/internal/buildscripts/packaging/fpm/Dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -FROM debian:12 - -RUN apt-get update && \ - apt-get install -y ruby ruby-dev rubygems build-essential git rpm - -RUN gem install --no-document fpm -v 1.11.0 - -VOLUME /repo -WORKDIR /repo - -ENV PACKAGE="deb" -ENV VERSION="" -ENV ARCH="amd64" -ENV OUTPUT_DIR="/repo/dist/" - -CMD ./internal/buildscripts/packaging/fpm/$PACKAGE/build.sh "$VERSION" "$ARCH" "$OUTPUT_DIR" \ No newline at end of file diff --git a/internal/buildscripts/packaging/fpm/common.sh b/internal/buildscripts/packaging/fpm/common.sh deleted file mode 100644 index 40d90e362f6b..000000000000 --- a/internal/buildscripts/packaging/fpm/common.sh +++ /dev/null @@ -1,66 +0,0 @@ -#!/bin/bash - -# Copyright The OpenTelemetry Authors -# SPDX-License-Identifier: Apache-2.0 - -FPM_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -export FPM_DIR - -export PKG_NAME="otel-contrib-collector" -export PKG_VENDOR="OpenTelemetry Community" -export PKG_MAINTAINER="OpenTelemetry Community " -export PKG_DESCRIPTION="OpenTelemetry Contrib Collector" -export PKG_LICENSE="Apache 2.0" -export PKG_URL="https://github.com/open-telemetry/opentelemetry-collector-contrib" -export PKG_USER="otel" -export PKG_GROUP="otel" - -export SERVICE_NAME="otel-contrib-collector" -export PROCESS_NAME="otelcontribcol" - -export CONFIG_PATH="$REPO_DIR/examples/demo/otel-collector-config.yaml" -export SERVICE_PATH="$FPM_DIR/$SERVICE_NAME.service" -export ENVFILE_PATH="$FPM_DIR/$SERVICE_NAME.conf" -export PREINSTALL_PATH="$FPM_DIR/preinstall.sh" -export POSTINSTALL_PATH="$FPM_DIR/postinstall.sh" -export PREUNINSTALL_PATH="$FPM_DIR/preuninstall.sh" - -docker_cp() { - local container="$1" - local src="$2" - local dest="$3" - local dest_dir - dest_dir="$( dirname "$dest" )" - - echo "Copying $src to $container:$dest ..." - podman exec "$container" mkdir -p "$dest_dir" - podman cp "$src" "$container":"$dest" -} - -install_pkg() { - local container="$1" - local pkg_path="$2" - local pkg_base - pkg_base=$( basename "$pkg_path" ) - - echo "Installing $pkg_base ..." - docker_cp "$container" "$pkg_path" /tmp/"$pkg_base" - if [[ "${pkg_base##*.}" = "deb" ]]; then - podman exec "$container" dpkg -i /tmp/"$pkg_base" - else - podman exec "$container" rpm -ivh /tmp/"$pkg_base" - fi -} - -uninstall_pkg() { - local container="$1" - local pkg_type="$2" - local pkg_name="${3:-"$PKG_NAME"}" - - echo "Uninstalling $pkg_name ..." - if [[ "$pkg_type" = "deb" ]]; then - podman exec "$container" dpkg -r "$pkg_name" - else - podman exec "$container" rpm -e "$pkg_name" - fi -} diff --git a/internal/buildscripts/packaging/fpm/deb/Dockerfile.test b/internal/buildscripts/packaging/fpm/deb/Dockerfile.test deleted file mode 100644 index 56d482f9d5c0..000000000000 --- a/internal/buildscripts/packaging/fpm/deb/Dockerfile.test +++ /dev/null @@ -1,14 +0,0 @@ -# A debian11 image with systemd enabled. Must be run with: -# `-d --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro` flags -FROM debian:12 - -ENV container docker -ENV DEBIAN_FRONTEND noninteractive - -# Enable systemd. -RUN apt-get update ; \ - apt-get install -y systemd systemd-sysv procps; \ - apt-get clean ; \ - rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* - -CMD ["/lib/systemd/systemd"] diff --git a/internal/buildscripts/packaging/fpm/deb/README.md b/internal/buildscripts/packaging/fpm/deb/README.md deleted file mode 100644 index 7620be58c3a6..000000000000 --- a/internal/buildscripts/packaging/fpm/deb/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# Build otel-contrib-collector deb package - -Build the otel-contrib-collector deb package with [fpm](https://github.com/jordansissel/fpm). - -To build the deb package, run `make deb-package` from the repo root directory. The deb package will be written to -`dist/otel-contrib-collector__.deb`. - -By default, `` is `amd64` and `` is the latest git tag with `-post` appended, e.g. `1.2.3-post`. -To override these defaults, set the `ARCH` and `VERSION` environment variables, e.g. -`ARCH=arm64 VERSION=4.5.6 make deb-package`. - -Run `./internal/buildscripts/packaging/fpm/test.sh PATH_TO_DEB_FILE [PATH_TO_CONFIG_FILE]` to run a basic installation -test with the built package. `PATH_TO_CONFIG_FILE` defaults to `examples/demo/otel-collector-config.yaml` if one is -not specified. \ No newline at end of file diff --git a/internal/buildscripts/packaging/fpm/deb/build.sh b/internal/buildscripts/packaging/fpm/deb/build.sh deleted file mode 100755 index b07fff55ea2e..000000000000 --- a/internal/buildscripts/packaging/fpm/deb/build.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash - -# Copyright The OpenTelemetry Authors -# SPDX-License-Identifier: Apache-2.0 - -set -euxo pipefail - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -REPO_DIR="$( cd "$SCRIPT_DIR/../../../../../" && pwd )" -VERSION="${1:-}" -ARCH="${2:-"amd64"}" -OUTPUT_DIR="${3:-"$REPO_DIR/dist/"}" -OTELCONTRIBCOL_PATH="$REPO_DIR/bin/otelcontribcol_linux_$ARCH" - -. "$SCRIPT_DIR"/../common.sh - -if [[ -z "$VERSION" ]]; then - latest_tag="$( git describe --abbrev=0 --match v[0-9]* )" - VERSION="${latest_tag}-post" -fi - -mkdir -p "$OUTPUT_DIR" - -fpm -s dir -t deb -n "$PKG_NAME" -v "${VERSION#v}" -f -p "$OUTPUT_DIR" \ - --vendor "$PKG_VENDOR" \ - --maintainer "$PKG_MAINTAINER" \ - --description "$PKG_DESCRIPTION" \ - --license "$PKG_LICENSE" \ - --url "$PKG_URL" \ - --architecture "$ARCH" \ - --deb-dist "stable" \ - --deb-user "$PKG_USER" \ - --deb-group "$PKG_GROUP" \ - --before-install "$PREINSTALL_PATH" \ - --after-install "$POSTINSTALL_PATH" \ - --pre-uninstall "$PREUNINSTALL_PATH" \ - "$SERVICE_PATH"=/lib/systemd/system/"$SERVICE_NAME".service \ - "$OTELCONTRIBCOL_PATH"=/usr/bin/otelcontribcol \ - "$CONFIG_PATH"=/etc/otel-contrib-collector/config.yaml \ - "$ENVFILE_PATH"=/etc/otel-contrib-collector/otel-contrib-collector.conf diff --git a/internal/buildscripts/packaging/fpm/otel-contrib-collector.conf b/internal/buildscripts/packaging/fpm/otel-contrib-collector.conf deleted file mode 100644 index b61dd4e0f1cd..000000000000 --- a/internal/buildscripts/packaging/fpm/otel-contrib-collector.conf +++ /dev/null @@ -1,5 +0,0 @@ -# Systemd environment file for the otel-contrib-collector service - -# Command-line options for the otel-contrib-collector service. -# Run `/usr/bin/otelcontribcol --help` to see all available options. -OTELCOL_OPTIONS="--config=/etc/otel-contrib-collector/config.yaml" \ No newline at end of file diff --git a/internal/buildscripts/packaging/fpm/otel-contrib-collector.service b/internal/buildscripts/packaging/fpm/otel-contrib-collector.service deleted file mode 100644 index 7f1a4c4017b2..000000000000 --- a/internal/buildscripts/packaging/fpm/otel-contrib-collector.service +++ /dev/null @@ -1,15 +0,0 @@ -[Unit] -Description=OpenTelemetry Contrib Collector -After=network.target - -[Service] -ExecStart=/usr/bin/otelcontribcol $OTELCOL_OPTIONS -EnvironmentFile=/etc/otel-contrib-collector/otel-contrib-collector.conf -KillMode=mixed -Restart=on-failure -Type=simple -User=otel -Group=otel - -[Install] -WantedBy=multi-user.target \ No newline at end of file diff --git a/internal/buildscripts/packaging/fpm/postinstall.sh b/internal/buildscripts/packaging/fpm/postinstall.sh deleted file mode 100644 index b60b00295adf..000000000000 --- a/internal/buildscripts/packaging/fpm/postinstall.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh - -# Copyright The OpenTelemetry Authors -# SPDX-License-Identifier: Apache-2.0 - -if command -v systemctl >/dev/null 2>&1; then - systemctl enable otel-contrib-collector.service - if [ -f /etc/otel-contrib-collector/config.yaml ]; then - systemctl start otel-contrib-collector.service - fi -fi \ No newline at end of file diff --git a/internal/buildscripts/packaging/fpm/preinstall.sh b/internal/buildscripts/packaging/fpm/preinstall.sh deleted file mode 100644 index 99320ee3b335..000000000000 --- a/internal/buildscripts/packaging/fpm/preinstall.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh - -# Copyright The OpenTelemetry Authors -# SPDX-License-Identifier: Apache-2.0 - -getent passwd otel >/dev/null || useradd --system --user-group --no-create-home --shell /sbin/nologin otel \ No newline at end of file diff --git a/internal/buildscripts/packaging/fpm/preuninstall.sh b/internal/buildscripts/packaging/fpm/preuninstall.sh deleted file mode 100644 index 4faffaac44fc..000000000000 --- a/internal/buildscripts/packaging/fpm/preuninstall.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh - -# Copyright The OpenTelemetry Authors -# SPDX-License-Identifier: Apache-2.0 - -if command -v systemctl >/dev/null 2>&1; then - systemctl stop otel-contrib-collector.service - systemctl disable otel-contrib-collector.service -fi \ No newline at end of file diff --git a/internal/buildscripts/packaging/fpm/rpm/Dockerfile.test b/internal/buildscripts/packaging/fpm/rpm/Dockerfile.test deleted file mode 100644 index 8429e850d73b..000000000000 --- a/internal/buildscripts/packaging/fpm/rpm/Dockerfile.test +++ /dev/null @@ -1,9 +0,0 @@ -# A rockylinux8.5 image with systemd enabled. Must be run with: -# `-d --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro` flags -FROM rockylinux:9.3 - -ENV container docker - -RUN dnf install -y initscripts - -CMD ["/usr/sbin/init"] diff --git a/internal/buildscripts/packaging/fpm/rpm/README.md b/internal/buildscripts/packaging/fpm/rpm/README.md deleted file mode 100644 index 8f64d6f70d51..000000000000 --- a/internal/buildscripts/packaging/fpm/rpm/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# Build otel-contrib-collector rpm package - -Build the otel-contrib-collector rpm package with [fpm](https://github.com/jordansissel/fpm). - -To build the rpm package, run `make rpm-package` from the repo root directory. The rpm package will be written to -`dist/otel-contrib-collector-.>.rpm`. - -By default, `` is `amd64` and `` is the latest git tag with `~post` appended, e.g. `1.2.3~post`. -To override these defaults, set the `ARCH` and `VERSION` environment variables, e.g. -`ARCH=arm64 VERSION=4.5.6 make rpm-package`. - -Run `./internal/buildscripts/packaging/fpm/test.sh PATH_TO_RPM_FILE [PATH_TO_CONFIG_FILE]` to run a basic installation -test with the built package. `PATH_TO_CONFIG_FILE` defaults to `examples/demo/otel-collector-config.yaml` if one is -not specified. \ No newline at end of file diff --git a/internal/buildscripts/packaging/fpm/rpm/build.sh b/internal/buildscripts/packaging/fpm/rpm/build.sh deleted file mode 100755 index 4b2d072c62cb..000000000000 --- a/internal/buildscripts/packaging/fpm/rpm/build.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/bash - -# Copyright The OpenTelemetry Authors -# SPDX-License-Identifier: Apache-2.0 - -set -euxo pipefail - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -REPO_DIR="$( cd "$SCRIPT_DIR/../../../../../" && pwd )" -VERSION="${1:-}" -ARCH="${2:-"amd64"}" -OUTPUT_DIR="${3:-"$REPO_DIR/dist/"}" -OTELCONTRIBCOL_PATH="$REPO_DIR/bin/otelcontribcol_linux_$ARCH" - -. "$SCRIPT_DIR"/../common.sh - -if [[ -z "$VERSION" ]]; then - latest_tag="$( git describe --abbrev=0 --match v[0-9]* )" - VERSION="${latest_tag}~post" -fi - -# remap arm64 to aarch64, which is the arch used by Linux distributions -# see https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/6508 -if [[ "$ARCH" == "arm64" ]]; then - ARCH="aarch64" -fi - -mkdir -p "$OUTPUT_DIR" - -fpm -s dir -t rpm -n "$PKG_NAME" -v "${VERSION#v}" -f -p "$OUTPUT_DIR" \ - --vendor "$PKG_VENDOR" \ - --maintainer "$PKG_MAINTAINER" \ - --description "$PKG_DESCRIPTION" \ - --license "$PKG_LICENSE" \ - --url "$PKG_URL" \ - --architecture "$ARCH" \ - --rpm-summary "$PKG_DESCRIPTION" \ - --rpm-user "$PKG_USER" \ - --rpm-group "$PKG_GROUP" \ - --before-install "$PREINSTALL_PATH" \ - --after-install "$POSTINSTALL_PATH" \ - --pre-uninstall "$PREUNINSTALL_PATH" \ - "$SERVICE_PATH"=/lib/systemd/system/"$SERVICE_NAME".service \ - "$OTELCONTRIBCOL_PATH"=/usr/bin/otelcontribcol \ - "$CONFIG_PATH"=/etc/otel-contrib-collector/config.yaml \ - "$ENVFILE_PATH"=/etc/otel-contrib-collector/otel-contrib-collector.conf diff --git a/internal/buildscripts/packaging/fpm/test.sh b/internal/buildscripts/packaging/fpm/test.sh deleted file mode 100755 index e52b3407a4c2..000000000000 --- a/internal/buildscripts/packaging/fpm/test.sh +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/bash - -# Copyright The OpenTelemetry Authors -# SPDX-License-Identifier: Apache-2.0 - -set -euov pipefail - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -REPO_DIR="$( cd "$SCRIPT_DIR/../../../../" && pwd )" -export REPO_DIR -PKG_PATH="${1:-}" - -. "$SCRIPT_DIR"/common.sh - -if [[ -z "$PKG_PATH" ]]; then - echo "usage: ${BASH_SOURCE[0]} DEB_OR_RPM_PATH" >&2 - exit 1 -fi - -if [[ ! -f "$PKG_PATH" ]]; then - echo "$PKG_PATH not found!" >&2 - exit 1 -fi - - -pkg_base="$( basename "$PKG_PATH" )" -pkg_type="${pkg_base##*.}" -if [[ ! "$pkg_type" =~ ^(deb|rpm)$ ]]; then - echo "$PKG_PATH not supported!" >&2 - exit 1 -fi -image_name="otelcontribcol-$pkg_type-test" -container_name="$image_name" -container_exec="podman exec $container_name" - -trap 'podman rm -fv $container_name >/dev/null 2>&1 || true' EXIT - -podman build -t "$image_name" -f "$SCRIPT_DIR/$pkg_type/Dockerfile.test" "$SCRIPT_DIR" -podman rm -fv "$container_name" >/dev/null 2>&1 || true - -# test install -CRUN_VER='1.14.4' -mkdir -p "${HOME}/.local/bin" -curl -L "https://github.com/containers/crun/releases/download/${CRUN_VER}/crun-${CRUN_VER}-linux-amd64" -o "${HOME}/.local/bin/crun" -chmod +x "${HOME}/.local/bin/crun" -mkdir -p "${HOME}/.config/containers" -cat << EOF > "${HOME}/.config/containers/containers.conf" -[engine.runtimes] -crun = [ - "${HOME}/.local/bin/crun", - "/usr/bin/crun" -] -EOF - -echo -podman run --name "$container_name" -d "$image_name" -install_pkg "$container_name" "$PKG_PATH" - -# ensure service has started and still running after 5 seconds -sleep 5 -echo "Checking $SERVICE_NAME service status ..." -$container_exec systemctl --no-pager status $SERVICE_NAME - -echo "Checking $PROCESS_NAME process ..." -$container_exec pgrep -a -u otel $PROCESS_NAME - -# test uninstall -echo -uninstall_pkg "$container_name" "$pkg_type" - -echo "Checking $SERVICE_NAME service status after uninstall ..." -if $container_exec systemctl --no-pager status $SERVICE_NAME; then - echo "$SERVICE_NAME service still running after uninstall" >&2 - exit 1 -fi -echo "$SERVICE_NAME service successfully stopped after uninstall" - -echo "Checking $SERVICE_NAME service existence after uninstall ..." -if $container_exec systemctl list-unit-files --all | grep $SERVICE_NAME; then - echo "$SERVICE_NAME service still exists after uninstall" >&2 - exit 1 -fi -echo "$SERVICE_NAME service successfully removed after uninstall" - -echo "Checking $PROCESS_NAME process after uninstall ..." -if $container_exec pgrep $PROCESS_NAME; then - echo "$PROCESS_NAME process still running after uninstall" - exit 1 -fi -echo "$PROCESS_NAME process successfully killed after uninstall" diff --git a/internal/collectd/go.mod b/internal/collectd/go.mod index de5020bf4c00..a7b44f88b4f2 100644 --- a/internal/collectd/go.mod +++ b/internal/collectd/go.mod @@ -1,3 +1,3 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/internal/collectd -go 1.21.0 +go 1.22.0 diff --git a/internal/common/docker/images.go b/internal/common/docker/images.go index 8e5b3353f071..b97c35aa8aee 100644 --- a/internal/common/docker/images.go +++ b/internal/common/docker/images.go @@ -10,9 +10,7 @@ import ( "go.uber.org/zap" ) -var ( - extractImageRegexp = regexp.MustCompile(`^(?P([^/\s]+/)?([^:\s]+))(:(?P[^@\s]+))?(@sha256:(?P\d+))?$`) -) +var extractImageRegexp = regexp.MustCompile(`^(?P([^/\s]+/)?([^:\s]+))(:(?P[^@\s]+))?(@sha256:(?P\d+))?$`) type ImageRef struct { Repository string diff --git a/internal/common/docker/images_test.go b/internal/common/docker/images_test.go index 480ad446e35c..76a68f13ef9b 100644 --- a/internal/common/docker/images_test.go +++ b/internal/common/docker/images_test.go @@ -5,6 +5,9 @@ package docker import ( "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestDockerImageToElements(t *testing.T) { @@ -133,18 +136,13 @@ func TestDockerImageToElements(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { image, err := ParseImageName(tt.args.image) - if (err != nil) != tt.wantErr { - t.Errorf("ParseImageName() error = %v, wantErr %v", err, tt.wantErr) - return - } - if image.Repository != tt.wantRepository { - t.Errorf("ParseImageName() repository = %v, want %v", image.Repository, tt.wantRepository) - } - if image.Tag != tt.wantTag { - t.Errorf("ParseImageName() tag = %v, want %v", image.Tag, tt.wantTag) - } - if image.SHA256 != tt.wantSHA256 { - t.Errorf("ParseImageName() hash = %v, want %v", image.SHA256, tt.wantSHA256) + if !tt.wantErr { + assert.NoError(t, err, "ParseImageName() error = %v, wantErr %v", err, tt.wantErr) + assert.Equal(t, tt.wantRepository, image.Repository, "ParseImageName() repository = %v, want %v", image.Repository, tt.wantRepository) + assert.Equal(t, tt.wantTag, image.Tag, "ParseImageName() tag = %v, want %v", image.Tag, tt.wantTag) + assert.Equal(t, tt.wantSHA256, image.SHA256, "ParseImageName() hash = %v, want %v", image.SHA256, tt.wantSHA256) + } else { + require.Error(t, err) } }) } diff --git a/internal/common/go.mod b/internal/common/go.mod index da30c3a0c640..fbeb709483ba 100644 --- a/internal/common/go.mod +++ b/internal/common/go.mod @@ -1,10 +1,10 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/internal/common -go 1.21.0 +go 1.22.0 require ( - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/featuregate v1.9.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/featuregate v1.22.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) diff --git a/internal/common/go.sum b/internal/common/go.sum index f9722a06caf0..74af9addddfa 100644 --- a/internal/common/go.sum +++ b/internal/common/go.sum @@ -10,10 +10,10 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= diff --git a/internal/common/localhostgate/featuregate.go b/internal/common/localhostgate/featuregate.go deleted file mode 100644 index 238d909f0b63..000000000000 --- a/internal/common/localhostgate/featuregate.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -// package localhostgate defines a feature gate that controls whether server-like receivers and extensions use localhost as the default host for their endpoints. -// This package is duplicated across core and contrib to avoid exposing the feature gate as part of the public API. -// To do this we define a `registerOrLoad` helper and try to register the gate in both modules. -// IMPORTANT NOTE: ANY CHANGES TO THIS PACKAGE MUST BE MIRRORED IN THE CORE COUNTERPART. -// See https://github.com/open-telemetry/opentelemetry-collector/blob/main/internal/localhostgate/featuregate.go -package localhostgate // import "github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/localhostgate" - -import ( - "errors" - "fmt" - - "go.opentelemetry.io/collector/featuregate" - "go.uber.org/zap" -) - -const UseLocalHostAsDefaultHostID = "component.UseLocalHostAsDefaultHost" - -// UseLocalHostAsDefaultHostfeatureGate is the feature gate that controls whether -// server-like receivers and extensions such as the OTLP receiver use localhost as the default host for their endpoints. -var UseLocalHostAsDefaultHostfeatureGate = mustRegisterOrLoad( - featuregate.GlobalRegistry(), - UseLocalHostAsDefaultHostID, - featuregate.StageAlpha, - featuregate.WithRegisterDescription("controls whether server-like receivers and extensions such as the OTLP receiver use localhost as the default host for their endpoints"), -) - -// mustRegisterOrLoad tries to register the feature gate and loads it if it already exists. -// It panics on any other error. -func mustRegisterOrLoad(reg *featuregate.Registry, id string, stage featuregate.Stage, opts ...featuregate.RegisterOption) *featuregate.Gate { - gate, err := reg.Register(id, stage, opts...) - - if errors.Is(err, featuregate.ErrAlreadyRegistered) { - // Gate is already registered; find it. - // Only a handful of feature gates are registered, so it's fine to iterate over all of them. - reg.VisitAll(func(g *featuregate.Gate) { - if g.ID() == id { - gate = g - return - } - }) - } else if err != nil { - panic(err) - } - - return gate -} - -// EndpointForPort gets the endpoint for a given port using localhost or 0.0.0.0 depending on the feature gate. -func EndpointForPort(port int) string { - host := "localhost" - if !UseLocalHostAsDefaultHostfeatureGate.IsEnabled() { - host = "0.0.0.0" - } - return fmt.Sprintf("%s:%d", host, port) -} - -// LogAboutUseLocalHostAsDefault logs about the upcoming change from 0.0.0.0 to localhost on server-like components. -func LogAboutUseLocalHostAsDefault(logger *zap.Logger) { - if !UseLocalHostAsDefaultHostfeatureGate.IsEnabled() { - logger.Warn( - "The default endpoints for all servers in components will change to use localhost instead of 0.0.0.0 in a future version. Use the feature gate to preview the new default.", - zap.String("feature gate ID", UseLocalHostAsDefaultHostID), - ) - } -} diff --git a/internal/common/localhostgate/featuregate_test.go b/internal/common/localhostgate/featuregate_test.go deleted file mode 100644 index 3c2972ccab4b..000000000000 --- a/internal/common/localhostgate/featuregate_test.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package localhostgate - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/featuregate" -) - -func setFeatureGateForTest(t testing.TB, gate *featuregate.Gate, enabled bool) func() { - originalValue := gate.IsEnabled() - require.NoError(t, featuregate.GlobalRegistry().Set(gate.ID(), enabled)) - return func() { - require.NoError(t, featuregate.GlobalRegistry().Set(gate.ID(), originalValue)) - } -} - -func TestEndpointForPort(t *testing.T) { - tests := []struct { - port int - enabled bool - endpoint string - }{ - { - port: 4317, - enabled: false, - endpoint: "0.0.0.0:4317", - }, - { - port: 4317, - enabled: true, - endpoint: "localhost:4317", - }, - { - port: 0, - enabled: false, - endpoint: "0.0.0.0:0", - }, - { - port: 0, - enabled: true, - endpoint: "localhost:0", - }, - } - - for _, tt := range tests { - t.Run(tt.endpoint, func(t *testing.T) { - defer setFeatureGateForTest(t, UseLocalHostAsDefaultHostfeatureGate, tt.enabled)() - assert.Equal(t, EndpointForPort(tt.port), tt.endpoint) - }) - } -} diff --git a/internal/common/testutil/testutil.go b/internal/common/testutil/testutil.go index 1f958995d530..823815fbb6c9 100644 --- a/internal/common/testutil/testutil.go +++ b/internal/common/testutil/testutil.go @@ -4,6 +4,7 @@ package testutil // import "github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/testutil" import ( + "fmt" "net" "os/exec" "runtime" @@ -25,15 +26,15 @@ type portpair struct { // describing it. The port is available for opening when this function returns // provided that there is no race by some other code to grab the same port // immediately. -func GetAvailableLocalAddress(t testing.TB) string { - return GetAvailableLocalNetworkAddress(t, "tcp") +func GetAvailableLocalAddress(tb testing.TB) string { + return GetAvailableLocalNetworkAddress(tb, "tcp") } // GetAvailableLocalNetworkAddress finds an available local port on specified network and returns an endpoint // describing it. The port is available for opening when this function returns // provided that there is no race by some other code to grab the same port // immediately. -func GetAvailableLocalNetworkAddress(t testing.TB, network string) string { +func GetAvailableLocalNetworkAddress(tb testing.TB, network string) string { // Retry has been added for windows as net.Listen can return a port that is not actually available. Details can be // found in https://github.com/docker/for-win/issues/3171 but to summarize Hyper-V will reserve ranges of ports // which do not show up under the "netstat -ano" but can only be found by @@ -43,14 +44,14 @@ func GetAvailableLocalNetworkAddress(t testing.TB, network string) string { portFound := false if runtime.GOOS == "windows" { - exclusions = getExclusionsList(t) + exclusions = getExclusionsList(tb) } var endpoint string for !portFound { - endpoint = findAvailableAddress(t, network) + endpoint = findAvailableAddress(tb, network) _, port, err := net.SplitHostPort(endpoint) - require.NoError(t, err) + require.NoError(tb, err) portFound = true if runtime.GOOS == "windows" { for _, pair := range exclusions { @@ -65,26 +66,26 @@ func GetAvailableLocalNetworkAddress(t testing.TB, network string) string { return endpoint } -func findAvailableAddress(t testing.TB, network string) string { +func findAvailableAddress(tb testing.TB, network string) string { switch network { // net.Listen supported network strings case "tcp", "tcp4", "tcp6", "unix", "unixpacket": ln, err := net.Listen(network, "localhost:0") - require.NoError(t, err, "Failed to get a free local port") + require.NoError(tb, err, "Failed to get a free local port") // There is a possible race if something else takes this same port before // the test uses it, however, that is unlikely in practice. defer func() { - assert.NoError(t, ln.Close()) + assert.NoError(tb, ln.Close()) }() return ln.Addr().String() // net.ListenPacket supported network strings case "udp", "udp4", "udp6", "unixgram": ln, err := net.ListenPacket(network, "localhost:0") - require.NoError(t, err, "Failed to get a free local port") + require.NoError(tb, err, "Failed to get a free local port") // There is a possible race if something else takes this same port before // the test uses it, however, that is unlikely in practice. defer func() { - assert.NoError(t, ln.Close()) + assert.NoError(tb, ln.Close()) }() return ln.LocalAddr().String() } @@ -92,32 +93,32 @@ func findAvailableAddress(t testing.TB, network string) string { } // Get excluded ports on Windows from the command: netsh interface ipv4 show excludedportrange protocol=tcp -func getExclusionsList(t testing.TB) []portpair { +func getExclusionsList(tb testing.TB) []portpair { cmdTCP := exec.Command("netsh", "interface", "ipv4", "show", "excludedportrange", "protocol=tcp") outputTCP, errTCP := cmdTCP.CombinedOutput() - require.NoError(t, errTCP) - exclusions := createExclusionsList(t, string(outputTCP)) + require.NoError(tb, errTCP) + exclusions := createExclusionsList(tb, string(outputTCP)) cmdUDP := exec.Command("netsh", "interface", "ipv4", "show", "excludedportrange", "protocol=udp") outputUDP, errUDP := cmdUDP.CombinedOutput() - require.NoError(t, errUDP) - exclusions = append(exclusions, createExclusionsList(t, string(outputUDP))...) + require.NoError(tb, errUDP) + exclusions = append(exclusions, createExclusionsList(tb, string(outputUDP))...) return exclusions } -func createExclusionsList(t testing.TB, exclusionsText string) []portpair { +func createExclusionsList(tb testing.TB, exclusionsText string) []portpair { var exclusions []portpair parts := strings.Split(exclusionsText, "--------") - require.Equal(t, len(parts), 3) + require.Len(tb, parts, 3) portsText := strings.Split(parts[2], "*") - require.Greater(t, len(portsText), 1) // original text may have a suffix like " - Administered port exclusions." + require.Greater(tb, len(portsText), 1) // original text may have a suffix like " - Administered port exclusions." lines := strings.Split(portsText[0], "\n") for _, line := range lines { if strings.TrimSpace(line) != "" { entries := strings.Fields(strings.TrimSpace(line)) - require.Equal(t, len(entries), 2) + require.Len(tb, entries, 2) pair := portpair{entries[0], entries[1]} exclusions = append(exclusions, pair) } @@ -127,21 +128,26 @@ func createExclusionsList(t testing.TB, exclusionsText string) []portpair { // Force the state of feature gate for a test // usage: defer SetFeatureGateForTest("gateName", true)() -func SetFeatureGateForTest(t testing.TB, gate *featuregate.Gate, enabled bool) func() { +func SetFeatureGateForTest(tb testing.TB, gate *featuregate.Gate, enabled bool) func() { originalValue := gate.IsEnabled() - require.NoError(t, featuregate.GlobalRegistry().Set(gate.ID(), enabled)) + require.NoError(tb, featuregate.GlobalRegistry().Set(gate.ID(), enabled)) return func() { - require.NoError(t, featuregate.GlobalRegistry().Set(gate.ID(), originalValue)) + require.NoError(tb, featuregate.GlobalRegistry().Set(gate.ID(), originalValue)) } } -func GetAvailablePort(t testing.TB) int { - endpoint := GetAvailableLocalAddress(t) +func GetAvailablePort(tb testing.TB) int { + endpoint := GetAvailableLocalAddress(tb) _, port, err := net.SplitHostPort(endpoint) - require.NoError(t, err) + require.NoError(tb, err) portInt, err := strconv.Atoi(port) - require.NoError(t, err) + require.NoError(tb, err) return portInt } + +// EndpointForPort gets the endpoint for a given port using localhost. +func EndpointForPort(port int) string { + return fmt.Sprintf("localhost:%d", port) +} diff --git a/internal/common/testutil/testutil_test.go b/internal/common/testutil/testutil_test.go index f6cb1eb1c7f6..0b43ad8407a6 100644 --- a/internal/common/testutil/testutil_test.go +++ b/internal/common/testutil/testutil_test.go @@ -26,6 +26,7 @@ func TestGetAvailableLocalAddress(t *testing.T) { require.Error(t, err) require.Nil(t, ln1) } + func TestGetAvailableLocalUDPAddress(t *testing.T) { addr := GetAvailableLocalNetworkAddress(t, "udp") // Endpoint should be free. @@ -42,6 +43,10 @@ func TestGetAvailableLocalUDPAddress(t *testing.T) { require.Nil(t, ln1) } +func TestEndpointForPort(t *testing.T) { + require.Equal(t, "localhost:22", EndpointForPort(22)) +} + func TestCreateExclusionsList(t *testing.T) { // Test two examples of typical output from "netsh interface ipv4 show excludedportrange protocol=tcp" emptyExclusionsText := ` @@ -63,8 +68,8 @@ Start Port End Port * - Administered port exclusions. ` exclusions := createExclusionsList(t, exclusionsText) - require.Equal(t, len(exclusions), 2) + require.Len(t, exclusions, 2) emptyExclusions := createExclusionsList(t, emptyExclusionsText) - require.Equal(t, len(emptyExclusions), 0) + require.Empty(t, emptyExclusions) } diff --git a/internal/common/ttlmap/ttl_map_test.go b/internal/common/ttlmap/ttl_map_test.go index c5bc890e5a46..d8a98db8a0a5 100644 --- a/internal/common/ttlmap/ttl_map_test.go +++ b/internal/common/ttlmap/ttl_map_test.go @@ -22,8 +22,8 @@ func TestTTLMapData(t *testing.T) { func TestTTLMapSimple(t *testing.T) { m := New(5, 10, make(chan struct{})) - require.EqualValues(t, m.sweepInterval, 5) - require.EqualValues(t, m.md.maxAge, 10) + require.EqualValues(t, 5, m.sweepInterval) + require.EqualValues(t, 10, m.md.maxAge) m.Put("foo", "bar") s := m.Get("foo").(string) require.Equal(t, "bar", s) diff --git a/internal/components/components.go b/internal/components/components.go deleted file mode 100644 index 47809d68925e..000000000000 --- a/internal/components/components.go +++ /dev/null @@ -1,403 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package components // import "github.com/open-telemetry/opentelemetry-collector-contrib/internal/components" - -import ( - "go.opentelemetry.io/collector/connector" - "go.opentelemetry.io/collector/connector/forwardconnector" - "go.opentelemetry.io/collector/exporter" - "go.opentelemetry.io/collector/exporter/debugexporter" - "go.opentelemetry.io/collector/exporter/loggingexporter" - "go.opentelemetry.io/collector/exporter/otlpexporter" - "go.opentelemetry.io/collector/exporter/otlphttpexporter" - "go.opentelemetry.io/collector/extension" - "go.opentelemetry.io/collector/extension/ballastextension" - "go.opentelemetry.io/collector/extension/zpagesextension" - "go.opentelemetry.io/collector/otelcol" - "go.opentelemetry.io/collector/processor" - "go.opentelemetry.io/collector/processor/batchprocessor" - "go.opentelemetry.io/collector/processor/memorylimiterprocessor" - "go.opentelemetry.io/collector/receiver" - "go.opentelemetry.io/collector/receiver/otlpreceiver" - - "github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector" - "github.com/open-telemetry/opentelemetry-collector-contrib/connector/datadogconnector" - "github.com/open-telemetry/opentelemetry-collector-contrib/connector/exceptionsconnector" - "github.com/open-telemetry/opentelemetry-collector-contrib/connector/grafanacloudconnector" - "github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector" - "github.com/open-telemetry/opentelemetry-collector-contrib/connector/servicegraphconnector" - "github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/alibabacloudlogserviceexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awscloudwatchlogsexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsemfexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awskinesisexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsxrayexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/azuredataexplorerexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/azuremonitorexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/carbonexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/cassandraexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/clickhouseexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/coralogixexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datasetexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlecloudexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlecloudpubsubexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/googlemanagedprometheusexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/influxdbexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/instanaexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/loadbalancingexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/logicmonitorexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/logzioexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/lokiexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/mezmoexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opensearchexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/pulsarexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sapmexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sentryexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/signalfxexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/skywalkingexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/sumologicexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/tencentcloudlogserviceexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/asapauthextension" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/basicauthextension" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/bearertokenauthextension" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/jaegerremotesampling" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/oauth2clientauthextension" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/dockerobserver" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/ecstaskobserver" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/hostobserver" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/k8sobserver" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/oidcauthextension" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/dbstorage" - "github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/filestorage" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricsgenerationprocessor" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricstransformprocessor" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/routingprocessor" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/spanprocessor" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/activedirectorydsreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/apachereceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/apachesparkreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awscloudwatchreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awscontainerinsightreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsecscontainermetricsreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsfirehosereceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsxrayreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azureblobreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azureeventhubreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/azuremonitorreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/bigipreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/carbonreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/chronyreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/cloudfoundryreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/collectdreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/couchdbreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/datadogreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/dockerstatsreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/elasticsearchreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/expvarreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/flinkmetricsreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/fluentforwardreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/googlecloudpubsubreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/googlecloudspannerreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/haproxyreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/httpcheckreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/iisreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/influxdbreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jmxreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/journaldreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sclusterreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8seventsreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/k8sobjectsreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkametricsreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kubeletstatsreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/lokireceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/memcachedreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mongodbatlasreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mongodbreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/mysqlreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nginxreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nsxtreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/oracledbreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/otlpjsonfilereceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/podmanreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/postgresqlreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/pulsarreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/purefareceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/purefbreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/rabbitmqreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/receivercreator" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/redisreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/riakreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/saphanareceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sapmreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/signalfxreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/simpleprometheusreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/skywalkingreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/snmpreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/snowflakereceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/solacereceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkenterprisereceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/splunkhecreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sqlqueryreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sqlserverreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/sshcheckreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/statsdreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/tcplogreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/udplogreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/vcenterreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/wavefrontreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/webhookeventreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/windowseventlogreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/windowsperfcountersreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver" - "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver" -) - -func Components() (otelcol.Factories, error) { - var err error - factories := otelcol.Factories{} - extensions := []extension.Factory{ - asapauthextension.NewFactory(), - awsproxy.NewFactory(), - ballastextension.NewFactory(), - basicauthextension.NewFactory(), - bearertokenauthextension.NewFactory(), - dbstorage.NewFactory(), - dockerobserver.NewFactory(), - ecstaskobserver.NewFactory(), - filestorage.NewFactory(), - headerssetterextension.NewFactory(), - healthcheckextension.NewFactory(), - hostobserver.NewFactory(), - jaegerremotesampling.NewFactory(), - k8sobserver.NewFactory(), - pprofextension.NewFactory(), - oauth2clientauthextension.NewFactory(), - oidcauthextension.NewFactory(), - sigv4authextension.NewFactory(), - zpagesextension.NewFactory(), - } - factories.Extensions, err = extension.MakeFactoryMap(extensions...) - if err != nil { - return otelcol.Factories{}, err - } - - receivers := []receiver.Factory{ - activedirectorydsreceiver.NewFactory(), - aerospikereceiver.NewFactory(), - apachereceiver.NewFactory(), - apachesparkreceiver.NewFactory(), - awscontainerinsightreceiver.NewFactory(), - awsecscontainermetricsreceiver.NewFactory(), - awsfirehosereceiver.NewFactory(), - awscloudwatchreceiver.NewFactory(), - awsxrayreceiver.NewFactory(), - azureblobreceiver.NewFactory(), - azureeventhubreceiver.NewFactory(), - azuremonitorreceiver.NewFactory(), - bigipreceiver.NewFactory(), - carbonreceiver.NewFactory(), - chronyreceiver.NewFactory(), - cloudfoundryreceiver.NewFactory(), - collectdreceiver.NewFactory(), - couchdbreceiver.NewFactory(), - datadogreceiver.NewFactory(), - dockerstatsreceiver.NewFactory(), - elasticsearchreceiver.NewFactory(), - expvarreceiver.NewFactory(), - filelogreceiver.NewFactory(), - flinkmetricsreceiver.NewFactory(), - fluentforwardreceiver.NewFactory(), - googlecloudspannerreceiver.NewFactory(), - googlecloudpubsubreceiver.NewFactory(), - haproxyreceiver.NewFactory(), - hostmetricsreceiver.NewFactory(), - httpcheckreceiver.NewFactory(), - influxdbreceiver.NewFactory(), - iisreceiver.NewFactory(), - jaegerreceiver.NewFactory(), - jmxreceiver.NewFactory(), - journaldreceiver.NewFactory(), - kafkareceiver.NewFactory(), - kafkametricsreceiver.NewFactory(), - k8sclusterreceiver.NewFactory(), - k8seventsreceiver.NewFactory(), - k8sobjectsreceiver.NewFactory(), - kubeletstatsreceiver.NewFactory(), - lokireceiver.NewFactory(), - memcachedreceiver.NewFactory(), - mongodbatlasreceiver.NewFactory(), - mongodbreceiver.NewFactory(), - mysqlreceiver.NewFactory(), - nsxtreceiver.NewFactory(), - nginxreceiver.NewFactory(), - opencensusreceiver.NewFactory(), - oracledbreceiver.NewFactory(), - otlpjsonfilereceiver.NewFactory(), - otlpreceiver.NewFactory(), - podmanreceiver.NewFactory(), - postgresqlreceiver.NewFactory(), - prometheusreceiver.NewFactory(), - pulsarreceiver.NewFactory(), - purefareceiver.NewFactory(), - purefbreceiver.NewFactory(), - rabbitmqreceiver.NewFactory(), - receivercreator.NewFactory(), - redisreceiver.NewFactory(), - riakreceiver.NewFactory(), - saphanareceiver.NewFactory(), - sapmreceiver.NewFactory(), - signalfxreceiver.NewFactory(), - simpleprometheusreceiver.NewFactory(), - skywalkingreceiver.NewFactory(), - snmpreceiver.NewFactory(), - snowflakereceiver.NewFactory(), - solacereceiver.NewFactory(), - splunkenterprisereceiver.NewFactory(), - splunkhecreceiver.NewFactory(), - sqlqueryreceiver.NewFactory(), - sqlserverreceiver.NewFactory(), - sshcheckreceiver.NewFactory(), - statsdreceiver.NewFactory(), - wavefrontreceiver.NewFactory(), - webhookeventreceiver.NewFactory(), - windowseventlogreceiver.NewFactory(), - windowsperfcountersreceiver.NewFactory(), - zookeeperreceiver.NewFactory(), - syslogreceiver.NewFactory(), - tcplogreceiver.NewFactory(), - udplogreceiver.NewFactory(), - vcenterreceiver.NewFactory(), - zipkinreceiver.NewFactory(), - } - factories.Receivers, err = receiver.MakeFactoryMap(receivers...) - if err != nil { - return otelcol.Factories{}, err - } - - exporters := []exporter.Factory{ - alibabacloudlogserviceexporter.NewFactory(), - awscloudwatchlogsexporter.NewFactory(), - awsemfexporter.NewFactory(), - awskinesisexporter.NewFactory(), - awsxrayexporter.NewFactory(), - azuredataexplorerexporter.NewFactory(), - azuremonitorexporter.NewFactory(), - carbonexporter.NewFactory(), - cassandraexporter.NewFactory(), - clickhouseexporter.NewFactory(), - coralogixexporter.NewFactory(), - datadogexporter.NewFactory(), - datasetexporter.NewFactory(), - debugexporter.NewFactory(), - elasticsearchexporter.NewFactory(), - fileexporter.NewFactory(), - googlecloudexporter.NewFactory(), - googlemanagedprometheusexporter.NewFactory(), - googlecloudpubsubexporter.NewFactory(), - influxdbexporter.NewFactory(), - instanaexporter.NewFactory(), - kafkaexporter.NewFactory(), - loadbalancingexporter.NewFactory(), - loggingexporter.NewFactory(), - logicmonitorexporter.NewFactory(), - logzioexporter.NewFactory(), - lokiexporter.NewFactory(), - mezmoexporter.NewFactory(), - opencensusexporter.NewFactory(), - opensearchexporter.NewFactory(), - otlpexporter.NewFactory(), - otlphttpexporter.NewFactory(), - prometheusexporter.NewFactory(), - prometheusremotewriteexporter.NewFactory(), - pulsarexporter.NewFactory(), - sapmexporter.NewFactory(), - sentryexporter.NewFactory(), - signalfxexporter.NewFactory(), - skywalkingexporter.NewFactory(), - splunkhecexporter.NewFactory(), - sumologicexporter.NewFactory(), - tencentcloudlogserviceexporter.NewFactory(), - zipkinexporter.NewFactory(), - } - factories.Exporters, err = exporter.MakeFactoryMap(exporters...) - if err != nil { - return otelcol.Factories{}, err - } - - processors := []processor.Factory{ - attributesprocessor.NewFactory(), - batchprocessor.NewFactory(), - filterprocessor.NewFactory(), - groupbyattrsprocessor.NewFactory(), - groupbytraceprocessor.NewFactory(), - k8sattributesprocessor.NewFactory(), - memorylimiterprocessor.NewFactory(), - metricstransformprocessor.NewFactory(), - metricsgenerationprocessor.NewFactory(), - probabilisticsamplerprocessor.NewFactory(), - resourcedetectionprocessor.NewFactory(), - resourceprocessor.NewFactory(), - routingprocessor.NewFactory(), - tailsamplingprocessor.NewFactory(), - spanprocessor.NewFactory(), - cumulativetodeltaprocessor.NewFactory(), - deltatorateprocessor.NewFactory(), - transformprocessor.NewFactory(), - } - factories.Processors, err = processor.MakeFactoryMap(processors...) - if err != nil { - return otelcol.Factories{}, err - } - - connectors := []connector.Factory{ - forwardconnector.NewFactory(), - countconnector.NewFactory(), - datadogconnector.NewFactory(), - exceptionsconnector.NewFactory(), - grafanacloudconnector.NewFactory(), - routingconnector.NewFactory(), - servicegraphconnector.NewFactory(), - spanmetricsconnector.NewFactory(), - } - factories.Connectors, err = connector.MakeFactoryMap(connectors...) - if err != nil { - return otelcol.Factories{}, err - } - - return factories, nil -} diff --git a/internal/coreinternal/aggregateutil/aggregate.go b/internal/coreinternal/aggregateutil/aggregate.go new file mode 100644 index 000000000000..198ca09bee0f --- /dev/null +++ b/internal/coreinternal/aggregateutil/aggregate.go @@ -0,0 +1,380 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package aggregateutil // import "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/aggregateutil" + +import ( + "encoding/json" + "math" + "sort" + + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/pmetric" +) + +func CopyMetricDetails(from, to pmetric.Metric) { + to.SetName(from.Name()) + to.SetUnit(from.Unit()) + to.SetDescription(from.Description()) + //exhaustive:enforce + switch from.Type() { + case pmetric.MetricTypeGauge: + to.SetEmptyGauge() + case pmetric.MetricTypeSum: + to.SetEmptySum().SetAggregationTemporality(from.Sum().AggregationTemporality()) + to.Sum().SetIsMonotonic(from.Sum().IsMonotonic()) + case pmetric.MetricTypeHistogram: + to.SetEmptyHistogram().SetAggregationTemporality(from.Histogram().AggregationTemporality()) + case pmetric.MetricTypeExponentialHistogram: + to.SetEmptyExponentialHistogram().SetAggregationTemporality(from.ExponentialHistogram().AggregationTemporality()) + case pmetric.MetricTypeSummary: + to.SetEmptySummary() + } +} + +func FilterAttrs(metric pmetric.Metric, filterAttrKeys []string) { + // filterAttrKeys being nil means the filter is to be skipped. + if filterAttrKeys == nil { + return + } + // filterAttrKeys being empty means it is explicitly expected to filter + // against an empty label set, which is functionally the same as removing + // all attributes. + if len(filterAttrKeys) == 0 { + RangeDataPointAttributes(metric, func(attrs pcommon.Map) bool { + attrs.Clear() + return true + }) + } + // filterAttrKeys having provided attributes means the filter continues + // as normal. + RangeDataPointAttributes(metric, func(attrs pcommon.Map) bool { + attrs.RemoveIf(func(k string, _ pcommon.Value) bool { + return isNotPresent(k, filterAttrKeys) + }) + return true + }) +} + +func GroupDataPoints(metric pmetric.Metric, ag *AggGroups) { + switch metric.Type() { + case pmetric.MetricTypeGauge: + if ag.gauge == nil { + ag.gauge = map[string]pmetric.NumberDataPointSlice{} + } + groupNumberDataPoints(metric.Gauge().DataPoints(), false, ag.gauge) + case pmetric.MetricTypeSum: + if ag.sum == nil { + ag.sum = map[string]pmetric.NumberDataPointSlice{} + } + groupByStartTime := metric.Sum().AggregationTemporality() == pmetric.AggregationTemporalityDelta + groupNumberDataPoints(metric.Sum().DataPoints(), groupByStartTime, ag.sum) + case pmetric.MetricTypeHistogram: + if ag.histogram == nil { + ag.histogram = map[string]pmetric.HistogramDataPointSlice{} + } + groupByStartTime := metric.Histogram().AggregationTemporality() == pmetric.AggregationTemporalityDelta + groupHistogramDataPoints(metric.Histogram().DataPoints(), groupByStartTime, ag.histogram) + case pmetric.MetricTypeExponentialHistogram: + if ag.expHistogram == nil { + ag.expHistogram = map[string]pmetric.ExponentialHistogramDataPointSlice{} + } + groupByStartTime := metric.ExponentialHistogram().AggregationTemporality() == pmetric.AggregationTemporalityDelta + groupExponentialHistogramDataPoints(metric.ExponentialHistogram().DataPoints(), groupByStartTime, ag.expHistogram) + } +} + +func MergeDataPoints(to pmetric.Metric, aggType AggregationType, ag AggGroups) { + switch to.Type() { + case pmetric.MetricTypeGauge: + mergeNumberDataPoints(ag.gauge, aggType, to.Gauge().DataPoints()) + case pmetric.MetricTypeSum: + mergeNumberDataPoints(ag.sum, aggType, to.Sum().DataPoints()) + case pmetric.MetricTypeHistogram: + mergeHistogramDataPoints(ag.histogram, to.Histogram().DataPoints()) + case pmetric.MetricTypeExponentialHistogram: + mergeExponentialHistogramDataPoints(ag.expHistogram, to.ExponentialHistogram().DataPoints()) + } +} + +// RangeDataPointAttributes calls f sequentially on attributes of every metric data point. +// The iteration terminates if f returns false. +func RangeDataPointAttributes(metric pmetric.Metric, f func(pcommon.Map) bool) { + //exhaustive:enforce + switch metric.Type() { + case pmetric.MetricTypeGauge: + for i := 0; i < metric.Gauge().DataPoints().Len(); i++ { + dp := metric.Gauge().DataPoints().At(i) + if !f(dp.Attributes()) { + return + } + } + case pmetric.MetricTypeSum: + for i := 0; i < metric.Sum().DataPoints().Len(); i++ { + dp := metric.Sum().DataPoints().At(i) + if !f(dp.Attributes()) { + return + } + } + case pmetric.MetricTypeHistogram: + for i := 0; i < metric.Histogram().DataPoints().Len(); i++ { + dp := metric.Histogram().DataPoints().At(i) + if !f(dp.Attributes()) { + return + } + } + case pmetric.MetricTypeExponentialHistogram: + for i := 0; i < metric.ExponentialHistogram().DataPoints().Len(); i++ { + dp := metric.ExponentialHistogram().DataPoints().At(i) + if !f(dp.Attributes()) { + return + } + } + case pmetric.MetricTypeSummary: + for i := 0; i < metric.Summary().DataPoints().Len(); i++ { + dp := metric.Summary().DataPoints().At(i) + if !f(dp.Attributes()) { + return + } + } + } +} + +func isNotPresent(target string, arr []string) bool { + for _, item := range arr { + if item == target { + return false + } + } + return true +} + +func mergeNumberDataPoints(dpsMap map[string]pmetric.NumberDataPointSlice, agg AggregationType, to pmetric.NumberDataPointSlice) { + for _, dps := range dpsMap { + dp := to.AppendEmpty() + dps.At(0).MoveTo(dp) + switch dp.ValueType() { + case pmetric.NumberDataPointValueTypeDouble: + medianNumbers := []float64{dp.DoubleValue()} + for i := 1; i < dps.Len(); i++ { + switch agg { + case Sum, Mean: + dp.SetDoubleValue(dp.DoubleValue() + doubleVal(dps.At(i))) + case Max: + dp.SetDoubleValue(math.Max(dp.DoubleValue(), doubleVal(dps.At(i)))) + case Min: + dp.SetDoubleValue(math.Min(dp.DoubleValue(), doubleVal(dps.At(i)))) + case Median: + medianNumbers = append(medianNumbers, doubleVal(dps.At(i))) + case Count: + dp.SetDoubleValue(float64(dps.Len())) + } + if dps.At(i).StartTimestamp() < dp.StartTimestamp() { + dp.SetStartTimestamp(dps.At(i).StartTimestamp()) + } + } + if agg == Mean { + dp.SetDoubleValue(dp.DoubleValue() / float64(dps.Len())) + } + if agg == Median { + if len(medianNumbers) == 1 { + dp.SetDoubleValue(medianNumbers[0]) + } else { + sort.Float64s(medianNumbers) + mNumber := len(medianNumbers) / 2 + if math.Mod(float64(len(medianNumbers)), 2) != 0 { + dp.SetDoubleValue(medianNumbers[mNumber]) + } else { + dp.SetDoubleValue((medianNumbers[mNumber-1] + medianNumbers[mNumber]) / 2) + } + } + } + case pmetric.NumberDataPointValueTypeInt: + medianNumbers := []int64{dp.IntValue()} + for i := 1; i < dps.Len(); i++ { + switch agg { + case Sum, Mean: + dp.SetIntValue(dp.IntValue() + dps.At(i).IntValue()) + case Max: + if dp.IntValue() < intVal(dps.At(i)) { + dp.SetIntValue(intVal(dps.At(i))) + } + case Min: + if dp.IntValue() > intVal(dps.At(i)) { + dp.SetIntValue(intVal(dps.At(i))) + } + case Median: + medianNumbers = append(medianNumbers, intVal(dps.At(i))) + case Count: + dp.SetIntValue(int64(dps.Len())) + } + if dps.At(i).StartTimestamp() < dp.StartTimestamp() { + dp.SetStartTimestamp(dps.At(i).StartTimestamp()) + } + } + if agg == Median { + if len(medianNumbers) == 1 { + dp.SetIntValue(medianNumbers[0]) + } else { + sort.Slice(medianNumbers, func(i, j int) bool { + return medianNumbers[i] < medianNumbers[j] + }) + mNumber := len(medianNumbers) / 2 + if math.Mod(float64(len(medianNumbers)), 2) != 0 { + dp.SetIntValue(medianNumbers[mNumber]) + } else { + dp.SetIntValue((medianNumbers[mNumber-1] + medianNumbers[mNumber]) / 2) + } + } + } + if agg == Mean { + dp.SetIntValue(dp.IntValue() / int64(dps.Len())) + } + } + } +} + +func doubleVal(dp pmetric.NumberDataPoint) float64 { + switch dp.ValueType() { + case pmetric.NumberDataPointValueTypeDouble: + return dp.DoubleValue() + case pmetric.NumberDataPointValueTypeInt: + return float64(dp.IntValue()) + } + return 0 +} + +func intVal(dp pmetric.NumberDataPoint) int64 { + switch dp.ValueType() { + case pmetric.NumberDataPointValueTypeDouble: + return int64(dp.DoubleValue()) + case pmetric.NumberDataPointValueTypeInt: + return dp.IntValue() + } + return 0 +} + +func mergeHistogramDataPoints(dpsMap map[string]pmetric.HistogramDataPointSlice, to pmetric.HistogramDataPointSlice) { + for _, dps := range dpsMap { + dp := to.AppendEmpty() + dps.At(0).MoveTo(dp) + counts := dp.BucketCounts() + for i := 1; i < dps.Len(); i++ { + if dps.At(i).Count() == 0 { + continue + } + dp.SetCount(dp.Count() + dps.At(i).Count()) + dp.SetSum(dp.Sum() + dps.At(i).Sum()) + if dp.HasMin() && dp.Min() > dps.At(i).Min() { + dp.SetMin(dps.At(i).Min()) + } + if dp.HasMax() && dp.Max() < dps.At(i).Max() { + dp.SetMax(dps.At(i).Max()) + } + for b := 0; b < dps.At(i).BucketCounts().Len(); b++ { + counts.SetAt(b, counts.At(b)+dps.At(i).BucketCounts().At(b)) + } + dps.At(i).Exemplars().MoveAndAppendTo(dp.Exemplars()) + if dps.At(i).StartTimestamp() < dp.StartTimestamp() { + dp.SetStartTimestamp(dps.At(i).StartTimestamp()) + } + } + } +} + +func mergeExponentialHistogramDataPoints(dpsMap map[string]pmetric.ExponentialHistogramDataPointSlice, + to pmetric.ExponentialHistogramDataPointSlice, +) { + for _, dps := range dpsMap { + dp := to.AppendEmpty() + dps.At(0).MoveTo(dp) + negatives := dp.Negative().BucketCounts() + positives := dp.Positive().BucketCounts() + for i := 1; i < dps.Len(); i++ { + if dps.At(i).Count() == 0 { + continue + } + dp.SetCount(dp.Count() + dps.At(i).Count()) + dp.SetSum(dp.Sum() + dps.At(i).Sum()) + if dp.HasMin() && dp.Min() > dps.At(i).Min() { + dp.SetMin(dps.At(i).Min()) + } + if dp.HasMax() && dp.Max() < dps.At(i).Max() { + dp.SetMax(dps.At(i).Max()) + } + for b := 0; b < dps.At(i).Negative().BucketCounts().Len(); b++ { + negatives.SetAt(b, negatives.At(b)+dps.At(i).Negative().BucketCounts().At(b)) + } + for b := 0; b < dps.At(i).Positive().BucketCounts().Len(); b++ { + positives.SetAt(b, positives.At(b)+dps.At(i).Positive().BucketCounts().At(b)) + } + dps.At(i).Exemplars().MoveAndAppendTo(dp.Exemplars()) + if dps.At(i).StartTimestamp() < dp.StartTimestamp() { + dp.SetStartTimestamp(dps.At(i).StartTimestamp()) + } + } + } +} + +func groupNumberDataPoints(dps pmetric.NumberDataPointSlice, useStartTime bool, + dpsByAttrsAndTs map[string]pmetric.NumberDataPointSlice, +) { + var keyHashParts []any + for i := 0; i < dps.Len(); i++ { + if useStartTime { + keyHashParts = []any{dps.At(i).StartTimestamp().String()} + } + key := dataPointHashKey(dps.At(i).Attributes(), dps.At(i).Timestamp(), keyHashParts...) + if _, ok := dpsByAttrsAndTs[key]; !ok { + dpsByAttrsAndTs[key] = pmetric.NewNumberDataPointSlice() + } + dps.At(i).MoveTo(dpsByAttrsAndTs[key].AppendEmpty()) + } +} + +func groupHistogramDataPoints(dps pmetric.HistogramDataPointSlice, useStartTime bool, + dpsByAttrsAndTs map[string]pmetric.HistogramDataPointSlice, +) { + for i := 0; i < dps.Len(); i++ { + dp := dps.At(i) + keyHashParts := make([]any, 0, dp.ExplicitBounds().Len()+4) + for b := 0; b < dp.ExplicitBounds().Len(); b++ { + keyHashParts = append(keyHashParts, dp.ExplicitBounds().At(b)) + } + if useStartTime { + keyHashParts = append(keyHashParts, dp.StartTimestamp().String()) + } + + keyHashParts = append(keyHashParts, dp.HasMin(), dp.HasMax(), uint32(dp.Flags())) + key := dataPointHashKey(dps.At(i).Attributes(), dp.Timestamp(), keyHashParts...) + if _, ok := dpsByAttrsAndTs[key]; !ok { + dpsByAttrsAndTs[key] = pmetric.NewHistogramDataPointSlice() + } + dp.MoveTo(dpsByAttrsAndTs[key].AppendEmpty()) + } +} + +func groupExponentialHistogramDataPoints(dps pmetric.ExponentialHistogramDataPointSlice, useStartTime bool, + dpsByAttrsAndTs map[string]pmetric.ExponentialHistogramDataPointSlice, +) { + for i := 0; i < dps.Len(); i++ { + dp := dps.At(i) + keyHashParts := make([]any, 0, 5) + keyHashParts = append(keyHashParts, dp.Scale(), dp.HasMin(), dp.HasMax(), uint32(dp.Flags()), dp.Negative().Offset(), + dp.Positive().Offset()) + if useStartTime { + keyHashParts = append(keyHashParts, dp.StartTimestamp().String()) + } + key := dataPointHashKey(dps.At(i).Attributes(), dp.Timestamp(), keyHashParts...) + if _, ok := dpsByAttrsAndTs[key]; !ok { + dpsByAttrsAndTs[key] = pmetric.NewExponentialHistogramDataPointSlice() + } + dp.MoveTo(dpsByAttrsAndTs[key].AppendEmpty()) + } +} + +func dataPointHashKey(atts pcommon.Map, ts pcommon.Timestamp, other ...any) string { + hashParts := []any{atts.AsRaw(), ts.String()} + jsonStr, _ := json.Marshal(append(hashParts, other...)) + return string(jsonStr) +} diff --git a/internal/coreinternal/aggregateutil/aggregate_test.go b/internal/coreinternal/aggregateutil/aggregate_test.go new file mode 100644 index 000000000000..642e44996dd8 --- /dev/null +++ b/internal/coreinternal/aggregateutil/aggregate_test.go @@ -0,0 +1,564 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package aggregateutil // import "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/aggregateutil" + +import ( + "testing" + "time" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/pmetric" +) + +func Test_CopyMetricDetails(t *testing.T) { + gaugeFunc := func() pmetric.Metric { + m := pmetric.NewMetric() + m.SetDescription("desc") + m.SetName("name") + m.SetUnit("unit") + m.SetEmptyGauge() + return m + } + + sumFunc := func() pmetric.Metric { + m := pmetric.NewMetric() + m.SetDescription("desc") + m.SetName("name") + m.SetUnit("unit") + s := m.SetEmptySum() + s.SetAggregationTemporality(pmetric.AggregationTemporalityCumulative) + s.SetIsMonotonic(true) + return m + } + + summaryFunc := func() pmetric.Metric { + m := pmetric.NewMetric() + m.SetDescription("desc") + m.SetName("name") + m.SetUnit("unit") + m.SetEmptySummary() + return m + } + + histogramFunc := func() pmetric.Metric { + m := pmetric.NewMetric() + m.SetDescription("desc") + m.SetName("name") + m.SetUnit("unit") + m.SetEmptyHistogram().SetAggregationTemporality(pmetric.AggregationTemporalityCumulative) + return m + } + + expHistogramFunc := func() pmetric.Metric { + m := pmetric.NewMetric() + m.SetDescription("desc") + m.SetName("name") + m.SetUnit("unit") + m.SetEmptyExponentialHistogram().SetAggregationTemporality(pmetric.AggregationTemporalityDelta) + return m + } + tests := []struct { + name string + from func() pmetric.Metric + to func() pmetric.Metric + }{ + { + name: "gauge", + from: gaugeFunc, + to: gaugeFunc, + }, + { + name: "summary", + from: summaryFunc, + to: summaryFunc, + }, + { + name: "sum", + from: sumFunc, + to: sumFunc, + }, + { + name: "histogram", + from: histogramFunc, + to: histogramFunc, + }, + { + name: " exp histogram", + from: expHistogramFunc, + to: expHistogramFunc, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := pmetric.NewMetric() + from := tt.from() + to := tt.to() + CopyMetricDetails(from, result) + require.Equal(t, to, result) + }) + } +} + +func Test_FilterAttributes(t *testing.T) { + tests := []struct { + name string + attr []string + want func() pmetric.Metric + }{ + { + name: "nil", + attr: nil, + want: func() pmetric.Metric { + m := pmetric.NewMetric() + s := m.SetEmptySum() + d := s.DataPoints().AppendEmpty() + d.Attributes().PutStr("attr1", "val1") + d.Attributes().PutStr("attr2", "val2") + return m + }, + }, + { + name: "empty", + attr: []string{}, + want: func() pmetric.Metric { + m := pmetric.NewMetric() + s := m.SetEmptySum() + s.DataPoints().AppendEmpty() + return m + }, + }, + { + name: "valid", + attr: []string{"attr1"}, + want: func() pmetric.Metric { + m := pmetric.NewMetric() + s := m.SetEmptySum() + d := s.DataPoints().AppendEmpty() + d.Attributes().PutStr("attr1", "val1") + return m + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + m := pmetric.NewMetric() + s := m.SetEmptySum() + d := s.DataPoints().AppendEmpty() + d.Attributes().PutStr("attr1", "val1") + d.Attributes().PutStr("attr2", "val2") + + FilterAttrs(m, tt.attr) + require.Equal(t, tt.want(), m) + }) + } +} + +func Test_RangeDataPointAttributes(t *testing.T) { + fun := func(attrs pcommon.Map) bool { + attrs.RemoveIf(func(k string, _ pcommon.Value) bool { + return isNotPresent(k, []string{"attr1"}) + }) + return true + } + + tests := []struct { + name string + in func() pmetric.Metric + want func() pmetric.Metric + }{ + { + name: "sum", + in: func() pmetric.Metric { + m := pmetric.NewMetric() + s := m.SetEmptySum() + d := s.DataPoints().AppendEmpty() + d.Attributes().PutStr("attr1", "val1") + d.Attributes().PutStr("attr2", "val2") + return m + }, + want: func() pmetric.Metric { + m := pmetric.NewMetric() + s := m.SetEmptySum() + d := s.DataPoints().AppendEmpty() + d.Attributes().PutStr("attr1", "val1") + return m + }, + }, + { + name: "gauge", + in: func() pmetric.Metric { + m := pmetric.NewMetric() + s := m.SetEmptyGauge() + d := s.DataPoints().AppendEmpty() + d.Attributes().PutStr("attr1", "val1") + d.Attributes().PutStr("attr2", "val2") + return m + }, + want: func() pmetric.Metric { + m := pmetric.NewMetric() + s := m.SetEmptyGauge() + d := s.DataPoints().AppendEmpty() + d.Attributes().PutStr("attr1", "val1") + return m + }, + }, + { + name: "summary", + in: func() pmetric.Metric { + m := pmetric.NewMetric() + s := m.SetEmptySummary() + d := s.DataPoints().AppendEmpty() + d.Attributes().PutStr("attr1", "val1") + d.Attributes().PutStr("attr2", "val2") + return m + }, + want: func() pmetric.Metric { + m := pmetric.NewMetric() + s := m.SetEmptySummary() + d := s.DataPoints().AppendEmpty() + d.Attributes().PutStr("attr1", "val1") + return m + }, + }, + { + name: "histogram", + in: func() pmetric.Metric { + m := pmetric.NewMetric() + s := m.SetEmptyHistogram() + d := s.DataPoints().AppendEmpty() + d.Attributes().PutStr("attr1", "val1") + d.Attributes().PutStr("attr2", "val2") + return m + }, + want: func() pmetric.Metric { + m := pmetric.NewMetric() + s := m.SetEmptyHistogram() + d := s.DataPoints().AppendEmpty() + d.Attributes().PutStr("attr1", "val1") + return m + }, + }, + { + name: "exp histogram", + in: func() pmetric.Metric { + m := pmetric.NewMetric() + s := m.SetEmptyExponentialHistogram() + d := s.DataPoints().AppendEmpty() + d.Attributes().PutStr("attr1", "val1") + d.Attributes().PutStr("attr2", "val2") + return m + }, + want: func() pmetric.Metric { + m := pmetric.NewMetric() + s := m.SetEmptyExponentialHistogram() + d := s.DataPoints().AppendEmpty() + d.Attributes().PutStr("attr1", "val1") + return m + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + m := tt.in() + RangeDataPointAttributes(m, fun) + require.Equal(t, tt.want(), m) + }) + } +} + +func Test_GroupDataPoints(t *testing.T) { + mapAttr := pcommon.NewMap() + mapAttr.PutStr("attr1", "val1") + hash := dataPointHashKey(mapAttr, pcommon.NewTimestampFromTime(time.Time{})) + + hashHistogram := dataPointHashKey(mapAttr, pcommon.NewTimestampFromTime(time.Time{}), false, false, 0) + + hashExpHistogram := dataPointHashKey(mapAttr, pcommon.NewTimestampFromTime(time.Time{}), 0, false, false, 0, 0, 0) + + tests := []struct { + name string + in func() pmetric.Metric + aggGroup AggGroups + want AggGroups + }{ + { + name: "sum", + aggGroup: AggGroups{ + sum: map[string]pmetric.NumberDataPointSlice{ + hash: testDataNumber(), + }, + }, + in: func() pmetric.Metric { + m := pmetric.NewMetric() + s := m.SetEmptySum() + s.SetAggregationTemporality(pmetric.AggregationTemporalityCumulative) + d := s.DataPoints().AppendEmpty() + d.SetTimestamp(pcommon.NewTimestampFromTime(time.Time{})) + d.Attributes().PutStr("attr1", "val1") + d.SetIntValue(5) + return m + }, + want: AggGroups{ + sum: map[string]pmetric.NumberDataPointSlice{ + hash: testDataNumberDouble(), + }, + }, + }, + { + name: "gauge", + aggGroup: AggGroups{ + gauge: map[string]pmetric.NumberDataPointSlice{ + hash: testDataNumber(), + }, + }, + in: func() pmetric.Metric { + m := pmetric.NewMetric() + s := m.SetEmptyGauge() + d := s.DataPoints().AppendEmpty() + d.SetTimestamp(pcommon.NewTimestampFromTime(time.Time{})) + d.Attributes().PutStr("attr1", "val1") + d.SetIntValue(5) + return m + }, + want: AggGroups{ + gauge: map[string]pmetric.NumberDataPointSlice{ + hash: testDataNumberDouble(), + }, + }, + }, + { + name: "histogram", + aggGroup: AggGroups{ + histogram: map[string]pmetric.HistogramDataPointSlice{ + hashHistogram: testDataHistogram(), + }, + }, + in: func() pmetric.Metric { + m := pmetric.NewMetric() + s := m.SetEmptyHistogram() + s.SetAggregationTemporality(pmetric.AggregationTemporalityCumulative) + d := s.DataPoints().AppendEmpty() + d.SetTimestamp(pcommon.NewTimestampFromTime(time.Time{})) + d.Attributes().PutStr("attr1", "val1") + d.SetCount(1) + return m + }, + want: AggGroups{ + histogram: map[string]pmetric.HistogramDataPointSlice{ + hashHistogram: testDataHistogramDouble(), + }, + }, + }, + { + name: "exp histogram", + aggGroup: AggGroups{ + expHistogram: map[string]pmetric.ExponentialHistogramDataPointSlice{ + hashExpHistogram: testDataExpHistogram(), + }, + }, + in: func() pmetric.Metric { + m := pmetric.NewMetric() + s := m.SetEmptyExponentialHistogram() + s.SetAggregationTemporality(pmetric.AggregationTemporalityCumulative) + d := s.DataPoints().AppendEmpty() + d.SetTimestamp(pcommon.NewTimestampFromTime(time.Time{})) + d.Attributes().PutStr("attr1", "val1") + d.SetCount(1) + return m + }, + want: AggGroups{ + expHistogram: map[string]pmetric.ExponentialHistogramDataPointSlice{ + hashExpHistogram: testDataExpHistogramDouble(), + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + a := tt.aggGroup + GroupDataPoints(tt.in(), &a) + require.Equal(t, tt.want, a) + }) + } +} + +func Test_MergeDataPoints(t *testing.T) { + mapAttr := pcommon.NewMap() + mapAttr.PutStr("attr1", "val1") + + hash := dataPointHashKey(mapAttr, pcommon.NewTimestampFromTime(time.Time{})) + + hashHistogram := dataPointHashKey(mapAttr, pcommon.NewTimestampFromTime(time.Time{}), false, false, 0) + + hashExpHistogram := dataPointHashKey(mapAttr, pcommon.NewTimestampFromTime(time.Time{}), 0, false, false, 0, 0, 0) + + tests := []struct { + name string + typ AggregationType + aggGroup AggGroups + want func() pmetric.Metric + in func() pmetric.Metric + }{ + { + name: "sum", + aggGroup: AggGroups{ + sum: map[string]pmetric.NumberDataPointSlice{ + hash: testDataNumberDouble(), + }, + }, + typ: Sum, + want: func() pmetric.Metric { + m := pmetric.NewMetric() + s := m.SetEmptySum() + s.SetAggregationTemporality(pmetric.AggregationTemporalityCumulative) + d := s.DataPoints().AppendEmpty() + d.Attributes().PutStr("attr1", "val1") + d.SetIntValue(6) + return m + }, + in: func() pmetric.Metric { + m := pmetric.NewMetric() + s := m.SetEmptySum() + s.SetAggregationTemporality(pmetric.AggregationTemporalityCumulative) + return m + }, + }, + { + name: "gauge", + aggGroup: AggGroups{ + gauge: map[string]pmetric.NumberDataPointSlice{ + hash: testDataNumberDouble(), + }, + }, + typ: Sum, + want: func() pmetric.Metric { + m := pmetric.NewMetric() + s := m.SetEmptyGauge() + d := s.DataPoints().AppendEmpty() + d.Attributes().PutStr("attr1", "val1") + d.SetIntValue(6) + return m + }, + in: func() pmetric.Metric { + m := pmetric.NewMetric() + m.SetEmptyGauge() + return m + }, + }, + { + name: "histogram", + aggGroup: AggGroups{ + histogram: map[string]pmetric.HistogramDataPointSlice{ + hashHistogram: testDataHistogramDouble(), + }, + }, + typ: Sum, + want: func() pmetric.Metric { + m := pmetric.NewMetric() + s := m.SetEmptyHistogram() + d := s.DataPoints().AppendEmpty() + d.Attributes().PutStr("attr1", "val1") + d.SetCount(3) + d.SetSum(0) + return m + }, + in: func() pmetric.Metric { + m := pmetric.NewMetric() + m.SetEmptyHistogram() + return m + }, + }, + { + name: "exp histogram", + aggGroup: AggGroups{ + expHistogram: map[string]pmetric.ExponentialHistogramDataPointSlice{ + hashExpHistogram: testDataExpHistogramDouble(), + }, + }, + typ: Sum, + want: func() pmetric.Metric { + m := pmetric.NewMetric() + s := m.SetEmptyExponentialHistogram() + d := s.DataPoints().AppendEmpty() + d.Attributes().PutStr("attr1", "val1") + d.SetCount(3) + d.SetSum(0) + return m + }, + in: func() pmetric.Metric { + m := pmetric.NewMetric() + m.SetEmptyExponentialHistogram() + return m + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + m := tt.in() + MergeDataPoints(m, tt.typ, tt.aggGroup) + require.Equal(t, tt.want(), m) + }) + } +} + +func testDataNumber() pmetric.NumberDataPointSlice { + data := pmetric.NewNumberDataPointSlice() + d := data.AppendEmpty() + d.Attributes().PutStr("attr1", "val1") + d.SetIntValue(1) + return data +} + +func testDataNumberDouble() pmetric.NumberDataPointSlice { + dataWant := pmetric.NewNumberDataPointSlice() + dWant := dataWant.AppendEmpty() + dWant.Attributes().PutStr("attr1", "val1") + dWant.SetIntValue(1) + dWant2 := dataWant.AppendEmpty() + dWant2.SetTimestamp(pcommon.NewTimestampFromTime(time.Time{})) + dWant2.Attributes().PutStr("attr1", "val1") + dWant2.SetIntValue(5) + return dataWant +} + +func testDataHistogram() pmetric.HistogramDataPointSlice { + data := pmetric.NewHistogramDataPointSlice() + d := data.AppendEmpty() + d.Attributes().PutStr("attr1", "val1") + d.SetCount(2) + return data +} + +func testDataHistogramDouble() pmetric.HistogramDataPointSlice { + dataWant := pmetric.NewHistogramDataPointSlice() + dWant := dataWant.AppendEmpty() + dWant.Attributes().PutStr("attr1", "val1") + dWant.SetCount(2) + dWant2 := dataWant.AppendEmpty() + dWant2.SetTimestamp(pcommon.NewTimestampFromTime(time.Time{})) + dWant2.Attributes().PutStr("attr1", "val1") + dWant2.SetCount(1) + return dataWant +} + +func testDataExpHistogram() pmetric.ExponentialHistogramDataPointSlice { + data := pmetric.NewExponentialHistogramDataPointSlice() + d := data.AppendEmpty() + d.Attributes().PutStr("attr1", "val1") + d.SetCount(2) + return data +} + +func testDataExpHistogramDouble() pmetric.ExponentialHistogramDataPointSlice { + dataWant := pmetric.NewExponentialHistogramDataPointSlice() + dWant := dataWant.AppendEmpty() + dWant.Attributes().PutStr("attr1", "val1") + dWant.SetCount(2) + dWant2 := dataWant.AppendEmpty() + dWant2.SetTimestamp(pcommon.NewTimestampFromTime(time.Time{})) + dWant2.Attributes().PutStr("attr1", "val1") + dWant2.SetCount(1) + return dataWant +} diff --git a/internal/coreinternal/aggregateutil/type.go b/internal/coreinternal/aggregateutil/type.go new file mode 100644 index 000000000000..b2fb01271974 --- /dev/null +++ b/internal/coreinternal/aggregateutil/type.go @@ -0,0 +1,69 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package aggregateutil // import "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/aggregateutil" + +import ( + "fmt" + "strings" + + "go.opentelemetry.io/collector/pdata/pmetric" +) + +// AggregationType is the enum to capture the three types of aggregation for the aggregation operation. +type AggregationType string + +const ( + // Sum indicates taking the sum of the aggregated data. + Sum AggregationType = "sum" + + // Mean indicates taking the mean of the aggregated data. + Mean AggregationType = "mean" + + // Min indicates taking the minimum of the aggregated data. + Min AggregationType = "min" + + // Max indicates taking the max of the aggregated data. + Max AggregationType = "max" + + // Median indicates taking the median of the aggregated data. + Median AggregationType = "median" + + // Count indicates taking the count of the aggregated data. + Count AggregationType = "count" +) + +var AggregationTypes = []AggregationType{Sum, Mean, Min, Max, Median, Count} + +func (at AggregationType) IsValid() bool { + for _, aggregationType := range AggregationTypes { + if at == aggregationType { + return true + } + } + + return false +} + +func GetSupportedAggregationFunctionsList() string { + slice := make([]string, 0, len(AggregationTypes)) + for _, a := range AggregationTypes { + slice = append(slice, string(a)) + } + return strings.Join(slice, ", ") +} + +type AggGroups struct { + gauge map[string]pmetric.NumberDataPointSlice + sum map[string]pmetric.NumberDataPointSlice + histogram map[string]pmetric.HistogramDataPointSlice + expHistogram map[string]pmetric.ExponentialHistogramDataPointSlice +} + +func ConvertToAggregationFunction(str string) (AggregationType, error) { + a := AggregationType(str) + if a.IsValid() { + return a, nil + } + return a, fmt.Errorf("unsupported function: '%s'", str) +} diff --git a/internal/coreinternal/aggregateutil/type_test.go b/internal/coreinternal/aggregateutil/type_test.go new file mode 100644 index 000000000000..7306a7a905fb --- /dev/null +++ b/internal/coreinternal/aggregateutil/type_test.go @@ -0,0 +1,70 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package aggregateutil + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" +) + +func Test_AggregationType_IsValid(t *testing.T) { + tests := []struct { + name string + in AggregationType + want bool + }{ + { + name: "valid", + in: Mean, + want: true, + }, + + { + name: "invalid", + in: AggregationType("invalid"), + want: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + require.Equal(t, tt.want, tt.in.IsValid()) + }) + } +} + +func Test_AggregationType_Convert(t *testing.T) { + tests := []struct { + name string + in string + want AggregationType + wantErr error + }{ + { + name: "valid", + in: "mean", + want: Mean, + wantErr: nil, + }, + + { + name: "invalid", + in: "invalid", + want: "invalid", + wantErr: fmt.Errorf("unsupported function: 'invalid'"), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := ConvertToAggregationFunction(tt.in) + require.Equal(t, tt.want, got) + require.Equal(t, tt.wantErr, err) + }) + } +} + +func Test_GetSupportedAggregationFunctionsList(t *testing.T) { + require.Equal(t, "sum, mean, min, max, median, count", GetSupportedAggregationFunctionsList()) +} diff --git a/internal/coreinternal/attraction/attraction.go b/internal/coreinternal/attraction/attraction.go index c05d4c4d52bd..b1a5083eba71 100644 --- a/internal/coreinternal/attraction/attraction.go +++ b/internal/coreinternal/attraction/attraction.go @@ -12,6 +12,8 @@ import ( "go.opentelemetry.io/collector/client" "go.opentelemetry.io/collector/pdata/pcommon" "go.uber.org/zap" + + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/clientutil" ) // Settings specifies the processor settings. @@ -32,7 +34,7 @@ type ActionKeyValue struct { // The type of the value is inferred from the configuration. Value any `mapstructure:"value"` - // A regex pattern must be specified for the action EXTRACT. + // A regex pattern must be specified for the action EXTRACT. // It uses the attribute specified by `key' to extract values from // The target keys are inferred based on the names of the matcher groups // provided and the names will be inferred based on the values of the @@ -341,14 +343,17 @@ func (ap *AttrProc) Process(ctx context.Context, logger *zap.Logger, attrs pcomm func getAttributeValueFromContext(ctx context.Context, key string) (pcommon.Value, bool) { const ( - metadataPrefix = "metadata." - authPrefix = "auth." + metadataPrefix = "metadata." + authPrefix = "auth." + clientAddressKey = "client.address" ) ci := client.FromContext(ctx) var vals []string switch { + case key == clientAddressKey: + vals = []string{clientutil.Address(ci)} case strings.HasPrefix(key, metadataPrefix): mdKey := strings.TrimPrefix(key, metadataPrefix) vals = ci.Metadata.Get(mdKey) diff --git a/internal/coreinternal/attraction/attraction_test.go b/internal/coreinternal/attraction/attraction_test.go index 05e0b3038972..6d2b3cbe5441 100644 --- a/internal/coreinternal/attraction/attraction_test.go +++ b/internal/coreinternal/attraction/attraction_test.go @@ -10,6 +10,7 @@ import ( "errors" "fmt" "math" + "net" "regexp" "testing" @@ -85,7 +86,6 @@ func TestAttributes_InsertValue(t *testing.T) { } func TestAttributes_InsertFromAttribute(t *testing.T) { - testCases := []testCase{ // Ensure no attribute is inserted because because attributes do not exist. { @@ -143,7 +143,6 @@ func TestAttributes_InsertFromAttribute(t *testing.T) { } func TestAttributes_UpdateValue(t *testing.T) { - testCases := []testCase{ // Ensure no changes to the span as there is no attributes map. { @@ -189,7 +188,6 @@ func TestAttributes_UpdateValue(t *testing.T) { } func TestAttributes_UpdateFromAttribute(t *testing.T) { - testCases := []testCase{ // Ensure no changes to the span as there is no attributes map. { @@ -402,7 +400,6 @@ func TestAttributes_Extract(t *testing.T) { cfg := &Settings{ Actions: []ActionKeyValue{ - {Key: "user_key", RegexPattern: "^\\/api\\/v1\\/document\\/(?P.*)\\/update\\/(?P.*)$", Action: EXTRACT}, }, } @@ -417,7 +414,6 @@ func TestAttributes_Extract(t *testing.T) { } func TestAttributes_UpsertFromAttribute(t *testing.T) { - testCases := []testCase{ // Ensure `new_user_key` is not set for spans with no attributes. { @@ -856,7 +852,8 @@ func TestInvalidConfig(t *testing.T) { }, errorString: "error creating AttrProc due to missing required field \"pattern\" for action \"extract\" at the 0-th action", }, - {name: "set value for extract", + { + name: "set value for extract", actionLists: []ActionKeyValue{ {Key: "Key", RegexPattern: "(?P.*?)$", Value: "value", Action: EXTRACT}, }, @@ -918,14 +915,14 @@ func TestValidConfiguration(t *testing.T) { compiledRegex := regexp.MustCompile(`^\/api\/v1\/document\/(?P.*)\/update$`) assert.Equal(t, []attributeAction{ {Key: "one", Action: DELETE}, - {Key: "two", Action: INSERT, + { + Key: "two", Action: INSERT, AttributeValue: &av, }, {Key: "three", FromAttribute: "two", Action: UPDATE}, {Key: "five", FromAttribute: "two", Action: UPSERT}, {Key: "two", Regex: compiledRegex, AttrNames: []string{"", "documentId"}, Action: EXTRACT}, }, ap.actions) - } func hash(b []byte) string { @@ -949,7 +946,6 @@ func (a mockInfoAuth) GetAttributeNames() []string { } func TestFromContext(t *testing.T) { - mdCtx := client.NewContext(context.TODO(), client.Info{ Metadata: client.NewMetadata(map[string][]string{ "source_single_val": {"single_val"}, @@ -958,6 +954,9 @@ func TestFromContext(t *testing.T) { Auth: mockInfoAuth{ "source_auth_val": "auth_val", }, + Addr: &net.IPAddr{ + IP: net.IPv4(192, 168, 1, 1), + }, }) testCases := []struct { @@ -1008,6 +1007,12 @@ func TestFromContext(t *testing.T) { expectedAttributes: map[string]any{}, action: &ActionKeyValue{Key: "dest", FromContext: "auth.unknown_val", Action: INSERT}, }, + { + name: "with_address", + ctx: mdCtx, + expectedAttributes: map[string]any{"dest": "192.168.1.1"}, + action: &ActionKeyValue{Key: "dest", FromContext: "client.address", Action: INSERT}, + }, } for _, tc := range testCases { diff --git a/internal/coreinternal/clientutil/client.go b/internal/coreinternal/clientutil/client.go new file mode 100644 index 000000000000..c40c2d5f4335 --- /dev/null +++ b/internal/coreinternal/clientutil/client.go @@ -0,0 +1,40 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package clientutil // import "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/clientutil" + +import ( + "net" + "strings" + + "go.opentelemetry.io/collector/client" +) + +// Address returns the address of the client connecting to the collector. +func Address(client client.Info) string { + if client.Addr == nil { + return "" + } + switch addr := client.Addr.(type) { + case *net.UDPAddr: + return addr.IP.String() + case *net.TCPAddr: + return addr.IP.String() + case *net.IPAddr: + return addr.IP.String() + } + + // If this is not a known address type, check for known "untyped" formats. + // 1.1.1.1: + + lastColonIndex := strings.LastIndex(client.Addr.String(), ":") + if lastColonIndex != -1 { + ipString := client.Addr.String()[:lastColonIndex] + ip := net.ParseIP(ipString) + if ip != nil { + return ip.String() + } + } + + return client.Addr.String() +} diff --git a/internal/coreinternal/clientutil/client_test.go b/internal/coreinternal/clientutil/client_test.go new file mode 100644 index 000000000000..2dcfa0dea395 --- /dev/null +++ b/internal/coreinternal/clientutil/client_test.go @@ -0,0 +1,79 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package clientutil + +import ( + "net" + "testing" + + "github.com/stretchr/testify/assert" + "go.opentelemetry.io/collector/client" +) + +type fakeAddr string + +func (s fakeAddr) String() string { + return string(s) +} + +func (fakeAddr) Network() string { + return "tcp" +} + +func TestAddress(t *testing.T) { + tests := []struct { + name string + client client.Info + want string + }{ + { + name: "UDPAddr", + client: client.Info{ + Addr: &net.UDPAddr{ + IP: net.IPv4(192, 0, 2, 1), + Port: 1234, + }, + }, + want: "192.0.2.1", + }, + { + name: "TCPAddr", + client: client.Info{ + Addr: &net.TCPAddr{ + IP: net.IPv4(192, 0, 2, 2), + Port: 1234, + }, + }, + want: "192.0.2.2", + }, + { + name: "IPAddr", + client: client.Info{ + Addr: &net.IPAddr{ + IP: net.IPv4(192, 0, 2, 3), + }, + }, + want: "192.0.2.3", + }, + { + name: "fake_addr_with_port", + client: client.Info{ + Addr: fakeAddr("1.1.1.1:3200"), + }, + want: "1.1.1.1", + }, + { + name: "fake_addr_without_port", + client: client.Info{ + Addr: fakeAddr("1.1.1.1"), + }, + want: "1.1.1.1", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + assert.Equal(t, tt.want, Address(tt.client)) + }) + } +} diff --git a/internal/coreinternal/consumerretry/logs_test.go b/internal/coreinternal/consumerretry/logs_test.go index f9a34a96893f..7193797b76e7 100644 --- a/internal/coreinternal/consumerretry/logs_test.go +++ b/internal/coreinternal/consumerretry/logs_test.go @@ -65,7 +65,7 @@ func TestConsumeLogs(t *testing.T) { err := consumer.ConsumeLogs(context.Background(), testdata.GenerateLogsTwoLogRecordsSameResource()) assert.Equal(t, tt.expectedErr, err) if err == nil { - assert.Equal(t, 1, len(tt.consumer.AllLogs())) + assert.Len(t, tt.consumer.AllLogs(), 1) assert.Equal(t, 2, tt.consumer.AllLogs()[0].LogRecordCount()) if tt.consumer.acceptAfter > 0 { assert.Equal(t, tt.consumer.rejectCount.Load(), tt.consumer.acceptAfter) @@ -88,8 +88,7 @@ func TestConsumeLogs_ContextDeadline(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Millisecond) defer cancel() err := consumer.ConsumeLogs(ctx, testdata.GenerateLogsTwoLogRecordsSameResource()) - assert.Error(t, err) - assert.Contains(t, err.Error(), "context is cancelled or timed out retry later") + assert.ErrorContains(t, err, "context is cancelled or timed out retry later") } func TestConsumeLogs_PartialRetry(t *testing.T) { @@ -106,7 +105,7 @@ func TestConsumeLogs_PartialRetry(t *testing.T) { assert.NoError(t, consumer.ConsumeLogs(context.Background(), logs)) // Verify the logs batch is broken into two parts, one with the partial error and one without. - assert.Equal(t, 2, len(sink.AllLogs())) + assert.Len(t, sink.AllLogs(), 2) assert.Equal(t, 1, sink.AllLogs()[0].ResourceLogs().Len()) assert.Equal(t, 2, sink.AllLogs()[0].LogRecordCount()) assert.Equal(t, 1, sink.AllLogs()[1].ResourceLogs().Len()) diff --git a/internal/coreinternal/errorutil/grpc.go b/internal/coreinternal/errorutil/grpc.go new file mode 100644 index 000000000000..08b75990f0fc --- /dev/null +++ b/internal/coreinternal/errorutil/grpc.go @@ -0,0 +1,25 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package errorutil // import "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/errorutil" + +import ( + "go.opentelemetry.io/collector/consumer/consumererror" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func GrpcError(err error) error { + s, ok := status.FromError(err) + if !ok { + // Default to a retryable error + // https://github.com/open-telemetry/opentelemetry-proto/blob/main/docs/specification.md#failures + code := codes.Unavailable + if consumererror.IsPermanent(err) { + // non-retryable error + code = codes.Unknown + } + s = status.New(code, err.Error()) + } + return s.Err() +} diff --git a/internal/coreinternal/errorutil/http.go b/internal/coreinternal/errorutil/http.go new file mode 100644 index 000000000000..2d643042daaa --- /dev/null +++ b/internal/coreinternal/errorutil/http.go @@ -0,0 +1,33 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package errorutil // import "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/errorutil" + +import ( + "net/http" + + "go.opentelemetry.io/collector/consumer/consumererror" +) + +func HTTPError(w http.ResponseWriter, err error) { + if err == nil { + return + } + http.Error(w, err.Error(), GetHTTPStatusCodeFromError(err)) +} + +func GetHTTPStatusCodeFromError(err error) int { + // See requirements for receivers + // https://github.com/open-telemetry/opentelemetry-collector/blob/8e522ad950de6326a0841d7e1bef808bbc0d3537/receiver/doc.go#L10-L29 + + // See https://github.com/open-telemetry/opentelemetry-proto/blob/main/docs/specification.md#failures-1 + // to see a list of retryable http status codes. + + // non-retryable status + status := http.StatusBadRequest + if !consumererror.IsPermanent(err) { + // retryable status + status = http.StatusServiceUnavailable + } + return status +} diff --git a/internal/coreinternal/go.mod b/internal/coreinternal/go.mod index 8f9cc2d9fbfd..1be0fd475d6e 100644 --- a/internal/coreinternal/go.mod +++ b/internal/coreinternal/go.mod @@ -1,96 +1,95 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal -go 1.21.0 +go 1.22.0 require ( github.com/cenkalti/backoff/v4 v4.3.0 github.com/docker/go-connections v0.5.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.102.0 - github.com/stretchr/testify v1.9.0 - github.com/testcontainers/testcontainers-go v0.31.0 - go.opentelemetry.io/collector v0.102.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/receiver v0.102.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/elastic/lunes v0.1.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.116.0 + github.com/stretchr/testify v1.10.0 + github.com/testcontainers/testcontainers-go v0.34.0 + go.opentelemetry.io/collector/client v1.22.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 + go.opentelemetry.io/collector/receiver v0.116.0 + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 + go.opentelemetry.io/collector/semconv v0.116.0 + go.opentelemetry.io/otel v1.32.0 + go.opentelemetry.io/otel/trace v1.32.0 go.uber.org/goleak v1.3.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 - golang.org/x/text v0.15.0 + golang.org/x/text v0.21.0 + google.golang.org/grpc v1.68.1 ) require ( dario.cat/mergo v1.0.0 // indirect + github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/Microsoft/hcsshim v0.11.4 // indirect - github.com/beorn7/perks v1.0.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/containerd/containerd v1.7.15 // indirect github.com/containerd/log v0.1.0 // indirect - github.com/cpuguy83/dockercfg v0.3.1 // indirect + github.com/containerd/platforms v0.2.1 // indirect + github.com/cpuguy83/dockercfg v0.3.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/distribution/reference v0.5.0 // indirect - github.com/docker/docker v25.0.5+incompatible // indirect + github.com/distribution/reference v0.6.0 // indirect + github.com/docker/docker v27.3.1+incompatible // indirect github.com/docker/go-units v0.5.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.2 // indirect - github.com/knadh/koanf/maps v0.1.1 // indirect - github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/klauspost/compress v1.17.9 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/magefile/mage v1.15.0 // indirect github.com/magiconair/properties v1.8.7 // indirect - github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/patternmatcher v0.6.0 // indirect github.com/moby/sys/sequential v0.5.0 // indirect github.com/moby/sys/user v0.1.0 // indirect + github.com/moby/sys/userns v0.1.0 // indirect github.com/moby/term v0.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/morikuni/aec v1.0.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/shirou/gopsutil/v3 v3.24.4 // indirect + github.com/shirou/gopsutil/v3 v3.24.5 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/confmap v0.102.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/metric v1.27.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - golang.org/x/crypto v0.23.0 // indirect - golang.org/x/mod v0.16.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/tools v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/internal/coreinternal/go.sum b/internal/coreinternal/go.sum index defdad2707de..171d34fd3bd0 100644 --- a/internal/coreinternal/go.sum +++ b/internal/coreinternal/go.sum @@ -4,50 +4,47 @@ github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9 github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= -github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w= -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/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/containerd/containerd v1.7.15 h1:afEHXdil9iAm03BmhjzKyXnnEBtjaLJefdU7DV0IFes= -github.com/containerd/containerd v1.7.15/go.mod h1:ISzRRTMF8EXNpJlTzyr2XMhN+j9K302C21/+cr3kUnY= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= -github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= +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/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= -github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= -github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/docker v27.3.1+incompatible h1:KttF0XoteNTicmUtBO0L2tP+J7FGRFTjaEF4k6WdhfI= +github.com/docker/docker v27.3.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/elastic/lunes v0.1.0 h1:amRtLPjwkWtzDF/RKzcEPMvSsSseLDLW+bnhfNSLRe4= +github.com/elastic/lunes v0.1.0/go.mod h1:xGphYIt3XdZRtyWosHQTErsQTd4OP1p9wsbVoHelrd4= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -59,32 +56,28 @@ 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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4= -github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= -github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= -github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= -github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= +github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -104,18 +97,10 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= -github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= +github.com/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI= +github.com/shirou/gopsutil/v3 v3.24.5/go.mod h1:bsoOS1aStSs9ErQ1WWfxllSeS1K5D+U30r2NfcubMVk= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= @@ -123,18 +108,14 @@ github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnj github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/testcontainers/testcontainers-go v0.31.0 h1:W0VwIhcEVhRflwL9as3dhY6jXjVCA27AkmbnZ+UTh3U= -github.com/testcontainers/testcontainers-go v0.31.0/go.mod h1:D2lAoA0zUFiSY+eAflqK5mcUx/A5hrrORaEQrd0SefI= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/testcontainers/testcontainers-go v0.34.0 h1:5fbgF0vIN5u+nD3IWabQwRybuB4GY8G2HHgCkbMzMHo= +github.com/testcontainers/testcontainers-go v0.34.0/go.mod h1:6P/kMkQe8yqPHfPWNulFGdFHTD8HB2vLq/231xY2iPQ= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= @@ -143,44 +124,56 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= -go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= -go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 h1:j9+03ymgYhPKmeXGk5Zu+cIZOlVzd9Zv7QIiyItjFBU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0/go.mod h1:Y5+XiUG4Emn1hTfciPzGPJaSI+RpDts6BnCIir0SLqk= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -190,23 +183,19 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= -golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -216,41 +205,37 @@ golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= -golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 h1:Z0hjGZePRE0ZBWotvtrwxFNrNE9CUAGtplaDK5NNI/g= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 h1:P8OJ/WCl/Xo4E4zoe4/bifHpSmmKwARqyqE4nW6J2GQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= -gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= diff --git a/internal/coreinternal/goldendataset/metrics_gen.go b/internal/coreinternal/goldendataset/metrics_gen.go index 044cde1606ff..fea84d9abf4f 100644 --- a/internal/coreinternal/goldendataset/metrics_gen.go +++ b/internal/coreinternal/goldendataset/metrics_gen.go @@ -176,7 +176,7 @@ func populateDoubleHistogram(cfg MetricsCfg, dh pmetric.Histogram) { } func setDoubleHistogramBounds(hdp pmetric.HistogramDataPoint, bounds ...float64) { - counts := make([]uint64, len(bounds)) + counts := make([]uint64, len(bounds)+1) hdp.BucketCounts().FromRaw(counts) hdp.ExplicitBounds().FromRaw(bounds) } diff --git a/internal/coreinternal/goldendataset/metrics_gen_test.go b/internal/coreinternal/goldendataset/metrics_gen_test.go index 6cfc4b33f0a0..9b78c6615829 100644 --- a/internal/coreinternal/goldendataset/metrics_gen_test.go +++ b/internal/coreinternal/goldendataset/metrics_gen_test.go @@ -49,7 +49,7 @@ func TestDoubleHistogramFunctions(t *testing.T) { pt := pmetric.NewHistogramDataPoint() setDoubleHistogramBounds(pt, 1, 2, 3, 4, 5) require.Equal(t, 5, pt.ExplicitBounds().Len()) - require.Equal(t, 5, pt.BucketCounts().Len()) + require.Equal(t, 6, pt.BucketCounts().Len()) addDoubleHistogramVal(pt, 1) require.EqualValues(t, 1, pt.Count()) @@ -75,7 +75,7 @@ func TestGenDoubleHistogram(t *testing.T) { pts := getMetric(md).Histogram().DataPoints() pt := pts.At(0) buckets := pt.BucketCounts() - require.Equal(t, 5, buckets.Len()) + require.Equal(t, 6, buckets.Len()) require.EqualValues(t, 2, buckets.At(2)) } diff --git a/internal/coreinternal/goldendataset/pict_metrics_gen_test.go b/internal/coreinternal/goldendataset/pict_metrics_gen_test.go index 2a30fe5b7558..47ec630fd535 100644 --- a/internal/coreinternal/goldendataset/pict_metrics_gen_test.go +++ b/internal/coreinternal/goldendataset/pict_metrics_gen_test.go @@ -14,7 +14,7 @@ import ( func TestGenerateMetricDatas(t *testing.T) { mds, err := GenerateMetrics("testdata/generated_pict_pairs_metrics.txt") require.NoError(t, err) - require.Equal(t, 25, len(mds)) + require.Len(t, mds, 25) } func TestPICTtoCfg(t *testing.T) { diff --git a/internal/coreinternal/goldendataset/resource_generator.go b/internal/coreinternal/goldendataset/resource_generator.go index 03e82dfcdb1e..0f9ae0986346 100644 --- a/internal/coreinternal/goldendataset/resource_generator.go +++ b/internal/coreinternal/goldendataset/resource_generator.go @@ -5,7 +5,7 @@ package goldendataset // import "github.com/open-telemetry/opentelemetry-collect import ( "go.opentelemetry.io/collector/pdata/pcommon" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.18.0" ) // GenerateResource generates a PData Resource object with representative attributes for the diff --git a/internal/coreinternal/goldendataset/resource_generator_test.go b/internal/coreinternal/goldendataset/resource_generator_test.go index 1e1ab7b3c4b1..79474113c207 100644 --- a/internal/coreinternal/goldendataset/resource_generator_test.go +++ b/internal/coreinternal/goldendataset/resource_generator_test.go @@ -16,7 +16,7 @@ func TestGenerateResource(t *testing.T) { if rscID == ResourceEmpty { assert.Equal(t, 0, rsc.Attributes().Len()) } else { - assert.True(t, rsc.Attributes().Len() > 0) + assert.Positive(t, rsc.Attributes().Len()) } } } diff --git a/internal/coreinternal/goldendataset/span_generator.go b/internal/coreinternal/goldendataset/span_generator.go index a72cb327fa38..71720b154443 100644 --- a/internal/coreinternal/goldendataset/span_generator.go +++ b/internal/coreinternal/goldendataset/span_generator.go @@ -6,11 +6,12 @@ package goldendataset // import "github.com/open-telemetry/opentelemetry-collect import ( "fmt" "io" + "net/http" "time" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.12.0" ) var statusCodeMap = map[PICTInputStatus]ptrace.StatusCode{ @@ -228,7 +229,7 @@ func appendFaaSDatasourceAttributes(attrMap pcommon.Map) { func appendFaaSHTTPAttributes(includeStatus bool, attrMap pcommon.Map) { attrMap.PutStr(conventions.AttributeFaaSTrigger, conventions.AttributeFaaSTriggerHTTP) - attrMap.PutStr(conventions.AttributeHTTPMethod, "POST") + attrMap.PutStr(conventions.AttributeHTTPMethod, http.MethodPost) attrMap.PutStr(conventions.AttributeHTTPScheme, "https") attrMap.PutStr(conventions.AttributeHTTPHost, "api.opentelemetry.io") attrMap.PutStr(conventions.AttributeHTTPTarget, "/blog/posts") @@ -266,7 +267,7 @@ func appendFaaSOtherAttributes(attrMap pcommon.Map) { } func appendHTTPClientAttributes(includeStatus bool, attrMap pcommon.Map) { - attrMap.PutStr(conventions.AttributeHTTPMethod, "GET") + attrMap.PutStr(conventions.AttributeHTTPMethod, http.MethodGet) attrMap.PutStr(conventions.AttributeHTTPURL, "https://opentelemetry.io/registry/") if includeStatus { attrMap.PutInt(conventions.AttributeHTTPStatusCode, 200) @@ -276,7 +277,7 @@ func appendHTTPClientAttributes(includeStatus bool, attrMap pcommon.Map) { } func appendHTTPServerAttributes(includeStatus bool, attrMap pcommon.Map) { - attrMap.PutStr(conventions.AttributeHTTPMethod, "POST") + attrMap.PutStr(conventions.AttributeHTTPMethod, http.MethodPost) attrMap.PutStr(conventions.AttributeHTTPScheme, "https") attrMap.PutStr(conventions.AttributeHTTPServerName, "api22.opentelemetry.io") attrMap.PutInt(conventions.AttributeNetHostPort, 443) @@ -329,7 +330,7 @@ func appendInternalAttributes(attrMap pcommon.Map) { } func appendMaxCountAttributes(includeStatus bool, attrMap pcommon.Map) { - attrMap.PutStr(conventions.AttributeHTTPMethod, "POST") + attrMap.PutStr(conventions.AttributeHTTPMethod, http.MethodPost) attrMap.PutStr(conventions.AttributeHTTPScheme, "https") attrMap.PutStr(conventions.AttributeHTTPHost, "api.opentelemetry.io") attrMap.PutStr(conventions.AttributeNetHostName, "api22.opentelemetry.io") diff --git a/internal/coreinternal/goldendataset/traces_generator.go b/internal/coreinternal/goldendataset/traces_generator.go index cc4a8baf439d..ebb093c0d636 100644 --- a/internal/coreinternal/goldendataset/traces_generator.go +++ b/internal/coreinternal/goldendataset/traces_generator.go @@ -50,7 +50,8 @@ func GenerateTraces(tracePairsFile string, spanPairsFile string) ([]ptrace.Trace // // The generated resource spans. If err is not nil, some or all of the resource spans fields will be nil. func appendResourceSpan(tracingInputs *PICTTracingInputs, spanPairsFile string, - random io.Reader, resourceSpansSlice ptrace.ResourceSpansSlice) error { + random io.Reader, resourceSpansSlice ptrace.ResourceSpansSlice, +) error { resourceSpan := resourceSpansSlice.AppendEmpty() err := appendScopeSpans(tracingInputs, spanPairsFile, random, resourceSpan.ScopeSpans()) if err != nil { @@ -61,7 +62,8 @@ func appendResourceSpan(tracingInputs *PICTTracingInputs, spanPairsFile string, } func appendScopeSpans(tracingInputs *PICTTracingInputs, spanPairsFile string, - random io.Reader, scopeSpansSlice ptrace.ScopeSpansSlice) error { + random io.Reader, scopeSpansSlice ptrace.ScopeSpansSlice, +) error { var count int switch tracingInputs.InstrumentationLibrary { case LibraryNone: diff --git a/internal/coreinternal/goldendataset/traces_generator_test.go b/internal/coreinternal/goldendataset/traces_generator_test.go index f7a9be8061ae..c018d3affe83 100644 --- a/internal/coreinternal/goldendataset/traces_generator_test.go +++ b/internal/coreinternal/goldendataset/traces_generator_test.go @@ -13,5 +13,5 @@ func TestGenerateTraces(t *testing.T) { rscSpans, err := GenerateTraces("testdata/generated_pict_pairs_traces.txt", "testdata/generated_pict_pairs_spans.txt") assert.NoError(t, err) - assert.Equal(t, 32, len(rscSpans)) + assert.Len(t, rscSpans, 32) } diff --git a/internal/coreinternal/parseutils/parser.go b/internal/coreinternal/parseutils/parser.go index 2758161ec565..9c9df67d19c5 100644 --- a/internal/coreinternal/parseutils/parser.go +++ b/internal/coreinternal/parseutils/parser.go @@ -18,6 +18,7 @@ func SplitString(input, delimiter string) ([]string, error) { current := "" delimiterLength := len(delimiter) quoteChar := "" // "" means we are not in quotes + escaped := false for i := 0; i < len(input); i++ { if quoteChar == "" && i+delimiterLength <= len(input) && input[i:i+delimiterLength] == delimiter { // delimiter @@ -31,13 +32,19 @@ func SplitString(input, delimiter string) ([]string, error) { continue } - if quoteChar == "" && (input[i] == '"' || input[i] == '\'') { // start of quote - quoteChar = string(input[i]) - continue - } - if string(input[i]) == quoteChar { // end of quote - quoteChar = "" - continue + if !escaped { // consider quote termination so long as previous character wasn't backslash + if quoteChar == "" && (input[i] == '"' || input[i] == '\'') { // start of quote + quoteChar = string(input[i]) + continue + } + if string(input[i]) == quoteChar { // end of quote + quoteChar = "" + continue + } + // Only if we weren't escaped could the next character result in escaped state + escaped = input[i] == '\\' // potentially escaping next character + } else { + escaped = false } current += string(input[i]) diff --git a/internal/coreinternal/parseutils/parser_test.go b/internal/coreinternal/parseutils/parser_test.go index f4f8f4b14e5d..6dbcaf3022e0 100644 --- a/internal/coreinternal/parseutils/parser_test.go +++ b/internal/coreinternal/parseutils/parser_test.go @@ -85,6 +85,17 @@ func Test_SplitString(t *testing.T) { `c=this is a "co ol"`, }, }, + { + name: "embedded escaped quotes", + input: `ab c="this \"is \"" d='a \'co ol\' value' e="\""`, + delimiter: " ", + expected: []string{ + "ab", + `c=this \"is \"`, + `d=a \'co ol\' value`, + `e=\"`, + }, + }, { name: "quoted values include whitespace", input: `name=" ottl " func=" key_ value"`, @@ -259,6 +270,17 @@ func Test_ParseKeyValuePairs(t *testing.T) { "c": "d", }, }, + { + name: "escaped quotes", + pairs: []string{"key=foobar", `key2="foo bar"`, `key3="foo \"bar\""`, `key4='\'foo\' \'bar\''`}, + delimiter: "=", + expected: map[string]any{ + "key": "foobar", + "key2": `"foo bar"`, + "key3": `"foo \"bar\""`, + "key4": `'\'foo\' \'bar\''`, + }, + }, } for _, tc := range testCases { diff --git a/internal/coreinternal/parseutils/uri.go b/internal/coreinternal/parseutils/uri.go new file mode 100644 index 000000000000..cd154b9d36cc --- /dev/null +++ b/internal/coreinternal/parseutils/uri.go @@ -0,0 +1,164 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package parseutils // import "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/parseutils" + +import ( + "net/url" + "strconv" + "strings" + + semconv "go.opentelemetry.io/collector/semconv/v1.27.0" +) + +const ( + // replace once conventions includes these + AttributeURLUserInfo = "url.user_info" + AttributeURLUsername = "url.username" + AttributeURLPassword = "url.password" +) + +// parseURI takes an absolute or relative uri and returns the parsed values. +func ParseURI(value string, semconvCompliant bool) (map[string]any, error) { + m := make(map[string]any) + + if strings.HasPrefix(value, "?") { + // remove the query string '?' prefix before parsing + v, err := url.ParseQuery(value[1:]) + if err != nil { + return nil, err + } + return queryToMap(v, m), nil + } + + var x *url.URL + var err error + var mappingFn func(*url.URL, map[string]any) (map[string]any, error) + + if semconvCompliant { + mappingFn = urlToSemconvMap + x, err = url.Parse(value) + if err != nil { + return nil, err + } + } else { + x, err = url.ParseRequestURI(value) + if err != nil { + return nil, err + } + + mappingFn = urlToMap + } + return mappingFn(x, m) +} + +// urlToMap converts a url.URL to a map, excludes any values that are not set. +func urlToSemconvMap(parsedURI *url.URL, m map[string]any) (map[string]any, error) { + m[semconv.AttributeURLOriginal] = parsedURI.String() + m[semconv.AttributeURLDomain] = parsedURI.Hostname() + m[semconv.AttributeURLScheme] = parsedURI.Scheme + m[semconv.AttributeURLPath] = parsedURI.Path + + if portString := parsedURI.Port(); len(portString) > 0 { + port, err := strconv.Atoi(portString) + if err != nil { + return nil, err + } + m[semconv.AttributeURLPort] = port + } + + if fragment := parsedURI.Fragment; len(fragment) > 0 { + m[semconv.AttributeURLFragment] = fragment + } + + if parsedURI.User != nil { + m[AttributeURLUserInfo] = parsedURI.User.String() + + if username := parsedURI.User.Username(); len(username) > 0 { + m[AttributeURLUsername] = username + } + + if pwd, isSet := parsedURI.User.Password(); isSet { + m[AttributeURLPassword] = pwd + } + } + + if query := parsedURI.RawQuery; len(query) > 0 { + m[semconv.AttributeURLQuery] = query + } + + if periodIdx := strings.LastIndex(parsedURI.Path, "."); periodIdx != -1 { + if periodIdx < len(parsedURI.Path)-1 { + m[semconv.AttributeURLExtension] = parsedURI.Path[periodIdx+1:] + } + } + + return m, nil +} + +// urlToMap converts a url.URL to a map, excludes any values that are not set. +func urlToMap(p *url.URL, m map[string]any) (map[string]any, error) { + scheme := p.Scheme + if scheme != "" { + m["scheme"] = scheme + } + + user := p.User.Username() + if user != "" { + m["user"] = user + } + + host := p.Hostname() + if host != "" { + m["host"] = host + } + + port := p.Port() + if port != "" { + m["port"] = port + } + + path := p.EscapedPath() + if path != "" { + m["path"] = path + } + + return queryToMap(p.Query(), m), nil +} + +// queryToMap converts a query string url.Values to a map. +func queryToMap(query url.Values, m map[string]any) map[string]any { + // no-op if query is empty, do not create the key m["query"] + if len(query) == 0 { + return m + } + + /* 'parameter' will represent url.Values + map[string]any{ + "parameter-a": []any{ + "a", + "b", + }, + "parameter-b": []any{ + "x", + "y", + }, + } + */ + parameters := map[string]any{} + for param, values := range query { + parameters[param] = queryParamValuesToMap(values) + } + m["query"] = parameters + return m +} + +// queryParamValuesToMap takes query string parameter values and +// returns an []interface populated with the values +func queryParamValuesToMap(values []string) []any { + v := make([]any, len(values)) + for i, value := range values { + v[i] = value + } + return v +} diff --git a/internal/coreinternal/parseutils/uri_test.go b/internal/coreinternal/parseutils/uri_test.go new file mode 100644 index 000000000000..6fdb5612ce74 --- /dev/null +++ b/internal/coreinternal/parseutils/uri_test.go @@ -0,0 +1,629 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package parseutils + +import ( + "net/url" + "testing" + + "github.com/stretchr/testify/require" + semconv "go.opentelemetry.io/collector/semconv/v1.27.0" +) + +// Test all usecases: absolute uri, relative uri, query string +func TestParseURI(t *testing.T) { + cases := []struct { + name string + inputBody string + outputBody map[string]any + expectErr bool + }{ + { + "scheme-http", + "http://", + map[string]any{ + "scheme": "http", + }, + false, + }, + { + "scheme-user", + "http://myuser:mypass@", + map[string]any{ + "scheme": "http", + "user": "myuser", + }, + false, + }, + { + "scheme-host", + "http://golang.com", + map[string]any{ + "scheme": "http", + "host": "golang.com", + }, + false, + }, + { + "scheme-host-root", + "http://golang.com/", + map[string]any{ + "scheme": "http", + "host": "golang.com", + "path": "/", + }, + false, + }, + { + "scheme-host-minimal", + "http://golang", + map[string]any{ + "scheme": "http", + "host": "golang", + }, + false, + }, + { + "host-missing-scheme", + "golang.org", + map[string]any{}, + true, + }, + { + "sheme-port", + "http://:8080", + map[string]any{ + "scheme": "http", + "port": "8080", + }, + false, + }, + { + "port-missing-scheme", + ":8080", + map[string]any{}, + true, + }, + { + "path", + "/docs", + map[string]any{ + "path": "/docs", + }, + false, + }, + { + "path-advanced", + `/x/y%2Fz`, + map[string]any{ + "path": `/x/y%2Fz`, + }, + false, + }, + { + "path-root", + "/", + map[string]any{ + "path": "/", + }, + false, + }, + { + "path-query", + "/v1/app?user=golang", + map[string]any{ + "path": "/v1/app", + "query": map[string]any{ + "user": []any{ + "golang", + }, + }, + }, + false, + }, + { + "invalid-query", + "?q;go", + map[string]any{}, + true, + }, + { + "scheme-path", + "http:///v1/app", + map[string]any{ + "scheme": "http", + "path": "/v1/app", + }, + false, + }, + { + "scheme-host-query", + "https://app.com?token=0000&env=prod&env=stage", + map[string]any{ + "scheme": "https", + "host": "app.com", + "query": map[string]any{ + "token": []any{ + "0000", + }, + "env": []any{ + "prod", + "stage", + }, + }, + }, + false, + }, + { + "minimal", + "http://golang.org", + map[string]any{ + "scheme": "http", + "host": "golang.org", + }, + false, + }, + { + "advanced", + "https://go:password@golang.org:8443/v2/app?env=stage&token=456&index=105838&env=prod", + map[string]any{ + "scheme": "https", + "user": "go", + "host": "golang.org", + "port": "8443", + "path": "/v2/app", + "query": map[string]any{ + "token": []any{ + "456", + }, + "index": []any{ + "105838", + }, + "env": []any{ + "stage", + "prod", + }, + }, + }, + false, + }, + { + "magnet", + "magnet:?xt=urn:sha1:HNCKHTQCWBTRNJIV4WNAE52SJUQCZO6C", + map[string]any{ + "scheme": "magnet", + "query": map[string]any{ + "xt": []any{ + "urn:sha1:HNCKHTQCWBTRNJIV4WNAE52SJUQCZO6C", + }, + }, + }, + false, + }, + { + "sftp", + "sftp://ftp.com//home/name/employee.csv", + map[string]any{ + "scheme": "sftp", + "host": "ftp.com", + "path": "//home/name/employee.csv", + }, + false, + }, + { + "missing-schema", + "golang.org/app", + map[string]any{}, + true, + }, + { + "query-advanced", + "?token=0000&env=prod&env=stage&task=update&task=new&action=update", + map[string]any{ + "query": map[string]any{ + "token": []any{ + "0000", + }, + "env": []any{ + "prod", + "stage", + }, + "task": []any{ + "update", + "new", + }, + "action": []any{ + "update", + }, + }, + }, + false, + }, + { + "query", + "?token=0000", + map[string]any{ + "query": map[string]any{ + "token": []any{ + "0000", + }, + }, + }, + false, + }, + { + "query-empty", + "?", + map[string]any{}, + false, + }, + { + "query-empty-key", + "?user=", + map[string]any{ + "query": map[string]any{ + "user": []any{ + "", // no value + }, + }, + }, + false, + }, + // Query string without a ? prefix is treated as a URI, therefor + // an error will be returned by url.Parse("user=dev") + { + "query-no-?-prefix", + "user=dev", + map[string]any{}, + true, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + x, err := ParseURI(tc.inputBody, false) + if tc.expectErr { + require.Error(t, err) + return + } + require.NoError(t, err) + require.Equal(t, tc.outputBody, x) + }) + } +} + +func TestURLToMap(t *testing.T) { + cases := []struct { + name string + inputBody *url.URL + outputBody map[string]any + }{ + { + "absolute-uri", + &url.URL{ + Scheme: "https", + Host: "google.com:8443", + Path: "/app", + RawQuery: "stage=prod&stage=dev", + }, + map[string]any{ + "scheme": "https", + "host": "google.com", + "port": "8443", + "path": "/app", + "query": map[string]any{ + "stage": []any{ + "prod", + "dev", + }, + }, + }, + }, + { + "absolute-uri-simple", + &url.URL{ + Scheme: "http", + Host: "google.com", + }, + map[string]any{ + "scheme": "http", + "host": "google.com", + }, + }, + { + "path", + &url.URL{ + Path: "/app", + RawQuery: "stage=prod&stage=dev", + }, + map[string]any{ + "path": "/app", + "query": map[string]any{ + "stage": []any{ + "prod", + "dev", + }, + }, + }, + }, + { + "path-simple", + &url.URL{ + Path: "/app", + }, + map[string]any{ + "path": "/app", + }, + }, + { + "query", + &url.URL{ + RawQuery: "stage=prod&stage=dev", + }, + map[string]any{ + "query": map[string]any{ + "stage": []any{ + "prod", + "dev", + }, + }, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + m := make(map[string]any) + resMap, err := urlToMap(tc.inputBody, m) + require.NoError(t, err) + require.Equal(t, tc.outputBody, resMap) + }) + } +} + +func TestQueryToMap(t *testing.T) { + cases := []struct { + name string + inputBody url.Values + outputBody map[string]any + }{ + { + "query", + url.Values{ + "stage": []string{ + "prod", + "dev", + }, + }, + map[string]any{ + "query": map[string]any{ + "stage": []any{ + "prod", + "dev", + }, + }, + }, + }, + { + "empty", + url.Values{}, + map[string]any{}, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + m := make(map[string]any) + require.Equal(t, tc.outputBody, queryToMap(tc.inputBody, m)) + }) + } +} + +func TestQueryParamValuesToMap(t *testing.T) { + cases := []struct { + name string + inputBody []string + outputBody []any + }{ + { + "simple", + []string{ + "prod", + "dev", + }, + []any{ + "prod", + "dev", + }, + }, + { + "empty", + []string{}, + []any{}, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + require.Equal(t, tc.outputBody, queryParamValuesToMap(tc.inputBody)) + }) + } +} + +func BenchmarkURLToMap(b *testing.B) { + m := make(map[string]any) + v := "https://dev:password@www.golang.org:8443/v1/app/stage?token=d9e28b1d-2c7b-4853-be6a-d94f34a5d4ab&env=prod&env=stage&token=c6fa29f9-a31b-4584-b98d-aa8473b0e18d®ion=us-east1b&mode=fast" + u, err := url.ParseRequestURI(v) + require.NoError(b, err) + for n := 0; n < b.N; n++ { + _, _ = urlToMap(u, m) + } +} + +func BenchmarkQueryToMap(b *testing.B) { + m := make(map[string]any) + v := "?token=d9e28b1d-2c7b-4853-be6a-d94f34a5d4ab&env=prod&env=stage&token=c6fa29f9-a31b-4584-b98d-aa8473b0e18d®ion=us-east1b&mode=fast" + u, err := url.ParseQuery(v) + require.NoError(b, err) + for n := 0; n < b.N; n++ { + queryToMap(u, m) + } +} + +func BenchmarkQueryParamValuesToMap(b *testing.B) { + v := []string{ + "d9e28b1d-2c7b-4853-be6a-d94f34a5d4ab", + "c6fa29f9-a31b-4584-b98d-aa8473b0e18", + } + for n := 0; n < b.N; n++ { + queryParamValuesToMap(v) + } +} + +func TestParseSemconv(t *testing.T) { + testCases := []struct { + Name string + Original string + ExpectedMap map[string]any + }{ + { + "complete example", + "http://myusername:mypassword@www.example.com:80/foo.gif?key1=val1&key2=val2#fragment", + map[string]any{ + semconv.AttributeURLPath: "/foo.gif", + semconv.AttributeURLFragment: "fragment", + semconv.AttributeURLExtension: "gif", + AttributeURLPassword: "mypassword", + semconv.AttributeURLOriginal: "http://myusername:mypassword@www.example.com:80/foo.gif?key1=val1&key2=val2#fragment", + semconv.AttributeURLScheme: "http", + semconv.AttributeURLPort: 80, + AttributeURLUserInfo: "myusername:mypassword", + semconv.AttributeURLDomain: "www.example.com", + semconv.AttributeURLQuery: "key1=val1&key2=val2", + AttributeURLUsername: "myusername", + }, + }, + { + "simple example", + "http://www.example.com", + map[string]any{ + semconv.AttributeURLOriginal: "http://www.example.com", + semconv.AttributeURLScheme: "http", + semconv.AttributeURLDomain: "www.example.com", + semconv.AttributeURLPath: "", + }, + }, + { + "custom port", + "http://www.example.com:77", + map[string]any{ + semconv.AttributeURLOriginal: "http://www.example.com:77", + semconv.AttributeURLScheme: "http", + semconv.AttributeURLDomain: "www.example.com", + semconv.AttributeURLPath: "", + semconv.AttributeURLPort: 77, + }, + }, + { + "file", + "http://www.example.com:77/file.png", + map[string]any{ + semconv.AttributeURLOriginal: "http://www.example.com:77/file.png", + semconv.AttributeURLScheme: "http", + semconv.AttributeURLDomain: "www.example.com", + semconv.AttributeURLPath: "/file.png", + semconv.AttributeURLPort: 77, + semconv.AttributeURLExtension: "png", + }, + }, + { + "fragment", + "http://www.example.com:77/foo#bar", + map[string]any{ + semconv.AttributeURLOriginal: "http://www.example.com:77/foo#bar", + semconv.AttributeURLScheme: "http", + semconv.AttributeURLDomain: "www.example.com", + semconv.AttributeURLPath: "/foo", + semconv.AttributeURLPort: 77, + semconv.AttributeURLFragment: "bar", + }, + }, + { + "query example", + "https://www.example.com:77/foo?key=val", + map[string]any{ + semconv.AttributeURLOriginal: "https://www.example.com:77/foo?key=val", + semconv.AttributeURLScheme: "https", + semconv.AttributeURLDomain: "www.example.com", + semconv.AttributeURLPath: "/foo", + semconv.AttributeURLPort: 77, + semconv.AttributeURLQuery: "key=val", + }, + }, + { + "user info", + "https://user:pw@www.example.com:77/foo", + map[string]any{ + semconv.AttributeURLOriginal: "https://user:pw@www.example.com:77/foo", + semconv.AttributeURLScheme: "https", + semconv.AttributeURLDomain: "www.example.com", + semconv.AttributeURLPath: "/foo", + semconv.AttributeURLPort: 77, + AttributeURLUserInfo: "user:pw", + AttributeURLUsername: "user", + AttributeURLPassword: "pw", + }, + }, + { + "user info - no password", + "https://user:@www.example.com:77/foo", + map[string]any{ + semconv.AttributeURLOriginal: "https://user:@www.example.com:77/foo", + semconv.AttributeURLScheme: "https", + semconv.AttributeURLDomain: "www.example.com", + semconv.AttributeURLPath: "/foo", + semconv.AttributeURLPort: 77, + AttributeURLUserInfo: "user:", + AttributeURLUsername: "user", + AttributeURLPassword: "", + }, + }, + { + "non-http scheme: ftp", + "ftp://ftp.is.co.za/rfc/rfc1808.txt", + map[string]any{ + semconv.AttributeURLOriginal: "ftp://ftp.is.co.za/rfc/rfc1808.txt", + semconv.AttributeURLScheme: "ftp", + semconv.AttributeURLPath: "/rfc/rfc1808.txt", + semconv.AttributeURLExtension: "txt", + semconv.AttributeURLDomain: "ftp.is.co.za", + }, + }, + { + "non-http scheme: telnet", + "telnet://192.0.2.16:80/", + map[string]any{ + semconv.AttributeURLOriginal: "telnet://192.0.2.16:80/", + semconv.AttributeURLScheme: "telnet", + semconv.AttributeURLPath: "/", + semconv.AttributeURLPort: 80, + semconv.AttributeURLDomain: "192.0.2.16", + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.Name, func(t *testing.T) { + resMap, err := ParseURI(tc.Original, true) + require.NoError(t, err) + + require.Equal(t, len(tc.ExpectedMap), len(resMap)) + for k, v := range tc.ExpectedMap { + actualValue, found := resMap[k] + require.True(t, found, "key not found %q", k) + require.Equal(t, v, actualValue) + } + }) + } +} diff --git a/internal/coreinternal/scraperinttest/scraperint.go b/internal/coreinternal/scraperinttest/scraperint.go index b211e3c78098..3d650a2c284d 100644 --- a/internal/coreinternal/scraperinttest/scraperint.go +++ b/internal/coreinternal/scraperinttest/scraperint.go @@ -16,6 +16,7 @@ import ( "unicode" "github.com/docker/go-connections/nat" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/testcontainers/testcontainers-go" "go.opentelemetry.io/collector/component" @@ -70,11 +71,11 @@ func (it *IntegrationTest) Run(t *testing.T) { cfg := it.factory.CreateDefaultConfig() it.customConfig(t, cfg, ci) sink := new(consumertest.MetricsSink) - settings := receivertest.NewNopCreateSettings() + settings := receivertest.NewNopSettings() observedZapCore, observedLogs := observer.New(zap.WarnLevel) settings.Logger = zap.New(observedZapCore) - rcvr, err := it.factory.CreateMetricsReceiver(context.Background(), settings, cfg, sink) + rcvr, err := it.factory.CreateMetrics(context.Background(), settings, cfg, sink) require.NoError(t, err, "failed creating metrics receiver") require.NoError(t, rcvr.Start(context.Background(), componenttest.NewNopHost())) defer func() { @@ -142,7 +143,7 @@ func (it *IntegrationTest) createContainers(t *testing.T) *ContainerInfo { for _, cr := range it.containerRequests { go func(req testcontainers.ContainerRequest) { var errs error - require.Eventuallyf(t, func() bool { + assert.Eventuallyf(t, func() bool { c, err := testcontainers.GenericContainer( context.Background(), testcontainers.GenericContainerRequest{ @@ -269,7 +270,7 @@ func (ci *ContainerInfo) MappedPortForNamedContainer(t *testing.T, containerName } func (ci *ContainerInfo) container(t *testing.T, name string) testcontainers.Container { - require.NotZero(t, len(ci.containers), "no containers in use") + require.NotEmpty(t, ci.containers, "no containers in use") c, ok := ci.containers[name] require.True(t, ok, "container with name %q not found", name) return c diff --git a/internal/coreinternal/testdata/profile.go b/internal/coreinternal/testdata/profile.go new file mode 100644 index 000000000000..fc2a1eb4a6b7 --- /dev/null +++ b/internal/coreinternal/testdata/profile.go @@ -0,0 +1,67 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package testdata + +import ( + "time" + + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/pprofile" +) + +var ( + TestProfileStartTime = time.Date(2020, 2, 11, 20, 26, 13, 789, time.UTC) + TestProfileStartTimestamp = pcommon.NewTimestampFromTime(TestProfileStartTime) +) + +func GenerateProfilesOneEmptyResourceProfiles() pprofile.Profiles { + pd := pprofile.NewProfiles() + pd.ResourceProfiles().AppendEmpty() + return pd +} + +func GenerateProfilesNoProfiles() pprofile.Profiles { + pd := GenerateProfilesOneEmptyResourceProfiles() + initResource1(pd.ResourceProfiles().At(0).Resource()) + return pd +} + +func GenerateProfilesOneEmptyProfile() pprofile.Profiles { + pd := GenerateProfilesNoProfiles() + rs0 := pd.ResourceProfiles().At(0) + rs0.ScopeProfiles().AppendEmpty().Profiles().AppendEmpty() + return pd +} + +func GenerateProfilesOneProfile() pprofile.Profiles { + pd := GenerateProfilesOneEmptyProfile() + fillProfileOne(pd.ResourceProfiles().At(0).ScopeProfiles().At(0).Profiles().At(0)) + return pd +} + +func GenerateProfilesTwoProfilesSameResource() pprofile.Profiles { + pd := GenerateProfilesOneEmptyProfile() + profiles := pd.ResourceProfiles().At(0).ScopeProfiles().At(0).Profiles() + fillProfileOne(profiles.At(0)) + fillProfileTwo(profiles.AppendEmpty()) + return pd +} + +func fillProfileOne(profile pprofile.Profile) { + profile.SetStartTime(TestProfileStartTimestamp) + profile.SetProfileID([16]byte{0x01, 0x02, 0x03, 0x04}) + + attrs := profile.Attributes() + attrs.PutStr("app", "server") + attrs.PutInt("instance_num", 1) +} + +func fillProfileTwo(profile pprofile.Profile) { + profile.SetStartTime(TestProfileStartTimestamp) + profile.SetProfileID([16]byte{0x05, 0x06, 0x07, 0x08}) + + attrs := profile.Attributes() + attrs.PutStr("customer", "acme") + attrs.PutStr("env", "dev") +} diff --git a/internal/coreinternal/textutils/encoding.go b/internal/coreinternal/textutils/encoding.go index 209c2cbc7754..512b6a6f7da4 100644 --- a/internal/coreinternal/textutils/encoding.go +++ b/internal/coreinternal/textutils/encoding.go @@ -74,7 +74,7 @@ var encodingOverrides = map[string]encoding.Encoding{ } func lookupEncoding(enc string) (encoding.Encoding, error) { - if e, ok := encodingOverrides[strings.ToLower(enc)]; ok { + if e, ok := EncodingOverridesMap.Get(strings.ToLower(enc)); ok { return e, nil } e, err := ianaindex.IANA.Encoding(enc) @@ -94,3 +94,12 @@ func IsNop(enc string) bool { } return e == encoding.Nop } + +var EncodingOverridesMap = encodingOverridesMap{} + +type encodingOverridesMap struct{} + +func (e *encodingOverridesMap) Get(key string) (encoding.Encoding, bool) { + v, ok := encodingOverrides[key] + return v, ok +} diff --git a/internal/coreinternal/timeutils/internal/ctimefmt/ctimefmt.go b/internal/coreinternal/timeutils/internal/ctimefmt/ctimefmt.go index 52170879a57b..adb0c5dded54 100644 --- a/internal/coreinternal/timeutils/internal/ctimefmt/ctimefmt.go +++ b/internal/coreinternal/timeutils/internal/ctimefmt/ctimefmt.go @@ -16,8 +16,11 @@ import ( "time" ) -var ctimeRegexp = regexp.MustCompile(`%.`) -var decimalsRegexp = regexp.MustCompile(`\d`) +var ( + ctimeRegexp = regexp.MustCompile(`%.`) + invalidFractionalSecondsStrptime = regexp.MustCompile(`[^.,]%[Lfs]`) + decimalsRegexp = regexp.MustCompile(`\d`) +) var ctimeSubstitutes = map[string]string{ "%Y": "2006", @@ -121,10 +124,6 @@ func Parse(format, value string) (time.Time, error) { // ToNative converts ctime-like format string to Go native layout // (which is used by time.Time.Format() and time.Parse() functions). func ToNative(format string) (string, error) { - if match := decimalsRegexp.FindString(format); match != "" { - return "", errors.New("format string should not contain decimals") - } - var errs []error replaceFunc := func(directive string) string { if subst, ok := ctimeSubstitutes[directive]; ok { @@ -141,3 +140,26 @@ func ToNative(format string) (string, error) { return replaced, nil } + +func Validate(format string) error { + if match := decimalsRegexp.FindString(format); match != "" { + return errors.New("format string should not contain decimals") + } + + if match := invalidFractionalSecondsStrptime.FindString(format); match != "" { + return fmt.Errorf("invalid fractional seconds directive: '%s'. must be preceded with '.' or ','", match) + } + + directives := ctimeRegexp.FindAllString(format, -1) + + var errs []error + for _, directive := range directives { + if _, ok := ctimeSubstitutes[directive]; !ok { + errs = append(errs, errors.New("unsupported ctimefmt.ToNative() directive: "+directive)) + } + } + if len(errs) != 0 { + return fmt.Errorf("invalid strptime format: %v", errs) + } + return nil +} diff --git a/internal/coreinternal/timeutils/internal/ctimefmt/ctimefmt_test.go b/internal/coreinternal/timeutils/internal/ctimefmt/ctimefmt_test.go index 182b1dd4a9e1..8b0829aa8bf5 100644 --- a/internal/coreinternal/timeutils/internal/ctimefmt/ctimefmt_test.go +++ b/internal/coreinternal/timeutils/internal/ctimefmt/ctimefmt_test.go @@ -12,47 +12,38 @@ package ctimefmt import ( "testing" "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) -var format1 = "%Y-%m-%d %H:%M:%S.%f" -var format2 = "%Y-%m-%d %l:%M:%S.%L %P, %a" -var value1 = "2019-01-02 15:04:05.666666" -var value2 = "2019-01-02 3:04:05.666 pm, Wed" -var dt1 = time.Date(2019, 1, 2, 15, 4, 5, 666666000, time.UTC) -var dt2 = time.Date(2019, 1, 2, 15, 4, 5, 666000000, time.UTC) +var ( + format1 = "%Y-%m-%d %H:%M:%S.%f" + format2 = "%Y-%m-%d %l:%M:%S.%L %P, %a" + value1 = "2019-01-02 15:04:05.666666" + value2 = "2019-01-02 3:04:05.666 pm, Wed" + dt1 = time.Date(2019, 1, 2, 15, 4, 5, 666666000, time.UTC) + dt2 = time.Date(2019, 1, 2, 15, 4, 5, 666000000, time.UTC) +) func TestFormat(t *testing.T) { s, err := Format(format1, dt1) - if err != nil { - t.Fatal(err) - } - if s != value1 { - t.Errorf("Given: %v, expected: %v", s, value1) - } + require.NoError(t, err) + assert.Equal(t, s, value1, "Given: %v, expected: %v", s, value1) s, err = Format(format2, dt1) - if err != nil { - t.Fatal(err) - } - if s != value2 { - t.Errorf("Given: %v, expected: %v", s, value2) - } + require.NoError(t, err) + assert.Equal(t, s, value2, "Given: %v, expected: %v", s, value2) } func TestParse(t *testing.T) { dt, err := Parse(format1, value1) - if err != nil { - t.Error(err) - } else if dt != dt1 { - t.Errorf("Given: %v, expected: %v", dt, dt1) - } + require.NoError(t, err) + assert.Equal(t, dt, dt1, "Given: %v, expected: %v", dt, dt1) dt, err = Parse(format2, value2) - if err != nil { - t.Error(err) - } else if dt != dt2 { - t.Errorf("Given: %v, expected: %v", dt, dt2) - } + require.NoError(t, err) + assert.Equal(t, dt, dt2, "Given: %v, expected: %v", dt, dt2) } func TestZulu(t *testing.T) { @@ -65,13 +56,61 @@ func TestZulu(t *testing.T) { } { t.Run(input, func(t *testing.T) { dt, err := Parse(format, input) - if err != nil { - t.Error(err) - } else if dt.UnixNano() != dt1.UnixNano() { - // We compare the unix nanoseconds because Go has a subtle parsing difference between "Z" and "+0000". - // The former returns a Time with the UTC timezone, the latter returns a Time with a 0000 time zone offset. - // (See Go's documentation for `time.Parse`.) - t.Errorf("Given: %v, expected: %v", dt, dt1) + require.NoError(t, err) + // We compare the unix nanoseconds because Go has a subtle parsing difference between "Z" and "+0000". + // The former returns a Time with the UTC timezone, the latter returns a Time with a 0000 time zone offset. + // (See Go's documentation for `time.Parse`.) + assert.Equal(t, dt.UnixNano(), dt1.UnixNano(), "Given: %v, expected: %v", dt, dt1) + }) + } +} + +func TestValidate(t *testing.T) { + type args struct { + layout string + } + tests := []struct { + name string + args args + wantErr string + }{ + { + name: "valid format", + args: args{ + layout: "%Y-%m-%d %H:%M:%S.%f", + }, + wantErr: "", + }, + { + name: "invalid fractional second", + args: args{ + layout: "%Y-%m-%d-%H-%M-%S:%L", + }, + wantErr: "invalid fractional seconds directive: ':%L'. must be preceded with '.' or ','", + }, + { + name: "format including decimal", + args: args{ + layout: "2006-%m-%d-%H-%M-%S:%L", + }, + wantErr: "format string should not contain decimals", + }, + { + name: "unsupported directive", + args: args{ + layout: "%C-%m-%d-%H-%M-%S.%L", + }, + wantErr: "invalid strptime format: [unsupported ctimefmt.ToNative() directive: %C]", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := Validate(tt.args.layout) + + if tt.wantErr != "" { + require.ErrorContains(t, err, tt.wantErr) + } else { + require.NoError(t, err) } }) } diff --git a/internal/coreinternal/timeutils/parser.go b/internal/coreinternal/timeutils/parser.go index 8af480096f2d..82c5523292e1 100644 --- a/internal/coreinternal/timeutils/parser.go +++ b/internal/coreinternal/timeutils/parser.go @@ -4,13 +4,19 @@ package timeutils // import "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/timeutils" import ( + "errors" "fmt" + "regexp" "strings" "time" + "github.com/elastic/lunes" + strptime "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/timeutils/internal/ctimefmt" ) +var invalidFractionalSecondsGoTime = regexp.MustCompile(`[^.,9]9+`) + func StrptimeToGotime(layout string) (string, error) { return strptime.ToNative(layout) } @@ -23,6 +29,17 @@ func ParseStrptime(layout string, value any, location *time.Location) (time.Time return ParseGotime(goLayout, value, location) } +// ParseLocalizedStrptime is like ParseLocalizedGotime, but instead of using the native Go time layout, +// it uses the ctime-like format. +func ParseLocalizedStrptime(layout string, value any, location *time.Location, language string) (time.Time, error) { + goLayout, err := strptime.ToNative(layout) + if err != nil { + return time.Time{}, err + } + + return ParseLocalizedGotime(goLayout, value, location, language) +} + func GetLocation(location *string, layout *string) (*time.Location, error) { if location != nil && *location != "" { // If location is specified, it must be in the local timezone database @@ -41,6 +58,24 @@ func GetLocation(location *string, layout *string) (*time.Location, error) { return time.Local, nil } +// ParseLocalizedGotime is like ParseGotime, but instead of parsing a formatted time in +// English, it parses a value in foreign language, and returns the [time.Time] it represents. +// The language argument must be a well-formed BCP 47 language tag (e.g.: "en", "en-US"), and +// a known CLDR locale. +func ParseLocalizedGotime(layout string, value any, location *time.Location, language string) (time.Time, error) { + stringValue, err := convertParsingValue(value) + if err != nil { + return time.Time{}, err + } + + translatedVal, err := lunes.Translate(layout, stringValue, language) + if err != nil { + return time.Time{}, err + } + + return ParseGotime(layout, translatedVal, location) +} + func ParseGotime(layout string, value any, location *time.Location) (time.Time, error) { timeValue, err := parseGotime(layout, value, location) if err != nil { @@ -50,14 +85,9 @@ func ParseGotime(layout string, value any, location *time.Location) (time.Time, } func parseGotime(layout string, value any, location *time.Location) (time.Time, error) { - var str string - switch v := value.(type) { - case string: - str = v - case []byte: - str = string(v) - default: - return time.Time{}, fmt.Errorf("type %T cannot be parsed as a time", value) + str, err := convertParsingValue(value) + if err != nil { + return time.Time{}, err } result, err := time.ParseInLocation(layout, str, location) @@ -86,6 +116,20 @@ func parseGotime(layout string, value any, location *time.Location) (time.Time, return resultLoc, locErr } +func convertParsingValue(value any) (string, error) { + var str string + switch v := value.(type) { + case string: + str = v + case []byte: + str = string(v) + default: + return "", fmt.Errorf("type %T cannot be parsed as a time", value) + } + + return str, nil +} + // SetTimestampYear sets the year of a timestamp to the current year. // This is needed because year is missing from some time formats, such as rfc3164. func SetTimestampYear(t time.Time) time.Time { @@ -104,5 +148,35 @@ func SetTimestampYear(t time.Time) time.Time { return d } +// ValidateStrptime checks the given strptime layout and returns an error if it detects any known issues +// that prevent it from being parsed. +func ValidateStrptime(layout string) error { + return strptime.Validate(layout) +} + +func ValidateGotime(layout string) error { + if match := invalidFractionalSecondsGoTime.FindString(layout); match != "" { + return fmt.Errorf("invalid fractional seconds directive: '%s'. must be preceded with '.' or ','", match) + } + + return nil +} + +// ValidateLocale checks the given locale and returns an error if the language tag +// is not supported by the localized parser functions. +func ValidateLocale(locale string) error { + _, err := lunes.NewDefaultLocale(locale) + if err == nil { + return nil + } + + var e *lunes.ErrUnsupportedLocale + if errors.As(err, &e) { + return fmt.Errorf("unsupported locale '%s', value must be a supported BCP 47 language tag", locale) + } + + return fmt.Errorf("invalid locale '%s': %w", locale, err) +} + // Allows tests to override with deterministic value var Now = time.Now diff --git a/internal/coreinternal/timeutils/parser_test.go b/internal/coreinternal/timeutils/parser_test.go index 7427a2e34d65..256154c30332 100644 --- a/internal/coreinternal/timeutils/parser_test.go +++ b/internal/coreinternal/timeutils/parser_test.go @@ -7,52 +7,52 @@ import ( "testing" "time" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestParseGoTimeBadLocation(t *testing.T) { _, err := ParseGotime(time.RFC822, "02 Jan 06 15:04 BST", time.UTC) - require.Error(t, err) - require.Contains(t, err.Error(), "failed to load location BST") + require.ErrorContains(t, err, "failed to load location BST") } func Test_setTimestampYear(t *testing.T) { t.Run("Normal", func(t *testing.T) { Now = func() time.Time { - return time.Date(2020, 06, 16, 3, 31, 34, 525, time.UTC) + return time.Date(2020, 0o6, 16, 3, 31, 34, 525, time.UTC) } - noYear := time.Date(0, 06, 16, 3, 31, 34, 525, time.UTC) + noYear := time.Date(0, 0o6, 16, 3, 31, 34, 525, time.UTC) yearAdded := SetTimestampYear(noYear) - expected := time.Date(2020, 06, 16, 3, 31, 34, 525, time.UTC) + expected := time.Date(2020, 0o6, 16, 3, 31, 34, 525, time.UTC) require.Equal(t, expected, yearAdded) }) t.Run("FutureOneDay", func(t *testing.T) { Now = func() time.Time { - return time.Date(2020, 01, 16, 3, 31, 34, 525, time.UTC) + return time.Date(2020, 0o1, 16, 3, 31, 34, 525, time.UTC) } - noYear := time.Date(0, 01, 17, 3, 31, 34, 525, time.UTC) + noYear := time.Date(0, 0o1, 17, 3, 31, 34, 525, time.UTC) yearAdded := SetTimestampYear(noYear) - expected := time.Date(2020, 01, 17, 3, 31, 34, 525, time.UTC) + expected := time.Date(2020, 0o1, 17, 3, 31, 34, 525, time.UTC) require.Equal(t, expected, yearAdded) }) t.Run("FutureEightDays", func(t *testing.T) { Now = func() time.Time { - return time.Date(2020, 01, 16, 3, 31, 34, 525, time.UTC) + return time.Date(2020, 0o1, 16, 3, 31, 34, 525, time.UTC) } - noYear := time.Date(0, 01, 24, 3, 31, 34, 525, time.UTC) + noYear := time.Date(0, 0o1, 24, 3, 31, 34, 525, time.UTC) yearAdded := SetTimestampYear(noYear) - expected := time.Date(2019, 01, 24, 3, 31, 34, 525, time.UTC) + expected := time.Date(2019, 0o1, 24, 3, 31, 34, 525, time.UTC) require.Equal(t, expected, yearAdded) }) t.Run("RolloverYear", func(t *testing.T) { Now = func() time.Time { - return time.Date(2020, 01, 01, 3, 31, 34, 525, time.UTC) + return time.Date(2020, 0o1, 0o1, 3, 31, 34, 525, time.UTC) } noYear := time.Date(0, 12, 31, 3, 31, 34, 525, time.UTC) @@ -61,3 +61,176 @@ func Test_setTimestampYear(t *testing.T) { require.Equal(t, expected, yearAdded) }) } + +func TestValidateGotime(t *testing.T) { + type args struct { + layout string + } + tests := []struct { + name string + args args + wantErr string + }{ + { + name: "valid format", + args: args{ + layout: "2006-01-02 15:04:05.999999", + }, + wantErr: "", + }, + { + name: "valid format 2", + args: args{ + layout: "2006-01-02 15:04:05,999999", + }, + wantErr: "", + }, + { + name: "invalid fractional second", + args: args{ + layout: "2006-01-02 15:04:05:999999", + }, + wantErr: "invalid fractional seconds directive: ':999999'. must be preceded with '.' or ','", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := ValidateGotime(tt.args.layout) + + if tt.wantErr != "" { + require.ErrorContains(t, err, tt.wantErr) + } else { + require.NoError(t, err) + } + }) + } +} + +func TestParseLocalizedStrptime(t *testing.T) { + tests := []struct { + name string + format string + value any + language string + expected time.Time + location *time.Location + }{ + { + name: "Foreign language", + format: "%B %d %A, %Y, %r", + value: "Febrero 25 jueves, 1993, 02:03:04 p.m.", + expected: time.Date(1993, 2, 25, 14, 3, 4, 0, time.Local), + location: time.Local, + language: "es-ES", + }, + { + name: "Foreign language with location", + format: "%A %h %e %Y", + value: "mercoledì set 4 2024", + expected: time.Date(2024, 9, 4, 0, 0, 0, 0, time.UTC), + location: time.UTC, + language: "it-IT", + }, + { + name: "String value", + format: "%B %d %A, %Y, %I:%M:%S %p", + value: "March 12 Friday, 2004, 02:03:04 AM", + expected: time.Date(2004, 3, 12, 2, 3, 4, 0, time.Local), + location: time.Local, + language: "en", + }, + { + name: "Bytes value", + format: "%h %d %a, %y, %I:%M:%S %p", + value: []byte("Jun 10 Fri, 04, 02:03:04 AM"), + expected: time.Date(2004, 6, 10, 2, 3, 4, 0, time.Local), + location: time.Local, + language: "en-US", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := ParseLocalizedStrptime(tt.format, tt.value, tt.location, tt.language) + require.NoError(t, err) + assert.Equal(t, tt.expected.UnixNano(), result.UnixNano()) + }) + } +} + +func TestParseLocalizedStrptimeInvalidType(t *testing.T) { + value := time.Now().UnixNano() + _, err := ParseLocalizedStrptime("%c", value, time.Local, "en") + require.Error(t, err) + require.ErrorContains(t, err, "cannot be parsed as a time") +} + +func TestParseLocalizedGotime(t *testing.T) { + tests := []struct { + name string + format string + value any + language string + expected time.Time + location *time.Location + }{ + { + name: "Foreign language", + format: "January 02 Monday, 2006, 03:04:05 pm", + value: "Febrero 25 jueves, 1993, 02:03:04 p.m.", + expected: time.Date(1993, 2, 25, 14, 3, 4, 0, time.Local), + location: time.Local, + language: "es-ES", + }, + { + name: "Foreign language with location", + format: "Monday Jan _2 2006", + value: "mercoledì set 4 2024", + expected: time.Date(2024, 9, 4, 0, 0, 0, 0, time.UTC), + location: time.UTC, + language: "it-IT", + }, + { + name: "String value", + format: "January 02 Monday, 2006, 03:04:05 PM", + value: "March 12 Friday, 2004, 02:03:04 AM", + expected: time.Date(2004, 3, 12, 2, 3, 4, 0, time.Local), + location: time.Local, + language: "en", + }, + { + name: "Bytes value", + format: "Jan 02 Mon, 06, 03:04:05 PM", + value: []byte("Jun 10 Fri, 04, 02:03:04 AM"), + expected: time.Date(2004, 6, 10, 2, 3, 4, 0, time.Local), + location: time.Local, + language: "en-US", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := ParseLocalizedGotime(tt.format, tt.value, tt.location, tt.language) + require.NoError(t, err) + assert.Equal(t, tt.expected.UnixNano(), result.UnixNano()) + }) + } +} + +func TestParseLocalizedGotimeInvalidType(t *testing.T) { + value := time.Now().UnixNano() + _, err := ParseLocalizedStrptime("Mon", value, time.Local, "en") + require.Error(t, err) + require.ErrorContains(t, err, "cannot be parsed as a time") +} + +func TestValidateLocale(t *testing.T) { + require.NoError(t, ValidateLocale("es")) + require.NoError(t, ValidateLocale("en-US")) + require.NoError(t, ValidateLocale("ca-ES-valencia")) +} + +func TestValidateLocaleUnsupported(t *testing.T) { + err := ValidateLocale("foo-bar") + require.ErrorContains(t, err, "unsupported locale 'foo-bar'") +} diff --git a/internal/docker/config.go b/internal/docker/config.go index 460fb217786c..8a775ee3e1cc 100644 --- a/internal/docker/config.go +++ b/internal/docker/config.go @@ -11,10 +11,13 @@ import ( "time" "github.com/docker/docker/api/types/versions" + "github.com/docker/docker/client" + "go.opentelemetry.io/collector/confmap" ) type Config struct { // The URL of the docker server. Default is "unix:///var/run/docker.sock" + // on non-Windows and "npipe:////./pipe/docker_engine" on Windows Endpoint string `mapstructure:"endpoint"` // The maximum amount of time to wait for docker API responses. Default is 5s @@ -27,23 +30,46 @@ type Config struct { DockerAPIVersion string `mapstructure:"api_version"` } +func (config *Config) Unmarshal(conf *confmap.Conf) error { + // WithIgonreUnused needed because this configuration is embedded inside other configurations + err := conf.Unmarshal(config, confmap.WithIgnoreUnused()) + if err != nil { + if floatAPIVersion, ok := conf.Get("api_version").(float64); ok { + return fmt.Errorf( + "%w.\n\nHint: You may want to wrap the 'api_version' value in quotes (api_version: \"%1.2f\")", + err, + floatAPIVersion, + ) + } + return err + } + return nil +} + +func (config Config) Validate() error { + if config.Endpoint == "" { + return errors.New("endpoint must be specified") + } + return nil +} + // NewConfig creates a new config to be used when creating // a docker client -func NewConfig(endpoint string, timeout time.Duration, excludedImages []string, apiVersion string) (*Config, error) { +func NewConfig(endpoint string, timeout time.Duration, excludedImages []string, apiVersion string) *Config { cfg := &Config{ Endpoint: endpoint, Timeout: timeout, ExcludedImages: excludedImages, DockerAPIVersion: apiVersion, } - return cfg, cfg.validate() + return cfg } // NewDefaultConfig creates a new config with default values // to be used when creating a docker client func NewDefaultConfig() *Config { cfg := &Config{ - Endpoint: "unix:///var/run/docker.sock", + Endpoint: client.DefaultDockerHost, Timeout: 5 * time.Second, DockerAPIVersion: minimumRequiredDockerAPIVersion, } @@ -51,18 +77,6 @@ func NewDefaultConfig() *Config { return cfg } -// validate asserts that an endpoint field is set -// on the config struct -func (config Config) validate() error { - if config.Endpoint == "" { - return errors.New("config.Endpoint must be specified") - } - if err := VersionIsValidAndGTE(config.DockerAPIVersion, minimumRequiredDockerAPIVersion); err != nil { - return err - } - return nil -} - type apiVersion struct { major int minor int diff --git a/internal/docker/docker.go b/internal/docker/docker.go index 0df0aeed5671..27eff88ef263 100644 --- a/internal/docker/docker.go +++ b/internal/docker/docker.go @@ -14,8 +14,8 @@ import ( "time" dtypes "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/container" - devents "github.com/docker/docker/api/types/events" + ctypes "github.com/docker/docker/api/types/container" + etypes "github.com/docker/docker/api/types/events" dfilters "github.com/docker/docker/api/types/filters" docker "github.com/docker/docker/client" "go.uber.org/zap" @@ -35,7 +35,7 @@ type Container struct { // Client provides the core metric gathering functionality from the Docker Daemon. // It retrieves container information in two forms to produce metric data: dtypes.ContainerJSON // from client.ContainerInspect() for container information (id, name, hostname, labels, and env) -// and dtypes.StatsJSON from client.ContainerStats() for metric values. +// and ctypes.StatsResponse from client.ContainerStats() for metric values. type Client struct { client *docker.Client config *Config @@ -99,7 +99,7 @@ func (dc *Client) LoadContainerList(ctx context.Context) error { // Build initial container maps before starting loop filters := dfilters.NewArgs() filters.Add("status", "running") - options := container.ListOptions{ + options := ctypes.ListOptions{ Filters: filters, } @@ -135,7 +135,7 @@ func (dc *Client) LoadContainerList(ctx context.Context) error { func (dc *Client) FetchContainerStatsAsJSON( ctx context.Context, container Container, -) (*dtypes.StatsJSON, error) { +) (*ctypes.StatsResponse, error) { containerStats, err := dc.FetchContainerStats(ctx, container) if err != nil { return nil, err @@ -154,7 +154,7 @@ func (dc *Client) FetchContainerStatsAsJSON( func (dc *Client) FetchContainerStats( ctx context.Context, container Container, -) (dtypes.ContainerStats, error) { +) (ctypes.StatsResponseReader, error) { dc.logger.Debug("Fetching container stats.", zap.String("id", container.ID)) statsCtx, cancel := context.WithTimeout(ctx, dc.config.Timeout) containerStats, err := dc.client.ContainerStats(statsCtx, container.ID, false) @@ -179,10 +179,10 @@ func (dc *Client) FetchContainerStats( } func (dc *Client) toStatsJSON( - containerStats dtypes.ContainerStats, + containerStats ctypes.StatsResponseReader, container *Container, -) (*dtypes.StatsJSON, error) { - var statsJSON dtypes.StatsJSON +) (*ctypes.StatsResponse, error) { + var statsJSON ctypes.StatsResponse err := json.NewDecoder(containerStats.Body).Decode(&statsJSON) containerStats.Body.Close() if err != nil { @@ -204,7 +204,7 @@ func (dc *Client) toStatsJSON( // Events exposes the underlying Docker clients Events channel. // Caller should close the events channel by canceling the context. // If an error occurs, processing stops and caller must reinvoke this method. -func (dc *Client) Events(ctx context.Context, options dtypes.EventsOptions) (<-chan devents.Message, <-chan error) { +func (dc *Client) Events(ctx context.Context, options etypes.ListOptions) (<-chan etypes.Message, <-chan error) { return dc.client.Events(ctx, options) } @@ -224,7 +224,7 @@ func (dc *Client) ContainerEventLoop(ctx context.Context) { EVENT_LOOP: for { - options := dtypes.EventsOptions{ + options := etypes.ListOptions{ Filters: filters, Since: lastTime.Format(time.RFC3339Nano), } diff --git a/internal/docker/docker_test.go b/internal/docker/docker_test.go index 5bb749220f68..19cddeeed000 100644 --- a/internal/docker/docker_test.go +++ b/internal/docker/docker_test.go @@ -1,26 +1,22 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -//go:build !windows - -// TODO review if tests should succeed on Windows - package docker import ( "context" "fmt" "io" - "net" "net/http" "net/http/httptest" - "os" + "runtime" "strings" "sync" "testing" "time" dtypes "github.com/docker/docker/api/types" + ctypes "github.com/docker/docker/api/types/container" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.uber.org/zap" @@ -47,34 +43,14 @@ func TestInvalidExclude(t *testing.T) { assert.Equal(t, "could not determine docker client excluded images: invalid glob item: unexpected end of input", err.Error()) } -func tmpSock(t *testing.T) (net.Listener, string) { - f, err := os.CreateTemp(os.TempDir(), "testsock") - if err != nil { - t.Fatal(err) - } - addr := f.Name() - assert.NoError(t, os.Remove(addr)) - - listener, err := net.Listen("unix", addr) - if err != nil { - t.Fatal(err) - } - - return listener, addr -} - func TestWatchingTimeouts(t *testing.T) { - listener, addr := tmpSock(t) + listener, addr := testListener(t) defer func() { assert.NoError(t, listener.Close()) }() - defer func() { - assert.NoError(t, os.Remove(addr)) - }() - config := &Config{ - Endpoint: fmt.Sprintf("unix://%s", addr), + Endpoint: portableEndpoint(addr), Timeout: 50 * time.Millisecond, } @@ -87,8 +63,7 @@ func TestWatchingTimeouts(t *testing.T) { shouldHaveTaken := time.Now().Add(100 * time.Millisecond).UnixNano() err = cli.LoadContainerList(context.Background()) - require.Error(t, err) - assert.Contains(t, err.Error(), expectedError) + assert.ErrorContains(t, err, expectedError) observed, logs := observer.New(zapcore.WarnLevel) cli, err = NewDockerClient(config, zap.New(observed)) assert.NotNil(t, cli) @@ -97,7 +72,7 @@ func TestWatchingTimeouts(t *testing.T) { cnt, ofInterest := cli.inspectedContainerIsOfInterest(context.Background(), "SomeContainerId") assert.False(t, ofInterest) assert.Nil(t, cnt) - assert.Equal(t, 1, len(logs.All())) + assert.Len(t, logs.All(), 1) for _, l := range logs.All() { assert.Contains(t, l.ContextMap()["error"], expectedError) } @@ -109,17 +84,14 @@ func TestWatchingTimeouts(t *testing.T) { } func TestFetchingTimeouts(t *testing.T) { - listener, addr := tmpSock(t) + listener, addr := testListener(t) defer func() { assert.NoError(t, listener.Close()) }() - defer func() { - assert.NoError(t, os.Remove(addr)) - }() config := &Config{ - Endpoint: fmt.Sprintf("unix://%s", addr), + Endpoint: portableEndpoint(addr), Timeout: 50 * time.Millisecond, } @@ -148,11 +120,10 @@ func TestFetchingTimeouts(t *testing.T) { ) assert.Nil(t, statsJSON) - require.Error(t, err) - assert.Contains(t, err.Error(), expectedError) + assert.ErrorContains(t, err, expectedError) - assert.Equal(t, 1, len(logs.All())) + assert.Len(t, logs.All(), 1) for _, l := range logs.All() { assert.Contains(t, l.ContextMap()["error"], expectedError) } @@ -161,21 +132,16 @@ func TestFetchingTimeouts(t *testing.T) { t, time.Now().UnixNano(), shouldHaveTaken, "Client timeouts don't appear to have been exercised.", ) - } func TestToStatsJSONErrorHandling(t *testing.T) { - listener, addr := tmpSock(t) + listener, addr := testListener(t) defer func() { assert.NoError(t, listener.Close()) }() - defer func() { - assert.NoError(t, os.Remove(addr)) - }() - config := &Config{ - Endpoint: fmt.Sprintf("unix://%s", addr), + Endpoint: portableEndpoint(addr), Timeout: 50 * time.Millisecond, } @@ -192,7 +158,7 @@ func TestToStatsJSONErrorHandling(t *testing.T) { } statsJSON, err := cli.toStatsJSON( - dtypes.ContainerStats{ + ctypes.StatsResponseReader{ Body: io.NopCloser(strings.NewReader("")), }, dc, ) @@ -200,7 +166,7 @@ func TestToStatsJSONErrorHandling(t *testing.T) { assert.Equal(t, io.EOF, err) statsJSON, err = cli.toStatsJSON( - dtypes.ContainerStats{ + ctypes.StatsResponseReader{ Body: io.NopCloser(strings.NewReader("{\"Networks\": 123}")), }, dc, ) @@ -216,7 +182,7 @@ func TestEventLoopHandlesError(t *testing.T) { wg.Done() } _, err := w.Write([]byte{}) - require.NoError(t, err) + assert.NoError(t, err) })) defer srv.Close() @@ -254,3 +220,11 @@ func TestEventLoopHandlesError(t *testing.T) { return } } + +func portableEndpoint(addr string) string { + endpoint := fmt.Sprintf("unix://%s", addr) + if runtime.GOOS == "windows" { + endpoint = fmt.Sprintf("npipe://%s", strings.ReplaceAll(addr, "\\", "/")) + } + return endpoint +} diff --git a/internal/docker/docker_test_listener.go b/internal/docker/docker_test_listener.go new file mode 100644 index 000000000000..d54feb731b49 --- /dev/null +++ b/internal/docker/docker_test_listener.go @@ -0,0 +1,25 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 +//go:build !windows + +package docker // import "github.com/open-telemetry/opentelemetry-collector-contrib/internal/docker" + +import ( + "net" + "os" + "testing" + + "github.com/stretchr/testify/require" +) + +func testListener(t *testing.T) (net.Listener, string) { + f, err := os.CreateTemp(os.TempDir(), "testListener") + require.NoError(t, err) + addr := f.Name() + require.NoError(t, os.Remove(addr)) + + listener, err := net.Listen("unix", addr) + require.NoError(t, err) + + return listener, addr +} diff --git a/internal/docker/docker_test_listener_windows.go b/internal/docker/docker_test_listener_windows.go new file mode 100644 index 000000000000..03c2728848f6 --- /dev/null +++ b/internal/docker/docker_test_listener_windows.go @@ -0,0 +1,22 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 +//go:build windows + +package docker // import "github.com/open-telemetry/opentelemetry-collector-contrib/internal/docker" + +import ( + "net" + "testing" + + "github.com/Microsoft/go-winio" + "github.com/stretchr/testify/require" +) + +func testListener(t *testing.T) (net.Listener, string) { + addr := "\\\\.\\pipe\\testListener-otel-collector-contrib" + + l, err := winio.ListenPipe(addr, nil) + require.NoError(t, err) + require.NotNil(t, l) + return l, addr +} diff --git a/internal/docker/go.mod b/internal/docker/go.mod index f42749fa88fe..f39b04908ac3 100644 --- a/internal/docker/go.mod +++ b/internal/docker/go.mod @@ -1,17 +1,18 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/internal/docker -go 1.21.0 +go 1.22.0 require ( - github.com/docker/docker v25.0.5+incompatible + github.com/Microsoft/go-winio v0.6.2 + github.com/docker/docker v27.4.0+incompatible github.com/gobwas/glob v0.2.3 - github.com/stretchr/testify v1.9.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/confmap v1.22.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) require ( - github.com/Microsoft/go-winio v0.4.17 // indirect github.com/containerd/log v0.1.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/distribution/reference v0.5.0 // indirect @@ -20,8 +21,14 @@ require ( github.com/felixge/httpsnoop v1.0.4 // indirect github.com/go-logr/logr v1.4.1 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/kr/pretty v0.2.1 // indirect + github.com/knadh/koanf/maps v0.1.1 // indirect + github.com/knadh/koanf/providers/confmap v0.1.0 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect github.com/morikuni/aec v1.0.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect @@ -38,7 +45,6 @@ require ( golang.org/x/net v0.23.0 // indirect golang.org/x/sys v0.18.0 // indirect golang.org/x/time v0.4.0 // indirect - gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools/v3 v3.0.3 // indirect ) diff --git a/internal/docker/go.sum b/internal/docker/go.sum index 97ff63efbf32..3f18b58c5ff6 100644 --- a/internal/docker/go.sum +++ b/internal/docker/go.sum @@ -1,7 +1,7 @@ github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Microsoft/go-winio v0.4.17 h1:iT12IBVClFevaf8PuVyi3UmZOVh4OqnaLxDTW2O6j3w= -github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= @@ -11,8 +11,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= -github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v27.4.0+incompatible h1:I9z7sQ5qyzO0BfAb9IMOawRkAGxhYsidKiTMcm0DU+A= +github.com/docker/docker v27.4.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= @@ -24,6 +24,8 @@ github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -38,12 +40,22 @@ github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= +github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= +github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= +github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= @@ -57,15 +69,17 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= @@ -105,9 +119,7 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= @@ -135,8 +147,8 @@ google.golang.org/grpc v1.61.1/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFL google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= diff --git a/internal/docker/matcher.go b/internal/docker/matcher.go index c0c14911a337..e54e9c75773f 100644 --- a/internal/docker/matcher.go +++ b/internal/docker/matcher.go @@ -56,7 +56,6 @@ func newStringMatcher(items []string) (*stringMatcher, error) { // by definition this must lead and end with '/' chars reText := item[1 : len(item)-1] re, err = regexp.Compile(reText) - if err != nil { return nil, fmt.Errorf("invalid regex item: %w", err) } diff --git a/internal/docker/metadata.yaml b/internal/docker/metadata.yaml index 5407e2033345..94758b0b5e11 100644 --- a/internal/docker/metadata.yaml +++ b/internal/docker/metadata.yaml @@ -1,3 +1,4 @@ status: codeowners: - active: [rmfitzpatrick, jamesmoessis] \ No newline at end of file + active: [jamesmoessis, MovieStoreGuy] + emeritus: [rmfitzpatrick] \ No newline at end of file diff --git a/internal/exp/metrics/go.mod b/internal/exp/metrics/go.mod index c2cacbe7f5b4..179aecdcfd17 100644 --- a/internal/exp/metrics/go.mod +++ b/internal/exp/metrics/go.mod @@ -1,14 +1,14 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/semconv v0.102.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/semconv v0.116.0 ) require ( @@ -20,12 +20,12 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/internal/exp/metrics/go.sum b/internal/exp/metrics/go.sum index ecec1f7a0169..bed93e4d2788 100644 --- a/internal/exp/metrics/go.sum +++ b/internal/exp/metrics/go.sum @@ -5,6 +5,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -27,14 +29,14 @@ github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjR github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -48,20 +50,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -70,12 +72,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/internal/exp/metrics/metrics_test.go b/internal/exp/metrics/metrics_test.go index df49b71aae60..de6645068fc3 100644 --- a/internal/exp/metrics/metrics_test.go +++ b/internal/exp/metrics/metrics_test.go @@ -11,7 +11,7 @@ import ( "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" - conventions "go.opentelemetry.io/collector/semconv/v1.9.0" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden" diff --git a/internal/exp/metrics/staleness/priority_queue_test.go b/internal/exp/metrics/staleness/priority_queue_test.go index b58478e7c1db..4e8253709e6d 100644 --- a/internal/exp/metrics/staleness/priority_queue_test.go +++ b/internal/exp/metrics/staleness/priority_queue_test.go @@ -79,7 +79,7 @@ func TestPriorityQueueImpl(t *testing.T) { // And the inner lookup map should also be empty require.IsType(t, &heapPriorityQueue{}, pq) heapQueue := pq.(*heapPriorityQueue) - require.Len(t, heapQueue.itemLookup, 0) + require.Empty(t, heapQueue.itemLookup) } func generateStreamID(t *testing.T, attributes map[string]any) identity.Stream { diff --git a/internal/exp/metrics/staleness/staleness.go b/internal/exp/metrics/staleness/staleness.go index dae1870cbfd6..eb52e6861825 100644 --- a/internal/exp/metrics/staleness/staleness.go +++ b/internal/exp/metrics/staleness/staleness.go @@ -102,3 +102,33 @@ func (s *Staleness[T]) Evict() (identity.Stream, bool) { func (s *Staleness[T]) Clear() { s.items.Clear() } + +type Tracker struct { + pq PriorityQueue +} + +func NewTracker() Tracker { + return Tracker{pq: NewPriorityQueue()} +} + +func (stale Tracker) Refresh(ts time.Time, ids ...identity.Stream) { + for _, id := range ids { + stale.pq.Update(id, ts) + } +} + +func (stale Tracker) Collect(max time.Duration) []identity.Stream { + now := NowFunc() + + var ids []identity.Stream + for stale.pq.Len() > 0 { + _, ts := stale.pq.Peek() + if now.Sub(ts) < max { + break + } + id, _ := stale.pq.Pop() + ids = append(ids, id) + } + + return ids +} diff --git a/internal/filter/filterexpr/matcher_test.go b/internal/filter/filterexpr/matcher_test.go index 6bfbe22e0ae3..ca26ec7e81b1 100644 --- a/internal/filter/filterexpr/matcher_test.go +++ b/internal/filter/filterexpr/matcher_test.go @@ -111,7 +111,6 @@ func testMetricNameMatch(t *testing.T, dataType pmetric.MetricType) { matched, err = matcher.MatchMetric(m) assert.NoError(t, err) assert.True(t, matched) - } func TestMatchIntGaugeDataPointByMetricAndSecondPointLabelValue(t *testing.T) { diff --git a/internal/filter/filterlog/filterlog.go b/internal/filter/filterlog/filterlog.go index b394397c193f..41d324d86db8 100644 --- a/internal/filter/filterlog/filterlog.go +++ b/internal/filter/filterlog/filterlog.go @@ -28,7 +28,6 @@ var useOTTLBridge = featuregate.GlobalRegistry().MustRegister( // The logic determining if a log should be processed is based on include and exclude settings. // Include properties are checked before exclude settings are checked. func NewSkipExpr(mp *filterconfig.MatchConfig) (expr.BoolExpr[ottllog.TransformContext], error) { - if useOTTLBridge.IsEnabled() { return filterottl.NewLogSkipExprBridge(mp) } diff --git a/internal/filter/filterlog/filterlog_test.go b/internal/filter/filterlog/filterlog_test.go index 7e315e49450a..ebfd5e483d3c 100644 --- a/internal/filter/filterlog/filterlog_test.go +++ b/internal/filter/filterlog/filterlog_test.go @@ -12,7 +12,7 @@ import ( "go.opentelemetry.io/collector/featuregate" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter/filterconfig" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter/filterottl" @@ -151,11 +151,11 @@ func TestLogRecord_Matching_False(t *testing.T) { assert.NoError(t, err) require.NotNil(t, expr) - val, err := expr.Eval(context.Background(), ottllog.NewTransformContext(lr, pcommon.NewInstrumentationScope(), pcommon.NewResource())) + val, err := expr.Eval(context.Background(), ottllog.NewTransformContext(lr, pcommon.NewInstrumentationScope(), pcommon.NewResource(), plog.NewScopeLogs(), plog.NewResourceLogs())) require.NoError(t, err) assert.False(t, val) - val, err = expr.Eval(context.Background(), ottllog.NewTransformContext(lrm, pcommon.NewInstrumentationScope(), pcommon.NewResource())) + val, err = expr.Eval(context.Background(), ottllog.NewTransformContext(lrm, pcommon.NewInstrumentationScope(), pcommon.NewResource(), plog.NewScopeLogs(), plog.NewResourceLogs())) require.NoError(t, err) assert.False(t, val) }) @@ -228,12 +228,12 @@ func TestLogRecord_Matching_True(t *testing.T) { require.NotNil(t, expr) assert.NotNil(t, lr) - val, err := expr.Eval(context.Background(), ottllog.NewTransformContext(lr, pcommon.NewInstrumentationScope(), pcommon.NewResource())) + val, err := expr.Eval(context.Background(), ottllog.NewTransformContext(lr, pcommon.NewInstrumentationScope(), pcommon.NewResource(), plog.NewScopeLogs(), plog.NewResourceLogs())) require.NoError(t, err) assert.True(t, val) assert.NotNil(t, lrm) - val, err = expr.Eval(context.Background(), ottllog.NewTransformContext(lrm, pcommon.NewInstrumentationScope(), pcommon.NewResource())) + val, err = expr.Eval(context.Background(), ottllog.NewTransformContext(lrm, pcommon.NewInstrumentationScope(), pcommon.NewResource(), plog.NewScopeLogs(), plog.NewResourceLogs())) require.NoError(t, err) assert.True(t, val) }) @@ -1304,7 +1304,7 @@ func Test_NewSkipExpr_With_Bridge(t *testing.T) { scope := pcommon.NewInstrumentationScope() - tCtx := ottllog.NewTransformContext(log, scope, resource) + tCtx := ottllog.NewTransformContext(log, scope, resource, plog.NewScopeLogs(), plog.NewResourceLogs()) boolExpr, err := NewSkipExpr(tt.condition) require.NoError(t, err) @@ -1378,7 +1378,7 @@ func BenchmarkFilterlog_NewSkipExpr(b *testing.B) { scope := pcommon.NewInstrumentationScope() - tCtx := ottllog.NewTransformContext(log, scope, resource) + tCtx := ottllog.NewTransformContext(log, scope, resource, plog.NewScopeLogs(), plog.NewResourceLogs()) b.Run(tt.name, func(b *testing.B) { for i := 0; i < b.N; i++ { diff --git a/internal/filter/filtermatcher/attributematcher.go b/internal/filter/filtermatcher/attributematcher.go index a4261a0676cd..0a1d2c6d18c3 100644 --- a/internal/filter/filtermatcher/attributematcher.go +++ b/internal/filter/filtermatcher/attributematcher.go @@ -37,7 +37,6 @@ func NewAttributesMatcher(config filterset.Config, attributes []filterconfig.Att // Convert attribute values from mp representation to in-memory representation. var rawAttributes []AttributeMatcher for _, attribute := range attributes { - if attribute.Key == "" { return nil, errors.New("can't have empty key in the list of attributes") } @@ -73,7 +72,6 @@ func NewAttributesMatcher(config filterset.Config, attributes []filterconfig.Att } default: return nil, filterset.NewUnrecognizedMatchTypeError(config.MatchType) - } } diff --git a/internal/filter/filtermatcher/filtermatcher_test.go b/internal/filter/filtermatcher/filtermatcher_test.go index 0592fccc4ba8..26a556c3814a 100644 --- a/internal/filter/filtermatcher/filtermatcher_test.go +++ b/internal/filter/filtermatcher/filtermatcher_test.go @@ -9,7 +9,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/pdata/pcommon" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter/filterconfig" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter/filterset" diff --git a/internal/filter/filtermetric/filtermetric_test.go b/internal/filter/filtermetric/filtermetric_test.go index ea63fa7eb7f7..c5935b97d651 100644 --- a/internal/filter/filtermetric/filtermetric_test.go +++ b/internal/filter/filtermetric/filtermetric_test.go @@ -83,7 +83,7 @@ func TestMatcherMatches(t *testing.T) { assert.NotNil(t, matcher) assert.NoError(t, err) - matches, err := matcher.Eval(context.Background(), ottlmetric.NewTransformContext(test.metric, pmetric.NewMetricSlice(), pcommon.NewInstrumentationScope(), pcommon.NewResource())) + matches, err := matcher.Eval(context.Background(), ottlmetric.NewTransformContext(test.metric, pmetric.NewMetricSlice(), pcommon.NewInstrumentationScope(), pcommon.NewResource(), pmetric.NewScopeMetrics(), pmetric.NewResourceMetrics())) assert.NoError(t, err) assert.Equal(t, test.shouldMatch, matches) }) @@ -188,7 +188,7 @@ func Test_NewSkipExpr_With_Bridge(t *testing.T) { scope := pcommon.NewInstrumentationScope() - tCtx := ottlmetric.NewTransformContext(metric, pmetric.NewMetricSlice(), scope, resource) + tCtx := ottlmetric.NewTransformContext(metric, pmetric.NewMetricSlice(), scope, resource, pmetric.NewScopeMetrics(), pmetric.NewResourceMetrics()) boolExpr, err := NewSkipExpr(tt.include, tt.exclude) require.NoError(t, err) diff --git a/internal/filter/filterottl/filter.go b/internal/filter/filterottl/filter.go index e4dad6ee9359..705b2acf5a4e 100644 --- a/internal/filter/filterottl/filter.go +++ b/internal/filter/filterottl/filter.go @@ -6,7 +6,6 @@ package filterottl // import "github.com/open-telemetry/opentelemetry-collector- import ( "go.opentelemetry.io/collector/component" - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter/expr" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottldatapoint" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottllog" @@ -20,7 +19,7 @@ import ( // NewBoolExprForSpan creates a BoolExpr[ottlspan.TransformContext] that will return true if any of the given OTTL conditions evaluate to true. // The passed in functions should use the ottlspan.TransformContext. // If a function named `match` is not present in the function map it will be added automatically so that parsing works as expected -func NewBoolExprForSpan(conditions []string, functions map[string]ottl.Factory[ottlspan.TransformContext], errorMode ottl.ErrorMode, set component.TelemetrySettings) (expr.BoolExpr[ottlspan.TransformContext], error) { +func NewBoolExprForSpan(conditions []string, functions map[string]ottl.Factory[ottlspan.TransformContext], errorMode ottl.ErrorMode, set component.TelemetrySettings) (*ottl.ConditionSequence[ottlspan.TransformContext], error) { parser, err := ottlspan.NewParser(functions, set) if err != nil { return nil, err @@ -36,7 +35,7 @@ func NewBoolExprForSpan(conditions []string, functions map[string]ottl.Factory[o // NewBoolExprForSpanEvent creates a BoolExpr[ottlspanevent.TransformContext] that will return true if any of the given OTTL conditions evaluate to true. // The passed in functions should use the ottlspanevent.TransformContext. // If a function named `match` is not present in the function map it will be added automatically so that parsing works as expected -func NewBoolExprForSpanEvent(conditions []string, functions map[string]ottl.Factory[ottlspanevent.TransformContext], errorMode ottl.ErrorMode, set component.TelemetrySettings) (expr.BoolExpr[ottlspanevent.TransformContext], error) { +func NewBoolExprForSpanEvent(conditions []string, functions map[string]ottl.Factory[ottlspanevent.TransformContext], errorMode ottl.ErrorMode, set component.TelemetrySettings) (*ottl.ConditionSequence[ottlspanevent.TransformContext], error) { parser, err := ottlspanevent.NewParser(functions, set) if err != nil { return nil, err @@ -52,7 +51,7 @@ func NewBoolExprForSpanEvent(conditions []string, functions map[string]ottl.Fact // NewBoolExprForMetric creates a BoolExpr[ottlmetric.TransformContext] that will return true if any of the given OTTL conditions evaluate to true. // The passed in functions should use the ottlmetric.TransformContext. // If a function named `match` is not present in the function map it will be added automatically so that parsing works as expected -func NewBoolExprForMetric(conditions []string, functions map[string]ottl.Factory[ottlmetric.TransformContext], errorMode ottl.ErrorMode, set component.TelemetrySettings) (expr.BoolExpr[ottlmetric.TransformContext], error) { +func NewBoolExprForMetric(conditions []string, functions map[string]ottl.Factory[ottlmetric.TransformContext], errorMode ottl.ErrorMode, set component.TelemetrySettings) (*ottl.ConditionSequence[ottlmetric.TransformContext], error) { parser, err := ottlmetric.NewParser(functions, set) if err != nil { return nil, err @@ -68,7 +67,7 @@ func NewBoolExprForMetric(conditions []string, functions map[string]ottl.Factory // NewBoolExprForDataPoint creates a BoolExpr[ottldatapoint.TransformContext] that will return true if any of the given OTTL conditions evaluate to true. // The passed in functions should use the ottldatapoint.TransformContext. // If a function named `match` is not present in the function map it will be added automatically so that parsing works as expected -func NewBoolExprForDataPoint(conditions []string, functions map[string]ottl.Factory[ottldatapoint.TransformContext], errorMode ottl.ErrorMode, set component.TelemetrySettings) (expr.BoolExpr[ottldatapoint.TransformContext], error) { +func NewBoolExprForDataPoint(conditions []string, functions map[string]ottl.Factory[ottldatapoint.TransformContext], errorMode ottl.ErrorMode, set component.TelemetrySettings) (*ottl.ConditionSequence[ottldatapoint.TransformContext], error) { parser, err := ottldatapoint.NewParser(functions, set) if err != nil { return nil, err @@ -84,7 +83,7 @@ func NewBoolExprForDataPoint(conditions []string, functions map[string]ottl.Fact // NewBoolExprForLog creates a BoolExpr[ottllog.TransformContext] that will return true if any of the given OTTL conditions evaluate to true. // The passed in functions should use the ottllog.TransformContext. // If a function named `match` is not present in the function map it will be added automatically so that parsing works as expected -func NewBoolExprForLog(conditions []string, functions map[string]ottl.Factory[ottllog.TransformContext], errorMode ottl.ErrorMode, set component.TelemetrySettings) (expr.BoolExpr[ottllog.TransformContext], error) { +func NewBoolExprForLog(conditions []string, functions map[string]ottl.Factory[ottllog.TransformContext], errorMode ottl.ErrorMode, set component.TelemetrySettings) (*ottl.ConditionSequence[ottllog.TransformContext], error) { parser, err := ottllog.NewParser(functions, set) if err != nil { return nil, err @@ -100,7 +99,7 @@ func NewBoolExprForLog(conditions []string, functions map[string]ottl.Factory[ot // NewBoolExprForResource creates a BoolExpr[ottlresource.TransformContext] that will return true if any of the given OTTL conditions evaluate to true. // The passed in functions should use the ottlresource.TransformContext. // If a function named `match` is not present in the function map it will be added automatically so that parsing works as expected -func NewBoolExprForResource(conditions []string, functions map[string]ottl.Factory[ottlresource.TransformContext], errorMode ottl.ErrorMode, set component.TelemetrySettings) (expr.BoolExpr[ottlresource.TransformContext], error) { +func NewBoolExprForResource(conditions []string, functions map[string]ottl.Factory[ottlresource.TransformContext], errorMode ottl.ErrorMode, set component.TelemetrySettings) (*ottl.ConditionSequence[ottlresource.TransformContext], error) { parser, err := ottlresource.NewParser(functions, set) if err != nil { return nil, err @@ -116,7 +115,7 @@ func NewBoolExprForResource(conditions []string, functions map[string]ottl.Facto // NewBoolExprForScope creates a BoolExpr[ottlscope.TransformContext] that will return true if any of the given OTTL conditions evaluate to true. // The passed in functions should use the ottlresource.TransformContext. // If a function named `match` is not present in the function map it will be added automatically so that parsing works as expected -func NewBoolExprForScope(conditions []string, functions map[string]ottl.Factory[ottlscope.TransformContext], errorMode ottl.ErrorMode, set component.TelemetrySettings) (expr.BoolExpr[ottlscope.TransformContext], error) { +func NewBoolExprForScope(conditions []string, functions map[string]ottl.Factory[ottlscope.TransformContext], errorMode ottl.ErrorMode, set component.TelemetrySettings) (*ottl.ConditionSequence[ottlscope.TransformContext], error) { parser, err := ottlscope.NewParser(functions, set) if err != nil { return nil, err diff --git a/internal/filter/filterottl/functions.go b/internal/filter/filterottl/functions.go index c3ce56ce4abf..3612d184966f 100644 --- a/internal/filter/filterottl/functions.go +++ b/internal/filter/filterottl/functions.go @@ -21,7 +21,10 @@ import ( ) func StandardSpanFuncs() map[string]ottl.Factory[ottlspan.TransformContext] { - return ottlfuncs.StandardConverters[ottlspan.TransformContext]() + m := ottlfuncs.StandardConverters[ottlspan.TransformContext]() + isRootSpanFactory := ottlfuncs.NewIsRootSpanFactory() + m[isRootSpanFactory.Name()] = isRootSpanFactory + return m } func StandardSpanEventFuncs() map[string]ottl.Factory[ottlspanevent.TransformContext] { diff --git a/internal/filter/filterottl/functions_test.go b/internal/filter/filterottl/functions_test.go index 2e1755361d27..abb327073cea 100644 --- a/internal/filter/filterottl/functions_test.go +++ b/internal/filter/filterottl/functions_test.go @@ -126,7 +126,7 @@ func Test_HasAttrKeyOnDatapoint(t *testing.T) { t.Run(tt.name, func(t *testing.T) { exprFunc, err := hasAttributeKeyOnDatapoint(tt.key) assert.NoError(t, err) - result, err := exprFunc(context.Background(), ottlmetric.NewTransformContext(tt.input(), pmetric.NewMetricSlice(), pcommon.NewInstrumentationScope(), pcommon.NewResource())) + result, err := exprFunc(context.Background(), ottlmetric.NewTransformContext(tt.input(), pmetric.NewMetricSlice(), pcommon.NewInstrumentationScope(), pcommon.NewResource(), pmetric.NewScopeMetrics(), pmetric.NewResourceMetrics())) assert.NoError(t, err) assert.Equal(t, tt.expected, result) }) @@ -351,7 +351,7 @@ func Test_HasAttrOnDatapoint(t *testing.T) { t.Run(tt.name, func(t *testing.T) { exprFunc, err := hasAttributeOnDatapoint(tt.key, tt.expectedVal) assert.NoError(t, err) - result, err := exprFunc(context.Background(), ottlmetric.NewTransformContext(tt.input(), pmetric.NewMetricSlice(), pcommon.NewInstrumentationScope(), pcommon.NewResource())) + result, err := exprFunc(context.Background(), ottlmetric.NewTransformContext(tt.input(), pmetric.NewMetricSlice(), pcommon.NewInstrumentationScope(), pcommon.NewResource(), pmetric.NewScopeMetrics(), pmetric.NewResourceMetrics())) assert.NoError(t, err) assert.Equal(t, tt.expected, result) }) diff --git a/internal/filter/filterset/config.go b/internal/filter/filterset/config.go index 7a60b641651e..f6c6c757d549 100644 --- a/internal/filter/filterset/config.go +++ b/internal/filter/filterset/config.go @@ -22,9 +22,7 @@ const ( MatchTypeFieldName = "match_type" ) -var ( - validMatchTypes = []MatchType{Regexp, Strict} -) +var validMatchTypes = []MatchType{Regexp, Strict} // Config configures the matching behavior of a FilterSet. type Config struct { diff --git a/internal/filter/filterset/regexp/regexpfilterset_test.go b/internal/filter/filterset/regexp/regexpfilterset_test.go index cfb616430662..b6e87d15fde7 100644 --- a/internal/filter/filterset/regexp/regexpfilterset_test.go +++ b/internal/filter/filterset/regexp/regexpfilterset_test.go @@ -10,18 +10,16 @@ import ( "github.com/stretchr/testify/require" ) -var ( - validRegexpFilters = []string{ - "prefix/.*", - "prefix_.*", - ".*/suffix", - ".*_suffix", - ".*/contains/.*", - ".*_contains_.*", - "full/name/match", - "full_name_match", - } -) +var validRegexpFilters = []string{ + "prefix/.*", + "prefix_.*", + ".*/suffix", + ".*_suffix", + ".*/contains/.*", + ".*_contains_.*", + "full/name/match", + "full_name_match", +} func TestNewRegexpFilterSet(t *testing.T) { tests := []struct { @@ -109,7 +107,7 @@ func TestRegexpDeDup(t *testing.T) { require.NoError(t, err) assert.NotNil(t, fs) assert.Nil(t, fs.cache) - assert.EqualValues(t, 1, len(fs.regexes)) + assert.Len(t, fs.regexes, 1) } func TestRegexpMatchesCaches(t *testing.T) { diff --git a/internal/filter/filterset/strict/strictfilterset_test.go b/internal/filter/filterset/strict/strictfilterset_test.go index 63317917c534..9947b58971fa 100644 --- a/internal/filter/filterset/strict/strictfilterset_test.go +++ b/internal/filter/filterset/strict/strictfilterset_test.go @@ -9,13 +9,11 @@ import ( "github.com/stretchr/testify/assert" ) -var ( - validStrictFilters = []string{ - "exact_string_match", - ".*/suffix", - "(a|b)", - } -) +var validStrictFilters = []string{ + "exact_string_match", + ".*/suffix", + "(a|b)", +} func TestNewStrictFilterSet(t *testing.T) { tests := []struct { diff --git a/internal/filter/filterspan/filterspan.go b/internal/filter/filterspan/filterspan.go index 2ee4358991fe..734b8a01b756 100644 --- a/internal/filter/filterspan/filterspan.go +++ b/internal/filter/filterspan/filterspan.go @@ -9,7 +9,7 @@ import ( "go.opentelemetry.io/collector/featuregate" "go.opentelemetry.io/collector/pdata/pcommon" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/traceutil" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter/expr" diff --git a/internal/filter/filterspan/filterspan_test.go b/internal/filter/filterspan/filterspan_test.go index ff04a1d997c3..b06171543c1a 100644 --- a/internal/filter/filterspan/filterspan_test.go +++ b/internal/filter/filterspan/filterspan_test.go @@ -12,7 +12,7 @@ import ( "go.opentelemetry.io/collector/featuregate" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/testdata" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/traceutil" @@ -179,7 +179,7 @@ func TestSpan_Matching_False(t *testing.T) { require.NoError(t, err) assert.NotNil(t, expr) - val, err := expr.Eval(context.Background(), ottlspan.NewTransformContext(span, library, resource)) + val, err := expr.Eval(context.Background(), ottlspan.NewTransformContext(span, library, resource, ptrace.NewScopeSpans(), ptrace.NewResourceSpans())) require.NoError(t, err) assert.False(t, val) }) @@ -197,7 +197,7 @@ func TestSpan_MissingServiceName(t *testing.T) { assert.NotNil(t, mp) emptySpan := ptrace.NewSpan() - val, err := mp.Eval(context.Background(), ottlspan.NewTransformContext(emptySpan, pcommon.NewInstrumentationScope(), pcommon.NewResource())) + val, err := mp.Eval(context.Background(), ottlspan.NewTransformContext(emptySpan, pcommon.NewInstrumentationScope(), pcommon.NewResource(), ptrace.NewScopeSpans(), ptrace.NewResourceSpans())) require.NoError(t, err) assert.False(t, val) } @@ -288,7 +288,7 @@ func TestSpan_Matching_True(t *testing.T) { require.NoError(t, err) assert.NotNil(t, mp) - val, err := mp.Eval(context.Background(), ottlspan.NewTransformContext(span, library, resource)) + val, err := mp.Eval(context.Background(), ottlspan.NewTransformContext(span, library, resource, ptrace.NewScopeSpans(), ptrace.NewResourceSpans())) require.NoError(t, err) assert.True(t, val) }) @@ -298,13 +298,12 @@ func TestSpan_Matching_True(t *testing.T) { func TestServiceNameForResource(t *testing.T) { td := testdata.GenerateTracesOneSpanNoResource() name := serviceNameForResource(td.ResourceSpans().At(0).Resource()) - require.Equal(t, name, "") + require.Equal(t, "", name) td = testdata.GenerateTracesOneSpan() resource := td.ResourceSpans().At(0).Resource() name = serviceNameForResource(resource) - require.Equal(t, name, "") - + require.Equal(t, "", name) } func Test_NewSkipExpr_With_Bridge(t *testing.T) { @@ -1211,7 +1210,7 @@ func Test_NewSkipExpr_With_Bridge(t *testing.T) { scope.SetName("scope") scope.SetVersion("0.1.0") - tCtx := ottlspan.NewTransformContext(span, scope, resource) + tCtx := ottlspan.NewTransformContext(span, scope, resource, ptrace.NewScopeSpans(), ptrace.NewResourceSpans()) boolExpr, err := NewSkipExpr(tt.condition) require.NoError(t, err) @@ -1279,7 +1278,7 @@ func BenchmarkFilterspan_NewSkipExpr(b *testing.B) { scope := pcommon.NewInstrumentationScope() - tCtx := ottlspan.NewTransformContext(span, scope, resource) + tCtx := ottlspan.NewTransformContext(span, scope, resource, ptrace.NewScopeSpans(), ptrace.NewResourceSpans()) b.Run(tt.name, func(b *testing.B) { for i := 0; i < b.N; i++ { diff --git a/internal/filter/go.mod b/internal/filter/go.mod index 83273d20b397..d4780fb80056 100644 --- a/internal/filter/go.mod +++ b/internal/filter/go.mod @@ -1,64 +1,70 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter -go 1.21.0 +go 1.22.0 require ( github.com/expr-lang/expr v1.16.9 github.com/hashicorp/golang-lru/v2 v2.0.7 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/featuregate v1.9.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/semconv v0.102.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/featuregate v1.22.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/semconv v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) require ( github.com/alecthomas/participle/v2 v2.1.1 // indirect - github.com/beorn7/perks v1.0.1 // indirect + github.com/antchfx/xmlquery v1.4.2 // indirect + github.com/antchfx/xpath v1.3.2 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/elastic/go-grok v0.3.1 // indirect + github.com/elastic/lunes v0.1.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gobwas/glob v0.2.3 // indirect + github.com/goccy/go-json v0.10.4 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect + github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/iancoleman/strcase v0.3.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect + github.com/magefile/mage v1.15.0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/metric v1.27.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - go.opentelemetry.io/otel/trace v1.27.0 // indirect + github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/internal/filter/go.sum b/internal/filter/go.sum index 65e349414474..f2e0d7d5d94c 100644 --- a/internal/filter/go.sum +++ b/internal/filter/go.sum @@ -4,26 +4,38 @@ github.com/alecthomas/participle/v2 v2.1.1 h1:hrjKESvSqGHzRb4yW1ciisFJ4p3MGYih6i github.com/alecthomas/participle/v2 v2.1.1/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= -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/antchfx/xmlquery v1.4.2 h1:MZKd9+wblwxfQ1zd1AdrTsqVaMjMCwow3IqkCSe00KA= +github.com/antchfx/xmlquery v1.4.2/go.mod h1:QXhvf5ldTuGqhd1SHNvvtlhhdQLks4dD0awIVhXIDTA= +github.com/antchfx/xpath v1.3.2 h1:LNjzlsSjinu3bQpw9hWMY9ocB80oLOWuQqFvO6xt51U= +github.com/antchfx/xpath v1.3.2/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/elastic/go-grok v0.3.1 h1:WEhUxe2KrwycMnlvMimJXvzRa7DoByJB4PVUIE1ZD/U= +github.com/elastic/go-grok v0.3.1/go.mod h1:n38ls8ZgOboZRgKcjMY8eFeZFMmcL9n2lP0iHhIDk64= +github.com/elastic/lunes v0.1.0 h1:amRtLPjwkWtzDF/RKzcEPMvSsSseLDLW+bnhfNSLRe4= +github.com/elastic/lunes v0.1.0/go.mod h1:xGphYIt3XdZRtyWosHQTErsQTd4OP1p9wsbVoHelrd4= github.com/expr-lang/expr v1.16.9 h1:WUAzmR0JNI9JCiF0/ewwHB1gmcGw5wW7nWt8gc6PpCI= github.com/expr-lang/expr v1.16.9/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= +github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -31,6 +43,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= @@ -45,12 +59,14 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= +github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= @@ -62,46 +78,43 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 h1:SIKIoA4e/5Y9ZOl0DCe3eVMLPOQzJxgZpfdHHeauNTM= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6/go.mod h1:BUbeWZiieNxAuuADTBNb3/aeje6on3DhU3rpWsQSB1E= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -111,44 +124,64 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/grpcutil/Makefile b/internal/grpcutil/Makefile new file mode 100644 index 000000000000..ded7a36092dc --- /dev/null +++ b/internal/grpcutil/Makefile @@ -0,0 +1 @@ +include ../../Makefile.Common diff --git a/internal/grpcutil/go.mod b/internal/grpcutil/go.mod new file mode 100644 index 000000000000..67801c1df217 --- /dev/null +++ b/internal/grpcutil/go.mod @@ -0,0 +1,11 @@ +module github.com/open-telemetry/opentelemetry-collector-contrib/internal/grpcutil + +go 1.22.0 + +require github.com/stretchr/testify v1.10.0 + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/internal/grpcutil/go.sum b/internal/grpcutil/go.sum new file mode 100644 index 000000000000..713a0b4f0a3a --- /dev/null +++ b/internal/grpcutil/go.sum @@ -0,0 +1,10 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/grpcutil/metadata.yaml b/internal/grpcutil/metadata.yaml new file mode 100644 index 000000000000..92ebf80067ec --- /dev/null +++ b/internal/grpcutil/metadata.yaml @@ -0,0 +1,3 @@ +status: + codeowners: + active: [jmacd, moh-osman3, lquerel] diff --git a/internal/grpcutil/timeout.go b/internal/grpcutil/timeout.go new file mode 100644 index 000000000000..88620f1f0f44 --- /dev/null +++ b/internal/grpcutil/timeout.go @@ -0,0 +1,114 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// The EncodeTimeout function is forked and modified from the original +// https://github.com/grpc/grpc-go/blob/master/internal/grpcutil/encode_duration.go + +// This DecodeTimeout function is forked and modified from the original +// https://github.com/grpc/grpc-go/blob/master/internal/transport/http_util.go + +package grpcutil // import "github.com/open-telemetry/opentelemetry-collector-contrib/internal/grpcutil" + +import ( + "fmt" + "math" + "strconv" + "time" +) + +const maxTimeoutValue int64 = 100000000 - 1 + +// div does integer division and round-up the result. Note that this is +// equivalent to (d+r-1)/r but has less chance to overflow. +func div(d, r time.Duration) int64 { + if d%r > 0 { + return int64(d/r + 1) + } + return int64(d / r) +} + +type timeoutUnit uint8 + +const ( + hour timeoutUnit = 'H' + minute timeoutUnit = 'M' + second timeoutUnit = 'S' + millisecond timeoutUnit = 'm' + microsecond timeoutUnit = 'u' + nanosecond timeoutUnit = 'n' +) + +// EncodeTimeout encodes the duration to the format grpc-timeout +// header accepts. This is copied from the gRPC-Go implementation, +// with two branches of the original six branches removed, leaving the +// four you see for milliseconds, seconds, minutes, and hours. This +// code will not encode timeouts less than one millisecond. See: +// +// https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests +func EncodeTimeout(t time.Duration) string { + if t < time.Millisecond { + return "0m" + } + if d := div(t, time.Millisecond); d <= maxTimeoutValue { + return fmt.Sprintf("%d%c", d, millisecond) + } + if d := div(t, time.Second); d <= maxTimeoutValue { + return fmt.Sprintf("%d%c", d, second) + } + if d := div(t, time.Minute); d <= maxTimeoutValue { + return fmt.Sprintf("%d%c", d, minute) + } + // Note that maxTimeoutValue * time.Hour > MaxInt64. + return fmt.Sprintf("%d%c", div(t, time.Hour), hour) +} + +func timeoutUnitToDuration(u timeoutUnit) (d time.Duration, ok bool) { + switch u { + case hour: + return time.Hour, true + case minute: + return time.Minute, true + case second: + return time.Second, true + case millisecond: + return time.Millisecond, true + case microsecond: + return time.Microsecond, true + case nanosecond: + return time.Nanosecond, true + default: + } + return +} + +// DecodeTimeout parses a string associated with the "grpc-timeout" +// header. Note this will accept all valid gRPC units including +// microseconds and nanoseconds, which EncodeTimeout avoids. This is +// specified in: +// +// https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests +func DecodeTimeout(s string) (time.Duration, error) { + size := len(s) + if size < 2 { + return 0, fmt.Errorf("transport: timeout string is too short: %q", s) + } + if size > 9 { + // Spec allows for 8 digits plus the unit. + return 0, fmt.Errorf("transport: timeout string is too long: %q", s) + } + unit := timeoutUnit(s[size-1]) + d, ok := timeoutUnitToDuration(unit) + if !ok { + return 0, fmt.Errorf("transport: timeout unit is not recognized: %q", s) + } + t, err := strconv.ParseInt(s[:size-1], 10, 64) + if err != nil { + return 0, err + } + const maxHours = math.MaxInt64 / int64(time.Hour) + if d == time.Hour && t > maxHours { + // This timeout would overflow math.MaxInt64; clamp it. + return time.Duration(math.MaxInt64), nil + } + return d * time.Duration(t), nil +} diff --git a/internal/grpcutil/timeout_test.go b/internal/grpcutil/timeout_test.go new file mode 100644 index 000000000000..9554b6dd35cf --- /dev/null +++ b/internal/grpcutil/timeout_test.go @@ -0,0 +1,54 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package grpcutil + +import ( + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestTimeoutEncode(t *testing.T) { + // Note the gRPC specification limits durations to 8 digits, + // so the use of 123456789 as a multiplier below forces the + // next-larger unit to be used. + require.Equal(t, "0m", EncodeTimeout(-time.Second)) + require.Equal(t, "1000m", EncodeTimeout(time.Second)) + require.Equal(t, "123m", EncodeTimeout(123*time.Millisecond)) + require.Equal(t, "123457S", EncodeTimeout(123456789*time.Millisecond)) + require.Equal(t, "2057614M", EncodeTimeout(123456789*time.Second)) + require.Equal(t, "2057614H", EncodeTimeout(123456789*time.Minute)) +} + +func mustDecode(t *testing.T, s string) time.Duration { + d, err := DecodeTimeout(s) + require.NoError(t, err, "must parse a timeout") + return d +} + +func TestTimeoutDecode(t *testing.T) { + // Note the gRPC specification limits durations to 8 digits, + // so the use of 123456789 as a multiplier below forces the + // next-larger unit to be used. + require.Equal(t, time.Duration(0), mustDecode(t, "0m")) + require.Equal(t, time.Second, mustDecode(t, "1000m")) + require.Equal(t, 123*time.Millisecond, mustDecode(t, "123m")) + require.Equal(t, 123*time.Second, mustDecode(t, "123S")) + require.Equal(t, 123*time.Minute, mustDecode(t, "123M")) + require.Equal(t, 123*time.Hour, mustDecode(t, "123H")) + + // these are not encoded by EncodeTimeout, but will be decoded + require.Equal(t, 123*time.Microsecond, mustDecode(t, "123u")) + require.Equal(t, 123*time.Nanosecond, mustDecode(t, "123n")) + + // error cases + testError := func(s string) { + _, err := DecodeTimeout(s) + require.Error(t, err) + } + testError("123x") + testError("x") + testError("") +} diff --git a/internal/k8sconfig/config.go b/internal/k8sconfig/config.go index 578a6fe079a8..d3391166762d 100644 --- a/internal/k8sconfig/config.go +++ b/internal/k8sconfig/config.go @@ -27,7 +27,7 @@ import ( func init() { k8sruntime.ReallyCrash = false - k8sruntime.PanicHandlers = []func(any){} + k8sruntime.PanicHandlers = []func(context.Context, any){} } // AuthType describes the type of authentication to use for the K8s API @@ -101,7 +101,6 @@ func CreateRestConfig(apiConf APIConfig) (*rest.Config, error) { } authConf, err = clientcmd.NewNonInteractiveDeferredLoadingClientConfig( loadingRules, configOverrides).ClientConfig() - if err != nil { return nil, fmt.Errorf("error connecting to k8s with auth_type=%s: %w", AuthTypeKubeConfig, err) } diff --git a/internal/k8sconfig/go.mod b/internal/k8sconfig/go.mod index 8b1c41a414d4..f12abc5f8462 100644 --- a/internal/k8sconfig/go.mod +++ b/internal/k8sconfig/go.mod @@ -1,27 +1,28 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig -go 1.21.0 +go 1.22.0 require ( github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142 - k8s.io/api v0.29.3 - k8s.io/apimachinery v0.29.3 - k8s.io/client-go v0.29.3 + k8s.io/api v0.31.3 + k8s.io/apimachinery v0.31.3 + k8s.io/client-go v0.31.3 ) require ( - github.com/davecgh/go-spew v1.1.1 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect - github.com/go-logr/logr v1.3.0 // indirect + github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/swag v0.22.3 // indirect + github.com/go-openapi/swag v0.22.4 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.4.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/imdario/mergo v0.3.11 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect @@ -31,23 +32,23 @@ require ( github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/openshift/api v3.9.0+incompatible // indirect github.com/spf13/pflag v1.0.5 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/oauth2 v0.14.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/term v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect + github.com/x448/float16 v0.8.4 // indirect + golang.org/x/net v0.26.0 // indirect + golang.org/x/oauth2 v0.21.0 // indirect + golang.org/x/sys v0.21.0 // indirect + golang.org/x/term v0.21.0 // indirect + golang.org/x/text v0.16.0 // indirect golang.org/x/time v0.4.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.33.0 // indirect + google.golang.org/protobuf v1.34.2 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/klog/v2 v2.110.1 // indirect - k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect - k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect + k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) // openshift removed all tags from their repo, use the pseudoversion from the release-3.9 branch HEAD diff --git a/internal/k8sconfig/go.sum b/internal/k8sconfig/go.sum index 10268b347bd8..2bd99a0e12b9 100644 --- a/internal/k8sconfig/go.sum +++ b/internal/k8sconfig/go.sum @@ -41,8 +41,9 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= @@ -54,14 +55,16 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= -github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= @@ -74,10 +77,11 @@ github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8 github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= +github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -126,13 +130,13 @@ github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OI github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af h1:kmjWCqn2qkEml422C2Rrd27c3VGxi6a/6HNq8QmHRKM= +github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= @@ -188,12 +192,12 @@ github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= -github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= +github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= +github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg= -github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/openshift/api v0.0.0-20180801171038-322a19404e37 h1:05irGU4HK4IauGGDbsk+ZHrm1wOzMLYjMlfaiqMrBYc= github.com/openshift/api v0.0.0-20180801171038-322a19404e37/go.mod h1:dh9o4Fs58gpFXGSYfnVxGR9PnV53I8TW84pQaJDdGiY= github.com/openshift/api v0.0.0-20210521075222-e273a339932a/go.mod h1:izBmoXbUu3z5kUa4FjZhvekTsyzIWiOoaIgJiZBBMQs= @@ -202,12 +206,13 @@ github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142 h1:ZHRIMCFIJN1 github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142/go.mod h1:fjS8r9mqDVsPb5td3NehsNOAWa4uiFkYEfVZioQ2gH0= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -222,8 +227,10 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -292,15 +299,15 @@ golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= -golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= +golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= +golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -334,21 +341,21 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= +golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -390,8 +397,8 @@ golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= -golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -411,8 +418,6 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -448,8 +453,8 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -478,28 +483,28 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.21.1/go.mod h1:FstGROTmsSHBarKc8bylzXih8BLNYTiS3TZcsoEDg2s= -k8s.io/api v0.29.3 h1:2ORfZ7+bGC3YJqGpV0KSDDEVf8hdGQ6A03/50vj8pmw= -k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80= +k8s.io/api v0.31.3 h1:umzm5o8lFbdN/hIXbrK9oRpOproJO62CV1zqxXrLgk8= +k8s.io/api v0.31.3/go.mod h1:UJrkIp9pnMOI9K2nlL6vwpxRzzEX5sWgn8kGQe92kCE= k8s.io/apimachinery v0.21.1/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY= -k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= -k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= +k8s.io/apimachinery v0.31.3 h1:6l0WhcYgasZ/wk9ktLq5vLaoXJJr5ts6lkaQzgeYPq4= +k8s.io/apimachinery v0.31.3/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= k8s.io/client-go v0.21.1/go.mod h1:/kEw4RgW+3xnBGzvp9IWxKSNA+lXn3A7AuH3gdOAzLs= -k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg= -k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= +k8s.io/client-go v0.31.3 h1:CAlZuM+PH2cm+86LOBemaJI/lQ5linJ6UFxKX/SoG+4= +k8s.io/client-go v0.31.3/go.mod h1:2CgjPUTpv3fE5dNygAr2NcM8nhHzXvxB8KL5gYc3kJs= k8s.io/code-generator v0.21.1/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= -k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= 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= @@ -510,5 +515,5 @@ sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/internal/k8stest/client.go b/internal/k8stest/client.go index 8481b37d62b9..3de4092c4d51 100644 --- a/internal/k8stest/client.go +++ b/internal/k8stest/client.go @@ -21,7 +21,6 @@ type K8sClient struct { } func NewK8sClient(kubeconfigPath string) (*K8sClient, error) { - if kubeconfigPath == "" { return nil, errors.New("Please provide file path to load kubeconfig") } @@ -42,5 +41,6 @@ func NewK8sClient(kubeconfigPath string) (*K8sClient, error) { mapper := restmapper.NewDeferredDiscoveryRESTMapper(memory.NewMemCacheClient(discoveryClient)) return &K8sClient{ - DynamicClient: dynamicClient, DiscoveryClient: discoveryClient, Mapper: mapper}, nil + DynamicClient: dynamicClient, DiscoveryClient: discoveryClient, Mapper: mapper, + }, nil } diff --git a/internal/k8stest/go.mod b/internal/k8stest/go.mod index b3f403ca9cff..f442aec3cc74 100644 --- a/internal/k8stest/go.mod +++ b/internal/k8stest/go.mod @@ -1,38 +1,41 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8stest -go 1.21.0 +go 1.22.0 require ( - github.com/docker/docker v25.0.5+incompatible - github.com/stretchr/testify v1.9.0 - k8s.io/api v0.29.3 - k8s.io/apimachinery v0.29.3 - k8s.io/client-go v0.29.3 + github.com/docker/docker v27.4.0+incompatible + github.com/stretchr/testify v1.10.0 + k8s.io/api v0.31.3 + k8s.io/apimachinery v0.31.3 + k8s.io/client-go v0.31.3 ) require ( github.com/Microsoft/go-winio v0.6.1 // indirect github.com/containerd/log v0.1.0 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/distribution/reference v0.5.0 // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/swag v0.22.3 // indirect + github.com/go-openapi/swag v0.22.4 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/imdario/mergo v0.3.6 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/mailru/easyjson v0.7.7 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/term v0.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect @@ -41,32 +44,33 @@ require ( github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.2 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/spf13/pflag v1.0.5 // indirect + github.com/x448/float16 v0.8.4 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect go.opentelemetry.io/otel v1.24.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 // indirect go.opentelemetry.io/otel/metric v1.24.0 // indirect go.opentelemetry.io/otel/sdk v1.24.0 // indirect go.opentelemetry.io/otel/trace v1.24.0 // indirect - golang.org/x/mod v0.14.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/oauth2 v0.14.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/term v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/mod v0.17.0 // indirect + golang.org/x/net v0.26.0 // indirect + golang.org/x/oauth2 v0.21.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.21.0 // indirect + golang.org/x/term v0.21.0 // indirect + golang.org/x/text v0.16.0 // indirect golang.org/x/time v0.4.0 // indirect - golang.org/x/tools v0.16.1 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.33.0 // indirect + golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect + google.golang.org/protobuf v1.34.2 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools/v3 v3.4.0 // indirect - k8s.io/klog/v2 v2.110.1 // indirect - k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect - k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect + k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) diff --git a/internal/k8stest/go.sum b/internal/k8stest/go.sum index 88e12dcff96a..e1a2889038aa 100644 --- a/internal/k8stest/go.sum +++ b/internal/k8stest/go.sum @@ -8,39 +8,39 @@ github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= -github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v27.4.0+incompatible h1:I9z7sQ5qyzO0BfAb9IMOawRkAGxhYsidKiTMcm0DU+A= +github.com/docker/docker v27.4.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= +github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= @@ -52,10 +52,10 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af h1:kmjWCqn2qkEml422C2Rrd27c3VGxi6a/6HNq8QmHRKM= +github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No= github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU= github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= @@ -75,6 +75,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -86,20 +88,21 @@ github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= -github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= -github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg= -github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= +github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= +github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -111,8 +114,10 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= @@ -136,35 +141,33 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= -golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= +golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= +golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/time v0.4.0 h1:Z81tqI5ddIoXDPvVQ7/7CC9TnLM7ubaFG2qXYd5BbYY= golang.org/x/time v0.4.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -172,25 +175,25 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= -golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917 h1:rcS6EyEaoCO52hQDupoSfrxI3R6C2Tq741is7X8OvnM= google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917/go.mod h1:CmlNWB9lSezaYELKS5Ym1r44VrrbPUa7JTvw+6MbpJ0= google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 h1:6G8oQ016D88m1xAKljMlBOOGWDZkes4kMhgGFlf8WcQ= google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917/go.mod h1:xtjpI3tXFPP051KaWnhvxkiubL/6dJ18vLVf7q2pTOU= google.golang.org/grpc v1.61.1 h1:kLAiWrZs7YeDM6MumDe7m3y4aM6wacLzM1Y/wiLP9XY= google.golang.org/grpc v1.61.1/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= +gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -201,21 +204,21 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= -k8s.io/api v0.29.3 h1:2ORfZ7+bGC3YJqGpV0KSDDEVf8hdGQ6A03/50vj8pmw= -k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80= -k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= -k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= -k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg= -k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= -k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= -k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/api v0.31.3 h1:umzm5o8lFbdN/hIXbrK9oRpOproJO62CV1zqxXrLgk8= +k8s.io/api v0.31.3/go.mod h1:UJrkIp9pnMOI9K2nlL6vwpxRzzEX5sWgn8kGQe92kCE= +k8s.io/apimachinery v0.31.3 h1:6l0WhcYgasZ/wk9ktLq5vLaoXJJr5ts6lkaQzgeYPq4= +k8s.io/apimachinery v0.31.3/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= +k8s.io/client-go v0.31.3 h1:CAlZuM+PH2cm+86LOBemaJI/lQ5linJ6UFxKX/SoG+4= +k8s.io/client-go v0.31.3/go.mod h1:2CgjPUTpv3fE5dNygAr2NcM8nhHzXvxB8KL5gYc3kJs= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/internal/k8stest/k8s_collector.go b/internal/k8stest/k8s_collector.go index d607fd194e1a..b74257845344 100644 --- a/internal/k8stest/k8s_collector.go +++ b/internal/k8stest/k8s_collector.go @@ -27,6 +27,9 @@ func CreateCollectorObjects(t *testing.T, client *K8sClient, testID string, mani manifestFiles, err := os.ReadDir(manifestsDir) require.NoErrorf(t, err, "failed to read collector manifests directory %s", manifestsDir) host := HostEndpoint(t) + if host == "" { + require.Fail(t, "host endpoint cannot be empty") + } var podNamespace string var podLabels map[string]any createdObjs := make([]*unstructured.Unstructured, 0, len(manifestFiles)) @@ -100,7 +103,6 @@ func WaitForCollectorToStart(t *testing.T, client *K8sClient, podNamespace strin return true } return false - }, time.Duration(podTimeoutMinutes)*time.Minute, 2*time.Second, "collector pods were not ready within %d minutes", podTimeoutMinutes) } diff --git a/internal/k8stest/k8s_data_helpers.go b/internal/k8stest/k8s_data_helpers.go index 50be3a2336f5..09114fd29fcf 100644 --- a/internal/k8stest/k8s_data_helpers.go +++ b/internal/k8stest/k8s_data_helpers.go @@ -9,7 +9,7 @@ import ( "testing" "time" - "github.com/docker/docker/api/types" + network2 "github.com/docker/docker/api/types/network" docker "github.com/docker/docker/client" "github.com/stretchr/testify/require" "k8s.io/apimachinery/pkg/labels" @@ -25,10 +25,12 @@ func HostEndpoint(t *testing.T) string { client.NegotiateAPIVersion(context.Background()) ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() - network, err := client.NetworkInspect(ctx, "kind", types.NetworkInspectOptions{}) + network, err := client.NetworkInspect(ctx, "kind", network2.InspectOptions{}) require.NoError(t, err) for _, ipam := range network.IPAM.Config { - return ipam.Gateway + if ipam.Gateway != "" { + return ipam.Gateway + } } require.Fail(t, "failed to find host endpoint") return "" diff --git a/internal/k8stest/k8s_objects.go b/internal/k8stest/k8s_objects.go index bf4b559d0994..a9acca588f84 100644 --- a/internal/k8stest/k8s_objects.go +++ b/internal/k8stest/k8s_objects.go @@ -5,6 +5,8 @@ package k8stest // import "github.com/open-telemetry/opentelemetry-collector-con import ( "context" + "os" + "path/filepath" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -53,3 +55,36 @@ func DeleteObject(client *K8sClient, obj *unstructured.Unstructured) error { PropagationPolicy: &deletePolicy, }) } + +func CreateObjects(client *K8sClient, dir string) ([]*unstructured.Unstructured, error) { + var objs []*unstructured.Unstructured + files, err := os.ReadDir(dir) + if err != nil { + return nil, err + } + + for _, file := range files { + if file.IsDir() { + continue // Skip directories + } + manifest, err := os.ReadFile(filepath.Join(dir, file.Name())) + if err != nil { + return nil, err + } + obj, err := CreateObject(client, manifest) + if err != nil { + return nil, err + } + objs = append(objs, obj) + } + return objs, nil +} + +func DeleteObjects(client *K8sClient, objs []*unstructured.Unstructured) error { + for _, obj := range objs { + if err := DeleteObject(client, obj); err != nil { + return err + } + } + return nil +} diff --git a/internal/kafka/authentication.go b/internal/kafka/authentication.go index 104d6152a1b2..ca6ce4c3519e 100644 --- a/internal/kafka/authentication.go +++ b/internal/kafka/authentication.go @@ -7,9 +7,11 @@ import ( "context" "crypto/sha256" "crypto/sha512" + "crypto/tls" "fmt" "github.com/IBM/sarama" + "github.com/aws/aws-msk-iam-sasl-signer-go/signer" "go.opentelemetry.io/collector/config/configtls" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka/awsmsk" @@ -35,7 +37,7 @@ type SASLConfig struct { Username string `mapstructure:"username"` // Password to be used on authentication Password string `mapstructure:"password"` - // SASL Mechanism to be used, possible values are: (PLAIN, AWS_MSK_IAM, SCRAM-SHA-256 or SCRAM-SHA-512). + // SASL Mechanism to be used, possible values are: (PLAIN, AWS_MSK_IAM, AWS_MSK_IAM_OAUTHBEARER, SCRAM-SHA-256 or SCRAM-SHA-512). Mechanism string `mapstructure:"mechanism"` // SASL Protocol Version to be used, possible values are: (0, 1). Defaults to 0. Version int `mapstructure:"version"` @@ -44,27 +46,37 @@ type SASLConfig struct { } // AWSMSKConfig defines the additional SASL authentication -// measures needed to use AWS_MSK_IAM mechanism +// measures needed to use AWS_MSK_IAM and AWS_MSK_IAM_OAUTHBEARER mechanism type AWSMSKConfig struct { // Region is the AWS region the MSK cluster is based in Region string `mapstructure:"region"` // BrokerAddr is the client is connecting to in order to perform the auth required BrokerAddr string `mapstructure:"broker_addr"` + // Context + ctx context.Context } -// KerberosConfig defines kereros configuration. +// Token return the AWS session token for the AWS_MSK_IAM_OAUTHBEARER mechanism +func (c *AWSMSKConfig) Token() (*sarama.AccessToken, error) { + token, _, err := signer.GenerateAuthToken(c.ctx, c.Region) + + return &sarama.AccessToken{Token: token}, err +} + +// KerberosConfig defines kerberos configuration. type KerberosConfig struct { - ServiceName string `mapstructure:"service_name"` - Realm string `mapstructure:"realm"` - UseKeyTab bool `mapstructure:"use_keytab"` - Username string `mapstructure:"username"` - Password string `mapstructure:"password" json:"-"` - ConfigPath string `mapstructure:"config_file"` - KeyTabPath string `mapstructure:"keytab_file"` + ServiceName string `mapstructure:"service_name"` + Realm string `mapstructure:"realm"` + UseKeyTab bool `mapstructure:"use_keytab"` + Username string `mapstructure:"username"` + Password string `mapstructure:"password" json:"-"` + ConfigPath string `mapstructure:"config_file"` + KeyTabPath string `mapstructure:"keytab_file"` + DisablePAFXFAST bool `mapstructure:"disable_fast_negotiation"` } // ConfigureAuthentication configures authentication in sarama.Config. -func ConfigureAuthentication(config Authentication, saramaConfig *sarama.Config) error { +func ConfigureAuthentication(ctx context.Context, config Authentication, saramaConfig *sarama.Config) error { if config.PlainText != nil { configurePlaintext(*config.PlainText, saramaConfig) } @@ -74,7 +86,7 @@ func ConfigureAuthentication(config Authentication, saramaConfig *sarama.Config) } } if config.SASL != nil { - if err := configureSASL(*config.SASL, saramaConfig); err != nil { + if err := configureSASL(ctx, *config.SASL, saramaConfig); err != nil { return err } } @@ -91,13 +103,12 @@ func configurePlaintext(config PlainTextConfig, saramaConfig *sarama.Config) { saramaConfig.Net.SASL.Password = config.Password } -func configureSASL(config SASLConfig, saramaConfig *sarama.Config) error { - - if config.Username == "" { +func configureSASL(ctx context.Context, config SASLConfig, saramaConfig *sarama.Config) error { + if config.Username == "" && config.Mechanism != "AWS_MSK_IAM_OAUTHBEARER" { return fmt.Errorf("username have to be provided") } - if config.Password == "" { + if config.Password == "" && config.Mechanism != "AWS_MSK_IAM_OAUTHBEARER" { return fmt.Errorf("password have to be provided") } @@ -119,8 +130,15 @@ func configureSASL(config SASLConfig, saramaConfig *sarama.Config) error { return awsmsk.NewIAMSASLClient(config.AWSMSK.BrokerAddr, config.AWSMSK.Region, saramaConfig.ClientID) } saramaConfig.Net.SASL.Mechanism = awsmsk.Mechanism + case "AWS_MSK_IAM_OAUTHBEARER": + config.AWSMSK.ctx = ctx + saramaConfig.Net.SASL.Mechanism = sarama.SASLTypeOAuth + saramaConfig.Net.SASL.TokenProvider = &config.AWSMSK + tlsConfig := tls.Config{} + saramaConfig.Net.TLS.Enable = true + saramaConfig.Net.TLS.Config = &tlsConfig default: - return fmt.Errorf(`invalid SASL Mechanism %q: can be either "PLAIN", "AWS_MSK_IAM", "SCRAM-SHA-256" or "SCRAM-SHA-512"`, config.Mechanism) + return fmt.Errorf(`invalid SASL Mechanism %q: can be either "PLAIN", "AWS_MSK_IAM", "AWS_MSK_IAM_OAUTHBEARER", "SCRAM-SHA-256" or "SCRAM-SHA-512"`, config.Mechanism) } switch config.Version { @@ -159,4 +177,5 @@ func configureKerberos(config KerberosConfig, saramaConfig *sarama.Config) { saramaConfig.Net.SASL.GSSAPI.Username = config.Username saramaConfig.Net.SASL.GSSAPI.Realm = config.Realm saramaConfig.Net.SASL.GSSAPI.ServiceName = config.ServiceName + saramaConfig.Net.SASL.GSSAPI.DisablePAFXFAST = config.DisablePAFXFAST } diff --git a/internal/kafka/authentication_test.go b/internal/kafka/authentication_test.go index 38be5ab45d5e..47cbc0989684 100644 --- a/internal/kafka/authentication_test.go +++ b/internal/kafka/authentication_test.go @@ -5,6 +5,7 @@ package kafka import ( "context" + "crypto/tls" "testing" "github.com/IBM/sarama" @@ -42,7 +43,6 @@ func TestAuthentication(t *testing.T) { saramaSASLPLAINConfig.Net.SASL.Enable = true saramaSASLPLAINConfig.Net.SASL.User = "jdoe" saramaSASLPLAINConfig.Net.SASL.Password = "pass" - saramaSASLPLAINConfig.Net.SASL.Mechanism = sarama.SASLTypePlaintext saramaTLSCfg := &sarama.Config{} @@ -52,6 +52,16 @@ func TestAuthentication(t *testing.T) { require.NoError(t, err) saramaTLSCfg.Net.TLS.Config = tlscfg + ctx := context.Background() + saramaSASLAWSIAMOATUHConfig := &sarama.Config{} + saramaSASLAWSIAMOATUHConfig.Net.SASL.Enable = true + saramaSASLAWSIAMOATUHConfig.Net.SASL.Mechanism = sarama.SASLTypeOAuth + saramaSASLAWSIAMOATUHConfig.Net.SASL.TokenProvider = &AWSMSKConfig{Region: "region", ctx: ctx} + + tlsConfig := tls.Config{} + saramaSASLAWSIAMOATUHConfig.Net.TLS.Enable = true + saramaSASLAWSIAMOATUHConfig.Net.TLS.Config = &tlsConfig + saramaKerberosCfg := &sarama.Config{} saramaKerberosCfg.Net.SASL.Mechanism = sarama.SASLTypeGSSAPI saramaKerberosCfg.Net.SASL.Enable = true @@ -64,6 +74,20 @@ func TestAuthentication(t *testing.T) { saramaKerberosKeyTabCfg.Net.SASL.GSSAPI.KeyTabPath = "/path" saramaKerberosKeyTabCfg.Net.SASL.GSSAPI.AuthType = sarama.KRB5_KEYTAB_AUTH + saramaKerberosDisablePAFXFASTTrueCfg := &sarama.Config{} + saramaKerberosDisablePAFXFASTTrueCfg.Net.SASL.Mechanism = sarama.SASLTypeGSSAPI + saramaKerberosDisablePAFXFASTTrueCfg.Net.SASL.Enable = true + saramaKerberosDisablePAFXFASTTrueCfg.Net.SASL.GSSAPI.ServiceName = "foobar" + saramaKerberosDisablePAFXFASTTrueCfg.Net.SASL.GSSAPI.AuthType = sarama.KRB5_USER_AUTH + saramaKerberosDisablePAFXFASTTrueCfg.Net.SASL.GSSAPI.DisablePAFXFAST = true + + saramaKerberosDisablePAFXFASTFalseCfg := &sarama.Config{} + saramaKerberosDisablePAFXFASTFalseCfg.Net.SASL.Mechanism = sarama.SASLTypeGSSAPI + saramaKerberosDisablePAFXFASTFalseCfg.Net.SASL.Enable = true + saramaKerberosDisablePAFXFASTFalseCfg.Net.SASL.GSSAPI.ServiceName = "foobar" + saramaKerberosDisablePAFXFASTFalseCfg.Net.SASL.GSSAPI.AuthType = sarama.KRB5_USER_AUTH + saramaKerberosDisablePAFXFASTFalseCfg.Net.SASL.GSSAPI.DisablePAFXFAST = false + tests := []struct { auth Authentication saramaConfig *sarama.Config @@ -92,6 +116,14 @@ func TestAuthentication(t *testing.T) { auth: Authentication{Kerberos: &KerberosConfig{UseKeyTab: true, KeyTabPath: "/path"}}, saramaConfig: saramaKerberosKeyTabCfg, }, + { + auth: Authentication{Kerberos: &KerberosConfig{ServiceName: "foobar", DisablePAFXFAST: true}}, + saramaConfig: saramaKerberosDisablePAFXFASTTrueCfg, + }, + { + auth: Authentication{Kerberos: &KerberosConfig{ServiceName: "foobar", DisablePAFXFAST: false}}, + saramaConfig: saramaKerberosDisablePAFXFASTFalseCfg, + }, { auth: Authentication{SASL: &SASLConfig{Username: "jdoe", Password: "pass", Mechanism: "SCRAM-SHA-256"}}, saramaConfig: saramaSASLSCRAM256Config, @@ -108,6 +140,10 @@ func TestAuthentication(t *testing.T) { auth: Authentication{SASL: &SASLConfig{Username: "jdoe", Password: "pass", Mechanism: "PLAIN"}}, saramaConfig: saramaSASLPLAINConfig, }, + { + auth: Authentication{SASL: &SASLConfig{Username: "", Password: "", Mechanism: "AWS_MSK_IAM_OAUTHBEARER", AWSMSK: AWSMSKConfig{Region: "region"}}}, + saramaConfig: saramaSASLAWSIAMOATUHConfig, + }, { auth: Authentication{SASL: &SASLConfig{Username: "jdoe", Password: "pass", Mechanism: "SCRAM-SHA-222"}}, saramaConfig: saramaSASLSCRAM512Config, @@ -132,10 +168,9 @@ func TestAuthentication(t *testing.T) { for _, test := range tests { t.Run("", func(t *testing.T) { config := &sarama.Config{} - err := ConfigureAuthentication(test.auth, config) + err := ConfigureAuthentication(context.Background(), test.auth, config) if test.err != "" { - require.Error(t, err) - assert.Contains(t, err.Error(), test.err) + assert.ErrorContains(t, err, test.err) } else { // equalizes SCRAMClientGeneratorFunc to do assertion with the same reference. config.Net.SASL.SCRAMClientGeneratorFunc = test.saramaConfig.Net.SASL.SCRAMClientGeneratorFunc diff --git a/internal/kafka/awsmsk/iam_scram_client_test.go b/internal/kafka/awsmsk/iam_scram_client_test.go index afe355caeded..d62946eb252d 100644 --- a/internal/kafka/awsmsk/iam_scram_client_test.go +++ b/internal/kafka/awsmsk/iam_scram_client_test.go @@ -112,5 +112,4 @@ func TestValidatingServerResponse(t *testing.T) { _, err := new(IAMSASLClient).Step("") assert.ErrorIs(t, err, ErrInvalidStateReached, "Must be an invalid step when not set up correctly") - } diff --git a/internal/kafka/go.mod b/internal/kafka/go.mod index 2eba43ef7e4c..d866c7f192a8 100644 --- a/internal/kafka/go.mod +++ b/internal/kafka/go.mod @@ -1,23 +1,36 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka -go 1.21.0 +go 1.22.0 require ( - github.com/IBM/sarama v1.43.2 - github.com/aws/aws-sdk-go v1.53.11 - github.com/stretchr/testify v1.9.0 + github.com/IBM/sarama v1.43.3 + github.com/aws/aws-msk-iam-sasl-signer-go v1.0.0 + github.com/aws/aws-sdk-go v1.55.5 + github.com/stretchr/testify v1.10.0 github.com/xdg-go/scram v1.1.2 - go.opentelemetry.io/collector/config/configtls v0.102.0 + go.opentelemetry.io/collector/config/configtls v1.22.0 go.uber.org/goleak v1.3.0 go.uber.org/multierr v1.11.0 ) require ( + github.com/aws/aws-sdk-go-v2 v1.19.0 // indirect + github.com/aws/aws-sdk-go-v2/config v1.18.28 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.27 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.5 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.29 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.3.36 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.29 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.12.13 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.13 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.19.3 // indirect + github.com/aws/smithy-go v1.13.5 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/eapache/go-resiliency v1.6.0 // indirect + github.com/eapache/go-resiliency v1.7.0 // indirect github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 // indirect github.com/eapache/queue v1.1.0 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect @@ -28,16 +41,16 @@ require ( github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect github.com/jcmturner/rpc/v2 v2.0.3 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/compress v1.17.9 // indirect github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect - go.opentelemetry.io/collector/config/configopaque v1.9.0 // indirect - golang.org/x/crypto v0.22.0 // indirect - golang.org/x/net v0.24.0 // indirect - golang.org/x/sys v0.19.0 // indirect - golang.org/x/text v0.14.0 // indirect + go.opentelemetry.io/collector/config/configopaque v1.22.0 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/net v0.28.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/internal/kafka/go.sum b/internal/kafka/go.sum index 71ce6bfdf50b..4f3f9eb46c04 100644 --- a/internal/kafka/go.sum +++ b/internal/kafka/go.sum @@ -1,25 +1,51 @@ -github.com/IBM/sarama v1.43.2 h1:HABeEqRUh32z8yzY2hGB/j8mHSzC/HA9zlEjqFNCzSw= -github.com/IBM/sarama v1.43.2/go.mod h1:Kyo4WkF24Z+1nz7xeVUFWIuKVV8RS3wM8mkvPKMdXFQ= -github.com/aws/aws-sdk-go v1.53.11 h1:KcmduYvX15rRqt4ZU/7jKkmDxU/G87LJ9MUI0yQJh00= -github.com/aws/aws-sdk-go v1.53.11/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/IBM/sarama v1.43.3 h1:Yj6L2IaNvb2mRBop39N7mmJAHBVY3dTPncr3qGVkxPA= +github.com/IBM/sarama v1.43.3/go.mod h1:FVIRaLrhK3Cla/9FfRF5X9Zua2KpS3SYIXxhac1H+FQ= +github.com/aws/aws-msk-iam-sasl-signer-go v1.0.0 h1:UyjtGmO0Uwl/K+zpzPwLoXzMhcN9xmnR2nrqJoBrg3c= +github.com/aws/aws-msk-iam-sasl-signer-go v1.0.0/go.mod h1:TJAXuFs2HcMib3sN5L0gUC+Q01Qvy3DemvA55WuC+iA= +github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= +github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/aws/aws-sdk-go-v2 v1.19.0 h1:klAT+y3pGFBU/qVf1uzwttpBbiuozJYWzNLHioyDJ+k= +github.com/aws/aws-sdk-go-v2 v1.19.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= +github.com/aws/aws-sdk-go-v2/config v1.18.28 h1:TINEaKyh1Td64tqFvn09iYpKiWjmHYrG1fa91q2gnqw= +github.com/aws/aws-sdk-go-v2/config v1.18.28/go.mod h1:nIL+4/8JdAuNHEjn/gPEXqtnS02Q3NXB/9Z7o5xE4+A= +github.com/aws/aws-sdk-go-v2/credentials v1.13.27 h1:dz0yr/yR1jweAnsCx+BmjerUILVPQ6FS5AwF/OyG1kA= +github.com/aws/aws-sdk-go-v2/credentials v1.13.27/go.mod h1:syOqAek45ZXZp29HlnRS/BNgMIW6uiRmeuQsz4Qh2UE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.5 h1:kP3Me6Fy3vdi+9uHd7YLr6ewPxRL+PU6y15urfTaamU= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.5/go.mod h1:Gj7tm95r+QsDoN2Fhuz/3npQvcZbkEf5mL70n3Xfluc= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35 h1:hMUCiE3Zi5AHrRNGf5j985u0WyqI6r2NULhUfo0N/No= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35/go.mod h1:ipR5PvpSPqIqL5Mi82BxLnfMkHVbmco8kUwO2xrCi0M= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.29 h1:yOpYx+FTBdpk/g+sBU6Cb1H0U/TLEcYYp66mYqsPpcc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.29/go.mod h1:M/eUABlDbw2uVrdAn+UsI6M727qp2fxkp8K0ejcBDUY= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.36 h1:8r5m1BoAWkn0TDC34lUculryf7nUF25EgIMdjvGCkgo= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.36/go.mod h1:Rmw2M1hMVTwiUhjwMoIBFWFJMhvJbct06sSidxInkhY= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.29 h1:IiDolu/eLmuB18DRZibj77n1hHQT7z12jnGO7Ze3pLc= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.29/go.mod h1:fDbkK4o7fpPXWn8YAPmTieAMuB9mk/VgvW64uaUqxd4= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.13 h1:sWDv7cMITPcZ21QdreULwxOOAmE05JjEsT6fCDtDA9k= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.13/go.mod h1:DfX0sWuT46KpcqbMhJ9QWtxAIP1VozkDWf8VAkByjYY= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.13 h1:BFubHS/xN5bjl818QaroN6mQdjneYQ+AOx44KNXlyH4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.13/go.mod h1:BzqsVVFduubEmzrVtUFQQIQdFqvUItF8XUq2EnS8Wog= +github.com/aws/aws-sdk-go-v2/service/sts v1.19.3 h1:e5mnydVdCVWxP+5rPAGi2PYxC7u2OZgH1ypC114H04U= +github.com/aws/aws-sdk-go-v2/service/sts v1.19.3/go.mod h1:yVGZA1CPkmUhBdA039jXNJJG7/6t+G+EBWmFq23xqnY= +github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= +github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/eapache/go-resiliency v1.6.0 h1:CqGDTLtpwuWKn6Nj3uNUdflaq+/kIPsg0gfNzHton30= -github.com/eapache/go-resiliency v1.6.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= +github.com/eapache/go-resiliency v1.7.0 h1:n3NRTnBn5N0Cbi/IeOHuQn9s2UwVUH7Ga0ZWcP+9JTA= +github.com/eapache/go-resiliency v1.7.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 h1:Oy0F4ALJ04o5Qqpdz8XLIpNA3WM/iSIXqxtqo7UGVws= github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -46,22 +72,12 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= -github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= -github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= -github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -78,8 +94,8 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= @@ -87,23 +103,19 @@ github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3k github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= -go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -111,20 +123,20 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= +golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -133,8 +145,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= diff --git a/internal/kafka/scram_client.go b/internal/kafka/scram_client.go index 0c3f83d8baaf..269dcfbd7713 100644 --- a/internal/kafka/scram_client.go +++ b/internal/kafka/scram_client.go @@ -34,7 +34,6 @@ func (x *XDGSCRAMClient) Begin(userName, password, authzID string) (err error) { // completes is also an error. func (x *XDGSCRAMClient) Step(challenge string) (response string, err error) { return x.ClientConversation.Step(challenge) - } // Done returns true if the conversation is completed or has errored. diff --git a/internal/kubelet/client.go b/internal/kubelet/client.go index df16aa3b3c84..eda1b97c2d25 100644 --- a/internal/kubelet/client.go +++ b/internal/kubelet/client.go @@ -101,7 +101,6 @@ func (p *kubeConfigClientProvider) BuildClient() (Client, error) { tok: nil, logger: p.logger, }, nil - } type readOnlyClientProvider struct { @@ -121,7 +120,6 @@ func (p *readOnlyClientProvider) BuildClient() (Client, error) { tok: nil, logger: p.logger, }, nil - } type tlsClientProvider struct { @@ -296,7 +294,7 @@ func (c *clientImpl) buildReq(p string) (*http.Request, error) { if err != nil { return nil, err } - req, err := http.NewRequest("GET", reqURL, nil) + req, err := http.NewRequest(http.MethodGet, reqURL, nil) if err != nil { return nil, err } diff --git a/internal/kubelet/client_test.go b/internal/kubelet/client_test.go index 0e8ce71caab2..952de83db29b 100644 --- a/internal/kubelet/client_test.go +++ b/internal/kubelet/client_test.go @@ -28,9 +28,11 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig" ) -const certPath = "./testdata/testcert.crt" -const keyFile = "./testdata/testkey.key" -const errSignedByUnknownCA = "tls: failed to verify certificate: x509: certificate signed by unknown authority" +const ( + certPath = "./testdata/testcert.crt" + keyFile = "./testdata/testkey.key" + errSignedByUnknownCA = "tls: failed to verify certificate: x509: certificate signed by unknown authority" +) func TestClient(t *testing.T) { tr := &fakeRoundTripper{} @@ -45,9 +47,9 @@ func TestClient(t *testing.T) { require.Equal(t, "hello", string(resp)) require.True(t, tr.closed) require.Equal(t, baseURL+"/foo", tr.url) - require.Equal(t, 1, len(tr.header)) + require.Len(t, tr.header, 1) require.Equal(t, "application/json", tr.header["Content-Type"][0]) - require.Equal(t, "GET", tr.method) + require.Equal(t, http.MethodGet, tr.method) } func TestNewTLSClientProvider(t *testing.T) { @@ -66,7 +68,7 @@ func TestNewTLSClientProvider(t *testing.T) { require.NoError(t, err) c := client.(*clientImpl) tcc := c.httpClient.Transport.(*http.Transport).TLSClientConfig - require.Equal(t, 1, len(tcc.Certificates)) + require.Len(t, tcc.Certificates, 1) require.NotNil(t, tcc.RootCAs) } @@ -105,9 +107,9 @@ func TestDefaultTLSClient(t *testing.T) { func TestSvcAcctClient(t *testing.T) { server := httptest.NewUnstartedServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { // Check if call is authenticated using token from test file - require.Equal(t, req.Header.Get("Authorization"), "Bearer s3cr3t") + assert.Equal(t, "Bearer s3cr3t", req.Header.Get("Authorization")) _, err := rw.Write([]byte(`OK`)) - require.NoError(t, err) + assert.NoError(t, err) })) cert, err := tls.LoadX509KeyPair(certPath, keyFile) require.NoError(t, err) @@ -174,11 +176,11 @@ func TestNewKubeConfigClient(t *testing.T) { t.Run(tt.name, func(t *testing.T) { server := httptest.NewUnstartedServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { // Check if call is authenticated using provided kubeconfig - require.Equal(t, req.Header.Get("Authorization"), "Bearer my-token") - require.Equal(t, "/api/v1/nodes/nodename/proxy/", req.URL.EscapedPath()) + assert.Equal(t, "Bearer my-token", req.Header.Get("Authorization")) + assert.Equal(t, "/api/v1/nodes/nodename/proxy/", req.URL.EscapedPath()) // Send response to be tested _, err := rw.Write([]byte(`OK`)) - require.NoError(t, err) + assert.NoError(t, err) })) server.StartTLS() defer server.Close() diff --git a/internal/kubelet/go.mod b/internal/kubelet/go.mod index f2dc2ef9ec50..1e9d4e5e5430 100644 --- a/internal/kubelet/go.mod +++ b/internal/kubelet/go.mod @@ -1,31 +1,32 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/internal/kubelet -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/config/configtls v0.102.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/config/configtls v1.22.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 - k8s.io/client-go v0.29.3 + k8s.io/client-go v0.31.3 ) require ( - github.com/davecgh/go-spew v1.1.1 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.3.0 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/swag v0.22.3 // indirect + github.com/go-openapi/swag v0.22.4 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.4.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/imdario/mergo v0.3.11 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect @@ -35,29 +36,29 @@ require ( github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/openshift/api v3.9.0+incompatible // indirect github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/spf13/pflag v1.0.5 // indirect - go.opentelemetry.io/collector/config/configopaque v1.9.0 // indirect + github.com/x448/float16 v0.8.4 // indirect + go.opentelemetry.io/collector/config/configopaque v1.22.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/oauth2 v0.14.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/term v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/net v0.26.0 // indirect + golang.org/x/oauth2 v0.21.0 // indirect + golang.org/x/sys v0.21.0 // indirect + golang.org/x/term v0.21.0 // indirect + golang.org/x/text v0.16.0 // indirect golang.org/x/time v0.4.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.33.0 // indirect + google.golang.org/protobuf v1.34.2 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.29.3 // indirect - k8s.io/apimachinery v0.29.3 // indirect - k8s.io/klog/v2 v2.110.1 // indirect - k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect - k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + k8s.io/api v0.31.3 // indirect + k8s.io/apimachinery v0.31.3 // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect + k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/common => ../../internal/common diff --git a/internal/kubelet/go.sum b/internal/kubelet/go.sum index 0dc4edb4e445..a83b5c32a156 100644 --- a/internal/kubelet/go.sum +++ b/internal/kubelet/go.sum @@ -41,8 +41,9 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= @@ -54,16 +55,18 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= -github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= @@ -76,12 +79,11 @@ github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8 github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= +github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -130,13 +132,13 @@ github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OI github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af h1:kmjWCqn2qkEml422C2Rrd27c3VGxi6a/6HNq8QmHRKM= +github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= @@ -159,12 +161,6 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= -github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= -github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= -github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -180,11 +176,7 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= @@ -202,12 +194,12 @@ github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= -github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= +github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= +github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg= -github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/openshift/api v0.0.0-20180801171038-322a19404e37 h1:05irGU4HK4IauGGDbsk+ZHrm1wOzMLYjMlfaiqMrBYc= github.com/openshift/api v0.0.0-20180801171038-322a19404e37/go.mod h1:dh9o4Fs58gpFXGSYfnVxGR9PnV53I8TW84pQaJDdGiY= github.com/openshift/api v0.0.0-20210521075222-e273a339932a/go.mod h1:izBmoXbUu3z5kUa4FjZhvekTsyzIWiOoaIgJiZBBMQs= @@ -216,12 +208,13 @@ github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142 h1:ZHRIMCFIJN1 github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142/go.mod h1:fjS8r9mqDVsPb5td3NehsNOAWa4uiFkYEfVZioQ2gH0= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -236,20 +229,20 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -318,15 +311,15 @@ golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= -golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= +golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= +golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -360,21 +353,21 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= +golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -416,8 +409,8 @@ golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= -golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -437,8 +430,6 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -474,8 +465,8 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -504,28 +495,28 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.21.1/go.mod h1:FstGROTmsSHBarKc8bylzXih8BLNYTiS3TZcsoEDg2s= -k8s.io/api v0.29.3 h1:2ORfZ7+bGC3YJqGpV0KSDDEVf8hdGQ6A03/50vj8pmw= -k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80= +k8s.io/api v0.31.3 h1:umzm5o8lFbdN/hIXbrK9oRpOproJO62CV1zqxXrLgk8= +k8s.io/api v0.31.3/go.mod h1:UJrkIp9pnMOI9K2nlL6vwpxRzzEX5sWgn8kGQe92kCE= k8s.io/apimachinery v0.21.1/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY= -k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= -k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= +k8s.io/apimachinery v0.31.3 h1:6l0WhcYgasZ/wk9ktLq5vLaoXJJr5ts6lkaQzgeYPq4= +k8s.io/apimachinery v0.31.3/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= k8s.io/client-go v0.21.1/go.mod h1:/kEw4RgW+3xnBGzvp9IWxKSNA+lXn3A7AuH3gdOAzLs= -k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg= -k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= +k8s.io/client-go v0.31.3 h1:CAlZuM+PH2cm+86LOBemaJI/lQ5linJ6UFxKX/SoG+4= +k8s.io/client-go v0.31.3/go.mod h1:2CgjPUTpv3fE5dNygAr2NcM8nhHzXvxB8KL5gYc3kJs= k8s.io/code-generator v0.21.1/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= -k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= 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= @@ -536,5 +527,5 @@ sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/internal/metadataproviders/aws/ec2/metadata_test.go b/internal/metadataproviders/aws/ec2/metadata_test.go index 39fb4c43f0a1..1cdb0f53c497 100644 --- a/internal/metadataproviders/aws/ec2/metadata_test.go +++ b/internal/metadataproviders/aws/ec2/metadata_test.go @@ -39,8 +39,7 @@ func TestMetadataProviderGetError(t *testing.T) { } func TestMetadataProvider_available(t *testing.T) { - type fields struct { - } + type fields struct{} type args struct { ctx context.Context sess *session.Session diff --git a/internal/metadataproviders/azure/metadata.go b/internal/metadataproviders/azure/metadata.go index d64576e1efb6..820974ff36b0 100644 --- a/internal/metadataproviders/azure/metadata.go +++ b/internal/metadataproviders/azure/metadata.go @@ -82,7 +82,7 @@ func (p *azureProviderImpl) Metadata(ctx context.Context) (*ComputeMetadata, err return nil, fmt.Errorf("failed to query Azure IMDS: %w", err) } defer resp.Body.Close() - if resp.StatusCode != 200 { + if resp.StatusCode != http.StatusOK { //lint:ignore ST1005 Azure is a capitalized proper noun here return nil, fmt.Errorf("Azure IMDS replied with status code: %s", resp.Status) } diff --git a/internal/metadataproviders/go.mod b/internal/metadataproviders/go.mod index 528e1e63d2c3..1c0d570b7463 100644 --- a/internal/metadataproviders/go.mod +++ b/internal/metadataproviders/go.mod @@ -1,21 +1,22 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders -go 1.21.0 +go 1.22.0 require ( github.com/Showmax/go-fqdn v1.0.0 - github.com/aws/aws-sdk-go v1.53.11 - github.com/docker/docker v25.0.5+incompatible - github.com/hashicorp/consul/api v1.28.3 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel v1.27.0 - go.opentelemetry.io/otel/sdk v1.27.0 + github.com/aws/aws-sdk-go v1.55.5 + github.com/docker/docker v27.4.0+incompatible + github.com/hashicorp/consul/api v1.30.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig v0.116.0 + github.com/shirou/gopsutil/v4 v4.24.10 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/semconv v0.116.0 + go.opentelemetry.io/otel v1.32.0 + go.opentelemetry.io/otel/sdk v1.32.0 go.uber.org/goleak v1.3.0 - k8s.io/api v0.29.3 - k8s.io/apimachinery v0.29.3 - k8s.io/client-go v0.29.3 + k8s.io/api v0.31.3 + k8s.io/apimachinery v0.31.3 + k8s.io/client-go v0.31.3 ) require ( @@ -26,22 +27,23 @@ require ( github.com/distribution/reference v0.5.0 // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.4.0 // indirect + github.com/ebitengine/purego v0.8.1 // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect - github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/fatih/color v1.16.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/swag v0.22.3 // indirect + github.com/go-openapi/swag v0.22.4 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/hashicorp/consul/proto-public v0.6.1 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-hclog v1.5.0 // indirect @@ -54,11 +56,13 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect @@ -70,34 +74,39 @@ require ( github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/objx v0.5.2 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect + github.com/x448/float16 v0.8.4 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.27.0 // indirect - go.opentelemetry.io/otel/trace v1.27.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/oauth2 v0.18.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/term v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect + golang.org/x/net v0.26.0 // indirect + golang.org/x/oauth2 v0.21.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/term v0.21.0 // indirect + golang.org/x/text v0.16.0 // indirect golang.org/x/time v0.4.0 // indirect - google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240515191416-fc5f0ca64291 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + google.golang.org/grpc v1.64.1 // indirect + google.golang.org/protobuf v1.34.2 // indirect + gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools/v3 v3.2.0 // indirect - k8s.io/klog/v2 v2.110.1 // indirect - k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect - k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect + k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) retract ( diff --git a/internal/metadataproviders/go.sum b/internal/metadataproviders/go.sum index a3bc0d7ffb5e..09dc68e8f203 100644 --- a/internal/metadataproviders/go.sum +++ b/internal/metadataproviders/go.sum @@ -51,8 +51,8 @@ github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+ github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aws/aws-sdk-go v1.53.11 h1:KcmduYvX15rRqt4ZU/7jKkmDxU/G87LJ9MUI0yQJh00= -github.com/aws/aws-sdk-go v1.53.11/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= +github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= @@ -77,13 +77,15 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= -github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v27.4.0+incompatible h1:I9z7sQ5qyzO0BfAb9IMOawRkAGxhYsidKiTMcm0DU+A= +github.com/docker/docker v27.4.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/BE= +github.com/ebitengine/purego v0.8.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= @@ -92,8 +94,6 @@ github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRr github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= @@ -103,6 +103,8 @@ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2 github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -114,11 +116,12 @@ github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7 github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= @@ -131,11 +134,12 @@ github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8 github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= +github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= @@ -160,8 +164,6 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -177,6 +179,7 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -190,8 +193,8 @@ github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OI github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af h1:kmjWCqn2qkEml422C2Rrd27c3VGxi6a/6HNq8QmHRKM= +github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -204,12 +207,10 @@ github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No= github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU= -github.com/hashicorp/consul/api v1.28.3 h1:IE06LST/knnCQ+cxcvzyXRF/DetkgGhJoaOFd4l9xkk= -github.com/hashicorp/consul/api v1.28.3/go.mod h1:7AGcUFu28HkgOKD/GmsIGIFzRTmN0L02AE9Thsr2OhU= -github.com/hashicorp/consul/proto-public v0.6.1 h1:+uzH3olCrksXYWAYHKqK782CtK9scfqH+Unlw3UHhCg= -github.com/hashicorp/consul/proto-public v0.6.1/go.mod h1:cXXbOg74KBNGajC+o8RlA502Esf0R9prcoJgiOX/2Tg= -github.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU= -github.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo= +github.com/hashicorp/consul/api v1.30.0 h1:ArHVMMILb1nQv8vZSGIwwQd2gtc+oSQZ6CalyiyH2XQ= +github.com/hashicorp/consul/api v1.30.0/go.mod h1:B2uGchvaXVW2JhFoS8nqTxMD5PBykr4ebY4JWHTTeLM= +github.com/hashicorp/consul/sdk v0.16.1 h1:V8TxTnImoPD5cj0U9Spl0TUxcytjcbbJeADFF07KdHg= +github.com/hashicorp/consul/sdk v0.16.1/go.mod h1:fSXvwxB2hmh1FMZCNl6PwX0Q/1wdWtHJcZ7Ea5tns0s= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -284,6 +285,8 @@ github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= @@ -315,6 +318,8 @@ github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:F github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= @@ -337,12 +342,12 @@ github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= -github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= +github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= +github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg= -github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= @@ -366,6 +371,8 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= @@ -379,11 +386,13 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/shirou/gopsutil/v4 v4.24.10 h1:7VOzPtfw/5YDU+jLEoBwXwxJbQetULywoSV4RYY7HkM= +github.com/shirou/gopsutil/v4 v4.24.10/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= @@ -409,32 +418,39 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0 h1:t6wl9SPayj+c7lEIFgm4ooDBZVb01IhLB4InpomhRw8= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0/go.mod h1:iSDOcsnSA5INXzZtwaBPrKp/lWu/V14Dd+llD0oI2EA= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 h1:Xw8U6u2f8DK2XAkGRFV7BBLENgnTGX9i4rQRxJf+/vs= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0/go.mod h1:6KW1Fm6R/s6Z3PGXwSJN2K4eT6wQB3vXX6CVnYX9NmM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI= go.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -449,7 +465,6 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -483,7 +498,6 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -511,16 +525,15 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= -golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= +golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= +golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -529,7 +542,6 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -546,6 +558,7 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -562,29 +575,28 @@ golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= +golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -592,10 +604,8 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -639,9 +649,8 @@ golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= -golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -661,8 +670,6 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -693,8 +700,8 @@ google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/grpc v1.64.1 h1:LKtvyfbX3UGVPFcGqJ9ItpVWW6oN/2XqTxfAnwRRXiA= +google.golang.org/grpc v1.64.1/go.mod h1:hiQF4LFZelK2WKaP6W0L92zGHtiQdZxk8CrSdvyjeP0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -704,10 +711,8 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -716,6 +721,8 @@ gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= +gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= @@ -741,28 +748,28 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.21.1/go.mod h1:FstGROTmsSHBarKc8bylzXih8BLNYTiS3TZcsoEDg2s= -k8s.io/api v0.29.3 h1:2ORfZ7+bGC3YJqGpV0KSDDEVf8hdGQ6A03/50vj8pmw= -k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80= +k8s.io/api v0.31.3 h1:umzm5o8lFbdN/hIXbrK9oRpOproJO62CV1zqxXrLgk8= +k8s.io/api v0.31.3/go.mod h1:UJrkIp9pnMOI9K2nlL6vwpxRzzEX5sWgn8kGQe92kCE= k8s.io/apimachinery v0.21.1/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY= -k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= -k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= +k8s.io/apimachinery v0.31.3 h1:6l0WhcYgasZ/wk9ktLq5vLaoXJJr5ts6lkaQzgeYPq4= +k8s.io/apimachinery v0.31.3/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= k8s.io/client-go v0.21.1/go.mod h1:/kEw4RgW+3xnBGzvp9IWxKSNA+lXn3A7AuH3gdOAzLs= -k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg= -k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= +k8s.io/client-go v0.31.3 h1:CAlZuM+PH2cm+86LOBemaJI/lQ5linJ6UFxKX/SoG+4= +k8s.io/client-go v0.31.3/go.mod h1:2CgjPUTpv3fE5dNygAr2NcM8nhHzXvxB8KL5gYc3kJs= k8s.io/code-generator v0.21.1/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= -k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= 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= @@ -773,5 +780,5 @@ sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/internal/metadataproviders/internal/internal_test.go b/internal/metadataproviders/internal/internal_test.go index b569c132efe4..48db74f8bd15 100644 --- a/internal/metadataproviders/internal/internal_test.go +++ b/internal/metadataproviders/internal/internal_test.go @@ -7,7 +7,7 @@ import ( "testing" "github.com/stretchr/testify/assert" - conventions "go.opentelemetry.io/collector/semconv/v1.18.0" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" ) func TestGOOSToOsType(t *testing.T) { diff --git a/internal/metadataproviders/system/metadata.go b/internal/metadataproviders/system/metadata.go index 116ba76d9bf6..0118fdeae071 100644 --- a/internal/metadataproviders/system/metadata.go +++ b/internal/metadataproviders/system/metadata.go @@ -12,7 +12,8 @@ import ( "strings" "github.com/Showmax/go-fqdn" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + "github.com/shirou/gopsutil/v4/cpu" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/sdk/resource" @@ -69,6 +70,9 @@ type Provider interface { // HostMACs returns the host's MAC addresses HostMACs() ([]net.HardwareAddr, error) + + // CPUInfo returns the host's CPU info + CPUInfo(ctx context.Context) ([]cpu.InfoStat, error) } type systemMetadataProvider struct { @@ -195,7 +199,6 @@ func (p systemMetadataProvider) HostIPs() (ips []net.IP, err error) { ips = append(ips, ip) } - } return ips, err } @@ -216,3 +219,7 @@ func (p systemMetadataProvider) HostMACs() (macs []net.HardwareAddr, err error) } return macs, err } + +func (p systemMetadataProvider) CPUInfo(ctx context.Context) ([]cpu.InfoStat, error) { + return cpu.InfoWithContext(ctx) +} diff --git a/internal/otelarrow/Makefile b/internal/otelarrow/Makefile new file mode 100644 index 000000000000..ded7a36092dc --- /dev/null +++ b/internal/otelarrow/Makefile @@ -0,0 +1 @@ +include ../../Makefile.Common diff --git a/internal/otelarrow/admission2/README.md b/internal/otelarrow/admission2/README.md new file mode 100644 index 000000000000..9076096e2ec5 --- /dev/null +++ b/internal/otelarrow/admission2/README.md @@ -0,0 +1,32 @@ +# Admission Package + +## Overview + +The admission package provides a BoundedQueue object. This object +implements a semaphore for limiting the number of bytes admitted into +a collector pipeline. Additionally, the BoundedQueue limits the +number of bytes allowed to block on a call to `Acquire(pending int64)`. + +There are two error conditions generated within this code: + +- `rejecting request, too much pending data`: When the limit on waiting bytes its reached, this will be returned to limit the total amount waiting. +- `rejecting request, request is too large`: When an individual request exceeds the configured limit, this will be returned without acquiring or waiting. + +The BoundedQueue implements LIFO semantics. See this +[article](https://medium.com/swlh/fifo-considered-harmful-793b76f98374) +explaining why it is preferred to FIFO semantics. + +## Usage + +Create a new BoundedQueue by calling `bq := admission.NewBoundedQueue(maxLimitBytes, maxLimitWaiting)` + +Within the component call `bq.Acquire(ctx, requestSize)` which will: + +1. succeed immediately if there is enough available memory, +2. fail immediately if there are too many waiters, or +3. block until context cancelation or enough bytes becomes available. + +When the resources have been acquired successfully, a closure is +returned that, when called, will release the semaphore. When the +semaphore is released, pending waiters that can be satisfied will +acquire the resource and become unblocked. diff --git a/internal/otelarrow/admission2/boundedqueue.go b/internal/otelarrow/admission2/boundedqueue.go new file mode 100644 index 000000000000..0b5efc67fb48 --- /dev/null +++ b/internal/otelarrow/admission2/boundedqueue.go @@ -0,0 +1,208 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package admission2 // import "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/admission2" + +import ( + "container/list" + "context" + "sync" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/trace" + grpccodes "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + internalmetadata "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/internal/metadata" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/netstats" +) + +var ( + ErrTooMuchWaiting = status.Error(grpccodes.ResourceExhausted, "rejecting request, too much pending data") + ErrRequestTooLarge = status.Errorf(grpccodes.InvalidArgument, "rejecting request, request is too large") +) + +// BoundedQueue is a LIFO-oriented admission-controlled Queue. +type BoundedQueue struct { + maxLimitAdmit uint64 + maxLimitWait uint64 + tracer trace.Tracer + telemetryBuilder *internalmetadata.TelemetryBuilder + + // lock protects currentAdmitted, currentWaiting, and waiters + + lock sync.Mutex + currentAdmitted uint64 + currentWaiting uint64 + waiters *list.List // of *waiter +} + +var _ Queue = &BoundedQueue{} + +// waiter is an item in the BoundedQueue waiters list. +type waiter struct { + notify N + pending uint64 +} + +// NewBoundedQueue returns a LIFO-oriented Queue implementation which +// admits `maxLimitAdmit` bytes concurrently and allows up to +// `maxLimitWait` bytes to wait for admission. +func NewBoundedQueue(id component.ID, ts component.TelemetrySettings, maxLimitAdmit, maxLimitWait uint64) (Queue, error) { + bq := &BoundedQueue{ + maxLimitAdmit: maxLimitAdmit, + maxLimitWait: maxLimitWait, + waiters: list.New(), + tracer: ts.TracerProvider.Tracer("github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow"), + } + attr := metric.WithAttributes(attribute.String(netstats.ReceiverKey, id.String())) + telemetryBuilder, err := internalmetadata.NewTelemetryBuilder(ts, + internalmetadata.WithOtelarrowAdmissionInFlightBytesCallback(bq.inFlightCB, attr), + internalmetadata.WithOtelarrowAdmissionWaitingBytesCallback(bq.waitingCB, attr), + ) + if err != nil { + return nil, err + } + bq.telemetryBuilder = telemetryBuilder + return bq, nil +} + +func (bq *BoundedQueue) inFlightCB() int64 { + // Note, see https://github.com/open-telemetry/otel-arrow/issues/270 + bq.lock.Lock() + defer bq.lock.Unlock() + return int64(bq.currentAdmitted) +} + +func (bq *BoundedQueue) waitingCB() int64 { + // Note, see https://github.com/open-telemetry/otel-arrow/issues/270 + bq.lock.Lock() + defer bq.lock.Unlock() + return int64(bq.currentWaiting) +} + +// acquireOrGetWaiter returns with three distinct conditions depending +// on whether it was accepted, rejected, or asked to wait. +// +// - element=nil, error=nil: the fast success path +// - element=nil, error=non-nil: the fast failure path +// - element=non-nil, error=non-nil: the slow success path +func (bq *BoundedQueue) acquireOrGetWaiter(pending uint64) (*list.Element, error) { + if pending > bq.maxLimitAdmit { + // when the request will never succeed because it is + // individually over the total limit, fail fast. + return nil, ErrRequestTooLarge + } + + bq.lock.Lock() + defer bq.lock.Unlock() + + if bq.currentAdmitted+pending <= bq.maxLimitAdmit { + // the fast success path. + bq.currentAdmitted += pending + return nil, nil + } + + // since we were unable to admit, check if we can wait. + if bq.currentWaiting+pending > bq.maxLimitWait { + return nil, ErrTooMuchWaiting + } + + // otherwise we need to wait + return bq.addWaiterLocked(pending), nil +} + +// Acquire implements Queue. +func (bq *BoundedQueue) Acquire(ctx context.Context, pending uint64) (ReleaseFunc, error) { + element, err := bq.acquireOrGetWaiter(pending) + parentSpan := trace.SpanFromContext(ctx) + pendingAttr := trace.WithAttributes(attribute.Int64("pending", int64(pending))) + + if err != nil { + parentSpan.AddEvent("admission rejected (fast path)", pendingAttr) + return noopRelease, err + } else if element == nil { + parentSpan.AddEvent("admission accepted (fast path)", pendingAttr) + return bq.releaseFunc(pending), nil + } + + parentSpan.AddEvent("enter admission queue") + + ctx, span := bq.tracer.Start(ctx, "admission_blocked", pendingAttr) + defer span.End() + + waiter := element.Value.(*waiter) + + select { + case <-waiter.notify.Chan(): + parentSpan.AddEvent("admission accepted (slow path)", pendingAttr) + return bq.releaseFunc(pending), nil + + case <-ctx.Done(): + bq.lock.Lock() + defer bq.lock.Unlock() + + if waiter.notify.HasBeenNotified() { + // We were also admitted, which can happen + // concurrently with cancellation. Make sure + // to release since no one else will do it. + bq.releaseLocked(pending) + } else { + // Remove ourselves from the list of waiters + // so that we can't be admitted in the future. + bq.removeWaiterLocked(pending, element) + bq.admitWaitersLocked() + } + + parentSpan.AddEvent("admission rejected (canceled)", pendingAttr) + return noopRelease, status.Error(grpccodes.Canceled, context.Cause(ctx).Error()) + } +} + +func (bq *BoundedQueue) admitWaitersLocked() { + for bq.waiters.Len() != 0 { + // Ensure there is enough room to admit the next waiter. + element := bq.waiters.Back() + waiter := element.Value.(*waiter) + if bq.currentAdmitted+waiter.pending > bq.maxLimitAdmit { + // Returning means continuing to wait for the + // most recent arrival to get service by another release. + return + } + + // Release the next waiter and tell it that it has been admitted. + bq.removeWaiterLocked(waiter.pending, element) + bq.currentAdmitted += waiter.pending + + waiter.notify.Notify() + } +} + +func (bq *BoundedQueue) addWaiterLocked(pending uint64) *list.Element { + bq.currentWaiting += pending + return bq.waiters.PushBack(&waiter{ + pending: pending, + notify: newNotification(), + }) +} + +func (bq *BoundedQueue) removeWaiterLocked(pending uint64, element *list.Element) { + bq.currentWaiting -= pending + bq.waiters.Remove(element) +} + +func (bq *BoundedQueue) releaseLocked(pending uint64) { + bq.currentAdmitted -= pending + bq.admitWaitersLocked() +} + +func (bq *BoundedQueue) releaseFunc(pending uint64) ReleaseFunc { + return func() { + bq.lock.Lock() + defer bq.lock.Unlock() + + bq.releaseLocked(pending) + } +} diff --git a/internal/otelarrow/admission2/boundedqueue_test.go b/internal/otelarrow/admission2/boundedqueue_test.go new file mode 100644 index 000000000000..177d9b732718 --- /dev/null +++ b/internal/otelarrow/admission2/boundedqueue_test.go @@ -0,0 +1,431 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package admission2 + +import ( + "context" + "fmt" + "sync" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/config/configtelemetry" + sdkmetric "go.opentelemetry.io/otel/sdk/metric" + "go.opentelemetry.io/otel/sdk/metric/metricdata" + "go.opentelemetry.io/otel/sdk/resource" + "google.golang.org/grpc/codes" + grpccodes "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/netstats" +) + +const ( + expectScope = "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow" + expectInFlightName = "otelcol_otelarrow_admission_in_flight_bytes" + expectWaitingName = "otelcol_otelarrow_admission_waiting_bytes" +) + +type bqTest struct { + t *testing.T + reader *sdkmetric.ManualReader + provider *sdkmetric.MeterProvider + *BoundedQueue +} + +func newBQTest(t *testing.T, maxAdmit, maxWait uint64) bqTest { + settings := componenttest.NewNopTelemetrySettings() + + reader := sdkmetric.NewManualReader() + provider := sdkmetric.NewMeterProvider( + sdkmetric.WithResource(resource.Empty()), + sdkmetric.WithReader(reader), + ) + settings.MeterProvider = provider + settings.MetricsLevel = configtelemetry.LevelDetailed + + bq, err := NewBoundedQueue(component.MustNewID("admission_testing"), settings, maxAdmit, maxWait) + require.NoError(t, err) + return bqTest{ + t: t, + reader: reader, + provider: provider, + BoundedQueue: bq.(*BoundedQueue), + } +} + +func (bq *bqTest) startWaiter(ctx context.Context, size uint64, relp *ReleaseFunc) N { + n := newNotification() + go func() { + var err error + *relp, err = bq.Acquire(ctx, size) + require.NoError(bq.t, err) + n.Notify() + }() + return n +} + +func (bq *bqTest) waitForPending(admitted, waiting uint64) { + require.Eventually(bq.t, func() bool { + bq.lock.Lock() + defer bq.lock.Unlock() + return bq.currentAdmitted == admitted && bq.currentWaiting == waiting + }, time.Second, 20*time.Millisecond) +} + +func mkRepeat(x uint64, n int) []uint64 { + if n == 0 { + return nil + } + return append(mkRepeat(x, n-1), x) +} + +func mkRange(from, to uint64) []uint64 { + if from > to { + return nil + } + return append([]uint64{from}, mkRange(from+1, to)...) +} + +func TestBoundedQueueLimits(t *testing.T) { + for _, test := range []struct { + name string + maxLimitAdmit uint64 + maxLimitWait uint64 + expectAcquired [2]int64 + requestSizes []uint64 + timeout time.Duration + expectErrs map[string]int + }{ + { + name: "simple_no_waiters_25", + maxLimitAdmit: 1000, + maxLimitWait: 0, + requestSizes: mkRepeat(25, 40), + expectAcquired: [2]int64{1000, 1000}, + timeout: 0, + expectErrs: map[string]int{}, + }, + { + name: "simple_no_waiters_1", + maxLimitAdmit: 1000, + maxLimitWait: 0, + requestSizes: mkRepeat(1, 1000), + expectAcquired: [2]int64{1000, 1000}, + timeout: 0, + expectErrs: map[string]int{}, + }, + { + name: "without_waiting_remainder", + maxLimitAdmit: 1000, + maxLimitWait: 0, + requestSizes: mkRepeat(30, 40), + expectAcquired: [2]int64{990, 990}, + timeout: 0, + expectErrs: map[string]int{ + // 7 failures with a remainder of 10 + // 30 * (40 - 7) = 990 + ErrTooMuchWaiting.Error(): 7, + }, + }, + { + name: "without_waiting_complete", + maxLimitAdmit: 1000, + maxLimitWait: 0, + requestSizes: append(mkRepeat(30, 40), 10), + expectAcquired: [2]int64{1000, 1000}, + timeout: 0, + expectErrs: map[string]int{ + // 30*33+10 succeed, 7 failures (as above) + ErrTooMuchWaiting.Error(): 7, + }, + }, + { + name: "with_waiters_timeout", + maxLimitAdmit: 1000, + maxLimitWait: 1000, + requestSizes: mkRepeat(20, 100), + expectAcquired: [2]int64{1000, 1000}, + timeout: time.Second, + expectErrs: map[string]int{ + // 20*50=1000 is half of the requests timing out + status.Error(grpccodes.Canceled, context.DeadlineExceeded.Error()).Error(): 50, + }, + }, + { + name: "with_size_exceeded", + maxLimitAdmit: 1000, + maxLimitWait: 2000, + requestSizes: []uint64{1001}, + expectAcquired: [2]int64{0, 0}, + timeout: 0, + expectErrs: map[string]int{ + ErrRequestTooLarge.Error(): 1, + }, + }, + { + name: "mixed_sizes", + maxLimitAdmit: 45, // 45 is the exact sum of request sizes + maxLimitWait: 0, + requestSizes: mkRange(1, 9), + expectAcquired: [2]int64{45, 45}, + timeout: 0, + expectErrs: map[string]int{}, + }, + { + name: "too_many_mixed_sizes", + maxLimitAdmit: 44, // all but one request will succeed + maxLimitWait: 0, + requestSizes: mkRange(1, 9), + // worst case is the size=9 fails, so minimum is 44-9+1 + expectAcquired: [2]int64{36, 44}, + timeout: 0, + expectErrs: map[string]int{ + ErrTooMuchWaiting.Error(): 1, + }, + }, + } { + t.Run(test.name, func(t *testing.T) { + bq := newBQTest(t, test.maxLimitAdmit, test.maxLimitWait) + ctx := context.Background() + + if test.timeout != 0 { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, test.timeout) + defer cancel() + } + + numRequests := len(test.requestSizes) + allErrors := make(chan error, numRequests) + + releaseChan := make(chan struct{}) + var wait1 sync.WaitGroup + var wait2 sync.WaitGroup + + wait1.Add(numRequests) + wait2.Add(numRequests) + + for _, requestSize := range test.requestSizes { + go func() { + release, err := bq.Acquire(ctx, requestSize) + allErrors <- err + + wait1.Done() + + <-releaseChan + + release() + + wait2.Done() + }() + } + + wait1.Wait() + + // The in-flight bytes are in-range, none waiting. + inflight, waiting := bq.verifyMetrics(t) + require.LessOrEqual(t, test.expectAcquired[0], inflight) + require.GreaterOrEqual(t, test.expectAcquired[1], inflight) + require.Equal(t, int64(0), waiting) + + close(releaseChan) + + wait2.Wait() + + close(allErrors) + + errCounts := map[string]int{} + + for err := range allErrors { + if err == nil { + continue + } + errCounts[err.Error()]++ + } + + require.Equal(t, test.expectErrs, errCounts) + + // Make sure we can allocate the whole limit at end-of-test. + release, err := bq.Acquire(ctx, test.maxLimitAdmit) + assert.NoError(t, err) + release() + + // and the final state is all 0. + bq.waitForPending(0, 0) + + // metrics are zero + inflight, waiting = bq.verifyMetrics(t) + require.Equal(t, int64(0), inflight) + require.Equal(t, int64(0), waiting) + }) + } +} + +func (bq bqTest) verifyPoint(t *testing.T, m metricdata.Metrics) int64 { + switch a := m.Data.(type) { + case metricdata.Sum[int64]: + require.Len(t, a.DataPoints, 1) + dp := a.DataPoints[0] + for _, attr := range dp.Attributes.ToSlice() { + if attr.Key == netstats.ReceiverKey && attr.Value.AsString() == "admission_testing" { + return dp.Value + } + } + t.Errorf("point value not found: %v", m.Data) + default: + t.Errorf("incorrect metric data type: %T", m.Data) + } + return -1 +} + +func (bq bqTest) verifyMetrics(t *testing.T) (inflight int64, waiting int64) { + inflight = -1 + waiting = -1 + + var rm metricdata.ResourceMetrics + require.NoError(t, bq.reader.Collect(context.Background(), &rm)) + + for _, sm := range rm.ScopeMetrics { + if sm.Scope.Name != expectScope { + continue + } + for _, m := range sm.Metrics { + switch m.Name { + case expectInFlightName: + inflight = bq.verifyPoint(t, m) + case expectWaitingName: + waiting = bq.verifyPoint(t, m) + } + } + } + return +} + +func TestBoundedQueueLIFO(t *testing.T) { + const maxAdmit = 10 + + for _, firstAcquire := range mkRange(2, 8) { + for _, firstWait := range mkRange(2, 8) { + t.Run(fmt.Sprint(firstAcquire, ",", firstWait), func(t *testing.T) { + t.Parallel() + + bq := newBQTest(t, maxAdmit, maxAdmit) + ctx := context.Background() + + // Fill the queue + relFirst, err := bq.Acquire(ctx, firstAcquire) + require.NoError(t, err) + bq.waitForPending(firstAcquire, 0) + + relSecond, err := bq.Acquire(ctx, maxAdmit-firstAcquire-1) + require.NoError(t, err) + bq.waitForPending(maxAdmit-1, 0) + + relOne, err := bq.Acquire(ctx, 1) + require.NoError(t, err) + bq.waitForPending(maxAdmit, 0) + + // Create two half-size waiters + var relW0 ReleaseFunc + notW0 := bq.startWaiter(ctx, firstWait, &relW0) + bq.waitForPending(maxAdmit, firstWait) + + var relW1 ReleaseFunc + secondWait := maxAdmit - firstWait + notW1 := bq.startWaiter(ctx, secondWait, &relW1) + bq.waitForPending(maxAdmit, maxAdmit) + + // The in-flight and waiting bytes are counted. + inflight, waiting := bq.verifyMetrics(t) + require.Equal(t, int64(maxAdmit), inflight) + require.Equal(t, int64(maxAdmit), waiting) + + relFirst() + + // early is true when releasing the first acquired + // will not make enough room for the first waiter + early := firstAcquire < secondWait + if early { + relSecond() + } + + // Expect notifications in LIFO order, i.e., W1 before W0. + select { + case <-notW0.Chan(): + t.Fatalf("FIFO order -- incorrect") + case <-notW1.Chan(): + if !early { + relSecond() + } + } + relOne() + + <-notW0.Chan() + + relW0() + relW1() + + bq.waitForPending(0, 0) + + inflight, waiting = bq.verifyMetrics(t) + require.Equal(t, int64(0), inflight) + require.Equal(t, int64(0), waiting) + }) + } + } +} + +func TestBoundedQueueCancelation(t *testing.T) { + // this test attempts to exercise the race condition between + // the Acquire slow path and context cancelation. + const ( + repetition = 100 + maxAdmit = 10 + ) + bq := newBQTest(t, maxAdmit, maxAdmit) + + for number := range repetition { + ctx, cancel := context.WithCancel(context.Background()) + + tester := func() { + // This acquire either succeeds or is canceled. + testrel, err := bq.Acquire(ctx, maxAdmit) + defer testrel() + if err == nil { + return + } + serr, ok := status.FromError(err) + require.True(t, ok, "has gRPC status") + require.Equal(t, codes.Canceled, serr.Code()) + } + + release, err := bq.Acquire(ctx, maxAdmit) + require.NoError(t, err) + + go tester() + + if number%2 == 0 { + go cancel() + go release() + } else { + go release() + go cancel() + } + + bq.waitForPending(0, 0) + } +} + +func TestBoundedQueueNoop(t *testing.T) { + nq := NewUnboundedQueue() + for _, i := range mkRange(1, 100) { + rel, err := nq.Acquire(context.Background(), i<<20) + require.NoError(t, err) + defer rel() + } +} diff --git a/internal/otelarrow/admission2/controller.go b/internal/otelarrow/admission2/controller.go new file mode 100644 index 000000000000..6999a10838e9 --- /dev/null +++ b/internal/otelarrow/admission2/controller.go @@ -0,0 +1,56 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package admission2 // import "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/admission2" + +import ( + "context" +) + +// Queue is a weighted admission queue interface. +type Queue interface { + // Acquire asks the controller to admit the caller. + // + // The weight parameter specifies how large of an admission to make. + // This might be used on the bytes of request (for example) to differentiate + // between large and small requests. + // + // Admit will return when one of the following events occurs: + // + // (1) admission is allowed, or + // (2) the provided ctx becomes canceled, or + // (3) there are so many existing waiters that the + // controller decides to reject this caller without + // admitting it. + // + // In case (1), the return value will be a non-nil + // ReleaseFunc. The caller must invoke it after it is finished + // with the resource being guarded by the admission + // controller. + // + // In case (2), the return value will be a Cancelled or + // DeadlineExceeded error. + // + // In case (3), the return value will be a ResourceExhausted + // error. + Acquire(ctx context.Context, weight uint64) (ReleaseFunc, error) +} + +// ReleaseFunc is returned by Acquire when the Acquire() was admitted. +type ReleaseFunc func() + +type noopController struct{} + +var _ Queue = noopController{} + +// NewUnboundedQueue returns a no-op implementation of the Queue interface. +func NewUnboundedQueue() Queue { + return noopController{} +} + +func noopRelease() {} + +// Acquire implements Queue. +func (noopController) Acquire(_ context.Context, _ uint64) (ReleaseFunc, error) { + return noopRelease, nil +} diff --git a/internal/otelarrow/admission2/notification.go b/internal/otelarrow/admission2/notification.go new file mode 100644 index 000000000000..efbf66143548 --- /dev/null +++ b/internal/otelarrow/admission2/notification.go @@ -0,0 +1,42 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package admission2 // import "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/admission2" + +// notification.N is a minimal Go version of absl::Notification: +// +// https://github.com/abseil/abseil-cpp/blob/master/absl/synchronization/notification.h +// +// Use New() to construct a notification object (the zero value is not +// usable). +type N struct { + c chan struct{} +} + +func newNotification() N { + return N{c: make(chan struct{})} +} + +func (n *N) Notify() { + close(n.c) +} + +func (n *N) HasBeenNotified() bool { + select { + case <-n.c: + return true + default: + return false + } +} + +func (n *N) WaitForNotification() { + <-n.c +} + +// Chan allows a caller to wait for the notification as part of a +// select statement. Outside of a select statement, prefer writing +// WaitForNotification(). +func (n *N) Chan() <-chan struct{} { + return n.c +} diff --git a/internal/otelarrow/admission2/notification_test.go b/internal/otelarrow/admission2/notification_test.go new file mode 100644 index 000000000000..1e66d8445a41 --- /dev/null +++ b/internal/otelarrow/admission2/notification_test.go @@ -0,0 +1,43 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package admission2 + +import ( + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestNotification(t *testing.T) { + require := require.New(t) + + start := newNotification() + require.False(start.HasBeenNotified()) + + done := make([]N, 5) + for i := 0; i < 5; i++ { + done[i] = newNotification() + go func(i int) { + start.WaitForNotification() + done[i].Notify() + }(i) + } + + // None of the goroutines can make progress until we notify + // start. + for now := time.Now(); time.Now().Before(now.Add(100 * time.Millisecond)); { + for _, n := range done { + require.False(n.HasBeenNotified()) + } + } + + start.Notify() + + // Now the goroutines can finish. + for _, n := range done { + n.WaitForNotification() + require.True(n.HasBeenNotified()) + } +} diff --git a/internal/otelarrow/compression/README.md b/internal/otelarrow/compression/README.md new file mode 100644 index 000000000000..583bf2398e56 --- /dev/null +++ b/internal/otelarrow/compression/README.md @@ -0,0 +1,18 @@ +# Compression configuration package + +## Overview + +This package provides a mechanism for configuring the static +compressors registered with gRPC for the Zstd compression library. +This enables OpenTelemetry Collector components to control all aspects +of Zstd configuration for both encoding and decoding. + +## Usage + +Embed the `EncoderConfig` or `DecoderConfig` object into the component +configuration struct. Compression levels 1..10 are supported via +static compressor objects, registered with names "zstdarrow1", +"zstdarrow10" corresponding with Zstd level. Level-independent +settings are modified using `SetEncoderConfig` or `SetDecoderConfig`. + +For exporters, use `EncoderConfig.CallOption()` at the gRPC call site. diff --git a/internal/otelarrow/compression/zstd/mru.go b/internal/otelarrow/compression/zstd/mru.go new file mode 100644 index 000000000000..930692418b19 --- /dev/null +++ b/internal/otelarrow/compression/zstd/mru.go @@ -0,0 +1,106 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package zstd // import "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/compression/zstd" + +import ( + "sync" + "time" +) + +// mru is a freelist whose two main benefits compared to sync.Pool are: +// +// - It doesn't perform any per-CPU caching; it has only a single +// cache. The cache is modeled as a stack, meaning that the most +// recently used item is always the next to be used. (Hence the name +// MRU.) +// +// - It isn't cleared when GC runs. Instead, items that haven't been used +// in a long time (1min) are released. +// +// An MRU freelist is most useful when the objects being freelisted are +// sufficiently valuable, or expensive to create, that they are worth keeping +// across GC passes. The drawbacks are that MRU isn't as performant under +// heavy concurrent access as sync.Pool, and that its sizing logic (1min TTL) +// is less sophisticated than sync.Pool's. +// +// A zero-initialized MRU is safe to use. Threadsafe. +type mru[T generational] struct { + mu sync.Mutex + reset Gen + freelist []T + putTimes []time.Time // putTimes[i] is when freelist[i] was Put() + zero T +} + +// Gen is the reset time. +type Gen time.Time + +type generational interface { + // generation uses monotonic time + generation() Gen +} + +// TTL is modified in testing. +var TTL = time.Minute + +// Get returns an object from the freelist. If the list is empty, the return +// value is the zero value of T. +func (mru *mru[T]) Get() (T, Gen) { + mru.mu.Lock() + defer mru.mu.Unlock() + + if n := len(mru.freelist); n > 0 { + ret := mru.freelist[n-1] + mru.freelist[n-1] = mru.zero // Allow GC to occur. + mru.freelist = mru.freelist[:n-1] + mru.putTimes = mru.putTimes[:n-1] + return ret, mru.reset + } + + return mru.zero, mru.reset +} + +func before(a, b Gen) bool { + return time.Time(a).Before(time.Time(b)) +} + +func (mru *mru[T]) Put(item T) { + mru.mu.Lock() + defer mru.mu.Unlock() + + if before(item.generation(), mru.reset) { + return + } + + now := time.Now() + + mru.freelist = append(mru.freelist, item) + mru.putTimes = append(mru.putTimes, now) + + // Evict any objects that haven't been touched recently. + for len(mru.putTimes) > 0 && now.Sub(mru.putTimes[0]) >= TTL { + // Shift values by one index in the slice, to preserve capacity. + l := len(mru.freelist) + copy(mru.freelist[0:l-1], mru.freelist[1:]) + copy(mru.putTimes[0:l-1], mru.putTimes[1:]) + mru.freelist[l-1] = mru.zero // Allow GC to occur. + mru.freelist = mru.freelist[:l-1] + mru.putTimes = mru.putTimes[:l-1] + } +} + +func (mru *mru[T]) Size() int { + mru.mu.Lock() + defer mru.mu.Unlock() + return len(mru.putTimes) +} + +func (mru *mru[T]) Reset() Gen { + mru.mu.Lock() + defer mru.mu.Unlock() + mru.reset = Gen(time.Now()) + mru.freelist = nil + mru.putTimes = nil + return mru.reset +} diff --git a/internal/otelarrow/compression/zstd/mru_test.go b/internal/otelarrow/compression/zstd/mru_test.go new file mode 100644 index 000000000000..d21038eb1d6d --- /dev/null +++ b/internal/otelarrow/compression/zstd/mru_test.go @@ -0,0 +1,90 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package zstd + +import ( + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +type gint struct { + value int + Gen +} + +func TestMRUGet(t *testing.T) { + defer resetTest() + + var m mru[*gint] + const cnt = 5 + + v, g := m.Get() + require.Nil(t, v) + + for i := 0; i < cnt; i++ { + p := &gint{ + value: i + 1, + Gen: g, + } + m.Put(p) + } + + for i := 0; i < cnt; i++ { + v, _ = m.Get() + require.Equal(t, 5-i, v.value) + } + + v, _ = m.Get() + require.Nil(t, v) +} + +func TestMRUPut(t *testing.T) { + defer resetTest() + + var m mru[*gint] + const cnt = 5 + + // Use zero TTL => no freelist + TTL = 0 + + g := m.Reset() + + for i := 0; i < cnt; i++ { + p := &gint{ + value: i + 1, + Gen: g, + } + m.Put(p) + } + require.Equal(t, 0, m.Size()) +} + +func TestMRUReset(t *testing.T) { + defer resetTest() + + var m mru[*gint] + + g := m.Reset() + + m.Put(&gint{ + Gen: g, + }) + require.Equal(t, 1, m.Size()) + + // Ensure the monotonic clock has has advanced before resetting. + for time.Since(time.Time(g)) <= 0 { + time.Sleep(10 * time.Millisecond) + } + + m.Reset() + require.Equal(t, 0, m.Size()) + + // This doesn't take because its generation is before the reset. + m.Put(&gint{ + Gen: g, + }) + require.Equal(t, 0, m.Size()) +} diff --git a/internal/otelarrow/compression/zstd/zstd.go b/internal/otelarrow/compression/zstd/zstd.go new file mode 100644 index 000000000000..e2a046bab8fa --- /dev/null +++ b/internal/otelarrow/compression/zstd/zstd.go @@ -0,0 +1,323 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package zstd // import "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/compression/zstd" + +import ( + "bytes" + "errors" + "fmt" + "io" + "runtime" + "sync" + + zstdlib "github.com/klauspost/compress/zstd" + "google.golang.org/grpc" + "google.golang.org/grpc/encoding" +) + +// NamePrefix is prefix, with N for compression level. +const NamePrefix = "zstdarrow" + +// Level is an integer value mapping to compression level. +// [0] implies disablement; not registered in grpc +// [1,2] fastest i.e., "zstdarrow1", "zstdarrow2" +// [3-5] default +// [6-9] better +// [10] best. +type Level uint + +const ( + // DefaultLevel is a reasonable balance of compression and cpu usage. + DefaultLevel Level = 5 + // MinLevel is fast and cheap. + MinLevel Level = 1 + // MaxLevel is slow and expensive. + MaxLevel Level = 10 +) + +type EncoderConfig struct { + // Level is meaningful in the range [0, 10]. No invalid + // values, they all map into 4 default configurations. (default: 5) + // See `zstdlib.WithEncoderLevel()`. + Level Level `mapstructure:"level"` + // WindowSizeMiB is a Zstd-library parameter that controls how + // much window of text is visible to the compressor at a time. + // It is the dominant factor that determines memory usage. + // If zero, the window size is determined by level. (default: 0) + // See `zstdlib.WithWindowSize()`. + WindowSizeMiB uint32 `mapstructure:"window_size_mib"` + // Concurrency is a Zstd-library parameter that configures the + // use of background goroutines to improve compression speed. + // 0 means to let the library decide (it will use up to GOMAXPROCS), + // and 1 means to avoid background workers. (default: 1) + // See `zstdlib.WithEncoderConcurrency()`. + Concurrency uint `mapstructure:"concurrency"` +} + +type DecoderConfig struct { + // MemoryLimitMiB is a memory limit control for the decoder, + // as a way to limit overall memory use by Zstd. + // See `zstdlib.WithDecoderMaxMemory()`. + MemoryLimitMiB uint32 `mapstructure:"memory_limit_mib"` + // MaxWindowSizeMiB limits window sizes that can be configured + // in the corresponding encoder's `EncoderConfig.WindowSizeMiB` + // setting, as a way to control memory usage. + // See `zstdlib.WithDecoderMaxWindow()`. + MaxWindowSizeMiB uint32 `mapstructure:"max_window_size_mib"` + // Concurrency is a Zstd-library parameter that configures the + // use of background goroutines to improve decompression speed. + // 0 means to let the library decide (it will use up to GOMAXPROCS), + // and 1 means to avoid background workers. (default: 1) + // See `zstdlib.WithDecoderConcurrency()`. + Concurrency uint `mapstructure:"concurrency"` +} + +type encoder struct { + lock sync.Mutex // protects cfg + cfg EncoderConfig + pool mru[*writer] +} + +type decoder struct { + lock sync.Mutex // protects cfg + cfg DecoderConfig + pool mru[*reader] +} + +type reader struct { + *zstdlib.Decoder + Gen + pool *mru[*reader] +} + +type writer struct { + *zstdlib.Encoder + Gen + pool *mru[*writer] +} + +type combined struct { + enc encoder + dec decoder +} + +type instance struct { + lock sync.Mutex + byLevel map[Level]*combined +} + +var _ encoding.Compressor = &combined{} + +var staticInstances = &instance{ + byLevel: map[Level]*combined{}, +} + +func (g *Gen) generation() Gen { + return *g +} + +func DefaultEncoderConfig() EncoderConfig { + return EncoderConfig{ + Level: DefaultLevel, // Determines other defaults + Concurrency: 1, // Avoids extra CPU/memory + } +} + +func DefaultDecoderConfig() DecoderConfig { + return DecoderConfig{ + Concurrency: 1, // Avoids extra CPU/memory + MemoryLimitMiB: 128, // More conservative than library default + MaxWindowSizeMiB: 32, // Corresponds w/ "best" level default + } +} + +func validate(level Level, f func() error) error { + if level > MaxLevel { + return fmt.Errorf("level out of range [0,10]: %d", level) + } + if level < MinLevel { + return fmt.Errorf("level out of range [0,10]: %d", level) + } + return f() +} + +func (cfg EncoderConfig) Validate() error { + return validate(cfg.Level, func() error { + var buf bytes.Buffer + test, err := zstdlib.NewWriter(&buf, cfg.options()...) + if test != nil { + test.Close() + } + return err + }) +} + +func (cfg DecoderConfig) Validate() error { + return validate(MinLevel, func() error { + var buf bytes.Buffer + test, err := zstdlib.NewReader(&buf, cfg.options()...) + if test != nil { + test.Close() + } + return err + }) +} + +func init() { + staticInstances.lock.Lock() + defer staticInstances.lock.Unlock() + resetLibrary() +} + +func resetLibrary() { + for level := MinLevel; level <= MaxLevel; level++ { + var combi combined + combi.enc.cfg = DefaultEncoderConfig() + combi.dec.cfg = DefaultDecoderConfig() + combi.enc.cfg.Level = level + encoding.RegisterCompressor(&combi) + staticInstances.byLevel[level] = &combi + } +} + +func SetEncoderConfig(cfg EncoderConfig) error { + if err := cfg.Validate(); err != nil { + return err + } + + updateOne := func(enc *encoder) { + enc.lock.Lock() + defer enc.lock.Unlock() + enc.cfg = cfg + enc.pool.Reset() + } + + staticInstances.lock.Lock() + defer staticInstances.lock.Unlock() + + updateOne(&staticInstances.byLevel[cfg.Level].enc) + return nil +} + +func SetDecoderConfig(cfg DecoderConfig) error { + if err := cfg.Validate(); err != nil { + return err + } + updateOne := func(dec *decoder) { + dec.lock.Lock() + defer dec.lock.Unlock() + dec.cfg = cfg + dec.pool.Reset() + } + + staticInstances.lock.Lock() + defer staticInstances.lock.Unlock() + + for level := MinLevel; level <= MaxLevel; level++ { + updateOne(&staticInstances.byLevel[level].dec) + } + return nil +} + +func (cfg EncoderConfig) options() (opts []zstdlib.EOption) { + opts = append(opts, zstdlib.WithEncoderLevel(zstdlib.EncoderLevelFromZstd(int(cfg.Level)))) + + if cfg.Concurrency != 0 { + opts = append(opts, zstdlib.WithEncoderConcurrency(int(cfg.Concurrency))) + } + if cfg.WindowSizeMiB != 0 { + opts = append(opts, zstdlib.WithWindowSize(int(cfg.WindowSizeMiB<<20))) + } + + return opts +} + +func (e *encoder) getConfig() EncoderConfig { + e.lock.Lock() + defer e.lock.Unlock() + return e.cfg +} + +func (cfg EncoderConfig) Name() string { + return fmt.Sprint(NamePrefix, cfg.Level) +} + +func (cfg EncoderConfig) CallOption() grpc.CallOption { + if cfg.Level < MinLevel || cfg.Level > MaxLevel { + return grpc.UseCompressor(EncoderConfig{Level: DefaultLevel}.Name()) + } + return grpc.UseCompressor(cfg.Name()) +} + +func (cfg DecoderConfig) options() (opts []zstdlib.DOption) { + if cfg.Concurrency != 0 { + opts = append(opts, zstdlib.WithDecoderConcurrency(int(cfg.Concurrency))) + } + if cfg.MaxWindowSizeMiB != 0 { + opts = append(opts, zstdlib.WithDecoderMaxWindow(uint64(cfg.MaxWindowSizeMiB)<<20)) + } + if cfg.MemoryLimitMiB != 0 { + opts = append(opts, zstdlib.WithDecoderMaxMemory(uint64(cfg.MemoryLimitMiB)<<20)) + } + + return opts +} + +func (d *decoder) getConfig() DecoderConfig { + d.lock.Lock() + defer d.lock.Unlock() + return d.cfg +} + +func (c *combined) Compress(w io.Writer) (io.WriteCloser, error) { + z, gen := c.enc.pool.Get() + if z == nil { + encoder, err := zstdlib.NewWriter(w, c.enc.getConfig().options()...) + if err != nil { + return nil, err + } + z = &writer{Encoder: encoder, pool: &c.enc.pool, Gen: gen} + } else { + z.Encoder.Reset(w) + } + return z, nil +} + +func (w *writer) Close() error { + defer w.pool.Put(w) + return w.Encoder.Close() +} + +func (c *combined) Decompress(r io.Reader) (io.Reader, error) { + z, gen := c.dec.pool.Get() + if z == nil { + decoder, err := zstdlib.NewReader(r, c.dec.getConfig().options()...) + if err != nil { + return nil, err + } + z = &reader{Decoder: decoder, pool: &c.dec.pool, Gen: gen} + + // zstd decoders need to be closed when they are evicted from + // the freelist. Note that the finalizer is attached to the + // reader object, not to the decoder, because zstd maintains + // background references to the decoder that prevent it from + // being GC'ed. + runtime.SetFinalizer(z, (*reader).Close) + } else if err := z.Decoder.Reset(r); err != nil { + return nil, err + } + return z, nil +} + +func (r *reader) Read(p []byte) (n int, err error) { + n, err = r.Decoder.Read(p) + if errors.Is(err, io.EOF) { + r.pool.Put(r) + } + return n, err +} + +func (c *combined) Name() string { + return c.enc.cfg.Name() +} diff --git a/internal/otelarrow/compression/zstd/zstd_test.go b/internal/otelarrow/compression/zstd/zstd_test.go new file mode 100644 index 000000000000..6a529f9a6d24 --- /dev/null +++ b/internal/otelarrow/compression/zstd/zstd_test.go @@ -0,0 +1,181 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package zstd + +import ( + "bytes" + "fmt" + "testing" + "time" + + "github.com/stretchr/testify/require" + "google.golang.org/grpc" + "google.golang.org/grpc/encoding" +) + +func resetTest() { + TTL = time.Minute + resetLibrary() +} + +func TestCompressorNonNil(t *testing.T) { + defer resetTest() + + for i := 1; i <= 10; i++ { + require.NotNil(t, encoding.GetCompressor(fmt.Sprint(NamePrefix, i))) + } + require.Nil(t, encoding.GetCompressor(fmt.Sprint(NamePrefix, MinLevel-1))) + require.Nil(t, encoding.GetCompressor(fmt.Sprint(NamePrefix, MaxLevel+1))) +} + +func TestConfigLibraryError(t *testing.T) { + defer resetTest() + + require.Error(t, SetEncoderConfig(EncoderConfig{ + Level: 1, + WindowSizeMiB: 1024, + })) + require.NoError(t, SetDecoderConfig(DecoderConfig{ + MaxWindowSizeMiB: 1024, + })) +} + +func TestInvalidCompressorLevel(t *testing.T) { + defer resetTest() + + require.Error(t, SetEncoderConfig(EncoderConfig{ + Level: 12, + Concurrency: 10, + WindowSizeMiB: 16, + })) +} + +func TestAllCompressorOptions(t *testing.T) { + defer resetTest() + + require.NoError(t, SetEncoderConfig(EncoderConfig{ + Level: 9, + Concurrency: 10, + WindowSizeMiB: 16, + })) + require.NoError(t, SetDecoderConfig(DecoderConfig{ + Concurrency: 10, + MaxWindowSizeMiB: 16, + MemoryLimitMiB: 256, + })) +} + +func TestCompressorReset(t *testing.T) { + defer resetTest() + + // Get compressor configs 1 and 2. + comp1 := encoding.GetCompressor("zstdarrow1").(*combined) + comp2 := encoding.GetCompressor("zstdarrow2").(*combined) + + // Get an object for level 1 + var buf bytes.Buffer + wc, err := comp1.Compress(&buf) + require.NoError(t, err) + + // Put back the once, it will be saved. + save := wc.(*writer) + require.NoError(t, wc.Close()) + require.Equal(t, 1, comp1.enc.pool.Size()) + require.Equal(t, 0, comp2.enc.pool.Size()) + + // We get the same object pointer again. + wc, err = comp1.Compress(&buf) + require.NoError(t, err) + require.Equal(t, save, wc.(*writer)) + + // Modify 1's encoder configuration. + encCfg1 := comp1.enc.getConfig() + encCfg2 := comp2.enc.getConfig() + cpyCfg1 := encCfg1 + cpyCfg1.WindowSizeMiB = 32 + + require.Equal(t, Level(1), cpyCfg1.Level) + require.NotEqual(t, cpyCfg1, encCfg1, "see %v %v", cpyCfg1, encCfg1) + + require.NoError(t, SetEncoderConfig(cpyCfg1)) + + // The instances can't have changed. + require.Equal(t, comp1, encoding.GetCompressor("zstdarrow1").(*combined)) + require.Equal(t, comp2, encoding.GetCompressor("zstdarrow2").(*combined)) + + // Level 2 is unchanged + require.Equal(t, encCfg2, comp2.enc.getConfig()) + + // Level 1 is changed + require.NotEqual(t, encCfg1, comp1.enc.getConfig(), "see %v %v", encCfg1, comp1.enc.getConfig()) + + // Put back the saved item, it will not be placed back in the + // pool due to reset. + require.NoError(t, wc.Close()) + require.Equal(t, 0, comp1.enc.pool.Size()) + // Explicitly, we get a nil from the pool. + v, _ := comp1.enc.pool.Get() + require.Nil(t, v) +} + +func TestDecompressorReset(t *testing.T) { + defer resetTest() + + // Get compressor configs 3 and 4. + comp3 := encoding.GetCompressor("zstdarrow3").(*combined) + comp4 := encoding.GetCompressor("zstdarrow4").(*combined) + + // Get an object for level 3 + buf := new(bytes.Buffer) + rd, err := comp3.Decompress(buf) + require.NoError(t, err) + _, err = rd.Read([]byte{}) + require.Error(t, err) + + // We get the same object pointer again. + buf = new(bytes.Buffer) + rd, err = comp3.Decompress(buf) + require.NoError(t, err) + _, err = rd.Read(nil) + require.Error(t, err) + + // Modify 3's encoder configuration. + decCfg3 := comp3.dec.getConfig() + decCfg4 := comp4.dec.getConfig() + cpyCfg3 := decCfg3 + cpyCfg3.MaxWindowSizeMiB = 128 + + require.NotEqual(t, cpyCfg3, decCfg3, "see %v %v", cpyCfg3, decCfg3) + + require.NoError(t, SetDecoderConfig(cpyCfg3)) + + // The instances can't have changed. + require.Equal(t, comp3, encoding.GetCompressor("zstdarrow3").(*combined)) + require.Equal(t, comp4, encoding.GetCompressor("zstdarrow4").(*combined)) + + // Level 4 is _also changed_ + require.Equal(t, cpyCfg3, comp4.dec.getConfig()) + require.NotEqual(t, decCfg4, comp4.dec.getConfig()) + + // Level 3 is changed + require.NotEqual(t, decCfg3, comp3.dec.getConfig(), "see %v %v", decCfg3, comp3.dec.getConfig()) + + // Unlike the encoder test, which has an explicit Close() to its advantage, + // we aren't testing the behavior of the finalizer that puts back into the MRU. +} + +func TestGRPCCallOption(t *testing.T) { + cfgN := func(l Level) EncoderConfig { + return EncoderConfig{ + Level: l, + } + } + cfg2 := cfgN(2) + require.Equal(t, cfg2.Name(), cfg2.CallOption().(grpc.CompressorCallOption).CompressorType) + + cfgD := cfgN(DefaultLevel) + cfg13 := cfgN(13) + // Invalid maps to default call option + require.Equal(t, cfgD.Name(), cfg13.CallOption().(grpc.CompressorCallOption).CompressorType) +} diff --git a/internal/otelarrow/doc.go b/internal/otelarrow/doc.go new file mode 100644 index 000000000000..a3890efafb00 --- /dev/null +++ b/internal/otelarrow/doc.go @@ -0,0 +1,6 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +//go:generate mdatagen metadata.yaml + +package otelarrow // import "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow" diff --git a/internal/otelarrow/documentation.md b/internal/otelarrow/documentation.md new file mode 100644 index 000000000000..eff8f632560b --- /dev/null +++ b/internal/otelarrow/documentation.md @@ -0,0 +1,23 @@ +[comment]: <> (Code generated by mdatagen. DO NOT EDIT.) + +# otelarrow + +## Internal Telemetry + +The following telemetry is emitted by this component. + +### otelcol_otelarrow_admission_in_flight_bytes + +Number of bytes that have started processing but are not finished. + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| By | Sum | Int | false | + +### otelcol_otelarrow_admission_waiting_bytes + +Number of items waiting to start processing. + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| By | Sum | Int | false | diff --git a/internal/otelarrow/generated_component_telemetry_test.go b/internal/otelarrow/generated_component_telemetry_test.go new file mode 100644 index 000000000000..c7a4e7ae7661 --- /dev/null +++ b/internal/otelarrow/generated_component_telemetry_test.go @@ -0,0 +1,75 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package otelarrow + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + sdkmetric "go.opentelemetry.io/otel/sdk/metric" + "go.opentelemetry.io/otel/sdk/metric/metricdata" + "go.opentelemetry.io/otel/sdk/metric/metricdata/metricdatatest" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/config/configtelemetry" +) + +type componentTestTelemetry struct { + reader *sdkmetric.ManualReader + meterProvider *sdkmetric.MeterProvider +} + +func (tt *componentTestTelemetry) newTelemetrySettings() component.TelemetrySettings { + set := componenttest.NewNopTelemetrySettings() + set.MeterProvider = tt.meterProvider + set.MetricsLevel = configtelemetry.LevelDetailed + return set +} + +func setupTestTelemetry() componentTestTelemetry { + reader := sdkmetric.NewManualReader() + return componentTestTelemetry{ + reader: reader, + meterProvider: sdkmetric.NewMeterProvider(sdkmetric.WithReader(reader)), + } +} + +func (tt *componentTestTelemetry) assertMetrics(t *testing.T, expected []metricdata.Metrics) { + var md metricdata.ResourceMetrics + require.NoError(t, tt.reader.Collect(context.Background(), &md)) + // ensure all required metrics are present + for _, want := range expected { + got := tt.getMetric(want.Name, md) + metricdatatest.AssertEqual(t, want, got, metricdatatest.IgnoreTimestamp()) + } + + // ensure no additional metrics are emitted + require.Equal(t, len(expected), tt.len(md)) +} + +func (tt *componentTestTelemetry) getMetric(name string, got metricdata.ResourceMetrics) metricdata.Metrics { + for _, sm := range got.ScopeMetrics { + for _, m := range sm.Metrics { + if m.Name == name { + return m + } + } + } + + return metricdata.Metrics{} +} + +func (tt *componentTestTelemetry) len(got metricdata.ResourceMetrics) int { + metricsCount := 0 + for _, sm := range got.ScopeMetrics { + metricsCount += len(sm.Metrics) + } + + return metricsCount +} + +func (tt *componentTestTelemetry) Shutdown(ctx context.Context) error { + return tt.meterProvider.Shutdown(ctx) +} diff --git a/internal/otelarrow/generated_package_test.go b/internal/otelarrow/generated_package_test.go new file mode 100644 index 000000000000..ec77bf1fb2a0 --- /dev/null +++ b/internal/otelarrow/generated_package_test.go @@ -0,0 +1,13 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package otelarrow + +import ( + "testing" + + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + goleak.VerifyTestMain(m) +} diff --git a/internal/otelarrow/go.mod b/internal/otelarrow/go.mod new file mode 100644 index 000000000000..e7422ac27ef2 --- /dev/null +++ b/internal/otelarrow/go.mod @@ -0,0 +1,106 @@ +module github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow + +go 1.22.0 + +require ( + github.com/klauspost/compress v1.17.11 + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/otelarrowexporter v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/otelarrowreceiver v0.116.0 + github.com/open-telemetry/otel-arrow v0.31.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configgrpc v0.116.0 + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/pdata/testdata v0.116.0 + go.opentelemetry.io/collector/receiver v0.116.0 + go.opentelemetry.io/otel v1.32.0 + go.opentelemetry.io/otel/metric v1.32.0 + go.opentelemetry.io/otel/sdk v1.32.0 + go.opentelemetry.io/otel/sdk/metric v1.32.0 + go.opentelemetry.io/otel/trace v1.32.0 + go.uber.org/goleak v1.3.0 + go.uber.org/multierr v1.11.0 + go.uber.org/zap v1.27.0 + google.golang.org/grpc v1.68.1 +) + +require ( + github.com/HdrHistogram/hdrhistogram-go v1.1.2 // indirect + github.com/apache/arrow/go/v16 v16.1.0 // indirect + github.com/apache/arrow/go/v17 v17.0.0 // indirect + github.com/axiomhq/hyperloglog v0.0.0-20230201085229-3ddf4bad03dc // indirect + github.com/brianvoe/gofakeit/v6 v6.17.0 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/dgryski/go-metro v0.0.0-20180109044635-280f6062b5bc // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/fxamacker/cbor/v2 v2.4.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/goccy/go-json v0.10.4 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/flatbuffers v24.3.25+incompatible // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/cpuid/v2 v2.2.8 // indirect + github.com/knadh/koanf/maps v0.1.1 // indirect + github.com/knadh/koanf/providers/confmap v0.1.0 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/mostynb/go-grpc-compression v1.2.3 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/grpcutil v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.116.0 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/x448/float16 v0.8.4 // indirect + github.com/zeebo/xxh3 v1.0.2 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/component/componentstatus v0.116.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/confignet v1.22.0 // indirect + go.opentelemetry.io/collector/config/configopaque v1.22.0 // indirect + go.opentelemetry.io/collector/config/configretry v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtls v1.22.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/confmap v1.22.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 // indirect + golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect + golang.org/x/mod v0.18.0 // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/sync v0.9.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.20.0 // indirect + golang.org/x/tools v0.22.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 // indirect + google.golang.org/protobuf v1.35.2 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/open-telemetry/opentelemetry-collector-contrib/receiver/otelarrowreceiver => ../../receiver/otelarrowreceiver + +replace github.com/open-telemetry/opentelemetry-collector-contrib/exporter/otelarrowexporter => ../../exporter/otelarrowexporter + +replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent => ../sharedcomponent + +replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/grpcutil => ../grpcutil diff --git a/internal/otelarrow/go.sum b/internal/otelarrow/go.sum new file mode 100644 index 000000000000..23de1b1ae271 --- /dev/null +++ b/internal/otelarrow/go.sum @@ -0,0 +1,272 @@ +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= +github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/apache/arrow/go/v16 v16.1.0 h1:dwgfOya6s03CzH9JrjCBx6bkVb4yPD4ma3haj9p7FXI= +github.com/apache/arrow/go/v16 v16.1.0/go.mod h1:9wnc9mn6vEDTRIm4+27pEjQpRKuTvBaessPoEXQzxWA= +github.com/apache/arrow/go/v17 v17.0.0 h1:RRR2bdqKcdbss9Gxy2NS/hK8i4LDMh23L6BbkN5+F54= +github.com/apache/arrow/go/v17 v17.0.0/go.mod h1:jR7QHkODl15PfYyjM2nU+yTLScZ/qfj7OSUZmJ8putc= +github.com/axiomhq/hyperloglog v0.0.0-20230201085229-3ddf4bad03dc h1:Keo7wQ7UODUaHcEi7ltENhbAK2VgZjfat6mLy03tQzo= +github.com/axiomhq/hyperloglog v0.0.0-20230201085229-3ddf4bad03dc/go.mod h1:k08r+Yj1PRAmuayFiRK6MYuR5Ve4IuZtTfxErMIh0+c= +github.com/brianvoe/gofakeit/v6 v6.17.0 h1:obbQTJeHfktJtiZzq0Q1bEpsNUs+yHrYlPVWt7BtmJ4= +github.com/brianvoe/gofakeit/v6 v6.17.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-metro v0.0.0-20180109044635-280f6062b5bc h1:8WFBn63wegobsYAX0YjD+8suexZDga5CctH4CCTx2+8= +github.com/dgryski/go-metro v0.0.0-20180109044635-280f6062b5bc/go.mod h1:c9O8+fpSOX1DM8cPNSkX/qsBWdkD4yd2dpciOWQjpBw= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fxamacker/cbor/v2 v2.4.0 h1:ri0ArlOR+5XunOP8CRUowT0pSJOwhW098ZCUyskZD88= +github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= +github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/flatbuffers v24.3.25+incompatible h1:CX395cjN9Kke9mmalRoL3d81AtFUxJM+yDthflgJGkI= +github.com/google/flatbuffers v24.3.25+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= +github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= +github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= +github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= +github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mostynb/go-grpc-compression v1.2.3 h1:42/BKWMy0KEJGSdWvzqIyOZ95YcR9mLPqKctH7Uo//I= +github.com/mostynb/go-grpc-compression v1.2.3/go.mod h1:AghIxF3P57umzqM9yz795+y1Vjs47Km/Y2FE6ouQ7Lg= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/open-telemetry/otel-arrow v0.31.0 h1:KEWHM5XrUbuGktf17gp3Tgls0OHPyT0VtT5WEohiCC4= +github.com/open-telemetry/otel-arrow v0.31.0/go.mod h1:rEiUiCmxRT3RrtB0ZsT5LeTWJBynPCs0iBkVlMGk+E8= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/configgrpc v0.116.0 h1:O8Y1X9wDH5dDdqDJ9kqoaMrxEauaDSJBg9aNC6QgB7g= +go.opentelemetry.io/collector/config/configgrpc v0.116.0/go.mod h1:RPrSQrr6xhIaAK2DdcECi142NjSo0npQfVQB3nommSo= +go.opentelemetry.io/collector/config/confignet v1.22.0 h1:SBEMHJZWD8J4qgFw1O+BEkXW9AWldDi6Fz5YeDeoU58= +go.opentelemetry.io/collector/config/confignet v1.22.0/go.mod h1:ZppUH1hgUJOubawEsxsQ9MzEYFytqo2GnVSS7d4CVxc= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 h1:yMkBS9yViCc7U7yeLzJPM2XizlfdVvBRSmsQDWu6qc0= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0/go.mod h1:n8MR6/liuGB5EmTETUBeU5ZgqMOlqKRxUaqPQBOANZ8= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= +go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= +golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ= +golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= +golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= +gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 h1:QCqS/PdaHTSWGvupk2F/ehwHtGc0/GYkT+3GAcR1CCc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/internal/otelarrow/internal/metadata/generated_telemetry.go b/internal/otelarrow/internal/metadata/generated_telemetry.go new file mode 100644 index 000000000000..b660514567f1 --- /dev/null +++ b/internal/otelarrow/internal/metadata/generated_telemetry.go @@ -0,0 +1,99 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "context" + "errors" + + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/metric/noop" + "go.opentelemetry.io/otel/trace" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configtelemetry" +) + +func Meter(settings component.TelemetrySettings) metric.Meter { + return settings.MeterProvider.Meter("github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow") +} + +func Tracer(settings component.TelemetrySettings) trace.Tracer { + return settings.TracerProvider.Tracer("github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow") +} + +// TelemetryBuilder provides an interface for components to report telemetry +// as defined in metadata and user config. +type TelemetryBuilder struct { + meter metric.Meter + OtelarrowAdmissionInFlightBytes metric.Int64ObservableUpDownCounter + observeOtelarrowAdmissionInFlightBytes func(context.Context, metric.Observer) error + OtelarrowAdmissionWaitingBytes metric.Int64ObservableUpDownCounter + observeOtelarrowAdmissionWaitingBytes func(context.Context, metric.Observer) error +} + +// TelemetryBuilderOption applies changes to default builder. +type TelemetryBuilderOption interface { + apply(*TelemetryBuilder) +} + +type telemetryBuilderOptionFunc func(mb *TelemetryBuilder) + +func (tbof telemetryBuilderOptionFunc) apply(mb *TelemetryBuilder) { + tbof(mb) +} + +// WithOtelarrowAdmissionInFlightBytesCallback sets callback for observable OtelarrowAdmissionInFlightBytes metric. +func WithOtelarrowAdmissionInFlightBytesCallback(cb func() int64, opts ...metric.ObserveOption) TelemetryBuilderOption { + return telemetryBuilderOptionFunc(func(builder *TelemetryBuilder) { + builder.observeOtelarrowAdmissionInFlightBytes = func(_ context.Context, o metric.Observer) error { + o.ObserveInt64(builder.OtelarrowAdmissionInFlightBytes, cb(), opts...) + return nil + } + }) +} + +// WithOtelarrowAdmissionWaitingBytesCallback sets callback for observable OtelarrowAdmissionWaitingBytes metric. +func WithOtelarrowAdmissionWaitingBytesCallback(cb func() int64, opts ...metric.ObserveOption) TelemetryBuilderOption { + return telemetryBuilderOptionFunc(func(builder *TelemetryBuilder) { + builder.observeOtelarrowAdmissionWaitingBytes = func(_ context.Context, o metric.Observer) error { + o.ObserveInt64(builder.OtelarrowAdmissionWaitingBytes, cb(), opts...) + return nil + } + }) +} + +// NewTelemetryBuilder provides a struct with methods to update all internal telemetry +// for a component +func NewTelemetryBuilder(settings component.TelemetrySettings, options ...TelemetryBuilderOption) (*TelemetryBuilder, error) { + builder := TelemetryBuilder{} + for _, op := range options { + op.apply(&builder) + } + builder.meter = Meter(settings) + var err, errs error + builder.OtelarrowAdmissionInFlightBytes, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64ObservableUpDownCounter( + "otelcol_otelarrow_admission_in_flight_bytes", + metric.WithDescription("Number of bytes that have started processing but are not finished."), + metric.WithUnit("By"), + ) + errs = errors.Join(errs, err) + _, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).RegisterCallback(builder.observeOtelarrowAdmissionInFlightBytes, builder.OtelarrowAdmissionInFlightBytes) + errs = errors.Join(errs, err) + builder.OtelarrowAdmissionWaitingBytes, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64ObservableUpDownCounter( + "otelcol_otelarrow_admission_waiting_bytes", + metric.WithDescription("Number of items waiting to start processing."), + metric.WithUnit("By"), + ) + errs = errors.Join(errs, err) + _, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).RegisterCallback(builder.observeOtelarrowAdmissionWaitingBytes, builder.OtelarrowAdmissionWaitingBytes) + errs = errors.Join(errs, err) + return &builder, errs +} + +func getLeveledMeter(meter metric.Meter, cfgLevel, srvLevel configtelemetry.Level) metric.Meter { + if cfgLevel <= srvLevel { + return meter + } + return noop.Meter{} +} diff --git a/internal/otelarrow/internal/metadata/generated_telemetry_test.go b/internal/otelarrow/internal/metadata/generated_telemetry_test.go new file mode 100644 index 000000000000..a23e1167e3a9 --- /dev/null +++ b/internal/otelarrow/internal/metadata/generated_telemetry_test.go @@ -0,0 +1,74 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/otel/metric" + embeddedmetric "go.opentelemetry.io/otel/metric/embedded" + noopmetric "go.opentelemetry.io/otel/metric/noop" + "go.opentelemetry.io/otel/trace" + embeddedtrace "go.opentelemetry.io/otel/trace/embedded" + nooptrace "go.opentelemetry.io/otel/trace/noop" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" +) + +type mockMeter struct { + noopmetric.Meter + name string +} +type mockMeterProvider struct { + embeddedmetric.MeterProvider +} + +func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { + return mockMeter{name: name} +} + +type mockTracer struct { + nooptrace.Tracer + name string +} + +type mockTracerProvider struct { + embeddedtrace.TracerProvider +} + +func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { + return mockTracer{name: name} +} + +func TestProviders(t *testing.T) { + set := component.TelemetrySettings{ + MeterProvider: mockMeterProvider{}, + TracerProvider: mockTracerProvider{}, + } + + meter := Meter(set) + if m, ok := meter.(mockMeter); ok { + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow", m.name) + } else { + require.Fail(t, "returned Meter not mockMeter") + } + + tracer := Tracer(set) + if m, ok := tracer.(mockTracer); ok { + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow", m.name) + } else { + require.Fail(t, "returned Meter not mockTracer") + } +} + +func TestNewTelemetryBuilder(t *testing.T) { + set := componenttest.NewNopTelemetrySettings() + applied := false + _, err := NewTelemetryBuilder(set, telemetryBuilderOptionFunc(func(b *TelemetryBuilder) { + applied = true + })) + require.NoError(t, err) + require.True(t, applied) +} diff --git a/internal/otelarrow/metadata.yaml b/internal/otelarrow/metadata.yaml new file mode 100644 index 000000000000..56966ea6b25b --- /dev/null +++ b/internal/otelarrow/metadata.yaml @@ -0,0 +1,28 @@ +type: otelarrow + +status: + class: pkg + stability: + beta: [traces, metrics, logs] + codeowners: + active: [jmacd, moh-osman3] + +telemetry: + metrics: + otelarrow_admission_in_flight_bytes: + description: Number of bytes that have started processing but are not finished. + unit: By + enabled: true + sum: + monotonic: false + value_type: int + async: true + + otelarrow_admission_waiting_bytes: + description: Number of items waiting to start processing. + enabled: true + unit: By + sum: + monotonic: false + value_type: int + async: true diff --git a/internal/otelarrow/netstats/README.md b/internal/otelarrow/netstats/README.md new file mode 100644 index 000000000000..55783ec7d2bf --- /dev/null +++ b/internal/otelarrow/netstats/README.md @@ -0,0 +1,37 @@ +# Network Statistics package + +## Overview + +This package provides general support for counting the number of bytes +read and written by an exporter or receiver component. This package +specifically supports monitoring the compression rate achieved by +OpenTelemetry Protocol with Apache Arrow, but it can be easily adopted +for any gRPC-based component, for both unary and streaming RPCs. + +## Usage + +To create a network reporter, pass the exporter or receiver settings +to `netstats.NewExporterNetworkReporter` or +`netstats.NewExporterNetworkReporter`, then register with gRPC: + +``` + dialOpts = append(dialOpts, grpc.WithStatsHandler(netReporter.Handler())) +``` + +Because OTel-Arrow supports the use of compressed payloads, configured +through Arrow IPC, it is necessary for the exporter and receiver +components to manually account for uncompressed payload sizes. + +The `SizesStruct` supports recording either one or both of the +compressed and uncompressed sizes. To report only uncompressed size +in the exporter case, for example: + +``` + var sized netstats.SizesStruct + sized.Method = s.method + sized.Length = int64(uncompressedSize) + netReporter.CountSend(ctx, sized) +``` + +Likewise, the receiver uses `CountRecv` with `sized.Length` set to +report its uncompressed size after OTel-Arrow decompression. diff --git a/internal/otelarrow/netstats/grpc.go b/internal/otelarrow/netstats/grpc.go new file mode 100644 index 000000000000..cc994c6b4970 --- /dev/null +++ b/internal/otelarrow/netstats/grpc.go @@ -0,0 +1,20 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package netstats // import "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/netstats" + +import "google.golang.org/grpc" + +// GRPCStreamMethodName applies the logic gRPC uses but does not expose to construct +// method names. This allows direct calling of the netstats interface +// from outside a gRPC stats handler. +func GRPCStreamMethodName(desc grpc.ServiceDesc, stream grpc.StreamDesc) string { + return "/" + desc.ServiceName + "/" + stream.StreamName +} + +// GRPCUnaryMethodName applies the logic gRPC uses but does not expose to construct +// method names. This allows direct calling of the netstats interface +// from outside a gRPC stats handler. +func GRPCUnaryMethodName(desc grpc.ServiceDesc, method grpc.MethodDesc) string { + return "/" + desc.ServiceName + "/" + method.MethodName +} diff --git a/internal/otelarrow/netstats/handler.go b/internal/otelarrow/netstats/handler.go new file mode 100644 index 000000000000..73507fd35b60 --- /dev/null +++ b/internal/otelarrow/netstats/handler.go @@ -0,0 +1,83 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package netstats // import "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/netstats" + +import ( + "context" + "strings" + + "google.golang.org/grpc/stats" +) + +type netstatsContext struct{} // value: string + +type statsHandler struct { + rep *NetworkReporter +} + +var _ stats.Handler = statsHandler{} + +func (rep *NetworkReporter) Handler() stats.Handler { + return statsHandler{rep: rep} +} + +// TagRPC implements grpc/stats.Handler +func (statsHandler) TagRPC(ctx context.Context, s *stats.RPCTagInfo) context.Context { + return context.WithValue(ctx, netstatsContext{}, s.FullMethodName) +} + +// trustUncompressed is a super hacky way of knowing when the +// uncompressed size is realistic. nothing else would work -- the +// same handler is used by both arrow and non-arrow, and the +// `*stats.Begin` which indicates streaming vs. not streaming does not +// appear in TagRPC() where we could store it in context. this +// approach is considered a better alternative than others, however +// ugly. when non-arrow RPCs are sent, the instrumentation works +// correctly, this avoids special instrumentation outside of the Arrow +// components. +func trustUncompressed(method string) bool { + return !strings.Contains(method, "arrow.v1") +} + +func (h statsHandler) HandleRPC(ctx context.Context, rs stats.RPCStats) { + switch rs.(type) { + case *stats.InHeader, *stats.InTrailer, *stats.Begin, *stats.OutHeader, *stats.OutTrailer: + // Note we have some info about header WireLength, + // but intentionally not counting. + return + } + method := "unknown" + if name := ctx.Value(netstatsContext{}); name != nil { + method = name.(string) + } + switch s := rs.(type) { + case *stats.InPayload: + var ss SizesStruct + ss.Method = method + if trustUncompressed(method) { + ss.Length = int64(s.Length) + } + ss.WireLength = int64(s.WireLength) + h.rep.CountReceive(ctx, ss) + + case *stats.OutPayload: + var ss SizesStruct + ss.Method = method + if trustUncompressed(method) { + ss.Length = int64(s.Length) + } + ss.WireLength = int64(s.WireLength) + h.rep.CountSend(ctx, ss) + } +} + +// TagConn implements grpc/stats.Handler +func (statsHandler) TagConn(ctx context.Context, _ *stats.ConnTagInfo) context.Context { + return ctx +} + +// HandleConn implements grpc/stats.Handler +func (statsHandler) HandleConn(_ context.Context, _ stats.ConnStats) { + // Note: ConnBegin and ConnEnd +} diff --git a/internal/otelarrow/netstats/netstats.go b/internal/otelarrow/netstats/netstats.go new file mode 100644 index 000000000000..02f5265fa9c3 --- /dev/null +++ b/internal/otelarrow/netstats/netstats.go @@ -0,0 +1,263 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package netstats // import "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/netstats" + +import ( + "context" + + "go.opentelemetry.io/collector/config/configtelemetry" + "go.opentelemetry.io/collector/exporter" + "go.opentelemetry.io/collector/receiver" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric" + noopmetric "go.opentelemetry.io/otel/metric/noop" + "go.opentelemetry.io/otel/trace" + "go.uber.org/multierr" +) + +const ( + // ExporterKey is an attribute name that identifies an + // exporter component that produces internal metrics, logs, + // and traces. + ExporterKey = "exporter" + + // ReceiverKey is an attribute name that identifies an + // receiver component that produces internal metrics, logs, + // and traces. + ReceiverKey = "receiver" + + // SentBytes is used to track bytes sent by exporters and receivers. + SentBytes = "sent" + + // SentWireBytes is used to track bytes sent on the wire + // (includes compression) by exporters and receivers. + SentWireBytes = "sent_wire" + + // RecvBytes is used to track bytes received by exporters and receivers. + RecvBytes = "recv" + + // RecvWireBytes is used to track bytes received on the wire + // (includes compression) by exporters and receivers. + RecvWireBytes = "recv_wire" + + // CompSize is used for compressed size histogram metrics. + CompSize = "compressed_size" + + scopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/netstats" +) + +// NetworkReporter is a helper to add network-level observability to +// an exporter or receiver. +type NetworkReporter struct { + isExporter bool + staticAttr attribute.KeyValue + sentBytes metric.Int64Counter + sentWireBytes metric.Int64Counter + recvBytes metric.Int64Counter + recvWireBytes metric.Int64Counter + compSizeHisto metric.Int64Histogram +} + +var _ Interface = &NetworkReporter{} + +// SizesStruct is used to pass uncompressed on-wire message lengths to +// the CountSend() and CountReceive() methods. +type SizesStruct struct { + // Method refers to the gRPC method name + Method string + // Length is the uncompressed size + Length int64 + // WireLength is compressed size + WireLength int64 +} + +// Interface describes a *NetworkReporter or a Noop. +type Interface interface { + // CountSend reports outbound bytes. + CountSend(ctx context.Context, ss SizesStruct) + + // CountSend reports inbound bytes. + CountReceive(ctx context.Context, ss SizesStruct) +} + +// Noop is a no-op implementation of Interface. +type Noop struct{} + +var _ Interface = Noop{} + +func (Noop) CountSend(context.Context, SizesStruct) {} +func (Noop) CountReceive(context.Context, SizesStruct) {} + +const ( + bytesUnit = "bytes" + sentDescription = "Number of bytes sent by the component." + sentWireDescription = "Number of bytes sent on the wire by the component." + recvDescription = "Number of bytes received by the component." + recvWireDescription = "Number of bytes received on the wire by the component." + compSizeDescription = "Size of compressed payload" +) + +// makeSentMetrics builds the sent and sent-wire metric instruments +// for an exporter or receiver using the corresponding `prefix`. +// major` indicates the major direction of the pipeline, +// which is true when sending for exporters, receiving for receivers. +func makeSentMetrics(prefix string, meter metric.Meter, major bool) (sent, sentWire metric.Int64Counter, _ error) { + var sentBytes metric.Int64Counter = noopmetric.Int64Counter{} + var err1 error + if major { + sentBytes, err1 = meter.Int64Counter(prefix+"_"+SentBytes, metric.WithDescription(sentDescription), metric.WithUnit(bytesUnit)) + } + sentWireBytes, err2 := meter.Int64Counter(prefix+"_"+SentWireBytes, metric.WithDescription(sentWireDescription), metric.WithUnit(bytesUnit)) + return sentBytes, sentWireBytes, multierr.Append(err1, err2) +} + +// makeRecvMetrics builds the received and received-wire metric +// instruments for an exporter or receiver using the corresponding +// `prefix`. `major` indicates the major direction of the pipeline, +// which is true when sending for exporters, receiving for receivers. +func makeRecvMetrics(prefix string, meter metric.Meter, major bool) (recv, recvWire metric.Int64Counter, _ error) { + var recvBytes metric.Int64Counter = noopmetric.Int64Counter{} + var err1 error + if major { + recvBytes, err1 = meter.Int64Counter(prefix+"_"+RecvBytes, metric.WithDescription(recvDescription), metric.WithUnit(bytesUnit)) + } + recvWireBytes, err2 := meter.Int64Counter(prefix+"_"+RecvWireBytes, metric.WithDescription(recvWireDescription), metric.WithUnit(bytesUnit)) + return recvBytes, recvWireBytes, multierr.Append(err1, err2) +} + +// NewExporterNetworkReporter creates a new NetworkReporter configured for an exporter. +func NewExporterNetworkReporter(settings exporter.Settings) (*NetworkReporter, error) { + level := settings.TelemetrySettings.MetricsLevel + + if level <= configtelemetry.LevelBasic { + // Note: NetworkReporter implements nil a check. + return nil, nil + } + + meter := settings.TelemetrySettings.MeterProvider.Meter(scopeName) + rep := &NetworkReporter{ + isExporter: true, + staticAttr: attribute.String(ExporterKey, settings.ID.String()), + compSizeHisto: noopmetric.Int64Histogram{}, + } + + var errors, err error + if level > configtelemetry.LevelNormal { + rep.compSizeHisto, err = meter.Int64Histogram("otelcol_"+ExporterKey+"_"+CompSize, metric.WithDescription(compSizeDescription), metric.WithUnit(bytesUnit)) + errors = multierr.Append(errors, err) + } + + rep.sentBytes, rep.sentWireBytes, err = makeSentMetrics("otelcol_"+ExporterKey, meter, true) + errors = multierr.Append(errors, err) + + // Normally, an exporter counts sent bytes, and skips received + // bytes. LevelDetailed will reveal exporter-received bytes. + if level > configtelemetry.LevelNormal { + rep.recvBytes, rep.recvWireBytes, err = makeRecvMetrics("otelcol_"+ExporterKey, meter, false) + errors = multierr.Append(errors, err) + } + + return rep, errors +} + +// NewReceiverNetworkReporter creates a new NetworkReporter configured for an exporter. +func NewReceiverNetworkReporter(settings receiver.Settings) (*NetworkReporter, error) { + level := settings.TelemetrySettings.MetricsLevel + + if level <= configtelemetry.LevelBasic { + // Note: NetworkReporter implements nil a check. + return nil, nil + } + + meter := settings.MeterProvider.Meter(scopeName) + rep := &NetworkReporter{ + isExporter: false, + staticAttr: attribute.String(ReceiverKey, settings.ID.String()), + compSizeHisto: noopmetric.Int64Histogram{}, + } + + var errors, err error + if level > configtelemetry.LevelNormal { + rep.compSizeHisto, err = meter.Int64Histogram("otelcol_"+ReceiverKey+"_"+CompSize, metric.WithDescription(compSizeDescription), metric.WithUnit(bytesUnit)) + errors = multierr.Append(errors, err) + } + + rep.recvBytes, rep.recvWireBytes, err = makeRecvMetrics("otelcol_"+ReceiverKey, meter, true) + errors = multierr.Append(errors, err) + + // Normally, a receiver counts received bytes, and skips sent + // bytes. LevelDetailed will reveal receiver-sent bytes. + if level > configtelemetry.LevelNormal { + rep.sentBytes, rep.sentWireBytes, err = makeSentMetrics("otelcol_"+ReceiverKey, meter, false) + errors = multierr.Append(errors, err) + } + + return rep, errors +} + +// CountSend is used to report a message sent by the component. For +// exporters, SizesStruct indicates the size of a request. For +// receivers, SizesStruct indicates the size of a response. +func (rep *NetworkReporter) CountSend(ctx context.Context, ss SizesStruct) { + // Indicates basic level telemetry, not counting bytes. + if rep == nil { + return + } + + span := trace.SpanFromContext(ctx) + attrs := metric.WithAttributes(rep.staticAttr, attribute.String("method", ss.Method)) + + if ss.Length > 0 { + if rep.sentBytes != nil { + rep.sentBytes.Add(ctx, ss.Length, attrs) + } + if span.IsRecording() { + span.SetAttributes(attribute.Int64("sent_uncompressed", ss.Length)) + } + } + if ss.WireLength > 0 { + if rep.isExporter && rep.compSizeHisto != nil { + rep.compSizeHisto.Record(ctx, ss.WireLength, attrs) + } + if rep.sentWireBytes != nil { + rep.sentWireBytes.Add(ctx, ss.WireLength, attrs) + } + if span.IsRecording() { + span.SetAttributes(attribute.Int64("sent_compressed", ss.WireLength)) + } + } +} + +// CountReceive is used to report a message received by the component. For +// exporters, SizesStruct indicates the size of a response. For +// receivers, SizesStruct indicates the size of a request. +func (rep *NetworkReporter) CountReceive(ctx context.Context, ss SizesStruct) { + // Indicates basic level telemetry, not counting bytes. + if rep == nil { + return + } + + span := trace.SpanFromContext(ctx) + attrs := metric.WithAttributes(rep.staticAttr, attribute.String("method", ss.Method)) + + if ss.Length > 0 { + if rep.recvBytes != nil { + rep.recvBytes.Add(ctx, ss.Length, attrs) + } + if span.IsRecording() { + span.SetAttributes(attribute.Int64("received_uncompressed", ss.Length)) + } + } + if ss.WireLength > 0 { + if !rep.isExporter && rep.compSizeHisto != nil { + rep.compSizeHisto.Record(ctx, ss.WireLength, attrs) + } + if rep.recvWireBytes != nil { + rep.recvWireBytes.Add(ctx, ss.WireLength, attrs) + } + if span.IsRecording() { + span.SetAttributes(attribute.Int64("received_compressed", ss.WireLength)) + } + } +} diff --git a/internal/otelarrow/netstats/netstats_test.go b/internal/otelarrow/netstats/netstats_test.go new file mode 100644 index 000000000000..c2ec991b89ea --- /dev/null +++ b/internal/otelarrow/netstats/netstats_test.go @@ -0,0 +1,326 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package netstats + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configtelemetry" + "go.opentelemetry.io/collector/exporter" + "go.opentelemetry.io/collector/receiver" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/sdk/metric" + "go.opentelemetry.io/otel/sdk/metric/metricdata" + "go.opentelemetry.io/otel/sdk/resource" + sdktrace "go.opentelemetry.io/otel/sdk/trace" + "google.golang.org/grpc/stats" +) + +func metricValues(t *testing.T, rm metricdata.ResourceMetrics, expectMethod string) map[string]any { + res := map[string]any{} + for _, sm := range rm.ScopeMetrics { + for _, mm := range sm.Metrics { + var value int64 + var attrs attribute.Set + switch t := mm.Data.(type) { + case metricdata.Histogram[int64]: + for _, dp := range t.DataPoints { + value = dp.Sum // histogram tested as the sum + attrs = dp.Attributes + } + case metricdata.Sum[int64]: + for _, dp := range t.DataPoints { + value = dp.Value + attrs = dp.Attributes + } + } + var method string + for _, attr := range attrs.ToSlice() { + if attr.Key == "method" { + method = attr.Value.AsString() + } + } + + require.Equal(t, expectMethod, method) + res[mm.Name] = value + } + } + return res +} + +func TestNetStatsExporterNone(t *testing.T) { + testNetStatsExporter(t, configtelemetry.LevelNone, map[string]any{}) +} + +func TestNetStatsExporterNormal(t *testing.T) { + testNetStatsExporter(t, configtelemetry.LevelNormal, map[string]any{ + "otelcol_exporter_sent": int64(1000), + "otelcol_exporter_sent_wire": int64(100), + }) +} + +func TestNetStatsExporterDetailed(t *testing.T) { + testNetStatsExporter(t, configtelemetry.LevelDetailed, map[string]any{ + "otelcol_exporter_sent": int64(1000), + "otelcol_exporter_sent_wire": int64(100), + "otelcol_exporter_recv_wire": int64(10), + "otelcol_exporter_compressed_size": int64(100), // same as sent_wire b/c sum metricValue uses histogram sum + }) +} + +func testNetStatsExporter(t *testing.T, level configtelemetry.Level, expect map[string]any) { + for _, apiDirect := range []bool{true, false} { + t.Run(func() string { + if apiDirect { + return "direct" + } + return "grpc" + }(), func(t *testing.T) { + rdr := metric.NewManualReader() + mp := metric.NewMeterProvider( + metric.WithResource(resource.Empty()), + metric.WithReader(rdr), + ) + enr, err := NewExporterNetworkReporter(exporter.Settings{ + ID: component.NewID(component.MustNewType("test")), + TelemetrySettings: component.TelemetrySettings{ + MeterProvider: mp, + MetricsLevel: level, + }, + }) + require.NoError(t, err) + handler := enr.Handler() + + ctx := context.Background() + for i := 0; i < 10; i++ { + if apiDirect { + // use the direct API + enr.CountSend(ctx, SizesStruct{ + Method: "Hello", + Length: 100, + WireLength: 10, + }) + enr.CountReceive(ctx, SizesStruct{ + Method: "Hello", + Length: 10, + WireLength: 1, + }) + } else { + // simulate the RPC path + handler.HandleRPC(handler.TagRPC(ctx, &stats.RPCTagInfo{ + FullMethodName: "Hello", + }), &stats.OutPayload{ + Length: 100, + WireLength: 10, + }) + handler.HandleRPC(handler.TagRPC(ctx, &stats.RPCTagInfo{ + FullMethodName: "Hello", + }), &stats.InPayload{ + Length: 10, + WireLength: 1, + }) + } + } + var rm metricdata.ResourceMetrics + err = rdr.Collect(ctx, &rm) + require.NoError(t, err) + + require.Equal(t, expect, metricValues(t, rm, "Hello")) + }) + } +} + +func TestNetStatsSetSpanAttrs(t *testing.T) { + tests := []struct { + name string + attrs []attribute.KeyValue + isExporter bool + length int + wireLength int + }{ + { + name: "set exporter attributes", + isExporter: true, + length: 1234567, + wireLength: 123, + attrs: []attribute.KeyValue{ + attribute.Int("sent_uncompressed", 1234567), + attribute.Int("sent_compressed", 123), + attribute.Int("received_uncompressed", 1234567*2), + attribute.Int("received_compressed", 123*2), + }, + }, + { + name: "set receiver attributes", + isExporter: false, + length: 8901234, + wireLength: 890, + attrs: []attribute.KeyValue{ + attribute.Int("sent_uncompressed", 8901234), + attribute.Int("sent_compressed", 890), + attribute.Int("received_uncompressed", 8901234*2), + attribute.Int("received_compressed", 890*2), + }, + }, + } + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + enr := &NetworkReporter{ + isExporter: tc.isExporter, + } + + tp := sdktrace.NewTracerProvider() + ctx, sp := tp.Tracer("test/span").Start(context.Background(), "test-op") + + var sized SizesStruct + sized.Method = "test" + sized.Length = int64(tc.length) + sized.WireLength = int64(tc.wireLength) + enr.CountSend(ctx, sized) + sized.Length *= 2 + sized.WireLength *= 2 + enr.CountReceive(ctx, sized) + + actualAttrs := sp.(sdktrace.ReadOnlySpan).Attributes() + + require.Equal(t, attribute.NewSet(tc.attrs...), attribute.NewSet(actualAttrs...)) + }) + } +} + +func TestNetStatsReceiverNone(t *testing.T) { + testNetStatsReceiver(t, configtelemetry.LevelNone, map[string]any{}) +} + +func TestNetStatsReceiverNormal(t *testing.T) { + testNetStatsReceiver(t, configtelemetry.LevelNormal, map[string]any{ + "otelcol_receiver_recv": int64(1000), + "otelcol_receiver_recv_wire": int64(100), + }) +} + +func TestNetStatsReceiverDetailed(t *testing.T) { + testNetStatsReceiver(t, configtelemetry.LevelDetailed, map[string]any{ + "otelcol_receiver_recv": int64(1000), + "otelcol_receiver_recv_wire": int64(100), + "otelcol_receiver_sent_wire": int64(10), + "otelcol_receiver_compressed_size": int64(100), // same as recv_wire b/c sum metricValue uses histogram sum + }) +} + +func testNetStatsReceiver(t *testing.T, level configtelemetry.Level, expect map[string]any) { + for _, apiDirect := range []bool{true, false} { + t.Run(func() string { + if apiDirect { + return "direct" + } + return "grpc" + }(), func(t *testing.T) { + rdr := metric.NewManualReader() + mp := metric.NewMeterProvider( + metric.WithResource(resource.Empty()), + metric.WithReader(rdr), + ) + rer, err := NewReceiverNetworkReporter(receiver.Settings{ + ID: component.NewID(component.MustNewType("test")), + TelemetrySettings: component.TelemetrySettings{ + MeterProvider: mp, + MetricsLevel: level, + }, + }) + require.NoError(t, err) + handler := rer.Handler() + + ctx := context.Background() + for i := 0; i < 10; i++ { + if apiDirect { + // use the direct API + rer.CountReceive(ctx, SizesStruct{ + Method: "Hello", + Length: 100, + WireLength: 10, + }) + rer.CountSend(ctx, SizesStruct{ + Method: "Hello", + Length: 10, + WireLength: 1, + }) + } else { + // simulate the RPC path + handler.HandleRPC(handler.TagRPC(ctx, &stats.RPCTagInfo{ + FullMethodName: "Hello", + }), &stats.InPayload{ + Length: 100, + WireLength: 10, + }) + handler.HandleRPC(handler.TagRPC(ctx, &stats.RPCTagInfo{ + FullMethodName: "Hello", + }), &stats.OutPayload{ + Length: 10, + WireLength: 1, + }) + } + } + var rm metricdata.ResourceMetrics + err = rdr.Collect(ctx, &rm) + require.NoError(t, err) + + require.Equal(t, expect, metricValues(t, rm, "Hello")) + }) + } +} + +func TestUncompressedSizeBypass(t *testing.T) { + rdr := metric.NewManualReader() + mp := metric.NewMeterProvider( + metric.WithResource(resource.Empty()), + metric.WithReader(rdr), + ) + enr, err := NewExporterNetworkReporter(exporter.Settings{ + ID: component.NewID(component.MustNewType("test")), + TelemetrySettings: component.TelemetrySettings{ + MeterProvider: mp, + MetricsLevel: configtelemetry.LevelDetailed, + }, + }) + require.NoError(t, err) + handler := enr.Handler() + + ctx := context.Background() + for i := 0; i < 10; i++ { + // simulate the RPC path + handler.HandleRPC(handler.TagRPC(ctx, &stats.RPCTagInfo{ + FullMethodName: "my.arrow.v1.method", + }), &stats.OutPayload{ + Length: 9999, + WireLength: 10, + }) + handler.HandleRPC(handler.TagRPC(ctx, &stats.RPCTagInfo{ + FullMethodName: "my.arrow.v1.method", + }), &stats.InPayload{ + Length: 9999, + WireLength: 1, + }) + // There would bo no uncompressed size metric w/o this call + // and if the bypass didn't work, we would count the 9999s above. + enr.CountSend(ctx, SizesStruct{ + Method: "my.arrow.v1.method", + Length: 100, + }) + } + var rm metricdata.ResourceMetrics + err = rdr.Collect(ctx, &rm) + require.NoError(t, err) + + expect := map[string]any{ + "otelcol_exporter_sent": int64(1000), + "otelcol_exporter_sent_wire": int64(100), + "otelcol_exporter_recv_wire": int64(10), + "otelcol_exporter_compressed_size": int64(100), + } + require.Equal(t, expect, metricValues(t, rm, "my.arrow.v1.method")) +} diff --git a/internal/otelarrow/test/e2e_test.go b/internal/otelarrow/test/e2e_test.go new file mode 100644 index 000000000000..9c5f75d64da0 --- /dev/null +++ b/internal/otelarrow/test/e2e_test.go @@ -0,0 +1,729 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package test + +import ( + "context" + "encoding/json" + "fmt" + "math/rand" + "regexp" + "strings" + "sync" + "sync/atomic" + "testing" + "time" + + "github.com/open-telemetry/otel-arrow/pkg/datagen" + otel_assert "github.com/open-telemetry/otel-arrow/pkg/otel/assert" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/config/configgrpc" + "go.opentelemetry.io/collector/consumer" + "go.opentelemetry.io/collector/consumer/consumererror" + "go.opentelemetry.io/collector/consumer/consumertest" + "go.opentelemetry.io/collector/exporter" + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/ptrace" + "go.opentelemetry.io/collector/pdata/ptrace/ptraceotlp" + "go.opentelemetry.io/collector/pdata/testdata" + "go.opentelemetry.io/collector/receiver" + otelcodes "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/sdk/trace" + "go.opentelemetry.io/otel/sdk/trace/tracetest" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" + "go.uber.org/zap/zaptest/observer" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/otelarrowexporter" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/testutil" + "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/otelarrowreceiver" +) + +type testParams struct { + threadCount int + requestWhileTrue func(*testConsumer) bool + + // missingDeadline is configured so the zero value implies a deadline, + // which is the default. + missingDeadline bool + + // skipVerify allows skipping verification for very large tests. The + // reason for this is that we have an O(N^2) verification step. + skipVerify bool +} + +type testConsumer struct { + t *testing.T + + sink consumertest.TracesSink + sentSpans atomic.Int64 + + recvCfg *otelarrowreceiver.Config + expCfg *otelarrowexporter.Config + + recvLogs *observer.ObservedLogs + expLogs *observer.ObservedLogs + + recvSpans *tracetest.InMemoryExporter + expSpans *tracetest.InMemoryExporter + + expectDeadline bool +} + +var _ consumer.Traces = &testConsumer{} + +type ( + ExpConfig = otelarrowexporter.Config + RecvConfig = otelarrowreceiver.Config + CfgFunc func(*ExpConfig, *RecvConfig) + GenFunc func(int) ptrace.Traces + MkGen func() GenFunc + EndFunc func(t *testing.T, tp testParams, testCon *testConsumer, expect [][]ptrace.Traces) (rops, eops map[string]int) + ConsumerErrFunc func(t *testing.T, err error) +) + +func (*testConsumer) Capabilities() consumer.Capabilities { + return consumer.Capabilities{} +} + +func (tc *testConsumer) ConsumeTraces(ctx context.Context, td ptrace.Traces) error { + time.Sleep(time.Duration(float64(time.Millisecond) * (1 + rand.Float64()))) + + dead, hasDeadline := ctx.Deadline() + timeout := time.Until(dead) + + require.Equal(tc.t, tc.expectDeadline, hasDeadline, "deadline set or not set: %v", timeout) + + return tc.sink.ConsumeTraces(ctx, td) +} + +func testLoggerSettings(_ *testing.T) (component.TelemetrySettings, *observer.ObservedLogs, *tracetest.InMemoryExporter) { + tset := componenttest.NewNopTelemetrySettings() + + core, obslogs := observer.New(zapcore.DebugLevel) + + exp := tracetest.NewInMemoryExporter() + + // Note: To debug any of the logs-based assertions in this test, uncomment + // the following line: + // + // tset.Logger = zap.New(zapcore.NewTee(core, zaptest.NewLogger(t).Core())) + tset.Logger = zap.New(core) + tset.TracerProvider = trace.NewTracerProvider(trace.WithSyncer(exp)) + + return tset, obslogs, exp +} + +func basicTestConfig(t *testing.T, tp testParams, cfgF CfgFunc) (*testConsumer, exporter.Traces, receiver.Traces) { + ctx := context.Background() + + efact := otelarrowexporter.NewFactory() + rfact := otelarrowreceiver.NewFactory() + + ecfg := efact.CreateDefaultConfig() + rcfg := rfact.CreateDefaultConfig() + + receiverCfg := rcfg.(*RecvConfig) + exporterCfg := ecfg.(*ExpConfig) + + addr := testutil.GetAvailableLocalAddress(t) + + receiverCfg.Protocols.GRPC.NetAddr.Endpoint = addr + + exporterCfg.ClientConfig.Endpoint = addr + exporterCfg.ClientConfig.WaitForReady = true + exporterCfg.ClientConfig.TLSSetting.Insecure = true + exporterCfg.TimeoutSettings.Timeout = time.Minute + exporterCfg.QueueSettings.Enabled = false + exporterCfg.RetryConfig.Enabled = true + exporterCfg.Arrow.NumStreams = 1 + exporterCfg.Arrow.MaxStreamLifetime = 5 * time.Second + exporterCfg.Arrow.DisableDowngrade = true + + if cfgF != nil { + cfgF(exporterCfg, receiverCfg) + } + + expTset, expLogs, expSpans := testLoggerSettings(t) + recvTset, recvLogs, recvSpans := testLoggerSettings(t) + + testCon := &testConsumer{ + t: t, + + recvCfg: receiverCfg, + expCfg: exporterCfg, + + recvLogs: recvLogs, + expLogs: expLogs, + + recvSpans: recvSpans, + expSpans: expSpans, + + expectDeadline: !tp.missingDeadline, + } + + receiver, err := rfact.CreateTraces(ctx, receiver.Settings{ + ID: component.MustNewID("otelarrowreceiver"), + TelemetrySettings: recvTset, + }, receiverCfg, testCon) + require.NoError(t, err) + + exporter, err := efact.CreateTraces(ctx, exporter.Settings{ + ID: component.MustNewID("otelarrowexporter"), + TelemetrySettings: expTset, + }, exporterCfg) + require.NoError(t, err) + + return testCon, exporter, receiver +} + +func testIntegrationTraces(ctx context.Context, t *testing.T, tp testParams, cfgf CfgFunc, mkgen MkGen, errf ConsumerErrFunc, endf EndFunc) { + host := componenttest.NewNopHost() + + testCon, exporter, receiver := basicTestConfig(t, tp, cfgf) + + var startWG sync.WaitGroup + var exporterShutdownWG sync.WaitGroup + var startExporterShutdownWG sync.WaitGroup + var receiverShutdownWG sync.WaitGroup // wait for receiver shutdown + + receiverShutdownWG.Add(1) + exporterShutdownWG.Add(1) + startExporterShutdownWG.Add(1) + startWG.Add(1) + + // Run the receiver, shutdown after exporter does. + go func() { + defer receiverShutdownWG.Done() + assert.NoError(t, receiver.Start(ctx, host)) + exporterShutdownWG.Wait() + assert.NoError(t, receiver.Shutdown(ctx)) + }() + + // Run the exporter and wait for clients to finish + go func() { + defer exporterShutdownWG.Done() + assert.NoError(t, exporter.Start(ctx, host)) + startWG.Done() + startExporterShutdownWG.Wait() + assert.NoError(t, exporter.Shutdown(ctx)) + }() + + // wait for the exporter to start + startWG.Wait() + var clientDoneWG sync.WaitGroup // wait for client to finish + + expect := make([][]ptrace.Traces, tp.threadCount) + + for num := 0; num < tp.threadCount; num++ { + clientDoneWG.Add(1) + go func(num int) { + defer clientDoneWG.Done() + generator := mkgen() + for i := 0; tp.requestWhileTrue(testCon); i++ { + td := generator(i) + + errf(t, exporter.ConsumeTraces(ctx, td)) + testCon.sentSpans.Add(int64(td.SpanCount())) + expect[num] = append(expect[num], td) + } + }(num) + } + + // wait til senders finish + clientDoneWG.Wait() + + // shut down exporter; it triggers receiver to shut down + startExporterShutdownWG.Done() + + // wait for receiver to shut down + receiverShutdownWG.Wait() + + endf(t, tp, testCon, expect) +} + +func makeTestTraces(i int) ptrace.Traces { + td := ptrace.NewTraces() + td.ResourceSpans().AppendEmpty().Resource().Attributes().PutStr("resource-attr", fmt.Sprint("resource-attr-val-", i)) + + ss := td.ResourceSpans().At(0).ScopeSpans().AppendEmpty().Spans() + span := ss.AppendEmpty() + + span.SetName("operationA") + span.SetStartTimestamp(pcommon.NewTimestampFromTime(time.Now())) + span.SetEndTimestamp(pcommon.NewTimestampFromTime(time.Now())) + + span.SetTraceID(testutil.UInt64ToTraceID(rand.Uint64(), rand.Uint64())) + span.SetSpanID(testutil.UInt64ToSpanID(rand.Uint64())) + evs := span.Events() + ev0 := evs.AppendEmpty() + ev0.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) + ev0.SetName("event-with-attr") + ev0.Attributes().PutStr("span-event-attr", "span-event-attr-val") + ev0.SetDroppedAttributesCount(2) + ev1 := evs.AppendEmpty() + ev1.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) + ev1.SetName("event") + ev1.SetDroppedAttributesCount(2) + span.SetDroppedEventsCount(1) + status := span.Status() + status.SetCode(ptrace.StatusCodeError) + status.SetMessage("status-cancelled") + + return td +} + +func bulkyGenFunc() MkGen { + return func() GenFunc { + entropy := datagen.NewTestEntropy(int64(rand.Uint64())) //nolint:gosec // only used for testing + + tracesGen := datagen.NewTracesGenerator( + entropy, + entropy.NewStandardResourceAttributes(), + entropy.NewStandardInstrumentationScopes(), + ) + return func(x int) ptrace.Traces { + if x == 0 { + return testdata.GenerateTraces(1) + } + return tracesGen.Generate(1000, time.Minute) + } + } +} + +func standardEnding(t *testing.T, params testParams, testCon *testConsumer, expect [][]ptrace.Traces) (rops, eops map[string]int) { + // Check for matching request count and data + require.Equal(t, int(testCon.sentSpans.Load()), testCon.sink.SpanCount()) + + if !params.skipVerify { + var expectJSON []json.Marshaler + for _, tdn := range expect { + for _, td := range tdn { + expectJSON = append(expectJSON, ptraceotlp.NewExportRequestFromTraces(td)) + } + } + var receivedJSON []json.Marshaler + + for _, td := range testCon.sink.AllTraces() { + receivedJSON = append(receivedJSON, ptraceotlp.NewExportRequestFromTraces(td)) + } + asserter := otel_assert.NewStdUnitTest(t) + + otel_assert.Equiv(asserter, expectJSON, receivedJSON) + } + + rops = map[string]int{} + eops = map[string]int{} + + for _, span := range testCon.expSpans.GetSpans() { + eops[fmt.Sprintf("%v/%v", span.Name, span.Status.Code)]++ + + // This span has a recognized span error which we can't easily fix. See + // https://github.com/open-telemetry/opentelemetry-go-contrib/issues/2644 + if span.Name == "opentelemetry.proto.experimental.arrow.v1.ArrowTracesService/ArrowTraces" { + continue + } + + require.NotEqual(t, otelcodes.Error, span.Status.Code, + "Exporter span has error: %v: %v", span.Name, span.Status.Description) + } + for _, span := range testCon.recvSpans.GetSpans() { + rops[fmt.Sprintf("%v/%v", span.Name, span.Status.Code)]++ + // This span occasionally has a "transport is closing error" + if span.Name == "opentelemetry.proto.experimental.arrow.v1.ArrowTracesService/ArrowTraces" { + continue + } + + require.NotEqual(t, otelcodes.Error, span.Status.Code, + "Receiver span has error: %v: %v", span.Name, span.Status.Description) + } + return rops, eops +} + +// logSigs computes a signature of a structured log message emitted by +// the component via the Zap observer. The encoding is the message, +// "|||", followed by the field names in order, separated by "///". +// +// Specifically, we expect "arrow stream error" messages. When this is +// the case, the corresponding message is returned as a slice. +func logSigs(obs *observer.ObservedLogs) (map[string]int, []string) { + counts := map[string]int{} + var msgs []string + for _, rl := range obs.All() { + var attrs []string + for _, f := range rl.Context { + attrs = append(attrs, f.Key) + + // One way we can see memory limit errors is through the + // OTel-Arrow common "arrow stream error" message, which both + // sides will log. + if rl.Message == "arrow stream error" && f.Key == "message" { + msgs = append(msgs, f.String) + } + } + var sig strings.Builder + sig.WriteString(rl.Message) + sig.WriteString("|||") + sig.WriteString(strings.Join(attrs, "///")) + counts[sig.String()]++ + } + return counts, msgs +} + +var limitRegexp = regexp.MustCompile(`memory limit exceeded`) + +func countMemoryLimitErrors(msgs []string) (cnt int) { + for _, msg := range msgs { + // The memory errors are expected from the receiver, + // so whether these print on the exporter or receiver, + // the message will contain "otel-arrow decode" from + // the receiver. + if limitRegexp.MatchString(msg) && strings.Contains(msg, "otel-arrow decode") { + cnt++ + } + } + return +} + +func failureMemoryLimitEnding(t *testing.T, _ testParams, testCon *testConsumer, _ [][]ptrace.Traces) (rops, eops map[string]int) { + eSigs, eMsgs := logSigs(testCon.expLogs) + rSigs, rMsgs := logSigs(testCon.recvLogs) + + // Test for arrow stream errors on both sides. + require.Positive(t, eSigs["arrow stream error|||code///message///where"], "should have exporter arrow stream errors: %v", eMsgs) + require.Positive(t, rSigs["arrow stream error|||code///message///where"], "should have receiver arrow stream errors: %v", rSigs) + + // Ensure both side's error logs include admission control errors. + require.Positive(t, countMemoryLimitErrors(rMsgs), "should have memory limit errors: %v", rMsgs) + require.Positive(t, countMemoryLimitErrors(eMsgs), "should have memory limit errors: %v", eMsgs) + + return nil, nil +} + +var admissionRegexp = regexp.MustCompile(`too much pending data`) + +func countAdmissionLimitErrors(msgs []string) (cnt int) { + for _, msg := range msgs { + if admissionRegexp.MatchString(msg) { + cnt++ + } + } + return +} + +func failureAdmissionLimitEnding(t *testing.T, _ testParams, testCon *testConsumer, _ [][]ptrace.Traces) (rops, eops map[string]int) { + eSigs, eMsgs := logSigs(testCon.expLogs) + rSigs, rMsgs := logSigs(testCon.recvLogs) + + // Test for arrow stream errors on both sides. + require.Positive(t, eSigs["arrow stream error|||code///message///where"], "should have exporter arrow stream errors: %v", eMsgs) + require.Positive(t, rSigs["arrow stream error|||code///message///where"], "should have receiver arrow stream errors: %v", rSigs) + + // Ensure both side's error logs include admission limit errors. + require.Positive(t, countAdmissionLimitErrors(rMsgs), "should have admission limit errors: %v", rMsgs) + require.Positive(t, countAdmissionLimitErrors(eMsgs), "should have admission limit errors: %v", eMsgs) + + return nil, nil +} + +func consumerSuccess(t *testing.T, err error) { + require.NoError(t, err) +} + +func consumerFailure(t *testing.T, err error) { + if err == nil { + return + } + + // there should be no permanent errors anywhere in this test. + require.False(t, consumererror.IsPermanent(err), + "should not be permanent: %v", err) + + stat, ok := status.FromError(err) + require.True(t, ok, "should be a status error: %v", err) + + switch stat.Code() { + case codes.ResourceExhausted, codes.Canceled: + // Cool + default: + // Not cool + t.Fatalf("unexpected status code %v", stat) + } +} + +func TestIntegrationTracesSimple(t *testing.T) { + for _, n := range []int{1, 2, 4, 8} { + t.Run(fmt.Sprint(n), func(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + // until 10 threads can write 1000 spans + params := testParams{ + threadCount: 10, + requestWhileTrue: func(test *testConsumer) bool { + return test.sink.SpanCount() < 1000 + }, + } + + testIntegrationTraces(ctx, t, params, func(ecfg *ExpConfig, _ *RecvConfig) { + ecfg.Arrow.NumStreams = n + }, func() GenFunc { return makeTestTraces }, consumerSuccess, standardEnding) + }) + } +} + +func TestIntegrationDeadlinePropagation(t *testing.T) { + for _, hasDeadline := range []bool{false, true} { + t.Run(fmt.Sprint("deadline=", hasDeadline), func(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + // Until at least one span is written. + params := testParams{ + threadCount: 1, + requestWhileTrue: func(test *testConsumer) bool { + return test.sink.SpanCount() < 1 + }, + missingDeadline: !hasDeadline, + } + + testIntegrationTraces(ctx, t, params, func(ecfg *ExpConfig, _ *RecvConfig) { + if !hasDeadline { + // 0 disables the exporthelper-set timeout. + ecfg.TimeoutSettings.Timeout = 0 + } else { + ecfg.TimeoutSettings.Timeout = 37 * time.Minute + } + }, func() GenFunc { return makeTestTraces }, consumerSuccess, standardEnding) + }) + } +} + +func TestIntegrationMemoryLimited(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + // until exporter and receiver finish at least one ArrowTraces span. + params := testParams{ + threadCount: 10, + requestWhileTrue: func(test *testConsumer) bool { + cf := func(spans tracetest.SpanStubs) (cnt int) { + for _, span := range spans { + if span.Name == "opentelemetry.proto.experimental.arrow.v1.ArrowTracesService/ArrowTraces" { + cnt++ + } + } + return + } + rcnt := cf(test.recvSpans.GetSpans()) + ecnt := cf(test.expSpans.GetSpans()) + return ecnt == 0 || rcnt == 0 + }, + } + + testIntegrationTraces(ctx, t, params, func(ecfg *ExpConfig, rcfg *RecvConfig) { + rcfg.Arrow.MemoryLimitMiB = 1 + ecfg.Arrow.NumStreams = 10 + // Shorten timeouts for this test, because we intend + // for it to fail and don't want to wait for retries. + ecfg.TimeoutSettings.Timeout = 5 * time.Second + ecfg.RetryConfig.InitialInterval = 1 * time.Second + ecfg.RetryConfig.MaxInterval = 2 * time.Second + ecfg.RetryConfig.MaxElapsedTime = 30 * time.Second + ecfg.Arrow.MaxStreamLifetime = 5 * time.Second + }, bulkyGenFunc(), consumerFailure, failureMemoryLimitEnding) +} + +func multiStreamEnding(t *testing.T, p testParams, testCon *testConsumer, td [][]ptrace.Traces) (_, _ map[string]int) { + recvOps, expOps := standardEnding(t, p, testCon, td) + + const streamName = "opentelemetry.proto.experimental.arrow.v1.ArrowTracesService/ArrowTraces" + + total := int(testCon.sentSpans.Load()) + + // Exporter spans: + // + // This span is the Arrow gRPC client stream. Should have no + // stream errors, > 1 streams. + expStreamsUnset := expOps[streamName+"/Unset"] + expStreamsError := expOps[streamName+"/Error"] + require.Less(t, 1, expStreamsUnset+expStreamsError) + require.Equal(t, 1, expStreamsError) + + // Number of export requests: exact match. This is the + // exporterhelper's base span. + require.Equal(t, total, expOps["exporter/otelarrowexporter/traces/Unset"]) + + // Number of export requests: exact match. This span covers + // handling one request in the Arrow exporter. + require.Equal(t, total, expOps["otel_arrow_stream_send/Unset"]) + + // Receiver spans + // + // This span is the Arrow gRPC server stream, instrumented by + // otelgrpc. Because of + // https://github.com/open-telemetry/opentelemetry-go-contrib/issues/2644 + // we expect either an error or unset. There should be > 1 + // streams. + recvStreamsUnset := recvOps[streamName+"/Unset"] + recvStreamsError := recvOps[streamName+"/Error"] + require.Equal(t, 0, recvStreamsError) + require.Less(t, 1, recvStreamsUnset+recvStreamsError) + + // For each stream, there is one Recv() span at the end that ends + // in cancelation (or EOF). So we expect total to be less than + // this span count. + require.Equal(t, total+recvStreamsUnset+recvStreamsError, recvOps["otel_arrow_stream_inflight/Unset"]) + + // This is in request context, the Arrow stream handling one request. + require.Equal(t, total, recvOps["otel_arrow_stream_recv/Unset"]) + + // This is in request context, the receiverhelper's per-request span. + require.Equal(t, total, recvOps["receiver/otelarrowreceiver/TraceDataReceived/Unset"]) + + // Exporter and Receiver stream span counts match: + require.Equal(t, expStreamsUnset+expStreamsError, recvStreamsUnset+recvStreamsError) + + return recvOps, expOps +} + +func TestIntegrationSelfTracing(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + // until 2 Arrow stream spans are received from self instrumentation + params := testParams{ + threadCount: 10, + requestWhileTrue: func(test *testConsumer) bool { + cnt := 0 + for _, span := range test.expSpans.GetSpans() { + if span.Name == "opentelemetry.proto.experimental.arrow.v1.ArrowTracesService/ArrowTraces" { + cnt++ + } + } + return cnt < 2 + }, + } + + testIntegrationTraces(ctx, t, params, func(_ *ExpConfig, rcfg *RecvConfig) { + rcfg.Protocols.GRPC.Keepalive = &configgrpc.KeepaliveServerConfig{ + ServerParameters: &configgrpc.KeepaliveServerParameters{ + MaxConnectionAge: time.Second, + MaxConnectionAgeGrace: 5 * time.Second, + }, + } + }, func() GenFunc { return makeTestTraces }, consumerSuccess, multiStreamEnding) +} + +func nearLimitGenFunc() MkGen { + var sizer ptrace.ProtoMarshaler + const nearLimit = 900 << 10 // close to 1 MiB + const hardLimit = 1 << 20 // 1 MiB + + return func() GenFunc { + entropy := datagen.NewTestEntropy(int64(rand.Uint64())) //nolint:gosec // only used for testing + + tracesGen := datagen.NewTracesGenerator( + entropy, + entropy.NewStandardResourceAttributes(), + entropy.NewStandardInstrumentationScopes(), + ) + + return func(int) ptrace.Traces { + size := 100 + for { + td := tracesGen.Generate(size, time.Minute) + uncomp := sizer.TracesSize(td) + if uncomp > nearLimit && uncomp < hardLimit { + return td + } + switch { + case uncomp > hardLimit: + size -= 10 + case uncomp < nearLimit/2: + size *= 2 + default: + size += 10 + } + } + } + } +} + +func TestIntegrationAdmissionLimited(t *testing.T) { + for _, test := range []struct { + bounded bool + allowWait bool + }{ + { + bounded: true, // bounded queue + allowWait: false, // no waiters allowed + }, + { + bounded: true, // bounded queue + allowWait: true, // with waiters allowed + }, + { + bounded: false, // bounded queue + allowWait: true, // config not used + }, + } { + t.Run(fmt.Sprint("bounded=", test.bounded, ",allow_wait=", test.allowWait), func(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + // until exporter and receiver finish at least one ArrowTraces span. + params := testParams{ + threadCount: 10, + requestWhileTrue: func(test *testConsumer) bool { + return test.sink.SpanCount() < 10000 + }, + missingDeadline: true, + + // this test produces a lot of data, + // which is too expensive to verify + // with an O(N^2) algorithm. + skipVerify: true, + } + + var ending func(*testing.T, testParams, *testConsumer, [][]ptrace.Traces) (_, _ map[string]int) + var waitingLimit uint64 + var admitLimit uint64 + if test.bounded { + if test.allowWait { + admitLimit = 1 + waitingLimit = uint64(params.threadCount) + ending = standardEnding + } else { + admitLimit = 1 + waitingLimit = 0 + ending = failureAdmissionLimitEnding + } + } else { + admitLimit = 0 + waitingLimit = 0 + ending = standardEnding + } + + testIntegrationTraces(ctx, t, params, func(ecfg *ExpConfig, rcfg *RecvConfig) { + rcfg.Admission.RequestLimitMiB = admitLimit + rcfg.Admission.WaitingLimitMiB = waitingLimit + + ecfg.Arrow.NumStreams = 10 + + // Disable export timeout and retry, + // because we expect progress to be + // slow for this test. + ecfg.TimeoutSettings.Timeout = 0 + ecfg.RetryConfig.Enabled = false + ecfg.Arrow.MaxStreamLifetime = 5 * time.Second + }, nearLimitGenFunc(), consumerFailure, ending) + }) + } +} diff --git a/internal/otelarrow/testdata/common.go b/internal/otelarrow/testdata/common.go new file mode 100644 index 000000000000..b62cf24724d4 --- /dev/null +++ b/internal/otelarrow/testdata/common.go @@ -0,0 +1,30 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package testdata + +import ( + "go.opentelemetry.io/collector/pdata/pcommon" +) + +func initMetricExemplarAttributes(dest pcommon.Map) { + dest.PutStr("exemplar-attachment", "exemplar-attachment-value") +} + +func initMetricAttributes1(dest pcommon.Map) { + dest.PutStr("label-1", "label-value-1") +} + +func initMetricAttributes2(dest pcommon.Map) { + dest.PutStr("label-2", "label-value-2") +} + +func initMetricAttributes12(dest pcommon.Map) { + initMetricAttributes1(dest) + initMetricAttributes2(dest) +} + +func initMetricAttributes13(dest pcommon.Map) { + initMetricAttributes1(dest) + dest.PutStr("label-3", "label-value-3") +} diff --git a/internal/otelarrow/testdata/log.go b/internal/otelarrow/testdata/log.go new file mode 100644 index 000000000000..f8c3237995ee --- /dev/null +++ b/internal/otelarrow/testdata/log.go @@ -0,0 +1,59 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package testdata + +import ( + "time" + + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/plog" +) + +var ( + logTimestamp = pcommon.NewTimestampFromTime(time.Date(2020, 2, 11, 20, 26, 13, 789, time.UTC)) +) + +func GenerateLogs(count int) plog.Logs { + ld := plog.NewLogs() + initResource(ld.ResourceLogs().AppendEmpty().Resource()) + logs := ld.ResourceLogs().At(0).ScopeLogs().AppendEmpty().LogRecords() + logs.EnsureCapacity(count) + for i := 0; i < count; i++ { + switch i % 2 { + case 0: + fillLogTwo(logs.AppendEmpty()) + case 1: + fillLogOne(logs.AppendEmpty()) + } + } + return ld +} + +func fillLogOne(log plog.LogRecord) { + log.SetTimestamp(logTimestamp) + log.SetDroppedAttributesCount(1) + log.SetSeverityNumber(plog.SeverityNumberInfo) + log.SetSeverityText("Info") + log.SetSpanID([8]byte{0x01, 0x02, 0x04, 0x08}) + log.SetTraceID([16]byte{0x08, 0x04, 0x02, 0x01}) + + attrs := log.Attributes() + attrs.PutStr("app", "server") + attrs.PutInt("instance_num", 1) + + log.Body().SetStr("This is a log message") +} + +func fillLogTwo(log plog.LogRecord) { + log.SetTimestamp(logTimestamp + 1) + log.SetDroppedAttributesCount(1) + log.SetSeverityNumber(plog.SeverityNumberInfo) + log.SetSeverityText("Info") + + attrs := log.Attributes() + attrs.PutStr("customer", "acme") + attrs.PutStr("env", "dev") + + log.Body().SetStr("something happened") +} diff --git a/internal/otelarrow/testdata/metric.go b/internal/otelarrow/testdata/metric.go new file mode 100644 index 000000000000..26a5ab79ac56 --- /dev/null +++ b/internal/otelarrow/testdata/metric.go @@ -0,0 +1,293 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package testdata + +import ( + "time" + + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/pmetric" +) + +var ( + metricStartTimestamp = pcommon.NewTimestampFromTime(time.Date(2020, 2, 11, 20, 26, 12, 321, time.UTC)) + metricExemplarTimestamp = pcommon.NewTimestampFromTime(time.Date(2020, 2, 11, 20, 26, 13, 123, time.UTC)) + metricTimestamp = pcommon.NewTimestampFromTime(time.Date(2020, 2, 11, 20, 26, 13, 789, time.UTC)) +) + +const ( + TestGaugeDoubleMetricName = "gauge-double" + TestGaugeIntMetricName = "gauge-int" + TestSumDoubleMetricName = "sum-double" + TestSumIntMetricName = "sum-int" + TestHistogramMetricName = "histogram" + TestExponentialHistogramMetricName = "exponential-histogram" + TestSummaryMetricName = "summary" +) + +func generateMetricsOneEmptyInstrumentationScope() pmetric.Metrics { + md := pmetric.NewMetrics() + initResource(md.ResourceMetrics().AppendEmpty().Resource()) + md.ResourceMetrics().At(0).ScopeMetrics().AppendEmpty() + return md +} + +func GenerateMetricsAllTypesEmpty() pmetric.Metrics { + md := generateMetricsOneEmptyInstrumentationScope() + ms := md.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics() + + doubleGauge := ms.AppendEmpty() + initMetric(doubleGauge, TestGaugeDoubleMetricName, pmetric.MetricTypeGauge) + doubleGauge.Gauge().DataPoints().AppendEmpty() + intGauge := ms.AppendEmpty() + initMetric(intGauge, TestGaugeIntMetricName, pmetric.MetricTypeGauge) + intGauge.Gauge().DataPoints().AppendEmpty() + doubleSum := ms.AppendEmpty() + initMetric(doubleSum, TestSumDoubleMetricName, pmetric.MetricTypeSum) + doubleSum.Sum().DataPoints().AppendEmpty() + intSum := ms.AppendEmpty() + initMetric(intSum, TestSumIntMetricName, pmetric.MetricTypeSum) + intSum.Sum().DataPoints().AppendEmpty() + histogram := ms.AppendEmpty() + initMetric(histogram, TestHistogramMetricName, pmetric.MetricTypeHistogram) + histogram.Histogram().DataPoints().AppendEmpty() + summary := ms.AppendEmpty() + initMetric(summary, TestSummaryMetricName, pmetric.MetricTypeSummary) + summary.Summary().DataPoints().AppendEmpty() + return md +} + +func GenerateMetricsMetricTypeInvalid() pmetric.Metrics { + md := generateMetricsOneEmptyInstrumentationScope() + initMetric(md.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics().AppendEmpty(), TestSumIntMetricName, pmetric.MetricTypeEmpty) + return md +} + +func GenerateMetricsAllTypes() pmetric.Metrics { + md := generateMetricsOneEmptyInstrumentationScope() + ms := md.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics() + initGaugeIntMetric(ms.AppendEmpty()) + initGaugeDoubleMetric(ms.AppendEmpty()) + initSumIntMetric(ms.AppendEmpty()) + initSumDoubleMetric(ms.AppendEmpty()) + initHistogramMetric(ms.AppendEmpty()) + initExponentialHistogramMetric(ms.AppendEmpty()) + initSummaryMetric(ms.AppendEmpty()) + return md +} + +func GenerateMetrics(count int) pmetric.Metrics { + md := generateMetricsOneEmptyInstrumentationScope() + ms := md.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics() + ms.EnsureCapacity(count) + for i := 0; i < count; i++ { + switch i % 7 { + case 0: + initGaugeIntMetric(ms.AppendEmpty()) + case 1: + initGaugeDoubleMetric(ms.AppendEmpty()) + case 2: + initSumIntMetric(ms.AppendEmpty()) + case 3: + initSumDoubleMetric(ms.AppendEmpty()) + case 4: + initHistogramMetric(ms.AppendEmpty()) + case 5: + initExponentialHistogramMetric(ms.AppendEmpty()) + case 6: + initSummaryMetric(ms.AppendEmpty()) + } + } + return md +} + +func initGaugeIntMetric(im pmetric.Metric) { + initMetric(im, TestGaugeIntMetricName, pmetric.MetricTypeGauge) + + idps := im.Gauge().DataPoints() + idp0 := idps.AppendEmpty() + initMetricAttributes1(idp0.Attributes()) + idp0.SetStartTimestamp(metricStartTimestamp) + idp0.SetTimestamp(metricTimestamp) + idp0.SetIntValue(123) + idp1 := idps.AppendEmpty() + initMetricAttributes2(idp1.Attributes()) + idp1.SetStartTimestamp(metricStartTimestamp) + idp1.SetTimestamp(metricTimestamp) + idp1.SetIntValue(456) +} + +func initGaugeDoubleMetric(im pmetric.Metric) { + initMetric(im, TestGaugeDoubleMetricName, pmetric.MetricTypeGauge) + + idps := im.Gauge().DataPoints() + idp0 := idps.AppendEmpty() + initMetricAttributes12(idp0.Attributes()) + idp0.SetStartTimestamp(metricStartTimestamp) + idp0.SetTimestamp(metricTimestamp) + idp0.SetDoubleValue(1.23) + idp1 := idps.AppendEmpty() + initMetricAttributes13(idp1.Attributes()) + idp1.SetStartTimestamp(metricStartTimestamp) + idp1.SetTimestamp(metricTimestamp) + idp1.SetDoubleValue(4.56) +} + +func initSumIntMetric(im pmetric.Metric) { + initMetric(im, TestSumIntMetricName, pmetric.MetricTypeSum) + + idps := im.Sum().DataPoints() + idp0 := idps.AppendEmpty() + initMetricAttributes1(idp0.Attributes()) + idp0.SetStartTimestamp(metricStartTimestamp) + idp0.SetTimestamp(metricTimestamp) + idp0.SetIntValue(123) + idp1 := idps.AppendEmpty() + initMetricAttributes2(idp1.Attributes()) + idp1.SetStartTimestamp(metricStartTimestamp) + idp1.SetTimestamp(metricTimestamp) + idp1.SetIntValue(456) +} + +func initSumDoubleMetric(dm pmetric.Metric) { + initMetric(dm, TestSumDoubleMetricName, pmetric.MetricTypeSum) + + ddps := dm.Sum().DataPoints() + ddp0 := ddps.AppendEmpty() + initMetricAttributes12(ddp0.Attributes()) + ddp0.SetStartTimestamp(metricStartTimestamp) + ddp0.SetTimestamp(metricTimestamp) + ddp0.SetDoubleValue(1.23) + + ddp1 := ddps.AppendEmpty() + initMetricAttributes13(ddp1.Attributes()) + ddp1.SetStartTimestamp(metricStartTimestamp) + ddp1.SetTimestamp(metricTimestamp) + ddp1.SetDoubleValue(4.56) +} + +func initHistogramMetric(hm pmetric.Metric) { + initMetric(hm, TestHistogramMetricName, pmetric.MetricTypeHistogram) + + hdps := hm.Histogram().DataPoints() + hdp0 := hdps.AppendEmpty() + initMetricAttributes13(hdp0.Attributes()) + hdp0.SetStartTimestamp(metricStartTimestamp) + hdp0.SetTimestamp(metricTimestamp) + hdp0.SetCount(1) + hdp0.SetSum(15) + + hdp1 := hdps.AppendEmpty() + initMetricAttributes2(hdp1.Attributes()) + hdp1.SetStartTimestamp(metricStartTimestamp) + hdp1.SetTimestamp(metricTimestamp) + hdp1.SetCount(1) + hdp1.SetSum(15) + hdp1.SetMin(15) + hdp1.SetMax(15) + hdp1.BucketCounts().FromRaw([]uint64{0, 1}) + exemplar := hdp1.Exemplars().AppendEmpty() + exemplar.SetTimestamp(metricExemplarTimestamp) + exemplar.SetDoubleValue(15) + initMetricExemplarAttributes(exemplar.FilteredAttributes()) + hdp1.ExplicitBounds().FromRaw([]float64{1}) +} + +func initExponentialHistogramMetric(hm pmetric.Metric) { + initMetric(hm, TestExponentialHistogramMetricName, pmetric.MetricTypeExponentialHistogram) + + hdps := hm.ExponentialHistogram().DataPoints() + hdp0 := hdps.AppendEmpty() + initMetricAttributes13(hdp0.Attributes()) + hdp0.SetStartTimestamp(metricStartTimestamp) + hdp0.SetTimestamp(metricTimestamp) + hdp0.SetCount(5) + hdp0.SetSum(0.15) + hdp0.SetZeroCount(1) + hdp0.SetScale(1) + + // positive index 1 and 2 are values sqrt(2), 2 at scale 1 + hdp0.Positive().SetOffset(1) + hdp0.Positive().BucketCounts().FromRaw([]uint64{1, 1}) + // negative index -1 and 0 are values -1/sqrt(2), -1 at scale 1 + hdp0.Negative().SetOffset(-1) + hdp0.Negative().BucketCounts().FromRaw([]uint64{1, 1}) + + // The above will print: + // Bucket (-1.414214, -1.000000], Count: 1 + // Bucket (-1.000000, -0.707107], Count: 1 + // Bucket [0, 0], Count: 1 + // Bucket [0.707107, 1.000000), Count: 1 + // Bucket [1.000000, 1.414214), Count: 1 + + hdp1 := hdps.AppendEmpty() + initMetricAttributes2(hdp1.Attributes()) + hdp1.SetStartTimestamp(metricStartTimestamp) + hdp1.SetTimestamp(metricTimestamp) + hdp1.SetCount(3) + hdp1.SetSum(1.25) + hdp1.SetMin(0) + hdp1.SetMax(1) + hdp1.SetZeroCount(1) + hdp1.SetScale(-1) + + // index -1 and 0 are values 0.25, 1 at scale -1 + hdp1.Positive().SetOffset(-1) + hdp1.Positive().BucketCounts().FromRaw([]uint64{1, 1}) + + // The above will print: + // Bucket [0, 0], Count: 1 + // Bucket [0.250000, 1.000000), Count: 1 + // Bucket [1.000000, 4.000000), Count: 1 + + exemplar := hdp1.Exemplars().AppendEmpty() + exemplar.SetTimestamp(metricExemplarTimestamp) + exemplar.SetDoubleValue(15) + initMetricExemplarAttributes(exemplar.FilteredAttributes()) +} + +func initSummaryMetric(sm pmetric.Metric) { + initMetric(sm, TestSummaryMetricName, pmetric.MetricTypeSummary) + + sdps := sm.Summary().DataPoints() + sdp0 := sdps.AppendEmpty() + initMetricAttributes13(sdp0.Attributes()) + sdp0.SetStartTimestamp(metricStartTimestamp) + sdp0.SetTimestamp(metricTimestamp) + sdp0.SetCount(1) + sdp0.SetSum(15) + + sdp1 := sdps.AppendEmpty() + initMetricAttributes2(sdp1.Attributes()) + sdp1.SetStartTimestamp(metricStartTimestamp) + sdp1.SetTimestamp(metricTimestamp) + sdp1.SetCount(1) + sdp1.SetSum(15) + + quantile := sdp1.QuantileValues().AppendEmpty() + quantile.SetQuantile(0.01) + quantile.SetValue(15) +} + +func initMetric(m pmetric.Metric, name string, ty pmetric.MetricType) { + m.SetName(name) + m.SetDescription("") + m.SetUnit("1") + switch ty { + case pmetric.MetricTypeGauge: + m.SetEmptyGauge() + case pmetric.MetricTypeSum: + sum := m.SetEmptySum() + sum.SetIsMonotonic(true) + sum.SetAggregationTemporality(pmetric.AggregationTemporalityCumulative) + case pmetric.MetricTypeHistogram: + histo := m.SetEmptyHistogram() + histo.SetAggregationTemporality(pmetric.AggregationTemporalityCumulative) + case pmetric.MetricTypeExponentialHistogram: + histo := m.SetEmptyExponentialHistogram() + histo.SetAggregationTemporality(pmetric.AggregationTemporalityDelta) + case pmetric.MetricTypeSummary: + m.SetEmptySummary() + } +} diff --git a/internal/otelarrow/testdata/resource.go b/internal/otelarrow/testdata/resource.go new file mode 100644 index 000000000000..cac7a4046021 --- /dev/null +++ b/internal/otelarrow/testdata/resource.go @@ -0,0 +1,10 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package testdata + +import "go.opentelemetry.io/collector/pdata/pcommon" + +func initResource(r pcommon.Resource) { + r.Attributes().PutStr("resource-attr", "resource-attr-val-1") +} diff --git a/internal/otelarrow/testdata/trace.go b/internal/otelarrow/testdata/trace.go new file mode 100644 index 000000000000..c4fd6e5e51f4 --- /dev/null +++ b/internal/otelarrow/testdata/trace.go @@ -0,0 +1,71 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package testdata + +import ( + "time" + + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/ptrace" +) + +var ( + spanStartTimestamp = pcommon.NewTimestampFromTime(time.Date(2020, 2, 11, 20, 26, 12, 321, time.UTC)) + spanEventTimestamp = pcommon.NewTimestampFromTime(time.Date(2020, 2, 11, 20, 26, 13, 123, time.UTC)) + spanEndTimestamp = pcommon.NewTimestampFromTime(time.Date(2020, 2, 11, 20, 26, 13, 789, time.UTC)) +) + +func GenerateTraces(spanCount int) ptrace.Traces { + td := ptrace.NewTraces() + initResource(td.ResourceSpans().AppendEmpty().Resource()) + ss := td.ResourceSpans().At(0).ScopeSpans().AppendEmpty().Spans() + ss.EnsureCapacity(spanCount) + for i := 0; i < spanCount; i++ { + switch i % 2 { + case 0: + fillSpanOne(ss.AppendEmpty()) + case 1: + fillSpanTwo(ss.AppendEmpty()) + } + } + return td +} + +func fillSpanOne(span ptrace.Span) { + span.SetName("operationA") + span.SetStartTimestamp(spanStartTimestamp) + span.SetEndTimestamp(spanEndTimestamp) + span.SetDroppedAttributesCount(1) + span.SetTraceID([16]byte{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10}) + span.SetSpanID([8]byte{0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18}) + evs := span.Events() + + ev0 := evs.AppendEmpty() + ev0.SetTimestamp(spanEventTimestamp) + ev0.SetName("event") + ev0.SetDroppedAttributesCount(2) + + ev1 := evs.AppendEmpty() + ev1.SetTimestamp(spanEventTimestamp) + ev1.SetName("event-with-attr") + ev1.Attributes().PutStr("span-event-attr", "span-event-attr-val") + ev1.SetDroppedAttributesCount(2) + + span.SetDroppedEventsCount(1) + status := span.Status() + status.SetCode(ptrace.StatusCodeError) + status.SetMessage("status-cancelled") +} + +func fillSpanTwo(span ptrace.Span) { + span.SetName("operationB") + span.SetStartTimestamp(spanStartTimestamp) + span.SetEndTimestamp(spanEndTimestamp) + link0 := span.Links().AppendEmpty() + link0.Attributes().PutStr("span-link-attr", "span-link-attr-val") + link0.SetDroppedAttributesCount(4) + link1 := span.Links().AppendEmpty() + link1.SetDroppedAttributesCount(4) + span.SetDroppedLinksCount(3) +} diff --git a/internal/otelarrow/testutil/testutil.go b/internal/otelarrow/testutil/testutil.go new file mode 100644 index 000000000000..1ad0a852d9b9 --- /dev/null +++ b/internal/otelarrow/testutil/testutil.go @@ -0,0 +1,117 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package testutil // import "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/testutil" + +import ( + "encoding/binary" + "net" + "os/exec" + "runtime" + "strings" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/pdata/pcommon" +) + +type portpair struct { + first string + last string +} + +// GetAvailableLocalAddress finds an available local port and returns an endpoint +// describing it. The port is available for opening when this function returns +// provided that there is no race by some other code to grab the same port +// immediately. +func GetAvailableLocalAddress(tb testing.TB) string { + // Retry has been added for windows as net.Listen can return a port that is not actually available. Details can be + // found in https://github.com/docker/for-win/issues/3171 but to summarize Hyper-V will reserve ranges of ports + // which do not show up under the "netstat -ano" but can only be found by + // "netsh interface ipv4 show excludedportrange protocol=tcp". We'll use []exclusions to hold those ranges and + // retry if the port returned by GetAvailableLocalAddress falls in one of those them. + var exclusions []portpair + portFound := false + if runtime.GOOS == "windows" { + exclusions = getExclusionsList(tb) + } + + var endpoint string + for !portFound { + endpoint = findAvailableAddress(tb) + _, port, err := net.SplitHostPort(endpoint) + require.NoError(tb, err) + portFound = true + if runtime.GOOS == "windows" { + for _, pair := range exclusions { + if port >= pair.first && port <= pair.last { + portFound = false + break + } + } + } + } + + return endpoint +} + +func findAvailableAddress(tb testing.TB) string { + ln, err := net.Listen("tcp", "localhost:0") + require.NoError(tb, err, "Failed to get a free local port") + // There is a possible race if something else takes this same port before + // the test uses it, however, that is unlikely in practice. + defer func() { + assert.NoError(tb, ln.Close()) + }() + return ln.Addr().String() +} + +// Get excluded ports on Windows from the command: netsh interface ipv4 show excludedportrange protocol=tcp +func getExclusionsList(tb testing.TB) []portpair { + cmdTCP := exec.Command("netsh", "interface", "ipv4", "show", "excludedportrange", "protocol=tcp") + outputTCP, errTCP := cmdTCP.CombinedOutput() + require.NoError(tb, errTCP) + exclusions := createExclusionsList(tb, string(outputTCP)) + + cmdUDP := exec.Command("netsh", "interface", "ipv4", "show", "excludedportrange", "protocol=udp") + outputUDP, errUDP := cmdUDP.CombinedOutput() + require.NoError(tb, errUDP) + exclusions = append(exclusions, createExclusionsList(tb, string(outputUDP))...) + + return exclusions +} + +func createExclusionsList(tb testing.TB, exclusionsText string) []portpair { + var exclusions []portpair + + parts := strings.Split(exclusionsText, "--------") + require.Len(tb, parts, 3) + portsText := strings.Split(parts[2], "*") + require.Greater(tb, len(portsText), 1) // original text may have a suffix like " - Administered port exclusions." + lines := strings.Split(portsText[0], "\n") + for _, line := range lines { + if strings.TrimSpace(line) != "" { + entries := strings.Fields(strings.TrimSpace(line)) + require.Len(tb, entries, 2) + pair := portpair{entries[0], entries[1]} + exclusions = append(exclusions, pair) + } + } + return exclusions +} + +// UInt64ToTraceID is from collector-contrib/internal/idutils +func UInt64ToTraceID(high, low uint64) pcommon.TraceID { + traceID := [16]byte{} + binary.BigEndian.PutUint64(traceID[:8], high) + binary.BigEndian.PutUint64(traceID[8:], low) + return traceID +} + +// UInt64ToSpanID is from collector-contrib/internal/idutils +func UInt64ToSpanID(id uint64) pcommon.SpanID { + spanID := [8]byte{} + binary.BigEndian.PutUint64(spanID[:8], id) + return spanID +} diff --git a/internal/otelarrow/testutil/testutil_test.go b/internal/otelarrow/testutil/testutil_test.go new file mode 100644 index 000000000000..0e692637f10a --- /dev/null +++ b/internal/otelarrow/testutil/testutil_test.go @@ -0,0 +1,57 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package testutil + +import ( + "net" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestGetAvailableLocalAddress(t *testing.T) { + endpoint := GetAvailableLocalAddress(t) + + // Endpoint should be free. + ln0, err := net.Listen("tcp", endpoint) + require.NoError(t, err) + require.NotNil(t, ln0) + t.Cleanup(func() { + assert.NoError(t, ln0.Close()) + }) + + // Ensure that the endpoint wasn't something like ":0" by checking that a + // second listener will fail. + ln1, err := net.Listen("tcp", endpoint) + require.Error(t, err) + require.Nil(t, ln1) +} + +func TestCreateExclusionsList(t *testing.T) { + // Test two examples of typical output from "netsh interface ipv4 show excludedportrange protocol=tcp" + emptyExclusionsText := ` + +Protocol tcp Port Exclusion Ranges + +Start Port End Port +---------- -------- + +* - Administered port exclusions.` + + exclusionsText := ` + +Start Port End Port +---------- -------- + 49697 49796 + 49797 49896 + +* - Administered port exclusions. +` + exclusions := createExclusionsList(t, exclusionsText) + require.Len(t, exclusions, 2) + + emptyExclusions := createExclusionsList(t, emptyExclusionsText) + require.Empty(t, emptyExclusions) +} diff --git a/internal/pdatautil/attributes.go b/internal/pdatautil/attributes.go new file mode 100644 index 000000000000..6963e93d8c6f --- /dev/null +++ b/internal/pdatautil/attributes.go @@ -0,0 +1,41 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package pdatautil // import "github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil" + +import "go.opentelemetry.io/collector/pdata/pcommon" + +type Dimension struct { + Name string + Value *pcommon.Value +} + +// GetDimensionValue gets the Dimension Value for the given configured Dimension. +// It iterates over multiple attributes until a value is found. +// The order comes first, the higher the priority. +// Finally, falls back to the configured default value if provided. +// +// The ok flag indicates if a Dimension Value was fetched in order to differentiate +// an empty string value from a state where no value was found. +func GetDimensionValue(d Dimension, attributes ...pcommon.Map) (v pcommon.Value, ok bool) { + for _, attrs := range attributes { + if attr, exists := attrs.Get(d.Name); exists { + return attr, true + } + } + // Set the default if configured, otherwise this metric will have no Value set for the Dimension. + if d.Value != nil { + return *d.Value, true + } + return v, ok +} + +// GetAttributeValue look up value from the given attributes for the specified key, and if not found, return empty string. +func GetAttributeValue(key string, attributes ...pcommon.Map) (string, bool) { + for _, attr := range attributes { + if v, ok := attr.Get(key); ok { + return v.AsString(), true + } + } + return "", false +} diff --git a/internal/pdatautil/attributes_test.go b/internal/pdatautil/attributes_test.go new file mode 100644 index 000000000000..7fea4472aa0e --- /dev/null +++ b/internal/pdatautil/attributes_test.go @@ -0,0 +1,63 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package pdatautil + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "go.opentelemetry.io/collector/pdata/pcommon" +) + +func TestGetDimensionValue(t *testing.T) { + resourceattris := pcommon.NewMap() + resourceattris.PutStr("service.name", "mock-service-name") + + spanattris := pcommon.NewMap() + spanattris.PutStr("span.name", "mock-span-name") + + otherattris := pcommon.NewMap() + otherattris.PutStr("a", "b") + otherattris.PutStr("foo", "bar") + + defaultFoo := pcommon.NewValueStr("bar") + + tests := []struct { + name string + dimension Dimension + attributes []pcommon.Map + wantDimensionVal string + }{ + { + name: "success get dimension value", + dimension: Dimension{Name: "foo"}, + attributes: []pcommon.Map{resourceattris, spanattris, otherattris}, + wantDimensionVal: "bar", + }, + { + name: "not found and get default dimension provided value", + dimension: Dimension{ + Name: "foo", + Value: &defaultFoo, + }, + attributes: []pcommon.Map{resourceattris, spanattris}, + wantDimensionVal: "bar", + }, + { + name: "not found and get default get empty value", + dimension: Dimension{ + Name: "foo", + }, + attributes: []pcommon.Map{resourceattris, spanattris}, + wantDimensionVal: "", + }, + } + + for _, tc := range tests { + val, ok := GetDimensionValue(tc.dimension, tc.attributes...) + if ok { + assert.Equal(t, tc.wantDimensionVal, val.AsString()) + } + } +} diff --git a/internal/pdatautil/go.mod b/internal/pdatautil/go.mod index 81ede4111ae7..9f1aaf33988a 100644 --- a/internal/pdatautil/go.mod +++ b/internal/pdatautil/go.mod @@ -1,12 +1,12 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/pdata v1.9.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/pdata v1.22.0 ) require ( @@ -18,12 +18,12 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.24.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/internal/pdatautil/go.sum b/internal/pdatautil/go.sum index 5b3571d1becc..4b549a71d067 100644 --- a/internal/pdatautil/go.sum +++ b/internal/pdatautil/go.sum @@ -5,6 +5,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -27,12 +29,12 @@ github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjR github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -46,20 +48,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -68,12 +70,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/internal/pdatautil/logs_test.go b/internal/pdatautil/logs_test.go index 48329fac7876..75b51344a24e 100644 --- a/internal/pdatautil/logs_test.go +++ b/internal/pdatautil/logs_test.go @@ -142,13 +142,15 @@ func TestGroupByResourceLogs(t *testing.T) { }, { name: "single", - input: []resourceLogs{newResourceLogs(1, - newScopeLogs(11, 101, 102, 103), - ), + input: []resourceLogs{ + newResourceLogs(1, + newScopeLogs(11, 101, 102, 103), + ), }, - expected: []resourceLogs{newResourceLogs(1, - newScopeLogs(11, 101, 102, 103), - ), + expected: []resourceLogs{ + newResourceLogs(1, + newScopeLogs(11, 101, 102, 103), + ), }, }, { diff --git a/internal/rabbitmq/Makefile b/internal/rabbitmq/Makefile new file mode 100644 index 000000000000..ded7a36092dc --- /dev/null +++ b/internal/rabbitmq/Makefile @@ -0,0 +1 @@ +include ../../Makefile.Common diff --git a/internal/rabbitmq/client.go b/internal/rabbitmq/client.go new file mode 100644 index 000000000000..9fa868da3397 --- /dev/null +++ b/internal/rabbitmq/client.go @@ -0,0 +1,201 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package rabbitmq // import "github.com/open-telemetry/opentelemetry-collector-contrib/internal/rabbitmq" + +import ( + "context" + "crypto/tls" + "errors" + "sync" + "time" + + amqp "github.com/rabbitmq/amqp091-go" + "go.uber.org/zap" +) + +type AmqpClient interface { + DialConfig(config DialConfig) (Connection, error) +} + +type Connection interface { + ReconnectIfUnhealthy() error + IsClosed() bool + Channel() (Channel, error) + NotifyClose(receiver chan *amqp.Error) chan *amqp.Error + Close() error +} + +type Channel interface { + Confirm(noWait bool) error + PublishWithDeferredConfirmWithContext(ctx context.Context, exchange, key string, mandatory, immediate bool, msg amqp.Publishing) (DeferredConfirmation, error) + IsClosed() bool + Close() error +} + +type DeferredConfirmation interface { + Done() <-chan struct{} + Acked() bool +} + +type connectionHolder struct { + url string + config amqp.Config + connection *amqp.Connection + logger *zap.Logger + connLock *sync.Mutex + connectionErrors chan *amqp.Error +} + +type channelHolder struct { + channel *amqp.Channel +} + +type deferredConfirmationHolder struct { + confirmation *amqp.DeferredConfirmation +} + +type DialConfig struct { + URL string + Vhost string + Auth amqp.Authentication + ConnectionTimeout time.Duration + Heartbeat time.Duration + TLS *tls.Config + ConnectionName string +} + +func NewAmqpClient(logger *zap.Logger) AmqpClient { + return &client{logger: logger} +} + +type client struct { + logger *zap.Logger +} + +func (c *client) DialConfig(config DialConfig) (Connection, error) { + properties := amqp.Table{} + properties.SetClientConnectionName(config.ConnectionName) + ch := &connectionHolder{ + url: config.URL, + config: amqp.Config{ + SASL: []amqp.Authentication{config.Auth}, + Vhost: config.Vhost, + TLSClientConfig: config.TLS, + Heartbeat: config.Heartbeat, + Dial: amqp.DefaultDial(config.ConnectionTimeout), + Properties: properties, + }, + logger: c.logger, + connLock: &sync.Mutex{}, + connectionErrors: make(chan *amqp.Error, 1), + } + + ch.connLock.Lock() + defer ch.connLock.Unlock() + + return ch, ch.connect() +} + +func (c *connectionHolder) ReconnectIfUnhealthy() error { + c.connLock.Lock() + defer c.connLock.Unlock() + + hasConnectionError := false + select { + case err := <-c.connectionErrors: + hasConnectionError = true + c.logger.Info("Received connection error, will retry restoring unhealthy connection", zap.Error(err)) + default: + break + } + + if hasConnectionError || !c.isConnected() { + if c.isConnected() { + err := c.connection.Close() + if err != nil { + c.logger.Warn("Error closing unhealthy connection", zap.Error(err)) + } + } + + if err := c.connect(); err != nil { + return errors.Join(errors.New("failed attempt at restoring unhealthy connection"), err) + } + c.logger.Info("Successfully restored unhealthy rabbitmq connection") + } + + return nil +} + +func (c *connectionHolder) connect() error { + c.logger.Debug("Connecting to rabbitmq") + + connection, err := amqp.DialConfig(c.url, c.config) + if connection != nil { + c.connection = connection + } + if err != nil { + return err + } + + // Goal is to lazily restore the connection so this needs to be buffered to avoid blocking on asynchronous amqp errors. + // Also re-create this channel each time because apparently the amqp library can close it + c.connectionErrors = make(chan *amqp.Error, 1) + c.connection.NotifyClose(c.connectionErrors) + return nil +} + +func (c *connectionHolder) Close() error { + if c.isConnected() { + return c.connection.Close() + } + return nil +} + +func (c *connectionHolder) isConnected() bool { + return c.connection != nil && !c.IsClosed() +} + +func (c *connectionHolder) Channel() (Channel, error) { + channel, err := c.connection.Channel() + if err != nil { + return nil, err + } + return &channelHolder{channel: channel}, nil +} + +func (c *connectionHolder) IsClosed() bool { + return c.connection.IsClosed() +} + +func (c *connectionHolder) NotifyClose(receiver chan *amqp.Error) chan *amqp.Error { + return c.connection.NotifyClose(receiver) +} + +func (c *channelHolder) Confirm(noWait bool) error { + return c.channel.Confirm(noWait) +} + +func (c *channelHolder) PublishWithDeferredConfirmWithContext(ctx context.Context, exchange, key string, mandatory, immediate bool, msg amqp.Publishing) (DeferredConfirmation, error) { + confirmation, err := c.channel.PublishWithDeferredConfirmWithContext(ctx, exchange, key, mandatory, immediate, msg) + if err != nil { + return nil, err + } + return &deferredConfirmationHolder{confirmation: confirmation}, nil +} + +func (c *channelHolder) IsClosed() bool { + return c.channel.IsClosed() +} + +func (c *channelHolder) Close() error { + return c.channel.Close() +} + +func (d *deferredConfirmationHolder) Done() <-chan struct{} { + return d.confirmation.Done() +} + +func (d *deferredConfirmationHolder) Acked() bool { + return d.confirmation.Acked() +} diff --git a/internal/rabbitmq/client_test.go b/internal/rabbitmq/client_test.go new file mode 100644 index 000000000000..79cdf32ed2fd --- /dev/null +++ b/internal/rabbitmq/client_test.go @@ -0,0 +1,190 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package rabbitmq + +import ( + "context" + "crypto/tls" + "runtime" + "sync" + "testing" + "time" + + amqp "github.com/rabbitmq/amqp091-go" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "go.uber.org/zap" +) + +type MockConnection struct { + mock.Mock +} + +func (m *MockConnection) ReconnectIfUnhealthy() error { + args := m.Called() + return args.Error(0) +} + +func (m *MockConnection) IsClosed() bool { + args := m.Called() + return args.Bool(0) +} + +func (m *MockConnection) Channel() (Channel, error) { + args := m.Called() + return args.Get(0).(Channel), args.Error(1) +} + +func (m *MockConnection) NotifyClose(receiver chan *amqp.Error) chan *amqp.Error { + args := m.Called(receiver) + return args.Get(0).(chan *amqp.Error) +} + +func (m *MockConnection) Close() error { + args := m.Called() + return args.Error(0) +} + +type MockChannel struct { + mock.Mock +} + +func (m *MockChannel) Confirm(noWait bool) error { + args := m.Called(noWait) + return args.Error(0) +} + +func (m *MockChannel) PublishWithDeferredConfirmWithContext(ctx context.Context, exchange, key string, mandatory, immediate bool, msg amqp.Publishing) (DeferredConfirmation, error) { + args := m.Called(ctx, exchange, key, mandatory, immediate, msg) + return args.Get(0).(DeferredConfirmation), args.Error(1) +} + +func (m *MockChannel) IsClosed() bool { + args := m.Called() + return args.Bool(0) +} + +func (m *MockChannel) Close() error { + args := m.Called() + return args.Error(0) +} + +type MockDeferredConfirmation struct { + mock.Mock +} + +func (m *MockDeferredConfirmation) Done() <-chan struct{} { + args := m.Called() + return args.Get(0).(chan struct{}) +} + +func (m *MockDeferredConfirmation) Acked() bool { + args := m.Called() + return args.Bool(0) +} + +func TestDialConfig(t *testing.T) { + logger := zap.NewNop() + client := NewAmqpClient(logger) + + config := DialConfig{ + URL: "amqp://guest:guest@localhost:5672/", + Vhost: "/", + Auth: &amqp.PlainAuth{Username: "guest", Password: "guest"}, + ConnectionTimeout: 10 * time.Second, + Heartbeat: 10 * time.Second, + TLS: &tls.Config{}, + ConnectionName: "test-connection", + } + + conn, err := client.DialConfig(config) + if runtime.GOOS == "windows" { + assert.ErrorContains(t, err, "No connection could be made") + } else { + assert.ErrorContains(t, err, "connect: connection refused") + } + assert.NotNil(t, conn) +} + +func TestReconnectIfUnhealthy(t *testing.T) { + connection := &connectionHolder{ + logger: zap.NewNop(), + connLock: &sync.Mutex{}, + connectionErrors: make(chan *amqp.Error, 1), + url: "amqp://guest:guest@localhost:5672/", + config: amqp.Config{ + Vhost: "/", + }, + } + + connection.connectionErrors <- &amqp.Error{ + Code: 0, + Reason: "mock error", + Server: false, + Recover: false, + } + + err := connection.ReconnectIfUnhealthy() + if runtime.GOOS == "windows" { + assert.ErrorContains(t, err, "No connection could be made") + } else { + assert.ErrorContains(t, err, "connect: connection refused") + } +} + +func TestIsConnected(t *testing.T) { + logger := zap.NewNop() + connection := &connectionHolder{ + logger: logger, + connLock: &sync.Mutex{}, + } + + assert.False(t, connection.isConnected()) +} + +func TestChannel(t *testing.T) { + mockConn := new(MockConnection) + mockChan := new(MockChannel) + + mockConn.On("Channel").Return(mockChan, nil) + mockChan.On("Confirm", false).Return(nil) + mockChan.On("PublishWithDeferredConfirmWithContext", mock.Anything, "exchange", "key", false, false, mock.Anything).Return(new(MockDeferredConfirmation), nil) + mockChan.On("IsClosed").Return(false) + mockChan.On("Close").Return(nil) + + channel, err := mockConn.Channel() + assert.NoError(t, err) + assert.NotNil(t, channel) + + err = channel.Confirm(false) + assert.NoError(t, err) + + ctx := context.Background() + deferredConf, err := channel.PublishWithDeferredConfirmWithContext(ctx, "exchange", "key", false, false, amqp.Publishing{}) + assert.NoError(t, err) + assert.NotNil(t, deferredConf) + + assert.False(t, channel.IsClosed()) + + err = channel.Close() + assert.NoError(t, err) + + mockConn.AssertExpectations(t) + mockChan.AssertExpectations(t) +} + +func TestPublishWithDeferredConfirmWithContext(t *testing.T) { + mockChan := new(MockChannel) + mockDefConf := new(MockDeferredConfirmation) + ctx := context.Background() + + mockChan.On("PublishWithDeferredConfirmWithContext", ctx, "exchange", "key", false, false, mock.Anything).Return(mockDefConf, nil) + + deferredConf, err := mockChan.PublishWithDeferredConfirmWithContext(ctx, "exchange", "key", false, false, amqp.Publishing{}) + assert.NoError(t, err) + assert.NotNil(t, deferredConf) + + mockChan.AssertExpectations(t) + mockDefConf.AssertExpectations(t) +} diff --git a/internal/rabbitmq/go.mod b/internal/rabbitmq/go.mod new file mode 100644 index 000000000000..1536aa8fab5e --- /dev/null +++ b/internal/rabbitmq/go.mod @@ -0,0 +1,17 @@ +module github.com/open-telemetry/opentelemetry-collector-contrib/internal/rabbitmq + +go 1.22.0 + +require ( + github.com/rabbitmq/amqp091-go v1.10.0 + github.com/stretchr/testify v1.10.0 + go.uber.org/zap v1.27.0 +) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/stretchr/objx v0.5.2 // indirect + go.uber.org/multierr v1.10.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/internal/rabbitmq/go.sum b/internal/rabbitmq/go.sum new file mode 100644 index 000000000000..b01797957a44 --- /dev/null +++ b/internal/rabbitmq/go.sum @@ -0,0 +1,20 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rabbitmq/amqp091-go v1.10.0 h1:STpn5XsHlHGcecLmMFCtg7mqq0RnD+zFr4uzukfVhBw= +github.com/rabbitmq/amqp091-go v1.10.0/go.mod h1:Hy4jKW5kQART1u+JkDTF9YYOQUHXqMuhrgxOEeS7G4o= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= +go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/rabbitmq/metadata.yaml b/internal/rabbitmq/metadata.yaml new file mode 100644 index 000000000000..416b20ab1932 --- /dev/null +++ b/internal/rabbitmq/metadata.yaml @@ -0,0 +1,3 @@ +status: + codeowners: + active: [swar8080, atoulme] diff --git a/internal/sharedcomponent/go.mod b/internal/sharedcomponent/go.mod index bac9a2df030f..48b4683eb2bd 100644 --- a/internal/sharedcomponent/go.mod +++ b/internal/sharedcomponent/go.mod @@ -1,48 +1,36 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent -go 1.21.0 +go 1.22.0 require ( - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 go.uber.org/goleak v1.3.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/knadh/koanf/maps v0.1.1 // indirect - github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect - github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/confmap v0.102.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/metric v1.27.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - go.opentelemetry.io/otel/trace v1.27.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/internal/sharedcomponent/go.sum b/internal/sharedcomponent/go.sum index 27bd431c4509..b8943a303863 100644 --- a/internal/sharedcomponent/go.sum +++ b/internal/sharedcomponent/go.sum @@ -1,72 +1,50 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= -github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= -github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= -github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -82,20 +60,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -104,12 +82,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/internal/sharedcomponent/sharedcomponent_test.go b/internal/sharedcomponent/sharedcomponent_test.go index dad4886c1766..09d3cb690a8e 100644 --- a/internal/sharedcomponent/sharedcomponent_test.go +++ b/internal/sharedcomponent/sharedcomponent_test.go @@ -17,7 +17,7 @@ var id = component.MustNewID("test") func TestNewSharedComponents(t *testing.T) { comps := NewSharedComponents() - assert.Len(t, comps.comps, 0) + assert.Empty(t, comps.comps) } type mockComponent struct { @@ -37,7 +37,7 @@ func TestSharedComponents_GetOrAdd(t *testing.T) { // Shutdown nop will remove assert.NoError(t, got.Shutdown(context.Background())) - assert.Len(t, comps.comps, 0) + assert.Empty(t, comps.comps) assert.NotSame(t, got, comps.GetOrAdd(id, createNop)) } diff --git a/internal/splunk/common.go b/internal/splunk/common.go index a98d064b6513..e57ecaf53e15 100644 --- a/internal/splunk/common.go +++ b/internal/splunk/common.go @@ -5,6 +5,7 @@ package splunk // import "github.com/open-telemetry/opentelemetry-collector-cont import ( "encoding/json" + "regexp" "strconv" "strings" ) @@ -31,8 +32,14 @@ const ( DefaultRawPath = "/services/collector/raw" DefaultHealthPath = "/services/collector/health" DefaultAckPath = "/services/collector/ack" + + // https://docs.splunk.com/Documentation/Splunk/9.2.1/Metrics/Overview#What_is_a_metric_data_point.3F + // metric name can contain letters, numbers, underscore, dot or colon. cannot start with number or underscore, or contain metric_name + metricNamePattern = "^metric_name:([A-Za-z\\.:][A-Za-z0-9_\\.:]*)$" ) +var metricNameRegexp = regexp.MustCompile(metricNamePattern) + // AccessTokenPassthroughConfig configures passing through access tokens. type AccessTokenPassthroughConfig struct { // AccessTokenPassthrough indicates whether to associate datapoints with an organization access token received in request. @@ -55,6 +62,18 @@ func (e *Event) IsMetric() bool { return e.Event == HecEventMetricType || (e.Event == nil && len(e.GetMetricValues()) > 0) } +// checks if the field name matches the requirements for a metric datapoint field, +// and returns the metric name and a bool indicating whether the field is a metric. +func getMetricNameFromField(fieldName string) (string, bool) { + // only consider metric name if it fits regex criteria. + // use matches[1] since first element contains entire string. + // first subgroup will be the actual metric name. + if matches := metricNameRegexp.FindStringSubmatch(fieldName); len(matches) > 1 { + return matches[1], !strings.Contains(matches[1], "metric_name") + } + return "", false +} + // GetMetricValues extracts metric key value pairs from a Splunk HEC metric. func (e *Event) GetMetricValues() map[string]any { if v, ok := e.Fields["metric_name"]; ok { @@ -63,8 +82,8 @@ func (e *Event) GetMetricValues() map[string]any { values := map[string]any{} for k, v := range e.Fields { - if strings.HasPrefix(k, "metric_name:") { - values[k[12:]] = v + if metricName, ok := getMetricNameFromField(k); ok { + values[metricName] = v } } return values @@ -120,6 +139,16 @@ type HecToOtelAttrs struct { Host string `mapstructure:"host"` } +func (h HecToOtelAttrs) Equal(o HecToOtelAttrs) bool { + if h.Host != o.Host || + h.Source != o.Source || + h.SourceType != o.SourceType || + h.Index != o.Index { + return false + } + return true +} + type AckRequest struct { Acks []uint64 `json:"acks"` } diff --git a/internal/splunk/common_test.go b/internal/splunk/common_test.go index 5ec597153351..f4d2d2f3a63f 100644 --- a/internal/splunk/common_test.go +++ b/internal/splunk/common_test.go @@ -16,10 +16,21 @@ func TestGetValues(t *testing.T) { Fields: map[string]any{}, } assert.Equal(t, map[string]any{}, metric.GetMetricValues()) + metric.Fields["metric_name:x"] = "y" + assert.Equal(t, map[string]any{"x": "y"}, metric.GetMetricValues()) metric.Fields["metric_name:foo"] = "bar" - assert.Equal(t, map[string]any{"foo": "bar"}, metric.GetMetricValues()) + assert.Equal(t, map[string]any{"x": "y", "foo": "bar"}, metric.GetMetricValues()) metric.Fields["metric_name:foo2"] = "foobar" - assert.Equal(t, map[string]any{"foo": "bar", "foo2": "foobar"}, metric.GetMetricValues()) + assert.Equal(t, map[string]any{"x": "y", "foo": "bar", "foo2": "foobar"}, metric.GetMetricValues()) + metric.Fields["metric_name:foo:123_456.Bar"] = "quux" + assert.Equal(t, map[string]any{"x": "y", "foo": "bar", "foo2": "foobar", "foo:123_456.Bar": "quux"}, metric.GetMetricValues()) + // fields that aren't allowed + metric.Fields["metric_name:foo bar"] = "baz" // contains space + metric.Fields["metric_name:foo?"] = "baz" // illegal character + metric.Fields["metric_name:1stfoo"] = "baz" // starts with number + metric.Fields["metric_name:_foo"] = "baz" // starts with underscore + metric.Fields["metric_name:foo_metric_name:bar"] = "baz" // name contains "metric_name" + assert.Equal(t, map[string]any{"x": "y", "foo": "bar", "foo2": "foobar", "foo:123_456.Bar": "quux"}, metric.GetMetricValues()) } func TestSingleValue(t *testing.T) { diff --git a/internal/splunk/go.mod b/internal/splunk/go.mod index 4e2b7abeee5d..749615174aaf 100644 --- a/internal/splunk/go.mod +++ b/internal/splunk/go.mod @@ -1,13 +1,13 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk -go 1.21.0 +go 1.22.0 require ( - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/semconv v0.102.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/semconv v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/multierr v1.11.0 ) @@ -15,33 +15,36 @@ require ( require ( github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/stdr v1.2.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/knadh/koanf/maps v0.1.1 // indirect - github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect - github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/component v0.102.0 // indirect - go.opentelemetry.io/collector/config/configretry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/confmap v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/metric v1.27.0 // indirect - go.opentelemetry.io/otel/trace v1.27.0 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + go.opentelemetry.io/collector/component v0.116.0 // indirect + go.opentelemetry.io/collector/config/configretry v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/consumer v1.22.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/internal/splunk/go.sum b/internal/splunk/go.sum index 5cabb27274f4..6236e107e602 100644 --- a/internal/splunk/go.sum +++ b/internal/splunk/go.sum @@ -1,43 +1,32 @@ -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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= -github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= -github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= -github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -45,58 +34,70 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configretry v0.102.0 h1:UMYkyeSHjQ9AaPblKLrMUPrA9PWdb2nufBevr1yHoCw= -go.opentelemetry.io/collector/config/configretry v0.102.0/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -112,20 +113,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -134,12 +135,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/internal/splunk/hostid.go b/internal/splunk/hostid.go index 8a9305567cbb..588a1180f50b 100644 --- a/internal/splunk/hostid.go +++ b/internal/splunk/hostid.go @@ -8,7 +8,7 @@ import ( "strings" "go.opentelemetry.io/collector/pdata/pcommon" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" ) // HostIDKey represents a host identifier. diff --git a/internal/splunk/hostid_test.go b/internal/splunk/hostid_test.go index 292888fdef5c..0da55b6b972a 100644 --- a/internal/splunk/hostid_test.go +++ b/internal/splunk/hostid_test.go @@ -8,7 +8,7 @@ import ( "github.com/stretchr/testify/assert" "go.opentelemetry.io/collector/pdata/pcommon" - conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + conventions "go.opentelemetry.io/collector/semconv/v1.27.0" ) var ( diff --git a/internal/sqlquery/config.go b/internal/sqlquery/config.go index c679d81db4d7..7412a8069bc0 100644 --- a/internal/sqlquery/config.go +++ b/internal/sqlquery/config.go @@ -68,7 +68,8 @@ func (q Query) Validate() error { } type LogsCfg struct { - BodyColumn string `mapstructure:"body_column"` + BodyColumn string `mapstructure:"body_column"` + AttributeColumns []string `mapstructure:"attribute_columns"` } func (config LogsCfg) Validate() error { diff --git a/internal/sqlquery/db_client_test.go b/internal/sqlquery/db_client_test.go index 9b149979a943..a95521f73da7 100644 --- a/internal/sqlquery/db_client_test.go +++ b/internal/sqlquery/db_client_test.go @@ -70,7 +70,7 @@ func TestDBSQLClient_Nulls(t *testing.T) { } rows, err := cl.QueryRows(context.Background()) assert.Error(t, err) - assert.True(t, errors.Is(err, ErrNullValueWarning)) + assert.ErrorIs(t, err, ErrNullValueWarning) assert.Len(t, rows, 1) assert.EqualValues(t, map[string]string{ "col_0": "42", @@ -96,7 +96,7 @@ func TestDBSQLClient_Nulls_MultiRow(t *testing.T) { assert.Len(t, uw, 2) for _, err := range uw { - assert.True(t, errors.Is(err, ErrNullValueWarning)) + assert.ErrorIs(t, err, ErrNullValueWarning) } } assert.Len(t, rows, 2) diff --git a/internal/sqlquery/go.mod b/internal/sqlquery/go.mod index 474166b9410a..033d0e15a6a3 100644 --- a/internal/sqlquery/go.mod +++ b/internal/sqlquery/go.mod @@ -1,18 +1,20 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/internal/sqlquery -go 1.21.0 +go 1.22.0 require ( - github.com/SAP/go-hdb v1.9.5 + github.com/SAP/go-hdb v1.12.7 github.com/go-sql-driver/mysql v1.8.1 github.com/lib/pq v1.10.9 - github.com/microsoft/go-mssqldb v1.7.1 - github.com/sijms/go-ora/v2 v2.8.19 - github.com/snowflakedb/gosnowflake v1.10.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/receiver v0.102.0 + github.com/microsoft/go-mssqldb v1.8.0 + github.com/sijms/go-ora/v2 v2.8.22 + github.com/snowflakedb/gosnowflake v1.12.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/receiver v0.116.0 + go.opentelemetry.io/collector/scraper v0.116.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 ) @@ -21,33 +23,31 @@ require ( filippo.io/edwards25519 v1.1.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.2 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0 // indirect + github.com/BurntSushi/toml v1.4.0 // indirect github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c // indirect github.com/apache/arrow/go/v15 v15.0.0 // indirect - github.com/aws/aws-sdk-go-v2 v1.17.7 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.18 // indirect - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.59 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.31 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.25 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.23 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.26 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.25 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.14.0 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.31.0 // indirect - github.com/aws/smithy-go v1.13.5 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/aws/aws-sdk-go-v2 v1.26.1 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.11 // indirect + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.15 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.7 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1 // indirect + github.com/aws/smithy-go v1.20.2 // indirect github.com/danieljoos/wincred v1.1.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dvsekhvalnov/jose2go v1.6.0 // indirect github.com/gabriel-vasile/mimetype v1.4.2 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect github.com/goccy/go-json v0.10.2 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gogo/protobuf v1.3.2 // indirect @@ -55,6 +55,7 @@ require ( github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect github.com/golang-sql/sqlexp v0.1.0 // indirect github.com/google/flatbuffers v23.5.26+incompatible // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect github.com/jcmturner/aescts/v2 v2.0.0 // indirect @@ -65,47 +66,36 @@ require ( github.com/jcmturner/rpc/v2 v2.0.3 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.16.7 // indirect + github.com/klauspost/compress v1.17.9 // indirect github.com/klauspost/cpuid/v2 v2.2.5 // indirect - github.com/knadh/koanf/maps v0.1.1 // indirect - github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect - github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mtibben/percent v0.2.1 // indirect github.com/pierrec/lz4/v4 v4.1.18 // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/sirupsen/logrus v1.9.0 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect github.com/zeebo/xxh3 v1.0.2 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/confmap v0.102.0 // indirect - go.opentelemetry.io/collector/consumer v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/metric v1.27.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - go.opentelemetry.io/otel/trace v1.27.0 // indirect - golang.org/x/crypto v0.23.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/consumer v1.22.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + golang.org/x/crypto v0.31.0 // indirect golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3 // indirect - golang.org/x/mod v0.14.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/term v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - golang.org/x/tools v0.17.0 // indirect + golang.org/x/mod v0.17.0 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect + golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/internal/sqlquery/go.sum b/internal/sqlquery/go.sum index c1ee88201db3..ac9cc2099f39 100644 --- a/internal/sqlquery/go.sum +++ b/internal/sqlquery/go.sum @@ -4,88 +4,82 @@ github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMb github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= github.com/99designs/keyring v1.2.2 h1:pZd3neh/EmUzWONb35LxQfvuY7kiSXAq3HQd97+XBn0= github.com/99designs/keyring v1.2.2/go.mod h1:wes/FrByc8j7lFOAGLGSNEg8f/PaI3cgTBqhFkHUrPk= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1 h1:lGlwhPtrX6EVml1hO0ivjkUxsSyl4dsiw9qcA1k/3IQ= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1/go.mod h1:RKUqNu35KJYcVG/fqTRqmuXJZYNhYkBrnC/hX7yGbTA= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1 h1:sO0/P7g68FrryJzljemN+6GTssUXdANk6aJ7T1ZxnsQ= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1/go.mod h1:h8hyGFDsU5HMivxiS2iYFZsgDbU9OnnJ163x5UGVKYo= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1 h1:6oNBlSdi1QqM1PNW7FPA6xOGA5UNsXnkaYZz9vdPGhA= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1/go.mod h1:s4kgfzA0covAXNicZHDMN58jExvcng2mC/DepXiF1EI= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqbjDYsgN+RzP4q16yV5eM= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0 h1:U2rTu3Ef+7w9FHKIAXM6ZyqF3UOWJZ12zIm8zECAFfg= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0 h1:jBQA3cKT4L2rWMpgE7Yt3Hwh2aUj8KXjIGLxjHeYNNo= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0/go.mod h1:4OG6tQ9EOP/MT0NMjDlRzWoVFxfu9rN9B2X+tlSVktg= github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1 h1:MyVTgWR8qd/Jw1Le0NZebGBUCLbtak3bJ3z1OlqZBpw= github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1/go.mod h1:GpPjLhVR9dnUoJMyHWSPy71xY9/lcmpzIPZXmF0FCVY= github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0 h1:D3occbWoio4EBLkbkevetNMAVX197GkzbUMtqjGWn80= github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0/go.mod h1:bTSOgj05NGRuHHhQwAdPnYr9TOdNmKlZTgGLL6nyAdI= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0 h1:u/LLAOFgsMv7HmNL4Qufg58y+qElGOt5qv0z1mURkRY= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0/go.mod h1:2e8rMJtl2+2j+HXbTBwnyGpm5Nou7KhvSfxOq8JpTag= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 h1:DzHpqpoJVaCgOUdVHxE8QB52S6NiVdDQvGlny1qvPqA= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:RGWPOewvKIROun94nF7v2cua9qP+thov/7M50KEoeSU= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= -github.com/SAP/go-hdb v1.9.5 h1:rLp9rgs4n0Lvsxi3uTNiUpTM+KpA8tOgbQhcjksmdaA= -github.com/SAP/go-hdb v1.9.5/go.mod h1:eKGk33q3PZ41Lgua4lmqtKgIXpSEYs0teXePqMAcwBg= +github.com/SAP/go-hdb v1.12.7 h1:b6UAWiRxgGQwzcvQD1+tkmCl2Zda4Tjfjkry7FY+/mo= +github.com/SAP/go-hdb v1.12.7/go.mod h1:zb852z999jPL3nh7wOfJiXzAnFGeYMtVlruVg3eZdY8= github.com/apache/arrow/go/v15 v15.0.0 h1:1zZACWf85oEZY5/kd9dsQS7i+2G5zVQcbKTHgslqHNA= github.com/apache/arrow/go/v15 v15.0.0/go.mod h1:DGXsR3ajT524njufqf95822i+KTh+yea1jass9YXgjA= -github.com/aws/aws-sdk-go-v2 v1.17.7 h1:CLSjnhJSTSogvqUGhIC6LqFKATMRexcxLZ0i/Nzk9Eg= -github.com/aws/aws-sdk-go-v2 v1.17.7/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10 h1:dK82zF6kkPeCo8J1e+tGx4JdvDIQzj7ygIoLg8WMuGs= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10/go.mod h1:VeTZetY5KRJLuD/7fkQXMU6Mw7H5m/KP2J5Iy9osMno= -github.com/aws/aws-sdk-go-v2/config v1.18.19 h1:AqFK6zFNtq4i1EYu+eC7lcKHYnZagMn6SW171la0bGw= -github.com/aws/aws-sdk-go-v2/config v1.18.19/go.mod h1:XvTmGMY8d52ougvakOv1RpiTLPz9dlG/OQHsKU/cMmY= -github.com/aws/aws-sdk-go-v2/credentials v1.13.18 h1:EQMdtHwz0ILTW1hoP+EwuWhwCG1hD6l3+RWFQABET4c= -github.com/aws/aws-sdk-go-v2/credentials v1.13.18/go.mod h1:vnwlwjIe+3XJPBYKu1et30ZPABG3VaXJYr8ryohpIyM= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.1 h1:gt57MN3liKiyGopcqgNzJb2+d9MJaKT/q1OksHNXVE4= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.1/go.mod h1:lfUx8puBRdM5lVVMQlwt2v+ofiG/X6Ms+dy0UkG/kXw= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.59 h1:E3Y+OfzOK1+rmRo/K2G0ml8Vs+Xqk0kOnf4nS0kUtBc= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.59/go.mod h1:1M4PLSBUVfBI0aP+C9XI7SM6kZPCGYyI6izWz0TGprE= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.31 h1:sJLYcS+eZn5EeNINGHSCRAwUJMFVqklwkH36Vbyai7M= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.31/go.mod h1:QT0BqUvX1Bh2ABdTGnjqEjvjzrCfIniM9Sc8zn9Yndo= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.25 h1:1mnRASEKnkqsntcxHaysxwgVoUUp5dkiB+l3llKnqyg= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.25/go.mod h1:zBHOPwhBc3FlQjQJE/D3IfPWiWaQmT06Vq9aNukDo0k= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.32 h1:p5luUImdIqywn6JpQsW3tq5GNOxKmOnEpybzPx+d1lk= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.32/go.mod h1:XGhIBZDEgfqmFIugclZ6FU7v75nHhBDtzuB4xB/tEi4= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.23 h1:DWYZIsyqagnWL00f8M/SOr9fN063OEQWn9LLTbdYXsk= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.23/go.mod h1:uIiFgURZbACBEQJfqTZPb/jxO7R+9LeoHUFudtIdeQI= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11 h1:y2+VQzC6Zh2ojtV2LoC0MNwHWc6qXv/j2vrQtlftkdA= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11/go.mod h1:iV4q2hsqtNECrfmlXyord9u4zyuFEJX9eLgLpSPzWA8= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.26 h1:CeuSeq/8FnYpPtnuIeLQEEvDv9zUjneuYi8EghMBdwQ= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.26/go.mod h1:2UqAAwMUXKeRkAHIlDJqvMVgOWkUi/AUXPk/YIe+Dg4= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.25 h1:5LHn8JQ0qvjD9L9JhMtylnkcw7j05GDZqM9Oin6hpr0= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.25/go.mod h1:/95IA+0lMnzW6XzqYJRpjjsAbKEORVeO0anQqjd2CNU= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.14.0 h1:e2ooMhpYGhDnBfSvIyusvAwX7KexuZaHbQY2Dyei7VU= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.14.0/go.mod h1:bh2E0CXKZsQN+faiKVqC40vfNMAWheoULBCnEgO9K+8= -github.com/aws/aws-sdk-go-v2/service/s3 v1.31.0 h1:B1G2pSPvbAtQjilPq+Y7jLIzCOwKzuVEl+aBBaNG0AQ= -github.com/aws/aws-sdk-go-v2/service/s3 v1.31.0/go.mod h1:ncltU6n4Nof5uJttDtcNQ537uNuwYqsZZQcpkd2/GUQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.6 h1:5V7DWLBd7wTELVz5bPpwzYy/sikk0gsgZfj40X+l5OI= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.6/go.mod h1:Y1VOmit/Fn6Tz1uFAeCO6Q7M2fmfXSCLeL5INVYsLuY= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.6 h1:B8cauxOH1W1v7rd8RdI/MWnoR4Ze0wIHWrb90qczxj4= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.6/go.mod h1:Lh/bc9XUf8CfOY6Jp5aIkQtN+j1mc+nExc+KXj9jx2s= -github.com/aws/aws-sdk-go-v2/service/sts v1.18.7 h1:bWNgNdRko2x6gqa0blfATqAZKZokPIeM1vfmQt2pnvM= -github.com/aws/aws-sdk-go-v2/service/sts v1.18.7/go.mod h1:JuTnSoeePXmMVe9G8NcjjwgOKEfZ4cOjMuT2IBT/2eI= -github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= -github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/aws/aws-sdk-go-v2 v1.26.1 h1:5554eUqIYVWpU0YmeeYZ0wU64H2VLBs8TlhRB2L+EkA= +github.com/aws/aws-sdk-go-v2 v1.26.1/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 h1:x6xsQXGSmW6frevwDA+vi/wqhp1ct18mVXYN08/93to= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2/go.mod h1:lPprDr1e6cJdyYeGXnRaJoP4Md+cDBvi2eOj00BlGmg= +github.com/aws/aws-sdk-go-v2/config v1.27.11 h1:f47rANd2LQEYHda2ddSCKYId18/8BhSRM4BULGmfgNA= +github.com/aws/aws-sdk-go-v2/config v1.27.11/go.mod h1:SMsV78RIOYdve1vf36z8LmnszlRWkwMQtomCAI0/mIE= +github.com/aws/aws-sdk-go-v2/credentials v1.17.11 h1:YuIB1dJNf1Re822rriUOTxopaHHvIq0l/pX3fwO+Tzs= +github.com/aws/aws-sdk-go-v2/credentials v1.17.11/go.mod h1:AQtFPsDH9bI2O+71anW6EKL+NcD7LG3dpKGMV4SShgo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1 h1:FVJ0r5XTHSmIHJV6KuDmdYhEpvlHpiSd38RQWhut5J4= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1/go.mod h1:zusuAeqezXzAB24LGuzuekqMAEgWkVYukBec3kr3jUg= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.15 h1:7Zwtt/lP3KNRkeZre7soMELMGNoBrutx8nobg1jKWmo= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.15/go.mod h1:436h2adoHb57yd+8W+gYPrrA9U/R/SuAuOO42Ushzhw= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 h1:aw39xVGeRWlWx9EzGVnhOR4yOjQDHPQ6o6NmBlscyQg= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5/go.mod h1:FSaRudD0dXiMPK2UjknVwwTYyZMRsHv3TtkabsZih5I= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 h1:PG1F3OD1szkuQPzDw3CIQsRIrtTlUC3lP84taWzHlq0= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5/go.mod h1:jU1li6RFryMz+so64PpKtudI+QzbKoIEivqdf6LNpOc= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5 h1:81KE7vaZzrl7yHBYHVEzYB8sypz11NMOZ40YlWvPxsU= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5/go.mod h1:LIt2rg7Mcgn09Ygbdh/RdIm0rQ+3BNkbP1gyVMFtRK0= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2/go.mod h1:5CsjAbs3NlGQyZNFACh+zztPDI7fU6eW9QsxjfnuBKg= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.7 h1:ZMeFZ5yk+Ek+jNr1+uwCd2tG89t6oTS5yVWpa6yy2es= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.7/go.mod h1:mxV05U+4JiHqIpGqqYXOHLPKUC6bDXC44bsUhNjOEwY= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7 h1:ogRAwT1/gxJBcSWDMZlgyFUM962F51A5CRhDLbxLdmo= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7/go.mod h1:YCsIZhXfRPLFFCl5xxY+1T9RKzOKjCut+28JSX2DnAk= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5 h1:f9RyWNtS8oH7cZlbn+/JNPpjUk5+5fLd5lM9M0i49Ys= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5/go.mod h1:h5CoMZV2VF297/VLhRhO1WF+XYWOzXo+4HsObA4HjBQ= +github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1 h1:6cnno47Me9bRykw9AEv9zkXE+5or7jz8TsskTTccbgc= +github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1/go.mod h1:qmdkIIAC+GCLASF7R2whgNrJADz0QZPX+Seiw/i4S3o= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.5 h1:vN8hEbpRnL7+Hopy9dzmRle1xmDc7o8tmY0klsr175w= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.5/go.mod h1:qGzynb/msuZIE8I75DVRCUXw3o3ZyBmUvMwQ2t/BrGM= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.4 h1:Jux+gDDyi1Lruk+KHF91tK2KCuY61kzoCpvtvJJBtOE= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.4/go.mod h1:mUYPBhaF2lGiukDEjJX2BLRRKTmoUSitGDUgM4tRxak= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.6 h1:cwIxeBttqPN3qkaAjcEcsh8NYr8n2HZPkcKgPAi1phU= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.6/go.mod h1:FZf1/nKNEkHdGGJP/cI2MoIMquumuRK6ol3QQJNDxmw= +github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= +github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/dvsekhvalnov/jose2go v1.6.0 h1:Y9gnSnP4qEI0+/uQkHvFXeD2PLPJeXEL+ySMEA2EjTY= github.com/dvsekhvalnov/jose2go v1.6.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= @@ -98,9 +92,10 @@ github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0kt github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/flatbuffers v23.5.26+incompatible h1:M9dgRyhJemaM4Sw8+66GHBu8ioaQmyPLg1b8VwK5WJg= github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -135,16 +130,10 @@ 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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= -github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= -github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= -github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -155,12 +144,8 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/microsoft/go-mssqldb v1.7.1 h1:KU/g8aWeM3Hx7IMOFpiwYiUkU+9zeISb4+tx3ScVfsM= -github.com/microsoft/go-mssqldb v1.7.1/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/microsoft/go-mssqldb v1.8.0 h1:7cyZ/AT7ycDsEoWPIXibd+aVKFtteUNhDGf3aobP+tw= +github.com/microsoft/go-mssqldb v1.8.0/go.mod h1:6znkekS3T2vp0waiMhen4GPU1BiAsrP+iXHcE7a7rFo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -175,22 +160,14 @@ github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmd github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/sijms/go-ora/v2 v2.8.19 h1:7LoKZatDYGi18mkpQTR/gQvG9yOdtc7hPAex96Bqisc= -github.com/sijms/go-ora/v2 v2.8.19/go.mod h1:EHxlY6x7y9HAsdfumurRfTd+v8NrEOTR3Xl4FWlH6xk= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/snowflakedb/gosnowflake v1.10.0 h1:5hBGKa/jJEhciokzgJcz5xmLNlJ8oUm8vhfu5tg82tM= -github.com/snowflakedb/gosnowflake v1.10.0/go.mod h1:WC4eGUOH3K9w3pLsdwZsdawIwtWgse4kZPPqNG0Ky/k= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/sijms/go-ora/v2 v2.8.22 h1:3ABgRzVKxS439cEgSLjFKutIwOyhnyi4oOSBywEdOlU= +github.com/sijms/go-ora/v2 v2.8.22/go.mod h1:QgFInVi3ZWyqAiJwzBQA+nbKYKH77tdp1PYoCqhR2dU= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/snowflakedb/gosnowflake v1.12.0 h1:Saez8egtn5xAoVMBxFaMu9MYfAG9SS9dpAEXD1/ECIo= +github.com/snowflakedb/gosnowflake v1.12.0/go.mod h1:wHfYmZi3zvtWItojesAhWWXBN7+niex2R1h/S7QCZYg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -202,8 +179,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= @@ -211,32 +188,46 @@ github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/scraper v0.116.0 h1:Gdg3v/QUZobHcAAewOlwlaE4XlkRQl3FFut906XuCiw= +go.opentelemetry.io/collector/scraper v0.116.0/go.mod h1:G4SmTIPG8RbxVhTF3zj4EFJx+1tceZbZxhS6mtXOeg0= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -248,15 +239,15 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3 h1:/RIbNt/Zr7rVhIkQhooTxCxFcdWLGIKnZA4IXNFSrvo= golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -266,14 +257,14 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -285,26 +276,26 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= -golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -313,12 +304,12 @@ golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3j golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gonum.org/v1/gonum v0.12.0 h1:xKuo6hzt+gMav00meVPUlXwSdoEJP46BR+wdxQEFK2o= gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/internal/sqlquery/metrics.go b/internal/sqlquery/metrics.go index 01cb8dbae856..4ffcde6d3f62 100644 --- a/internal/sqlquery/metrics.go +++ b/internal/sqlquery/metrics.go @@ -4,6 +4,7 @@ package sqlquery // import "github.com/open-telemetry/opentelemetry-collector-contrib/internal/sqlquery" import ( + "errors" "fmt" "strconv" @@ -18,36 +19,38 @@ func rowToMetric(row StringMap, cfg MetricCfg, dest pmetric.Metric, startTime pc dest.SetUnit(cfg.Unit) dataPointSlice := setMetricFields(cfg, dest) dataPoint := dataPointSlice.AppendEmpty() + var errs []error if cfg.StartTsColumn != "" { if val, found := row[cfg.StartTsColumn]; found { timestamp, err := strconv.ParseInt(val, 10, 64) if err != nil { - return fmt.Errorf("failed to parse uint64 for %q, value was %q: %w", cfg.StartTsColumn, val, err) + errs = append(errs, fmt.Errorf("failed to parse uint64 for %q, value was %q: %w", cfg.StartTsColumn, val, err)) } startTime = pcommon.Timestamp(timestamp) } else { - return fmt.Errorf("rowToMetric: start_ts_column not found") + errs = append(errs, fmt.Errorf("rowToMetric: start_ts_column not found")) } } if cfg.TsColumn != "" { if val, found := row[cfg.TsColumn]; found { timestamp, err := strconv.ParseInt(val, 10, 64) if err != nil { - return fmt.Errorf("failed to parse uint64 for %q, value was %q: %w", cfg.TsColumn, val, err) + errs = append(errs, fmt.Errorf("failed to parse uint64 for %q, value was %q: %w", cfg.TsColumn, val, err)) } ts = pcommon.Timestamp(timestamp) } else { - return fmt.Errorf("rowToMetric: ts_column not found") + errs = append(errs, fmt.Errorf("rowToMetric: ts_column not found")) } } setTimestamp(cfg, dataPoint, startTime, ts, scrapeCfg) value, found := row[cfg.ValueColumn] if !found { - return fmt.Errorf("rowToMetric: value_column '%s' not found in result set", cfg.ValueColumn) + errs = append(errs, fmt.Errorf("rowToMetric: value_column '%s' not found in result set", cfg.ValueColumn)) } + err := setDataPointValue(cfg, value, dataPoint) if err != nil { - return fmt.Errorf("rowToMetric: %w", err) + errs = append(errs, fmt.Errorf("rowToMetric: %w", err)) } attrs := dataPoint.Attributes() for k, v := range cfg.StaticAttributes { @@ -57,10 +60,10 @@ func rowToMetric(row StringMap, cfg MetricCfg, dest pmetric.Metric, startTime pc if attrVal, found := row[columnName]; found { attrs.PutStr(columnName, attrVal) } else { - return fmt.Errorf("rowToMetric: attribute_column not found: '%s'", columnName) + errs = append(errs, fmt.Errorf("rowToMetric: attribute_column '%s' not found in result set", columnName)) } } - return nil + return errors.Join(errs...) } func setTimestamp(cfg MetricCfg, dp pmetric.NumberDataPoint, startTime pcommon.Timestamp, ts pcommon.Timestamp, scrapeCfg scraperhelper.ControllerConfig) { diff --git a/internal/sqlquery/row_scanner.go b/internal/sqlquery/row_scanner.go index bfda8aab270e..5366f808160c 100644 --- a/internal/sqlquery/row_scanner.go +++ b/internal/sqlquery/row_scanner.go @@ -32,7 +32,7 @@ func newRowScanner(colTypes []colType) *rowScanner { } format := "%v" if t, isTime := v.(time.Time); isTime { - return t.Format(time.RFC3339), nil + return t.Format(time.RFC3339Nano), nil } if reflect.TypeOf(v).Kind() == reflect.Slice { // The Postgres driver returns a []uint8 (ascii string) for decimal and numeric types, diff --git a/internal/sqlquery/scraper.go b/internal/sqlquery/scraper.go index 31eafbef2161..b8314f6a286d 100644 --- a/internal/sqlquery/scraper.go +++ b/internal/sqlquery/scraper.go @@ -13,8 +13,9 @@ import ( "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" - "go.opentelemetry.io/collector/receiver/scrapererror" "go.opentelemetry.io/collector/receiver/scraperhelper" + "go.opentelemetry.io/collector/scraper" + "go.opentelemetry.io/collector/scraper/scrapererror" "go.uber.org/zap" ) @@ -37,7 +38,7 @@ type Scraper struct { Db *sql.DB } -var _ scraperhelper.Scraper = (*Scraper)(nil) +var _ scraper.Metrics = (*Scraper)(nil) func NewScraper(id component.ID, query Query, scrapeCfg scraperhelper.ControllerConfig, logger *zap.Logger, telemetry TelemetryConfig, dbProviderFunc DbProviderFunc, clientProviderFunc ClientProviderFunc) *Scraper { return &Scraper{ @@ -67,7 +68,7 @@ func (s *Scraper) Start(context.Context, component.Host) error { return nil } -func (s *Scraper) Scrape(ctx context.Context) (pmetric.Metrics, error) { +func (s *Scraper) ScrapeMetrics(ctx context.Context) (pmetric.Metrics, error) { out := pmetric.NewMetrics() rows, err := s.Client.QueryRows(ctx) if err != nil { diff --git a/internal/sqlquery/scraper_test.go b/internal/sqlquery/scraper_test.go index e4567a189459..4cb80117e3be 100644 --- a/internal/sqlquery/scraper_test.go +++ b/internal/sqlquery/scraper_test.go @@ -14,7 +14,7 @@ import ( "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" - "go.opentelemetry.io/collector/receiver/scrapererror" + "go.opentelemetry.io/collector/scraper/scrapererror" "go.uber.org/zap" ) @@ -35,7 +35,7 @@ func TestScraper_ClientErrorOnScrape(t *testing.T) { scrpr := Scraper{ Client: client, } - _, err := scrpr.Scrape(context.Background()) + _, err := scrpr.ScrapeMetrics(context.Background()) require.Error(t, err) } @@ -57,7 +57,7 @@ func TestScraper_RowToMetricErrorOnScrape_Float(t *testing.T) { }}, }, } - _, err := scrpr.Scrape(context.Background()) + _, err := scrpr.ScrapeMetrics(context.Background()) assert.Error(t, err) } @@ -79,7 +79,7 @@ func TestScraper_RowToMetricErrorOnScrape_Int(t *testing.T) { }}, }, } - _, err := scrpr.Scrape(context.Background()) + _, err := scrpr.ScrapeMetrics(context.Background()) assert.Error(t, err) } @@ -102,7 +102,7 @@ func TestScraper_RowToMetricMultiErrorsOnScrape(t *testing.T) { }}, }, } - _, err := scrpr.Scrape(context.Background()) + _, err := scrpr.ScrapeMetrics(context.Background()) assert.Error(t, err) } @@ -135,7 +135,7 @@ func TestScraper_SingleRow_MultiMetrics(t *testing.T) { }, }, } - metrics, err := scrpr.Scrape(context.Background()) + metrics, err := scrpr.ScrapeMetrics(context.Background()) require.NoError(t, err) rms := metrics.ResourceMetrics() assert.Equal(t, 1, rms.Len()) @@ -204,7 +204,7 @@ func TestScraper_MultiRow(t *testing.T) { }, }, } - metrics, err := scrpr.Scrape(context.Background()) + metrics, err := scrpr.ScrapeMetrics(context.Background()) require.NoError(t, err) ms := metrics.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics() { @@ -270,7 +270,7 @@ func TestScraper_MultiResults_DeltaSum(t *testing.T) { } func assertTransactionCount(t *testing.T, scrpr Scraper, expected int, agg pmetric.AggregationTemporality) { - metrics, err := scrpr.Scrape(context.Background()) + metrics, err := scrpr.ScrapeMetrics(context.Background()) require.NoError(t, err) metric := metrics.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics().At(0) assert.Equal(t, "transaction.count", metric.Name()) @@ -301,7 +301,7 @@ func TestScraper_Float(t *testing.T) { }}, }, } - metrics, err := scrpr.Scrape(context.Background()) + metrics, err := scrpr.ScrapeMetrics(context.Background()) require.NoError(t, err) metric := metrics.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics().At(0) assert.Equal(t, 123.4, metric.Gauge().DataPoints().At(0).DoubleValue()) @@ -324,7 +324,7 @@ func TestScraper_DescriptionAndUnit(t *testing.T) { }}, }, } - metrics, err := scrpr.Scrape(context.Background()) + metrics, err := scrpr.ScrapeMetrics(context.Background()) require.NoError(t, err) z := metrics.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics().At(0) assert.Equal(t, "my-unit", z.Unit()) @@ -346,7 +346,7 @@ func TestScraper_FakeDB_Warnings(t *testing.T) { }}, }, } - _, err := scrpr.Scrape(context.Background()) + _, err := scrpr.ScrapeMetrics(context.Background()) require.NoError(t, err) } @@ -365,7 +365,7 @@ func TestScraper_FakeDB_MultiRows_Warnings(t *testing.T) { }}, }, } - _, err := scrpr.Scrape(context.Background()) + _, err := scrpr.ScrapeMetrics(context.Background()) // No error is expected because we're not actually asking for metrics from the // NULL column. Instead the errors from the NULL reads should just log warnings. assert.NoError(t, err) @@ -378,21 +378,22 @@ func TestScraper_FakeDB_MultiRows_Error(t *testing.T) { Client: NewDbClient(db, "", logger, TelemetryConfig{}), Logger: logger, Query: Query{ - Metrics: []MetricCfg{{ - MetricName: "my.col.0", - ValueColumn: "col_0", - Description: "my description 0", - Unit: "my-unit-0", - }, { - MetricName: "my.col.1", - ValueColumn: "col_1", - Description: "my description 1", - Unit: "my-unit-1", - }, + Metrics: []MetricCfg{ + { + MetricName: "my.col.0", + ValueColumn: "col_0", + Description: "my description 0", + Unit: "my-unit-0", + }, { + MetricName: "my.col.1", + ValueColumn: "col_1", + Description: "my description 1", + Unit: "my-unit-1", + }, }, }, } - _, err := scrpr.Scrape(context.Background()) + _, err := scrpr.ScrapeMetrics(context.Background()) // We expect an error here not directly because of the NULL values but because // the column was also requested in Query.Metrics[1] but wasn't found. It's just // a partial scrape error though so it shouldn't cause a Scraper shutdown. @@ -423,7 +424,7 @@ func TestScraper_StartAndTSColumn(t *testing.T) { }}, }, } - metrics, err := scrpr.Scrape(context.Background()) + metrics, err := scrpr.ScrapeMetrics(context.Background()) require.NoError(t, err) metric := metrics.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics().At(0) assert.Equal(t, pcommon.Timestamp(1682417791), metric.Sum().DataPoints().At(0).StartTimestamp()) @@ -452,10 +453,39 @@ func TestScraper_StartAndTS_ErrorOnColumnNotFound(t *testing.T) { }}, }, } - _, err := scrpr.Scrape(context.Background()) + _, err := scrpr.ScrapeMetrics(context.Background()) assert.Error(t, err) } +func TestScraper_CollectRowToMetricsErrors(t *testing.T) { + client := &FakeDBClient{ + StringMaps: [][]StringMap{{ + { + "mycol": "42", + }, + }}, + } + scrpr := Scraper{ + Client: client, + Query: Query{ + Metrics: []MetricCfg{{ + MetricName: "my.name", + ValueColumn: "mycol_na", + TsColumn: "Ts", + StartTsColumn: "StartTs", + AttributeColumns: []string{"attr_na"}, + DataType: MetricTypeSum, + Aggregation: MetricAggregationCumulative, + }}, + }, + } + _, err := scrpr.ScrapeMetrics(context.Background()) + assert.ErrorContains(t, err, "rowToMetric: start_ts_column not found") + assert.ErrorContains(t, err, "rowToMetric: ts_column not found") + assert.ErrorContains(t, err, "rowToMetric: value_column 'mycol_na' not found in result set") + assert.ErrorContains(t, err, "rowToMetric: attribute_column 'attr_na' not found in result set") +} + func TestScraper_StartAndTS_ErrorOnParse(t *testing.T) { client := &FakeDBClient{ StringMaps: [][]StringMap{{ @@ -477,6 +507,6 @@ func TestScraper_StartAndTS_ErrorOnParse(t *testing.T) { }}, }, } - _, err := scrpr.Scrape(context.Background()) + _, err := scrpr.ScrapeMetrics(context.Background()) assert.Error(t, err) } diff --git a/internal/tools/go.mod b/internal/tools/go.mod index f4dc7075c9c5..5234fc938ea0 100644 --- a/internal/tools/go.mod +++ b/internal/tools/go.mod @@ -1,26 +1,28 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/internal/tools -go 1.21.0 +go 1.22.1 require ( + github.com/Antonboom/testifylint v1.5.2 github.com/Khan/genqlient v0.7.0 github.com/client9/misspell v0.3.4 - github.com/daixiang0/gci v0.13.4 - github.com/golangci/golangci-lint v1.59.0 + github.com/daixiang0/gci v0.13.5 + github.com/golangci/golangci-lint v1.59.1 github.com/google/addlicense v1.1.1 github.com/jcchavezs/porto v0.6.0 github.com/jstemmer/go-junit-report v1.0.0 - go.opentelemetry.io/build-tools/checkfile v0.13.0 - go.opentelemetry.io/build-tools/chloggen v0.13.0 - go.opentelemetry.io/build-tools/crosslink v0.13.0 - go.opentelemetry.io/build-tools/issuegenerator v0.13.0 - go.opentelemetry.io/build-tools/multimod v0.13.0 - go.opentelemetry.io/collector/cmd/builder v0.102.0 - go.opentelemetry.io/collector/cmd/mdatagen v0.102.0 + go.opentelemetry.io/build-tools/checkfile v0.15.0 + go.opentelemetry.io/build-tools/chloggen v0.15.0 + go.opentelemetry.io/build-tools/crosslink v0.15.0 + go.opentelemetry.io/build-tools/issuegenerator v0.15.0 + go.opentelemetry.io/build-tools/multimod v0.15.0 + go.opentelemetry.io/collector/cmd/builder v0.116.0 + go.opentelemetry.io/collector/cmd/mdatagen v0.116.0 go.uber.org/goleak v1.3.0 - golang.org/x/tools v0.21.1-0.20240514024235-59d9797072e7 - golang.org/x/vuln v1.1.1 - gotest.tools/gotestsum v1.11.0 + golang.org/x/tools v0.27.0 + golang.org/x/vuln v1.1.3 + gotest.tools/gotestsum v1.12.0 + mvdan.cc/gofumpt v0.6.0 ) require ( @@ -31,7 +33,6 @@ require ( github.com/Abirdcfly/dupword v0.0.14 // indirect github.com/Antonboom/errname v0.1.13 // indirect github.com/Antonboom/nilnil v0.1.9 // indirect - github.com/Antonboom/testifylint v1.3.0 // indirect github.com/BurntSushi/toml v1.4.0 // indirect github.com/Crocmagnon/fatcontext v0.2.2 // indirect github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect @@ -39,18 +40,18 @@ require ( github.com/Masterminds/semver/v3 v3.2.1 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/OpenPeeDeeP/depguard/v2 v2.2.0 // indirect - github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 // indirect + github.com/ProtonMail/go-crypto v1.0.0 // indirect github.com/agnivade/levenshtein v1.1.1 // indirect github.com/alecthomas/go-check-sumtype v0.1.4 // indirect - github.com/alexflint/go-arg v1.4.2 // indirect - github.com/alexflint/go-scalar v1.0.0 // indirect + github.com/alexflint/go-arg v1.5.0 // indirect + github.com/alexflint/go-scalar v1.2.0 // indirect github.com/alexkohler/nakedret/v2 v2.0.4 // indirect github.com/alexkohler/prealloc v1.0.0 // indirect github.com/alingse/asasalint v0.0.11 // indirect github.com/ashanbrown/forbidigo v1.6.0 // indirect github.com/ashanbrown/makezero v1.1.1 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bitfield/gotestdox v0.2.1 // indirect + github.com/bitfield/gotestdox v0.2.2 // indirect github.com/bkielbasa/cyclop v1.2.1 // indirect github.com/blizzy78/varnamelen v0.8.0 // indirect github.com/bmatcuk/doublestar/v4 v4.0.2 // indirect @@ -82,7 +83,7 @@ require ( github.com/go-critic/go-critic v0.11.4 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.5.0 // indirect - github.com/go-git/go-git/v5 v5.11.0 // indirect + github.com/go-git/go-git/v5 v5.12.0 // indirect github.com/go-toolsmith/astcast v1.1.0 // indirect github.com/go-toolsmith/astcopy v1.1.0 // indirect github.com/go-toolsmith/astequal v1.2.0 // indirect @@ -90,16 +91,15 @@ require ( github.com/go-toolsmith/astp v1.1.0 // indirect github.com/go-toolsmith/strparse v1.1.0 // indirect github.com/go-toolsmith/typep v1.1.0 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/go-xmlfmt/xmlfmt v1.1.2 // indirect github.com/gobwas/glob v0.2.3 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.4 // indirect github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a // indirect github.com/golangci/gofmt v0.0.0-20231018234816-f50ced29576e // indirect - github.com/golangci/misspell v0.5.1 // indirect + github.com/golangci/misspell v0.6.0 // indirect github.com/golangci/modinfo v0.3.4 // indirect github.com/golangci/plugin-module-register v0.1.1 // indirect github.com/golangci/revgrep v0.5.3 // indirect @@ -132,10 +132,10 @@ require ( github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/parsers/yaml v0.1.0 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/providers/env v0.1.0 // indirect - github.com/knadh/koanf/providers/file v0.1.0 // indirect + github.com/knadh/koanf/providers/env v1.0.0 // indirect + github.com/knadh/koanf/providers/file v1.1.2 // indirect github.com/knadh/koanf/providers/fs v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/kulti/thelper v0.6.3 // indirect github.com/kunwardeep/paralleltest v1.0.10 // indirect github.com/kyoh86/exportloopref v0.1.11 // indirect @@ -160,6 +160,7 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/moricho/tparallel v0.3.1 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nakabonne/nestif v0.3.1 // indirect github.com/nishanths/exhaustive v0.12.0 // indirect github.com/nishanths/predeclared v0.2.2 // indirect @@ -168,11 +169,11 @@ require ( github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/pjbgf/sha1cd v0.3.0 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/polyfloyd/go-errorlint v1.5.1 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect + github.com/polyfloyd/go-errorlint v1.5.2 // indirect + github.com/prometheus/client_golang v1.20.3 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect + github.com/prometheus/common v0.59.1 // indirect + github.com/prometheus/procfs v0.15.1 // indirect github.com/quasilyte/go-ruleguard v0.4.2 // indirect github.com/quasilyte/go-ruleguard/dsl v0.3.22 // indirect github.com/quasilyte/gogrep v0.5.0 // indirect @@ -185,26 +186,26 @@ require ( github.com/sanposhiho/wastedassign/v2 v2.0.7 // indirect github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 // indirect github.com/sashamelentyev/interfacebloat v1.1.0 // indirect - github.com/sashamelentyev/usestdlibvars v1.25.0 // indirect + github.com/sashamelentyev/usestdlibvars v1.26.0 // indirect github.com/securego/gosec/v2 v2.20.1-0.20240525090044-5f0084eb01a9 // indirect - github.com/sergi/go-diff v1.3.1 // indirect + github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/sivchari/containedctx v1.0.3 // indirect github.com/sivchari/tenv v1.7.1 // indirect - github.com/skeema/knownhosts v1.2.1 // indirect + github.com/skeema/knownhosts v1.2.2 // indirect github.com/sonatard/noctx v0.0.2 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/sourcegraph/go-diff v0.7.0 // indirect github.com/spf13/afero v1.11.0 // indirect github.com/spf13/cast v1.6.0 // indirect - github.com/spf13/cobra v1.8.0 // indirect + github.com/spf13/cobra v1.8.1 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.18.2 // indirect + github.com/spf13/viper v1.19.0 // indirect github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect github.com/stbenjam/no-sprintf-host-port v0.1.1 // indirect github.com/stretchr/objx v0.5.2 // indirect - github.com/stretchr/testify v1.9.0 // indirect + github.com/stretchr/testify v1.10.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c // indirect github.com/tdakkota/asciicheck v0.2.0 // indirect @@ -216,7 +217,7 @@ require ( github.com/ultraware/funlen v0.1.0 // indirect github.com/ultraware/whitespace v0.1.1 // indirect github.com/uudashr/gocognit v1.1.2 // indirect - github.com/vektah/gqlparser/v2 v2.5.11 // indirect + github.com/vektah/gqlparser/v2 v2.5.16 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/xen0n/gosmopolitan v1.2.2 // indirect github.com/yagipy/maintidx v1.0.0 // indirect @@ -224,49 +225,45 @@ require ( github.com/ykadowak/zerologlint v0.1.5 // indirect gitlab.com/bosi/decorder v0.4.2 // indirect go-simpler.org/musttag v0.12.2 // indirect - go-simpler.org/sloglint v0.7.0 // indirect - go.opentelemetry.io/build-tools v0.13.0 // indirect - go.opentelemetry.io/collector/component v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/confmap v0.102.0 // indirect - go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0 // indirect - go.opentelemetry.io/collector/filter v0.102.0 // indirect - go.opentelemetry.io/collector/pdata v1.9.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/metric v1.27.0 // indirect - go.opentelemetry.io/otel/trace v1.27.0 // indirect + go-simpler.org/sloglint v0.7.1 // indirect + go.opentelemetry.io/build-tools v0.15.0 // indirect + go.opentelemetry.io/collector/component v0.116.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/confmap v1.22.0 // indirect + go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0 // indirect + go.opentelemetry.io/collector/filter v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/automaxprocs v1.5.3 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.23.0 // indirect + golang.org/x/crypto v0.31.0 // indirect golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc // indirect golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f // indirect - golang.org/x/mod v0.17.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/oauth2 v0.18.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/term v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/mod v0.22.0 // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/oauth2 v0.23.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/telemetry v0.0.0-20240522233618-39ace7a40ae7 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect honnef.co/go/tools v0.4.7 // indirect - mvdan.cc/gofumpt v0.6.0 // indirect - mvdan.cc/unparam v0.0.0-20240427195214-063aff900ca1 // indirect + mvdan.cc/unparam v0.0.0-20240528143540-8a5130ca722f // indirect ) // openshift removed all tags from their repo, use the pseudoversion from the release-3.9 branch HEAD replace github.com/openshift/api v3.9.0+incompatible => github.com/openshift/api v0.0.0-20180801171038-322a19404e37 -// It appears that the v0.2.0 tag was modified. Replacing with v0.2.1 -replace github.com/outcaste-io/ristretto v0.2.0 => github.com/outcaste-io/ristretto v0.2.1 - retract ( v0.76.2 v0.76.1 diff --git a/internal/tools/go.sum b/internal/tools/go.sum index f79176274d0f..414c7a57865c 100644 --- a/internal/tools/go.sum +++ b/internal/tools/go.sum @@ -12,8 +12,8 @@ github.com/Antonboom/errname v0.1.13 h1:JHICqsewj/fNckzrfVSe+T33svwQxmjC+1ntDsHO github.com/Antonboom/errname v0.1.13/go.mod h1:uWyefRYRN54lBg6HseYCFhs6Qjcy41Y3Jl/dVhA87Ns= github.com/Antonboom/nilnil v0.1.9 h1:eKFMejSxPSA9eLSensFmjW2XTgTwJMjZ8hUHtV4s/SQ= github.com/Antonboom/nilnil v0.1.9/go.mod h1:iGe2rYwCq5/Me1khrysB4nwI7swQvjclR8/YRPl5ihQ= -github.com/Antonboom/testifylint v1.3.0 h1:UiqrddKs1W3YK8R0TUuWwrVKlVAnS07DTUVWWs9c+y4= -github.com/Antonboom/testifylint v1.3.0/go.mod h1:NV0hTlteCkViPW9mSR4wEMfwp+Hs1T3dY60bkvSfhpM= +github.com/Antonboom/testifylint v1.5.2 h1:4s3Xhuv5AvdIgbd8wOOEeo0uZG7PbDKQyKY5lGoQazk= +github.com/Antonboom/testifylint v1.5.2/go.mod h1:vxy8VJ0bc6NavlYqjZfmp6EfqXMtBgQ4+mhCojwC1P8= github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/Crocmagnon/fatcontext v0.2.2 h1:OrFlsDdOj9hW/oBEJBNSuH7QWf+E9WPVHw+x52bXVbk= @@ -31,8 +31,8 @@ github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migc github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/OpenPeeDeeP/depguard/v2 v2.2.0 h1:vDfG60vDtIuf0MEOhmLlLLSzqaRM8EMcgJPdp74zmpA= github.com/OpenPeeDeeP/depguard/v2 v2.2.0/go.mod h1:CIzddKRvLBC4Au5aYP/i3nyaWQ+ClszLIuVocRiCYFQ= -github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 h1:kkhsdkhsCvIsutKu5zLMgWtgh9YxGCNAw8Ad8hjwfYg= -github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= +github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8= github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo= github.com/alecthomas/assert/v2 v2.2.2 h1:Z/iVC0xZfWTaFNE6bA3z07T86hd45Xe2eLt6WVy2bbk= @@ -41,10 +41,10 @@ github.com/alecthomas/go-check-sumtype v0.1.4 h1:WCvlB3l5Vq5dZQTFmodqL2g68uHiSww github.com/alecthomas/go-check-sumtype v0.1.4/go.mod h1:WyYPfhfkdhyrdaligV6svFopZV8Lqdzn5pyVBaV6jhQ= github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= -github.com/alexflint/go-arg v1.4.2 h1:lDWZAXxpAnZUq4qwb86p/3rIJJ2Li81EoMbTMujhVa0= -github.com/alexflint/go-arg v1.4.2/go.mod h1:9iRbDxne7LcR/GSvEr7ma++GLpdIU1zrghf2y2768kM= -github.com/alexflint/go-scalar v1.0.0 h1:NGupf1XV/Xb04wXskDFzS0KWOLH632W/EO4fAFi+A70= -github.com/alexflint/go-scalar v1.0.0/go.mod h1:GpHzbCOZXEKMEcygYQ5n/aa4Aq84zbxjy3MxYW0gjYw= +github.com/alexflint/go-arg v1.5.0 h1:rwMKGiaQuRbXfZNyRUvIfke63QvOBt1/QTshlGQHohM= +github.com/alexflint/go-arg v1.5.0/go.mod h1:A7vTJzvjoaSTypg4biM5uYNTkJ27SkNTArtYXnlqVO8= +github.com/alexflint/go-scalar v1.2.0 h1:WR7JPKkeNpnYIOfHRa7ivM21aWAdHD0gEWHCx+WQBRw= +github.com/alexflint/go-scalar v1.2.0/go.mod h1:LoFvNMqS1CPrMVltza4LvnGKhaSpc3oyLEBUZVhhS2o= github.com/alexkohler/nakedret/v2 v2.0.4 h1:yZuKmjqGi0pSmjGpOC016LtPJysIL0WEUiaXW5SUnNg= github.com/alexkohler/nakedret/v2 v2.0.4/go.mod h1:bF5i0zF2Wo2o4X4USt9ntUWve6JbFv02Ff4vlkmS/VU= github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw= @@ -65,8 +65,8 @@ github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5Fc github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI= 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/bitfield/gotestdox v0.2.1 h1:Zj8IMLAO5/oiAKoMmtN96eyFiPZraJRTH2p0zDgtxc0= -github.com/bitfield/gotestdox v0.2.1/go.mod h1:D+gwtS0urjBrzguAkTM2wodsTQYFHdpx8eqRJ3N+9pY= +github.com/bitfield/gotestdox v0.2.2 h1:x6RcPAbBbErKLnapz1QeAlf3ospg8efBsedU93CDsnE= +github.com/bitfield/gotestdox v0.2.2/go.mod h1:D+gwtS0urjBrzguAkTM2wodsTQYFHdpx8eqRJ3N+9pY= github.com/bkielbasa/cyclop v1.2.1 h1:AeF71HZDob1P2/pRm1so9cd1alZnrpyc4q2uP2l0gJY= github.com/bkielbasa/cyclop v1.2.1/go.mod h1:K/dT/M0FPAiYjBgQGau7tz+3TMh4FWAEqlMhzFWCrgM= github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M= @@ -103,13 +103,13 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/curioswitch/go-reassign v0.2.0 h1:G9UZyOcpk/d7Gd6mqYgd8XYWFMw/znxwGDUstnC9DIo= github.com/curioswitch/go-reassign v0.2.0/go.mod h1:x6OpXuWvgfQaMGks2BZybTngWjT84hqJfKoO8Tt/Roc= github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= -github.com/daixiang0/gci v0.13.4 h1:61UGkmpoAcxHM2hhNkZEf5SzwQtWJXTSws7jaPyqwlw= -github.com/daixiang0/gci v0.13.4/go.mod h1:12etP2OniiIdP4q+kjUGrC/rUagga7ODbqsom5Eo5Yk= +github.com/daixiang0/gci v0.13.5 h1:kThgmH1yBmZSBCh1EJVxQ7JsHpm5Oms0AMed/0LaH4c= +github.com/daixiang0/gci v0.13.5/go.mod h1:12etP2OniiIdP4q+kjUGrC/rUagga7ODbqsom5Eo5Yk= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -127,6 +127,7 @@ github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FM github.com/ettle/strcase v0.2.0 h1:fGNiVF21fHXpX1niBgk0aROov1LagYsOwV/xqKDKR/Q= github.com/ettle/strcase v0.2.0/go.mod h1:DajmHElDSaX76ITe3/VHVyMin4LWSJN5Z909Wp+ED1A= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= @@ -135,15 +136,14 @@ github.com/firefart/nonamedreturns v1.0.5 h1:tM+Me2ZaXs8tfdDw3X6DOX++wMCOqzYUho6 github.com/firefart/nonamedreturns v1.0.5/go.mod h1:gHJjDqhGM4WyPt639SOZs+G89Ko7QKH5R5BhnO6xJhw= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= github.com/ghostiam/protogetter v0.3.6 h1:R7qEWaSgFCsy20yYHNIJsU9ZOb8TziSRRxuAOTVKeOk= github.com/ghostiam/protogetter v0.3.6/go.mod h1:7lpeDnEJ1ZjL/YtyoN99ljO4z0pd3H0d18/t2dPBxHw= -github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= -github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= +github.com/gliderlabs/ssh v0.3.7 h1:iV3Bqi942d9huXnzEF2Mt+CY9gLu8DNM4Obd+8bODRE= +github.com/gliderlabs/ssh v0.3.7/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8= github.com/go-critic/go-critic v0.11.4 h1:O7kGOCx0NDIni4czrkRIXTnit0mkyKOCePh3My6OyEU= github.com/go-critic/go-critic v0.11.4/go.mod h1:2QAdo4iuLik5S9YG0rT4wcZ8QxwHYkrr6/2MWAiv/vc= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= @@ -152,10 +152,10 @@ github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+ github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.11.0 h1:XIZc1p+8YzypNr34itUfSvYJcv+eYdTnTvOZ2vD3cA4= -github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys= +github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= @@ -179,8 +179,8 @@ github.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQi github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ= github.com/go-toolsmith/typep v1.1.0 h1:fIRYDyF+JywLfqzyhdiHzRop/GQDxxNhLGQ6gFUNHus= github.com/go-toolsmith/typep v1.1.0/go.mod h1:fVIw+7zjdsMxDA3ITWnH1yOiw1rnTQKCsF/sk2H/qig= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-xmlfmt/xmlfmt v1.1.2 h1:Nea7b4icn8s57fTx1M5AI4qQT5HEM3rVUO8MuE6g80U= github.com/go-xmlfmt/xmlfmt v1.1.2/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= @@ -191,18 +191,16 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= github.com/golangci/gofmt v0.0.0-20231018234816-f50ced29576e h1:ULcKCDV1LOZPFxGZaA6TlQbiM3J2GCPnkx/bGF6sX/g= github.com/golangci/gofmt v0.0.0-20231018234816-f50ced29576e/go.mod h1:Pm5KhLPA8gSnQwrQ6ukebRcapGb/BG9iUkdaiCcGHJM= -github.com/golangci/golangci-lint v1.59.0 h1:st69YDnAH/v2QXDcgUaZ0seQajHScPALBVkyitYLXEk= -github.com/golangci/golangci-lint v1.59.0/go.mod h1:QNA32UWdUdHXnu+Ap5/ZU4WVwyp2tL94UxEXrSErjg0= -github.com/golangci/misspell v0.5.1 h1:/SjR1clj5uDjNLwYzCahHwIOPmQgoH04AyQIiWGbhCM= -github.com/golangci/misspell v0.5.1/go.mod h1:keMNyY6R9isGaSAu+4Q8NMBwMPkh15Gtc8UCVoDtAWo= +github.com/golangci/golangci-lint v1.59.1 h1:CRRLu1JbhK5avLABFJ/OHVSQ0Ie5c4ulsOId1h3TTks= +github.com/golangci/golangci-lint v1.59.1/go.mod h1:jX5Oif4C7P0j9++YB2MMJmoNrb01NJ8ITqKWNLewThg= +github.com/golangci/misspell v0.6.0 h1:JCle2HUTNWirNlDIAUO44hUsKhOFqGPoC4LZxlaSXDs= +github.com/golangci/misspell v0.6.0/go.mod h1:keMNyY6R9isGaSAu+4Q8NMBwMPkh15Gtc8UCVoDtAWo= github.com/golangci/modinfo v0.3.4 h1:oU5huX3fbxqQXdfspamej74DFX0kyGLkw1ppvXoJ8GA= github.com/golangci/modinfo v0.3.4/go.mod h1:wytF1M5xl9u0ij8YSvhkEVPP3M5Mc7XLl1pxH3B2aUM= github.com/golangci/plugin-module-register v0.1.1 h1:TCmesur25LnyJkpsVrupv1Cdzo+2f7zX0H6Jkw1Ol6c= @@ -218,7 +216,6 @@ github.com/google/go-cmdtest v0.4.1-0.20220921163831-55ab3332a786/go.mod h1:apVn github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -288,20 +285,22 @@ github.com/kisielk/errcheck v1.7.0/go.mod h1:1kLL+jV4e+CFfueBmI1dSK2ADDyQnlrnrY/ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkHAIKE/contextcheck v1.1.5 h1:CdnJh63tcDe53vG+RebdpdXJTc9atMgGqdx8LXxiilg= github.com/kkHAIKE/contextcheck v1.1.5/go.mod h1:O930cpht4xb1YQpK+1+AgoM3mFsvxr7uyFptcnWTYUA= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/parsers/yaml v0.1.0 h1:ZZ8/iGfRLvKSaMEECEBPM1HQslrZADk8fP1XFUxVI5w= github.com/knadh/koanf/parsers/yaml v0.1.0/go.mod h1:cvbUDC7AL23pImuQP0oRw/hPuccrNBS2bps8asS0CwY= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/providers/env v0.1.0 h1:LqKteXqfOWyx5Ab9VfGHmjY9BvRXi+clwyZozgVRiKg= -github.com/knadh/koanf/providers/env v0.1.0/go.mod h1:RE8K9GbACJkeEnkl8L/Qcj8p4ZyPXZIQ191HJi44ZaQ= -github.com/knadh/koanf/providers/file v0.1.0 h1:fs6U7nrV58d3CFAFh8VTde8TM262ObYf3ODrc//Lp+c= -github.com/knadh/koanf/providers/file v0.1.0/go.mod h1:rjJ/nHQl64iYCtAW2QQnF0eSmDEX/YZ/eNFj5yR6BvA= +github.com/knadh/koanf/providers/env v1.0.0 h1:ufePaI9BnWH+ajuxGGiJ8pdTG0uLEUWC7/HDDPGLah0= +github.com/knadh/koanf/providers/env v1.0.0/go.mod h1:mzFyRZueYhb37oPmC1HAv/oGEEuyvJDA98r3XAa8Gak= +github.com/knadh/koanf/providers/file v1.1.2 h1:aCC36YGOgV5lTtAFz2qkgtWdeQsgfxUkxDOe+2nQY3w= +github.com/knadh/koanf/providers/file v1.1.2/go.mod h1:/faSBcv2mxPVjFrXck95qeoyoZ5myJ6uxN8OOVNJJCI= github.com/knadh/koanf/providers/fs v0.1.0 h1:9Hln9GS3bWTItAnGVFYyfkoAIxAFq7pvlF64pTNiDdQ= github.com/knadh/koanf/providers/fs v0.1.0/go.mod h1:Cva1yH8NBxkEeVZx8CUmF5TunbgO72E+GwqDbqpP2sE= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -363,6 +362,8 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/moricho/tparallel v0.3.1 h1:fQKD4U1wRMAYNngDonW5XupoB/ZGJHdpzrWqgyg9krA= github.com/moricho/tparallel v0.3.1/go.mod h1:leENX2cUv7Sv2qDgdi0D0fCftN8fRC67Bcn8pqzeYNI= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= github.com/nishanths/exhaustive v0.12.0 h1:vIY9sALmw6T/yxiASewa4TQcFsVYZQQRUQJhKRf3Swg= @@ -393,18 +394,18 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/polyfloyd/go-errorlint v1.5.1 h1:5gHxDjLyyWij7fhfrjYNNlHsUNQeyx0LFQKUelO3RBo= -github.com/polyfloyd/go-errorlint v1.5.1/go.mod h1:sH1QC1pxxi0fFecsVIzBmxtrgd9IF/SkJpA6wqyKAJs= +github.com/polyfloyd/go-errorlint v1.5.2 h1:SJhVik3Umsjh7mte1vE0fVZ5T1gznasQG3PV7U5xFdA= +github.com/polyfloyd/go-errorlint v1.5.2/go.mod h1:sH1QC1pxxi0fFecsVIzBmxtrgd9IF/SkJpA6wqyKAJs= github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= +github.com/prometheus/client_golang v1.20.3 h1:oPksm4K8B+Vt35tUhw6GbSNSgVlVSBH0qELP/7u83l4= +github.com/prometheus/client_golang v1.20.3/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= +github.com/prometheus/common v0.59.1 h1:LXb1quJHWm1P6wq/U824uxYi4Sg0oGvNeUm1z5dJoX0= +github.com/prometheus/common v0.59.1/go.mod h1:GpWM7dewqmVYcd7SmRaiWVe9SSqjf0UrwnYnpEZNuT0= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/quasilyte/go-ruleguard v0.4.2 h1:htXcXDK6/rO12kiTHKfHuqR4kr3Y4M0J0rOL6CH/BYs= github.com/quasilyte/go-ruleguard v0.4.2/go.mod h1:GJLgqsLeo4qgavUoL8JeGFNS7qcisx3awV/w9eWTmNI= github.com/quasilyte/go-ruleguard/dsl v0.3.22 h1:wd8zkOhSNr+I+8Qeciml08ivDt1pSXe60+5DqOpCjPE= @@ -433,12 +434,12 @@ github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6Ng github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY= github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tMEOsumirXcOJqAw= github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= -github.com/sashamelentyev/usestdlibvars v1.25.0 h1:IK8SI2QyFzy/2OD2PYnhy84dpfNo9qADrRt6LH8vSzU= -github.com/sashamelentyev/usestdlibvars v1.25.0/go.mod h1:9nl0jgOfHKWNFS43Ojw0i7aRoS4j6EBye3YBhmAIRF8= +github.com/sashamelentyev/usestdlibvars v1.26.0 h1:LONR2hNVKxRmzIrZR0PhSF3mhCAzvnr+DcUiHgREfXE= +github.com/sashamelentyev/usestdlibvars v1.26.0/go.mod h1:9nl0jgOfHKWNFS43Ojw0i7aRoS4j6EBye3YBhmAIRF8= github.com/securego/gosec/v2 v2.20.1-0.20240525090044-5f0084eb01a9 h1:rnO6Zp1YMQwv8AyxzuwsVohljJgp4L0ZqiCgtACsPsc= github.com/securego/gosec/v2 v2.20.1-0.20240525090044-5f0084eb01a9/go.mod h1:dg7lPlu/xK/Ut9SedURCoZbVCR4yC7fM65DtH9/CDHs= -github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= -github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU= github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= @@ -450,8 +451,8 @@ github.com/sivchari/containedctx v1.0.3 h1:x+etemjbsh2fB5ewm5FeLNi5bUjK0V8n0RB+W github.com/sivchari/containedctx v1.0.3/go.mod h1:c1RDvCbnJLtH4lLcYD/GqwiBSSf4F5Qk0xld2rBqzJ4= github.com/sivchari/tenv v1.7.1 h1:PSpuD4bu6fSmtWMxSGWcvqUUgIn7k3yOJhOIzVWn8Ak= github.com/sivchari/tenv v1.7.1/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg= -github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ= -github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= +github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A= +github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= github.com/sonatard/noctx v0.0.2 h1:L7Dz4De2zDQhW8S0t+KUjY0MAQJd6SgVwhzNIc4ok00= github.com/sonatard/noctx v0.0.2/go.mod h1:kzFz+CzWSjQ2OzIm46uJZoXuBpa2+0y3T36U18dWqIo= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= @@ -462,13 +463,12 @@ github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= -github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= +github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= +github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/stbenjam/no-sprintf-host-port v0.1.1 h1:tYugd/yrm1O0dV+ThCbaKZh195Dfm07ysF0U6JQXczc= @@ -487,8 +487,9 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c h1:+aPplBwWcHBo6q9xrfWdMrT9o4kltkmmvpemgIjep/8= @@ -515,8 +516,8 @@ github.com/ultraware/whitespace v0.1.1 h1:bTPOGejYFulW3PkcrqkeQwOd6NKOOXvmGD9bo/ github.com/ultraware/whitespace v0.1.1/go.mod h1:XcP1RLD81eV4BW8UhQlpaR+SDc2givTvyI8a586WjW8= github.com/uudashr/gocognit v1.1.2 h1:l6BAEKJqQH2UpKAPKdMfZf5kE4W/2xk8pfU1OVLvniI= github.com/uudashr/gocognit v1.1.2/go.mod h1:aAVdLURqcanke8h3vg35BC++eseDm66Z7KmchI5et4k= -github.com/vektah/gqlparser/v2 v2.5.11 h1:JJxLtXIoN7+3x6MBdtIP59TP1RANnY7pXOaDnADQSf8= -github.com/vektah/gqlparser/v2 v2.5.11/go.mod h1:1rCcfwB2ekJofmluGWXMSEnPMZgbxzwj6FaZ/4OT8Cc= +github.com/vektah/gqlparser/v2 v2.5.16 h1:1gcmLTvs3JLKXckwCwlUagVn/IlV2bwqle0vJ0vy5p8= +github.com/vektah/gqlparser/v2 v2.5.16/go.mod h1:1lz1OeCqgQbQepsGxPVywrjdBHW2T08PUS3pJqepRww= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= github.com/xen0n/gosmopolitan v1.2.2 h1:/p2KTnMzwRexIW8GlKawsTWOxn7UHA+jCMF/V8HHtvU= @@ -540,42 +541,42 @@ go-simpler.org/assert v0.9.0 h1:PfpmcSvL7yAnWyChSjOz6Sp6m9j5lyK8Ok9pEL31YkQ= go-simpler.org/assert v0.9.0/go.mod h1:74Eqh5eI6vCK6Y5l3PI8ZYFXG4Sa+tkr70OIPJAUr28= go-simpler.org/musttag v0.12.2 h1:J7lRc2ysXOq7eM8rwaTYnNrHd5JwjppzB6mScysB2Cs= go-simpler.org/musttag v0.12.2/go.mod h1:uN1DVIasMTQKk6XSik7yrJoEysGtR2GRqvWnI9S7TYM= -go-simpler.org/sloglint v0.7.0 h1:rMZRxD9MbaGoRFobIOicMxZzum7AXNFDlez6xxJs5V4= -go-simpler.org/sloglint v0.7.0/go.mod h1:g9SXiSWY0JJh4LS39/Q0GxzP/QX2cVcbTOYhDpXrJEs= -go.opentelemetry.io/build-tools v0.13.0 h1:0I3jJQ2zcJU8k4ZjyHNqUBX2Len1UvBIOzVP4b50g9A= -go.opentelemetry.io/build-tools v0.13.0/go.mod h1:PEtg5iWjNI9WAlKXP/xll/hgbq/Cp4Ma4T1ssKB2T0Q= -go.opentelemetry.io/build-tools/checkfile v0.13.0 h1:Nq13fOLpF9T+y4birZbfv6JurFC1Pla5UwC+t0GMbAo= -go.opentelemetry.io/build-tools/checkfile v0.13.0/go.mod h1:fRNphqnBebBiwL1A3OofgCDiJ6enb73uKGIO+n0gHPI= -go.opentelemetry.io/build-tools/chloggen v0.13.0 h1:C30r8ecNuJ30T3+vSvFJhaXUjUpx6r07nM3weDCpS7U= -go.opentelemetry.io/build-tools/chloggen v0.13.0/go.mod h1:1Ueg04+D2eU7Lm80RqS4DYTdtkHwTmulQZL0tUI4iAk= -go.opentelemetry.io/build-tools/crosslink v0.13.0 h1:R0V89bTYzoJpasiOIYiQo6txL/ZTzMdEuthJ4gLUTF8= -go.opentelemetry.io/build-tools/crosslink v0.13.0/go.mod h1:aYIwOj9b3Nmgm6nIZZk28tF/JjpicI8xenEVUeoVNp0= -go.opentelemetry.io/build-tools/issuegenerator v0.13.0 h1:hAzDPWh/oyBVoYRB5Xb8Y6/3Zs0/JD3uwkp1pQWt8vM= -go.opentelemetry.io/build-tools/issuegenerator v0.13.0/go.mod h1:hHPQ5lv0apJv0QM8mz/k5nAwacDEEDD+fJ8xYhrKjBM= -go.opentelemetry.io/build-tools/multimod v0.13.0 h1:HGAP3zCM8vOTNJSQbjQ5VbKZSctIZxppPBxRTzye7ic= -go.opentelemetry.io/build-tools/multimod v0.13.0/go.mod h1:CxZp68c4PIN+bYlVOGB2FvE5zZMBuGz7cGSHv2L7pSc= -go.opentelemetry.io/collector/cmd/builder v0.102.0 h1:GvNRXRFxEy6pYfqBmIceXycL+RexUSqJsAiauibAzt4= -go.opentelemetry.io/collector/cmd/builder v0.102.0/go.mod h1:t8ksqDrnfO7hwruDB+jN0txcvIV5e1LHQWcO1okjbs0= -go.opentelemetry.io/collector/cmd/mdatagen v0.102.0 h1:jM0cE0edcQguFCjZoSE7aH9/HiNT9AwwdEzCkzzZBkc= -go.opentelemetry.io/collector/cmd/mdatagen v0.102.0/go.mod h1:gOy2rhbFnX6tsfcutM8oAR76RdB1FaYmNusKAqhzb74= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0 h1:SfASE6lxXjrmYj/UibcWdOiFWvRG0zt4hJgenloEhlY= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.0/go.mod h1:+Ku0Fvdb5f6e9UkfqJXAV5FaUJVxxg6Ykfx7Js8y+V4= -go.opentelemetry.io/collector/filter v0.102.0 h1:2K4Q/l4b+tglMAQmxpscuCr/juyozyPx17Q6Dfm2FwU= -go.opentelemetry.io/collector/filter v0.102.0/go.mod h1:zDVjFCeeVct7hYwejzx+aRC1dbHaPsvv/Ob1SvCiQjE= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go-simpler.org/sloglint v0.7.1 h1:qlGLiqHbN5islOxjeLXoPtUdZXb669RW+BDQ+xOSNoU= +go-simpler.org/sloglint v0.7.1/go.mod h1:OlaVDRh/FKKd4X4sIMbsz8st97vomydceL146Fthh/c= +go.opentelemetry.io/build-tools v0.15.0 h1:SJFD+MSKKrSIP0oujmmY/zRi8TgVFzUc1080nIBmRzA= +go.opentelemetry.io/build-tools v0.15.0/go.mod h1:xyjzzjE7WEtBPVqZ0BwC8RxbGGW3DkD33YFgVLkvOUs= +go.opentelemetry.io/build-tools/checkfile v0.15.0 h1:C4qF0t+CMgkNdj125SKwpjjX6RG+NW75KdF9KigbaXk= +go.opentelemetry.io/build-tools/checkfile v0.15.0/go.mod h1:UbB2iej3/BOBeK+796FGUSP1Yu6ppq2SoklGBspQp/E= +go.opentelemetry.io/build-tools/chloggen v0.15.0 h1:G5UeYUgP6x4QXie0yNs/6TjK9nCuuVXgXeDWE9/cxQQ= +go.opentelemetry.io/build-tools/chloggen v0.15.0/go.mod h1:oovDPiOQS4iruTVH469/68hEYjWC48c8u+qJpWJc8Eg= +go.opentelemetry.io/build-tools/crosslink v0.15.0 h1:cGwaVTtYi4wUQrQss8i9qmSoE9x7JXj9ou3JNMIe0nw= +go.opentelemetry.io/build-tools/crosslink v0.15.0/go.mod h1:BB5bv1xmtugy4lL9IWE9zNbpwtRwoFRdM8JmusHs3xw= +go.opentelemetry.io/build-tools/issuegenerator v0.15.0 h1:M2cnoXKf0yRmZ7SO2mOYYpiKtOWZyFZnnAHzQhgFeIw= +go.opentelemetry.io/build-tools/issuegenerator v0.15.0/go.mod h1:GW53mhELVGByYf/Z6K3I4Ll37osqGY7w/r9mmu9VG1g= +go.opentelemetry.io/build-tools/multimod v0.15.0 h1:mF4+7rf0uW06VhentAI9puZZoTKa9I9s7IXGgLSTD+E= +go.opentelemetry.io/build-tools/multimod v0.15.0/go.mod h1:ovMzngj19/DmEFJSUsplyj0aVaYxbMf5o2eeK/+Pzqw= +go.opentelemetry.io/collector/cmd/builder v0.116.0 h1:KVLk6qEpHdz2wSg1BasxpFLNYChRakBllhwb8/2qiOs= +go.opentelemetry.io/collector/cmd/builder v0.116.0/go.mod h1:dbzO6Gh1jW7IDLpxk1XMZXM1C3BaDRY4xppmx6cyTgM= +go.opentelemetry.io/collector/cmd/mdatagen v0.116.0 h1:TUJ3cah2B53ZbZeOiwvlzhJpYmy5y7EStkXvqp30jTY= +go.opentelemetry.io/collector/cmd/mdatagen v0.116.0/go.mod h1:jwSwViT+hLPeDycCNQMr4upI+vLFyvzGR0wZoM+gx/4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0 h1:upFhnU8EyPp0WMR53mJIdx+UR2EGFOr+ppYKzUCY/Vg= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0/go.mod h1:FhjMWU5nf3IctX27lVZomM5SKMyRywShRsA4/rHoBe8= +go.opentelemetry.io/collector/filter v0.116.0 h1:pvN3W2JIEHxWbCLlUS1HxrRo3ZQrN4BiWyLvPFyKfvQ= +go.opentelemetry.io/collector/filter v0.116.0/go.mod h1:GoLxnSI6uE6QzmGOaiz0mkgirbQpj2A2Nb18bTKv5gI= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8= go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -593,8 +594,11 @@ golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc h1:ao2WRsKSzW6KuUY9IWPwWahcHCgR0s52IfwutMfEbdM= golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= @@ -613,8 +617,10 @@ golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -633,10 +639,13 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= -golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= +golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= +golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -645,8 +654,9 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -661,7 +671,6 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220702020025-31831981b65f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -675,8 +684,15 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= +golang.org/x/telemetry v0.0.0-20240522233618-39ace7a40ae7 h1:FemxDzfMUcK2f3YY4H+05K9CDzbSVr2+q/JKN45pey0= +golang.org/x/telemetry v0.0.0-20240522233618-39ace7a40ae7/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -686,22 +702,26 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -728,24 +748,22 @@ golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= -golang.org/x/tools v0.21.1-0.20240514024235-59d9797072e7 h1:DnP3aRQn/r68glNGB8/7+3iE77jA+YZZCxpfIXx2MdA= -golang.org/x/tools v0.21.1-0.20240514024235-59d9797072e7/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= -golang.org/x/vuln v1.1.1 h1:4nYQg4OSr7uYQMtjuuYqLAEVuTjY4k/CPMYqvv5OPcI= -golang.org/x/vuln v1.1.1/go.mod h1:hNgE+SKMSp2wHVUpW0Ow2ejgKpNJePdML+4YjxrVxik= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= +golang.org/x/tools v0.27.0 h1:qEKojBykQkQ4EynWy4S8Weg69NumxKdn40Fce3uc/8o= +golang.org/x/tools v0.27.0/go.mod h1:sUi0ZgbwW9ZPAq26Ekut+weQPR5eIM6GQLQ1Yjm1H0Q= +golang.org/x/vuln v1.1.3 h1:NPGnvPOTgnjBc9HTaUx+nj+EaUYxl5SJOWqaDYGaFYw= +golang.org/x/vuln v1.1.3/go.mod h1:7Le6Fadm5FOqE9C926BCD0g12NWyhg7cxV4BwcPFuNY= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= @@ -760,13 +778,13 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/gotestsum v1.11.0 h1:A88/QWw7acMjZH1dMe6KZFhw32odUOIjCiAU/Q4n3mI= -gotest.tools/gotestsum v1.11.0/go.mod h1:cUOKgFEvWAP0twchmiOvdzX0SBZX0UI58bGRpRIu4xs= -gotest.tools/v3 v3.3.0 h1:MfDY1b1/0xN1CyMlQDac0ziEy9zJQd9CXBRRDHw2jJo= -gotest.tools/v3 v3.3.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= +gotest.tools/gotestsum v1.12.0 h1:CmwtaGDkHxrZm4Ib0Vob89MTfpc3GrEFMJKovliPwGk= +gotest.tools/gotestsum v1.12.0/go.mod h1:fAvqkSptospfSbQw26CTYzNwnsE/ztqLeyhP0h67ARY= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.4.7 h1:9MDAWxMoSnB6QoSqiVr7P5mtkT9pOc1kSxchzPCnqJs= honnef.co/go/tools v0.4.7/go.mod h1:+rnGS1THNh8zMwnd2oVOTL9QF6vmfyG6ZXBULae2uc0= mvdan.cc/gofumpt v0.6.0 h1:G3QvahNDmpD+Aek/bNOLrFR2XC6ZAdo62dZu65gmwGo= mvdan.cc/gofumpt v0.6.0/go.mod h1:4L0wf+kgIPZtcCWXynNS2e6bhmj73umwnuXSZarixzA= -mvdan.cc/unparam v0.0.0-20240427195214-063aff900ca1 h1:Nykk7fggxChwLK4rUPYESzeIwqsuxXXlFEAh5YhaMRo= -mvdan.cc/unparam v0.0.0-20240427195214-063aff900ca1/go.mod h1:ZzZjEpJDOmx8TdVU6umamY3Xy0UAQUI2DHbf05USVbI= +mvdan.cc/unparam v0.0.0-20240528143540-8a5130ca722f h1:lMpcwN6GxNbWtbpI1+xzFLSW8XzX0u72NttUGVFjO3U= +mvdan.cc/unparam v0.0.0-20240528143540-8a5130ca722f/go.mod h1:RSLa7mKKCNeTTMHBw5Hsy2rfJmd6O2ivt9Dw9ZqCQpQ= diff --git a/internal/tools/tools.go b/internal/tools/tools.go index a941c9512234..2dcc07248445 100644 --- a/internal/tools/tools.go +++ b/internal/tools/tools.go @@ -6,11 +6,12 @@ package tools // import "github.com/open-telemetry/opentelemetry-collector-contrib/internal/tools" // This file follows the recommendation at -// https://github.com/golang/go/wiki/Modules#how-can-i-track-tool-dependencies-for-a-module +// https://go.dev/wiki/Modules#how-can-i-track-tool-dependencies-for-a-module // on how to pin tooling dependencies to a go.mod file. // This ensures that all systems use the same version of tools in addition to regular dependencies. import ( + _ "github.com/Antonboom/testifylint" _ "github.com/Khan/genqlient" _ "github.com/client9/misspell/cmd/misspell" _ "github.com/daixiang0/gci" @@ -28,4 +29,5 @@ import ( _ "golang.org/x/tools/cmd/goimports" _ "golang.org/x/vuln/cmd/govulncheck" _ "gotest.tools/gotestsum" + _ "mvdan.cc/gofumpt" ) diff --git a/issue-triaging.md b/issue-triaging.md new file mode 100644 index 000000000000..b9a4f809e8d9 --- /dev/null +++ b/issue-triaging.md @@ -0,0 +1,73 @@ +# Issue management + +To help provide a consistent process for seeing issues through to completion, this section details some guidelines and +definitions to keep in mind when triaging issues. + +### Roles + +Determining the root cause of issues is a shared responsibility between those with triager permissions, code owners, +OpenTelemetry community members, issue authors, and anyone else who would like to contribute. + +#### Triagers + +Contributors with [triager](https://github.com/open-telemetry/opentelemetry-collector-contrib/#contributing) permissions can help move +issues along by adding missing component labels, which help organize issues and trigger automations to notify code owners. They can +also use their familiarity with the Collector and its components to investigate issues themselves. Alternatively, they may point issue +authors to another resource or someone else who may know more. + +#### Code Owners + +In many cases, the code owners for an issue are the best resource to help determine the root cause of a bug or whether an enhancement +is fit to be added to a component. Code owners will be notified by repository automations when: + +- a component label is added to an issue +- an issue is opened +- the issue becomes stale + +Code owners may not have triager permissions on the repository, +so they can help triage through investigation and by participating in discussions. They can also help organize issues by +[adding labels via comments](#adding-labels-via-comments). + +#### Community Members + +Community members or interested parties are welcome to help triage issues by investigating the root cause of bugs, adding input for +features they would like to see, or participating in design discussions. + +### Triage process + +Triaging an issue requires getting the issue into a state where there is enough information available on the issue or understanding +between the involved parties to allow work to begin or for the issue to be closed. Facilitating this may involve, but is not limited to: + +- Determining whether the issue is related to the code or documentation, or whether the issue can be resolved without any changes. +- Ensuring that a bug can be reproduced, and if possible, the behavior can be traced back to the offending code or documentation. +- Determining whether a feature request belongs in a component, should be accomplished through other means, or isn't appropriate for a component at this time. +- Guiding any interested parties to another person or resource that may be more knowledgeable about an issue. +- Suggesting an issue for discussion at a SIG meeting if a synchronous discussion would be more productive. + +#### Issue assignment + +Issues are assigned for someone to work on by a triager when someone volunteers to work on an issue. Assignment is intended to prevent duplicate work by making it visible who is +working on a particular task. A person who is assigned to the issue may be assigned to help triage the issue and implement it, or can be assigned after the issue has already been +triaged and is ready for work. If someone who is assigned to an issue is no longer able to work on it, they may request to be unassigned from the issue. + +### Label Definitions + +| Label | When to apply | +| -------------------- |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `bug` | Something that is advertised or intended to work isn't working as expected. | +| `enhancement` | Something that isn't an advertised feature that would be useful to users or maintainers. | +| `flaky test` | A test unexpectedly failed during CI, showing that there is a problem with the tests or test setup that is causing the tests to intermittently fail. | +| `documentation` | This is a collector usability issue that could likely be resolved by providing relevant documentation. Please consider adding new or improving existing documentation before closing issues with this label. | +| `good first issue` | Implementing this issue would not require specialized or in-depth knowledge about the component and is ideal for a new or first-time contributor to take. | +| `help wanted` | The code owners for this component do not expect to have time to work on it soon, and would welcome help from contributors. | +| `discussion needed` | This issue needs more input from the maintainers or community before work can be started. | +| `needs triage` | This label is added automatically, and can be removed when a triager or code owner deems that an issue is either ready for work or should not need any work. See also the [triaging process](#triage-process). | +| `waiting for author` | Can be applied when input is required from the author before the issue can move any further. | +| `priority:p0` | A critical security vulnerability or Collector panic using a default or common configuration unrelated to a specific component. | +| `priority:p1` | An urgent issue that should be worked on quickly, before most other issues. | +| `priority:p2` | A standard bug or enhancement. | +| `priority:p3` | A technical improvement, lower priority bug, or other minor issue. Generally something that is considered a "nice to have." | +| `release:blocker` | This issue must be resolved before the next Collector version can be released. | +| `Sponsor Needed` | A new component has been proposed, but implementation is not ready to begin. This can be because a sponsor has not yet been decided, or because some details on the component still need to be decided. | +| `Accepted Component` | A sponsor has elected to take on a component and implementation is ready to begin. | +| `Vendor Specific Component` | This should be applied to any component proposal where the functionality for the component is particular to a vendor. | diff --git a/pkg/batchperresourceattr/batchperresourceattr.go b/pkg/batchperresourceattr/batchperresourceattr.go index 92f55b6481da..510b41f6fca2 100644 --- a/pkg/batchperresourceattr/batchperresourceattr.go +++ b/pkg/batchperresourceattr/batchperresourceattr.go @@ -35,9 +35,9 @@ func NewMultiBatchPerResourceTraces(attrKeys []string, next consumer.Traces) con } } -// Capabilities implements the consumer interface. +// Capabilities returns the capabilities of the next consumer because batchTraces doesn't mutate data itself. func (bt *batchTraces) Capabilities() consumer.Capabilities { - return consumer.Capabilities{MutatesData: false} + return bt.next.Capabilities() } func (bt *batchTraces) ConsumeTraces(ctx context.Context, td ptrace.Traces) error { @@ -98,9 +98,9 @@ func NewMultiBatchPerResourceMetrics(attrKeys []string, next consumer.Metrics) c } } -// Capabilities implements the consumer interface. +// Capabilities returns the capabilities of the next consumer because batchMetrics doesn't mutate data itself. func (bt *batchMetrics) Capabilities() consumer.Capabilities { - return consumer.Capabilities{MutatesData: false} + return bt.next.Capabilities() } func (bt *batchMetrics) ConsumeMetrics(ctx context.Context, td pmetric.Metrics) error { @@ -159,9 +159,9 @@ func NewMultiBatchPerResourceLogs(attrKeys []string, next consumer.Logs) consume } } -// Capabilities implements the consumer interface. +// Capabilities returns the capabilities of the next consumer because batchLogs doesn't mutate data itself. func (bt *batchLogs) Capabilities() consumer.Capabilities { - return consumer.Capabilities{MutatesData: false} + return bt.next.Capabilities() } func (bt *batchLogs) ConsumeLogs(ctx context.Context, td plog.Logs) error { diff --git a/pkg/batchperresourceattr/go.mod b/pkg/batchperresourceattr/go.mod index 41645295885f..ee8c7a0d84af 100644 --- a/pkg/batchperresourceattr/go.mod +++ b/pkg/batchperresourceattr/go.mod @@ -1,11 +1,12 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchperresourceattr -go 1.21.0 +go 1.22.0 require ( - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 go.uber.org/goleak v1.3.0 go.uber.org/multierr v1.11.0 ) @@ -17,12 +18,14 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/pkg/batchperresourceattr/go.sum b/pkg/batchperresourceattr/go.sum index fbbfe0ef7798..35d3ed65354c 100644 --- a/pkg/batchperresourceattr/go.sum +++ b/pkg/batchperresourceattr/go.sum @@ -3,6 +3,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -25,16 +27,22 @@ github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjR github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -48,20 +56,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -70,12 +78,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/pkg/batchpersignal/batchpersignal_test.go b/pkg/batchpersignal/batchpersignal_test.go index e6459f64d5ea..8263c8ed39a8 100644 --- a/pkg/batchpersignal/batchpersignal_test.go +++ b/pkg/batchpersignal/batchpersignal_test.go @@ -65,7 +65,6 @@ func TestSplitDifferentTracesIntoDifferentBatches(t *testing.T) { assert.Equal(t, library.Name(), secondOutILS.Scope().Name()) assert.Equal(t, secondSpan.Name(), secondOutILS.Spans().At(0).Name()) assert.Equal(t, ils.SchemaUrl(), secondOutILS.SchemaUrl()) - } func TestSplitTracesWithNilTraceID(t *testing.T) { diff --git a/pkg/batchpersignal/go.mod b/pkg/batchpersignal/go.mod index a75f0b1b61ae..3c4c7dfabd62 100644 --- a/pkg/batchpersignal/go.mod +++ b/pkg/batchpersignal/go.mod @@ -1,10 +1,10 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal -go 1.21.0 +go 1.22.0 require ( - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/pdata v1.9.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/pdata v1.22.0 go.uber.org/goleak v1.3.0 ) @@ -17,12 +17,12 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/pkg/batchpersignal/go.sum b/pkg/batchpersignal/go.sum index 1bb33e0ec9fc..49bd71274315 100644 --- a/pkg/batchpersignal/go.sum +++ b/pkg/batchpersignal/go.sum @@ -4,6 +4,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -26,12 +28,12 @@ github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjR github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -45,20 +47,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -67,12 +69,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/pkg/datadog/Makefile b/pkg/datadog/Makefile new file mode 100644 index 000000000000..c1496226e590 --- /dev/null +++ b/pkg/datadog/Makefile @@ -0,0 +1 @@ +include ../../Makefile.Common \ No newline at end of file diff --git a/pkg/datadog/config/config.go b/pkg/datadog/config/config.go new file mode 100644 index 000000000000..6171ca13cdb8 --- /dev/null +++ b/pkg/datadog/config/config.go @@ -0,0 +1,365 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package config // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/datadog/config" + +import ( + "errors" + "fmt" + "regexp" + "strings" + "time" + + "github.com/DataDog/datadog-agent/pkg/util/hostname/validate" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/confighttp" + "go.opentelemetry.io/collector/config/confignet" + "go.opentelemetry.io/collector/config/configopaque" + "go.opentelemetry.io/collector/config/configretry" + "go.opentelemetry.io/collector/confmap" + "go.opentelemetry.io/collector/exporter/exporterhelper" + "go.uber.org/zap" +) + +var ( + // ErrUnsetAPIKey is returned when the API key is not set. + ErrUnsetAPIKey = errors.New("api.key is not set") + // ErrNoMetadata is returned when only_metadata is enabled but host metadata is disabled or hostname_source is not first_resource. + ErrNoMetadata = errors.New("only_metadata can't be enabled when host_metadata::enabled = false or host_metadata::hostname_source != first_resource") + // ErrInvalidHostname is returned when the hostname is invalid. + ErrEmptyEndpoint = errors.New("endpoint cannot be empty") + // ErrAPIKeyFormat is returned if API key contains invalid characters + ErrAPIKeyFormat = errors.New("api::key contains invalid characters") + // NonHexRegex is a regex of characters that are always invalid in a Datadog API key + NonHexRegex = regexp.MustCompile(NonHexChars) +) + +const ( + // DefaultSite is the default site of the Datadog intake to send data to + DefaultSite = "datadoghq.com" + // NonHexChars is a regex of characters that are always invalid in a Datadog API key + NonHexChars = "[^0-9a-fA-F]" +) + +// APIConfig defines the API configuration options +type APIConfig struct { + // Key is the Datadog API key to associate your Agent's data with your organization. + // Create a new API key here: https://app.datadoghq.com/account/settings + Key configopaque.String `mapstructure:"key"` + + // Site is the site of the Datadog intake to send data to. + // The default value is "datadoghq.com". + Site string `mapstructure:"site"` + + // FailOnInvalidKey states whether to exit at startup on invalid API key. + // The default value is false. + FailOnInvalidKey bool `mapstructure:"fail_on_invalid_key"` +} + +// TagsConfig defines the tag-related configuration +// It is embedded in the configuration +type TagsConfig struct { + // Hostname is the fallback hostname used for payloads without hostname-identifying attributes. + // This option will NOT change the hostname applied to your metrics, traces and logs if they already have hostname-identifying attributes. + // If unset, the hostname will be determined automatically. See https://docs.datadoghq.com/opentelemetry/schema_semantics/hostname/?tab=datadogexporter#fallback-hostname-logic for details. + // + // Prefer using the `datadog.host.name` resource attribute over using this setting. + // See https://docs.datadoghq.com/opentelemetry/schema_semantics/hostname/?tab=datadogexporter#general-hostname-semantic-conventions for details. + Hostname string `mapstructure:"hostname"` +} + +// Config defines configuration for the Datadog exporter. +type Config struct { + confighttp.ClientConfig `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. + QueueSettings exporterhelper.QueueConfig `mapstructure:"sending_queue"` + configretry.BackOffConfig `mapstructure:"retry_on_failure"` + + TagsConfig `mapstructure:",squash"` + + // API defines the Datadog API configuration. + API APIConfig `mapstructure:"api"` + + // Metrics defines the Metrics exporter specific configuration + Metrics MetricsConfig `mapstructure:"metrics"` + + // Traces defines the Traces exporter specific configuration + Traces TracesExporterConfig `mapstructure:"traces"` + + // Logs defines the Logs exporter specific configuration + Logs LogsConfig `mapstructure:"logs"` + + // HostMetadata defines the host metadata specific configuration + HostMetadata HostMetadataConfig `mapstructure:"host_metadata"` + + // OnlyMetadata defines whether to only send metadata + // This is useful for agent-collector setups, so that + // metadata about a host is sent to the backend even + // when telemetry data is reported via a different host. + // + // This flag is incompatible with disabling host metadata, + // `use_resource_metadata`, or `host_metadata::hostname_source != first_resource` + OnlyMetadata bool `mapstructure:"only_metadata"` + + // Non-fatal warnings found during configuration loading. + warnings []error +} + +// LogWarnings logs warning messages that were generated on unmarshaling. +func (c *Config) LogWarnings(logger *zap.Logger) { + for _, err := range c.warnings { + logger.Warn(fmt.Sprintf("%v", err)) + } +} + +var _ component.Config = (*Config)(nil) + +// Validate the configuration for errors. This is required by component.Config. +func (c *Config) Validate() error { + if err := validateClientConfig(c.ClientConfig); err != nil { + return err + } + + if c.OnlyMetadata && (!c.HostMetadata.Enabled || c.HostMetadata.HostnameSource != HostnameSourceFirstResource) { + return ErrNoMetadata + } + + if err := validate.ValidHostname(c.Hostname); c.Hostname != "" && err != nil { + return fmt.Errorf("hostname field is invalid: %w", err) + } + + if string(c.API.Key) == "" { + return ErrUnsetAPIKey + } + + invalidAPIKeyChars := NonHexRegex.FindAllString(string(c.API.Key), -1) + if len(invalidAPIKeyChars) > 0 { + return fmt.Errorf("%w: invalid characters: %s", ErrAPIKeyFormat, strings.Join(invalidAPIKeyChars, ", ")) + } + + if err := c.Traces.Validate(); err != nil { + return err + } + + err := c.Metrics.HistConfig.validate() + if err != nil { + return err + } + + if c.HostMetadata.ReporterPeriod < 5*time.Minute { + return errors.New("reporter_period must be 5 minutes or higher") + } + + return nil +} + +func validateClientConfig(cfg confighttp.ClientConfig) error { + var unsupported []string + if cfg.Auth != nil { + unsupported = append(unsupported, "auth") + } + if cfg.Endpoint != "" { + unsupported = append(unsupported, "endpoint") + } + if cfg.Compression != "" { + unsupported = append(unsupported, "compression") + } + if len(cfg.Headers) > 0 { + unsupported = append(unsupported, "headers") + } + if cfg.HTTP2ReadIdleTimeout != 0 { + unsupported = append(unsupported, "http2_read_idle_timeout") + } + if cfg.HTTP2PingTimeout != 0 { + unsupported = append(unsupported, "http2_ping_timeout") + } + + if len(unsupported) > 0 { + return fmt.Errorf("these confighttp client configs are currently not respected by Datadog exporter: %s", strings.Join(unsupported, ", ")) + } + return nil +} + +var _ error = (*renameError)(nil) + +// renameError is an error related to a renamed setting. +type renameError struct { + // oldName of the configuration option. + oldName string + // newName of the configuration option. + newName string + // issueNumber on opentelemetry-collector-contrib for tracking + issueNumber uint +} + +// List of settings that have been removed, but for which we keep a custom error. +var removedSettings = []renameError{ + { + oldName: "metrics::send_monotonic_counter", + newName: "metrics::sums::cumulative_monotonic_mode", + issueNumber: 8489, + }, + { + oldName: "tags", + newName: "host_metadata::tags", + issueNumber: 9099, + }, + { + oldName: "send_metadata", + newName: "host_metadata::enabled", + issueNumber: 9099, + }, + { + oldName: "use_resource_metadata", + newName: "host_metadata::hostname_source", + issueNumber: 9099, + }, + { + oldName: "metrics::report_quantiles", + newName: "metrics::summaries::mode", + issueNumber: 8845, + }, + { + oldName: "metrics::instrumentation_library_metadata_as_tags", + newName: "metrics::instrumentation_scope_as_tags", + issueNumber: 11135, + }, +} + +// Error implements the error interface. +func (e renameError) Error() string { + return fmt.Sprintf( + "%q was removed in favor of %q. See https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/%d", + e.oldName, + e.newName, + e.issueNumber, + ) +} + +func handleRemovedSettings(configMap *confmap.Conf) error { + var errs []error + for _, removedErr := range removedSettings { + if configMap.IsSet(removedErr.oldName) { + errs = append(errs, removedErr) + } + } + + return errors.Join(errs...) +} + +var _ confmap.Unmarshaler = (*Config)(nil) + +// Unmarshal a configuration map into the configuration struct. +func (c *Config) Unmarshal(configMap *confmap.Conf) error { + if err := handleRemovedSettings(configMap); err != nil { + return err + } + + err := configMap.Unmarshal(c) + if err != nil { + return err + } + + // Add deprecation warnings for deprecated settings. + renamingWarnings, err := handleRenamedSettings(configMap, c) + if err != nil { + return err + } + c.warnings = append(c.warnings, renamingWarnings...) + + c.API.Key = configopaque.String(strings.TrimSpace(string(c.API.Key))) + + // If an endpoint is not explicitly set, override it based on the site. + if !configMap.IsSet("metrics::endpoint") { + c.Metrics.TCPAddrConfig.Endpoint = fmt.Sprintf("https://api.%s", c.API.Site) + } + if !configMap.IsSet("traces::endpoint") { + c.Traces.TCPAddrConfig.Endpoint = fmt.Sprintf("https://trace.agent.%s", c.API.Site) + } + if !configMap.IsSet("logs::endpoint") { + c.Logs.TCPAddrConfig.Endpoint = fmt.Sprintf("https://http-intake.logs.%s", c.API.Site) + } + + // Return an error if an endpoint is explicitly set to "" + if c.Metrics.TCPAddrConfig.Endpoint == "" || c.Traces.TCPAddrConfig.Endpoint == "" || c.Logs.TCPAddrConfig.Endpoint == "" { + return ErrEmptyEndpoint + } + + const ( + initialValueSetting = "metrics::sums::initial_cumulative_monotonic_value" + cumulMonoMode = "metrics::sums::cumulative_monotonic_mode" + ) + if configMap.IsSet(initialValueSetting) && c.Metrics.SumConfig.CumulativeMonotonicMode != CumulativeMonotonicSumModeToDelta { + return fmt.Errorf("%q can only be configured when %q is set to %q", + initialValueSetting, cumulMonoMode, CumulativeMonotonicSumModeToDelta) + } + + return nil +} + +func defaultClientConfig() confighttp.ClientConfig { + client := confighttp.NewDefaultClientConfig() + client.Timeout = 15 * time.Second + return client +} + +// CreateDefaultConfig creates the default exporter configuration +func CreateDefaultConfig() component.Config { + return &Config{ + ClientConfig: defaultClientConfig(), + BackOffConfig: configretry.NewDefaultBackOffConfig(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), + + API: APIConfig{ + Site: "datadoghq.com", + }, + + Metrics: MetricsConfig{ + TCPAddrConfig: confignet.TCPAddrConfig{ + Endpoint: "https://api.datadoghq.com", + }, + DeltaTTL: 3600, + ExporterConfig: MetricsExporterConfig{ + ResourceAttributesAsTags: false, + InstrumentationScopeMetadataAsTags: false, + }, + HistConfig: HistogramConfig{ + Mode: "distributions", + SendAggregations: false, + }, + SumConfig: SumConfig{ + CumulativeMonotonicMode: CumulativeMonotonicSumModeToDelta, + InitialCumulativeMonotonicMode: InitialValueModeAuto, + }, + SummaryConfig: SummaryConfig{ + Mode: SummaryModeGauges, + }, + }, + + Traces: TracesExporterConfig{ + TCPAddrConfig: confignet.TCPAddrConfig{ + Endpoint: "https://trace.agent.datadoghq.com", + }, + TracesConfig: TracesConfig{ + IgnoreResources: []string{}, + PeerServiceAggregation: true, + PeerTagsAggregation: true, + ComputeStatsBySpanKind: true, + }, + }, + + Logs: LogsConfig{ + TCPAddrConfig: confignet.TCPAddrConfig{ + Endpoint: "https://http-intake.logs.datadoghq.com", + }, + UseCompression: true, + CompressionLevel: 6, + BatchWait: 5, + }, + + HostMetadata: HostMetadataConfig{ + Enabled: true, + HostnameSource: HostnameSourceConfigOrSystem, + ReporterPeriod: 30 * time.Minute, + }, + } +} diff --git a/pkg/datadog/config/config_test.go b/pkg/datadog/config/config_test.go new file mode 100644 index 000000000000..a5db98302203 --- /dev/null +++ b/pkg/datadog/config/config_test.go @@ -0,0 +1,829 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package config // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/datadog/config" + +import ( + "path/filepath" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/config/configauth" + "go.opentelemetry.io/collector/config/confighttp" + "go.opentelemetry.io/collector/config/confignet" + "go.opentelemetry.io/collector/config/configopaque" + "go.opentelemetry.io/collector/config/configretry" + "go.opentelemetry.io/collector/config/configtls" + "go.opentelemetry.io/collector/confmap" + "go.opentelemetry.io/collector/confmap/confmaptest" + "go.opentelemetry.io/collector/exporter/exporterhelper" +) + +func TestValidate(t *testing.T) { + idleConnTimeout := 30 * time.Second + maxIdleConn := 300 + maxIdleConnPerHost := 150 + maxConnPerHost := 250 + ty, err := component.NewType("ty") + assert.NoError(t, err) + auth := configauth.Authentication{AuthenticatorID: component.NewID(ty)} + + tests := []struct { + name string + cfg *Config + err string + }{ + { + name: "no api::key", + cfg: &Config{ + HostMetadata: HostMetadataConfig{Enabled: true, ReporterPeriod: 10 * time.Minute}, + }, + err: ErrUnsetAPIKey.Error(), + }, + { + name: "invalid format api::key", + cfg: &Config{ + API: APIConfig{Key: "'aaaaaaa"}, + }, + err: ErrAPIKeyFormat.Error(), + }, + { + name: "invalid hostname", + cfg: &Config{ + API: APIConfig{Key: "aaaaaaa"}, + TagsConfig: TagsConfig{Hostname: "invalid_host"}, + HostMetadata: HostMetadataConfig{Enabled: true, ReporterPeriod: 10 * time.Minute}, + }, + err: "hostname field is invalid: invalid_host is not RFC1123 compliant", + }, + { + name: "no metadata", + cfg: &Config{ + API: APIConfig{Key: "aaaaaaa"}, + OnlyMetadata: true, + HostMetadata: HostMetadataConfig{Enabled: true, ReporterPeriod: 10 * time.Minute}, + }, + err: ErrNoMetadata.Error(), + }, + { + name: "span name remapping valid", + cfg: &Config{ + API: APIConfig{Key: "aaaaaaa"}, + Traces: TracesExporterConfig{TracesConfig: TracesConfig{SpanNameRemappings: map[string]string{"old.opentelemetryspan.name": "updated.name"}}}, + HostMetadata: HostMetadataConfig{Enabled: true, ReporterPeriod: 10 * time.Minute}, + }, + }, + { + name: "span name remapping empty val", + cfg: &Config{ + API: APIConfig{Key: "aaaaaaa"}, + Traces: TracesExporterConfig{TracesConfig: TracesConfig{SpanNameRemappings: map[string]string{"oldname": ""}}}, + HostMetadata: HostMetadataConfig{Enabled: true, ReporterPeriod: 10 * time.Minute}, + }, + err: "'' is not valid value for span name remapping", + }, + { + name: "span name remapping empty key", + cfg: &Config{ + API: APIConfig{Key: "aaaaaaa"}, + Traces: TracesExporterConfig{TracesConfig: TracesConfig{SpanNameRemappings: map[string]string{"": "newname"}}}, + HostMetadata: HostMetadataConfig{Enabled: true, ReporterPeriod: 10 * time.Minute}, + }, + err: "'' is not valid key for span name remapping", + }, + { + name: "ignore resources valid", + cfg: &Config{ + API: APIConfig{Key: "aaaaaaa"}, + Traces: TracesExporterConfig{TracesConfig: TracesConfig{IgnoreResources: []string{"[123]"}}}, + HostMetadata: HostMetadataConfig{Enabled: true, ReporterPeriod: 10 * time.Minute}, + }, + }, + { + name: "ignore resources missing bracket", + cfg: &Config{ + API: APIConfig{Key: "aaaaaaa"}, + Traces: TracesExporterConfig{TracesConfig: TracesConfig{IgnoreResources: []string{"[123"}}}, + HostMetadata: HostMetadataConfig{Enabled: true, ReporterPeriod: 10 * time.Minute}, + }, + err: "'[123' is not valid resource filter regular expression", + }, + { + name: "invalid histogram settings", + cfg: &Config{ + API: APIConfig{Key: "aaaaaaa"}, + Metrics: MetricsConfig{ + HistConfig: HistogramConfig{ + Mode: HistogramModeNoBuckets, + SendAggregations: false, + }, + }, + HostMetadata: HostMetadataConfig{Enabled: true, ReporterPeriod: 10 * time.Minute}, + }, + err: "'nobuckets' mode and `send_aggregation_metrics` set to false will send no histogram metrics", + }, + { + name: "TLS settings are valid", + cfg: &Config{ + API: APIConfig{Key: "aaaaaaa"}, + ClientConfig: confighttp.ClientConfig{ + TLSSetting: configtls.ClientConfig{ + InsecureSkipVerify: true, + }, + }, + HostMetadata: HostMetadataConfig{Enabled: true, ReporterPeriod: 10 * time.Minute}, + }, + }, + { + name: "With trace_buffer", + cfg: &Config{ + API: APIConfig{Key: "aaaaaaa"}, + Traces: TracesExporterConfig{TraceBuffer: 10}, + HostMetadata: HostMetadataConfig{Enabled: true, ReporterPeriod: 10 * time.Minute}, + }, + }, + { + name: "With peer_tags", + cfg: &Config{ + API: APIConfig{Key: "aaaaaaa"}, + Traces: TracesExporterConfig{ + TracesConfig: TracesConfig{ + PeerTags: []string{"tag1", "tag2"}, + }, + }, + HostMetadata: HostMetadataConfig{Enabled: true, ReporterPeriod: 10 * time.Minute}, + }, + }, + { + name: "With confighttp client configs", + cfg: &Config{ + API: APIConfig{Key: "aaaaaaa"}, + ClientConfig: confighttp.ClientConfig{ + ReadBufferSize: 100, + WriteBufferSize: 200, + Timeout: 10 * time.Second, + IdleConnTimeout: &idleConnTimeout, + MaxIdleConns: &maxIdleConn, + MaxIdleConnsPerHost: &maxIdleConnPerHost, + MaxConnsPerHost: &maxConnPerHost, + DisableKeepAlives: true, + TLSSetting: configtls.ClientConfig{InsecureSkipVerify: true}, + }, + HostMetadata: HostMetadataConfig{Enabled: true, ReporterPeriod: 10 * time.Minute}, + }, + }, + + { + name: "unsupported confighttp client configs", + cfg: &Config{ + API: APIConfig{Key: "aaaaaaa"}, + ClientConfig: confighttp.ClientConfig{ + Endpoint: "endpoint", + Compression: "gzip", + Auth: &auth, + Headers: map[string]configopaque.String{"key": "val"}, + HTTP2ReadIdleTimeout: 250, + HTTP2PingTimeout: 200, + }, + HostMetadata: HostMetadataConfig{Enabled: true, ReporterPeriod: 10 * time.Minute}, + }, + err: "these confighttp client configs are currently not respected by Datadog exporter: auth, endpoint, compression, headers, http2_read_idle_timeout, http2_ping_timeout", + }, + { + name: "Invalid reporter_period", + cfg: &Config{ + API: APIConfig{Key: "abcdef0"}, + HostMetadata: HostMetadataConfig{Enabled: true, ReporterPeriod: 4 * time.Minute}, + }, + err: "reporter_period must be 5 minutes or higher", + }, + } + for _, testInstance := range tests { + t.Run(testInstance.name, func(t *testing.T) { + err := testInstance.cfg.Validate() + if testInstance.err != "" { + assert.ErrorContains(t, err, testInstance.err) + } else { + assert.NoError(t, err) + } + }) + } +} + +func TestUnmarshal(t *testing.T) { + cfgWithHTTPConfigs := CreateDefaultConfig().(*Config) + idleConnTimeout := 30 * time.Second + maxIdleConn := 300 + maxIdleConnPerHost := 150 + maxConnPerHost := 250 + cfgWithHTTPConfigs.ReadBufferSize = 100 + cfgWithHTTPConfigs.WriteBufferSize = 200 + cfgWithHTTPConfigs.Timeout = 10 * time.Second + cfgWithHTTPConfigs.MaxIdleConns = &maxIdleConn + cfgWithHTTPConfigs.MaxIdleConnsPerHost = &maxIdleConnPerHost + cfgWithHTTPConfigs.MaxConnsPerHost = &maxConnPerHost + cfgWithHTTPConfigs.IdleConnTimeout = &idleConnTimeout + cfgWithHTTPConfigs.DisableKeepAlives = true + cfgWithHTTPConfigs.TLSSetting.InsecureSkipVerify = true + cfgWithHTTPConfigs.warnings = nil + + tests := []struct { + name string + configMap *confmap.Conf + cfg *Config + err string + field string + }{ + { + name: "invalid cumulative monotonic mode", + configMap: confmap.NewFromStringMap(map[string]any{ + "metrics": map[string]any{ + "sums": map[string]any{ + "cumulative_monotonic_mode": "invalid_mode", + }, + }, + }), + err: "invalid cumulative monotonic sum mode \"invalid_mode\"", + field: "metrics.sums.cumulative_monotonic_mode", + }, + { + name: "invalid host metadata hostname source", + configMap: confmap.NewFromStringMap(map[string]any{ + "host_metadata": map[string]any{ + "hostname_source": "invalid_source", + }, + }), + err: "invalid host metadata hostname source \"invalid_source\"", + field: "host_metadata.hostname_source", + }, + { + name: "invalid summary mode", + configMap: confmap.NewFromStringMap(map[string]any{ + "metrics": map[string]any{ + "summaries": map[string]any{ + "mode": "invalid_mode", + }, + }, + }), + err: "invalid summary mode \"invalid_mode\"", + field: "metrics.summaries.mode", + }, + { + name: "metrics::send_monotonic_counter custom error", + configMap: confmap.NewFromStringMap(map[string]any{ + "metrics": map[string]any{ + "send_monotonic_counter": true, + }, + }), + err: "\"metrics::send_monotonic_counter\" was removed in favor of \"metrics::sums::cumulative_monotonic_mode\". See https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/8489", + }, + { + name: "tags custom error", + configMap: confmap.NewFromStringMap(map[string]any{ + "tags": []string{}, + }), + err: "\"tags\" was removed in favor of \"host_metadata::tags\". See https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/9099", + }, + { + name: "send_metadata custom error", + configMap: confmap.NewFromStringMap(map[string]any{ + "send_metadata": false, + }), + err: "\"send_metadata\" was removed in favor of \"host_metadata::enabled\". See https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/9099", + }, + { + name: "use_resource_metadata custom error", + configMap: confmap.NewFromStringMap(map[string]any{ + "use_resource_metadata": false, + }), + err: "\"use_resource_metadata\" was removed in favor of \"host_metadata::hostname_source\". See https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/9099", + }, + { + name: "metrics::report_quantiles custom error", + configMap: confmap.NewFromStringMap(map[string]any{ + "metrics": map[string]any{ + "report_quantiles": true, + }, + }), + err: "\"metrics::report_quantiles\" was removed in favor of \"metrics::summaries::mode\". See https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/8845", + }, + { + name: "instrumentation_library_metadata_as_tags custom error", + configMap: confmap.NewFromStringMap(map[string]any{ + "metrics": map[string]any{ + "instrumentation_library_metadata_as_tags": true, + }, + }), + err: "\"metrics::instrumentation_library_metadata_as_tags\" was removed in favor of \"metrics::instrumentation_scope_as_tags\". See https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/11135", + }, + { + name: "Empty metric endpoint", + configMap: confmap.NewFromStringMap(map[string]any{ + "metrics": map[string]any{ + "endpoint": "", + }, + }), + err: ErrEmptyEndpoint.Error(), + }, + { + name: "Empty trace endpoint", + configMap: confmap.NewFromStringMap(map[string]any{ + "traces": map[string]any{ + "endpoint": "", + }, + }), + err: ErrEmptyEndpoint.Error(), + }, + { + name: "Empty log endpoint", + configMap: confmap.NewFromStringMap(map[string]any{ + "logs": map[string]any{ + "endpoint": "", + }, + }), + err: ErrEmptyEndpoint.Error(), + }, + { + name: "invalid initial cumulative monotonic value mode", + configMap: confmap.NewFromStringMap(map[string]any{ + "metrics": map[string]any{ + "sums": map[string]any{ + "initial_cumulative_monotonic_value": "invalid_mode", + }, + }, + }), + err: "invalid initial value mode \"invalid_mode\"", + field: "metrics.sums.initial_cumulative_monotonic_value", + }, + { + name: "initial cumulative monotonic value mode set with raw_value", + configMap: confmap.NewFromStringMap(map[string]any{ + "metrics": map[string]any{ + "sums": map[string]any{ + "cumulative_monotonic_mode": "raw_value", + "initial_cumulative_monotonic_value": "drop", + }, + }, + }), + err: "\"metrics::sums::initial_cumulative_monotonic_value\" can only be configured when \"metrics::sums::cumulative_monotonic_mode\" is set to \"to_delta\"", + }, + { + name: "unmarshall confighttp client configs", + configMap: confmap.NewFromStringMap(map[string]any{ + "read_buffer_size": 100, + "write_buffer_size": 200, + "timeout": "10s", + "max_idle_conns": 300, + "max_idle_conns_per_host": 150, + "max_conns_per_host": 250, + "disable_keep_alives": true, + "idle_conn_timeout": "30s", + "tls": map[string]any{"insecure_skip_verify": true}, + }), + cfg: cfgWithHTTPConfigs, + }, + } + + for _, testInstance := range tests { + t.Run(testInstance.name, func(t *testing.T) { + cfg := CreateDefaultConfig().(*Config) + err := cfg.Unmarshal(testInstance.configMap) + if err != nil || testInstance.err != "" { + assert.ErrorContains(t, err, testInstance.err) + if testInstance.field != "" { + assert.ErrorContains(t, err, testInstance.field) + } + } else { + assert.Equal(t, testInstance.cfg, cfg) + } + }) + } +} + +// Test that the factory creates the default configuration +func TestCreateDefaultConfig(t *testing.T) { + cfg := CreateDefaultConfig() + + assert.Equal(t, &Config{ + ClientConfig: defaultClientConfig(), + BackOffConfig: configretry.NewDefaultBackOffConfig(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), + + API: APIConfig{ + Site: "datadoghq.com", + }, + + Metrics: MetricsConfig{ + TCPAddrConfig: confignet.TCPAddrConfig{ + Endpoint: "https://api.datadoghq.com", + }, + DeltaTTL: 3600, + HistConfig: HistogramConfig{ + Mode: "distributions", + SendAggregations: false, + }, + SumConfig: SumConfig{ + CumulativeMonotonicMode: CumulativeMonotonicSumModeToDelta, + InitialCumulativeMonotonicMode: InitialValueModeAuto, + }, + SummaryConfig: SummaryConfig{ + Mode: SummaryModeGauges, + }, + }, + + Traces: TracesExporterConfig{ + TCPAddrConfig: confignet.TCPAddrConfig{ + Endpoint: "https://trace.agent.datadoghq.com", + }, + TracesConfig: TracesConfig{ + IgnoreResources: []string{}, + PeerServiceAggregation: true, + PeerTagsAggregation: true, + ComputeStatsBySpanKind: true, + }, + }, + Logs: LogsConfig{ + TCPAddrConfig: confignet.TCPAddrConfig{ + Endpoint: "https://http-intake.logs.datadoghq.com", + }, + UseCompression: true, + CompressionLevel: 6, + BatchWait: 5, + }, + + HostMetadata: HostMetadataConfig{ + Enabled: true, + HostnameSource: HostnameSourceConfigOrSystem, + ReporterPeriod: 30 * time.Minute, + }, + OnlyMetadata: false, + }, cfg, "failed to create default config") + + assert.NoError(t, componenttest.CheckConfigStruct(cfg)) +} + +var ddtype = component.MustNewType("datadog") + +func TestLoadConfig(t *testing.T) { + t.Parallel() + + cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml")) + require.NoError(t, err) + + tests := []struct { + id component.ID + expected component.Config + }{ + { + id: component.NewIDWithName(ddtype, "default"), + expected: &Config{ + ClientConfig: defaultClientConfig(), + BackOffConfig: configretry.NewDefaultBackOffConfig(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), + API: APIConfig{ + Key: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + Site: "datadoghq.com", + FailOnInvalidKey: false, + }, + + Metrics: MetricsConfig{ + TCPAddrConfig: confignet.TCPAddrConfig{ + Endpoint: "https://api.datadoghq.com", + }, + DeltaTTL: 3600, + HistConfig: HistogramConfig{ + Mode: "distributions", + SendAggregations: false, + }, + SumConfig: SumConfig{ + CumulativeMonotonicMode: CumulativeMonotonicSumModeToDelta, + InitialCumulativeMonotonicMode: InitialValueModeAuto, + }, + SummaryConfig: SummaryConfig{ + Mode: SummaryModeGauges, + }, + }, + + Traces: TracesExporterConfig{ + TCPAddrConfig: confignet.TCPAddrConfig{ + Endpoint: "https://trace.agent.datadoghq.com", + }, + TracesConfig: TracesConfig{ + IgnoreResources: []string{}, + PeerServiceAggregation: true, + PeerTagsAggregation: true, + ComputeStatsBySpanKind: true, + }, + }, + Logs: LogsConfig{ + TCPAddrConfig: confignet.TCPAddrConfig{ + Endpoint: "https://http-intake.logs.datadoghq.com", + }, + UseCompression: true, + CompressionLevel: 6, + BatchWait: 5, + }, + HostMetadata: HostMetadataConfig{ + Enabled: true, + HostnameSource: HostnameSourceConfigOrSystem, + ReporterPeriod: 30 * time.Minute, + }, + OnlyMetadata: false, + }, + }, + { + id: component.NewIDWithName(ddtype, "api"), + expected: &Config{ + ClientConfig: defaultClientConfig(), + BackOffConfig: configretry.NewDefaultBackOffConfig(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), + TagsConfig: TagsConfig{ + Hostname: "customhostname", + }, + API: APIConfig{ + Key: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + Site: "datadoghq.eu", + FailOnInvalidKey: true, + }, + Metrics: MetricsConfig{ + TCPAddrConfig: confignet.TCPAddrConfig{ + Endpoint: "https://api.datadoghq.eu", + }, + DeltaTTL: 3600, + HistConfig: HistogramConfig{ + Mode: "distributions", + SendAggregations: false, + }, + SumConfig: SumConfig{ + CumulativeMonotonicMode: CumulativeMonotonicSumModeToDelta, + InitialCumulativeMonotonicMode: InitialValueModeAuto, + }, + SummaryConfig: SummaryConfig{ + Mode: SummaryModeGauges, + }, + }, + Traces: TracesExporterConfig{ + TCPAddrConfig: confignet.TCPAddrConfig{ + Endpoint: "https://trace.agent.datadoghq.eu", + }, + TracesConfig: TracesConfig{ + SpanNameRemappings: map[string]string{ + "old_name1": "new_name1", + "old_name2": "new_name2", + }, + SpanNameAsResourceName: true, + IgnoreResources: []string{}, + PeerServiceAggregation: true, + PeerTagsAggregation: true, + ComputeStatsBySpanKind: true, + }, + TraceBuffer: 10, + }, + Logs: LogsConfig{ + TCPAddrConfig: confignet.TCPAddrConfig{ + Endpoint: "https://http-intake.logs.datadoghq.eu", + }, + UseCompression: true, + CompressionLevel: 6, + BatchWait: 5, + }, + OnlyMetadata: false, + HostMetadata: HostMetadataConfig{ + Enabled: true, + HostnameSource: HostnameSourceConfigOrSystem, + ReporterPeriod: 30 * time.Minute, + }, + }, + }, + { + id: component.NewIDWithName(ddtype, "api2"), + expected: &Config{ + ClientConfig: defaultClientConfig(), + BackOffConfig: configretry.NewDefaultBackOffConfig(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), + TagsConfig: TagsConfig{ + Hostname: "customhostname", + }, + API: APIConfig{ + Key: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + Site: "datadoghq.eu", + FailOnInvalidKey: false, + }, + Metrics: MetricsConfig{ + TCPAddrConfig: confignet.TCPAddrConfig{ + Endpoint: "https://api.datadoghq.test", + }, + DeltaTTL: 3600, + HistConfig: HistogramConfig{ + Mode: "distributions", + SendAggregations: false, + }, + SumConfig: SumConfig{ + CumulativeMonotonicMode: CumulativeMonotonicSumModeToDelta, + InitialCumulativeMonotonicMode: InitialValueModeAuto, + }, + SummaryConfig: SummaryConfig{ + Mode: SummaryModeGauges, + }, + }, + Traces: TracesExporterConfig{ + TCPAddrConfig: confignet.TCPAddrConfig{ + Endpoint: "https://trace.agent.datadoghq.test", + }, + TracesConfig: TracesConfig{ + SpanNameRemappings: map[string]string{ + "old_name3": "new_name3", + "old_name4": "new_name4", + }, + IgnoreResources: []string{}, + PeerServiceAggregation: true, + PeerTagsAggregation: true, + ComputeStatsBySpanKind: true, + }, + }, + Logs: LogsConfig{ + TCPAddrConfig: confignet.TCPAddrConfig{ + Endpoint: "https://http-intake.logs.datadoghq.test", + }, + UseCompression: true, + CompressionLevel: 6, + BatchWait: 5, + }, + HostMetadata: HostMetadataConfig{ + Enabled: true, + HostnameSource: HostnameSourceConfigOrSystem, + Tags: []string{"example:tag"}, + ReporterPeriod: 30 * time.Minute, + }, + }, + }, + { + id: component.NewIDWithName(ddtype, "customReporterPeriod"), + expected: &Config{ + ClientConfig: defaultClientConfig(), + BackOffConfig: configretry.NewDefaultBackOffConfig(), + QueueSettings: exporterhelper.NewDefaultQueueConfig(), + API: APIConfig{ + Key: "abc", + Site: "datadoghq.com", + FailOnInvalidKey: false, + }, + + Metrics: MetricsConfig{ + TCPAddrConfig: confignet.TCPAddrConfig{ + Endpoint: "https://api.datadoghq.com", + }, + DeltaTTL: 3600, + HistConfig: HistogramConfig{ + Mode: "distributions", + SendAggregations: false, + }, + SumConfig: SumConfig{ + CumulativeMonotonicMode: CumulativeMonotonicSumModeToDelta, + InitialCumulativeMonotonicMode: InitialValueModeAuto, + }, + SummaryConfig: SummaryConfig{ + Mode: SummaryModeGauges, + }, + }, + + Traces: TracesExporterConfig{ + TCPAddrConfig: confignet.TCPAddrConfig{ + Endpoint: "https://trace.agent.datadoghq.com", + }, + TracesConfig: TracesConfig{ + IgnoreResources: []string{}, + ComputeStatsBySpanKind: true, + PeerServiceAggregation: true, + PeerTagsAggregation: true, + }, + }, + Logs: LogsConfig{ + TCPAddrConfig: confignet.TCPAddrConfig{ + Endpoint: "https://http-intake.logs.datadoghq.com", + }, + UseCompression: true, + CompressionLevel: 6, + BatchWait: 5, + }, + HostMetadata: HostMetadataConfig{ + Enabled: true, + HostnameSource: HostnameSourceConfigOrSystem, + ReporterPeriod: 10 * time.Minute, + }, + OnlyMetadata: false, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.id.String(), func(t *testing.T) { + cfg := CreateDefaultConfig() + + sub, err := cm.Sub(tt.id.String()) + require.NoError(t, err) + require.NoError(t, sub.Unmarshal(cfg)) + + assert.NoError(t, component.ValidateConfig(cfg)) + assert.Equal(t, tt.expected, cfg) + }) + } +} + +func TestOverrideEndpoints(t *testing.T) { + tests := []struct { + componentID string + expectedSite string + expectedMetricsEndpoint string + expectedTracesEndpoint string + expectedLogsEndpoint string + }{ + { + componentID: "nositeandnoendpoints", + expectedSite: "datadoghq.com", + expectedMetricsEndpoint: "https://api.datadoghq.com", + expectedTracesEndpoint: "https://trace.agent.datadoghq.com", + expectedLogsEndpoint: "https://http-intake.logs.datadoghq.com", + }, + { + componentID: "nositeandmetricsendpoint", + expectedSite: "datadoghq.com", + expectedMetricsEndpoint: "metricsendpoint:1234", + expectedTracesEndpoint: "https://trace.agent.datadoghq.com", + expectedLogsEndpoint: "https://http-intake.logs.datadoghq.com", + }, + { + componentID: "nositeandtracesendpoint", + expectedSite: "datadoghq.com", + expectedMetricsEndpoint: "https://api.datadoghq.com", + expectedTracesEndpoint: "tracesendpoint:1234", + expectedLogsEndpoint: "https://http-intake.logs.datadoghq.com", + }, + { + componentID: "nositeandlogsendpoint", + expectedSite: "datadoghq.com", + expectedMetricsEndpoint: "https://api.datadoghq.com", + expectedTracesEndpoint: "https://trace.agent.datadoghq.com", + expectedLogsEndpoint: "logsendpoint:1234", + }, + { + componentID: "nositeandallendpoints", + expectedSite: "datadoghq.com", + expectedMetricsEndpoint: "metricsendpoint:1234", + expectedTracesEndpoint: "tracesendpoint:1234", + expectedLogsEndpoint: "logsendpoint:1234", + }, + + { + componentID: "siteandnoendpoints", + expectedSite: "datadoghq.eu", + expectedMetricsEndpoint: "https://api.datadoghq.eu", + expectedTracesEndpoint: "https://trace.agent.datadoghq.eu", + expectedLogsEndpoint: "https://http-intake.logs.datadoghq.eu", + }, + { + componentID: "siteandmetricsendpoint", + expectedSite: "datadoghq.eu", + expectedMetricsEndpoint: "metricsendpoint:1234", + expectedTracesEndpoint: "https://trace.agent.datadoghq.eu", + expectedLogsEndpoint: "https://http-intake.logs.datadoghq.eu", + }, + { + componentID: "siteandtracesendpoint", + expectedSite: "datadoghq.eu", + expectedMetricsEndpoint: "https://api.datadoghq.eu", + expectedTracesEndpoint: "tracesendpoint:1234", + expectedLogsEndpoint: "https://http-intake.logs.datadoghq.eu", + }, + { + componentID: "siteandallendpoints", + expectedSite: "datadoghq.eu", + expectedMetricsEndpoint: "metricsendpoint:1234", + expectedTracesEndpoint: "tracesendpoint:1234", + expectedLogsEndpoint: "logsendpoint:1234", + }, + } + + cm, err := confmaptest.LoadConf(filepath.Join("testdata", "unmarshal.yaml")) + require.NoError(t, err) + + for _, testInstance := range tests { + t.Run(testInstance.componentID, func(t *testing.T) { + cfg := CreateDefaultConfig() + sub, err := cm.Sub(component.NewIDWithName(ddtype, testInstance.componentID).String()) + require.NoError(t, err) + require.NoError(t, sub.Unmarshal(cfg)) + + componentCfg, ok := cfg.(*Config) + require.True(t, ok, "component.Config is not a Datadog exporter config (wrong ID?)") + assert.Equal(t, testInstance.expectedSite, componentCfg.API.Site) + assert.Equal(t, testInstance.expectedMetricsEndpoint, componentCfg.Metrics.Endpoint) + assert.Equal(t, testInstance.expectedTracesEndpoint, componentCfg.Traces.Endpoint) + assert.Equal(t, testInstance.expectedLogsEndpoint, componentCfg.Logs.Endpoint) + }) + } +} diff --git a/exporter/datadogexporter/config_warnings.go b/pkg/datadog/config/config_warnings.go similarity index 95% rename from exporter/datadogexporter/config_warnings.go rename to pkg/datadog/config/config_warnings.go index 8197903d2285..0e5701c99522 100644 --- a/exporter/datadogexporter/config_warnings.go +++ b/pkg/datadog/config/config_warnings.go @@ -1,7 +1,7 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -package datadogexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter" +package config // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/datadog/config" import ( "errors" diff --git a/exporter/datadogexporter/config_warnings_test.go b/pkg/datadog/config/config_warnings_test.go similarity index 93% rename from exporter/datadogexporter/config_warnings_test.go rename to pkg/datadog/config/config_warnings_test.go index bd9f70d0f014..402f7850a014 100644 --- a/exporter/datadogexporter/config_warnings_test.go +++ b/pkg/datadog/config/config_warnings_test.go @@ -1,7 +1,7 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -package datadogexporter +package config // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/datadog/config" import ( "testing" @@ -77,11 +77,10 @@ func TestSendAggregations(t *testing.T) { for _, testInstance := range tests { t.Run(testInstance.name, func(t *testing.T) { - f := NewFactory() - cfg := f.CreateDefaultConfig().(*Config) + cfg := CreateDefaultConfig().(*Config) err := testInstance.cfgMap.Unmarshal(cfg) if err != nil || testInstance.err != "" { - assert.EqualError(t, err, testInstance.err) + assert.ErrorContains(t, err, testInstance.err) } else { assert.Equal(t, testInstance.expectedAggrValue, cfg.Metrics.HistConfig.SendAggregations) var warningStr []string @@ -92,7 +91,6 @@ func TestSendAggregations(t *testing.T) { } }) } - } func TestPeerTags(t *testing.T) { @@ -139,7 +137,7 @@ func TestPeerTags(t *testing.T) { { name: "traces::peer_service_aggregation and traces::peer_tags_aggregation unset", cfgMap: confmap.New(), - expectedPeerTagsValue: false, + expectedPeerTagsValue: true, }, { name: "traces::peer_tags_aggregation set", @@ -154,11 +152,10 @@ func TestPeerTags(t *testing.T) { for _, testInstance := range tests { t.Run(testInstance.name, func(t *testing.T) { - f := NewFactory() - cfg := f.CreateDefaultConfig().(*Config) + cfg := CreateDefaultConfig().(*Config) err := testInstance.cfgMap.Unmarshal(cfg) if err != nil || testInstance.err != "" { - assert.EqualError(t, err, testInstance.err) + assert.ErrorContains(t, err, testInstance.err) } else { assert.Equal(t, testInstance.expectedPeerTagsValue, cfg.Traces.PeerTagsAggregation) var warningStr []string @@ -169,5 +166,4 @@ func TestPeerTags(t *testing.T) { } }) } - } diff --git a/pkg/datadog/config/host.go b/pkg/datadog/config/host.go new file mode 100644 index 000000000000..4d481aa005c8 --- /dev/null +++ b/pkg/datadog/config/host.go @@ -0,0 +1,90 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package config // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/datadog/config" + +import ( + "encoding" + "fmt" + "time" +) + +// HostnameSource is the source for the hostname of host metadata. +type HostnameSource string + +const ( + // HostnameSourceFirstResource picks the host metadata hostname from the resource + // attributes on the first OTLP payload that gets to the exporter. If it is lacking any + // hostname-like attributes, it will fallback to 'config_or_system' behavior (see below). + // + // Do not use this hostname source if receiving data from multiple hosts. + HostnameSourceFirstResource HostnameSource = "first_resource" + + // HostnameSourceConfigOrSystem picks the host metadata hostname from the 'hostname' setting, + // and if this is empty, from available system APIs and cloud provider endpoints. + HostnameSourceConfigOrSystem HostnameSource = "config_or_system" +) + +var _ encoding.TextUnmarshaler = (*HostnameSource)(nil) + +// UnmarshalText implements the encoding.TextUnmarshaler interface. +func (sm *HostnameSource) UnmarshalText(in []byte) error { + switch mode := HostnameSource(in); mode { + case HostnameSourceFirstResource, + HostnameSourceConfigOrSystem: + *sm = mode + return nil + default: + return fmt.Errorf("invalid host metadata hostname source %q", mode) + } +} + +// HostMetadataConfig defines the host metadata related configuration. +// Host metadata is the information used for populating the infrastructure list, +// the host map and providing host tags functionality. +// +// The exporter will send host metadata for a single host, whose name is chosen +// according to `host_metadata::hostname_source`. +type HostMetadataConfig struct { + // Enabled enables the host metadata functionality. + Enabled bool `mapstructure:"enabled"` + + // HostnameSource is the source for the hostname of host metadata. + // This hostname is used for identifying the infrastructure list, host map and host tag information related to the host where the Datadog exporter is running. + // Changing this setting will not change the host used to tag your metrics, traces and logs in any way. + // For remote hosts, see https://docs.datadoghq.com/opentelemetry/schema_semantics/host_metadata/. + // + // Valid values are 'first_resource' and 'config_or_system': + // - 'first_resource' picks the host metadata hostname from the resource + // attributes on the first OTLP payload that gets to the exporter. + // If the first payload lacks hostname-like attributes, it will fallback to 'config_or_system'. + // **Do not use this hostname source if receiving data from multiple hosts**. + // - 'config_or_system' picks the host metadata hostname from the 'hostname' setting, + // If this is empty it will use available system APIs and cloud provider endpoints. + // + // The default is 'config_or_system'. + HostnameSource HostnameSource `mapstructure:"hostname_source"` + + // Tags is a list of host tags. + // These tags will be attached to telemetry signals that have the host metadata hostname. + // To attach tags to telemetry signals regardless of the host, use a processor instead. + Tags []string `mapstructure:"tags"` + + // sourceTimeout is the timeout to fetch from each provider - for example AWS IMDS. + // If unset, or set to zero duration, there will be no timeout applied. + // Default is no timeout. + sourceTimeout time.Duration + + // ReporterPeriod is the period at which the host metadata reporter will run. + ReporterPeriod time.Duration `mapstructure:"reporter_period"` +} + +// SetSourceTimeout sets the timeout to fetch from each provider - for example AWS IMDS. +func (h *HostMetadataConfig) SetSourceTimeout(t time.Duration) { + h.sourceTimeout = t +} + +// GetSourceTimeout returns the timeout to fetch from each provider - for example AWS IMDS. +func (h *HostMetadataConfig) GetSourceTimeout() time.Duration { + return h.sourceTimeout +} diff --git a/pkg/datadog/config/logs.go b/pkg/datadog/config/logs.go new file mode 100644 index 000000000000..b1d4cf5a577b --- /dev/null +++ b/pkg/datadog/config/logs.go @@ -0,0 +1,31 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package config // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/datadog/config" + +import "go.opentelemetry.io/collector/config/confignet" + +// LogsConfig defines logs exporter specific configuration +type LogsConfig struct { + // TCPAddr.Endpoint is the host of the Datadog intake server to send logs to. + // If unset, the value is obtained from the Site. + confignet.TCPAddrConfig `mapstructure:",squash"` + + // DumpPayloads report whether payloads should be dumped when logging level is debug. + // Note: this config option does not apply when the `exporter.datadogexporter.UseLogsAgentExporter` feature flag is enabled (now enabled by default). + // Deprecated: This config option is not supported in the Datadog Agent logs pipeline. + DumpPayloads bool `mapstructure:"dump_payloads"` + + // UseCompression enables the logs agent to compress logs before sending them. + // Note: this config option does not apply when the `exporter.datadogexporter.UseLogsAgentExporter` feature flag is disabled. + UseCompression bool `mapstructure:"use_compression"` + + // CompressionLevel accepts values from 0 (no compression) to 9 (maximum compression but higher resource usage). + // Only takes effect if UseCompression is set to true. + // Note: this config option does not apply when the `exporter.datadogexporter.UseLogsAgentExporter` feature flag is disabled. + CompressionLevel int `mapstructure:"compression_level"` + + // BatchWait represents the maximum time the logs agent waits to fill each batch of logs before sending. + // Note: this config option does not apply when the `exporter.datadogexporter.UseLogsAgentExporter` feature flag is disabled. + BatchWait int `mapstructure:"batch_wait"` +} diff --git a/pkg/datadog/config/metrics.go b/pkg/datadog/config/metrics.go new file mode 100644 index 000000000000..c17a148af8e4 --- /dev/null +++ b/pkg/datadog/config/metrics.go @@ -0,0 +1,243 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package config // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/datadog/config" + +import ( + "encoding" + "fmt" + + otlpmetrics "github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics" + "go.opentelemetry.io/collector/config/confignet" +) + +// MetricsConfig defines the metrics exporter specific configuration options +type MetricsConfig struct { + // DeltaTTL defines the time that previous points of a cumulative monotonic + // metric are kept in memory to calculate deltas + DeltaTTL int64 `mapstructure:"delta_ttl"` + + // TCPAddr.Endpoint is the host of the Datadog intake server to send metrics to. + // If unset, the value is obtained from the Site. + confignet.TCPAddrConfig `mapstructure:",squash"` + + ExporterConfig MetricsExporterConfig `mapstructure:",squash"` + + // HistConfig defines the export of OTLP Histograms. + HistConfig HistogramConfig `mapstructure:"histograms"` + + // SumConfig defines the export of OTLP Sums. + SumConfig SumConfig `mapstructure:"sums"` + + // SummaryConfig defines the export for OTLP Summaries. + SummaryConfig SummaryConfig `mapstructure:"summaries"` +} + +type HistogramMode string + +const ( + // HistogramModeNoBuckets reports no bucket histogram metrics. .sum and .count metrics will still be sent + // if `send_count_sum_metrics` is enabled. + HistogramModeNoBuckets HistogramMode = "nobuckets" + // HistogramModeCounters reports histograms as Datadog counts, one metric per bucket. + HistogramModeCounters HistogramMode = "counters" + // HistogramModeDistributions reports histograms as Datadog distributions (recommended). + HistogramModeDistributions HistogramMode = "distributions" +) + +var _ encoding.TextUnmarshaler = (*HistogramMode)(nil) + +func (hm *HistogramMode) UnmarshalText(in []byte) error { + switch mode := HistogramMode(in); mode { + case HistogramModeCounters, HistogramModeDistributions, HistogramModeNoBuckets: + *hm = mode + return nil + default: + return fmt.Errorf("invalid histogram mode %q", mode) + } +} + +// HistogramConfig customizes export of OTLP Histograms. +type HistogramConfig struct { + // Mode for exporting histograms. Valid values are 'distributions', 'counters' or 'nobuckets'. + // - 'distributions' sends histograms as Datadog distributions (recommended). + // - 'counters' sends histograms as Datadog counts, one metric per bucket. + // - 'nobuckets' sends no bucket histogram metrics. Aggregation metrics will still be sent + // if `send_aggregation_metrics` is enabled. + // + // The current default is 'distributions'. + Mode HistogramMode `mapstructure:"mode"` + + // SendCountSum states if the export should send .sum and .count metrics for histograms. + // The default is false. + // Deprecated: [v0.75.0] Use `send_aggregation_metrics` (HistogramConfig.SendAggregations) instead. + SendCountSum bool `mapstructure:"send_count_sum_metrics"` + + // SendAggregations states if the exporter should send .sum, .count, .min and .max metrics for histograms. + // The default is false. + SendAggregations bool `mapstructure:"send_aggregation_metrics"` +} + +func (c *HistogramConfig) validate() error { + if c.Mode == HistogramModeNoBuckets && !c.SendAggregations { + return fmt.Errorf("'nobuckets' mode and `send_aggregation_metrics` set to false will send no histogram metrics") + } + return nil +} + +// CumulativeMonotonicSumMode is the export mode for OTLP Sum metrics. +type CumulativeMonotonicSumMode string + +const ( + // CumulativeMonotonicSumModeToDelta calculates delta for + // cumulative monotonic sum metrics in the client side and reports + // them as Datadog counts. + CumulativeMonotonicSumModeToDelta CumulativeMonotonicSumMode = "to_delta" + + // CumulativeMonotonicSumModeRawValue reports the raw value for + // cumulative monotonic sum metrics as a Datadog gauge. + CumulativeMonotonicSumModeRawValue CumulativeMonotonicSumMode = "raw_value" +) + +var _ encoding.TextUnmarshaler = (*CumulativeMonotonicSumMode)(nil) + +// UnmarshalText implements the encoding.TextUnmarshaler interface. +func (sm *CumulativeMonotonicSumMode) UnmarshalText(in []byte) error { + switch mode := CumulativeMonotonicSumMode(in); mode { + case CumulativeMonotonicSumModeToDelta, + CumulativeMonotonicSumModeRawValue: + *sm = mode + return nil + default: + return fmt.Errorf("invalid cumulative monotonic sum mode %q", mode) + } +} + +// InitialValueMode defines what the exporter should do with the initial value +// of a time series when transforming from cumulative to delta. +type InitialValueMode string + +const ( + // InitialValueModeAuto reports the initial value if its start timestamp + // is set and it happens after the process was started. + InitialValueModeAuto InitialValueMode = "auto" + + // InitialValueModeDrop always drops the initial value. + InitialValueModeDrop InitialValueMode = "drop" + + // InitialValueModeKeep always reports the initial value. + InitialValueModeKeep InitialValueMode = "keep" +) + +var _ encoding.TextUnmarshaler = (*InitialValueMode)(nil) + +// UnmarshalText implements the encoding.TextUnmarshaler interface. +func (iv *InitialValueMode) UnmarshalText(in []byte) error { + switch mode := InitialValueMode(in); mode { + case InitialValueModeAuto, + InitialValueModeDrop, + InitialValueModeKeep: + *iv = mode + return nil + default: + return fmt.Errorf("invalid initial value mode %q", mode) + } +} + +// SumConfig customizes export of OTLP Sums. +type SumConfig struct { + // CumulativeMonotonicMode is the mode for exporting OTLP Cumulative Monotonic Sums. + // Valid values are 'to_delta' or 'raw_value'. + // - 'to_delta' calculates delta for cumulative monotonic sums and sends it as a Datadog count. + // - 'raw_value' sends the raw value of cumulative monotonic sums as Datadog gauges. + // + // The default is 'to_delta'. + // See https://docs.datadoghq.com/metrics/otlp/?tab=sum#mapping for details and examples. + CumulativeMonotonicMode CumulativeMonotonicSumMode `mapstructure:"cumulative_monotonic_mode"` + + // InitialCumulativeMonotonicMode defines the behavior of the exporter when receiving the first value + // of a cumulative monotonic sum. + InitialCumulativeMonotonicMode InitialValueMode `mapstructure:"initial_cumulative_monotonic_value"` +} + +// SummaryMode is the export mode for OTLP Summary metrics. +type SummaryMode string + +const ( + // SummaryModeNoQuantiles sends no `.quantile` metrics. `.sum` and `.count` metrics will still be sent. + SummaryModeNoQuantiles SummaryMode = "noquantiles" + // SummaryModeGauges sends `.quantile` metrics as gauges tagged by the quantile. + SummaryModeGauges SummaryMode = "gauges" +) + +var _ encoding.TextUnmarshaler = (*SummaryMode)(nil) + +// UnmarshalText implements the encoding.TextUnmarshaler interface. +func (sm *SummaryMode) UnmarshalText(in []byte) error { + switch mode := SummaryMode(in); mode { + case SummaryModeNoQuantiles, + SummaryModeGauges: + *sm = mode + return nil + default: + return fmt.Errorf("invalid summary mode %q", mode) + } +} + +// SummaryConfig customizes export of OTLP Summaries. +type SummaryConfig struct { + // Mode is the the mode for exporting OTLP Summaries. + // Valid values are 'noquantiles' or 'gauges'. + // - 'noquantiles' sends no `.quantile` metrics. `.sum` and `.count` metrics will still be sent. + // - 'gauges' sends `.quantile` metrics as gauges tagged by the quantile. + // + // The default is 'gauges'. + // See https://docs.datadoghq.com/metrics/otlp/?tab=summary#mapping for details and examples. + Mode SummaryMode `mapstructure:"mode"` +} + +// MetricsExporterConfig provides options for a user to customize the behavior of the +// metrics exporter +type MetricsExporterConfig struct { + // ResourceAttributesAsTags, if set to true, will use the exporterhelper feature to transform all + // resource attributes into metric labels, which are then converted into tags + ResourceAttributesAsTags bool `mapstructure:"resource_attributes_as_tags"` + + // InstrumentationScopeMetadataAsTags, if set to true, adds the name and version of the + // instrumentation scope that created a metric to the metric tags + InstrumentationScopeMetadataAsTags bool `mapstructure:"instrumentation_scope_metadata_as_tags"` +} + +// ToTranslatorOpts returns a list of metrics translator options from the metrics config +func (mcfg MetricsConfig) ToTranslatorOpts() []otlpmetrics.TranslatorOption { + options := []otlpmetrics.TranslatorOption{ + otlpmetrics.WithDeltaTTL(mcfg.DeltaTTL), + } + + if mcfg.HistConfig.SendAggregations { + options = append(options, otlpmetrics.WithHistogramAggregations()) + } + + if mcfg.SummaryConfig.Mode == SummaryModeGauges { + options = append(options, otlpmetrics.WithQuantiles()) + } + + if mcfg.ExporterConfig.InstrumentationScopeMetadataAsTags { + options = append(options, otlpmetrics.WithInstrumentationScopeMetadataAsTags()) + } + + options = append(options, otlpmetrics.WithHistogramMode(otlpmetrics.HistogramMode(mcfg.HistConfig.Mode))) + + var numberMode otlpmetrics.NumberMode + switch mcfg.SumConfig.CumulativeMonotonicMode { + case CumulativeMonotonicSumModeRawValue: + numberMode = otlpmetrics.NumberModeRawValue + case CumulativeMonotonicSumModeToDelta: + numberMode = otlpmetrics.NumberModeCumulativeToDelta + } + options = append(options, otlpmetrics.WithNumberMode(numberMode)) + options = append(options, otlpmetrics.WithInitialCumulMonoValueMode( + otlpmetrics.InitialCumulMonoValueMode(mcfg.SumConfig.InitialCumulativeMonotonicMode))) + + return options +} diff --git a/pkg/datadog/config/testdata/config.yaml b/pkg/datadog/config/testdata/config.yaml new file mode 100644 index 000000000000..0dbfc0a4782a --- /dev/null +++ b/pkg/datadog/config/testdata/config.yaml @@ -0,0 +1,46 @@ +datadog/api: + hostname: customhostname + api: + key: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + site: datadoghq.eu + fail_on_invalid_key: true + + traces: + span_name_remappings: + "old_name1": "new_name1" + "old_name2": "new_name2" + span_name_as_resource_name: true + trace_buffer: 10 + +datadog/api2: + hostname: customhostname + + host_metadata: + tags: [example:tag] + + api: + key: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + site: datadoghq.eu + + metrics: + endpoint: https://api.datadoghq.test + + traces: + span_name_remappings: + "old_name3": "new_name3" + "old_name4": "new_name4" + endpoint: https://trace.agent.datadoghq.test + + logs: + endpoint: https://http-intake.logs.datadoghq.test + +datadog/default: + api: + key: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +datadog/customReporterPeriod: + api: + key: abc + host_metadata: + enabled: true + reporter_period: 10m diff --git a/pkg/datadog/config/testdata/unmarshal.yaml b/pkg/datadog/config/testdata/unmarshal.yaml new file mode 100644 index 000000000000..b3c5b76036d4 --- /dev/null +++ b/pkg/datadog/config/testdata/unmarshal.yaml @@ -0,0 +1,53 @@ +datadog/nositeandnoendpoints: + +datadog/nositeandmetricsendpoint: + metrics: + endpoint: "metricsendpoint:1234" + +datadog/nositeandtracesendpoint: + traces: + endpoint: "tracesendpoint:1234" + +datadog/nositeandlogsendpoint: + logs: + endpoint: "logsendpoint:1234" + +datadog/nositeandallendpoints: + metrics: + endpoint: "metricsendpoint:1234" + traces: + endpoint: "tracesendpoint:1234" + logs: + endpoint: "logsendpoint:1234" + +datadog/siteandnoendpoints: + api: + site: datadoghq.eu + +datadog/siteandmetricsendpoint: + api: + site: datadoghq.eu + metrics: + endpoint: "metricsendpoint:1234" + +datadog/siteandtracesendpoint: + api: + site: datadoghq.eu + traces: + endpoint: "tracesendpoint:1234" + +datadog/siteandlogsendpoint: + api: + site: datadoghq.eu + logs: + endpoint: "logsendpoint:1234" + +datadog/siteandallendpoints: + api: + site: datadoghq.eu + metrics: + endpoint: "metricsendpoint:1234" + traces: + endpoint: "tracesendpoint:1234" + logs: + endpoint: "logsendpoint:1234" diff --git a/pkg/datadog/config/traces.go b/pkg/datadog/config/traces.go new file mode 100644 index 000000000000..1e338fa58a0f --- /dev/null +++ b/pkg/datadog/config/traces.go @@ -0,0 +1,167 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package config // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/datadog/config" + +import ( + "fmt" + "regexp" + "time" + + "go.opentelemetry.io/collector/config/confignet" +) + +// TracesConfig defines the traces exporter specific configuration options +type TracesConfig struct { + // ignored resources + // A blacklist of regular expressions can be provided to disable certain traces based on their resource name + // all entries must be surrounded by double quotes and separated by commas. + // ignore_resources: ["(GET|POST) /healthcheck"] + IgnoreResources []string `mapstructure:"ignore_resources"` + + // SpanNameRemappings is the map of datadog span names and preferred name to map to. This can be used to + // automatically map Datadog Span Operation Names to an updated value. All entries should be key/value pairs. + // span_name_remappings: + // io.opentelemetry.javaagent.spring.client: spring.client + // instrumentation:express.server: express + // go.opentelemetry.io_contrib_instrumentation_net_http_otelhttp.client: http.client + SpanNameRemappings map[string]string `mapstructure:"span_name_remappings"` + + // If set to true the OpenTelemetry span name will used in the Datadog resource name. + // If set to false the resource name will be filled with the instrumentation library name + span kind. + // The default value is `false`. + SpanNameAsResourceName bool `mapstructure:"span_name_as_resource_name"` + + // If set to true, enables an additional stats computation check on spans to see they have an eligible `span.kind` (server, consumer, client, producer). + // If enabled, a span with an eligible `span.kind` will have stats computed. If disabled, only top-level and measured spans will have stats computed. + // NOTE: For stats computed from OTel traces, only top-level spans are considered when this option is off. + // If you are sending OTel traces and want stats on non-top-level spans, this flag will need to be enabled. + // If you are sending OTel traces and do not want stats computed by span kind, you need to disable this flag and disable `compute_top_level_by_span_kind`. + ComputeStatsBySpanKind bool `mapstructure:"compute_stats_by_span_kind"` + + // If set to true, root spans and spans with a server or consumer `span.kind` will be marked as top-level. + // Additionally, spans with a client or producer `span.kind` will have stats computed. + // Enabling this config option may increase the number of spans that generate trace metrics, and may change which spans appear as top-level in Datadog. + // ComputeTopLevelBySpanKind needs to be enabled in both the Datadog connector and Datadog exporter configs if both components are being used. + // The default value is `false`. + ComputeTopLevelBySpanKind bool `mapstructure:"compute_top_level_by_span_kind"` + + // If set to true, enables `peer.service` aggregation in the exporter. If disabled, aggregated trace stats will not include `peer.service` as a dimension. + // For the best experience with `peer.service`, it is recommended to also enable `compute_stats_by_span_kind`. + // If enabling both causes the datadog exporter to consume too many resources, try disabling `compute_stats_by_span_kind` first. + // If the overhead remains high, it will be due to a high cardinality of `peer.service` values from the traces. You may need to check your instrumentation. + // Deprecated: Please use PeerTagsAggregation instead + PeerServiceAggregation bool `mapstructure:"peer_service_aggregation"` + + // If set to true, enables aggregation of peer related tags (e.g., `peer.service`, `db.instance`, etc.) in the datadog exporter. + // If disabled, aggregated trace stats will not include these tags as dimensions on trace metrics. + // For the best experience with peer tags, Datadog also recommends enabling `compute_stats_by_span_kind`. + // If you are using an OTel tracer, it's best to have both enabled because client/producer spans with relevant peer tags + // may not be marked by the datadog exporter as top-level spans. + // If enabling both causes the datadog exporter to consume too many resources, try disabling `compute_stats_by_span_kind` first. + // A high cardinality of peer tags or APM resources can also contribute to higher CPU and memory consumption. + // You can check for the cardinality of these fields by making trace search queries in the Datadog UI. + // The default list of peer tags can be found in https://github.com/DataDog/datadog-agent/blob/main/pkg/trace/stats/concentrator.go. + PeerTagsAggregation bool `mapstructure:"peer_tags_aggregation"` + + // [BETA] Optional list of supplementary peer tags that go beyond the defaults. The Datadog backend validates all tags + // and will drop ones that are unapproved. The default set of peer tags can be found at + // https://github.com/DataDog/datadog-agent/blob/505170c4ac8c3cbff1a61cf5f84b28d835c91058/pkg/trace/stats/concentrator.go#L55. + PeerTags []string `mapstructure:"peer_tags"` +} + +func (c *TracesConfig) Validate() error { + if c.IgnoreResources != nil { + for _, entry := range c.IgnoreResources { + _, err := regexp.Compile(entry) + if err != nil { + return fmt.Errorf("'%s' is not valid resource filter regular expression", entry) + } + } + } + + if c.SpanNameRemappings != nil { + for key, value := range c.SpanNameRemappings { + if value == "" { + return fmt.Errorf("'%s' is not valid value for span name remapping", value) + } + if key == "" { + return fmt.Errorf("'%s' is not valid key for span name remapping", key) + } + } + } + return nil +} + +// TracesExporterConfig Traces configuration in DD exporter +type TracesExporterConfig struct { + // TCPAddr.Endpoint is the host of the Datadog intake server to send traces to. + // If unset, the value is obtained from the Site. + confignet.TCPAddrConfig `mapstructure:",squash"` + + // TracesConfig contains the common configuration for all traces. + TracesConfig `mapstructure:",squash"` + + // TraceBuffer specifies the number of Datadog Agent TracerPayloads to buffer before dropping. + // The default value is 0, meaning the Datadog Agent TracerPayloads are unbuffered. + TraceBuffer int `mapstructure:"trace_buffer"` + + // flushInterval defines the interval in seconds at which the writer flushes traces + // to the intake; used in tests. + flushInterval float64 +} + +// SetFlushInterval sets the interval in seconds at which the writer flushes traces +func (c *TracesExporterConfig) SetFlushInterval(interval float64) { + c.flushInterval = interval +} + +// GetFlushInterval returns the interval in seconds at which the writer flushes traces +func (c *TracesExporterConfig) GetFlushInterval() float64 { + return c.flushInterval +} + +func (c *TracesExporterConfig) Validate() error { + if err := c.TracesConfig.Validate(); err != nil { + return err + } + if c.TraceBuffer < 0 { + return fmt.Errorf("trace buffer must be non-negative") + } + + return nil +} + +// TracesConnectorConfig Traces configuration in DD connector +type TracesConnectorConfig struct { + // TracesConfig contains the common configuration for all traces. + TracesConfig `mapstructure:",squash"` + + // TraceBuffer specifies the number of Datadog Agent TracerPayloads to buffer before dropping. + // The default value is 1000. + TraceBuffer int `mapstructure:"trace_buffer"` + + // ResourceAttributesAsContainerTags specifies the list of resource attributes to be used as container tags. + ResourceAttributesAsContainerTags []string `mapstructure:"resource_attributes_as_container_tags"` + + // BucketInterval specifies the time interval size of aggregation buckets that aggregate the Datadog trace metrics. + // It is also the time interval that Datadog trace metrics payloads are flushed to the pipeline. + // If you are concerned about the metric volume generated by the Datadog connector and the resulting networking egress, try increasing bucket_interval. + // Default is 10s if unset. + BucketInterval time.Duration `mapstructure:"bucket_interval"` +} + +func (c *TracesConnectorConfig) Validate() error { + if err := c.TracesConfig.Validate(); err != nil { + return err + } + + if c.TraceBuffer < 0 { + return fmt.Errorf("trace buffer must be non-negative") + } + + if c.BucketInterval < 0 { + return fmt.Errorf("bucket interval must be non-negative") + } + return nil +} diff --git a/pkg/datadog/doc.go b/pkg/datadog/doc.go new file mode 100644 index 000000000000..0a7468491e3a --- /dev/null +++ b/pkg/datadog/doc.go @@ -0,0 +1,5 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package datadog contains the shared Datadog exporter and Datadog connector configuration. +package datadog // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/datadog" diff --git a/pkg/datadog/go.mod b/pkg/datadog/go.mod new file mode 100644 index 000000000000..6f8ef26cd9f9 --- /dev/null +++ b/pkg/datadog/go.mod @@ -0,0 +1,89 @@ +module github.com/open-telemetry/opentelemetry-collector-contrib/pkg/datadog + +go 1.22.0 + +require ( + github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.59.0 + github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics v0.22.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configauth v0.116.0 + go.opentelemetry.io/collector/config/confighttp v0.116.0 + go.opentelemetry.io/collector/config/confignet v1.22.0 + go.opentelemetry.io/collector/config/configopaque v1.22.0 + go.opentelemetry.io/collector/config/configretry v1.22.0 + go.opentelemetry.io/collector/config/configtls v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.uber.org/zap v1.27.0 +) + +require ( + github.com/DataDog/datadog-agent/pkg/proto v0.52.0-devel // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.59.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.59.0 // indirect + github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.22.0 // indirect + github.com/DataDog/opentelemetry-mapping-go/pkg/quantile v0.22.0 // indirect + github.com/DataDog/sketches-go v1.4.4 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.17.11 // indirect + github.com/knadh/koanf/maps v0.1.1 // indirect + github.com/knadh/koanf/providers/confmap v0.1.0 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/patrickmn/go-cache v2.1.0+incompatible // indirect + github.com/philhofer/fwd v1.1.2 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/rs/cors v1.11.1 // indirect + github.com/tinylib/msgp v1.1.8 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/consumer v1.22.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/semconv v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/pkg/datadog/go.sum b/pkg/datadog/go.sum new file mode 100644 index 000000000000..2138389f1ebf --- /dev/null +++ b/pkg/datadog/go.sum @@ -0,0 +1,273 @@ +github.com/DataDog/datadog-agent/pkg/proto v0.52.0-devel h1:nBejGNIU6Jk7bPBxz2bAO+f+kahAXWBXPecebY3R+Zo= +github.com/DataDog/datadog-agent/pkg/proto v0.52.0-devel/go.mod h1:wjr5YlVvGip6VmAGzHrdBaGUu1LaA9B6gHvInm5kHiY= +github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.59.0 h1:8qlROMBQixtDVQwjvttGSM8hTmN3tnFQugOyh614ACc= +github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.59.0/go.mod h1:4EPWYAplHgdaLZsP/NuLEfh21NuvF+JdVtwttTqQlUY= +github.com/DataDog/datadog-agent/pkg/util/log v0.59.0 h1:0JwuSc9Pr/kHAYIEzbdeYKLxgDViNlA6e/bB+7IvFtE= +github.com/DataDog/datadog-agent/pkg/util/log v0.59.0/go.mod h1:pH5Vs7I0fwUU4dUtiQ/oEC//+xzPAgUlhH5+MG5eseg= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.59.0 h1:p4uZow1IE/ve590aKqTsS+/5P7fPi+abHN9TWFi+bhE= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.59.0/go.mod h1:krOxbYZc4KKE7bdEDu10lLSQBjdeSFS/XDSclsaSf1Y= +github.com/DataDog/opentelemetry-mapping-go/pkg/internal/sketchtest v0.22.0 h1:cXcKVEU1D0HlguR7GunnvuI70TghkarCa9DApqzMY94= +github.com/DataDog/opentelemetry-mapping-go/pkg/internal/sketchtest v0.22.0/go.mod h1:ES00EXfyEKgUkjd93tAXCxJA6i0seeOhZoS5Cj2qzzg= +github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.22.0 h1:yfk2cF8Bx98fSFpGrehEHh1FRqewfxcCTAbUDt5r3F8= +github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.22.0/go.mod h1:9qzpnBSxSOnKzbF/uHket3SSlQihQHix/ZRC2nZUUYQ= +github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics v0.22.0 h1:w9+ngZDYUMLW+GSRA8x1DvVbuMR+cwlGb8VLwZfgBGs= +github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/metrics v0.22.0/go.mod h1:UsfqLgiD6Sjhpjkg+YzAd+TdKUZ2m6ZZ8t+tEkLNTMA= +github.com/DataDog/opentelemetry-mapping-go/pkg/quantile v0.22.0 h1:63SzQz9Ab8XJj8fQKQz6UZNBhOm8rucwzbDfwTVF6dQ= +github.com/DataDog/opentelemetry-mapping-go/pkg/quantile v0.22.0/go.mod h1:E/PY/aQ6S/N5hBPHXZRGmovs5b1BSi4RHGNcB4yP/Z0= +github.com/DataDog/sketches-go v1.4.4 h1:dF52vzXRFSPOj2IjXSWLvXq3jubL4CI69kwYjJ1w5Z8= +github.com/DataDog/sketches-go v1.4.4/go.mod h1:XR0ns2RtEEF09mDKXiKZiQg+nfZStrq1ZuL1eezeZe0= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= +github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= +github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= +github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lightstep/go-expohisto v1.0.0 h1:UPtTS1rGdtehbbAF7o/dhkWLTDI73UifG8LbfQI7cA4= +github.com/lightstep/go-expohisto v1.0.0/go.mod h1:xDXD0++Mu2FOaItXtdDfksfgxfV0z1TMPa+e/EUd0cs= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.115.0 h1:MerLKMrkM4YoGF6Di0D9yMXO02yCX8mrZAi/+jJVVeI= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.115.0/go.mod h1:R8AkVWe9G5Q0oMOapvm9HNS076E3Min8SVlmhBL3QD0= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.115.0 h1:WEqcnWSy9dNSlGb8pYRBX7zhaz2ReyaeImlenbzNTB4= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.115.0/go.mod h1:6Mk71CakHUA3I6oM9hARDiyQypYyOolvb+4PFYyVEFg= +github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= +github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= +github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tinylib/msgp v1.1.8 h1:FCXC1xanKO4I8plpHGH2P7koL/RzZs12l/+r7vakfm0= +github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw= +github.com/vmihailenco/msgpack/v4 v4.3.12 h1:07s4sz9IReOgdikxLTKNbBdqDMLsjPKXwvCazn8G65U= +github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.1 h1:quXMXlA39OCbd2wAdTsGDlK9RkOk6Wuw+x37wVyIuWY= +github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/confignet v1.22.0 h1:SBEMHJZWD8J4qgFw1O+BEkXW9AWldDi6Fz5YeDeoU58= +go.opentelemetry.io/collector/config/confignet v1.22.0/go.mod h1:ZppUH1hgUJOubawEsxsQ9MzEYFytqo2GnVSS7d4CVxc= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= +golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/pkg/datadog/metadata.yaml b/pkg/datadog/metadata.yaml new file mode 100644 index 000000000000..2b6a2b6d571c --- /dev/null +++ b/pkg/datadog/metadata.yaml @@ -0,0 +1,3 @@ +status: + codeowners: + active: [mx-psi, dineshg13, liustanley, songy23, mackjmr, ankitpatel96, jade-guiton-dd] \ No newline at end of file diff --git a/pkg/experimentalmetricmetadata/entity_events.go b/pkg/experimentalmetricmetadata/entity_events.go index 3dd14864b668..f8b0ada15bc5 100644 --- a/pkg/experimentalmetricmetadata/entity_events.go +++ b/pkg/experimentalmetricmetadata/entity_events.go @@ -4,6 +4,8 @@ package experimentalmetricmetadata // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata" import ( + "time" + "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" ) @@ -18,6 +20,7 @@ const ( semconvOtelEntityID = "otel.entity.id" semconvOtelEntityType = "otel.entity.type" + semconvOtelEntityInterval = "otel.entity.interval" semconvOtelEntityAttributes = "otel.entity.attributes" semconvOtelEntityEventAsScope = "otel.entity.event_as_log" @@ -173,6 +176,21 @@ func (s EntityStateDetails) SetEntityType(t string) { s.orig.Attributes().PutStr(semconvOtelEntityType, t) } +// SetInterval sets the reporting period +// i.e. how frequently the information about this entity is reported via EntityState events even if the entity does not change. +func (s EntityStateDetails) SetInterval(t time.Duration) { + s.orig.Attributes().PutInt(semconvOtelEntityInterval, t.Milliseconds()) +} + +// Interval returns the reporting period +func (s EntityStateDetails) Interval() time.Duration { + t, ok := s.orig.Attributes().Get(semconvOtelEntityInterval) + if !ok { + return 0 + } + return time.Duration(t.Int()) * time.Millisecond +} + // EntityDeleteDetails represents the details of an EntityDelete event. type EntityDeleteDetails struct { orig plog.LogRecord diff --git a/pkg/experimentalmetricmetadata/entity_events_test.go b/pkg/experimentalmetricmetadata/entity_events_test.go index b76c6dcd2060..13c13cec2f35 100644 --- a/pkg/experimentalmetricmetadata/entity_events_test.go +++ b/pkg/experimentalmetricmetadata/entity_events_test.go @@ -19,6 +19,7 @@ func Test_Entity_State(t *testing.T) { event.ID().PutStr("k8s.pod.uid", "123") state := event.SetEntityState() state.SetEntityType("k8s.pod") + state.SetInterval(1 * time.Hour) state.Attributes().PutStr("label1", "value1") actual := slice.At(0) @@ -34,6 +35,8 @@ func Test_Entity_State(t *testing.T) { assert.Equal(t, "value1", v.Str()) assert.Equal(t, "k8s.pod", actual.EntityStateDetails().EntityType()) + + assert.Equal(t, 1*time.Hour, actual.EntityStateDetails().Interval()) } func Test_Entity_Delete(t *testing.T) { @@ -88,7 +91,7 @@ func Test_EntityEventsSlice_ConvertAndMoveToLogs(t *testing.T) { // Check the Scope v, ok := scopeLogs.Scope().Attributes().Get(semconvOtelEntityEventAsScope) assert.True(t, ok) - assert.Equal(t, true, v.Bool()) + assert.True(t, v.Bool()) records := scopeLogs.LogRecords() assert.Equal(t, 2, records.Len()) diff --git a/pkg/experimentalmetricmetadata/go.mod b/pkg/experimentalmetricmetadata/go.mod index 79316699ce53..eb68ba5b918b 100644 --- a/pkg/experimentalmetricmetadata/go.mod +++ b/pkg/experimentalmetricmetadata/go.mod @@ -1,10 +1,10 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata -go 1.21.0 +go 1.22.0 require ( - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/pdata v1.9.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/pdata v1.22.0 go.uber.org/goleak v1.3.0 ) @@ -17,12 +17,12 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/pkg/experimentalmetricmetadata/go.sum b/pkg/experimentalmetricmetadata/go.sum index 1bb33e0ec9fc..49bd71274315 100644 --- a/pkg/experimentalmetricmetadata/go.sum +++ b/pkg/experimentalmetricmetadata/go.sum @@ -4,6 +4,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -26,12 +28,12 @@ github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjR github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -45,20 +47,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -67,12 +69,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/pkg/experimentalmetricmetadata/metadata.yaml b/pkg/experimentalmetricmetadata/metadata.yaml index e2972c99bb93..7509bde48a39 100644 --- a/pkg/experimentalmetricmetadata/metadata.yaml +++ b/pkg/experimentalmetricmetadata/metadata.yaml @@ -1,3 +1,4 @@ status: codeowners: - active: [rmfitzpatrick] \ No newline at end of file + active: [dmitryax] + emeritus: [rmfitzpatrick] \ No newline at end of file diff --git a/pkg/golden/README.md b/pkg/golden/README.md index 6f3880ec2f53..b574f5e3c424 100644 --- a/pkg/golden/README.md +++ b/pkg/golden/README.md @@ -6,7 +6,7 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Apkg%2Fgolden%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Apkg%2Fgolden) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Apkg%2Fgolden%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Apkg%2Fgolden) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@djaglowski](https://www.github.com/djaglowski), [@atoulme](https://www.github.com/atoulme) | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha The package golden provides utilities for reading and writing files with metrics, traces and logs in YAML format. diff --git a/pkg/golden/go.mod b/pkg/golden/go.mod index ea4c41af3b60..c454d9fd3d0a 100644 --- a/pkg/golden/go.mod +++ b/pkg/golden/go.mod @@ -1,11 +1,11 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/pdata v1.9.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/pdata v1.22.0 go.uber.org/goleak v1.3.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -19,12 +19,12 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect ) replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../pdatautil diff --git a/pkg/golden/go.sum b/pkg/golden/go.sum index 2bfebc3f8feb..4b549a71d067 100644 --- a/pkg/golden/go.sum +++ b/pkg/golden/go.sum @@ -5,6 +5,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -27,12 +29,12 @@ github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjR github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -46,20 +48,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -68,12 +70,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/pkg/golden/golden.go b/pkg/golden/golden.go index 823f2b143766..ac66a1c57465 100644 --- a/pkg/golden/golden.go +++ b/pkg/golden/golden.go @@ -37,13 +37,13 @@ func ReadMetrics(filePath string) (pmetric.Metrics, error) { } // WriteMetrics writes a pmetric.Metrics to the specified file in YAML format. -func WriteMetrics(t testing.TB, filePath string, metrics pmetric.Metrics, opts ...WriteMetricsOption) error { +func WriteMetrics(tb testing.TB, filePath string, metrics pmetric.Metrics, opts ...WriteMetricsOption) error { if err := writeMetrics(filePath, metrics, opts...); err != nil { return err } - t.Logf("Golden file successfully written to %s.", filePath) - t.Log("NOTE: The WriteMetrics call must be removed in order to pass the test.") - t.Fail() + tb.Logf("Golden file successfully written to %s.", filePath) + tb.Log("NOTE: The WriteMetrics call must be removed in order to pass the test.") + tb.Fail() return nil } @@ -86,7 +86,7 @@ func writeMetrics(filePath string, metrics pmetric.Metrics, opts ...WriteMetrics if err != nil { return err } - return os.WriteFile(filePath, b, 0600) + return os.WriteFile(filePath, b, 0o600) } // ReadLogs reads a plog.Logs from the specified YAML or JSON file. @@ -110,13 +110,13 @@ func ReadLogs(filePath string) (plog.Logs, error) { } // WriteLogs writes a plog.Logs to the specified file in YAML format. -func WriteLogs(t testing.TB, filePath string, logs plog.Logs) error { +func WriteLogs(tb testing.TB, filePath string, logs plog.Logs) error { if err := writeLogs(filePath, logs); err != nil { return err } - t.Logf("Golden file successfully written to %s.", filePath) - t.Log("NOTE: The WriteLogs call must be removed in order to pass the test.") - t.Fail() + tb.Logf("Golden file successfully written to %s.", filePath) + tb.Log("NOTE: The WriteLogs call must be removed in order to pass the test.") + tb.Fail() return nil } @@ -137,7 +137,7 @@ func writeLogs(filePath string, logs plog.Logs) error { if err := enc.Encode(jsonVal); err != nil { return err } - return os.WriteFile(filePath, b.Bytes(), 0600) + return os.WriteFile(filePath, b.Bytes(), 0o600) } // ReadTraces reads a ptrace.Traces from the specified YAML or JSON file. @@ -161,13 +161,13 @@ func ReadTraces(filePath string) (ptrace.Traces, error) { } // WriteTraces writes a ptrace.Traces to the specified file in YAML format. -func WriteTraces(t testing.TB, filePath string, traces ptrace.Traces) error { +func WriteTraces(tb testing.TB, filePath string, traces ptrace.Traces) error { if err := writeTraces(filePath, traces); err != nil { return err } - t.Logf("Golden file successfully written to %s.", filePath) - t.Log("NOTE: The WriteTraces call must be removed in order to pass the test.") - t.Fail() + tb.Logf("Golden file successfully written to %s.", filePath) + tb.Log("NOTE: The WriteTraces call must be removed in order to pass the test.") + tb.Fail() return nil } @@ -188,5 +188,5 @@ func writeTraces(filePath string, traces ptrace.Traces) error { if err := enc.Encode(jsonVal); err != nil { return err } - return os.WriteFile(filePath, b.Bytes(), 0600) + return os.WriteFile(filePath, b.Bytes(), 0o600) } diff --git a/pkg/golden/golden_test.go b/pkg/golden/golden_test.go index 3b7550f82de7..dbcae432674a 100644 --- a/pkg/golden/golden_test.go +++ b/pkg/golden/golden_test.go @@ -141,7 +141,7 @@ func testMetrics() pmetric.MetricSlice { dp = dps.AppendEmpty() attributes = pcommon.NewMap() - setDPDoubleVal(dp, 2, attributes, time.Date(1997, 07, 27, 1, 1, 1, 1, &time.Location{})) + setDPDoubleVal(dp, 2, attributes, time.Date(1997, 0o7, 27, 1, 1, 1, 1, &time.Location{})) return slice } diff --git a/pkg/golden/sort_metrics_test.go b/pkg/golden/sort_metrics_test.go index 1595670ecfc9..e507ae41f39c 100644 --- a/pkg/golden/sort_metrics_test.go +++ b/pkg/golden/sort_metrics_test.go @@ -42,7 +42,6 @@ func TestSortAttributes(t *testing.T) { t.Errorf("Incorrect key at index %d. Expected: %s, Actual: %s", i, key, actualKeys[i]) } } - } func TestSortMetricsResourceAndScope(t *testing.T) { @@ -56,5 +55,4 @@ func TestSortMetricsResourceAndScope(t *testing.T) { after, err := ReadMetrics(afterPath) require.NoError(t, err) require.Equal(t, before, after) - } diff --git a/pkg/golden/testdata/sort-metrics/after.yaml b/pkg/golden/testdata/sort-metrics/after.yaml index ff9daa54c975..7197b495a9c9 100644 --- a/pkg/golden/testdata/sort-metrics/after.yaml +++ b/pkg/golden/testdata/sort-metrics/after.yaml @@ -22,7 +22,7 @@ resourceMetrics: - key: a value: stringValue: CCCC - name: otelcol/anotherfakereceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/anotherfakereceiver version: latest - resource: attributes: @@ -47,7 +47,7 @@ resourceMetrics: - key: a value: stringValue: AAAA - name: otelcol/fakereceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/fakereceiver version: latest - metrics: - description: The number of bytes which have flowed through the network interface. @@ -112,7 +112,7 @@ resourceMetrics: - key: a value: stringValue: BBBB - name: otelcol/nsxtreceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nsxtreceiver version: latest - metrics: - description: This also isn't a real metric @@ -131,7 +131,7 @@ resourceMetrics: - key: a value: stringValue: CCCC - name: otelcol/anotherfakereceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/anotherfakereceiver version: latest - resource: attributes: @@ -156,5 +156,5 @@ resourceMetrics: - key: a value: stringValue: AAAA - name: otelcol/questionablyfakereceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/questionablyfakereceiver version: latest diff --git a/pkg/golden/testdata/sort-metrics/before.yaml b/pkg/golden/testdata/sort-metrics/before.yaml index f6348dfab77a..54d2b0abba5c 100644 --- a/pkg/golden/testdata/sort-metrics/before.yaml +++ b/pkg/golden/testdata/sort-metrics/before.yaml @@ -64,7 +64,7 @@ resourceMetrics: isMonotonic: true unit: By scope: - name: otelcol/nsxtreceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/nsxtreceiver version: latest attributes: - key: a @@ -84,7 +84,7 @@ resourceMetrics: isMonotonic: false unit: "1" scope: - name: otelcol/fakereceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/fakereceiver version: latest attributes: - key: a @@ -104,7 +104,7 @@ resourceMetrics: isMonotonic: false unit: "1" scope: - name: otelcol/anotherfakereceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/anotherfakereceiver version: latest attributes: - key: a @@ -130,7 +130,7 @@ resourceMetrics: isMonotonic: false unit: "1" scope: - name: otelcol/anotherfakereceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/anotherfakereceiver version: latest attributes: - key: a @@ -156,7 +156,7 @@ resourceMetrics: isMonotonic: false unit: "1" scope: - name: otelcol/questionablyfakereceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/questionablyfakereceiver version: latest attributes: - key: a diff --git a/pkg/golden/testdata/standardize-metrics/after.yaml b/pkg/golden/testdata/standardize-metrics/after.yaml index 76159535c1c2..d987014c461e 100644 --- a/pkg/golden/testdata/standardize-metrics/after.yaml +++ b/pkg/golden/testdata/standardize-metrics/after.yaml @@ -52,7 +52,7 @@ resourceMetrics: - key: a value: stringValue: AAA - name: otelcol/FakeMetric + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/FakeMetric version: latest - metrics: - description: Fake Metric @@ -80,7 +80,7 @@ resourceMetrics: - key: a value: stringValue: CCCC - name: otelcol/anotherfakereceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/anotherfakereceiver version: latest - resource: attributes: @@ -199,5 +199,5 @@ resourceMetrics: - key: b value: stringValue: BBB - name: otelcol/standardization + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/standardization version: latest diff --git a/pkg/golden/testdata/standardize-metrics/before.yaml b/pkg/golden/testdata/standardize-metrics/before.yaml index deed1bf116d5..41b854b2e185 100644 --- a/pkg/golden/testdata/standardize-metrics/before.yaml +++ b/pkg/golden/testdata/standardize-metrics/before.yaml @@ -116,7 +116,7 @@ resourceMetrics: - key: b value: stringValue: BBB - name: otelcol/standardization + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/standardization version: latest - resource: attributes: @@ -147,7 +147,7 @@ resourceMetrics: isMonotonic: false unit: "1" scope: - name: otelcol/anotherfakereceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/anotherfakereceiver version: latest attributes: - key: a @@ -197,7 +197,7 @@ resourceMetrics: isMonotonic: false unit: "1" scope: - name: otelcol/FakeMetric + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/FakeMetric version: latest attributes: - key: a diff --git a/pkg/golden/testdata/timestamp-norm/after_normalize.yaml b/pkg/golden/testdata/timestamp-norm/after_normalize.yaml index e68943375c46..1fa766fdd41e 100644 --- a/pkg/golden/testdata/timestamp-norm/after_normalize.yaml +++ b/pkg/golden/testdata/timestamp-norm/after_normalize.yaml @@ -91,5 +91,5 @@ resourceMetrics: isMonotonic: true unit: By scope: - name: otelcol/timestampNormalization + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/timestampNormalization version: latest diff --git a/pkg/golden/testdata/timestamp-norm/before_normalize.yaml b/pkg/golden/testdata/timestamp-norm/before_normalize.yaml index da118b02fae5..3f961a19c772 100644 --- a/pkg/golden/testdata/timestamp-norm/before_normalize.yaml +++ b/pkg/golden/testdata/timestamp-norm/before_normalize.yaml @@ -91,6 +91,6 @@ resourceMetrics: isMonotonic: true unit: By scope: - name: otelcol/timestampNormalization + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/timestampNormalization version: latest \ No newline at end of file diff --git a/pkg/kafka/topic/Makefile b/pkg/kafka/topic/Makefile new file mode 100644 index 000000000000..bdd863a203be --- /dev/null +++ b/pkg/kafka/topic/Makefile @@ -0,0 +1 @@ +include ../../../Makefile.Common diff --git a/pkg/kafka/topic/README.md b/pkg/kafka/topic/README.md new file mode 100644 index 000000000000..663d969e5d61 --- /dev/null +++ b/pkg/kafka/topic/README.md @@ -0,0 +1,4 @@ +# Kafka Topic Context Accessor + +This module is used for accessing the topic within a context. +See the [kafka exporter readme](../../../exporter/kafkaexporter/README.md#destination-topic) for more details. diff --git a/pkg/kafka/topic/go.mod b/pkg/kafka/topic/go.mod new file mode 100644 index 000000000000..7ef117787414 --- /dev/null +++ b/pkg/kafka/topic/go.mod @@ -0,0 +1,3 @@ +module github.com/open-telemetry/opentelemetry-collector-contrib/pkg/kafka/topic + +go 1.22.0 diff --git a/pkg/kafka/topic/kafka_ctx.go b/pkg/kafka/topic/kafka_ctx.go new file mode 100644 index 000000000000..603863615fb4 --- /dev/null +++ b/pkg/kafka/topic/kafka_ctx.go @@ -0,0 +1,19 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package topic // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/kafka/topic" + +import ( + "context" +) + +func WithTopic(ctx context.Context, topic string) context.Context { + return context.WithValue(ctx, topicContextKey{}, topic) +} + +func FromContext(ctx context.Context) (string, bool) { + contextTopic, ok := ctx.Value(topicContextKey{}).(string) + return contextTopic, ok +} + +type topicContextKey struct{} diff --git a/pkg/kafka/topic/metadata.yaml b/pkg/kafka/topic/metadata.yaml new file mode 100644 index 000000000000..708ccce63f83 --- /dev/null +++ b/pkg/kafka/topic/metadata.yaml @@ -0,0 +1,6 @@ +type: topic + +status: + class: pkg + codeowners: + active: [pavolloffay, MovieStoreGuy] diff --git a/pkg/ottl/CONTRIBUTING.md b/pkg/ottl/CONTRIBUTING.md index c644810d2c49..e5e54971b6ce 100644 --- a/pkg/ottl/CONTRIBUTING.md +++ b/pkg/ottl/CONTRIBUTING.md @@ -6,20 +6,57 @@ This guide is specific to the OpenTelemetry Transformation Language. All guidel - Changes to the OpenTelemetry Transformation Language should be made independent of any component that depend on the package. Whenever possible, try not to submit PRs that change both the OTTL and a dependent component. Instead, submit a PR that updates the OTTL and then, once merged, update the component as needed. -## New Values +## Adding New Editors/Converters -When adding new values to the grammar you must: +Before raising a PR with a new Editor or Converter, raise an issue to verify its acceptance. While acceptance is strongly specific to a specific use case, consider these guidelines for early assessment. -1. Update the `Value` struct with the new value. This may also mean adding new token(s) to the lexer. -2. Update `NewFunctionCall` to be able to handle calling functions with this new value. -3. Update `NewGetter` to be able to handle the new value. -4. Add new unit tests. +Your proposal likely will be accepted if: + +- The proposed functionality is missing, +- The proposed solution significantly improves user experience and readability for very common use cases, +- The proposed solution is more performant in cases where it is possible to achieve the same result with existing options. +- The proposed solution makes use of packages from the Go standard library to offer functionality possible through an existing option in a more standard or reliable manner. + +It will be up for discussion if: + +- Your proposal solves an issue that can be achieved in another way but does not improve user experience or performance. +- The proposed functionality is not obviously applicable to the needs of a significant number of OTTL users. +- Your proposal extracts data into a structure with enumerable keys or values and OpenTelemetry semantic conventions do not cover the shape or values for this data. + +Your proposal likely won't be accepted if: + +- User experience is worse and assumes a highly technical user, +- The performance of your proposal very negatively affects the processing pipeline. + +As with code, OTTL aims for readability first. This means: -## New Functions +- Using short, meaningful, and descriptive names, +- Ensuring naming consistency across Editors and Converters, +- Avoiding deep nesting to achieve desired transformations, +- Ensuring Editors and Converters have a single responsibility. + +### Implementation guidelines All new functions must be added via a new file. Function files must start with `func_`. Functions must be placed in `ottlfuncs`. Unit tests must be added for all new functions. Unit test files must start with `func_` and end in `_test`. Unit tests must be placed in the same directory as the function. Functions that are not specific to a pipeline should be tested independently of any specific pipeline. Functions that are specific to a pipeline should be tests against that pipeline. End-to-end tests must be added in the `e2e` directory. -Function names should follow the [Function Syntax Guidelines](ottlfuncs/README.md#function-syntax) +#### Naming and Parameter Guidelines + +Functions should be named and formatted according to the following standards. + +- Function names MUST start with a verb unless it is a Factory that creates a new type. +- Converters MUST be UpperCamelCase. +- Function names that contain multiple words MUST separate those words with `_`. +- Functions that interact with multiple items MUST have plurality in the name. Ex: `truncate_all`, `keep_keys`, `replace_all_matches`. +- Functions that interact with a single item MUST NOT have plurality in the name. If a function would interact with multiple items due to a condition, like `where`, it is still considered singular. Ex: `set`, `delete`, `replace_match`. +- Functions that change a specific target MUST set the target as the first parameter. +## New Values + +When adding new values to the grammar you must: + +1. Update the `Value` struct with the new value. This may also mean adding new token(s) to the lexer. +2. Update `NewFunctionCall` to be able to handle calling functions with this new value. +3. Update `NewGetter` to be able to handle the new value. +4. Add new unit tests. diff --git a/pkg/ottl/LANGUAGE.md b/pkg/ottl/LANGUAGE.md index 05df67e0ffef..ee4545228a74 100644 --- a/pkg/ottl/LANGUAGE.md +++ b/pkg/ottl/LANGUAGE.md @@ -1,6 +1,6 @@ ## Grammar -The OTTL grammar includes function invocations, Values and Boolean Expressions. These parts all fit into a Statement, which is the basis of execution in the OTTL. +OTTL grammar includes function invocations, Values and Boolean Expressions. These parts all fit into a Statement, which is the basis of execution in OTTL. ### Design principles @@ -18,9 +18,9 @@ An Editor is made up of 2 parts: - a string identifier. The string identifier must start with a lowercase letter. - zero or more Values (comma separated) surrounded by parentheses (`()`). -**The OTTL has no built-in Editors.** +**OTTL has no built-in Editors.** Users must supply a map between string identifiers and Editor implementations. -The OTTL will use this map to determine which implementation to call when executing a Statement. +OTTL will use this map to determine which implementation to call when executing a Statement. See [ottlfuncs](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/pkg/ottl/ottlfuncs#editors) for pre-made, usable Editors. ### Converters @@ -32,9 +32,9 @@ Converters are made up of 3 parts: - zero or more Values (comma separated) surrounded by parentheses (`()`). - a combination of zero or more a string key (`["key"]`) or int key (`[0]`) -**The OTTL has no built-in Converters.** +**OTTL has no built-in Converters.** Users must include Converters in the same map that Editors are supplied. -The OTTL will use this map and reflection to generate Converters that can then be invoked by the user. +OTTL will use this map and reflection to generate Converters that can then be invoked by the user. See [ottlfuncs](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/pkg/ottl/ottlfuncs#converters) for pre-made, usable Converters. When keys are supplied the value returned by the Converter will be indexed by the keys in order. @@ -69,6 +69,7 @@ The following types are supported for single-value parameters in OTTL functions: - `IntLikeGetter` - `BoolGetter` - `BoolLikeGetter` +- `ByteSliceLikeGetter` - `Enum` - `string` - `float64` @@ -88,7 +89,7 @@ For slice parameters, the following types are supported: - `string` - `float64` - `int64` -- `uint8`. Byte slice literals are parsed as byte slices by the OTTL. +- `uint8`. Byte slice literals are parsed as byte slices by OTTL. - `Getter` To make a parameter optional, use the `Optional` type, which takes a type argument for the underlying @@ -113,10 +114,11 @@ Values are passed as function parameters or are used in a Boolean Expression. Va - [Enums](#enums) - [Converters](#converters) - [Math Expressions](#math-expressions) +- [Maps](#maps) ### Paths -A Path Value is a reference to a telemetry field. Paths are made up of lowercase identifiers, dots (`.`), and square brackets combined with a string key (`["key"]`) or int key (`[0]`). **The interpretation of a Path is NOT implemented by the OTTL.** Instead, the user must provide a `PathExpressionParser` that the OTTL can use to interpret paths. As a result, how the Path parts are used is up to the user. However, it is recommended that the parts be used like so: +A Path Value is a reference to a telemetry field. Paths are made up of lowercase identifiers, dots (`.`), and square brackets combined with a string key (`["key"]`) or int key (`[0]`). **The interpretation of a Path is NOT implemented by OTTL.** Instead, the user must provide a `PathExpressionParser` that OTTL can use to interpret paths. As a result, how the Path parts are used is up to the user. However, it is recommended that the parts be used like so: - Identifiers are used to map to a telemetry field. - Dots (`.`) are used to separate nested fields. @@ -154,13 +156,23 @@ Example List Values: - `["1", "2", "3"]` - `["a", attributes["key"], Concat(["a", "b"], "-")]` +### Maps + +A Map Value comprises a set of key Value pairs. + +Example Map Values: +- `{}` +- `{"foo": "bar"}` +- `{"foo": {"a": 2}}` +- `{"foo": {"a": attributes["key"]}}` + ### Literals Literals are literal interpretations of the Value into a Go value. Accepted literals are: - Strings. Strings are represented as literals by surrounding the string in double quotes (`""`). -- Ints. Ints are represented by any digit, optionally prepended by plus (`+`) or minus (`-`). Internally the OTTL represents all ints as `int64` -- Floats. Floats are represented by digits separated by a dot (`.`), optionally prepended by plus (`+`) or minus (`-`). The leading digit is optional. Internally the OTTL represents all Floats as `float64`. +- Ints. Ints are represented by any digit, optionally prepended by plus (`+`) or minus (`-`). Internally OTTL represents all ints as `int64` +- Floats. Floats are represented by digits separated by a dot (`.`), optionally prepended by plus (`+`) or minus (`-`). The leading digit is optional. Internally OTTL represents all Floats as `float64`. - Bools. Bools are represented by the exact strings `true` and `false`. - Nil. Nil is represented by the exact string `nil`. - Byte slices. Byte slices are represented via a hex string prefaced with `0x` @@ -175,7 +187,7 @@ Example Literals ### Enums -Enums are uppercase identifiers that get interpreted during parsing and converted to an `int64`. **The interpretation of an Enum is NOT implemented by the OTTL.** Instead, the user must provide a `EnumParser` that the OTTL can use to interpret the Enum. The `EnumParser` returns an `int64` instead of a function, which means that the Enum's numeric value is retrieved during parsing instead of during execution. +Enums are uppercase identifiers that get interpreted during parsing and converted to an `int64`. **The interpretation of an Enum is NOT implemented by OTTL.** Instead, the user must provide a `EnumParser` that OTTL can use to interpret the Enum. The `EnumParser` returns an `int64` instead of a function, which means that the Enum's numeric value is retrieved during parsing instead of during execution. Within the grammar Enums are always used as `int64`. As a result, the Enum's symbol can be used as if it is an Int value. @@ -280,7 +292,7 @@ Examples: ## Accessing signal telemetry -Access to signal telemetry is provided to OTTL functions through a `TransformContext` that is created by the user and passed during statement evaluation. To allow functions to operate on the `TransformContext`, the OTTL provides `Getter`, `Setter`, and `GetSetter` interfaces. +Access to signal telemetry is provided to OTTL functions through a `TransformContext` that is created by the user and passed during statement evaluation. To allow functions to operate on the `TransformContext`, OTTL provides `Getter`, `Setter`, and `GetSetter` interfaces. ### Getters and Setters @@ -293,6 +305,6 @@ Getters allow for reading the following types of data. See the respective sectio It is possible to update the Value in a telemetry field using a Setter. For read and write access, the `GetSetter` interface extends both interfaces. -## Logging inside a OTTL function +## Logging inside an OTTL function -To emit logs inside a OTTL function, add a parameter of type [`component.TelemetrySettings`](https://pkg.go.dev/go.opentelemetry.io/collector/component#TelemetrySettings) to the function signature. The OTTL will then inject the TelemetrySettings that were passed to `NewParser` into the function. TelemetrySettings can be used to emit logs. +To emit logs inside an OTTL function, add a parameter of type [`component.TelemetrySettings`](https://pkg.go.dev/go.opentelemetry.io/collector/component#TelemetrySettings) to the function signature. OTTL will then inject the TelemetrySettings that were passed to `NewParser` into the function. TelemetrySettings can be used to emit logs. diff --git a/pkg/ottl/README.md b/pkg/ottl/README.md index b57b2de5cd4b..b7d7a125f45f 100644 --- a/pkg/ottl/README.md +++ b/pkg/ottl/README.md @@ -6,12 +6,17 @@ | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Apkg%2Fottl%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Apkg%2Fottl) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Apkg%2Fottl%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Apkg%2Fottl) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@TylerHelmuth](https://www.github.com/TylerHelmuth), [@kentquirk](https://www.github.com/kentquirk), [@bogdandrutu](https://www.github.com/bogdandrutu), [@evan-bradley](https://www.github.com/evan-bradley) \| Seeking more code owners! | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha -The OpenTelemetry Transformation Language is a language for transforming open telemetry data based on the [OpenTelemetry Collector Processing Exploration](https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/rfcs/processing.md). +The OpenTelemetry Transformation Language (OTTL) is a small, domain-specific programming language intended to process data with OpenTelemetry-native concepts and constructs. -This package reads in OTTL statements and converts them to invokable functions/booleans based on the OTTL's grammar. +This package implements everything necessary to use OTTL in a Collector component or in another user-facing system. + +- [Getting Started](#getting-started) +- [Where to use OTTL](#where-to-use-ottl) +- [Troubleshooting](#troubleshooting) +- [Resources](#resources) ## Getting Started @@ -19,114 +24,52 @@ If you're looking to write OTTL statements for a component's configuration check See [OTTL Functions](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/pkg/ottl/ottlfuncs#ottl-functions) for a list of functions available for use in the OTTL statements of most components. -OTTL Contexts define how you access the fields on a piece of telemetry. See the table to find the exact list of available fields: +OTTL Contexts define how you access the fields on a given telemetry item. See the table to find the exact list of available fields: | Telemetry | OTTL Context | |-------------------------|--------------------------------------------------------------------------------------------------------------------------------------------| -| `Resource` | [Resource](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/pkg/ottl/contexts/ottlresource/README.md) | -| `Instrumentation Scope` | [Instrumentation Scope](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/pkg/ottl/contexts/ottlscope/README.md) | -| `Span` | [Span](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/pkg/ottl/contexts/ottlspan/README.md) | -| `Span Event` | [SpanEvent](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/pkg/ottl/contexts/ottlspanevent/README.md) | -| `Metric` | [Metric](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/pkg/ottl/contexts/ottlmetric/README.md) | -| `Datapoint` | [DataPoint](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/pkg/ottl/contexts/ottldatapoint/README.md) | -| `Log` | [Log](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/pkg/ottl/contexts/ottllog/README.md) | - -### Component Creators - -If you're looking to use OTTL in your component, check out [the OTTL grammar](./LANGUAGE.md). - -## Examples - -These examples contain a SQL-like declarative language. Applied statements interact with only one signal, but statements can be declared across multiple signals. Functions used in examples are indicative of what could be useful. - -### Remove a forbidden attribute - -``` -traces: - delete(attributes["http.request.header.authorization"]) -metrics: - delete(attributes["http.request.header.authorization"]) -logs: - delete(attributes["http.request.header.authorization"]) -``` - -### Remove all attributes except for some - -``` -traces: - keep_keys(attributes, ["http.method", "http.status_code"]) -metrics: - keep_keys(attributes, ["http.method", "http.status_code"]) -logs: - keep_keys(attributes, ["http.method", "http.status_code"]) -``` - -### Reduce cardinality of an attribute - -``` -traces: - replace_match(attributes["http.target"], "/user/*/list/*", "/user/{userId}/list/{listId}") -``` - -### Reduce cardinality of a span name +| `Resource` | [Resource](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/pkg/ottl/contexts/ottlresource/README.md) | +| `Instrumentation Scope` | [Instrumentation Scope](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/pkg/ottl/contexts/ottlscope/README.md) | +| `Span` | [Span](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/pkg/ottl/contexts/ottlspan/README.md) | +| `Span Event` | [SpanEvent](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/pkg/ottl/contexts/ottlspanevent/README.md) | +| `Metric` | [Metric](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/pkg/ottl/contexts/ottlmetric/README.md) | +| `Datapoint` | [DataPoint](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/pkg/ottl/contexts/ottldatapoint/README.md) | +| `Log` | [Log](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/pkg/ottl/contexts/ottllog/README.md) | -``` -traces: - replace_match(name, "GET /user/*/list/*", "GET /user/{userId}/list/{listId}") -``` - -### Reduce cardinality of any matching attribute +To understand what OTTL offers as a language, check out [OTTL's grammar doc](./LANGUAGE.md). -``` -traces: - replace_all_matches(attributes, "/user/*/list/*", "/user/{userId}/list/{listId}") -``` - -### Decrease the size of the telemetry payload - -``` -traces: - delete(resource.attributes["process.command_line"]) -metrics: - delete(resource.attributes["process.command_line"]) -logs: - delete(resource.attributes["process.command_line"]) -``` +## Where to use OTTL -### Attach information from resource into telemetry +- To modify your data as it passes through a pipeline, use the [transform processor](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/transformprocessor/README.md). +- To remove data from your pipeline, use the [filter processor](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/filterprocessor/README.md). +- To select spans to be sampled, use the [tail sampling processor](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/tailsamplingprocessor/README.md). +- To route data between pipelines, use the [routing connector](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/connector/routingconnector/README.md). -``` -metrics: - set(attributes["k8s_pod"], resource.attributes["k8s.pod.name"]) -``` +## Troubleshooting -### Decorate error spans with additional information +When using OTTL you can enable debug logging in the collector to print out useful information, +such as the current Statement/Condition and the current TransformContext, to help you troubleshoot +why a statement is not behaving as you expect. This feature is very verbose, but provides you an accurate +view into how OTTL views the underlying data. -``` -traces: - set(attributes["whose_fault"], "theirs") where attributes["http.status"] == 400 or attributes["http.status"] == 404 - set(attributes["whose_fault"], "ours") where attributes["http.status"] == 500 +```yaml +service: + telemetry: + logs: + level: debug ``` -### Update a spans ID - ``` -logs: - set(span_id, SpanID(0x0000000000000000)) -traces: - set(span_id, SpanID(0x0000000000000000)) +2024-05-29T16:38:09.600-0600 debug ottl@v0.101.0/parser.go:265 initial TransformContext {"kind": "processor", "name": "transform", "pipeline": "logs", "TransformContext": {"resource": {"attributes": {}, "dropped_attribute_count": 0}, "scope": {"attributes": {}, "dropped_attribute_count": 0, "name": "", "version": ""}, "log_record": {"attributes": {"log.file.name": "test.log"}, "body": "test", "dropped_attribute_count": 0, "flags": 0, "observed_time_unix_nano": 1717022289500721000, "severity_number": 0, "severity_text": "", "span_id": "", "time_unix_nano": 0, "trace_id": ""}, "cache": {}}} +2024-05-29T16:38:09.600-0600 debug ottl@v0.101.0/parser.go:268 TransformContext after statement execution {"kind": "processor", "name": "transform", "pipeline": "logs", "statement": "set(resource.attributes[\"test\"], \"pass\")", "condition matched": true, "TransformContext": {"resource": {"attributes": {"test": "pass"}, "dropped_attribute_count": 0}, "scope": {"attributes": {}, "dropped_attribute_count": 0, "name": "", "version": ""}, "log_record": {"attributes": {"log.file.name": "test.log"}, "body": "test", "dropped_attribute_count": 0, "flags": 0, "observed_time_unix_nano": 1717022289500721000, "severity_number": 0, "severity_text": "", "span_id": "", "time_unix_nano": 0, "trace_id": ""}, "cache": {}}} +2024-05-29T16:38:09.600-0600 debug ottl@v0.101.0/parser.go:268 TransformContext after statement execution {"kind": "processor", "name": "transform", "pipeline": "logs", "statement": "set(instrumentation_scope.attributes[\"test\"], [\"pass\"])", "condition matched": true, "TransformContext": {"resource": {"attributes": {"test": "pass"}, "dropped_attribute_count": 0}, "scope": {"attributes": {"test": ["pass"]}, "dropped_attribute_count": 0, "name": "", "version": ""}, "log_record": {"attributes": {"log.file.name": "test.log"}, "body": "test", "dropped_attribute_count": 0, "flags": 0, "observed_time_unix_nano": 1717022289500721000, "severity_number": 0, "severity_text": "", "span_id": "", "time_unix_nano": 0, "trace_id": ""}, "cache": {}}} +2024-05-29T16:38:09.601-0600 debug ottl@v0.101.0/parser.go:268 TransformContext after statement execution {"kind": "processor", "name": "transform", "pipeline": "logs", "statement": "set(attributes[\"test\"], true)", "condition matched": true, "TransformContext": {"resource": {"attributes": {"test": "pass"}, "dropped_attribute_count": 0}, "scope": {"attributes": {"test": ["pass"]}, "dropped_attribute_count": 0, "name": "", "version": ""}, "log_record": {"attributes": {"log.file.name": "test.log", "test": true}, "body": "test", "dropped_attribute_count": 0, "flags": 0, "observed_time_unix_nano": 1717022289500721000, "severity_number": 0, "severity_text": "", "span_id": "", "time_unix_nano": 0, "trace_id": ""}, "cache": {}}} ``` -### Convert metric name to snake case +## Resources -``` -metrics: - set(metric.name, ConvertCase(metric.name, "snake")) -``` - -### Check if an attribute exists +These are previous conference presentations given about OTTL: -``` -traces: - set(attributes["test-passed"], true) where attributes["target-attribute"] != nil -``` +- [OTTL Me Why Transforming Telemetry in the OpenTelemetry Collector Just Got Better](https://youtu.be/uVs0oUV72CE) +- [Managing Observability Data at the Edge with the OpenTelemetry Collector and OTTL](https://youtu.be/GO0ulYLxy_8) +- [The OTTL Cookbook: A Collection of Solutions to Common Problems](https://www.youtube.com/watch?v=UGTU0-KT_60) \ No newline at end of file diff --git a/pkg/ottl/boolean_value.go b/pkg/ottl/boolean_value.go index 9bd2df9171b7..fd3378d343c7 100644 --- a/pkg/ottl/boolean_value.go +++ b/pkg/ottl/boolean_value.go @@ -94,7 +94,6 @@ func (p *Parser[K]) newComparisonEvaluator(comparison *comparison) (BoolExpr[K], } return p.compare(a, b, comparison.Op), nil }}, nil - } func (p *Parser[K]) newBoolExpr(expr *booleanExpression) (BoolExpr[K], error) { diff --git a/pkg/ottl/boolean_value_test.go b/pkg/ottl/boolean_value_test.go index ba6fbd3da430..e688a969938f 100644 --- a/pkg/ottl/boolean_value_test.go +++ b/pkg/ottl/boolean_value_test.go @@ -115,7 +115,7 @@ func Test_newComparisonEvaluator(t *testing.T) { JanFirst2023 := time.Date(2023, 1, 1, 0, 0, 0, 0, time.Local) - var tests = []struct { + tests := []struct { name string l any r any @@ -159,16 +159,16 @@ func Test_newComparisonEvaluator(t *testing.T) { {name: "compare not greater than equal to durations", l: "dur1", r: "dur2", op: ">=", want: false, item: map[string]time.Duration{"dur1": oneMillisecond, "dur2": threeSeconds}}, {name: "compare equal times", l: "time1", r: "time2", op: "==", want: true, item: map[string]time.Time{"time1": JanFirst2023, "time2": JanFirst2023}}, {name: "compare unequal times", l: "time1", r: "time2", op: "==", want: false, item: map[string]time.Time{"time1": JanFirst2023, "time2": time.Date(2023, 1, 2, 0, 0, 0, 0, time.Local)}}, - {name: "compare for not equal times", l: "time1", r: "time2", op: "!=", want: true, item: map[string]time.Time{"time1": JanFirst2023, "time2": time.Date(2002, 11, 2, 01, 01, 01, 01, time.Local)}}, - {name: "compare for equal times using not equal", l: "time1", r: "time2", op: "!=", want: false, item: map[string]time.Time{"time1": time.Date(2002, 11, 2, 01, 01, 01, 01, time.Local), "time2": time.Date(2002, 11, 2, 01, 01, 01, 01, time.Local)}}, - {name: "compare less than times", l: "time1", r: "time2", op: "<", want: true, item: map[string]time.Time{"time1": JanFirst2023, "time2": time.Date(2023, 5, 2, 01, 01, 01, 01, time.Local)}}, - {name: "compare not less than times", l: "time1", r: "time2", op: "<", want: false, item: map[string]time.Time{"time1": time.Date(2023, 6, 2, 01, 01, 01, 01, time.Local), "time2": time.Date(2023, 5, 2, 01, 01, 01, 01, time.Local)}}, - {name: "compare less than equal to times", l: "time1", r: "time2", op: "<=", want: true, item: map[string]time.Time{"time1": time.Date(2003, 5, 2, 01, 01, 01, 01, time.Local), "time2": time.Date(2003, 5, 2, 01, 01, 01, 01, time.Local)}}, - {name: "compare not less than equal to times", l: "time1", r: "time2", op: "<=", want: false, item: map[string]time.Time{"time1": time.Date(2002, 5, 2, 01, 01, 01, 01, time.Local), "time2": time.Date(1999, 5, 2, 01, 01, 01, 01, time.Local)}}, - {name: "compare not greater than equal to w/ times", l: "time1", r: "time2", op: ">=", want: false, item: map[string]time.Time{"time1": time.Date(2002, 5, 2, 01, 01, 01, 01, time.Local), "time2": time.Date(2003, 5, 2, 01, 01, 01, 01, time.Local)}}, - {name: "compare greater than equal to w/ times", l: "time1", r: "time2", op: ">=", want: true, item: map[string]time.Time{"time1": time.Date(2022, 5, 2, 01, 01, 01, 01, time.Local), "time2": time.Date(2003, 5, 2, 01, 01, 01, 01, time.Local)}}, - {name: "compare greater than w/ times", l: "time1", r: "time2", op: ">", want: true, item: map[string]time.Time{"time1": time.Date(2022, 5, 2, 01, 01, 01, 01, time.Local), "time2": time.Date(2003, 5, 2, 01, 01, 01, 01, time.Local)}}, - {name: "compare not greater than w/ times", l: "time1", r: "time2", op: ">", want: false, item: map[string]time.Time{"time1": time.Date(2002, 3, 2, 01, 01, 01, 01, time.Local), "time2": time.Date(2003, 5, 2, 01, 01, 01, 01, time.Local)}}, + {name: "compare for not equal times", l: "time1", r: "time2", op: "!=", want: true, item: map[string]time.Time{"time1": JanFirst2023, "time2": time.Date(2002, 11, 2, 0o1, 0o1, 0o1, 0o1, time.Local)}}, + {name: "compare for equal times using not equal", l: "time1", r: "time2", op: "!=", want: false, item: map[string]time.Time{"time1": time.Date(2002, 11, 2, 0o1, 0o1, 0o1, 0o1, time.Local), "time2": time.Date(2002, 11, 2, 0o1, 0o1, 0o1, 0o1, time.Local)}}, + {name: "compare less than times", l: "time1", r: "time2", op: "<", want: true, item: map[string]time.Time{"time1": JanFirst2023, "time2": time.Date(2023, 5, 2, 0o1, 0o1, 0o1, 0o1, time.Local)}}, + {name: "compare not less than times", l: "time1", r: "time2", op: "<", want: false, item: map[string]time.Time{"time1": time.Date(2023, 6, 2, 0o1, 0o1, 0o1, 0o1, time.Local), "time2": time.Date(2023, 5, 2, 0o1, 0o1, 0o1, 0o1, time.Local)}}, + {name: "compare less than equal to times", l: "time1", r: "time2", op: "<=", want: true, item: map[string]time.Time{"time1": time.Date(2003, 5, 2, 0o1, 0o1, 0o1, 0o1, time.Local), "time2": time.Date(2003, 5, 2, 0o1, 0o1, 0o1, 0o1, time.Local)}}, + {name: "compare not less than equal to times", l: "time1", r: "time2", op: "<=", want: false, item: map[string]time.Time{"time1": time.Date(2002, 5, 2, 0o1, 0o1, 0o1, 0o1, time.Local), "time2": time.Date(1999, 5, 2, 0o1, 0o1, 0o1, 0o1, time.Local)}}, + {name: "compare not greater than equal to w/ times", l: "time1", r: "time2", op: ">=", want: false, item: map[string]time.Time{"time1": time.Date(2002, 5, 2, 0o1, 0o1, 0o1, 0o1, time.Local), "time2": time.Date(2003, 5, 2, 0o1, 0o1, 0o1, 0o1, time.Local)}}, + {name: "compare greater than equal to w/ times", l: "time1", r: "time2", op: ">=", want: true, item: map[string]time.Time{"time1": time.Date(2022, 5, 2, 0o1, 0o1, 0o1, 0o1, time.Local), "time2": time.Date(2003, 5, 2, 0o1, 0o1, 0o1, 0o1, time.Local)}}, + {name: "compare greater than w/ times", l: "time1", r: "time2", op: ">", want: true, item: map[string]time.Time{"time1": time.Date(2022, 5, 2, 0o1, 0o1, 0o1, 0o1, time.Local), "time2": time.Date(2003, 5, 2, 0o1, 0o1, 0o1, 0o1, time.Local)}}, + {name: "compare not greater than w/ times", l: "time1", r: "time2", op: ">", want: false, item: map[string]time.Time{"time1": time.Date(2002, 3, 2, 0o1, 0o1, 0o1, 0o1, time.Local), "time2": time.Date(2003, 5, 2, 0o1, 0o1, 0o1, 0o1, time.Local)}}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -220,6 +220,7 @@ func True() (ExprFunc[any], error) { return true, nil }, nil } + func False() (ExprFunc[any], error) { return func(_ context.Context, _ any) (any, error) { return false, nil @@ -243,7 +244,8 @@ func Test_newBooleanExpressionEvaluator(t *testing.T) { want bool expr *booleanExpression }{ - {"a", false, + { + "a", false, &booleanExpression{ Left: &term{ Left: &booleanValue{ @@ -264,7 +266,8 @@ func Test_newBooleanExpressionEvaluator(t *testing.T) { }, }, }, - {"b", true, + { + "b", true, &booleanExpression{ Left: &term{ Left: &booleanValue{ @@ -285,7 +288,8 @@ func Test_newBooleanExpressionEvaluator(t *testing.T) { }, }, }, - {"c", false, + { + "c", false, &booleanExpression{ Left: &term{ Left: &booleanValue{ @@ -314,7 +318,8 @@ func Test_newBooleanExpressionEvaluator(t *testing.T) { }, }, }, - {"d", true, + { + "d", true, &booleanExpression{ Left: &term{ Left: &booleanValue{ @@ -337,7 +342,8 @@ func Test_newBooleanExpressionEvaluator(t *testing.T) { }, }, }, - {"e", true, + { + "e", true, &booleanExpression{ Left: &term{ Left: &booleanValue{ @@ -360,7 +366,8 @@ func Test_newBooleanExpressionEvaluator(t *testing.T) { }, }, }, - {"f", false, + { + "f", false, &booleanExpression{ Left: &term{ Left: &booleanValue{ @@ -383,7 +390,8 @@ func Test_newBooleanExpressionEvaluator(t *testing.T) { }, }, }, - {"g", true, + { + "g", true, &booleanExpression{ Left: &term{ Left: &booleanValue{ @@ -416,7 +424,8 @@ func Test_newBooleanExpressionEvaluator(t *testing.T) { }, }, }, - {"h", true, + { + "h", true, &booleanExpression{ Left: &term{ Left: &booleanValue{ @@ -455,7 +464,8 @@ func Test_newBooleanExpressionEvaluator(t *testing.T) { }, }, }, - {"i", true, + { + "i", true, &booleanExpression{ Left: &term{ Left: &booleanValue{ @@ -467,7 +477,8 @@ func Test_newBooleanExpressionEvaluator(t *testing.T) { }, }, }, - {"j", false, + { + "j", false, &booleanExpression{ Left: &term{ Left: &booleanValue{ @@ -479,7 +490,8 @@ func Test_newBooleanExpressionEvaluator(t *testing.T) { }, }, }, - {"k", true, + { + "k", true, &booleanExpression{ Left: &term{ Left: &booleanValue{ @@ -497,7 +509,8 @@ func Test_newBooleanExpressionEvaluator(t *testing.T) { }, }, }, - {"l", false, + { + "l", false, &booleanExpression{ Left: &term{ Left: &booleanValue{ @@ -537,7 +550,8 @@ func Test_newBooleanExpressionEvaluator(t *testing.T) { }, }, }, - {"m", false, + { + "m", false, &booleanExpression{ Left: &term{ Left: &booleanValue{ @@ -573,7 +587,8 @@ func Test_newBooleanExpressionEvaluator(t *testing.T) { }, }, }, - {"n", true, + { + "n", true, &booleanExpression{ Left: &term{ Left: &booleanValue{ @@ -586,7 +601,8 @@ func Test_newBooleanExpressionEvaluator(t *testing.T) { }, }, }, - {"o", false, + { + "o", false, &booleanExpression{ Left: &term{ Left: &booleanValue{ diff --git a/pkg/ottl/context_inferrer.go b/pkg/ottl/context_inferrer.go new file mode 100644 index 000000000000..da4ade783278 --- /dev/null +++ b/pkg/ottl/context_inferrer.go @@ -0,0 +1,77 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottl // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" + +import "math" + +var defaultContextInferPriority = []string{ + "log", + "metric", + "datapoint", + "spanevent", + "span", + "resource", + "scope", + "instrumentation_scope", +} + +// contextInferrer is an interface used to infer the OTTL context from statements paths. +type contextInferrer interface { + // infer returns the OTTL context inferred from the given statements paths. + infer(statements []string) (string, error) +} + +type priorityContextInferrer struct { + contextPriority map[string]int +} + +func (s *priorityContextInferrer) infer(statements []string) (string, error) { + var inferredContext string + var inferredContextPriority int + + for _, statement := range statements { + parsed, err := parseStatement(statement) + if err != nil { + return inferredContext, err + } + + for _, p := range getParsedStatementPaths(parsed) { + pathContextPriority, ok := s.contextPriority[p.Context] + if !ok { + // Lowest priority + pathContextPriority = math.MaxInt + } + + if inferredContext == "" || pathContextPriority < inferredContextPriority { + inferredContext = p.Context + inferredContextPriority = pathContextPriority + } + } + } + + return inferredContext, nil +} + +// defaultPriorityContextInferrer is like newPriorityContextInferrer, but using the default +// context priorities and ignoring unknown/non-prioritized contexts. +func defaultPriorityContextInferrer() contextInferrer { + return newPriorityContextInferrer(defaultContextInferPriority) +} + +// newPriorityContextInferrer creates a new priority-based context inferrer. +// To infer the context, it compares all [ottl.Path.Context] values, prioritizing them based +// on the provide contextsPriority argument, the lower the context position is in the array, +// the more priority it will have over other items. +// If unknown/non-prioritized contexts are found on the statements, they can be either ignored +// or considered when no other prioritized context is found. To skip unknown contexts, the +// ignoreUnknownContext argument must be set to false. +func newPriorityContextInferrer(contextsPriority []string) contextInferrer { + contextPriority := make(map[string]int, len(contextsPriority)) + for i, ctx := range contextsPriority { + contextPriority[ctx] = i + } + return &priorityContextInferrer{ + contextPriority: contextPriority, + } +} diff --git a/pkg/ottl/context_inferrer_test.go b/pkg/ottl/context_inferrer_test.go new file mode 100644 index 000000000000..4d4455dd0dcf --- /dev/null +++ b/pkg/ottl/context_inferrer_test.go @@ -0,0 +1,89 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottl + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func Test_NewPriorityContextInferrer_Infer(t *testing.T) { + tests := []struct { + name string + priority []string + statements []string + expected string + }{ + { + name: "with priority and contexts", + priority: []string{"spanevent", "span", "resource"}, + statements: []string{"set(span.foo, resource.value) where spanevent.bar == true"}, + expected: "spanevent", + }, + { + name: "with multiple statements", + priority: []string{"spanevent", "span", "resource"}, + statements: []string{ + "set(resource.foo, resource.value) where span.bar == true", + "set(resource.foo, resource.value) where spanevent.bar == true", + }, + expected: "spanevent", + }, + { + name: "with no context", + priority: []string{"log", "resource"}, + statements: []string{"set(foo, true) where bar == true"}, + expected: "", + }, + { + name: "with empty priority", + statements: []string{"set(foo.name, true) where bar.name == true"}, + expected: "foo", + }, + { + name: "with unknown context", + priority: []string{"foo", "bar"}, + statements: []string{"set(span.foo, true) where span.bar == true"}, + expected: "span", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + inferrer := newPriorityContextInferrer(tt.priority) + inferredContext, err := inferrer.infer(tt.statements) + require.NoError(t, err) + assert.Equal(t, tt.expected, inferredContext) + }) + } +} + +func Test_NewPriorityContextInferrer_InvalidStatement(t *testing.T) { + inferrer := newPriorityContextInferrer([]string{"foo"}) + statements := []string{"set(foo.field,"} + _, err := inferrer.infer(statements) + require.ErrorContains(t, err, "unexpected token") +} + +func Test_DefaultPriorityContextInferrer(t *testing.T) { + expectedPriority := []string{ + "log", + "metric", + "datapoint", + "spanevent", + "span", + "resource", + "scope", + "instrumentation_scope", + } + + inferrer := defaultPriorityContextInferrer().(*priorityContextInferrer) + require.NotNil(t, inferrer) + + for pri, ctx := range expectedPriority { + require.Equal(t, pri, inferrer.contextPriority[ctx]) + } +} diff --git a/pkg/ottl/contexts/internal/logging/logging.go b/pkg/ottl/contexts/internal/logging/logging.go new file mode 100644 index 000000000000..4837506d55d9 --- /dev/null +++ b/pkg/ottl/contexts/internal/logging/logging.go @@ -0,0 +1,390 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package logging // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/internal/logging" + +import ( + "encoding/hex" + "errors" + + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/pmetric" + "go.opentelemetry.io/collector/pdata/ptrace" + "go.uber.org/zap/zapcore" +) + +type Slice pcommon.Slice + +func (s Slice) MarshalLogArray(encoder zapcore.ArrayEncoder) error { + ss := pcommon.Slice(s) + var err error + for i := 0; i < ss.Len(); i++ { + v := ss.At(i) + switch v.Type() { + case pcommon.ValueTypeStr: + encoder.AppendString(v.Str()) + case pcommon.ValueTypeBool: + encoder.AppendBool(v.Bool()) + case pcommon.ValueTypeInt: + encoder.AppendInt64(v.Int()) + case pcommon.ValueTypeDouble: + encoder.AppendFloat64(v.Double()) + case pcommon.ValueTypeMap: + err = errors.Join(err, encoder.AppendObject(Map(v.Map()))) + case pcommon.ValueTypeSlice: + err = errors.Join(err, encoder.AppendArray(Slice(v.Slice()))) + case pcommon.ValueTypeBytes: + encoder.AppendByteString(v.Bytes().AsRaw()) + } + } + return err +} + +type Map pcommon.Map + +func (m Map) MarshalLogObject(encoder zapcore.ObjectEncoder) error { + mm := pcommon.Map(m) + var err error + mm.Range(func(k string, v pcommon.Value) bool { + switch v.Type() { + case pcommon.ValueTypeStr: + encoder.AddString(k, v.Str()) + case pcommon.ValueTypeBool: + encoder.AddBool(k, v.Bool()) + case pcommon.ValueTypeInt: + encoder.AddInt64(k, v.Int()) + case pcommon.ValueTypeDouble: + encoder.AddFloat64(k, v.Double()) + case pcommon.ValueTypeMap: + err = errors.Join(err, encoder.AddObject(k, Map(v.Map()))) + case pcommon.ValueTypeSlice: + err = errors.Join(err, encoder.AddArray(k, Slice(v.Slice()))) + case pcommon.ValueTypeBytes: + encoder.AddByteString(k, v.Bytes().AsRaw()) + } + return true + }) + return nil +} + +type Resource pcommon.Resource + +func (r Resource) MarshalLogObject(encoder zapcore.ObjectEncoder) error { + rr := pcommon.Resource(r) + err := encoder.AddObject("attributes", Map(rr.Attributes())) + encoder.AddUint32("dropped_attribute_count", rr.DroppedAttributesCount()) + return err +} + +type InstrumentationScope pcommon.InstrumentationScope + +func (i InstrumentationScope) MarshalLogObject(encoder zapcore.ObjectEncoder) error { + is := pcommon.InstrumentationScope(i) + err := encoder.AddObject("attributes", Map(is.Attributes())) + encoder.AddUint32("dropped_attribute_count", is.DroppedAttributesCount()) + encoder.AddString("name", is.Name()) + encoder.AddString("version", is.Version()) + return err +} + +type Span ptrace.Span + +func (s Span) MarshalLogObject(encoder zapcore.ObjectEncoder) error { + ss := ptrace.Span(s) + parentSpanID := ss.ParentSpanID() + spanID := ss.SpanID() + traceID := ss.TraceID() + err := encoder.AddObject("attributes", Map(ss.Attributes())) + encoder.AddUint32("dropped_attribute_count", ss.DroppedAttributesCount()) + encoder.AddUint32("dropped_events_count", ss.DroppedEventsCount()) + encoder.AddUint32("dropped_links_count", ss.DroppedLinksCount()) + encoder.AddUint64("end_time_unix_nano", uint64(ss.EndTimestamp())) + err = errors.Join(err, encoder.AddArray("events", SpanEventSlice(ss.Events()))) + encoder.AddString("kind", ss.Kind().String()) + err = errors.Join(err, encoder.AddArray("links", SpanLinkSlice(ss.Links()))) + encoder.AddString("name", ss.Name()) + encoder.AddString("parent_span_id", hex.EncodeToString(parentSpanID[:])) + encoder.AddString("span_id", hex.EncodeToString(spanID[:])) + encoder.AddUint64("start_time_unix_nano", uint64(ss.StartTimestamp())) + encoder.AddString("status.code", ss.Status().Code().String()) + encoder.AddString("status.message", ss.Status().Message()) + encoder.AddString("trace_id", hex.EncodeToString(traceID[:])) + encoder.AddString("trace_state", ss.TraceState().AsRaw()) + return err +} + +type SpanEventSlice ptrace.SpanEventSlice + +func (s SpanEventSlice) MarshalLogArray(encoder zapcore.ArrayEncoder) error { + ses := ptrace.SpanEventSlice(s) + var err error + for i := 0; i < ses.Len(); i++ { + err = errors.Join(err, encoder.AppendObject(SpanEvent(ses.At(i)))) + } + return err +} + +type SpanEvent ptrace.SpanEvent + +func (s SpanEvent) MarshalLogObject(encoder zapcore.ObjectEncoder) error { + se := ptrace.SpanEvent(s) + err := encoder.AddObject("attributes", Map(se.Attributes())) + encoder.AddUint32("dropped_attribute_count", se.DroppedAttributesCount()) + encoder.AddString("name", se.Name()) + encoder.AddUint64("time_unix_nano", uint64(se.Timestamp())) + return err +} + +type SpanLinkSlice ptrace.SpanLinkSlice + +func (s SpanLinkSlice) MarshalLogArray(encoder zapcore.ArrayEncoder) error { + sls := ptrace.SpanLinkSlice(s) + var err error + for i := 0; i < sls.Len(); i++ { + err = errors.Join(err, encoder.AppendObject(SpanLink(sls.At(i)))) + } + return err +} + +type SpanLink ptrace.SpanLink + +func (s SpanLink) MarshalLogObject(encoder zapcore.ObjectEncoder) error { + sl := ptrace.SpanLink(s) + spanID := sl.SpanID() + traceID := sl.TraceID() + err := encoder.AddObject("attributes", Map(sl.Attributes())) + encoder.AddUint32("dropped_attribute_count", sl.DroppedAttributesCount()) + encoder.AddUint32("flags", sl.Flags()) + encoder.AddString("span_id", hex.EncodeToString(spanID[:])) + encoder.AddString("trace_id", hex.EncodeToString(traceID[:])) + encoder.AddString("trace_state", sl.TraceState().AsRaw()) + return err +} + +type Metric pmetric.Metric + +func (m Metric) MarshalLogObject(encoder zapcore.ObjectEncoder) error { + mm := pmetric.Metric(m) + encoder.AddString("description", mm.Description()) + encoder.AddString("name", mm.Name()) + encoder.AddString("unit", mm.Unit()) + encoder.AddString("type", mm.Type().String()) + + var err error + switch mm.Type() { + case pmetric.MetricTypeSum: + encoder.AddString("aggregation_temporality", mm.Sum().AggregationTemporality().String()) + encoder.AddBool("is_monotonic", mm.Sum().IsMonotonic()) + err = encoder.AddArray("datapoints", NumberDataPointSlice(mm.Sum().DataPoints())) + case pmetric.MetricTypeGauge: + err = encoder.AddArray("datapoints", NumberDataPointSlice(mm.Gauge().DataPoints())) + case pmetric.MetricTypeHistogram: + encoder.AddString("aggregation_temporality", mm.Histogram().AggregationTemporality().String()) + err = encoder.AddArray("datapoints", HistogramDataPointSlice(mm.Histogram().DataPoints())) + case pmetric.MetricTypeExponentialHistogram: + encoder.AddString("aggregation_temporality", mm.ExponentialHistogram().AggregationTemporality().String()) + err = encoder.AddArray("datapoints", ExponentialHistogramDataPointSlice(mm.ExponentialHistogram().DataPoints())) + case pmetric.MetricTypeSummary: + err = encoder.AddArray("datapoints", SummaryDataPointSlice(mm.Summary().DataPoints())) + } + + return err +} + +type NumberDataPointSlice pmetric.NumberDataPointSlice + +func (n NumberDataPointSlice) MarshalLogArray(encoder zapcore.ArrayEncoder) error { + ndps := pmetric.NumberDataPointSlice(n) + var err error + for i := 0; i < ndps.Len(); i++ { + err = errors.Join(err, encoder.AppendObject(NumberDataPoint(ndps.At(i)))) + } + return err +} + +type NumberDataPoint pmetric.NumberDataPoint + +func (n NumberDataPoint) MarshalLogObject(encoder zapcore.ObjectEncoder) error { + ndp := pmetric.NumberDataPoint(n) + err := encoder.AddObject("attributes", Map(ndp.Attributes())) + err = errors.Join(err, encoder.AddArray("exemplars", ExemplarSlice(ndp.Exemplars()))) + encoder.AddUint32("flags", uint32(ndp.Flags())) + encoder.AddUint64("start_time_unix_nano", uint64(ndp.StartTimestamp())) + encoder.AddUint64("time_unix_nano", uint64(ndp.Timestamp())) + if ndp.ValueType() == pmetric.NumberDataPointValueTypeInt { + encoder.AddInt64("value_int", ndp.IntValue()) + } + if ndp.ValueType() == pmetric.NumberDataPointValueTypeDouble { + encoder.AddFloat64("value_double", ndp.DoubleValue()) + } + + return err +} + +type HistogramDataPointSlice pmetric.HistogramDataPointSlice + +func (h HistogramDataPointSlice) MarshalLogArray(encoder zapcore.ArrayEncoder) error { + hdps := pmetric.HistogramDataPointSlice(h) + var err error + for i := 0; i < hdps.Len(); i++ { + err = errors.Join(err, encoder.AppendObject(HistogramDataPoint(hdps.At(i)))) + } + return err +} + +type HistogramDataPoint pmetric.HistogramDataPoint + +func (h HistogramDataPoint) MarshalLogObject(encoder zapcore.ObjectEncoder) error { + hdp := pmetric.HistogramDataPoint(h) + err := encoder.AddObject("attributes", Map(hdp.Attributes())) + err = errors.Join(err, encoder.AddArray("bucket_counts", UInt64Slice(hdp.BucketCounts()))) + encoder.AddUint64("count", hdp.Count()) + err = errors.Join(err, encoder.AddArray("exemplars", ExemplarSlice(hdp.Exemplars()))) + err = errors.Join(err, encoder.AddArray("explicit_bounds", Float64Slice(hdp.ExplicitBounds()))) + encoder.AddUint32("flags", uint32(hdp.Flags())) + encoder.AddFloat64("max", hdp.Max()) + encoder.AddFloat64("min", hdp.Min()) + encoder.AddUint64("start_time_unix_nano", uint64(hdp.StartTimestamp())) + encoder.AddFloat64("sum", hdp.Sum()) + encoder.AddUint64("time_unix_nano", uint64(hdp.Timestamp())) + + return err +} + +type ExponentialHistogramDataPointSlice pmetric.ExponentialHistogramDataPointSlice + +func (e ExponentialHistogramDataPointSlice) MarshalLogArray(encoder zapcore.ArrayEncoder) error { + ehdps := pmetric.ExponentialHistogramDataPointSlice(e) + var err error + for i := 0; i < ehdps.Len(); i++ { + err = errors.Join(err, encoder.AppendObject(ExponentialHistogramDataPoint(ehdps.At(i)))) + } + return err +} + +type ExponentialHistogramDataPoint pmetric.ExponentialHistogramDataPoint + +func (e ExponentialHistogramDataPoint) MarshalLogObject(encoder zapcore.ObjectEncoder) error { + ehdp := pmetric.ExponentialHistogramDataPoint(e) + err := encoder.AddObject("attributes", Map(ehdp.Attributes())) + encoder.AddUint64("count", ehdp.Count()) + err = errors.Join(err, encoder.AddArray("exemplars", ExemplarSlice(ehdp.Exemplars()))) + encoder.AddUint32("flags", uint32(ehdp.Flags())) + encoder.AddFloat64("max", ehdp.Max()) + encoder.AddFloat64("min", ehdp.Min()) + err = errors.Join(err, encoder.AddObject("negative", ExponentialHistogramDataPointBuckets(ehdp.Negative()))) + err = errors.Join(err, encoder.AddObject("positive", ExponentialHistogramDataPointBuckets(ehdp.Positive()))) + encoder.AddInt32("scale", ehdp.Scale()) + encoder.AddUint64("start_time_unix_nano", uint64(ehdp.StartTimestamp())) + encoder.AddFloat64("sum", ehdp.Sum()) + encoder.AddUint64("time_unix_nano", uint64(ehdp.Timestamp())) + encoder.AddUint64("zero_count", ehdp.ZeroCount()) + encoder.AddFloat64("zero_threshold", ehdp.ZeroThreshold()) + return err +} + +type ExponentialHistogramDataPointBuckets pmetric.ExponentialHistogramDataPointBuckets + +func (e ExponentialHistogramDataPointBuckets) MarshalLogObject(encoder zapcore.ObjectEncoder) error { + b := pmetric.ExponentialHistogramDataPointBuckets(e) + err := encoder.AddArray("bucket_counts", UInt64Slice(b.BucketCounts())) + encoder.AddInt32("offset", b.Offset()) + return err +} + +type SummaryDataPointSlice pmetric.SummaryDataPointSlice + +func (s SummaryDataPointSlice) MarshalLogArray(encoder zapcore.ArrayEncoder) error { + sdps := pmetric.SummaryDataPointSlice(s) + var err error + for i := 0; i < sdps.Len(); i++ { + err = errors.Join(err, encoder.AppendObject(SummaryDataPoint(sdps.At(i)))) + } + return err +} + +type SummaryDataPoint pmetric.SummaryDataPoint + +func (s SummaryDataPoint) MarshalLogObject(encoder zapcore.ObjectEncoder) error { + sdp := pmetric.SummaryDataPoint(s) + err := encoder.AddObject("attributes", Map(sdp.Attributes())) + encoder.AddUint64("count", sdp.Count()) + encoder.AddUint32("flags", uint32(sdp.Flags())) + encoder.AddUint64("start_time_unix_nano", uint64(sdp.StartTimestamp())) + encoder.AddFloat64("sum", sdp.Sum()) + encoder.AddUint64("time_unix_nano", uint64(sdp.Timestamp())) + err = errors.Join(err, encoder.AddArray("quantile_values", SummaryDataPointValueAtQuantileSlice(sdp.QuantileValues()))) + + return err +} + +type SummaryDataPointValueAtQuantileSlice pmetric.SummaryDataPointValueAtQuantileSlice + +func (s SummaryDataPointValueAtQuantileSlice) MarshalLogArray(encoder zapcore.ArrayEncoder) error { + qs := pmetric.SummaryDataPointValueAtQuantileSlice(s) + var err error + for i := 0; i < qs.Len(); i++ { + err = errors.Join(err, encoder.AppendObject(SummaryDataPointValueAtQuantile(qs.At(i)))) + } + return nil +} + +type SummaryDataPointValueAtQuantile pmetric.SummaryDataPointValueAtQuantile + +func (s SummaryDataPointValueAtQuantile) MarshalLogObject(encoder zapcore.ObjectEncoder) error { + q := pmetric.SummaryDataPointValueAtQuantile(s) + encoder.AddFloat64("value", q.Value()) + encoder.AddFloat64("quantile", q.Quantile()) + return nil +} + +type UInt64Slice pcommon.UInt64Slice + +func (u UInt64Slice) MarshalLogArray(encoder zapcore.ArrayEncoder) error { + uis := pcommon.UInt64Slice(u) + for i := 0; i < uis.Len(); i++ { + encoder.AppendUint64(uis.At(i)) + } + return nil +} + +type Float64Slice pcommon.Float64Slice + +func (f Float64Slice) MarshalLogArray(encoder zapcore.ArrayEncoder) error { + fs := pcommon.Float64Slice(f) + for i := 0; i < fs.Len(); i++ { + encoder.AppendFloat64(fs.At(i)) + } + return nil +} + +type ExemplarSlice pmetric.ExemplarSlice + +func (e ExemplarSlice) MarshalLogArray(encoder zapcore.ArrayEncoder) error { + es := pmetric.ExemplarSlice(e) + var err error + for i := 0; i < es.Len(); i++ { + ee := es.At(i) + err = errors.Join(err, encoder.AppendObject(Exemplar(ee))) + } + return err +} + +type Exemplar pmetric.Exemplar + +func (e Exemplar) MarshalLogObject(encoder zapcore.ObjectEncoder) error { + ee := pmetric.Exemplar(e) + spanID := ee.SpanID() + traceID := ee.TraceID() + err := encoder.AddObject("filtered_attributes", Map(ee.FilteredAttributes())) + encoder.AddString("span_id", hex.EncodeToString(spanID[:])) + encoder.AddUint64("time_unix_nano", uint64(ee.Timestamp())) + encoder.AddString("trace_id", hex.EncodeToString(traceID[:])) + if ee.ValueType() == pmetric.ExemplarValueTypeInt { + encoder.AddInt64("value_int", ee.IntValue()) + } + if ee.ValueType() == pmetric.ExemplarValueTypeDouble { + encoder.AddFloat64("value_double", ee.DoubleValue()) + } + return err +} diff --git a/pkg/ottl/contexts/internal/logging/logging_test.go b/pkg/ottl/contexts/internal/logging/logging_test.go new file mode 100644 index 000000000000..34a3e71f7718 --- /dev/null +++ b/pkg/ottl/contexts/internal/logging/logging_test.go @@ -0,0 +1,4 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package logging diff --git a/pkg/ottl/contexts/internal/metric_test.go b/pkg/ottl/contexts/internal/metric_test.go index 3165f818ff8d..b259b70b52f9 100644 --- a/pkg/ottl/contexts/internal/metric_test.go +++ b/pkg/ottl/contexts/internal/metric_test.go @@ -14,7 +14,6 @@ import ( ) func Test_MetricPathGetSetter(t *testing.T) { - refMetric := createMetricTelemetry() newMetric := pmetric.NewMetric() diff --git a/pkg/ottl/contexts/internal/path.go b/pkg/ottl/contexts/internal/path.go index c7d9d802b664..954d14329646 100644 --- a/pkg/ottl/contexts/internal/path.go +++ b/pkg/ottl/contexts/internal/path.go @@ -12,6 +12,7 @@ import ( var _ ottl.Path[any] = &TestPath[any]{} type TestPath[K any] struct { + C string N string KeySlice []ottl.Key[K] NextPath *TestPath[K] @@ -21,6 +22,10 @@ func (p *TestPath[K]) Name() string { return p.N } +func (p *TestPath[K]) Context() string { + return p.C +} + func (p *TestPath[K]) Next() ottl.Path[K] { if p.NextPath == nil { return nil diff --git a/pkg/ottl/contexts/internal/resource.go b/pkg/ottl/contexts/internal/resource.go index 6e86ae81dd93..2dfee7fce9f8 100644 --- a/pkg/ottl/contexts/internal/resource.go +++ b/pkg/ottl/contexts/internal/resource.go @@ -13,6 +13,7 @@ import ( type ResourceContext interface { GetResource() pcommon.Resource + GetResourceSchemaURLItem() SchemaURLItem } func ResourcePathGetSetter[K ResourceContext](path ottl.Path[K]) (ottl.GetSetter[K], error) { @@ -27,6 +28,8 @@ func ResourcePathGetSetter[K ResourceContext](path ottl.Path[K]) (ottl.GetSetter return accessResourceAttributesKey[K](path.Keys()), nil case "dropped_attributes_count": return accessResourceDroppedAttributesCount[K](), nil + case "schema_url": + return accessResourceSchemaURLItem[K](), nil default: return nil, FormatDefaultErrorMessage(path.Name(), path.String(), "Resource", ResourceContextRef) } @@ -84,3 +87,17 @@ func accessResourceDroppedAttributesCount[K ResourceContext]() ottl.StandardGetS }, } } + +func accessResourceSchemaURLItem[K ResourceContext]() ottl.StandardGetSetter[K] { + return ottl.StandardGetSetter[K]{ + Getter: func(_ context.Context, tCtx K) (any, error) { + return tCtx.GetResourceSchemaURLItem().SchemaUrl(), nil + }, + Setter: func(_ context.Context, tCtx K, val any) error { + if schemaURL, ok := val.(string); ok { + tCtx.GetResourceSchemaURLItem().SetSchemaUrl(schemaURL) + } + return nil + }, + } +} diff --git a/pkg/ottl/contexts/internal/resource_test.go b/pkg/ottl/contexts/internal/resource_test.go index ffc7425701aa..71100ec95122 100644 --- a/pkg/ottl/contexts/internal/resource_test.go +++ b/pkg/ottl/contexts/internal/resource_test.go @@ -17,6 +17,7 @@ import ( func TestResourcePathGetSetter(t *testing.T) { refResource := createResource() + refResourceContext := newResourceContext(refResource) newAttrs := pcommon.NewMap() newAttrs.PutStr("hello", "world") @@ -36,6 +37,17 @@ func TestResourcePathGetSetter(t *testing.T) { pcommon.NewResource().CopyTo(resource) }, }, + { + name: "resource schema_url", + path: &TestPath[*resourceContext]{ + N: "schema_url", + }, + orig: refResourceContext.GetResourceSchemaURLItem().SchemaUrl(), + newVal: "new_schema_url", + modified: func(_ pcommon.Resource) { + refResourceContext.GetResourceSchemaURLItem().SetSchemaUrl("new_schema_url") + }, + }, { name: "attributes", path: &TestPath[*resourceContext]{ @@ -370,14 +382,40 @@ func createResource() pcommon.Resource { return resource } +type TestResourceSchemaURLItem struct { + schemaURL string +} + +//revive:disable:var-naming This must implement the SchemaURL interface. +func (t *TestResourceSchemaURLItem) SchemaUrl() string { + return t.schemaURL +} + +func (t *TestResourceSchemaURLItem) SetSchemaUrl(v string) { + t.schemaURL = v +} + +//revive:enable:var-naming + +func createResourceSchemaURLItem() SchemaURLItem { + return &TestResourceSchemaURLItem{ + schemaURL: "schema_url", + } +} + type resourceContext struct { - resource pcommon.Resource + resource pcommon.Resource + schemaURLItem SchemaURLItem } func (r *resourceContext) GetResource() pcommon.Resource { return r.resource } +func (r *resourceContext) GetResourceSchemaURLItem() SchemaURLItem { + return r.schemaURLItem +} + func newResourceContext(resource pcommon.Resource) *resourceContext { - return &resourceContext{resource: resource} + return &resourceContext{resource: resource, schemaURLItem: createResourceSchemaURLItem()} } diff --git a/pkg/ottl/contexts/internal/schema.go b/pkg/ottl/contexts/internal/schema.go new file mode 100644 index 000000000000..c5b6702200e5 --- /dev/null +++ b/pkg/ottl/contexts/internal/schema.go @@ -0,0 +1,11 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 +package internal // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/internal" + +//revive:disable:var-naming The methods in this interface are defined by pdata types. +type SchemaURLItem interface { + SchemaUrl() string + SetSchemaUrl(v string) +} + +//revive:enable:var-naming diff --git a/pkg/ottl/contexts/internal/scope.go b/pkg/ottl/contexts/internal/scope.go index f207106c42f6..6bc5d7352005 100644 --- a/pkg/ottl/contexts/internal/scope.go +++ b/pkg/ottl/contexts/internal/scope.go @@ -13,6 +13,7 @@ import ( type InstrumentationScopeContext interface { GetInstrumentationScope() pcommon.InstrumentationScope + GetScopeSchemaURLItem() SchemaURLItem } func ScopePathGetSetter[K InstrumentationScopeContext](path ottl.Path[K]) (ottl.GetSetter[K], error) { @@ -32,6 +33,8 @@ func ScopePathGetSetter[K InstrumentationScopeContext](path ottl.Path[K]) (ottl. return accessInstrumentationScopeAttributesKey[K](mapKeys), nil case "dropped_attributes_count": return accessInstrumentationScopeDroppedAttributesCount[K](), nil + case "schema_url": + return accessInstrumentationScopeSchemaURLItem[K](), nil default: return nil, FormatDefaultErrorMessage(path.Name(), path.String(), "Instrumentation Scope", InstrumentationScopeRef) } @@ -117,3 +120,17 @@ func accessInstrumentationScopeDroppedAttributesCount[K InstrumentationScopeCont }, } } + +func accessInstrumentationScopeSchemaURLItem[K InstrumentationScopeContext]() ottl.StandardGetSetter[K] { + return ottl.StandardGetSetter[K]{ + Getter: func(_ context.Context, tCtx K) (any, error) { + return tCtx.GetScopeSchemaURLItem().SchemaUrl(), nil + }, + Setter: func(_ context.Context, tCtx K, val any) error { + if schemaURL, ok := val.(string); ok { + tCtx.GetScopeSchemaURLItem().SetSchemaUrl(schemaURL) + } + return nil + }, + } +} diff --git a/pkg/ottl/contexts/internal/scope_test.go b/pkg/ottl/contexts/internal/scope_test.go index 04882efac3f3..1f9837fc8d2b 100644 --- a/pkg/ottl/contexts/internal/scope_test.go +++ b/pkg/ottl/contexts/internal/scope_test.go @@ -17,6 +17,7 @@ import ( func TestScopePathGetSetter(t *testing.T) { refIS := createInstrumentationScope() + refISC := newInstrumentationScopeContext(refIS) newAttrs := pcommon.NewMap() newAttrs.PutStr("hello", "world") tests := []struct { @@ -57,6 +58,17 @@ func TestScopePathGetSetter(t *testing.T) { is.SetVersion("next") }, }, + { + name: "instrumentation_scope schema_url", + path: &TestPath[*instrumentationScopeContext]{ + N: "schema_url", + }, + orig: refISC.GetScopeSchemaURLItem().SchemaUrl(), + newVal: "new_schema_url", + modified: func(_ pcommon.InstrumentationScope) { + refISC.GetScopeSchemaURLItem().SetSchemaUrl("new_schema_url") + }, + }, { name: "attributes", path: &TestPath[*instrumentationScopeContext]{ @@ -394,14 +406,40 @@ func createInstrumentationScope() pcommon.InstrumentationScope { return is } +type TestSchemaURLItem struct { + schemaURL string +} + +//revive:disable:var-naming This must implement the SchemaURL interface. +func (t *TestSchemaURLItem) SchemaUrl() string { + return t.schemaURL +} + +func (t *TestSchemaURLItem) SetSchemaUrl(v string) { + t.schemaURL = v +} + +//revive:enable:var-naming + +func createSchemaURLItem() SchemaURLItem { + return &TestSchemaURLItem{ + schemaURL: "schema_url", + } +} + type instrumentationScopeContext struct { - is pcommon.InstrumentationScope + is pcommon.InstrumentationScope + schemaURLItem SchemaURLItem } func (r *instrumentationScopeContext) GetInstrumentationScope() pcommon.InstrumentationScope { return r.is } +func (r *instrumentationScopeContext) GetScopeSchemaURLItem() SchemaURLItem { + return r.schemaURLItem +} + func newInstrumentationScopeContext(is pcommon.InstrumentationScope) *instrumentationScopeContext { - return &instrumentationScopeContext{is: is} + return &instrumentationScopeContext{is: is, schemaURLItem: createSchemaURLItem()} } diff --git a/pkg/ottl/contexts/ottldatapoint/datapoint.go b/pkg/ottl/contexts/ottldatapoint/datapoint.go index 6d55fa91ad65..9c50d85cd723 100644 --- a/pkg/ottl/contexts/ottldatapoint/datapoint.go +++ b/pkg/ottl/contexts/ottldatapoint/datapoint.go @@ -5,23 +5,29 @@ package ottldatapoint // import "github.com/open-telemetry/opentelemetry-collect import ( "context" + "errors" "fmt" "time" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" + "go.uber.org/zap/zapcore" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/internal" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/internal/logging" ) const ( contextName = "DataPoint" ) -var _ internal.ResourceContext = TransformContext{} -var _ internal.InstrumentationScopeContext = TransformContext{} +var ( + _ internal.ResourceContext = (*TransformContext)(nil) + _ internal.InstrumentationScopeContext = (*TransformContext)(nil) + _ zapcore.ObjectMarshaler = (*TransformContext)(nil) +) type TransformContext struct { dataPoint any @@ -30,11 +36,33 @@ type TransformContext struct { instrumentationScope pcommon.InstrumentationScope resource pcommon.Resource cache pcommon.Map + scopeMetrics pmetric.ScopeMetrics + resourceMetrics pmetric.ResourceMetrics +} + +func (tCtx TransformContext) MarshalLogObject(encoder zapcore.ObjectEncoder) error { + err := encoder.AddObject("resource", logging.Resource(tCtx.resource)) + err = errors.Join(err, encoder.AddObject("scope", logging.InstrumentationScope(tCtx.instrumentationScope))) + err = errors.Join(err, encoder.AddObject("metric", logging.Metric(tCtx.metric))) + + switch dp := tCtx.dataPoint.(type) { + case pmetric.NumberDataPoint: + err = encoder.AddObject("datapoint", logging.NumberDataPoint(dp)) + case pmetric.HistogramDataPoint: + err = encoder.AddObject("datapoint", logging.HistogramDataPoint(dp)) + case pmetric.ExponentialHistogramDataPoint: + err = encoder.AddObject("datapoint", logging.ExponentialHistogramDataPoint(dp)) + case pmetric.SummaryDataPoint: + err = encoder.AddObject("datapoint", logging.SummaryDataPoint(dp)) + } + + err = errors.Join(err, encoder.AddObject("cache", logging.Map(tCtx.cache))) + return err } type Option func(*ottl.Parser[TransformContext]) -func NewTransformContext(dataPoint any, metric pmetric.Metric, metrics pmetric.MetricSlice, instrumentationScope pcommon.InstrumentationScope, resource pcommon.Resource) TransformContext { +func NewTransformContext(dataPoint any, metric pmetric.Metric, metrics pmetric.MetricSlice, instrumentationScope pcommon.InstrumentationScope, resource pcommon.Resource, scopeMetrics pmetric.ScopeMetrics, resourceMetrics pmetric.ResourceMetrics) TransformContext { return TransformContext{ dataPoint: dataPoint, metric: metric, @@ -42,6 +70,8 @@ func NewTransformContext(dataPoint any, metric pmetric.Metric, metrics pmetric.M instrumentationScope: instrumentationScope, resource: resource, cache: pcommon.NewMap(), + scopeMetrics: scopeMetrics, + resourceMetrics: resourceMetrics, } } @@ -69,6 +99,14 @@ func (tCtx TransformContext) getCache() pcommon.Map { return tCtx.cache } +func (tCtx TransformContext) GetScopeSchemaURLItem() internal.SchemaURLItem { + return tCtx.scopeMetrics +} + +func (tCtx TransformContext) GetResourceSchemaURLItem() internal.SchemaURLItem { + return tCtx.resourceMetrics +} + func NewParser(functions map[string]ottl.Factory[TransformContext], telemetrySettings component.TelemetrySettings, options ...Option) (ottl.Parser[TransformContext], error) { pep := pathExpressionParser{telemetrySettings} p, err := ottl.NewParser[TransformContext]( diff --git a/pkg/ottl/contexts/ottldatapoint/datapoint_test.go b/pkg/ottl/contexts/ottldatapoint/datapoint_test.go index d25d7746098d..1da5f4309e0a 100644 --- a/pkg/ottl/contexts/ottldatapoint/datapoint_test.go +++ b/pkg/ottl/contexts/ottldatapoint/datapoint_test.go @@ -65,7 +65,7 @@ func Test_newPathGetSetter_Cache(t *testing.T) { numberDataPoint := createNumberDataPointTelemetry(tt.valueType) - ctx := NewTransformContext(numberDataPoint, pmetric.NewMetric(), pmetric.NewMetricSlice(), pcommon.NewInstrumentationScope(), pcommon.NewResource()) + ctx := NewTransformContext(numberDataPoint, pmetric.NewMetric(), pmetric.NewMetricSlice(), pcommon.NewInstrumentationScope(), pcommon.NewResource(), pmetric.NewScopeMetrics(), pmetric.NewResourceMetrics()) got, err := accessor.Get(context.Background(), ctx) assert.NoError(t, err) @@ -483,7 +483,7 @@ func Test_newPathGetSetter_NumberDataPoint(t *testing.T) { numberDataPoint := createNumberDataPointTelemetry(tt.valueType) - ctx := NewTransformContext(numberDataPoint, pmetric.NewMetric(), pmetric.NewMetricSlice(), pcommon.NewInstrumentationScope(), pcommon.NewResource()) + ctx := NewTransformContext(numberDataPoint, pmetric.NewMetric(), pmetric.NewMetricSlice(), pcommon.NewInstrumentationScope(), pcommon.NewResource(), pmetric.NewScopeMetrics(), pmetric.NewResourceMetrics()) got, err := accessor.Get(context.Background(), ctx) assert.NoError(t, err) @@ -496,7 +496,6 @@ func Test_newPathGetSetter_NumberDataPoint(t *testing.T) { tt.modified(exNumberDataPoint) assert.Equal(t, exNumberDataPoint, numberDataPoint) - }) } } @@ -918,7 +917,7 @@ func Test_newPathGetSetter_HistogramDataPoint(t *testing.T) { histogramDataPoint := createHistogramDataPointTelemetry() - ctx := NewTransformContext(histogramDataPoint, pmetric.NewMetric(), pmetric.NewMetricSlice(), pcommon.NewInstrumentationScope(), pcommon.NewResource()) + ctx := NewTransformContext(histogramDataPoint, pmetric.NewMetric(), pmetric.NewMetricSlice(), pcommon.NewInstrumentationScope(), pcommon.NewResource(), pmetric.NewScopeMetrics(), pmetric.NewResourceMetrics()) got, err := accessor.Get(context.Background(), ctx) assert.NoError(t, err) @@ -1436,7 +1435,7 @@ func Test_newPathGetSetter_ExpoHistogramDataPoint(t *testing.T) { expoHistogramDataPoint := createExpoHistogramDataPointTelemetry() - ctx := NewTransformContext(expoHistogramDataPoint, pmetric.NewMetric(), pmetric.NewMetricSlice(), pcommon.NewInstrumentationScope(), pcommon.NewResource()) + ctx := NewTransformContext(expoHistogramDataPoint, pmetric.NewMetric(), pmetric.NewMetricSlice(), pcommon.NewInstrumentationScope(), pcommon.NewResource(), pmetric.NewScopeMetrics(), pmetric.NewResourceMetrics()) got, err := accessor.Get(context.Background(), ctx) assert.NoError(t, err) @@ -1855,7 +1854,7 @@ func Test_newPathGetSetter_SummaryDataPoint(t *testing.T) { summaryDataPoint := createSummaryDataPointTelemetry() - ctx := NewTransformContext(summaryDataPoint, pmetric.NewMetric(), pmetric.NewMetricSlice(), pcommon.NewInstrumentationScope(), pcommon.NewResource()) + ctx := NewTransformContext(summaryDataPoint, pmetric.NewMetric(), pmetric.NewMetricSlice(), pcommon.NewInstrumentationScope(), pcommon.NewResource(), pmetric.NewScopeMetrics(), pmetric.NewResourceMetrics()) got, err := accessor.Get(context.Background(), ctx) assert.NoError(t, err) @@ -2039,7 +2038,7 @@ func Test_newPathGetSetter_Metric(t *testing.T) { metric := createMetricTelemetry() - ctx := NewTransformContext(pmetric.NewNumberDataPoint(), metric, pmetric.NewMetricSlice(), pcommon.NewInstrumentationScope(), pcommon.NewResource()) + ctx := NewTransformContext(pmetric.NewNumberDataPoint(), metric, pmetric.NewMetricSlice(), pcommon.NewInstrumentationScope(), pcommon.NewResource(), pmetric.NewScopeMetrics(), pmetric.NewResourceMetrics()) got, err := accessor.Get(context.Background(), ctx) assert.NoError(t, err) @@ -2130,7 +2129,7 @@ func Test_ParseEnum(t *testing.T) { t.Run(tt.name, func(t *testing.T) { actual, err := parseEnum((*ottl.EnumSymbol)(ottltest.Strp(tt.name))) assert.NoError(t, err) - assert.Equal(t, *actual, tt.want) + assert.Equal(t, tt.want, *actual) }) } } diff --git a/pkg/ottl/contexts/ottllog/log.go b/pkg/ottl/contexts/ottllog/log.go index 3111268ecb06..7ca056730cc7 100644 --- a/pkg/ottl/contexts/ottllog/log.go +++ b/pkg/ottl/contexts/ottllog/log.go @@ -6,40 +6,77 @@ package ottllog // import "github.com/open-telemetry/opentelemetry-collector-con import ( "context" "encoding/hex" + "errors" "fmt" "time" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" + "go.uber.org/zap/zapcore" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/internal" - "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/internal/ottlcommon" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/internal/logging" + common "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/internal/ottlcommon" ) const ( contextName = "Log" ) -var _ internal.ResourceContext = TransformContext{} -var _ internal.InstrumentationScopeContext = TransformContext{} +var ( + _ internal.ResourceContext = (*TransformContext)(nil) + _ internal.InstrumentationScopeContext = (*TransformContext)(nil) + _ zapcore.ObjectMarshaler = (*TransformContext)(nil) +) type TransformContext struct { logRecord plog.LogRecord instrumentationScope pcommon.InstrumentationScope resource pcommon.Resource cache pcommon.Map + scopeLogs plog.ScopeLogs + resourceLogs plog.ResourceLogs +} + +type logRecord plog.LogRecord + +func (l logRecord) MarshalLogObject(encoder zapcore.ObjectEncoder) error { + lr := plog.LogRecord(l) + spanID := lr.SpanID() + traceID := lr.TraceID() + err := encoder.AddObject("attributes", logging.Map(lr.Attributes())) + encoder.AddString("body", lr.Body().AsString()) + encoder.AddUint32("dropped_attribute_count", lr.DroppedAttributesCount()) + encoder.AddUint32("flags", uint32(lr.Flags())) + encoder.AddUint64("observed_time_unix_nano", uint64(lr.ObservedTimestamp())) + encoder.AddInt32("severity_number", int32(lr.SeverityNumber())) + encoder.AddString("severity_text", lr.SeverityText()) + encoder.AddString("span_id", hex.EncodeToString(spanID[:])) + encoder.AddUint64("time_unix_nano", uint64(lr.Timestamp())) + encoder.AddString("trace_id", hex.EncodeToString(traceID[:])) + return err +} + +func (tCtx TransformContext) MarshalLogObject(encoder zapcore.ObjectEncoder) error { + err := encoder.AddObject("resource", logging.Resource(tCtx.resource)) + err = errors.Join(err, encoder.AddObject("scope", logging.InstrumentationScope(tCtx.instrumentationScope))) + err = errors.Join(err, encoder.AddObject("log_record", logRecord(tCtx.logRecord))) + err = errors.Join(err, encoder.AddObject("cache", logging.Map(tCtx.cache))) + return err } type Option func(*ottl.Parser[TransformContext]) -func NewTransformContext(logRecord plog.LogRecord, instrumentationScope pcommon.InstrumentationScope, resource pcommon.Resource) TransformContext { +func NewTransformContext(logRecord plog.LogRecord, instrumentationScope pcommon.InstrumentationScope, resource pcommon.Resource, scopeLogs plog.ScopeLogs, resourceLogs plog.ResourceLogs) TransformContext { return TransformContext{ logRecord: logRecord, instrumentationScope: instrumentationScope, resource: resource, cache: pcommon.NewMap(), + scopeLogs: scopeLogs, + resourceLogs: resourceLogs, } } @@ -59,6 +96,14 @@ func (tCtx TransformContext) getCache() pcommon.Map { return tCtx.cache } +func (tCtx TransformContext) GetScopeSchemaURLItem() internal.SchemaURLItem { + return tCtx.scopeLogs +} + +func (tCtx TransformContext) GetResourceSchemaURLItem() internal.SchemaURLItem { + return tCtx.resourceLogs +} + func NewParser(functions map[string]ottl.Factory[TransformContext], telemetrySettings component.TelemetrySettings, options ...Option) (ottl.Parser[TransformContext], error) { pep := pathExpressionParser{telemetrySettings} p, err := ottl.NewParser[TransformContext]( @@ -332,7 +377,7 @@ func accessSeverityText() ottl.StandardGetSetter[TransformContext] { func accessBody() ottl.StandardGetSetter[TransformContext] { return ottl.StandardGetSetter[TransformContext]{ Getter: func(_ context.Context, tCtx TransformContext) (any, error) { - return ottlcommon.GetValue(tCtx.GetLogRecord().Body()), nil + return common.GetValue(tCtx.GetLogRecord().Body()), nil }, Setter: func(_ context.Context, tCtx TransformContext, val any) error { return internal.SetValue(tCtx.GetLogRecord().Body(), val) diff --git a/pkg/ottl/contexts/ottllog/log_test.go b/pkg/ottl/contexts/ottllog/log_test.go index e85f9b03cc59..a4efc98091be 100644 --- a/pkg/ottl/contexts/ottllog/log_test.go +++ b/pkg/ottl/contexts/ottllog/log_test.go @@ -181,7 +181,6 @@ func Test_newPathGetSetter(t *testing.T) { fmt.Println(log.Body().Slice().At(0).AsString()) newBodySlice.CopyTo(log.Body().Slice()) fmt.Println(log.Body().Slice().At(0).AsString()) - }, bodyType: "slice", }, @@ -628,12 +627,12 @@ func Test_newPathGetSetter(t *testing.T) { log, il, resource := createTelemetry(tt.bodyType) - tCtx := NewTransformContext(log, il, resource) + tCtx := NewTransformContext(log, il, resource, plog.NewScopeLogs(), plog.NewResourceLogs()) got, err := accessor.Get(context.Background(), tCtx) assert.NoError(t, err) assert.Equal(t, tt.orig, got) - tCtx = NewTransformContext(log, il, resource) + tCtx = NewTransformContext(log, il, resource, plog.NewScopeLogs(), plog.NewResourceLogs()) err = accessor.Set(context.Background(), tCtx, tt.newVal) assert.NoError(t, err) @@ -736,11 +735,11 @@ func Test_InvalidBodyIndexing(t *testing.T) { log, il, resource := createTelemetry("string") - tCtx := NewTransformContext(log, il, resource) + tCtx := NewTransformContext(log, il, resource, plog.NewScopeLogs(), plog.NewResourceLogs()) _, err = accessor.Get(context.Background(), tCtx) assert.Error(t, err) - tCtx = NewTransformContext(log, il, resource) + tCtx = NewTransformContext(log, il, resource, plog.NewScopeLogs(), plog.NewResourceLogs()) err = accessor.Set(context.Background(), tCtx, nil) assert.Error(t, err) } @@ -855,7 +854,7 @@ func Test_ParseEnum(t *testing.T) { t.Run(tt.name, func(t *testing.T) { actual, err := parseEnum((*ottl.EnumSymbol)(ottltest.Strp(tt.name))) assert.NoError(t, err) - assert.Equal(t, *actual, tt.want) + assert.Equal(t, tt.want, *actual) }) } } diff --git a/pkg/ottl/contexts/ottlmetric/metrics.go b/pkg/ottl/contexts/ottlmetric/metrics.go index 964210d46564..eba931c74404 100644 --- a/pkg/ottl/contexts/ottlmetric/metrics.go +++ b/pkg/ottl/contexts/ottlmetric/metrics.go @@ -15,9 +15,11 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/internal" ) -var _ internal.ResourceContext = TransformContext{} -var _ internal.InstrumentationScopeContext = TransformContext{} -var _ internal.MetricContext = TransformContext{} +var ( + _ internal.ResourceContext = TransformContext{} + _ internal.InstrumentationScopeContext = TransformContext{} + _ internal.MetricContext = TransformContext{} +) type TransformContext struct { metric pmetric.Metric @@ -25,17 +27,21 @@ type TransformContext struct { instrumentationScope pcommon.InstrumentationScope resource pcommon.Resource cache pcommon.Map + scopeMetrics pmetric.ScopeMetrics + resourceMetrics pmetric.ResourceMetrics } type Option func(*ottl.Parser[TransformContext]) -func NewTransformContext(metric pmetric.Metric, metrics pmetric.MetricSlice, instrumentationScope pcommon.InstrumentationScope, resource pcommon.Resource) TransformContext { +func NewTransformContext(metric pmetric.Metric, metrics pmetric.MetricSlice, instrumentationScope pcommon.InstrumentationScope, resource pcommon.Resource, scopeMetrics pmetric.ScopeMetrics, resourceMetrics pmetric.ResourceMetrics) TransformContext { return TransformContext{ metric: metric, metrics: metrics, instrumentationScope: instrumentationScope, resource: resource, cache: pcommon.NewMap(), + scopeMetrics: scopeMetrics, + resourceMetrics: resourceMetrics, } } @@ -59,6 +65,14 @@ func (tCtx TransformContext) getCache() pcommon.Map { return tCtx.cache } +func (tCtx TransformContext) GetScopeSchemaURLItem() internal.SchemaURLItem { + return tCtx.scopeMetrics +} + +func (tCtx TransformContext) GetResourceSchemaURLItem() internal.SchemaURLItem { + return tCtx.resourceMetrics +} + func NewParser(functions map[string]ottl.Factory[TransformContext], telemetrySettings component.TelemetrySettings, options ...Option) (ottl.Parser[TransformContext], error) { pep := pathExpressionParser{telemetrySettings} p, err := ottl.NewParser[TransformContext]( diff --git a/pkg/ottl/contexts/ottlmetric/metrics_test.go b/pkg/ottl/contexts/ottlmetric/metrics_test.go index fb2bfb4b670a..f83ead9e3a4b 100644 --- a/pkg/ottl/contexts/ottlmetric/metrics_test.go +++ b/pkg/ottl/contexts/ottlmetric/metrics_test.go @@ -17,7 +17,6 @@ import ( ) func Test_newPathGetSetter(t *testing.T) { - refMetric := createMetricTelemetry() newCache := pcommon.NewMap() @@ -149,7 +148,7 @@ func Test_newPathGetSetter(t *testing.T) { metric := createMetricTelemetry() - ctx := NewTransformContext(metric, pmetric.NewMetricSlice(), pcommon.NewInstrumentationScope(), pcommon.NewResource()) + ctx := NewTransformContext(metric, pmetric.NewMetricSlice(), pcommon.NewInstrumentationScope(), pcommon.NewResource(), pmetric.NewScopeMetrics(), pmetric.NewResourceMetrics()) got, err := accessor.Get(context.Background(), ctx) assert.NoError(t, err) @@ -224,7 +223,7 @@ func Test_ParseEnum(t *testing.T) { t.Run(tt.name, func(t *testing.T) { actual, err := parseEnum((*ottl.EnumSymbol)(ottltest.Strp(tt.name))) assert.NoError(t, err) - assert.Equal(t, *actual, tt.want) + assert.Equal(t, tt.want, *actual) }) } } diff --git a/pkg/ottl/contexts/ottlresource/resource.go b/pkg/ottl/contexts/ottlresource/resource.go index e37440d9dbc2..da3a8ceea1b6 100644 --- a/pkg/ottl/contexts/ottlresource/resource.go +++ b/pkg/ottl/contexts/ottlresource/resource.go @@ -5,28 +5,42 @@ package ottlresource // import "github.com/open-telemetry/opentelemetry-collecto import ( "context" + "errors" "fmt" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/pdata/pcommon" + "go.uber.org/zap/zapcore" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/internal" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/internal/logging" ) -var _ internal.ResourceContext = TransformContext{} +var ( + _ internal.ResourceContext = (*TransformContext)(nil) + _ zapcore.ObjectMarshaler = (*TransformContext)(nil) +) type TransformContext struct { - resource pcommon.Resource - cache pcommon.Map + resource pcommon.Resource + cache pcommon.Map + schemaURLItem internal.SchemaURLItem +} + +func (tCtx TransformContext) MarshalLogObject(encoder zapcore.ObjectEncoder) error { + err := encoder.AddObject("resource", logging.Resource(tCtx.resource)) + err = errors.Join(err, encoder.AddObject("cache", logging.Map(tCtx.cache))) + return err } type Option func(*ottl.Parser[TransformContext]) -func NewTransformContext(resource pcommon.Resource) TransformContext { +func NewTransformContext(resource pcommon.Resource, schemaURLItem internal.SchemaURLItem) TransformContext { return TransformContext{ - resource: resource, - cache: pcommon.NewMap(), + resource: resource, + cache: pcommon.NewMap(), + schemaURLItem: schemaURLItem, } } @@ -38,6 +52,10 @@ func (tCtx TransformContext) getCache() pcommon.Map { return tCtx.cache } +func (tCtx TransformContext) GetResourceSchemaURLItem() internal.SchemaURLItem { + return tCtx.schemaURLItem +} + func NewParser(functions map[string]ottl.Factory[TransformContext], telemetrySettings component.TelemetrySettings, options ...Option) (ottl.Parser[TransformContext], error) { pep := pathExpressionParser{telemetrySettings} p, err := ottl.NewParser[TransformContext]( diff --git a/pkg/ottl/contexts/ottlresource/resource_test.go b/pkg/ottl/contexts/ottlresource/resource_test.go index 77dde557eaa1..9d490a362c3d 100644 --- a/pkg/ottl/contexts/ottlresource/resource_test.go +++ b/pkg/ottl/contexts/ottlresource/resource_test.go @@ -9,6 +9,7 @@ import ( "github.com/stretchr/testify/assert" "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/pmetric" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/internal" @@ -368,7 +369,7 @@ func Test_newPathGetSetter(t *testing.T) { resource := createTelemetry() - tCtx := NewTransformContext(resource) + tCtx := NewTransformContext(resource, pmetric.NewResourceMetrics()) got, err := accessor.Get(context.Background(), tCtx) assert.NoError(t, err) assert.Equal(t, tt.orig, got) diff --git a/pkg/ottl/contexts/ottlscope/scope.go b/pkg/ottl/contexts/ottlscope/scope.go index f7a9d92ee8d4..3ae5e0976446 100644 --- a/pkg/ottl/contexts/ottlscope/scope.go +++ b/pkg/ottl/contexts/ottlscope/scope.go @@ -5,31 +5,46 @@ package ottlscope // import "github.com/open-telemetry/opentelemetry-collector-c import ( "context" + "errors" "fmt" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/pdata/pcommon" + "go.uber.org/zap/zapcore" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/internal" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/internal/logging" ) -var _ internal.ResourceContext = TransformContext{} -var _ internal.InstrumentationScopeContext = TransformContext{} +var ( + _ internal.ResourceContext = (*TransformContext)(nil) + _ internal.InstrumentationScopeContext = (*TransformContext)(nil) + _ zapcore.ObjectMarshaler = (*TransformContext)(nil) +) type TransformContext struct { instrumentationScope pcommon.InstrumentationScope resource pcommon.Resource cache pcommon.Map + schemaURLItem internal.SchemaURLItem +} + +func (tCtx TransformContext) MarshalLogObject(encoder zapcore.ObjectEncoder) error { + err := encoder.AddObject("resource", logging.Resource(tCtx.resource)) + err = errors.Join(err, encoder.AddObject("scope", logging.InstrumentationScope(tCtx.instrumentationScope))) + err = errors.Join(err, encoder.AddObject("cache", logging.Map(tCtx.cache))) + return err } type Option func(*ottl.Parser[TransformContext]) -func NewTransformContext(instrumentationScope pcommon.InstrumentationScope, resource pcommon.Resource) TransformContext { +func NewTransformContext(instrumentationScope pcommon.InstrumentationScope, resource pcommon.Resource, schemaURLItem internal.SchemaURLItem) TransformContext { return TransformContext{ instrumentationScope: instrumentationScope, resource: resource, cache: pcommon.NewMap(), + schemaURLItem: schemaURLItem, } } @@ -45,6 +60,14 @@ func (tCtx TransformContext) getCache() pcommon.Map { return tCtx.cache } +func (tCtx TransformContext) GetScopeSchemaURLItem() internal.SchemaURLItem { + return tCtx.schemaURLItem +} + +func (tCtx TransformContext) GetResourceSchemaURLItem() internal.SchemaURLItem { + return tCtx.schemaURLItem +} + func NewParser(functions map[string]ottl.Factory[TransformContext], telemetrySettings component.TelemetrySettings, options ...Option) (ottl.Parser[TransformContext], error) { pep := pathExpressionParser{telemetrySettings} p, err := ottl.NewParser[TransformContext]( diff --git a/pkg/ottl/contexts/ottlscope/scope_test.go b/pkg/ottl/contexts/ottlscope/scope_test.go index 0e417e8c5787..bd2e899f96fb 100644 --- a/pkg/ottl/contexts/ottlscope/scope_test.go +++ b/pkg/ottl/contexts/ottlscope/scope_test.go @@ -9,6 +9,7 @@ import ( "github.com/stretchr/testify/assert" "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/plog" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/internal" @@ -401,7 +402,7 @@ func Test_newPathGetSetter(t *testing.T) { il, resource := createTelemetry() - tCtx := NewTransformContext(il, resource) + tCtx := NewTransformContext(il, resource, plog.NewScopeLogs()) got, err := accessor.Get(context.Background(), tCtx) assert.NoError(t, err) assert.Equal(t, tt.orig, got) diff --git a/pkg/ottl/contexts/ottlspan/span.go b/pkg/ottl/contexts/ottlspan/span.go index a680fd68a96a..aa3283124bbd 100644 --- a/pkg/ottl/contexts/ottlspan/span.go +++ b/pkg/ottl/contexts/ottlspan/span.go @@ -5,34 +5,52 @@ package ottlspan // import "github.com/open-telemetry/opentelemetry-collector-co import ( "context" + "errors" "fmt" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" + "go.uber.org/zap/zapcore" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/internal" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/internal/logging" ) -var _ internal.ResourceContext = TransformContext{} -var _ internal.InstrumentationScopeContext = TransformContext{} +var ( + _ internal.ResourceContext = (*TransformContext)(nil) + _ internal.InstrumentationScopeContext = (*TransformContext)(nil) + _ zapcore.ObjectMarshaler = (*TransformContext)(nil) +) type TransformContext struct { span ptrace.Span instrumentationScope pcommon.InstrumentationScope resource pcommon.Resource cache pcommon.Map + scopeSpans ptrace.ScopeSpans + resourceSpans ptrace.ResourceSpans +} + +func (tCtx TransformContext) MarshalLogObject(encoder zapcore.ObjectEncoder) error { + err := encoder.AddObject("resource", logging.Resource(tCtx.resource)) + err = errors.Join(err, encoder.AddObject("scope", logging.InstrumentationScope(tCtx.instrumentationScope))) + err = errors.Join(err, encoder.AddObject("span", logging.Span(tCtx.span))) + err = errors.Join(err, encoder.AddObject("cache", logging.Map(tCtx.cache))) + return err } type Option func(*ottl.Parser[TransformContext]) -func NewTransformContext(span ptrace.Span, instrumentationScope pcommon.InstrumentationScope, resource pcommon.Resource) TransformContext { +func NewTransformContext(span ptrace.Span, instrumentationScope pcommon.InstrumentationScope, resource pcommon.Resource, scopeSpans ptrace.ScopeSpans, resourceSpans ptrace.ResourceSpans) TransformContext { return TransformContext{ span: span, instrumentationScope: instrumentationScope, resource: resource, cache: pcommon.NewMap(), + scopeSpans: scopeSpans, + resourceSpans: resourceSpans, } } @@ -52,6 +70,14 @@ func (tCtx TransformContext) getCache() pcommon.Map { return tCtx.cache } +func (tCtx TransformContext) GetResourceSchemaURLItem() internal.SchemaURLItem { + return tCtx.resourceSpans +} + +func (tCtx TransformContext) GetScopeSchemaURLItem() internal.SchemaURLItem { + return tCtx.scopeSpans +} + func NewParser(functions map[string]ottl.Factory[TransformContext], telemetrySettings component.TelemetrySettings, options ...Option) (ottl.Parser[TransformContext], error) { pep := pathExpressionParser{telemetrySettings} p, err := ottl.NewParser[TransformContext]( diff --git a/pkg/ottl/contexts/ottlspan/span_test.go b/pkg/ottl/contexts/ottlspan/span_test.go index c02ae40ae613..967feac6e27a 100644 --- a/pkg/ottl/contexts/ottlspan/span_test.go +++ b/pkg/ottl/contexts/ottlspan/span_test.go @@ -317,7 +317,6 @@ func Test_newPathGetSetter(t *testing.T) { N: "attributes", KeySlice: []ottl.Key[TransformContext]{ &internal.TestKey[TransformContext]{ - S: ottltest.Strp("int"), }, }, @@ -331,11 +330,9 @@ func Test_newPathGetSetter(t *testing.T) { { name: "attributes float", path: &internal.TestPath[TransformContext]{ - N: "attributes", KeySlice: []ottl.Key[TransformContext]{ &internal.TestKey[TransformContext]{ - S: ottltest.Strp("double"), }, }, @@ -349,11 +346,9 @@ func Test_newPathGetSetter(t *testing.T) { { name: "attributes bytes", path: &internal.TestPath[TransformContext]{ - N: "attributes", KeySlice: []ottl.Key[TransformContext]{ &internal.TestKey[TransformContext]{ - S: ottltest.Strp("bytes"), }, }, @@ -367,11 +362,9 @@ func Test_newPathGetSetter(t *testing.T) { { name: "attributes array string", path: &internal.TestPath[TransformContext]{ - N: "attributes", KeySlice: []ottl.Key[TransformContext]{ &internal.TestKey[TransformContext]{ - S: ottltest.Strp("arr_str"), }, }, @@ -388,11 +381,9 @@ func Test_newPathGetSetter(t *testing.T) { { name: "attributes array bool", path: &internal.TestPath[TransformContext]{ - N: "attributes", KeySlice: []ottl.Key[TransformContext]{ &internal.TestKey[TransformContext]{ - S: ottltest.Strp("arr_bool"), }, }, @@ -409,11 +400,9 @@ func Test_newPathGetSetter(t *testing.T) { { name: "attributes array int", path: &internal.TestPath[TransformContext]{ - N: "attributes", KeySlice: []ottl.Key[TransformContext]{ &internal.TestKey[TransformContext]{ - S: ottltest.Strp("arr_int"), }, }, @@ -430,11 +419,9 @@ func Test_newPathGetSetter(t *testing.T) { { name: "attributes array float", path: &internal.TestPath[TransformContext]{ - N: "attributes", KeySlice: []ottl.Key[TransformContext]{ &internal.TestKey[TransformContext]{ - S: ottltest.Strp("arr_float"), }, }, @@ -451,11 +438,9 @@ func Test_newPathGetSetter(t *testing.T) { { name: "attributes array bytes", path: &internal.TestPath[TransformContext]{ - N: "attributes", KeySlice: []ottl.Key[TransformContext]{ &internal.TestKey[TransformContext]{ - S: ottltest.Strp("arr_bytes"), }, }, @@ -472,11 +457,9 @@ func Test_newPathGetSetter(t *testing.T) { { name: "attributes pcommon.Map", path: &internal.TestPath[TransformContext]{ - N: "attributes", KeySlice: []ottl.Key[TransformContext]{ &internal.TestKey[TransformContext]{ - S: ottltest.Strp("pMap"), }, }, @@ -495,11 +478,9 @@ func Test_newPathGetSetter(t *testing.T) { { name: "attributes map[string]any", path: &internal.TestPath[TransformContext]{ - N: "attributes", KeySlice: []ottl.Key[TransformContext]{ &internal.TestKey[TransformContext]{ - S: ottltest.Strp("map"), }, }, @@ -699,7 +680,7 @@ func Test_newPathGetSetter(t *testing.T) { span, il, resource := createTelemetry() - tCtx := NewTransformContext(span, il, resource) + tCtx := NewTransformContext(span, il, resource, ptrace.NewScopeSpans(), ptrace.NewResourceSpans()) got, err := accessor.Get(context.Background(), tCtx) assert.NoError(t, err) @@ -832,7 +813,7 @@ func Test_ParseEnum(t *testing.T) { t.Run(tt.name, func(t *testing.T) { actual, err := parseEnum((*ottl.EnumSymbol)(ottltest.Strp(tt.name))) assert.NoError(t, err) - assert.Equal(t, *actual, tt.want) + assert.Equal(t, tt.want, *actual) }) } } diff --git a/pkg/ottl/contexts/ottlspanevent/span_events.go b/pkg/ottl/contexts/ottlspanevent/span_events.go index baf2aadcb475..b3826f690d2d 100644 --- a/pkg/ottl/contexts/ottlspanevent/span_events.go +++ b/pkg/ottl/contexts/ottlspanevent/span_events.go @@ -5,20 +5,25 @@ package ottlspanevent // import "github.com/open-telemetry/opentelemetry-collect import ( "context" + "errors" "fmt" "time" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" + "go.uber.org/zap/zapcore" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/internal" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/internal/logging" ) -var _ internal.ResourceContext = TransformContext{} -var _ internal.InstrumentationScopeContext = TransformContext{} -var _ internal.SpanContext = TransformContext{} +var ( + _ internal.ResourceContext = (*TransformContext)(nil) + _ internal.InstrumentationScopeContext = (*TransformContext)(nil) + _ zapcore.ObjectMarshaler = (*TransformContext)(nil) +) type TransformContext struct { spanEvent ptrace.SpanEvent @@ -26,17 +31,30 @@ type TransformContext struct { instrumentationScope pcommon.InstrumentationScope resource pcommon.Resource cache pcommon.Map + scopeSpans ptrace.ScopeSpans + resouceSpans ptrace.ResourceSpans +} + +func (tCtx TransformContext) MarshalLogObject(encoder zapcore.ObjectEncoder) error { + err := encoder.AddObject("resource", logging.Resource(tCtx.resource)) + err = errors.Join(err, encoder.AddObject("scope", logging.InstrumentationScope(tCtx.instrumentationScope))) + err = errors.Join(err, encoder.AddObject("span", logging.Span(tCtx.span))) + err = errors.Join(err, encoder.AddObject("spanevent", logging.SpanEvent(tCtx.spanEvent))) + err = errors.Join(err, encoder.AddObject("cache", logging.Map(tCtx.cache))) + return err } type Option func(*ottl.Parser[TransformContext]) -func NewTransformContext(spanEvent ptrace.SpanEvent, span ptrace.Span, instrumentationScope pcommon.InstrumentationScope, resource pcommon.Resource) TransformContext { +func NewTransformContext(spanEvent ptrace.SpanEvent, span ptrace.Span, instrumentationScope pcommon.InstrumentationScope, resource pcommon.Resource, scopeSpans ptrace.ScopeSpans, resourceSpans ptrace.ResourceSpans) TransformContext { return TransformContext{ spanEvent: spanEvent, span: span, instrumentationScope: instrumentationScope, resource: resource, cache: pcommon.NewMap(), + scopeSpans: scopeSpans, + resouceSpans: resourceSpans, } } @@ -60,6 +78,14 @@ func (tCtx TransformContext) getCache() pcommon.Map { return tCtx.cache } +func (tCtx TransformContext) GetScopeSchemaURLItem() internal.SchemaURLItem { + return tCtx.scopeSpans +} + +func (tCtx TransformContext) GetResourceSchemaURLItem() internal.SchemaURLItem { + return tCtx.resouceSpans +} + func NewParser(functions map[string]ottl.Factory[TransformContext], telemetrySettings component.TelemetrySettings, options ...Option) (ottl.Parser[TransformContext], error) { pep := pathExpressionParser{telemetrySettings} p, err := ottl.NewParser[TransformContext]( @@ -155,8 +181,8 @@ func (pep *pathExpressionParser) parsePath(path ottl.Path[TransformContext]) (ot default: return nil, internal.FormatDefaultErrorMessage(path.Name(), path.String(), "Span Event", internal.SpanEventRef) } - } + func accessCache() ottl.StandardGetSetter[TransformContext] { return ottl.StandardGetSetter[TransformContext]{ Getter: func(_ context.Context, tCtx TransformContext) (any, error) { diff --git a/pkg/ottl/contexts/ottlspanevent/span_events_test.go b/pkg/ottl/contexts/ottlspanevent/span_events_test.go index 0464b36e9aee..90b0c9781704 100644 --- a/pkg/ottl/contexts/ottlspanevent/span_events_test.go +++ b/pkg/ottl/contexts/ottlspanevent/span_events_test.go @@ -17,9 +17,7 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottltest" ) -var ( - spanID2 = [8]byte{8, 7, 6, 5, 4, 3, 2, 1} -) +var spanID2 = [8]byte{8, 7, 6, 5, 4, 3, 2, 1} func Test_newPathGetSetter(t *testing.T) { refSpanEvent, refSpan, refIS, refResource := createTelemetry() @@ -449,7 +447,7 @@ func Test_newPathGetSetter(t *testing.T) { spanEvent, span, il, resource := createTelemetry() - tCtx := NewTransformContext(spanEvent, span, il, resource) + tCtx := NewTransformContext(spanEvent, span, il, resource, ptrace.NewScopeSpans(), ptrace.NewResourceSpans()) got, err := accessor.Get(context.Background(), tCtx) assert.NoError(t, err) @@ -571,7 +569,7 @@ func Test_ParseEnum(t *testing.T) { t.Run(tt.name, func(t *testing.T) { actual, err := parseEnum((*ottl.EnumSymbol)(ottltest.Strp(tt.name))) assert.NoError(t, err) - assert.Equal(t, *actual, tt.want) + assert.Equal(t, tt.want, *actual) }) } } diff --git a/pkg/ottl/e2e/e2e_test.go b/pkg/ottl/e2e/e2e_test.go index 52595dcab6b0..bb1dd43b5282 100644 --- a/pkg/ottl/e2e/e2e_test.go +++ b/pkg/ottl/e2e/e2e_test.go @@ -5,6 +5,7 @@ package e2e import ( "context" + "net/http" "testing" "time" @@ -12,10 +13,13 @@ import ( "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" + "go.opentelemetry.io/collector/pdata/ptrace" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottllog" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottlspan" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/plogtest" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/ptracetest" ) var ( @@ -48,6 +52,15 @@ func Test_e2e_editors(t *testing.T) { tCtx.GetLogRecord().Attributes().Remove("http.url") }, }, + { + statement: `keep_matching_keys(attributes, "^http")`, + want: func(tCtx ottllog.TransformContext) { + tCtx.GetLogRecord().Attributes().Remove("flags") + tCtx.GetLogRecord().Attributes().Remove("total.string") + tCtx.GetLogRecord().Attributes().Remove("foo") + tCtx.GetLogRecord().Attributes().Remove("things") + }, + }, { statement: `flatten(attributes)`, want: func(tCtx ottllog.TransformContext) { @@ -56,6 +69,15 @@ func Test_e2e_editors(t *testing.T) { tCtx.GetLogRecord().Attributes().PutStr("foo.flags", "pass") tCtx.GetLogRecord().Attributes().PutStr("foo.slice.0", "val") tCtx.GetLogRecord().Attributes().PutStr("foo.nested.test", "pass") + + tCtx.GetLogRecord().Attributes().Remove("things") + m1 := tCtx.GetLogRecord().Attributes().PutEmptyMap("things.0") + m1.PutStr("name", "foo") + m1.PutInt("value", 2) + + m2 := tCtx.GetLogRecord().Attributes().PutEmptyMap("things.1") + m2.PutStr("name", "bar") + m2.PutInt("value", 5) }, }, { @@ -73,13 +95,17 @@ func Test_e2e_editors(t *testing.T) { m.PutStr("test.foo.flags", "pass") m.PutStr("test.foo.slice.0", "val") m.PutStr("test.foo.nested.test", "pass") + + m1 := m.PutEmptyMap("test.things.0") + m1.PutStr("name", "foo") + m1.PutInt("value", 2) + + m2 := m.PutEmptyMap("test.things.1") + m2.PutStr("name", "bar") + m2.PutInt("value", 5) m.CopyTo(tCtx.GetLogRecord().Attributes()) }, }, - { - statement: `flatten(attributes, depth=0)`, - want: func(_ ottllog.TransformContext) {}, - }, { statement: `flatten(attributes, depth=1)`, want: func(tCtx ottllog.TransformContext) { @@ -93,9 +119,18 @@ func Test_e2e_editors(t *testing.T) { m.PutStr("foo.flags", "pass") m.PutStr("foo.bar", "pass") m.PutStr("foo.flags", "pass") - m.PutStr("foo.slice.0", "val") - m2 := m.PutEmptyMap("foo.nested") - m2.PutStr("test", "pass") + m.PutEmptySlice("foo.slice").AppendEmpty().SetStr("val") + + m1 := m.PutEmptyMap("things.0") + m1.PutStr("name", "foo") + m1.PutInt("value", 2) + + m2 := m.PutEmptyMap("things.1") + m2.PutStr("name", "bar") + m2.PutInt("value", 5) + + m3 := m.PutEmptyMap("foo.nested") + m3.PutStr("test", "pass") m.CopyTo(tCtx.GetLogRecord().Attributes()) }, }, @@ -106,6 +141,7 @@ func Test_e2e_editors(t *testing.T) { tCtx.GetLogRecord().Attributes().Remove("http.path") tCtx.GetLogRecord().Attributes().Remove("http.url") tCtx.GetLogRecord().Attributes().Remove("foo") + tCtx.GetLogRecord().Attributes().Remove("things") }, }, { @@ -120,6 +156,7 @@ func Test_e2e_editors(t *testing.T) { tCtx.GetLogRecord().Attributes().Remove("http.url") tCtx.GetLogRecord().Attributes().Remove("flags") tCtx.GetLogRecord().Attributes().Remove("foo") + tCtx.GetLogRecord().Attributes().Remove("things") }, }, { @@ -229,6 +266,43 @@ func Test_e2e_editors(t *testing.T) { tCtx.GetLogRecord().Attributes().PutStr("total.string", "1") }, }, + { + statement: `append(attributes["foo"]["slice"], "sample_value")`, + want: func(tCtx ottllog.TransformContext) { + v, _ := tCtx.GetLogRecord().Attributes().Get("foo") + sv, _ := v.Map().Get("slice") + s := sv.Slice() + s.AppendEmpty().SetStr("sample_value") + }, + }, + { + statement: `append(attributes["foo"]["flags"], "sample_value")`, + want: func(tCtx ottllog.TransformContext) { + v, _ := tCtx.GetLogRecord().Attributes().Get("foo") + s := v.Map().PutEmptySlice("flags") + s.AppendEmpty().SetStr("pass") + s.AppendEmpty().SetStr("sample_value") + }, + }, + { + statement: `append(attributes["foo"]["slice"], values=[5,6])`, + want: func(tCtx ottllog.TransformContext) { + v, _ := tCtx.GetLogRecord().Attributes().Get("foo") + sv, _ := v.Map().Get("slice") + s := sv.Slice() + s.AppendEmpty().SetInt(5) + s.AppendEmpty().SetInt(6) + }, + }, + { + statement: `append(attributes["foo"]["new_slice"], values=[5,6])`, + want: func(tCtx ottllog.TransformContext) { + v, _ := tCtx.GetLogRecord().Attributes().Get("foo") + s := v.Map().PutEmptySlice("new_slice") + s.AppendEmpty().SetInt(5) + s.AppendEmpty().SetInt(6) + }, + }, } for _, tt := range tests { @@ -261,6 +335,12 @@ func Test_e2e_converters(t *testing.T) { tCtx.GetLogRecord().Attributes().PutStr("test", "pass") }, }, + { + statement: `set(attributes["test"], Decode("cGFzcw==", "base64"))`, + want: func(tCtx ottllog.TransformContext) { + tCtx.GetLogRecord().Attributes().PutStr("test", "pass") + }, + }, { statement: `set(attributes["test"], Concat(["A","B"], ":"))`, want: func(tCtx ottllog.TransformContext) { @@ -270,7 +350,7 @@ func Test_e2e_converters(t *testing.T) { { statement: `set(attributes["test"], ConvertCase(attributes["http.method"], "upper"))`, want: func(tCtx ottllog.TransformContext) { - tCtx.GetLogRecord().Attributes().PutStr("test", "GET") + tCtx.GetLogRecord().Attributes().PutStr("test", http.MethodGet) }, }, { @@ -291,6 +371,24 @@ func Test_e2e_converters(t *testing.T) { tCtx.GetLogRecord().Attributes().PutStr("test", "FooBar") }, }, + { + statement: `set(attributes["test"], ConvertAttributesToElementsXML("This is a log message!"))`, + want: func(tCtx ottllog.TransformContext) { + tCtx.GetLogRecord().Attributes().PutStr("test", `This is a log message!1`) + }, + }, + { + statement: `set(body, ConvertTextToElementsXML("foo"))`, + want: func(tCtx ottllog.TransformContext) { + tCtx.GetLogRecord().Body().SetStr("foo") + }, + }, + { + statement: `set(body, ConvertTextToElementsXML("foobar", "/a", "custom"))`, + want: func(tCtx ottllog.TransformContext) { + tCtx.GetLogRecord().Body().SetStr("foobar") + }, + }, { statement: `set(attributes["test"], Double(1.0))`, want: func(tCtx ottllog.TransformContext) { @@ -328,12 +426,30 @@ func Test_e2e_converters(t *testing.T) { m.PutStr("numbers", "123") }, }, + { + statement: `set(attributes["test"], ExtractGrokPatterns("http://user:password@example.com:80/path?query=string", "%{ELB_URI}", true))`, + want: func(tCtx ottllog.TransformContext) { + m := tCtx.GetLogRecord().Attributes().PutEmptyMap("test") + m.PutStr("url.scheme", "http") + m.PutStr("url.username", "user") + m.PutStr("url.domain", "example.com") + m.PutInt("url.port", 80) + m.PutStr("url.path", "/path") + m.PutStr("url.query", "query=string") + }, + }, { statement: `set(attributes["test"], FNV("pass"))`, want: func(tCtx ottllog.TransformContext) { tCtx.GetLogRecord().Attributes().PutInt("test", 266877920130663416) }, }, + { + statement: `set(attributes["test"], Format("%03d-%s", [7, "test"]))`, + want: func(tCtx ottllog.TransformContext) { + tCtx.GetLogRecord().Attributes().PutStr("test", "007-test") + }, + }, { statement: `set(attributes["test"], Hour(Time("12", "%H")))`, want: func(tCtx ottllog.TransformContext) { @@ -346,6 +462,12 @@ func Test_e2e_converters(t *testing.T) { tCtx.GetLogRecord().Attributes().PutDouble("test", 1.5) }, }, + { + statement: `set(attributes["test"], InsertXML("", "/a", ""))`, + want: func(tCtx ottllog.TransformContext) { + tCtx.GetLogRecord().Attributes().PutStr("test", "") + }, + }, { statement: `set(attributes["test"], Int(1.0))`, want: func(tCtx ottllog.TransformContext) { @@ -370,6 +492,36 @@ func Test_e2e_converters(t *testing.T) { tCtx.GetLogRecord().Attributes().PutInt("test", 1) }, }, + { + statement: `set(attributes["test"], GetXML("12", "/a//b"))`, + want: func(tCtx ottllog.TransformContext) { + tCtx.GetLogRecord().Attributes().PutStr("test", "12") + }, + }, + { + statement: `set(attributes["test"], Hex(1.0))`, + want: func(tCtx ottllog.TransformContext) { + tCtx.GetLogRecord().Attributes().PutStr("test", "3ff0000000000000") + }, + }, + { + statement: `set(attributes["test"], Hex(true))`, + want: func(tCtx ottllog.TransformContext) { + tCtx.GetLogRecord().Attributes().PutStr("test", "01") + }, + }, + { + statement: `set(attributes["test"], Hex(12))`, + want: func(tCtx ottllog.TransformContext) { + tCtx.GetLogRecord().Attributes().PutStr("test", "000000000000000c") + }, + }, + { + statement: `set(attributes["test"], Hex("12"))`, + want: func(tCtx ottllog.TransformContext) { + tCtx.GetLogRecord().Attributes().PutStr("test", "3132") + }, + }, { statement: `set(attributes["test"], "pass") where IsBool(false)`, want: func(tCtx ottllog.TransformContext) { @@ -418,6 +570,12 @@ func Test_e2e_converters(t *testing.T) { tCtx.GetLogRecord().Attributes().PutDouble("test", 0) }, }, + { + statement: `set(attributes["test"], MD5("pass"))`, + want: func(tCtx ottllog.TransformContext) { + tCtx.GetLogRecord().Attributes().PutStr("test", "1a1dc91c907325c69271ddf0c944bc72") + }, + }, { statement: `set(attributes["test"], Microseconds(Duration("1ms")))`, want: func(tCtx ottllog.TransformContext) { @@ -473,6 +631,14 @@ func Test_e2e_converters(t *testing.T) { m.PutDouble("id", 1) }, }, + { + statement: `set(attributes["test"], ParseJSON("[\"value1\",\"value2\"]"))`, + want: func(tCtx ottllog.TransformContext) { + m := tCtx.GetLogRecord().Attributes().PutEmptySlice("test") + m.AppendEmpty().SetStr("value1") + m.AppendEmpty().SetStr("value2") + }, + }, { statement: `set(attributes["test"], ParseKeyValue("k1=v1 k2=v2"))`, want: func(tCtx ottllog.TransformContext) { @@ -497,6 +663,39 @@ func Test_e2e_converters(t *testing.T) { m.PutStr("k2", "v2__!__v2") }, }, + { + statement: `set(attributes["test"], ToKeyValueString(ParseKeyValue("k1=v1 k2=v2"), "=", " ", true))`, + want: func(tCtx ottllog.TransformContext) { + tCtx.GetLogRecord().Attributes().PutStr("test", "k1=v1 k2=v2") + }, + }, + { + statement: `set(attributes["test"], ToKeyValueString(ParseKeyValue("k1:v1,k2:v2", ":" , ","), ":", ",", true))`, + want: func(tCtx ottllog.TransformContext) { + tCtx.GetLogRecord().Attributes().PutStr("test", "k1:v1,k2:v2") + }, + }, + { + statement: `set(attributes["test"], ToKeyValueString(ParseKeyValue("k1=v1 k2=v2"), "!", "+", true))`, + want: func(tCtx ottllog.TransformContext) { + tCtx.GetLogRecord().Attributes().PutStr("test", "k1!v1+k2!v2") + }, + }, + { + statement: `set(attributes["test"], ToKeyValueString(ParseKeyValue("k1=v1 k2=v2=v3"), "=", " ", true))`, + want: func(tCtx ottllog.TransformContext) { + tCtx.GetLogRecord().Attributes().PutStr("test", "k1=v1 k2=\"v2=v3\"") + }, + }, + { + statement: `set(attributes["test"], ParseSimplifiedXML("1This is a log message!"))`, + want: func(tCtx ottllog.TransformContext) { + attr := tCtx.GetLogRecord().Attributes().PutEmptyMap("test") + log := attr.PutEmptyMap("Log") + log.PutStr("id", "1") + log.PutStr("Message", "This is a log message!") + }, + }, { statement: `set(attributes["test"], ParseXML("This is a log message!"))`, want: func(tCtx ottllog.TransformContext) { @@ -513,6 +712,12 @@ func Test_e2e_converters(t *testing.T) { message.PutStr("content", "This is a log message!") }, }, + { + statement: `set(attributes["test"], RemoveXML("This is a log message!", "/Log/Message"))`, + want: func(tCtx ottllog.TransformContext) { + tCtx.GetLogRecord().Attributes().PutStr("test", ``) + }, + }, { statement: `set(attributes["test"], Seconds(Duration("1m")))`, want: func(tCtx ottllog.TransformContext) { @@ -531,6 +736,68 @@ func Test_e2e_converters(t *testing.T) { tCtx.GetLogRecord().Attributes().PutStr("test", "d74ff0ee8da3b9806b18c877dbf29bbde50b5bd8e4dad7a3a725000feb82e8f1") }, }, + { + statement: `set(attributes["test"], SHA512("pass"))`, + want: func(tCtx ottllog.TransformContext) { + tCtx.GetLogRecord().Attributes().PutStr("test", "5b722b307fce6c944905d132691d5e4a2214b7fe92b738920eb3fce3a90420a19511c3010a0e7712b054daef5b57bad59ecbd93b3280f210578f547f4aed4d25") + }, + }, + { + statement: `set(attributes["test"], Sort(Split(attributes["flags"], "|"), "desc"))`, + want: func(tCtx ottllog.TransformContext) { + s := tCtx.GetLogRecord().Attributes().PutEmptySlice("test") + s.AppendEmpty().SetStr("C") + s.AppendEmpty().SetStr("B") + s.AppendEmpty().SetStr("A") + }, + }, + { + statement: `set(attributes["test"], Sort([true, false, false]))`, + want: func(tCtx ottllog.TransformContext) { + s := tCtx.GetLogRecord().Attributes().PutEmptySlice("test") + s.AppendEmpty().SetBool(false) + s.AppendEmpty().SetBool(false) + s.AppendEmpty().SetBool(true) + }, + }, + { + statement: `set(attributes["test"], Sort([3, 6, 9], "desc"))`, + want: func(tCtx ottllog.TransformContext) { + s := tCtx.GetLogRecord().Attributes().PutEmptySlice("test") + s.AppendEmpty().SetInt(9) + s.AppendEmpty().SetInt(6) + s.AppendEmpty().SetInt(3) + }, + }, + { + statement: `set(attributes["test"], Sort([Double(1.5), Double(10.2), Double(2.3), Double(0.5)]))`, + want: func(tCtx ottllog.TransformContext) { + s := tCtx.GetLogRecord().Attributes().PutEmptySlice("test") + s.AppendEmpty().SetDouble(0.5) + s.AppendEmpty().SetDouble(1.5) + s.AppendEmpty().SetDouble(2.3) + s.AppendEmpty().SetDouble(10.2) + }, + }, + { + statement: `set(attributes["test"], Sort([Int(11), Double(2.2), Double(-1)]))`, + want: func(tCtx ottllog.TransformContext) { + s := tCtx.GetLogRecord().Attributes().PutEmptySlice("test") + s.AppendEmpty().SetDouble(-1) + s.AppendEmpty().SetDouble(2.2) + s.AppendEmpty().SetInt(11) + }, + }, + { + statement: `set(attributes["test"], Sort([false, Int(11), Double(2.2), "three"]))`, + want: func(tCtx ottllog.TransformContext) { + s := tCtx.GetLogRecord().Attributes().PutEmptySlice("test") + s.AppendEmpty().SetInt(11) + s.AppendEmpty().SetDouble(2.2) + s.AppendEmpty().SetBool(false) + s.AppendEmpty().SetStr("three") + }, + }, { statement: `set(span_id, SpanID(0x0000000000000000))`, want: func(tCtx ottllog.TransformContext) { @@ -662,6 +929,36 @@ func Test_e2e_converters(t *testing.T) { m.PutStr("bar", "pass") }, }, + { + statement: `set(attributes["test"], UserAgent("curl/7.81.0"))`, + want: func(tCtx ottllog.TransformContext) { + m := tCtx.GetLogRecord().Attributes().PutEmptyMap("test") + m.PutStr("user_agent.original", "curl/7.81.0") + m.PutStr("user_agent.name", "curl") + m.PutStr("user_agent.version", "7.81.0") + }, + }, + { + statement: `set(attributes["test"], SliceToMap(attributes["things"], ["name"]))`, + want: func(tCtx ottllog.TransformContext) { + m := tCtx.GetLogRecord().Attributes().PutEmptyMap("test") + thing1 := m.PutEmptyMap("foo") + thing1.PutStr("name", "foo") + thing1.PutInt("value", 2) + + thing2 := m.PutEmptyMap("bar") + thing2.PutStr("name", "bar") + thing2.PutInt("value", 5) + }, + }, + { + statement: `set(attributes["test"], SliceToMap(attributes["things"], ["name"], ["value"]))`, + want: func(tCtx ottllog.TransformContext) { + m := tCtx.GetLogRecord().Attributes().PutEmptyMap("test") + m.PutInt("foo", 2) + m.PutInt("bar", 5) + }, + }, } for _, tt := range tests { @@ -748,6 +1045,32 @@ func Test_e2e_ottl_features(t *testing.T) { statement: `set(attributes["test"], attributes["metadata"]["uid"])`, want: func(_ ottllog.TransformContext) {}, }, + { + name: "map value", + statement: `set(body, {"_raw": body, "test": {"result": attributes["foo"]["bar"], "time": UnixNano(time)}})`, + want: func(tCtx ottllog.TransformContext) { + originalBody := tCtx.GetLogRecord().Body().AsString() + mapValue := tCtx.GetLogRecord().Body().SetEmptyMap() + mapValue.PutStr("_raw", originalBody) + mv1 := mapValue.PutEmptyMap("test") + mv1.PutStr("result", "pass") + mv1.PutInt("time", 1581452772000000321) + }, + }, + { + name: "map value as input to function", + statement: `set(attributes["isMap"], IsMap({"foo": {"bar": "baz", "test": "pass"}}))`, + want: func(tCtx ottllog.TransformContext) { + tCtx.GetLogRecord().Attributes().PutBool("isMap", true) + }, + }, + { + name: "extract value from Split function result slice of type []string", + statement: `set(attributes["my.environment.2"], Split(resource.attributes["host.name"],"h")[1])`, + want: func(tCtx ottllog.TransformContext) { + tCtx.GetLogRecord().Attributes().PutStr("my.environment.2", "ost") + }, + }, } for _, tt := range tests { @@ -769,6 +1092,41 @@ func Test_e2e_ottl_features(t *testing.T) { } } +func Test_ProcessTraces_TraceContext(t *testing.T) { + tests := []struct { + statement string + want func(_ ottlspan.TransformContext) + }{ + { + statement: `set(attributes["entrypoint-root"], name) where IsRootSpan()`, + want: func(tCtx ottlspan.TransformContext) { + tCtx.GetSpan().Attributes().PutStr("entrypoint-root", "operationB") + }, + }, + } + + for _, tt := range tests { + t.Run(tt.statement, func(t *testing.T) { + settings := componenttest.NewNopTelemetrySettings() + funcs := ottlfuncs.StandardFuncs[ottlspan.TransformContext]() + isRootSpanFactory := ottlfuncs.NewIsRootSpanFactory() + funcs[isRootSpanFactory.Name()] = isRootSpanFactory + spanParser, err := ottlspan.NewParser(funcs, settings) + assert.NoError(t, err) + spanStatements, err := spanParser.ParseStatement(tt.statement) + assert.NoError(t, err) + + tCtx := constructSpanTransformContext() + _, _, _ = spanStatements.Execute(context.Background(), tCtx) + + exTCtx := constructSpanTransformContext() + tt.want(exTCtx) + + assert.NoError(t, ptracetest.CompareResourceSpans(newResourceSpans(exTCtx), newResourceSpans(tCtx))) + }) + } +} + func constructLogTransformContext() ottllog.TransformContext { resource := pcommon.NewResource() resource.Attributes().PutStr("host.name", "localhost") @@ -799,7 +1157,28 @@ func constructLogTransformContext() ottllog.TransformContext { m2 := m.PutEmptyMap("nested") m2.PutStr("test", "pass") - return ottllog.NewTransformContext(logRecord, scope, resource) + s2 := logRecord.Attributes().PutEmptySlice("things") + thing1 := s2.AppendEmpty().SetEmptyMap() + thing1.PutStr("name", "foo") + thing1.PutInt("value", 2) + + thing2 := s2.AppendEmpty().SetEmptyMap() + thing2.PutStr("name", "bar") + thing2.PutInt("value", 5) + + return ottllog.NewTransformContext(logRecord, scope, resource, plog.NewScopeLogs(), plog.NewResourceLogs()) +} + +func constructSpanTransformContext() ottlspan.TransformContext { + resource := pcommon.NewResource() + + scope := pcommon.NewInstrumentationScope() + scope.SetName("scope") + + td := ptrace.NewSpan() + fillSpanOne(td) + + return ottlspan.NewTransformContext(td, scope, resource, ptrace.NewScopeSpans(), ptrace.NewResourceSpans()) } func newResourceLogs(tCtx ottllog.TransformContext) plog.ResourceLogs { @@ -811,3 +1190,53 @@ func newResourceLogs(tCtx ottllog.TransformContext) plog.ResourceLogs { tCtx.GetLogRecord().CopyTo(l) return rl } + +func newResourceSpans(tCtx ottlspan.TransformContext) ptrace.ResourceSpans { + rl := ptrace.NewResourceSpans() + tCtx.GetResource().CopyTo(rl.Resource()) + sl := rl.ScopeSpans().AppendEmpty() + tCtx.GetInstrumentationScope().CopyTo(sl.Scope()) + l := sl.Spans().AppendEmpty() + tCtx.GetSpan().CopyTo(l) + return rl +} + +func fillSpanOne(span ptrace.Span) { + span.SetName("operationB") + span.SetSpanID(spanID) + span.SetTraceID(traceID) +} + +func Benchmark_XML_Functions(b *testing.B) { + testXML := `12` + tCtxWithTestBody := func() ottllog.TransformContext { + resource := pcommon.NewResource() + scope := pcommon.NewInstrumentationScope() + logRecord := plog.NewLogRecord() + logRecord.Body().SetStr(testXML) + return ottllog.NewTransformContext(logRecord, scope, resource, plog.NewScopeLogs(), plog.NewResourceLogs()) + } + + settings := componenttest.NewNopTelemetrySettings() + logParser, err := ottllog.NewParser(ottlfuncs.StandardFuncs[ottllog.TransformContext](), settings) + assert.NoError(b, err) + + // Use a round trip composition to ensure each iteration of the benchmark is the same. + // GetXML(body, "/Data/From/Test") returns "12" + // InsertXML(body, "/Data/To", GetXML(...)) adds the two Test elements to the To element + // RemoveXML(InsertXML(...) "/Data/To/Test") removes the Test elements which were just added + // set overwrites the body, but the result should be the same as the original body + roundTrip := `set(body, RemoveXML(InsertXML(body, "/Data/To", GetXML(body, "/Data/From/Test")), "/Data/To/Test"))` + logStatements, err := logParser.ParseStatement(roundTrip) + assert.NoError(b, err) + + actualCtx := tCtxWithTestBody() + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, _, _ = logStatements.Execute(context.Background(), actualCtx) + } + + // Ensure correctness + assert.NoError(b, plogtest.CompareResourceLogs(newResourceLogs(tCtxWithTestBody()), newResourceLogs(actualCtx))) +} diff --git a/pkg/ottl/expression.go b/pkg/ottl/expression.go index 6f6cc18b81c7..a2e8d29e63c4 100644 --- a/pkg/ottl/expression.go +++ b/pkg/ottl/expression.go @@ -4,14 +4,16 @@ package ottl // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" import ( + "bytes" "context" + "encoding/binary" "encoding/hex" "fmt" "reflect" "strconv" "time" - jsoniter "github.com/json-iterator/go" + "github.com/goccy/go-json" "go.opentelemetry.io/collector/pdata/pcommon" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/internal/ottlcommon" @@ -109,10 +111,35 @@ func (g exprGetter[K]) Get(ctx context.Context, tCtx K) (any, error) { } result = ottlcommon.GetValue(r.At(int(*k.Int))) case []any: - if int(*k.Int) >= len(r) || int(*k.Int) < 0 { - return nil, fmt.Errorf("index %v out of bounds", *k.Int) + result, err = getElementByIndex(r, k.Int) + if err != nil { + return nil, err + } + case []string: + result, err = getElementByIndex(r, k.Int) + if err != nil { + return nil, err + } + case []bool: + result, err = getElementByIndex(r, k.Int) + if err != nil { + return nil, err + } + case []float64: + result, err = getElementByIndex(r, k.Int) + if err != nil { + return nil, err + } + case []int64: + result, err = getElementByIndex(r, k.Int) + if err != nil { + return nil, err + } + case []byte: + result, err = getElementByIndex(r, k.Int) + if err != nil { + return nil, err } - result = r[*k.Int] default: return nil, fmt.Errorf("type, %T, does not support int indexing", result) } @@ -123,6 +150,13 @@ func (g exprGetter[K]) Get(ctx context.Context, tCtx K) (any, error) { return result, nil } +func getElementByIndex[T any](r []T, idx *int64) (any, error) { + if int(*idx) >= len(r) || int(*idx) < 0 { + return nil, fmt.Errorf("index %v out of bounds", *idx) + } + return r[*idx], nil +} + type listGetter[K any] struct { slice []Getter[K] } @@ -141,6 +175,31 @@ func (l *listGetter[K]) Get(ctx context.Context, tCtx K) (any, error) { return evaluated, nil } +type mapGetter[K any] struct { + mapValues map[string]Getter[K] +} + +func (m *mapGetter[K]) Get(ctx context.Context, tCtx K) (any, error) { + evaluated := map[string]any{} + for k, v := range m.mapValues { + val, err := v.Get(ctx, tCtx) + if err != nil { + return nil, err + } + switch t := val.(type) { + case pcommon.Map: + evaluated[k] = t.AsRaw() + default: + evaluated[k] = t + } + } + result := pcommon.NewMap() + if err := result.FromRaw(evaluated); err != nil { + return nil, err + } + return result, nil +} + // TypeError represents that a value was not an expected type. type TypeError string @@ -401,22 +460,25 @@ func (g StandardStringLikeGetter[K]) Get(ctx context.Context, tCtx K) (*string, case []byte: result = hex.EncodeToString(v) case pcommon.Map: - result, err = jsoniter.MarshalToString(v.AsRaw()) + resultBytes, err := json.Marshal(v.AsRaw()) if err != nil { return nil, err } + result = string(resultBytes) case pcommon.Slice: - result, err = jsoniter.MarshalToString(v.AsRaw()) + resultBytes, err := json.Marshal(v.AsRaw()) if err != nil { return nil, err } + result = string(resultBytes) case pcommon.Value: result = v.AsString() default: - result, err = jsoniter.MarshalToString(v) + resultBytes, err := json.Marshal(v) if err != nil { return nil, TypeError(fmt.Sprintf("unsupported type: %T", v)) } + result = string(resultBytes) } return &result, nil } @@ -549,6 +611,81 @@ func (g StandardIntLikeGetter[K]) Get(ctx context.Context, tCtx K) (*int64, erro return &result, nil } +// ByteSliceLikeGetter is a Getter that returns []byte by converting the underlying value to an []byte if necessary +type ByteSliceLikeGetter[K any] interface { + // Get retrieves []byte value. + // The expectation is that the underlying value is converted to []byte if possible. + // If the value cannot be converted to []byte, nil and an error are returned. + // If the value is nil, nil is returned without an error. + Get(ctx context.Context, tCtx K) ([]byte, error) +} + +type StandardByteSliceLikeGetter[K any] struct { + Getter func(ctx context.Context, tCtx K) (any, error) +} + +func (g StandardByteSliceLikeGetter[K]) Get(ctx context.Context, tCtx K) ([]byte, error) { + val, err := g.Getter(ctx, tCtx) + if err != nil { + return nil, fmt.Errorf("error getting value in %T: %w", g, err) + } + if val == nil { + return nil, nil + } + var result []byte + switch v := val.(type) { + case []byte: + result = v + case string: + result = []byte(v) + case float64, int64, bool: + result, err = valueToBytes(v) + if err != nil { + return nil, fmt.Errorf("error converting value %f of %T: %w", v, g, err) + } + case pcommon.Value: + switch v.Type() { + case pcommon.ValueTypeBytes: + result = v.Bytes().AsRaw() + case pcommon.ValueTypeInt: + result, err = valueToBytes(v.Int()) + if err != nil { + return nil, fmt.Errorf("error converting value %d of int64: %w", v.Int(), err) + } + case pcommon.ValueTypeDouble: + result, err = valueToBytes(v.Double()) + if err != nil { + return nil, fmt.Errorf("error converting value %f of float64: %w", v.Double(), err) + } + case pcommon.ValueTypeStr: + result = []byte(v.Str()) + case pcommon.ValueTypeBool: + result, err = valueToBytes(v.Bool()) + if err != nil { + return nil, fmt.Errorf("error converting value %s of bool: %w", v.Str(), err) + } + default: + return nil, TypeError(fmt.Sprintf("unsupported value type: %v", v.Type())) + } + default: + return nil, TypeError(fmt.Sprintf("unsupported type: %T", v)) + } + return result, nil +} + +// valueToBytes converts a value to a byte slice of length 8. +func valueToBytes(n any) ([]byte, error) { + // Create a buffer to hold the bytes + buf := new(bytes.Buffer) + // Write the value to the buffer using binary.Write + err := binary.Write(buf, binary.BigEndian, n) + if err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + // BoolLikeGetter is a Getter that returns a bool by converting the underlying value to a bool if necessary. type BoolLikeGetter[K any] interface { // Get retrieves a bool value. @@ -638,7 +775,7 @@ func (p *Parser[K]) newGetter(val value) (Getter[K], error) { return &literal[K]{value: *i}, nil } if eL.Path != nil { - np, err := newPath[K](eL.Path.Fields) + np, err := p.newPath(eL.Path) if err != nil { return nil, err } @@ -661,6 +798,18 @@ func (p *Parser[K]) newGetter(val value) (Getter[K], error) { return &lg, nil } + if val.Map != nil { + mg := mapGetter[K]{mapValues: map[string]Getter[K]{}} + for _, kvp := range val.Map.Values { + getter, err := p.newGetter(*kvp.Value) + if err != nil { + return nil, err + } + mg.mapValues[*kvp.Key] = getter + } + return &mg, nil + } + if val.MathExpression == nil { // In practice, can't happen since the DSL grammar guarantees one is set return nil, fmt.Errorf("no value field set. This is a bug in the OpenTelemetry Transformation Language") diff --git a/pkg/ottl/expression_test.go b/pkg/ottl/expression_test.go index 821c86a8acfe..e5cffbfcd547 100644 --- a/pkg/ottl/expression_test.go +++ b/pkg/ottl/expression_test.go @@ -59,6 +59,56 @@ func basicSlice() (ExprFunc[any], error) { }, nil } +func basicSliceString() (ExprFunc[any], error) { + return func(_ context.Context, _ any) (any, error) { + return []any{ + []string{ + "pass", + }, + }, nil + }, nil +} + +func basicSliceBool() (ExprFunc[any], error) { + return func(_ context.Context, _ any) (any, error) { + return []any{ + []bool{ + true, + }, + }, nil + }, nil +} + +func basicSliceInteger() (ExprFunc[any], error) { + return func(_ context.Context, _ any) (any, error) { + return []any{ + []int64{ + 1, + }, + }, nil + }, nil +} + +func basicSliceFloat() (ExprFunc[any], error) { + return func(_ context.Context, _ any) (any, error) { + return []any{ + []float64{ + 1, + }, + }, nil + }, nil +} + +func basicSliceByte() (ExprFunc[any], error) { + return func(_ context.Context, _ any) (any, error) { + return []any{ + []byte{ + byte('p'), + }, + }, nil + }, nil +} + func Test_newGetter(t *testing.T) { tests := []struct { name string @@ -237,6 +287,101 @@ func Test_newGetter(t *testing.T) { }, want: "pass", }, + { + name: "function call nested SliceString", + val: value{ + Literal: &mathExprLiteral{ + Converter: &converter{ + Function: "SliceString", + Keys: []key{ + { + Int: ottltest.Intp(0), + }, + { + Int: ottltest.Intp(0), + }, + }, + }, + }, + }, + want: "pass", + }, + { + name: "function call nested SliceBool", + val: value{ + Literal: &mathExprLiteral{ + Converter: &converter{ + Function: "SliceBool", + Keys: []key{ + { + Int: ottltest.Intp(0), + }, + { + Int: ottltest.Intp(0), + }, + }, + }, + }, + }, + want: true, + }, + { + name: "function call nested SliceInteger", + val: value{ + Literal: &mathExprLiteral{ + Converter: &converter{ + Function: "SliceInteger", + Keys: []key{ + { + Int: ottltest.Intp(0), + }, + { + Int: ottltest.Intp(0), + }, + }, + }, + }, + }, + want: 1, + }, + { + name: "function call nested SliceFloat", + val: value{ + Literal: &mathExprLiteral{ + Converter: &converter{ + Function: "SliceFloat", + Keys: []key{ + { + Int: ottltest.Intp(0), + }, + { + Int: ottltest.Intp(0), + }, + }, + }, + }, + }, + want: 1.0, + }, + { + name: "function call nested SliceByte", + val: value{ + Literal: &mathExprLiteral{ + Converter: &converter{ + Function: "SliceByte", + Keys: []key{ + { + Int: ottltest.Intp(0), + }, + { + Int: ottltest.Intp(0), + }, + }, + }, + }, + }, + want: byte('p'), + }, { name: "enum", val: value{ @@ -414,6 +559,116 @@ func Test_newGetter(t *testing.T) { }, want: []any{"test0", int64(1)}, }, + { + name: "map", + val: value{ + Map: &mapValue{ + Values: []mapItem{ + { + Key: ottltest.Strp("stringAttr"), + Value: &value{String: ottltest.Strp("value")}, + }, + { + Key: ottltest.Strp("intAttr"), + Value: &value{ + Literal: &mathExprLiteral{ + Int: ottltest.Intp(3), + }, + }, + }, + { + Key: ottltest.Strp("floatAttr"), + Value: &value{ + Literal: &mathExprLiteral{ + Float: ottltest.Floatp(2.5), + }, + }, + }, + { + Key: ottltest.Strp("boolAttr"), + Value: &value{Bool: (*boolean)(ottltest.Boolp(true))}, + }, + { + Key: ottltest.Strp("byteAttr"), + Value: &value{Bytes: (*byteSlice)(&[]byte{1, 2, 3, 4, 5, 6, 7, 8})}, + }, + { + Key: ottltest.Strp("enumAttr"), + Value: &value{Enum: (*enumSymbol)(ottltest.Strp("TEST_ENUM_ONE"))}, + }, + { + Key: ottltest.Strp("pathAttr"), + Value: &value{ + Literal: &mathExprLiteral{ + Path: &path{ + Fields: []field{ + { + Name: "name", + }, + }, + }, + }, + }, + }, + { + Key: ottltest.Strp("mapAttr"), + Value: &value{ + Map: &mapValue{ + Values: []mapItem{ + { + Key: ottltest.Strp("foo"), + Value: &value{ + Map: &mapValue{ + Values: []mapItem{ + { + Key: ottltest.Strp("test"), + Value: &value{String: ottltest.Strp("value")}, + }, + }, + }, + }, + }, + { + Key: ottltest.Strp("listAttr"), + Value: &value{ + List: &list{ + Values: []value{ + { + String: ottltest.Strp("test0"), + }, + { + Literal: &mathExprLiteral{ + Int: ottltest.Intp(1), + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + ctx: "bear", + want: map[string]any{ + "enumAttr": int64(1), + "pathAttr": "bear", + "mapAttr": map[string]any{ + "foo": map[string]any{ + "test": "value", + }, + "listAttr": []any{"test0", int64(1)}, + }, + "stringAttr": "value", + "intAttr": int64(3), + "floatAttr": 2.5, + "boolAttr": true, + "byteAttr": []byte{1, 2, 3, 4, 5, 6, 7, 8}, + }, + }, } functions := CreateFactoryMap( @@ -422,6 +677,11 @@ func Test_newGetter(t *testing.T) { createFactory("Map", &struct{}{}, basicMap), createFactory("PSlice", &struct{}{}, pslice), createFactory("Slice", &struct{}{}, basicSlice), + createFactory("SliceString", &struct{}{}, basicSliceString), + createFactory("SliceBool", &struct{}{}, basicSliceBool), + createFactory("SliceInteger", &struct{}{}, basicSliceInteger), + createFactory("SliceFloat", &struct{}{}, basicSliceFloat), + createFactory("SliceByte", &struct{}{}, basicSliceByte), ) p, _ := NewParser[any]( @@ -444,7 +704,15 @@ func Test_newGetter(t *testing.T) { val, err := reader.Get(context.Background(), tCtx) assert.NoError(t, err) - assert.Equal(t, tt.want, val) + + switch v := val.(type) { + case pcommon.Map: + // need to compare the raw map here as require.EqualValues can not seem to handle + // the comparison of pcommon.Map + assert.EqualValues(t, tt.want, v.AsRaw()) + default: + assert.EqualValues(t, tt.want, v) + } }) } @@ -453,6 +721,7 @@ func Test_newGetter(t *testing.T) { assert.Error(t, err) }) } + func Test_exprGetter_Get_Invalid(t *testing.T) { tests := []struct { name string @@ -1449,6 +1718,205 @@ func Test_StandardIntLikeGetter_WrappedError(t *testing.T) { assert.False(t, ok) } +func Test_StandardByteSliceLikeGetter(t *testing.T) { + tests := []struct { + name string + getter ByteSliceLikeGetter[any] + want any + valid bool + expectedErrorMsg string + }{ + { + name: "string type", + getter: StandardByteSliceLikeGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "1", nil + }, + }, + want: []byte{49}, + valid: true, + }, + { + name: "byte type", + getter: StandardByteSliceLikeGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return []byte{49}, nil + }, + }, + want: []byte{49}, + valid: true, + }, + { + name: "int64 type", + getter: StandardByteSliceLikeGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return int64(12), nil + }, + }, + want: []byte{0, 0, 0, 0, 0, 0, 0, 12}, + valid: true, + }, + { + name: "float64 type", + getter: StandardByteSliceLikeGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return 1.1, nil + }, + }, + want: []byte{63, 241, 153, 153, 153, 153, 153, 154}, + valid: true, + }, + { + name: "primitive bool true", + getter: StandardByteSliceLikeGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return true, nil + }, + }, + want: []byte{1}, + valid: true, + }, + { + name: "primitive bool false", + getter: StandardByteSliceLikeGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return false, nil + }, + }, + want: []byte{0}, + valid: true, + }, + { + name: "pcommon.value type int", + getter: StandardByteSliceLikeGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + v := pcommon.NewValueInt(int64(100)) + return v, nil + }, + }, + want: []byte{0, 0, 0, 0, 0, 0, 0, 100}, + valid: true, + }, + { + name: "pcommon.value type float", + getter: StandardByteSliceLikeGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + v := pcommon.NewValueDouble(float64(1.9)) + return v, nil + }, + }, + want: []byte{63, 254, 102, 102, 102, 102, 102, 102}, + valid: true, + }, + { + name: "pcommon.value type string", + getter: StandardByteSliceLikeGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + v := pcommon.NewValueStr("1") + return v, nil + }, + }, + want: []byte{49}, + valid: true, + }, + { + name: "pcommon.value type bytes", + getter: StandardByteSliceLikeGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + v := pcommon.NewValueBytes() + v.SetEmptyBytes().Append(byte(12)) + return v, nil + }, + }, + want: []byte{12}, + valid: true, + }, + { + name: "pcommon.value type bool true", + getter: StandardByteSliceLikeGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + v := pcommon.NewValueBool(true) + return v, nil + }, + }, + want: []byte{1}, + valid: true, + }, + { + name: "pcommon.value type bool false", + getter: StandardByteSliceLikeGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + v := pcommon.NewValueBool(false) + return v, nil + }, + }, + want: []byte{0}, + valid: true, + }, + { + name: "nil", + getter: StandardByteSliceLikeGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return nil, nil + }, + }, + want: nil, + valid: true, + }, + { + name: "invalid type", + getter: StandardByteSliceLikeGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return map[string]string{}, nil + }, + }, + valid: false, + expectedErrorMsg: "unsupported type: map[string]string", + }, + { + name: "invalid pcommon.Value type", + getter: StandardByteSliceLikeGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + v := pcommon.NewValueMap() + return v, nil + }, + }, + valid: false, + expectedErrorMsg: "unsupported value type: Map", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + val, err := tt.getter.Get(context.Background(), nil) + if tt.valid { + assert.NoError(t, err) + if tt.want == nil { + assert.Nil(t, val) + } else { + assert.Equal(t, tt.want, val) + } + } else { + assert.IsType(t, TypeError(""), err) + assert.EqualError(t, err, tt.expectedErrorMsg) + } + }) + } +} + +// nolint:errorlint +func Test_StandardByteSliceLikeGetter_WrappedError(t *testing.T) { + getter := StandardByteSliceLikeGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return nil, TypeError("") + }, + } + _, err := getter.Get(context.Background(), nil) + assert.Error(t, err) + _, ok := err.(TypeError) + assert.False(t, ok) +} + func Test_StandardBoolGetter(t *testing.T) { tests := []struct { name string diff --git a/pkg/ottl/functions.go b/pkg/ottl/functions.go index 98f730a24dc7..4ff92123c7e6 100644 --- a/pkg/ottl/functions.go +++ b/pkg/ottl/functions.go @@ -22,37 +22,58 @@ type Enum int64 type EnumSymbol string -func buildOriginalText(fields []field) string { +func buildOriginalText(path *path) string { var builder strings.Builder - for i, f := range fields { + if path.Context != "" { + builder.WriteString(path.Context) + if len(path.Fields) > 0 { + builder.WriteString(".") + } + } + for i, f := range path.Fields { builder.WriteString(f.Name) if len(f.Keys) > 0 { - for _, k := range f.Keys { - builder.WriteString("[") - if k.Int != nil { - builder.WriteString(strconv.FormatInt(*k.Int, 10)) - } - if k.String != nil { - builder.WriteString(*k.String) - } - builder.WriteString("]") - } + builder.WriteString(buildOriginalKeysText(f.Keys)) } - if i != len(fields)-1 { + if i != len(path.Fields)-1 { builder.WriteString(".") } } return builder.String() } -func newPath[K any](fields []field) (*basePath[K], error) { - if len(fields) == 0 { +func buildOriginalKeysText(keys []key) string { + var builder strings.Builder + if len(keys) > 0 { + for _, k := range keys { + builder.WriteString("[") + if k.Int != nil { + builder.WriteString(strconv.FormatInt(*k.Int, 10)) + } + if k.String != nil { + builder.WriteString(*k.String) + } + builder.WriteString("]") + } + } + return builder.String() +} + +func (p *Parser[K]) newPath(path *path) (*basePath[K], error) { + if len(path.Fields) == 0 { return nil, fmt.Errorf("cannot make a path from zero fields") } - originalText := buildOriginalText(fields) + + pathContext, fields, err := p.parsePathContext(path) + if err != nil { + return nil, err + } + + originalText := buildOriginalText(path) var current *basePath[K] for i := len(fields) - 1; i >= 0; i-- { current = &basePath[K]{ + context: pathContext, name: fields[i].Name, keys: newKeys[K](fields[i].Keys), nextPath: current, @@ -64,10 +85,56 @@ func newPath[K any](fields []field) (*basePath[K], error) { return current, nil } +func (p *Parser[K]) parsePathContext(path *path) (string, []field, error) { + hasPathContextNames := len(p.pathContextNames) > 0 + if path.Context != "" { + // no pathContextNames means the Parser isn't handling the grammar path's context yet, + // so it falls back to the previous behavior with the path.Context value as the first + // path's segment. + if !hasPathContextNames { + return "", append([]field{{Name: path.Context}}, path.Fields...), nil + } + + if _, ok := p.pathContextNames[path.Context]; !ok { + return "", path.Fields, fmt.Errorf(`context "%s" from path "%s" is not valid, it must be replaced by one of: %s`, path.Context, buildOriginalText(path), p.buildPathContextNamesText("")) + } + + return path.Context, path.Fields, nil + } + + if hasPathContextNames { + originalText := buildOriginalText(path) + return "", nil, fmt.Errorf(`missing context name for path "%s", possibly valid options are: %s`, originalText, p.buildPathContextNamesText(originalText)) + } + + return "", path.Fields, nil +} + +func (p *Parser[K]) buildPathContextNamesText(path string) string { + var builder strings.Builder + var suffix string + if path != "" { + suffix = "." + path + } + + i := 0 + for ctx := range p.pathContextNames { + builder.WriteString(fmt.Sprintf(`"%s%s"`, ctx, suffix)) + if i != len(p.pathContextNames)-1 { + builder.WriteString(", ") + } + i++ + } + return builder.String() +} + // Path represents a chain of path parts in an OTTL statement, such as `body.string`. // A Path has a name, and potentially a set of keys. // If the path in the OTTL statement contains multiple parts (separated by a dot (`.`)), then the Path will have a pointer to the next Path. type Path[K any] interface { + // Context is the OTTL context name of this Path. + Context() string + // Name is the name of this segment of the path. Name() string @@ -86,6 +153,7 @@ type Path[K any] interface { var _ Path[any] = &basePath[any]{} type basePath[K any] struct { + context string name string keys []Key[K] nextPath *basePath[K] @@ -94,6 +162,10 @@ type basePath[K any] struct { originalText string } +func (p *basePath[K]) Context() string { + return p.context +} + func (p *basePath[K]) Name() string { return p.name } @@ -412,7 +484,7 @@ func (p *Parser[K]) buildArg(argVal value, argType reflect.Type) (any, error) { if argVal.Literal == nil || argVal.Literal.Path == nil { return nil, fmt.Errorf("must be a path") } - np, err := newPath[K](argVal.Literal.Path.Fields) + np, err := p.newPath(argVal.Literal.Path) if err != nil { return nil, err } @@ -493,6 +565,12 @@ func (p *Parser[K]) buildArg(argVal value, argType reflect.Type) (any, error) { return nil, err } return StandardBoolLikeGetter[K]{Getter: arg.Get}, nil + case strings.HasPrefix(name, "ByteSliceLikeGetter"): + arg, err := p.newGetter(argVal) + if err != nil { + return nil, err + } + return StandardByteSliceLikeGetter[K]{Getter: arg.Get}, nil case name == "Enum": arg, err := p.enumParser((*EnumSymbol)(argVal.Enum)) if err != nil { diff --git a/pkg/ottl/functions_test.go b/pkg/ottl/functions_test.go index d94c84f53106..a7bd4aef87c7 100644 --- a/pkg/ottl/functions_test.go +++ b/pkg/ottl/functions_test.go @@ -1207,6 +1207,20 @@ func Test_NewFunctionCall(t *testing.T) { }, want: nil, }, + { + name: "byteslicelikegetter arg", + inv: editor{ + Function: "testing_byte_slice", + Arguments: []argument{ + { + Value: value{ + Bytes: &byteSlice{1}, + }, + }, + }, + }, + want: nil, + }, { name: "pmapgetter arg", inv: editor{ @@ -1864,6 +1878,16 @@ func functionWithIntLikeGetter(IntLikeGetter[any]) (ExprFunc[any], error) { }, nil } +type byteSliceLikeGetterArguments struct { + ByteSliceLikeGetterArg ByteSliceLikeGetter[any] +} + +func functionWithByteSliceLikeGetter(ByteSliceLikeGetter[any]) (ExprFunc[any], error) { + return func(context.Context, any) (any, error) { + return "anything", nil + }, nil +} + type pMapGetterArguments struct { PMapArg PMapGetter[any] } @@ -2150,6 +2174,11 @@ func defaultFunctionsForTests() map[string]Factory[any] { &intLikeGetterArguments{}, functionWithIntLikeGetter, ), + createFactory[any]( + "testing_byteslicelikegetter", + &byteSliceLikeGetterArguments{}, + functionWithByteSliceLikeGetter, + ), createFactory[any]( "testing_pmapgetter", &pMapGetterArguments{}, @@ -2201,6 +2230,14 @@ func Test_basePath_Name(t *testing.T) { assert.Equal(t, "test", n) } +func Test_basePath_Context(t *testing.T) { + bp := basePath[any]{ + context: "log", + } + n := bp.Context() + assert.Equal(t, "log", n) +} + func Test_basePath_Next(t *testing.T) { bp := basePath[any]{ nextPath: &basePath[any]{}, @@ -2218,7 +2255,7 @@ func Test_basePath_Keys(t *testing.T) { }, } ks := bp.Keys() - assert.Equal(t, 1, len(ks)) + assert.Len(t, ks, 1) assert.Equal(t, k, ks[0]) } @@ -2323,6 +2360,13 @@ func Test_basePath_NextWithIsComplete(t *testing.T) { } func Test_newPath(t *testing.T) { + ps, _ := NewParser[any]( + defaultFunctionsForTests(), + testParsePath[any], + componenttest.NewNopTelemetrySettings(), + WithEnumParser[any](testParseEnum), + ) + fields := []field{ { Name: "body", @@ -2336,7 +2380,8 @@ func Test_newPath(t *testing.T) { }, }, } - np, err := newPath[any](fields) + + np, err := ps.newPath(&path{Fields: fields}) assert.NoError(t, err) p := Path[any](np) assert.Equal(t, "body", p.Name()) @@ -2346,7 +2391,7 @@ func Test_newPath(t *testing.T) { assert.Equal(t, "string", p.Name()) assert.Equal(t, "body.string[key]", p.String()) assert.Nil(t, p.Next()) - assert.Equal(t, 1, len(p.Keys())) + assert.Len(t, p.Keys(), 1) v, err := p.Keys()[0].String(context.Background(), struct{}{}) assert.NoError(t, err) assert.Equal(t, "key", *v) @@ -2355,6 +2400,110 @@ func Test_newPath(t *testing.T) { assert.Nil(t, i) } +func Test_newPath_WithPathContextNames(t *testing.T) { + tests := []struct { + name string + pathContext string + pathContextNames []string + expectedError string + }{ + { + name: "with no path context", + pathContextNames: []string{"log"}, + expectedError: `missing context name for path "body.string[key]", valid options are: "log.body.string[key]"`, + }, + { + name: "with no path context and configuration", + }, + { + name: "with valid path context", + pathContext: "log", + pathContextNames: []string{"log"}, + }, + { + name: "with invalid path context", + pathContext: "span", + pathContextNames: []string{"log"}, + expectedError: `context "span" from path "span.body.string[key]" is not valid, it must be replaced by one of: "log"`, + }, + { + name: "with multiple configured contexts", + pathContext: "span", + pathContextNames: []string{"log", "span"}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ps, _ := NewParser[any]( + defaultFunctionsForTests(), + testParsePath[any], + componenttest.NewNopTelemetrySettings(), + WithEnumParser[any](testParseEnum), + WithPathContextNames[any](tt.pathContextNames), + ) + + gp := &path{ + Context: tt.pathContext, + Fields: []field{ + { + Name: "body", + }, + { + Name: "string", + Keys: []key{ + { + String: ottltest.Strp("key"), + }, + }, + }, + }, + } + + np, err := ps.newPath(gp) + if tt.expectedError != "" { + assert.Error(t, err, tt.expectedError) + return + } + assert.NoError(t, err) + p := Path[any](np) + contextParsedAsField := len(tt.pathContextNames) == 0 && tt.pathContext != "" + if contextParsedAsField { + assert.Equal(t, tt.pathContext, p.Name()) + assert.Equal(t, "", p.Context()) + assert.Nil(t, p.Keys()) + p = p.Next() + } + var bodyStringFuncValue string + if tt.pathContext != "" { + bodyStringFuncValue = fmt.Sprintf("%s.body.string[key]", tt.pathContext) + } else { + bodyStringFuncValue = "body.string[key]" + } + assert.Equal(t, "body", p.Name()) + assert.Nil(t, p.Keys()) + assert.Equal(t, bodyStringFuncValue, p.String()) + if !contextParsedAsField { + assert.Equal(t, tt.pathContext, p.Context()) + } + p = p.Next() + assert.Equal(t, "string", p.Name()) + assert.Equal(t, bodyStringFuncValue, p.String()) + if !contextParsedAsField { + assert.Equal(t, tt.pathContext, p.Context()) + } + assert.Nil(t, p.Next()) + assert.Len(t, p.Keys(), 1) + v, err := p.Keys()[0].String(context.Background(), struct{}{}) + assert.NoError(t, err) + assert.Equal(t, "key", *v) + i, err := p.Keys()[0].Int(context.Background(), struct{}{}) + assert.NoError(t, err) + assert.Nil(t, i) + }) + } +} + func Test_baseKey_String(t *testing.T) { bp := baseKey[any]{ s: ottltest.Strp("test"), @@ -2386,7 +2535,7 @@ func Test_newKey(t *testing.T) { } ks := newKeys[any](keys) - assert.Equal(t, 2, len(ks)) + assert.Len(t, ks, 2) s, err := ks[0].String(context.Background(), nil) assert.NoError(t, err) diff --git a/pkg/ottl/go.mod b/pkg/ottl/go.mod index d508983fadbc..7902bd77b3e7 100644 --- a/pkg/ottl/go.mod +++ b/pkg/ottl/go.mod @@ -1,59 +1,58 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl -go 1.21.0 +go 1.22.0 require ( github.com/alecthomas/participle/v2 v2.1.1 + github.com/antchfx/xmlquery v1.4.2 + github.com/antchfx/xpath v1.3.2 + github.com/elastic/go-grok v0.3.1 github.com/gobwas/glob v0.2.3 + github.com/goccy/go-json v0.10.4 github.com/google/uuid v1.6.0 github.com/iancoleman/strcase v0.3.0 - github.com/json-iterator/go v1.1.12 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.116.0 + github.com/stretchr/testify v1.10.0 + github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/semconv v0.116.0 + go.opentelemetry.io/otel/trace v1.32.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 + golang.org/x/net v0.31.0 + golang.org/x/text v0.21.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/elastic/lunes v0.1.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/knadh/koanf/maps v0.1.1 // indirect - github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect - github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/hashicorp/golang-lru v0.5.4 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/magefile/mage v1.15.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/confmap v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/metric v1.27.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/sys v0.28.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/pkg/ottl/go.sum b/pkg/ottl/go.sum index 0f8d2a59c885..a5fd6b538dff 100644 --- a/pkg/ottl/go.sum +++ b/pkg/ottl/go.sum @@ -4,29 +4,41 @@ github.com/alecthomas/participle/v2 v2.1.1 h1:hrjKESvSqGHzRb4yW1ciisFJ4p3MGYih6i github.com/alecthomas/participle/v2 v2.1.1/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= -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/antchfx/xmlquery v1.4.2 h1:MZKd9+wblwxfQ1zd1AdrTsqVaMjMCwow3IqkCSe00KA= +github.com/antchfx/xmlquery v1.4.2/go.mod h1:QXhvf5ldTuGqhd1SHNvvtlhhdQLks4dD0awIVhXIDTA= +github.com/antchfx/xpath v1.3.2 h1:LNjzlsSjinu3bQpw9hWMY9ocB80oLOWuQqFvO6xt51U= +github.com/antchfx/xpath v1.3.2/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/elastic/go-grok v0.3.1 h1:WEhUxe2KrwycMnlvMimJXvzRa7DoByJB4PVUIE1ZD/U= +github.com/elastic/go-grok v0.3.1/go.mod h1:n38ls8ZgOboZRgKcjMY8eFeZFMmcL9n2lP0iHhIDk64= +github.com/elastic/lunes v0.1.0 h1:amRtLPjwkWtzDF/RKzcEPMvSsSseLDLW+bnhfNSLRe4= +github.com/elastic/lunes v0.1.0/go.mod h1:xGphYIt3XdZRtyWosHQTErsQTd4OP1p9wsbVoHelrd4= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= +github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= @@ -35,20 +47,12 @@ 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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= -github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= -github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= -github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= +github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -56,42 +60,37 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 h1:SIKIoA4e/5Y9ZOl0DCe3eVMLPOQzJxgZpfdHHeauNTM= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6/go.mod h1:BUbeWZiieNxAuuADTBNb3/aeje6on3DhU3rpWsQSB1E= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -101,44 +100,64 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/pkg/ottl/grammar.go b/pkg/ottl/grammar.go index 04352a6b7a8e..a1e5eb53a81d 100644 --- a/pkg/ottl/grammar.go +++ b/pkg/ottl/grammar.go @@ -6,6 +6,7 @@ package ottl // import "github.com/open-telemetry/opentelemetry-collector-contri import ( "encoding/hex" "fmt" + "strings" "github.com/alecthomas/participle/v2/lexer" ) @@ -19,17 +20,17 @@ type parsedStatement struct { } func (p *parsedStatement) checkForCustomError() error { + validator := &grammarCustomErrorsVisitor{} if p.Converter != nil { - return fmt.Errorf("editor names must start with a lowercase letter but got '%v'", p.Converter.Function) - } - err := p.Editor.checkForCustomError() - if err != nil { - return err + validator.add(fmt.Errorf("editor names must start with a lowercase letter but got '%v'", p.Converter.Function)) } + + p.Editor.accept(validator) if p.WhereClause != nil { - return p.WhereClause.checkForCustomError() + p.WhereClause.accept(validator) } - return nil + + return validator.join() } type constExpr struct { @@ -47,14 +48,16 @@ type booleanValue struct { SubExpr *booleanExpression `parser:"| '(' @@ ')' )"` } -func (b *booleanValue) checkForCustomError() error { +func (b *booleanValue) accept(v grammarVisitor) { if b.Comparison != nil { - return b.Comparison.checkForCustomError() + b.Comparison.accept(v) + } + if b.ConstExpr != nil && b.ConstExpr.Converter != nil { + b.ConstExpr.Converter.accept(v) } if b.SubExpr != nil { - return b.SubExpr.checkForCustomError() + b.SubExpr.accept(v) } - return nil } // opAndBooleanValue represents the right side of an AND boolean expression. @@ -63,8 +66,10 @@ type opAndBooleanValue struct { Value *booleanValue `parser:"@@"` } -func (b *opAndBooleanValue) checkForCustomError() error { - return b.Value.checkForCustomError() +func (b *opAndBooleanValue) accept(v grammarVisitor) { + if b.Value != nil { + b.Value.accept(v) + } } // term represents an arbitrary number of boolean values joined by AND. @@ -73,18 +78,15 @@ type term struct { Right []*opAndBooleanValue `parser:"@@*"` } -func (b *term) checkForCustomError() error { - err := b.Left.checkForCustomError() - if err != nil { - return err +func (b *term) accept(v grammarVisitor) { + if b.Left != nil { + b.Left.accept(v) } for _, r := range b.Right { - err = r.checkForCustomError() - if err != nil { - return err + if r != nil { + r.accept(v) } } - return nil } // opOrTerm represents the right side of an OR boolean expression. @@ -93,8 +95,10 @@ type opOrTerm struct { Term *term `parser:"@@"` } -func (b *opOrTerm) checkForCustomError() error { - return b.Term.checkForCustomError() +func (b *opOrTerm) accept(v grammarVisitor) { + if b.Term != nil { + b.Term.accept(v) + } } // booleanExpression represents a true/false decision expressed @@ -105,17 +109,20 @@ type booleanExpression struct { } func (b *booleanExpression) checkForCustomError() error { - err := b.Left.checkForCustomError() - if err != nil { - return err + validator := &grammarCustomErrorsVisitor{} + b.accept(validator) + return validator.join() +} + +func (b *booleanExpression) accept(v grammarVisitor) { + if b.Left != nil { + b.Left.accept(v) } for _, r := range b.Right { - err = r.checkForCustomError() - if err != nil { - return err + if r != nil { + r.accept(v) } } - return nil } // compareOp is the type of a comparison operator. @@ -178,13 +185,9 @@ type comparison struct { Right value `parser:"@@"` } -func (c *comparison) checkForCustomError() error { - err := c.Left.checkForCustomError() - if err != nil { - return err - } - err = c.Right.checkForCustomError() - return err +func (c *comparison) accept(v grammarVisitor) { + c.Left.accept(v) + c.Right.accept(v) } // editor represents the function call of a statement. @@ -195,19 +198,11 @@ type editor struct { Keys []key `parser:"( @@ )*"` } -func (i *editor) checkForCustomError() error { - var err error - +func (i *editor) accept(v grammarVisitor) { + v.visitEditor(i) for _, arg := range i.Arguments { - err = arg.checkForCustomError() - if err != nil { - return err - } + arg.accept(v) } - if i.Keys != nil { - return fmt.Errorf("only paths and converters may be indexed, not editors, but got %v %v", i.Function, i.Keys) - } - return nil } // converter represents a converter function call. @@ -217,14 +212,22 @@ type converter struct { Keys []key `parser:"( @@ )*"` } +func (c *converter) accept(v grammarVisitor) { + if c.Arguments != nil { + for _, a := range c.Arguments { + a.accept(v) + } + } +} + type argument struct { Name string `parser:"(@(Lowercase(Uppercase | Lowercase)*) Equal)?"` Value value `parser:"( @@"` FunctionName *string `parser:"| @(Uppercase(Uppercase | Lowercase)*) )"` } -func (a *argument) checkForCustomError() error { - return a.Value.checkForCustomError() +func (a *argument) accept(v grammarVisitor) { + a.Value.accept(v) } // value represents a part of a parsed statement which is resolved to a value of some sort. This can be a telemetry path @@ -237,22 +240,33 @@ type value struct { String *string `parser:"| @String"` Bool *boolean `parser:"| @Boolean"` Enum *enumSymbol `parser:"| @Uppercase (?! Lowercase)"` + Map *mapValue `parser:"| @@"` List *list `parser:"| @@)"` } -func (v *value) checkForCustomError() error { +func (v *value) accept(vis grammarVisitor) { + vis.visitValue(v) if v.Literal != nil { - return v.Literal.checkForCustomError() + v.Literal.accept(vis) } if v.MathExpression != nil { - return v.MathExpression.checkForCustomError() + v.MathExpression.accept(vis) + } + if v.Map != nil { + v.Map.accept(vis) + } + if v.List != nil { + for _, i := range v.List.Values { + i.accept(vis) + } } - return nil } // path represents a telemetry path mathExpression. type path struct { - Fields []field `parser:"@@ ( '.' @@ )*"` + Pos lexer.Position + Context string `parser:"(@Lowercase '.')?"` + Fields []field `parser:"@@ ( '.' @@ )*"` } // field is an item within a path. @@ -270,6 +284,23 @@ type list struct { Values []value `parser:"'[' (@@)* (',' @@)* ']'"` } +type mapValue struct { + Values []mapItem `parser:"'{' (@@ ','?)* '}'"` +} + +func (m *mapValue) accept(v grammarVisitor) { + for _, i := range m.Values { + if i.Value != nil { + i.Value.accept(v) + } + } +} + +type mapItem struct { + Key *string `parser:"@String ':'"` + Value *value `parser:"@@"` +} + // byteSlice type for capturing byte slices type byteSlice []byte @@ -308,11 +339,17 @@ type mathExprLiteral struct { Path *path `parser:"| @@ )"` } -func (m *mathExprLiteral) checkForCustomError() error { +func (m *mathExprLiteral) accept(v grammarVisitor) { + v.visitMathExprLiteral(m) + if m.Path != nil { + v.visitPath(m.Path) + } if m.Editor != nil { - return fmt.Errorf("converter names must start with an uppercase letter but got '%v'", m.Editor.Function) + m.Editor.accept(v) + } + if m.Converter != nil { + m.Converter.accept(v) } - return nil } type mathValue struct { @@ -320,11 +357,13 @@ type mathValue struct { SubExpression *mathExpression `parser:"| '(' @@ ')' )"` } -func (m *mathValue) checkForCustomError() error { +func (m *mathValue) accept(v grammarVisitor) { if m.Literal != nil { - return m.Literal.checkForCustomError() + m.Literal.accept(v) + } + if m.SubExpression != nil { + m.SubExpression.accept(v) } - return m.SubExpression.checkForCustomError() } type opMultDivValue struct { @@ -332,8 +371,10 @@ type opMultDivValue struct { Value *mathValue `parser:"@@"` } -func (m *opMultDivValue) checkForCustomError() error { - return m.Value.checkForCustomError() +func (m *opMultDivValue) accept(v grammarVisitor) { + if m.Value != nil { + m.Value.accept(v) + } } type addSubTerm struct { @@ -341,18 +382,15 @@ type addSubTerm struct { Right []*opMultDivValue `parser:"@@*"` } -func (m *addSubTerm) checkForCustomError() error { - err := m.Left.checkForCustomError() - if err != nil { - return err +func (m *addSubTerm) accept(v grammarVisitor) { + if m.Left != nil { + m.Left.accept(v) } for _, r := range m.Right { - err = r.checkForCustomError() - if err != nil { - return err + if r != nil { + r.accept(v) } } - return nil } type opAddSubTerm struct { @@ -360,8 +398,10 @@ type opAddSubTerm struct { Term *addSubTerm `parser:"@@"` } -func (m *opAddSubTerm) checkForCustomError() error { - return m.Term.checkForCustomError() +func (r *opAddSubTerm) accept(v grammarVisitor) { + if r.Term != nil { + r.Term.accept(v) + } } type mathExpression struct { @@ -369,18 +409,17 @@ type mathExpression struct { Right []*opAddSubTerm `parser:"@@*"` } -func (m *mathExpression) checkForCustomError() error { - err := m.Left.checkForCustomError() - if err != nil { - return err +func (m *mathExpression) accept(v grammarVisitor) { + if m.Left != nil { + m.Left.accept(v) } - for _, r := range m.Right { - err = r.checkForCustomError() - if err != nil { - return err + if m.Right != nil { + for _, r := range m.Right { + if r != nil { + r.accept(v) + } } } - return nil } type mathOp int @@ -444,9 +483,80 @@ func buildLexer() *lexer.StatefulDefinition { {Name: `Equal`, Pattern: `=`}, {Name: `LParen`, Pattern: `\(`}, {Name: `RParen`, Pattern: `\)`}, + {Name: `LBrace`, Pattern: `\{`}, + {Name: `RBrace`, Pattern: `\}`}, + {Name: `Colon`, Pattern: `\:`}, {Name: `Punct`, Pattern: `[,.\[\]]`}, {Name: `Uppercase`, Pattern: `[A-Z][A-Z0-9_]*`}, {Name: `Lowercase`, Pattern: `[a-z][a-z0-9_]*`}, {Name: "whitespace", Pattern: `\s+`}, }) } + +// grammarCustomError represents a grammar error in which the statement has a valid syntax +// according to the grammar's definition, but is still logically invalid. +type grammarCustomError struct { + errs []error +} + +// Error returns all errors messages separate by semicolons. +func (e *grammarCustomError) Error() string { + switch len(e.errs) { + case 0: + return "" + case 1: + return e.errs[0].Error() + default: + var b strings.Builder + b.WriteString(e.errs[0].Error()) + for _, err := range e.errs[1:] { + b.WriteString("; ") + b.WriteString(err.Error()) + } + return b.String() + } +} + +func (e *grammarCustomError) Unwrap() []error { + return e.errs +} + +// grammarVisitor allows accessing the grammar AST nodes using the visitor pattern. +type grammarVisitor interface { + visitPath(v *path) + visitEditor(v *editor) + visitValue(v *value) + visitMathExprLiteral(v *mathExprLiteral) +} + +// grammarCustomErrorsVisitor is used to execute custom validations on the grammar AST. +type grammarCustomErrorsVisitor struct { + errs []error +} + +func (g *grammarCustomErrorsVisitor) add(err error) { + g.errs = append(g.errs, err) +} + +func (g *grammarCustomErrorsVisitor) join() error { + if len(g.errs) == 0 { + return nil + } + return &grammarCustomError{errs: g.errs} +} + +func (g *grammarCustomErrorsVisitor) visitPath(_ *path) {} + +func (g *grammarCustomErrorsVisitor) visitValue(_ *value) {} + +func (g *grammarCustomErrorsVisitor) visitEditor(v *editor) { + if v.Keys != nil { + g.add(fmt.Errorf("only paths and converters may be indexed, not editors, but got %s%s", v.Function, buildOriginalKeysText(v.Keys))) + } +} + +func (g *grammarCustomErrorsVisitor) visitMathExprLiteral(v *mathExprLiteral) { + if v.Editor != nil { + g.add(fmt.Errorf("converter names must start with an uppercase letter but got '%v'", v.Editor.Function)) + } +} diff --git a/pkg/ottl/lexer_test.go b/pkg/ottl/lexer_test.go index 289145f8a05c..b73d71d80e8f 100644 --- a/pkg/ottl/lexer_test.go +++ b/pkg/ottl/lexer_test.go @@ -78,7 +78,7 @@ func Test_lexer(t *testing.T) { {"OpNot", "not"}, {"Boolean", "false"}, }}, - {"nothing_recognizable", "{}", true, []result{ + {"nothing_recognizable", "|", true, []result{ {"", ""}, }}, {"basic_ident_expr", `set(attributes["bytes"], 0x0102030405060708)`, false, []result{ @@ -123,6 +123,13 @@ func Test_lexer(t *testing.T) { {"OpMultDiv", "*"}, {"Float", "2.9"}, }}, + {"Map", `{"foo":"bar"}`, false, []result{ + {"LBrace", "{"}, + {"String", `"foo"`}, + {"Colon", ":"}, + {"String", `"bar"`}, + {"RBrace", "}"}, + }}, } for _, tt := range tests { diff --git a/pkg/ottl/math_test.go b/pkg/ottl/math_test.go index 5f3d7281dc7c..4f1af566d5ea 100644 --- a/pkg/ottl/math_test.go +++ b/pkg/ottl/math_test.go @@ -576,7 +576,6 @@ func Test_evaluateMathExpression_error(t *testing.T) { assert.Error(t, err) assert.ErrorContains(t, err, tt.errorMsg) } - } else { parsed, err := mathParser.ParseString("", tt.input) assert.NoError(t, err) @@ -588,7 +587,6 @@ func Test_evaluateMathExpression_error(t *testing.T) { assert.Nil(t, result) assert.Error(t, err) } - }) } } @@ -623,7 +621,7 @@ func Test_evaluateMathExpressionTimeDuration(t *testing.T) { tenHoursetc, err := time.ParseDuration("10h47m48s11ns") require.NoError(t, err) - var tests = []struct { + tests := []struct { name string mathExpr *mathExpression expected any diff --git a/pkg/ottl/ottlfuncs/README.md b/pkg/ottl/ottlfuncs/README.md index e9d0c62ff566..8a4aec76ca5b 100644 --- a/pkg/ottl/ottlfuncs/README.md +++ b/pkg/ottl/ottlfuncs/README.md @@ -29,9 +29,9 @@ In these situations the function will error if it does not know how to do the co Use `ErrorMode` to determine how the `Statement` handles these errors. See the component-specific guides for how each uses error mode: -- [filterprocessor](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/filterprocessor#ottl) -- [routingprocessor](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/routingprocessor#tech-preview-opentelemetry-transformation-language-statements-as-routing-conditions) -- [transformprocessor](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/transformprocessor#config) +- [filterprocessor](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/filterprocessor/README.md#configuration) +- [routingconnector](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/connector/routingconnector/README.md#configuration) +- [transformprocessor](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/transformprocessor/README.md#config) ## Editors @@ -39,14 +39,16 @@ Editors are what OTTL uses to transform telemetry. Editors: -- Are allowed to transform telemetry. When a Function is invoked the expectation is that the underlying telemetry is modified in some way. -- May have side effects. Some Functions may generate telemetry and add it to the telemetry payload to be processed in this batch. -- May return values. Although not common and not required, Functions may return values. +- Are allowed to transform telemetry. When an Editor is invoked the expectation is that the underlying telemetry is modified in some way. +- May have side effects. Some Editors may generate telemetry and add it to the telemetry payload to be processed in this batch. +- May return values. Although not common and not required, Editors may return values. Available Editors: +- [append](#append) - [delete_key](#delete_key) - [delete_matching_keys](#delete_matching_keys) +- [keep_matching_keys](#keep_matching_keys) - [flatten](#flatten) - [keep_keys](#keep_keys) - [limit](#limit) @@ -58,6 +60,19 @@ Available Editors: - [set](#set) - [truncate_all](#truncate_all) +### append + +`append(target, Optional[value], Optional[values])` + +The `append` function appends single or multiple string values to `target`. +`append` converts scalar values into an array if the field exists but is not an array, and creates an array containing the provided values if the field doesn’t exist. + +Resulting field is always of type `pcommon.Slice` and will not convert the types of existing or new items in the slice. This means that it is possible to create a slice whose elements have different types. Be careful when using `append` to set attribute values, as this will produce values that are not possible to create through OpenTelemetry APIs [according to](https://opentelemetry.io/docs/specs/otel/common/#attribute) the OpenTelemetry specification. + +- `append(attributes["tags"], "prod")` +- `append(attributes["tags"], values = ["staging", "staging:east"])` +- `append(attributes["tags_copy"], attributes["tags"])` + ### delete_key `delete_key(target, key)` @@ -92,6 +107,23 @@ Examples: - `delete_matching_keys(resource.attributes, "(?i).*password.*")` +### keep_matching_keys + +`keep_matching_keys(target, pattern)` + +The `keep_matching_keys` function keeps all keys from a `pcommon.Map` that match a regex pattern. + +`target` is a path expression to a `pcommon.Map` type field. `pattern` is a regex string. + +All keys that match the pattern will remain in the map, while non matching keys will be removed. + +Examples: + + +- `keep_matching_keys(attributes, "(?i).*version.*")` + +- `keep_matching_keys(resource.attributes, "(?i).*version.*")` + ### flatten `flatten(target, Optional[prefix], Optional[depth])` @@ -378,25 +410,35 @@ Unlike functions, they do not modify any input telemetry and always return a val Available Converters: - [Base64Decode](#base64decode) +- [Decode](#decode) - [Concat](#concat) - [ConvertCase](#convertcase) +- [ConvertAttributesToElementsXML](#convertattributestoelementsxml) +- [ConvertTextToElementsXML](#converttexttoelementsxml) - [Day](#day) +- [Double](#double) +- [Duration](#duration) - [ExtractPatterns](#extractpatterns) +- [ExtractGrokPatterns](#extractgrokpatterns) - [FNV](#fnv) +- [Format](#format) +- [GetXML](#getxml) +- [Hex](#hex) - [Hour](#hour) - [Hours](#hours) -- [Double](#double) -- [Duration](#duration) +- [InsertXML](#insertxml) - [Int](#int) - [IsBool](#isbool) - [IsDouble](#isdouble) - [IsInt](#isint) +- [IsRootSpan](#isrootspan) - [IsMap](#ismap) - [IsMatch](#ismatch) - [IsList](#islist) - [IsString](#isstring) - [Len](#len) - [Log](#log) +- [MD5](#md5) - [Microseconds](#microseconds) - [Milliseconds](#milliseconds) - [Minute](#minute) @@ -407,15 +449,21 @@ Available Converters: - [ParseCSV](#parsecsv) - [ParseJSON](#parsejson) - [ParseKeyValue](#parsekeyvalue) +- [ParseSimplifiedXML](#parsesimplifiedxml) - [ParseXML](#parsexml) +- [RemoveXML](#removexml) - [Seconds](#seconds) - [SHA1](#sha1) - [SHA256](#sha256) +- [SHA512](#sha512) +- [SliceToMap](#slicetomap) +- [Sort](#sort) - [SpanID](#spanid) - [Split](#split) - [String](#string) - [Substring](#substring) - [Time](#time) +- [ToKeyValueString](#tokeyvaluestring) - [TraceID](#traceid) - [TruncateTime](#truncatetime) - [Unix](#unix) @@ -423,10 +471,13 @@ Available Converters: - [UnixMilli](#unixmilli) - [UnixNano](#unixnano) - [UnixSeconds](#unixseconds) +- [UserAgent](#useragent) - [UUID](#UUID) - [Year](#year) -### Base64Decode +### Base64Decode (Deprecated) + +*This function has been deprecated. Please use the [Decode](#decode) function instead.* `Base64Decode(value)` @@ -441,6 +492,22 @@ Examples: - `Base64Decode(attributes["encoded field"])` +### Decode + +`Decode(value, encoding)` + +The `Decode` Converter takes a string or byte array encoded with the specified encoding and returns the decoded string. + +`value` is a valid encoded string or byte array. +`encoding` is a valid encoding name included in the [IANA encoding index](https://www.iana.org/assignments/character-sets/character-sets.xhtml). + +Examples: + +- `Decode("aGVsbG8gd29ybGQ=", "base64")` + + +- `Decode(attributes["encoded field"], "us-ascii")` + ### Concat `Concat(values[], delimiter)` @@ -484,6 +551,61 @@ Examples: - `ConvertCase(metric.name, "snake")` +### ConvertAttributesToElementsXML + +`ConvertAttributesToElementsXML(target, Optional[xpath])` + +The `ConvertAttributesToElementsXML` Converter returns an edited version of an XML string where attributes are converted into child elements. + +`target` is a Getter that returns a string. This string should be in XML format. +If `target` is not a string, nil, or cannot be parsed as XML, `ConvertAttributesToElementsXML` will return an error. + +`xpath` (optional) is a string that specifies an [XPath](https://www.w3.org/TR/1999/REC-xpath-19991116/) expression that +selects one or more elements. Attributes will only be converted within the result(s) of the xpath. + +For example, `baz` will be converted to `bazbar`. + +Examples: + +Convert all attributes in a document + +- `ConvertAttributesToElementsXML(body)` + +Convert only attributes within "Record" elements + +- `ConvertAttributesToElementsXML(body, "/Log/Record")` + +### ConvertTextToElementsXML + +`ConvertTextToElementsXML(target, Optional[xpath], Optional[elementName])` + +The `ConvertTextToElementsXML` Converter returns an edited version of an XML string where all text belongs to a dedicated element. + +`target` is a Getter that returns a string. This string should be in XML format. +If `target` is not a string, nil, or cannot be parsed as XML, `ConvertTextToElementsXML` will return an error. + +`xpath` (optional) is a string that specifies an [XPath](https://www.w3.org/TR/1999/REC-xpath-19991116/) expression that +selects one or more elements. Content will only be converted within the result(s) of the xpath. The default is `/`. + +`elementName` (optional) is a string that is used for any element tags that are created to wrap content. +The default is `"value"`. + +For example, `foobar` will be converted to `foobar`. + +Examples: + +Ensure all text content in a document is wrapped in a dedicated element + +- `ConvertTextToElementsXML(body)` + +Use a custom name for any new elements + +- `ConvertTextToElementsXML(body, elementName = "custom")` + +Convert only part of the document + +- `ConvertTextToElementsXML(body, "/some/part/", "value")` + ### Day `Day(value)` @@ -553,6 +675,97 @@ Examples: - `ExtractPatterns(body, "^(?P\\w+ \\w+ [0-9]+:[0-9]+:[0-9]+) (?P([A-Za-z0-9-_]+)) (?P\\w+)(\\[(?P\\d+)\\])?: (?P.*)$")` +### ExtractGrokPatterns + +`ExtractGrokPatterns(target, pattern, Optional[namedCapturesOnly], Optional[patternDefinitions])` + +The `ExtractGrokPatterns` Converter parses unstructured data into a format that is structured and queryable. +It returns a `pcommon.Map` struct that is a result of extracting named capture groups from the target string. If no matches are found then an empty `pcommon.Map` is returned. + +- `target` is a Getter that returns a string. +- `pattern` is a grok pattern string. +- `namedCapturesOnly` (optional) specifies if non-named captures should be returned. +- `patternDefinitions` (optional) is a list of custom pattern definition strings used inside `pattern` in the form of `PATTERN_NAME=PATTERN`. +This parameter lets you define your own custom patterns to improve readability when the extracted `pattern` is not part of the default set or when you need custom naming. + +If `target` is not a string or nil `ExtractGrokPatterns` returns an error. If `pattern` does not contain at least 1 named capture group and `namedCapturesOnly` is set to `true` then `ExtractPatterns` errors on startup. + +Parsing is done using [Elastic Go-Grok](https://github.com/elastic/go-grok?tab=readme-ov-file) library. +Grok is a regular expression dialect that supports reusable aliased expressions. It sits on `re2` regex library so any valid `re2` expressions are valid in grok. +Grok uses this regular expression language to allow naming existing patterns and combining them into more complex patterns that match your fields + +Pattern can be specified in either of these forms: + - `%{SYNTAX}` - e.g {NUMBER} + - `%{SYNTAX:ID}` - e.g {NUMBER:MY_AGE} + - `%{SYNTAX:ID:TYPE}` - e.g {NUMBER:MY_AGE:INT} + +Where `SYNTAX` is a pattern that will match your text, `ID` is identifier you give to the piece of text being matched and `TYPE` data type you want to cast your named field. +Supported types are `int`, `long`, `double`, `float` and boolean + +The [Elastic Go-Grok](https://github.com/elastic/go-grok) ships with numerous predefined grok patterns that simplify working with grok. +In collector Complete set is included consisting of a default set and all additional sets adding product/tool specific capabilities (like [aws](https://github.com/elastic/go-grok/blob/main/patterns/aws.go) or [java](https://github.com/elastic/go-grok/blob/main/patterns/java.go) patterns). + + +Default set consists of: + +| Name | Example | +|-----|-----| +| WORD | "hello", "world123", "test_data" | +| NOTSPACE | "example", "text-with-dashes", "12345" | +| SPACE | " ", "\t", " " | +| INT | "123", "-456", "+789" | +| NUMBER | "123", "456.789", "-0.123" | +| BOOL |"true", "false", "true" | +| BASE10NUM | "123", "-123.456", "0.789" | +| BASE16NUM | "1a2b", "0x1A2B", "-0x1a2b3c" | +| BASE16FLOAT | "0x1.a2b3", "-0x1A2B3C.D" | +| POSINT | "123", "456", "789" | +| NONNEGINT | "0", "123", "456" | +| GREEDYDATA |"anything goes", "literally anything", "123 #@!" | +| QUOTEDSTRING | "\"This is a quote\"", "'single quoted'" | +| UUID |"123e4567-e89b-12d3-a456-426614174000" | +| URN | "urn:isbn:0451450523", "urn:ietf:rfc:2648" | + +and many more. Complete list can be found [here](https://github.com/elastic/go-grok/blob/main/patterns/default.go). + +Examples: + +- _Uses regex pattern with named captures to extract_: + + `ExtractGrokPatterns(attributes["k8s.change_cause"], "GIT_SHA=(?P\w+)")` + +- _Uses regex pattern with named captures to extract_: + + `ExtractGrokPatterns(body, "^(?P\\w+ \\w+ [0-9]+:[0-9]+:[0-9]+) (?P([A-Za-z0-9-_]+)) (?P\\w+)(\\[(?P\\d+)\\])?: (?P.*)$")` + +- _Uses `URI` from default set to extract URI and includes only named captures_: + + `ExtractGrokPatterns(body, "%{URI}", true)` + +- _Uses more complex pattern consisting of elements from default set and includes only named captures_: + + `ExtractGrokPatterns(body, "%{DATESTAMP:timestamp} %{TZ:event.timezone} %{DATA:user.name} %{GREEDYDATA:postgresql.log.connection_id} %{POSINT:process.pid:int}", true)` + +- _Uses `LOGLINE` pattern defined in `patternDefinitions` passed as last argument_: + + `ExtractGrokPatterns(body, "%{LOGLINE}", true, ["LOGLINE=%{DATESTAMP:timestamp} %{TZ:event.timezone} %{DATA:user.name} %{GREEDYDATA:postgresql.log.connection_id} %{POSINT:process.pid:int}"])` + +- Add custom patterns to parse the password from `/etc/passwd` and making `pattern` readable: + + - `pattern`: `%{USERNAME:user.name}:%{PASSWORD:user.password}:%{USERINFO}` + - `patternDefinitions`: + - `PASSWORD=%{WORD}` + - `USERINFO=%{GREEDYDATA}` + + Note that `USERNAME` is in the default pattern set and does not need to be redefined. + + - Target: `smith:pass123:1001:1000:J Smith,1234,(234)567-8910,(234)567-1098,email:/home/smith:/bin/sh` + + - Return values: + - `user.name`: smith + - `user.password`: pass123 + + ### FNV `FNV(value)` @@ -572,6 +785,95 @@ Examples: - `FNV("name")` +### Format + +```Format(formatString, []formatArguments)``` + +The `Format` Converter takes the given format string and formats it using `fmt.Sprintf` and the given arguments. + +`formatString` is a string. `formatArguments` is an array of values. + +If the `formatString` is not a string or does not exist, the `Format` Converter will return an error. +If any of the `formatArgs` are incorrect (e.g. missing, or an incorrect type for the corresponding format specifier), then a string will still be returned, but with Go's default error handling for `fmt.Sprintf`. + +Format specifiers that can be used in `formatString` are documented in Go's [fmt package documentation](https://pkg.go.dev/fmt#hdr-Printing) + +Examples: + +- `Format("%02d", [attributes["priority"]])` +- `Format("%04d-%02d-%02d", [Year(Now()), Month(Now()), Day(Now())])` +- `Format("%s/%s/%04d-%02d-%02d.log", [attributes["hostname"], body["program"], Year(Now()), Month(Now()), Day(Now())])` + + +### GetXML + +`GetXML(target, xpath)` + +The `GetXML` Converter returns an XML string with selected elements. + +`target` is a Getter that returns a string. This string should be in XML format. +If `target` is not a string, nil, or is not valid xml, `GetXML` will return an error. + +`xpath` is a string that specifies an [XPath](https://www.w3.org/TR/1999/REC-xpath-19991116/) expression that +selects one or more elements. Currently, this converter only supports selecting elements. + +Examples: + +Get all elements at the root of the document with tag "a" + +- `GetXML(body, "/a")` + +Gel all elements anywhere in the document with tag "a" + +- `GetXML(body, "//a")` + +Get the first element at the root of the document with tag "a" + +- `GetXML(body, "/a[1]")` + +Get all elements in the document with tag "a" that have an attribute "b" with value "c" + +- `GetXML(body, "//a[@b='c']")` + +Get `foo` from `foo` + +- `GetXML(body, "/a/text()")` + +Get `hello` from `` + +- `GetXML(body, "/a/text()")` + +Get `bar` from `` + +- `GetXML(body, "/a/@foo")` + +### Hex + +`Hex(value)` + +The `Hex` converter converts the `value` to its hexadecimal representation. + +The returned type is string representation of the hexadecimal value. + +The input `value` types: + +- float64 (`1.1` will result to `0x3ff199999999999a`) +- string (`"1"` will result in `0x31`) +- bool (`true` will result in `0x01`; `false` to `0x00`) +- int64 (`12` will result in `0xC`) +- []byte (without any changes - `0x02` will result to `0x02`) + +If `value` is another type or parsing failed nil is always returned. + +The `value` is either a path expression to a telemetry field to retrieve or a literal. + +Examples: + +- `Hex(attributes["http.status_code"])` + + +- `Hex(2.0)` + ### Hour `Hour(value)` @@ -600,6 +902,35 @@ Examples: - `Hours(Duration("1h"))` +### InsertXML + +`InsertXML(target, xpath, value)` + +The `InsertXML` Converter returns an edited version of an XML string with child elements added to selected elements. + +`target` is a Getter that returns a string. This string should be in XML format and represents the document which will +be modified. If `target` is not a string, nil, or is not valid xml, `InsertXML` will return an error. + +`xpath` is a string that specifies an [XPath](https://www.w3.org/TR/1999/REC-xpath-19991116/) expression that +selects one or more elements. + +`value` is a Getter that returns a string. This string should be in XML format and represents the document which will +be inserted into `target`. If `value` is not a string, nil, or is not valid xml, `InsertXML` will return an error. + +Examples: + +Add an element "foo" to the root of the document + +- `InsertXML(body, "/", "")` + +Add an element "bar" to any element called "foo" + +- `InsertXML(body, "//foo", "")` + +Fetch and insert an xml document into another + +- `InsertXML(body, "/subdoc", attributes["subdoc"])` + ### Int `Int(value)` @@ -684,6 +1015,23 @@ Examples: - `IsInt(attributes["maybe a int"])` +### IsRootSpan + +`IsRootSpan()` + +The `IsRootSpan` Converter returns `true` if the span in the corresponding context is root, which means +its `parent_span_id` is equal to hexadecimal representation of zero. + +This function is supported with [OTTL span context](../contexts/ottlspan/README.md). In any other context it is not supported. + +The function returns `false` in all other scenarios, including `parent_span_id == ""` or `parent_span_id == nil`. + +Examples: + +- `IsRootSpan()` + +- `set(attributes["isRoot"], "true") where IsRootSpan()` + ### IsMap `IsMap(value)` @@ -799,6 +1147,26 @@ Examples: - `Int(Log(attributes["duration_ms"])` +### MD5 + +`MD5(value)` + +The `MD5` Converter converts the `value` to a md5 hash/digest. + +The returned type is string. + +`value` is either a path expression to a string telemetry field or a literal string. If `value` is another type an error is returned. + +If an error occurs during hashing it will be returned. + +Examples: + +- `MD5(attributes["device.name"])` + +- `MD5("name")` + +**Note:** According to the National Institute of Standards and Technology (NIST), MD5 is no longer a recommended hash function. It should be avoided except when required for compatibility. New uses should prefer a SHA-2 family function (e.g. SHA-256, SHA-512) whenever possible. + ### Microseconds `Microseconds(value)` @@ -932,12 +1300,12 @@ Examples: `ParseJSON(target)` -The `ParseJSON` Converter returns a `pcommon.Map` struct that is a result of parsing the target string as JSON +The `ParseJSON` Converter returns a `pcommon.Map` or `pcommon.Slice` struct that is a result of parsing the target string as JSON `target` is a Getter that returns a string. This string should be in json format. If `target` is not a string, nil, or cannot be parsed as JSON, `ParseJSON` will return an error. -Unmarshalling is done using [jsoniter](https://github.com/json-iterator/go). +Unmarshalling is done using [goccy/go-json](https://github.com/goccy/go-json). Each JSON type is converted into a `pdata.Value` using the following map: ``` @@ -954,6 +1322,9 @@ Examples: - `ParseJSON("{\"attr\":true}")` +- `ParseJSON("[\"attr1\",\"attr2\"]")` + + - `ParseJSON(attributes["kubernetes"])` @@ -978,6 +1349,132 @@ Examples: - `ParseKeyValue("k1!v1_k2!v2_k3!v3", "!", "_")` - `ParseKeyValue(attributes["pairs"])` +### ParseSimplifiedXML + +`ParseSimplifiedXML(target)` + +The `ParseSimplifiedXML` Converter returns a `pcommon.Map` struct that is the result of parsing the target string without preservation of attributes or extraneous text content. + +The goal of this Converter is to produce a more user-friendly representation of XML data than the [`ParseXML`](#parsexml) Converter. +This Converter should be preferred over `ParseXML` when minor semantic details (e.g. order of elements) are not critically important, when subsequent processing or querying of the result is expected, or when human-readability is a concern. + +This Converter disregards certain aspects of XML, specifically attributes and extraneous text content, in order to produce +a direct representation of XML data. Users are encouraged to simplify their XML documents prior to using `ParseSimplifiedXML`. + +See other functions which may be useful for preparing XML documents: + +- [`ConvertAttributesToElementsXML`](#convertattributestoelementsxml) +- [`ConvertTextToElementsXML`](#converttexttoelementsxml) +- [`RemoveXML`](#removexml) +- [`InsertXML`](#insertxml) +- [`GetXML`](#getxml) + +#### Formal Definitions + +A "Simplified XML" document contains no attributes and no extraneous text content. + +An element has "extraneous text content" when it contains both text and element content. e.g. + +```xml + + bar + world + +``` + +#### Parsing logic + +1. Declaration elements, attributes, comments, and extraneous text content are ignored. +2. Elements which contain a value are converted into key/value pairs. + e.g. `bar` becomes `"foo": "bar"` +3. Elements which contain child elements are converted into a key/value pair where the value is a map. + e.g. ` baz ` becomes `"foo": { "bar": "baz" }` +4. Sibling elements that share the same tag will be combined into a slice. + e.g. ` 1 2 3 ` becomes `"a": { "b": "1", "c": [ "2", "3" ] }`. +5. Empty elements are dropped, but they can determine whether a value should be a slice or map. + e.g. ` 1 ` becomes `"a": { "b": [ "1" ] }` instead of `"a": { "b": "1" }` + +#### Examples + +Parse a Simplified XML document from the body: + +```xml + + 1 + jane +
+ + Something happened + unknown +
+
+``` + +```json +{ + "event": { + "id": 1, + "user": "jane", + "details": { + "time": "2021-10-01T12:00:00Z", + "description": "Something happened", + "cause": "unknown" + } + } +} +``` + +Parse a Simplified XML document with unique child elements: + +```xml + + 1 + 2 + +``` + +```json +{ + "x": { + "y": "1", + "z": "2" + } +} +``` + +Parse a Simplified XML document with multiple elements of the same tag: + +```xml + + 1 + 2 + +``` + +```json +{ + "a": { + "b": ["1", "2"] + } +} +``` + +Parse a Simplified XML document with CDATA element: + +```xml + + 1 + + +``` + +```json +{ + "a": { + "b": ["1", "2"] + } +} +``` ### ParseXML @@ -1049,7 +1546,70 @@ Examples: - `ParseXML("")` +### RemoveXML + +`RemoveXML(target, xpath)` + +The `RemoveXML` Converter returns an edited version of an XML string with selected elements removed. + +`target` is a Getter that returns a string. This string should be in XML format. +If `target` is not a string, nil, or is not valid xml, `RemoveXML` will return an error. + +`xpath` is a string that specifies an [XPath](https://www.w3.org/TR/1999/REC-xpath-19991116/) expression that +selects one or more elements to remove from the XML document. + +For example, the XPath `/Log/Record[./Name/@type="archive"]` applied to the following XML document: + +```xml + + + + 00001 + + Some data + + + 00002 + + Some data + + +``` + +will return: + +```xml + + + + 00002 + + Some data + + +``` + +Examples: + +Delete the attribute "foo" from the elements with tag "a" + +- `RemoveXML(body, "/a/@foo")` + +Delete all elements with tag "b" that are children of elements with tag "a" + +- `RemoveXML(body, "/a/b")` + +Delete all elements with tag "b" that are children of elements with tag "a" and have the attribute "foo" with value "bar" + +- `RemoveXML(body, "/a/b[@foo='bar']")` +Delete all comments + +- `RemoveXML(body, "//comment()")` + +Delete text from nodes that contain the word "sensitive" + +- `RemoveXML(body, "//*[contains(text(), 'sensitive')]")` ### Seconds @@ -1084,7 +1644,7 @@ Examples: - `SHA1("name")` -**Note:** According to the National Institute of Standards and Technology (NIST), SHA1 is no longer a recommended hash function. It should be avoided except when required for compatibility. New uses should prefer FNV whenever possible. +**Note:** [According to the National Institute of Standards and Technology (NIST)](https://csrc.nist.gov/projects/hash-functions), SHA1 is no longer a recommended hash function. It should be avoided except when required for compatibility. New uses should prefer a SHA-2 family function (such as SHA-256 or SHA-512) whenever possible. ### SHA256 @@ -1102,10 +1662,113 @@ Examples: - `SHA256(attributes["device.name"])` - - `SHA256("name")` -**Note:** According to the National Institute of Standards and Technology (NIST), SHA256 is no longer a recommended hash function. It should be avoided except when required for compatibility. New uses should prefer FNV whenever possible. +### SHA512 + +`SHA512(input)` + +The `SHA512` converter calculates sha512 hash value/digest of the `input`. + +The returned type is string. + +`input` is either a path expression to a string telemetry field or a literal string. If `input` is another type, converter raises an error. +If an error occurs during hashing, the error will be returned. + +Examples: + +- `SHA512(attributes["device.name"])` + +- `SHA512("name")` + +### SliceToMap + +`SliceToMap(target, keyPath, Optional[valuePath])` + +The `SliceToMap` converter converts a slice of objects to a map. The arguments are as follows: + +- `target`: A list of maps containing the entries to be converted. +- `keyPath`: A string array that determines the name of the keys for the map entries by pointing to the value of an attribute within each slice item. Note that +the `keyPath` must resolve to a string value, otherwise the converter will not be able to convert the item +to a map entry. +- `valuePath`: This optional string array determines which attribute should be used as the value for the map entry. If no +`valuePath` is defined, the value of the map entry will be the same as the original slice item. + +Examples: + +The examples below will convert the following input: + +```yaml +attributes: + hello: world + things: + - name: foo + value: 2 + - name: bar + value: 5 +``` + +- `SliceToMap(attributes["things"], ["name"])`: + +This converts the input above to the following: + +```yaml +attributes: + hello: world + things: + foo: + name: foo + value: 2 + bar: + name: bar + value: 5 +``` + +- `SliceToMap(attributes["things"], ["name"], ["value"])`: + +This converts the input above to the following: + +```yaml +attributes: + hello: world + things: + foo: 2 + bar: 5 +``` + +Once the `SliceToMap` function has been applied to a value, the converted entries are addressable via their keys: + +- `set(attributes["thingsMap"], SliceToMap(attributes["things"], ["name"]))` +- `set(attributes["element_1"], attributes["thingsMap"]["foo'])` +- `set(attributes["element_2"], attributes["thingsMap"]["bar'])` + +### Sort + +`Sort(target, Optional[order])` + +The `Sort` Converter sorts the `target` array in either ascending or descending order. + +`target` is an array or `pcommon.Slice` typed field containing the elements to be sorted. + +`order` is a string specifying the sort order. Must be either `asc` or `desc`. The default value is `asc`. + +The Sort Converter preserves the data type of the original elements while sorting. +The behavior varies based on the types of elements in the target slice: + +| Element Types | Sorting Behavior | Return Value | +|---------------|-------------------------------------|--------------| +| Integers | Sorts as integers | Sorted array of integers | +| Doubles | Sorts as doubles | Sorted array of doubles | +| Integers and doubles | Converts all to doubles, then sorts | Sorted array of integers and doubles | +| Strings | Sorts as strings | Sorted array of strings | +| Booleans | Converts all to strings, then sorts | Sorted array of booleans | +| Mix of integers, doubles, booleans, and strings | Converts all to strings, then sorts | Sorted array of mixed types | +| Any other types | N/A | Returns an error | + +Examples: + +- `Sort(attributes["device.tags"])` +- `Sort(attributes["device.tags"], "desc")` ### SpanID @@ -1177,11 +1840,11 @@ Examples: ### Time -`Time(target, format, Optional[location])` +`Time(target, format, Optional[location], Optional[locale])` The `Time` Converter takes a string representation of a time and converts it to a Golang `time.Time`. -`target` is a string. `format` is a string, `location` is an optional string. +`target` is a string. `format` is a string, `location` is an optional string, `locale` is an optional string. If either `target` or `format` are nil, an error is returned. The parser used is the parser at [internal/coreinternal/parser](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/internal/coreinternal/timeutils). If the `target` and `format` do not follow the parsing rules used by this parser, an error is returned. @@ -1212,6 +1875,10 @@ If either `target` or `format` are nil, an error is returned. The parser used is |`%s` | Nanosecond as a zero-padded number | 00000000, ..., 99999999 | |`%z` | UTC offset in the form ±HHMM[SS[.ffffff]] or empty | +0000, -0400 | |`%Z` | Timezone name or abbreviation or empty | UTC, EST, CST | +|`%i` | Timezone as +/-HH | -07 | +|`%j` | Timezone as +/-HH:MM | -07:00 | +|`%k` | Timezone as +/-HH:MM:SS | -07:00:00 | +|`%w` | Timezone as +/-HHMMSS | -070000 | |`%D`, `%x` | Short MM/DD/YYYY date, equivalent to %m/%d/%y | 01/21/2031 | |`%F` | Short YYYY-MM-DD date, equivalent to %Y-%m-%d | 2031-01-21 | |`%T`,`%X` | ISO 8601 time format (HH:MM:SS), equivalent to %H:%M:%S | 02:55:02 | @@ -1241,6 +1908,55 @@ Examples: - `Time("2012-11-01T22:08:41+0000 EST", "%Y-%m-%dT%H:%M:%S%z %Z")` - `Time("2023-05-26 12:34:56", "%Y-%m-%d %H:%M:%S", "America/New_York")` +`locale` specifies the input language of the `target` value. It is used to interpret timestamp values written in a specific language, +ensuring that the function can correctly parse the localized month names, day names, and periods of the day based on the provided language. + +The value must be a well-formed BCP 47 language tag, and a known [CLDR](https://cldr.unicode.org) v45 locale. +If not supplied, English (`en`) is used. + +Examples: + +- `Time("mercoledì set 4 2024", "%A %h %e %Y", "", "it")` +- `Time("Febrero 25 lunes, 2002, 02:03:04 p.m.", "%B %d %A, %Y, %r", "America/New_York", "es-ES")` + +### ToKeyValueString + +`ToKeyValueString(target, Optional[delimiter], Optional[pair_delimiter], Optional[sort_output])` + +The `ToKeyValueString` Converter takes a `pcommon.Map` and converts it to a `string` of key value pairs. + +- `target` is a Getter that returns a `pcommon.Map`. +- `delimiter` is an optional string that is used to join keys and values, the default is `=`. +- `pair_delimiter` is an optional string that is used to join key value pairs, the default is a single space (` `). +- `sort_output` is an optional bool that is used to deterministically sort the keys of the output string. It should only be used if the output is required to be in the same order each time, as it introduces some performance overhead. + +For example, the following map `{"k1":"v1","k2":"v2","k3":"v3"}` will use default delimiters and be converted into the following string: + +``` +`k1=v1 k2=v2 k3=v3` +``` + +**Note:** Any nested arrays or maps will be represented as a JSON string. It is recommended to [flatten](#flatten) `target` before using this function. + +For example, `{"k1":"v1","k2":{"k3":"v3","k4":["v4","v5"]}}` will be converted to: + +``` +`k1=v1 k2={\"k3\":\"v3\",\"k4\":[\"v4\",\"v5\"]}` +``` + +**Note:** If any keys or values contain either delimiter, they will be double quoted. If any double quotes are present in the quoted value, they will be escaped. + +For example, `{"k1":"v1","k2":"v=2","k3"="\"v=3\""}` will be converted to: + +``` +`k1=v1 k2="v=2" k3="\"v=3\""` +``` + +Examples: + +- `ToKeyValueString(body)` +- `ToKeyValueString(body, ":", ",", true)` + ### TraceID `TraceID(bytes)` @@ -1338,6 +2054,72 @@ Examples: - `UnixSeconds(Time("02/04/2023", "%m/%d/%Y"))` +### UserAgent + +`UserAgent(value)` + +The `UserAgent` Converter parses the string argument trying to match it against well-known user-agent strings. + +`value` is a string or a path to a string. If `value` is not a string an error is returned. + +The results of the parsing are returned as a map containing `user_agent.name`, `user_agent.version` and `user_agent.original` +as defined in semconv v1.25.0. + +Parsing is done using the [uap-go package](https://github.com/ua-parser/uap-go). The specific formats it recognizes can be found [here](https://github.com/ua-parser/uap-core/blob/master/regexes.yaml). + +Examples: + +- `UserAgent("curl/7.81.0")` + ```yaml + "user_agent.name": "curl" + "user_agent.version": "7.81.0" + "user_agent.original": "curl/7.81.0" + ``` +- `Mozilla/5.0 (X11; Linux x86_64; rv:126.0) Gecko/20100101 Firefox/126.0` + ```yaml + "user_agent.name": "Firefox" + "user_agent.version": "126.0" + "user_agent.original": "Mozilla/5.0 (X11; Linux x86_64; rv:126.0) Gecko/20100101 Firefox/126.0" + ``` + +### URL + +`URL(url_string)` + +Parses a Uniform Resource Locator (URL) string and extracts its components as an object. +This URL object includes properties for the URL’s domain, path, fragment, port, query, scheme, user info, username, and password. + +`original`, `domain`, `scheme`, and `path` are always present. Other properties are present only if they have corresponding values. + +`url_string` is a `string`. + +- `URL("http://www.example.com")` + +results in +``` + "url.original": "http://www.example.com", + "url.scheme": "http", + "url.domain": "www.example.com", + "url.path": "", +``` + +- `URL("http://myusername:mypassword@www.example.com:80/foo.gif?key1=val1&key2=val2#fragment")` + +results in +``` + "url.path": "/foo.gif", + "url.fragment": "fragment", + "url.extension": "gif", + "url.password": "mypassword", + "url.original": "http://myusername:mypassword@www.example.com:80/foo.gif?key1=val1&key2=val2#fragment", + "url.scheme": "http", + "url.port": 80, + "url.user_info": "myusername:mypassword", + "url.domain": "www.example.com", + "url.query": "key1=val1&key2=val2", + "url.username": "myusername", +``` + ### UUID `UUID()` @@ -1357,14 +2139,3 @@ The returned type is `int64`. Examples: - `Year(Now())` - -## Function syntax - -Functions should be named and formatted according to the following standards. - -- Function names MUST start with a verb unless it is a Factory that creates a new type. -- Converters MUST be UpperCamelCase. -- Function names that contain multiple words MUST separate those words with `_`. -- Functions that interact with multiple items MUST have plurality in the name. Ex: `truncate_all`, `keep_keys`, `replace_all_matches`. -- Functions that interact with a single item MUST NOT have plurality in the name. If a function would interact with multiple items due to a condition, like `where`, it is still considered singular. Ex: `set`, `delete`, `replace_match`. -- Functions that change a specific target MUST set the target as the first parameter. diff --git a/pkg/ottl/ottlfuncs/func_append.go b/pkg/ottl/ottlfuncs/func_append.go new file mode 100644 index 000000000000..3bf6cb2a9021 --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_append.go @@ -0,0 +1,135 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs" + +import ( + "context" + "fmt" + + "go.opentelemetry.io/collector/pdata/pcommon" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +type AppendArguments[K any] struct { + Target ottl.GetSetter[K] + Value ottl.Optional[ottl.Getter[K]] + Values ottl.Optional[[]ottl.Getter[K]] +} + +func NewAppendFactory[K any]() ottl.Factory[K] { + return ottl.NewFactory("append", &AppendArguments[K]{}, createAppendFunction[K]) +} + +func createAppendFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { + args, ok := oArgs.(*AppendArguments[K]) + if !ok { + return nil, fmt.Errorf("AppendFactory args must be of type *Appendrguments[K]") + } + + return appendTo(args.Target, args.Value, args.Values) +} + +func appendTo[K any](target ottl.GetSetter[K], value ottl.Optional[ottl.Getter[K]], values ottl.Optional[[]ottl.Getter[K]]) (ottl.ExprFunc[K], error) { + if value.IsEmpty() && values.IsEmpty() { + return nil, fmt.Errorf("at least one of the optional arguments ('value' or 'values') must be provided") + } + + return func(ctx context.Context, tCtx K) (any, error) { + t, err := target.Get(ctx, tCtx) + if err != nil { + return nil, err + } + + // init res with target values + var res []any + + if t != nil { + switch targetType := t.(type) { + case pcommon.Slice: + res = append(res, targetType.AsRaw()...) + case pcommon.Value: + switch targetType.Type() { + case pcommon.ValueTypeEmpty: + res = append(res, targetType.Str()) + case pcommon.ValueTypeStr: + res = append(res, targetType.Str()) + case pcommon.ValueTypeInt: + res = append(res, targetType.Int()) + case pcommon.ValueTypeDouble: + res = append(res, targetType.Double()) + case pcommon.ValueTypeBool: + res = append(res, targetType.Bool()) + case pcommon.ValueTypeSlice: + res = append(res, targetType.Slice().AsRaw()...) + default: + return nil, fmt.Errorf("unsupported type of target field: %q", targetType.Type()) + } + + case []string: + res = appendMultiple(res, targetType) + case []any: + res = append(res, targetType...) + case []int64: + res = appendMultiple(res, targetType) + case []bool: + res = appendMultiple(res, targetType) + case []float64: + res = appendMultiple(res, targetType) + + case string: + res = append(res, targetType) + case int64: + res = append(res, targetType) + case bool: + res = append(res, targetType) + case float64: + res = append(res, targetType) + case any: + res = append(res, targetType) + default: + return nil, fmt.Errorf("unsupported type of target field: '%T'", t) + } + } + + appendGetterFn := func(g ottl.Getter[K]) error { + v, err := g.Get(ctx, tCtx) + if err != nil { + return err + } + res = append(res, v) + return nil + } + + if !value.IsEmpty() { + getter := value.Get() + if err := appendGetterFn(getter); err != nil { + return nil, err + } + } + if !values.IsEmpty() { + getters := values.Get() + for _, g := range getters { + if err := appendGetterFn(g); err != nil { + return nil, err + } + } + } + + // retype []any to Slice, having []any sometimes misbehaves and nils pcommon.Value + resSlice := pcommon.NewSlice() + if err := resSlice.FromRaw(res); err != nil { + return nil, err + } + + return nil, target.Set(ctx, tCtx, resSlice) + }, nil +} + +func appendMultiple[K any](target []any, values []K) []any { + for _, v := range values { + target = append(target, v) + } + return target +} diff --git a/pkg/ottl/ottlfuncs/func_append_test.go b/pkg/ottl/ottlfuncs/func_append_test.go new file mode 100644 index 000000000000..455dc37169de --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_append_test.go @@ -0,0 +1,697 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + "go.opentelemetry.io/collector/pdata/pcommon" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +func Test_Append(t *testing.T) { + setter := func(_ context.Context, res any, val any) error { + rSlice := res.(pcommon.Slice) + vSlice := val.(pcommon.Slice) + assert.NoError(t, rSlice.FromRaw(vSlice.AsRaw())) + + return nil + } + + var nilOptional ottl.Optional[ottl.Getter[any]] + var nilSliceOptional ottl.Optional[[]ottl.Getter[any]] + + singleGetter := ottl.NewTestingOptional[ottl.Getter[any]](ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "a", nil + }, + }) + + singleIntGetter := ottl.NewTestingOptional[ottl.Getter[any]](ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return 66, nil + }, + }) + + multiGetter := ottl.NewTestingOptional[[]ottl.Getter[any]]( + []ottl.Getter[any]{ + ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "a", nil + }, + }, + ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "b", nil + }, + }, + }, + ) + + testCases := []struct { + Name string + Target ottl.GetSetter[any] + Value ottl.Optional[ottl.Getter[any]] + Values ottl.Optional[[]ottl.Getter[any]] + Want func(pcommon.Slice) + }{ + { + "Single: non existing target", + &ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return nil, nil + }, + Setter: setter, + }, + singleGetter, + nilSliceOptional, + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetStr("a") + }, + }, + { + "Single: non existing target - non string value", + &ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return nil, nil + }, + Setter: setter, + }, + singleIntGetter, + nilSliceOptional, + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetInt(66) + }, + }, + { + "Single: standard []string target - empty", + &ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return []string{}, nil + }, + Setter: setter, + }, + singleGetter, + nilSliceOptional, + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetStr("a") + }, + }, + { + "Slice: standard []string target - empty", + &ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return []string{}, nil + }, + Setter: setter, + }, + nilOptional, + multiGetter, + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetStr("a") + expectedValue.AppendEmpty().SetStr("b") + }, + }, + + { + "Single: standard []string target", + &ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return []any{"5", "6"}, nil + }, + Setter: setter, + }, + singleGetter, + nilSliceOptional, + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetStr("5") + expectedValue.AppendEmpty().SetStr("6") + expectedValue.AppendEmpty().SetStr("a") + }, + }, + { + "Slice: standard []string target", + &ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return []string{"5", "6"}, nil + }, + Setter: setter, + }, + nilOptional, + multiGetter, + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetStr("5") + expectedValue.AppendEmpty().SetStr("6") + expectedValue.AppendEmpty().SetStr("a") + expectedValue.AppendEmpty().SetStr("b") + }, + }, + + { + "Single: Slice target", + &ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + ps := pcommon.NewSlice() + if err := ps.FromRaw([]any{"5", "6"}); err != nil { + return nil, err + } + return ps, nil + }, + Setter: setter, + }, + singleGetter, + nilSliceOptional, + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetStr("5") + expectedValue.AppendEmpty().SetStr("6") + expectedValue.AppendEmpty().SetStr("a") + }, + }, + { + "Slice: Slice target", + &ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + ps := pcommon.NewSlice() + if err := ps.FromRaw([]any{"5", "6"}); err != nil { + return nil, err + } + return ps, nil + }, + Setter: setter, + }, + nilOptional, + multiGetter, + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetStr("5") + expectedValue.AppendEmpty().SetStr("6") + expectedValue.AppendEmpty().SetStr("a") + expectedValue.AppendEmpty().SetStr("b") + }, + }, + + { + "Single: Slice target of string values in pcommon.value", + &ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + ps := pcommon.NewSlice() + ps.AppendEmpty().SetStr("5") + ps.AppendEmpty().SetStr("6") + return ps, nil + }, + Setter: setter, + }, + singleGetter, + nilSliceOptional, + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetStr("5") + expectedValue.AppendEmpty().SetStr("6") + expectedValue.AppendEmpty().SetStr("a") + }, + }, + { + "Slice: Slice target of string values in pcommon.value", + &ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + ps := pcommon.NewSlice() + ps.AppendEmpty().SetStr("5") + ps.AppendEmpty().SetStr("6") + return ps, nil + }, + Setter: setter, + }, + nilOptional, + multiGetter, + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetStr("5") + expectedValue.AppendEmpty().SetStr("6") + expectedValue.AppendEmpty().SetStr("a") + expectedValue.AppendEmpty().SetStr("b") + }, + }, + + { + "Single: []any target", + &ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return []any{5, 6}, nil + }, + Setter: setter, + }, + singleGetter, + nilSliceOptional, + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetInt(5) + expectedValue.AppendEmpty().SetInt(6) + expectedValue.AppendEmpty().SetStr("a") + }, + }, + { + "Slice: []any target", + &ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return []any{5, 6}, nil + }, + Setter: setter, + }, + nilOptional, + multiGetter, + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetInt(5) + expectedValue.AppendEmpty().SetInt(6) + expectedValue.AppendEmpty().SetStr("a") + expectedValue.AppendEmpty().SetStr("b") + }, + }, + + { + "Single: pcommon.Value - string", + &ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + v := "5" + return v, nil + }, + Setter: setter, + }, + singleGetter, + nilSliceOptional, + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetStr("5") + expectedValue.AppendEmpty().SetStr("a") + }, + }, + { + "Slice: pcommon.Value - string", + &ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + v := "5" + return v, nil + }, + Setter: setter, + }, + nilOptional, + multiGetter, + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetStr("5") + expectedValue.AppendEmpty().SetStr("a") + expectedValue.AppendEmpty().SetStr("b") + }, + }, + + { + "Single: pcommon.Value - slice", + &ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + v := pcommon.NewValueSlice() + if err := v.FromRaw([]any{"5", "6"}); err != nil { + return nil, err + } + return v, nil + }, + Setter: setter, + }, + singleGetter, + nilSliceOptional, + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetStr("5") + expectedValue.AppendEmpty().SetStr("6") + expectedValue.AppendEmpty().SetStr("a") + }, + }, + { + "Slice: pcommon.Value - slice", + &ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + v := pcommon.NewValueSlice() + if err := v.FromRaw([]any{"5", "6"}); err != nil { + return nil, err + } + return v, nil + }, + Setter: setter, + }, + nilOptional, + multiGetter, + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetStr("5") + expectedValue.AppendEmpty().SetStr("6") + expectedValue.AppendEmpty().SetStr("a") + expectedValue.AppendEmpty().SetStr("b") + }, + }, + + { + "Single: scalar target string", + &ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "5", nil + }, + Setter: setter, + }, + singleGetter, + nilSliceOptional, + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetStr("5") + expectedValue.AppendEmpty().SetStr("a") + }, + }, + { + "Slice: scalar target string", + &ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "5", nil + }, + Setter: setter, + }, + nilOptional, + multiGetter, + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetStr("5") + expectedValue.AppendEmpty().SetStr("a") + expectedValue.AppendEmpty().SetStr("b") + }, + }, + + { + "Single: scalar target any", + &ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return 5, nil + }, + Setter: setter, + }, + singleGetter, + nilSliceOptional, + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetInt(5) + expectedValue.AppendEmpty().SetStr("a") + }, + }, + { + "Slice: scalar target any", + &ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return 5, nil + }, + Setter: setter, + }, + nilOptional, + multiGetter, + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetInt(5) + expectedValue.AppendEmpty().SetStr("a") + expectedValue.AppendEmpty().SetStr("b") + }, + }, + + { + "Single: scalar target any append int", + &ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return 5, nil + }, + Setter: setter, + }, + singleIntGetter, + nilSliceOptional, + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetInt(5) + expectedValue.AppendEmpty().SetInt(66) + }, + }, + } + for _, tc := range testCases { + t.Run(tc.Name, func(t *testing.T) { + exprFunc, err := appendTo[any](tc.Target, tc.Value, tc.Values) + assert.NoError(t, err) + + res := pcommon.NewSlice() + result, err := exprFunc(context.Background(), res) + assert.NoError(t, err) + assert.Nil(t, result) + assert.NotNil(t, res) + + expectedSlice := pcommon.NewSlice() + tc.Want(expectedSlice) + assert.EqualValues(t, expectedSlice, res) + }) + } +} + +func TestTargetType(t *testing.T) { + expectedInt := 5 + expectedSlice := pcommon.NewValueSlice() + assert.NoError(t, expectedSlice.Slice().FromRaw([]any{"a"})) + singleIntGetter := ottl.NewTestingOptional[ottl.Getter[any]](ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return expectedInt, nil + }, + }) + + testCases := []struct { + Name string + TargetValue any + Want func(pcommon.Slice) + expectedError bool + }{ + { + "pcommon.Slice", + expectedSlice.Slice(), + func(expectedValue pcommon.Slice) { + expectedSlice.Slice().MoveAndAppendTo(expectedValue) + expectedValue.AppendEmpty().SetInt(int64(expectedInt)) + }, + false, + }, + { + "pcommon.ValueTypeEmpty", + pcommon.NewValueEmpty(), + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetStr("") + expectedValue.AppendEmpty().SetInt(int64(expectedInt)) + }, + false, + }, + { + "pcommon.ValueTypeStr", + pcommon.NewValueStr("expected string"), + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetStr("expected string") + expectedValue.AppendEmpty().SetInt(int64(expectedInt)) + }, + false, + }, + { + "pcommon.ValueTypeInt", + pcommon.NewValueInt(4), + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetInt(4) + expectedValue.AppendEmpty().SetInt(int64(expectedInt)) + }, + false, + }, + { + "pcommon.ValueTypeDouble", + pcommon.NewValueDouble(2.5), + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetDouble(2.5) + expectedValue.AppendEmpty().SetInt(int64(expectedInt)) + }, + false, + }, + { + "pcommon.ValueTypeBool", + pcommon.NewValueBool(true), + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetBool(true) + expectedValue.AppendEmpty().SetInt(int64(expectedInt)) + }, + false, + }, + { + "pcommon.ValueTypeSlice", + expectedSlice, + func(expectedValue pcommon.Slice) { + expectedSlice.Slice().MoveAndAppendTo(expectedValue) + expectedValue.AppendEmpty().SetInt(int64(expectedInt)) + }, + false, + }, + { + "pcommon.ValueTypeMap", + pcommon.NewValueMap(), + func(_ pcommon.Slice) { + }, + true, + }, + + { + "string array", + []string{"a", "b"}, + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetStr("a") + expectedValue.AppendEmpty().SetStr("b") + expectedValue.AppendEmpty().SetInt(int64(expectedInt)) + }, + false, + }, + { + "any array", + []any{"a", "b"}, + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetStr("a") + expectedValue.AppendEmpty().SetStr("b") + expectedValue.AppendEmpty().SetInt(int64(expectedInt)) + }, + false, + }, + { + "int64 array", + []int64{5, 6}, + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetInt(5) + expectedValue.AppendEmpty().SetInt(6) + expectedValue.AppendEmpty().SetInt(int64(expectedInt)) + }, + false, + }, + { + "bool array", + []bool{false, true}, + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetBool(false) + expectedValue.AppendEmpty().SetBool(true) + expectedValue.AppendEmpty().SetInt(int64(expectedInt)) + }, + false, + }, + { + "float64 array", + []float64{1.5, 2.5}, + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetDouble(1.5) + expectedValue.AppendEmpty().SetDouble(2.5) + expectedValue.AppendEmpty().SetInt(int64(expectedInt)) + }, + false, + }, + + { + "string", + "a", + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetStr("a") + expectedValue.AppendEmpty().SetInt(int64(expectedInt)) + }, + false, + }, + { + "int64 ", + 5, + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetInt(5) + expectedValue.AppendEmpty().SetInt(int64(expectedInt)) + }, + false, + }, + { + "bool", + true, + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetBool(true) + expectedValue.AppendEmpty().SetInt(int64(expectedInt)) + }, + false, + }, + { + "float64 ", + 2.5, + func(expectedValue pcommon.Slice) { + expectedValue.AppendEmpty().SetDouble(2.5) + expectedValue.AppendEmpty().SetInt(int64(expectedInt)) + }, + false, + }, + } + for _, tc := range testCases { + t.Run(tc.Name, func(t *testing.T) { + target := &ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return tc.TargetValue, nil + }, + Setter: func(_ context.Context, res any, val any) error { + rSlice := res.(pcommon.Slice) + vSlice := val.(pcommon.Slice) + assert.NoError(t, rSlice.FromRaw(vSlice.AsRaw())) + + return nil + }, + } + + var nilSlice ottl.Optional[[]ottl.Getter[any]] + exprFunc, err := appendTo[any](target, singleIntGetter, nilSlice) + assert.NoError(t, err) + + res := pcommon.NewSlice() + result, err := exprFunc(context.Background(), res) + + if tc.expectedError { + assert.Error(t, err) + } else { + assert.NoError(t, err) + assert.Nil(t, result) + assert.NotNil(t, res) + + expectedSlice := pcommon.NewSlice() + tc.Want(expectedSlice) + assert.EqualValues(t, expectedSlice, res) + } + }) + } +} + +func Test_ArgumentsArePresent(t *testing.T) { + var nilOptional ottl.Optional[ottl.Getter[any]] + var nilSliceOptional ottl.Optional[[]ottl.Getter[any]] + singleGetter := ottl.NewTestingOptional[ottl.Getter[any]](ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "val", nil + }, + }) + + multiGetter := ottl.NewTestingOptional[[]ottl.Getter[any]]( + []ottl.Getter[any]{ + ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "val1", nil + }, + }, + ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "val2", nil + }, + }, + }, + ) + testCases := []struct { + Name string + Value ottl.Optional[ottl.Getter[any]] + Values ottl.Optional[[]ottl.Getter[any]] + IsErrorExpected bool + }{ + {"providedBoth", singleGetter, multiGetter, false}, + {"provided values", nilOptional, multiGetter, false}, + {"provided value", singleGetter, nilSliceOptional, false}, + {"nothing provided", nilOptional, nilSliceOptional, true}, + } + + for _, tc := range testCases { + t.Run(tc.Name, func(t *testing.T) { + _, err := appendTo[any](nil, tc.Value, tc.Values) + assert.Equal(t, tc.IsErrorExpected, err != nil) + }) + } +} diff --git a/pkg/ottl/ottlfuncs/func_base64decode.go b/pkg/ottl/ottlfuncs/func_base64decode.go index 42e401d71505..f626adc3b557 100644 --- a/pkg/ottl/ottlfuncs/func_base64decode.go +++ b/pkg/ottl/ottlfuncs/func_base64decode.go @@ -30,7 +30,6 @@ func createBase64DecodeFunction[K any](_ ottl.FunctionContext, oArgs ottl.Argume } func Base64Decode[K any](target ottl.StringGetter[K]) (ottl.ExprFunc[K], error) { - return func(ctx context.Context, tCtx K) (any, error) { val, err := target.Get(ctx, tCtx) if err != nil { diff --git a/pkg/ottl/ottlfuncs/func_convert_attributes_to_elements_xml.go b/pkg/ottl/ottlfuncs/func_convert_attributes_to_elements_xml.go new file mode 100644 index 000000000000..64d4ecc5fde5 --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_convert_attributes_to_elements_xml.go @@ -0,0 +1,69 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs" + +import ( + "context" + "fmt" + + "github.com/antchfx/xmlquery" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +type ConvertAttributesToElementsXMLArguments[K any] struct { + Target ottl.StringGetter[K] + XPath ottl.Optional[string] +} + +func NewConvertAttributesToElementsXMLFactory[K any]() ottl.Factory[K] { + return ottl.NewFactory("ConvertAttributesToElementsXML", &ConvertAttributesToElementsXMLArguments[K]{}, createConvertAttributesToElementsXMLFunction[K]) +} + +func createConvertAttributesToElementsXMLFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { + args, ok := oArgs.(*ConvertAttributesToElementsXMLArguments[K]) + + if !ok { + return nil, fmt.Errorf("ConvertAttributesToElementsXML args must be of type *ConvertAttributesToElementsXMLAguments[K]") + } + + xPath := args.XPath.Get() + if xPath == "" { + xPath = "//@*" // All attributes in the document + } + if err := validateXPath(xPath); err != nil { + return nil, err + } + + return convertAttributesToElementsXML(args.Target, xPath), nil +} + +// convertAttributesToElementsXML returns a string that is a result of converting all attributes of the +// target XML into child elements. These new elements are added as the last child elements of the parent. +// e.g. -> worldbar +func convertAttributesToElementsXML[K any](target ottl.StringGetter[K], xPath string) ottl.ExprFunc[K] { + return func(ctx context.Context, tCtx K) (any, error) { + var doc *xmlquery.Node + if targetVal, err := target.Get(ctx, tCtx); err != nil { + return nil, err + } else if doc, err = parseNodesXML(targetVal); err != nil { + return nil, err + } + for _, n := range xmlquery.Find(doc, xPath) { + if n.Type != xmlquery.AttributeNode { + continue + } + xmlquery.AddChild(n.Parent, &xmlquery.Node{ + Type: xmlquery.ElementNode, + Data: n.Data, + FirstChild: &xmlquery.Node{ + Type: xmlquery.TextNode, + Data: n.InnerText(), + }, + }) + n.Parent.RemoveAttr(n.Data) + } + return doc.OutputXML(false), nil + } +} diff --git a/pkg/ottl/ottlfuncs/func_convert_attributes_to_elements_xml_test.go b/pkg/ottl/ottlfuncs/func_convert_attributes_to_elements_xml_test.go new file mode 100644 index 000000000000..11bc2c5a29bd --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_convert_attributes_to_elements_xml_test.go @@ -0,0 +1,126 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs" + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +func Test_ConvertAttributesToElementsXML(t *testing.T) { + tests := []struct { + name string + document string + xPath string + want string + }{ + { + name: "nop", + document: ``, + want: ``, + }, + { + name: "nop declaration", + document: ``, + want: ``, + }, + { + name: "single attribute", + document: ``, + want: `bar`, + }, + { + name: "multiple attributes - order 1", + document: ``, + want: `barworld`, + }, + { + name: "multiple attributes - order 2", + document: ``, + want: `worldbar`, + }, + { + name: "with child elements", + document: ``, + want: `worldbar`, + }, + { + name: "with child value", + document: `free value`, + want: `free valueworldbar`, + }, + { + name: "with child elements and values", + document: `free value2`, + want: `free value2worldbar`, + }, + { + name: "multiple levels", + document: ``, + want: `www.example.comworldbar`, + }, + { + name: "xpath filtered", + document: ``, + xPath: "/a/b/@*", // only convert attributes of b + want: `www.example.com`, + }, + { + name: "attributes found with non-attributes xpath", + document: ``, + xPath: "/a/b", // convert b (the attributes of b, even though the element b was selected) + want: ``, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + args := &ConvertAttributesToElementsXMLArguments[any]{ + Target: ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return tt.document, nil + }, + }, + XPath: ottl.NewTestingOptional(tt.xPath), + } + exprFunc, err := createConvertAttributesToElementsXMLFunction[any](ottl.FunctionContext{}, args) + assert.NoError(t, err) + + result, err := exprFunc(context.Background(), nil) + assert.NoError(t, err) + assert.Equal(t, tt.want, result) + }) + } +} + +func TestCreateConvertAttributesToElementsXMLFunc(t *testing.T) { + factory := NewConvertAttributesToElementsXMLFactory[any]() + fCtx := ottl.FunctionContext{} + + // Invalid arg type + exprFunc, err := factory.CreateFunction(fCtx, nil) + assert.Error(t, err) + assert.Nil(t, exprFunc) + + // Invalid XPath should error on function creation + exprFunc, err = factory.CreateFunction( + fCtx, &ConvertAttributesToElementsXMLArguments[any]{ + XPath: ottl.NewTestingOptional("!"), + }) + assert.Error(t, err) + assert.Nil(t, exprFunc) + + // Invalid XML should error on function execution + exprFunc, err = factory.CreateFunction( + fCtx, &ConvertAttributesToElementsXMLArguments[any]{ + Target: invalidXMLGetter(), + }) + assert.NoError(t, err) + assert.NotNil(t, exprFunc) + _, err = exprFunc(context.Background(), nil) + assert.Error(t, err) +} diff --git a/pkg/ottl/ottlfuncs/func_convert_text_to_elements_xml.go b/pkg/ottl/ottlfuncs/func_convert_text_to_elements_xml.go new file mode 100644 index 000000000000..a0fb108c4069 --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_convert_text_to_elements_xml.go @@ -0,0 +1,107 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs" + +import ( + "context" + "fmt" + + "github.com/antchfx/xmlquery" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +type ConvertTextToElementsXMLArguments[K any] struct { + Target ottl.StringGetter[K] + XPath ottl.Optional[string] + ElementName ottl.Optional[string] +} + +func NewConvertTextToElementsXMLFactory[K any]() ottl.Factory[K] { + return ottl.NewFactory("ConvertTextToElementsXML", &ConvertTextToElementsXMLArguments[K]{}, createConvertTextToElementsXMLFunction[K]) +} + +func createConvertTextToElementsXMLFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { + args, ok := oArgs.(*ConvertTextToElementsXMLArguments[K]) + + if !ok { + return nil, fmt.Errorf("ConvertTextToElementsXML args must be of type *ConvertTextToElementsXMLAguments[K]") + } + + xPath := args.XPath.Get() + if xPath == "" { + xPath = "/" + } else if err := validateXPath(xPath); err != nil { + return nil, err + } + + elementName := args.ElementName.Get() + if elementName == "" { + elementName = "value" + } + + return convertTextToElementsXML(args.Target, xPath, elementName), nil +} + +// convertTextToElementsXML returns a string that is a result of wrapping any extraneous text nodes with a dedicated element. +func convertTextToElementsXML[K any](target ottl.StringGetter[K], xPath string, elementName string) ottl.ExprFunc[K] { + return func(ctx context.Context, tCtx K) (any, error) { + var doc *xmlquery.Node + if targetVal, err := target.Get(ctx, tCtx); err != nil { + return nil, err + } else if doc, err = parseNodesXML(targetVal); err != nil { + return nil, err + } + for _, n := range xmlquery.Find(doc, xPath) { + convertTextToElementsForNode(n, elementName) + } + return doc.OutputXML(false), nil + } +} + +func convertTextToElementsForNode(parent *xmlquery.Node, elementName string) { + switch parent.Type { + case xmlquery.ElementNode: // ok + case xmlquery.DocumentNode: // ok + default: + return + } + + if parent.FirstChild == nil { + return + } + + // Convert any child nodes and count text and element nodes. + var valueCount, elementCount int + for child := parent.FirstChild; child != nil; child = child.NextSibling { + if child.Type == xmlquery.ElementNode { + convertTextToElementsForNode(child, elementName) + elementCount++ + } else if child.Type == xmlquery.TextNode { + valueCount++ + } + } + + // If there are no values to wrap, or if there is exactly one value OR one element, this node is all set. + if valueCount == 0 || elementCount+valueCount <= 1 { + return + } + + // At this point, we either have multiple values, or a mix of values and elements. + // Either way, we need to wrap the values. + for child := parent.FirstChild; child != nil; child = child.NextSibling { + if child.Type != xmlquery.TextNode { + continue + } + newTextNode := &xmlquery.Node{ + Type: xmlquery.TextNode, + Data: child.Data, + } + // Change this node into an element + child.Type = xmlquery.ElementNode + child.Data = elementName + child.FirstChild = newTextNode + child.LastChild = newTextNode + } +} diff --git a/pkg/ottl/ottlfuncs/func_convert_text_to_elements_xml_test.go b/pkg/ottl/ottlfuncs/func_convert_text_to_elements_xml_test.go new file mode 100644 index 000000000000..7e3b10bcdf12 --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_convert_text_to_elements_xml_test.go @@ -0,0 +1,127 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs" + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +func Test_ConvertTextToElementsXML(t *testing.T) { + tests := []struct { + name string + document string + xPath string + elementName string + want string + }{ + { + name: "nop", + document: ``, + want: ``, + }, + { + name: "nop declaration", + document: ``, + want: ``, + }, + { + name: "nop attributes", + document: ``, + want: ``, + }, + { + name: "nop wrapped text", + document: `hello world`, + want: `hello world`, + }, + { + name: "simple hanging", + document: `foo`, + want: `foo`, + }, + { + name: "simple hanging with tag name", + elementName: "bar", + document: `foo`, + want: `foo`, + }, + { + name: "multiple hanging same level", + document: `foobar`, + want: `foobar`, + }, + { + name: "multiple hanging multiple levels", + document: `foobar1not2`, + elementName: "v", + want: `foobar1not2`, + }, + { + name: "xpath select some", + document: `foobarbaz`, + xPath: "/a/b", + want: `foobarbaz`, + }, + { + name: "xpath with element name", + document: `foobarbaz`, + xPath: "/a/b", + elementName: "V", + want: `foobarbaz`, + }, + } + factory := NewConvertTextToElementsXMLFactory[any]() + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + args := &ConvertTextToElementsXMLArguments[any]{ + Target: ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return tt.document, nil + }, + }, + XPath: ottl.NewTestingOptional(tt.xPath), + ElementName: ottl.NewTestingOptional(tt.elementName), + } + exprFunc, err := factory.CreateFunction(ottl.FunctionContext{}, args) + assert.NoError(t, err) + + result, err := exprFunc(context.Background(), nil) + assert.NoError(t, err) + assert.Equal(t, tt.want, result) + }) + } +} + +func TestCreateConvertTextToElementsXMLFunc(t *testing.T) { + factory := NewConvertTextToElementsXMLFactory[any]() + fCtx := ottl.FunctionContext{} + + // Invalid arg type + exprFunc, err := factory.CreateFunction(fCtx, nil) + assert.Error(t, err) + assert.Nil(t, exprFunc) + + // Invalid XPath should error on function creation + exprFunc, err = factory.CreateFunction( + fCtx, &ConvertTextToElementsXMLArguments[any]{ + XPath: ottl.NewTestingOptional("!"), + }) + assert.Error(t, err) + assert.Nil(t, exprFunc) + + // Invalid XML should error on function execution + exprFunc, err = factory.CreateFunction( + fCtx, &ConvertTextToElementsXMLArguments[any]{ + Target: invalidXMLGetter(), + }) + assert.NoError(t, err) + assert.NotNil(t, exprFunc) + _, err = exprFunc(context.Background(), nil) + assert.Error(t, err) +} diff --git a/pkg/ottl/ottlfuncs/func_decode.go b/pkg/ottl/ottlfuncs/func_decode.go new file mode 100644 index 000000000000..d6dc5efc0364 --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_decode.go @@ -0,0 +1,103 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs" + +import ( + "context" + "encoding/base64" + "fmt" + "strings" + + "go.opentelemetry.io/collector/pdata/pcommon" + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/ianaindex" + + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/textutils" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +type DecodeArguments[K any] struct { + Target ottl.Getter[K] + Encoding string +} + +func NewDecodeFactory[K any]() ottl.Factory[K] { + return ottl.NewFactory("Decode", &DecodeArguments[K]{}, createDecodeFunction[K]) +} + +func createDecodeFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { + args, ok := oArgs.(*DecodeArguments[K]) + if !ok { + return nil, fmt.Errorf("DecodeFactory args must be of type *DecodeArguments[K]") + } + + return Decode(args.Target, args.Encoding) +} + +func Decode[K any](target ottl.Getter[K], encoding string) (ottl.ExprFunc[K], error) { + return func(ctx context.Context, tCtx K) (any, error) { + val, err := target.Get(ctx, tCtx) + if err != nil { + return nil, err + } + var stringValue string + + switch v := val.(type) { + case []byte: + stringValue = string(v) + case *string: + stringValue = *v + case string: + stringValue = v + case pcommon.ByteSlice: + stringValue = string(v.AsRaw()) + case *pcommon.ByteSlice: + stringValue = string(v.AsRaw()) + case pcommon.Value: + stringValue = v.AsString() + case *pcommon.Value: + stringValue = v.AsString() + default: + return nil, fmt.Errorf("unsupported type provided to Decode function: %T", v) + } + + switch encoding { + case "base64": + // base64 is not in IANA index, so we have to deal with this encoding separately + decodedBytes, err := base64.StdEncoding.DecodeString(stringValue) + if err != nil { + return nil, fmt.Errorf("could not decode: %w", err) + } + return string(decodedBytes), nil + default: + e, err := getEncoding(encoding) + if err != nil { + return nil, err + } + + decodedString, err := e.NewDecoder().String(stringValue) + if err != nil { + return nil, fmt.Errorf("could not decode: %w", err) + } + + return decodedString, nil + } + }, nil +} + +func getEncoding(encoding string) (encoding.Encoding, error) { + if e, ok := textutils.EncodingOverridesMap.Get(strings.ToLower(encoding)); ok { + return e, nil + } + e, err := ianaindex.IANA.Encoding(encoding) + if err != nil { + return nil, fmt.Errorf("could not get encoding for %s: %w", encoding, err) + } + if e == nil { + // for some encodings a nil error and a nil encoding is returned, so we need to double check + // if the encoding is actually set here + return nil, fmt.Errorf("no decoder available for encoding: %s", encoding) + } + return e, nil +} diff --git a/pkg/ottl/ottlfuncs/func_decode_test.go b/pkg/ottl/ottlfuncs/func_decode_test.go new file mode 100644 index 000000000000..5f5ab8944a6f --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_decode_test.go @@ -0,0 +1,198 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/pdata/pcommon" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +func TestDecode(t *testing.T) { + testByteSlice := pcommon.NewByteSlice() + testByteSlice.FromRaw([]byte("test string")) + testByteSliceB64 := pcommon.NewByteSlice() + testByteSliceB64.FromRaw([]byte("aGVsbG8gd29ybGQ=")) + + testValue := pcommon.NewValueEmpty() + _ = testValue.FromRaw("test string") + testValueB64 := pcommon.NewValueEmpty() + _ = testValueB64.FromRaw("aGVsbG8gd29ybGQ=") + + type testCase struct { + name string + value any + encoding string + want any + expectedError string + } + tests := []testCase{ + { + name: "convert base64 byte array", + value: []byte("dGVzdAo="), + encoding: "base64", + want: "test\n", + }, + { + name: "convert base64 string", + value: "aGVsbG8gd29ybGQ=", + encoding: "base64", + want: "hello world", + }, + { + name: "convert base64 ByteSlice", + value: testByteSliceB64, + encoding: "base64", + want: "hello world", + }, + { + name: "convert base64 Value", + value: testValueB64, + encoding: "base64", + want: "hello world", + }, + { + name: "convert base64 ByteSlice pointer", + value: &testByteSliceB64, + encoding: "base64", + want: "hello world", + }, + { + name: "convert base64 Value pointer", + value: &testValueB64, + encoding: "base64", + want: "hello world", + }, + { + name: "decode us-ascii encoded string", + value: "test string", + encoding: "us-ascii", + want: "test string", + }, + { + name: "decode us-ascii encoded byte array", + value: []byte("test string"), + encoding: "us-ascii", + want: "test string", + }, + { + name: "decode us-ascii encoded byte slice", + value: testByteSlice, + encoding: "us-ascii", + want: "test string", + }, + { + name: "decode us-ascii encoded Value", + value: testValue, + encoding: "us-ascii", + want: "test string", + }, + { + name: "decode us-ascii encoded byte slice pointer", + value: &testByteSlice, + encoding: "us-ascii", + want: "test string", + }, + { + name: "decode us-ascii encoded Value pointer", + value: &testValue, + encoding: "us-ascii", + want: "test string", + }, + { + name: "decode ISO-8859-1 encoded string", + value: "test string", + encoding: "ISO-8859-1", + want: "test string", + }, + { + name: "decode WINDOWS-1251 encoded string", + value: "test string", + encoding: "WINDOWS-1251", + want: "test string", + }, + { + name: "decode WINDOWS-1252 encoded string", + value: "test string", + encoding: "WINDOWS-1252", + want: "test string", + }, + { + name: "decode UTF-8 encoded string", + value: "test string", + encoding: "UTF-8", + want: "test string", + }, + { + name: "decode UTF-16 encoded string 1", + value: []byte{116, 0, 101, 0, 115, 0, 116, 0, 32, 0, 115, 0, 116, 0, 114, 0, 105, 0, 110, 0, 103, 0}, + encoding: "UTF-16", + want: "test string", + }, + { + name: "decode UTF-16 encoded string 2", + value: []byte{116, 0, 101, 0, 115, 0, 116, 0, 32, 0, 115, 0, 116, 0, 114, 0, 105, 0, 110, 0, 103, 0}, + encoding: "UTF16", + want: "test string", + }, + { + name: "decode GB2312 encoded string; no decoder available", + value: "test string", + encoding: "GB2312", + want: nil, + expectedError: "no decoder available for encoding: GB2312", + }, + { + name: "non-string", + value: 10, + encoding: "base64", + expectedError: "unsupported type provided to Decode function: int", + }, + { + name: "nil", + value: nil, + encoding: "base64", + expectedError: "unsupported type provided to Decode function: ", + }, + { + name: "not-base64-string", + value: "!@#$%^&*()_+", + encoding: "base64", + expectedError: "illegal base64 data at input byte", + }, + { + name: "missing-base64-padding", + value: "cmVtb3ZlZCBwYWRkaW5nCg", + encoding: "base64", + expectedError: "illegal base64 data at input byte", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + expressionFunc, err := createDecodeFunction[any](ottl.FunctionContext{}, &DecodeArguments[any]{ + Target: &ottl.StandardGetSetter[any]{ + Getter: func(context.Context, any) (any, error) { + return tt.value, nil + }, + }, + Encoding: tt.encoding, + }) + + require.NoError(t, err) + + result, err := expressionFunc(nil, nil) + if tt.expectedError != "" { + require.ErrorContains(t, err, tt.expectedError) + return + } + + require.NoError(t, err) + require.Equal(t, tt.want, result) + }) + } +} diff --git a/pkg/ottl/ottlfuncs/func_double_test.go b/pkg/ottl/ottlfuncs/func_double_test.go index 6a9ebda2894a..8e72a17a29c2 100644 --- a/pkg/ottl/ottlfuncs/func_double_test.go +++ b/pkg/ottl/ottlfuncs/func_double_test.go @@ -76,7 +76,6 @@ func Test_Double(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { exprFunc := doubleFunc[any](&ottl.StandardFloatLikeGetter[any]{ - Getter: func(context.Context, any) (any, error) { return test.value, nil }, diff --git a/pkg/ottl/ottlfuncs/func_duration.go b/pkg/ottl/ottlfuncs/func_duration.go index e125ff2b90d3..27138583fa3d 100644 --- a/pkg/ottl/ottlfuncs/func_duration.go +++ b/pkg/ottl/ottlfuncs/func_duration.go @@ -18,6 +18,7 @@ type DurationArguments[K any] struct { func NewDurationFactory[K any]() ottl.Factory[K] { return ottl.NewFactory("Duration", &DurationArguments[K]{}, createDurationFunction[K]) } + func createDurationFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { args, ok := oArgs.(*DurationArguments[K]) diff --git a/pkg/ottl/ottlfuncs/func_duration_test.go b/pkg/ottl/ottlfuncs/func_duration_test.go index 3736942ef00a..229f167dbbf8 100644 --- a/pkg/ottl/ottlfuncs/func_duration_test.go +++ b/pkg/ottl/ottlfuncs/func_duration_test.go @@ -28,7 +28,8 @@ func Test_Duration(t *testing.T) { }, }, expected: time.Duration(100000000), - }, { + }, + { name: "234 microseconds", duration: &ottl.StandardStringGetter[any]{ Getter: func(_ context.Context, _ any) (any, error) { @@ -36,7 +37,8 @@ func Test_Duration(t *testing.T) { }, }, expected: time.Duration(234000), - }, { + }, + { name: "777 nanoseconds", duration: &ottl.StandardStringGetter[any]{ Getter: func(_ context.Context, _ any) (any, error) { diff --git a/pkg/ottl/ottlfuncs/func_extract_grok_patterns.go b/pkg/ottl/ottlfuncs/func_extract_grok_patterns.go new file mode 100644 index 000000000000..78f50866a0cd --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_extract_grok_patterns.go @@ -0,0 +1,103 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs" + +import ( + "context" + "fmt" + "strings" + + "github.com/elastic/go-grok" + "go.opentelemetry.io/collector/pdata/pcommon" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +type ExtractGrokPatternsArguments[K any] struct { + Target ottl.StringGetter[K] + Pattern string + NamedCapturesOnly ottl.Optional[bool] + PatternDefinitions ottl.Optional[[]string] +} + +func NewExtractGrokPatternsFactory[K any]() ottl.Factory[K] { + return ottl.NewFactory("ExtractGrokPatterns", &ExtractGrokPatternsArguments[K]{}, createExtractGrokPatternsFunction[K]) +} + +func createExtractGrokPatternsFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { + args, ok := oArgs.(*ExtractGrokPatternsArguments[K]) + + if !ok { + return nil, fmt.Errorf("ExtractGrokPatternsFactory args must be of type *ExtractGrokPatternsArguments[K]") + } + + return extractGrokPatterns(args.Target, args.Pattern, args.NamedCapturesOnly, args.PatternDefinitions) +} + +func extractGrokPatterns[K any](target ottl.StringGetter[K], pattern string, nco ottl.Optional[bool], patternDefinitions ottl.Optional[[]string]) (ottl.ExprFunc[K], error) { + g, err := grok.NewComplete() + if err != nil { + return nil, fmt.Errorf("failed to initialize grok parser: %w", err) + } + namedCapturesOnly := !nco.IsEmpty() && nco.Get() + + if !patternDefinitions.IsEmpty() { + for i, patternDefinition := range patternDefinitions.Get() { + // split pattern in format key=val + parts := strings.SplitN(patternDefinition, "=", 2) + if len(parts) == 1 { + trimmedPattern := patternDefinition + if len(patternDefinition) > 20 { + trimmedPattern = fmt.Sprintf("%s...", patternDefinition[:17]) // keep whole string 20 characters long including ... + } + return nil, fmt.Errorf("pattern %q supplied to ExtractGrokPatterns at index %d has incorrect format, expecting PATTERNNAME=pattern definition", trimmedPattern, i) + } + + if strings.ContainsRune(parts[0], ':') { + return nil, fmt.Errorf("pattern ID %q should not contain ':'", parts[0]) + } + + err = g.AddPattern(parts[0], parts[1]) + if err != nil { + return nil, fmt.Errorf("failed to add pattern %q=%q: %w", parts[0], parts[1], err) + } + } + } + err = g.Compile(pattern, namedCapturesOnly) + if err != nil { + return nil, fmt.Errorf("the pattern supplied to ExtractGrokPatterns is not a valid pattern: %w", err) + } + + if namedCapturesOnly && !g.HasCaptureGroups() { + return nil, fmt.Errorf("at least 1 named capture group must be supplied in the given regex") + } + + return func(ctx context.Context, tCtx K) (any, error) { + val, err := target.Get(ctx, tCtx) + if err != nil { + return nil, err + } + + matches, err := g.ParseTypedString(val) + if err != nil { + return nil, err + } + + result := pcommon.NewMap() + for k, v := range matches { + switch val := v.(type) { + case bool: + result.PutBool(k, val) + case float64: + result.PutDouble(k, val) + case int: + result.PutInt(k, int64(val)) + case string: + result.PutStr(k, val) + } + } + + return result, err + }, nil +} diff --git a/pkg/ottl/ottlfuncs/func_extract_grok_patterns_test.go b/pkg/ottl/ottlfuncs/func_extract_grok_patterns_test.go new file mode 100644 index 000000000000..371934946aac --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_extract_grok_patterns_test.go @@ -0,0 +1,256 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/pdata/pcommon" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +func Test_extractGrokPatterns_patterns(t *testing.T) { + tests := []struct { + name string + targetString string + pattern string + namedCapturesOnly bool + want func(pcommon.Map) + definitions []string + }{ + { + name: "regex - extract patterns", + targetString: `a=b c=d`, + pattern: `^a=(?P\w+)\s+c=(?P\w+)$`, + namedCapturesOnly: false, + want: func(expectedMap pcommon.Map) { + expectedMap.PutStr("a", "b") + expectedMap.PutStr("c", "d") + }, + definitions: nil, + }, + { + name: "regex - no pattern found", + targetString: `a=b c=d`, + namedCapturesOnly: false, + pattern: `^a=(?P\w+)$`, + want: func(_ pcommon.Map) {}, + }, + { + name: "grok - URI default pattern", + targetString: `http://user:password@example.com:80/path?query=string`, + pattern: "%{URI}", + namedCapturesOnly: false, + want: func(expectedMap pcommon.Map) { + expectedMap.PutStr("URIPROTO", "http") + expectedMap.PutStr("USER", "user") + expectedMap.PutStr("URIHOST", "example.com:80") + expectedMap.PutStr("IPORHOST", "example.com") + expectedMap.PutStr("POSINT", "80") + expectedMap.PutStr("URIPATH", "/path") + expectedMap.PutStr("URIQUERY", "query=string") + }, + definitions: nil, + }, + { + name: "grok - URI AWS pattern with captures", + targetString: `http://user:password@example.com:80/path?query=string`, + pattern: "%{ELB_URI}", + namedCapturesOnly: true, + want: func(expectedMap pcommon.Map) { + expectedMap.PutStr("url.scheme", "http") + expectedMap.PutStr("url.username", "user") + expectedMap.PutStr("url.domain", "example.com") + expectedMap.PutInt("url.port", 80) + expectedMap.PutStr("url.path", "/path") + expectedMap.PutStr("url.query", "query=string") + }, + definitions: nil, + }, + { + name: "grok - POSTGRES log sample", + targetString: `2024-06-18 12:34:56 UTC johndoe 12345 67890`, + pattern: "%{DATESTAMP:timestamp} %{TZ:event.timezone} %{DATA:user.name} %{GREEDYDATA:postgresql.log.connection_id} %{POSINT:process.pid:int}", + namedCapturesOnly: true, + want: func(expectedMap pcommon.Map) { + expectedMap.PutStr("timestamp", "24-06-18 12:34:56") + expectedMap.PutStr("event.timezone", "UTC") + expectedMap.PutStr("user.name", "johndoe") + expectedMap.PutStr("postgresql.log.connection_id", "12345") + expectedMap.PutInt("process.pid", 67890) + }, + definitions: nil, + }, + { + name: "grok - custom patterns", + targetString: `2024-06-18 12:34:56 otel`, + pattern: "%{MYPATTERN}", + namedCapturesOnly: true, + want: func(expectedMap pcommon.Map) { + expectedMap.PutStr("timestamp", "24-06-18 12:34:56") + }, + definitions: []string{ + `MYPATTERN=%{MYDATEPATTERN:timestamp} otel`, + `MYDATEPATTERN=%{DATE}[- ]%{TIME}`, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + nco := ottl.NewTestingOptional(tt.namedCapturesOnly) + target := &ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return tt.targetString, nil + }, + } + + patternDefinitionOptional := ottl.NewTestingOptional[[]string](tt.definitions) + exprFunc, err := extractGrokPatterns(target, tt.pattern, nco, patternDefinitionOptional) + assert.NoError(t, err) + + result, err := exprFunc(context.Background(), nil) + assert.NoError(t, err) + + resultMap, ok := result.(pcommon.Map) + require.True(t, ok) + + expected := pcommon.NewMap() + tt.want(expected) + + expected.Range(func(k string, _ pcommon.Value) bool { + ev, _ := expected.Get(k) + av, _ := resultMap.Get(k) + assert.Equal(t, ev, av) + return true + }) + }) + } +} + +func Test_extractGrokPatterns_validation(t *testing.T) { + tests := []struct { + name string + target ottl.StringGetter[any] + pattern string + namedCapturesOnly bool + definitions []string + expectedFactoryError bool + expectedError bool + }{ + { + name: "bad regex", + target: &ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "foobar", nil + }, + }, + pattern: "(", + namedCapturesOnly: false, + expectedFactoryError: true, + }, + { + name: "no named capture group", + target: &ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "foobar", nil + }, + }, + pattern: "(.*)", + namedCapturesOnly: false, + expectedError: false, + }, + { + name: "custom pattern name invalid", + target: &ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "http://user:password@example.com:80/path?query=string", nil + }, + }, + pattern: "%{URI}", + definitions: []string{ + "PAT:TERN=invalid", + }, + expectedFactoryError: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + nco := ottl.NewTestingOptional(tt.namedCapturesOnly) + patternDefinitionOptional := ottl.NewTestingOptional[[]string](tt.definitions) + exprFunc, err := extractGrokPatterns[any](tt.target, tt.pattern, nco, patternDefinitionOptional) + if tt.expectedFactoryError { + require.Error(t, err) + return + } + + require.NoError(t, err) + + _, err = exprFunc(nil, nil) + assert.Equal(t, tt.expectedError, err != nil) + }) + } +} + +func Test_extractGrokPatterns_bad_input(t *testing.T) { + tests := []struct { + name string + target ottl.StringGetter[any] + pattern string + }{ + { + name: "regex - target is non-string", + target: &ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return 123, nil + }, + }, + pattern: "(?P.*)", + }, + { + name: "regex - target is nil", + target: &ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return nil, nil + }, + }, + pattern: "(?P.*)", + }, + { + name: "target is nil", + target: &ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return nil, nil + }, + }, + pattern: "%{URI}", + }, + { + name: "target is non-string", + target: &ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return 123, nil + }, + }, + pattern: "%{URI}", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + nco := ottl.NewTestingOptional(false) + patternDefinitionOptional := ottl.NewTestingOptional[[]string](nil) + + exprFunc, err := extractGrokPatterns[any](tt.target, tt.pattern, nco, patternDefinitionOptional) + assert.NoError(t, err) + + result, err := exprFunc(nil, nil) + assert.Error(t, err) + assert.Nil(t, result) + }) + } +} diff --git a/pkg/ottl/ottlfuncs/func_flatten.go b/pkg/ottl/ottlfuncs/func_flatten.go index 44a97b8095bc..709eb1bef746 100644 --- a/pkg/ottl/ottlfuncs/func_flatten.go +++ b/pkg/ottl/ottlfuncs/func_flatten.go @@ -37,8 +37,8 @@ func flatten[K any](target ottl.PMapGetter[K], p ottl.Optional[string], d ottl.O depth := int64(math.MaxInt64) if !d.IsEmpty() { depth = d.Get() - if depth < 0 { - return nil, fmt.Errorf("invalid depth for flatten function, %d cannot be negative", depth) + if depth < 1 { + return nil, fmt.Errorf("invalid depth '%d' for flatten function, must be greater than 0", depth) } } @@ -55,7 +55,7 @@ func flatten[K any](target ottl.PMapGetter[K], p ottl.Optional[string], d ottl.O result := pcommon.NewMap() flattenHelper(m, result, prefix, 0, depth) - result.CopyTo(m) + result.MoveTo(m) return nil, nil }, nil @@ -69,7 +69,7 @@ func flattenHelper(m pcommon.Map, result pcommon.Map, prefix string, currentDept switch { case v.Type() == pcommon.ValueTypeMap && currentDepth < maxDepth: flattenHelper(v.Map(), result, prefix+k, currentDepth+1, maxDepth) - case v.Type() == pcommon.ValueTypeSlice: + case v.Type() == pcommon.ValueTypeSlice && currentDepth < maxDepth: for i := 0; i < v.Slice().Len(); i++ { v.Slice().At(i).CopyTo(result.PutEmpty(fmt.Sprintf("%v.%v", prefix+k, i))) } diff --git a/pkg/ottl/ottlfuncs/func_flatten_test.go b/pkg/ottl/ottlfuncs/func_flatten_test.go index 09dfc9648a16..39448e6e2fd0 100644 --- a/pkg/ottl/ottlfuncs/func_flatten_test.go +++ b/pkg/ottl/ottlfuncs/func_flatten_test.go @@ -144,10 +144,42 @@ func Test_flatten(t *testing.T) { }, }, }, + { + name: "max depth with slice", + target: map[string]any{ + "0": map[string]any{ + "1": map[string]any{ + "2": map[string]any{ + "3": "value", + }, + }, + }, + "1": map[string]any{ + "1": []any{ + map[string]any{ + "1": "value", + }, + }, + }, + }, + prefix: ottl.Optional[string]{}, + depth: ottl.NewTestingOptional[int64](1), + expected: map[string]any{ + "0.1": map[string]any{ + "2": map[string]any{ + "3": "value", + }, + }, + "1.1": []any{ + map[string]any{ + "1": "value", + }, + }, + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - m := pcommon.NewMap() err := m.FromRaw(tt.target) assert.NoError(t, err) @@ -166,6 +198,7 @@ func Test_flatten(t *testing.T) { }) } } + func Test_flatten_bad_target(t *testing.T) { target := &ottl.StandardPMapGetter[any]{ Getter: func(_ context.Context, _ any) (any, error) { @@ -179,11 +212,29 @@ func Test_flatten_bad_target(t *testing.T) { } func Test_flatten_bad_depth(t *testing.T) { - target := &ottl.StandardPMapGetter[any]{ - Getter: func(_ context.Context, _ any) (any, error) { - return pcommon.NewMap(), nil + tests := []struct { + name string + depth ottl.Optional[int64] + }{ + { + name: "negative depth", + depth: ottl.NewTestingOptional[int64](-1), + }, + { + name: "zero depth", + depth: ottl.NewTestingOptional[int64](0), }, } - _, err := flatten[any](target, ottl.Optional[string]{}, ottl.NewTestingOptional[int64](-1)) - assert.Error(t, err) + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + target := &ottl.StandardPMapGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return pcommon.NewMap(), nil + }, + } + _, err := flatten[any](target, ottl.Optional[string]{}, tt.depth) + assert.Error(t, err) + }) + } } diff --git a/pkg/ottl/ottlfuncs/func_fnv.go b/pkg/ottl/ottlfuncs/func_fnv.go index 5df53a4737e1..c9a29ca5739b 100644 --- a/pkg/ottl/ottlfuncs/func_fnv.go +++ b/pkg/ottl/ottlfuncs/func_fnv.go @@ -30,7 +30,6 @@ func createFnvFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ott } func FNVHashString[K any](target ottl.StringGetter[K]) (ottl.ExprFunc[K], error) { - return func(ctx context.Context, tCtx K) (any, error) { val, err := target.Get(ctx, tCtx) if err != nil { diff --git a/pkg/ottl/ottlfuncs/func_format.go b/pkg/ottl/ottlfuncs/func_format.go new file mode 100644 index 000000000000..86f3dc830465 --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_format.go @@ -0,0 +1,45 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs" + +import ( + "context" + "fmt" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +type FormatArguments[K any] struct { + Format string + Vals []ottl.Getter[K] +} + +func NewFormatFactory[K any]() ottl.Factory[K] { + return ottl.NewFactory("Format", &FormatArguments[K]{}, createFormatFunction[K]) +} + +func createFormatFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { + args, ok := oArgs.(*FormatArguments[K]) + if !ok { + return nil, fmt.Errorf("FormatFactory args must be of type *FormatArguments[K]") + } + + return format(args.Format, args.Vals), nil +} + +func format[K any](formatString string, vals []ottl.Getter[K]) ottl.ExprFunc[K] { + return func(ctx context.Context, tCtx K) (any, error) { + formatArgs := make([]any, 0, len(vals)) + for _, arg := range vals { + formatArg, err := arg.Get(ctx, tCtx) + if err != nil { + return nil, err + } + + formatArgs = append(formatArgs, formatArg) + } + + return fmt.Sprintf(formatString, formatArgs...), nil + } +} diff --git a/pkg/ottl/ottlfuncs/func_format_test.go b/pkg/ottl/ottlfuncs/func_format_test.go new file mode 100644 index 000000000000..010b46c71d79 --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_format_test.go @@ -0,0 +1,78 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs + +import ( + "context" + "errors" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +type getterFunc[K any] func(ctx context.Context, tCtx K) (any, error) + +func (g getterFunc[K]) Get(ctx context.Context, tCtx K) (any, error) { + return g(ctx, tCtx) +} + +func Test_Format(t *testing.T) { + tests := []struct { + name string + formatString string + formatArgs []ottl.Getter[any] + expected string + }{ + { + name: "non formatting string", + formatString: "test", + formatArgs: []ottl.Getter[any]{}, + expected: "test", + }, + { + name: "padded int", + formatString: "test-%04d", + formatArgs: []ottl.Getter[any]{ + getterFunc[any](func(_ context.Context, _ any) (any, error) { + return 2, nil + }), + }, + expected: "test-0002", + }, + { + name: "multiple-args", + formatString: "test-%04d-%4s", + formatArgs: []ottl.Getter[any]{ + getterFunc[any](func(_ context.Context, _ any) (any, error) { + return 2, nil + }), + getterFunc[any](func(_ context.Context, _ any) (any, error) { + return "te", nil + }), + }, + expected: "test-0002- te", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + exprFunc := format(tt.formatString, tt.formatArgs) + result, err := exprFunc(nil, nil) + assert.NoError(t, err) + assert.Equal(t, tt.expected, result) + }) + } +} + +func TestFormat_error(t *testing.T) { + target := getterFunc[any](func(_ context.Context, _ any) (any, error) { + return nil, errors.New("failed to get") + }) + + exprFunc := format[any]("test-%d", []ottl.Getter[any]{target}) + _, err := exprFunc(context.Background(), nil) + assert.Error(t, err) +} diff --git a/pkg/ottl/ottlfuncs/func_get_xml.go b/pkg/ottl/ottlfuncs/func_get_xml.go new file mode 100644 index 000000000000..c344dd5b8efe --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_get_xml.go @@ -0,0 +1,70 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs" + +import ( + "context" + "fmt" + + "github.com/antchfx/xmlquery" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +type GetXMLArguments[K any] struct { + Target ottl.StringGetter[K] + XPath string +} + +func NewGetXMLFactory[K any]() ottl.Factory[K] { + return ottl.NewFactory("GetXML", &GetXMLArguments[K]{}, createGetXMLFunction[K]) +} + +func createGetXMLFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { + args, ok := oArgs.(*GetXMLArguments[K]) + + if !ok { + return nil, fmt.Errorf("GetXML args must be of type *GetXMLAguments[K]") + } + + if err := validateXPath(args.XPath); err != nil { + return nil, err + } + + return getXML(args.Target, args.XPath), nil +} + +// getXML returns a XML formatted string that is a result of matching elements from the target XML. +func getXML[K any](target ottl.StringGetter[K], xPath string) ottl.ExprFunc[K] { + return func(ctx context.Context, tCtx K) (any, error) { + var doc *xmlquery.Node + if targetVal, err := target.Get(ctx, tCtx); err != nil { + return nil, err + } else if doc, err = parseNodesXML(targetVal); err != nil { + return nil, err + } + + nodes, err := xmlquery.QueryAll(doc, xPath) + if err != nil { + return nil, err + } + + result := &xmlquery.Node{Type: xmlquery.DocumentNode} + for _, n := range nodes { + switch n.Type { + case xmlquery.ElementNode, xmlquery.TextNode: + xmlquery.AddChild(result, n) + case xmlquery.AttributeNode, xmlquery.CharDataNode: + // get the value + xmlquery.AddChild(result, &xmlquery.Node{ + Type: xmlquery.TextNode, + Data: n.InnerText(), + }) + default: + continue + } + } + return result.OutputXML(false), nil + } +} diff --git a/pkg/ottl/ottlfuncs/func_get_xml_test.go b/pkg/ottl/ottlfuncs/func_get_xml_test.go new file mode 100644 index 000000000000..e9686d3696ad --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_get_xml_test.go @@ -0,0 +1,144 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs" + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +func Test_GetXML(t *testing.T) { + tests := []struct { + name string + document string + xPath string + want string + }{ + { + name: "get single element", + document: ``, + xPath: "/a/b", + want: ``, + }, + { + name: "get single complex element", + document: `hello`, + xPath: "/a", + want: `hello`, + }, + { + name: "get uniform elements from same parent", + document: `helloworld`, + xPath: "/a/b", + want: `helloworld`, + }, + { + name: "get nonuniform elements from same parent", + document: `helloworld`, + xPath: "/a/*", + want: `helloworld`, + }, + { + name: "get elements from various places", + document: `123`, + xPath: "/a//x", + want: `123`, + }, + { + name: "get filtered elements from various places", + document: `123`, + xPath: "/a//x[@env='prod']", + want: `13`, + }, + { + name: "ignore empty", + document: ``, + xPath: "/", + want: ``, + }, + { + name: "ignore declaration", + document: ``, + xPath: "/*", + want: ``, + }, + { + name: "ignore comments", + document: ``, + xPath: "/*", + want: ``, + }, + { + name: "get attribute selection", + document: ``, + xPath: "/a/@foo", + want: `bar`, + }, + { + name: "get text selection", + document: `hello`, + xPath: "/a/text()", + want: `hello`, + }, + { + name: "get chardata selection", + document: ``, + xPath: "/a/text()", + want: `hello`, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + factory := NewGetXMLFactory[any]() + exprFunc, err := factory.CreateFunction( + ottl.FunctionContext{}, + &GetXMLArguments[any]{ + Target: ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return tt.document, nil + }, + }, + XPath: tt.xPath, + }) + assert.NoError(t, err) + + result, err := exprFunc(context.Background(), nil) + assert.NoError(t, err) + assert.Equal(t, tt.want, result) + }) + } +} + +func TestCreateGetXMLFunc(t *testing.T) { + factory := NewGetXMLFactory[any]() + fCtx := ottl.FunctionContext{} + + // Invalid arg type + exprFunc, err := factory.CreateFunction(fCtx, nil) + assert.Error(t, err) + assert.Nil(t, exprFunc) + + // Invalid XPath should error on function creation + exprFunc, err = factory.CreateFunction( + fCtx, &GetXMLArguments[any]{ + XPath: "!", + }) + assert.Error(t, err) + assert.Nil(t, exprFunc) + + // Invalid XML should error on function execution + exprFunc, err = factory.CreateFunction( + fCtx, &GetXMLArguments[any]{ + Target: invalidXMLGetter(), + XPath: "/", + }) + assert.NoError(t, err) + assert.NotNil(t, exprFunc) + _, err = exprFunc(context.Background(), nil) + assert.Error(t, err) +} diff --git a/pkg/ottl/ottlfuncs/func_hex.go b/pkg/ottl/ottlfuncs/func_hex.go new file mode 100644 index 000000000000..dd87e1887793 --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_hex.go @@ -0,0 +1,40 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs" + +import ( + "context" + "encoding/hex" + "fmt" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +type HexArguments[K any] struct { + Target ottl.ByteSliceLikeGetter[K] +} + +func NewHexFactory[K any]() ottl.Factory[K] { + return ottl.NewFactory("Hex", &HexArguments[K]{}, createHexFunction[K]) +} + +func createHexFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { + args, ok := oArgs.(*HexArguments[K]) + + if !ok { + return nil, fmt.Errorf("HexFactory args must be of type *HexArguments[K]") + } + + return Hex(args.Target) +} + +func Hex[K any](target ottl.ByteSliceLikeGetter[K]) (ottl.ExprFunc[K], error) { + return func(ctx context.Context, tCtx K) (any, error) { + value, err := target.Get(ctx, tCtx) + if err != nil { + return nil, err + } + return hex.EncodeToString(value), nil + }, nil +} diff --git a/pkg/ottl/ottlfuncs/func_hex_test.go b/pkg/ottl/ottlfuncs/func_hex_test.go new file mode 100644 index 000000000000..fa8689f9b985 --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_hex_test.go @@ -0,0 +1,76 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +func TestHex(t *testing.T) { + type args struct { + target ottl.ByteSliceLikeGetter[any] + } + type testCase struct { + name string + args args + wantFunc func() any + wantErr error + } + tests := []testCase{ + { + name: "int64", + args: args{ + target: &ottl.StandardByteSliceLikeGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return int64(12), nil + }, + }, + }, + wantFunc: func() any { + return "000000000000000c" + }, + }, + { + name: "nil", + args: args{ + target: &ottl.StandardByteSliceLikeGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return nil, nil + }, + }, + }, + wantFunc: func() any { + return "" + }, + wantErr: nil, + }, + { + name: "error", + args: args{ + target: &ottl.StandardByteSliceLikeGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return map[string]string{"hi": "hi"}, nil + }, + }, + }, + wantFunc: func() any { + return nil + }, + wantErr: ottl.TypeError("unsupported type: map[string]string"), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + expressionFunc, _ := Hex(tt.args.target) + got, err := expressionFunc(context.Background(), tt.args) + assert.Equal(t, tt.wantErr, err) + assert.Equal(t, tt.wantFunc(), got) + }) + } +} diff --git a/pkg/ottl/ottlfuncs/func_hour.go b/pkg/ottl/ottlfuncs/func_hour.go index 3e30fbd1087e..5bc3e89600ac 100644 --- a/pkg/ottl/ottlfuncs/func_hour.go +++ b/pkg/ottl/ottlfuncs/func_hour.go @@ -17,6 +17,7 @@ type HourArguments[K any] struct { func NewHourFactory[K any]() ottl.Factory[K] { return ottl.NewFactory("Hour", &HourArguments[K]{}, createHourFunction[K]) } + func createHourFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { args, ok := oArgs.(*HourArguments[K]) diff --git a/pkg/ottl/ottlfuncs/func_hours.go b/pkg/ottl/ottlfuncs/func_hours.go index 66ab2dbcad1a..580091ae4bec 100644 --- a/pkg/ottl/ottlfuncs/func_hours.go +++ b/pkg/ottl/ottlfuncs/func_hours.go @@ -17,6 +17,7 @@ type HoursArguments[K any] struct { func NewHoursFactory[K any]() ottl.Factory[K] { return ottl.NewFactory("Hours", &HoursArguments[K]{}, createHoursFunction[K]) } + func createHoursFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { args, ok := oArgs.(*HoursArguments[K]) diff --git a/pkg/ottl/ottlfuncs/func_insert_xml.go b/pkg/ottl/ottlfuncs/func_insert_xml.go new file mode 100644 index 000000000000..778b16938a07 --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_insert_xml.go @@ -0,0 +1,75 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs" + +import ( + "context" + "errors" + "fmt" + + "github.com/antchfx/xmlquery" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +type InsertXMLArguments[K any] struct { + Target ottl.StringGetter[K] + XPath string + SubDocument ottl.StringGetter[K] +} + +func NewInsertXMLFactory[K any]() ottl.Factory[K] { + return ottl.NewFactory("InsertXML", &InsertXMLArguments[K]{}, createInsertXMLFunction[K]) +} + +func createInsertXMLFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { + args, ok := oArgs.(*InsertXMLArguments[K]) + + if !ok { + return nil, fmt.Errorf("InsertXML args must be of type *InsertXMLAguments[K]") + } + + if err := validateXPath(args.XPath); err != nil { + return nil, err + } + + return insertXML(args.Target, args.XPath, args.SubDocument), nil +} + +// insertXML returns a XML formatted string that is a result of inserting another XML document into +// the content of each selected target element. +func insertXML[K any](target ottl.StringGetter[K], xPath string, subGetter ottl.StringGetter[K]) ottl.ExprFunc[K] { + return func(ctx context.Context, tCtx K) (any, error) { + var doc *xmlquery.Node + if targetVal, err := target.Get(ctx, tCtx); err != nil { + return nil, err + } else if doc, err = parseNodesXML(targetVal); err != nil { + return nil, err + } + + var subDoc *xmlquery.Node + if subDocVal, err := subGetter.Get(ctx, tCtx); err != nil { + return nil, err + } else if subDoc, err = parseNodesXML(subDocVal); err != nil { + return nil, err + } + + nodes, errs := xmlquery.QueryAll(doc, xPath) + for _, n := range nodes { + switch n.Type { + case xmlquery.ElementNode, xmlquery.DocumentNode: + var nextSibling *xmlquery.Node + for c := subDoc.FirstChild; c != nil; c = nextSibling { + // AddChild updates c.NextSibling but not subDoc.FirstChild + // so we need to get the handle to it prior to the update. + nextSibling = c.NextSibling + xmlquery.AddChild(n, c) + } + default: + errs = errors.Join(errs, fmt.Errorf("InsertXML XPath selected non-element: %q", n.Data)) + } + } + return doc.OutputXML(false), errs + } +} diff --git a/pkg/ottl/ottlfuncs/func_insert_xml_test.go b/pkg/ottl/ottlfuncs/func_insert_xml_test.go new file mode 100644 index 000000000000..32750d4c8feb --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_insert_xml_test.go @@ -0,0 +1,185 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs" + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +func Test_InsertXML(t *testing.T) { + tests := []struct { + name string + document string + xPath string + subdoc string + want string + expectErr string + }{ + { + name: "add single element", + document: ``, + xPath: "/a", + subdoc: ``, + want: ``, + }, + { + name: "add single element to multiple matches", + document: ``, + xPath: "/a", + subdoc: ``, + want: ``, + }, + { + name: "add single element at multiple levels", + document: ``, + xPath: "//a", + subdoc: ``, + want: ``, + }, + { + name: "add multiple elements at root", + document: ``, + xPath: "/", + subdoc: ``, + want: ``, + }, + { + name: "add multiple elements to other element", + document: ``, + xPath: "/a", + subdoc: ``, + want: ``, + }, + { + name: "add multiple elements to multiple elements", + document: ``, + xPath: "/a", + subdoc: ``, + want: ``, + }, + { + name: "add multiple elements at multiple levels", + document: ``, + xPath: "//a", + subdoc: ``, + want: ``, + }, + { + name: "add rich doc", + document: ``, + xPath: "/a", + subdoc: `text1`, + want: `text1`, + }, + { + name: "add root element to empty document", + document: ``, + xPath: "/", + subdoc: ``, + want: ``, + }, + { + name: "add root element to non-empty document", + document: ``, + xPath: "/", + subdoc: ``, + want: ``, + }, + { + name: "err on attribute", + document: ``, + xPath: "/a/@foo", + subdoc: "", + want: ``, + expectErr: `InsertXML XPath selected non-element: "foo"`, + }, + { + name: "err on text content", + document: `foo`, + xPath: "/a/text()", + subdoc: "", + want: `foo`, + expectErr: `InsertXML XPath selected non-element: "foo"`, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + f := NewInsertXMLFactory[any]() + exprFunc, err := f.CreateFunction( + ottl.FunctionContext{}, + &InsertXMLArguments[any]{ + Target: ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return tt.document, nil + }, + }, + XPath: tt.xPath, + SubDocument: ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return tt.subdoc, nil + }, + }, + }) + assert.NoError(t, err) + + result, err := exprFunc(context.Background(), nil) + if tt.expectErr == "" { + assert.NoError(t, err) + } else { + assert.EqualError(t, err, tt.expectErr) + } + assert.Equal(t, tt.want, result) + }) + } +} + +func TestCreateInsertXMLFunc(t *testing.T) { + factory := NewInsertXMLFactory[any]() + fCtx := ottl.FunctionContext{} + + // Invalid arg type + exprFunc, err := factory.CreateFunction(fCtx, nil) + assert.Error(t, err) + assert.Nil(t, exprFunc) + + // Invalid XPath should error on function creation + exprFunc, err = factory.CreateFunction( + fCtx, &InsertXMLArguments[any]{ + XPath: "!", + }) + assert.Error(t, err) + assert.Nil(t, exprFunc) + + // Invalid XML target should error on function execution + exprFunc, err = factory.CreateFunction( + fCtx, &InsertXMLArguments[any]{ + Target: invalidXMLGetter(), + XPath: "/", + }) + assert.NoError(t, err) + assert.NotNil(t, exprFunc) + _, err = exprFunc(context.Background(), nil) + assert.Error(t, err) + + // Invalid XML subdoc should error on function execution + exprFunc, err = factory.CreateFunction( + fCtx, &InsertXMLArguments[any]{ + Target: ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "", nil + }, + }, + XPath: "/", + SubDocument: invalidXMLGetter(), + }) + assert.NoError(t, err) + assert.NotNil(t, exprFunc) + _, err = exprFunc(context.Background(), nil) + assert.Error(t, err) +} diff --git a/pkg/ottl/ottlfuncs/func_is_root_span.go b/pkg/ottl/ottlfuncs/func_is_root_span.go new file mode 100644 index 000000000000..1aaba5a7bb4b --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_is_root_span.go @@ -0,0 +1,25 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs" + +import ( + "context" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottlspan" +) + +func NewIsRootSpanFactory() ottl.Factory[ottlspan.TransformContext] { + return ottl.NewFactory("IsRootSpan", nil, createIsRootSpanFunction) +} + +func createIsRootSpanFunction(_ ottl.FunctionContext, _ ottl.Arguments) (ottl.ExprFunc[ottlspan.TransformContext], error) { + return isRootSpan() +} + +func isRootSpan() (ottl.ExprFunc[ottlspan.TransformContext], error) { + return func(_ context.Context, tCtx ottlspan.TransformContext) (any, error) { + return tCtx.GetSpan().ParentSpanID().IsEmpty(), nil + }, nil +} diff --git a/pkg/ottl/ottlfuncs/func_is_root_span_test.go b/pkg/ottl/ottlfuncs/func_is_root_span_test.go new file mode 100644 index 000000000000..68dc177cbe1e --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_is_root_span_test.go @@ -0,0 +1,40 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs" + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/ptrace" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottlspan" +) + +func Test_IsRootSpan(t *testing.T) { + exprFunc, err := isRootSpan() + assert.NoError(t, err) + + // root span + spanRoot := ptrace.NewSpan() + spanRoot.SetParentSpanID(pcommon.SpanID{ + 0, 0, 0, 0, 0, 0, 0, 0, + }) + + value, err := exprFunc(nil, ottlspan.NewTransformContext(spanRoot, pcommon.NewInstrumentationScope(), pcommon.NewResource(), ptrace.NewScopeSpans(), ptrace.NewResourceSpans())) + assert.NoError(t, err) + require.Equal(t, true, value) + + // non root span + spanNonRoot := ptrace.NewSpan() + spanNonRoot.SetParentSpanID(pcommon.SpanID{ + 1, 0, 0, 0, 0, 0, 0, 0, + }) + + value, err = exprFunc(nil, ottlspan.NewTransformContext(spanNonRoot, pcommon.NewInstrumentationScope(), pcommon.NewResource(), ptrace.NewScopeSpans(), ptrace.NewResourceSpans())) + assert.NoError(t, err) + require.Equal(t, false, value) +} diff --git a/pkg/ottl/ottlfuncs/func_keep_matching_keys.go b/pkg/ottl/ottlfuncs/func_keep_matching_keys.go new file mode 100644 index 000000000000..c5878d46eff7 --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_keep_matching_keys.go @@ -0,0 +1,51 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs" +import ( + "fmt" + "regexp" + + "go.opentelemetry.io/collector/pdata/pcommon" + "golang.org/x/net/context" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +type KeepMatchingKeysArguments[K any] struct { + Target ottl.PMapGetter[K] + Pattern string +} + +func NewKeepMatchingKeysFactory[K any]() ottl.Factory[K] { + return ottl.NewFactory("keep_matching_keys", &KeepMatchingKeysArguments[K]{}, createKeepMatchingKeysFunction[K]) +} + +func createKeepMatchingKeysFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { + args, ok := oArgs.(*KeepMatchingKeysArguments[K]) + + if !ok { + return nil, fmt.Errorf("KeepMatchingKeysFactory args must be of type *KeepMatchingKeysArguments[K") + } + + return keepMatchingKeys(args.Target, args.Pattern) +} + +func keepMatchingKeys[K any](target ottl.PMapGetter[K], pattern string) (ottl.ExprFunc[K], error) { + compiledPattern, err := regexp.Compile(pattern) + if err != nil { + return nil, fmt.Errorf("the regex pattern provided to keep_matching_keys is not a valid pattern: %w", err) + } + + return func(ctx context.Context, tCtx K) (any, error) { + val, err := target.Get(ctx, tCtx) + if err != nil { + return nil, err + } + + val.RemoveIf(func(key string, _ pcommon.Value) bool { + return !compiledPattern.MatchString(key) + }) + return nil, nil + }, nil +} diff --git a/pkg/ottl/ottlfuncs/func_keep_matching_keys_test.go b/pkg/ottl/ottlfuncs/func_keep_matching_keys_test.go new file mode 100644 index 000000000000..c77e70c2fb22 --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_keep_matching_keys_test.go @@ -0,0 +1,127 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + "go.opentelemetry.io/collector/pdata/pcommon" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +func Test_keepMatchingKeys(t *testing.T) { + in := pcommon.NewMap() + in.PutStr("foo", "bar") + in.PutStr("foo1", "bar") + in.PutInt("foo2", 3) + + target := &ottl.StandardPMapGetter[pcommon.Map]{ + Getter: func(_ context.Context, tCtx pcommon.Map) (any, error) { + return tCtx, nil + }, + } + + tests := []struct { + name string + target ottl.PMapGetter[pcommon.Map] + pattern string + want func() *pcommon.Map + wantError bool + }{ + { + name: "keep everything that ends with a number", + target: target, + pattern: "\\d$", + want: func() *pcommon.Map { + m := pcommon.NewMap() + m.PutStr("foo1", "bar") + m.PutInt("foo2", 3) + return &m + }, + }, + { + name: "keep nothing", + target: target, + pattern: "bar.*", + want: func() *pcommon.Map { + m := pcommon.NewMap() + // add and remove something to have an empty map instead of nil + m.PutStr("k", "") + m.Remove("k") + return &m + }, + }, + { + name: "keep everything", + target: target, + pattern: "foo.*", + want: func() *pcommon.Map { + m := pcommon.NewMap() + m.PutStr("foo", "bar") + m.PutStr("foo1", "bar") + m.PutInt("foo2", 3) + return &m + }, + }, + { + name: "invalid pattern", + target: target, + pattern: "*", + want: func() *pcommon.Map { + return nil + }, + wantError: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + scenarioMap := pcommon.NewMap() + in.CopyTo(scenarioMap) + + exprFunc, err := keepMatchingKeys(tt.target, tt.pattern) + + if tt.wantError { + assert.Error(t, err) + return + } + assert.NoError(t, err) + + _, err = exprFunc(nil, scenarioMap) + assert.NoError(t, err) + + assert.Equal(t, *tt.want(), scenarioMap) + }) + } +} + +func Test_keepMatchingKeys_bad_input(t *testing.T) { + input := pcommon.NewValueInt(1) + target := &ottl.StandardPMapGetter[any]{ + Getter: func(_ context.Context, tCtx any) (any, error) { + return tCtx, nil + }, + } + + exprFunc, err := keepMatchingKeys[any](target, "anything") + assert.NoError(t, err) + + _, err = exprFunc(nil, input) + assert.Error(t, err) +} + +func Test_keepMatchingKeys_get_nil(t *testing.T) { + target := &ottl.StandardPMapGetter[any]{ + Getter: func(_ context.Context, tCtx any) (any, error) { + return tCtx, nil + }, + } + + exprFunc, err := keepMatchingKeys[any](target, "anything") + assert.NoError(t, err) + _, err = exprFunc(nil, nil) + assert.Error(t, err) +} diff --git a/pkg/ottl/ottlfuncs/func_log_test.go b/pkg/ottl/ottlfuncs/func_log_test.go index 1a7442ca08fa..bd724b426d4d 100644 --- a/pkg/ottl/ottlfuncs/func_log_test.go +++ b/pkg/ottl/ottlfuncs/func_log_test.go @@ -102,7 +102,7 @@ func Test_Log(t *testing.T) { }) result, err := exprFunc(nil, nil) assert.ErrorContains(t, err, tt.errorStr) - assert.Equal(t, nil, result) + assert.Nil(t, result) }) } } diff --git a/pkg/ottl/ottlfuncs/func_md5.go b/pkg/ottl/ottlfuncs/func_md5.go new file mode 100644 index 000000000000..280ac5c8bcb8 --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_md5.go @@ -0,0 +1,46 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs" + +import ( + "context" + "crypto/md5" // #nosec + "encoding/hex" + "fmt" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +type MD5Arguments[K any] struct { + Target ottl.StringGetter[K] +} + +func NewMD5Factory[K any]() ottl.Factory[K] { + return ottl.NewFactory("MD5", &MD5Arguments[K]{}, createMD5Function[K]) +} + +func createMD5Function[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { + args, ok := oArgs.(*MD5Arguments[K]) + + if !ok { + return nil, fmt.Errorf("MD5Factory args must be of type *MD5Arguments[K]") + } + + return MD5HashString(args.Target) +} + +func MD5HashString[K any](target ottl.StringGetter[K]) (ottl.ExprFunc[K], error) { + return func(ctx context.Context, tCtx K) (any, error) { + val, err := target.Get(ctx, tCtx) + if err != nil { + return nil, err + } + hash := md5.New() // #nosec + _, err = hash.Write([]byte(val)) + if err != nil { + return nil, err + } + return hex.EncodeToString(hash.Sum(nil)), nil + }, nil +} diff --git a/pkg/ottl/ottlfuncs/func_md5_test.go b/pkg/ottl/ottlfuncs/func_md5_test.go new file mode 100644 index 000000000000..a53ecd620da2 --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_md5_test.go @@ -0,0 +1,82 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +func Test_MD5(t *testing.T) { + tests := []struct { + name string + value any + expected any + err bool + }{ + { + name: "string", + value: "hello world", + expected: "5eb63bbbe01eeed093cb22bb8f5acdc3", + }, + { + name: "empty string", + value: "", + expected: "d41d8cd98f00b204e9800998ecf8427e", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + exprFunc, err := MD5HashString[any](&ottl.StandardStringGetter[any]{ + Getter: func(context.Context, any) (any, error) { + return tt.value, nil + }, + }) + assert.NoError(t, err) + result, err := exprFunc(nil, nil) + if tt.err { + assert.Error(t, err) + } else { + assert.NoError(t, err) + } + assert.Equal(t, tt.expected, result) + }) + } +} + +func Test_MD5Error(t *testing.T) { + tests := []struct { + name string + value any + err bool + expectedError string + }{ + { + name: "non-string", + value: 10, + expectedError: "expected string but got int", + }, + { + name: "nil", + value: nil, + expectedError: "expected string but got nil", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + exprFunc, err := MD5HashString[any](&ottl.StandardStringGetter[any]{ + Getter: func(context.Context, any) (any, error) { + return tt.value, nil + }, + }) + assert.NoError(t, err) + _, err = exprFunc(nil, nil) + assert.ErrorContains(t, err, tt.expectedError) + }) + } +} diff --git a/pkg/ottl/ottlfuncs/func_merge_maps_test.go b/pkg/ottl/ottlfuncs/func_merge_maps_test.go index afae5d6e2d46..7a00c43bb891 100644 --- a/pkg/ottl/ottlfuncs/func_merge_maps_test.go +++ b/pkg/ottl/ottlfuncs/func_merge_maps_test.go @@ -14,7 +14,6 @@ import ( ) func Test_MergeMaps(t *testing.T) { - input := pcommon.NewMap() input.PutStr("attr1", "value1") diff --git a/pkg/ottl/ottlfuncs/func_microseconds.go b/pkg/ottl/ottlfuncs/func_microseconds.go index 0855efaca055..f76616782b95 100644 --- a/pkg/ottl/ottlfuncs/func_microseconds.go +++ b/pkg/ottl/ottlfuncs/func_microseconds.go @@ -17,6 +17,7 @@ type MicrosecondsArguments[K any] struct { func NewMicrosecondsFactory[K any]() ottl.Factory[K] { return ottl.NewFactory("Microseconds", &MicrosecondsArguments[K]{}, createMicrosecondsFunction[K]) } + func createMicrosecondsFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { args, ok := oArgs.(*MicrosecondsArguments[K]) diff --git a/pkg/ottl/ottlfuncs/func_milliseconds.go b/pkg/ottl/ottlfuncs/func_milliseconds.go index da787e0e157e..f0d605d5ee5c 100644 --- a/pkg/ottl/ottlfuncs/func_milliseconds.go +++ b/pkg/ottl/ottlfuncs/func_milliseconds.go @@ -17,6 +17,7 @@ type MillisecondsArguments[K any] struct { func NewMillisecondsFactory[K any]() ottl.Factory[K] { return ottl.NewFactory("Milliseconds", &MillisecondsArguments[K]{}, createMillisecondsFunction[K]) } + func createMillisecondsFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { args, ok := oArgs.(*MillisecondsArguments[K]) diff --git a/pkg/ottl/ottlfuncs/func_minutes.go b/pkg/ottl/ottlfuncs/func_minutes.go index 5048befc5725..557fa972ed46 100644 --- a/pkg/ottl/ottlfuncs/func_minutes.go +++ b/pkg/ottl/ottlfuncs/func_minutes.go @@ -17,6 +17,7 @@ type MinutesArguments[K any] struct { func NewMinutesFactory[K any]() ottl.Factory[K] { return ottl.NewFactory("Minutes", &MinutesArguments[K]{}, createMinutesFunction[K]) } + func createMinutesFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { args, ok := oArgs.(*MinutesArguments[K]) diff --git a/pkg/ottl/ottlfuncs/func_nanoseconds.go b/pkg/ottl/ottlfuncs/func_nanoseconds.go index 2bb2cd7d1dd4..327696267505 100644 --- a/pkg/ottl/ottlfuncs/func_nanoseconds.go +++ b/pkg/ottl/ottlfuncs/func_nanoseconds.go @@ -17,6 +17,7 @@ type NanosecondsArguments[K any] struct { func NewNanosecondsFactory[K any]() ottl.Factory[K] { return ottl.NewFactory("Nanoseconds", &NanosecondsArguments[K]{}, createNanosecondsFunction[K]) } + func createNanosecondsFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { args, ok := oArgs.(*NanosecondsArguments[K]) diff --git a/pkg/ottl/ottlfuncs/func_parse_json.go b/pkg/ottl/ottlfuncs/func_parse_json.go index 8cca75f71601..011437424c1c 100644 --- a/pkg/ottl/ottlfuncs/func_parse_json.go +++ b/pkg/ottl/ottlfuncs/func_parse_json.go @@ -7,7 +7,7 @@ import ( "context" "fmt" - jsoniter "github.com/json-iterator/go" + "github.com/goccy/go-json" "go.opentelemetry.io/collector/pdata/pcommon" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" @@ -31,7 +31,7 @@ func createParseJSONFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments return parseJSON(args.Target), nil } -// parseJSON returns a `pcommon.Map` struct that is a result of parsing the target string as JSON +// parseJSON returns a `pcommon.Map` or `pcommon.Slice` struct that is a result of parsing the target string as JSON // Each JSON type is converted into a `pdata.Value` using the following map: // // JSON boolean -> bool @@ -46,13 +46,22 @@ func parseJSON[K any](target ottl.StringGetter[K]) ottl.ExprFunc[K] { if err != nil { return nil, err } - var parsedValue map[string]any - err = jsoniter.UnmarshalFromString(targetVal, &parsedValue) + var parsedValue any + err = json.Unmarshal([]byte(targetVal), &parsedValue) if err != nil { return nil, err } - result := pcommon.NewMap() - err = result.FromRaw(parsedValue) - return result, err + switch v := parsedValue.(type) { + case []any: + result := pcommon.NewSlice() + err = result.FromRaw(v) + return result, err + case map[string]any: + result := pcommon.NewMap() + err = result.FromRaw(v) + return result, err + default: + return nil, fmt.Errorf("could not convert parsed value of type %T to JSON object", v) + } } } diff --git a/pkg/ottl/ottlfuncs/func_parse_json_test.go b/pkg/ottl/ottlfuncs/func_parse_json_test.go index f557a5fad1ee..4ef3f8fb49c2 100644 --- a/pkg/ottl/ottlfuncs/func_parse_json_test.go +++ b/pkg/ottl/ottlfuncs/func_parse_json_test.go @@ -16,9 +16,10 @@ import ( func Test_ParseJSON(t *testing.T) { tests := []struct { - name string - target ottl.StringGetter[any] - want func(pcommon.Map) + name string + target ottl.StringGetter[any] + wantMap func(pcommon.Map) + wantSlice func(pcommon.Slice) }{ { name: "handle string", @@ -27,7 +28,7 @@ func Test_ParseJSON(t *testing.T) { return `{"test":"string value"}`, nil }, }, - want: func(expectedMap pcommon.Map) { + wantMap: func(expectedMap pcommon.Map) { expectedMap.PutStr("test", "string value") }, }, @@ -38,7 +39,7 @@ func Test_ParseJSON(t *testing.T) { return `{"test":true}`, nil }, }, - want: func(expectedMap pcommon.Map) { + wantMap: func(expectedMap pcommon.Map) { expectedMap.PutBool("test", true) }, }, @@ -49,7 +50,7 @@ func Test_ParseJSON(t *testing.T) { return `{"test":1}`, nil }, }, - want: func(expectedMap pcommon.Map) { + wantMap: func(expectedMap pcommon.Map) { expectedMap.PutDouble("test", 1) }, }, @@ -60,7 +61,7 @@ func Test_ParseJSON(t *testing.T) { return `{"test":1.1}`, nil }, }, - want: func(expectedMap pcommon.Map) { + wantMap: func(expectedMap pcommon.Map) { expectedMap.PutDouble("test", 1.1) }, }, @@ -71,7 +72,7 @@ func Test_ParseJSON(t *testing.T) { return `{"test":null}`, nil }, }, - want: func(expectedMap pcommon.Map) { + wantMap: func(expectedMap pcommon.Map) { expectedMap.PutEmpty("test") }, }, @@ -82,12 +83,36 @@ func Test_ParseJSON(t *testing.T) { return `{"test":["string","value"]}`, nil }, }, - want: func(expectedMap pcommon.Map) { + wantMap: func(expectedMap pcommon.Map) { emptySlice := expectedMap.PutEmptySlice("test") emptySlice.AppendEmpty().SetStr("string") emptySlice.AppendEmpty().SetStr("value") }, }, + { + name: "handle top level array", + target: ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return `["string","value"]`, nil + }, + }, + wantSlice: func(expectedSlice pcommon.Slice) { + expectedSlice.AppendEmpty().SetStr("string") + expectedSlice.AppendEmpty().SetStr("value") + }, + }, + { + name: "handle top level array of objects", + target: ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return `[{"test":"value"},{"test":"value"}]`, nil + }, + }, + wantSlice: func(expectedSlice pcommon.Slice) { + expectedSlice.AppendEmpty().SetEmptyMap().PutStr("test", "value") + expectedSlice.AppendEmpty().SetEmptyMap().PutStr("test", "value") + }, + }, { name: "handle nested object", target: ottl.StandardStringGetter[any]{ @@ -95,7 +120,7 @@ func Test_ParseJSON(t *testing.T) { return `{"test":{"nested":"true"}}`, nil }, }, - want: func(expectedMap pcommon.Map) { + wantMap: func(expectedMap pcommon.Map) { newMap := expectedMap.PutEmptyMap("test") newMap.PutStr("nested", "true") }, @@ -107,7 +132,7 @@ func Test_ParseJSON(t *testing.T) { return `{"existing":"pass"}`, nil }, }, - want: func(expectedMap pcommon.Map) { + wantMap: func(expectedMap pcommon.Map) { expectedMap.PutStr("existing", "pass") }, }, @@ -118,7 +143,7 @@ func Test_ParseJSON(t *testing.T) { return `{"test1":{"nested":"true"},"test2":"string","test3":1,"test4":1.1,"test5":[[1], [2, 3],[]],"test6":null}`, nil }, }, - want: func(expectedMap pcommon.Map) { + wantMap: func(expectedMap pcommon.Map) { newMap := expectedMap.PutEmptyMap("test1") newMap.PutStr("nested", "true") expectedMap.PutStr("test2", "string") @@ -141,19 +166,25 @@ func Test_ParseJSON(t *testing.T) { result, err := exprFunc(context.Background(), nil) assert.NoError(t, err) - resultMap, ok := result.(pcommon.Map) - require.True(t, ok) - - expected := pcommon.NewMap() - tt.want(expected) - - assert.Equal(t, expected.Len(), resultMap.Len()) - expected.Range(func(k string, _ pcommon.Value) bool { - ev, _ := expected.Get(k) - av, _ := resultMap.Get(k) - assert.Equal(t, ev, av) - return true - }) + if tt.wantMap != nil { + resultMap, ok := result.(pcommon.Map) + require.True(t, ok) + expected := pcommon.NewMap() + tt.wantMap(expected) + assert.Equal(t, expected.Len(), resultMap.Len()) + expected.Range(func(k string, _ pcommon.Value) bool { + ev, _ := expected.Get(k) + av, _ := resultMap.Get(k) + assert.Equal(t, ev, av) + return true + }) + } else if tt.wantSlice != nil { + resultSlice, ok := result.(pcommon.Slice) + require.True(t, ok) + expected := pcommon.NewSlice() + tt.wantSlice(expected) + assert.Equal(t, expected, resultSlice) + } }) } } @@ -168,3 +199,63 @@ func Test_ParseJSON_Error(t *testing.T) { _, err := exprFunc(context.Background(), nil) assert.Error(t, err) } + +const benchData = `{ + "_id": "667cb0db02f4dfc7648b0f6b", + "index": 0, + "guid": "2e419732-8214-4e36-a158-d3ced0217ab6", + "isActive": true, + "balance": "$1,105.05", + "picture": "http://example.com/1", + "age": 22, + "eyeColor": "blue", + "name": "Vincent Knox", + "gender": "male", + "company": "ANIVET", + "email": "vincentknox@anivet.com", + "phone": "+1 (914) 599-2454", + "address": "483 Gerritsen Avenue, Succasunna, Massachusetts, 7803", + "about": "Elit aliqua qui amet duis esse eiusmod cillum proident quis amet elit tempor dolor exercitation. Eu ut tempor exercitation excepteur est. Lorem ad elit sit reprehenderit quis ad sunt laborum amet veniam commodo sit sunt aliqua. Sint incididunt eu ut est magna amet mollit qui deserunt nostrud labore ad. Nostrud officia proident occaecat et irure ut quis culpa mollit veniam. Laboris labore ea reprehenderit veniam mollit enim et proident ipsum id. In qui sit officia laborum.\r\nIn ad consectetur duis ad nisi proident. Non in officia do mollit amet sint voluptate minim nostrud voluptate elit. Veniam Lorem cillum fugiat adipisicing qui ea commodo irure tempor ipsum pariatur sit voluptate. Eiusmod cillum occaecat excepteur cillum aliquip laboris velit aute proident amet.\r\nIpsum sunt eiusmod do ut voluptate sit anim. Consequat nisi nisi consequat amet excepteur ea ad incididunt pariatur veniam exercitation eu ex in. Incididunt sint tempor pariatur Lorem do. Occaecat laborum ad ad id enim dolor deserunt ipsum amet Lorem Lorem. Cillum veniam labore eu do duis.\r\nCillum dolor eiusmod sit amet commodo voluptate pariatur ex irure eu culpa sunt. Incididunt non exercitation est pariatur est. Incididunt mollit Lorem velit ullamco excepteur esse quis id magna et ullamco labore. Laboris consequat tempor est ea amet enim et nisi amet officia dolore magna veniam. Nostrud officia consectetur ea culpa laborum et ut Lorem laboris.\r\nDeserunt labore ullamco dolor exercitation laboris consectetur nulla cupidatat duis. Occaecat quis velit deserunt culpa nostrud eiusmod elit fugiat nulla duis deserunt Lorem do. Proident anim proident aute amet pariatur et do irure. Ad magna qui elit consequat sit exercitation sit. Magna adipisicing id esse aliqua officia magna. Et veniam aliqua minim reprehenderit in culpa. Adipisicing quis eu do Lorem cupidatat consequat ad aute quis.\r\nIn aliquip ea laborum esse dolor reprehenderit qui sit culpa occaecat. Consectetur Lorem dolore adipisicing amet incididunt. Dolor veniam Lorem nulla ex. Eiusmod amet tempor sit eiusmod do reprehenderit proident sit commodo elit cupidatat.\r\nNulla nulla consequat cillum mollit tempor eiusmod irure deserunt amet et voluptate. Fugiat et veniam culpa eiusmod minim ex pariatur. Eiusmod adipisicing pariatur pariatur adipisicing in consequat cillum ut qui veniam amet incididunt ullamco anim.\r\nDolor nulla laborum tempor adipisicing qui id. Exercitation labore aliqua ut laborum velit cupidatat officia. Est qui dolor sint laboris aliqua ea nulla culpa.\r\nAute reprehenderit nulla elit nisi reprehenderit pariatur officia veniam dolore ea occaecat nostrud sunt fugiat. Cillum consequat labore nostrud veniam nisi ea proident est officia incididunt adipisicing qui sint nisi. Ad enim reprehenderit minim labore minim irure dolor. Voluptate commodo dolor excepteur est tempor dolor sunt esse fugiat ea eu et.\r\nIpsum sit velit deserunt aliqua eu labore ad esse eu. Duis eiusmod non exercitation consequat nulla. Enim elit consectetur pariatur sunt labore sunt dolore non do. Sint consequat aliqua tempor consectetur veniam minim. Veniam eu aute occaecat consectetur dolore ullamco dolore officia.\r\n", + "registered": "2023-06-08T12:29:06 +07:00", + "latitude": -59.802339, + "longitude": -160.473187, + "tags": [ + "pariatur", + "anim", + "id", + "duis", + "fugiat", + "qui", + "veniam" + ], + "friends": [ + { + "id": 0, + "name": "Hester Bruce" + }, + { + "id": 1, + "name": "Laurel Mcknight" + }, + { + "id": 2, + "name": "Wynn Moses" + } + ], + "greeting": "Hello, Vincent Knox! You have 1 unread messages.", + "favoriteFruit": "apple" +}` + +func BenchmarkParseJSON(b *testing.B) { + ctx := context.Background() + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := parseJSON(ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return benchData, nil + }, + })(ctx, nil) + require.NoError(b, err) + } +} diff --git a/pkg/ottl/ottlfuncs/func_parse_simplified_xml.go b/pkg/ottl/ottlfuncs/func_parse_simplified_xml.go new file mode 100644 index 000000000000..7e4f1e2753fa --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_parse_simplified_xml.go @@ -0,0 +1,134 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs" + +import ( + "context" + "fmt" + + "github.com/antchfx/xmlquery" + "go.opentelemetry.io/collector/pdata/pcommon" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +type ParseSimplifiedXMLArguments[K any] struct { + Target ottl.StringGetter[K] +} + +func NewParseSimplifiedXMLFactory[K any]() ottl.Factory[K] { + return ottl.NewFactory("ParseSimplifiedXML", &ParseSimplifiedXMLArguments[K]{}, createParseSimplifiedXMLFunction[K]) +} + +func createParseSimplifiedXMLFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { + args, ok := oArgs.(*ParseSimplifiedXMLArguments[K]) + + if !ok { + return nil, fmt.Errorf("ParseSimplifiedXML args must be of type *ParseSimplifiedXMLAguments[K]") + } + + return parseSimplifiedXML(args.Target), nil +} + +// The `ParseSimplifiedXML` Converter returns a `pcommon.Map` struct that is the result of parsing the target +// string without preservation of attributes or extraneous text content. +func parseSimplifiedXML[K any](target ottl.StringGetter[K]) ottl.ExprFunc[K] { + return func(ctx context.Context, tCtx K) (any, error) { + var doc *xmlquery.Node + if targetVal, err := target.Get(ctx, tCtx); err != nil { + return nil, err + } else if doc, err = parseNodesXML(targetVal); err != nil { + return nil, err + } + + docMap := pcommon.NewMap() + parseElement(doc, &docMap) + return docMap, nil + } +} + +func parseElement(parent *xmlquery.Node, parentMap *pcommon.Map) { + // Count the number of each element tag so we know whether it will be a member of a slice or not + childTags := make(map[string]int) + for child := parent.FirstChild; child != nil; child = child.NextSibling { + if child.Type != xmlquery.ElementNode { + continue + } + childTags[child.Data]++ + } + if len(childTags) == 0 { + return + } + + // Convert the children, now knowing whether they will be a member of a slice or not + for child := parent.FirstChild; child != nil; child = child.NextSibling { + if child.Type != xmlquery.ElementNode || child.FirstChild == nil { + continue + } + + leafValue := leafValueFromElement(child) + + // Slice of the same element + if childTags[child.Data] > 1 { + // Get or create the slice of children + var childrenSlice pcommon.Slice + childrenValue, ok := parentMap.Get(child.Data) + if ok { + childrenSlice = childrenValue.Slice() + } else { + childrenSlice = parentMap.PutEmptySlice(child.Data) + } + + // Add the child's text content to the slice + if leafValue != "" { + childrenSlice.AppendEmpty().SetStr(leafValue) + continue + } + + // Parse the child to make sure there's something to add + childMap := pcommon.NewMap() + parseElement(child, &childMap) + if childMap.Len() == 0 { + continue + } + + sliceValue := childrenSlice.AppendEmpty() + sliceMap := sliceValue.SetEmptyMap() + childMap.CopyTo(sliceMap) + continue + } + + if leafValue != "" { + parentMap.PutStr(child.Data, leafValue) + continue + } + + // Child will be a map + childMap := pcommon.NewMap() + parseElement(child, &childMap) + if childMap.Len() == 0 { + continue + } + + childMap.CopyTo(parentMap.PutEmptyMap(child.Data)) + } +} + +func leafValueFromElement(node *xmlquery.Node) string { + // First check if there are any child elements. If there are, ignore any extraneous text. + for child := node.FirstChild; child != nil; child = child.NextSibling { + if child.Type == xmlquery.ElementNode { + return "" + } + } + + // No child elements, so return the first text or CDATA content + for child := node.FirstChild; child != nil; child = child.NextSibling { + switch child.Type { + case xmlquery.TextNode, xmlquery.CharDataNode: + return child.Data + } + } + return "" +} diff --git a/pkg/ottl/ottlfuncs/func_parse_simplified_xml_test.go b/pkg/ottl/ottlfuncs/func_parse_simplified_xml_test.go new file mode 100644 index 000000000000..20f3abd6f1d2 --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_parse_simplified_xml_test.go @@ -0,0 +1,278 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs" + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + "go.opentelemetry.io/collector/pdata/pcommon" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +func Test_ParseSimplifiedXML(t *testing.T) { + tests := []struct { + name string + document string + want pcommon.Map + }{ + { + name: "single leaf", + document: `b`, + want: func() pcommon.Map { + m := pcommon.NewMap() + m.PutStr("a", "b") + return m + }(), + }, + { + name: "double leaf", + document: `bc`, + want: func() pcommon.Map { + m := pcommon.NewMap() + b := m.PutEmptySlice("a") + b.AppendEmpty().SetStr("b") + b.AppendEmpty().SetStr("c") + return m + }(), + }, + { + name: "nested maps", + document: `1`, + want: func() pcommon.Map { + m := pcommon.NewMap() + a := m.PutEmptyMap("a") + a.PutStr("b", "1") + return m + }(), + }, + { + name: "mixed slice", + document: `13`, + want: func() pcommon.Map { + m := pcommon.NewMap() + a := m.PutEmptySlice("a") + a.AppendEmpty().SetStr("1") + a.AppendEmpty().SetStr("2") + b := a.AppendEmpty().SetEmptyMap() + b.PutStr("b", "3") + return m + }(), + }, + { + name: "char data leaf", + document: ``, + want: func() pcommon.Map { + m := pcommon.NewMap() + m.PutStr("a", "b") + return m + }(), + }, + { + name: "ignore attributes", + document: `c`, + want: func() pcommon.Map { + m := pcommon.NewMap() + a := m.PutEmptyMap("a") + a.PutStr("b", "c") + return m + }(), + }, + { + name: "ignore declaration", + document: `b`, + want: func() pcommon.Map { + m := pcommon.NewMap() + m.PutStr("a", "b") + return m + }(), + }, + { + name: "ignore comments", + document: `b`, + want: func() pcommon.Map { + m := pcommon.NewMap() + m.PutStr("a", "b") + return m + }(), + }, + { + name: "ignore empty other than comment", + document: `2`, + want: func() pcommon.Map { + m := pcommon.NewMap() + a := m.PutEmptyMap("a") + a.PutStr("b", "2") + return m + }(), + }, + { + name: "empty other than comment forces slice", + document: `24`, + want: func() pcommon.Map { + m := pcommon.NewMap() + a := m.PutEmptyMap("a") + a.PutStr("b", "2") + c := a.PutEmptySlice("c") + c.AppendEmpty().SetStr("4") + return m + }(), + }, + { + name: "ignore extraneous text", + document: `extra13extra2`, + want: func() pcommon.Map { + m := pcommon.NewMap() + a := m.PutEmptyMap("a") + a.PutStr("b", "3") + return m + }(), + }, + { + name: "ignore extraneous CDATA", + document: `3`, + want: func() pcommon.Map { + m := pcommon.NewMap() + a := m.PutEmptyMap("a") + a.PutStr("b", "3") + return m + }(), + }, + { + name: "ignore single empty element", + document: `3`, + want: func() pcommon.Map { + m := pcommon.NewMap() + a := m.PutEmptyMap("a") + a.PutStr("b", "3") + return m + }(), + }, + { + name: "empty element cascade", + document: `2`, + want: func() pcommon.Map { + m := pcommon.NewMap() + a := m.PutEmptyMap("a") + a.PutStr("d", "2") + return m + }(), + }, + { + name: "empty element forces slice", + document: `3`, + want: func() pcommon.Map { + m := pcommon.NewMap() + a := m.PutEmptyMap("a") + b := a.PutEmptySlice("b") + b.AppendEmpty().SetStr("3") + return m + }(), + }, + { + // ParseSimplifiedXML(ConvertAttributesToElementsXML(ConvertTextToElementsXML("..."))) + name: "Simplified WEL", + document: ` + http://schemas.microsoft.com/win/2004/08/events/event + + Microsoft-Windows-Security-Auditing{54849625-5478-4994-a5ba-3e3b0328c30d} + 4625 + 0 + 0 + 12544 + 0 + 0x8010000000000000 + 2024-09-04T08:38:09.7477579Z + 1361885 + {b67ee0c2-a671-0001-5f6b-82e8c1eeda01} + 6562276 + Security + samuel-vahala + + + + SubjectUserSidS-1-0-0 + TargetUserSidS-1-0-0 + Status0xc000006d + WorkstationNameD-508 + +`, + want: func() pcommon.Map { + result := pcommon.NewMap() + event := result.PutEmptyMap("Event") + event.PutStr("xmlns", "http://schemas.microsoft.com/win/2004/08/events/event") + system := event.PutEmptyMap("System") + provider := system.PutEmptyMap("Provider") + provider.PutStr("Name", "Microsoft-Windows-Security-Auditing") + provider.PutStr("Guid", "{54849625-5478-4994-a5ba-3e3b0328c30d}") + system.PutStr("EventID", "4625") + system.PutStr("Version", "0") + system.PutStr("Level", "0") + system.PutStr("Task", "12544") + system.PutStr("Opcode", "0") + system.PutStr("Keywords", "0x8010000000000000") + timeCreated := system.PutEmptyMap("TimeCreated") + timeCreated.PutStr("SystemTime", "2024-09-04T08:38:09.7477579Z") + system.PutStr("EventRecordID", "1361885") + correlation := system.PutEmptyMap("Correlation") + correlation.PutStr("ActivityID", "{b67ee0c2-a671-0001-5f6b-82e8c1eeda01}") + execution := system.PutEmptyMap("Execution") + execution.PutStr("ProcessID", "656") + execution.PutStr("ThreadID", "2276") + system.PutStr("Channel", "Security") + system.PutStr("Computer", "samuel-vahala") + eventData := event.PutEmptyMap("EventData") + data := eventData.PutEmptySlice("Data") + data1 := data.AppendEmpty().SetEmptyMap() + data1.PutStr("Name", "SubjectUserSid") + data1.PutStr("value", "S-1-0-0") + data2 := data.AppendEmpty().SetEmptyMap() + data2.PutStr("Name", "TargetUserSid") + data2.PutStr("value", "S-1-0-0") + data3 := data.AppendEmpty().SetEmptyMap() + data3.PutStr("Name", "Status") + data3.PutStr("value", "0xc000006d") + data4 := data.AppendEmpty().SetEmptyMap() + data4.PutStr("Name", "WorkstationName") + data4.PutStr("value", "D-508") + return result + }(), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + target := ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return tt.document, nil + }, + } + exprFunc := parseSimplifiedXML(target) + result, err := exprFunc(context.Background(), nil) + assert.NoError(t, err) + assert.Equal(t, tt.want, result) + }) + } +} + +func TestCreateParseSimplifiedXMLFunc(t *testing.T) { + factory := NewParseSimplifiedXMLFactory[any]() + fCtx := ottl.FunctionContext{} + + // Invalid arg type + exprFunc, err := factory.CreateFunction(fCtx, nil) + assert.Error(t, err) + assert.Nil(t, exprFunc) + + // Invalid XML should error on function execution + exprFunc, err = factory.CreateFunction( + fCtx, &ParseSimplifiedXMLArguments[any]{ + Target: invalidXMLGetter(), + }) + assert.NoError(t, err) + assert.NotNil(t, exprFunc) + _, err = exprFunc(context.Background(), nil) + assert.Error(t, err) +} diff --git a/pkg/ottl/ottlfuncs/func_remove_xml.go b/pkg/ottl/ottlfuncs/func_remove_xml.go new file mode 100644 index 000000000000..b45ee74fcd1f --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_remove_xml.go @@ -0,0 +1,95 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs" + +import ( + "context" + "fmt" + "strings" + + "github.com/antchfx/xmlquery" + "github.com/antchfx/xpath" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +type RemoveXMLArguments[K any] struct { + Target ottl.StringGetter[K] + XPath string +} + +func NewRemoveXMLFactory[K any]() ottl.Factory[K] { + return ottl.NewFactory("RemoveXML", &RemoveXMLArguments[K]{}, createRemoveXMLFunction[K]) +} + +func createRemoveXMLFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { + args, ok := oArgs.(*RemoveXMLArguments[K]) + + if !ok { + return nil, fmt.Errorf("RemoveXML args must be of type *RemoveXMLAguments[K]") + } + + if err := validateXPath(args.XPath); err != nil { + return nil, err + } + + return removeXML(args.Target, args.XPath), nil +} + +// removeXML returns a XML formatted string that is a result of removing all matching nodes from the target XML. +// This currently supports removal of elements, attributes, text values, comments, and CharData. +func removeXML[K any](target ottl.StringGetter[K], xPath string) ottl.ExprFunc[K] { + return func(ctx context.Context, tCtx K) (any, error) { + var doc *xmlquery.Node + if targetVal, err := target.Get(ctx, tCtx); err != nil { + return nil, err + } else if doc, err = parseNodesXML(targetVal); err != nil { + return nil, err + } + + nodes, err := xmlquery.QueryAll(doc, xPath) + if err != nil { + return nil, err + } + + for _, n := range nodes { + switch n.Type { + case xmlquery.ElementNode: + xmlquery.RemoveFromTree(n) + case xmlquery.AttributeNode: + n.Parent.RemoveAttr(n.Data) + case xmlquery.TextNode: + n.Data = "" + case xmlquery.CommentNode: + xmlquery.RemoveFromTree(n) + case xmlquery.CharDataNode: + xmlquery.RemoveFromTree(n) + } + } + return doc.OutputXML(false), nil + } +} + +func validateXPath(xPath string) error { + _, err := xpath.Compile(xPath) + if err != nil { + return fmt.Errorf("invalid xpath: %w", err) + } + return nil +} + +// Aside from parsing the XML document, this function also ensures that +// the XML declaration is included in the result only if it was present in +// the original document. +func parseNodesXML(targetVal string) (*xmlquery.Node, error) { + preserveDeclearation := strings.HasPrefix(targetVal, "`, + xPath: "/a/b", + want: ``, + }, + { + name: "remove multiple element", + document: ``, + xPath: "/a/b", + want: ``, + }, + { + name: "remove multiple element with children", + document: ``, + xPath: "/a/b", + want: ``, + }, + { + name: "remove multiple element various depths", + document: ``, + xPath: "/a//b", + want: ``, + }, + { + name: "remove attribute", + document: ``, + xPath: "/a/@foo", + want: ``, + }, + { + name: "remove element with attribute", + document: ``, + xPath: "/a/b[@foo='bar']", + want: ``, + }, + { + name: "remove attributes from multiple nodes", + document: ``, + xPath: "//@foo", + want: ``, + }, + { + name: "remove multiple attributes from single node", + document: ``, + xPath: "//@*[local-name() != 'keep']", + want: ``, + }, + { + name: "remove text", + document: `delete this`, + xPath: "//text()['*delete*']", + want: ``, + }, + { + name: "remove comments", + document: ``, + xPath: "//comment()", + want: ``, + }, + { + name: "remove CDATA", + document: ``, + xPath: "//text()['`, + }, + { + name: "preserve declaration", + document: `delete this`, + xPath: "//text()['*delete*']", + want: ``, + }, + { + name: "ignore empty", + document: ``, + xPath: "/", + want: ``, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + factory := NewRemoveXMLFactory[any]() + exprFunc, err := factory.CreateFunction( + ottl.FunctionContext{}, + &RemoveXMLArguments[any]{ + Target: ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return tt.document, nil + }, + }, + XPath: tt.xPath, + }) + assert.NoError(t, err) + + result, err := exprFunc(context.Background(), nil) + assert.NoError(t, err) + assert.Equal(t, tt.want, result) + }) + } +} + +func TestCreateRemoveXMLFunc(t *testing.T) { + factory := NewRemoveXMLFactory[any]() + fCtx := ottl.FunctionContext{} + + // Invalid arg type + exprFunc, err := factory.CreateFunction(fCtx, nil) + assert.Error(t, err) + assert.Nil(t, exprFunc) + + // Invalid XPath should error on function creation + exprFunc, err = factory.CreateFunction( + fCtx, &RemoveXMLArguments[any]{ + XPath: "!", + }) + assert.Error(t, err) + assert.Nil(t, exprFunc) + + // Invalid XML should error on function execution + exprFunc, err = factory.CreateFunction( + fCtx, &RemoveXMLArguments[any]{ + Target: invalidXMLGetter(), + XPath: "/", + }) + assert.NoError(t, err) + assert.NotNil(t, exprFunc) + _, err = exprFunc(context.Background(), nil) + assert.Error(t, err) +} + +func invalidXMLGetter() ottl.StandardStringGetter[any] { + return ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return `>>>>>>`, nil + }, + } +} diff --git a/pkg/ottl/ottlfuncs/func_replace_all_patterns.go b/pkg/ottl/ottlfuncs/func_replace_all_patterns.go index 0f3aae69e8c2..402c8fec6fa2 100644 --- a/pkg/ottl/ottlfuncs/func_replace_all_patterns.go +++ b/pkg/ottl/ottlfuncs/func_replace_all_patterns.go @@ -97,7 +97,7 @@ func replaceAllPatterns[K any](target ottl.PMapGetter[K], mode string, regexPatt } return true }) - updated.CopyTo(val) + updated.MoveTo(val) return nil, nil }, nil } diff --git a/pkg/ottl/ottlfuncs/func_replace_all_patterns_test.go b/pkg/ottl/ottlfuncs/func_replace_all_patterns_test.go index 534bd80f2c07..2d2be602ca00 100644 --- a/pkg/ottl/ottlfuncs/func_replace_all_patterns_test.go +++ b/pkg/ottl/ottlfuncs/func_replace_all_patterns_test.go @@ -627,5 +627,5 @@ func Test_replaceAllPatterns_invalid_model(t *testing.T) { invalidMode := "invalid" exprFunc, err := replaceAllPatterns[any](target, invalidMode, "regex", replacement, function, replacementFormat) assert.Nil(t, exprFunc) - assert.Contains(t, err.Error(), "invalid mode") + assert.ErrorContains(t, err, "invalid mode") } diff --git a/pkg/ottl/ottlfuncs/func_replace_pattern_test.go b/pkg/ottl/ottlfuncs/func_replace_pattern_test.go index 1ccfcf712081..2e2e0c59e785 100644 --- a/pkg/ottl/ottlfuncs/func_replace_pattern_test.go +++ b/pkg/ottl/ottlfuncs/func_replace_pattern_test.go @@ -35,7 +35,6 @@ func createTestFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ot } func hashString[K any](target ottl.StringGetter[K]) ottl.ExprFunc[K] { - return func(ctx context.Context, tCtx K) (any, error) { val, err := target.Get(ctx, tCtx) if err != nil { @@ -245,7 +244,6 @@ func Test_replacePattern(t *testing.T) { tt.want(expected) assert.Equal(t, expected, scenarioValue) - }) } } diff --git a/pkg/ottl/ottlfuncs/func_seconds.go b/pkg/ottl/ottlfuncs/func_seconds.go index 7c7e57d62902..895faebe63d8 100644 --- a/pkg/ottl/ottlfuncs/func_seconds.go +++ b/pkg/ottl/ottlfuncs/func_seconds.go @@ -17,6 +17,7 @@ type SecondsArguments[K any] struct { func NewSecondsFactory[K any]() ottl.Factory[K] { return ottl.NewFactory("Seconds", &SecondsArguments[K]{}, createSecondsFunction[K]) } + func createSecondsFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { args, ok := oArgs.(*SecondsArguments[K]) diff --git a/pkg/ottl/ottlfuncs/func_sha1.go b/pkg/ottl/ottlfuncs/func_sha1.go index 1e4c22a50e41..dd82b243e23e 100644 --- a/pkg/ottl/ottlfuncs/func_sha1.go +++ b/pkg/ottl/ottlfuncs/func_sha1.go @@ -31,7 +31,6 @@ func createSHA1Function[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ot } func SHA1HashString[K any](target ottl.StringGetter[K]) (ottl.ExprFunc[K], error) { - return func(ctx context.Context, tCtx K) (any, error) { val, err := target.Get(ctx, tCtx) if err != nil { diff --git a/pkg/ottl/ottlfuncs/func_sha256.go b/pkg/ottl/ottlfuncs/func_sha256.go index b2201c71b901..5876b66011b6 100644 --- a/pkg/ottl/ottlfuncs/func_sha256.go +++ b/pkg/ottl/ottlfuncs/func_sha256.go @@ -31,7 +31,6 @@ func createSHA256Function[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) ( } func SHA256HashString[K any](target ottl.StringGetter[K]) (ottl.ExprFunc[K], error) { - return func(ctx context.Context, tCtx K) (any, error) { val, err := target.Get(ctx, tCtx) if err != nil { diff --git a/pkg/ottl/ottlfuncs/func_sha512.go b/pkg/ottl/ottlfuncs/func_sha512.go new file mode 100644 index 000000000000..c9fadf86bf61 --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_sha512.go @@ -0,0 +1,47 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs" + +import ( + "context" + "crypto/sha512" + "encoding/hex" + "fmt" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +type SHA512Arguments[K any] struct { + Target ottl.StringGetter[K] +} + +func NewSHA512Factory[K any]() ottl.Factory[K] { + return ottl.NewFactory("SHA512", &SHA512Arguments[K]{}, createSHA512Function[K]) +} + +func createSHA512Function[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { + args, ok := oArgs.(*SHA512Arguments[K]) + + if !ok { + return nil, fmt.Errorf("SHA512Factory args must be of type *SHA512Arguments[K]") + } + + return SHA512HashString(args.Target) +} + +func SHA512HashString[K any](target ottl.StringGetter[K]) (ottl.ExprFunc[K], error) { + return func(ctx context.Context, tCtx K) (any, error) { + val, err := target.Get(ctx, tCtx) + if err != nil { + return nil, err + } + hash := sha512.New() + _, err = hash.Write([]byte(val)) + if err != nil { + return nil, err + } + hashValue := hex.EncodeToString(hash.Sum(nil)) + return hashValue, nil + }, nil +} diff --git a/pkg/ottl/ottlfuncs/func_sha512_test.go b/pkg/ottl/ottlfuncs/func_sha512_test.go new file mode 100644 index 000000000000..132fc5202173 --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_sha512_test.go @@ -0,0 +1,82 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +func Test_SHA512(t *testing.T) { + tests := []struct { + name string + value any + expected any + err bool + }{ + { + name: "empty string", + value: "", + expected: "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e", + }, + { + name: "string", + value: "foo bar", + expected: "65019286222ace418f742556366f9b9da5aaf6797527d2f0cba5bfe6b2f8ed24746542a0f2be1da8d63c2477f688b608eb53628993afa624f378b03f10090ce7", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + exprFunc, err := SHA512HashString[any](&ottl.StandardStringGetter[any]{ + Getter: func(context.Context, any) (any, error) { + return tt.value, nil + }, + }) + assert.NoError(t, err) + result, err := exprFunc(nil, nil) + if tt.err { + assert.Error(t, err) + } else { + assert.NoError(t, err) + } + assert.Equal(t, tt.expected, result) + }) + } +} + +func Test_SHA512Error(t *testing.T) { + tests := []struct { + name string + value any + err bool + expectedError string + }{ + { + name: "non-string", + value: 10, + expectedError: "expected string but got int", + }, + { + name: "nil", + value: nil, + expectedError: "expected string but got nil", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + exprFunc, err := SHA512HashString[any](&ottl.StandardStringGetter[any]{ + Getter: func(context.Context, any) (any, error) { + return tt.value, nil + }, + }) + assert.NoError(t, err) + _, err = exprFunc(nil, nil) + assert.ErrorContains(t, err, tt.expectedError) + }) + } +} diff --git a/pkg/ottl/ottlfuncs/func_slice_to_map.go b/pkg/ottl/ottlfuncs/func_slice_to_map.go new file mode 100644 index 000000000000..2ed8575c0068 --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_slice_to_map.go @@ -0,0 +1,105 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs" +import ( + "fmt" + + "go.opentelemetry.io/collector/pdata/pcommon" + "golang.org/x/net/context" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +type SliceToMapArguments[K any] struct { + Target ottl.Getter[K] + KeyPath []string + ValuePath ottl.Optional[[]string] +} + +func NewSliceToMapFactory[K any]() ottl.Factory[K] { + return ottl.NewFactory("SliceToMap", &SliceToMapArguments[K]{}, sliceToMapFunction[K]) +} + +func sliceToMapFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { + args, ok := oArgs.(*SliceToMapArguments[K]) + if !ok { + return nil, fmt.Errorf("SliceToMapFactory args must be of type *SliceToMapArguments[K") + } + + return getSliceToMapFunc(args.Target, args.KeyPath, args.ValuePath) +} + +func getSliceToMapFunc[K any](target ottl.Getter[K], keyPath []string, valuePath ottl.Optional[[]string]) (ottl.ExprFunc[K], error) { + if len(keyPath) == 0 { + return nil, fmt.Errorf("key path must contain at least one element") + } + return func(ctx context.Context, tCtx K) (any, error) { + val, err := target.Get(ctx, tCtx) + if err != nil { + return nil, err + } + + switch v := val.(type) { + case []any: + return sliceToMap(v, keyPath, valuePath) + case pcommon.Slice: + return sliceToMap(v.AsRaw(), keyPath, valuePath) + default: + return nil, fmt.Errorf("unsupported type provided to SliceToMap function: %T", v) + } + }, nil +} + +func sliceToMap(v []any, keyPath []string, valuePath ottl.Optional[[]string]) (any, error) { + result := make(map[string]any, len(v)) + for _, elem := range v { + e, ok := elem.(map[string]any) + if !ok { + return nil, fmt.Errorf("could not cast element '%v' to map[string]any", elem) + } + extractedKey, err := extractValue(e, keyPath) + if err != nil { + return nil, fmt.Errorf("could not extract key from element: %w", err) + } + + key, ok := extractedKey.(string) + if !ok { + return nil, fmt.Errorf("extracted key attribute is not of type string") + } + + if valuePath.IsEmpty() { + result[key] = e + continue + } + extractedValue, err := extractValue(e, valuePath.Get()) + if err != nil { + return nil, fmt.Errorf("could not extract value from element: %w", err) + } + result[key] = extractedValue + } + m := pcommon.NewMap() + if err := m.FromRaw(result); err != nil { + return nil, fmt.Errorf("could not create pcommon.Map from result: %w", err) + } + + return m, nil +} + +func extractValue(v map[string]any, path []string) (any, error) { + if len(path) == 0 { + return nil, fmt.Errorf("must provide at least one path item") + } + obj, ok := v[path[0]] + if !ok { + return nil, fmt.Errorf("provided object does not contain the path %v", path) + } + if len(path) == 1 { + return obj, nil + } + + if o, ok := obj.(map[string]any); ok { + return extractValue(o, path[1:]) + } + return nil, fmt.Errorf("provided object does not contain the path %v", path) +} diff --git a/pkg/ottl/ottlfuncs/func_slice_to_map_test.go b/pkg/ottl/ottlfuncs/func_slice_to_map_test.go new file mode 100644 index 000000000000..9ec68798356e --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_slice_to_map_test.go @@ -0,0 +1,310 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/pdata/pcommon" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +func Test_SliceToMap(t *testing.T) { + type testCase struct { + name string + value func() any + keyPath []string + valuePath []string + want func() pcommon.Map + wantExecutionErr string + wantConfigErr string + } + tests := []testCase{ + { + name: "flat object with key path only", + keyPath: []string{"name"}, + value: func() any { + sl := pcommon.NewSlice() + thing1 := sl.AppendEmpty().SetEmptyMap() + thing1.PutStr("name", "foo") + thing1.PutInt("value", 2) + + thing2 := sl.AppendEmpty().SetEmptyMap() + thing2.PutStr("name", "bar") + thing2.PutInt("value", 5) + + return sl + }, + want: func() pcommon.Map { + m := pcommon.NewMap() + thing1 := m.PutEmptyMap("foo") + thing1.PutStr("name", "foo") + thing1.PutInt("value", 2) + + thing2 := m.PutEmptyMap("bar") + thing2.PutStr("name", "bar") + thing2.PutInt("value", 5) + + return m + }, + }, + { + name: "flat object with missing key value", + keyPath: []string{"notfound"}, + value: func() any { + sl := pcommon.NewSlice() + thing1 := sl.AppendEmpty().SetEmptyMap() + thing1.PutStr("name", "foo") + thing1.PutInt("value", 2) + + thing2 := sl.AppendEmpty().SetEmptyMap() + thing2.PutStr("name", "bar") + thing2.PutInt("value", 5) + + return sl + }, + wantExecutionErr: "could not extract key from element: provided object does not contain the path [notfound]", + }, + { + name: "flat object with key path and value path", + keyPath: []string{"name"}, + valuePath: []string{"value"}, + value: func() any { + sl := pcommon.NewSlice() + thing1 := sl.AppendEmpty().SetEmptyMap() + thing1.PutStr("name", "foo") + thing1.PutInt("value", 2) + + thing2 := sl.AppendEmpty().SetEmptyMap() + thing2.PutStr("name", "bar") + thing2.PutInt("value", 5) + + return sl + }, + want: func() pcommon.Map { + m := pcommon.NewMap() + m.PutInt("foo", 2) + m.PutInt("bar", 5) + + return m + }, + }, + { + name: "nested object with key path only", + keyPath: []string{"value", "test"}, + value: func() any { + sl := pcommon.NewSlice() + thing1 := sl.AppendEmpty().SetEmptyMap() + thing1.PutStr("name", "foo") + thing1.PutEmptyMap("value").PutStr("test", "x") + + thing2 := sl.AppendEmpty().SetEmptyMap() + thing2.PutStr("name", "bar") + thing2.PutInt("value", 5) + thing2.PutEmptyMap("value").PutStr("test", "y") + + return sl + }, + want: func() pcommon.Map { + m := pcommon.NewMap() + thing1 := m.PutEmptyMap("x") + thing1.PutStr("name", "foo") + thing1.PutEmptyMap("value").PutStr("test", "x") + + thing2 := m.PutEmptyMap("y") + thing2.PutStr("name", "bar") + thing2.PutEmptyMap("value").PutStr("test", "y") + + return m + }, + }, + { + name: "nested object with key path and value path", + keyPath: []string{"value", "test"}, + valuePath: []string{"name"}, + value: func() any { + sl := pcommon.NewSlice() + thing1 := sl.AppendEmpty().SetEmptyMap() + thing1.PutStr("name", "foo") + thing1.PutEmptyMap("value").PutStr("test", "x") + + thing2 := sl.AppendEmpty().SetEmptyMap() + thing2.PutStr("name", "bar") + thing2.PutInt("value", 5) + thing2.PutEmptyMap("value").PutStr("test", "y") + + return sl + }, + want: func() pcommon.Map { + m := pcommon.NewMap() + m.PutStr("x", "foo") + m.PutStr("y", "bar") + + return m + }, + }, + { + name: "flat object with key path resolving to non-string", + keyPath: []string{"value"}, + value: func() any { + sl := pcommon.NewSlice() + thing1 := sl.AppendEmpty().SetEmptyMap() + thing1.PutStr("name", "foo") + thing1.PutInt("value", 2) + + thing2 := sl.AppendEmpty().SetEmptyMap() + thing2.PutStr("name", "bar") + thing2.PutInt("value", 5) + + return sl + }, + wantExecutionErr: "extracted key attribute is not of type string", + }, + { + name: "nested object with value path not resolving to a value", + keyPath: []string{"value", "test"}, + valuePath: []string{"notfound"}, + value: func() any { + sl := pcommon.NewSlice() + thing1 := sl.AppendEmpty().SetEmptyMap() + thing1.PutStr("name", "foo") + thing1.PutEmptyMap("value").PutStr("test", "x") + + thing2 := sl.AppendEmpty().SetEmptyMap() + thing2.PutStr("name", "bar") + thing2.PutInt("value", 5) + thing2.PutEmptyMap("value").PutStr("test", "y") + + return sl + }, + wantExecutionErr: "could not extract value from element: provided object does not contain the path [notfound]", + }, + { + name: "nested object with value path segment resolving to non-map value", + keyPath: []string{"value", "test"}, + valuePath: []string{"name", "nothing"}, + value: func() any { + sl := pcommon.NewSlice() + thing1 := sl.AppendEmpty().SetEmptyMap() + thing1.PutStr("name", "foo") + thing1.PutEmptyMap("value").PutStr("test", "x") + + thing2 := sl.AppendEmpty().SetEmptyMap() + thing2.PutStr("name", "bar") + thing2.PutInt("value", 5) + thing2.PutEmptyMap("value").PutStr("test", "y") + + return sl + }, + wantExecutionErr: "could not extract value from element: provided object does not contain the path [name nothing]", + }, + { + name: "unsupported type", + keyPath: []string{"name"}, + value: func() any { + return pcommon.NewMap() + }, + wantExecutionErr: "unsupported type provided to SliceToMap function: pcommon.Map", + }, + { + name: "slice containing unsupported value type", + keyPath: []string{"name"}, + value: func() any { + sl := pcommon.NewSlice() + sl.AppendEmpty().SetStr("unsupported") + + return sl + }, + wantExecutionErr: "could not cast element 'unsupported' to map[string]any", + }, + { + name: "empty key path", + keyPath: []string{}, + value: func() any { + return pcommon.NewMap() + }, + wantConfigErr: "key path must contain at least one element", + }, + { + name: "mixed data types with invalid element", + keyPath: []string{"name"}, + valuePath: []string{"value"}, + value: func() any { + sl := pcommon.NewSlice() + thing1 := sl.AppendEmpty().SetEmptyMap() + thing1.PutStr("name", "foo") + thing1.PutInt("value", 2) + + sl.AppendEmpty().SetStr("nothingToSeeHere") + + thing2 := sl.AppendEmpty().SetEmptyMap() + thing2.PutStr("name", "bar") + thing2.PutInt("value", 5) + + return sl + }, + wantExecutionErr: "could not cast element 'nothingToSeeHere' to map[string]any", + }, + { + name: "nested with different value data types", + keyPath: []string{"name"}, + valuePath: []string{"value"}, + value: func() any { + sl := pcommon.NewSlice() + thing1 := sl.AppendEmpty().SetEmptyMap() + thing1.PutStr("name", "foo") + thing1.PutEmptyMap("value").PutStr("test", "value") + + thing2 := sl.AppendEmpty().SetEmptyMap() + thing2.PutStr("name", "bar") + thing2.PutInt("value", 5) + + return sl + }, + want: func() pcommon.Map { + m := pcommon.NewMap() + m.PutEmptyMap("foo").PutStr("test", "value") + m.PutInt("bar", 5) + + return m + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + valuePathOptional := ottl.Optional[[]string]{} + + if len(tt.valuePath) > 0 { + valuePathOptional = ottl.NewTestingOptional(tt.valuePath) + } + associateFunc, err := sliceToMapFunction[any](ottl.FunctionContext{}, &SliceToMapArguments[any]{ + Target: &ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return tt.value(), nil + }, + }, + KeyPath: tt.keyPath, + ValuePath: valuePathOptional, + }) + + if tt.wantConfigErr != "" { + require.ErrorContains(t, err, tt.wantConfigErr) + return + } + require.NoError(t, err) + + result, err := associateFunc(nil, nil) + if tt.wantExecutionErr != "" { + require.ErrorContains(t, err, tt.wantExecutionErr) + return + } + + require.NoError(t, err) + require.EqualValues(t, tt.want().AsRaw(), result.(pcommon.Map).AsRaw()) + }) + } +} diff --git a/pkg/ottl/ottlfuncs/func_sort.go b/pkg/ottl/ottlfuncs/func_sort.go new file mode 100644 index 000000000000..4c9f56c820ce --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_sort.go @@ -0,0 +1,253 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs" + +import ( + "cmp" + "context" + "fmt" + "slices" + "strconv" + + "go.opentelemetry.io/collector/pdata/pcommon" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +const ( + sortAsc = "asc" + sortDesc = "desc" +) + +type SortArguments[K any] struct { + Target ottl.Getter[K] + Order ottl.Optional[string] +} + +func NewSortFactory[K any]() ottl.Factory[K] { + return ottl.NewFactory("Sort", &SortArguments[K]{}, createSortFunction[K]) +} + +func createSortFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { + args, ok := oArgs.(*SortArguments[K]) + + if !ok { + return nil, fmt.Errorf("SortFactory args must be of type *SortArguments[K]") + } + + order := sortAsc + if !args.Order.IsEmpty() { + o := args.Order.Get() + switch o { + case sortAsc, sortDesc: + order = o + default: + return nil, fmt.Errorf("invalid arguments: %s. Order should be either \"%s\" or \"%s\"", o, sortAsc, sortDesc) + } + } + + return sort(args.Target, order), nil +} + +func sort[K any](target ottl.Getter[K], order string) ottl.ExprFunc[K] { + return func(ctx context.Context, tCtx K) (any, error) { + val, err := target.Get(ctx, tCtx) + if err != nil { + return nil, err + } + + switch v := val.(type) { + case pcommon.Slice: + return sortSlice(v, order) + case pcommon.Value: + if v.Type() == pcommon.ValueTypeSlice { + return sortSlice(v.Slice(), order) + } + return nil, fmt.Errorf("sort with unsupported type: '%s'. Target is not a list", v.Type().String()) + case []any: + // handle Sort([1,2,3]) + slice := pcommon.NewValueSlice().SetEmptySlice() + if err := slice.FromRaw(v); err != nil { + return nil, fmt.Errorf("sort with unsupported type: '%T'. Target is not a list of primitive types; %w", v, err) + } + return sortSlice(slice, order) + case []string: + dup := makeCopy(v) + return sortTypedSlice(dup, order), nil + case []int64: + dup := makeCopy(v) + return sortTypedSlice(dup, order), nil + case []float64: + dup := makeCopy(v) + return sortTypedSlice(dup, order), nil + case []bool: + var strings []string + for _, b := range v { + strings = append(strings, strconv.FormatBool(b)) + } + + sortTypedSlice(strings, order) + + bools := make([]bool, len(strings)) + for i, s := range strings { + boolValue, _ := strconv.ParseBool(s) + bools[i] = boolValue + } + return bools, nil + default: + return nil, fmt.Errorf("sort with unsupported type: '%T'. Target is not a list", v) + } + } +} + +// sortSlice sorts a pcommon.Slice based on the specified order. +// It gets the common type for all elements in the slice and converts all elements to this common type, creating a new copy +// Parameters: +// - slice: The pcommon.Slice to be sorted +// - order: The sort order. "asc" for ascending, "desc" for descending +// +// Returns: +// - A sorted slice as []any or the original pcommon.Slice +// - An error if an unsupported type is encountered +func sortSlice(slice pcommon.Slice, order string) (any, error) { + length := slice.Len() + if length == 0 { + return slice, nil + } + + commonType, ok := findCommonValueType(slice) + if !ok { + return slice, nil + } + + switch commonType { + case pcommon.ValueTypeInt: + arr := makeConvertedCopy(slice, func(idx int) int64 { + return slice.At(idx).Int() + }) + return sortConvertedSlice(arr, order), nil + case pcommon.ValueTypeDouble: + arr := makeConvertedCopy(slice, func(idx int) float64 { + s := slice.At(idx) + if s.Type() == pcommon.ValueTypeInt { + return float64(s.Int()) + } + + return s.Double() + }) + return sortConvertedSlice(arr, order), nil + case pcommon.ValueTypeStr: + arr := makeConvertedCopy(slice, func(idx int) string { + return slice.At(idx).AsString() + }) + return sortConvertedSlice(arr, order), nil + default: + return nil, fmt.Errorf("sort with unsupported type: '%T'", commonType) + } +} + +type targetType interface { + ~int64 | ~float64 | ~string +} + +// findCommonValueType determines the most appropriate common type for all elements in a pcommon.Slice. +// It returns two values: +// - A pcommon.ValueType representing the desired common type for all elements. +// Mixed Numeric types return ValueTypeDouble. Integer type returns ValueTypeInt. Double type returns ValueTypeDouble. +// String, Bool, Empty and mixed of the mentioned types return ValueTypeStr, as they require string conversion for comparison. +// - A boolean indicating whether a common type could be determined (true) or not (false). +// returns false for ValueTypeMap, ValueTypeSlice and ValueTypeBytes. They are unsupported types for sort. +func findCommonValueType(slice pcommon.Slice) (pcommon.ValueType, bool) { + length := slice.Len() + if length == 0 { + return pcommon.ValueTypeEmpty, false + } + + wantType := slice.At(0).Type() + wantStr := false + wantDouble := false + + for i := 0; i < length; i++ { + value := slice.At(i) + currType := value.Type() + + switch currType { + case pcommon.ValueTypeInt: + if wantType == pcommon.ValueTypeDouble { + wantDouble = true + } + case pcommon.ValueTypeDouble: + if wantType == pcommon.ValueTypeInt { + wantDouble = true + } + case pcommon.ValueTypeStr, pcommon.ValueTypeBool, pcommon.ValueTypeEmpty: + wantStr = true + default: + return pcommon.ValueTypeEmpty, false + } + } + + if wantStr { + wantType = pcommon.ValueTypeStr + } else if wantDouble { + wantType = pcommon.ValueTypeDouble + } + + return wantType, true +} + +func makeCopy[T targetType](src []T) []T { + dup := make([]T, len(src)) + copy(dup, src) + return dup +} + +func sortTypedSlice[T targetType](arr []T, order string) []T { + if len(arr) == 0 { + return arr + } + + slices.SortFunc(arr, func(a, b T) int { + if order == sortDesc { + return cmp.Compare(b, a) + } + return cmp.Compare(a, b) + }) + + return arr +} + +type convertedValue[T targetType] struct { + value T + originalValue any +} + +func makeConvertedCopy[T targetType](slice pcommon.Slice, converter func(idx int) T) []convertedValue[T] { + length := slice.Len() + var out []convertedValue[T] + for i := 0; i < length; i++ { + cv := convertedValue[T]{ + value: converter(i), + originalValue: slice.At(i).AsRaw(), + } + out = append(out, cv) + } + return out +} + +func sortConvertedSlice[T targetType](cvs []convertedValue[T], order string) []any { + slices.SortFunc(cvs, func(a, b convertedValue[T]) int { + if order == sortDesc { + return cmp.Compare(b.value, a.value) + } + return cmp.Compare(a.value, b.value) + }) + + var out []any + for _, cv := range cvs { + out = append(out, cv.originalValue) + } + + return out +} diff --git a/pkg/ottl/ottlfuncs/func_sort_test.go b/pkg/ottl/ottlfuncs/func_sort_test.go new file mode 100644 index 000000000000..b6f038c946f8 --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_sort_test.go @@ -0,0 +1,279 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + "go.opentelemetry.io/collector/pdata/pcommon" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +func Test_Sort(t *testing.T) { + pMap := pcommon.NewValueMap().SetEmptyMap() + pMap.PutStr("k", "v") + emptySlice := pcommon.NewValueSlice().SetEmptySlice() + + tests := []struct { + name string + getter ottl.Getter[any] + order string + expected any + err bool + }{ + { + name: "int slice", + getter: ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + s := pcommon.NewValueSlice().SetEmptySlice() + _ = s.FromRaw([]any{9, 6, 3}) + return s, nil + }, + }, + order: sortAsc, + expected: []any{int64(3), int64(6), int64(9)}, + }, + { + name: "int slice desc", + getter: ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + s := pcommon.NewValueSlice().SetEmptySlice() + _ = s.FromRaw([]any{3, 6, 9}) + return s, nil + }, + }, + order: sortDesc, + expected: []any{int64(9), int64(6), int64(3)}, + }, + { + name: "string slice", + getter: ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + s := pcommon.NewValueSlice().SetEmptySlice() + _ = s.FromRaw([]any{"i", "am", "awesome", "slice"}) + return s, nil + }, + }, + order: sortAsc, + expected: []any{"am", "awesome", "i", "slice"}, + }, + { + name: "double slice", + getter: ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + s := pcommon.NewValueSlice().SetEmptySlice() + _ = s.FromRaw([]any{1.5, 10.2, 2.3, 0.5}) + return s, nil + }, + }, + order: sortAsc, + expected: []any{0.5, 1.5, 2.3, 10.2}, + }, + { + name: "empty slice", + getter: ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + s := pcommon.NewValueSlice().SetEmptySlice() + return s, nil + }, + }, + order: sortAsc, + expected: emptySlice, + }, + { + name: "bool slice compares as string", + getter: ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + s := pcommon.NewValueSlice().SetEmptySlice() + _ = s.FromRaw([]any{true, false, true, false}) + return s, nil + }, + }, + order: sortAsc, + expected: []any{false, false, true, true}, + }, + { + name: "mixed types slice compares as string", + getter: ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + s := pcommon.NewValueSlice().SetEmptySlice() + _ = s.FromRaw([]any{1, "two", 3.33, false}) + return s, nil + }, + }, + order: sortAsc, + expected: []any{int64(1), 3.33, false, "two"}, + }, + { + name: "double and string slice compares as string", + getter: ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + s := pcommon.NewValueSlice().SetEmptySlice() + _ = s.FromRaw([]any{1.5, "10.2", 2.3, 0.5}) + return s, nil + }, + }, + order: sortAsc, + expected: []any{0.5, 1.5, "10.2", 2.3}, + }, + { + name: "mixed numeric types slice compares as double", + getter: ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + s := pcommon.NewValueSlice().SetEmptySlice() + _ = s.FromRaw([]any{0, 2, 3.33, 0}) + return s, nil + }, + }, + order: sortAsc, + expected: []any{int64(0), int64(0), int64(2), 3.33}, + }, + { + name: "mixed numeric types slice compares as double desc", + getter: ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + s := pcommon.NewValueSlice().SetEmptySlice() + _ = s.FromRaw([]any{3.14, 2, 3.33, 0}) + return s, nil + }, + }, + order: sortDesc, + expected: []any{3.33, 3.14, int64(2), int64(0)}, + }, + { + name: "[]any compares as string", + getter: ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return []any{1, "two", 3.33, false}, nil + }, + }, + order: sortAsc, + expected: []any{int64(1), 3.33, false, "two"}, + }, + { + name: "[]string", + getter: ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return []string{"A", "a", "aa"}, nil + }, + }, + order: sortAsc, + expected: []string{"A", "a", "aa"}, + }, + { + name: "[]bool compares as string", + getter: ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return []bool{true, false}, nil + }, + }, + order: sortAsc, + expected: []bool{false, true}, + }, + { + name: "[]int64", + getter: ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return []int64{6, 3, 9}, nil + }, + }, + order: sortAsc, + expected: []int64{3, 6, 9}, + }, + { + name: "[]float64", + getter: ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return []float64{1.5, 10.2, 2.3, 0.5}, nil + }, + }, + order: sortAsc, + expected: []float64{0.5, 1.5, 2.3, 10.2}, + }, + { + name: "pcommon.Value is a slice", + getter: ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + pv := pcommon.NewValueEmpty() + s := pv.SetEmptySlice() + _ = s.FromRaw([]any{"a", "slice", "a"}) + return pv, nil + }, + }, + order: sortAsc, + expected: []any{"a", "a", "slice"}, + }, + { + name: "pcommon.Value is empty", + getter: ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + pv := pcommon.NewValueEmpty() + return pv, nil + }, + }, + order: sortAsc, + expected: nil, + err: true, + }, + { + name: "unsupported ValueTypeMap", + getter: ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return pMap, nil + }, + }, + order: sortAsc, + expected: nil, + err: true, + }, + { + name: "unsupported bytes", + getter: ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return []byte("still fine"), nil + }, + }, + order: sortAsc, + expected: nil, + err: true, + }, + { + name: "unsupported string", + getter: ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "no change", nil + }, + }, + order: sortAsc, + expected: nil, + err: true, + }, + { + name: "[]any with a map", + getter: ottl.StandardGetSetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return []any{map[string]string{"some": "invalid kv"}}, nil + }, + }, + order: sortAsc, + expected: nil, + err: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + exprFunc := sort(tt.getter, tt.order) + result, err := exprFunc(nil, nil) + if tt.err { + assert.Error(t, err) + } else { + assert.NoError(t, err) + } + assert.Equal(t, tt.expected, result) + }) + } +} diff --git a/pkg/ottl/ottlfuncs/func_substring_test.go b/pkg/ottl/ottlfuncs/func_substring_test.go index 491a14f45d8c..3079638bfe43 100644 --- a/pkg/ottl/ottlfuncs/func_substring_test.go +++ b/pkg/ottl/ottlfuncs/func_substring_test.go @@ -208,7 +208,7 @@ func Test_substring_error(t *testing.T) { exprFunc := substring(tt.target, tt.start, tt.length) result, err := exprFunc(nil, nil) assert.Error(t, err) - assert.Equal(t, nil, result) + assert.Nil(t, result) }) } } diff --git a/pkg/ottl/ottlfuncs/func_time.go b/pkg/ottl/ottlfuncs/func_time.go index b6d793cc3e5d..c849fb3e11a6 100644 --- a/pkg/ottl/ottlfuncs/func_time.go +++ b/pkg/ottl/ottlfuncs/func_time.go @@ -6,6 +6,7 @@ package ottlfuncs // import "github.com/open-telemetry/opentelemetry-collector-c import ( "context" "fmt" + "time" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/timeutils" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" @@ -15,11 +16,13 @@ type TimeArguments[K any] struct { Time ottl.StringGetter[K] Format string Location ottl.Optional[string] + Locale ottl.Optional[string] } func NewTimeFactory[K any]() ottl.Factory[K] { return ottl.NewFactory("Time", &TimeArguments[K]{}, createTimeFunction[K]) } + func createTimeFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { args, ok := oArgs.(*TimeArguments[K]) @@ -27,13 +30,18 @@ func createTimeFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ot return nil, fmt.Errorf("TimeFactory args must be of type *TimeArguments[K]") } - return Time(args.Time, args.Format, args.Location) + return Time(args.Time, args.Format, args.Location, args.Locale) } -func Time[K any](inputTime ottl.StringGetter[K], format string, location ottl.Optional[string]) (ottl.ExprFunc[K], error) { +func Time[K any](inputTime ottl.StringGetter[K], format string, location ottl.Optional[string], locale ottl.Optional[string]) (ottl.ExprFunc[K], error) { if format == "" { return nil, fmt.Errorf("format cannot be nil") } + gotimeFormat, err := timeutils.StrptimeToGotime(format) + if err != nil { + return nil, err + } + var defaultLocation *string if !location.IsEmpty() { l := location.Get() @@ -45,6 +53,15 @@ func Time[K any](inputTime ottl.StringGetter[K], format string, location ottl.Op return nil, err } + var inputTimeLocale *string + if !locale.IsEmpty() { + l := locale.Get() + if err = timeutils.ValidateLocale(l); err != nil { + return nil, err + } + inputTimeLocale = &l + } + return func(ctx context.Context, tCtx K) (any, error) { t, err := inputTime.Get(ctx, tCtx) if err != nil { @@ -53,7 +70,12 @@ func Time[K any](inputTime ottl.StringGetter[K], format string, location ottl.Op if t == "" { return nil, fmt.Errorf("time cannot be nil") } - timestamp, err := timeutils.ParseStrptime(format, t, loc) + var timestamp time.Time + if inputTimeLocale != nil { + timestamp, err = timeutils.ParseLocalizedGotime(gotimeFormat, t, loc, *inputTimeLocale) + } else { + timestamp, err = timeutils.ParseGotime(gotimeFormat, t, loc) + } if err != nil { return nil, err } diff --git a/pkg/ottl/ottlfuncs/func_time_test.go b/pkg/ottl/ottlfuncs/func_time_test.go index 41e62edaae04..4f24e36584dc 100644 --- a/pkg/ottl/ottlfuncs/func_time_test.go +++ b/pkg/ottl/ottlfuncs/func_time_test.go @@ -24,6 +24,7 @@ func Test_Time(t *testing.T) { format string expected time.Time location string + locale string }{ { name: "simple short form", @@ -73,7 +74,7 @@ func Test_Time(t *testing.T) { }, }, format: "%b %d %Y %H:%M:%S", - expected: time.Date(2023, 3, 14, 17, 02, 59, 0, time.Local), + expected: time.Date(2023, 3, 14, 17, 0o2, 59, 0, time.Local), }, { name: "day of the week long form", @@ -133,7 +134,7 @@ func Test_Time(t *testing.T) { }, }, format: "%Y-%m-%dT%H:%M:%S%z %Z", - expected: time.Date(2012, 11, 01, 22, 8, 41, 0, time.FixedZone("EST", 0)), + expected: time.Date(2012, 11, 0o1, 22, 8, 41, 0, time.FixedZone("EST", 0)), }, { name: "RFC 3339 in custom format before 2000", @@ -143,7 +144,7 @@ func Test_Time(t *testing.T) { }, }, format: "%Y-%m-%dT%H:%M:%S %Z", - expected: time.Date(1986, 10, 01, 00, 17, 33, 00, time.FixedZone("MST", -7*60*60)), + expected: time.Date(1986, 10, 0o1, 0o0, 17, 33, 0o0, time.FixedZone("MST", -7*60*60)), }, { name: "no location", @@ -153,7 +154,7 @@ func Test_Time(t *testing.T) { }, }, format: "%Y/%m/%d", - expected: time.Date(2022, 01, 01, 0, 0, 0, 0, time.Local), + expected: time.Date(2022, 0o1, 0o1, 0, 0, 0, 0, time.Local), }, { name: "with location - America", @@ -186,16 +187,54 @@ func Test_Time(t *testing.T) { }, location: "Asia/Shanghai", format: "%Y-%m-%dT%H:%M:%S %Z", - expected: time.Date(1986, 10, 01, 00, 17, 33, 00, time.FixedZone("MST", -7*60*60)), + expected: time.Date(1986, 10, 0o1, 0o0, 17, 33, 0o0, time.FixedZone("MST", -7*60*60)), + }, + { + name: "with locale", + time: &ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "Febrero 25 lunes, 2002, 02:03:04 p.m.", nil + }, + }, + format: "%B %d %A, %Y, %r", + locale: "es-ES", + expected: time.Date(2002, 2, 25, 14, 0o3, 0o4, 0, time.Local), + }, + { + name: "with locale - date only", + time: &ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "mercoledì set 4 2024", nil + }, + }, + format: "%A %h %e %Y", + locale: "it", + expected: time.Date(2024, 9, 4, 0, 0, 0, 0, time.Local), + }, + { + name: "with locale and location", + time: &ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "Febrero 25 lunes, 2002, 02:03:04 p.m.", nil + }, + }, + format: "%B %d %A, %Y, %r", + location: "America/New_York", + locale: "es-ES", + expected: time.Date(2002, 2, 25, 14, 0o3, 0o4, 0, locationAmericaNewYork), }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - var locOptional ottl.Optional[string] + var locationOptional ottl.Optional[string] if tt.location != "" { - locOptional = ottl.NewTestingOptional(tt.location) + locationOptional = ottl.NewTestingOptional(tt.location) + } + var localeOptional ottl.Optional[string] + if tt.locale != "" { + localeOptional = ottl.NewTestingOptional(tt.locale) } - exprFunc, err := Time(tt.time, tt.format, locOptional) + exprFunc, err := Time(tt.time, tt.format, locationOptional, localeOptional) assert.NoError(t, err) result, err := exprFunc(nil, nil) assert.NoError(t, err) @@ -234,8 +273,9 @@ func Test_TimeError(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - var locOptional ottl.Optional[string] - exprFunc, err := Time[any](tt.time, tt.format, locOptional) + var locationOptional ottl.Optional[string] + var localeOptional ottl.Optional[string] + exprFunc, err := Time[any](tt.time, tt.format, locationOptional, localeOptional) require.NoError(t, err) _, err = exprFunc(context.Background(), nil) assert.ErrorContains(t, err, tt.expectedError) @@ -250,6 +290,7 @@ func Test_TimeFormatError(t *testing.T) { format string expectedError string location string + locale string }{ { name: "invalid short with no format", @@ -272,15 +313,221 @@ func Test_TimeFormatError(t *testing.T) { location: "Jupiter/Ganymede", expectedError: "unknown time zone Jupiter/Ganymede", }, + { + name: "with unsupported locale", + time: &ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "2023-05-26 12:34:56", nil + }, + }, + format: "%Y-%m-%d %H:%M:%S", + locale: "foo-bar", + expectedError: "unsupported locale 'foo-bar'", + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - var locOptional ottl.Optional[string] + var locationOptional ottl.Optional[string] if tt.location != "" { - locOptional = ottl.NewTestingOptional(tt.location) + locationOptional = ottl.NewTestingOptional(tt.location) } - _, err := Time[any](tt.time, tt.format, locOptional) + var localeOptional ottl.Optional[string] + if tt.locale != "" { + localeOptional = ottl.NewTestingOptional(tt.locale) + } + _, err := Time[any](tt.time, tt.format, locationOptional, localeOptional) assert.ErrorContains(t, err, tt.expectedError) }) } } + +func Benchmark_Time(t *testing.B) { + locationAmericaNewYork, _ := time.LoadLocation("America/New_York") + locationAsiaShanghai, _ := time.LoadLocation("Asia/Shanghai") + + tests := []struct { + name string + time ottl.StringGetter[any] + format string + expected time.Time + location string + }{ + { + name: "simple short form", + time: &ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "2023-04-12", nil + }, + }, + format: "%Y-%m-%d", + expected: time.Date(2023, 4, 12, 0, 0, 0, 0, time.Local), + }, + { + name: "simple short form with short year and slashes", + time: &ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "11/11/11", nil + }, + }, + format: "%d/%m/%y", + expected: time.Date(2011, 11, 11, 0, 0, 0, 0, time.Local), + }, + { + name: "month day year", + time: &ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "02/04/2023", nil + }, + }, + format: "%m/%d/%Y", + expected: time.Date(2023, 2, 4, 0, 0, 0, 0, time.Local), + }, + { + name: "simple long form", + time: &ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "July 31, 1993", nil + }, + }, + format: "%B %d, %Y", + expected: time.Date(1993, 7, 31, 0, 0, 0, 0, time.Local), + }, + { + name: "date with timestamp", + time: &ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "Mar 14 2023 17:02:59", nil + }, + }, + format: "%b %d %Y %H:%M:%S", + expected: time.Date(2023, 3, 14, 17, 0o2, 59, 0, time.Local), + }, + { + name: "day of the week long form", + time: &ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "Monday, May 01, 2023", nil + }, + }, + format: "%A, %B %d, %Y", + expected: time.Date(2023, 5, 1, 0, 0, 0, 0, time.Local), + }, + { + name: "short weekday, short month, long format", + time: &ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "Sat, May 20, 2023", nil + }, + }, + format: "%a, %b %d, %Y", + expected: time.Date(2023, 5, 20, 0, 0, 0, 0, time.Local), + }, + { + name: "short months", + time: &ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "Feb 15, 2023", nil + }, + }, + format: "%b %d, %Y", + expected: time.Date(2023, 2, 15, 0, 0, 0, 0, time.Local), + }, + { + name: "timestamp with time zone offset", + time: &ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "2023-05-26 12:34:56 HST", nil + }, + }, + format: "%Y-%m-%d %H:%M:%S %Z", + expected: time.Date(2023, 5, 26, 12, 34, 56, 0, time.FixedZone("HST", -10*60*60)), + }, + { + name: "short date with timestamp without time zone offset", + time: &ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "2023-05-26T12:34:56 GMT", nil + }, + }, + format: "%Y-%m-%dT%H:%M:%S %Z", + expected: time.Date(2023, 5, 26, 12, 34, 56, 0, time.FixedZone("GMT", 0)), + }, + { + name: "RFC 3339 in custom format", + time: &ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "2012-11-01T22:08:41+0000 EST", nil + }, + }, + format: "%Y-%m-%dT%H:%M:%S%z %Z", + expected: time.Date(2012, 11, 0o1, 22, 8, 41, 0, time.FixedZone("EST", 0)), + }, + { + name: "RFC 3339 in custom format before 2000", + time: &ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "1986-10-01T00:17:33 MST", nil + }, + }, + format: "%Y-%m-%dT%H:%M:%S %Z", + expected: time.Date(1986, 10, 0o1, 0o0, 17, 33, 0o0, time.FixedZone("MST", -7*60*60)), + }, + { + name: "no location", + time: &ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "2022/01/01", nil + }, + }, + format: "%Y/%m/%d", + expected: time.Date(2022, 0o1, 0o1, 0, 0, 0, 0, time.Local), + }, + { + name: "with location - America", + time: &ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "2023-05-26 12:34:56", nil + }, + }, + format: "%Y-%m-%d %H:%M:%S", + location: "America/New_York", + expected: time.Date(2023, 5, 26, 12, 34, 56, 0, locationAmericaNewYork), + }, + { + name: "with location - Asia", + time: &ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "2023-05-26 12:34:56", nil + }, + }, + format: "%Y-%m-%d %H:%M:%S", + location: "Asia/Shanghai", + expected: time.Date(2023, 5, 26, 12, 34, 56, 0, locationAsiaShanghai), + }, + { + name: "RFC 3339 in custom format before 2000, ignore default location", + time: &ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "1986-10-01T00:17:33 MST", nil + }, + }, + location: "Asia/Shanghai", + format: "%Y-%m-%dT%H:%M:%S %Z", + expected: time.Date(1986, 10, 0o1, 0o0, 17, 33, 0o0, time.FixedZone("MST", -7*60*60)), + }, + } + for _, tt := range tests { + var locOptional ottl.Optional[string] + if tt.location != "" { + locOptional = ottl.NewTestingOptional(tt.location) + } + exprFunc, err := Time(tt.time, tt.format, locOptional, ottl.Optional[string]{}) + assert.NoError(t, err) + + t.Run(tt.name, func(t *testing.B) { + result, err := exprFunc(nil, nil) + assert.NoError(t, err) + assert.Equal(t, tt.expected.UnixNano(), result.(time.Time).UnixNano()) + }) + } +} diff --git a/pkg/ottl/ottlfuncs/func_to_key_value_string.go b/pkg/ottl/ottlfuncs/func_to_key_value_string.go new file mode 100644 index 000000000000..366899115ef3 --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_to_key_value_string.go @@ -0,0 +1,121 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs" + +import ( + "context" + "fmt" + gosort "sort" + "strings" + + "go.opentelemetry.io/collector/pdata/pcommon" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +type ToKeyValueStringArguments[K any] struct { + Target ottl.PMapGetter[K] + Delimiter ottl.Optional[string] + PairDelimiter ottl.Optional[string] + SortOutput ottl.Optional[bool] +} + +func NewToKeyValueStringFactory[K any]() ottl.Factory[K] { + return ottl.NewFactory("ToKeyValueString", &ToKeyValueStringArguments[K]{}, createToKeyValueStringFunction[K]) +} + +func createToKeyValueStringFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { + args, ok := oArgs.(*ToKeyValueStringArguments[K]) + + if !ok { + return nil, fmt.Errorf("ToKeyValueStringFactory args must be of type *ToKeyValueStringArguments[K]") + } + + return toKeyValueString[K](args.Target, args.Delimiter, args.PairDelimiter, args.SortOutput) +} + +func toKeyValueString[K any](target ottl.PMapGetter[K], d ottl.Optional[string], p ottl.Optional[string], s ottl.Optional[bool]) (ottl.ExprFunc[K], error) { + delimiter := "=" + if !d.IsEmpty() { + if d.Get() == "" { + return nil, fmt.Errorf("delimiter cannot be set to an empty string") + } + delimiter = d.Get() + } + + pairDelimiter := " " + if !p.IsEmpty() { + if p.Get() == "" { + return nil, fmt.Errorf("pair delimiter cannot be set to an empty string") + } + pairDelimiter = p.Get() + } + + if pairDelimiter == delimiter { + return nil, fmt.Errorf("pair delimiter %q cannot be equal to delimiter %q", pairDelimiter, delimiter) + } + + sortOutput := false + if !s.IsEmpty() { + sortOutput = s.Get() + } + + return func(ctx context.Context, tCtx K) (any, error) { + source, err := target.Get(ctx, tCtx) + if err != nil { + return nil, err + } + + return convertMapToKV(source, delimiter, pairDelimiter, sortOutput), nil + }, nil +} + +// convertMapToKV converts a pcommon.Map to a key value string +func convertMapToKV(target pcommon.Map, delimiter string, pairDelimiter string, sortOutput bool) string { + var kvStrings []string + if sortOutput { + var keyValues []struct { + key string + val pcommon.Value + } + + // Sort by keys + target.Range(func(k string, v pcommon.Value) bool { + keyValues = append(keyValues, struct { + key string + val pcommon.Value + }{key: k, val: v}) + return true + }) + gosort.Slice(keyValues, func(i, j int) bool { + return keyValues[i].key < keyValues[j].key + }) + + // Convert KV pairs + for _, kv := range keyValues { + kvStrings = append(kvStrings, buildKVString(kv.key, kv.val, delimiter, pairDelimiter)) + } + } else { + target.Range(func(k string, v pcommon.Value) bool { + kvStrings = append(kvStrings, buildKVString(k, v, delimiter, pairDelimiter)) + return true + }) + } + + return strings.Join(kvStrings, pairDelimiter) +} + +func buildKVString(k string, v pcommon.Value, delimiter string, pairDelimiter string) string { + key := escapeAndQuoteKV(k, delimiter, pairDelimiter) + value := escapeAndQuoteKV(v.AsString(), delimiter, pairDelimiter) + return key + delimiter + value +} + +func escapeAndQuoteKV(s string, delimiter string, pairDelimiter string) string { + s = strings.ReplaceAll(s, `"`, `\"`) + if strings.Contains(s, pairDelimiter) || strings.Contains(s, delimiter) { + s = `"` + s + `"` + } + return s +} diff --git a/pkg/ottl/ottlfuncs/func_to_key_value_string_test.go b/pkg/ottl/ottlfuncs/func_to_key_value_string_test.go new file mode 100644 index 000000000000..981c8c8ceb8d --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_to_key_value_string_test.go @@ -0,0 +1,249 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +func Test_toKeyValueString(t *testing.T) { + tests := []struct { + name string + target ottl.PMapGetter[any] + delimiter ottl.Optional[string] + pairDelimiter ottl.Optional[string] + expected string + }{ + { + name: "default delimiters with no nesting", + target: ottl.StandardPMapGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return map[string]any{ + "key1": "value1", + "key2": "value2", + }, nil + }, + }, + delimiter: ottl.Optional[string]{}, + pairDelimiter: ottl.Optional[string]{}, + expected: `key1=value1 key2=value2`, + }, + { + name: "custom delimiter with no nesting", + target: ottl.StandardPMapGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return map[string]any{ + "key1": "value1", + "key2": "value2", + }, nil + }, + }, + delimiter: ottl.NewTestingOptional[string](":"), + pairDelimiter: ottl.Optional[string]{}, + expected: `key1:value1 key2:value2`, + }, + { + name: "custom pair delimiter with no nesting", + target: ottl.StandardPMapGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return map[string]any{ + "key1": "value1", + "key2": "value2", + }, nil + }, + }, + delimiter: ottl.Optional[string]{}, + pairDelimiter: ottl.NewTestingOptional[string](","), + expected: `key1=value1,key2=value2`, + }, + { + name: "delimiters present in keys and values", + target: ottl.StandardPMapGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return map[string]any{ + "key 1": "value 1", + "key2=": "value2=", + }, nil + }, + }, + delimiter: ottl.Optional[string]{}, + pairDelimiter: ottl.Optional[string]{}, + expected: `"key 1"="value 1" "key2="="value2="`, + }, + { + name: "long delimiters present in keys and values", + target: ottl.StandardPMapGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return map[string]any{ + "key1": "value1", + "key2,,,": "value2,,,,,,", + }, nil + }, + }, + delimiter: ottl.NewTestingOptional[string](",,,"), + pairDelimiter: ottl.Optional[string]{}, + expected: `key1,,,value1 "key2,,,",,,"value2,,,,,,"`, + }, + { + name: "delimiters and quotes present in keys and values", + target: ottl.StandardPMapGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return map[string]any{ + "key 1": "value 1", + "key2\"=": "value2\"=", + "key\"3": "value\"3", + }, nil + }, + }, + delimiter: ottl.Optional[string]{}, + pairDelimiter: ottl.Optional[string]{}, + expected: `"key 1"="value 1" key\"3=value\"3 "key2\"="="value2\"="`, + }, + { + name: "nested", + target: ottl.StandardPMapGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return map[string]any{ + "key1": "value1", + "key2": map[string]any{ + "key3": "value3", + "key4": map[string]any{ + "key5": "value5", + "key6": []any{"value6a", "value6b"}, + }, + }, + "key7": []any{"value7", []any{"value8a", map[string]any{"key8b": "value8b"}}}, + }, nil + }, + }, + delimiter: ottl.Optional[string]{}, + pairDelimiter: ottl.Optional[string]{}, + expected: `key1=value1 key2={\"key3\":\"value3\",\"key4\":{\"key5\":\"value5\",\"key6\":[\"value6a\",\"value6b\"]}} key7=[\"value7\",[\"value8a\",{\"key8b\":\"value8b\"}]]`, + }, + { + name: "nested with delimiter present", + target: ottl.StandardPMapGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return map[string]any{ + "key1": "value1", + "key2": map[string]any{ + "key3": "value3", + "key4": map[string]any{ + "key5": "value=5", + "key6": []any{"value6a", "value6b"}, + }, + }, + "key7": []any{"value7", []any{"value8a", map[string]any{"key 8b": "value8b"}}}, + }, nil + }, + }, + delimiter: ottl.Optional[string]{}, + pairDelimiter: ottl.Optional[string]{}, + expected: `key1=value1 key2="{\"key3\":\"value3\",\"key4\":{\"key5\":\"value=5\",\"key6\":[\"value6a\",\"value6b\"]}}" key7="[\"value7\",[\"value8a\",{\"key 8b\":\"value8b\"}]]"`, + }, + { + name: "nested with delimiter and quotes present", + target: ottl.StandardPMapGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return map[string]any{ + "key1": "value1\"", + "key2": map[string]any{ + "key3": "value3", + "key4": map[string]any{ + "key5": "value=5\"", + "key6": []any{"value6a", "value6b"}, + }, + }, + "key7": []any{"value7", []any{"value8a", map[string]any{"key 8b\"": "value8b"}}}, + }, nil + }, + }, + delimiter: ottl.Optional[string]{}, + pairDelimiter: ottl.Optional[string]{}, + expected: `key1=value1\" key2="{\"key3\":\"value3\",\"key4\":{\"key5\":\"value=5\\"\",\"key6\":[\"value6a\",\"value6b\"]}}" key7="[\"value7\",[\"value8a\",{\"key 8b\\"\":\"value8b\"}]]"`, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + exprFunc, err := toKeyValueString[any](tt.target, tt.delimiter, tt.pairDelimiter, ottl.NewTestingOptional[bool](true)) + assert.NoError(t, err) + + result, err := exprFunc(context.Background(), nil) + assert.NoError(t, err) + + actual, ok := result.(string) + assert.True(t, ok) + + assert.Equal(t, tt.expected, actual) + }) + } +} + +func Test_toKeyValueString_equal_delimiters(t *testing.T) { + target := ottl.StandardPMapGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return map[string]any{ + "key1": "value1", + "key2": "value2", + }, nil + }, + } + delimiter := ottl.NewTestingOptional[string]("=") + pairDelimiter := ottl.NewTestingOptional[string]("=") + _, err := toKeyValueString[any](target, delimiter, pairDelimiter, ottl.NewTestingOptional[bool](false)) + assert.Error(t, err) + + delimiter = ottl.NewTestingOptional[string](" ") + _, err = toKeyValueString[any](target, delimiter, ottl.Optional[string]{}, ottl.NewTestingOptional[bool](false)) + assert.Error(t, err) +} + +func Test_toKeyValueString_bad_target(t *testing.T) { + target := ottl.StandardPMapGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return 1, nil + }, + } + delimiter := ottl.NewTestingOptional[string]("=") + pairDelimiter := ottl.NewTestingOptional[string]("!") + exprFunc, err := toKeyValueString[any](target, delimiter, pairDelimiter, ottl.NewTestingOptional[bool](false)) + assert.NoError(t, err) + _, err = exprFunc(context.Background(), nil) + assert.Error(t, err) +} + +func Test_toKeyValueString_empty_target(t *testing.T) { + target := ottl.StandardPMapGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "", nil + }, + } + delimiter := ottl.NewTestingOptional[string]("=") + pairDelimiter := ottl.NewTestingOptional[string]("!") + exprFunc, err := toKeyValueString[any](target, delimiter, pairDelimiter, ottl.NewTestingOptional[bool](false)) + assert.NoError(t, err) + _, err = exprFunc(context.Background(), nil) + assert.Error(t, err) +} + +func Test_toKeyValueString_empty_delimiters(t *testing.T) { + target := ottl.StandardPMapGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return "a=b c=d", nil + }, + } + delimiter := ottl.NewTestingOptional[string]("") + + _, err := toKeyValueString[any](target, delimiter, ottl.Optional[string]{}, ottl.NewTestingOptional[bool](false)) + assert.ErrorContains(t, err, "delimiter cannot be set to an empty string") + + _, err = toKeyValueString[any](target, ottl.Optional[string]{}, delimiter, ottl.NewTestingOptional[bool](false)) + assert.ErrorContains(t, err, "pair delimiter cannot be set to an empty string") +} diff --git a/pkg/ottl/ottlfuncs/func_truncate_time.go b/pkg/ottl/ottlfuncs/func_truncate_time.go index 3d122dfb8740..167053538130 100644 --- a/pkg/ottl/ottlfuncs/func_truncate_time.go +++ b/pkg/ottl/ottlfuncs/func_truncate_time.go @@ -18,6 +18,7 @@ type TruncateTimeArguments[K any] struct { func NewTruncateTimeFactory[K any]() ottl.Factory[K] { return ottl.NewFactory("TruncateTime", &TruncateTimeArguments[K]{}, createTruncateTimeFunction[K]) } + func createTruncateTimeFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { args, ok := oArgs.(*TruncateTimeArguments[K]) diff --git a/pkg/ottl/ottlfuncs/func_unix.go b/pkg/ottl/ottlfuncs/func_unix.go index 06de04b413ba..47c5065ff0e4 100644 --- a/pkg/ottl/ottlfuncs/func_unix.go +++ b/pkg/ottl/ottlfuncs/func_unix.go @@ -19,6 +19,7 @@ type UnixArguments[K any] struct { func NewUnixFactory[K any]() ottl.Factory[K] { return ottl.NewFactory("Unix", &UnixArguments[K]{}, createUnixFunction[K]) } + func createUnixFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { args, ok := oArgs.(*UnixArguments[K]) diff --git a/pkg/ottl/ottlfuncs/func_unix_micro.go b/pkg/ottl/ottlfuncs/func_unix_micro.go index d55f717c7509..939941b12fe6 100644 --- a/pkg/ottl/ottlfuncs/func_unix_micro.go +++ b/pkg/ottl/ottlfuncs/func_unix_micro.go @@ -17,6 +17,7 @@ type UnixMicroArguments[K any] struct { func NewUnixMicroFactory[K any]() ottl.Factory[K] { return ottl.NewFactory("UnixMicro", &UnixMicroArguments[K]{}, createUnixMicroFunction[K]) } + func createUnixMicroFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { args, ok := oArgs.(*UnixMicroArguments[K]) diff --git a/pkg/ottl/ottlfuncs/func_unix_milli.go b/pkg/ottl/ottlfuncs/func_unix_milli.go index 8f5e587c73b6..7aabfedb47a1 100644 --- a/pkg/ottl/ottlfuncs/func_unix_milli.go +++ b/pkg/ottl/ottlfuncs/func_unix_milli.go @@ -17,6 +17,7 @@ type UnixMilliArguments[K any] struct { func NewUnixMilliFactory[K any]() ottl.Factory[K] { return ottl.NewFactory("UnixMilli", &UnixMilliArguments[K]{}, createUnixMilliFunction[K]) } + func createUnixMilliFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { args, ok := oArgs.(*UnixMilliArguments[K]) diff --git a/pkg/ottl/ottlfuncs/func_unix_nano.go b/pkg/ottl/ottlfuncs/func_unix_nano.go index 4c027d855fcb..5ba82f5d607b 100644 --- a/pkg/ottl/ottlfuncs/func_unix_nano.go +++ b/pkg/ottl/ottlfuncs/func_unix_nano.go @@ -17,6 +17,7 @@ type UnixNanoArguments[K any] struct { func NewUnixNanoFactory[K any]() ottl.Factory[K] { return ottl.NewFactory("UnixNano", &UnixNanoArguments[K]{}, createUnixNanoFunction[K]) } + func createUnixNanoFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { args, ok := oArgs.(*UnixNanoArguments[K]) diff --git a/pkg/ottl/ottlfuncs/func_unix_seconds.go b/pkg/ottl/ottlfuncs/func_unix_seconds.go index 612a87f8c50c..55b7f0f130e4 100644 --- a/pkg/ottl/ottlfuncs/func_unix_seconds.go +++ b/pkg/ottl/ottlfuncs/func_unix_seconds.go @@ -17,6 +17,7 @@ type UnixSecondsArguments[K any] struct { func NewUnixSecondsFactory[K any]() ottl.Factory[K] { return ottl.NewFactory("UnixSeconds", &UnixSecondsArguments[K]{}, createUnixSecondsFunction[K]) } + func createUnixSecondsFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { args, ok := oArgs.(*UnixSecondsArguments[K]) diff --git a/pkg/ottl/ottlfuncs/func_url.go b/pkg/ottl/ottlfuncs/func_url.go new file mode 100644 index 000000000000..371576bb0249 --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_url.go @@ -0,0 +1,44 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs" + +import ( + "context" + "fmt" + + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/parseutils" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +type URLArguments[K any] struct { + URI ottl.StringGetter[K] +} + +func NewURLFactory[K any]() ottl.Factory[K] { + return ottl.NewFactory("URL", &URLArguments[K]{}, createURIFunction[K]) +} + +func createURIFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { + args, ok := oArgs.(*URLArguments[K]) + if !ok { + return nil, fmt.Errorf("URLFactory args must be of type *URLArguments[K]") + } + + return url(args.URI), nil //revive:disable-line:var-naming +} + +func url[K any](uriSource ottl.StringGetter[K]) ottl.ExprFunc[K] { //revive:disable-line:var-naming + return func(ctx context.Context, tCtx K) (any, error) { + urlString, err := uriSource.Get(ctx, tCtx) + if err != nil { + return nil, err + } + + if urlString == "" { + return nil, fmt.Errorf("url cannot be empty") + } + + return parseutils.ParseURI(urlString, true) + } +} diff --git a/pkg/ottl/ottlfuncs/func_url_test.go b/pkg/ottl/ottlfuncs/func_url_test.go new file mode 100644 index 000000000000..5990a3693ba4 --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_url_test.go @@ -0,0 +1,178 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + semconv "go.opentelemetry.io/collector/semconv/v1.25.0" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +const ( + // replace once conventions includes these + AttributeURLUserInfo = "url.user_info" + AttributeURLUsername = "url.username" + AttributeURLPassword = "url.password" +) + +func TestURLParser(t *testing.T) { + testCases := []struct { + Name string + Original string + ExpectedMap map[string]any + }{ + { + "complete example", + "http://myusername:mypassword@www.example.com:80/foo.gif?key1=val1&key2=val2#fragment", + map[string]any{ + semconv.AttributeURLPath: "/foo.gif", + semconv.AttributeURLFragment: "fragment", + semconv.AttributeURLExtension: "gif", + AttributeURLPassword: "mypassword", + semconv.AttributeURLOriginal: "http://myusername:mypassword@www.example.com:80/foo.gif?key1=val1&key2=val2#fragment", + semconv.AttributeURLScheme: "http", + semconv.AttributeURLPort: 80, + AttributeURLUserInfo: "myusername:mypassword", + semconv.AttributeURLDomain: "www.example.com", + semconv.AttributeURLQuery: "key1=val1&key2=val2", + AttributeURLUsername: "myusername", + }, + }, + { + "simple example", + "http://www.example.com", + map[string]any{ + semconv.AttributeURLOriginal: "http://www.example.com", + semconv.AttributeURLScheme: "http", + semconv.AttributeURLDomain: "www.example.com", + semconv.AttributeURLPath: "", + }, + }, + { + "custom port", + "http://www.example.com:77", + map[string]any{ + semconv.AttributeURLOriginal: "http://www.example.com:77", + semconv.AttributeURLScheme: "http", + semconv.AttributeURLDomain: "www.example.com", + semconv.AttributeURLPath: "", + semconv.AttributeURLPort: 77, + }, + }, + { + "file", + "http://www.example.com:77/file.png", + map[string]any{ + semconv.AttributeURLOriginal: "http://www.example.com:77/file.png", + semconv.AttributeURLScheme: "http", + semconv.AttributeURLDomain: "www.example.com", + semconv.AttributeURLPath: "/file.png", + semconv.AttributeURLPort: 77, + semconv.AttributeURLExtension: "png", + }, + }, + { + "fragment", + "http://www.example.com:77/foo#bar", + map[string]any{ + semconv.AttributeURLOriginal: "http://www.example.com:77/foo#bar", + semconv.AttributeURLScheme: "http", + semconv.AttributeURLDomain: "www.example.com", + semconv.AttributeURLPath: "/foo", + semconv.AttributeURLPort: 77, + semconv.AttributeURLFragment: "bar", + }, + }, + { + "query example", + "https://www.example.com:77/foo?key=val", + map[string]any{ + semconv.AttributeURLOriginal: "https://www.example.com:77/foo?key=val", + semconv.AttributeURLScheme: "https", + semconv.AttributeURLDomain: "www.example.com", + semconv.AttributeURLPath: "/foo", + semconv.AttributeURLPort: 77, + semconv.AttributeURLQuery: "key=val", + }, + }, + { + "user info", + "https://user:pw@www.example.com:77/foo", + map[string]any{ + semconv.AttributeURLOriginal: "https://user:pw@www.example.com:77/foo", + semconv.AttributeURLScheme: "https", + semconv.AttributeURLDomain: "www.example.com", + semconv.AttributeURLPath: "/foo", + semconv.AttributeURLPort: 77, + AttributeURLUserInfo: "user:pw", + AttributeURLUsername: "user", + AttributeURLPassword: "pw", + }, + }, + { + "user info - no password", + "https://user:@www.example.com:77/foo", + map[string]any{ + semconv.AttributeURLOriginal: "https://user:@www.example.com:77/foo", + semconv.AttributeURLScheme: "https", + semconv.AttributeURLDomain: "www.example.com", + semconv.AttributeURLPath: "/foo", + semconv.AttributeURLPort: 77, + AttributeURLUserInfo: "user:", + AttributeURLUsername: "user", + AttributeURLPassword: "", + }, + }, + { + "non-http scheme: ftp", + "ftp://ftp.is.co.za/rfc/rfc1808.txt", + map[string]any{ + semconv.AttributeURLOriginal: "ftp://ftp.is.co.za/rfc/rfc1808.txt", + semconv.AttributeURLScheme: "ftp", + semconv.AttributeURLPath: "/rfc/rfc1808.txt", + semconv.AttributeURLExtension: "txt", + semconv.AttributeURLDomain: "ftp.is.co.za", + }, + }, + { + "non-http scheme: telnet", + "telnet://192.0.2.16:80/", + map[string]any{ + semconv.AttributeURLOriginal: "telnet://192.0.2.16:80/", + semconv.AttributeURLScheme: "telnet", + semconv.AttributeURLPath: "/", + semconv.AttributeURLPort: 80, + semconv.AttributeURLDomain: "192.0.2.16", + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.Name, func(t *testing.T) { + source := &ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return tc.Original, nil + }, + } + + exprFunc := url(source) //revive:disable-line:var-naming + res, err := exprFunc(context.Background(), nil) + require.NoError(t, err) + + resMap, ok := res.(map[string]any) + require.True(t, ok) + + require.Equal(t, len(tc.ExpectedMap), len(resMap)) + for k, v := range tc.ExpectedMap { + actualValue, found := resMap[k] + require.True(t, found, "key not found %q", k) + require.Equal(t, v, actualValue) + } + }) + } +} diff --git a/pkg/ottl/ottlfuncs/func_useragent.go b/pkg/ottl/ottlfuncs/func_useragent.go new file mode 100644 index 000000000000..0ba1d1d9f346 --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_useragent.go @@ -0,0 +1,47 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs" +import ( + "context" + "fmt" + + "github.com/ua-parser/uap-go/uaparser" + semconv "go.opentelemetry.io/collector/semconv/v1.25.0" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +type UserAgentArguments[K any] struct { + UserAgent ottl.StringGetter[K] +} + +func NewUserAgentFactory[K any]() ottl.Factory[K] { + return ottl.NewFactory("UserAgent", &UserAgentArguments[K]{}, createUserAgentFunction[K]) +} + +func createUserAgentFunction[K any](_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[K], error) { + args, ok := oArgs.(*UserAgentArguments[K]) + if !ok { + return nil, fmt.Errorf("URLFactory args must be of type *URLArguments[K]") + } + + return userAgent[K](args.UserAgent), nil +} + +func userAgent[K any](userAgentSource ottl.StringGetter[K]) ottl.ExprFunc[K] { //revive:disable-line:var-naming + parser := uaparser.NewFromSaved() + + return func(ctx context.Context, tCtx K) (any, error) { + userAgentString, err := userAgentSource.Get(ctx, tCtx) + if err != nil { + return nil, err + } + parsedUserAgent := parser.ParseUserAgent(userAgentString) + return map[string]any{ + semconv.AttributeUserAgentName: parsedUserAgent.Family, + semconv.AttributeUserAgentOriginal: userAgentString, + semconv.AttributeUserAgentVersion: parsedUserAgent.ToVersionString(), + }, nil + } +} diff --git a/pkg/ottl/ottlfuncs/func_useragent_test.go b/pkg/ottl/ottlfuncs/func_useragent_test.go new file mode 100644 index 000000000000..f5ce22b7a07a --- /dev/null +++ b/pkg/ottl/ottlfuncs/func_useragent_test.go @@ -0,0 +1,118 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottlfuncs // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs" +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + semconv "go.opentelemetry.io/collector/semconv/v1.25.0" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" +) + +func TestUserAgentParser(t *testing.T) { + testCases := []struct { + Name string + UAString string + ExpectedMap map[string]any + }{ + { + Name: "Firefox", + UAString: "Mozilla/5.0 (X11; Linux x86_64; rv:126.0) Gecko/20100101 Firefox/126.0", + ExpectedMap: map[string]any{ + semconv.AttributeUserAgentOriginal: "Mozilla/5.0 (X11; Linux x86_64; rv:126.0) Gecko/20100101 Firefox/126.0", + semconv.AttributeUserAgentName: "Firefox", + semconv.AttributeUserAgentVersion: "126.0", + }, + }, + { + Name: "Chrome", + UAString: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36", + ExpectedMap: map[string]any{ + semconv.AttributeUserAgentOriginal: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36", + semconv.AttributeUserAgentName: "Chrome", + semconv.AttributeUserAgentVersion: "51.0.2704", + }, + }, + { + Name: "Mobile Safari", + UAString: "Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Mobile/15E148 Safari/604.1", + ExpectedMap: map[string]any{ + semconv.AttributeUserAgentOriginal: "Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Mobile/15E148 Safari/604.1", + semconv.AttributeUserAgentName: "Mobile Safari", + semconv.AttributeUserAgentVersion: "13.1.1", + }, + }, + { + Name: "Edge", + UAString: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.59", + ExpectedMap: map[string]any{ + semconv.AttributeUserAgentOriginal: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.59", + semconv.AttributeUserAgentName: "Edge", + semconv.AttributeUserAgentVersion: "91.0.864", + }, + }, + { + Name: "Opera", + UAString: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36 OPR/38.0.2220.41", + ExpectedMap: map[string]any{ + semconv.AttributeUserAgentOriginal: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36 OPR/38.0.2220.41", + semconv.AttributeUserAgentName: "Opera", + semconv.AttributeUserAgentVersion: "38.0.2220", + }, + }, + { + Name: "curl", + UAString: "curl/7.81.0", + ExpectedMap: map[string]any{ + semconv.AttributeUserAgentOriginal: "curl/7.81.0", + semconv.AttributeUserAgentName: "curl", + semconv.AttributeUserAgentVersion: "7.81.0", + }, + }, + { + Name: "Unknown user agent", + UAString: "foobar/1.2.3 (foo; bar baz)", + ExpectedMap: map[string]any{ + semconv.AttributeUserAgentOriginal: "foobar/1.2.3 (foo; bar baz)", + semconv.AttributeUserAgentName: "Other", + semconv.AttributeUserAgentVersion: "", + }, + }, + { + Name: "Otel collector 0.106.1 linux/amd64 user agent", + UAString: "OpenTelemetry Collector Contrib/0.106.1 (linux/amd64)", + ExpectedMap: map[string]any{ + semconv.AttributeUserAgentOriginal: "OpenTelemetry Collector Contrib/0.106.1 (linux/amd64)", + semconv.AttributeUserAgentName: "Other", + semconv.AttributeUserAgentVersion: "", + }, + }, + } + + for _, tt := range testCases { + t.Run(tt.Name, func(t *testing.T) { + source := &ottl.StandardStringGetter[any]{ + Getter: func(_ context.Context, _ any) (any, error) { + return tt.UAString, nil + }, + } + + exprFunc := userAgent[any](source) //revive:disable-line:var-naming + res, err := exprFunc(context.Background(), nil) + require.NoError(t, err) + require.IsType(t, map[string]any{}, res) + resMap := res.(map[string]any) + assert.Equal(t, tt.ExpectedMap, resMap) + assert.Len(t, resMap, len(tt.ExpectedMap)) + for k, v := range tt.ExpectedMap { + if assert.Containsf(t, resMap, k, "key not found %q", k) { + assert.Equal(t, v, resMap[k]) + } + } + }) + } +} diff --git a/pkg/ottl/ottlfuncs/functions.go b/pkg/ottl/ottlfuncs/functions.go index c67f68952ce1..6fae06eb6b01 100644 --- a/pkg/ottl/ottlfuncs/functions.go +++ b/pkg/ottl/ottlfuncs/functions.go @@ -12,6 +12,7 @@ func StandardFuncs[K any]() map[string]ottl.Factory[K] { // Editors NewDeleteKeyFactory[K](), NewDeleteMatchingKeysFactory[K](), + NewKeepMatchingKeysFactory[K](), NewFlattenFactory[K](), NewKeepKeysFactory[K](), NewLimitFactory[K](), @@ -36,15 +37,21 @@ func converters[K any]() []ottl.Factory[K] { return []ottl.Factory[K]{ // Converters NewBase64DecodeFactory[K](), + NewDecodeFactory[K](), NewConcatFactory[K](), NewConvertCaseFactory[K](), + NewConvertAttributesToElementsXMLFactory[K](), + NewConvertTextToElementsXMLFactory[K](), NewDayFactory[K](), NewDoubleFactory[K](), NewDurationFactory[K](), NewExtractPatternsFactory[K](), + NewExtractGrokPatternsFactory[K](), NewFnvFactory[K](), + NewGetXMLFactory[K](), NewHourFactory[K](), NewHoursFactory[K](), + NewInsertXMLFactory[K](), NewIntFactory[K](), NewIsBoolFactory[K](), NewIsDoubleFactory[K](), @@ -55,6 +62,7 @@ func converters[K any]() []ottl.Factory[K] { NewIsStringFactory[K](), NewLenFactory[K](), NewLogFactory[K](), + NewMD5Factory[K](), NewMicrosecondsFactory[K](), NewMillisecondsFactory[K](), NewMinuteFactory[K](), @@ -65,15 +73,21 @@ func converters[K any]() []ottl.Factory[K] { NewParseCSVFactory[K](), NewParseJSONFactory[K](), NewParseKeyValueFactory[K](), + NewParseSimplifiedXMLFactory[K](), NewParseXMLFactory[K](), + NewRemoveXMLFactory[K](), NewSecondsFactory[K](), NewSHA1Factory[K](), NewSHA256Factory[K](), + NewSHA512Factory[K](), + NewSortFactory[K](), NewSpanIDFactory[K](), NewSplitFactory[K](), + NewFormatFactory[K](), NewStringFactory[K](), NewSubstringFactory[K](), NewTimeFactory[K](), + NewToKeyValueStringFactory[K](), NewTruncateTimeFactory[K](), NewTraceIDFactory[K](), NewUnixFactory[K](), @@ -82,6 +96,11 @@ func converters[K any]() []ottl.Factory[K] { NewUnixNanoFactory[K](), NewUnixSecondsFactory[K](), NewUUIDFactory[K](), + NewURLFactory[K](), + NewUserAgentFactory[K](), + NewAppendFactory[K](), NewYearFactory[K](), + NewHexFactory[K](), + NewSliceToMapFactory[K](), } } diff --git a/pkg/ottl/parser.go b/pkg/ottl/parser.go index f5b0bf632bed..fade87d2982d 100644 --- a/pkg/ottl/parser.go +++ b/pkg/ottl/parser.go @@ -7,6 +7,8 @@ import ( "context" "errors" "fmt" + "sort" + "strings" "github.com/alecthomas/participle/v2" "go.opentelemetry.io/collector/component" @@ -16,9 +18,10 @@ import ( // Statement holds a top level Statement for processing telemetry data. A Statement is a combination of a function // invocation and the boolean expression to match telemetry for invoking the function. type Statement[K any] struct { - function Expr[K] - condition BoolExpr[K] - origText string + function Expr[K] + condition BoolExpr[K] + origText string + telemetrySettings component.TelemetrySettings } // Execute is a function that will execute the statement's function if the statement's condition is met. @@ -27,6 +30,11 @@ type Statement[K any] struct { // In addition, the functions return value is always returned. func (s *Statement[K]) Execute(ctx context.Context, tCtx K) (any, bool, error) { condition, err := s.condition.Eval(ctx, tCtx) + defer func() { + if s.telemetrySettings.Logger != nil { + s.telemetrySettings.Logger.Debug("TransformContext after statement execution", zap.String("statement", s.origText), zap.Bool("condition matched", condition), zap.Any("TransformContext", tCtx)) + } + }() if err != nil { return nil, false, err } @@ -58,6 +66,7 @@ type Parser[K any] struct { pathParser PathExpressionParser[K] enumParser EnumParser telemetrySettings component.TelemetrySettings + pathContextNames map[string]struct{} } func NewParser[K any]( @@ -91,6 +100,22 @@ func WithEnumParser[K any](parser EnumParser) Option[K] { } } +// WithPathContextNames sets the context names to be considered when parsing a Path value. +// When this option is empty or nil, all Path segments are considered fields, and the +// Path.Context value is always empty. +// When this option is configured, and the path's context is empty or is not present in +// this context names list, it results into an error. +func WithPathContextNames[K any](contexts []string) Option[K] { + return func(p *Parser[K]) { + pathContextNames := make(map[string]struct{}, len(contexts)) + for _, ctx := range contexts { + pathContextNames[ctx] = struct{}{} + } + + p.pathContextNames = pathContextNames + } +} + // ParseStatements parses string statements into ottl.Statement objects ready for execution. // Returns a slice of statements and a nil error on successful parsing. // If parsing fails, returns nil and a joined error containing each error per failed statement. @@ -131,9 +156,10 @@ func (p *Parser[K]) ParseStatement(statement string) (*Statement[K], error) { return nil, err } return &Statement[K]{ - function: function, - condition: expression, - origText: statement, + function: function, + condition: expression, + origText: statement, + telemetrySettings: p.telemetrySettings, }, nil } @@ -178,12 +204,40 @@ func (p *Parser[K]) ParseCondition(condition string) (*Condition[K], error) { }, nil } -var parser = newParser[parsedStatement]() -var conditionParser = newParser[booleanExpression]() +// prependContextToStatementPaths changes the given OTTL statement adding the context name prefix +// to all context-less paths. No modifications are performed for paths which [Path.Context] +// value matches any WithPathContextNames value. +// The context argument must be valid WithPathContextNames value, otherwise an error is returned. +func (p *Parser[K]) prependContextToStatementPaths(context string, statement string) (string, error) { + if _, ok := p.pathContextNames[context]; !ok { + return statement, fmt.Errorf(`unknown context "%s" for parser %T, valid options are: %s`, context, p, p.buildPathContextNamesText("")) + } + parsed, err := parseStatement(statement) + if err != nil { + return "", err + } + paths := getParsedStatementPaths(parsed) + if len(paths) == 0 { + return statement, nil + } + + var missingContextOffsets []int + for _, it := range paths { + if _, ok := p.pathContextNames[it.Context]; !ok { + missingContextOffsets = append(missingContextOffsets, it.Pos.Offset) + } + } + + return insertContextIntoStatementOffsets(context, statement, missingContextOffsets) +} + +var ( + parser = newParser[parsedStatement]() + conditionParser = newParser[booleanExpression]() +) func parseStatement(raw string) (*parsedStatement, error) { parsed, err := parser.ParseString("", raw) - if err != nil { return nil, fmt.Errorf("statement has invalid syntax: %w", err) } @@ -197,7 +251,6 @@ func parseStatement(raw string) (*parsedStatement, error) { func parseCondition(raw string) (*booleanExpression, error) { parsed, err := conditionParser.ParseString("", raw) - if err != nil { return nil, fmt.Errorf("condition has invalid syntax: %w", err) } @@ -209,6 +262,30 @@ func parseCondition(raw string) (*booleanExpression, error) { return parsed, nil } +func insertContextIntoStatementOffsets(context string, statement string, offsets []int) (string, error) { + if len(offsets) == 0 { + return statement, nil + } + + contextPrefix := context + "." + var sb strings.Builder + sb.Grow(len(statement) + (len(contextPrefix) * len(offsets))) + + sort.Ints(offsets) + left := 0 + for _, offset := range offsets { + if offset < 0 || offset > len(statement) { + return statement, fmt.Errorf(`failed to insert context "%s" into statement "%s": offset %d is out of range`, context, statement, offset) + } + sb.WriteString(statement[left:offset]) + sb.WriteString(contextPrefix) + left = offset + } + sb.WriteString(statement[left:]) + + return sb.String(), nil +} + // newParser returns a parser that can be used to read a string into a parsedStatement. An error will be returned if the string // is not formatted for the DSL. func newParser[G any]() *participle.Parser[G] { @@ -262,6 +339,7 @@ func NewStatementSequence[K any](statements []*Statement[K], telemetrySettings c // When the ErrorMode of the StatementSequence is `ignore`, errors are logged and execution continues to the next statement. // When the ErrorMode of the StatementSequence is `silent`, errors are not logged and execution continues to the next statement. func (s *StatementSequence[K]) Execute(ctx context.Context, tCtx K) error { + s.telemetrySettings.Logger.Debug("initial TransformContext before executing StatementSequence", zap.Any("TransformContext", tCtx)) for _, statement := range s.statements { _, _, err := statement.Execute(ctx, tCtx) if err != nil { @@ -333,6 +411,7 @@ func (c *ConditionSequence[K]) Eval(ctx context.Context, tCtx K) (bool, error) { var atLeastOneMatch bool for _, condition := range c.conditions { match, err := condition.Eval(ctx, tCtx) + c.telemetrySettings.Logger.Debug("condition evaluation result", zap.String("condition", condition.origText), zap.Bool("match", match), zap.Any("TransformContext", tCtx)) if err != nil { if c.errorMode == PropagateError { err = fmt.Errorf("failed to eval condition: %v, %w", condition.origText, err) diff --git a/pkg/ottl/parser_collection.go b/pkg/ottl/parser_collection.go new file mode 100644 index 000000000000..72d0d6abb3f0 --- /dev/null +++ b/pkg/ottl/parser_collection.go @@ -0,0 +1,334 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottl // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" + +import ( + "fmt" + "reflect" + + "go.opentelemetry.io/collector/component" + "go.uber.org/zap" +) + +// Safeguard to statically ensure the Parser.ParseStatements method can be reflectively +// invoked by the ottlParserWrapper.parseStatements +var _ interface { + ParseStatements(statements []string) ([]*Statement[any], error) +} = (*Parser[any])(nil) + +// Safeguard to statically ensure any ParsedStatementConverter method can be reflectively +// invoked by the statementsConverterWrapper.call +var _ ParsedStatementConverter[any, any] = func( + _ *ParserCollection[any], + _ *Parser[any], + _ string, + _ StatementsGetter, + _ []*Statement[any], +) (any, error) { + return nil, nil +} + +// StatementsGetter represents a set of statements to be parsed. +// +// Experimental: *NOTE* this API is subject to change or removal in the future. +type StatementsGetter interface { + // GetStatements retrieves the OTTL statements to be parsed + GetStatements() []string +} + +type defaultStatementsGetter []string + +func (d defaultStatementsGetter) GetStatements() []string { + return d +} + +// NewStatementsGetter creates a new StatementsGetter. +// +// Experimental: *NOTE* this API is subject to change or removal in the future. +func NewStatementsGetter(statements []string) StatementsGetter { + return defaultStatementsGetter(statements) +} + +// ottlParserWrapper wraps an ottl.Parser using reflection, so it can invoke exported +// methods without knowing its generic type (transform context). +type ottlParserWrapper struct { + parser reflect.Value + prependContextToStatementPaths func(context string, statement string) (string, error) +} + +func newParserWrapper[K any](parser *Parser[K]) *ottlParserWrapper { + return &ottlParserWrapper{ + parser: reflect.ValueOf(parser), + prependContextToStatementPaths: parser.prependContextToStatementPaths, + } +} + +func (g *ottlParserWrapper) parseStatements(statements []string) (reflect.Value, error) { + method := g.parser.MethodByName("ParseStatements") + parseStatementsRes := method.Call([]reflect.Value{reflect.ValueOf(statements)}) + err := parseStatementsRes[1] + if !err.IsNil() { + return reflect.Value{}, err.Interface().(error) + } + return parseStatementsRes[0], nil +} + +func (g *ottlParserWrapper) prependContextToStatementsPaths(context string, statements []string) ([]string, error) { + result := make([]string, 0, len(statements)) + for _, s := range statements { + prependedStatement, err := g.prependContextToStatementPaths(context, s) + if err != nil { + return nil, err + } + result = append(result, prependedStatement) + } + return result, nil +} + +// statementsConverterWrapper is a reflection-based wrapper to the ParsedStatementConverter function, +// which does not require knowing all generic parameters to be called. +type statementsConverterWrapper reflect.Value + +func newStatementsConverterWrapper[K any, R any](converter ParsedStatementConverter[K, R]) statementsConverterWrapper { + return statementsConverterWrapper(reflect.ValueOf(converter)) +} + +func (s statementsConverterWrapper) call( + parserCollection reflect.Value, + ottlParser *ottlParserWrapper, + context string, + statements StatementsGetter, + parsedStatements reflect.Value, +) (reflect.Value, error) { + result := reflect.Value(s).Call([]reflect.Value{ + parserCollection, + ottlParser.parser, + reflect.ValueOf(context), + reflect.ValueOf(statements), + parsedStatements, + }) + + resultValue := result[0] + resultError := result[1] + if !resultError.IsNil() { + return reflect.Value{}, resultError.Interface().(error) + } + + return resultValue, nil +} + +// parserCollectionParser holds an ottlParserWrapper and its respectively +// statementsConverter function. +type parserCollectionParser struct { + ottlParser *ottlParserWrapper + statementsConverter statementsConverterWrapper +} + +// ParserCollection is a configurable set of ottl.Parser that can handle multiple OTTL contexts +// parsings, inferring the context, choosing the right parser for the given statements, and +// transforming the parsed ottl.Statement[K] slice into a common result of type R. +// +// Experimental: *NOTE* this API is subject to change or removal in the future. +type ParserCollection[R any] struct { + contextParsers map[string]*parserCollectionParser + contextInferrer contextInferrer + modifiedStatementLogging bool + Settings component.TelemetrySettings + ErrorMode ErrorMode +} + +// ParserCollectionOption is a configurable ParserCollection option. +// +// Experimental: *NOTE* this API is subject to change or removal in the future. +type ParserCollectionOption[R any] func(*ParserCollection[R]) error + +// NewParserCollection creates a new ParserCollection. +// +// Experimental: *NOTE* this API is subject to change or removal in the future. +func NewParserCollection[R any]( + settings component.TelemetrySettings, + options ...ParserCollectionOption[R], +) (*ParserCollection[R], error) { + pc := &ParserCollection[R]{ + Settings: settings, + contextParsers: map[string]*parserCollectionParser{}, + contextInferrer: defaultPriorityContextInferrer(), + } + + for _, op := range options { + err := op(pc) + if err != nil { + return nil, err + } + } + + return pc, nil +} + +// ParsedStatementConverter is a function that converts the parsed ottl.Statement[K] into +// a common representation to all parser collection contexts passed through WithParserCollectionContext. +// Given each parser has its own transform context type, they must agree on a common type [R] +// so it can be returned by the ParserCollection.ParseStatements and ParserCollection.ParseStatementsWithContext +// functions. +// +// Experimental: *NOTE* this API is subject to change or removal in the future. +type ParsedStatementConverter[K any, R any] func( + collection *ParserCollection[R], + parser *Parser[K], + context string, + statements StatementsGetter, + parsedStatements []*Statement[K], +) (R, error) + +func newNopParsedStatementConverter[K any]() ParsedStatementConverter[K, any] { + return func( + _ *ParserCollection[any], + _ *Parser[K], + _ string, + _ StatementsGetter, + parsedStatements []*Statement[K], + ) (any, error) { + return parsedStatements, nil + } +} + +// WithParserCollectionContext configures an ottl.Parser for the given context. +// The provided ottl.Parser must be configured to support the provided context using +// the ottl.WithPathContextNames option. +// +// Experimental: *NOTE* this API is subject to change or removal in the future. +func WithParserCollectionContext[K any, R any]( + context string, + parser *Parser[K], + converter ParsedStatementConverter[K, R], +) ParserCollectionOption[R] { + return func(mp *ParserCollection[R]) error { + if _, ok := parser.pathContextNames[context]; !ok { + return fmt.Errorf(`context "%s" must be a valid "%T" path context name`, context, parser) + } + mp.contextParsers[context] = &parserCollectionParser{ + ottlParser: newParserWrapper[K](parser), + statementsConverter: newStatementsConverterWrapper(converter), + } + return nil + } +} + +// WithParserCollectionErrorMode has no effect on the ParserCollection, but might be used +// by the ParsedStatementConverter functions to handle/create StatementSequence. +// +// Experimental: *NOTE* this API is subject to change or removal in the future. +func WithParserCollectionErrorMode[R any](errorMode ErrorMode) ParserCollectionOption[R] { + return func(tp *ParserCollection[R]) error { + tp.ErrorMode = errorMode + return nil + } +} + +// EnableParserCollectionModifiedStatementLogging controls the statements modification logs. +// When enabled, it logs any statements modifications performed by the parsing operations, +// instructing users to rewrite the statements accordingly. +// +// Experimental: *NOTE* this API is subject to change or removal in the future. +func EnableParserCollectionModifiedStatementLogging[R any](enabled bool) ParserCollectionOption[R] { + return func(tp *ParserCollection[R]) error { + tp.modifiedStatementLogging = enabled + return nil + } +} + +// ParseStatements parses the given statements into [R] using the configured context's ottl.Parser +// and subsequently calling the ParsedStatementConverter function. +// The statement's context is automatically inferred from the [Path.Context] values, choosing the +// highest priority context found. +// If no contexts are present in the statements, or if the inferred value is not supported by +// the [ParserCollection], it returns an error. +// If parsing the statements fails, it returns the underlying [ottl.Parser.ParseStatements] error. +// +// Experimental: *NOTE* this API is subject to change or removal in the future. +func (pc *ParserCollection[R]) ParseStatements(statements StatementsGetter) (R, error) { + statementsValues := statements.GetStatements() + inferredContext, err := pc.contextInferrer.infer(statementsValues) + if err != nil { + return *new(R), err + } + + if inferredContext == "" { + return *new(R), fmt.Errorf("unable to infer context from statements [%v], path's first segment must be a valid context name", statementsValues) + } + + return pc.ParseStatementsWithContext(inferredContext, statements, false) +} + +// ParseStatementsWithContext parses the given statements into [R] using the configured +// context's ottl.Parser and subsequently calling the ParsedStatementConverter function. +// Unlike ParseStatements, it uses the provided context and does not infer it +// automatically. The context value must be supported by the [ParserCollection], +// otherwise an error is returned. +// If the statement's Path does not provide their Path.Context value, the prependPathsContext +// argument should be set to true, so it rewrites the statements prepending the missing paths +// contexts. +// If parsing the statements fails, it returns the underlying [ottl.Parser.ParseStatements] error. +// +// Experimental: *NOTE* this API is subject to change or removal in the future. +func (pc *ParserCollection[R]) ParseStatementsWithContext(context string, statements StatementsGetter, prependPathsContext bool) (R, error) { + contextParser, ok := pc.contextParsers[context] + if !ok { + return *new(R), fmt.Errorf(`unknown context "%s" for stataments: %v`, context, statements.GetStatements()) + } + + var err error + var parsingStatements []string + if prependPathsContext { + originalStatements := statements.GetStatements() + parsingStatements, err = contextParser.ottlParser.prependContextToStatementsPaths(context, originalStatements) + if err != nil { + return *new(R), err + } + if pc.modifiedStatementLogging { + pc.logModifiedStatements(originalStatements, parsingStatements) + } + } else { + parsingStatements = statements.GetStatements() + } + + parsedStatements, err := contextParser.ottlParser.parseStatements(parsingStatements) + if err != nil { + return *new(R), err + } + + convertedStatements, err := contextParser.statementsConverter.call( + reflect.ValueOf(pc), + contextParser.ottlParser, + context, + statements, + parsedStatements, + ) + if err != nil { + return *new(R), err + } + + if convertedStatements.IsNil() { + return *new(R), nil + } + + return convertedStatements.Interface().(R), nil +} + +func (pc *ParserCollection[R]) logModifiedStatements(originalStatements, modifiedStatements []string) { + var fields []zap.Field + for i, original := range originalStatements { + if modifiedStatements[i] != original { + statementKey := fmt.Sprintf("[%v]", i) + fields = append(fields, zap.Dict( + statementKey, + zap.String("original", original), + zap.String("modified", modifiedStatements[i])), + ) + } + } + if len(fields) > 0 { + pc.Settings.Logger.Info("one or more statements were modified to include their paths context, please rewrite them accordingly", zap.Dict("statements", fields...)) + } +} diff --git a/pkg/ottl/parser_collection_test.go b/pkg/ottl/parser_collection_test.go new file mode 100644 index 000000000000..841f3a5fab60 --- /dev/null +++ b/pkg/ottl/parser_collection_test.go @@ -0,0 +1,402 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottl + +import ( + "context" + "errors" + "fmt" + "reflect" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.uber.org/zap" + "go.uber.org/zap/zaptest/observer" +) + +type mockStatementsGetter struct { + values []string +} + +func (s mockStatementsGetter) GetStatements() []string { + return s.values +} + +type mockFailingContextInferrer struct { + err error +} + +func (r *mockFailingContextInferrer) infer(_ []string) (string, error) { + return "", r.err +} + +type mockStaticContextInferrer struct { + value string +} + +func (r *mockStaticContextInferrer) infer(_ []string) (string, error) { + return r.value, nil +} + +type mockSetArguments[K any] struct { + Target Setter[K] + Value Getter[K] +} + +func Test_NewParserCollection(t *testing.T) { + settings := componenttest.NewNopTelemetrySettings() + pc, err := NewParserCollection[any](settings) + require.NoError(t, err) + + assert.NotNil(t, pc) + assert.NotNil(t, pc.contextParsers) + assert.NotNil(t, pc.contextInferrer) +} + +func Test_NewParserCollection_OptionError(t *testing.T) { + _, err := NewParserCollection[any]( + componenttest.NewNopTelemetrySettings(), + func(_ *ParserCollection[any]) error { + return errors.New("option error") + }, + ) + + require.Error(t, err, "option error") +} + +func Test_WithParserCollectionContext(t *testing.T) { + ps := mockParser(t, WithPathContextNames[any]([]string{"testContext"})) + conv := newNopParsedStatementConverter[any]() + option := WithParserCollectionContext("testContext", ps, conv) + + pc, err := NewParserCollection[any](componenttest.NewNopTelemetrySettings(), option) + require.NoError(t, err) + + pw, exists := pc.contextParsers["testContext"] + assert.True(t, exists) + assert.NotNil(t, pw) + assert.Equal(t, reflect.ValueOf(ps), pw.ottlParser.parser) + assert.Equal(t, reflect.ValueOf(conv), reflect.Value(pw.statementsConverter)) +} + +func Test_WithParserCollectionContext_UnsupportedContext(t *testing.T) { + ps := mockParser(t, WithPathContextNames[any]([]string{"foo"})) + conv := newNopParsedStatementConverter[any]() + option := WithParserCollectionContext("bar", ps, conv) + + _, err := NewParserCollection[any](componenttest.NewNopTelemetrySettings(), option) + + require.ErrorContains(t, err, `context "bar" must be a valid "*ottl.Parser[interface {}]" path context name`) +} + +func Test_WithParserCollectionErrorMode(t *testing.T) { + pc, err := NewParserCollection[any]( + componenttest.NewNopTelemetrySettings(), + WithParserCollectionErrorMode[any](PropagateError), + ) + + require.NoError(t, err) + require.NotNil(t, pc) + require.Equal(t, PropagateError, pc.ErrorMode) +} + +func Test_EnableParserCollectionModifiedStatementLogging_True(t *testing.T) { + ps := mockParser(t, WithPathContextNames[any]([]string{"dummy"})) + core, observedLogs := observer.New(zap.InfoLevel) + telemetrySettings := componenttest.NewNopTelemetrySettings() + telemetrySettings.Logger = zap.New(core) + + pc, err := NewParserCollection( + telemetrySettings, + WithParserCollectionContext("dummy", ps, newNopParsedStatementConverter[any]()), + EnableParserCollectionModifiedStatementLogging[any](true), + ) + require.NoError(t, err) + + originalStatements := []string{ + `set(attributes["foo"], "foo")`, + `set(attributes["bar"], "bar")`, + } + + _, err = pc.ParseStatementsWithContext("dummy", mockStatementsGetter{originalStatements}, true) + require.NoError(t, err) + + logEntries := observedLogs.TakeAll() + require.Len(t, logEntries, 1) + logEntry := logEntries[0] + require.Equal(t, zap.InfoLevel, logEntry.Level) + require.Contains(t, logEntry.Message, "one or more statements were modified") + logEntryStatements := logEntry.ContextMap()["statements"] + require.NotNil(t, logEntryStatements) + + for i, originalStatement := range originalStatements { + k := fmt.Sprintf("[%d]", i) + logEntryStatementContext := logEntryStatements.(map[string]any)[k] + require.Equal(t, logEntryStatementContext.(map[string]any)["original"], originalStatement) + modifiedStatement, err := ps.prependContextToStatementPaths("dummy", originalStatement) + require.NoError(t, err) + require.Equal(t, logEntryStatementContext.(map[string]any)["modified"], modifiedStatement) + } +} + +func Test_EnableParserCollectionModifiedStatementLogging_False(t *testing.T) { + ps := mockParser(t, WithPathContextNames[any]([]string{"dummy"})) + core, observedLogs := observer.New(zap.InfoLevel) + telemetrySettings := componenttest.NewNopTelemetrySettings() + telemetrySettings.Logger = zap.New(core) + + pc, err := NewParserCollection( + telemetrySettings, + WithParserCollectionContext("dummy", ps, newNopParsedStatementConverter[any]()), + EnableParserCollectionModifiedStatementLogging[any](false), + ) + require.NoError(t, err) + + _, err = pc.ParseStatementsWithContext("dummy", mockStatementsGetter{[]string{`set(attributes["foo"], "foo")`}}, true) + require.NoError(t, err) + require.Empty(t, observedLogs.TakeAll()) +} + +func Test_NopParsedStatementConverter(t *testing.T) { + type dummyContext struct{} + + noop := newNopParsedStatementConverter[dummyContext]() + parsedStatements := []*Statement[dummyContext]{{}} + convertedStatements, err := noop(nil, nil, "", mockStatementsGetter{values: []string{}}, parsedStatements) + + require.NoError(t, err) + require.NotNil(t, convertedStatements) + assert.Equal(t, parsedStatements, convertedStatements) +} + +func Test_NewParserCollection_DefaultContextInferrer(t *testing.T) { + pc, err := NewParserCollection[any](componenttest.NewNopTelemetrySettings()) + require.NoError(t, err) + require.NotNil(t, pc) + require.NotNil(t, pc.contextInferrer) +} + +func Test_ParseStatements_Success(t *testing.T) { + ps := mockParser(t, WithPathContextNames[any]([]string{"foo"})) + + pc, err := NewParserCollection( + component.TelemetrySettings{}, + WithParserCollectionContext("foo", ps, newNopParsedStatementConverter[any]()), + ) + require.NoError(t, err) + pc.contextInferrer = &mockStaticContextInferrer{"foo"} + + statements := mockStatementsGetter{values: []string{`set(foo.attributes["bar"], "foo")`, `set(foo.attributes["bar"], "bar")`}} + result, err := pc.ParseStatements(statements) + require.NoError(t, err) + + assert.IsType(t, []*Statement[any]{}, result) + assert.Len(t, result.([]*Statement[any]), 2) + assert.NotNil(t, result) +} + +func Test_ParseStatements_MultipleContexts_Success(t *testing.T) { + fooParser := mockParser(t, WithPathContextNames[any]([]string{"foo"})) + barParser := mockParser(t, WithPathContextNames[any]([]string{"bar"})) + failingConverter := func( + _ *ParserCollection[any], + _ *Parser[any], + _ string, + _ StatementsGetter, + _ []*Statement[any], + ) (any, error) { + return nil, errors.New("failing converter") + } + + pc, err := NewParserCollection( + component.TelemetrySettings{}, + WithParserCollectionContext("foo", fooParser, failingConverter), + WithParserCollectionContext("bar", barParser, newNopParsedStatementConverter[any]()), + ) + require.NoError(t, err) + pc.contextInferrer = &mockStaticContextInferrer{"bar"} + + // The `foo` context is never used, so these statements will successfully parse. + statements := mockStatementsGetter{values: []string{`set(bar.attributes["bar"], "foo")`, `set(bar.attributes["bar"], "bar")`}} + result, err := pc.ParseStatements(statements) + require.NoError(t, err) + + assert.IsType(t, []*Statement[any]{}, result) + assert.Len(t, result.([]*Statement[any]), 2) + assert.NotNil(t, result) +} + +func Test_ParseStatements_NoContextInferredError(t *testing.T) { + pc, err := NewParserCollection[any](component.TelemetrySettings{}) + require.NoError(t, err) + pc.contextInferrer = &mockStaticContextInferrer{""} + + statements := mockStatementsGetter{values: []string{`set(bar.attributes["bar"], "foo")`}} + _, err = pc.ParseStatements(statements) + + assert.ErrorContains(t, err, "unable to infer context from statements") +} + +func Test_ParseStatements_ContextInferenceError(t *testing.T) { + pc, err := NewParserCollection[any](component.TelemetrySettings{}) + require.NoError(t, err) + pc.contextInferrer = &mockFailingContextInferrer{err: errors.New("inference error")} + + statements := mockStatementsGetter{values: []string{`set(bar.attributes["bar"], "foo")`}} + _, err = pc.ParseStatements(statements) + + assert.EqualError(t, err, "inference error") +} + +func Test_ParseStatements_UnknownContextError(t *testing.T) { + pc, err := NewParserCollection[any](component.TelemetrySettings{}) + require.NoError(t, err) + pc.contextInferrer = &mockStaticContextInferrer{"foo"} + + statements := mockStatementsGetter{values: []string{`set(foo.attributes["bar"], "foo")`}} + _, err = pc.ParseStatements(statements) + + assert.ErrorContains(t, err, `unknown context "foo"`) +} + +func Test_ParseStatements_ParseStatementsError(t *testing.T) { + ps := mockParser(t, WithPathContextNames[any]([]string{"foo"})) + ps.pathParser = func(_ Path[any]) (GetSetter[any], error) { + return nil, errors.New("parse statements error") + } + + pc, err := NewParserCollection( + component.TelemetrySettings{}, + WithParserCollectionContext("foo", ps, newNopParsedStatementConverter[any]()), + ) + require.NoError(t, err) + pc.contextInferrer = &mockStaticContextInferrer{"foo"} + + statements := mockStatementsGetter{values: []string{`set(foo.attributes["bar"], "foo")`}} + _, err = pc.ParseStatements(statements) + assert.ErrorContains(t, err, "parse statements error") +} + +func Test_ParseStatements_ConverterError(t *testing.T) { + ps := mockParser(t, WithPathContextNames[any]([]string{"dummy"})) + conv := func(_ *ParserCollection[any], _ *Parser[any], _ string, _ StatementsGetter, _ []*Statement[any]) (any, error) { + return nil, errors.New("converter error") + } + + pc, err := NewParserCollection( + component.TelemetrySettings{}, + WithParserCollectionContext("dummy", ps, conv), + ) + require.NoError(t, err) + pc.contextInferrer = &mockStaticContextInferrer{"dummy"} + + statements := mockStatementsGetter{values: []string{`set(dummy.attributes["bar"], "foo")`}} + _, err = pc.ParseStatements(statements) + + assert.EqualError(t, err, "converter error") +} + +func Test_ParseStatements_ConverterNilReturn(t *testing.T) { + ps := mockParser(t, WithPathContextNames[any]([]string{"dummy"})) + conv := func(_ *ParserCollection[any], _ *Parser[any], _ string, _ StatementsGetter, _ []*Statement[any]) (any, error) { + return nil, nil + } + + pc, err := NewParserCollection( + component.TelemetrySettings{}, + WithParserCollectionContext("dummy", ps, conv), + ) + require.NoError(t, err) + pc.contextInferrer = &mockStaticContextInferrer{"dummy"} + + statements := mockStatementsGetter{values: []string{`set(dummy.attributes["bar"], "foo")`}} + result, err := pc.ParseStatements(statements) + assert.NoError(t, err) + assert.Nil(t, result) +} + +func Test_ParseStatements_StatementsConverterGetterType(t *testing.T) { + ps := mockParser(t, WithPathContextNames[any]([]string{"dummy"})) + statements := mockStatementsGetter{values: []string{`set(dummy.attributes["bar"], "foo")`}} + conv := func(_ *ParserCollection[any], _ *Parser[any], _ string, statementsGetter StatementsGetter, _ []*Statement[any]) (any, error) { + switch statementsGetter.(type) { + case mockStatementsGetter: + return statements, nil + default: + return nil, fmt.Errorf("invalid StatementsGetter type, expected: mockStatementsGetter, got: %T", statementsGetter) + } + } + + pc, err := NewParserCollection(component.TelemetrySettings{}, WithParserCollectionContext("dummy", ps, conv)) + require.NoError(t, err) + pc.contextInferrer = &mockStaticContextInferrer{"dummy"} + + _, err = pc.ParseStatements(statements) + require.NoError(t, err) +} + +func Test_ParseStatementsWithContext_UnknownContextError(t *testing.T) { + pc, err := NewParserCollection[any](component.TelemetrySettings{}) + require.NoError(t, err) + + statements := mockStatementsGetter{[]string{`set(attributes["bar"], "bar")`}} + _, err = pc.ParseStatementsWithContext("bar", statements, false) + + assert.ErrorContains(t, err, `unknown context "bar"`) +} + +func Test_ParseStatementsWithContext_PrependPathContext(t *testing.T) { + ps := mockParser(t, WithPathContextNames[any]([]string{"dummy"})) + pc, err := NewParserCollection( + component.TelemetrySettings{}, + WithParserCollectionContext("dummy", ps, newNopParsedStatementConverter[any]()), + ) + require.NoError(t, err) + + result, err := pc.ParseStatementsWithContext( + "dummy", + mockStatementsGetter{[]string{ + `set(attributes["foo"], "foo")`, + `set(attributes["bar"], "bar")`, + }}, + true, + ) + + require.NoError(t, err) + require.Len(t, result, 2) + parsedStatements := result.([]*Statement[any]) + assert.Equal(t, `set(dummy.attributes["foo"], "foo")`, parsedStatements[0].origText) + assert.Equal(t, `set(dummy.attributes["bar"], "bar")`, parsedStatements[1].origText) +} + +func Test_NewStatementsGetter(t *testing.T) { + statements := []string{`set(foo, "bar")`, `set(bar, "foo")`} + statementsGetter := NewStatementsGetter(statements) + assert.Implements(t, (*StatementsGetter)(nil), statementsGetter) + assert.Equal(t, statements, statementsGetter.GetStatements()) +} + +func mockParser(t *testing.T, options ...Option[any]) *Parser[any] { + mockSetFactory := NewFactory("set", &mockSetArguments[any]{}, + func(_ FunctionContext, _ Arguments) (ExprFunc[any], error) { + return func(_ context.Context, _ any) (any, error) { + return nil, nil + }, nil + }) + + ps, err := NewParser( + CreateFactoryMap[any](mockSetFactory), + testParsePath[any], + componenttest.NewNopTelemetrySettings(), + append([]Option[any]{ + WithEnumParser[any](testParseEnum), + }, options...)..., + ) + + require.NoError(t, err) + return &ps +} diff --git a/pkg/ottl/parser_test.go b/pkg/ottl/parser_test.go index 10da41ead069..726f531bfb81 100644 --- a/pkg/ottl/parser_test.go +++ b/pkg/ottl/parser_test.go @@ -12,7 +12,9 @@ import ( "testing" "time" + "github.com/alecthomas/participle/v2/lexer" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component/componenttest" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottltest" @@ -84,6 +86,172 @@ func Test_parse(t *testing.T) { WhereClause: nil, }, }, + { + name: "editor with map", + statement: `fff({"stringAttr": "value", "intAttr": 3, "floatAttr": 2.5, "boolAttr": true})`, + expected: &parsedStatement{ + Editor: editor{ + Function: "fff", + Arguments: []argument{ + { + Value: value{ + Map: &mapValue{ + Values: []mapItem{ + { + Key: ottltest.Strp("stringAttr"), + Value: &value{String: ottltest.Strp("value")}, + }, + { + Key: ottltest.Strp("intAttr"), + Value: &value{ + Literal: &mathExprLiteral{ + Int: ottltest.Intp(3), + }, + }, + }, + { + Key: ottltest.Strp("floatAttr"), + Value: &value{ + Literal: &mathExprLiteral{ + Float: ottltest.Floatp(2.5), + }, + }, + }, + { + Key: ottltest.Strp("boolAttr"), + Value: &value{Bool: (*boolean)(ottltest.Boolp(true))}, + }, + }, + }, + }, + }, + }, + }, + WhereClause: nil, + }, + }, + { + name: "editor with empty map", + statement: `fff({})`, + expected: &parsedStatement{ + Editor: editor{ + Function: "fff", + Arguments: []argument{ + { + Value: value{ + Map: &mapValue{ + Values: nil, + }, + }, + }, + }, + }, + WhereClause: nil, + }, + }, + { + name: "editor with converter with a map", + statement: `fff(GetSomething({"foo":"bar"}))`, + expected: &parsedStatement{ + Editor: editor{ + Function: "fff", + Arguments: []argument{ + { + Value: value{ + Literal: &mathExprLiteral{ + Converter: &converter{ + Function: "GetSomething", + Arguments: []argument{ + { + Value: value{ + Map: &mapValue{ + Values: []mapItem{ + { + Key: ottltest.Strp("foo"), + Value: &value{String: ottltest.Strp("bar")}, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + WhereClause: nil, + }, + }, + { + name: "editor with nested map", + statement: `fff({"mapAttr": {"foo": "bar", "get": bear.honey, "arrayAttr":["foo", "bar"]}})`, + expected: &parsedStatement{ + Editor: editor{ + Function: "fff", + Arguments: []argument{ + { + Value: value{ + Map: &mapValue{ + Values: []mapItem{ + { + Key: ottltest.Strp("mapAttr"), + Value: &value{ + Map: &mapValue{ + Values: []mapItem{ + { + Key: ottltest.Strp("foo"), + Value: &value{String: ottltest.Strp("bar")}, + }, + { + Key: ottltest.Strp("get"), + Value: &value{ + Literal: &mathExprLiteral{ + Path: &path{ + Pos: lexer.Position{ + Offset: 38, + Line: 1, + Column: 39, + }, + Context: "bear", + Fields: []field{ + { + Name: "honey", + }, + }, + }, + }, + }, + }, + { + Key: ottltest.Strp("arrayAttr"), + Value: &value{ + List: &list{ + Values: []value{ + { + String: ottltest.Strp("foo"), + }, + { + String: ottltest.Strp("bar"), + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + WhereClause: nil, + }, + }, { name: "complex editor", statement: `set("foo", GetSomething(bear.honey))`, @@ -106,10 +274,13 @@ func Test_parse(t *testing.T) { Value: value{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 24, + Line: 1, + Column: 25, + }, + Context: "bear", Fields: []field{ - { - Name: "bear", - }, { Name: "honey", }, @@ -139,10 +310,13 @@ func Test_parse(t *testing.T) { Value: value{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 4, + Line: 1, + Column: 5, + }, + Context: "foo", Fields: []field{ - { - Name: "foo", - }, { Name: "attributes", Keys: []key{ @@ -169,6 +343,47 @@ func Test_parse(t *testing.T) { WhereClause: nil, }, }, + { + name: "single field segment", + statement: `set(attributes["bar"], "dog")`, + expected: &parsedStatement{ + Editor: editor{ + Function: "set", + Arguments: []argument{ + { + Value: value{ + Literal: &mathExprLiteral{ + Path: &path{ + Pos: lexer.Position{ + Offset: 4, + Line: 1, + Column: 5, + }, + Context: "", + Fields: []field{ + { + Name: "attributes", + Keys: []key{ + { + String: ottltest.Strp("bar"), + }, + }, + }, + }, + }, + }, + }, + }, + { + Value: value{ + String: ottltest.Strp("dog"), + }, + }, + }, + }, + WhereClause: nil, + }, + }, { name: "Converter parameters (All Uppercase)", statement: `replace_pattern(attributes["message"], "device=*", attributes["device_name"], SHA256)`, @@ -180,6 +395,11 @@ func Test_parse(t *testing.T) { Value: value{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 16, + Line: 1, + Column: 17, + }, Fields: []field{ { Name: "attributes", @@ -203,6 +423,11 @@ func Test_parse(t *testing.T) { Value: value{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 51, + Line: 1, + Column: 52, + }, Fields: []field{ { Name: "attributes", @@ -238,6 +463,11 @@ func Test_parse(t *testing.T) { Value: value{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 16, + Line: 1, + Column: 17, + }, Fields: []field{ { Name: "attributes", @@ -271,6 +501,11 @@ func Test_parse(t *testing.T) { Value: value{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 16, + Line: 1, + Column: 17, + }, Fields: []field{ { Name: "attributes", @@ -306,10 +541,13 @@ func Test_parse(t *testing.T) { Value: value{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 4, + Line: 1, + Column: 5, + }, + Context: "foo", Fields: []field{ - { - Name: "foo", - }, { Name: "bar", Keys: []key{ @@ -362,10 +600,13 @@ func Test_parse(t *testing.T) { Value: value{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 4, + Line: 1, + Column: 5, + }, + Context: "foo", Fields: []field{ - { - Name: "foo", - }, { Name: "attributes", Keys: []key{ @@ -396,6 +637,11 @@ func Test_parse(t *testing.T) { Left: value{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 44, + Line: 1, + Column: 45, + }, Fields: []field{ { Name: "name", @@ -425,10 +671,13 @@ func Test_parse(t *testing.T) { Value: value{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 4, + Line: 1, + Column: 5, + }, + Context: "foo", Fields: []field{ - { - Name: "foo", - }, { Name: "attributes", Keys: []key{ @@ -459,6 +708,11 @@ func Test_parse(t *testing.T) { Left: value{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 44, + Line: 1, + Column: 45, + }, Fields: []field{ { Name: "name", @@ -488,10 +742,13 @@ func Test_parse(t *testing.T) { Value: value{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 7, + Line: 1, + Column: 8, + }, + Context: "foo", Fields: []field{ - { - Name: "foo", - }, { Name: "attributes", Keys: []key{ @@ -522,6 +779,11 @@ func Test_parse(t *testing.T) { Left: value{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 52, + Line: 1, + Column: 53, + }, Fields: []field{ { Name: "name", @@ -612,6 +874,11 @@ func Test_parse(t *testing.T) { Value: value{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 4, + Line: 1, + Column: 5, + }, Fields: []field{ { Name: "attributes", @@ -647,6 +914,11 @@ func Test_parse(t *testing.T) { Value: value{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 4, + Line: 1, + Column: 5, + }, Fields: []field{ { Name: "attributes", @@ -682,6 +954,11 @@ func Test_parse(t *testing.T) { Value: value{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 4, + Line: 1, + Column: 5, + }, Fields: []field{ { Name: "attributes", @@ -717,6 +994,11 @@ func Test_parse(t *testing.T) { Value: value{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 4, + Line: 1, + Column: 5, + }, Fields: []field{ { Name: "attributes", @@ -754,6 +1036,11 @@ func Test_parse(t *testing.T) { Value: value{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 4, + Line: 1, + Column: 5, + }, Fields: []field{ { Name: "attributes", @@ -795,6 +1082,11 @@ func Test_parse(t *testing.T) { Value: value{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 4, + Line: 1, + Column: 5, + }, Fields: []field{ { Name: "attributes", @@ -839,6 +1131,11 @@ func Test_parse(t *testing.T) { Value: value{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 4, + Line: 1, + Column: 5, + }, Fields: []field{ { Name: "attributes", @@ -910,6 +1207,11 @@ func Test_parse(t *testing.T) { { Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 70, + Line: 1, + Column: 71, + }, Fields: []field{ { Name: "attributes", @@ -943,6 +1245,11 @@ func Test_parse(t *testing.T) { Value: value{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 4, + Line: 1, + Column: 5, + }, Fields: []field{ { Name: "attributes", @@ -1028,6 +1335,11 @@ func Test_parse(t *testing.T) { Left: &mathValue{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 55, + Line: 1, + Column: 56, + }, Fields: []field{ { Name: "three", @@ -1102,6 +1414,11 @@ func Test_parseCondition_full(t *testing.T) { Left: value{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 0, + Line: 1, + Column: 1, + }, Fields: []field{ { Name: "name", @@ -1129,6 +1446,11 @@ func Test_parseCondition_full(t *testing.T) { Left: value{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 0, + Line: 1, + Column: 1, + }, Fields: []field{ { Name: "name", @@ -1193,6 +1515,11 @@ func Test_parseCondition_full(t *testing.T) { Left: &mathValue{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 13, + Line: 1, + Column: 14, + }, Fields: []field{ { Name: "three", @@ -1292,6 +1619,11 @@ func setNameTest(b *booleanExpression) *parsedStatement { Value: value{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 4, + Line: 1, + Column: 5, + }, Fields: []field{ { Name: "name", @@ -1528,6 +1860,11 @@ func Test_parseWhere(t *testing.T) { Left: value{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 24, + Line: 1, + Column: 25, + }, Fields: []field{ { Name: "name", @@ -1550,6 +1887,11 @@ func Test_parseWhere(t *testing.T) { Left: value{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 42, + Line: 1, + Column: 43, + }, Fields: []field{ { Name: "name", @@ -1578,6 +1920,11 @@ func Test_parseWhere(t *testing.T) { Left: value{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 24, + Line: 1, + Column: 25, + }, Fields: []field{ { Name: "name", @@ -1602,6 +1949,11 @@ func Test_parseWhere(t *testing.T) { Left: value{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 41, + Line: 1, + Column: 42, + }, Fields: []field{ { Name: "name", @@ -1654,6 +2006,11 @@ func Test_parseWhere(t *testing.T) { Left: value{ Literal: &mathExprLiteral{ Path: &path{ + Pos: lexer.Position{ + Offset: 28, + Line: 1, + Column: 29, + }, Fields: []field{ { Name: "name", @@ -1837,71 +2194,81 @@ func Test_ParseConditions_Error(t *testing.T) { // This test doesn't validate parser results, simply checks whether the parse succeeds or not. // It's a fast way to check a large range of possible syntaxes. func Test_parseStatement(t *testing.T) { + converterNameErrorPrefix := "converter names must start with an uppercase letter" + editorWithIndexErrorPrefix := "only paths and converters may be indexed" + tests := []struct { - statement string - wantErr bool + statement string + wantErr bool + wantErrContaining string }{ - {`set(`, true}, - {`set("foo)`, true}, - {`set(name.)`, true}, - {`("foo")`, true}, - {`set("foo") where name =||= "fido"`, true}, - {`set(span_id, SpanIDWrapper{not a hex string})`, true}, - {`set(span_id, SpanIDWrapper{01})`, true}, - {`set(span_id, SpanIDWrapper{010203040506070809})`, true}, - {`set(trace_id, TraceIDWrapper{not a hex string})`, true}, - {`set(trace_id, TraceIDWrapper{0102030405060708090a0b0c0d0e0f})`, true}, - {`set(trace_id, TraceIDWrapper{0102030405060708090a0b0c0d0e0f1011})`, true}, - {`set("foo") where name = "fido"`, true}, - {`set("foo") where name or "fido"`, true}, - {`set("foo") where name and "fido"`, true}, - {`set("foo") where name and`, true}, - {`set("foo") where name or`, true}, - {`set("foo") where (`, true}, - {`set("foo") where )`, true}, - {`set("foo") where (name == "fido"))`, true}, - {`set("foo") where ((name == "fido")`, true}, - {`Set()`, true}, - {`set(int())`, true}, - {`set(1 + int())`, true}, - {`set(int() + 1)`, true}, - {`set(1 * int())`, true}, - {`set(1 * 1 + (2 * int()))`, true}, - {`set() where int() == 1`, true}, - {`set() where 1 == int()`, true}, - {`set() where true and 1 == int() `, true}, - {`set() where false or 1 == int() `, true}, - {`set(foo.attributes["bar"].cat, "dog")`, false}, - {`set(set = foo.attributes["animal"], val = "dog") where animal == "cat"`, false}, - {`test() where service == "pinger" or foo.attributes["endpoint"] == "/x/alive"`, false}, - {`test() where service == "pinger" or foo.attributes["verb"] == "GET" and foo.attributes["endpoint"] == "/x/alive"`, false}, - {`test() where animal > "cat"`, false}, - {`test() where animal >= "cat"`, false}, - {`test() where animal <= "cat"`, false}, - {`test() where animal < "cat"`, false}, - {`test() where animal =< "dog"`, true}, - {`test() where animal => "dog"`, true}, - {`test() where animal <> "dog"`, true}, - {`test() where animal = "dog"`, true}, - {`test() where animal`, true}, - {`test() where animal ==`, true}, - {`test() where ==`, true}, - {`test() where == animal`, true}, - {`test() where attributes["path"] == "/healthcheck"`, false}, - {`test() where one() == 1`, true}, - {`test(fail())`, true}, - {`Test()`, true}, + {statement: `set(`, wantErr: true}, + {statement: `set("foo)`, wantErr: true}, + {statement: `set(name.)`, wantErr: true}, + {statement: `("foo")`, wantErr: true}, + {statement: `set("foo") where name =||= "fido"`, wantErr: true}, + {statement: `set(span_id, SpanIDWrapper{not a hex string})`, wantErr: true}, + {statement: `set(span_id, SpanIDWrapper{01})`, wantErr: true}, + {statement: `set(span_id, SpanIDWrapper{010203040506070809})`, wantErr: true}, + {statement: `set(trace_id, TraceIDWrapper{not a hex string})`, wantErr: true}, + {statement: `set(trace_id, TraceIDWrapper{0102030405060708090a0b0c0d0e0f})`, wantErr: true}, + {statement: `set(trace_id, TraceIDWrapper{0102030405060708090a0b0c0d0e0f1011})`, wantErr: true}, + {statement: `set("foo") where name = "fido"`, wantErr: true}, + {statement: `set("foo") where name or "fido"`, wantErr: true}, + {statement: `set("foo") where name and "fido"`, wantErr: true}, + {statement: `set("foo") where name and`, wantErr: true}, + {statement: `set("foo") where name or`, wantErr: true}, + {statement: `set("foo") where (`, wantErr: true}, + {statement: `set("foo") where )`, wantErr: true}, + {statement: `set("foo") where (name == "fido"))`, wantErr: true}, + {statement: `set("foo") where ((name == "fido")`, wantErr: true}, + {statement: `Set()`, wantErr: true}, + {statement: `set(int())`, wantErrContaining: converterNameErrorPrefix}, + {statement: `set(1 + int())`, wantErrContaining: converterNameErrorPrefix}, + {statement: `set(int() + 1)`, wantErrContaining: converterNameErrorPrefix}, + {statement: `set(1 * int())`, wantErrContaining: converterNameErrorPrefix}, + {statement: `set(1 * 1 + (2 * int()))`, wantErrContaining: converterNameErrorPrefix}, + {statement: `set() where int() == 1`, wantErrContaining: converterNameErrorPrefix}, + {statement: `set() where 1 == int()`, wantErrContaining: converterNameErrorPrefix}, + {statement: `set() where true and 1 == int() `, wantErrContaining: converterNameErrorPrefix}, + {statement: `set() where false or 1 == int() `, wantErrContaining: converterNameErrorPrefix}, + {statement: `set(foo.attributes["bar"].cat)["key"]`, wantErrContaining: editorWithIndexErrorPrefix}, + {statement: `set(foo.attributes["bar"].cat, "dog")`}, + {statement: `set(set = foo.attributes["animal"], val = "dog") where animal == "cat"`}, + {statement: `test() where service == "pinger" or foo.attributes["endpoint"] == "/x/alive"`}, + {statement: `test() where service == "pinger" or foo.attributes["verb"] == "GET" and foo.attributes["endpoint"] == "/x/alive"`}, + {statement: `test() where animal > "cat"`}, + {statement: `test() where animal >= "cat"`}, + {statement: `test() where animal <= "cat"`}, + {statement: `test() where animal < "cat"`}, + {statement: `test() where animal =< "dog"`, wantErr: true}, + {statement: `test() where animal => "dog"`, wantErr: true}, + {statement: `test() where animal <> "dog"`, wantErr: true}, + {statement: `test() where animal = "dog"`, wantErr: true}, + {statement: `test() where animal`, wantErr: true}, + {statement: `test() where animal ==`, wantErr: true}, + {statement: `test() where ==`, wantErr: true}, + {statement: `test() where == animal`, wantErr: true}, + {statement: `test() where attributes["path"] == "/healthcheck"`}, + {statement: `test() where one() == 1`, wantErr: true}, + {statement: `test(fail())`, wantErrContaining: converterNameErrorPrefix}, + {statement: `Test()`, wantErr: true}, + {statement: `set() where test(foo)["key"] == "bar"`, wantErrContaining: converterNameErrorPrefix}, + {statement: `set() where test(foo)["key"] == "bar"`, wantErrContaining: editorWithIndexErrorPrefix}, } pat := regexp.MustCompile("[^a-zA-Z0-9]+") for _, tt := range tests { name := pat.ReplaceAllString(tt.statement, "_") t.Run(name, func(t *testing.T) { ast, err := parseStatement(tt.statement) - if (err != nil) != tt.wantErr { - t.Errorf("parseStatement(%s) error = %v, wantErr %v", tt.statement, err, tt.wantErr) + if (err != nil) != (tt.wantErr || tt.wantErrContaining != "") { + t.Errorf("parseStatement(%s) error = %v, wantErr %v, wantErrContaining %v", tt.statement, err, tt.wantErr, tt.wantErrContaining) t.Errorf("AST: %+v", ast) return } + if tt.wantErrContaining != "" { + require.ErrorContains(t, err, tt.wantErrContaining) + } }) } } @@ -1909,59 +2276,69 @@ func Test_parseStatement(t *testing.T) { // This test doesn't validate parser results, simply checks whether the parse succeeds or not. // It's a fast way to check a large range of possible syntaxes. func Test_parseCondition(t *testing.T) { + converterNameErrorPrefix := "converter names must start with an uppercase letter" + editorWithIndexErrorPrefix := "only paths and converters may be indexed" + tests := []struct { - condition string - wantErr bool + condition string + wantErr bool + wantErrContaining string }{ - {`set(`, true}, - {`set("foo)`, true}, - {`set(name.)`, true}, - {`("foo")`, true}, - {`name =||= "fido"`, true}, - {`name = "fido"`, true}, - {`name or "fido"`, true}, - {`name and "fido"`, true}, - {`name and`, true}, - {`name or`, true}, - {`(`, true}, - {`)`, true}, - {`(name == "fido"))`, true}, - {`((name == "fido")`, true}, - {`set()`, true}, - {`Int() == 1`, false}, - {`1 == Int()`, false}, - {`true and 1 == Int() `, false}, - {`false or 1 == Int() `, false}, - {`service == "pinger" or foo.attributes["endpoint"] == "/x/alive"`, false}, - {`service == "pinger" or foo.attributes["verb"] == "GET" and foo.attributes["endpoint"] == "/x/alive"`, false}, - {`animal > "cat"`, false}, - {`animal >= "cat"`, false}, - {`animal <= "cat"`, false}, - {`animal < "cat"`, false}, - {`animal =< "dog"`, true}, - {`animal => "dog"`, true}, - {`animal <> "dog"`, true}, - {`animal = "dog"`, true}, - {`animal`, true}, - {`animal ==`, true}, - {`==`, true}, - {`== animal`, true}, - {`attributes["path"] == "/healthcheck"`, false}, - {`One() == 1`, false}, - {`test(fail())`, true}, - {`Test()`, false}, - {`"test" == Foo`, true}, + {condition: `set(`, wantErr: true}, + {condition: `set("foo)`, wantErr: true}, + {condition: `set(name.)`, wantErr: true}, + {condition: `("foo")`, wantErr: true}, + {condition: `name =||= "fido"`, wantErr: true}, + {condition: `name = "fido"`, wantErr: true}, + {condition: `name or "fido"`, wantErr: true}, + {condition: `name and "fido"`, wantErr: true}, + {condition: `name and`, wantErr: true}, + {condition: `name or`, wantErr: true}, + {condition: `(`, wantErr: true}, + {condition: `)`, wantErr: true}, + {condition: `(name == "fido"))`, wantErr: true}, + {condition: `((name == "fido")`, wantErr: true}, + {condition: `set()`, wantErr: true}, + {condition: `Int() == 1`}, + {condition: `1 == Int()`}, + {condition: `true and 1 == Int() `}, + {condition: `false or 1 == Int() `}, + {condition: `service == "pinger" or foo.attributes["endpoint"] == "/x/alive"`}, + {condition: `service == "pinger" or foo.attributes["verb"] == "GET" and foo.attributes["endpoint"] == "/x/alive"`}, + {condition: `animal > "cat"`}, + {condition: `animal >= "cat"`}, + {condition: `animal <= "cat"`}, + {condition: `animal < "cat"`}, + {condition: `animal =< "dog"`, wantErr: true}, + {condition: `animal => "dog"`, wantErr: true}, + {condition: `animal <> "dog"`, wantErr: true}, + {condition: `animal = "dog"`, wantErr: true}, + {condition: `animal`, wantErr: true}, + {condition: `animal ==`, wantErr: true}, + {condition: `==`, wantErr: true}, + {condition: `== animal`, wantErr: true}, + {condition: `attributes["path"] == "/healthcheck"`}, + {condition: `One() == 1`}, + {condition: `test(fail())`, wantErr: true}, + {condition: `Test()`}, + {condition: `"test" == Foo`, wantErr: true}, + {condition: `test(animal) == "dog"`, wantErrContaining: converterNameErrorPrefix}, + {condition: `test(animal)["kind"] == "birds"`, wantErrContaining: converterNameErrorPrefix}, + {condition: `test(animal)["kind"] == "birds"`, wantErrContaining: editorWithIndexErrorPrefix}, } pat := regexp.MustCompile("[^a-zA-Z0-9]+") for _, tt := range tests { name := pat.ReplaceAllString(tt.condition, "_") t.Run(name, func(t *testing.T) { ast, err := parseCondition(tt.condition) - if (err != nil) != tt.wantErr { + if (err != nil) != (tt.wantErr || tt.wantErrContaining != "") { t.Errorf("parseCondition(%s) error = %v, wantErr %v", tt.condition, err, tt.wantErr) t.Errorf("AST: %+v", ast) return } + if tt.wantErrContaining != "" { + require.ErrorContains(t, err, tt.wantErrContaining) + } }) } } @@ -2005,8 +2382,9 @@ func Test_Statement_Execute(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { statement := Statement[any]{ - condition: BoolExpr[any]{tt.condition}, - function: Expr[any]{exprFunc: tt.function}, + condition: BoolExpr[any]{tt.condition}, + function: Expr[any]{exprFunc: tt.function}, + telemetrySettings: componenttest.NewNopTelemetrySettings(), } result, condition, err := statement.Execute(context.Background(), nil) @@ -2120,8 +2498,9 @@ func Test_Statements_Execute_Error(t *testing.T) { statements := StatementSequence[any]{ statements: []*Statement[any]{ { - condition: BoolExpr[any]{tt.condition}, - function: Expr[any]{exprFunc: tt.function}, + condition: BoolExpr[any]{tt.condition}, + function: Expr[any]{exprFunc: tt.function}, + telemetrySettings: componenttest.NewNopTelemetrySettings(), }, }, errorMode: tt.errorMode, @@ -2337,3 +2716,140 @@ func Test_ConditionSequence_Eval_Error(t *testing.T) { }) } } + +func Test_prependContextToStatementPaths_InvalidStatement(t *testing.T) { + ps, err := NewParser( + CreateFactoryMap[any](), + testParsePath[any], + componenttest.NewNopTelemetrySettings(), + WithEnumParser[any](testParseEnum), + WithPathContextNames[any]([]string{"foo", "bar"}), + ) + require.NoError(t, err) + _, err = ps.prependContextToStatementPaths("foo", "this is invalid") + require.ErrorContains(t, err, `statement has invalid syntax`) +} + +func Test_prependContextToStatementPaths_InvalidContext(t *testing.T) { + ps, err := NewParser( + CreateFactoryMap[any](), + testParsePath[any], + componenttest.NewNopTelemetrySettings(), + WithEnumParser[any](testParseEnum), + WithPathContextNames[any]([]string{"foo", "bar"}), + ) + require.NoError(t, err) + _, err = ps.prependContextToStatementPaths("foobar", "set(foo, 1)") + require.ErrorContains(t, err, `unknown context "foobar" for parser`) +} + +func Test_prependContextToStatementPaths_Success(t *testing.T) { + type mockSetArguments[K any] struct { + Target Setter[K] + Value Getter[K] + } + + mockSetFactory := NewFactory("set", &mockSetArguments[any]{}, func(_ FunctionContext, _ Arguments) (ExprFunc[any], error) { + return func(_ context.Context, _ any) (any, error) { + return nil, nil + }, nil + }) + + tests := []struct { + name string + statement string + context string + pathContextNames []string + expected string + }{ + { + name: "no paths", + statement: `set("foo", 1)`, + context: "bar", + pathContextNames: []string{"bar"}, + expected: `set("foo", 1)`, + }, + { + name: "single path with context", + statement: `set(span.value, 1)`, + context: "span", + pathContextNames: []string{"span"}, + expected: `set(span.value, 1)`, + }, + { + name: "single path without context", + statement: "set(value, 1)", + context: "span", + pathContextNames: []string{"span"}, + expected: "set(span.value, 1)", + }, + { + name: "single path with context - multiple context names", + statement: "set(span.value, 1)", + context: "spanevent", + pathContextNames: []string{"spanevent", "span"}, + expected: "set(span.value, 1)", + }, + { + name: "multiple paths with the same context", + statement: `set(span.value, 1) where span.attributes["foo"] == "foo" and span.id == 1`, + context: "another", + pathContextNames: []string{"another", "span"}, + expected: `set(span.value, 1) where span.attributes["foo"] == "foo" and span.id == 1`, + }, + { + name: "multiple paths with different contexts", + statement: `set(another.value, 1) where span.attributes["foo"] == "foo" and another.id == 1`, + context: "another", + pathContextNames: []string{"another", "span"}, + expected: `set(another.value, 1) where span.attributes["foo"] == "foo" and another.id == 1`, + }, + { + name: "multiple paths with and without contexts", + statement: `set(value, 1) where span.attributes["foo"] == "foo" and id == 1`, + context: "spanevent", + pathContextNames: []string{"spanevent", "span"}, + expected: `set(spanevent.value, 1) where span.attributes["foo"] == "foo" and spanevent.id == 1`, + }, + { + name: "multiple paths without context", + statement: `set(value, 1) where name == attributes["foo.name"]`, + context: "span", + pathContextNames: []string{"span"}, + expected: `set(span.value, 1) where span.name == span.attributes["foo.name"]`, + }, + { + name: "function path parameter without context", + statement: `set(attributes["test"], "pass") where IsMatch(name, "operation[AC]")`, + context: "log", + pathContextNames: []string{"log"}, + expected: `set(log.attributes["test"], "pass") where IsMatch(log.name, "operation[AC]")`, + }, + { + name: "function path parameter with context", + statement: `set(attributes["test"], "pass") where IsMatch(resource.name, "operation[AC]")`, + context: "log", + pathContextNames: []string{"log", "resource"}, + expected: `set(log.attributes["test"], "pass") where IsMatch(resource.name, "operation[AC]")`, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ps, err := NewParser( + CreateFactoryMap[any](mockSetFactory), + testParsePath[any], + componenttest.NewNopTelemetrySettings(), + WithEnumParser[any](testParseEnum), + WithPathContextNames[any](tt.pathContextNames), + ) + + require.NoError(t, err) + require.NotNil(t, ps) + + result, err := ps.prependContextToStatementPaths(tt.context, tt.statement) + require.NoError(t, err) + assert.Equal(t, tt.expected, result) + }) + } +} diff --git a/pkg/ottl/paths.go b/pkg/ottl/paths.go new file mode 100644 index 000000000000..dbb66ee7c994 --- /dev/null +++ b/pkg/ottl/paths.go @@ -0,0 +1,32 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottl // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" + +// grammarPathVisitor is used to extract all path from a parsedStatement or booleanExpression +type grammarPathVisitor struct { + paths []path +} + +func (v *grammarPathVisitor) visitEditor(_ *editor) {} +func (v *grammarPathVisitor) visitValue(_ *value) {} +func (v *grammarPathVisitor) visitMathExprLiteral(_ *mathExprLiteral) {} + +func (v *grammarPathVisitor) visitPath(value *path) { + v.paths = append(v.paths, *value) +} + +func getParsedStatementPaths(ps *parsedStatement) []path { + visitor := &grammarPathVisitor{} + ps.Editor.accept(visitor) + if ps.WhereClause != nil { + ps.WhereClause.accept(visitor) + } + return visitor.paths +} + +func getBooleanExpressionPaths(be *booleanExpression) []path { + visitor := &grammarPathVisitor{} + be.accept(visitor) + return visitor.paths +} diff --git a/pkg/ottl/paths_test.go b/pkg/ottl/paths_test.go new file mode 100644 index 000000000000..9f31dda15718 --- /dev/null +++ b/pkg/ottl/paths_test.go @@ -0,0 +1,450 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package ottl + +import ( + "testing" + + "github.com/alecthomas/participle/v2/lexer" + "github.com/stretchr/testify/require" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottltest" +) + +func Test_getParsedStatementPaths(t *testing.T) { + tests := []struct { + name string + statement string + expected []path + }{ + { + name: "editor with nested map with path", + statement: `fff({"mapAttr": {"foo": "bar", "get": bear.honey, "arrayAttr":["foo", "bar"]}})`, + expected: []path{ + { + Pos: lexer.Position{ + Offset: 38, + Line: 1, + Column: 39, + }, + Context: "bear", + Fields: []field{ + { + Name: "honey", + }, + }, + }, + }, + }, + { + name: "editor with function path parameter", + statement: `set("foo", GetSomething(bear.honey))`, + expected: []path{ + { + Pos: lexer.Position{ + Offset: 24, + Line: 1, + Column: 25, + }, + Context: "bear", + Fields: []field{ + { + Name: "honey", + }, + }, + }, + }, + }, + { + name: "path with key", + statement: `set(foo.attributes["bar"].cat, "dog")`, + expected: []path{ + { + Pos: lexer.Position{ + Offset: 4, + Line: 1, + Column: 5, + }, + Context: "foo", + Fields: []field{ + { + Name: "attributes", + Keys: []key{ + { + String: ottltest.Strp("bar"), + }, + }, + }, + { + Name: "cat", + }, + }, + }, + }, + }, + { + name: "single path field segment", + statement: `set(attributes["bar"], "dog")`, + expected: []path{ + { + Pos: lexer.Position{ + Offset: 4, + Line: 1, + Column: 5, + }, + Context: "", + Fields: []field{ + { + Name: "attributes", + Keys: []key{ + { + String: ottltest.Strp("bar"), + }, + }, + }, + }, + }, + }, + }, + { + name: "converter parameters", + statement: `replace_pattern(attributes["message"], "device=*", attributes["device_name"], SHA256)`, + expected: []path{ + { + Pos: lexer.Position{ + Offset: 16, + Line: 1, + Column: 17, + }, + Fields: []field{ + { + Name: "attributes", + Keys: []key{ + { + String: ottltest.Strp("message"), + }, + }, + }, + }, + }, + { + Pos: lexer.Position{ + Offset: 51, + Line: 1, + Column: 52, + }, + Fields: []field{ + { + Name: "attributes", + Keys: []key{ + { + String: ottltest.Strp("device_name"), + }, + }, + }, + }, + }, + }, + }, + { + name: "complex path with multiple keys", + statement: `set(foo.bar["x"]["y"].z, Test()[0]["pass"])`, + expected: []path{ + { + Pos: lexer.Position{ + Offset: 4, + Line: 1, + Column: 5, + }, + Context: "foo", + Fields: []field{ + { + Name: "bar", + Keys: []key{ + { + String: ottltest.Strp("x"), + }, + { + String: ottltest.Strp("y"), + }, + }, + }, + { + Name: "z", + }, + }, + }, + }, + }, + { + name: "where clause", + statement: `set(foo.attributes["bar"].cat, "dog") where name == "fido"`, + expected: []path{ + { + Pos: lexer.Position{ + Offset: 4, + Line: 1, + Column: 5, + }, + Context: "foo", + Fields: []field{ + { + Name: "attributes", + Keys: []key{ + { + String: ottltest.Strp("bar"), + }, + }, + }, + { + Name: "cat", + }, + }, + }, + { + Pos: lexer.Position{ + Offset: 44, + Line: 1, + Column: 45, + }, + Fields: []field{ + { + Name: "name", + }, + }, + }, + }, + }, + { + name: "where clause multiple conditions", + statement: `set(foo.attributes["bar"].cat, "dog") where name == "fido" and surname == "dido" or surname == "DIDO"`, + expected: []path{ + { + Pos: lexer.Position{ + Offset: 4, + Line: 1, + Column: 5, + }, + Context: "foo", + Fields: []field{ + { + Name: "attributes", + Keys: []key{ + { + String: ottltest.Strp("bar"), + }, + }, + }, + { + Name: "cat", + }, + }, + }, + { + Pos: lexer.Position{ + Offset: 44, + Line: 1, + Column: 45, + }, + Fields: []field{ + { + Name: "name", + }, + }, + }, + { + Pos: lexer.Position{ + Offset: 63, + Line: 1, + Column: 64, + }, + Fields: []field{ + { + Name: "surname", + }, + }, + }, + { + Pos: lexer.Position{ + Offset: 84, + Line: 1, + Column: 85, + }, + Fields: []field{ + { + Name: "surname", + }, + }, + }, + }, + }, + { + name: "where clause sub expression", + statement: `set(foo.attributes["bar"].cat, "value") where three / (1 + 1) == foo.value`, + expected: []path{ + { + Pos: lexer.Position{ + Offset: 4, + Line: 1, + Column: 5, + }, + Context: "foo", + Fields: []field{ + { + Name: "attributes", + Keys: []key{ + { + String: ottltest.Strp("bar"), + }, + }, + }, + { + Name: "cat", + }, + }, + }, + { + Pos: lexer.Position{ + Offset: 46, + Line: 1, + Column: 47, + }, + Fields: []field{ + { + Name: "three", + }, + }, + }, + { + Pos: lexer.Position{ + Offset: 65, + Line: 1, + Column: 66, + }, + Context: "foo", + Fields: []field{ + { + Name: "value", + }, + }, + }, + }, + }, + { + name: "converter with path list", + statement: `set(attributes["test"], [bear.bear, bear.honey])`, + expected: []path{ + { + Pos: lexer.Position{ + Offset: 4, + Line: 1, + Column: 5, + }, + Fields: []field{ + { + Name: "attributes", + Keys: []key{ + { + String: ottltest.Strp("test"), + }, + }, + }, + }, + }, + { + Pos: lexer.Position{ + Offset: 25, + Line: 1, + Column: 26, + }, + Context: "bear", + Fields: []field{{Name: "bear"}}, + }, + { + Pos: lexer.Position{ + Offset: 36, + Line: 1, + Column: 37, + }, + Context: "bear", + Fields: []field{{Name: "honey"}}, + }, + }, + }, + { + name: "converter math math expression", + statement: `set(attributes["test"], 1000 - 600) where 1 + 1 * 2 == three / One()`, + expected: []path{ + { + Pos: lexer.Position{ + Offset: 4, + Line: 1, + Column: 5, + }, + Fields: []field{ + { + Name: "attributes", + Keys: []key{ + { + String: ottltest.Strp("test"), + }, + }, + }, + }, + }, + { + Pos: lexer.Position{ + Offset: 55, + Line: 1, + Column: 56, + }, + Fields: []field{ + { + Name: "three", + }, + }, + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ps, err := parseStatement(tt.statement) + require.NoError(t, err) + + paths := getParsedStatementPaths(ps) + require.Equal(t, tt.expected, paths) + }) + } +} + +func Test_getBooleanExpressionPaths(t *testing.T) { + expected := []path{ + { + Pos: lexer.Position{ + Offset: 0, + Line: 1, + Column: 1, + }, + Context: "honey", + Fields: []field{{Name: "bear"}}, + }, + { + Pos: lexer.Position{ + Offset: 21, + Line: 1, + Column: 22, + }, + Context: "foo", + Fields: []field{{Name: "bar"}}, + }, + } + + c, err := parseCondition("honey.bear == 1 and (foo.bar == true or 1 == 1)") + require.NoError(t, err) + + paths := getBooleanExpressionPaths(c) + require.Equal(t, expected, paths) +} diff --git a/pkg/pdatatest/go.mod b/pkg/pdatatest/go.mod index 8730d450a2bf..f08b48ab2113 100644 --- a/pkg/pdatatest/go.mod +++ b/pkg/pdatatest/go.mod @@ -1,12 +1,13 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/pdata v1.9.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/multierr v1.11.0 ) @@ -19,12 +20,12 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/pkg/pdatatest/go.sum b/pkg/pdatatest/go.sum index 2bfebc3f8feb..f390c6d585a4 100644 --- a/pkg/pdatatest/go.sum +++ b/pkg/pdatatest/go.sum @@ -5,6 +5,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -27,12 +29,14 @@ github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjR github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -46,20 +50,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -68,12 +72,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/pkg/pdatatest/internal/util.go b/pkg/pdatatest/internal/util.go index f9b96dfc7b6a..9213ab8dbbff 100644 --- a/pkg/pdatatest/internal/util.go +++ b/pkg/pdatatest/internal/util.go @@ -7,6 +7,7 @@ import ( "fmt" "reflect" "regexp" + "sort" "go.opentelemetry.io/collector/pdata/pcommon" "go.uber.org/multierr" @@ -88,3 +89,22 @@ func CompareDroppedAttributesCount(expected, actual uint32) error { } return nil } + +func OrderMapByKey(input map[string]any) map[string]any { + // Create a slice to hold the keys + keys := make([]string, 0, len(input)) + for k := range input { + keys = append(keys, k) + } + + // Sort the keys + sort.Strings(keys) + + // Create a new map to hold the sorted key-value pairs + orderedMap := make(map[string]any, len(input)) + for _, k := range keys { + orderedMap[k] = input[k] + } + + return orderedMap +} diff --git a/pkg/pdatatest/plogtest/logs_test.go b/pkg/pdatatest/plogtest/logs_test.go index 345823e1846a..c8910d24c3ef 100644 --- a/pkg/pdatatest/plogtest/logs_test.go +++ b/pkg/pdatatest/plogtest/logs_test.go @@ -142,6 +142,14 @@ func TestCompareLogs(t *testing.T) { withoutOptions: errors.New(`resource "map[]": scope "collector": log record "map[]": timestamp doesn't match expected: 11651379494838206465, actual: 11651379494838206464`), withOptions: nil, }, + { + name: "ignore-log-record-attribute-value", + compareOptions: []CompareLogsOption{ + IgnoreLogRecordAttributeValue("Key1"), + }, + withoutOptions: errors.New(`resource "map[]": scope "": missing expected log record: map[Key1:Val2]; resource "map[]": scope "": unexpected log record: map[Key1:Val1]`), + withOptions: nil, + }, } for _, tc := range tcs { diff --git a/pkg/pdatatest/plogtest/options.go b/pkg/pdatatest/plogtest/options.go index 412efd7d7eb5..632b76297c99 100644 --- a/pkg/pdatatest/plogtest/options.go +++ b/pkg/pdatatest/plogtest/options.go @@ -42,13 +42,47 @@ func (opt ignoreResourceAttributeValue) applyOnLogs(expected, actual plog.Logs) opt.maskLogsResourceAttributeValue(actual) } -func (opt ignoreResourceAttributeValue) maskLogsResourceAttributeValue(metrics plog.Logs) { - rls := metrics.ResourceLogs() +func (opt ignoreResourceAttributeValue) maskLogsResourceAttributeValue(logs plog.Logs) { + rls := logs.ResourceLogs() for i := 0; i < rls.Len(); i++ { internal.MaskResourceAttributeValue(rls.At(i).Resource(), opt.attributeName) } } +// IgnoreLogRecordAttributeValue is a CompareLogsOption that sets the value of an attribute +// to empty bytes for every log record +func IgnoreLogRecordAttributeValue(attributeName string) CompareLogsOption { + return ignoreLogRecordAttributeValue{ + attributeName: attributeName, + } +} + +type ignoreLogRecordAttributeValue struct { + attributeName string +} + +func (opt ignoreLogRecordAttributeValue) applyOnLogs(expected, actual plog.Logs) { + opt.maskLogRecordAttributeValue(expected) + opt.maskLogRecordAttributeValue(actual) +} + +func (opt ignoreLogRecordAttributeValue) maskLogRecordAttributeValue(logs plog.Logs) { + rls := logs.ResourceLogs() + for i := 0; i < logs.ResourceLogs().Len(); i++ { + sls := rls.At(i).ScopeLogs() + for j := 0; j < sls.Len(); j++ { + lrs := sls.At(j).LogRecords() + for k := 0; k < lrs.Len(); k++ { + lr := lrs.At(k) + val, exists := lr.Attributes().Get(opt.attributeName) + if exists { + val.SetEmptyBytes() + } + } + } + } +} + func IgnoreTimestamp() CompareLogsOption { return compareLogsOptionFunc(func(expected, actual plog.Logs) { now := pcommon.NewTimestampFromTime(time.Now()) diff --git a/pkg/pdatatest/plogtest/testdata/ignore-log-record-attribute-value/actual.yaml b/pkg/pdatatest/plogtest/testdata/ignore-log-record-attribute-value/actual.yaml new file mode 100644 index 000000000000..5fed2e0e0108 --- /dev/null +++ b/pkg/pdatatest/plogtest/testdata/ignore-log-record-attribute-value/actual.yaml @@ -0,0 +1,12 @@ +resourceLogs: + - resource: {} + scopeLogs: + - logRecords: + - attributes: + - key: Key1 + value: + stringValue: Val1 + body: {} + spanId: "" + traceId: "" + scope: {} diff --git a/pkg/pdatatest/plogtest/testdata/ignore-log-record-attribute-value/expected.yaml b/pkg/pdatatest/plogtest/testdata/ignore-log-record-attribute-value/expected.yaml new file mode 100644 index 000000000000..fbd1af584d58 --- /dev/null +++ b/pkg/pdatatest/plogtest/testdata/ignore-log-record-attribute-value/expected.yaml @@ -0,0 +1,12 @@ +resourceLogs: + - resource: {} + scopeLogs: + - logRecords: + - attributes: + - key: Key1 + value: + stringValue: Val2 + body: {} + spanId: "" + traceId: "" + scope: {} diff --git a/pkg/pdatatest/pmetrictest/metrics_test.go b/pkg/pdatatest/pmetrictest/metrics_test.go index 7b23964eaead..6f09b1be5edc 100644 --- a/pkg/pdatatest/pmetrictest/metrics_test.go +++ b/pkg/pdatatest/pmetrictest/metrics_test.go @@ -240,6 +240,13 @@ func TestCompareMetrics(t *testing.T) { }, withoutOptions: errors.New(`resource "map[]": scope "": metric "gauge.one": datapoint "map[]": double value doesn't match expected: 123.456000, actual: 654.321000`), }, + { + name: "ignore-data-point-value-double-precision", + compareOptions: []CompareMetricsOption{ + IgnoreMetricFloatPrecision(3), + }, + withoutOptions: errors.New(`resource "map[]": scope "": metric "gauge.one": datapoint "map[]": double value doesn't match expected: 654.321110, actual: 654.321000`), + }, { name: "ignore-data-point-value-int-mismatch", compareOptions: []CompareMetricsOption{ @@ -378,10 +385,10 @@ func TestCompareMetrics(t *testing.T) { IgnoreMetricsOrder(), }, withoutOptions: multierr.Combine( - errors.New(`resource "map[namespace:test]": scope "otelcol/aerospikereceiver": metrics are out of order: metric "aerospike.namespace.memory.free" expected at index 0, found at index 2`), - errors.New(`resource "map[namespace:test]": scope "otelcol/aerospikereceiver": metrics are out of order: metric "aerospike.namespace.memory.usage" expected at index 1, found at index 3`), - errors.New(`resource "map[namespace:test]": scope "otelcol/aerospikereceiver": metrics are out of order: metric "aerospike.namespace.disk.available" expected at index 2, found at index 1`), - errors.New(`resource "map[namespace:test]": scope "otelcol/aerospikereceiver": metrics are out of order: metric "aerospike.namespace.scan.count" expected at index 3, found at index 0`), + errors.New(`resource "map[namespace:test]": scope "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver": metrics are out of order: metric "aerospike.namespace.memory.free" expected at index 0, found at index 2`), + errors.New(`resource "map[namespace:test]": scope "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver": metrics are out of order: metric "aerospike.namespace.memory.usage" expected at index 1, found at index 3`), + errors.New(`resource "map[namespace:test]": scope "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver": metrics are out of order: metric "aerospike.namespace.disk.available" expected at index 2, found at index 1`), + errors.New(`resource "map[namespace:test]": scope "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver": metrics are out of order: metric "aerospike.namespace.scan.count" expected at index 3, found at index 0`), ), withOptions: nil, }, @@ -391,9 +398,9 @@ func TestCompareMetrics(t *testing.T) { IgnoreMetricDataPointsOrder(), }, withoutOptions: multierr.Combine( - errors.New(`resource "map[namespace:test]": scope "otelcol/aerospikereceiver": metric "aerospike.namespace.scan.count": datapoints are out of order: datapoint "map[result:complete type:aggr]" expected at index 1, found at index 2`), - errors.New(`resource "map[namespace:test]": scope "otelcol/aerospikereceiver": metric "aerospike.namespace.scan.count": datapoints are out of order: datapoint "map[result:error type:aggr]" expected at index 2, found at index 3`), - errors.New(`resource "map[namespace:test]": scope "otelcol/aerospikereceiver": metric "aerospike.namespace.scan.count": datapoints are out of order: datapoint "map[result:abort type:basic]" expected at index 3, found at index 1`), + errors.New(`resource "map[namespace:test]": scope "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver": metric "aerospike.namespace.scan.count": datapoints are out of order: datapoint "map[result:complete type:aggr]" expected at index 1, found at index 2`), + errors.New(`resource "map[namespace:test]": scope "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver": metric "aerospike.namespace.scan.count": datapoints are out of order: datapoint "map[result:error type:aggr]" expected at index 2, found at index 3`), + errors.New(`resource "map[namespace:test]": scope "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver": metric "aerospike.namespace.scan.count": datapoints are out of order: datapoint "map[result:abort type:basic]" expected at index 3, found at index 1`), ), withOptions: nil, }, diff --git a/pkg/pdatatest/pmetrictest/options.go b/pkg/pdatatest/pmetrictest/options.go index 14a3326a28a5..3a6ce4cb9651 100644 --- a/pkg/pdatatest/pmetrictest/options.go +++ b/pkg/pdatatest/pmetrictest/options.go @@ -6,6 +6,7 @@ package pmetrictest // import "github.com/open-telemetry/opentelemetry-collector import ( "bytes" "fmt" + "math" "regexp" "time" @@ -53,7 +54,14 @@ func maskMetricSliceValues(metrics pmetric.MetricSlice, metricNames ...string) { } for i := 0; i < metrics.Len(); i++ { if len(metricNames) == 0 || metricNameSet[metrics.At(i).Name()] { - maskDataPointSliceValues(getDataPointSlice(metrics.At(i))) + switch metrics.At(i).Type() { + case pmetric.MetricTypeEmpty, pmetric.MetricTypeSum, pmetric.MetricTypeGauge: + maskDataPointSliceValues(getDataPointSlice(metrics.At(i))) + case pmetric.MetricTypeHistogram: + maskHistogramDataPointSliceValues(metrics.At(i).Histogram().DataPoints()) + default: + panic(fmt.Sprintf("data type not supported: %s", metrics.At(i).Type())) + } } } } @@ -66,7 +74,9 @@ func getDataPointSlice(metric pmetric.Metric) pmetric.NumberDataPointSlice { dataPointSlice = metric.Gauge().DataPoints() case pmetric.MetricTypeSum: dataPointSlice = metric.Sum().DataPoints() - case pmetric.MetricTypeEmpty, pmetric.MetricTypeHistogram, pmetric.MetricTypeExponentialHistogram, pmetric.MetricTypeSummary: + case pmetric.MetricTypeEmpty: + dataPointSlice = pmetric.NewNumberDataPointSlice() + case pmetric.MetricTypeHistogram, pmetric.MetricTypeExponentialHistogram, pmetric.MetricTypeSummary: fallthrough default: panic(fmt.Sprintf("data type not supported: %s", metric.Type())) @@ -83,6 +93,72 @@ func maskDataPointSliceValues(dataPoints pmetric.NumberDataPointSlice) { } } +// maskHistogramDataPointSliceValues sets all data point values to zero. +func maskHistogramDataPointSliceValues(dataPoints pmetric.HistogramDataPointSlice) { + for i := 0; i < dataPoints.Len(); i++ { + dataPoint := dataPoints.At(i) + dataPoint.SetCount(0) + dataPoint.SetSum(0) + dataPoint.SetMin(0) + dataPoint.SetMax(0) + dataPoint.BucketCounts().FromRaw([]uint64{}) + dataPoint.Exemplars().RemoveIf(func(pmetric.Exemplar) bool { + return true + }) + dataPoint.ExplicitBounds().FromRaw([]float64{}) + } +} + +// IgnoreMetricFloatPrecision is a CompareMetricsOption that rounds away float precision discrepancies in metric values. +func IgnoreMetricFloatPrecision(precision int, metricNames ...string) CompareMetricsOption { + return compareMetricsOptionFunc(func(expected, actual pmetric.Metrics) { + floatMetricValues(precision, expected, metricNames...) + floatMetricValues(precision, actual, metricNames...) + }) +} + +func floatMetricValues(precision int, metrics pmetric.Metrics, metricNames ...string) { + rms := metrics.ResourceMetrics() + for i := 0; i < rms.Len(); i++ { + ilms := rms.At(i).ScopeMetrics() + for j := 0; j < ilms.Len(); j++ { + floatMetricSliceValues(precision, ilms.At(j).Metrics(), metricNames...) + } + } +} + +// floatMetricSliceValues sets all data point values to zero. +func floatMetricSliceValues(precision int, metrics pmetric.MetricSlice, metricNames ...string) { + metricNameSet := make(map[string]bool, len(metricNames)) + for _, metricName := range metricNames { + metricNameSet[metricName] = true + } + for i := 0; i < metrics.Len(); i++ { + if len(metricNames) == 0 || metricNameSet[metrics.At(i).Name()] { + switch metrics.At(i).Type() { + case pmetric.MetricTypeEmpty, pmetric.MetricTypeSum, pmetric.MetricTypeGauge: + roundDataPointSliceValues(getDataPointSlice(metrics.At(i)), precision) + default: + panic(fmt.Sprintf("data type not supported: %s", metrics.At(i).Type())) + } + } + } +} + +// maskDataPointSliceValues rounds all data point values at a given decimal. +func roundDataPointSliceValues(dataPoints pmetric.NumberDataPointSlice, precision int) { + for i := 0; i < dataPoints.Len(); i++ { + dataPoint := dataPoints.At(i) + factor := math.Pow(10, float64(precision)) + switch { + case dataPoint.DoubleValue() != 0.0: + dataPoint.SetDoubleValue(math.Round(dataPoint.DoubleValue()*factor) / factor) + case dataPoint.IntValue() != 0: + panic(fmt.Sprintf("integers can not have float precision ignored: %v", dataPoints.At(i))) + } + } +} + // IgnoreTimestamp is a CompareMetricsOption that clears Timestamp fields on all the data points. func IgnoreTimestamp() CompareMetricsOption { return compareMetricsOptionFunc(func(expected, actual pmetric.Metrics) { @@ -179,6 +255,55 @@ func IgnoreMetricAttributeValue(attributeName string, metricNames ...string) Com }) } +// IgnoreDatapointAttributesOrder is a CompareMetricsOption that ignores the order of datapoint attributes. +func IgnoreDatapointAttributesOrder() CompareMetricsOption { + return compareMetricsOptionFunc(func(expected, actual pmetric.Metrics) { + orderDatapointAttributes(expected) + orderDatapointAttributes(actual) + }) +} + +func orderDatapointAttributes(metrics pmetric.Metrics) { + rms := metrics.ResourceMetrics() + for i := 0; i < rms.Len(); i++ { + ilms := rms.At(i).ScopeMetrics() + for j := 0; j < ilms.Len(); j++ { + msl := ilms.At(j).Metrics() + for g := 0; g < msl.Len(); g++ { + msl.At(g) + switch msl.At(g).Type() { + case pmetric.MetricTypeGauge: + for k := 0; k < msl.At(g).Gauge().DataPoints().Len(); k++ { + rawOrdered := internal.OrderMapByKey(msl.At(g).Gauge().DataPoints().At(k).Attributes().AsRaw()) + _ = msl.At(g).Gauge().DataPoints().At(k).Attributes().FromRaw(rawOrdered) + } + case pmetric.MetricTypeSum: + for k := 0; k < msl.At(g).Sum().DataPoints().Len(); k++ { + rawOrdered := internal.OrderMapByKey(msl.At(g).Sum().DataPoints().At(k).Attributes().AsRaw()) + _ = msl.At(g).Sum().DataPoints().At(k).Attributes().FromRaw(rawOrdered) + } + case pmetric.MetricTypeHistogram: + for k := 0; k < msl.At(g).Histogram().DataPoints().Len(); k++ { + rawOrdered := internal.OrderMapByKey(msl.At(g).Histogram().DataPoints().At(k).Attributes().AsRaw()) + _ = msl.At(g).Histogram().DataPoints().At(k).Attributes().FromRaw(rawOrdered) + } + case pmetric.MetricTypeExponentialHistogram: + for k := 0; k < msl.At(g).ExponentialHistogram().DataPoints().Len(); k++ { + rawOrdered := internal.OrderMapByKey(msl.At(g).ExponentialHistogram().DataPoints().At(k).Attributes().AsRaw()) + _ = msl.At(g).ExponentialHistogram().DataPoints().At(k).Attributes().FromRaw(rawOrdered) + } + case pmetric.MetricTypeSummary: + for k := 0; k < msl.At(g).Summary().DataPoints().Len(); k++ { + rawOrdered := internal.OrderMapByKey(msl.At(g).Summary().DataPoints().At(k).Attributes().AsRaw()) + _ = msl.At(g).Summary().DataPoints().At(k).Attributes().FromRaw(rawOrdered) + } + case pmetric.MetricTypeEmpty: + } + } + } + } +} + func maskMetricAttributeValue(metrics pmetric.Metrics, attributeName string, metricNames []string) { rms := metrics.ResourceMetrics() for i := 0; i < rms.Len(); i++ { @@ -201,21 +326,52 @@ func maskMetricSliceAttributeValues(metrics pmetric.MetricSlice, attributeName s for i := 0; i < metrics.Len(); i++ { if len(metricNames) == 0 || metricNameSet[metrics.At(i).Name()] { - dps := getDataPointSlice(metrics.At(i)) - maskDataPointSliceAttributeValues(dps, attributeName) - - // If attribute values are ignored, some data points may become - // indistinguishable from each other, but sorting by value allows - // for a reasonably thorough comparison and a deterministic outcome. - dps.Sort(func(a, b pmetric.NumberDataPoint) bool { - if a.IntValue() < b.IntValue() { - return true - } - if a.DoubleValue() < b.DoubleValue() { - return true - } - return false - }) + switch metrics.At(i).Type() { + case pmetric.MetricTypeHistogram: + dps := metrics.At(i).Histogram().DataPoints() + maskHistogramSliceAttributeValues(dps, attributeName) + + // If attribute values are ignored, some data points may become + // indistinguishable from each other, but sorting by value allows + // for a reasonably thorough comparison and a deterministic outcome. + dps.Sort(func(a, b pmetric.HistogramDataPoint) bool { + if a.Sum() < b.Sum() { + return true + } + if a.Min() < b.Min() { + return true + } + if a.Max() < b.Max() { + return true + } + if a.Count() < b.Count() { + return true + } + if a.BucketCounts().Len() < b.BucketCounts().Len() { + return true + } + if a.ExplicitBounds().Len() < b.ExplicitBounds().Len() { + return true + } + return false + }) + default: + dps := getDataPointSlice(metrics.At(i)) + maskDataPointSliceAttributeValues(dps, attributeName) + + // If attribute values are ignored, some data points may become + // indistinguishable from each other, but sorting by value allows + // for a reasonably thorough comparison and a deterministic outcome. + dps.Sort(func(a, b pmetric.NumberDataPoint) bool { + if a.IntValue() < b.IntValue() { + return true + } + if a.DoubleValue() < b.DoubleValue() { + return true + } + return false + }) + } } } } @@ -243,6 +399,29 @@ func maskDataPointSliceAttributeValues(dataPoints pmetric.NumberDataPointSlice, } } +// maskHistogramSliceAttributeValues sets the value of the specified attribute to +// the zero value associated with the attribute data type. +func maskHistogramSliceAttributeValues(dataPoints pmetric.HistogramDataPointSlice, attributeName string) { + for i := 0; i < dataPoints.Len(); i++ { + attributes := dataPoints.At(i).Attributes() + attribute, ok := attributes.Get(attributeName) + if ok { + switch attribute.Type() { + case pcommon.ValueTypeStr: + attribute.SetStr("") + case pcommon.ValueTypeBool: + attribute.SetBool(false) + case pcommon.ValueTypeInt: + attribute.SetInt(0) + case pcommon.ValueTypeEmpty, pcommon.ValueTypeDouble, pcommon.ValueTypeMap, pcommon.ValueTypeSlice, pcommon.ValueTypeBytes: + fallthrough + default: + panic(fmt.Sprintf("data type not supported: %s", attribute.Type())) + } + } + } +} + // MatchMetricAttributeValue is a CompareMetricsOption that transforms a metric attribute value based on a regular expression. func MatchMetricAttributeValue(attributeName string, pattern string, metricNames ...string) CompareMetricsOption { re := regexp.MustCompile(pattern) @@ -270,21 +449,52 @@ func matchMetricSliceAttributeValues(metrics pmetric.MetricSlice, attributeName for i := 0; i < metrics.Len(); i++ { if len(metricNames) == 0 || metricNameSet[metrics.At(i).Name()] { - dps := getDataPointSlice(metrics.At(i)) - matchDataPointSliceAttributeValues(dps, attributeName, re) - - // If attribute values are ignored, some data points may become - // indistinguishable from each other, but sorting by value allows - // for a reasonably thorough comparison and a deterministic outcome. - dps.Sort(func(a, b pmetric.NumberDataPoint) bool { - if a.IntValue() < b.IntValue() { - return true - } - if a.DoubleValue() < b.DoubleValue() { - return true - } - return false - }) + switch metrics.At(i).Type() { + case pmetric.MetricTypeHistogram: + dps := metrics.At(i).Histogram().DataPoints() + matchHistogramDataPointSliceAttributeValues(dps, attributeName, re) + + // If attribute values are ignored, some data points may become + // indistinguishable from each other, but sorting by value allows + // for a reasonably thorough comparison and a deterministic outcome. + dps.Sort(func(a, b pmetric.HistogramDataPoint) bool { + if a.Sum() < b.Sum() { + return true + } + if a.Min() < b.Min() { + return true + } + if a.Max() < b.Max() { + return true + } + if a.Count() < b.Count() { + return true + } + if a.BucketCounts().Len() < b.BucketCounts().Len() { + return true + } + if a.ExplicitBounds().Len() < b.ExplicitBounds().Len() { + return true + } + return false + }) + default: + dps := getDataPointSlice(metrics.At(i)) + matchDataPointSliceAttributeValues(dps, attributeName, re) + + // If attribute values are ignored, some data points may become + // indistinguishable from each other, but sorting by value allows + // for a reasonably thorough comparison and a deterministic outcome. + dps.Sort(func(a, b pmetric.NumberDataPoint) bool { + if a.IntValue() < b.IntValue() { + return true + } + if a.DoubleValue() < b.DoubleValue() { + return true + } + return false + }) + } } } } @@ -302,6 +512,19 @@ func matchDataPointSliceAttributeValues(dataPoints pmetric.NumberDataPointSlice, } } +func matchHistogramDataPointSliceAttributeValues(dataPoints pmetric.HistogramDataPointSlice, attributeName string, re *regexp.Regexp) { + for i := 0; i < dataPoints.Len(); i++ { + attributes := dataPoints.At(i).Attributes() + attribute, ok := attributes.Get(attributeName) + if ok { + results := re.FindStringSubmatch(attribute.Str()) + if len(results) > 0 { + attribute.SetStr(results[0]) + } + } + } +} + // MatchResourceAttributeValue is a CompareMetricsOption that transforms a resource attribute value based on a regular expression. func MatchResourceAttributeValue(attributeName string, pattern string) CompareMetricsOption { re := regexp.MustCompile(pattern) @@ -369,12 +592,22 @@ func maskSubsequentDataPoints(metrics pmetric.Metrics, metricNames []string) { ms := sms.At(j).Metrics() for k := 0; k < ms.Len(); k++ { if len(metricNames) == 0 || metricNameSet[ms.At(k).Name()] { - dps := getDataPointSlice(ms.At(k)) - n := 0 - dps.RemoveIf(func(pmetric.NumberDataPoint) bool { - n++ - return n > 1 - }) + switch ms.At(k).Type() { + case pmetric.MetricTypeHistogram: + dps := ms.At(k).Histogram().DataPoints() + n := 0 + dps.RemoveIf(func(pmetric.HistogramDataPoint) bool { + n++ + return n > 1 + }) + default: + dps := getDataPointSlice(ms.At(k)) + n := 0 + dps.RemoveIf(func(pmetric.NumberDataPoint) bool { + n++ + return n > 1 + }) + } } } } diff --git a/pkg/pdatatest/pmetrictest/testdata/ignore-data-point-value-double-precision/actual.yaml b/pkg/pdatatest/pmetrictest/testdata/ignore-data-point-value-double-precision/actual.yaml new file mode 100644 index 000000000000..046dd763e6be --- /dev/null +++ b/pkg/pdatatest/pmetrictest/testdata/ignore-data-point-value-double-precision/actual.yaml @@ -0,0 +1,9 @@ +resourceMetrics: + - resource: {} + scopeMetrics: + - metrics: + - gauge: + dataPoints: + - asDouble: 654.321 + name: gauge.one + scope: {} diff --git a/pkg/pdatatest/pmetrictest/testdata/ignore-data-point-value-double-precision/expected.yaml b/pkg/pdatatest/pmetrictest/testdata/ignore-data-point-value-double-precision/expected.yaml new file mode 100644 index 000000000000..8472ce9e9ba2 --- /dev/null +++ b/pkg/pdatatest/pmetrictest/testdata/ignore-data-point-value-double-precision/expected.yaml @@ -0,0 +1,9 @@ +resourceMetrics: + - resource: {} + scopeMetrics: + - metrics: + - gauge: + dataPoints: + - asDouble: 654.32111 + name: gauge.one + scope: {} diff --git a/pkg/pdatatest/pmetrictest/testdata/ignore-data-points-order/actual.yaml b/pkg/pdatatest/pmetrictest/testdata/ignore-data-points-order/actual.yaml index 193291941507..e4b74fda14e1 100644 --- a/pkg/pdatatest/pmetrictest/testdata/ignore-data-points-order/actual.yaml +++ b/pkg/pdatatest/pmetrictest/testdata/ignore-data-points-order/actual.yaml @@ -184,4 +184,4 @@ resourceMetrics: timeUnixNano: "1653329645321022166" unit: By scope: - name: otelcol/aerospikereceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver diff --git a/pkg/pdatatest/pmetrictest/testdata/ignore-data-points-order/expected.yaml b/pkg/pdatatest/pmetrictest/testdata/ignore-data-points-order/expected.yaml index aa3e594596fb..657de0b97393 100644 --- a/pkg/pdatatest/pmetrictest/testdata/ignore-data-points-order/expected.yaml +++ b/pkg/pdatatest/pmetrictest/testdata/ignore-data-points-order/expected.yaml @@ -184,4 +184,4 @@ resourceMetrics: timeUnixNano: "1653329645321022166" unit: By scope: - name: otelcol/aerospikereceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver diff --git a/pkg/pdatatest/pmetrictest/testdata/ignore-metrics-order/actual.yaml b/pkg/pdatatest/pmetrictest/testdata/ignore-metrics-order/actual.yaml index aa3e594596fb..657de0b97393 100644 --- a/pkg/pdatatest/pmetrictest/testdata/ignore-metrics-order/actual.yaml +++ b/pkg/pdatatest/pmetrictest/testdata/ignore-metrics-order/actual.yaml @@ -184,4 +184,4 @@ resourceMetrics: timeUnixNano: "1653329645321022166" unit: By scope: - name: otelcol/aerospikereceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver diff --git a/pkg/pdatatest/pmetrictest/testdata/ignore-metrics-order/expected.yaml b/pkg/pdatatest/pmetrictest/testdata/ignore-metrics-order/expected.yaml index 5ec19414a69f..24523f779adf 100644 --- a/pkg/pdatatest/pmetrictest/testdata/ignore-metrics-order/expected.yaml +++ b/pkg/pdatatest/pmetrictest/testdata/ignore-metrics-order/expected.yaml @@ -184,4 +184,4 @@ resourceMetrics: isMonotonic: true unit: '{scans}' scope: - name: otelcol/aerospikereceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver diff --git a/pkg/pdatatest/pmetrictest/testdata/ignore-one-resource-attribute-multiple-resources/actual.yaml b/pkg/pdatatest/pmetrictest/testdata/ignore-one-resource-attribute-multiple-resources/actual.yaml index 34c3d8f4ab15..f2597137b454 100644 --- a/pkg/pdatatest/pmetrictest/testdata/ignore-one-resource-attribute-multiple-resources/actual.yaml +++ b/pkg/pdatatest/pmetrictest/testdata/ignore-one-resource-attribute-multiple-resources/actual.yaml @@ -187,7 +187,7 @@ resourceMetrics: isMonotonic: true unit: '{scans}' scope: - name: otelcol/aerospikereceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver - resource: attributes: - key: namespace @@ -376,7 +376,7 @@ resourceMetrics: isMonotonic: true unit: '{scans}' scope: - name: otelcol/aerospikereceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver - resource: attributes: - key: namespace @@ -565,4 +565,4 @@ resourceMetrics: isMonotonic: true unit: '{scans}' scope: - name: otelcol/aerospikereceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver diff --git a/pkg/pdatatest/pmetrictest/testdata/ignore-one-resource-attribute-multiple-resources/expected.yaml b/pkg/pdatatest/pmetrictest/testdata/ignore-one-resource-attribute-multiple-resources/expected.yaml index 1b3f78aa394b..d254b3a0a9ab 100644 --- a/pkg/pdatatest/pmetrictest/testdata/ignore-one-resource-attribute-multiple-resources/expected.yaml +++ b/pkg/pdatatest/pmetrictest/testdata/ignore-one-resource-attribute-multiple-resources/expected.yaml @@ -187,7 +187,7 @@ resourceMetrics: isMonotonic: true unit: '{scans}' scope: - name: otelcol/aerospikereceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver - resource: attributes: - key: namespace @@ -376,7 +376,7 @@ resourceMetrics: isMonotonic: true unit: '{scans}' scope: - name: otelcol/aerospikereceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver - resource: attributes: - key: namespace @@ -565,4 +565,4 @@ resourceMetrics: isMonotonic: true unit: '{scans}' scope: - name: otelcol/aerospikereceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver diff --git a/pkg/pdatatest/pmetrictest/testdata/ignore-one-resource-attribute/actual.yaml b/pkg/pdatatest/pmetrictest/testdata/ignore-one-resource-attribute/actual.yaml index caef02fd8006..0a53d0b15d92 100644 --- a/pkg/pdatatest/pmetrictest/testdata/ignore-one-resource-attribute/actual.yaml +++ b/pkg/pdatatest/pmetrictest/testdata/ignore-one-resource-attribute/actual.yaml @@ -101,4 +101,4 @@ resourceMetrics: timeUnixNano: "1652734556334562000" unit: '{connections}' scope: - name: otelcol/aerospikereceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver diff --git a/pkg/pdatatest/pmetrictest/testdata/ignore-one-resource-attribute/expected.yaml b/pkg/pdatatest/pmetrictest/testdata/ignore-one-resource-attribute/expected.yaml index f1d17907d81d..f487c23a2532 100644 --- a/pkg/pdatatest/pmetrictest/testdata/ignore-one-resource-attribute/expected.yaml +++ b/pkg/pdatatest/pmetrictest/testdata/ignore-one-resource-attribute/expected.yaml @@ -101,4 +101,4 @@ resourceMetrics: timeUnixNano: "1652734556334562000" unit: '{connections}' scope: - name: otelcol/aerospikereceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver diff --git a/pkg/pdatatest/pmetrictest/testdata/ignore-resource-order/actual.yaml b/pkg/pdatatest/pmetrictest/testdata/ignore-resource-order/actual.yaml index 1c7f182467c9..62ebd8ac4810 100644 --- a/pkg/pdatatest/pmetrictest/testdata/ignore-resource-order/actual.yaml +++ b/pkg/pdatatest/pmetrictest/testdata/ignore-resource-order/actual.yaml @@ -184,7 +184,7 @@ resourceMetrics: isMonotonic: true unit: '{scans}' scope: - name: otelcol/aerospikereceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver - resource: attributes: - key: node_id @@ -370,7 +370,7 @@ resourceMetrics: isMonotonic: true unit: '{scans}' scope: - name: otelcol/aerospikereceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver - resource: attributes: - key: node_id @@ -556,4 +556,4 @@ resourceMetrics: isMonotonic: true unit: '{scans}' scope: - name: otelcol/aerospikereceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver diff --git a/pkg/pdatatest/pmetrictest/testdata/ignore-resource-order/expected.yaml b/pkg/pdatatest/pmetrictest/testdata/ignore-resource-order/expected.yaml index 1ce7e5afd58f..65430a9beaed 100644 --- a/pkg/pdatatest/pmetrictest/testdata/ignore-resource-order/expected.yaml +++ b/pkg/pdatatest/pmetrictest/testdata/ignore-resource-order/expected.yaml @@ -184,7 +184,7 @@ resourceMetrics: isMonotonic: true unit: '{scans}' scope: - name: otelcol/aerospikereceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver - resource: attributes: - key: node_id @@ -370,7 +370,7 @@ resourceMetrics: isMonotonic: true unit: '{scans}' scope: - name: otelcol/aerospikereceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver - resource: attributes: - key: node_id @@ -556,4 +556,4 @@ resourceMetrics: isMonotonic: true unit: '{scans}' scope: - name: otelcol/aerospikereceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver diff --git a/pkg/pdatatest/pmetrictest/testdata/match-one-resource-attribute/actual.yaml b/pkg/pdatatest/pmetrictest/testdata/match-one-resource-attribute/actual.yaml index caef02fd8006..0a53d0b15d92 100644 --- a/pkg/pdatatest/pmetrictest/testdata/match-one-resource-attribute/actual.yaml +++ b/pkg/pdatatest/pmetrictest/testdata/match-one-resource-attribute/actual.yaml @@ -101,4 +101,4 @@ resourceMetrics: timeUnixNano: "1652734556334562000" unit: '{connections}' scope: - name: otelcol/aerospikereceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver diff --git a/pkg/pdatatest/pmetrictest/testdata/match-one-resource-attribute/expected.yaml b/pkg/pdatatest/pmetrictest/testdata/match-one-resource-attribute/expected.yaml index f1d17907d81d..f487c23a2532 100644 --- a/pkg/pdatatest/pmetrictest/testdata/match-one-resource-attribute/expected.yaml +++ b/pkg/pdatatest/pmetrictest/testdata/match-one-resource-attribute/expected.yaml @@ -101,4 +101,4 @@ resourceMetrics: timeUnixNano: "1652734556334562000" unit: '{connections}' scope: - name: otelcol/aerospikereceiver + name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/aerospikereceiver diff --git a/pkg/pdatatest/pprofiletest/options.go b/pkg/pdatatest/pprofiletest/options.go new file mode 100644 index 000000000000..17545953fa48 --- /dev/null +++ b/pkg/pdatatest/pprofiletest/options.go @@ -0,0 +1,215 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package pprofiletest // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/pprofiletest" + +import ( + "bytes" + "time" + + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/pprofile" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/internal" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil" +) + +// CompareProfilesOption can be used to mutate expected and/or actual profiles before comparing. +type CompareProfilesOption interface { + applyOnProfiles(expected, actual pprofile.Profiles) +} + +type compareProfilesOptionFunc func(expected, actual pprofile.Profiles) + +func (f compareProfilesOptionFunc) applyOnProfiles(expected, actual pprofile.Profiles) { + f(expected, actual) +} + +// IgnoreResourceAttributeValue is a CompareProfilesOption that removes a resource attribute +// from all resources. +func IgnoreResourceAttributeValue(attributeName string) CompareProfilesOption { + return ignoreResourceAttributeValue{ + attributeName: attributeName, + } +} + +type ignoreResourceAttributeValue struct { + attributeName string +} + +func (opt ignoreResourceAttributeValue) applyOnProfiles(expected, actual pprofile.Profiles) { + opt.maskProfilesResourceAttributeValue(expected) + opt.maskProfilesResourceAttributeValue(actual) +} + +func (opt ignoreResourceAttributeValue) maskProfilesResourceAttributeValue(profiles pprofile.Profiles) { + rls := profiles.ResourceProfiles() + for i := 0; i < rls.Len(); i++ { + internal.MaskResourceAttributeValue(rls.At(i).Resource(), opt.attributeName) + } +} + +// IgnoreResourceAttributeValue is a CompareProfilesOption that removes a resource attribute +// from all resources. +func IgnoreScopeAttributeValue(attributeName string) CompareProfilesOption { + return ignoreScopeAttributeValue{ + attributeName: attributeName, + } +} + +type ignoreScopeAttributeValue struct { + attributeName string +} + +func (opt ignoreScopeAttributeValue) applyOnProfiles(expected, actual pprofile.Profiles) { + opt.maskProfilesScopeAttributeValue(expected) + opt.maskProfilesScopeAttributeValue(actual) +} + +func (opt ignoreScopeAttributeValue) maskProfilesScopeAttributeValue(profiles pprofile.Profiles) { + rls := profiles.ResourceProfiles() + for i := 0; i < profiles.ResourceProfiles().Len(); i++ { + sls := rls.At(i).ScopeProfiles() + for j := 0; j < sls.Len(); j++ { + lr := sls.At(j) + val, exists := lr.Scope().Attributes().Get(opt.attributeName) + if exists { + val.SetEmptyBytes() + } + } + } +} + +// IgnoreProfileAttributeValue is a CompareProfilesOption that sets the value of an attribute +// to empty bytes for every profile +func IgnoreProfileAttributeValue(attributeName string) CompareProfilesOption { + return ignoreProfileAttributeValue{ + attributeName: attributeName, + } +} + +type ignoreProfileAttributeValue struct { + attributeName string +} + +func (opt ignoreProfileAttributeValue) applyOnProfiles(expected, actual pprofile.Profiles) { + opt.maskProfileAttributeValue(expected) + opt.maskProfileAttributeValue(actual) +} + +func (opt ignoreProfileAttributeValue) maskProfileAttributeValue(profiles pprofile.Profiles) { + rls := profiles.ResourceProfiles() + for i := 0; i < profiles.ResourceProfiles().Len(); i++ { + sls := rls.At(i).ScopeProfiles() + for j := 0; j < sls.Len(); j++ { + lrs := sls.At(j).Profiles() + for k := 0; k < lrs.Len(); k++ { + lr := lrs.At(k) + val, exists := lr.Attributes().Get(opt.attributeName) + if exists { + val.SetEmptyBytes() + } + } + } + } +} + +// IgnoreProfileTimestampValues is a CompareProfilesOption that sets the value of start timestamp +// and duration to empty bytes for every profile +func IgnoreProfileTimestampValues() CompareProfilesOption { + return ignoreProfileTimestampValues{} +} + +type ignoreProfileTimestampValues struct{} + +func (opt ignoreProfileTimestampValues) applyOnProfiles(expected, actual pprofile.Profiles) { + opt.maskProfileTimestampValues(expected) + opt.maskProfileTimestampValues(actual) +} + +func (opt ignoreProfileTimestampValues) maskProfileTimestampValues(profiles pprofile.Profiles) { + rls := profiles.ResourceProfiles() + for i := 0; i < profiles.ResourceProfiles().Len(); i++ { + sls := rls.At(i).ScopeProfiles() + for j := 0; j < sls.Len(); j++ { + lrs := sls.At(j).Profiles() + for k := 0; k < lrs.Len(); k++ { + lr := lrs.At(k) + lr.SetStartTime(pcommon.NewTimestampFromTime(time.Time{})) + lr.SetDuration(pcommon.NewTimestampFromTime(time.Time{})) + } + } + } +} + +// IgnoreResourceProfilesOrder is a CompareProfilesOption that ignores the order of resource traces/metrics/profiles. +func IgnoreResourceProfilesOrder() CompareProfilesOption { + return compareProfilesOptionFunc(func(expected, actual pprofile.Profiles) { + sortResourceProfilesSlice(expected.ResourceProfiles()) + sortResourceProfilesSlice(actual.ResourceProfiles()) + }) +} + +func sortResourceProfilesSlice(rls pprofile.ResourceProfilesSlice) { + rls.Sort(func(a, b pprofile.ResourceProfiles) bool { + if a.SchemaUrl() != b.SchemaUrl() { + return a.SchemaUrl() < b.SchemaUrl() + } + aAttrs := pdatautil.MapHash(a.Resource().Attributes()) + bAttrs := pdatautil.MapHash(b.Resource().Attributes()) + return bytes.Compare(aAttrs[:], bAttrs[:]) < 0 + }) +} + +// IgnoreScopeProfilesOrder is a CompareProfilesOption that ignores the order of instrumentation scope traces/metrics/profiles. +func IgnoreScopeProfilesOrder() CompareProfilesOption { + return compareProfilesOptionFunc(func(expected, actual pprofile.Profiles) { + sortScopeProfilesSlices(expected) + sortScopeProfilesSlices(actual) + }) +} + +func sortScopeProfilesSlices(ls pprofile.Profiles) { + for i := 0; i < ls.ResourceProfiles().Len(); i++ { + ls.ResourceProfiles().At(i).ScopeProfiles().Sort(func(a, b pprofile.ScopeProfiles) bool { + if a.SchemaUrl() != b.SchemaUrl() { + return a.SchemaUrl() < b.SchemaUrl() + } + if a.Scope().Name() != b.Scope().Name() { + return a.Scope().Name() < b.Scope().Name() + } + return a.Scope().Version() < b.Scope().Version() + }) + } +} + +// IgnoreProfilesOrder is a CompareProfilesOption that ignores the order of profile records. +func IgnoreProfilesOrder() CompareProfilesOption { + return compareProfilesOptionFunc(func(expected, actual pprofile.Profiles) { + sortProfileSlices(expected) + sortProfileSlices(actual) + }) +} + +func sortProfileSlices(ls pprofile.Profiles) { + for i := 0; i < ls.ResourceProfiles().Len(); i++ { + for j := 0; j < ls.ResourceProfiles().At(i).ScopeProfiles().Len(); j++ { + ls.ResourceProfiles().At(i).ScopeProfiles().At(j).Profiles().Sort(func(a, b pprofile.Profile) bool { + if a.StartTime() != b.StartTime() { + return a.StartTime() < b.StartTime() + } + if a.Duration() != b.Duration() { + return a.Duration() < b.Duration() + } + as := a.ProfileID() + bs := b.ProfileID() + if !bytes.Equal(as[:], bs[:]) { + return bytes.Compare(as[:], bs[:]) < 0 + } + aAttrs := pdatautil.MapHash(a.Attributes()) + bAttrs := pdatautil.MapHash(b.Attributes()) + return bytes.Compare(aAttrs[:], bAttrs[:]) < 0 + }) + } + } +} diff --git a/pkg/pdatatest/pprofiletest/package_test.go b/pkg/pdatatest/pprofiletest/package_test.go new file mode 100644 index 000000000000..453a8bc92eb6 --- /dev/null +++ b/pkg/pdatatest/pprofiletest/package_test.go @@ -0,0 +1,14 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package pprofiletest + +import ( + "testing" + + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + goleak.VerifyTestMain(m) +} diff --git a/pkg/pdatatest/pprofiletest/profiles.go b/pkg/pdatatest/pprofiletest/profiles.go new file mode 100644 index 000000000000..dc1222b8e4d0 --- /dev/null +++ b/pkg/pdatatest/pprofiletest/profiles.go @@ -0,0 +1,858 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package pprofiletest // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/pprofiletest" + +import ( + "bytes" + "fmt" + "reflect" + + "go.opentelemetry.io/collector/pdata/pprofile" + "go.uber.org/multierr" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/internal" +) + +// CompareProfiles compares each part of two given Profiles and returns +// an error if they don't match. The error describes what didn't match. +func CompareProfiles(expected, actual pprofile.Profiles, options ...CompareProfilesOption) error { + exp, act := pprofile.NewProfiles(), pprofile.NewProfiles() + expected.CopyTo(exp) + actual.CopyTo(act) + + for _, option := range options { + option.applyOnProfiles(exp, act) + } + + if exp.IsReadOnly() != act.IsReadOnly() { + return fmt.Errorf("readOnly state differs from expected '%t'", exp.IsReadOnly()) + } + + if exp.SampleCount() != act.SampleCount() { + return fmt.Errorf("sample count state differs from expected '%d', actual '%d'", exp.SampleCount(), act.SampleCount()) + } + + expectedProfiles, actualProfiles := exp.ResourceProfiles(), act.ResourceProfiles() + if expectedProfiles.Len() != actualProfiles.Len() { + return fmt.Errorf("number of resources doesn't match expected: %d, actual: %d", + expectedProfiles.Len(), actualProfiles.Len()) + } + + numResources := expectedProfiles.Len() + + // Keep track of matching resources so that each can only be matched once + matchingResources := make(map[pprofile.ResourceProfiles]pprofile.ResourceProfiles, numResources) + + var errs error + var outOfOrderErrs error + for e := 0; e < numResources; e++ { + er := expectedProfiles.At(e) + var foundMatch bool + for a := 0; a < numResources; a++ { + ar := actualProfiles.At(a) + if _, ok := matchingResources[ar]; ok { + continue + } + if reflect.DeepEqual(er.Resource().Attributes().AsRaw(), ar.Resource().Attributes().AsRaw()) { + foundMatch = true + matchingResources[ar] = er + if e != a { + outOfOrderErrs = multierr.Append(outOfOrderErrs, + fmt.Errorf(`resources are out of order: resource "%v" expected at index %d, found at index %d`, + er.Resource().Attributes().AsRaw(), e, a)) + } + break + } + } + if !foundMatch { + errs = multierr.Append(errs, fmt.Errorf("missing expected resource: %v", er.Resource().Attributes().AsRaw())) + } + } + + for i := 0; i < numResources; i++ { + if _, ok := matchingResources[actualProfiles.At(i)]; !ok { + errs = multierr.Append(errs, fmt.Errorf("unexpected resource: %v", actualProfiles.At(i).Resource().Attributes().AsRaw())) + } + } + + if errs != nil { + return errs + } + if outOfOrderErrs != nil { + return outOfOrderErrs + } + + for ar, er := range matchingResources { + errPrefix := fmt.Sprintf(`resource "%v"`, er.Resource().Attributes().AsRaw()) + errs = multierr.Append(errs, internal.AddErrPrefix(errPrefix, CompareResourceProfiles(er, ar))) + } + + return errs +} + +// CompareResourceProfiles compares each part of two given ResourceProfiles and returns +// an error if they don't match. The error describes what didn't match. +func CompareResourceProfiles(expected, actual pprofile.ResourceProfiles) error { + errs := multierr.Combine( + internal.CompareResource(expected.Resource(), actual.Resource()), + internal.CompareSchemaURL(expected.SchemaUrl(), actual.SchemaUrl()), + ) + + esls := expected.ScopeProfiles() + asls := actual.ScopeProfiles() + + if esls.Len() != asls.Len() { + errs = multierr.Append(errs, fmt.Errorf("number of scopes doesn't match expected: %d, actual: %d", esls.Len(), + asls.Len())) + return errs + } + + numScopeProfiles := esls.Len() + + // Keep track of matching scope profiles so that each container can only be matched once + matchingScopeProfiles := make(map[pprofile.ScopeProfiles]pprofile.ScopeProfiles, numScopeProfiles) + + var outOfOrderErrs error + for e := 0; e < numScopeProfiles; e++ { + esl := expected.ScopeProfiles().At(e) + var foundMatch bool + for a := 0; a < numScopeProfiles; a++ { + asl := actual.ScopeProfiles().At(a) + if _, ok := matchingScopeProfiles[asl]; ok { + continue + } + if esl.Scope().Name() == asl.Scope().Name() { + foundMatch = true + matchingScopeProfiles[asl] = esl + if e != a { + outOfOrderErrs = multierr.Append(outOfOrderErrs, + fmt.Errorf("scopes are out of order: scope %s expected at index %d, found at index %d", + esl.Scope().Name(), e, a)) + } + break + } + } + if !foundMatch { + errs = multierr.Append(errs, fmt.Errorf("missing expected scope: %s", esl.Scope().Name())) + } + } + + for i := 0; i < numScopeProfiles; i++ { + if _, ok := matchingScopeProfiles[actual.ScopeProfiles().At(i)]; !ok { + errs = multierr.Append(errs, fmt.Errorf("unexpected scope: %s", actual.ScopeProfiles().At(i).Scope().Name())) + } + } + + if errs != nil { + return errs + } + if outOfOrderErrs != nil { + return outOfOrderErrs + } + + for i := 0; i < esls.Len(); i++ { + errPrefix := fmt.Sprintf(`scope "%s"`, esls.At(i).Scope().Name()) + errs = multierr.Append(errs, internal.AddErrPrefix(errPrefix, CompareScopeProfiles(esls.At(i), asls.At(i)))) + } + + return errs +} + +// CompareScopeProfiles compares each part of two given ProfilesSlices and returns +// an error if they don't match. The error describes what didn't match. +func CompareScopeProfiles(expected, actual pprofile.ScopeProfiles) error { + errs := multierr.Combine( + internal.CompareInstrumentationScope(expected.Scope(), actual.Scope()), + internal.CompareSchemaURL(expected.SchemaUrl(), actual.SchemaUrl()), + ) + + if expected.Profiles().Len() != actual.Profiles().Len() { + errs = multierr.Append(errs, fmt.Errorf("number of profiles doesn't match expected: %d, actual: %d", + expected.Profiles().Len(), actual.Profiles().Len())) + return errs + } + + numProfiles := expected.Profiles().Len() + + // Keep track of matching containers so that each container can only be matched once + matchingProfiles := make(map[pprofile.Profile]pprofile.Profile, numProfiles) + + var outOfOrderErrs error + for e := 0; e < numProfiles; e++ { + elr := expected.Profiles().At(e) + var foundMatch bool + for a := 0; a < numProfiles; a++ { + alr := actual.Profiles().At(a) + if _, ok := matchingProfiles[alr]; ok { + continue + } + if reflect.DeepEqual(elr.Attributes().AsRaw(), alr.Attributes().AsRaw()) { + foundMatch = true + matchingProfiles[alr] = elr + if e != a { + outOfOrderErrs = multierr.Append(outOfOrderErrs, + fmt.Errorf(`profiles are out of order: profile "%v" expected at index %d, found at index %d`, + elr.Attributes().AsRaw(), e, a)) + } + break + } + } + if !foundMatch { + errs = multierr.Append(errs, fmt.Errorf("missing expected profile: %v", elr.Attributes().AsRaw())) + } + } + + for i := 0; i < numProfiles; i++ { + if _, ok := matchingProfiles[actual.Profiles().At(i)]; !ok { + errs = multierr.Append(errs, fmt.Errorf("unexpected profile: %v", + actual.Profiles().At(i).Attributes().AsRaw())) + } + } + + if errs != nil { + return errs + } + if outOfOrderErrs != nil { + return outOfOrderErrs + } + + for alr, elr := range matchingProfiles { + errPrefix := fmt.Sprintf(`profile "%v"`, elr.Attributes().AsRaw()) + errs = multierr.Append(errs, internal.AddErrPrefix(errPrefix, CompareProfile(elr, alr))) + } + return errs +} + +func CompareProfile(expected, actual pprofile.Profile) error { + errs := multierr.Combine( + internal.CompareAttributes(expected.Attributes(), actual.Attributes()), + internal.CompareDroppedAttributesCount(expected.DroppedAttributesCount(), actual.DroppedAttributesCount()), + ) + + if expected.ProfileID().String() != actual.ProfileID().String() { + errs = multierr.Append(errs, fmt.Errorf("profileID does not match expected '%s', actual '%s'", expected.ProfileID().String(), actual.ProfileID().String())) + } + + if expected.StartTime() != actual.StartTime() { + errs = multierr.Append(errs, fmt.Errorf("start timestamp doesn't match expected: %d, "+"actual: %d", expected.StartTime(), actual.StartTime())) + } + + if !reflect.DeepEqual(expected.LocationIndices(), actual.LocationIndices()) { + errs = multierr.Append(errs, fmt.Errorf("locationIndicies do not match expected")) + } + + if !reflect.DeepEqual(expected.CommentStrindices(), actual.CommentStrindices()) { + errs = multierr.Append(errs, fmt.Errorf("comment does not match expected")) + } + + if expected.Time() != actual.Time() { + errs = multierr.Append(errs, fmt.Errorf("time doesn't match expected: %d, actual: %d", expected.Time(), actual.Time())) + } + + if !reflect.DeepEqual(expected.StringTable(), actual.StringTable()) { + errs = multierr.Append(errs, fmt.Errorf("stringTable does not match expected")) + } + + if expected.OriginalPayloadFormat() != actual.OriginalPayloadFormat() { + errs = multierr.Append(errs, fmt.Errorf("originalPayloadFormat does not match expected '%s', actual '%s'", expected.OriginalPayloadFormat(), actual.OriginalPayloadFormat())) + } + + if !bytes.Equal(expected.OriginalPayload().AsRaw(), actual.OriginalPayload().AsRaw()) { + errs = multierr.Append(errs, fmt.Errorf("keepFrames does not match expected '%s', actual '%s'", expected.OriginalPayload().AsRaw(), actual.OriginalPayload().AsRaw())) + } + + if expected.StartTime() != actual.StartTime() { + errs = multierr.Append(errs, fmt.Errorf("startTime doesn't match expected: %d, actual: %d", expected.StartTime(), actual.StartTime())) + } + + if expected.Duration() != actual.Duration() { + errs = multierr.Append(errs, fmt.Errorf("duration doesn't match expected: %d, actual: %d", expected.Duration(), actual.Duration())) + } + + if expected.Period() != actual.Period() { + errs = multierr.Append(errs, fmt.Errorf("period does not match expected '%d', actual '%d'", expected.Period(), actual.Period())) + } + + if expected.DefaultSampleTypeStrindex() != actual.DefaultSampleTypeStrindex() { + errs = multierr.Append(errs, fmt.Errorf("defaultSampleType does not match expected '%d', actual '%d'", expected.DefaultSampleTypeStrindex(), actual.DefaultSampleTypeStrindex())) + } + + if expected.PeriodType().TypeStrindex() != actual.PeriodType().TypeStrindex() || + expected.PeriodType().UnitStrindex() != actual.PeriodType().UnitStrindex() || + expected.PeriodType().AggregationTemporality() != actual.PeriodType().AggregationTemporality() { + errs = multierr.Append(errs, fmt.Errorf("periodType does not match expected 'unit: %d, type: %d, aggregationTemporality: %d', actual 'unit: %d, type: %d,"+ + "aggregationTemporality: %d'", expected.PeriodType().UnitStrindex(), expected.PeriodType().TypeStrindex(), expected.PeriodType().AggregationTemporality(), + actual.PeriodType().UnitStrindex(), actual.PeriodType().TypeStrindex(), actual.PeriodType().AggregationTemporality())) + } + + errs = multierr.Append(errs, internal.AddErrPrefix("sampleType", CompareProfileValueTypeSlice(expected.SampleType(), actual.SampleType()))) + + errs = multierr.Append(errs, internal.AddErrPrefix("sample", CompareProfileSampleSlice(expected.Sample(), actual.Sample()))) + + errs = multierr.Append(errs, internal.AddErrPrefix("mapping", CompareProfileMappingSlice(expected.MappingTable(), actual.MappingTable()))) + + errs = multierr.Append(errs, internal.AddErrPrefix("location", CompareProfileLocationSlice(expected.LocationTable(), actual.LocationTable()))) + + errs = multierr.Append(errs, internal.AddErrPrefix("function", CompareProfileFunctionSlice(expected.FunctionTable(), actual.FunctionTable()))) + + errs = multierr.Append(errs, internal.AddErrPrefix("attributeUnits", CompareProfileAttributeUnitSlice(expected.AttributeUnits(), actual.AttributeUnits()))) + + errs = multierr.Append(errs, internal.AddErrPrefix("linkTable", CompareProfileLinkSlice(expected.LinkTable(), actual.LinkTable()))) + + return errs +} + +func CompareProfileValueTypeSlice(expected, actual pprofile.ValueTypeSlice) error { + var errs error + if expected.Len() != actual.Len() { + errs = multierr.Append(errs, fmt.Errorf("number of valueTypes doesn't match expected: %d, actual: %d", + expected.Len(), actual.Len())) + return errs + } + + numValueTypes := expected.Len() + + matchingValueTypes := make(map[pprofile.ValueType]pprofile.ValueType, numValueTypes) + + var outOfOrderErrs error + for e := 0; e < numValueTypes; e++ { + elr := expected.At(e) + var foundMatch bool + for a := 0; a < numValueTypes; a++ { + alr := actual.At(a) + if _, ok := matchingValueTypes[alr]; ok { + continue + } + if elr.TypeStrindex() == alr.TypeStrindex() && elr.UnitStrindex() == alr.UnitStrindex() { + foundMatch = true + matchingValueTypes[alr] = elr + if e != a { + outOfOrderErrs = multierr.Append(outOfOrderErrs, + fmt.Errorf(`valueTypes are out of order: valueType "unit: %d, type: %d, aggregationTemporality: %d" expected at index %d, found at index %d`, + elr.UnitStrindex(), elr.TypeStrindex(), elr.AggregationTemporality(), e, a)) + } + break + } + } + if !foundMatch { + errs = multierr.Append(errs, fmt.Errorf(`missing expected valueType "unit: %d, type: %d, aggregationTemporality: %d"`, elr.UnitStrindex(), elr.TypeStrindex(), elr.AggregationTemporality())) + } + } + + for i := 0; i < numValueTypes; i++ { + if _, ok := matchingValueTypes[actual.At(i)]; !ok { + errs = multierr.Append(errs, fmt.Errorf(`unexpected valueType "unit: %d, type: %d, aggregationTemporality: %d"`, + actual.At(i).UnitStrindex(), actual.At(i).TypeStrindex(), actual.At(i).AggregationTemporality())) + } + } + + if errs != nil { + return errs + } + if outOfOrderErrs != nil { + return outOfOrderErrs + } + + for alr, elr := range matchingValueTypes { + if !isValueTypeEqual(elr, alr) { + errs = multierr.Append(errs, fmt.Errorf(`expected valueType "unit: %d, type: %d, aggregationTemporality: %d",`+ + `got "unit: %d, type: %d, aggregationTemporality: %d"`, elr.UnitStrindex(), elr.TypeStrindex(), elr.AggregationTemporality(), + alr.UnitStrindex(), alr.TypeStrindex(), alr.AggregationTemporality())) + } + } + + return errs +} + +func isValueTypeEqual(expected, actual pprofile.ValueType) bool { + return expected.TypeStrindex() == actual.TypeStrindex() && + expected.UnitStrindex() == actual.UnitStrindex() && + expected.AggregationTemporality() == actual.AggregationTemporality() +} + +func CompareProfileSampleSlice(expected, actual pprofile.SampleSlice) error { + var errs error + if expected.Len() != actual.Len() { + errs = multierr.Append(errs, fmt.Errorf("number of samples doesn't match expected: %d, actual: %d", + expected.Len(), actual.Len())) + return errs + } + + numSlice := expected.Len() + + matchingItems := make(map[pprofile.Sample]pprofile.Sample, numSlice) + + var outOfOrderErrs error + for e := 0; e < numSlice; e++ { + elr := expected.At(e) + var foundMatch bool + for a := 0; a < numSlice; a++ { + alr := actual.At(a) + if _, ok := matchingItems[alr]; ok { + continue + } + if reflect.DeepEqual(elr.AttributeIndices().AsRaw(), alr.AttributeIndices().AsRaw()) { + foundMatch = true + matchingItems[alr] = elr + if e != a { + outOfOrderErrs = multierr.Append(outOfOrderErrs, + fmt.Errorf(`samples are out of order: sample "attributes: %v" expected at index %d, found at index %d`, + elr.AttributeIndices().AsRaw(), e, a)) + } + break + } + } + if !foundMatch { + errs = multierr.Append(errs, fmt.Errorf(`missing expected sample "attributes: %v"`, elr.AttributeIndices().AsRaw())) + } + } + + for i := 0; i < numSlice; i++ { + if _, ok := matchingItems[actual.At(i)]; !ok { + errs = multierr.Append(errs, fmt.Errorf(`unexpected sample "attributes: %v"`, + actual.At(i).AttributeIndices().AsRaw())) + } + } + + if errs != nil { + return errs + } + if outOfOrderErrs != nil { + return outOfOrderErrs + } + + for alr, elr := range matchingItems { + errPrefix := fmt.Sprintf(`sample "attributes: %v"`, elr.AttributeIndices().AsRaw()) + errs = multierr.Append(errs, internal.AddErrPrefix(errPrefix, CompareProfileSample(elr, alr))) + } + + return errs +} + +func CompareProfileSample(expected, actual pprofile.Sample) error { + var errs error + if expected.LocationsStartIndex() != actual.LocationsStartIndex() { + errs = multierr.Append(errs, fmt.Errorf("expected locationStartIndex '%d', got '%d'", expected.LocationsStartIndex(), actual.LocationsStartIndex())) + } + + if expected.LocationsLength() != actual.LocationsLength() { + errs = multierr.Append(errs, fmt.Errorf("expected locationLenght '%d', got '%d'", expected.LocationsLength(), actual.LocationsLength())) + } + + if !reflect.DeepEqual(expected.TimestampsUnixNano().AsRaw(), actual.TimestampsUnixNano().AsRaw()) { + errs = multierr.Append(errs, fmt.Errorf("expected timestampUnixNano '%v', got '%v'", expected.TimestampsUnixNano().AsRaw(), actual.TimestampsUnixNano().AsRaw())) + } + + if !reflect.DeepEqual(expected.Value().AsRaw(), actual.Value().AsRaw()) { + errs = multierr.Append(errs, fmt.Errorf("expected value '%v', got '%v'", expected.Value().AsRaw(), actual.Value().AsRaw())) + } + + if !reflect.DeepEqual(expected.TimestampsUnixNano().AsRaw(), actual.TimestampsUnixNano().AsRaw()) { + errs = multierr.Append(errs, fmt.Errorf("expected timestampUnixNano '%v', got '%v'", expected.TimestampsUnixNano().AsRaw(), actual.TimestampsUnixNano().AsRaw())) + } + + if !reflect.DeepEqual(expected.AttributeIndices().AsRaw(), actual.AttributeIndices().AsRaw()) { + errs = multierr.Append(errs, fmt.Errorf("expected attributes '%v', got '%v'", expected.AttributeIndices().AsRaw(), actual.AttributeIndices().AsRaw())) + } + + return errs +} + +func CompareProfileMappingSlice(expected, actual pprofile.MappingSlice) error { + var errs error + if expected.Len() != actual.Len() { + errs = multierr.Append(errs, fmt.Errorf("number of mappings doesn't match expected: %d, actual: %d", + expected.Len(), actual.Len())) + return errs + } + + numItems := expected.Len() + + matchingItems := make(map[pprofile.Mapping]pprofile.Mapping, numItems) + + var outOfOrderErrs error + for e := 0; e < numItems; e++ { + elr := expected.At(e) + var foundMatch bool + for a := 0; a < numItems; a++ { + alr := actual.At(a) + if _, ok := matchingItems[alr]; ok { + continue + } + if reflect.DeepEqual(elr.AttributeIndices().AsRaw(), alr.AttributeIndices().AsRaw()) { + foundMatch = true + matchingItems[alr] = elr + if e != a { + outOfOrderErrs = multierr.Append(outOfOrderErrs, + fmt.Errorf(`mappings are out of order: mapping "attributes: %v" expected at index %d, found at index %d`, + elr.AttributeIndices().AsRaw(), e, a)) + } + break + } + } + if !foundMatch { + errs = multierr.Append(errs, fmt.Errorf(`missing expected mapping "attributes: %v"`, elr.AttributeIndices().AsRaw())) + } + } + + for i := 0; i < numItems; i++ { + if _, ok := matchingItems[actual.At(i)]; !ok { + errs = multierr.Append(errs, fmt.Errorf(`unexpected profile mapping "attributes: %v"`, + actual.At(i).AttributeIndices().AsRaw())) + } + } + + if errs != nil { + return errs + } + if outOfOrderErrs != nil { + return outOfOrderErrs + } + + for alr, elr := range matchingItems { + if !isMappingEqual(elr, alr) { + errs = multierr.Append(errs, fmt.Errorf(`mapping with "attributes: %v", does not match expected`, + alr.AttributeIndices().AsRaw())) + } + } + + return errs +} + +func isMappingEqual(expected, actual pprofile.Mapping) bool { + return expected.MemoryStart() == actual.MemoryStart() && + expected.MemoryLimit() == actual.MemoryLimit() && + expected.FileOffset() == actual.FileOffset() && + expected.FilenameStrindex() == actual.FilenameStrindex() && + reflect.DeepEqual(expected.AttributeIndices().AsRaw(), actual.AttributeIndices().AsRaw()) && + expected.HasFunctions() == actual.HasFunctions() && + expected.HasFilenames() == actual.HasFilenames() && + expected.HasLineNumbers() == actual.HasLineNumbers() && + expected.HasInlineFrames() == actual.HasInlineFrames() +} + +func CompareProfileFunctionSlice(expected, actual pprofile.FunctionSlice) error { + var errs error + if expected.Len() != actual.Len() { + errs = multierr.Append(errs, fmt.Errorf("number of functions doesn't match expected: %d, actual: %d", + expected.Len(), actual.Len())) + return errs + } + + numItems := expected.Len() + + matchingItems := make(map[pprofile.Function]pprofile.Function, numItems) + + var outOfOrderErrs error + for e := 0; e < numItems; e++ { + elr := expected.At(e) + var foundMatch bool + for a := 0; a < numItems; a++ { + alr := actual.At(a) + if _, ok := matchingItems[alr]; ok { + continue + } + if elr.NameStrindex() == alr.NameStrindex() { + foundMatch = true + matchingItems[alr] = elr + if e != a { + outOfOrderErrs = multierr.Append(outOfOrderErrs, + fmt.Errorf(`functions are out of order: function "name: %d" expected at index %d, found at index %d`, + elr.NameStrindex(), e, a)) + } + break + } + } + if !foundMatch { + errs = multierr.Append(errs, fmt.Errorf(`missing expected function "name: %d"`, elr.NameStrindex())) + } + } + + for i := 0; i < numItems; i++ { + if _, ok := matchingItems[actual.At(i)]; !ok { + errs = multierr.Append(errs, fmt.Errorf(`unexpected profile function "name: %d"`, + actual.At(i).NameStrindex())) + } + } + + if errs != nil { + return errs + } + if outOfOrderErrs != nil { + return outOfOrderErrs + } + + for alr, elr := range matchingItems { + if !isFunctionEqual(elr, alr) { + errs = multierr.Append(errs, fmt.Errorf(`function with "name: %d" does not match expected`, alr.NameStrindex())) + } + } + + return errs +} + +func isFunctionEqual(expected, actual pprofile.Function) bool { + return expected.NameStrindex() == actual.NameStrindex() && + expected.SystemNameStrindex() == actual.SystemNameStrindex() && + expected.StartLine() == actual.StartLine() && + expected.FilenameStrindex() == actual.FilenameStrindex() +} + +func CompareProfileLocationSlice(expected, actual pprofile.LocationSlice) error { + var errs error + if expected.Len() != actual.Len() { + errs = multierr.Append(errs, fmt.Errorf("number of locations doesn't match expected: %d, actual: %d", + expected.Len(), actual.Len())) + return errs + } + + numItems := expected.Len() + + matchingItems := make(map[pprofile.Location]pprofile.Location, numItems) + + var outOfOrderErrs error + for e := 0; e < numItems; e++ { + elr := expected.At(e) + var foundMatch bool + for a := 0; a < numItems; a++ { + alr := actual.At(a) + if _, ok := matchingItems[alr]; ok { + continue + } + if reflect.DeepEqual(elr.AttributeIndices().AsRaw(), alr.AttributeIndices().AsRaw()) { + foundMatch = true + matchingItems[alr] = elr + if e != a { + outOfOrderErrs = multierr.Append(outOfOrderErrs, + fmt.Errorf(`locations are out of order: location "attributes: %v" expected at index %d, found at index %d`, + elr.AttributeIndices().AsRaw(), e, a)) + } + break + } + } + if !foundMatch { + errs = multierr.Append(errs, fmt.Errorf(`missing expected location "attributes: %v"`, elr.AttributeIndices().AsRaw())) + } + } + + for i := 0; i < numItems; i++ { + if _, ok := matchingItems[actual.At(i)]; !ok { + errs = multierr.Append(errs, fmt.Errorf(`unexpected location "attributes: %v"`, + actual.At(i).AttributeIndices().AsRaw())) + } + } + + if errs != nil { + return errs + } + if outOfOrderErrs != nil { + return outOfOrderErrs + } + + for alr, elr := range matchingItems { + errPrefix := fmt.Sprintf(`location "attributes: %v"`, elr.AttributeIndices().AsRaw()) + errs = multierr.Append(errs, internal.AddErrPrefix(errPrefix, CompareProfileLocation(elr, alr))) + } + + return errs +} + +func CompareProfileLocation(expected, actual pprofile.Location) error { + var errs error + + if expected.MappingIndex() != actual.MappingIndex() { + errs = multierr.Append(errs, fmt.Errorf("expected mappingIndex '%d', got '%d'", expected.MappingIndex(), actual.MappingIndex())) + } + + if expected.Address() != actual.Address() { + errs = multierr.Append(errs, fmt.Errorf("expected address '%d', got '%d'", expected.Address(), actual.Address())) + } + + if expected.IsFolded() != actual.IsFolded() { + errs = multierr.Append(errs, fmt.Errorf("expected isFolded '%v', got '%v'", expected.IsFolded(), actual.IsFolded())) + } + + if !reflect.DeepEqual(expected.AttributeIndices().AsRaw(), actual.AttributeIndices().AsRaw()) { + errs = multierr.Append(errs, fmt.Errorf("expected attributes '%v', got '%v'", expected.AttributeIndices().AsRaw(), actual.AttributeIndices().AsRaw())) + } + + errPrefix := fmt.Sprintf(`line of location with "attributes: %v"`, expected.AttributeIndices().AsRaw()) + errs = multierr.Append(errs, internal.AddErrPrefix(errPrefix, CompareProfileLineSlice(expected.Line(), actual.Line()))) + + return errs +} + +func CompareProfileLineSlice(expected, actual pprofile.LineSlice) error { + var errs error + if expected.Len() != actual.Len() { + errs = multierr.Append(errs, fmt.Errorf("number of lines doesn't match expected: %d, actual: %d", + expected.Len(), actual.Len())) + return errs + } + + numItems := expected.Len() + + matchingItems := make(map[pprofile.Line]pprofile.Line, numItems) + + var outOfOrderErrs error + for e := 0; e < numItems; e++ { + elr := expected.At(e) + var foundMatch bool + for a := 0; a < numItems; a++ { + alr := actual.At(a) + if _, ok := matchingItems[alr]; ok { + continue + } + if elr.FunctionIndex() == alr.FunctionIndex() { + foundMatch = true + matchingItems[alr] = elr + if e != a { + outOfOrderErrs = multierr.Append(outOfOrderErrs, + fmt.Errorf(`lines are out of order: line "functionIndex: %d" expected at index %d, found at index %d`, + elr.FunctionIndex(), e, a)) + } + break + } + } + if !foundMatch { + errs = multierr.Append(errs, fmt.Errorf(`missing expected line "functionIndex: %d"`, elr.FunctionIndex())) + } + } + + for i := 0; i < numItems; i++ { + if _, ok := matchingItems[actual.At(i)]; !ok { + errs = multierr.Append(errs, fmt.Errorf(`unexpected profile line "functionIndex: %d"`, + actual.At(i).FunctionIndex())) + } + } + + if errs != nil { + return errs + } + if outOfOrderErrs != nil { + return outOfOrderErrs + } + + for alr, elr := range matchingItems { + if !isLineEqual(elr, alr) { + errs = multierr.Append(errs, fmt.Errorf(`line with "functionIndex: %d" does not match expected`, alr.FunctionIndex())) + } + } + + return errs +} + +func isLineEqual(expected, actual pprofile.Line) bool { + return expected.FunctionIndex() == actual.FunctionIndex() && + expected.Line() == actual.Line() && + expected.Column() == actual.Column() +} + +func CompareProfileAttributeUnitSlice(expected, actual pprofile.AttributeUnitSlice) error { + var errs error + if expected.Len() != actual.Len() { + errs = multierr.Append(errs, fmt.Errorf("number of attributeUnits doesn't match expected: %d, actual: %d", + expected.Len(), actual.Len())) + return errs + } + + numItems := expected.Len() + + matchingItems := make(map[pprofile.AttributeUnit]pprofile.AttributeUnit, numItems) + + var outOfOrderErrs error + for e := 0; e < numItems; e++ { + elr := expected.At(e) + var foundMatch bool + for a := 0; a < numItems; a++ { + alr := actual.At(a) + if _, ok := matchingItems[alr]; ok { + continue + } + if elr.AttributeKeyStrindex() == alr.AttributeKeyStrindex() && elr.UnitStrindex() == alr.UnitStrindex() { + foundMatch = true + matchingItems[alr] = elr + if e != a { + outOfOrderErrs = multierr.Append(outOfOrderErrs, + fmt.Errorf(`attributeUnits are out of order: attributeUnit "attributeKey: %d" expected at index %d, found at index %d`, + elr.AttributeKeyStrindex(), e, a)) + } + break + } + } + if !foundMatch { + errs = multierr.Append(errs, fmt.Errorf(`missing expected attributeUnit "attributeKey: %d"`, elr.AttributeKeyStrindex())) + } + } + + for i := 0; i < numItems; i++ { + if _, ok := matchingItems[actual.At(i)]; !ok { + errs = multierr.Append(errs, fmt.Errorf(`unexpected profile attributeUnit "attributeKey: %d"`, + actual.At(i).AttributeKeyStrindex())) + } + } + + if errs != nil { + return errs + } + if outOfOrderErrs != nil { + return outOfOrderErrs + } + + return errs +} + +func CompareProfileLinkSlice(expected, actual pprofile.LinkSlice) error { + var errs error + if expected.Len() != actual.Len() { + errs = multierr.Append(errs, fmt.Errorf("number of links doesn't match expected: %d, actual: %d", + expected.Len(), actual.Len())) + return errs + } + + numItems := expected.Len() + + matchingItems := make(map[pprofile.Link]pprofile.Link, numItems) + + var outOfOrderErrs error + for e := 0; e < numItems; e++ { + elr := expected.At(e) + var foundMatch bool + for a := 0; a < numItems; a++ { + alr := actual.At(a) + if _, ok := matchingItems[alr]; ok { + continue + } + if elr.TraceID().String() == alr.TraceID().String() && elr.SpanID().String() == alr.SpanID().String() { + foundMatch = true + matchingItems[alr] = elr + if e != a { + outOfOrderErrs = multierr.Append(outOfOrderErrs, + fmt.Errorf(`links are out of order: link "spanId: %s, traceId: %s" expected at index %d, found at index %d`, + elr.SpanID().String(), elr.TraceID().String(), e, a)) + } + break + } + } + if !foundMatch { + errs = multierr.Append(errs, fmt.Errorf(`missing expected link "spanId: %s, traceId: %s"`, elr.SpanID().String(), elr.TraceID().String())) + } + } + + for i := 0; i < numItems; i++ { + if _, ok := matchingItems[actual.At(i)]; !ok { + errs = multierr.Append(errs, fmt.Errorf(`unexpected profile link "spanId: %s, traceId: %s"`, + actual.At(i).SpanID().String(), actual.At(i).TraceID().String())) + } + } + + if errs != nil { + return errs + } + if outOfOrderErrs != nil { + return outOfOrderErrs + } + + return errs +} diff --git a/pkg/pdatatest/pprofiletest/profiles_test.go b/pkg/pdatatest/pprofiletest/profiles_test.go new file mode 100644 index 000000000000..509434b41f6b --- /dev/null +++ b/pkg/pdatatest/pprofiletest/profiles_test.go @@ -0,0 +1,2000 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package pprofiletest + +import ( + "errors" + "fmt" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/pprofile" + "go.uber.org/multierr" +) + +func TestCompareProfiles(t *testing.T) { + timestamp1 := time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC) + timestamp2 := timestamp1.Add(5 * time.Second) + tcs := []struct { + name string + expected pprofile.Profiles + actual pprofile.Profiles + compareOptions []CompareProfilesOption + withoutOptions error + withOptions error + }{ + { + name: "empty", + expected: func() pprofile.Profiles { + p := pprofile.NewProfiles() + return p + }(), + actual: func() pprofile.Profiles { + p := pprofile.NewProfiles() + return p + }(), + }, + { + name: "equal", + expected: func() pprofile.Profiles { + p := pprofile.NewProfiles() + rl := p.ResourceProfiles().AppendEmpty() + rl.Resource().Attributes().PutStr("key1", "value1") + l := rl.ScopeProfiles().AppendEmpty().Profiles().AppendEmpty() + l.Attributes().PutStr("scope-attr1", "value1") + l.SetProfileID(pprofile.NewProfileIDEmpty()) + return p + }(), + actual: func() pprofile.Profiles { + p := pprofile.NewProfiles() + rl := p.ResourceProfiles().AppendEmpty() + rl.Resource().Attributes().PutStr("key1", "value1") + l := rl.ScopeProfiles().AppendEmpty().Profiles().AppendEmpty() + l.Attributes().PutStr("scope-attr1", "value1") + l.SetProfileID(pprofile.NewProfileIDEmpty()) + return p + }(), + }, + { + name: "resource order", + expected: func() pprofile.Profiles { + p := pprofile.NewProfiles() + rl := p.ResourceProfiles().AppendEmpty() + rl.Resource().Attributes().PutStr("key1", "value1") + l := rl.ScopeProfiles().AppendEmpty().Profiles().AppendEmpty() + l.Attributes().PutStr("scope-attr1", "value1") + l.SetProfileID(pprofile.NewProfileIDEmpty()) + rl2 := p.ResourceProfiles().AppendEmpty() + rl2.Resource().Attributes().PutStr("key2", "value2") + l2 := rl2.ScopeProfiles().AppendEmpty().Profiles().AppendEmpty() + l2.Attributes().PutStr("scope-attr2", "value2") + l2.SetProfileID(pprofile.NewProfileIDEmpty()) + return p + }(), + actual: func() pprofile.Profiles { + p := pprofile.NewProfiles() + rl2 := p.ResourceProfiles().AppendEmpty() + rl2.Resource().Attributes().PutStr("key2", "value2") + l2 := rl2.ScopeProfiles().AppendEmpty().Profiles().AppendEmpty() + l2.Attributes().PutStr("scope-attr2", "value2") + l2.SetProfileID(pprofile.NewProfileIDEmpty()) + rl := p.ResourceProfiles().AppendEmpty() + rl.Resource().Attributes().PutStr("key1", "value1") + l := rl.ScopeProfiles().AppendEmpty().Profiles().AppendEmpty() + l.Attributes().PutStr("scope-attr1", "value1") + l.SetProfileID(pprofile.NewProfileIDEmpty()) + return p + }(), + withoutOptions: multierr.Combine( + errors.New(`resources are out of order: resource "map[key1:value1]" expected at index 0, found at index 1`), + errors.New(`resources are out of order: resource "map[key2:value2]" expected at index 1, found at index 0`), + ), + compareOptions: []CompareProfilesOption{ + IgnoreResourceProfilesOrder(), + }, + }, + { + name: "resource masked attribute", + expected: func() pprofile.Profiles { + p := pprofile.NewProfiles() + rl := p.ResourceProfiles().AppendEmpty() + rl.Resource().Attributes().PutStr("key1", "value1") + return p + }(), + actual: func() pprofile.Profiles { + p := pprofile.NewProfiles() + rl := p.ResourceProfiles().AppendEmpty() + rl.Resource().Attributes().PutStr("key1", "value2") + return p + }(), + withoutOptions: multierr.Combine( + errors.New(`missing expected resource: map[key1:value1]`), + errors.New(`unexpected resource: map[key1:value2]`), + ), + compareOptions: []CompareProfilesOption{ + IgnoreResourceAttributeValue("key1"), + }, + }, + { + name: "resource scope order", + expected: func() pprofile.Profiles { + p := pprofile.NewProfiles() + rl := p.ResourceProfiles().AppendEmpty() + rl.Resource().Attributes().PutStr("key1", "value1") + l := rl.ScopeProfiles().AppendEmpty().Scope() + l.SetName("scope1") + l.Attributes().PutStr("scope-attr1", "value1") + l2 := rl.ScopeProfiles().AppendEmpty().Scope() + l2.Attributes().PutStr("scope-attr2", "value2") + l2.SetName("scope2") + return p + }(), + actual: func() pprofile.Profiles { + p := pprofile.NewProfiles() + rl := p.ResourceProfiles().AppendEmpty() + rl.Resource().Attributes().PutStr("key1", "value1") + l2 := rl.ScopeProfiles().AppendEmpty().Scope() + l2.Attributes().PutStr("scope-attr2", "value2") + l2.SetName("scope2") + l := rl.ScopeProfiles().AppendEmpty().Scope() + l.Attributes().PutStr("scope-attr1", "value1") + l.SetName("scope1") + return p + }(), + withoutOptions: errors.New(`resource "map[key1:value1]": scopes are out of order: scope scope1 expected at index 0, found at index 1; resource "map[key1:value1]": scopes are out of order: scope scope2 expected at index 1, found at index 0`), + compareOptions: []CompareProfilesOption{ + IgnoreScopeProfilesOrder(), + }, + }, + { + name: "mask scope attribute", + expected: func() pprofile.Profiles { + p := pprofile.NewProfiles() + rl := p.ResourceProfiles().AppendEmpty() + rl.Resource().Attributes().PutStr("key1", "value1") + l := rl.ScopeProfiles().AppendEmpty().Scope() + l.SetName("scope1") + l.Attributes().PutStr("scope-attr1", "value1") + l2 := rl.ScopeProfiles().AppendEmpty().Scope() + l2.Attributes().PutStr("scope-attr2", "value2") + l2.SetName("scope2") + return p + }(), + actual: func() pprofile.Profiles { + p := pprofile.NewProfiles() + rl := p.ResourceProfiles().AppendEmpty() + rl.Resource().Attributes().PutStr("key1", "value1") + l := rl.ScopeProfiles().AppendEmpty().Scope() + l.Attributes().PutStr("scope-attr1", "value12") + l.SetName("scope1") + l2 := rl.ScopeProfiles().AppendEmpty().Scope() + l2.Attributes().PutStr("scope-attr2", "value22") + l2.SetName("scope2") + return p + }(), + withoutOptions: errors.New(`resource "map[key1:value1]": scope "scope1": attributes don't match expected: map[scope-attr1:value1], actual: map[scope-attr1:value12]; resource "map[key1:value1]": scope "scope2": attributes don't match expected: map[scope-attr2:value2], actual: map[scope-attr2:value22]`), + compareOptions: []CompareProfilesOption{ + IgnoreScopeAttributeValue("scope-attr2"), + IgnoreScopeAttributeValue("scope-attr1"), + }, + }, + { + name: "ignore profile order", + expected: func() pprofile.Profiles { + p := pprofile.NewProfiles() + rl := p.ResourceProfiles().AppendEmpty() + rl.Resource().Attributes().PutStr("key1", "value1") + l := rl.ScopeProfiles().AppendEmpty() + l.Scope().SetName("scope1") + pc := l.Profiles().AppendEmpty() + pc.SetProfileID(pprofile.ProfileID([]byte("profileid1111111"))) + pc.Attributes().PutStr("continer-attr1", "value1") + pc2 := l.Profiles().AppendEmpty() + pc2.SetProfileID(pprofile.ProfileID([]byte("profileid1111112"))) + pc2.Attributes().PutStr("continer-attr2", "value2") + return p + }(), + actual: func() pprofile.Profiles { + p := pprofile.NewProfiles() + rl := p.ResourceProfiles().AppendEmpty() + rl.Resource().Attributes().PutStr("key1", "value1") + l := rl.ScopeProfiles().AppendEmpty() + l.Scope().SetName("scope1") + pc2 := l.Profiles().AppendEmpty() + pc2.SetProfileID(pprofile.ProfileID([]byte("profileid1111112"))) + pc2.Attributes().PutStr("continer-attr2", "value2") + pc := l.Profiles().AppendEmpty() + pc.SetProfileID(pprofile.ProfileID([]byte("profileid1111111"))) + pc.Attributes().PutStr("continer-attr1", "value1") + return p + }(), + withoutOptions: errors.New(`resource "map[key1:value1]": scope "scope1": profiles are out of order: profile "map[continer-attr1:value1]" expected at index 0, found at index 1; resource "map[key1:value1]": scope "scope1": profiles are out of order: profile "map[continer-attr2:value2]" expected at index 1, found at index 0`), + compareOptions: []CompareProfilesOption{ + IgnoreProfilesOrder(), + }, + }, + { + name: "ignore profile attribute value", + expected: func() pprofile.Profiles { + p := pprofile.NewProfiles() + rl := p.ResourceProfiles().AppendEmpty() + rl.Resource().Attributes().PutStr("key1", "value1") + l := rl.ScopeProfiles().AppendEmpty() + l.Scope().SetName("scope1") + pc := l.Profiles().AppendEmpty() + pc.SetProfileID(pprofile.ProfileID([]byte("profileid1111111"))) + pc.Attributes().PutStr("container-attr1", "value1") + pc2 := l.Profiles().AppendEmpty() + pc2.SetProfileID(pprofile.ProfileID([]byte("profileid1111112"))) + pc2.Attributes().PutStr("container-attr2", "value2") + return p + }(), + actual: func() pprofile.Profiles { + p := pprofile.NewProfiles() + rl := p.ResourceProfiles().AppendEmpty() + rl.Resource().Attributes().PutStr("key1", "value1") + l := rl.ScopeProfiles().AppendEmpty() + l.Scope().SetName("scope1") + pc := l.Profiles().AppendEmpty() + pc.SetProfileID(pprofile.ProfileID([]byte("profileid1111111"))) + pc.Attributes().PutStr("container-attr1", "value3") + pc2 := l.Profiles().AppendEmpty() + pc2.SetProfileID(pprofile.ProfileID([]byte("profileid1111112"))) + pc2.Attributes().PutStr("container-attr2", "value4") + return p + }(), + withoutOptions: errors.New(`resource "map[key1:value1]": scope "scope1": missing expected profile: map[container-attr1:value1]; resource "map[key1:value1]": scope "scope1": missing expected profile: map[container-attr2:value2]; resource "map[key1:value1]": scope "scope1": unexpected profile: map[container-attr1:value3]; resource "map[key1:value1]": scope "scope1": unexpected profile: map[container-attr2:value4]`), + compareOptions: []CompareProfilesOption{ + IgnoreProfileAttributeValue("container-attr2"), + IgnoreProfileAttributeValue("container-attr1"), + }, + }, + { + name: "ignore profile timestamp values", + expected: func(timestamp time.Time) pprofile.Profiles { + p := pprofile.NewProfiles() + rl := p.ResourceProfiles().AppendEmpty() + rl.Resource().Attributes().PutStr("key1", "value1") + l := rl.ScopeProfiles().AppendEmpty() + l.Scope().SetName("scope1") + pc := l.Profiles().AppendEmpty() + pc.SetProfileID(pprofile.ProfileID([]byte("profileid1111111"))) + pc.Attributes().PutStr("container-attr1", "value1") + pc.SetStartTime(pcommon.NewTimestampFromTime(timestamp)) + pc.SetDuration(pcommon.NewTimestampFromTime(timestamp2)) + return p + }(timestamp1), + actual: func(timestamp time.Time) pprofile.Profiles { + p := pprofile.NewProfiles() + rl := p.ResourceProfiles().AppendEmpty() + rl.Resource().Attributes().PutStr("key1", "value1") + l := rl.ScopeProfiles().AppendEmpty() + l.Scope().SetName("scope1") + pc := l.Profiles().AppendEmpty() + pc.SetProfileID(pprofile.ProfileID([]byte("profileid1111111"))) + pc.Attributes().PutStr("container-attr1", "value1") + pc.SetStartTime(pcommon.NewTimestampFromTime(timestamp)) + pc.SetDuration(pcommon.NewTimestampFromTime(timestamp2)) + return p + }(timestamp2), + withoutOptions: errors.New(`resource "map[key1:value1]": scope "scope1": profile "map[container-attr1:value1]": start timestamp doesn't match expected: 1577836800000000000, actual: 1577836805000000000; resource "map[key1:value1]": scope "scope1": profile "map[container-attr1:value1]": time doesn't match expected: 1577836800000000000, actual: 1577836805000000000; resource "map[key1:value1]": scope "scope1": profile "map[container-attr1:value1]": startTime doesn't match expected: 1577836800000000000, actual: 1577836805000000000`), + compareOptions: []CompareProfilesOption{ + IgnoreProfileTimestampValues(), + }, + }, + { + name: "not equal without options", + expected: func(timestamp time.Time) pprofile.Profiles { + p := pprofile.NewProfiles() + rl := p.ResourceProfiles().AppendEmpty() + rl.Resource().Attributes().PutStr("key1", "value1") + l := rl.ScopeProfiles().AppendEmpty() + l.Scope().SetName("scope1") + pc := l.Profiles().AppendEmpty() + pc.SetProfileID(pprofile.ProfileID([]byte("profileid1111111"))) + pc.Attributes().PutStr("container-attr1", "value1") + pc.SetStartTime(pcommon.NewTimestampFromTime(timestamp)) + pc.SetDuration(pcommon.NewTimestampFromTime(timestamp.Add(5 * time.Second))) + return p + }(timestamp1), + actual: func(timestamp time.Time) pprofile.Profiles { + p := pprofile.NewProfiles() + rl := p.ResourceProfiles().AppendEmpty() + rl.Resource().Attributes().PutStr("key1", "value2") + l := rl.ScopeProfiles().AppendEmpty() + l.Scope().SetName("scope1") + pc := l.Profiles().AppendEmpty() + pc.SetProfileID(pprofile.ProfileID([]byte("profileid1111111"))) + pc.Attributes().PutStr("container-attr1", "value2") + pc.SetStartTime(pcommon.NewTimestampFromTime(timestamp)) + pc.SetDuration(pcommon.NewTimestampFromTime(timestamp.Add(5 * time.Second))) + return p + }(timestamp2), + withoutOptions: errors.New(`missing expected resource: map[key1:value1]; unexpected resource: map[key1:value2]`), + }, + } + + for _, tc := range tcs { + t.Run(tc.name, func(t *testing.T) { + err := CompareProfiles(tc.expected, tc.actual) + if tc.withoutOptions == nil { + assert.NoError(t, err) + } else { + require.EqualError(t, err, tc.withoutOptions.Error()) + } + + if tc.compareOptions == nil { + return + } + + err = CompareProfiles(tc.expected, tc.actual, tc.compareOptions...) + if tc.withOptions == nil { + assert.NoError(t, err) + } else { + require.EqualError(t, err, tc.withOptions.Error()) + } + }) + } +} + +func TestCompareResourceProfiles(t *testing.T) { + tests := []struct { + name string + expected pprofile.ResourceProfiles + actual pprofile.ResourceProfiles + err error + }{ + { + name: "equal", + expected: func() pprofile.ResourceProfiles { + rl := pprofile.NewResourceProfiles() + rl.Resource().Attributes().PutStr("key1", "value1") + l := rl.ScopeProfiles().AppendEmpty().Profiles().AppendEmpty() + l.Attributes().PutStr("scope-attr1", "value1") + l.SetProfileID(pprofile.NewProfileIDEmpty()) + return rl + }(), + actual: func() pprofile.ResourceProfiles { + rl := pprofile.NewResourceProfiles() + rl.Resource().Attributes().PutStr("key1", "value1") + l := rl.ScopeProfiles().AppendEmpty().Profiles().AppendEmpty() + l.Attributes().PutStr("scope-attr1", "value1") + l.SetProfileID(pprofile.NewProfileIDEmpty()) + return rl + }(), + }, + { + name: "resource-attributes-mismatch", + expected: func() pprofile.ResourceProfiles { + rl := pprofile.NewResourceProfiles() + rl.Resource().Attributes().PutStr("key1", "value1") + rl.Resource().Attributes().PutStr("key2", "value2") + return rl + }(), + actual: func() pprofile.ResourceProfiles { + rl := pprofile.NewResourceProfiles() + rl.Resource().Attributes().PutStr("key1", "value1") + return rl + }(), + err: errors.New("attributes don't match expected: map[key1:value1 key2:value2], actual: map[key1:value1]"), + }, + { + name: "resource-schema-url-mismatch", + expected: func() pprofile.ResourceProfiles { + rl := pprofile.NewResourceProfiles() + rl.SetSchemaUrl("schema-url") + return rl + }(), + actual: func() pprofile.ResourceProfiles { + rl := pprofile.NewResourceProfiles() + rl.SetSchemaUrl("schema-url-2") + return rl + }(), + err: errors.New("schema url doesn't match expected: schema-url, actual: schema-url-2"), + }, + { + name: "scope-profiles-number-mismatch", + expected: func() pprofile.ResourceProfiles { + rl := pprofile.NewResourceProfiles() + rl.ScopeProfiles().AppendEmpty() + rl.ScopeProfiles().AppendEmpty() + return rl + }(), + actual: func() pprofile.ResourceProfiles { + rl := pprofile.NewResourceProfiles() + rl.ScopeProfiles().AppendEmpty() + return rl + }(), + err: errors.New("number of scopes doesn't match expected: 2, actual: 1"), + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + require.Equal(t, test.err, CompareResourceProfiles(test.expected, test.actual)) + }) + } +} + +func TestCompareScopeProfiles(t *testing.T) { + tests := []struct { + name string + expected pprofile.ScopeProfiles + actual pprofile.ScopeProfiles + err error + }{ + { + name: "equal", + expected: func() pprofile.ScopeProfiles { + sl := pprofile.NewScopeProfiles() + sl.Scope().SetName("scope-name") + l := sl.Profiles().AppendEmpty() + l.Attributes().PutStr("scope-attr1", "value1") + l.SetProfileID(pprofile.NewProfileIDEmpty()) + return sl + }(), + actual: func() pprofile.ScopeProfiles { + sl := pprofile.NewScopeProfiles() + sl.Scope().SetName("scope-name") + l := sl.Profiles().AppendEmpty() + l.Attributes().PutStr("scope-attr1", "value1") + l.SetProfileID(pprofile.NewProfileIDEmpty()) + return sl + }(), + }, + { + name: "scope-name-mismatch", + expected: func() pprofile.ScopeProfiles { + sl := pprofile.NewScopeProfiles() + sl.Scope().SetName("scope-name") + return sl + }(), + actual: func() pprofile.ScopeProfiles { + sl := pprofile.NewScopeProfiles() + sl.Scope().SetName("scope-name-2") + return sl + }(), + err: errors.New("name doesn't match expected: scope-name, actual: scope-name-2"), + }, + { + name: "scope-version-mismatch", + expected: func() pprofile.ScopeProfiles { + sl := pprofile.NewScopeProfiles() + sl.Scope().SetVersion("scope-version") + return sl + }(), + actual: func() pprofile.ScopeProfiles { + sl := pprofile.NewScopeProfiles() + sl.Scope().SetVersion("scope-version-2") + return sl + }(), + err: errors.New("version doesn't match expected: scope-version, actual: scope-version-2"), + }, + { + name: "scope-attributes-mismatch", + expected: func() pprofile.ScopeProfiles { + sl := pprofile.NewScopeProfiles() + sl.Scope().Attributes().PutStr("scope-attr1", "value1") + sl.Scope().Attributes().PutStr("scope-attr2", "value2") + return sl + }(), + actual: func() pprofile.ScopeProfiles { + sl := pprofile.NewScopeProfiles() + sl.Scope().Attributes().PutStr("scope-attr1", "value1") + sl.Scope().SetDroppedAttributesCount(1) + return sl + }(), + err: multierr.Combine( + errors.New("attributes don't match expected: map[scope-attr1:value1 scope-attr2:value2], "+ + "actual: map[scope-attr1:value1]"), + errors.New("dropped attributes count doesn't match expected: 0, actual: 1"), + ), + }, + { + name: "scope-schema-url-mismatch", + expected: func() pprofile.ScopeProfiles { + rl := pprofile.NewScopeProfiles() + rl.SetSchemaUrl("schema-url") + return rl + }(), + actual: func() pprofile.ScopeProfiles { + rl := pprofile.NewScopeProfiles() + rl.SetSchemaUrl("schema-url-2") + return rl + }(), + err: errors.New("schema url doesn't match expected: schema-url, actual: schema-url-2"), + }, + { + name: "profiles-number-mismatch", + expected: func() pprofile.ScopeProfiles { + sl := pprofile.NewScopeProfiles() + sl.Profiles().AppendEmpty() + sl.Profiles().AppendEmpty() + return sl + }(), + actual: func() pprofile.ScopeProfiles { + sl := pprofile.NewScopeProfiles() + sl.Profiles().AppendEmpty() + return sl + }(), + err: errors.New("number of profiles doesn't match expected: 2, actual: 1"), + }, + { + name: "profile-records-order-mismatch", + expected: func() pprofile.ScopeProfiles { + sl := pprofile.NewScopeProfiles() + l := sl.Profiles().AppendEmpty() + l.Attributes().PutStr("scope-attr1", "value1") + l.SetProfileID(pprofile.ProfileID([]byte("profileid1111111"))) + l = sl.Profiles().AppendEmpty() + l.Attributes().PutStr("scope-attr2", "value2") + l.SetProfileID(pprofile.ProfileID([]byte("profileid1111112"))) + return sl + }(), + actual: func() pprofile.ScopeProfiles { + sl := pprofile.NewScopeProfiles() + l := sl.Profiles().AppendEmpty() + l.Attributes().PutStr("scope-attr2", "value2") + l.SetProfileID(pprofile.ProfileID([]byte("profileid1111111"))) + l = sl.Profiles().AppendEmpty() + l.Attributes().PutStr("scope-attr1", "value1") + l.SetProfileID(pprofile.ProfileID([]byte("profileid1111113"))) + return sl + }(), + err: multierr.Combine( + errors.New(`profiles are out of order: profile "map[scope-attr1:value1]" expected at index 0, found at index 1`), + errors.New(`profiles are out of order: profile "map[scope-attr2:value2]" expected at index 1, found at index 0`), + ), + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + require.Equal(t, test.err, CompareScopeProfiles(test.expected, test.actual)) + }) + } +} + +func TestCompareProfile(t *testing.T) { + tests := []struct { + name string + expected pprofile.Profile + actual pprofile.Profile + err error + }{ + { + name: "empty", + expected: func() pprofile.Profile { + l := pprofile.NewProfile() + return l + }(), + actual: func() pprofile.Profile { + l := pprofile.NewProfile() + return l + }(), + }, + { + name: "equal", + expected: func() pprofile.Profile { + l := pprofile.NewProfile() + l.SetProfileID(pprofile.ProfileID([]byte("profileid1111111"))) + l.SetDroppedAttributesCount(2) + l.SetDefaultSampleTypeStrindex(1) + l.Attributes().PutStr("key", "val") + l.SetPeriod(1) + s := l.SampleType().AppendEmpty() + s.SetTypeStrindex(1) + s.SetUnitStrindex(1) + a := l.AttributeUnits().AppendEmpty() + a.SetAttributeKeyStrindex(1) + a.SetUnitStrindex(1) + return l + }(), + actual: func() pprofile.Profile { + l := pprofile.NewProfile() + l.SetProfileID(pprofile.ProfileID([]byte("profileid1111111"))) + l.SetDroppedAttributesCount(2) + l.SetDefaultSampleTypeStrindex(1) + l.Attributes().PutStr("key", "val") + l.SetPeriod(1) + s := l.SampleType().AppendEmpty() + s.SetTypeStrindex(1) + s.SetUnitStrindex(1) + a := l.AttributeUnits().AppendEmpty() + a.SetAttributeKeyStrindex(1) + a.SetUnitStrindex(1) + return l + }(), + }, + { + name: "not equal", + expected: func() pprofile.Profile { + l := pprofile.NewProfile() + l.SetProfileID(pprofile.ProfileID([]byte("profileid1111111"))) + l.SetDroppedAttributesCount(2) + l.SetDefaultSampleTypeStrindex(1) + l.Attributes().PutStr("key", "val") + l.SetPeriod(1) + s := l.SampleType().AppendEmpty() + s.SetTypeStrindex(1) + s.SetUnitStrindex(1) + a := l.AttributeUnits().AppendEmpty() + a.SetAttributeKeyStrindex(1) + a.SetUnitStrindex(1) + return l + }(), + actual: func() pprofile.Profile { + l := pprofile.NewProfile() + l.SetProfileID(pprofile.ProfileID([]byte("profileid1111111"))) + l.SetDroppedAttributesCount(2) + l.SetDefaultSampleTypeStrindex(1) + l.Attributes().PutStr("key1", "val1") + l.SetPeriod(2) + s := l.SampleType().AppendEmpty() + s.SetTypeStrindex(2) + s.SetUnitStrindex(2) + a := l.AttributeUnits().AppendEmpty() + a.SetAttributeKeyStrindex(2) + a.SetUnitStrindex(2) + return l + }(), + err: multierr.Combine( + errors.New(`attributes don't match expected: map[key:val], actual: map[key1:val1]`), + errors.New(`period does not match expected '1', actual '2'`), + fmt.Errorf(`sampleType: %w`, fmt.Errorf(`missing expected valueType "unit: 1, type: 1, aggregationTemporality: 0"`)), + fmt.Errorf(`sampleType: %w`, fmt.Errorf(`unexpected valueType "unit: 2, type: 2, aggregationTemporality: 0"`)), + fmt.Errorf(`attributeUnits: %w`, fmt.Errorf(`missing expected attributeUnit "attributeKey: 1"`)), + fmt.Errorf(`attributeUnits: %w`, fmt.Errorf(`unexpected profile attributeUnit "attributeKey: 2"`)), + ), + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + require.Equal(t, test.err, CompareProfile(test.expected, test.actual)) + }) + } +} + +func TestCompareProfileValueTypeSlice(t *testing.T) { + tests := []struct { + name string + expected pprofile.ValueTypeSlice + actual pprofile.ValueTypeSlice + err error + }{ + { + name: "empty", + expected: func() pprofile.ValueTypeSlice { + l := pprofile.NewValueTypeSlice() + return l + }(), + actual: func() pprofile.ValueTypeSlice { + l := pprofile.NewValueTypeSlice() + return l + }(), + }, + { + name: "equal", + expected: func() pprofile.ValueTypeSlice { + l := pprofile.NewValueTypeSlice() + i1 := l.AppendEmpty() + i1.SetTypeStrindex(1) + i1.SetUnitStrindex(1) + i1.SetAggregationTemporality(1) + i2 := l.AppendEmpty() + i2.SetTypeStrindex(2) + i2.SetUnitStrindex(2) + i2.SetAggregationTemporality(1) + return l + }(), + actual: func() pprofile.ValueTypeSlice { + l := pprofile.NewValueTypeSlice() + i1 := l.AppendEmpty() + i1.SetTypeStrindex(1) + i1.SetUnitStrindex(1) + i1.SetAggregationTemporality(1) + i2 := l.AppendEmpty() + i2.SetTypeStrindex(2) + i2.SetUnitStrindex(2) + i2.SetAggregationTemporality(1) + return l + }(), + }, + { + name: "equal wrong order", + expected: func() pprofile.ValueTypeSlice { + l := pprofile.NewValueTypeSlice() + i1 := l.AppendEmpty() + i1.SetTypeStrindex(1) + i1.SetUnitStrindex(1) + i1.SetAggregationTemporality(1) + i2 := l.AppendEmpty() + i2.SetTypeStrindex(2) + i2.SetUnitStrindex(2) + i2.SetAggregationTemporality(1) + return l + }(), + actual: func() pprofile.ValueTypeSlice { + l := pprofile.NewValueTypeSlice() + i2 := l.AppendEmpty() + i2.SetTypeStrindex(2) + i2.SetUnitStrindex(2) + i2.SetAggregationTemporality(1) + i1 := l.AppendEmpty() + i1.SetTypeStrindex(1) + i1.SetUnitStrindex(1) + i1.SetAggregationTemporality(1) + return l + }(), + err: multierr.Combine( + errors.New(`valueTypes are out of order: valueType "unit: 1, type: 1, aggregationTemporality: 1" expected at index 0, found at index 1`), + errors.New(`valueTypes are out of order: valueType "unit: 2, type: 2, aggregationTemporality: 1" expected at index 1, found at index 0`), + ), + }, + { + name: "wrong length", + expected: func() pprofile.ValueTypeSlice { + l := pprofile.NewValueTypeSlice() + i1 := l.AppendEmpty() + i1.SetTypeStrindex(1) + i1.SetUnitStrindex(1) + i1.SetAggregationTemporality(1) + return l + }(), + actual: func() pprofile.ValueTypeSlice { + l := pprofile.NewValueTypeSlice() + i1 := l.AppendEmpty() + i1.SetTypeStrindex(1) + i1.SetUnitStrindex(1) + i1.SetAggregationTemporality(1) + i2 := l.AppendEmpty() + i2.SetTypeStrindex(2) + i2.SetUnitStrindex(2) + i2.SetAggregationTemporality(1) + return l + }(), + err: multierr.Combine( + errors.New(`number of valueTypes doesn't match expected: 1, actual: 2`), + ), + }, + { + name: "not equal - does not match expected", + expected: func() pprofile.ValueTypeSlice { + l := pprofile.NewValueTypeSlice() + i1 := l.AppendEmpty() + i1.SetTypeStrindex(1) + i1.SetUnitStrindex(1) + i1.SetAggregationTemporality(1) + i2 := l.AppendEmpty() + i2.SetTypeStrindex(2) + i2.SetUnitStrindex(2) + i2.SetAggregationTemporality(1) + return l + }(), + actual: func() pprofile.ValueTypeSlice { + l := pprofile.NewValueTypeSlice() + i1 := l.AppendEmpty() + i1.SetTypeStrindex(1) + i1.SetUnitStrindex(1) + i1.SetAggregationTemporality(1) + i2 := l.AppendEmpty() + i2.SetTypeStrindex(2) + i2.SetUnitStrindex(2) + i2.SetAggregationTemporality(2) + return l + }(), + err: multierr.Combine( + errors.New(`expected valueType "unit: 2, type: 2, aggregationTemporality: 1",got "unit: 2, type: 2, aggregationTemporality: 2"`), + ), + }, + { + name: "not equal - missing", + expected: func() pprofile.ValueTypeSlice { + l := pprofile.NewValueTypeSlice() + i1 := l.AppendEmpty() + i1.SetTypeStrindex(1) + i1.SetUnitStrindex(1) + i1.SetAggregationTemporality(1) + i2 := l.AppendEmpty() + i2.SetTypeStrindex(2) + i2.SetUnitStrindex(2) + i2.SetAggregationTemporality(1) + return l + }(), + actual: func() pprofile.ValueTypeSlice { + l := pprofile.NewValueTypeSlice() + i1 := l.AppendEmpty() + i1.SetTypeStrindex(1) + i1.SetUnitStrindex(1) + i1.SetAggregationTemporality(1) + i2 := l.AppendEmpty() + i2.SetTypeStrindex(3) + i2.SetUnitStrindex(3) + i2.SetAggregationTemporality(1) + return l + }(), + err: multierr.Combine( + errors.New(`missing expected valueType "unit: 2, type: 2, aggregationTemporality: 1"`), + errors.New(`unexpected valueType "unit: 3, type: 3, aggregationTemporality: 1"`), + ), + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + require.Equal(t, test.err, CompareProfileValueTypeSlice(test.expected, test.actual)) + }) + } +} + +func TestCompareProfileSampleSlice(t *testing.T) { + tests := []struct { + name string + expected pprofile.SampleSlice + actual pprofile.SampleSlice + err error + }{ + { + name: "empty", + expected: func() pprofile.SampleSlice { + l := pprofile.NewSampleSlice() + return l + }(), + actual: func() pprofile.SampleSlice { + l := pprofile.NewSampleSlice() + return l + }(), + }, + { + name: "equal", + expected: func() pprofile.SampleSlice { + l := pprofile.NewSampleSlice() + i1 := l.AppendEmpty() + i1.SetLocationsLength(1) + i1.AttributeIndices().Append(1, 2) + i2 := l.AppendEmpty() + i2.AttributeIndices().Append(1, 2, 3) + i2.SetLocationsLength(2) + return l + }(), + actual: func() pprofile.SampleSlice { + l := pprofile.NewSampleSlice() + i1 := l.AppendEmpty() + i1.SetLocationsLength(1) + i1.AttributeIndices().Append(1, 2) + i2 := l.AppendEmpty() + i2.AttributeIndices().Append(1, 2, 3) + i2.SetLocationsLength(2) + return l + }(), + }, + { + name: "equal wrong order", + expected: func() pprofile.SampleSlice { + l := pprofile.NewSampleSlice() + i1 := l.AppendEmpty() + i1.SetLocationsLength(1) + i1.AttributeIndices().Append(1, 2) + i2 := l.AppendEmpty() + i2.AttributeIndices().Append(1, 2, 3) + i2.SetLocationsLength(2) + return l + }(), + actual: func() pprofile.SampleSlice { + l := pprofile.NewSampleSlice() + i2 := l.AppendEmpty() + i2.AttributeIndices().Append(1, 2, 3) + i2.SetLocationsLength(2) + i1 := l.AppendEmpty() + i1.SetLocationsLength(1) + i1.AttributeIndices().Append(1, 2) + return l + }(), + err: multierr.Combine( + errors.New(`samples are out of order: sample "attributes: [1 2]" expected at index 0, found at index 1`), + errors.New(`samples are out of order: sample "attributes: [1 2 3]" expected at index 1, found at index 0`), + ), + }, + { + name: "wrong length", + expected: func() pprofile.SampleSlice { + l := pprofile.NewSampleSlice() + i1 := l.AppendEmpty() + i1.SetLocationsLength(1) + i1.AttributeIndices().Append(1, 2) + return l + }(), + actual: func() pprofile.SampleSlice { + l := pprofile.NewSampleSlice() + i1 := l.AppendEmpty() + i1.SetLocationsLength(1) + i1.AttributeIndices().Append(1, 2) + i2 := l.AppendEmpty() + i2.AttributeIndices().Append(1, 2, 3) + i2.SetLocationsLength(2) + return l + }(), + err: multierr.Combine( + errors.New(`number of samples doesn't match expected: 1, actual: 2`), + ), + }, + { + name: "not equal - does not match expected", + expected: func() pprofile.SampleSlice { + l := pprofile.NewSampleSlice() + i1 := l.AppendEmpty() + i1.SetLocationsLength(1) + i1.AttributeIndices().Append(1, 2) + i2 := l.AppendEmpty() + i2.AttributeIndices().Append(1, 2, 3) + i2.SetLocationsLength(2) + return l + }(), + actual: func() pprofile.SampleSlice { + l := pprofile.NewSampleSlice() + i1 := l.AppendEmpty() + i1.SetLocationsLength(1) + i1.AttributeIndices().Append(1, 2) + i2 := l.AppendEmpty() + i2.AttributeIndices().Append(1, 2, 3) + i2.SetLocationsLength(3) + return l + }(), + err: multierr.Combine( + fmt.Errorf(`sample "attributes: [1 2 3]": %w`, fmt.Errorf(`expected locationLenght '2', got '3'`)), + ), + }, + { + name: "not equal - missing", + expected: func() pprofile.SampleSlice { + l := pprofile.NewSampleSlice() + i1 := l.AppendEmpty() + i1.SetLocationsLength(1) + i1.AttributeIndices().Append(1, 2) + i2 := l.AppendEmpty() + i2.AttributeIndices().Append(1, 2, 3) + i2.SetLocationsLength(2) + return l + }(), + actual: func() pprofile.SampleSlice { + l := pprofile.NewSampleSlice() + i1 := l.AppendEmpty() + i1.SetLocationsLength(1) + i1.AttributeIndices().Append(1, 2) + i2 := l.AppendEmpty() + i2.AttributeIndices().Append(1, 2, 3, 5) + i2.SetLocationsLength(3) + return l + }(), + err: multierr.Combine( + errors.New(`missing expected sample "attributes: [1 2 3]"`), + errors.New(`unexpected sample "attributes: [1 2 3 5]"`), + ), + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + require.Equal(t, test.err, CompareProfileSampleSlice(test.expected, test.actual)) + }) + } +} + +func TestCompareProfileSample(t *testing.T) { + tests := []struct { + name string + expected pprofile.Sample + actual pprofile.Sample + err error + }{ + { + name: "empty", + expected: func() pprofile.Sample { + l := pprofile.NewSample() + return l + }(), + actual: func() pprofile.Sample { + l := pprofile.NewSample() + return l + }(), + }, + { + name: "equal", + expected: func() pprofile.Sample { + l := pprofile.NewSample() + l.SetLocationsStartIndex(1) + l.SetLocationsLength(1) + l.AttributeIndices().Append(1, 2) + return l + }(), + actual: func() pprofile.Sample { + l := pprofile.NewSample() + l.SetLocationsStartIndex(1) + l.SetLocationsLength(1) + l.AttributeIndices().Append(1, 2) + return l + }(), + }, + { + name: "not equal", + expected: func() pprofile.Sample { + l := pprofile.NewSample() + l.SetLocationsStartIndex(1) + l.SetLocationsLength(1) + l.AttributeIndices().Append(1, 2) + return l + }(), + actual: func() pprofile.Sample { + l := pprofile.NewSample() + l.SetLocationsStartIndex(2) + l.SetLocationsLength(3) + l.AttributeIndices().Append(1, 2, 3) + return l + }(), + err: multierr.Combine( + errors.New(`expected locationStartIndex '1', got '2'`), + errors.New(`expected locationLenght '1', got '3'`), + errors.New(`expected attributes '[1 2]', got '[1 2 3]'`), + ), + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + require.Equal(t, test.err, CompareProfileSample(test.expected, test.actual)) + }) + } +} + +func TestCompareProfileMappingSlice(t *testing.T) { + tests := []struct { + name string + expected pprofile.MappingSlice + actual pprofile.MappingSlice + err error + }{ + { + name: "empty", + expected: func() pprofile.MappingSlice { + l := pprofile.NewMappingSlice() + return l + }(), + actual: func() pprofile.MappingSlice { + l := pprofile.NewMappingSlice() + return l + }(), + }, + { + name: "equal", + expected: func() pprofile.MappingSlice { + l := pprofile.NewMappingSlice() + i1 := l.AppendEmpty() + i1.AttributeIndices().Append(1) + i1.SetFilenameStrindex(1) + i2 := l.AppendEmpty() + i2.AttributeIndices().Append(1) + i2.SetFilenameStrindex(2) + return l + }(), + actual: func() pprofile.MappingSlice { + l := pprofile.NewMappingSlice() + i1 := l.AppendEmpty() + i1.AttributeIndices().Append(1) + i1.SetFilenameStrindex(1) + i2 := l.AppendEmpty() + i2.AttributeIndices().Append(1) + i2.SetFilenameStrindex(2) + return l + }(), + }, + { + name: "equal wrong order", + expected: func() pprofile.MappingSlice { + l := pprofile.NewMappingSlice() + i1 := l.AppendEmpty() + i1.AttributeIndices().Append(1, 2) + i1.SetFilenameStrindex(1) + i2 := l.AppendEmpty() + i2.AttributeIndices().Append(1) + i2.SetFilenameStrindex(2) + return l + }(), + actual: func() pprofile.MappingSlice { + l := pprofile.NewMappingSlice() + i2 := l.AppendEmpty() + i2.AttributeIndices().Append(1) + i2.SetFilenameStrindex(2) + i1 := l.AppendEmpty() + i1.AttributeIndices().Append(1, 2) + i1.SetFilenameStrindex(1) + return l + }(), + err: multierr.Combine( + errors.New(`mappings are out of order: mapping "attributes: [1 2]" expected at index 0, found at index 1`), + errors.New(`mappings are out of order: mapping "attributes: [1]" expected at index 1, found at index 0`), + ), + }, + { + name: "wrong length", + expected: func() pprofile.MappingSlice { + l := pprofile.NewMappingSlice() + i2 := l.AppendEmpty() + i2.SetFilenameStrindex(2) + return l + }(), + actual: func() pprofile.MappingSlice { + l := pprofile.NewMappingSlice() + i1 := l.AppendEmpty() + i1.AttributeIndices().Append(1) + i1.SetFilenameStrindex(1) + i2 := l.AppendEmpty() + i2.AttributeIndices().Append(1) + i2.SetFilenameStrindex(2) + return l + }(), + err: multierr.Combine( + errors.New(`number of mappings doesn't match expected: 1, actual: 2`), + ), + }, + { + name: "not equal - does not match expected", + expected: func() pprofile.MappingSlice { + l := pprofile.NewMappingSlice() + i1 := l.AppendEmpty() + i1.AttributeIndices().Append(1) + i1.SetFilenameStrindex(1) + i2 := l.AppendEmpty() + i2.AttributeIndices().Append(1) + i2.SetFilenameStrindex(2) + return l + }(), + actual: func() pprofile.MappingSlice { + l := pprofile.NewMappingSlice() + i1 := l.AppendEmpty() + i1.AttributeIndices().Append(1) + i1.SetFilenameStrindex(1) + i2 := l.AppendEmpty() + i2.AttributeIndices().Append(1) + i2.SetFilenameStrindex(3) + return l + }(), + err: multierr.Combine( + errors.New(`mapping with "attributes: [1]", does not match expected`), + ), + }, + { + name: "not equal - missing", + expected: func() pprofile.MappingSlice { + l := pprofile.NewMappingSlice() + i1 := l.AppendEmpty() + i1.AttributeIndices().Append(1) + i1.SetFilenameStrindex(1) + i2 := l.AppendEmpty() + i2.AttributeIndices().Append(1) + i2.SetFilenameStrindex(2) + return l + }(), + actual: func() pprofile.MappingSlice { + l := pprofile.NewMappingSlice() + i1 := l.AppendEmpty() + i1.AttributeIndices().Append(1) + i1.SetFilenameStrindex(1) + i2 := l.AppendEmpty() + i2.AttributeIndices().Append(1, 2) + i2.SetFilenameStrindex(2) + return l + }(), + err: multierr.Combine( + errors.New(`missing expected mapping "attributes: [1]"`), + errors.New(`unexpected profile mapping "attributes: [1 2]"`), + ), + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + require.Equal(t, test.err, CompareProfileMappingSlice(test.expected, test.actual)) + }) + } +} + +func TestCompareProfileFunctionSlice(t *testing.T) { + tests := []struct { + name string + expected pprofile.FunctionSlice + actual pprofile.FunctionSlice + err error + }{ + { + name: "empty", + expected: func() pprofile.FunctionSlice { + l := pprofile.NewFunctionSlice() + return l + }(), + actual: func() pprofile.FunctionSlice { + l := pprofile.NewFunctionSlice() + return l + }(), + }, + { + name: "equal", + expected: func() pprofile.FunctionSlice { + l := pprofile.NewFunctionSlice() + i1 := l.AppendEmpty() + i1.SetNameStrindex(1) + i1.SetFilenameStrindex(1) + i2 := l.AppendEmpty() + i2.SetNameStrindex(2) + i2.SetFilenameStrindex(2) + return l + }(), + actual: func() pprofile.FunctionSlice { + l := pprofile.NewFunctionSlice() + i1 := l.AppendEmpty() + i1.SetNameStrindex(1) + i1.SetFilenameStrindex(1) + i2 := l.AppendEmpty() + i2.SetNameStrindex(2) + i2.SetFilenameStrindex(2) + return l + }(), + }, + { + name: "equal wrong order", + expected: func() pprofile.FunctionSlice { + l := pprofile.NewFunctionSlice() + i1 := l.AppendEmpty() + i1.SetNameStrindex(1) + i1.SetFilenameStrindex(1) + i2 := l.AppendEmpty() + i2.SetNameStrindex(2) + i2.SetFilenameStrindex(2) + return l + }(), + actual: func() pprofile.FunctionSlice { + l := pprofile.NewFunctionSlice() + i2 := l.AppendEmpty() + i2.SetNameStrindex(2) + i2.SetFilenameStrindex(2) + i1 := l.AppendEmpty() + i1.SetNameStrindex(1) + i1.SetFilenameStrindex(1) + return l + }(), + err: multierr.Combine( + errors.New(`functions are out of order: function "name: 1" expected at index 0, found at index 1`), + errors.New(`functions are out of order: function "name: 2" expected at index 1, found at index 0`), + ), + }, + { + name: "wrong length", + expected: func() pprofile.FunctionSlice { + l := pprofile.NewFunctionSlice() + i2 := l.AppendEmpty() + i2.SetNameStrindex(2) + i2.SetFilenameStrindex(2) + return l + }(), + actual: func() pprofile.FunctionSlice { + l := pprofile.NewFunctionSlice() + i1 := l.AppendEmpty() + i1.SetNameStrindex(1) + i1.SetFilenameStrindex(1) + i2 := l.AppendEmpty() + i2.SetNameStrindex(2) + i2.SetFilenameStrindex(2) + return l + }(), + err: multierr.Combine( + errors.New(`number of functions doesn't match expected: 1, actual: 2`), + ), + }, + { + name: "not equal - does not match expected", + expected: func() pprofile.FunctionSlice { + l := pprofile.NewFunctionSlice() + i1 := l.AppendEmpty() + i1.SetNameStrindex(1) + i1.SetFilenameStrindex(1) + i2 := l.AppendEmpty() + i2.SetNameStrindex(2) + i2.SetFilenameStrindex(2) + return l + }(), + actual: func() pprofile.FunctionSlice { + l := pprofile.NewFunctionSlice() + i1 := l.AppendEmpty() + i1.SetNameStrindex(1) + i1.SetFilenameStrindex(1) + i2 := l.AppendEmpty() + i2.SetNameStrindex(2) + i2.SetFilenameStrindex(3) + return l + }(), + err: multierr.Combine( + errors.New(`function with "name: 2" does not match expected`), + ), + }, + { + name: "not equal - missing", + expected: func() pprofile.FunctionSlice { + l := pprofile.NewFunctionSlice() + i1 := l.AppendEmpty() + i1.SetNameStrindex(1) + i1.SetFilenameStrindex(1) + i2 := l.AppendEmpty() + i2.SetNameStrindex(2) + i2.SetFilenameStrindex(2) + return l + }(), + actual: func() pprofile.FunctionSlice { + l := pprofile.NewFunctionSlice() + i1 := l.AppendEmpty() + i1.SetNameStrindex(1) + i1.SetFilenameStrindex(1) + i2 := l.AppendEmpty() + i2.SetNameStrindex(3) + i2.SetFilenameStrindex(3) + return l + }(), + err: multierr.Combine( + errors.New(`missing expected function "name: 2"`), + errors.New(`unexpected profile function "name: 3"`), + ), + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + require.Equal(t, test.err, CompareProfileFunctionSlice(test.expected, test.actual)) + }) + } +} + +func TestCompareProfileLocationSlice(t *testing.T) { + tests := []struct { + name string + expected pprofile.LocationSlice + actual pprofile.LocationSlice + err error + }{ + { + name: "empty", + expected: func() pprofile.LocationSlice { + l := pprofile.NewLocationSlice() + return l + }(), + actual: func() pprofile.LocationSlice { + l := pprofile.NewLocationSlice() + return l + }(), + }, + { + name: "equal", + expected: func() pprofile.LocationSlice { + l := pprofile.NewLocationSlice() + i1 := l.AppendEmpty() + i1.AttributeIndices().Append(1, 2) + i1.SetMappingIndex(1) + i2 := l.AppendEmpty() + i2.AttributeIndices().Append(1, 2, 3) + i2.SetMappingIndex(2) + return l + }(), + actual: func() pprofile.LocationSlice { + l := pprofile.NewLocationSlice() + i1 := l.AppendEmpty() + i1.AttributeIndices().Append(1, 2) + i1.SetMappingIndex(1) + i2 := l.AppendEmpty() + i2.AttributeIndices().Append(1, 2, 3) + i2.SetMappingIndex(2) + return l + }(), + }, + { + name: "equal wrong order", + expected: func() pprofile.LocationSlice { + l := pprofile.NewLocationSlice() + i1 := l.AppendEmpty() + i1.AttributeIndices().Append(1, 2) + i1.SetMappingIndex(1) + i2 := l.AppendEmpty() + i2.AttributeIndices().Append(1, 2, 3) + i2.SetMappingIndex(2) + return l + }(), + actual: func() pprofile.LocationSlice { + l := pprofile.NewLocationSlice() + i2 := l.AppendEmpty() + i2.AttributeIndices().Append(1, 2, 3) + i2.SetMappingIndex(2) + i1 := l.AppendEmpty() + i1.AttributeIndices().Append(1, 2) + i1.SetMappingIndex(1) + return l + }(), + err: multierr.Combine( + errors.New(`locations are out of order: location "attributes: [1 2]" expected at index 0, found at index 1`), + errors.New(`locations are out of order: location "attributes: [1 2 3]" expected at index 1, found at index 0`), + ), + }, + { + name: "wrong length", + expected: func() pprofile.LocationSlice { + l := pprofile.NewLocationSlice() + i2 := l.AppendEmpty() + i2.AttributeIndices().Append(1, 2, 3) + i2.SetMappingIndex(2) + return l + }(), + actual: func() pprofile.LocationSlice { + l := pprofile.NewLocationSlice() + i2 := l.AppendEmpty() + i2.AttributeIndices().Append(1, 2, 3) + i2.SetMappingIndex(2) + i1 := l.AppendEmpty() + i1.AttributeIndices().Append(1, 2) + i1.SetMappingIndex(1) + return l + }(), + err: multierr.Combine( + errors.New(`number of locations doesn't match expected: 1, actual: 2`), + ), + }, + { + name: "not equal - does not match expected", + expected: func() pprofile.LocationSlice { + l := pprofile.NewLocationSlice() + i1 := l.AppendEmpty() + i1.AttributeIndices().Append(1, 2) + i1.SetMappingIndex(1) + i2 := l.AppendEmpty() + i2.AttributeIndices().Append(1, 2, 3) + i2.SetMappingIndex(2) + return l + }(), + actual: func() pprofile.LocationSlice { + l := pprofile.NewLocationSlice() + i1 := l.AppendEmpty() + i1.AttributeIndices().Append(1, 2) + i1.SetMappingIndex(1) + i2 := l.AppendEmpty() + i2.AttributeIndices().Append(1, 2, 3) + i2.SetMappingIndex(3) + return l + }(), + err: multierr.Combine( + fmt.Errorf(`location "attributes: [1 2 3]": %w`, fmt.Errorf(`expected mappingIndex '2', got '3'`)), + ), + }, + { + name: "not equal - missing", + expected: func() pprofile.LocationSlice { + l := pprofile.NewLocationSlice() + i1 := l.AppendEmpty() + i1.AttributeIndices().Append(1, 2) + i1.SetMappingIndex(1) + i2 := l.AppendEmpty() + i2.AttributeIndices().Append(1, 2, 3) + i2.SetMappingIndex(2) + return l + }(), + actual: func() pprofile.LocationSlice { + l := pprofile.NewLocationSlice() + i1 := l.AppendEmpty() + i1.AttributeIndices().Append(1, 2) + i1.SetMappingIndex(1) + i2 := l.AppendEmpty() + i2.AttributeIndices().Append(1, 2, 3, 5) + i2.SetMappingIndex(2) + return l + }(), + err: multierr.Combine( + errors.New(`missing expected location "attributes: [1 2 3]"`), + errors.New(`unexpected location "attributes: [1 2 3 5]"`), + ), + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + require.Equal(t, test.err, CompareProfileLocationSlice(test.expected, test.actual)) + }) + } +} + +func TestCompareProfileLocation(t *testing.T) { + tests := []struct { + name string + expected pprofile.Location + actual pprofile.Location + err error + }{ + { + name: "empty", + expected: func() pprofile.Location { + l := pprofile.NewLocation() + return l + }(), + actual: func() pprofile.Location { + l := pprofile.NewLocation() + return l + }(), + }, + { + name: "equal", + expected: func() pprofile.Location { + l := pprofile.NewLocation() + l.SetAddress(2) + l.SetIsFolded(true) + l.SetMappingIndex(4) + l.AttributeIndices().Append(1, 2, 3) + l.Line().AppendEmpty().Line() + return l + }(), + actual: func() pprofile.Location { + l := pprofile.NewLocation() + l.SetAddress(2) + l.SetIsFolded(true) + l.SetMappingIndex(4) + l.AttributeIndices().Append(1, 2, 3) + l.Line().AppendEmpty() + return l + }(), + }, + { + name: "not equal", + expected: func() pprofile.Location { + l := pprofile.NewLocation() + l.SetAddress(3) + l.SetIsFolded(false) + l.SetMappingIndex(2) + l.AttributeIndices().Append(1, 2, 3, 4) + l.Line().AppendEmpty().SetFunctionIndex(3) + return l + }(), + actual: func() pprofile.Location { + l := pprofile.NewLocation() + l.SetAddress(2) + l.SetIsFolded(true) + l.SetMappingIndex(4) + l.AttributeIndices().Append(1, 2, 3) + l.Line().AppendEmpty().Line() + return l + }(), + err: multierr.Combine( + errors.New(`expected mappingIndex '2', got '4'`), + errors.New(`expected address '3', got '2'`), + errors.New(`expected isFolded 'false', got 'true'`), + errors.New(`expected attributes '[1 2 3 4]', got '[1 2 3]'`), + fmt.Errorf(`line of location with "attributes: [1 2 3 4]": %w`, fmt.Errorf(`missing expected line "functionIndex: 3"`)), + fmt.Errorf(`line of location with "attributes: [1 2 3 4]": %w`, fmt.Errorf(`unexpected profile line "functionIndex: 0"`)), + ), + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + require.Equal(t, test.err, CompareProfileLocation(test.expected, test.actual)) + }) + } +} + +func TestCompareProfileLineSlice(t *testing.T) { + tests := []struct { + name string + expected pprofile.LineSlice + actual pprofile.LineSlice + err error + }{ + { + name: "empty", + expected: func() pprofile.LineSlice { + l := pprofile.NewLineSlice() + return l + }(), + actual: func() pprofile.LineSlice { + l := pprofile.NewLineSlice() + return l + }(), + }, + { + name: "equal", + expected: func() pprofile.LineSlice { + l := pprofile.NewLineSlice() + i1 := l.AppendEmpty() + i1.SetFunctionIndex(1) + i1.SetLine(3) + i1.SetColumn(3) + i2 := l.AppendEmpty() + i2.SetFunctionIndex(2) + i2.SetLine(4) + i2.SetColumn(4) + return l + }(), + actual: func() pprofile.LineSlice { + l := pprofile.NewLineSlice() + i1 := l.AppendEmpty() + i1.SetFunctionIndex(1) + i1.SetLine(3) + i1.SetColumn(3) + i2 := l.AppendEmpty() + i2.SetFunctionIndex(2) + i2.SetLine(4) + i2.SetColumn(4) + return l + }(), + }, + { + name: "equal wrong order", + expected: func() pprofile.LineSlice { + l := pprofile.NewLineSlice() + i1 := l.AppendEmpty() + i1.SetFunctionIndex(1) + i1.SetLine(3) + i1.SetColumn(3) + i2 := l.AppendEmpty() + i2.SetFunctionIndex(2) + i2.SetLine(4) + i2.SetColumn(4) + return l + }(), + actual: func() pprofile.LineSlice { + l := pprofile.NewLineSlice() + i2 := l.AppendEmpty() + i2.SetFunctionIndex(2) + i2.SetLine(4) + i2.SetColumn(4) + i1 := l.AppendEmpty() + i1.SetFunctionIndex(1) + i1.SetLine(3) + i1.SetColumn(3) + return l + }(), + err: multierr.Combine( + errors.New(`lines are out of order: line "functionIndex: 1" expected at index 0, found at index 1`), + errors.New(`lines are out of order: line "functionIndex: 2" expected at index 1, found at index 0`), + ), + }, + { + name: "wrong length", + expected: func() pprofile.LineSlice { + l := pprofile.NewLineSlice() + i1 := l.AppendEmpty() + i1.SetFunctionIndex(1) + i1.SetLine(3) + i1.SetColumn(3) + return l + }(), + actual: func() pprofile.LineSlice { + l := pprofile.NewLineSlice() + i1 := l.AppendEmpty() + i1.SetFunctionIndex(1) + i1.SetLine(3) + i1.SetColumn(3) + i2 := l.AppendEmpty() + i2.SetFunctionIndex(2) + i2.SetLine(4) + i2.SetColumn(4) + return l + }(), + err: multierr.Combine( + errors.New(`number of lines doesn't match expected: 1, actual: 2`), + ), + }, + { + name: "not equal - does not match expected", + expected: func() pprofile.LineSlice { + l := pprofile.NewLineSlice() + i1 := l.AppendEmpty() + i1.SetFunctionIndex(1) + i1.SetLine(3) + i1.SetColumn(3) + i2 := l.AppendEmpty() + i2.SetFunctionIndex(2) + i2.SetLine(4) + i2.SetColumn(4) + return l + }(), + actual: func() pprofile.LineSlice { + l := pprofile.NewLineSlice() + i1 := l.AppendEmpty() + i1.SetFunctionIndex(1) + i1.SetLine(3) + i1.SetColumn(3) + i2 := l.AppendEmpty() + i2.SetFunctionIndex(2) + i2.SetLine(5) + i2.SetColumn(5) + return l + }(), + err: multierr.Combine( + errors.New(`line with "functionIndex: 2" does not match expected`), + ), + }, + { + name: "not equal - missing", + expected: func() pprofile.LineSlice { + l := pprofile.NewLineSlice() + i1 := l.AppendEmpty() + i1.SetFunctionIndex(1) + i1.SetLine(3) + i1.SetColumn(3) + i2 := l.AppendEmpty() + i2.SetFunctionIndex(2) + i2.SetLine(4) + i2.SetColumn(4) + return l + }(), + actual: func() pprofile.LineSlice { + l := pprofile.NewLineSlice() + i1 := l.AppendEmpty() + i1.SetFunctionIndex(1) + i1.SetLine(3) + i1.SetColumn(3) + i2 := l.AppendEmpty() + i2.SetFunctionIndex(3) + i2.SetLine(5) + i2.SetColumn(5) + return l + }(), + err: multierr.Combine( + errors.New(`missing expected line "functionIndex: 2"`), + errors.New(`unexpected profile line "functionIndex: 3"`), + ), + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + require.Equal(t, test.err, CompareProfileLineSlice(test.expected, test.actual)) + }) + } +} + +func TestCompareProfileAttributeUnitSlice(t *testing.T) { + tests := []struct { + name string + expected pprofile.AttributeUnitSlice + actual pprofile.AttributeUnitSlice + err error + }{ + { + name: "empty", + expected: func() pprofile.AttributeUnitSlice { + l := pprofile.NewAttributeUnitSlice() + return l + }(), + actual: func() pprofile.AttributeUnitSlice { + l := pprofile.NewAttributeUnitSlice() + return l + }(), + }, + { + name: "equal", + expected: func() pprofile.AttributeUnitSlice { + l := pprofile.NewAttributeUnitSlice() + i1 := l.AppendEmpty() + i1.SetAttributeKeyStrindex(2) + i1.SetUnitStrindex(3) + i2 := l.AppendEmpty() + i2.SetAttributeKeyStrindex(4) + i2.SetUnitStrindex(5) + return l + }(), + actual: func() pprofile.AttributeUnitSlice { + l := pprofile.NewAttributeUnitSlice() + i1 := l.AppendEmpty() + i1.SetAttributeKeyStrindex(2) + i1.SetUnitStrindex(3) + i2 := l.AppendEmpty() + i2.SetAttributeKeyStrindex(4) + i2.SetUnitStrindex(5) + return l + }(), + }, + { + name: "equal wrong order", + expected: func() pprofile.AttributeUnitSlice { + l := pprofile.NewAttributeUnitSlice() + i1 := l.AppendEmpty() + i1.SetAttributeKeyStrindex(2) + i1.SetUnitStrindex(3) + i2 := l.AppendEmpty() + i2.SetAttributeKeyStrindex(4) + i2.SetUnitStrindex(5) + return l + }(), + actual: func() pprofile.AttributeUnitSlice { + l := pprofile.NewAttributeUnitSlice() + i2 := l.AppendEmpty() + i2.SetAttributeKeyStrindex(4) + i2.SetUnitStrindex(5) + i1 := l.AppendEmpty() + i1.SetAttributeKeyStrindex(2) + i1.SetUnitStrindex(3) + return l + }(), + err: multierr.Combine( + errors.New(`attributeUnits are out of order: attributeUnit "attributeKey: 2" expected at index 0, found at index 1`), + errors.New(`attributeUnits are out of order: attributeUnit "attributeKey: 4" expected at index 1, found at index 0`), + ), + }, + { + name: "wrong length", + expected: func() pprofile.AttributeUnitSlice { + l := pprofile.NewAttributeUnitSlice() + i1 := l.AppendEmpty() + i1.SetAttributeKeyStrindex(2) + i1.SetUnitStrindex(3) + return l + }(), + actual: func() pprofile.AttributeUnitSlice { + l := pprofile.NewAttributeUnitSlice() + i1 := l.AppendEmpty() + i1.SetAttributeKeyStrindex(2) + i1.SetUnitStrindex(3) + i2 := l.AppendEmpty() + i2.SetAttributeKeyStrindex(4) + i2.SetUnitStrindex(5) + return l + }(), + err: multierr.Combine( + errors.New(`number of attributeUnits doesn't match expected: 1, actual: 2`), + ), + }, + { + name: "not equal", + expected: func() pprofile.AttributeUnitSlice { + l := pprofile.NewAttributeUnitSlice() + i1 := l.AppendEmpty() + i1.SetAttributeKeyStrindex(2) + i1.SetUnitStrindex(3) + i2 := l.AppendEmpty() + i2.SetAttributeKeyStrindex(4) + i2.SetUnitStrindex(5) + return l + }(), + actual: func() pprofile.AttributeUnitSlice { + l := pprofile.NewAttributeUnitSlice() + i1 := l.AppendEmpty() + i1.SetAttributeKeyStrindex(2) + i1.SetUnitStrindex(3) + i2 := l.AppendEmpty() + i2.SetAttributeKeyStrindex(6) + i2.SetUnitStrindex(7) + return l + }(), + err: multierr.Combine( + errors.New(`missing expected attributeUnit "attributeKey: 4"`), + errors.New(`unexpected profile attributeUnit "attributeKey: 6"`), + ), + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + require.Equal(t, test.err, CompareProfileAttributeUnitSlice(test.expected, test.actual)) + }) + } +} + +func TestCompareProfileLinkSlice(t *testing.T) { + tests := []struct { + name string + expected pprofile.LinkSlice + actual pprofile.LinkSlice + err error + }{ + { + name: "empty", + expected: func() pprofile.LinkSlice { + l := pprofile.NewLinkSlice() + return l + }(), + actual: func() pprofile.LinkSlice { + l := pprofile.NewLinkSlice() + return l + }(), + }, + { + name: "equal", + expected: func() pprofile.LinkSlice { + l := pprofile.NewLinkSlice() + i1 := l.AppendEmpty() + i1.SetSpanID(pcommon.SpanID([]byte("spanidnn"))) + i1.SetTraceID(pcommon.TraceID([]byte("traceidnnnnnnnnn"))) + i2 := l.AppendEmpty() + i2.SetSpanID(pcommon.SpanID([]byte("spanidn2"))) + i2.SetTraceID(pcommon.TraceID([]byte("traceid2nnnnnnnn"))) + return l + }(), + actual: func() pprofile.LinkSlice { + l := pprofile.NewLinkSlice() + i1 := l.AppendEmpty() + i1.SetSpanID(pcommon.SpanID([]byte("spanidnn"))) + i1.SetTraceID(pcommon.TraceID([]byte("traceidnnnnnnnnn"))) + i2 := l.AppendEmpty() + i2.SetSpanID(pcommon.SpanID([]byte("spanidn2"))) + i2.SetTraceID(pcommon.TraceID([]byte("traceid2nnnnnnnn"))) + return l + }(), + }, + { + name: "equal wrong order", + expected: func() pprofile.LinkSlice { + l := pprofile.NewLinkSlice() + i1 := l.AppendEmpty() + i1.SetSpanID(pcommon.SpanID([]byte("spanidnn"))) + i1.SetTraceID(pcommon.TraceID([]byte("traceidnnnnnnnnn"))) + i2 := l.AppendEmpty() + i2.SetSpanID(pcommon.SpanID([]byte("spanidn2"))) + i2.SetTraceID(pcommon.TraceID([]byte("traceid2nnnnnnnn"))) + return l + }(), + actual: func() pprofile.LinkSlice { + l := pprofile.NewLinkSlice() + i2 := l.AppendEmpty() + i2.SetSpanID(pcommon.SpanID([]byte("spanidn2"))) + i2.SetTraceID(pcommon.TraceID([]byte("traceid2nnnnnnnn"))) + i1 := l.AppendEmpty() + i1.SetSpanID(pcommon.SpanID([]byte("spanidnn"))) + i1.SetTraceID(pcommon.TraceID([]byte("traceidnnnnnnnnn"))) + return l + }(), + err: multierr.Combine( + errors.New(`links are out of order: link "spanId: 7370616e69646e6e, traceId: 747261636569646e6e6e6e6e6e6e6e6e" expected at index 0, found at index 1`), + errors.New(`links are out of order: link "spanId: 7370616e69646e32, traceId: 74726163656964326e6e6e6e6e6e6e6e" expected at index 1, found at index 0`), + ), + }, + { + name: "wrong length", + expected: func() pprofile.LinkSlice { + l := pprofile.NewLinkSlice() + i1 := l.AppendEmpty() + i1.SetSpanID(pcommon.SpanID([]byte("spanidnn"))) + i1.SetTraceID(pcommon.TraceID([]byte("traceidnnnnnnnnn"))) + return l + }(), + actual: func() pprofile.LinkSlice { + l := pprofile.NewLinkSlice() + i2 := l.AppendEmpty() + i2.SetSpanID(pcommon.SpanID([]byte("spanidn2"))) + i2.SetTraceID(pcommon.TraceID([]byte("traceid2nnnnnnnn"))) + i1 := l.AppendEmpty() + i1.SetSpanID(pcommon.SpanID([]byte("spanidnn"))) + i1.SetTraceID(pcommon.TraceID([]byte("traceidnnnnnnnnn"))) + return l + }(), + err: multierr.Combine( + errors.New(`number of links doesn't match expected: 1, actual: 2`), + ), + }, + { + name: "not equal", + expected: func() pprofile.LinkSlice { + l := pprofile.NewLinkSlice() + i1 := l.AppendEmpty() + i1.SetSpanID(pcommon.SpanID([]byte("spanidnn"))) + i1.SetTraceID(pcommon.TraceID([]byte("traceidnnnnnnnnn"))) + i2 := l.AppendEmpty() + i2.SetSpanID(pcommon.SpanID([]byte("spanidn3"))) + i2.SetTraceID(pcommon.TraceID([]byte("traceid3nnnnnnnn"))) + return l + }(), + actual: func() pprofile.LinkSlice { + l := pprofile.NewLinkSlice() + i2 := l.AppendEmpty() + i2.SetSpanID(pcommon.SpanID([]byte("spanidn2"))) + i2.SetTraceID(pcommon.TraceID([]byte("traceid2nnnnnnnn"))) + i1 := l.AppendEmpty() + i1.SetSpanID(pcommon.SpanID([]byte("spanidnn"))) + i1.SetTraceID(pcommon.TraceID([]byte("traceidnnnnnnnnn"))) + return l + }(), + err: multierr.Combine( + errors.New(`missing expected link "spanId: 7370616e69646e33, traceId: 74726163656964336e6e6e6e6e6e6e6e"`), + errors.New(`unexpected profile link "spanId: 7370616e69646e32, traceId: 74726163656964326e6e6e6e6e6e6e6e"`), + ), + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + require.Equal(t, test.err, CompareProfileLinkSlice(test.expected, test.actual)) + }) + } +} diff --git a/pkg/pdatautil/go.mod b/pkg/pdatautil/go.mod index 0654176dbf3f..9f03a63076bb 100644 --- a/pkg/pdatautil/go.mod +++ b/pkg/pdatautil/go.mod @@ -1,11 +1,11 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil -go 1.21.0 +go 1.22.0 require ( github.com/cespare/xxhash/v2 v2.3.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/pdata v1.9.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/pdata v1.22.0 go.uber.org/goleak v1.3.0 ) @@ -15,12 +15,12 @@ require ( github.com/kr/text v0.2.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/pkg/pdatautil/go.sum b/pkg/pdatautil/go.sum index 7441a3e1f33b..5907bc85985a 100644 --- a/pkg/pdatautil/go.sum +++ b/pkg/pdatautil/go.sum @@ -5,6 +5,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -17,12 +19,12 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -36,20 +38,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -58,12 +60,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/pkg/pdatautil/hash.go b/pkg/pdatautil/hash.go index 6826de769b89..172789c607bf 100644 --- a/pkg/pdatautil/hash.go +++ b/pkg/pdatautil/hash.go @@ -31,6 +31,31 @@ var ( emptyHash = [16]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} ) +// HashOption is a function that sets an option on the hash calculation. +type HashOption func(*hashWriter) + +// WithMap adds a map to the hash calculation. +func WithMap(m pcommon.Map) HashOption { + return func(hw *hashWriter) { + hw.writeMapHash(m) + } +} + +// WithValue adds a value to the hash calculation. +func WithValue(v pcommon.Value) HashOption { + return func(hw *hashWriter) { + hw.writeValueHash(v) + } +} + +// WithString adds a string to the hash calculation. +func WithString(s string) HashOption { + return func(hw *hashWriter) { + hw.byteBuf = append(hw.byteBuf, valStrPrefix...) + hw.byteBuf = append(hw.byteBuf, s...) + } +} + type hashWriter struct { byteBuf []byte keysBuf []string @@ -47,6 +72,29 @@ var hashWriterPool = &sync.Pool{ New: func() any { return newHashWriter() }, } +// Hash generates a hash for the provided options and returns the computed hash as a [16]byte. +func Hash(opts ...HashOption) [16]byte { + if len(opts) == 0 { + return emptyHash + } + + hw := hashWriterPool.Get().(*hashWriter) + defer hashWriterPool.Put(hw) + hw.byteBuf = hw.byteBuf[:0] + + for _, o := range opts { + o(hw) + } + + return hw.hashSum128() +} + +// Hash64 generates a hash for the provided options and returns the computed hash as a uint64. +func Hash64(opts ...HashOption) uint64 { + hash := Hash(opts...) + return xxhash.Sum64(hash[:]) +} + // MapHash return a hash for the provided map. // Maps with the same underlying key/value pairs in different order produce the same deterministic hash value. func MapHash(m pcommon.Map) [16]byte { @@ -105,8 +153,7 @@ func (hw *hashWriter) writeMapHash(m pcommon.Map) { func (hw *hashWriter) writeValueHash(v pcommon.Value) { switch v.Type() { case pcommon.ValueTypeStr: - hw.byteBuf = append(hw.byteBuf, valStrPrefix...) - hw.byteBuf = append(hw.byteBuf, v.Str()...) + hw.writeString(v.Str()) case pcommon.ValueTypeBool: if v.Bool() { hw.byteBuf = append(hw.byteBuf, valBoolTrue...) @@ -138,6 +185,11 @@ func (hw *hashWriter) writeValueHash(v pcommon.Value) { } } +func (hw *hashWriter) writeString(s string) { + hw.byteBuf = append(hw.byteBuf, valStrPrefix...) + hw.byteBuf = append(hw.byteBuf, s...) +} + // hashSum128 returns a [16]byte hash sum. func (hw *hashWriter) hashSum128() [16]byte { r := [16]byte{} diff --git a/pkg/resourcetotelemetry/go.mod b/pkg/resourcetotelemetry/go.mod index 70fbcbb33b95..6aa03f15bc14 100644 --- a/pkg/resourcetotelemetry/go.mod +++ b/pkg/resourcetotelemetry/go.mod @@ -1,43 +1,38 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/exporter v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/exporter v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 go.uber.org/goleak v1.3.0 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/knadh/koanf/maps v0.1.1 // indirect - github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect - github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - go.opentelemetry.io/collector/component v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/confmap v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/metric v1.27.0 // indirect - go.opentelemetry.io/otel/trace v1.27.0 // indirect + go.opentelemetry.io/collector/component v0.116.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/pkg/resourcetotelemetry/go.sum b/pkg/resourcetotelemetry/go.sum index c7e1b6a28353..20924b98b9df 100644 --- a/pkg/resourcetotelemetry/go.sum +++ b/pkg/resourcetotelemetry/go.sum @@ -1,18 +1,14 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -20,20 +16,10 @@ 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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= -github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= -github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= -github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -41,46 +27,38 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/exporter v0.102.0 h1:hvyTyyGVx5FIikA6HzlTeZHILJ62hrIBsoZCoKlpX3A= -go.opentelemetry.io/collector/exporter v0.102.0/go.mod h1:JWE+1qNoSVBSelzhI3Iao/VkYVssY+sXaTPK1JOmpQ0= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -96,20 +74,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -118,12 +96,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/pkg/resourcetotelemetry/resource_to_telemetry_test.go b/pkg/resourcetotelemetry/resource_to_telemetry_test.go index 17396b512fec..6587d71ad86a 100644 --- a/pkg/resourcetotelemetry/resource_to_telemetry_test.go +++ b/pkg/resourcetotelemetry/resource_to_telemetry_test.go @@ -52,7 +52,6 @@ func TestConvertResourceToAttributesAllDataTypesEmptyDataPoint(t *testing.T) { assert.Equal(t, 1, md.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics().At(4).Histogram().DataPoints().At(0).Attributes().Len()) assert.Equal(t, 1, md.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics().At(5).Summary().DataPoints().At(0).Attributes().Len()) assert.Equal(t, 1, md.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics().At(6).ExponentialHistogram().DataPoints().At(0).Attributes().Len()) - } func BenchmarkJoinAttributes(b *testing.B) { @@ -111,7 +110,6 @@ func BenchmarkJoinAttributes(b *testing.B) { } }) } - } func initMetricAttributes(capacity int, idx int) pcommon.Map { diff --git a/pkg/sampling/common.go b/pkg/sampling/common.go index ad94bac763eb..d97c07087226 100644 --- a/pkg/sampling/common.go +++ b/pkg/sampling/common.go @@ -17,11 +17,9 @@ type KV struct { Value string } -var ( - // ErrTraceStateSize is returned when a TraceState is over its - // size limit, as specified by W3C. - ErrTraceStateSize = errors.New("invalid tracestate size") -) +// ErrTraceStateSize is returned when a TraceState is over its +// size limit, as specified by W3C. +var ErrTraceStateSize = errors.New("invalid tracestate size") // keyValueScanner defines distinct scanner behaviors for lists of // key-values. diff --git a/pkg/sampling/encoding_test.go b/pkg/sampling/encoding_test.go index 2d4bbcd86fab..7a0fc3defc02 100644 --- a/pkg/sampling/encoding_test.go +++ b/pkg/sampling/encoding_test.go @@ -5,7 +5,6 @@ package sampling import ( "encoding/binary" - "errors" "fmt" "math/rand" "strconv" @@ -187,7 +186,7 @@ func TestRValueSyntax(t *testing.T) { rnd, err := RValueToRandomness(test.in) if test.expectErr != nil { - require.True(t, errors.Is(err, test.expectErr), + require.ErrorIs(t, err, test.expectErr, "%q: not expecting %v wanted %v", test.in, err, test.expectErr, ) require.Equal(t, must(RValueToRandomness("00000000000000")), rnd) @@ -241,7 +240,7 @@ func TestTValueSyntax(t *testing.T) { _, err := TValueToThreshold(test.in) if test.expectErr != nil { - require.True(t, errors.Is(err, test.expectErr), + require.ErrorIs(t, err, test.expectErr, "%q: not expecting %v wanted %v", test.in, err, test.expectErr, ) } else { diff --git a/pkg/sampling/go.mod b/pkg/sampling/go.mod index 3d63b36fd301..79d09fcf3881 100644 --- a/pkg/sampling/go.mod +++ b/pkg/sampling/go.mod @@ -1,10 +1,10 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling -go 1.21.0 +go 1.22.0 require ( - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/pdata v1.9.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/pdata v1.22.0 go.uber.org/multierr v1.11.0 ) @@ -13,11 +13,11 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/kr/text v0.2.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/pkg/sampling/go.sum b/pkg/sampling/go.sum index d48703519002..4023ed6f6c93 100644 --- a/pkg/sampling/go.sum +++ b/pkg/sampling/go.sum @@ -3,6 +3,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -15,12 +17,12 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -34,20 +36,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -56,12 +58,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/pkg/sampling/oteltracestate_test.go b/pkg/sampling/oteltracestate_test.go index 4330c01466ab..ba96f054b70b 100644 --- a/pkg/sampling/oteltracestate_test.go +++ b/pkg/sampling/oteltracestate_test.go @@ -4,7 +4,6 @@ package sampling import ( - "errors" "fmt" "strconv" "strings" @@ -88,7 +87,7 @@ func TestOpenTelemetryTraceStateRValuePValue(t *testing.T) { require.Equal(t, "", otts.RValue()) // The error is oblivious to the old r-value, but that's ok. - require.Contains(t, err.Error(), "14 hex digits") + require.ErrorContains(t, err, "14 hex digits") require.Equal(t, []KV{{"p", "2"}}, otts.ExtraValues()) @@ -233,7 +232,7 @@ func TestParseOpenTelemetryTraceState(t *testing.T) { otts, err := NewOpenTelemetryTraceState(test.in) if test.expectErr != nil { - require.True(t, errors.Is(err, test.expectErr), "%q: not expecting %v wanted %v", test.in, err, test.expectErr) + require.ErrorIs(t, err, test.expectErr, "%q: not expecting %v wanted %v", test.in, err, test.expectErr) } else { require.NoError(t, err) } diff --git a/pkg/sampling/randomness_test.go b/pkg/sampling/randomness_test.go index 9d4a164b6509..d0f900e700ad 100644 --- a/pkg/sampling/randomness_test.go +++ b/pkg/sampling/randomness_test.go @@ -24,7 +24,7 @@ func TestExplicitRandomness(t *testing.T) { func ExampleTraceIDToRandomness() { // TraceID represented in hex as "abababababababababd29d6a7215ced0" - var exampleTid = pcommon.TraceID{ + exampleTid := pcommon.TraceID{ // 9 meaningless bytes 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, // 7 bytes randomness diff --git a/pkg/sampling/w3ctracestate_test.go b/pkg/sampling/w3ctracestate_test.go index 02eccf35c01b..b97e4b246a3d 100644 --- a/pkg/sampling/w3ctracestate_test.go +++ b/pkg/sampling/w3ctracestate_test.go @@ -4,7 +4,6 @@ package sampling import ( - "errors" "fmt" "strconv" "strings" @@ -116,7 +115,7 @@ func TestParseW3CTraceState(t *testing.T) { w3c, err := NewW3CTraceState(test.in) if test.expectErr != nil { - require.True(t, errors.Is(err, test.expectErr), + require.ErrorIs(t, err, test.expectErr, "%q: not expecting %v wanted %v", test.in, err, test.expectErr, ) } else { diff --git a/pkg/stanza/adapter/benchmark_test.go b/pkg/stanza/adapter/benchmark_test.go index 947537136cfb..b8641adf2d19 100644 --- a/pkg/stanza/adapter/benchmark_test.go +++ b/pkg/stanza/adapter/benchmark_test.go @@ -15,6 +15,7 @@ import ( "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/consumer/consumertest" "go.opentelemetry.io/collector/receiver/receivertest" + "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/entry" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator" @@ -32,7 +33,7 @@ func TestEndToEnd(t *testing.T) { cfg.BenchOpConfig.NumHosts = numHosts sink := new(consumertest.LogsSink) - rcvr, err := f.CreateLogsReceiver(ctx, receivertest.NewNopCreateSettings(), cfg, sink) + rcvr, err := f.CreateLogs(ctx, receivertest.NewNopSettings(), cfg, sink) require.NoError(t, err) require.NoError(t, rcvr.Start(context.Background(), componenttest.NewNopHost())) @@ -61,7 +62,7 @@ func (bc benchCase) run(b *testing.B) { cfg.BenchOpConfig.NumHosts = numHosts sink := new(consumertest.LogsSink) - rcvr, err := f.CreateLogsReceiver(context.Background(), receivertest.NewNopCreateSettings(), cfg, sink) + rcvr, err := f.CreateLogs(context.Background(), receivertest.NewNopSettings(), cfg, sink) require.NoError(b, err) b.ReportAllocs() @@ -85,7 +86,6 @@ const ( ) func BenchmarkEndToEnd(b *testing.B) { - // These values may have meaningful performance implications, so benchmarks // should cover a variety of values in order to highlight impacts. var ( @@ -197,7 +197,10 @@ func (b *Input) Start(_ operator.Persister) error { return default: } - b.Write(ctx, b.entries[n]) + err := b.Write(ctx, b.entries[n]) + if err != nil { + b.Logger().Error("failed to write entry", zap.Error(err)) + } } }() return nil diff --git a/pkg/stanza/adapter/converter.go b/pkg/stanza/adapter/converter.go index de7c259d648d..a81fd8f00a42 100644 --- a/pkg/stanza/adapter/converter.go +++ b/pkg/stanza/adapter/converter.go @@ -4,240 +4,54 @@ package adapter // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/adapter" import ( - "context" "encoding/binary" "encoding/json" - "errors" "fmt" - "math" - "runtime" "sort" "sync" "github.com/cespare/xxhash/v2" - "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" - "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/entry" ) -// Converter converts a batch of entry.Entry into plog.Logs aggregating translated -// entries into logs coming from the same Resource. -// -// The diagram below illustrates the internal communication inside the Converter: -// -// ┌─────────────────────────────────┐ -// │ Batch() │ -// ┌─────────┤ Ingests batches of log entries │ -// │ │ and sends them onto workerChan │ -// │ └─────────────────────────────────┘ -// │ -// │ ┌───────────────────────────────────────────────────┐ -// ├─► workerLoop() │ -// │ │ ┌─────────────────────────────────────────────────┴─┐ -// ├─┼─► workerLoop() │ -// │ │ │ ┌─────────────────────────────────────────────────┴─┐ -// └─┼─┼─► workerLoop() │ -// └─┤ │ consumes sent log entries from workerChan, │ -// │ │ translates received entries to plog.LogRecords, │ -// └─┤ and sends them on flushChan │ -// └─────────────────────────┬─────────────────────────┘ -// │ -// ▼ -// ┌─────────────────────────────────────────────────────┐ -// │ flushLoop() │ -// │ receives log records from flushChan and sends │ -// │ them onto pLogsChan which is consumed by │ -// │ downstream consumers via OutChannel() │ -// └─────────────────────────────────────────────────────┘ -type Converter struct { - set component.TelemetrySettings - - // pLogsChan is a channel on which aggregated logs will be sent to. - pLogsChan chan plog.Logs - - stopOnce sync.Once - stopChan chan struct{} - - // workerChan is an internal communication channel that gets the log - // entries from Batch() calls and it receives the data in workerLoop(). - workerChan chan []*entry.Entry - // workerCount configures the amount of workers started. - workerCount int - - // flushChan is an internal channel used for transporting batched plog.Logs. - flushChan chan plog.Logs - - // wg is a WaitGroup that makes sure that we wait for spun up goroutines exit - // when Stop() is called. - wg sync.WaitGroup -} - -type converterOption interface { - apply(*Converter) -} - -func withWorkerCount(workerCount int) converterOption { - return workerCountOption{workerCount} -} - -type workerCountOption struct { - workerCount int -} - -func (o workerCountOption) apply(c *Converter) { - c.workerCount = o.workerCount -} - -func NewConverter(set component.TelemetrySettings, opts ...converterOption) *Converter { - set.Logger = set.Logger.With(zap.String("component", "converter")) - c := &Converter{ - set: set, - workerChan: make(chan []*entry.Entry), - workerCount: int(math.Max(1, float64(runtime.NumCPU()/4))), - pLogsChan: make(chan plog.Logs), - stopChan: make(chan struct{}), - flushChan: make(chan plog.Logs), - } - for _, opt := range opts { - opt.apply(c) - } - return c -} - -func (c *Converter) Start() { - c.set.Logger.Debug("Starting log converter", zap.Int("worker_count", c.workerCount)) - - c.wg.Add(c.workerCount) - for i := 0; i < c.workerCount; i++ { - go c.workerLoop() - } - - c.wg.Add(1) - go c.flushLoop() -} - -func (c *Converter) Stop() { - c.stopOnce.Do(func() { - close(c.stopChan) - c.wg.Wait() - close(c.pLogsChan) - }) -} +func ConvertEntries(entries []*entry.Entry) plog.Logs { + resourceHashToIdx := make(map[uint64]int) + scopeIdxByResource := make(map[uint64]map[string]int) -// OutChannel returns the channel on which converted entries will be sent to. -func (c *Converter) OutChannel() <-chan plog.Logs { - return c.pLogsChan -} + pLogs := plog.NewLogs() + var sl plog.ScopeLogs -// workerLoop is responsible for obtaining log entries from Batch() calls, -// converting them to plog.LogRecords batched by Resource, and sending them -// on flushChan. -func (c *Converter) workerLoop() { - defer c.wg.Done() + for _, e := range entries { + resourceID := HashResource(e.Resource) + var rl plog.ResourceLogs - for { + resourceIdx, ok := resourceHashToIdx[resourceID] + if !ok { + resourceHashToIdx[resourceID] = pLogs.ResourceLogs().Len() - select { - case <-c.stopChan: - return + rl = pLogs.ResourceLogs().AppendEmpty() + upsertToMap(e.Resource, rl.Resource().Attributes()) - case entries, ok := <-c.workerChan: + scopeIdxByResource[resourceID] = map[string]int{e.ScopeName: 0} + sl = rl.ScopeLogs().AppendEmpty() + sl.Scope().SetName(e.ScopeName) + } else { + rl = pLogs.ResourceLogs().At(resourceIdx) + scopeIdxInResource, ok := scopeIdxByResource[resourceID][e.ScopeName] if !ok { - return - } - - resourceHashToIdx := make(map[uint64]int) - scopeIdxByResource := make(map[uint64]map[string]int) - - pLogs := plog.NewLogs() - var sl plog.ScopeLogs - - for _, e := range entries { - resourceID := HashResource(e.Resource) - var rl plog.ResourceLogs - - resourceIdx, ok := resourceHashToIdx[resourceID] - if !ok { - resourceHashToIdx[resourceID] = pLogs.ResourceLogs().Len() - - rl = pLogs.ResourceLogs().AppendEmpty() - upsertToMap(e.Resource, rl.Resource().Attributes()) - - scopeIdxByResource[resourceID] = map[string]int{e.ScopeName: 0} - sl = rl.ScopeLogs().AppendEmpty() - sl.Scope().SetName(e.ScopeName) - } else { - rl = pLogs.ResourceLogs().At(resourceIdx) - scopeIdxInResource, ok := scopeIdxByResource[resourceID][e.ScopeName] - if !ok { - scopeIdxByResource[resourceID][e.ScopeName] = rl.ScopeLogs().Len() - sl = rl.ScopeLogs().AppendEmpty() - sl.Scope().SetName(e.ScopeName) - } else { - sl = pLogs.ResourceLogs().At(resourceIdx).ScopeLogs().At(scopeIdxInResource) - } - } - convertInto(e, sl.LogRecords().AppendEmpty()) - } - - // Send plogs directly to flushChan - select { - case c.flushChan <- pLogs: - case <-c.stopChan: - } - } - } -} - -func (c *Converter) flushLoop() { - defer c.wg.Done() - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - for { - select { - case <-c.stopChan: - return - - case pLogs := <-c.flushChan: - if err := c.flush(ctx, pLogs); err != nil { - c.set.Logger.Debug("Problem sending log entries", - zap.Error(err), - ) + scopeIdxByResource[resourceID][e.ScopeName] = rl.ScopeLogs().Len() + sl = rl.ScopeLogs().AppendEmpty() + sl.Scope().SetName(e.ScopeName) + } else { + sl = pLogs.ResourceLogs().At(resourceIdx).ScopeLogs().At(scopeIdxInResource) } } + convertInto(e, sl.LogRecords().AppendEmpty()) } -} - -// flush flushes provided plog.Logs entries onto a channel. -func (c *Converter) flush(ctx context.Context, pLogs plog.Logs) error { - doneChan := ctx.Done() - - select { - case <-doneChan: - return fmt.Errorf("flushing log entries interrupted, err: %w", ctx.Err()) - - case c.pLogsChan <- pLogs: - - // The converter has been stopped so bail the flush. - case <-c.stopChan: - return errors.New("logs converter has been stopped") - } - - return nil -} - -// Batch takes in an entry.Entry and sends it to an available worker for processing. -func (c *Converter) Batch(e []*entry.Entry) error { - select { - case c.workerChan <- e: - return nil - case <-c.stopChan: - return errors.New("logs converter has been stopped") - } + return pLogs } // convert converts one entry.Entry into plog.LogRecord allocating it. @@ -276,7 +90,7 @@ func convertInto(ent *entry.Entry, dest plog.LogRecord) { copy(buffer[0:8], ent.SpanID) dest.SetSpanID(buffer) } - if ent.TraceFlags != nil && len(ent.TraceFlags) > 0 { + if len(ent.TraceFlags) > 0 { // The 8 least significant bits are the trace flags as defined in W3C Trace // Context specification. Don't override the 24 reserved bits. flags := uint32(ent.TraceFlags[0]) @@ -322,6 +136,7 @@ func upsertToAttributeVal(value any, dest pcommon.Value) { upsertToMap(t, dest.SetEmptyMap()) case []any: upsertToSlice(t, dest.SetEmptySlice()) + case nil: default: dest.SetStr(fmt.Sprintf("%v", t)) } diff --git a/pkg/stanza/adapter/converter_test.go b/pkg/stanza/adapter/converter_test.go index 586340c88228..a527e3bddb84 100644 --- a/pkg/stanza/adapter/converter_test.go +++ b/pkg/stanza/adapter/converter_test.go @@ -4,20 +4,15 @@ package adapter import ( - "context" "fmt" "sort" "strconv" - "sync" "testing" "time" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" - "go.uber.org/zap/zaptest" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/entry" ) @@ -42,10 +37,6 @@ func BenchmarkConvertComplex(b *testing.B) { } } -func complexEntries(count int) []*entry.Entry { - return complexEntriesForNDifferentHosts(count, 1) -} - func complexEntriesForNDifferentHosts(count int, n int) []*entry.Entry { ret := make([]*entry.Entry, count) for i := 0; i < count; i++ { @@ -392,163 +383,25 @@ func TestAllConvertedEntriesScopeGrouping(t *testing.T) { t.Run(strconv.Itoa(i), func(t *testing.T) { t.Parallel() - set := componenttest.NewNopTelemetrySettings() - set.Logger = zaptest.NewLogger(t) - converter := NewConverter(set) - converter.Start() - defer converter.Stop() - - go func() { - entries := complexEntriesForNDifferentHostsMDifferentScopes(100, 1, tc.numberOFScopes) - assert.NoError(t, converter.Batch(entries)) - }() - - var ( - timeoutTimer = time.NewTimer(10 * time.Second) - ch = converter.OutChannel() - ) - defer timeoutTimer.Stop() - - select { - case pLogs, ok := <-ch: - if !ok { - break - } - - rLogs := pLogs.ResourceLogs() - rLog := rLogs.At(0) - - ills := rLog.ScopeLogs() - require.Equal(t, ills.Len(), tc.numberOFScopes) - - for i := 0; i < tc.numberOFScopes; i++ { - sl := ills.At(i) - require.Equal(t, sl.Scope().Name(), fmt.Sprintf("scope-%d", i%tc.numberOFScopes)) - require.Equal(t, sl.LogRecords().Len(), tc.logsPerScope) - } - - case <-timeoutTimer.C: - break - } - }) - } -} - -func TestAllConvertedEntriesAreSentAndReceived(t *testing.T) { - t.Parallel() - - testcases := []struct { - entries int - maxFlushCount uint - }{ - { - entries: 10, - maxFlushCount: 10, - }, - { - entries: 10, - maxFlushCount: 3, - }, - { - entries: 100, - maxFlushCount: 20, - }, - } - - for i, tc := range testcases { - tc := tc - - t.Run(strconv.Itoa(i), func(t *testing.T) { - t.Parallel() - - set := componenttest.NewNopTelemetrySettings() - set.Logger = zaptest.NewLogger(t) - converter := NewConverter(set) - converter.Start() - defer converter.Stop() - - go func() { - entries := complexEntries(tc.entries) - for from := 0; from < tc.entries; from += int(tc.maxFlushCount) { - to := from + int(tc.maxFlushCount) - if to > tc.entries { - to = tc.entries - } - assert.NoError(t, converter.Batch(entries[from:to])) - } - }() - - var ( - actualCount int - timeoutTimer = time.NewTimer(10 * time.Second) - ch = converter.OutChannel() - ) - defer timeoutTimer.Stop() - - forLoop: - for { - if tc.entries == actualCount { - break - } - - select { - case pLogs, ok := <-ch: - if !ok { - break forLoop - } - - rLogs := pLogs.ResourceLogs() - require.Equal(t, 1, rLogs.Len()) + entries := complexEntriesForNDifferentHostsMDifferentScopes(100, 1, tc.numberOFScopes) - rLog := rLogs.At(0) - ills := rLog.ScopeLogs() - require.Equal(t, 1, ills.Len()) + pLogs := ConvertEntries(entries) - sl := ills.At(0) + rLogs := pLogs.ResourceLogs() + rLog := rLogs.At(0) - actualCount += sl.LogRecords().Len() + ills := rLog.ScopeLogs() + require.Equal(t, ills.Len(), tc.numberOFScopes) - assert.LessOrEqual(t, uint(sl.LogRecords().Len()), tc.maxFlushCount, - "Received more log records in one flush than configured by maxFlushCount", - ) - - case <-timeoutTimer.C: - break forLoop - } + for i := 0; i < tc.numberOFScopes; i++ { + sl := ills.At(i) + require.Equal(t, sl.Scope().Name(), fmt.Sprintf("scope-%d", i%tc.numberOFScopes)) + require.Equal(t, sl.LogRecords().Len(), tc.logsPerScope) } - - assert.Equal(t, tc.entries, actualCount, - "didn't receive expected number of entries after conversion", - ) }) } } -func TestConverterCancelledContextCancellsTheFlush(t *testing.T) { - set := componenttest.NewNopTelemetrySettings() - set.Logger = zaptest.NewLogger(t) - converter := NewConverter(set) - converter.Start() - defer converter.Stop() - var wg sync.WaitGroup - wg.Add(1) - - ctx, cancel := context.WithCancel(context.Background()) - cancel() - - go func() { - defer wg.Done() - pLogs := plog.NewLogs() - ills := pLogs.ResourceLogs().AppendEmpty().ScopeLogs().AppendEmpty() - - lr := convert(complexEntry()) - lr.CopyTo(ills.LogRecords().AppendEmpty()) - - assert.Error(t, converter.flush(ctx, pLogs)) - }() - wg.Wait() -} - func TestConvertMetadata(t *testing.T) { now := time.Now() @@ -566,6 +419,7 @@ func TestConvertMetadata(t *testing.T) { "int": 123, "double": 12.34, "string": "hello", + "empty": nil, }, } e.Body = true @@ -595,7 +449,7 @@ func TestConvertMetadata(t *testing.T) { require.True(t, ok) mapVal := attVal.Map() - require.Equal(t, 4, mapVal.Len()) + require.Equal(t, 5, mapVal.Len()) attVal, ok = mapVal.Get("bool") require.True(t, ok) @@ -613,6 +467,10 @@ func TestConvertMetadata(t *testing.T) { require.True(t, ok) require.Equal(t, "hello", attVal.Str()) + attVal, ok = mapVal.Get("empty") + require.True(t, ok) + require.Equal(t, pcommon.ValueTypeEmpty, attVal.Type()) + bod := result.Body() require.Equal(t, pcommon.ValueTypeBool, bod.Type()) require.True(t, bod.Bool()) @@ -890,7 +748,8 @@ func TestConvertTrace(t *testing.T) { }, TraceFlags: []byte{ 0x01, - }}) + }, + }) require.Equal(t, pcommon.TraceID( [16]byte{ @@ -911,7 +770,8 @@ func TestConvertTraceEmptyFlags(t *testing.T) { SpanID: []byte{ 0x32, 0xf0, 0xa2, 0x2b, 0x6a, 0x81, 0x2c, 0xff, }, - TraceFlags: []byte{}}) + TraceFlags: []byte{}, + }) require.Equal(t, pcommon.TraceID( [16]byte{ @@ -939,55 +799,17 @@ func BenchmarkConverter(b *testing.B) { for _, wc := range workerCounts { b.Run(fmt.Sprintf("worker_count=%d", wc), func(b *testing.B) { for i := 0; i < b.N; i++ { - set := componenttest.NewNopTelemetrySettings() - set.Logger = zaptest.NewLogger(b) - converter := NewConverter(set, withWorkerCount(wc)) - converter.Start() - defer converter.Stop() - b.ReportAllocs() - go func() { - for from := 0; from < entryCount; from += int(batchSize) { - to := from + int(batchSize) - if to > entryCount { - to = entryCount - } - assert.NoError(b, converter.Batch(entries[from:to])) - } - }() - - var ( - timeoutTimer = time.NewTimer(10 * time.Second) - ch = converter.OutChannel() - ) - defer timeoutTimer.Stop() - - var n int - forLoop: - for { - if n == entryCount { - break - } - - select { - case pLogs, ok := <-ch: - if !ok { - break forLoop - } - - rLogs := pLogs.ResourceLogs() - require.Equal(b, hostsCount, rLogs.Len()) - n += pLogs.LogRecordCount() - - case <-timeoutTimer.C: - break forLoop + for from := 0; from < entryCount; from += int(batchSize) { + to := from + int(batchSize) + if to > entryCount { + to = entryCount } + pLogs := ConvertEntries(entries[from:to]) + rLogs := pLogs.ResourceLogs() + require.Equal(b, hostsCount, rLogs.Len()) } - - assert.Equal(b, entryCount, n, - "didn't receive expected number of entries after conversion", - ) } }) } diff --git a/pkg/stanza/adapter/emitter.go b/pkg/stanza/adapter/emitter.go deleted file mode 100644 index acd78ce02002..000000000000 --- a/pkg/stanza/adapter/emitter.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package adapter // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/adapter" - -import ( - "go.opentelemetry.io/collector/component" - "go.uber.org/zap" - - "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper" -) - -// Deprecated [v0.101.0] Use helper.LogEmitter directly instead -type LogEmitter = helper.LogEmitter - -// Deprecated [v0.101.0] Use helper.NewLogEmitter directly instead -func NewLogEmitter(logger *zap.SugaredLogger, opts ...helper.EmitterOption) *LogEmitter { - return helper.NewLogEmitter(component.TelemetrySettings{Logger: logger.Desugar()}, opts...) -} diff --git a/pkg/stanza/adapter/factory.go b/pkg/stanza/adapter/factory.go index 9c46aac9c686..e4b8c83ecac2 100644 --- a/pkg/stanza/adapter/factory.go +++ b/pkg/stanza/adapter/factory.go @@ -37,7 +37,7 @@ func NewFactory(logReceiverType LogReceiverType, sl component.StabilityLevel) rc func createLogsReceiver(logReceiverType LogReceiverType) rcvr.CreateLogsFunc { return func( _ context.Context, - params rcvr.CreateSettings, + params rcvr.Settings, cfg component.Config, nextConsumer consumer.Logs, ) (rcvr.Logs, error) { @@ -46,14 +46,30 @@ func createLogsReceiver(logReceiverType LogReceiverType) rcvr.CreateLogsFunc { operators := append([]operator.Config{inputCfg}, baseCfg.Operators...) - emitterOpts := []helper.EmitterOption{} + obsrecv, err := receiverhelper.NewObsReport(receiverhelper.ObsReportSettings{ + ReceiverID: params.ID, + ReceiverCreateSettings: params, + }) + if err != nil { + return nil, err + } + rcv := &receiver{ + set: params.TelemetrySettings, + id: params.ID, + consumer: consumerretry.NewLogs(baseCfg.RetryOnFailure, params.Logger, nextConsumer), + obsrecv: obsrecv, + storageID: baseCfg.StorageID, + } + + var emitterOpts []helper.EmitterOption if baseCfg.maxBatchSize > 0 { emitterOpts = append(emitterOpts, helper.WithMaxBatchSize(baseCfg.maxBatchSize)) } if baseCfg.flushInterval > 0 { emitterOpts = append(emitterOpts, helper.WithFlushInterval(baseCfg.flushInterval)) } - emitter := helper.NewLogEmitter(params.TelemetrySettings, emitterOpts...) + + emitter := helper.NewLogEmitter(params.TelemetrySettings, rcv.consumeEntries, emitterOpts...) pipe, err := pipeline.Config{ Operators: operators, DefaultOutput: emitter, @@ -62,27 +78,9 @@ func createLogsReceiver(logReceiverType LogReceiverType) rcvr.CreateLogsFunc { return nil, err } - converterOpts := []converterOption{} - if baseCfg.numWorkers > 0 { - converterOpts = append(converterOpts, withWorkerCount(baseCfg.numWorkers)) - } - converter := NewConverter(params.TelemetrySettings, converterOpts...) - obsrecv, err := receiverhelper.NewObsReport(receiverhelper.ObsReportSettings{ - ReceiverID: params.ID, - ReceiverCreateSettings: params, - }) - if err != nil { - return nil, err - } - return &receiver{ - set: params.TelemetrySettings, - id: params.ID, - pipe: pipe, - emitter: emitter, - consumer: consumerretry.NewLogs(baseCfg.RetryOnFailure, params.Logger, nextConsumer), - converter: converter, - obsrecv: obsrecv, - storageID: baseCfg.StorageID, - }, nil + rcv.emitter = emitter + rcv.pipe = pipe + + return rcv, nil } } diff --git a/pkg/stanza/adapter/factory_test.go b/pkg/stanza/adapter/factory_test.go index fb15d875072a..6eb7d798cad5 100644 --- a/pkg/stanza/adapter/factory_test.go +++ b/pkg/stanza/adapter/factory_test.go @@ -26,7 +26,7 @@ func TestCreateReceiver(t *testing.T) { Builder: json.NewConfig(), }, } - receiver, err := factory.CreateLogsReceiver(context.Background(), receivertest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + receiver, err := factory.CreateLogs(context.Background(), receivertest.NewNopSettings(), cfg, consumertest.NewNop()) require.NoError(t, err, "receiver creation failed") require.NotNil(t, receiver, "receiver creation failed") }) @@ -39,7 +39,7 @@ func TestCreateReceiver(t *testing.T) { Builder: regex.NewConfig(), }, } - receiver, err := factory.CreateLogsReceiver(context.Background(), receivertest.NewNopCreateSettings(), badCfg, consumertest.NewNop()) + receiver, err := factory.CreateLogs(context.Background(), receivertest.NewNopSettings(), badCfg, consumertest.NewNop()) require.Error(t, err, "receiver creation should fail if parser configs aren't valid") require.Nil(t, receiver, "receiver creation should fail if parser configs aren't valid") }) diff --git a/pkg/stanza/adapter/frompdataconverter_test.go b/pkg/stanza/adapter/frompdataconverter_test.go index a60b32684e4f..4e46a6ea5bca 100644 --- a/pkg/stanza/adapter/frompdataconverter_test.go +++ b/pkg/stanza/adapter/frompdataconverter_test.go @@ -126,7 +126,6 @@ func BenchmarkFromPdataConverter(b *testing.B) { for _, wc := range workerCounts { b.Run(fmt.Sprintf("worker_count=%d", wc), func(b *testing.B) { for i := 0; i < b.N; i++ { - converter := NewFromPdataConverter(componenttest.NewNopTelemetrySettings(), wc) converter.Start() defer converter.Stop() @@ -155,7 +154,7 @@ func BenchmarkFromPdataConverter(b *testing.B) { break forLoop } - require.Equal(b, 250_000, len(entries)) + require.Len(b, entries, 250_000) n += len(entries) case <-timeoutTimer.C: diff --git a/pkg/stanza/adapter/integration_test.go b/pkg/stanza/adapter/integration_test.go index f06c5ad8697f..51d7676f355c 100644 --- a/pkg/stanza/adapter/integration_test.go +++ b/pkg/stanza/adapter/integration_test.go @@ -8,6 +8,7 @@ import ( "testing" "time" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/component/componenttest" @@ -26,7 +27,7 @@ import ( func createNoopReceiver(nextConsumer consumer.Logs) (*receiver, error) { set := componenttest.NewNopTelemetrySettings() set.Logger = zap.NewNop() - emitter := helper.NewLogEmitter(set) + pipe, err := pipeline.Config{ Operators: []operator.Config{ { @@ -41,21 +42,24 @@ func createNoopReceiver(nextConsumer consumer.Logs) (*receiver, error) { receiverID := component.MustNewID("test") obsrecv, err := receiverhelper.NewObsReport(receiverhelper.ObsReportSettings{ ReceiverID: receiverID, - ReceiverCreateSettings: receivertest.NewNopCreateSettings(), + ReceiverCreateSettings: receivertest.NewNopSettings(), }) if err != nil { return nil, err } - return &receiver{ - set: set, - id: component.MustNewID("testReceiver"), - pipe: pipe, - emitter: emitter, - consumer: nextConsumer, - converter: NewConverter(componenttest.NewNopTelemetrySettings()), - obsrecv: obsrecv, - }, nil + rcv := &receiver{ + set: set, + id: component.MustNewID("testReceiver"), + pipe: pipe, + consumer: nextConsumer, + obsrecv: obsrecv, + } + + emitter := helper.NewLogEmitter(set, rcv.consumeEntries) + + rcv.emitter = emitter + return rcv, nil } // BenchmarkEmitterToConsumer serves as a benchmark for entries going from the emitter to consumer, @@ -66,9 +70,7 @@ func BenchmarkEmitterToConsumer(b *testing.B) { hostsCount = 4 ) - var ( - entries = complexEntriesForNDifferentHosts(entryCount, hostsCount) - ) + entries := complexEntriesForNDifferentHosts(entryCount, hostsCount) cl := &consumertest.LogsSink{} logsReceiver, err := createNoopReceiver(cl) @@ -105,9 +107,7 @@ func BenchmarkEmitterToConsumerScopeGroupping(b *testing.B) { scopesCount = 2 ) - var ( - entries = complexEntriesForNDifferentHostsMDifferentScopes(entryCount, hostsCount, scopesCount) - ) + entries := complexEntriesForNDifferentHostsMDifferentScopes(entryCount, hostsCount, scopesCount) cl := &consumertest.LogsSink{} logsReceiver, err := createNoopReceiver(cl) @@ -151,12 +151,15 @@ func TestEmitterToConsumer(t *testing.T) { err = logsReceiver.Start(context.Background(), componenttest.NewNopHost()) require.NoError(t, err) - defer func() { require.NoError(t, logsReceiver.Shutdown(context.Background())) }() + defer func() { + require.NoError(t, logsReceiver.emitter.Stop()) + require.NoError(t, logsReceiver.Shutdown(context.Background())) + }() go func() { ctx := context.Background() for _, e := range entries { - require.NoError(t, logsReceiver.emitter.Process(ctx, e)) + assert.NoError(t, logsReceiver.emitter.Process(ctx, e)) } }() diff --git a/pkg/stanza/adapter/receiver.go b/pkg/stanza/adapter/receiver.go index 4df6fd846ba5..5b7760992181 100644 --- a/pkg/stanza/adapter/receiver.go +++ b/pkg/stanza/adapter/receiver.go @@ -6,7 +6,6 @@ package adapter // import "github.com/open-telemetry/opentelemetry-collector-con import ( "context" "fmt" - "sync" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/consumer" @@ -16,21 +15,19 @@ import ( "go.uber.org/multierr" "go.uber.org/zap" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/entry" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/pipeline" ) type receiver struct { - set component.TelemetrySettings - id component.ID - wg sync.WaitGroup - cancel context.CancelFunc + set component.TelemetrySettings + id component.ID - pipe pipeline.Pipeline - emitter *helper.LogEmitter - consumer consumer.Logs - converter *Converter - obsrecv *receiverhelper.ObsReport + pipe pipeline.Pipeline + emitter *helper.LogEmitter + consumer consumer.Logs + obsrecv *receiverhelper.ObsReport storageID *component.ID storageClient storage.Client @@ -41,8 +38,6 @@ var _ rcvr.Logs = (*receiver)(nil) // Start tells the receiver to start func (r *receiver) Start(ctx context.Context, host component.Host) error { - rctx, cancel := context.WithCancel(ctx) - r.cancel = cancel r.set.Logger.Info("Starting stanza receiver") if err := r.setStorageClient(ctx, host); err != nil { @@ -53,96 +48,25 @@ func (r *receiver) Start(ctx context.Context, host component.Host) error { return fmt.Errorf("start stanza: %w", err) } - r.converter.Start() - - // Below we're starting 2 loops: - // * one which reads all the logs produced by the emitter and then forwards - // them to converter - // ... - r.wg.Add(1) - go r.emitterLoop(rctx) - - // ... - // * second one which reads all the logs produced by the converter - // (aggregated by Resource) and then calls consumer to consumer them. - r.wg.Add(1) - go r.consumerLoop(rctx) - - // Those 2 loops are started in separate goroutines because batching in - // the emitter loop can cause a flush, caused by either reaching the max - // flush size or by the configurable ticker which would in turn cause - // a set of log entries to be available for reading in converter's out - // channel. In order to prevent backpressure, reading from the converter - // channel and batching are done in those 2 goroutines. - return nil } -// emitterLoop reads the log entries produced by the emitter and batches them -// in converter. -func (r *receiver) emitterLoop(ctx context.Context) { - defer r.wg.Done() - - // Don't create done channel on every iteration. - doneChan := ctx.Done() - for { - select { - case <-doneChan: - r.set.Logger.Debug("Receive loop stopped") - return - - case e, ok := <-r.emitter.OutChannel(): - if !ok { - continue - } - - if err := r.converter.Batch(e); err != nil { - r.set.Logger.Error("Could not add entry to batch", zap.Error(err)) - } - } - } -} +func (r *receiver) consumeEntries(ctx context.Context, entries []*entry.Entry) { + obsrecvCtx := r.obsrecv.StartLogsOp(ctx) + pLogs := ConvertEntries(entries) + logRecordCount := pLogs.LogRecordCount() -// consumerLoop reads converter log entries and calls the consumer to consumer them. -func (r *receiver) consumerLoop(ctx context.Context) { - defer r.wg.Done() - - // Don't create done channel on every iteration. - doneChan := ctx.Done() - pLogsChan := r.converter.OutChannel() - for { - select { - case <-doneChan: - r.set.Logger.Debug("Consumer loop stopped") - return - - case pLogs, ok := <-pLogsChan: - if !ok { - r.set.Logger.Debug("Converter channel got closed") - continue - } - obsrecvCtx := r.obsrecv.StartLogsOp(ctx) - logRecordCount := pLogs.LogRecordCount() - cErr := r.consumer.ConsumeLogs(ctx, pLogs) - if cErr != nil { - r.set.Logger.Error("ConsumeLogs() failed", zap.Error(cErr)) - } - r.obsrecv.EndLogsOp(obsrecvCtx, "stanza", logRecordCount, cErr) - } + cErr := r.consumer.ConsumeLogs(ctx, pLogs) + if cErr != nil { + r.set.Logger.Error("ConsumeLogs() failed", zap.Error(cErr)) } + r.obsrecv.EndLogsOp(obsrecvCtx, "stanza", logRecordCount, cErr) } // Shutdown is invoked during service shutdown func (r *receiver) Shutdown(ctx context.Context) error { - if r.cancel == nil { - return nil - } - r.set.Logger.Info("Stopping stanza receiver") pipelineErr := r.pipe.Stop() - r.converter.Stop() - r.cancel() - r.wg.Wait() if r.storageClient != nil { clientErr := r.storageClient.Close(ctx) diff --git a/pkg/stanza/adapter/receiver_test.go b/pkg/stanza/adapter/receiver_test.go index f6d620eee3e8..1e08e9498e24 100644 --- a/pkg/stanza/adapter/receiver_test.go +++ b/pkg/stanza/adapter/receiver_test.go @@ -8,13 +8,19 @@ import ( "fmt" "os" "path/filepath" + "sync/atomic" "testing" "time" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/confmap/confmaptest" + "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/consumer/consumertest" + "go.opentelemetry.io/collector/pdata/plog" + "go.opentelemetry.io/collector/receiver/receiverhelper" "go.opentelemetry.io/collector/receiver/receivertest" "gopkg.in/yaml.v2" @@ -31,9 +37,9 @@ func TestStart(t *testing.T) { factory := NewFactory(TestReceiverType{}, component.StabilityLevelDevelopment) - logsReceiver, err := factory.CreateLogsReceiver( + logsReceiver, err := factory.CreateLogs( context.Background(), - receivertest.NewNopCreateSettings(), + receivertest.NewNopSettings(), factory.CreateDefaultConfig(), mockConsumer, ) @@ -43,16 +49,12 @@ func TestStart(t *testing.T) { require.NoError(t, err, "receiver start failed") stanzaReceiver := logsReceiver.(*receiver) - logChan := stanzaReceiver.emitter.OutChannelForWrite() - logChan <- []*entry.Entry{entry.New()} + + stanzaReceiver.consumeEntries(context.Background(), []*entry.Entry{entry.New()}) // Eventually because of asynchronuous nature of the receiver. - require.Eventually(t, - func() bool { - return mockConsumer.LogRecordCount() == 1 - }, - 10*time.Second, 5*time.Millisecond, "one log entry expected", - ) + require.Equal(t, 1, mockConsumer.LogRecordCount()) + require.NoError(t, logsReceiver.Shutdown(context.Background())) } @@ -64,7 +66,7 @@ func TestHandleStartError(t *testing.T) { cfg := factory.CreateDefaultConfig().(*TestConfig) cfg.Input = NewUnstartableConfig() - receiver, err := factory.CreateLogsReceiver(context.Background(), receivertest.NewNopCreateSettings(), cfg, mockConsumer) + receiver, err := factory.CreateLogs(context.Background(), receivertest.NewNopSettings(), cfg, mockConsumer) require.NoError(t, err, "receiver should successfully build") err = receiver.Start(context.Background(), componenttest.NewNopHost()) @@ -75,15 +77,15 @@ func TestHandleConsume(t *testing.T) { mockConsumer := &consumertest.LogsSink{} factory := NewFactory(TestReceiverType{}, component.StabilityLevelDevelopment) - logsReceiver, err := factory.CreateLogsReceiver(context.Background(), receivertest.NewNopCreateSettings(), factory.CreateDefaultConfig(), mockConsumer) + logsReceiver, err := factory.CreateLogs(context.Background(), receivertest.NewNopSettings(), factory.CreateDefaultConfig(), mockConsumer) require.NoError(t, err, "receiver should successfully build") err = logsReceiver.Start(context.Background(), componenttest.NewNopHost()) require.NoError(t, err, "receiver start failed") stanzaReceiver := logsReceiver.(*receiver) - logChan := stanzaReceiver.emitter.OutChannelForWrite() - logChan <- []*entry.Entry{entry.New()} + + stanzaReceiver.consumeEntries(context.Background(), []*entry.Entry{entry.New()}) // Eventually because of asynchronuous nature of the receiver. require.Eventually(t, @@ -102,14 +104,14 @@ func TestHandleConsumeRetry(t *testing.T) { cfg := factory.CreateDefaultConfig() cfg.(*TestConfig).BaseConfig.RetryOnFailure.Enabled = true cfg.(*TestConfig).BaseConfig.RetryOnFailure.InitialInterval = 10 * time.Millisecond - logsReceiver, err := factory.CreateLogsReceiver(context.Background(), receivertest.NewNopCreateSettings(), cfg, mockConsumer) + logsReceiver, err := factory.CreateLogs(context.Background(), receivertest.NewNopSettings(), cfg, mockConsumer) require.NoError(t, err, "receiver should successfully build") require.NoError(t, logsReceiver.Start(context.Background(), componenttest.NewNopHost())) stanzaReceiver := logsReceiver.(*receiver) - logChan := stanzaReceiver.emitter.OutChannelForWrite() - logChan <- []*entry.Entry{entry.New()} + + stanzaReceiver.consumeEntries(context.Background(), []*entry.Entry{entry.New()}) require.Eventually(t, func() bool { @@ -120,21 +122,191 @@ func TestHandleConsumeRetry(t *testing.T) { require.NoError(t, logsReceiver.Shutdown(context.Background())) } +func TestShutdownFlush(t *testing.T) { + mockConsumer := &consumertest.LogsSink{} + factory := NewFactory(TestReceiverType{}, component.StabilityLevelDevelopment) + + logsReceiver, err := factory.CreateLogs(context.Background(), receivertest.NewNopSettings(), factory.CreateDefaultConfig(), mockConsumer) + require.NoError(t, err, "receiver should successfully build") + + err = logsReceiver.Start(context.Background(), componenttest.NewNopHost()) + require.NoError(t, err, "receiver start failed") + + var consumedLogCount atomic.Int32 + closeCh := make(chan struct{}) + stanzaReceiver := logsReceiver.(*receiver) + go func() { + for { + select { + case <-closeCh: + assert.NoError(t, logsReceiver.Shutdown(context.Background())) + fmt.Println(">> Shutdown called") + return + default: + err := stanzaReceiver.emitter.Process(context.Background(), entry.New()) + assert.NoError(t, err) + } + consumedLogCount.Add(1) + } + }() + require.Eventually(t, func() bool { + return consumedLogCount.Load() > 100 + }, 5*time.Second, 5*time.Millisecond) + + close(closeCh) + + // Eventually because of asynchronuous nature of the receiver. + require.EventuallyWithT(t, + func(t *assert.CollectT) { + assert.Equal(t, consumedLogCount.Load(), int32(mockConsumer.LogRecordCount())) + }, + 2*time.Second, 5*time.Millisecond, + ) +} + +func BenchmarkReceiver(b *testing.B) { + b.Run( + "1 Log entry per iteration", + func(b *testing.B) { + benchmarkReceiver(b, 1) + }, + ) + b.Run( + "10 Log entries per iteration", + func(b *testing.B) { + benchmarkReceiver(b, 10) + }, + ) + b.Run( + "100 Log entries per iteration", + func(b *testing.B) { + benchmarkReceiver(b, 100) + }, + ) + b.Run( + "1_000 Log entries per iteration", + func(b *testing.B) { + benchmarkReceiver(b, 1_000) + }, + ) + b.Run( + "10_000 Log entries per iteration", + func(b *testing.B) { + benchmarkReceiver(b, 10_000) + }, + ) +} + +func benchmarkReceiver(b *testing.B, logsPerIteration int) { + iterationComplete := make(chan struct{}) + nextIteration := make(chan struct{}) + + inputBuilder := &testInputBuilder{ + numberOfLogEntries: logsPerIteration, + nextIteration: nextIteration, + } + inputCfg := operator.Config{ + Builder: inputBuilder, + } + + storageClient := storagetest.NewInMemoryClient( + component.KindReceiver, + component.MustNewID("foolog"), + "test", + ) + + obsrecv, err := receiverhelper.NewObsReport(receiverhelper.ObsReportSettings{ReceiverCreateSettings: receivertest.NewNopSettings()}) + require.NoError(b, err) + + mockConsumer := &testConsumer{ + receivedAllLogs: iterationComplete, + expectedLogs: uint32(logsPerIteration), + receivedLogs: atomic.Uint32{}, + } + rcv := &receiver{ + consumer: mockConsumer, + obsrecv: obsrecv, + storageClient: storageClient, + } + + set := componenttest.NewNopTelemetrySettings() + emitter := helper.NewLogEmitter(set, rcv.consumeEntries) + defer func() { + require.NoError(b, emitter.Stop()) + }() + + pipe, err := pipeline.Config{ + Operators: []operator.Config{inputCfg}, + DefaultOutput: emitter, + }.Build(set) + require.NoError(b, err) + + rcv.pipe = pipe + rcv.set = set + rcv.emitter = emitter + + b.ResetTimer() + + require.NoError(b, rcv.Start(context.Background(), nil)) + + for i := 0; i < b.N; i++ { + nextIteration <- struct{}{} + <-iterationComplete + mockConsumer.receivedLogs.Store(0) + } + + require.NoError(b, rcv.Shutdown(context.Background())) +} + func BenchmarkReadLine(b *testing.B) { + receivedAllLogs := make(chan struct{}) filePath := filepath.Join(b.TempDir(), "bench.log") pipelineYaml := fmt.Sprintf(` -- type: file_input +pipeline: + type: file_input include: - %s start_at: beginning`, filePath) - var operatorCfgs []operator.Config - require.NoError(b, yaml.Unmarshal([]byte(pipelineYaml), &operatorCfgs)) + confmapFilePath := filepath.Join(b.TempDir(), "conf.yaml") + require.NoError(b, os.WriteFile(confmapFilePath, []byte(pipelineYaml), 0o600)) + + testConfMaps, err := confmaptest.LoadConf(confmapFilePath) + require.NoError(b, err) + + conf, err := testConfMaps.Sub("pipeline") + require.NoError(b, err) + require.NotNil(b, conf) + + operatorCfg := operator.Config{} + require.NoError(b, conf.Unmarshal(&operatorCfg)) + + operatorCfgs := []operator.Config{operatorCfg} + + storageClient := storagetest.NewInMemoryClient( + component.KindReceiver, + component.MustNewID("foolog"), + "test", + ) + + obsrecv, err := receiverhelper.NewObsReport(receiverhelper.ObsReportSettings{ReceiverCreateSettings: receivertest.NewNopSettings()}) + require.NoError(b, err) + + mockConsumer := &testConsumer{ + receivedAllLogs: receivedAllLogs, + expectedLogs: uint32(b.N), + receivedLogs: atomic.Uint32{}, + } + rcv := &receiver{ + consumer: mockConsumer, + obsrecv: obsrecv, + storageClient: storageClient, + } set := componenttest.NewNopTelemetrySettings() - emitter := helper.NewLogEmitter(set) + emitter := helper.NewLogEmitter(set, rcv.consumeEntries) defer func() { require.NoError(b, emitter.Stop()) }() @@ -145,30 +317,25 @@ func BenchmarkReadLine(b *testing.B) { }.Build(set) require.NoError(b, err) + rcv.pipe = pipe + rcv.set = set + rcv.emitter = emitter + // Populate the file that will be consumed - file, err := os.OpenFile(filePath, os.O_RDWR|os.O_CREATE, 0666) + file, err := os.OpenFile(filePath, os.O_RDWR|os.O_CREATE, 0o666) require.NoError(b, err) for i := 0; i < b.N; i++ { _, err := file.WriteString("testlog\n") require.NoError(b, err) } - storageClient := storagetest.NewInMemoryClient( - component.KindReceiver, - component.MustNewID("foolog"), - "test", - ) - // Run the actual benchmark b.ResetTimer() - require.NoError(b, pipe.Start(storageClient)) - logChan := emitter.OutChannel() - for i := 0; i < b.N; i++ { - entries := <-logChan - for _, e := range entries { - convert(e) - } - } + require.NoError(b, rcv.Start(context.Background(), nil)) + + <-receivedAllLogs + + require.NoError(b, rcv.Shutdown(context.Background())) } func BenchmarkParseAndMap(b *testing.B) { @@ -201,7 +368,11 @@ func BenchmarkParseAndMap(b *testing.B) { require.NoError(b, yaml.Unmarshal([]byte(pipelineYaml), &operatorCfgs)) set := componenttest.NewNopTelemetrySettings() - emitter := helper.NewLogEmitter(set) + emitter := helper.NewLogEmitter(set, func(_ context.Context, entries []*entry.Entry) { + for _, e := range entries { + convert(e) + } + }) defer func() { require.NoError(b, emitter.Stop()) }() @@ -213,7 +384,7 @@ func BenchmarkParseAndMap(b *testing.B) { require.NoError(b, err) // Populate the file that will be consumed - file, err := os.OpenFile(filePath, os.O_RDWR|os.O_CREATE, 0666) + file, err := os.OpenFile(filePath, os.O_RDWR|os.O_CREATE, 0o666) require.NoError(b, err) for i := 0; i < b.N; i++ { _, err := file.WriteString(fmt.Sprintf("10.33.121.119 - - [11/Aug/2020:00:00:00 -0400] \"GET /index.html HTTP/1.1\" 404 %d\n", i%1000)) @@ -229,11 +400,94 @@ func BenchmarkParseAndMap(b *testing.B) { // Run the actual benchmark b.ResetTimer() require.NoError(b, pipe.Start(storageClient)) - logChan := emitter.OutChannel() - for i := 0; i < b.N; i++ { - entries := <-logChan - for _, e := range entries { - convert(e) +} + +const testInputOperatorTypeStr = "test_input" + +type testInputBuilder struct { + numberOfLogEntries int + nextIteration chan struct{} +} + +func (t *testInputBuilder) ID() string { + return testInputOperatorTypeStr +} + +func (t *testInputBuilder) Type() string { + return testInputOperatorTypeStr +} + +func (t *testInputBuilder) Build(settings component.TelemetrySettings) (operator.Operator, error) { + inputConfig := helper.NewInputConfig(t.ID(), testInputOperatorTypeStr) + inputOperator, err := inputConfig.Build(settings) + if err != nil { + return nil, err + } + + return &testInputOperator{ + InputOperator: inputOperator, + numberOfLogEntries: t.numberOfLogEntries, + nextIteration: t.nextIteration, + }, nil +} + +func (t *testInputBuilder) SetID(_ string) {} + +var _ operator.Operator = &testInputOperator{} + +type testInputOperator struct { + helper.InputOperator + numberOfLogEntries int + nextIteration chan struct{} + cancelFunc context.CancelFunc +} + +func (t *testInputOperator) ID() string { + return testInputOperatorTypeStr +} + +func (t *testInputOperator) Type() string { + return testInputOperatorTypeStr +} + +func (t *testInputOperator) Start(_ operator.Persister) error { + ctx, cancelFunc := context.WithCancel(context.Background()) + t.cancelFunc = cancelFunc + + e := complexEntry() + go func() { + for { + select { + case <-t.nextIteration: + for i := 0; i < t.numberOfLogEntries; i++ { + _ = t.Write(context.Background(), e) + } + case <-ctx.Done(): + return + } } + }() + return nil +} + +func (t *testInputOperator) Stop() error { + t.cancelFunc() + return nil +} + +type testConsumer struct { + receivedAllLogs chan struct{} + expectedLogs uint32 + receivedLogs atomic.Uint32 +} + +func (t *testConsumer) Capabilities() consumer.Capabilities { + return consumer.Capabilities{} +} + +func (t *testConsumer) ConsumeLogs(_ context.Context, ld plog.Logs) error { + if t.receivedLogs.Add(uint32(ld.LogRecordCount())) >= t.expectedLogs { + t.receivedAllLogs <- struct{}{} } + return nil } diff --git a/pkg/stanza/adapter/storage.go b/pkg/stanza/adapter/storage.go index 56b933a13e13..86d0b7d596e4 100644 --- a/pkg/stanza/adapter/storage.go +++ b/pkg/stanza/adapter/storage.go @@ -27,7 +27,6 @@ func GetStorageClient(ctx context.Context, host component.Host, storageID *compo } return storageExtension.GetClient(ctx, component.KindReceiver, componentID, "") - } func (r *receiver) setStorageClient(ctx context.Context, host component.Host) error { diff --git a/pkg/stanza/adapter/storage_test.go b/pkg/stanza/adapter/storage_test.go index d24b583a40e5..3e5f96a31309 100644 --- a/pkg/stanza/adapter/storage_test.go +++ b/pkg/stanza/adapter/storage_test.go @@ -106,14 +106,14 @@ func TestFailOnNonStorageExtension(t *testing.T) { } func createReceiver(t *testing.T, storageID component.ID) *receiver { - params := rcvr.CreateSettings{ + params := rcvr.Settings{ ID: component.MustNewID("testreceiver"), TelemetrySettings: componenttest.NewNopTelemetrySettings(), } factory := NewFactory(TestReceiverType{}, component.StabilityLevelDevelopment) - logsReceiver, err := factory.CreateLogsReceiver( + logsReceiver, err := factory.CreateLogs( context.Background(), params, factory.CreateDefaultConfig(), diff --git a/pkg/stanza/decode/decode.go b/pkg/stanza/decode/decode.go index af40643a0cc6..0af0e3f3c361 100644 --- a/pkg/stanza/decode/decode.go +++ b/pkg/stanza/decode/decode.go @@ -10,8 +10,9 @@ import ( "golang.org/x/text/encoding" "golang.org/x/text/encoding/ianaindex" - "golang.org/x/text/encoding/unicode" "golang.org/x/text/transform" + + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/textutils" ) type Decoder struct { @@ -46,20 +47,9 @@ func (d *Decoder) Decode(msgBuf []byte) ([]byte, error) { } } -var encodingOverrides = map[string]encoding.Encoding{ - "": unicode.UTF8, - "nop": encoding.Nop, - "ascii": unicode.UTF8, - "us-ascii": unicode.UTF8, - "utf8": unicode.UTF8, - "utf-8": unicode.UTF8, - "utf16": unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM), - "utf-16": unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM), -} - // LookupEncoding attempts to match the string name provided with a character set encoding. func LookupEncoding(enc string) (encoding.Encoding, error) { - if e, ok := encodingOverrides[strings.ToLower(enc)]; ok { + if e, ok := textutils.EncodingOverridesMap.Get(strings.ToLower(enc)); ok { return e, nil } e, err := ianaindex.IANA.Encoding(enc) diff --git a/pkg/stanza/docs/operators/container.md b/pkg/stanza/docs/operators/container.md index 8c3fe381eccc..9935c04b3ddc 100644 --- a/pkg/stanza/docs/operators/container.md +++ b/pkg/stanza/docs/operators/container.md @@ -31,17 +31,13 @@ will produce the following k8s metadata: ```json { - "attributes": { - "k8s": { - "container": { - "name": "kube-controller", - "restart_count": "1" - }, "pod": { - "uid": "49cc7c1fd3702c40b2686ea7486091d6", - "name": "kube-controller-kind-control-plane" - }, "namespace": { - "name": "some-ns" - } + "resource": { + "attributes": { + "k8s.pod.name": "kube-controller-kind-control-plane", + "k8s.pod.uid": "49cc7c1fd3702c40b2686ea7486091d6", + "k8s.container.name": "kube-controller", + "k8s.container.restart_count": "1", + "k8s.namespace.name": "some" } } } @@ -69,7 +65,7 @@ Note: in this example the `format: docker` is optional since formats can be auto ```json { "timestamp": "", - "body": "{\"log\":\"INFO: log line here\",\"stream\":\"stdout\",\"time\":\"2029-03-30T08:31:20.545192187Z\"}", + "body": "{\"log\":\"INFO: log line here\",\"stream\":\"stdout\",\"time\":\"2024-03-30T08:31:20.545192187Z\"}", "log.file.path": "/var/log/pods/some_kube-controller-kind-control-plane_49cc7c1fd3702c40b2686ea7486091d6/kube-controller/1.log" } ``` @@ -80,16 +76,20 @@ Note: in this example the `format: docker` is optional since formats can be auto ```json { "timestamp": "2024-03-30 08:31:20.545192187 +0000 UTC", - "body": "log line here", + "body": "INFO: log line here", "attributes": { "time": "2024-03-30T08:31:20.545192187Z", "log.iostream": "stdout", - "k8s.pod.name": "kube-controller-kind-control-plane", - "k8s.pod.uid": "49cc7c1fd3702c40b2686ea7486091d6", - "k8s.container.name": "kube-controller", - "k8s.container.restart_count": "1", - "k8s.namespace.name": "some", "log.file.path": "/var/log/pods/some_kube-controller-kind-control-plane_49cc7c1fd3702c40b2686ea7486091d6/kube-controller/1.log" + }, + "resource": { + "attributes": { + "k8s.pod.name": "kube-controller-kind-control-plane", + "k8s.pod.uid": "49cc7c1fd3702c40b2686ea7486091d6", + "k8s.container.name": "kube-controller", + "k8s.container.restart_count": "1", + "k8s.namespace.name": "some" + } } } ``` @@ -129,12 +129,16 @@ Configuration: "time": "2024-04-13T07:59:37.505201169-05:00", "logtag": "F", "log.iostream": "stdout", - "k8s.pod.name": "kube-controller-kind-control-plane", - "k8s.pod.uid": "49cc7c1fd3702c40b2686ea7486091d6", - "k8s.container.name": "kube-controller", - "k8s.container.restart_count": "1", - "k8s.namespace.name": "some", "log.file.path": "/var/log/pods/some_kube-controller-kind-control-plane_49cc7c1fd3702c40b2686ea7486091d6/kube-controller/1.log" + }, + "resource": { + "attributes": { + "k8s.pod.name": "kube-controller-kind-control-plane", + "k8s.pod.uid": "49cc7c1fd3702c40b2686ea7486091d6", + "k8s.container.name": "kube-controller", + "k8s.container.restart_count": "1", + "k8s.namespace.name": "some" + } } } ``` @@ -174,12 +178,16 @@ Configuration: "time": "2023-06-22T10:27:25.813799277Z", "logtag": "F", "log.iostream": "stdout", - "k8s.pod.name": "kube-controller-kind-control-plane", - "k8s.pod.uid": "49cc7c1fd3702c40b2686ea7486091d6", - "k8s.container.name": "kube-controller", - "k8s.container.restart_count": "1", - "k8s.namespace.name": "some", "log.file.path": "/var/log/pods/some_kube-controller-kind-control-plane_49cc7c1fd3702c40b2686ea7486091d6/kube-controller/1.log" + }, + "resource": { + "attributes": { + "k8s.pod.name": "kube-controller-kind-control-plane", + "k8s.pod.uid": "49cc7c1fd3702c40b2686ea7486091d6", + "k8s.container.name": "kube-controller", + "k8s.container.restart_count": "1", + "k8s.namespace.name": "some" + } } } ``` @@ -203,12 +211,12 @@ Configuration: -```json +```json lines { "timestamp": "", "body": "2023-06-22T10:27:25.813799277Z stdout P multiline containerd line that i", "log.file.path": "/var/log/pods/some_kube-controller-kind-control-plane_49cc7c1fd3702c40b2686ea7486091d6/kube-controller/1.log" -}, +} { "timestamp": "", "body": "2023-06-22T10:27:25.813799277Z stdout F s super awesomne", @@ -227,16 +235,95 @@ Configuration: "time": "2023-06-22T10:27:25.813799277Z", "logtag": "F", "log.iostream": "stdout", - "k8s.pod.name": "kube-controller-kind-control-plane", - "k8s.pod.uid": "49cc7c1fd3702c40b2686ea7486091d6", - "k8s.container.name": "kube-controller", - "k8s.container.restart_count": "1", - "k8s.namespace.name": "some", "log.file.path": "/var/log/pods/some_kube-controller-kind-control-plane_49cc7c1fd3702c40b2686ea7486091d6/kube-controller/1.log" + }, + "resource": { + "attributes": { + "k8s.pod.name": "kube-controller-kind-control-plane", + "k8s.pod.uid": "49cc7c1fd3702c40b2686ea7486091d6", + "k8s.container.name": "kube-controller", + "k8s.container.restart_count": "1", + "k8s.namespace.name": "some" + } + } +} +``` + + + + + + +#### Parse multiline logs and recombine into a single one + +If you are using the Docker format (or log tag indicators are not working), +you can recombine multiline logs into a single one. + +Configuration: +```yaml +receivers: + filelog: + include: + - /var/log/pods/*/my-service/*.log + include_file_path: true + operators: + - id: container-parser + type: container + - id: recombine + type: recombine + combine_field: body + is_first_entry: body matches "^\\d{4}-\\d{2}-\\d{2}T\\d{2}" +``` + + + + + + -
Input body Output body
+ +```json lines +{ + "timestamp": "", + "body": "{\"log\":\"2024-07-03T13:50:49.526Z WARN 1 --- [http-nio-8080-exec-6] c.m.antifraud.FraudDetectionController : checkOrder\",\"stream\":\"stdout\",\"time\":\"2024-03-30T08:31:20.545192187Z\"}", + "log.file.path": "/var/log/pods/some_kube-controller-kind-control-plane_49cc7c1fd3702c40b2686ea7486091d6/kube-controller/1.log" +} +{ + "timestamp": "", + "body": "{\"log\":\"java.net.ConnectException: Failed to connect to\",\"stream\":\"stdout\",\"time\":\"2024-03-30T08:31:20.545192187Z\"}", + "log.file.path": "/var/log/pods/some_kube-controller-kind-control-plane_49cc7c1fd3702c40b2686ea7486091d6/kube-controller/1.log" +} +``` + + + +```json +{ + "timestamp": "2024-03-30 08:31:20.545192187 +0000 UTC", + "body": "2024-07-03T13:50:49.526Z WARN 1 --- [http-nio-8080-exec-6] c.m.antifraud.FraudDetectionController : checkOrder\njava.net.ConnectException: Failed to connect to", + "attributes": { + "time": "2024-03-30T08:31:20.545192187Z", + "log.iostream": "stdout", + "log.file.path": "/var/log/pods/some_kube-controller-kind-control-plane_49cc7c1fd3702c40b2686ea7486091d6/kube-controller/1.log" + }, + "resource": { + "attributes": { + "k8s.pod.name": "kube-controller-kind-control-plane", + "k8s.pod.uid": "49cc7c1fd3702c40b2686ea7486091d6", + "k8s.container.name": "kube-controller", + "k8s.container.restart_count": "1", + "k8s.namespace.name": "some" + } } } ```
\ No newline at end of file + + +### Removing original time field + +In order to remove the original time field from the log records users can enable the +`filelog.container.removeOriginalTimeField` feature gate. +The feature gate `filelog.container.removeOriginalTimeField` will be deprecated and eventually removed +in the future, following the [feature lifecycle](https://github.com/open-telemetry/opentelemetry-collector/tree/main/featuregate#feature-lifecycle). diff --git a/pkg/stanza/docs/operators/file_input.md b/pkg/stanza/docs/operators/file_input.md index fadfe71852d6..77be99e986f5 100644 --- a/pkg/stanza/docs/operators/file_input.md +++ b/pkg/stanza/docs/operators/file_input.md @@ -4,35 +4,37 @@ The `file_input` operator reads logs from files. It will place the lines read in ### Configuration Fields -| Field | Default | Description | -| --- | --- | --- | -| `id` | `file_input` | A unique identifier for the operator. | -| `output` | Next in pipeline | The connected operator(s) that will receive all outbound entries. | -| `include` | required | A list of file glob patterns that match the file paths to be read. | -| `exclude` | [] | A list of file glob patterns to exclude from reading. | -| `poll_interval` | 200ms | The duration between filesystem polls. | -| `multiline` | | A `multiline` configuration block. See below for details. | -| `force_flush_period` | `500ms` | Time since last read of data from file, after which currently buffered log should be send to pipeline. Takes `time.Time` as value. Zero means waiting for new data forever. | -| `encoding` | `utf-8` | The encoding of the file being read. See the list of supported encodings below for available options. | -| `include_file_name` | `true` | Whether to add the file name as the attribute `log.file.name`. | -| `include_file_path` | `false` | Whether to add the file path as the attribute `log.file.path`. | -| `include_file_name_resolved` | `false` | Whether to add the file name after symlinks resolution as the attribute `log.file.name_resolved`. | -| `include_file_path_resolved` | `false` | Whether to add the file path after symlinks resolution as the attribute `log.file.path_resolved`. | -| `include_file_owner_name` | `false` | Whether to add the file owner name as the attribute `log.file.owner.name`. Not supported for windows. | -| `include_file_owner_group_name` | `false` | Whether to add the file group name as the attribute `log.file.owner.group.name`. Not supported for windows. | +| Field | Default | Description | +|---------------------------------| --- |------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `id` | `file_input` | A unique identifier for the operator. | +| `output` | Next in pipeline | The connected operator(s) that will receive all outbound entries. | +| `include` | required | A list of file glob patterns that match the file paths to be read. | +| `exclude` | [] | A list of file glob patterns to exclude from reading. | +| `poll_interval` | 200ms | The duration between filesystem polls. | +| `multiline` | | A `multiline` configuration block. See below for details. | +| `force_flush_period` | `500ms` | Time since last read of data from file, after which currently buffered log should be send to pipeline. Takes `time.Time` as value. Zero means waiting for new data forever. | +| `encoding` | `utf-8` | The encoding of the file being read. See the list of supported encodings below for available options. | +| `include_file_name` | `true` | Whether to add the file name as the attribute `log.file.name`. | +| `include_file_path` | `false` | Whether to add the file path as the attribute `log.file.path`. | +| `include_file_name_resolved` | `false` | Whether to add the file name after symlinks resolution as the attribute `log.file.name_resolved`. | +| `include_file_path_resolved` | `false` | Whether to add the file path after symlinks resolution as the attribute `log.file.path_resolved`. | +| `include_file_owner_name` | `false` | Whether to add the file owner name as the attribute `log.file.owner.name`. Not supported for windows. | +| `include_file_owner_group_name` | `false` | Whether to add the file group name as the attribute `log.file.owner.group.name`. Not supported for windows. | +| `include_file_record_number` | `false` | Whether to add the record's record number in the file as the attribute `log.file.record_number`. | | `preserve_leading_whitespaces` | `false` | Whether to preserve leading whitespaces. | -| `preserve_trailing_whitespaces` | `false` | Whether to preserve trailing whitespaces. | -| `start_at` | `end` | At startup, where to start reading logs from the file. Options are `beginning` or `end`. This setting will be ignored if previously read file offsets are retrieved from a persistence mechanism. | +| `preserve_trailing_whitespaces` | `false` | Whether to preserve trailing whitespaces. | +| `start_at` | `end` | At startup, where to start reading logs from the file. Options are `beginning` or `end`. This setting will be ignored if previously read file offsets are retrieved from a persistence mechanism. | | `fingerprint_size` | `1kb` | The number of bytes with which to identify a file. The first bytes in the file are used as the fingerprint. Decreasing this value at any point will cause existing fingerprints to forgotten, meaning that all files will be read from the beginning (one time). | -| `max_log_size` | `1MiB` | The maximum size of a log entry to read before failing. Protects against reading large amounts of data into memory |. -| `max_concurrent_files` | 1024 | The maximum number of log files from which logs will be read concurrently (minimum = 2). If the number of files matched in the `include` pattern exceeds half of this number, then files will be processed in batches. | -| `max_batches` | 0 | Only applicable when files must be batched in order to respect `max_concurrent_files`. This value limits the number of batches that will be processed during a single poll interval. A value of 0 indicates no limit. | -| `delete_after_read` | `false` | If `true`, each log file will be read and then immediately deleted. Requires that the `filelog.allowFileDeletion` feature gate is enabled. | -| `attributes` | {} | A map of `key: value` pairs to add to the entry's attributes. | -| `resource` | {} | A map of `key: value` pairs to add to the entry's resource. | -| `header` | nil | Specifies options for parsing header metadata. Requires that the `filelog.allowHeaderMetadataParsing` feature gate is enabled. See below for details. | -| `header.pattern` | required for header metadata parsing | A regex that matches every header line. | -| `header.metadata_operators` | required for header metadata parsing | A list of operators used to parse metadata from the header. | +| `max_log_size` | `1MiB` | The maximum size of a log entry to read before failing. Protects against reading large amounts of data into memory |. +| `max_concurrent_files` | 1024 | The maximum number of log files from which logs will be read concurrently (minimum = 2). If the number of files matched in the `include` pattern exceeds half of this number, then files will be processed in batches. | +| `max_batches` | 0 | Only applicable when files must be batched in order to respect `max_concurrent_files`. This value limits the number of batches that will be processed during a single poll interval. A value of 0 indicates no limit. | +| `delete_after_read` | `false` | If `true`, each log file will be read and then immediately deleted. Requires that the `filelog.allowFileDeletion` feature gate is enabled. | +| `acquire_fs_lock` | `false` | Whether to attempt to acquire a filesystem lock before reading a file (Unix only). | +| `attributes` | {} | A map of `key: value` pairs to add to the entry's attributes. | +| `resource` | {} | A map of `key: value` pairs to add to the entry's resource. | +| `header` | nil | Specifies options for parsing header metadata. Requires that the `filelog.allowHeaderMetadataParsing` feature gate is enabled. See below for details. | +| `header.pattern` | required for header metadata parsing | A regex that matches every header line. | +| `header.metadata_operators` | required for header metadata parsing | A list of operators used to parse metadata from the header. | Note that by default, no logs will be read unless the monitored file is actively being written to because `start_at` defaults to `end`. diff --git a/pkg/stanza/docs/operators/json_parser.md b/pkg/stanza/docs/operators/json_parser.md index f173c337ed15..2f8f2c2286bd 100644 --- a/pkg/stanza/docs/operators/json_parser.md +++ b/pkg/stanza/docs/operators/json_parser.md @@ -4,16 +4,17 @@ The `json_parser` operator parses the string-type field selected by `parse_from` ### Configuration Fields -| Field | Default | Description | -| --- | --- | --- | -| `id` | `json_parser` | A unique identifier for the operator. | -| `output` | Next in pipeline | The connected operator(s) that will receive all outbound entries. | -| `parse_from` | `body` | The [field](../types/field.md) from which the value will be parsed. | -| `parse_to` | `attributes` | The [field](../types/field.md) to which the value will be parsed. | -| `on_error` | `send` | The behavior of the operator if it encounters an error. See [on_error](../types/on_error.md). | -| `if` | | An [expression](../types/expression.md) that, when set, will be evaluated to determine whether this operator should be used for the given entry. This allows you to do easy conditional parsing without branching logic with routers. | -| `timestamp` | `nil` | An optional [timestamp](../types/timestamp.md) block which will parse a timestamp field before passing the entry to the output operator. | -| `severity` | `nil` | An optional [severity](../types/severity.md) block which will parse a severity field before passing the entry to the output operator. | +| Field | Default | Description | +| --- | --- | --- | +| `id` | `json_parser` | A unique identifier for the operator. | +| `output` | Next in pipeline | The connected operator(s) that will receive all outbound entries. | +| `parse_from` | `body` | The [field](../types/field.md) from which the value will be parsed. | +| `parse_to` | `attributes` | The [field](../types/field.md) to which the value will be parsed. | +| `on_error` | `send` | The behavior of the operator if it encounters an error. See [on_error](../types/on_error.md). | +| `if` | | An [expression](../types/expression.md) that, when set, will be evaluated to determine whether this operator should be used for the given entry. This allows you to do easy conditional parsing without branching logic with routers. | +| `timestamp` | `nil` | An optional [timestamp](../types/timestamp.md) block which will parse a timestamp field before passing the entry to the output operator. | +| `severity` | `nil` | An optional [severity](../types/severity.md) block which will parse a severity field before passing the entry to the output operator. | +| `parse_ints` | `false` | Numbers like `int` and `float` are parsed as `float64` by default. When `parse_ints` is enabled, numbers are parsed as `json.Number` and then converted to `int64` or `float64` based on the value. However, this also introduces additional overhead. | ### Embedded Operations diff --git a/pkg/stanza/docs/operators/recombine.md b/pkg/stanza/docs/operators/recombine.md index 791bf4e09a91..891b1af079fe 100644 --- a/pkg/stanza/docs/operators/recombine.md +++ b/pkg/stanza/docs/operators/recombine.md @@ -11,7 +11,7 @@ The `recombine` operator combines consecutive logs into single logs based on sim | `on_error` | `send` | The behavior of the operator if it encounters an error. See [on_error](../types/on_error.md). | | `is_first_entry` | | An [expression](../types/expression.md) that returns true if the entry being processed is the first entry in a multiline series. | | `is_last_entry` | | An [expression](../types/expression.md) that returns true if the entry being processed is the last entry in a multiline series. | -| `combine_field` | required | The [field](../types/field.md) from all the entries that will recombined. | +| `combine_field` | required | The [field](../types/field.md) from all the entries that will be recombined. | | `combine_with` | `"\n"` | The string that is put between the combined entries. This can be an empty string as well. When using special characters like `\n`, be sure to enclose the value in double quotes: `"\n"`. | | `max_batch_size` | 1000 | The maximum number of consecutive entries that will be combined into a single entry. | | `max_unmatched_batch_size` | 100 | The maximum number of consecutive entries that will be combined into a single entry before the match occurs (with `is_first_entry` or `is_last_entry`), e.g. `max_unmatched_batch_size=0` - all entries combined, `max_unmatched_batch_size=1` - all entries uncombined until the match occurs, `max_unmatched_batch_size=100` - entries combined into 100-entry-packages until the match occurs | diff --git a/pkg/stanza/docs/operators/severity_parser.md b/pkg/stanza/docs/operators/severity_parser.md index d9f256ac6152..c78f133a0900 100644 --- a/pkg/stanza/docs/operators/severity_parser.md +++ b/pkg/stanza/docs/operators/severity_parser.md @@ -4,16 +4,16 @@ The `severity_parser` operator sets the severity on an entry by parsing a value ### Configuration Fields -| Field | Default | Description | -| --- | --- | --- | -| `id` | `severity_parser` | A unique identifier for the operator. | -| `output` | Next in pipeline | The `id` for the operator to send parsed entries to. | -| `parse_from` | required | The [field](../types/field.md) from which the value will be parsed. | -| `on_error` | `send` | The behavior of the operator if it encounters an error. See [on_error](../types/on_error.md). | -| `preset` | `default` | A predefined set of values that should be interpreted at specific severity levels. | -| `mapping` | | A formatted set of values that should be interpreted as severity levels. | -| `if` | | An [expression](../types/expression.md) that, when set, will be evaluated to determine whether this operator should be used for the given entry. This allows you to do easy conditional parsing without branching logic with routers. | - +| Field | Default | Description | +| --- | --- | --- | +| `id` | `severity_parser` | A unique identifier for the operator. | +| `output` | Next in pipeline | The `id` for the operator to send parsed entries to. | +| `parse_from` | required | The [field](../types/field.md) from which the value will be parsed. | +| `on_error` | `send` | The behavior of the operator if it encounters an error. See [on_error](../types/on_error.md). | +| `preset` | `default` | A predefined set of values that should be interpreted at specific severity levels. | +| `mapping` | | A formatted set of values that should be interpreted as severity levels. | +| `overwrite_with` | `false` | If `true`, the severity text will be set to the [standard short name](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/logs/data-model.md#displaying-severity) corresponding to the severity number. | +| `if` | | An [expression](../types/expression.md) that, when set, will be evaluated to determine whether this operator should be used for the given entry. This allows you to do easy conditional parsing without branching logic with routers. | ### Example Configurations diff --git a/pkg/stanza/docs/operators/tcp_input.md b/pkg/stanza/docs/operators/tcp_input.md index 37197f49fcb1..c42a6c06eb9e 100644 --- a/pkg/stanza/docs/operators/tcp_input.md +++ b/pkg/stanza/docs/operators/tcp_input.md @@ -14,7 +14,7 @@ The `tcp_input` operator listens for logs on one or more TCP connections. The op | `attributes` | {} | A map of `key: value` pairs to add to the entry's attributes. | | `one_log_per_packet` | false | Skip log tokenization, set to true if logs contains one log per record and multiline is not used. This will improve performance. | | `resource` | {} | A map of `key: value` pairs to add to the entry's resource. | -| `add_attributes` | false | Adds `net.*` attributes according to [semantic convention][https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/span-general.md#general-network-connection-attributes]. | +| `add_attributes` | false | Adds `net.*` attributes according to [semantic convention][https://github.com/open-telemetry/semantic-conventions/blob/main/docs/attributes-registry/network.md#network-attributes]. | | `multiline` | | A `multiline` configuration block. See below for details. | | `preserve_leading_whitespaces` | false | Whether to preserve leading whitespaces. | | `preserve_trailing_whitespaces` | false | Whether to preserve trailing whitespaces. | diff --git a/pkg/stanza/docs/operators/windows_eventlog_input.md b/pkg/stanza/docs/operators/windows_eventlog_input.md index 94e791289520..792fdbc11404 100644 --- a/pkg/stanza/docs/operators/windows_eventlog_input.md +++ b/pkg/stanza/docs/operators/windows_eventlog_input.md @@ -12,6 +12,8 @@ The `windows_eventlog_input` operator reads logs from the windows event log API. | `max_reads` | 100 | The maximum number of bodies read into memory, before beginning a new batch. | | `start_at` | `end` | On first startup, where to start reading logs from the API. Options are `beginning` or `end`. | | `poll_interval` | 1s | The interval at which the channel is checked for new log entries. This check begins again after all new bodies have been read. | +| `raw` | false | If false, the body of emitted log records will contain a structured representation of the event. Otherwise, the body will be the original XML string. | +| `suppress_rendering_info` | false | If false, [additional syscalls](https://learn.microsoft.com/en-us/windows/win32/api/winevt/nf-winevt-evtformatmessage#remarks) may be made to retrieve detailed information about the event. Otherwise, some unresolved values may be present in the event. | | `attributes` | {} | A map of `key: value` pairs to add to the entry's attributes. | | `resource` | {} | A map of `key: value` pairs to add to the entry's resource. | diff --git a/pkg/stanza/docs/types/field.md b/pkg/stanza/docs/types/field.md index 35f54be3bc9b..b6fb313b8c6d 100644 --- a/pkg/stanza/docs/types/field.md +++ b/pkg/stanza/docs/types/field.md @@ -1,6 +1,6 @@ ## Fields -A _Field_ is a reference to a value in a log [entry](../types/field.md). +A _Field_ is a reference to a value in a log [entry](../types/entry.md). Many [operators](../operators/README.md) use fields in their configurations. For example, parsers use fields to specify which value to parse and where to write a new value. diff --git a/pkg/stanza/docs/types/severity.md b/pkg/stanza/docs/types/severity.md index d3b2657e3268..d45a83422140 100644 --- a/pkg/stanza/docs/types/severity.md +++ b/pkg/stanza/docs/types/severity.md @@ -8,12 +8,14 @@ Severity is represented as a number from 1 to 24. The meaning of these severity Parser operators can parse a severity and attach the resulting value to a log entry. -| Field | Default | Description | -| --- | --- | --- | -| `parse_from` | required | The [field](../types/field.md) from which the value will be parsed. | -| `preset` | `default` | A predefined set of values that should be interpretted at specific severity levels. | -| `mapping` | | A custom set of values that should be interpretted at designated severity levels. | - +| Field | Default | Description | +| --- | --- | --- | +| `parse_from` | required | The [field](../types/field.md) from which the value will be parsed. | +| `preset` | `default` | A predefined set of values that should be interpretted at specific severity levels. | +| `mapping` | | A custom set of values that should be interpretted at designated severity levels. | +| `overwrite_text` | `false` | If `true`, the severity text will be set to the [recommeneded short name](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/logs/data-model.md#displaying-severity) corresponding to the severity number. | + +Note that by default the severity _text_ will be set to the original value which was interpreted into a severity number. In order to set the severity text to a standard short name (e.g. `ERROR`, `INFO3`, etc.), set `overwrite_text` to `true`. ### How severity `mapping` works diff --git a/pkg/stanza/docs/types/timestamp.md b/pkg/stanza/docs/types/timestamp.md index a7442203ee4f..d9d9f57df3d5 100644 --- a/pkg/stanza/docs/types/timestamp.md +++ b/pkg/stanza/docs/types/timestamp.md @@ -102,7 +102,7 @@ As a special case, the [`time_parser`](../operators/time_parser.md) operator sup ### Example Configurations -The following examples use `filelog` receiver, but they also apply to other components that use the stanza libarary. +The following examples use file log receiver, but they also apply to other components that use the stanza libarary. #### Parse timestamps from plain text logs diff --git a/pkg/stanza/entry/attribute_field_test.go b/pkg/stanza/entry/attribute_field_test.go index ade5c61bd999..ad55479d4279 100644 --- a/pkg/stanza/entry/attribute_field_test.go +++ b/pkg/stanza/entry/attribute_field_test.go @@ -460,13 +460,11 @@ func TestAttributeFieldUnmarshalFailure(t *testing.T) { t.Run(tc.name, func(t *testing.T) { var fy AttributeField err := yaml.UnmarshalStrict(tc.invalid, &fy) - require.Error(t, err) - require.Contains(t, err.Error(), tc.expectedErr) + require.ErrorContains(t, err, tc.expectedErr) var fj AttributeField err = json.Unmarshal(tc.invalid, &fj) - require.Error(t, err) - require.Contains(t, err.Error(), tc.expectedErr) + require.ErrorContains(t, err, tc.expectedErr) }) } } diff --git a/pkg/stanza/entry/body_field.go b/pkg/stanza/entry/body_field.go index 4db2363b4980..534231b73eb5 100644 --- a/pkg/stanza/entry/body_field.go +++ b/pkg/stanza/entry/body_field.go @@ -55,7 +55,7 @@ func (f BodyField) String() string { // Get will retrieve a value from an entry's body using the field. // It will return the value and whether the field existed. func (f BodyField) Get(entry *Entry) (any, bool) { - var currentValue = entry.Body + currentValue := entry.Body for _, key := range f.Keys { currentMap, ok := currentValue.(map[string]any) diff --git a/pkg/stanza/entry/body_field_test.go b/pkg/stanza/entry/body_field_test.go index 66100bb33adf..48238eda3a25 100644 --- a/pkg/stanza/entry/body_field_test.go +++ b/pkg/stanza/entry/body_field_test.go @@ -386,13 +386,11 @@ func TestBodyFieldUnmarshalFailure(t *testing.T) { t.Run(tc.name, func(t *testing.T) { var fy BodyField err := yaml.UnmarshalStrict(tc.invalid, &fy) - require.Error(t, err) - require.Contains(t, err.Error(), tc.expectedErr) + require.ErrorContains(t, err, tc.expectedErr) var fj BodyField err = json.Unmarshal(tc.invalid, &fj) - require.Error(t, err) - require.Contains(t, err.Error(), tc.expectedErr) + require.ErrorContains(t, err, tc.expectedErr) }) } } diff --git a/pkg/stanza/entry/copy_test.go b/pkg/stanza/entry/copy_test.go index 27cec125551f..c2cfc4512fe4 100644 --- a/pkg/stanza/entry/copy_test.go +++ b/pkg/stanza/entry/copy_test.go @@ -31,7 +31,7 @@ func TestCopyValueByte(t *testing.T) { func TestCopyValueNil(t *testing.T) { var value any - require.Equal(t, nil, copyValue(value)) + require.Nil(t, copyValue(value)) } func TestCopyValueStringArray(t *testing.T) { diff --git a/pkg/stanza/entry/entry_test.go b/pkg/stanza/entry/entry_test.go index 702b0b2e8bba..8d944156d947 100644 --- a/pkg/stanza/entry/entry_test.go +++ b/pkg/stanza/entry/entry_test.go @@ -185,7 +185,7 @@ func TestCopyNil(t *testing.T) { require.Equal(t, "", cp.SeverityText) require.Equal(t, map[string]any{}, cp.Attributes) require.Equal(t, map[string]any{}, cp.Resource) - require.Equal(t, nil, cp.Body) + require.Nil(t, cp.Body) require.Equal(t, []byte{}, cp.TraceID) require.Equal(t, []byte{}, cp.SpanID) require.Equal(t, []byte{}, cp.TraceFlags) @@ -275,8 +275,7 @@ func TestReadToInterfaceMapWithMissingField(t *testing.T) { field := NewAttributeField("label") dest := map[string]any{} err := entry.readToInterfaceMap(field, &dest) - require.Error(t, err) - require.Contains(t, err.Error(), "can not be read as a map[string]any") + require.ErrorContains(t, err, "can not be read as a map[string]any") } func TestReadToStringMapWithMissingField(t *testing.T) { @@ -284,8 +283,7 @@ func TestReadToStringMapWithMissingField(t *testing.T) { field := NewAttributeField("label") dest := map[string]string{} err := entry.readToStringMap(field, &dest) - require.Error(t, err) - require.Contains(t, err.Error(), "can not be read as a map[string]string") + require.ErrorContains(t, err, "can not be read as a map[string]string") } func TestReadToInterfaceMissingField(t *testing.T) { @@ -293,8 +291,7 @@ func TestReadToInterfaceMissingField(t *testing.T) { field := NewAttributeField("label") var dest any err := entry.readToInterface(field, &dest) - require.Error(t, err) - require.Contains(t, err.Error(), "can not be read as a any") + require.ErrorContains(t, err, "can not be read as a any") } func TestDefaultTimestamps(t *testing.T) { diff --git a/pkg/stanza/entry/field_test.go b/pkg/stanza/entry/field_test.go index f07c4c3b45de..617b812790dc 100644 --- a/pkg/stanza/entry/field_test.go +++ b/pkg/stanza/entry/field_test.go @@ -143,13 +143,11 @@ func TestFieldUnmarshalJSON(t *testing.T) { switch { case tc.expectedErrRootable != "": - require.Error(t, err) - require.Contains(t, err.Error(), tc.expectedErr) + require.ErrorContains(t, err, tc.expectedErr) require.Error(t, errRootable) require.Contains(t, errRootable.Error(), tc.expectedErrRootable) case tc.expectedErr != "": - require.Error(t, err) - require.Contains(t, err.Error(), tc.expectedErr) + require.ErrorContains(t, err, tc.expectedErr) require.NoError(t, errRootable) require.Equal(t, tc.expected, rootableField.Field) default: @@ -233,8 +231,7 @@ func TestFieldUnmarshalYAMLFailure(t *testing.T) { t.Run(tc.name, func(t *testing.T) { var f Field err := yaml.UnmarshalStrict(tc.input, &f) - require.Error(t, err) - require.Contains(t, err.Error(), tc.expected) + require.ErrorContains(t, err, tc.expected) }) } } @@ -284,8 +281,7 @@ func TestFromJSONDot(t *testing.T) { func TestFieldFromStringInvalidSplit(t *testing.T) { _, err := NewField("resource[test]") - require.Error(t, err) - require.Contains(t, err.Error(), "splitting field") + require.ErrorContains(t, err, "splitting field") } func TestFieldFromStringWithResource(t *testing.T) { diff --git a/pkg/stanza/entry/nil_field_test.go b/pkg/stanza/entry/nil_field_test.go index 754af8d97d49..1193b9d3410f 100644 --- a/pkg/stanza/entry/nil_field_test.go +++ b/pkg/stanza/entry/nil_field_test.go @@ -22,7 +22,7 @@ func TestNilFieldSet(t *testing.T) { nilField := NewNilField() err := nilField.Set(entry, "value") require.NoError(t, err) - require.Equal(t, *entry, Entry{}) + require.Equal(t, Entry{}, *entry) } func TestNilFieldDelete(t *testing.T) { @@ -31,7 +31,7 @@ func TestNilFieldDelete(t *testing.T) { value, ok := nilField.Delete(entry) require.True(t, ok) require.Nil(t, value) - require.Equal(t, *entry, Entry{}) + require.Equal(t, Entry{}, *entry) } func TestNilFieldString(t *testing.T) { diff --git a/pkg/stanza/entry/resource_field_test.go b/pkg/stanza/entry/resource_field_test.go index 6dbe6c499699..75a4f95c2a00 100644 --- a/pkg/stanza/entry/resource_field_test.go +++ b/pkg/stanza/entry/resource_field_test.go @@ -460,13 +460,11 @@ func TestResourceFieldUnmarshalFailure(t *testing.T) { t.Run(tc.name, func(t *testing.T) { var fy ResourceField err := yaml.UnmarshalStrict(tc.invalid, &fy) - require.Error(t, err) - require.Contains(t, err.Error(), tc.expectedErr) + require.ErrorContains(t, err, tc.expectedErr) var fj ResourceField err = json.Unmarshal(tc.invalid, &fj) - require.Error(t, err) - require.Contains(t, err.Error(), tc.expectedErr) + require.ErrorContains(t, err, tc.expectedErr) }) } } diff --git a/pkg/stanza/errors/error_test.go b/pkg/stanza/errors/error_test.go index b8b270d7e3c8..650303dbe874 100644 --- a/pkg/stanza/errors/error_test.go +++ b/pkg/stanza/errors/error_test.go @@ -18,26 +18,26 @@ func TestWithDetails(t *testing.T) { err := NewError("Test error", "") err2 := WithDetails(err, "foo", "bar") - require.Equal(t, err2.Details, ErrorDetails{"foo": "bar"}) + require.Equal(t, ErrorDetails{"foo": "bar"}, err2.Details) }) t.Run("AgentErrorWithExistingDetails", func(t *testing.T) { err := NewError("Test error", "", "foo1", "bar1") err2 := WithDetails(err, "foo2", "bar2") - require.Equal(t, err2.Details, ErrorDetails{"foo1": "bar1", "foo2": "bar2"}) + require.Equal(t, ErrorDetails{"foo1": "bar1", "foo2": "bar2"}, err2.Details) }) t.Run("StandardError", func(t *testing.T) { err := fmt.Errorf("Test error") err2 := WithDetails(err, "foo", "bar") - require.Equal(t, err2.Details, ErrorDetails{"foo": "bar"}) + require.Equal(t, ErrorDetails{"foo": "bar"}, err2.Details) }) t.Run("AgentMethod", func(t *testing.T) { err := NewError("Test error", "").WithDetails("foo", "bar") - require.Equal(t, err.Details, ErrorDetails{"foo": "bar"}) + require.Equal(t, ErrorDetails{"foo": "bar"}, err.Details) }) } diff --git a/pkg/stanza/fileconsumer/attrs/attrs.go b/pkg/stanza/fileconsumer/attrs/attrs.go index 0b174a97a812..5c953c443e42 100644 --- a/pkg/stanza/fileconsumer/attrs/attrs.go +++ b/pkg/stanza/fileconsumer/attrs/attrs.go @@ -17,6 +17,7 @@ const ( LogFilePathResolved = "log.file.path_resolved" LogFileOwnerName = "log.file.owner.name" LogFileOwnerGroupName = "log.file.owner.group.name" + LogFileRecordNumber = "log.file.record_number" ) type Resolver struct { @@ -29,7 +30,7 @@ type Resolver struct { } func (r *Resolver) Resolve(file *os.File) (attributes map[string]any, err error) { - var path = file.Name() + path := file.Name() // size 2 is sufficient if not resolving symlinks. This optimizes for the most performant cases. attributes = make(map[string]any, 2) if r.IncludeFileName { diff --git a/pkg/stanza/fileconsumer/attrs/attrs_test.go b/pkg/stanza/fileconsumer/attrs/attrs_test.go index c93cdef40d6e..097eb6e4bd09 100644 --- a/pkg/stanza/fileconsumer/attrs/attrs_test.go +++ b/pkg/stanza/fileconsumer/attrs/attrs_test.go @@ -18,8 +18,7 @@ func TestResolver(t *testing.T) { t.Parallel() for i := 0; i < 64; i++ { - - // Create a 4 bit string where each bit represents the value of a config option + // Create a 6 bit string where each bit represents the value of a config option bitString := fmt.Sprintf("%06b", i) // Create a resolver with a config that matches the bit pattern of i @@ -54,7 +53,7 @@ func TestResolver(t *testing.T) { assert.Empty(t, attributes[LogFilePath]) } - // We don't have an independent way to resolve the path, so the only meangingful validate + // We don't have an independent way to resolve the path, so the only meaningful validate // is to ensure that the resolver returns nothing vs something based on the config. if r.IncludeFileNameResolved { expectLen++ @@ -86,7 +85,7 @@ func TestResolver(t *testing.T) { assert.Empty(t, attributes[LogFileOwnerGroupName]) assert.Empty(t, attributes[LogFileOwnerGroupName]) } - assert.Equal(t, expectLen, len(attributes)) + assert.Len(t, attributes, expectLen) }) } } diff --git a/pkg/stanza/fileconsumer/attrs/owner_windows.go b/pkg/stanza/fileconsumer/attrs/owner_windows.go index 25d5e15fe986..58bada364e87 100644 --- a/pkg/stanza/fileconsumer/attrs/owner_windows.go +++ b/pkg/stanza/fileconsumer/attrs/owner_windows.go @@ -10,6 +10,6 @@ import ( "os" ) -func (r *Resolver) addOwnerInfo(file *os.File, attributes map[string]any) error { +func (r *Resolver) addOwnerInfo(_ *os.File, _ map[string]any) error { return fmt.Errorf("owner info not implemented for windows") } diff --git a/pkg/stanza/fileconsumer/benchmark_test.go b/pkg/stanza/fileconsumer/benchmark_test.go index efa410b77920..20ecfc980f15 100644 --- a/pkg/stanza/fileconsumer/benchmark_test.go +++ b/pkg/stanza/fileconsumer/benchmark_test.go @@ -12,9 +12,11 @@ import ( "testing" "time" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component/componenttest" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/emit" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/filetest" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/fingerprint" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/testutil" @@ -186,8 +188,8 @@ func BenchmarkFileInput(b *testing.B) { cfg.PollInterval = time.Microsecond doneChan := make(chan bool, len(files)) - callback := func(_ context.Context, token []byte, _ map[string]any) error { - if len(token) == 0 { + callback := func(_ context.Context, token emit.Token) error { + if len(token.Body) == 0 { doneChan <- true } return nil @@ -210,12 +212,12 @@ func BenchmarkFileInput(b *testing.B) { // Write the other half of the content while running for i := 0; i < b.N/2; i++ { _, err := f.WriteString(severalLines) - require.NoError(b, err) + assert.NoError(b, err) } // Signal end of file _, err := f.WriteString("\n") - require.NoError(b, err) - require.NoError(b, f.Sync()) + assert.NoError(b, err) + assert.NoError(b, f.Sync()) }(file) } diff --git a/pkg/stanza/fileconsumer/config.go b/pkg/stanza/fileconsumer/config.go index 5b6a87342e7e..bd0daf2d3e40 100644 --- a/pkg/stanza/fileconsumer/config.go +++ b/pkg/stanza/fileconsumer/config.go @@ -1,6 +1,8 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +//go:generate mdatagen metadata.yaml + package fileconsumer // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer" import ( @@ -12,7 +14,6 @@ import ( "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/featuregate" - "go.opentelemetry.io/otel/metric" "go.uber.org/zap" "golang.org/x/text/encoding" @@ -21,9 +22,9 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/emit" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/fingerprint" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/header" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/metadata" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/reader" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/scanner" - "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/tracker" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/matcher" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper" @@ -35,8 +36,6 @@ const ( defaultMaxConcurrentFiles = 1024 defaultEncoding = "utf-8" defaultPollInterval = 200 * time.Millisecond - openFilesMetric = "fileconsumer/open_files" - readingFilesMetric = "fileconsumer/reading_files" ) var allowFileDeletion = featuregate.GlobalRegistry().MustRegister( @@ -71,20 +70,24 @@ func NewConfig() *Config { // Config is the configuration of a file input operator type Config struct { - matcher.Criteria `mapstructure:",squash"` - attrs.Resolver `mapstructure:",squash"` - PollInterval time.Duration `mapstructure:"poll_interval,omitempty"` - MaxConcurrentFiles int `mapstructure:"max_concurrent_files,omitempty"` - MaxBatches int `mapstructure:"max_batches,omitempty"` - StartAt string `mapstructure:"start_at,omitempty"` - FingerprintSize helper.ByteSize `mapstructure:"fingerprint_size,omitempty"` - MaxLogSize helper.ByteSize `mapstructure:"max_log_size,omitempty"` - Encoding string `mapstructure:"encoding,omitempty"` - SplitConfig split.Config `mapstructure:"multiline,omitempty"` - TrimConfig trim.Config `mapstructure:",squash,omitempty"` - FlushPeriod time.Duration `mapstructure:"force_flush_period,omitempty"` - Header *HeaderConfig `mapstructure:"header,omitempty"` - DeleteAfterRead bool `mapstructure:"delete_after_read,omitempty"` + matcher.Criteria `mapstructure:",squash"` + attrs.Resolver `mapstructure:",squash"` + PollInterval time.Duration `mapstructure:"poll_interval,omitempty"` + MaxConcurrentFiles int `mapstructure:"max_concurrent_files,omitempty"` + MaxBatches int `mapstructure:"max_batches,omitempty"` + StartAt string `mapstructure:"start_at,omitempty"` + FingerprintSize helper.ByteSize `mapstructure:"fingerprint_size,omitempty"` + MaxLogSize helper.ByteSize `mapstructure:"max_log_size,omitempty"` + Encoding string `mapstructure:"encoding,omitempty"` + SplitConfig split.Config `mapstructure:"multiline,omitempty"` + TrimConfig trim.Config `mapstructure:",squash,omitempty"` + FlushPeriod time.Duration `mapstructure:"force_flush_period,omitempty"` + Header *HeaderConfig `mapstructure:"header,omitempty"` + DeleteAfterRead bool `mapstructure:"delete_after_read,omitempty"` + IncludeFileRecordNumber bool `mapstructure:"include_file_record_number,omitempty"` + Compression string `mapstructure:"compression,omitempty"` + PollsToArchive int `mapstructure:"-"` // TODO: activate this config once archiving is set up + AcquireFSLock bool `mapstructure:"acquire_fs_lock,omitempty"` } type HeaderConfig struct { @@ -153,56 +156,37 @@ func (c Config) Build(set component.TelemetrySettings, emit emit.Callback, opts set.Logger = set.Logger.With(zap.String("component", "fileconsumer")) readerFactory := reader.Factory{ - TelemetrySettings: set, - FromBeginning: startAtBeginning, - FingerprintSize: int(c.FingerprintSize), - InitialBufferSize: scanner.DefaultBufferSize, - MaxLogSize: int(c.MaxLogSize), - Encoding: enc, - SplitFunc: splitFunc, - TrimFunc: trimFunc, - FlushTimeout: c.FlushPeriod, - EmitFunc: emit, - Attributes: c.Resolver, - HeaderConfig: hCfg, - DeleteAtEOF: c.DeleteAfterRead, - } - - var t tracker.Tracker - if o.noTracking { - t = tracker.NewNoStateTracker(set, c.MaxConcurrentFiles/2) - } else { - t = tracker.NewFileTracker(set, c.MaxConcurrentFiles/2) + TelemetrySettings: set, + FromBeginning: startAtBeginning, + FingerprintSize: int(c.FingerprintSize), + InitialBufferSize: scanner.DefaultBufferSize, + MaxLogSize: int(c.MaxLogSize), + Encoding: enc, + SplitFunc: splitFunc, + TrimFunc: trimFunc, + FlushTimeout: c.FlushPeriod, + EmitFunc: emit, + Attributes: c.Resolver, + HeaderConfig: hCfg, + DeleteAtEOF: c.DeleteAfterRead, + IncludeFileRecordNumber: c.IncludeFileRecordNumber, + Compression: c.Compression, + AcquireFSLock: c.AcquireFSLock, } - meter := set.MeterProvider.Meter("otelcol/fileconsumer") - - openFiles, err := meter.Int64UpDownCounter( - openFilesMetric, - metric.WithDescription("Number of open files"), - metric.WithUnit("1"), - ) - if err != nil { - return nil, err - } - readingFiles, err := meter.Int64UpDownCounter( - readingFilesMetric, - metric.WithDescription("Number of open files that are being read"), - metric.WithUnit("1"), - ) + telemetryBuilder, err := metadata.NewTelemetryBuilder(set) if err != nil { return nil, err } return &Manager{ - set: set, - readerFactory: readerFactory, - fileMatcher: fileMatcher, - pollInterval: c.PollInterval, - maxBatchFiles: c.MaxConcurrentFiles / 2, - maxBatches: c.MaxBatches, - tracker: t, - openFiles: openFiles, - readingFiles: readingFiles, + set: set, + readerFactory: readerFactory, + fileMatcher: fileMatcher, + pollInterval: c.PollInterval, + maxBatchFiles: c.MaxConcurrentFiles / 2, + maxBatches: c.MaxBatches, + telemetryBuilder: telemetryBuilder, + noTracking: o.noTracking, }, nil } @@ -219,7 +203,7 @@ func (c Config) validate() error { return fmt.Errorf("'max_log_size' must be positive") } - if c.MaxConcurrentFiles <= 1 { + if c.MaxConcurrentFiles < 1 { return fmt.Errorf("'max_concurrent_files' must be positive") } diff --git a/pkg/stanza/fileconsumer/config_test.go b/pkg/stanza/fileconsumer/config_test.go index 35654ddfbf0b..72d06fd2478c 100644 --- a/pkg/stanza/fileconsumer/config_test.go +++ b/pkg/stanza/fileconsumer/config_test.go @@ -13,7 +13,6 @@ import ( "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/component/componenttest" - "go.opentelemetry.io/collector/featuregate" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/emittest" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/fingerprint" @@ -40,6 +39,8 @@ func TestNewConfig(t *testing.T) { assert.False(t, cfg.IncludeFilePathResolved) assert.False(t, cfg.IncludeFileOwnerName) assert.False(t, cfg.IncludeFileOwnerGroupName) + assert.False(t, cfg.IncludeFileRecordNumber) + assert.False(t, cfg.AcquireFSLock) } func TestUnmarshal(t *testing.T) { @@ -218,6 +219,23 @@ func TestUnmarshal(t *testing.T) { return newMockOperatorConfig(cfg) }(), }, + { + Name: "sort_by_group_by", + Expect: func() *mockOperatorConfig { + cfg := NewConfig() + cfg.OrderingCriteria = matcher.OrderingCriteria{ + Regex: `err\.(?P[a-zA-Z])\.\d+\.\d{10}\.log`, + GroupBy: `err\.(?P[a-z]+).[0-9]*.*log`, + SortBy: []matcher.Sort{ + { + SortType: "numeric", + RegexKey: "file_num", + }, + }, + } + return newMockOperatorConfig(cfg) + }(), + }, { Name: "poll_interval_no_units", Expect: func() *mockOperatorConfig { @@ -454,7 +472,7 @@ func TestBuild(t *testing.T) { func(_ *Config) {}, require.NoError, func(t *testing.T, m *Manager) { - require.Equal(t, m.pollInterval, 10*time.Millisecond) + require.Equal(t, 10*time.Millisecond, m.pollInterval) }, }, { @@ -663,7 +681,7 @@ func TestBuildWithSplitFunc(t *testing.T) { func(_ *Config) {}, require.NoError, func(t *testing.T, m *Manager) { - require.Equal(t, m.pollInterval, 10*time.Millisecond) + require.Equal(t, 10*time.Millisecond, m.pollInterval) }, }, { @@ -722,11 +740,6 @@ func TestBuildWithSplitFunc(t *testing.T) { } func TestBuildWithHeader(t *testing.T) { - require.NoError(t, featuregate.GlobalRegistry().Set(AllowHeaderMetadataParsing.ID(), true)) - t.Cleanup(func() { - require.NoError(t, featuregate.GlobalRegistry().Set(AllowHeaderMetadataParsing.ID(), false)) - }) - basicConfig := func() *Config { cfg := NewConfig() cfg.Include = []string{"/var/log/testpath.*"} @@ -831,6 +844,12 @@ func (c *Config) withHeader(headerMatchPattern, extractRegex string) *Config { return c } +// withGzipFileSuffix is a builder-like helper for quickly setting up support for gzip compressed log files +func (c *Config) withGzip() *Config { + c.Compression = "gzip" + return c +} + const mockOperatorType = "mock" func init() { diff --git a/pkg/stanza/fileconsumer/documentation.md b/pkg/stanza/fileconsumer/documentation.md new file mode 100644 index 000000000000..1f8eba7fdd6e --- /dev/null +++ b/pkg/stanza/fileconsumer/documentation.md @@ -0,0 +1,23 @@ +[comment]: <> (Code generated by mdatagen. DO NOT EDIT.) + +# fileconsumer + +## Internal Telemetry + +The following telemetry is emitted by this component. + +### otelcol_fileconsumer_open_files + +Number of open files + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| 1 | Sum | Int | false | + +### otelcol_fileconsumer_reading_files + +Number of open files that are being read + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| 1 | Sum | Int | false | diff --git a/pkg/stanza/fileconsumer/emit/emit.go b/pkg/stanza/fileconsumer/emit/emit.go index 65859444229e..6c27a3c72a4a 100644 --- a/pkg/stanza/fileconsumer/emit/emit.go +++ b/pkg/stanza/fileconsumer/emit/emit.go @@ -7,4 +7,16 @@ import ( "context" ) -type Callback func(ctx context.Context, token []byte, attrs map[string]any) error +type Callback func(ctx context.Context, token Token) error + +type Token struct { + Body []byte + Attributes map[string]any +} + +func NewToken(body []byte, attrs map[string]any) Token { + return Token{ + Body: body, + Attributes: attrs, + } +} diff --git a/pkg/stanza/fileconsumer/file.go b/pkg/stanza/fileconsumer/file.go index 517526ebe503..c5675a90a063 100644 --- a/pkg/stanza/fileconsumer/file.go +++ b/pkg/stanza/fileconsumer/file.go @@ -11,11 +11,11 @@ import ( "time" "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/checkpoint" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/fingerprint" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/metadata" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/reader" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/tracker" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/matcher" @@ -23,9 +23,6 @@ import ( ) type Manager struct { - // Deprecated [v0.101.0] - *zap.SugaredLogger - set component.TelemetrySettings wg sync.WaitGroup cancel context.CancelFunc @@ -33,14 +30,15 @@ type Manager struct { readerFactory reader.Factory fileMatcher *matcher.Matcher tracker tracker.Tracker + noTracking bool - pollInterval time.Duration - persister operator.Persister - maxBatches int - maxBatchFiles int + pollInterval time.Duration + persister operator.Persister + maxBatches int + maxBatchFiles int + pollsToArchive int - openFiles metric.Int64UpDownCounter - readingFiles metric.Int64UpDownCounter + telemetryBuilder *metadata.TelemetryBuilder } func (m *Manager) Start(persister operator.Persister) error { @@ -51,6 +49,9 @@ func (m *Manager) Start(persister operator.Persister) error { m.set.Logger.Warn("finding files", zap.Error(err)) } + // instantiate the tracker + m.instantiateTracker(persister) + if persister != nil { m.persister = persister offsets, err := checkpoint.Load(ctx, m.persister) @@ -62,6 +63,8 @@ func (m *Manager) Start(persister operator.Persister) error { m.readerFactory.FromBeginning = true m.tracker.LoadMetadata(offsets) } + } else if m.pollsToArchive > 0 { + m.set.Logger.Error("archiving is not supported in memory, please use a storage extension") } // Start polling goroutine @@ -77,7 +80,9 @@ func (m *Manager) Stop() error { m.cancel = nil } m.wg.Wait() - m.openFiles.Add(context.TODO(), int64(0-m.tracker.ClosePreviousFiles())) + if m.tracker != nil { + m.telemetryBuilder.FileconsumerOpenFiles.Add(context.TODO(), int64(0-m.tracker.ClosePreviousFiles())) + } if m.persister != nil { if err := checkpoint.Save(context.Background(), m.persister, m.tracker.GetMetadata()); err != nil { m.set.Logger.Error("save offsets", zap.Error(err)) @@ -160,14 +165,14 @@ func (m *Manager) consume(ctx context.Context, paths []string) { wg.Add(1) go func(r *reader.Reader) { defer wg.Done() - m.readingFiles.Add(ctx, 1) + m.telemetryBuilder.FileconsumerReadingFiles.Add(ctx, 1) r.ReadToEnd(ctx) - m.readingFiles.Add(ctx, -1) + m.telemetryBuilder.FileconsumerReadingFiles.Add(ctx, -1) }(r) } wg.Wait() - m.openFiles.Add(ctx, int64(0-m.tracker.EndConsume())) + m.telemetryBuilder.FileconsumerOpenFiles.Add(ctx, int64(0-m.tracker.EndConsume())) } func (m *Manager) makeFingerprint(path string) (*fingerprint.Fingerprint, *os.File) { @@ -252,7 +257,7 @@ func (m *Manager) newReader(ctx context.Context, file *os.File, fp *fingerprint. if err != nil { return nil, err } - m.openFiles.Add(ctx, 1) + m.telemetryBuilder.FileconsumerOpenFiles.Add(ctx, 1) return r, nil } @@ -262,6 +267,16 @@ func (m *Manager) newReader(ctx context.Context, file *os.File, fp *fingerprint. if err != nil { return nil, err } - m.openFiles.Add(ctx, 1) + m.telemetryBuilder.FileconsumerOpenFiles.Add(ctx, 1) return r, nil } + +func (m *Manager) instantiateTracker(persister operator.Persister) { + var t tracker.Tracker + if m.noTracking { + t = tracker.NewNoStateTracker(m.set, m.maxBatchFiles) + } else { + t = tracker.NewFileTracker(m.set, m.maxBatchFiles, m.pollsToArchive, persister) + } + m.tracker = t +} diff --git a/pkg/stanza/fileconsumer/file_other.go b/pkg/stanza/fileconsumer/file_other.go index 5acc955e8448..b59165683d83 100644 --- a/pkg/stanza/fileconsumer/file_other.go +++ b/pkg/stanza/fileconsumer/file_other.go @@ -57,9 +57,9 @@ OUTER: m.set.Logger.Debug("Reading lost file", zap.String("path", lostReader.GetFileName())) go func(r *reader.Reader) { defer lostWG.Done() - m.readingFiles.Add(ctx, 1) + m.telemetryBuilder.FileconsumerReadingFiles.Add(ctx, 1) r.ReadToEnd(ctx) - m.readingFiles.Add(ctx, -1) + m.telemetryBuilder.FileconsumerReadingFiles.Add(ctx, -1) }(lostReader) } lostWG.Wait() diff --git a/pkg/stanza/fileconsumer/file_test.go b/pkg/stanza/fileconsumer/file_test.go index 51c45f0a638f..e4faf03a8fef 100644 --- a/pkg/stanza/fileconsumer/file_test.go +++ b/pkg/stanza/fileconsumer/file_test.go @@ -4,6 +4,7 @@ package fileconsumer import ( + "compress/gzip" "context" "fmt" "os" @@ -140,7 +141,6 @@ func TestReadUsingNopEncoding(t *testing.T) { for _, tc := range tcs { t.Run(tc.testName, func(t *testing.T) { - tempDir := t.TempDir() cfg := NewConfig().includeDir(tempDir) cfg.StartAt = "beginning" @@ -151,7 +151,7 @@ func TestReadUsingNopEncoding(t *testing.T) { // Create a file, then start temp := filetest.OpenTemp(t, tempDir) bytesWritten, err := temp.Write(tc.input) - require.Greater(t, bytesWritten, 0) + require.Positive(t, bytesWritten) require.NoError(t, err) require.NoError(t, operator.Start(testutil.NewUnscopedMockPersister())) defer func() { @@ -224,7 +224,6 @@ func TestNopEncodingDifferentLogSizes(t *testing.T) { for _, tc := range tcs { t.Run(tc.testName, func(t *testing.T) { - tempDir := t.TempDir() cfg := NewConfig().includeDir(tempDir) cfg.StartAt = "beginning" @@ -235,7 +234,7 @@ func TestNopEncodingDifferentLogSizes(t *testing.T) { // Create a file, then start temp := filetest.OpenTemp(t, tempDir) bytesWritten, err := temp.Write(tc.input) - require.Greater(t, bytesWritten, 0) + require.Positive(t, bytesWritten) require.NoError(t, err) require.NoError(t, operator.Start(testutil.NewUnscopedMockPersister())) defer func() { @@ -320,6 +319,58 @@ func TestStartAtEnd(t *testing.T) { sink.ExpectToken(t, []byte("testlog2")) } +// TestSymlinkedFiles tests reading from a single file that's actually a symlink +// to another file, while the symlink target is changed frequently, reads all +// the logs from all the files ever targeted by that symlink. +func TestSymlinkedFiles(t *testing.T) { + if runtime.GOARCH == "arm64" { + t.Skip("Failing consistently on ARM64. See https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/34494") + } + + if runtime.GOOS == "windows" { + t.Skip("Time sensitive tests disabled for now on Windows. See https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/32715#issuecomment-2107737828") + } + + t.Parallel() + + // Create 30 files with a predictable naming scheme, each containing + // 100 log lines. + const numFiles = 30 + const logLinesPerFile = 100 + const pollInterval = 10 * time.Millisecond + tempDir := t.TempDir() + expectedTokens := [][]byte{} + for i := 1; i <= numFiles; i++ { + expectedTokensBatch := symlinkTestCreateLogFile(t, tempDir, i, logLinesPerFile) + expectedTokens = append(expectedTokens, expectedTokensBatch...) + } + + targetTempDir := t.TempDir() + symlinkFilePath := filepath.Join(targetTempDir, "sym.log") + cfg := NewConfig().includeDir(targetTempDir) + cfg.StartAt = "beginning" + cfg.PollInterval = pollInterval + sink := emittest.NewSink(emittest.WithCallBuffer(numFiles * logLinesPerFile)) + operator := testManagerWithSink(t, cfg, sink) + + require.NoError(t, operator.Start(testutil.NewUnscopedMockPersister())) + defer func() { + require.NoError(t, operator.Stop()) + }() + + sink.ExpectNoCalls(t) + + // Create and update symlink to each of the files over time. + for i := 1; i <= numFiles; i++ { + targetLogFilePath := filepath.Join(tempDir, fmt.Sprintf("%d.log", i)) + require.NoError(t, os.Symlink(targetLogFilePath, symlinkFilePath)) + // The sleep time here must be larger than the poll_interval value + time.Sleep(pollInterval + 1*time.Millisecond) + require.NoError(t, os.Remove(symlinkFilePath)) + } + sink.ExpectTokens(t, expectedTokens...) +} + // StartAtEndNewFile tests that when `start_at` is configured to `end`, // a file created after the operator has been started is read from the // beginning @@ -1098,11 +1149,6 @@ func TestMaxBatching(t *testing.T) { // TestReadExistingLogsWithHeader tests that, when starting from beginning, we // read all the lines that are already there, and parses the headers func TestReadExistingLogsWithHeader(t *testing.T) { - require.NoError(t, featuregate.GlobalRegistry().Set(AllowHeaderMetadataParsing.ID(), true)) - t.Cleanup(func() { - require.NoError(t, featuregate.GlobalRegistry().Set(AllowHeaderMetadataParsing.ID(), false)) - }) - tempDir := t.TempDir() cfg := NewConfig().includeDir(tempDir) cfg.StartAt = "beginning" @@ -1194,11 +1240,6 @@ func TestDeleteAfterRead_SkipPartials(t *testing.T) { } func TestHeaderPersistance(t *testing.T) { - require.NoError(t, featuregate.GlobalRegistry().Set(AllowHeaderMetadataParsing.ID(), true)) - t.Cleanup(func() { - require.NoError(t, featuregate.GlobalRegistry().Set(AllowHeaderMetadataParsing.ID(), false)) - }) - tempDir := t.TempDir() cfg := NewConfig().includeDir(tempDir) cfg.StartAt = "beginning" @@ -1234,11 +1275,6 @@ func TestHeaderPersistance(t *testing.T) { } func TestHeaderPersistanceInHeader(t *testing.T) { - require.NoError(t, featuregate.GlobalRegistry().Set(AllowHeaderMetadataParsing.ID(), true)) - t.Cleanup(func() { - require.NoError(t, featuregate.GlobalRegistry().Set(AllowHeaderMetadataParsing.ID(), false)) - }) - tempDir := t.TempDir() cfg1 := NewConfig().includeDir(tempDir) cfg1.StartAt = "beginning" @@ -1287,7 +1323,7 @@ func TestStalePartialFingerprintDiscarded(t *testing.T) { file1 := filetest.OpenTempWithPattern(t, tempDir, "*.log1") file2 := filetest.OpenTempWithPattern(t, tempDir, "*.log2") - // Two same fingerprint file , and smaller than config size + // Two same fingerprint file , and smaller than config size content := "aaaaaaaaaaa" filetest.WriteString(t, file1, content+"\n") filetest.WriteString(t, file2, content+"\n") @@ -1298,7 +1334,7 @@ func TestStalePartialFingerprintDiscarded(t *testing.T) { operator.wg.Wait() if runtime.GOOS != "windows" { // On windows, we never keep files in previousPollFiles, so we don't expect to see them here - require.Equal(t, len(operator.tracker.PreviousPollFiles()), 1) + require.Len(t, operator.tracker.PreviousPollFiles(), 1) } // keep append data to file1 and file2 @@ -1382,7 +1418,7 @@ func TestNoLostPartial(t *testing.T) { operator, sink := testManager(t, cfg) operator.persister = testutil.NewMockPersister("test") - // Two same fingerprint file , and smaller than config size + // Two same fingerprint file , and smaller than config size file1 := filetest.OpenTempWithPattern(t, tempDir, "*.log1") file2 := filetest.OpenTempWithPattern(t, tempDir, "*.log2") @@ -1468,3 +1504,155 @@ func TestNoTracking(t *testing.T) { }) } } + +func symlinkTestCreateLogFile(t *testing.T, tempDir string, fileIdx, numLogLines int) (tokens [][]byte) { + logFilePath := fmt.Sprintf("%s/%d.log", tempDir, fileIdx) + temp1 := filetest.OpenFile(t, logFilePath) + for i := 0; i < numLogLines; i++ { + msg := fmt.Sprintf("[fileIdx %2d] This is a simple log line with the number %3d", fileIdx, i) + filetest.WriteString(t, temp1, msg+"\n") + tokens = append(tokens, []byte(msg)) + } + temp1.Close() + return tokens +} + +// TestReadGzipCompressedLogsFromBeginning tests that, when starting from beginning of a gzip compressed file, we +// read all the lines that are already there +func TestReadGzipCompressedLogsFromBeginning(t *testing.T) { + t.Parallel() + + tempDir := t.TempDir() + cfg := NewConfig().includeDir(tempDir).withGzip() + cfg.StartAt = "beginning" + operator, sink := testManager(t, cfg) + + // Create a file, then start + temp := filetest.OpenTempWithPattern(t, tempDir, "*.gz") + writer := gzip.NewWriter(temp) + + _, err := writer.Write([]byte("testlog1\ntestlog2\n")) + require.NoError(t, err) + + require.NoError(t, writer.Close()) + + require.NoError(t, operator.Start(testutil.NewUnscopedMockPersister())) + defer func() { + require.NoError(t, operator.Stop()) + }() + + sink.ExpectToken(t, []byte("testlog1")) + sink.ExpectToken(t, []byte("testlog2")) +} + +// TestReadGzipCompressedLogsFromEnd tests that, when starting at the end of a gzip compressed file, we +// read all the lines that are added afterward +func TestReadGzipCompressedLogsFromEnd(t *testing.T) { + t.Parallel() + + tempDir := t.TempDir() + cfg := NewConfig().includeDir(tempDir).withGzip() + cfg.StartAt = "end" + operator, sink := testManager(t, cfg) + + // Create a file, then start + temp := filetest.OpenTempWithPattern(t, tempDir, "*.gz") + + appendToLog := func(t *testing.T, content string) { + writer := gzip.NewWriter(temp) + _, err := writer.Write([]byte(content)) + require.NoError(t, err) + require.NoError(t, writer.Close()) + } + + appendToLog(t, "testlog1\ntestlog2\n") + + // poll for the first time - this should not lead to emitted + // logs as those were already in the existing file + operator.poll(context.TODO()) + + // append new content to the log and poll again - this should be picked up + appendToLog(t, "testlog3\n") + operator.poll(context.TODO()) + sink.ExpectToken(t, []byte("testlog3")) + + // do another iteration to verify correct setting of compressed reader offset + appendToLog(t, "testlog4\n") + operator.poll(context.TODO()) + sink.ExpectToken(t, []byte("testlog4")) +} + +func TestIncludeFileRecordNumber(t *testing.T) { + t.Parallel() + + tempDir := t.TempDir() + cfg := NewConfig().includeDir(tempDir) + cfg.StartAt = "beginning" + cfg.IncludeFileRecordNumber = true + operator, sink := testManager(t, cfg) + + // Create a file, then start + temp := filetest.OpenTemp(t, tempDir) + filetest.WriteString(t, temp, "testlog1\n") + + require.NoError(t, operator.Start(testutil.NewUnscopedMockPersister())) + defer func() { + require.NoError(t, operator.Stop()) + }() + + sink.ExpectCall(t, []byte("testlog1"), map[string]any{ + attrs.LogFileName: filepath.Base(temp.Name()), + attrs.LogFileRecordNumber: int64(1), + }) +} + +func TestIncludeFileRecordNumberWithHeaderConfigured(t *testing.T) { + t.Parallel() + + tempDir := t.TempDir() + cfg := NewConfig().includeDir(tempDir) + cfg.StartAt = "beginning" + cfg.IncludeFileRecordNumber = true + cfg = cfg.withHeader("^#", "(?P[A-z]+)") + operator, sink := testManager(t, cfg) + + // Create a file, then start + temp := filetest.OpenTemp(t, tempDir) + filetest.WriteString(t, temp, "#abc\n#xyz: headerValue2\ntestlog1\n") + + require.NoError(t, operator.Start(testutil.NewUnscopedMockPersister())) + defer func() { + require.NoError(t, operator.Stop()) + }() + + sink.ExpectCall(t, []byte("testlog1"), map[string]any{ + attrs.LogFileName: filepath.Base(temp.Name()), + attrs.LogFileRecordNumber: int64(1), + "header_attr": "xyz", + }) +} + +func TestIncludeFileRecordNumberWithHeaderConfiguredButMissing(t *testing.T) { + t.Parallel() + + tempDir := t.TempDir() + cfg := NewConfig().includeDir(tempDir) + cfg.StartAt = "beginning" + cfg.IncludeFileRecordNumber = true + cfg = cfg.withHeader("^#", "(?P[A-z]+): (?P[A-z]+)") + operator, sink := testManager(t, cfg) + + // Create a file, then start + temp := filetest.OpenTemp(t, tempDir) + filetest.WriteString(t, temp, "testlog1\n") + + require.NoError(t, operator.Start(testutil.NewUnscopedMockPersister())) + defer func() { + require.NoError(t, operator.Stop()) + }() + + sink.ExpectCall(t, []byte("testlog1"), map[string]any{ + attrs.LogFileName: filepath.Base(temp.Name()), + attrs.LogFileRecordNumber: int64(1), + }) +} diff --git a/pkg/stanza/fileconsumer/file_windows.go b/pkg/stanza/fileconsumer/file_windows.go index d92679197abd..c4b03114613e 100644 --- a/pkg/stanza/fileconsumer/file_windows.go +++ b/pkg/stanza/fileconsumer/file_windows.go @@ -10,5 +10,5 @@ import ( ) // Noop on windows because we close files immediately after reading. -func (m *Manager) readLostFiles(ctx context.Context) { +func (m *Manager) readLostFiles(_ context.Context) { } diff --git a/pkg/stanza/fileconsumer/generated_component_telemetry_test.go b/pkg/stanza/fileconsumer/generated_component_telemetry_test.go new file mode 100644 index 000000000000..33ecc0a62dec --- /dev/null +++ b/pkg/stanza/fileconsumer/generated_component_telemetry_test.go @@ -0,0 +1,75 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package fileconsumer + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + sdkmetric "go.opentelemetry.io/otel/sdk/metric" + "go.opentelemetry.io/otel/sdk/metric/metricdata" + "go.opentelemetry.io/otel/sdk/metric/metricdata/metricdatatest" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/config/configtelemetry" +) + +type componentTestTelemetry struct { + reader *sdkmetric.ManualReader + meterProvider *sdkmetric.MeterProvider +} + +func (tt *componentTestTelemetry) newTelemetrySettings() component.TelemetrySettings { + set := componenttest.NewNopTelemetrySettings() + set.MeterProvider = tt.meterProvider + set.MetricsLevel = configtelemetry.LevelDetailed + return set +} + +func setupTestTelemetry() componentTestTelemetry { + reader := sdkmetric.NewManualReader() + return componentTestTelemetry{ + reader: reader, + meterProvider: sdkmetric.NewMeterProvider(sdkmetric.WithReader(reader)), + } +} + +func (tt *componentTestTelemetry) assertMetrics(t *testing.T, expected []metricdata.Metrics) { + var md metricdata.ResourceMetrics + require.NoError(t, tt.reader.Collect(context.Background(), &md)) + // ensure all required metrics are present + for _, want := range expected { + got := tt.getMetric(want.Name, md) + metricdatatest.AssertEqual(t, want, got, metricdatatest.IgnoreTimestamp()) + } + + // ensure no additional metrics are emitted + require.Equal(t, len(expected), tt.len(md)) +} + +func (tt *componentTestTelemetry) getMetric(name string, got metricdata.ResourceMetrics) metricdata.Metrics { + for _, sm := range got.ScopeMetrics { + for _, m := range sm.Metrics { + if m.Name == name { + return m + } + } + } + + return metricdata.Metrics{} +} + +func (tt *componentTestTelemetry) len(got metricdata.ResourceMetrics) int { + metricsCount := 0 + for _, sm := range got.ScopeMetrics { + metricsCount += len(sm.Metrics) + } + + return metricsCount +} + +func (tt *componentTestTelemetry) Shutdown(ctx context.Context) error { + return tt.meterProvider.Shutdown(ctx) +} diff --git a/pkg/stanza/fileconsumer/generated_package_test.go b/pkg/stanza/fileconsumer/generated_package_test.go new file mode 100644 index 000000000000..82364a087892 --- /dev/null +++ b/pkg/stanza/fileconsumer/generated_package_test.go @@ -0,0 +1,13 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package fileconsumer + +import ( + "testing" + + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + goleak.VerifyTestMain(m) +} diff --git a/pkg/stanza/fileconsumer/internal/checkpoint/checkpoint.go b/pkg/stanza/fileconsumer/internal/checkpoint/checkpoint.go index b75933abcc28..8a5a60b7d734 100644 --- a/pkg/stanza/fileconsumer/internal/checkpoint/checkpoint.go +++ b/pkg/stanza/fileconsumer/internal/checkpoint/checkpoint.go @@ -18,6 +18,10 @@ const knownFilesKey = "knownFiles" // Save syncs the most recent set of files to the database func Save(ctx context.Context, persister operator.Persister, rmds []*reader.Metadata) error { + return SaveKey(ctx, persister, rmds, knownFilesKey) +} + +func SaveKey(ctx context.Context, persister operator.Persister, rmds []*reader.Metadata, key string) error { var buf bytes.Buffer enc := json.NewEncoder(&buf) @@ -34,7 +38,7 @@ func Save(ctx context.Context, persister operator.Persister, rmds []*reader.Meta } } - if err := persister.Set(ctx, knownFilesKey, buf.Bytes()); err != nil { + if err := persister.Set(ctx, key, buf.Bytes()); err != nil { errs = append(errs, fmt.Errorf("persist known files: %w", err)) } @@ -43,7 +47,11 @@ func Save(ctx context.Context, persister operator.Persister, rmds []*reader.Meta // Load loads the most recent set of files to the database func Load(ctx context.Context, persister operator.Persister) ([]*reader.Metadata, error) { - encoded, err := persister.Get(ctx, knownFilesKey) + return LoadKey(ctx, persister, knownFilesKey) +} + +func LoadKey(ctx context.Context, persister operator.Persister, key string) ([]*reader.Metadata, error) { + encoded, err := persister.Get(ctx, key) if err != nil { return nil, err } diff --git a/pkg/stanza/fileconsumer/internal/checkpoint/checkpoint_test.go b/pkg/stanza/fileconsumer/internal/checkpoint/checkpoint_test.go index fea2ca2bc5a7..d10894187700 100644 --- a/pkg/stanza/fileconsumer/internal/checkpoint/checkpoint_test.go +++ b/pkg/stanza/fileconsumer/internal/checkpoint/checkpoint_test.go @@ -141,7 +141,6 @@ func TestMigrateHeaderAttributes(t *testing.T) { }, }, }, reloaded) - } func saveDeprecated(t *testing.T, persister operator.Persister, dep *deprecatedMetadata) { diff --git a/pkg/stanza/fileconsumer/internal/emittest/nop.go b/pkg/stanza/fileconsumer/internal/emittest/nop.go index 09c91b7949db..80e5c3e1a618 100644 --- a/pkg/stanza/fileconsumer/internal/emittest/nop.go +++ b/pkg/stanza/fileconsumer/internal/emittest/nop.go @@ -5,8 +5,10 @@ package emittest // import "github.com/open-telemetry/opentelemetry-collector-co import ( "context" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/emit" ) -func Nop(_ context.Context, _ []byte, _ map[string]any) error { +func Nop(_ context.Context, _ emit.Token) error { return nil } diff --git a/pkg/stanza/fileconsumer/internal/emittest/nop_test.go b/pkg/stanza/fileconsumer/internal/emittest/nop_test.go index 470327925fd4..40cef35312dc 100644 --- a/pkg/stanza/fileconsumer/internal/emittest/nop_test.go +++ b/pkg/stanza/fileconsumer/internal/emittest/nop_test.go @@ -8,8 +8,10 @@ import ( "testing" "github.com/stretchr/testify/require" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/emit" ) func TestNop(t *testing.T) { - require.NoError(t, Nop(context.Background(), nil, nil)) + require.NoError(t, Nop(context.Background(), emit.Token{})) } diff --git a/pkg/stanza/fileconsumer/internal/emittest/sink.go b/pkg/stanza/fileconsumer/internal/emittest/sink.go index c836e41fd40b..6c7d9954b3fc 100644 --- a/pkg/stanza/fileconsumer/internal/emittest/sink.go +++ b/pkg/stanza/fileconsumer/internal/emittest/sink.go @@ -57,13 +57,13 @@ func NewSink(opts ...SinkOpt) *Sink { return &Sink{ emitChan: emitChan, timeout: cfg.timeout, - Callback: func(ctx context.Context, token []byte, attrs map[string]any) error { - copied := make([]byte, len(token)) - copy(copied, token) + Callback: func(ctx context.Context, token emit.Token) error { + copied := make([]byte, len(token.Body)) + copy(copied, token.Body) select { case <-ctx.Done(): return ctx.Err() - case emitChan <- &Call{copied, attrs}: + case emitChan <- &Call{copied, token.Attributes}: } return nil }, @@ -119,7 +119,7 @@ func (s *Sink) ExpectTokens(t *testing.T, expected ...[]byte) { return } } - require.ElementsMatch(t, expected, actual, fmt.Sprintf("expected: %v, actual: %v", expected, actual)) + require.ElementsMatchf(t, expected, actual, "expected: %v, actual: %v", expected, actual) } func (s *Sink) ExpectCall(t *testing.T, expected []byte, attrs map[string]any) { diff --git a/pkg/stanza/fileconsumer/internal/emittest/sink_test.go b/pkg/stanza/fileconsumer/internal/emittest/sink_test.go index 326400b7e3e8..7d340b4a79fd 100644 --- a/pkg/stanza/fileconsumer/internal/emittest/sink_test.go +++ b/pkg/stanza/fileconsumer/internal/emittest/sink_test.go @@ -11,6 +11,8 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/emit" ) func TestNextToken(t *testing.T) { @@ -202,7 +204,7 @@ func sinkTest(t *testing.T, opts ...SinkOpt) (*Sink, []*Call) { } go func() { for _, c := range testCalls { - require.NoError(t, s.Callback(context.Background(), c.Token, c.Attrs)) + assert.NoError(t, s.Callback(context.Background(), emit.NewToken(c.Token, c.Attrs))) } }() return s, testCalls diff --git a/pkg/stanza/fileconsumer/internal/fileset/fileset_test.go b/pkg/stanza/fileconsumer/internal/fileset/fileset_test.go index 0d83ef8d5db6..c4763e86ea13 100644 --- a/pkg/stanza/fileconsumer/internal/fileset/fileset_test.go +++ b/pkg/stanza/fileconsumer/internal/fileset/fileset_test.go @@ -36,7 +36,7 @@ func pop[T Matchable](expectedErr error, expectedElemet T) func(t *testing.T, fi el, err := fileset.Pop() if expectedErr == nil { require.NoError(t, err) - require.Equal(t, el, expectedElemet) + require.Equal(t, expectedElemet, el) require.Equal(t, pr-1, fileset.Len()) } else { require.ErrorIs(t, err, expectedErr) @@ -55,7 +55,6 @@ func match[T Matchable](ele T, expect bool) func(t *testing.T, fileset *Fileset[ require.Nil(t, r) require.Equal(t, pr, fileset.Len()) } - } } diff --git a/pkg/stanza/fileconsumer/internal/filetest/filetest.go b/pkg/stanza/fileconsumer/internal/filetest/filetest.go index 4c58cf3762a9..76ba3b9cfab9 100644 --- a/pkg/stanza/fileconsumer/internal/filetest/filetest.go +++ b/pkg/stanza/fileconsumer/internal/filetest/filetest.go @@ -13,30 +13,30 @@ import ( ) func OpenFile(tb testing.TB, path string) *os.File { - file, err := os.OpenFile(path, os.O_CREATE|os.O_RDWR, 0600) + file, err := os.OpenFile(path, os.O_CREATE|os.O_RDWR, 0o600) require.NoError(tb, err) tb.Cleanup(func() { _ = file.Close() }) return file } -func OpenTemp(t testing.TB, tempDir string) *os.File { - return OpenTempWithPattern(t, tempDir, "") +func OpenTemp(tb testing.TB, tempDir string) *os.File { + return OpenTempWithPattern(tb, tempDir, "") } -func ReopenTemp(t testing.TB, name string) *os.File { - return OpenTempWithPattern(t, filepath.Dir(name), filepath.Base(name)) +func ReopenTemp(tb testing.TB, name string) *os.File { + return OpenTempWithPattern(tb, filepath.Dir(name), filepath.Base(name)) } -func OpenTempWithPattern(t testing.TB, tempDir, pattern string) *os.File { +func OpenTempWithPattern(tb testing.TB, tempDir, pattern string) *os.File { file, err := os.CreateTemp(tempDir, pattern) - require.NoError(t, err) - t.Cleanup(func() { _ = file.Close() }) + require.NoError(tb, err) + tb.Cleanup(func() { _ = file.Close() }) return file } -func WriteString(t testing.TB, file *os.File, s string) { +func WriteString(tb testing.TB, file *os.File, s string) { _, err := file.WriteString(s) - require.NoError(t, err) + require.NoError(tb, err) } func TokenWithLength(length int) []byte { diff --git a/pkg/stanza/fileconsumer/internal/fingerprint/fingerprint_test.go b/pkg/stanza/fileconsumer/internal/fingerprint/fingerprint_test.go index 78f844ef54ac..6d2141fbf2e7 100644 --- a/pkg/stanza/fileconsumer/internal/fingerprint/fingerprint_test.go +++ b/pkg/stanza/fileconsumer/internal/fingerprint/fingerprint_test.go @@ -134,7 +134,7 @@ func TestNewFromFile(t *testing.T) { fp, err := NewFromFile(temp, tc.fingerprintSize) require.NoError(t, err) - require.Equal(t, tc.expectedLen, len(fp.firstBytes)) + require.Len(t, fp.firstBytes, tc.expectedLen) }) } } diff --git a/pkg/stanza/fileconsumer/internal/header/config.go b/pkg/stanza/fileconsumer/internal/header/config.go index 768fc1611df1..41c8b30c82be 100644 --- a/pkg/stanza/fileconsumer/internal/header/config.go +++ b/pkg/stanza/fileconsumer/internal/header/config.go @@ -39,7 +39,6 @@ func NewConfig(set component.TelemetrySettings, matchRegex string, metadataOpera Operators: metadataOperators, DefaultOutput: newPipelineOutput(set), }.Build(set) - if err != nil { return nil, fmt.Errorf("failed to build pipelines: %w", err) } diff --git a/pkg/stanza/fileconsumer/internal/header/reader.go b/pkg/stanza/fileconsumer/internal/header/reader.go index 27a81c338bdb..5103313e9621 100644 --- a/pkg/stanza/fileconsumer/internal/header/reader.go +++ b/pkg/stanza/fileconsumer/internal/header/reader.go @@ -10,6 +10,7 @@ import ( "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/extension/experimental/storage" + "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/entry" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/pipeline" @@ -54,7 +55,8 @@ func (r *Reader) Process(ctx context.Context, token []byte, fileAttributes map[s newEntry.Body = string(token) if err := firstOperator.Process(ctx, newEntry); err != nil { - return fmt.Errorf("process header entry: %w", err) + r.set.Logger.Error("process header entry", zap.Error(err)) + // Do not return yet. An entry was added to the logsChan which must be consumed generically. } ent, err := r.output.WaitForEntry(ctx) diff --git a/pkg/stanza/fileconsumer/internal/metadata/generated_telemetry.go b/pkg/stanza/fileconsumer/internal/metadata/generated_telemetry.go new file mode 100644 index 000000000000..718505df0460 --- /dev/null +++ b/pkg/stanza/fileconsumer/internal/metadata/generated_telemetry.go @@ -0,0 +1,72 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "errors" + + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/metric/noop" + "go.opentelemetry.io/otel/trace" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configtelemetry" +) + +func Meter(settings component.TelemetrySettings) metric.Meter { + return settings.MeterProvider.Meter("github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer") +} + +func Tracer(settings component.TelemetrySettings) trace.Tracer { + return settings.TracerProvider.Tracer("github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer") +} + +// TelemetryBuilder provides an interface for components to report telemetry +// as defined in metadata and user config. +type TelemetryBuilder struct { + meter metric.Meter + FileconsumerOpenFiles metric.Int64UpDownCounter + FileconsumerReadingFiles metric.Int64UpDownCounter +} + +// TelemetryBuilderOption applies changes to default builder. +type TelemetryBuilderOption interface { + apply(*TelemetryBuilder) +} + +type telemetryBuilderOptionFunc func(mb *TelemetryBuilder) + +func (tbof telemetryBuilderOptionFunc) apply(mb *TelemetryBuilder) { + tbof(mb) +} + +// NewTelemetryBuilder provides a struct with methods to update all internal telemetry +// for a component +func NewTelemetryBuilder(settings component.TelemetrySettings, options ...TelemetryBuilderOption) (*TelemetryBuilder, error) { + builder := TelemetryBuilder{} + for _, op := range options { + op.apply(&builder) + } + builder.meter = Meter(settings) + var err, errs error + builder.FileconsumerOpenFiles, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64UpDownCounter( + "otelcol_fileconsumer_open_files", + metric.WithDescription("Number of open files"), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + builder.FileconsumerReadingFiles, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64UpDownCounter( + "otelcol_fileconsumer_reading_files", + metric.WithDescription("Number of open files that are being read"), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + return &builder, errs +} + +func getLeveledMeter(meter metric.Meter, cfgLevel, srvLevel configtelemetry.Level) metric.Meter { + if cfgLevel <= srvLevel { + return meter + } + return noop.Meter{} +} diff --git a/pkg/stanza/fileconsumer/internal/metadata/generated_telemetry_test.go b/pkg/stanza/fileconsumer/internal/metadata/generated_telemetry_test.go new file mode 100644 index 000000000000..1b7c89fb0f78 --- /dev/null +++ b/pkg/stanza/fileconsumer/internal/metadata/generated_telemetry_test.go @@ -0,0 +1,74 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/otel/metric" + embeddedmetric "go.opentelemetry.io/otel/metric/embedded" + noopmetric "go.opentelemetry.io/otel/metric/noop" + "go.opentelemetry.io/otel/trace" + embeddedtrace "go.opentelemetry.io/otel/trace/embedded" + nooptrace "go.opentelemetry.io/otel/trace/noop" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" +) + +type mockMeter struct { + noopmetric.Meter + name string +} +type mockMeterProvider struct { + embeddedmetric.MeterProvider +} + +func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { + return mockMeter{name: name} +} + +type mockTracer struct { + nooptrace.Tracer + name string +} + +type mockTracerProvider struct { + embeddedtrace.TracerProvider +} + +func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { + return mockTracer{name: name} +} + +func TestProviders(t *testing.T) { + set := component.TelemetrySettings{ + MeterProvider: mockMeterProvider{}, + TracerProvider: mockTracerProvider{}, + } + + meter := Meter(set) + if m, ok := meter.(mockMeter); ok { + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer", m.name) + } else { + require.Fail(t, "returned Meter not mockMeter") + } + + tracer := Tracer(set) + if m, ok := tracer.(mockTracer); ok { + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer", m.name) + } else { + require.Fail(t, "returned Meter not mockTracer") + } +} + +func TestNewTelemetryBuilder(t *testing.T) { + set := componenttest.NewNopTelemetrySettings() + applied := false + _, err := NewTelemetryBuilder(set, telemetryBuilderOptionFunc(func(b *TelemetryBuilder) { + applied = true + })) + require.NoError(t, err) + require.True(t, applied) +} diff --git a/pkg/stanza/fileconsumer/internal/reader/factory.go b/pkg/stanza/fileconsumer/internal/reader/factory.go index bd3508fa687b..f314e4aacae8 100644 --- a/pkg/stanza/fileconsumer/internal/reader/factory.go +++ b/pkg/stanza/fileconsumer/internal/reader/factory.go @@ -30,18 +30,21 @@ const ( type Factory struct { component.TelemetrySettings - HeaderConfig *header.Config - FromBeginning bool - FingerprintSize int - InitialBufferSize int - MaxLogSize int - Encoding encoding.Encoding - SplitFunc bufio.SplitFunc - TrimFunc trim.Func - FlushTimeout time.Duration - EmitFunc emit.Callback - Attributes attrs.Resolver - DeleteAtEOF bool + HeaderConfig *header.Config + FromBeginning bool + FingerprintSize int + InitialBufferSize int + MaxLogSize int + Encoding encoding.Encoding + SplitFunc bufio.SplitFunc + TrimFunc trim.Func + FlushTimeout time.Duration + EmitFunc emit.Callback + Attributes attrs.Resolver + DeleteAtEOF bool + IncludeFileRecordNumber bool + Compression string + AcquireFSLock bool } func (f *Factory) NewFingerprint(file *os.File) (*fingerprint.Fingerprint, error) { @@ -61,18 +64,19 @@ func (f *Factory) NewReader(file *os.File, fp *fingerprint.Fingerprint) (*Reader } func (f *Factory) NewReaderFromMetadata(file *os.File, m *Metadata) (r *Reader, err error) { - r = &Reader{ - Metadata: m, - set: f.TelemetrySettings, - file: file, - fileName: file.Name(), - fingerprintSize: f.FingerprintSize, - initialBufferSize: f.InitialBufferSize, - maxLogSize: f.MaxLogSize, - decoder: decode.New(f.Encoding), - lineSplitFunc: f.SplitFunc, - deleteAtEOF: f.DeleteAtEOF, + Metadata: m, + set: f.TelemetrySettings, + file: file, + fileName: file.Name(), + fingerprintSize: f.FingerprintSize, + initialBufferSize: f.InitialBufferSize, + maxLogSize: f.MaxLogSize, + decoder: decode.New(f.Encoding), + deleteAtEOF: f.DeleteAtEOF, + includeFileRecordNum: f.IncludeFileRecordNumber, + compression: f.Compression, + acquireFSLock: f.AcquireFSLock, } r.set.Logger = r.set.Logger.With(zap.String("path", r.fileName)) @@ -80,7 +84,7 @@ func (f *Factory) NewReaderFromMetadata(file *os.File, m *Metadata) (r *Reader, // User has reconfigured fingerprint_size shorter, rereadErr := fingerprint.NewFromFile(file, r.fingerprintSize) if rereadErr != nil { - return nil, fmt.Errorf("reread fingerprint: %w", err) + return nil, fmt.Errorf("reread fingerprint: %w", rereadErr) } if !r.Fingerprint.StartsWith(shorter) { return nil, errors.New("file truncated") @@ -97,18 +101,14 @@ func (f *Factory) NewReaderFromMetadata(file *os.File, m *Metadata) (r *Reader, } flushFunc := m.FlushState.Func(f.SplitFunc, f.FlushTimeout) - r.lineSplitFunc = trim.WithFunc(trim.ToLength(flushFunc, f.MaxLogSize), f.TrimFunc) + r.contentSplitFunc = trim.WithFunc(trim.ToLength(flushFunc, f.MaxLogSize), f.TrimFunc) r.emitFunc = f.EmitFunc - if f.HeaderConfig == nil || m.HeaderFinalized { - r.splitFunc = r.lineSplitFunc - r.processFunc = r.emitFunc - } else { + if f.HeaderConfig != nil && !m.HeaderFinalized { + r.headerSplitFunc = f.HeaderConfig.SplitFunc r.headerReader, err = header.NewReader(f.TelemetrySettings, *f.HeaderConfig) if err != nil { return nil, err } - r.splitFunc = f.HeaderConfig.SplitFunc - r.processFunc = r.headerReader.Process } attributes, err := f.Attributes.Resolve(file) @@ -119,5 +119,6 @@ func (f *Factory) NewReaderFromMetadata(file *os.File, m *Metadata) (r *Reader, for k, v := range attributes { r.FileAttributes[k] = v } + return r, nil } diff --git a/pkg/stanza/fileconsumer/internal/reader/fingerprint_test.go b/pkg/stanza/fileconsumer/internal/reader/fingerprint_test.go index f6ce84ee584e..877a9c23e1cd 100644 --- a/pkg/stanza/fileconsumer/internal/reader/fingerprint_test.go +++ b/pkg/stanza/fileconsumer/internal/reader/fingerprint_test.go @@ -296,7 +296,7 @@ func (tc updateFingerprintTest) run(bufferSize int) func(*testing.T) { i, err := temp.Write(tc.moreBytes) require.NoError(t, err) - require.Equal(t, i, len(tc.moreBytes)) + require.Len(t, tc.moreBytes, i) r.ReadToEnd(context.Background()) diff --git a/pkg/stanza/fileconsumer/internal/reader/reader.go b/pkg/stanza/fileconsumer/internal/reader/reader.go index 372f42e48d3d..3a591574fbc6 100644 --- a/pkg/stanza/fileconsumer/internal/reader/reader.go +++ b/pkg/stanza/fileconsumer/internal/reader/reader.go @@ -5,14 +5,17 @@ package reader // import "github.com/open-telemetry/opentelemetry-collector-cont import ( "bufio" + "compress/gzip" "context" "errors" + "io" "os" "go.opentelemetry.io/collector/component" "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/decode" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/attrs" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/emit" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/fingerprint" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/header" @@ -23,6 +26,7 @@ import ( type Metadata struct { Fingerprint *fingerprint.Fingerprint Offset int64 + RecordNum int64 FileAttributes map[string]any HeaderFinalized bool FlushState *flush.State @@ -34,23 +38,64 @@ type Reader struct { set component.TelemetrySettings fileName string file *os.File + reader io.Reader fingerprintSize int initialBufferSize int maxLogSize int - lineSplitFunc bufio.SplitFunc - splitFunc bufio.SplitFunc + headerSplitFunc bufio.SplitFunc + contentSplitFunc bufio.SplitFunc decoder *decode.Decoder headerReader *header.Reader - processFunc emit.Callback emitFunc emit.Callback deleteAtEOF bool needsUpdateFingerprint bool + includeFileRecordNum bool + compression string + acquireFSLock bool } // ReadToEnd will read until the end of the file func (r *Reader) ReadToEnd(ctx context.Context) { + if r.acquireFSLock { + if !r.tryLockFile() { + return + } + defer r.unlockFile() + } + + switch r.compression { + case "gzip": + // We need to create a gzip reader each time ReadToEnd is called because the underlying + // SectionReader can only read a fixed window (from previous offset to EOF). + info, err := r.file.Stat() + if err != nil { + r.set.Logger.Error("failed to stat", zap.Error(err)) + return + } + currentEOF := info.Size() + + // use a gzip Reader with an underlying SectionReader to pick up at the last + // offset of a gzip compressed file + gzipReader, err := gzip.NewReader(io.NewSectionReader(r.file, r.Offset, currentEOF)) + if err != nil { + if !errors.Is(err, io.EOF) { + r.set.Logger.Error("failed to create gzip reader", zap.Error(err)) + } + return + } else { + r.reader = gzipReader + } + // Offset tracking in an uncompressed file is based on the length of emitted tokens, but in this case + // we need to set the offset to the end of the file. + defer func() { + r.Offset = currentEOF + }() + default: + r.reader = r.file + } + if _, err := r.file.Seek(r.Offset, 0); err != nil { - r.set.Logger.Error("Failed to seek", zap.Error(err)) + r.set.Logger.Error("failed to seek", zap.Error(err)) return } @@ -60,64 +105,116 @@ func (r *Reader) ReadToEnd(ctx context.Context) { } }() - s := scanner.New(r, r.maxLogSize, r.initialBufferSize, r.Offset, r.splitFunc) + if r.headerReader != nil { + if r.readHeader(ctx) { + return + } + } + + r.readContents(ctx) +} - // Iterate over the tokenized file, emitting entries as we go +func (r *Reader) readHeader(ctx context.Context) (doneReadingFile bool) { + s := scanner.New(r, r.maxLogSize, r.initialBufferSize, r.Offset, r.headerSplitFunc) + + // Read the tokens from the file until no more header tokens are found or the end of file is reached. for { select { case <-ctx.Done(): - return + return true default: } ok := s.Scan() if !ok { if err := s.Error(); err != nil { - r.set.Logger.Error("Failed during scan", zap.Error(err)) - } else if r.deleteAtEOF { - r.delete() + r.set.Logger.Error("failed during header scan", zap.Error(err)) + } else { + r.set.Logger.Debug("end of file reached", zap.Bool("delete_at_eof", r.deleteAtEOF)) + if r.deleteAtEOF { + r.delete() + } } - return + // Either end of file was reached, or file cannot be scanned. + return true } token, err := r.decoder.Decode(s.Bytes()) if err != nil { - r.set.Logger.Error("decode: %w", zap.Error(err)) + r.set.Logger.Error("failed to decode header token", zap.Error(err)) r.Offset = s.Pos() // move past the bad token or we may be stuck continue } - err = r.processFunc(ctx, token, r.FileAttributes) - if err == nil { - r.Offset = s.Pos() // successful emit, update offset - continue + err = r.headerReader.Process(ctx, token, r.FileAttributes) + if err != nil { + if errors.Is(err, header.ErrEndOfHeader) { + // End of header reached. + break + } + r.set.Logger.Error("failed to process header token", zap.Error(err)) + } + + r.Offset = s.Pos() + } + + // Clean up the header machinery + if err := r.headerReader.Stop(); err != nil { + r.set.Logger.Error("failed to stop header pipeline during finalization", zap.Error(err)) + } + r.headerReader = nil + r.HeaderFinalized = true + r.initialBufferSize = scanner.DefaultBufferSize + + // Reset position in file to r.Offest after the header scanner might have moved it past a content token. + if _, err := r.file.Seek(r.Offset, 0); err != nil { + r.set.Logger.Error("failed to seek post-header", zap.Error(err)) + return true + } + + return false +} + +func (r *Reader) readContents(ctx context.Context) { + // Create the scanner to read the contents of the file. + s := scanner.New(r, r.maxLogSize, r.initialBufferSize, r.Offset, r.contentSplitFunc) + + // Iterate over the contents of the file. + for { + select { + case <-ctx.Done(): + return + default: } - if !errors.Is(err, header.ErrEndOfHeader) { - r.set.Logger.Error("process: %w", zap.Error(err)) + ok := s.Scan() + if !ok { + if err := s.Error(); err != nil { + r.set.Logger.Error("failed during scan", zap.Error(err)) + } else if r.deleteAtEOF { + r.delete() + } + return + } + + token, err := r.decoder.Decode(s.Bytes()) + if err != nil { + r.set.Logger.Error("failed to decode token", zap.Error(err)) r.Offset = s.Pos() // move past the bad token or we may be stuck continue } - // Clean up the header machinery - if err = r.headerReader.Stop(); err != nil { - r.set.Logger.Error("Failed to stop header pipeline during finalization", zap.Error(err)) + if r.includeFileRecordNum { + r.RecordNum++ + r.FileAttributes[attrs.LogFileRecordNumber] = r.RecordNum } - r.headerReader = nil - r.HeaderFinalized = true - - // Switch to the normal split and process functions. - r.splitFunc = r.lineSplitFunc - r.processFunc = r.emitFunc - // Recreate the scanner with the normal split func. - // Do not use the updated offset from the old scanner, as the most recent token - // could be split differently with the new splitter. - if _, err = r.file.Seek(r.Offset, 0); err != nil { - r.set.Logger.Error("Failed to seek post-header", zap.Error(err)) - return + err = r.emitFunc(ctx, emit.NewToken(token, r.FileAttributes)) + if err != nil { + r.set.Logger.Error("failed to process token", zap.Error(err)) } - s = scanner.New(r, r.maxLogSize, scanner.DefaultBufferSize, r.Offset, r.splitFunc) + + r.Offset = s.Pos() } } @@ -154,7 +251,7 @@ func (r *Reader) close() { // Read from the file and update the fingerprint if necessary func (r *Reader) Read(dst []byte) (n int, err error) { - n, err = r.file.Read(dst) + n, err = r.reader.Read(dst) if n == 0 || err != nil { return } diff --git a/pkg/stanza/fileconsumer/internal/reader/reader_other.go b/pkg/stanza/fileconsumer/internal/reader/reader_other.go new file mode 100644 index 000000000000..a0d5927cd4f2 --- /dev/null +++ b/pkg/stanza/fileconsumer/internal/reader/reader_other.go @@ -0,0 +1,13 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +//go:build !unix || aix || solaris + +package reader // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/reader" + +func (r *Reader) tryLockFile() bool { + return true +} + +func (r *Reader) unlockFile() { +} diff --git a/pkg/stanza/fileconsumer/internal/reader/reader_test.go b/pkg/stanza/fileconsumer/internal/reader/reader_test.go index 97160e4ffc5f..5f07b23821ee 100644 --- a/pkg/stanza/fileconsumer/internal/reader/reader_test.go +++ b/pkg/stanza/fileconsumer/internal/reader/reader_test.go @@ -6,7 +6,6 @@ package reader import ( "context" "fmt" - "runtime" "strings" "testing" "time" @@ -16,6 +15,7 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/filetest" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/fingerprint" + internaltime "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/internal/time" ) func TestFileReader_FingerprintUpdated(t *testing.T) { @@ -189,9 +189,6 @@ func TestFingerprintChangeSize(t *testing.T) { } func TestFlushPeriodEOF(t *testing.T) { - if runtime.GOOS == "windows" { - t.Skip("Skipping test on Windows; See https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/32715") - } tempDir := t.TempDir() temp := filetest.OpenTemp(t, tempDir) // Create a long enough initial token, so the scanner can't read the whole file at once @@ -209,6 +206,9 @@ func TestFlushPeriodEOF(t *testing.T) { require.NoError(t, err) assert.Equal(t, int64(0), r.Offset) + internaltime.Now = internaltime.NewAlwaysIncreasingClock().Now + defer func() { internaltime.Now = time.Now }() + r.ReadToEnd(context.Background()) sink.ExpectTokens(t, content[0:aContentLength], []byte{'b'}) } diff --git a/pkg/stanza/fileconsumer/internal/reader/reader_unix.go b/pkg/stanza/fileconsumer/internal/reader/reader_unix.go new file mode 100644 index 000000000000..65b80b995ab8 --- /dev/null +++ b/pkg/stanza/fileconsumer/internal/reader/reader_unix.go @@ -0,0 +1,34 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +//go:build unix && !aix && !solaris + +package reader // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/reader" + +import ( + "errors" + + "go.uber.org/zap" + "golang.org/x/sys/unix" +) + +func (r *Reader) tryLockFile() bool { + if err := unix.Flock(int(r.file.Fd()), unix.LOCK_SH|unix.LOCK_NB); err != nil { + if !errors.Is(err, unix.EWOULDBLOCK) { + r.set.Logger.Error("Failed to lock", zap.Error(err)) + } + return false + } + + return true +} + +func (r *Reader) unlockFile() { + if err := unix.Flock(int(r.file.Fd()), unix.LOCK_UN); err != nil { + // If delete_after_read is set then the file may already have been deleted by this point, + // in which case we'll get EBADF. This is harmless and not worth logging. + if !errors.Is(err, unix.EBADF) { + r.set.Logger.Error("Failed to unlock", zap.Error(err)) + } + } +} diff --git a/pkg/stanza/fileconsumer/internal/tracker/tracker.go b/pkg/stanza/fileconsumer/internal/tracker/tracker.go index 5039003a36ed..c784d1c3485a 100644 --- a/pkg/stanza/fileconsumer/internal/tracker/tracker.go +++ b/pkg/stanza/fileconsumer/internal/tracker/tracker.go @@ -4,12 +4,17 @@ package tracker // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/tracker" import ( + "context" + "fmt" + "go.opentelemetry.io/collector/component" "go.uber.org/zap" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/checkpoint" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/fileset" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/fingerprint" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/reader" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator" ) // Interface for tracking files that are being consumed. @@ -26,6 +31,7 @@ type Tracker interface { EndPoll() EndConsume() int TotalReaders() int + FindFiles([]*fingerprint.Fingerprint) []*reader.Metadata } // fileTracker tracks known offsets for files that are being consumed by the manager. @@ -37,9 +43,16 @@ type fileTracker struct { currentPollFiles *fileset.Fileset[*reader.Reader] previousPollFiles *fileset.Fileset[*reader.Reader] knownFiles []*fileset.Fileset[*reader.Metadata] + + // persister is to be used to store offsets older than 3 poll cycles. + // These offsets will be stored on disk + persister operator.Persister + + pollsToArchive int + archiveIndex int } -func NewFileTracker(set component.TelemetrySettings, maxBatchFiles int) Tracker { +func NewFileTracker(set component.TelemetrySettings, maxBatchFiles int, pollsToArchive int, persister operator.Persister) Tracker { knownFiles := make([]*fileset.Fileset[*reader.Metadata], 3) for i := 0; i < len(knownFiles); i++ { knownFiles[i] = fileset.New[*reader.Metadata](maxBatchFiles) @@ -51,6 +64,9 @@ func NewFileTracker(set component.TelemetrySettings, maxBatchFiles int) Tracker currentPollFiles: fileset.New[*reader.Reader](maxBatchFiles), previousPollFiles: fileset.New[*reader.Reader](maxBatchFiles), knownFiles: knownFiles, + pollsToArchive: pollsToArchive, + persister: persister, + archiveIndex: 0, } } @@ -113,6 +129,9 @@ func (t *fileTracker) ClosePreviousFiles() (filesClosed int) { func (t *fileTracker) EndPoll() { // shift the filesets at end of every poll() call // t.knownFiles[0] -> t.knownFiles[1] -> t.knownFiles[2] + + // Instead of throwing it away, archive it. + t.archive(t.knownFiles[2]) copy(t.knownFiles[1:], t.knownFiles) t.knownFiles[0] = fileset.New[*reader.Metadata](t.maxBatchFiles) } @@ -125,6 +144,101 @@ func (t *fileTracker) TotalReaders() int { return total } +func (t *fileTracker) archive(metadata *fileset.Fileset[*reader.Metadata]) { + // We make use of a ring buffer, where each set of files is stored under a specific index. + // Instead of discarding knownFiles[2], write it to the next index and eventually roll over. + // Separate storage keys knownFilesArchive0, knownFilesArchive1, ..., knownFilesArchiveN, roll over back to knownFilesArchive0 + + // Archiving: ┌─────────────────────on-disk archive─────────────────────────┐ + // | ┌───┐ ┌───┐ ┌──────────────────┐ | + // index | ▶ │ 0 │ ▶ │ 1 │ ▶ ... ▶ │ polls_to_archive │ | + // | ▲ └───┘ └───┘ └──────────────────┘ | + // | ▲ ▲ ▼ | + // | ▲ │ Roll over overriting older offsets, if any ◀ | + // └──────│──────────────────────────────────────────────────────┘ + // │ + // │ + // │ + // start + // index + + if t.pollsToArchive <= 0 || t.persister == nil { + return + } + if err := t.writeArchive(t.archiveIndex, metadata); err != nil { + t.set.Logger.Error("error faced while saving to the archive", zap.Error(err)) + } + t.archiveIndex = (t.archiveIndex + 1) % t.pollsToArchive // increment the index +} + +// readArchive loads data from the archive for a given index and returns a fileset.Filset. +func (t *fileTracker) readArchive(index int) (*fileset.Fileset[*reader.Metadata], error) { + key := fmt.Sprintf("knownFiles%d", index) + metadata, err := checkpoint.LoadKey(context.Background(), t.persister, key) + if err != nil { + return nil, err + } + f := fileset.New[*reader.Metadata](len(metadata)) + f.Add(metadata...) + return f, nil +} + +// writeArchive saves data to the archive for a given index and returns an error, if encountered. +func (t *fileTracker) writeArchive(index int, rmds *fileset.Fileset[*reader.Metadata]) error { + key := fmt.Sprintf("knownFiles%d", index) + return checkpoint.SaveKey(context.Background(), t.persister, rmds.Get(), key) +} + +// FindFiles goes through archive, one fileset at a time and tries to match all fingerprints against that loaded set. +func (t *fileTracker) FindFiles(fps []*fingerprint.Fingerprint) []*reader.Metadata { + // To minimize disk access, we first access the index, then review unmatched files and update the metadata, if found. + // We exit if all fingerprints are matched. + + // Track number of matched fingerprints so we can exit if all matched. + var numMatched int + + // Determine the index for reading archive, starting from the most recent and moving towards the oldest + nextIndex := t.archiveIndex + matchedMetadata := make([]*reader.Metadata, len(fps)) + + // continue executing the loop until either all records are matched or all archive sets have been processed. + for i := 0; i < t.pollsToArchive; i++ { + // Update the mostRecentIndex + nextIndex = (nextIndex - 1 + t.pollsToArchive) % t.pollsToArchive + + data, err := t.readArchive(nextIndex) // we load one fileset atmost once per poll + if err != nil { + t.set.Logger.Error("error while opening archive", zap.Error(err)) + continue + } + archiveModified := false + for j, fp := range fps { + if matchedMetadata[j] != nil { + // we've already found a match for this index, continue + continue + } + if md := data.Match(fp, fileset.StartsWith); md != nil { + // update the matched metada for the index + matchedMetadata[j] = md + archiveModified = true + numMatched++ + } + } + if !archiveModified { + continue + } + // we save one fileset atmost once per poll + if err := t.writeArchive(nextIndex, data); err != nil { + t.set.Logger.Error("error while opening archive", zap.Error(err)) + } + // Check if all metadata have been found + if numMatched == len(fps) { + return matchedMetadata + } + } + return matchedMetadata +} + // noStateTracker only tracks the current polled files. Once the poll is // complete and telemetry is consumed, the tracked files are closed. The next // poll will create fresh readers with no previously tracked offsets. @@ -179,3 +293,5 @@ func (t *noStateTracker) ClosePreviousFiles() int { return 0 } func (t *noStateTracker) EndPoll() {} func (t *noStateTracker) TotalReaders() int { return 0 } + +func (t *noStateTracker) FindFiles([]*fingerprint.Fingerprint) []*reader.Metadata { return nil } diff --git a/pkg/stanza/fileconsumer/internal/tracker/tracker_test.go b/pkg/stanza/fileconsumer/internal/tracker/tracker_test.go new file mode 100644 index 000000000000..f16e2d647032 --- /dev/null +++ b/pkg/stanza/fileconsumer/internal/tracker/tracker_test.go @@ -0,0 +1,62 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package tracker // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/tracker" + +import ( + "context" + "math/rand/v2" + "testing" + + "github.com/google/uuid" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component/componenttest" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/checkpoint" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/fingerprint" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/reader" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/testutil" +) + +func TestFindFilesOrder(t *testing.T) { + fps := make([]*fingerprint.Fingerprint, 0) + for i := 0; i < 100; i++ { + fps = append(fps, fingerprint.New([]byte(uuid.NewString()))) + } + persister := testutil.NewUnscopedMockPersister() + fpInStorage := populatedPersisterData(persister, fps) + + tracker := NewFileTracker(componenttest.NewNopTelemetrySettings(), 0, 100, persister) + matchables := tracker.FindFiles(fps) + + require.Equal(t, len(fps), len(matchables), "return slice should be of same length as input slice") + + for i := 0; i < len(matchables); i++ { + if fpInStorage[i] { + // if current fingerprint is present in storage, the corresponding return type should not be nil + require.NotNilf(t, matchables[i], "resulting index %d should be not be nil type", i) + require.Truef(t, fps[i].Equal(matchables[i].GetFingerprint()), "fingerprint at index %d is not equal to corresponding return value", i) + } else { + // if current fingerprint is absent from storage, the corresponding index should be empty i.e. "nil" + require.Nil(t, matchables[i], "resulting index %d should be of nil type", i) + } + } +} + +func populatedPersisterData(persister operator.Persister, fps []*fingerprint.Fingerprint) []bool { + md := make([]*reader.Metadata, 0) + + fpInStorage := make([]bool, len(fps)) + for i, fp := range fps { + // 50-50 chance that a fingerprint exists in the storage + if rand.Float32() < 0.5 { + md = append(md, &reader.Metadata{Fingerprint: fp}) + fpInStorage[i] = true // mark the fingerprint at index i in storage + } + } + // save half keys in knownFiles0 and other half in knownFiles1 + _ = checkpoint.SaveKey(context.Background(), persister, md[:len(md)/2], "knownFiles0") + _ = checkpoint.SaveKey(context.Background(), persister, md[len(md)/2:], "knownFiles1") + return fpInStorage +} diff --git a/pkg/stanza/fileconsumer/internal/trie/trie_test.go b/pkg/stanza/fileconsumer/internal/trie/trie_test.go index e58a16844803..a2725d1dc005 100644 --- a/pkg/stanza/fileconsumer/internal/trie/trie_test.go +++ b/pkg/stanza/fileconsumer/internal/trie/trie_test.go @@ -330,7 +330,7 @@ func get(key string, expect any, why string) testOp { func put(key string, val any) testOp { return func(t *testing.T, trie *Trie[any]) { trie.Put([]byte(key), val) - assert.Equalf(t, val, trie.Get([]byte(key)), "called Put(%s, %d) but HasKey(%s) does not return %d", key, key) + assert.Equalf(t, val, trie.Get([]byte(key)), "called Put(%s, %d) but HasKey(%s) does not return %d", key, val, key, val) } } @@ -342,7 +342,7 @@ func del(key string, why string) testOp { assert.Falsef(t, trie.Delete([]byte(key)), why) } else { assert.Truef(t, trie.Delete([]byte(key)), why) - assert.Falsef(t, trie.Delete([]byte(key)), "called Del(%s) twice in a row and got true both times") + assert.Falsef(t, trie.Delete([]byte(key)), "called Del(%s) twice in a row and got true both times", key) } } } diff --git a/pkg/stanza/fileconsumer/matcher/internal/filter/exclude.go b/pkg/stanza/fileconsumer/matcher/internal/filter/exclude.go index 8e6e254f597e..de4156535cfe 100644 --- a/pkg/stanza/fileconsumer/matcher/internal/filter/exclude.go +++ b/pkg/stanza/fileconsumer/matcher/internal/filter/exclude.go @@ -7,6 +7,8 @@ import ( "time" "go.uber.org/multierr" + + internaltime "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/internal/time" ) type excludeOlderThanOption struct { @@ -25,7 +27,7 @@ func (eot excludeOlderThanOption) apply(items []*item) ([]*item, error) { // Keep (include) the file if its age (since last modification) // is the same or less than the configured age. - fileAge := time.Since(fi.ModTime()) + fileAge := internaltime.Since(fi.ModTime()) if fileAge <= eot.age { filteredItems = append(filteredItems, item) } diff --git a/pkg/stanza/fileconsumer/matcher/internal/filter/exclude_test.go b/pkg/stanza/fileconsumer/matcher/internal/filter/exclude_test.go index 436bec80987d..6eb745314c91 100644 --- a/pkg/stanza/fileconsumer/matcher/internal/filter/exclude_test.go +++ b/pkg/stanza/fileconsumer/matcher/internal/filter/exclude_test.go @@ -11,6 +11,8 @@ import ( "time" "github.com/stretchr/testify/require" + + internaltime "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/internal/time" ) func TestExcludeOlderThanFilter(t *testing.T) { @@ -25,10 +27,6 @@ func TestExcludeOlderThanFilter(t *testing.T) { expect []string expectedErr string expectedWindowsErr string - - // List of OSes on which to skip this test case - skipOS []string - skipReason string }{ "no_files": { files: []string{}, @@ -47,9 +45,6 @@ func TestExcludeOlderThanFilter(t *testing.T) { expectedErr: "", }, "exclude_some_files": { - skipOS: []string{"windows"}, - skipReason: "Flaky test case on Windows: https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/32838", - files: []string{"a.log", "b.log"}, fileMTimes: []time.Time{twoHoursAgo, threeHoursAgo}, excludeOlderThan: 3 * time.Hour, @@ -78,11 +73,8 @@ func TestExcludeOlderThanFilter(t *testing.T) { for name, tc := range cases { t.Run(name, func(t *testing.T) { - for _, os := range tc.skipOS { - if runtime.GOOS == os { - t.Skipf("Skipping test case: %s", tc.skipReason) - } - } + internaltime.Since = internaltime.NewAlwaysIncreasingClock().Since + defer func() { internaltime.Since = time.Since }() tmpDir := t.TempDir() var items []*item diff --git a/pkg/stanza/fileconsumer/matcher/internal/finder/finder.go b/pkg/stanza/fileconsumer/matcher/internal/finder/finder.go index f534411f0ee0..caa447bda7ee 100644 --- a/pkg/stanza/fileconsumer/matcher/internal/finder/finder.go +++ b/pkg/stanza/fileconsumer/matcher/internal/finder/finder.go @@ -6,8 +6,10 @@ package finder // import "github.com/open-telemetry/opentelemetry-collector-cont import ( "errors" "fmt" + "slices" "github.com/bmatcuk/doublestar/v4" + "golang.org/x/exp/maps" ) func Validate(globs []string) error { @@ -23,7 +25,8 @@ func Validate(globs []string) error { // FindFiles gets a list of paths given an array of glob patterns to include and exclude func FindFiles(includes []string, excludes []string) ([]string, error) { var errs error - all := make([]string, 0, len(includes)) + + allSet := make(map[string]struct{}, len(includes)) for _, include := range includes { matches, err := doublestar.FilepathGlob(include, doublestar.WithFilesOnly(), doublestar.WithFailOnIOErrors()) if err != nil { @@ -40,15 +43,11 @@ func FindFiles(includes []string, excludes []string) ([]string, error) { } } - for _, existing := range all { - if existing == match { - continue INCLUDE - } - } - - all = append(all, match) + allSet[match] = struct{}{} } } - return all, errs + keys := maps.Keys(allSet) + slices.Sort(keys) + return keys, errs } diff --git a/pkg/stanza/fileconsumer/matcher/internal/finder/finder_test.go b/pkg/stanza/fileconsumer/matcher/internal/finder/finder_test.go index 14c415e125f1..d6e360931e3c 100644 --- a/pkg/stanza/fileconsumer/matcher/internal/finder/finder_test.go +++ b/pkg/stanza/fileconsumer/matcher/internal/finder/finder_test.go @@ -4,6 +4,7 @@ package finder import ( + "fmt" "os" "path/filepath" "runtime" @@ -176,10 +177,10 @@ func TestFindFiles(t *testing.T) { require.NoError(t, os.Chdir(cwd)) }() for _, f := range tc.files { - require.NoError(t, os.MkdirAll(filepath.Dir(f), 0700)) + require.NoError(t, os.MkdirAll(filepath.Dir(f), 0o700)) var file *os.File - file, err = os.OpenFile(f, os.O_CREATE|os.O_RDWR, 0600) + file, err = os.OpenFile(f, os.O_CREATE|os.O_RDWR, 0o600) require.NoError(t, err) _, err = file.WriteString(filepath.Base(f)) @@ -188,7 +189,7 @@ func TestFindFiles(t *testing.T) { } files, err := FindFiles(tc.include, tc.exclude) assert.NoError(t, err) - assert.Equal(t, tc.expected, files) + assert.ElementsMatch(t, tc.expected, files) }) } } @@ -212,15 +213,15 @@ func TestFindFilesWithIOErrors(t *testing.T) { filepath.Join("dir1", "1.log"), filepath.Join("dir1", "2.log"), } { - require.NoError(t, os.MkdirAll(filepath.Dir(f), 0700)) + require.NoError(t, os.MkdirAll(filepath.Dir(f), 0o700)) - _, err = os.OpenFile(f, os.O_CREATE|os.O_RDWR, 0600) + _, err = os.OpenFile(f, os.O_CREATE|os.O_RDWR, 0o600) require.NoError(t, err) } - require.NoError(t, os.Chmod("no_permission", 0000)) + require.NoError(t, os.Chmod("no_permission", 0o000)) defer func() { - require.NoError(t, os.Chmod("no_permission", 0700)) + require.NoError(t, os.Chmod("no_permission", 0o700)) }() cases := []struct { @@ -251,7 +252,38 @@ func TestFindFilesWithIOErrors(t *testing.T) { t.Run(tc.name, func(t *testing.T) { files, err := FindFiles(tc.include, []string{}) assert.ErrorContains(t, err, tc.failedMsg) - assert.Equal(t, tc.expected, files) + assert.ElementsMatch(t, tc.expected, files) }) } } + +// benchResult is package level variable that store the result of the benchmark. +// It is used to prevent go from optimizing out the benchmarked code. +var benchResult []string + +func BenchmarkFind10kFiles(b *testing.B) { + numFiles := 10000 + tmpDir := b.TempDir() + + // Create a bunch of files for benchmarking + for i := range numFiles { + path := filepath.Join(tmpDir, fmt.Sprintf("log-%05d.log", i)) + f, err := os.Create(path) + require.NoError(b, err) + require.NoError(b, f.Close()) + } + + includeGlobs := []string{ + filepath.Join(tmpDir, "log-*.log"), + } + + excludeGlobs := []string{} + + var r []string + b.ResetTimer() + for range b.N { + r, _ = FindFiles(includeGlobs, excludeGlobs) + } + + benchResult = r +} diff --git a/pkg/stanza/fileconsumer/matcher/matcher.go b/pkg/stanza/fileconsumer/matcher/matcher.go index 948f18852a98..0377bfab3a61 100644 --- a/pkg/stanza/fileconsumer/matcher/matcher.go +++ b/pkg/stanza/fileconsumer/matcher/matcher.go @@ -44,9 +44,10 @@ type Criteria struct { } type OrderingCriteria struct { - Regex string `mapstructure:"regex,omitempty"` - TopN int `mapstructure:"top_n,omitempty"` - SortBy []Sort `mapstructure:"sort_by,omitempty"` + Regex string `mapstructure:"regex,omitempty"` + TopN int `mapstructure:"top_n,omitempty"` + SortBy []Sort `mapstructure:"sort_by,omitempty"` + GroupBy string `mapstructure:"group_by,omitempty"` } type Sort struct { @@ -80,6 +81,14 @@ func New(c Criteria) (*Matcher, error) { m.filterOpts = append(m.filterOpts, filter.ExcludeOlderThan(c.ExcludeOlderThan)) } + if c.OrderingCriteria.GroupBy != "" { + r, err := regexp.Compile(c.OrderingCriteria.GroupBy) + if err != nil { + return nil, fmt.Errorf("compile group_by regex: %w", err) + } + m.groupBy = r + } + if len(c.OrderingCriteria.SortBy) == 0 { return m, nil } @@ -92,14 +101,13 @@ func New(c Criteria) (*Matcher, error) { c.OrderingCriteria.TopN = defaultOrderingCriteriaTopN } - var regex *regexp.Regexp if orderingCriteriaNeedsRegex(c.OrderingCriteria.SortBy) { if c.OrderingCriteria.Regex == "" { return nil, fmt.Errorf("'regex' must be specified when 'sort_by' is specified") } var err error - regex, err = regexp.Compile(c.OrderingCriteria.Regex) + regex, err := regexp.Compile(c.OrderingCriteria.Regex) if err != nil { return nil, fmt.Errorf("compile regex: %w", err) } @@ -158,6 +166,7 @@ type Matcher struct { exclude []string regex *regexp.Regexp filterOpts []filter.Option + groupBy *regexp.Regexp } // MatchFiles gets a list of paths given an array of glob patterns to include and exclude @@ -174,9 +183,27 @@ func (m Matcher) MatchFiles() ([]string, error) { return files, errs } - result, err := filter.Filter(files, m.regex, m.filterOpts...) - if len(result) == 0 { - return result, errors.Join(err, errs) + groups := make(map[string][]string) + if m.groupBy != nil { + for _, f := range files { + matches := m.groupBy.FindStringSubmatch(f) + if len(matches) > 1 { + group := matches[1] + groups[group] = append(groups[group], f) + } + } + } else { + groups["1"] = files + } + + var result []string + for _, groupedFiles := range groups { + groupResult, err := filter.Filter(groupedFiles, m.regex, m.filterOpts...) + if len(groupResult) == 0 { + return groupResult, errors.Join(err, errs) + } + result = append(result, groupResult...) } + return result, errs } diff --git a/pkg/stanza/fileconsumer/matcher/matcher_test.go b/pkg/stanza/fileconsumer/matcher/matcher_test.go index 00c7bd0fbec0..7ae3eac47762 100644 --- a/pkg/stanza/fileconsumer/matcher/matcher_test.go +++ b/pkg/stanza/fileconsumer/matcher/matcher_test.go @@ -69,6 +69,15 @@ func TestNew(t *testing.T) { }, expectedErr: "exclude: parse glob: syntax error in pattern", }, + { + name: "GroupBy", + criteria: Criteria{ + Include: []string{"*.log"}, + OrderingCriteria: OrderingCriteria{ + GroupBy: "[a-z]", + }, + }, + }, { name: "RegexEmpty", criteria: Criteria{ @@ -118,6 +127,16 @@ func TestNew(t *testing.T) { }, expectedErr: "'top_n' must be a positive integer", }, + { + name: "GroupBy error", + criteria: Criteria{ + Include: []string{"*.log"}, + OrderingCriteria: OrderingCriteria{ + GroupBy: "[a-z", + }, + }, + expectedErr: "compile group_by regex: error parsing regexp: missing closing ]: `[a-z`", + }, { name: "SortTypeEmpty", criteria: Criteria{ @@ -384,6 +403,54 @@ func TestMatcher(t *testing.T) { }, expected: []string{"err.123456789.log"}, }, + { + name: "Numeric Sorting", + files: []string{"err.a.123456788.log", "err.a.123456789.log", "err.a.123456787.log", "err.a.123456786.log", "err.b.123456788.log", "err.b.123456789.log"}, + include: []string{"err.*.log"}, + exclude: []string{}, + filterCriteria: OrderingCriteria{ + TopN: 6, + Regex: `err\.[a-z]\.(?P\d+).*log`, + SortBy: []Sort{ + { + SortType: sortTypeNumeric, + RegexKey: "value", + Ascending: false, + }, + }, + }, + expected: []string{"err.a.123456789.log", "err.b.123456789.log", "err.a.123456788.log", "err.b.123456788.log", "err.a.123456787.log", "err.a.123456786.log"}, + }, + { + name: "Numeric Sorting with grouping", + files: []string{"err.a.123456788.log", "err.a.123456789.log", "err.a.123456787.log", "err.a.123456786.log", "err.b.123456788.log", "err.b.123456789.log"}, + include: []string{"err.*.log"}, + exclude: []string{}, + filterCriteria: OrderingCriteria{ + TopN: 6, + GroupBy: `err\.(?P[a-z]+).[0-9]*.*log`, + Regex: `err\.[a-z]\.(?P\d+).*log`, + SortBy: []Sort{ + { + SortType: sortTypeNumeric, + RegexKey: "value", + Ascending: false, + }, + }, + }, + expected: []string{"err.a.123456789.log", "err.a.123456788.log", "err.a.123456787.log", "err.a.123456786.log", "err.b.123456789.log", "err.b.123456788.log"}, + }, + { + name: "Grouping", + files: []string{"err.a.123456788.log", "err.a.123456789.log", "err.a.123456787.log", "err.b.123456788.log", "err.a.123456786.log", "err.b.123456789.log"}, + include: []string{"err.*.log"}, + exclude: []string{}, + filterCriteria: OrderingCriteria{ + TopN: 6, + GroupBy: `err\.(?P[a-z]+).[0-9]*.*log`, + }, + expected: []string{"err.a.123456786.log", "err.a.123456787.log", "err.a.123456788.log", "err.a.123456789.log", "err.b.123456788.log", "err.b.123456789.log"}, + }, { name: "Numeric Sorting Ascending", files: []string{"err.123456789.log", "err.123456788.log", "err.123456786.log", "err.123456787.log"}, @@ -753,7 +820,8 @@ func TestMatcher(t *testing.T) { expected: []string{ filepath.Join("a", "1.log"), }, - }} + }, + } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { @@ -764,8 +832,8 @@ func TestMatcher(t *testing.T) { require.NoError(t, os.Chdir(cwd)) }() for _, f := range tc.files { - require.NoError(t, os.MkdirAll(filepath.Dir(f), 0700)) - file, fErr := os.OpenFile(f, os.O_CREATE|os.O_RDWR, 0600) + require.NoError(t, os.MkdirAll(filepath.Dir(f), 0o700)) + file, fErr := os.OpenFile(f, os.O_CREATE|os.O_RDWR, 0o600) require.NoError(t, fErr) _, fErr = file.WriteString(filepath.Base(f)) @@ -785,7 +853,7 @@ func TestMatcher(t *testing.T) { } else { assert.NoError(t, err) } - assert.Equal(t, tc.expected, files) + assert.ElementsMatch(t, tc.expected, files) }) } } diff --git a/pkg/stanza/fileconsumer/metadata.yaml b/pkg/stanza/fileconsumer/metadata.yaml new file mode 100644 index 000000000000..0f02e2f9e387 --- /dev/null +++ b/pkg/stanza/fileconsumer/metadata.yaml @@ -0,0 +1,25 @@ +type: fileconsumer + +status: + class: pkg + stability: + beta: [logs] + codeowners: + active: [djaglowski] + +telemetry: + metrics: + fileconsumer_open_files: + description: Number of open files + unit: "1" + enabled: true + sum: + value_type: int + monotonic: false + fileconsumer_reading_files: + description: Number of open files that are being read + unit: "1" + enabled: true + sum: + value_type: int + monotonic: false diff --git a/pkg/stanza/fileconsumer/package_test.go b/pkg/stanza/fileconsumer/package_test.go deleted file mode 100644 index ce83ffab6419..000000000000 --- a/pkg/stanza/fileconsumer/package_test.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package fileconsumer - -import ( - "testing" - - "go.uber.org/goleak" -) - -func TestMain(m *testing.M) { - goleak.VerifyTestMain(m) -} diff --git a/pkg/stanza/fileconsumer/rotation_test.go b/pkg/stanza/fileconsumer/rotation_test.go index 2c8912cc6eb7..bc8f067f535a 100644 --- a/pkg/stanza/fileconsumer/rotation_test.go +++ b/pkg/stanza/fileconsumer/rotation_test.go @@ -69,16 +69,16 @@ func TestCopyTruncate(t *testing.T) { filetest.WriteString(t, file, getMessage(fn, rotationNum, messageNum)+"\n") time.Sleep(10 * time.Millisecond) } - require.NoError(t, file.Sync()) + assert.NoError(t, file.Sync()) _, err := file.Seek(0, 0) - require.NoError(t, err) + assert.NoError(t, err) dst := filetest.OpenFile(t, fileName(fn, rotationNum)) _, err = io.Copy(dst, file) - require.NoError(t, err) - require.NoError(t, dst.Close()) - require.NoError(t, file.Truncate(0)) + assert.NoError(t, err) + assert.NoError(t, dst.Close()) + assert.NoError(t, file.Truncate(0)) _, err = file.Seek(0, 0) - require.NoError(t, err) + assert.NoError(t, err) } }(fileNum) } @@ -130,8 +130,8 @@ func TestMoveCreate(t *testing.T) { filetest.WriteString(t, file, getMessage(fn, rotationNum, messageNum)+"\n") time.Sleep(10 * time.Millisecond) } - require.NoError(t, file.Close()) - require.NoError(t, os.Rename(baseFileName(fn), fileName(fn, rotationNum))) + assert.NoError(t, file.Close()) + assert.NoError(t, os.Rename(baseFileName(fn), fileName(fn, rotationNum))) } }(fileNum) } @@ -191,14 +191,14 @@ func TestTrackMovedAwayFiles(t *testing.T) { operator.wg.Wait() newDir := fmt.Sprintf("%s%s", tempDir[:len(tempDir)-1], "_new/") - err := os.Mkdir(newDir, 0777) + err := os.Mkdir(newDir, 0o777) require.NoError(t, err) newFileName := fmt.Sprintf("%s%s", newDir, "newfile.log") err = os.Rename(temp1.Name(), newFileName) require.NoError(t, err) - movedFile, err := os.OpenFile(newFileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + movedFile, err := os.OpenFile(newFileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o644) require.NoError(t, err) filetest.WriteString(t, movedFile, "testlog2\n") operator.poll(context.Background()) @@ -236,12 +236,12 @@ func TestTrackRotatedFilesLogOrder(t *testing.T) { originalFile.Close() newDir := fmt.Sprintf("%s%s", tempDir[:len(tempDir)-1], "_new/") - require.NoError(t, os.Mkdir(newDir, 0777)) + require.NoError(t, os.Mkdir(newDir, 0o777)) movedFileName := fmt.Sprintf("%s%s", newDir, "newfile.log") require.NoError(t, os.Rename(orginalName, movedFileName)) - newFile, err := os.OpenFile(orginalName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + newFile, err := os.OpenFile(orginalName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o644) require.NoError(t, err) filetest.WriteString(t, newFile, "testlog3\n") @@ -318,6 +318,9 @@ func TestRotatedOutOfPatternMoveCreate(t *testing.T) { // When a file it rotated out of pattern via copy/truncate, we should // detect that our old handle is stale and not attempt to read from it. func TestRotatedOutOfPatternCopyTruncate(t *testing.T) { + if runtime.GOOS == windowsOS { + t.Skip("Rotation tests have been flaky on Windows. See https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/16331") + } t.Parallel() tempDir := t.TempDir() diff --git a/pkg/stanza/fileconsumer/testdata/config.yaml b/pkg/stanza/fileconsumer/testdata/config.yaml index aa973d609612..68223c706fd2 100644 --- a/pkg/stanza/fileconsumer/testdata/config.yaml +++ b/pkg/stanza/fileconsumer/testdata/config.yaml @@ -51,6 +51,14 @@ exclude_one: - "*.log" exclude: - one.log +sort_by_group_by: + type: mock + ordering_criteria: + regex: 'err\.(?P[a-zA-Z])\.\d+\.\d{10}\.log' + group_by: 'err\.(?P[a-z]+).[0-9]*.*log' + sort_by: + - regex_key: file_num + sort_type: numeric sort_by_numeric: type: mock ordering_criteria: diff --git a/pkg/stanza/fileconsumer/util_test.go b/pkg/stanza/fileconsumer/util_test.go index 19d465a6e43b..69bb92ca26cd 100644 --- a/pkg/stanza/fileconsumer/util_test.go +++ b/pkg/stanza/fileconsumer/util_test.go @@ -10,6 +10,8 @@ import ( "go.opentelemetry.io/collector/component/componenttest" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/emittest" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/tracker" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/testutil" ) func testManager(t *testing.T, cfg *Config, opts ...Option) (*Manager, *emittest.Sink) { @@ -20,6 +22,7 @@ func testManager(t *testing.T, cfg *Config, opts ...Option) (*Manager, *emittest func testManagerWithSink(t *testing.T, cfg *Config, sink *emittest.Sink, opts ...Option) *Manager { set := componenttest.NewNopTelemetrySettings() input, err := cfg.Build(set, sink.Callback, opts...) + input.tracker = tracker.NewFileTracker(set, cfg.MaxBatches, cfg.PollsToArchive, testutil.NewUnscopedMockPersister()) require.NoError(t, err) t.Cleanup(func() { input.tracker.ClosePreviousFiles() }) return input diff --git a/pkg/stanza/flush/flush.go b/pkg/stanza/flush/flush.go index afa03fe92f4d..b4d700795898 100644 --- a/pkg/stanza/flush/flush.go +++ b/pkg/stanza/flush/flush.go @@ -6,6 +6,8 @@ package flush // import "github.com/open-telemetry/opentelemetry-collector-contr import ( "bufio" "time" + + internaltime "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/internal/time" ) type State struct { @@ -40,7 +42,7 @@ func (s *State) Func(splitFunc bufio.SplitFunc, period time.Duration) bufio.Spli // If there's a token, return it if token != nil { - s.LastDataChange = time.Now() + s.LastDataChange = internaltime.Now() s.LastDataLength = 0 return advance, token, err } @@ -53,14 +55,14 @@ func (s *State) Func(splitFunc bufio.SplitFunc, period time.Duration) bufio.Spli // We're seeing new data so postpone the next flush if len(data) > s.LastDataLength { - s.LastDataChange = time.Now() + s.LastDataChange = internaltime.Now() s.LastDataLength = len(data) return 0, nil, nil } // Flush timed out if time.Since(s.LastDataChange) > period { - s.LastDataChange = time.Now() + s.LastDataChange = internaltime.Now() s.LastDataLength = 0 return len(data), data, nil } @@ -72,6 +74,6 @@ func (s *State) Func(splitFunc bufio.SplitFunc, period time.Duration) bufio.Spli // Deprecated: [v0.88.0] Use WithFunc instead. func WithPeriod(splitFunc bufio.SplitFunc, period time.Duration) bufio.SplitFunc { - s := &State{LastDataChange: time.Now()} + s := &State{LastDataChange: internaltime.Now()} return s.Func(splitFunc, period) } diff --git a/pkg/stanza/go.mod b/pkg/stanza/go.mod index 2ad64657ab77..a5da493bfdb6 100644 --- a/pkg/stanza/go.mod +++ b/pkg/stanza/go.mod @@ -1,75 +1,83 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza -go 1.21.0 +go 1.22.0 require ( - github.com/bmatcuk/doublestar/v4 v4.6.1 + github.com/bmatcuk/doublestar/v4 v4.7.1 github.com/cespare/xxhash/v2 v2.3.0 github.com/expr-lang/expr v1.16.9 - github.com/fsnotify/fsnotify v1.7.0 + github.com/fsnotify/fsnotify v1.8.0 + github.com/goccy/go-json v0.10.4 + github.com/google/uuid v1.6.0 + github.com/jonboulle/clockwork v0.4.0 github.com/jpillora/backoff v1.0.0 github.com/json-iterator/go v1.1.12 - github.com/leodido/go-syslog/v4 v4.1.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 - github.com/stretchr/testify v1.9.0 + github.com/leodido/go-syslog/v4 v4.2.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/stretchr/testify v1.10.0 github.com/valyala/fastjson v1.6.4 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configtls v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/collector/featuregate v1.9.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/receiver v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 + go.opentelemetry.io/collector/config/configtls v1.22.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 + go.opentelemetry.io/collector/featuregate v1.22.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/receiver v0.116.0 + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 + go.opentelemetry.io/otel/metric v1.32.0 + go.opentelemetry.io/otel/sdk/metric v1.32.0 + go.opentelemetry.io/otel/trace v1.32.0 go.uber.org/goleak v1.3.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 - golang.org/x/sys v0.20.0 - golang.org/x/text v0.15.0 - gonum.org/v1/gonum v0.15.0 + golang.org/x/sys v0.28.0 + golang.org/x/text v0.21.0 + gonum.org/v1/gonum v0.15.1 gopkg.in/yaml.v2 v2.4.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/elastic/lunes v0.1.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b // indirect + github.com/magefile/mage v1.15.0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect github.com/stretchr/objx v0.5.2 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configopaque v1.9.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - go.opentelemetry.io/otel/trace v1.27.0 // indirect - golang.org/x/net v0.25.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + go.opentelemetry.io/collector/config/configopaque v1.22.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/collector/semconv v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + golang.org/x/net v0.29.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/pkg/stanza/go.sum b/pkg/stanza/go.sum index e12278b92a1f..e5b6b024408b 100644 --- a/pkg/stanza/go.sum +++ b/pkg/stanza/go.sum @@ -1,7 +1,5 @@ -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/bmatcuk/doublestar/v4 v4.6.1 h1:FH9SifrbvJhnlQpztAx++wlkk70QBf0iBWDwNy7PA4I= -github.com/bmatcuk/doublestar/v4 v4.6.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= +github.com/bmatcuk/doublestar/v4 v4.7.1 h1:fdDeAqgT47acgwd9bd9HxJRDmc9UAmPpc+2m0CXv75Q= +github.com/bmatcuk/doublestar/v4 v4.7.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= @@ -9,19 +7,25 @@ github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/elastic/lunes v0.1.0 h1:amRtLPjwkWtzDF/RKzcEPMvSsSseLDLW+bnhfNSLRe4= +github.com/elastic/lunes v0.1.0/go.mod h1:xGphYIt3XdZRtyWosHQTErsQTd4OP1p9wsbVoHelrd4= github.com/expr-lang/expr v1.16.9 h1:WUAzmR0JNI9JCiF0/ewwHB1gmcGw5wW7nWt8gc6PpCI= github.com/expr-lang/expr v1.16.9/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= +github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -30,6 +34,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -40,16 +46,18 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/leodido/go-syslog/v4 v4.1.0 h1:Wsl194qyWXr7V6DrGWC3xmxA9Ra6XgWO+toNt2fmCaI= -github.com/leodido/go-syslog/v4 v4.1.0/go.mod h1:eJ8rUfDN5OS6dOkCOBYlg2a+hbAg6pJa99QXXgMrd98= +github.com/leodido/go-syslog/v4 v4.2.0 h1:A7vpbYxsO4e2E8udaurkLlxP5LDpDbmPMsGnuhb7jVk= +github.com/leodido/go-syslog/v4 v4.2.0/go.mod h1:eJ8rUfDN5OS6dOkCOBYlg2a+hbAg6pJa99QXXgMrd98= github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b h1:11UHH39z1RhZ5dc4y4r/4koJo6IYFgTRMe/LlwRTEw0= github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b/go.mod h1:WZxr2/6a/Ar9bMDc2rN/LJrE/hF6bXE4LPyDSIxwAfg= +github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= +github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= @@ -61,62 +69,70 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ= github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -134,20 +150,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -156,14 +172,14 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= -gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= +gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/pkg/stanza/internal/time/time.go b/pkg/stanza/internal/time/time.go new file mode 100644 index 000000000000..34269bbf3fbf --- /dev/null +++ b/pkg/stanza/internal/time/time.go @@ -0,0 +1,37 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package time // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/internal/time" + +import ( + "time" + + "github.com/jonboulle/clockwork" +) + +var ( + Now = time.Now + Since = time.Since +) + +// Clock where Now() always returns a greater value than the previous return value +type AlwaysIncreasingClock struct { + clockwork.FakeClock +} + +func NewAlwaysIncreasingClock() AlwaysIncreasingClock { + return AlwaysIncreasingClock{ + FakeClock: clockwork.NewFakeClock(), + } +} + +func (c AlwaysIncreasingClock) Now() time.Time { + c.FakeClock.Advance(time.Nanosecond) + return c.FakeClock.Now() +} + +func (c AlwaysIncreasingClock) Since(t time.Time) time.Duration { + // ensure that internal c.FakeClock.Now() will return a greater value + c.FakeClock.Advance(time.Nanosecond) + return c.FakeClock.Since(t) +} diff --git a/pkg/stanza/operator/config_test.go b/pkg/stanza/operator/config_test.go index 14375683a424..8d3899634f74 100644 --- a/pkg/stanza/operator/config_test.go +++ b/pkg/stanza/operator/config_test.go @@ -43,24 +43,21 @@ func TestUnmarshalJSONErrors(t *testing.T) { raw := `{}}` cfg := &Config{} err := cfg.UnmarshalJSON([]byte(raw)) - require.Error(t, err) - require.Contains(t, err.Error(), "invalid") + require.ErrorContains(t, err, "invalid") }) t.Run("MissingType", func(t *testing.T) { raw := `{"id":"stdout"}` var cfg Config err := json.Unmarshal([]byte(raw), &cfg) - require.Error(t, err) - require.Contains(t, err.Error(), "missing required field") + require.ErrorContains(t, err, "missing required field") }) t.Run("UnknownType", func(t *testing.T) { raw := `{"id":"stdout","type":"nonexist"}` var cfg Config err := json.Unmarshal([]byte(raw), &cfg) - require.Error(t, err) - require.Contains(t, err.Error(), "unsupported type") + require.ErrorContains(t, err, "unsupported type") }) t.Run("TypeSpecificUnmarshal", func(t *testing.T) { @@ -68,8 +65,7 @@ func TestUnmarshalJSONErrors(t *testing.T) { Register("operator", func() Builder { return &FakeBuilder{} }) var cfg Config err := json.Unmarshal([]byte(raw), &cfg) - require.Error(t, err) - require.Contains(t, err.Error(), "cannot unmarshal string into") + require.ErrorContains(t, err, "cannot unmarshal string into") }) } @@ -87,32 +83,28 @@ func TestUnmarshalYAMLErrors(t *testing.T) { raw := `-- - \n||\\` var cfg Config err := yaml.Unmarshal([]byte(raw), &cfg) - require.Error(t, err) - require.Contains(t, err.Error(), "failed ") + require.ErrorContains(t, err, "failed ") }) t.Run("MissingType", func(t *testing.T) { raw := "id: operator\n" var cfg Config err := yaml.Unmarshal([]byte(raw), &cfg) - require.Error(t, err) - require.Contains(t, err.Error(), "missing required field") + require.ErrorContains(t, err, "missing required field") }) t.Run("NonStringType", func(t *testing.T) { raw := "id: operator\ntype: 123" var cfg Config err := yaml.Unmarshal([]byte(raw), &cfg) - require.Error(t, err) - require.Contains(t, err.Error(), "non-string type") + require.ErrorContains(t, err, "non-string type") }) t.Run("UnknownType", func(t *testing.T) { raw := "id: operator\ntype: unknown\n" var cfg Config err := yaml.Unmarshal([]byte(raw), &cfg) - require.Error(t, err) - require.Contains(t, err.Error(), "unsupported type") + require.ErrorContains(t, err, "unsupported type") }) t.Run("TypeSpecificUnmarshal", func(t *testing.T) { @@ -120,7 +112,6 @@ func TestUnmarshalYAMLErrors(t *testing.T) { Register("operator", func() Builder { return &FakeBuilder{} }) var cfg Config err := yaml.Unmarshal([]byte(raw), &cfg) - require.Error(t, err) - require.Contains(t, err.Error(), "cannot unmarshal !!str") + require.ErrorContains(t, err, "cannot unmarshal !!str") }) } diff --git a/pkg/stanza/operator/helper/emitter.go b/pkg/stanza/operator/helper/emitter.go index dcff31667ad6..aa91b85c92be 100644 --- a/pkg/stanza/operator/helper/emitter.go +++ b/pkg/stanza/operator/helper/emitter.go @@ -14,17 +14,17 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator" ) -// LogEmitter is a stanza operator that emits log entries to a channel +// LogEmitter is a stanza operator that emits log entries to the consumer callback function `consumerFunc` type LogEmitter struct { OutputOperator - logChan chan []*entry.Entry + closeChan chan struct{} stopOnce sync.Once - cancel context.CancelFunc batchMux sync.Mutex batch []*entry.Entry wg sync.WaitGroup maxBatchSize uint flushInterval time.Duration + consumerFunc func(context.Context, []*entry.Entry) } var ( @@ -61,15 +61,15 @@ func (o flushIntervalOption) apply(e *LogEmitter) { } // NewLogEmitter creates a new receiver output -func NewLogEmitter(set component.TelemetrySettings, opts ...EmitterOption) *LogEmitter { +func NewLogEmitter(set component.TelemetrySettings, consumerFunc func(context.Context, []*entry.Entry), opts ...EmitterOption) *LogEmitter { op, _ := NewOutputConfig("log_emitter", "log_emitter").Build(set) e := &LogEmitter{ OutputOperator: op, - logChan: make(chan []*entry.Entry), + closeChan: make(chan struct{}), maxBatchSize: defaultMaxBatchSize, batch: make([]*entry.Entry, 0, defaultMaxBatchSize), flushInterval: defaultFlushInterval, - cancel: func() {}, + consumerFunc: consumerFunc, } for _, opt := range opts { opt.apply(e) @@ -79,40 +79,25 @@ func NewLogEmitter(set component.TelemetrySettings, opts ...EmitterOption) *LogE // Start starts the goroutine(s) required for this operator func (e *LogEmitter) Start(_ operator.Persister) error { - ctx, cancel := context.WithCancel(context.Background()) - e.cancel = cancel - e.wg.Add(1) - go e.flusher(ctx) + go e.flusher() return nil } // Stop will close the log channel and stop running goroutines func (e *LogEmitter) Stop() error { e.stopOnce.Do(func() { - e.cancel() + close(e.closeChan) e.wg.Wait() - - close(e.logChan) }) return nil } -// OutChannel returns the channel on which entries will be sent to. -func (e *LogEmitter) OutChannel() <-chan []*entry.Entry { - return e.logChan -} - -// OutChannelForWrite returns the channel on which entries can be sent to. -func (e *LogEmitter) OutChannelForWrite() chan []*entry.Entry { - return e.logChan -} - // Process will emit an entry to the output channel func (e *LogEmitter) Process(ctx context.Context, ent *entry.Entry) error { if oldBatch := e.appendEntry(ent); len(oldBatch) > 0 { - e.flush(ctx, oldBatch) + e.consumerFunc(ctx, oldBatch) } return nil @@ -135,7 +120,7 @@ func (e *LogEmitter) appendEntry(ent *entry.Entry) []*entry.Entry { } // flusher flushes the current batch every flush interval. Intended to be run as a goroutine -func (e *LogEmitter) flusher(ctx context.Context) { +func (e *LogEmitter) flusher() { defer e.wg.Done() ticker := time.NewTicker(e.flushInterval) @@ -145,22 +130,18 @@ func (e *LogEmitter) flusher(ctx context.Context) { select { case <-ticker.C: if oldBatch := e.makeNewBatch(); len(oldBatch) > 0 { - e.flush(ctx, oldBatch) + e.consumerFunc(context.Background(), oldBatch) + } + case <-e.closeChan: + // flush currently batched entries + if oldBatch := e.makeNewBatch(); len(oldBatch) > 0 { + e.consumerFunc(context.Background(), oldBatch) } - case <-ctx.Done(): return } } } -// flush flushes the provided batch to the log channel. -func (e *LogEmitter) flush(ctx context.Context, batch []*entry.Entry) { - select { - case e.logChan <- batch: - case <-ctx.Done(): - } -} - // makeNewBatch replaces the current batch on the log emitter with a new batch, returning the old one func (e *LogEmitter) makeNewBatch() []*entry.Entry { e.batchMux.Lock() diff --git a/pkg/stanza/operator/helper/emitter_test.go b/pkg/stanza/operator/helper/emitter_test.go index 843415e44776..927734dccf56 100644 --- a/pkg/stanza/operator/helper/emitter_test.go +++ b/pkg/stanza/operator/helper/emitter_test.go @@ -6,9 +6,11 @@ package helper import ( "context" "fmt" + "sync" "testing" "time" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component/componenttest" @@ -16,7 +18,16 @@ import ( ) func TestLogEmitter(t *testing.T) { - emitter := NewLogEmitter(componenttest.NewNopTelemetrySettings()) + rwMtx := &sync.RWMutex{} + var receivedEntries []*entry.Entry + emitter := NewLogEmitter( + componenttest.NewNopTelemetrySettings(), + func(_ context.Context, entries []*entry.Entry) { + rwMtx.Lock() + defer rwMtx.Unlock() + receivedEntries = entries + }, + ) require.NoError(t, emitter.Start(nil)) @@ -26,16 +37,14 @@ func TestLogEmitter(t *testing.T) { in := entry.New() - go func() { - require.NoError(t, emitter.Process(context.Background(), in)) - }() + assert.NoError(t, emitter.Process(context.Background(), in)) - select { - case out := <-emitter.logChan: - require.Equal(t, in, out[0]) - case <-time.After(time.Second): - require.FailNow(t, "Timed out waiting for output") - } + require.Eventually(t, func() bool { + rwMtx.RLock() + defer rwMtx.RUnlock() + return receivedEntries != nil + }, time.Second, 10*time.Millisecond) + require.Equal(t, in, receivedEntries[0]) } func TestLogEmitterEmitsOnMaxBatchSize(t *testing.T) { @@ -43,7 +52,16 @@ func TestLogEmitterEmitsOnMaxBatchSize(t *testing.T) { maxBatchSize = 100 timeout = time.Second ) - emitter := NewLogEmitter(componenttest.NewNopTelemetrySettings()) + rwMtx := &sync.RWMutex{} + var receivedEntries []*entry.Entry + emitter := NewLogEmitter( + componenttest.NewNopTelemetrySettings(), + func(_ context.Context, entries []*entry.Entry) { + rwMtx.Lock() + defer rwMtx.Unlock() + receivedEntries = entries + }, + ) require.NoError(t, emitter.Start(nil)) defer func() { @@ -52,21 +70,17 @@ func TestLogEmitterEmitsOnMaxBatchSize(t *testing.T) { entries := complexEntries(maxBatchSize) - go func() { - ctx := context.Background() - for _, e := range entries { - require.NoError(t, emitter.Process(ctx, e)) - } - }() - - timeoutChan := time.After(timeout) - - select { - case recv := <-emitter.logChan: - require.Equal(t, maxBatchSize, len(recv), "Length of received entries was not the same as max batch size!") - case <-timeoutChan: - require.FailNow(t, "Failed to receive log entries before timeout") + ctx := context.Background() + for _, e := range entries { + assert.NoError(t, emitter.Process(ctx, e)) } + + require.Eventually(t, func() bool { + rwMtx.RLock() + defer rwMtx.RUnlock() + return receivedEntries != nil + }, timeout, 10*time.Millisecond) + require.Len(t, receivedEntries, maxBatchSize) } func TestLogEmitterEmitsOnFlushInterval(t *testing.T) { @@ -74,7 +88,17 @@ func TestLogEmitterEmitsOnFlushInterval(t *testing.T) { flushInterval = 100 * time.Millisecond timeout = time.Second ) - emitter := NewLogEmitter(componenttest.NewNopTelemetrySettings()) + rwMtx := &sync.RWMutex{} + var receivedEntries []*entry.Entry + emitter := NewLogEmitter( + componenttest.NewNopTelemetrySettings(), + func(_ context.Context, entries []*entry.Entry) { + rwMtx.Lock() + defer rwMtx.Unlock() + receivedEntries = entries + }, + ) + emitter.flushInterval = flushInterval require.NoError(t, emitter.Start(nil)) defer func() { @@ -83,19 +107,16 @@ func TestLogEmitterEmitsOnFlushInterval(t *testing.T) { entry := complexEntry() - go func() { - ctx := context.Background() - require.NoError(t, emitter.Process(ctx, entry)) - }() + ctx := context.Background() + assert.NoError(t, emitter.Process(ctx, entry)) - timeoutChan := time.After(timeout) + require.Eventually(t, func() bool { + rwMtx.RLock() + defer rwMtx.RUnlock() + return receivedEntries != nil + }, timeout, 10*time.Millisecond) - select { - case recv := <-emitter.logChan: - require.Equal(t, 1, len(recv), "Should have received one entry, got %d instead", len(recv)) - case <-timeoutChan: - require.FailNow(t, "Failed to receive log entry before timeout") - } + require.Len(t, receivedEntries, 1) } func complexEntries(count int) []*entry.Entry { diff --git a/pkg/stanza/operator/helper/input_test.go b/pkg/stanza/operator/helper/input_test.go index bf077071e1f3..cfa58c304936 100644 --- a/pkg/stanza/operator/helper/input_test.go +++ b/pkg/stanza/operator/helper/input_test.go @@ -23,8 +23,7 @@ func TestInputConfigMissingBase(t *testing.T) { set := componenttest.NewNopTelemetrySettings() _, err := config.Build(set) - require.Error(t, err) - require.Contains(t, err.Error(), "missing required `type` field.") + require.ErrorContains(t, err, "missing required `type` field.") } func TestInputConfigMissingOutput(t *testing.T) { @@ -89,7 +88,7 @@ func TestInputOperatorProcess(t *testing.T) { ctx := context.Background() err := input.Process(ctx, entry) require.Error(t, err) - require.Equal(t, err.Error(), "Operator can not process logs.") + require.Equal(t, "Operator can not process logs.", err.Error()) } func TestInputOperatorNewEntry(t *testing.T) { diff --git a/pkg/stanza/operator/helper/operator_test.go b/pkg/stanza/operator/helper/operator_test.go index 99f7f6b8eb58..41577e1cfdc6 100644 --- a/pkg/stanza/operator/helper/operator_test.go +++ b/pkg/stanza/operator/helper/operator_test.go @@ -46,8 +46,7 @@ func TestBasicConfigBuildWithoutType(t *testing.T) { set := componenttest.NewNopTelemetrySettings() _, err := config.Build(set) - require.Error(t, err) - require.Contains(t, err.Error(), "missing required `type` field.") + require.ErrorContains(t, err, "missing required `type` field.") } func TestBasicConfigBuildMissingLogger(t *testing.T) { @@ -59,8 +58,7 @@ func TestBasicConfigBuildMissingLogger(t *testing.T) { set := componenttest.NewNopTelemetrySettings() set.Logger = nil _, err := config.Build(set) - require.Error(t, err) - require.Contains(t, err.Error(), "operator build context is missing a logger.") + require.ErrorContains(t, err, "operator build context is missing a logger.") } func TestBasicConfigBuildValid(t *testing.T) { diff --git a/pkg/stanza/operator/helper/output_test.go b/pkg/stanza/operator/helper/output_test.go index 2dc62b929fb2..b55e33abd4ca 100644 --- a/pkg/stanza/operator/helper/output_test.go +++ b/pkg/stanza/operator/helper/output_test.go @@ -17,8 +17,7 @@ func TestOutputConfigMissingBase(t *testing.T) { config := OutputConfig{} set := componenttest.NewNopTelemetrySettings() _, err := config.Build(set) - require.Error(t, err) - require.Contains(t, err.Error(), "missing required `type` field.") + require.ErrorContains(t, err, "missing required `type` field.") } func TestOutputConfigBuildValid(t *testing.T) { @@ -84,6 +83,5 @@ func TestOutputOperatorSetOutputs(t *testing.T) { } err := output.SetOutputs([]operator.Operator{}) - require.Error(t, err) - require.Contains(t, err.Error(), "Operator can not output") + require.ErrorContains(t, err, "Operator can not output") } diff --git a/pkg/stanza/operator/helper/parser.go b/pkg/stanza/operator/helper/parser.go index 84ba71035b8e..f46c55f970b7 100644 --- a/pkg/stanza/operator/helper/parser.go +++ b/pkg/stanza/operator/helper/parser.go @@ -105,22 +105,24 @@ func (p *ParserOperator) ProcessWithCallback(ctx context.Context, entry *entry.E return p.HandleEntryError(ctx, entry, err) } if skip { - p.Write(ctx, entry) - return nil + return p.Write(ctx, entry) } if err = p.ParseWith(ctx, entry, parse); err != nil { + if p.OnError == DropOnErrorQuiet || p.OnError == SendOnErrorQuiet { + return nil + } + return err } if cb != nil { err = cb(entry) if err != nil { - return err + return p.HandleEntryError(ctx, entry, err) } } - p.Write(ctx, entry) - return nil + return p.Write(ctx, entry) } // ParseWith will process an entry's field with a parser function. diff --git a/pkg/stanza/operator/helper/parser_test.go b/pkg/stanza/operator/helper/parser_test.go index e7d635377d1e..ef5e7c06c669 100644 --- a/pkg/stanza/operator/helper/parser_test.go +++ b/pkg/stanza/operator/helper/parser_test.go @@ -24,8 +24,7 @@ func TestParserConfigMissingBase(t *testing.T) { config := ParserConfig{} set := componenttest.NewNopTelemetrySettings() _, err := config.Build(set) - require.Error(t, err) - require.Contains(t, err.Error(), "missing required `type` field.") + require.ErrorContains(t, err, "missing required `type` field.") } func TestParserConfigInvalidTimeParser(t *testing.T) { @@ -39,8 +38,7 @@ func TestParserConfigInvalidTimeParser(t *testing.T) { set := componenttest.NewNopTelemetrySettings() _, err := cfg.Build(set) - require.Error(t, err) - require.Contains(t, err.Error(), "missing required configuration parameter `layout`") + require.ErrorContains(t, err, "missing required configuration parameter `layout`") } func TestParserConfigBodyCollision(t *testing.T) { @@ -52,8 +50,7 @@ func TestParserConfigBodyCollision(t *testing.T) { set := componenttest.NewNopTelemetrySettings() _, err := cfg.Build(set) - require.Error(t, err) - require.Contains(t, err.Error(), "`parse_to: body` not allowed when `body` is configured") + require.ErrorContains(t, err, "`parse_to: body` not allowed when `body` is configured") } func TestParserConfigBuildValid(t *testing.T) { @@ -123,8 +120,7 @@ func TestParserMissingField(t *testing.T) { ctx := context.Background() testEntry := entry.New() err := parser.ProcessWith(ctx, testEntry, parse) - require.Error(t, err) - require.Contains(t, err.Error(), "Entry is missing the expected parse_from field.") + require.ErrorContains(t, err, "Entry is missing the expected parse_from field.") } func TestParserInvalidParseDrop(t *testing.T) { @@ -142,11 +138,29 @@ func TestParserInvalidParseDrop(t *testing.T) { ctx := context.Background() testEntry := entry.New() err := parser.ProcessWith(ctx, testEntry, parse) - require.Error(t, err) - require.Contains(t, err.Error(), "parse failure") + require.ErrorContains(t, err, "parse failure") fakeOut.ExpectNoEntry(t, 100*time.Millisecond) } +func TestParserInvalidParseDropQuiet(t *testing.T) { + writer, fakeOut := writerWithFakeOut(t) + parser := ParserOperator{ + TransformerOperator: TransformerOperator{ + WriterOperator: *writer, + OnError: DropOnErrorQuiet, + }, + ParseFrom: entry.NewBodyField(), + } + parse := func(i any) (any, error) { + return i, fmt.Errorf("parse failure") + } + ctx := context.Background() + testEntry := entry.New() + err := parser.ProcessWith(ctx, testEntry, parse) + require.NoError(t, err, "error should be silent") + fakeOut.ExpectNoEntry(t, 100*time.Millisecond) // Entry should be dropped +} + func TestParserInvalidParseSend(t *testing.T) { writer, fakeOut := writerWithFakeOut(t) parser := ParserOperator{ @@ -162,8 +176,27 @@ func TestParserInvalidParseSend(t *testing.T) { ctx := context.Background() testEntry := entry.New() err := parser.ProcessWith(ctx, testEntry, parse) - require.Error(t, err) - require.Contains(t, err.Error(), "parse failure") + require.ErrorContains(t, err, "parse failure") + fakeOut.ExpectEntry(t, testEntry) + fakeOut.ExpectNoEntry(t, 100*time.Millisecond) +} + +func TestParserInvalidParseSendQuiet(t *testing.T) { + writer, fakeOut := writerWithFakeOut(t) + parser := ParserOperator{ + TransformerOperator: TransformerOperator{ + WriterOperator: *writer, + OnError: SendOnErrorQuiet, + }, + ParseFrom: entry.NewBodyField(), + } + parse := func(i any) (any, error) { + return i, fmt.Errorf("parse failure") + } + ctx := context.Background() + testEntry := entry.New() + err := parser.ProcessWith(ctx, testEntry, parse) + require.NoError(t, err, "error should be silent") fakeOut.ExpectEntry(t, testEntry) fakeOut.ExpectNoEntry(t, 100*time.Millisecond) } @@ -190,8 +223,7 @@ func TestParserInvalidTimeParseDrop(t *testing.T) { ctx := context.Background() testEntry := entry.New() err := parser.ProcessWith(ctx, testEntry, parse) - require.Error(t, err) - require.Contains(t, err.Error(), "time parser: log entry does not have the expected parse_from field") + require.ErrorContains(t, err, "time parser: log entry does not have the expected parse_from field") fakeOut.ExpectNoEntry(t, 100*time.Millisecond) } @@ -217,11 +249,11 @@ func TestParserInvalidTimeParseSend(t *testing.T) { ctx := context.Background() testEntry := entry.New() err := parser.ProcessWith(ctx, testEntry, parse) - require.Error(t, err) - require.Contains(t, err.Error(), "time parser: log entry does not have the expected parse_from field") + require.ErrorContains(t, err, "time parser: log entry does not have the expected parse_from field") fakeOut.ExpectEntry(t, testEntry) fakeOut.ExpectNoEntry(t, 100*time.Millisecond) } + func TestParserInvalidSeverityParseDrop(t *testing.T) { writer, fakeOut := writerWithFakeOut(t) parser := ParserOperator{ @@ -241,8 +273,7 @@ func TestParserInvalidSeverityParseDrop(t *testing.T) { ctx := context.Background() testEntry := entry.New() err := parser.ProcessWith(ctx, testEntry, parse) - require.Error(t, err) - require.Contains(t, err.Error(), "severity parser: log entry does not have the expected parse_from field") + require.ErrorContains(t, err, "severity parser: log entry does not have the expected parse_from field") fakeOut.ExpectNoEntry(t, 100*time.Millisecond) } @@ -284,8 +315,7 @@ func TestParserInvalidTimeValidSeverityParse(t *testing.T) { require.NoError(t, err) err = parser.ProcessWith(ctx, testEntry, parse) - require.Error(t, err) - require.Contains(t, err.Error(), "time parser: log entry does not have the expected parse_from field") + require.ErrorContains(t, err, "time parser: log entry does not have the expected parse_from field") // But, this should have been set anyways require.Equal(t, entry.Info, testEntry.Severity) @@ -339,8 +369,7 @@ func TestParserValidTimeInvalidSeverityParse(t *testing.T) { require.NoError(t, err) err = parser.ProcessWith(ctx, testEntry, parse) - require.Error(t, err) - require.Contains(t, err.Error(), "severity parser: log entry does not have the expected parse_from field") + require.ErrorContains(t, err, "severity parser: log entry does not have the expected parse_from field") require.Equal(t, expected, testEntry.Timestamp) } diff --git a/pkg/stanza/operator/helper/time.go b/pkg/stanza/operator/helper/time.go index bee6adbc29be..753eb79159b4 100644 --- a/pkg/stanza/operator/helper/time.go +++ b/pkg/stanza/operator/helper/time.go @@ -73,8 +73,15 @@ func (t *TimeParser) Validate() error { } switch t.LayoutType { - case NativeKey, GotimeKey: // ok + case NativeKey: // ok + case GotimeKey: + if err := timeutils.ValidateGotime(t.Layout); err != nil { + return errors.Wrap(err, "invalid gotime layout") + } case StrptimeKey: + if err := timeutils.ValidateStrptime(t.Layout); err != nil { + return errors.Wrap(err, "invalid strptime layout") + } var err error t.Layout, err = timeutils.StrptimeToGotime(t.Layout) if err != nil { diff --git a/pkg/stanza/operator/helper/time_test.go b/pkg/stanza/operator/helper/time_test.go index b356859f38e8..4c567d9793db 100644 --- a/pkg/stanza/operator/helper/time_test.go +++ b/pkg/stanza/operator/helper/time_test.go @@ -203,7 +203,7 @@ func TestTimeParser(t *testing.T) { { name: "oracle", sample: "2019-10-15T10:42:01.900436-10:00", - expected: time.Date(2019, time.October, 15, 10, 42, 01, 900436*1000, hst), + expected: time.Date(2019, time.October, 15, 10, 42, 0o1, 900436*1000, hst), gotimeLayout: "2006-01-02T15:04:05.999999-07:00", strptimeLayout: "%Y-%m-%dT%H:%M:%S.%f%j", }, @@ -239,7 +239,7 @@ func TestTimeParser(t *testing.T) { { name: "puppet", sample: "Aug 4 03:26:02", - expected: time.Date(timeutils.Now().Year(), time.August, 4, 3, 26, 02, 0, time.Local), + expected: time.Date(timeutils.Now().Year(), time.August, 4, 3, 26, 0o2, 0, time.Local), gotimeLayout: "Jan _2 15:04:05", strptimeLayout: "%b %e %H:%M:%S", }, @@ -547,7 +547,7 @@ func runLossyTimeParseTest(timeParser *TimeParser, ent *entry.Entry, buildErr bo require.True(t, expected.Equal(ent.Timestamp)) } else { diff := time.Duration(math.Abs(float64(expected.Sub(ent.Timestamp)))) - require.True(t, diff <= maxLoss) + require.LessOrEqual(t, diff, maxLoss) } } } @@ -571,8 +571,7 @@ func TestSetInvalidLocation(t *testing.T) { tp := NewTimeParser() tp.Location = "not_a_location" err := tp.setLocation() - require.Error(t, err) - require.Contains(t, err.Error(), "failed to load location "+"not_a_location") + require.ErrorContains(t, err, "failed to load location "+"not_a_location") } func TestUnmarshal(t *testing.T) { diff --git a/pkg/stanza/operator/helper/transformer.go b/pkg/stanza/operator/helper/transformer.go index a62eba5ca83f..a8b5a8709bfd 100644 --- a/pkg/stanza/operator/helper/transformer.go +++ b/pkg/stanza/operator/helper/transformer.go @@ -83,15 +83,13 @@ func (t *TransformerOperator) ProcessWith(ctx context.Context, entry *entry.Entr return t.HandleEntryError(ctx, entry, err) } if skip { - t.Write(ctx, entry) - return nil + return t.Write(ctx, entry) } if err := transform(entry); err != nil { return t.HandleEntryError(ctx, entry, err) } - t.Write(ctx, entry) - return nil + return t.Write(ctx, entry) } // HandleEntryError will handle an entry error using the on_error strategy. @@ -102,8 +100,12 @@ func (t *TransformerOperator) HandleEntryError(ctx context.Context, entry *entry t.Logger().Error("Failed to process entry", zap.Any("error", err), zap.Any("action", t.OnError)) } if t.OnError == SendOnError || t.OnError == SendOnErrorQuiet { - t.Write(ctx, entry) + writeErr := t.Write(ctx, entry) + if writeErr != nil { + err = fmt.Errorf("failed to send entry after error: %w", writeErr) + } } + return err } diff --git a/pkg/stanza/operator/helper/transformer_test.go b/pkg/stanza/operator/helper/transformer_test.go index e3038ff18313..f03c02dbefcc 100644 --- a/pkg/stanza/operator/helper/transformer_test.go +++ b/pkg/stanza/operator/helper/transformer_test.go @@ -26,8 +26,7 @@ func TestTransformerConfigMissingBase(t *testing.T) { cfg.OutputIDs = []string{"test-output"} set := componenttest.NewNopTelemetrySettings() _, err := cfg.Build(set) - require.Error(t, err) - require.Contains(t, err.Error(), "missing required `type` field.") + require.ErrorContains(t, err, "missing required `type` field.") } func TestTransformerConfigMissingOutput(t *testing.T) { @@ -58,8 +57,7 @@ func TestTransformerOnErrorInvalid(t *testing.T) { cfg.OnError = "invalid" set := componenttest.NewNopTelemetrySettings() _, err := cfg.Build(set) - require.Error(t, err) - require.Contains(t, err.Error(), "operator config has an invalid `on_error` field.") + require.ErrorContains(t, err, "operator config has an invalid `on_error` field.") } func TestTransformerOperatorCanProcess(t *testing.T) { diff --git a/pkg/stanza/operator/helper/writer.go b/pkg/stanza/operator/helper/writer.go index 89666ae88c91..a07b91a714c5 100644 --- a/pkg/stanza/operator/helper/writer.go +++ b/pkg/stanza/operator/helper/writer.go @@ -8,6 +8,7 @@ import ( "fmt" "go.opentelemetry.io/collector/component" + "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/entry" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator" @@ -47,14 +48,17 @@ type WriterOperator struct { } // Write will write an entry to the outputs of the operator. -func (w *WriterOperator) Write(ctx context.Context, e *entry.Entry) { - for i, operator := range w.OutputOperators { +func (w *WriterOperator) Write(ctx context.Context, e *entry.Entry) error { + for i, op := range w.OutputOperators { if i == len(w.OutputOperators)-1 { - _ = operator.Process(ctx, e) - return + return op.Process(ctx, e) + } + err := op.Process(ctx, e.Copy()) + if err != nil { + w.Logger().Error("Failed to process entry", zap.Error(err)) } - _ = operator.Process(ctx, e.Copy()) } + return nil } // CanOutput always returns true for a writer operator. diff --git a/pkg/stanza/operator/helper/writer_test.go b/pkg/stanza/operator/helper/writer_test.go index 271f01e1032d..385c536cf080 100644 --- a/pkg/stanza/operator/helper/writer_test.go +++ b/pkg/stanza/operator/helper/writer_test.go @@ -13,6 +13,7 @@ import ( "go.opentelemetry.io/collector/component/componenttest" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/entry" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/errors" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/operatortest" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/testutil" @@ -53,7 +54,36 @@ func TestWriterOperatorWrite(t *testing.T) { ctx := context.Background() testEntry := entry.New() - writer.Write(ctx, testEntry) + err := writer.Write(ctx, testEntry) + require.NoError(t, err) + output1.AssertCalled(t, "Process", ctx, mock.Anything) + output2.AssertCalled(t, "Process", ctx, mock.Anything) +} + +func TestWriterOperatorWriteAfterError(t *testing.T) { + output1 := testutil.NewMockOperator("output1") + output1.On("Process", mock.Anything, mock.Anything).Return(errors.NewError("Operator can not process logs.", "")) + output2 := testutil.NewMockOperator("output2") + output2.On("Process", mock.Anything, mock.Anything).Return(nil) + + config := WriterConfig{ + OutputIDs: []string{"output1", "output2"}, + BasicConfig: BasicConfig{ + OperatorType: "testtype", + }, + } + set := componenttest.NewNopTelemetrySettings() + writer, err := config.Build(set) + require.NoError(t, err) + + err = writer.SetOutputs([]operator.Operator{output1, output2}) + require.NoError(t, err) + + ctx := context.Background() + testEntry := entry.New() + + err = writer.Write(ctx, testEntry) + require.NoError(t, err) output1.AssertCalled(t, "Process", ctx, mock.Anything) output2.AssertCalled(t, "Process", ctx, mock.Anything) } @@ -75,7 +105,8 @@ func TestWriterOperatorOutputs(t *testing.T) { ctx := context.Background() testEntry := entry.New() - writer.Write(ctx, testEntry) + err := writer.Write(ctx, testEntry) + require.NoError(t, err) output1.AssertCalled(t, "Process", ctx, mock.Anything) output2.AssertCalled(t, "Process", ctx, mock.Anything) } @@ -88,8 +119,7 @@ func TestWriterSetOutputsMissing(t *testing.T) { } err := writer.SetOutputs([]operator.Operator{output1}) - require.Error(t, err) - require.Contains(t, err.Error(), "does not exist") + require.ErrorContains(t, err, "does not exist") } func TestWriterSetOutputsInvalid(t *testing.T) { @@ -101,8 +131,7 @@ func TestWriterSetOutputsInvalid(t *testing.T) { } err := writer.SetOutputs([]operator.Operator{output1}) - require.Error(t, err) - require.Contains(t, err.Error(), "can not process entries") + require.ErrorContains(t, err, "can not process entries") } func TestWriterSetOutputsValid(t *testing.T) { diff --git a/pkg/stanza/operator/input/file/input.go b/pkg/stanza/operator/input/file/input.go index ce20ef18cc55..39f721ad57b3 100644 --- a/pkg/stanza/operator/input/file/input.go +++ b/pkg/stanza/operator/input/file/input.go @@ -11,6 +11,7 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/entry" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/emit" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper" ) @@ -36,21 +37,20 @@ func (i *Input) Stop() error { return i.fileConsumer.Stop() } -func (i *Input) emit(ctx context.Context, token []byte, attrs map[string]any) error { - if len(token) == 0 { +func (i *Input) emit(ctx context.Context, token emit.Token) error { + if len(token.Body) == 0 { return nil } - ent, err := i.NewEntry(i.toBody(token)) + ent, err := i.NewEntry(i.toBody(token.Body)) if err != nil { return fmt.Errorf("create entry: %w", err) } - for k, v := range attrs { + for k, v := range token.Attributes { if err := ent.Set(entry.NewAttributeField(k), v); err != nil { i.Logger().Error("set attribute", zap.Error(err)) } } - i.Write(ctx, ent) - return nil + return i.Write(ctx, ent) } diff --git a/pkg/stanza/operator/input/file/input_test.go b/pkg/stanza/operator/input/file/input_test.go index 0fcbeab36f33..9319c71f7ba5 100644 --- a/pkg/stanza/operator/input/file/input_test.go +++ b/pkg/stanza/operator/input/file/input_test.go @@ -71,6 +71,51 @@ func TestAddFileResolvedFields(t *testing.T) { } } +// AddFileRecordNumber tests that the `log.file.record_number` is correctly included +// when IncludeFileRecordNumber is set to true +func TestAddFileRecordNumber(t *testing.T) { + t.Parallel() + operator, logReceived, tempDir := newTestFileOperator(t, func(cfg *Config) { + cfg.IncludeFileRecordNumber = true + }) + + // Create a file, then start + temp := openTemp(t, tempDir) + writeString(t, temp, "testlog1\ntestlog2\ntestlog3\n") + + require.NoError(t, operator.Start(testutil.NewUnscopedMockPersister())) + defer func() { + require.NoError(t, operator.Stop()) + }() + + e := waitForOne(t, logReceived) + require.Equal(t, "testlog1", e.Body) + require.Equal(t, int64(1), e.Attributes["log.file.record_number"]) + + e = waitForOne(t, logReceived) + require.Equal(t, "testlog2", e.Body) + require.Equal(t, int64(2), e.Attributes["log.file.record_number"]) + + e = waitForOne(t, logReceived) + require.Equal(t, "testlog3", e.Body) + require.Equal(t, int64(3), e.Attributes["log.file.record_number"]) + + // Write 3 more entries + writeString(t, temp, "testlog4\ntestlog5\ntestlog6\n") + + e = waitForOne(t, logReceived) + require.Equal(t, "testlog4", e.Body) + require.Equal(t, int64(4), e.Attributes["log.file.record_number"]) + + e = waitForOne(t, logReceived) + require.Equal(t, "testlog5", e.Body) + require.Equal(t, int64(5), e.Attributes["log.file.record_number"]) + + e = waitForOne(t, logReceived) + require.Equal(t, "testlog6", e.Body) + require.Equal(t, int64(6), e.Attributes["log.file.record_number"]) +} + // ReadExistingLogs tests that, when starting from beginning, we // read all the lines that are already there func TestReadExistingLogs(t *testing.T) { @@ -144,7 +189,7 @@ func TestReadUsingNopEncoding(t *testing.T) { // Create a file, then start temp := openTemp(t, tempDir) bytesWritten, err := temp.Write(tc.input) - require.Greater(t, bytesWritten, 0) + require.Positive(t, bytesWritten) require.NoError(t, err) require.NoError(t, operator.Start(testutil.NewUnscopedMockPersister())) defer func() { diff --git a/pkg/stanza/operator/input/file/util_test.go b/pkg/stanza/operator/input/file/util_test.go index a74aea301b0f..36a0501a899d 100644 --- a/pkg/stanza/operator/input/file/util_test.go +++ b/pkg/stanza/operator/input/file/util_test.go @@ -45,20 +45,20 @@ func newTestFileOperator(t *testing.T, cfgMod func(*Config)) (*Input, chan *entr return op.(*Input), fakeOutput.Received, tempDir } -func openTemp(t testing.TB, tempDir string) *os.File { - return openTempWithPattern(t, tempDir, "") +func openTemp(tb testing.TB, tempDir string) *os.File { + return openTempWithPattern(tb, tempDir, "") } -func openTempWithPattern(t testing.TB, tempDir, pattern string) *os.File { +func openTempWithPattern(tb testing.TB, tempDir, pattern string) *os.File { file, err := os.CreateTemp(tempDir, pattern) - require.NoError(t, err) - t.Cleanup(func() { _ = file.Close() }) + require.NoError(tb, err) + tb.Cleanup(func() { _ = file.Close() }) return file } -func writeString(t testing.TB, file *os.File, s string) { +func writeString(tb testing.TB, file *os.File, s string) { _, err := file.WriteString(s) - require.NoError(t, err) + require.NoError(tb, err) } func waitForOne(t *testing.T, c chan *entry.Entry) *entry.Entry { diff --git a/pkg/stanza/operator/input/generate/input.go b/pkg/stanza/operator/input/generate/input.go index a07be4ff16bd..31edb2414121 100644 --- a/pkg/stanza/operator/input/generate/input.go +++ b/pkg/stanza/operator/input/generate/input.go @@ -9,6 +9,8 @@ import ( "sync" "time" + "go.uber.org/zap" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/entry" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper" @@ -44,7 +46,11 @@ func (i *Input) Start(_ operator.Persister) error { if !i.static { entry.Timestamp = time.Now() } - i.Write(ctx, entry) + err := i.Write(ctx, entry) + if err != nil { + i.Logger().Error("failed to write entry", zap.Error(err)) + return + } n++ if n == i.count { diff --git a/pkg/stanza/operator/input/journald/config_all.go b/pkg/stanza/operator/input/journald/config_all.go index e7af99b14f24..1015fcf2f0d5 100644 --- a/pkg/stanza/operator/input/journald/config_all.go +++ b/pkg/stanza/operator/input/journald/config_all.go @@ -27,16 +27,18 @@ func NewConfigWithID(operatorID string) *Config { type Config struct { helper.InputConfig `mapstructure:",squash"` - Directory *string `mapstructure:"directory,omitempty"` - Files []string `mapstructure:"files,omitempty"` - StartAt string `mapstructure:"start_at,omitempty"` - Units []string `mapstructure:"units,omitempty"` - Priority string `mapstructure:"priority,omitempty"` - Matches []MatchConfig `mapstructure:"matches,omitempty"` - Identifiers []string `mapstructure:"identifiers,omitempty"` - Grep string `mapstructure:"grep,omitempty"` - Dmesg bool `mapstructure:"dmesg,omitempty"` - All bool `mapstructure:"all,omitempty"` + Directory *string `mapstructure:"directory,omitempty"` + Files []string `mapstructure:"files,omitempty"` + StartAt string `mapstructure:"start_at,omitempty"` + Units []string `mapstructure:"units,omitempty"` + Priority string `mapstructure:"priority,omitempty"` + Matches []MatchConfig `mapstructure:"matches,omitempty"` + Identifiers []string `mapstructure:"identifiers,omitempty"` + Grep string `mapstructure:"grep,omitempty"` + Dmesg bool `mapstructure:"dmesg,omitempty"` + All bool `mapstructure:"all,omitempty"` + Namespace string `mapstructure:"namespace,omitempty"` + ConvertMessageBytes bool `mapstructure:"convert_message_bytes,omitempty"` } type MatchConfig map[string]string diff --git a/pkg/stanza/operator/input/journald/config_linux.go b/pkg/stanza/operator/input/journald/config_linux.go index b8d62175f62e..c011e44bcf85 100644 --- a/pkg/stanza/operator/input/journald/config_linux.go +++ b/pkg/stanza/operator/input/journald/config_linux.go @@ -40,13 +40,16 @@ func (c Config) Build(set component.TelemetrySettings) (operator.Operator, error return &Input{ InputOperator: inputOperator, newCmd: func(ctx context.Context, cursor []byte) cmd { + // Copy args and if needed, add the cursor flag + journalArgs := append([]string{}, args...) if cursor != nil { - args = append(args, "--after-cursor", string(cursor)) + journalArgs = append(journalArgs, "--after-cursor", string(cursor)) } - return exec.CommandContext(ctx, "journalctl", args...) // #nosec - ... + return exec.CommandContext(ctx, "journalctl", journalArgs...) // #nosec - ... // journalctl is an executable that is required for this operator to function }, - json: jsoniter.ConfigFastest, + convertMessageBytes: c.ConvertMessageBytes, + json: jsoniter.ConfigFastest, }, nil } @@ -88,6 +91,10 @@ func (c Config) buildArgs() ([]string, error) { args = append(args, "--dmesg") } + if len(c.Namespace) > 0 { + args = append(args, "--namespace", c.Namespace) + } + switch { case c.Directory != nil: args = append(args, "--directory", *c.Directory) diff --git a/pkg/stanza/operator/input/journald/input.go b/pkg/stanza/operator/input/journald/input.go index f7af8c3ad6e5..d7969741daf8 100644 --- a/pkg/stanza/operator/input/journald/input.go +++ b/pkg/stanza/operator/input/journald/input.go @@ -13,7 +13,6 @@ import ( "io" "os/exec" "strconv" - "strings" "sync" "time" @@ -31,10 +30,12 @@ type Input struct { newCmd func(ctx context.Context, cursor []byte) cmd - persister operator.Persister - json jsoniter.API - cancel context.CancelFunc - wg sync.WaitGroup + persister operator.Persister + json jsoniter.API + convertMessageBytes bool + cancel context.CancelFunc + wg sync.WaitGroup + errChan chan error } type cmd interface { @@ -44,9 +45,10 @@ type cmd interface { Wait() error } -type failedCommand struct { - err string - output string +type journalctl struct { + cmd cmd + stdout io.ReadCloser + stderr io.ReadCloser } var lastReadCursorKey = "lastReadCursor" @@ -56,65 +58,100 @@ func (operator *Input) Start(persister operator.Persister) error { ctx, cancel := context.WithCancel(context.Background()) operator.cancel = cancel + operator.persister = persister + operator.errChan = make(chan error) + + go operator.run(ctx) + + select { + case err := <-operator.errChan: + return fmt.Errorf("journalctl command failed: %w", err) + case <-time.After(waitDuration): + return nil + } +} + +// run starts the journalctl process and monitor it. +// If there is an error in operator.newJournalctl, the error will be sent to operator.errChan. +// If the journalctl process started successfully, but there is an error in operator.runJournalctl, +// The error will be logged and the journalctl process will be restarted. +func (operator *Input) run(ctx context.Context) { + for { + select { + case <-ctx.Done(): + return + default: + jctl, err := operator.newJournalctl(ctx) + // If we can't start journalctl, there is nothing we can do but logging the error and return. + if err != nil { + select { + case operator.errChan <- err: + case <-time.After(waitDuration): + operator.Logger().Error("Failed to init and start journalctl", zap.Error(err)) + } + return + } + + operator.Logger().Debug("Starting the journalctl command") + if err := operator.runJournalctl(ctx, jctl); err != nil { + ee := &exec.ExitError{} + if ok := errors.As(err, &ee); ok && ee.ExitCode() != 0 { + operator.Logger().Error("journalctl command exited", zap.Error(ee)) + } else { + operator.Logger().Info("journalctl command exited") + } + } + // Backoff before restart. + select { + case <-ctx.Done(): + return + case <-time.After(2 * time.Second): + } + } + } +} + +// newJournalctl creates a new journalctl command. +func (operator *Input) newJournalctl(ctx context.Context) (*journalctl, error) { // Start from a cursor if there is a saved offset - cursor, err := persister.Get(ctx, lastReadCursorKey) + cursor, err := operator.persister.Get(ctx, lastReadCursorKey) if err != nil { - return fmt.Errorf("failed to get journalctl state: %w", err) + return nil, fmt.Errorf("failed to get journalctl state: %w", err) } - operator.persister = persister - - // Start journalctl journal := operator.newCmd(ctx, cursor) - stdout, err := journal.StdoutPipe() - if err != nil { - return fmt.Errorf("failed to get journalctl stdout: %w", err) + jctl := &journalctl{ + cmd: journal, } - stderr, err := journal.StderrPipe() + + jctl.stdout, err = journal.StdoutPipe() if err != nil { - return fmt.Errorf("failed to get journalctl stderr: %w", err) + return nil, fmt.Errorf("failed to get journalctl stdout: %w", err) } - err = journal.Start() + jctl.stderr, err = journal.StderrPipe() if err != nil { - return fmt.Errorf("start journalctl: %w", err) + return nil, fmt.Errorf("failed to get journalctl stderr: %w", err) } - stderrChan := make(chan string) - failedChan := make(chan failedCommand) - - // Start the wait goroutine - operator.wg.Add(1) - go func() { - defer operator.wg.Done() - err := journal.Wait() - message := <-stderrChan - - f := failedCommand{ - output: message, - } - - if err != nil { - ee := (&exec.ExitError{}) - if ok := errors.As(err, &ee); ok && ee.ExitCode() != 0 { - f.err = ee.Error() - } - } + if err = journal.Start(); err != nil { + return nil, fmt.Errorf("start journalctl: %w", err) + } - select { - case failedChan <- f: - // log an error in case channel is closed - case <-time.After(waitDuration): - operator.Logger().Error("journalctl command exited", zap.String("error", f.err), zap.String("output", f.output)) - } - }() + return jctl, nil +} - // Start the stderr reader goroutine +// runJournalctl runs the journalctl command. This is a blocking call that returns +// when the command exits. +func (operator *Input) runJournalctl(ctx context.Context, jctl *journalctl) error { + // Start the stderr reader goroutine. + // This goroutine reads the stderr from the journalctl process. If the + // process exits for any reason, then the stderr will be closed, this + // goroutine will get an EOF error and exit. operator.wg.Add(1) go func() { defer operator.wg.Done() - stderrBuf := bufio.NewReader(stderr) - messages := []string{} + stderrBuf := bufio.NewReader(jctl.stderr) for { line, err := stderrBuf.ReadBytes('\n') @@ -122,19 +159,22 @@ func (operator *Input) Start(persister operator.Persister) error { if !errors.Is(err, io.EOF) { operator.Logger().Error("Received error reading from journalctl stderr", zap.Error(err)) } - stderrChan <- strings.Join(messages, "\n") return } - messages = append(messages, string(line)) + operator.Logger().Error("Received from journalctl stderr", zap.ByteString("stderr", line)) } }() - // Start the reader goroutine + // Start the reader goroutine. + // This goroutine reads the stdout from the journalctl process, parses + // the data, and writes to output. If the journalctl process exits for + // any reason, then the stdout will be closed, this goroutine will get + // an EOF error and exits. operator.wg.Add(1) go func() { defer operator.wg.Done() - stdoutBuf := bufio.NewReader(stdout) + stdoutBuf := bufio.NewReader(jctl.stdout) for { line, err := stdoutBuf.ReadBytes('\n') @@ -150,23 +190,20 @@ func (operator *Input) Start(persister operator.Persister) error { operator.Logger().Warn("Failed to parse journal entry", zap.Error(err)) continue } - if err := operator.persister.Set(ctx, lastReadCursorKey, []byte(cursor)); err != nil { + if err = operator.persister.Set(ctx, lastReadCursorKey, []byte(cursor)); err != nil { operator.Logger().Warn("Failed to set offset", zap.Error(err)) } - operator.Write(ctx, entry) + if err = operator.Write(ctx, entry); err != nil { + operator.Logger().Error("failed to write entry", zap.Error(err)) + } } }() - // Wait waitDuration for eventual error - select { - case err := <-failedChan: - if err.err == "" { - return fmt.Errorf("journalctl command exited") - } - return fmt.Errorf("journalctl command failed (%v): %v", err.err, err.output) - case <-time.After(waitDuration): - return nil - } + // we wait for the reader goroutines to exit before calling Cmd.Wait(). + // As per documentation states, "It is thus incorrect to call Wait before all reads from the pipe have completed". + operator.wg.Wait() + + return jctl.cmd.Wait() } func (operator *Input) parseJournalEntry(line []byte) (*entry.Entry, string, error) { @@ -191,6 +228,21 @@ func (operator *Input) parseJournalEntry(line []byte) (*entry.Entry, string, err return nil, "", fmt.Errorf("parse timestamp: %w", err) } + if operator.convertMessageBytes { + // Convert the message bytes to string if given as a byte array + msgArr, msgArrayOk := body["MESSAGE"].([]any) + if msgArrayOk { + var bytes []byte + for _, val := range msgArr { + floatVal, floatCheckOk := val.(float64) + if floatCheckOk { + bytes = append(bytes, byte(int(floatVal))) + } + } + body["MESSAGE"] = string(bytes) + } + } + delete(body, "__REALTIME_TIMESTAMP") cursor, ok := body["__CURSOR"] @@ -217,6 +269,5 @@ func (operator *Input) Stop() error { if operator.cancel != nil { operator.cancel() } - operator.wg.Wait() return nil } diff --git a/pkg/stanza/operator/input/journald/input_test.go b/pkg/stanza/operator/input/journald/input_test.go index 86c7319a9381..ae8f4548d6d6 100644 --- a/pkg/stanza/operator/input/journald/input_test.go +++ b/pkg/stanza/operator/input/journald/input_test.go @@ -8,6 +8,7 @@ package journald import ( "bytes" "context" + "errors" "io" "os/exec" "testing" @@ -17,6 +18,7 @@ import ( "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component/componenttest" + "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/entry" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator" @@ -24,12 +26,13 @@ import ( ) type fakeJournaldCmd struct { - exitError *exec.ExitError - stdErr string + startError error + exitError *exec.ExitError + stdErr string } func (f *fakeJournaldCmd) Start() error { - return nil + return f.startError } func (f *fakeJournaldCmd) StdoutPipe() (io.ReadCloser, error) { @@ -73,8 +76,7 @@ func TestInputJournald(t *testing.T) { return &fakeJournaldCmd{} } - err = op.Start(testutil.NewUnscopedMockPersister()) - assert.EqualError(t, err, "journalctl command exited") + require.NoError(t, op.Start(testutil.NewUnscopedMockPersister())) defer func() { require.NoError(t, op.Stop()) }() @@ -198,6 +200,13 @@ func TestBuildConfig(t *testing.T) { }, Expected: []string{"--utc", "--output=json", "--follow", "--priority", "info", "--grep", "test_grep"}, }, + { + Name: "namespace", + Config: func(cfg *Config) { + cfg.Namespace = "foo" + }, + Expected: []string{"--utc", "--output=json", "--follow", "--priority", "info", "--namespace", "foo"}, + }, { Name: "dmesg", Config: func(cfg *Config) { @@ -236,6 +245,7 @@ func TestInputJournaldError(t *testing.T) { cfg.OutputIDs = []string{"output"} set := componenttest.NewNopTelemetrySettings() + set.Logger, _ = zap.NewDevelopment() op, err := cfg.Build(set) require.NoError(t, err) @@ -250,20 +260,12 @@ func TestInputJournaldError(t *testing.T) { op.(*Input).newCmd = func(_ context.Context, _ []byte) cmd { return &fakeJournaldCmd{ - exitError: &exec.ExitError{}, - stdErr: "stderr output\n", + exitError: &exec.ExitError{}, + startError: errors.New("fail to start"), } } err = op.Start(testutil.NewUnscopedMockPersister()) - assert.EqualError(t, err, "journalctl command failed (): stderr output\n") - defer func() { - require.NoError(t, op.Stop()) - }() - - select { - case <-received: - case <-time.After(time.Second): - require.FailNow(t, "Timed out waiting for entry to be read") - } + assert.EqualError(t, err, "journalctl command failed: start journalctl: fail to start") + require.NoError(t, op.Stop()) } diff --git a/pkg/stanza/operator/input/namedpipe/input.go b/pkg/stanza/operator/input/namedpipe/input.go index c659dbc4924a..8dc89150d1f9 100644 --- a/pkg/stanza/operator/input/namedpipe/input.go +++ b/pkg/stanza/operator/input/namedpipe/input.go @@ -139,6 +139,5 @@ func (i *Input) sendEntry(ctx context.Context, bytes []byte) error { return fmt.Errorf("failed to create entry: %w", err) } - i.Write(ctx, entry) - return nil + return i.Write(ctx, entry) } diff --git a/pkg/stanza/operator/input/namedpipe/input_test.go b/pkg/stanza/operator/input/namedpipe/input_test.go index de97d08ebacc..ef441a816aa1 100644 --- a/pkg/stanza/operator/input/namedpipe/input_test.go +++ b/pkg/stanza/operator/input/namedpipe/input_test.go @@ -22,15 +22,15 @@ import ( ) // filename attempts to get an unused filename. -func filename(t testing.TB) string { - t.Helper() +func filename(tb testing.TB) string { + tb.Helper() file, err := os.CreateTemp("", "") - require.NoError(t, err) + require.NoError(tb, err) name := file.Name() - require.NoError(t, file.Close()) - require.NoError(t, os.Remove(name)) + require.NoError(tb, file.Close()) + require.NoError(tb, os.Remove(name)) return name } @@ -39,7 +39,7 @@ func filename(t testing.TB) string { func TestCreatePipe(t *testing.T) { conf := NewConfig() conf.Path = filename(t) - conf.Permissions = 0666 + conf.Permissions = 0o666 set := componenttest.NewNopTelemetrySettings() op, err := conf.Build(set) @@ -62,7 +62,7 @@ func TestCreatePipe(t *testing.T) { func TestCreatePipeFailsWithFile(t *testing.T) { conf := NewConfig() conf.Path = filename(t) - conf.Permissions = 0666 + conf.Permissions = 0o666 pipe, err := os.OpenFile(conf.Path, os.O_CREATE, 0) require.NoError(t, err) @@ -81,7 +81,7 @@ func TestCreatePipeFailsWithFile(t *testing.T) { func TestCreatePipeAlreadyExists(t *testing.T) { conf := NewConfig() conf.Path = filename(t) - conf.Permissions = 0666 + conf.Permissions = 0o666 require.NoError(t, unix.Mkfifo(conf.Path, conf.Permissions)) @@ -99,7 +99,7 @@ func TestPipeWrites(t *testing.T) { conf := NewConfig() conf.Path = filename(t) - conf.Permissions = 0666 + conf.Permissions = 0o666 conf.OutputIDs = []string{fake.ID()} set := componenttest.NewNopTelemetrySettings() diff --git a/pkg/stanza/operator/input/stdin/input.go b/pkg/stanza/operator/input/stdin/input.go index faf05b566776..298a46217459 100644 --- a/pkg/stanza/operator/input/stdin/input.go +++ b/pkg/stanza/operator/input/stdin/input.go @@ -53,7 +53,7 @@ func (i *Input) Start(_ operator.Persister) error { } if ok := scanner.Scan(); !ok { - if err := scanner.Err(); err != nil { + if err = scanner.Err(); err != nil { i.Logger().Error("Scanning failed", zap.Error(err)) } i.Logger().Info("Stdin has been closed") @@ -62,7 +62,11 @@ func (i *Input) Start(_ operator.Persister) error { e := entry.New() e.Body = scanner.Text() - i.Write(ctx, e) + err = i.Write(ctx, e) + if err != nil { + i.Logger().Error("failed to write entry", zap.Error(err)) + return + } } }() diff --git a/pkg/stanza/operator/input/syslog/config.go b/pkg/stanza/operator/input/syslog/config.go index 9600b8403862..2ae316baef82 100644 --- a/pkg/stanza/operator/input/syslog/config.go +++ b/pkg/stanza/operator/input/syslog/config.go @@ -51,6 +51,7 @@ func (c Config) Build(set component.TelemetrySettings) (operator.Operator, error syslogParserCfg.BaseConfig = c.BaseConfig syslogParserCfg.SetID(inputBase.ID() + "_internal_parser") syslogParserCfg.OutputIDs = c.OutputIDs + syslogParserCfg.MaxOctets = c.MaxOctets syslogParser, err := syslogParserCfg.Build(set) if err != nil { return nil, fmt.Errorf("failed to resolve syslog config: %w", err) diff --git a/pkg/stanza/operator/input/tcp/input.go b/pkg/stanza/operator/input/tcp/input.go index 9f7feff86ac8..f5f0af8fd483 100644 --- a/pkg/stanza/operator/input/tcp/input.go +++ b/pkg/stanza/operator/input/tcp/input.go @@ -188,7 +188,10 @@ func (i *Input) handleMessage(ctx context.Context, conn net.Conn, dec *decode.De } } - i.Write(ctx, entry) + err = i.Write(ctx, entry) + if err != nil { + i.Logger().Error("Failed to write entry", zap.Error(err)) + } } func truncateMaxLog(data []byte, maxLogSize int) (token []byte) { diff --git a/pkg/stanza/operator/input/tcp/input_test.go b/pkg/stanza/operator/input/tcp/input_test.go index c0b0918a2fa7..359385f17b5d 100644 --- a/pkg/stanza/operator/input/tcp/input_test.go +++ b/pkg/stanza/operator/input/tcp/input_test.go @@ -12,6 +12,7 @@ import ( "testing" "time" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component/componenttest" @@ -390,7 +391,7 @@ func TestFailToBind(t *testing.T) { t.Errorf("failed to find a free port between %d and %d", minPort, maxPort) } - var startTCP = func(int) (*Input, error) { + startTCP := func(int) (*Input, error) { cfg := NewConfigWithID("test_id") cfg.ListenAddress = net.JoinHostPort(ip, strconv.Itoa(port)) set := componenttest.NewNopTelemetrySettings() @@ -435,13 +436,13 @@ func BenchmarkTCPInput(b *testing.B) { done := make(chan struct{}) go func() { conn, err := net.Dial("tcp", tcpInput.listener.Addr().String()) - require.NoError(b, err) + assert.NoError(b, err) defer func() { err := tcpInput.Stop() - require.NoError(b, err, "expected to stop tcp input operator without error") + assert.NoError(b, err, "expected to stop tcp input operator without error") err = conn.Close() - require.NoError(b, err, "expected to close connection without error") + assert.NoError(b, err, "expected to close connection without error") }() message := []byte("message\n") for { @@ -450,7 +451,7 @@ func BenchmarkTCPInput(b *testing.B) { return default: _, err := conn.Write(message) - require.NoError(b, err) + assert.NoError(b, err) } } }() diff --git a/pkg/stanza/operator/input/udp/input.go b/pkg/stanza/operator/input/udp/input.go index e064dd528ed5..f718e187f15b 100644 --- a/pkg/stanza/operator/input/udp/input.go +++ b/pkg/stanza/operator/input/udp/input.go @@ -220,7 +220,10 @@ func (i *Input) handleMessage(ctx context.Context, remoteAddr net.Addr, dec *dec } } - i.Write(ctx, entry) + err = i.Write(ctx, entry) + if err != nil { + i.Logger().Error("Failed to write entry", zap.Error(err)) + } } // readMessage will read log messages from the connection. diff --git a/pkg/stanza/operator/input/udp/input_test.go b/pkg/stanza/operator/input/udp/input_test.go index f3862d2a7edb..6f1ab7e9083d 100644 --- a/pkg/stanza/operator/input/udp/input_test.go +++ b/pkg/stanza/operator/input/udp/input_test.go @@ -10,6 +10,7 @@ import ( "testing" "time" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component/componenttest" @@ -178,7 +179,7 @@ func TestFailToBind(t *testing.T) { t.Errorf("failed to find a free port between %d and %d", minPort, maxPort) } - var startUDP = func(int) (*Input, error) { + startUDP := func(int) (*Input, error) { cfg := NewConfigWithID("test_input") cfg.ListenAddress = net.JoinHostPort(ip, strconv.Itoa(port)) @@ -229,9 +230,9 @@ func BenchmarkUDPInput(b *testing.B) { done := make(chan struct{}) go func() { conn, err := net.Dial("udp", udpInput.connection.LocalAddr().String()) - require.NoError(b, err) + assert.NoError(b, err) defer func() { - require.NoError(b, udpInput.Stop()) + assert.NoError(b, udpInput.Stop()) }() defer conn.Close() message := []byte("message\n") @@ -241,7 +242,7 @@ func BenchmarkUDPInput(b *testing.B) { return default: _, err := conn.Write(message) - require.NoError(b, err) + assert.NoError(b, err) } } }() diff --git a/pkg/stanza/operator/input/windows/api.go b/pkg/stanza/operator/input/windows/api.go index eb2ab3ec44ff..13a2e200f19f 100644 --- a/pkg/stanza/operator/input/windows/api.go +++ b/pkg/stanza/operator/input/windows/api.go @@ -21,11 +21,21 @@ var ( renderProc SyscallProc = api.NewProc("EvtRender") closeProc SyscallProc = api.NewProc("EvtClose") createBookmarkProc SyscallProc = api.NewProc("EvtCreateBookmark") + createRenderContextProc SyscallProc = api.NewProc("EvtCreateRenderContext") updateBookmarkProc SyscallProc = api.NewProc("EvtUpdateBookmark") openPublisherMetadataProc SyscallProc = api.NewProc("EvtOpenPublisherMetadata") formatMessageProc SyscallProc = api.NewProc("EvtFormatMessage") + openSessionProc SyscallProc = api.NewProc("EvtOpenSession") ) +type EvtRPCLogin struct { + Server *uint16 + User *uint16 + Domain *uint16 + Password *uint16 + Flags uint32 +} + // SyscallProc is a syscall procedure. type SyscallProc interface { Call(...uintptr) (uintptr, uintptr, error) @@ -38,6 +48,8 @@ const ( EvtSubscribeStartAtOldestRecord uint32 = 2 // EvtSubscribeStartAfterBookmark is a flag that will subscribe to all events that begin after a bookmark. EvtSubscribeStartAfterBookmark uint32 = 3 + // EvtRPCLoginClass is a flag that indicates the login class. + EvtRPCLoginClass uint32 = 1 ) const ( @@ -59,12 +71,23 @@ const ( ) const ( + // EvtRenderEventValues is a flag to render the event properties specified in the rendering context + EvtRenderEventValues uint32 = 0 // EvtRenderEventXML is a flag to render an event as an XML string EvtRenderEventXML uint32 = 1 // EvtRenderBookmark is a flag to render a bookmark as an XML string EvtRenderBookmark uint32 = 2 ) +const ( + // EvtRenderContextValues is a flag to render the system properties under the System element. + // The properties are returned in the order defined in the EVT_SYSTEM_PROPERTY_ID enumeration. + // https://learn.microsoft.com/en-us/windows/win32/api/winevt/ne-winevt-evt_render_context_flags + EvtRenderContextSystem uint32 = 1 +) + +var evtSubscribeFunc = evtSubscribe + // evtSubscribe is the direct syscall implementation of EvtSubscribe (https://docs.microsoft.com/en-us/windows/win32/api/winevt/nf-winevt-evtsubscribe) func evtSubscribe(session uintptr, signalEvent windows.Handle, channelPath *uint16, query *uint16, bookmark uintptr, context uintptr, callback uintptr, flags uint32) (uintptr, error) { handle, _, err := subscribeProc.Call(session, uintptr(signalEvent), uintptr(unsafe.Pointer(channelPath)), uintptr(unsafe.Pointer(query)), bookmark, context, callback, uintptr(flags)) @@ -117,6 +140,16 @@ func evtCreateBookmark(bookmarkXML *uint16) (uintptr, error) { return handle, nil } +// evtCreateRenderContext is the direct syscall implementation of EvtCreateRenderContext (https://docs.microsoft.com/en-us/windows/win32/api/winevt/nf-winevt-evtcreaterendercontext) +func evtCreateRenderContext(valuePathsCount uint32, valuePaths **uint16, flags uint32) (uintptr, error) { + handle, _, err := createRenderContextProc.Call(uintptr(valuePathsCount), uintptr(unsafe.Pointer(valuePaths)), uintptr(flags)) + if !errors.Is(err, ErrorSuccess) { + return 0, err + } + + return handle, nil +} + // evtUpdateBookmark is the direct syscall implementation of EvtUpdateBookmark (https://docs.microsoft.com/en-us/windows/win32/api/winevt/nf-winevt-evtcreatebookmark) func evtUpdateBookmark(bookmark uintptr, event uintptr) error { _, _, err := updateBookmarkProc.Call(bookmark, event) @@ -147,3 +180,13 @@ func evtFormatMessage(publisherMetadata uintptr, event uintptr, messageID uint32 return bufferUsed, nil } + +// evtOpenSession is the direct syscall implementation of EvtOpenSession (https://learn.microsoft.com/en-us/windows/win32/api/winevt/nf-winevt-evtopensession) +func evtOpenSession(loginClass uint32, login *EvtRPCLogin, timeout uint32, flags uint32) (windows.Handle, error) { + r0, _, e1 := openSessionProc.Call(uintptr(loginClass), uintptr(unsafe.Pointer(login)), uintptr(timeout), uintptr(flags)) + handle := windows.Handle(r0) + if handle == 0 { + return handle, e1 + } + return handle, nil +} diff --git a/pkg/stanza/operator/input/windows/api_test.go b/pkg/stanza/operator/input/windows/api_test.go index 95d5635e9b64..99b959e1fe09 100644 --- a/pkg/stanza/operator/input/windows/api_test.go +++ b/pkg/stanza/operator/input/windows/api_test.go @@ -22,7 +22,7 @@ func (m MockProc) Call(a ...uintptr) (uintptr, uintptr, error) { // SimpleMockProc returns a mock proc that will always return the supplied arguments when called. func SimpleMockProc(r1 uintptr, r2 uintptr, err syscall.Errno) SyscallProc { return MockProc{ - call: func(a ...uintptr) (uintptr, uintptr, error) { + call: func(_ ...uintptr) (uintptr, uintptr, error) { return r1, r2, err }, } diff --git a/pkg/stanza/operator/input/windows/bookmark.go b/pkg/stanza/operator/input/windows/bookmark.go index 83ee23f665b9..23a7e8d2f939 100644 --- a/pkg/stanza/operator/input/windows/bookmark.go +++ b/pkg/stanza/operator/input/windows/bookmark.go @@ -54,7 +54,7 @@ func (b *Bookmark) Update(event Event) error { } // Render will render the bookmark as xml. -func (b *Bookmark) Render(buffer Buffer) (string, error) { +func (b *Bookmark) Render(buffer *Buffer) (string, error) { if b.handle == 0 { return "", fmt.Errorf("bookmark handle is not open") } diff --git a/pkg/stanza/operator/input/windows/bookmark_test.go b/pkg/stanza/operator/input/windows/bookmark_test.go index 988d6a3bc995..28a318243dab 100644 --- a/pkg/stanza/operator/input/windows/bookmark_test.go +++ b/pkg/stanza/operator/input/windows/bookmark_test.go @@ -14,16 +14,14 @@ import ( func TestBookmarkOpenPreexisting(t *testing.T) { bookmark := Bookmark{handle: 5} err := bookmark.Open("") - require.Error(t, err) - require.Contains(t, err.Error(), "bookmark handle is already open") + require.ErrorContains(t, err, "bookmark handle is already open") } func TestBookmarkOpenInvalidUTF8(t *testing.T) { bookmark := NewBookmark() invalidUTF8 := "\u0000" err := bookmark.Open(invalidUTF8) - require.Error(t, err) - require.Contains(t, err.Error(), "failed to convert bookmark xml to utf16") + require.ErrorContains(t, err, "failed to convert bookmark xml to utf16") } func TestBookmarkOpenSyscallFailure(t *testing.T) { @@ -31,8 +29,7 @@ func TestBookmarkOpenSyscallFailure(t *testing.T) { xml := "<\\bookmark>" createBookmarkProc = SimpleMockProc(0, 0, ErrorNotSupported) err := bookmark.Open(xml) - require.Error(t, err) - require.Contains(t, err.Error(), "failed to create bookmark handle from xml") + require.ErrorContains(t, err, "failed to create bookmark handle from xml") } func TestBookmarkOpenSuccess(t *testing.T) { @@ -49,8 +46,7 @@ func TestBookmarkUpdateFailureOnCreateSyscall(t *testing.T) { bookmark := NewBookmark() createBookmarkProc = SimpleMockProc(0, 0, ErrorNotSupported) err := bookmark.Update(event) - require.Error(t, err) - require.Contains(t, err.Error(), "syscall to `EvtCreateBookmark` failed") + require.ErrorContains(t, err, "syscall to `EvtCreateBookmark` failed") } func TestBookmarkUpdateFailureOnUpdateSyscall(t *testing.T) { @@ -59,8 +55,7 @@ func TestBookmarkUpdateFailureOnUpdateSyscall(t *testing.T) { createBookmarkProc = SimpleMockProc(1, 0, ErrorSuccess) updateBookmarkProc = SimpleMockProc(0, 0, ErrorNotSupported) err := bookmark.Update(event) - require.Error(t, err) - require.Contains(t, err.Error(), "syscall to `EvtUpdateBookmark` failed") + require.ErrorContains(t, err, "syscall to `EvtUpdateBookmark` failed") } func TestBookmarkUpdateSuccess(t *testing.T) { @@ -83,8 +78,7 @@ func TestBookmarkCloseSyscallFailure(t *testing.T) { bookmark := Bookmark{handle: 5} closeProc = SimpleMockProc(0, 0, ErrorNotSupported) err := bookmark.Close() - require.Error(t, err) - require.Contains(t, err.Error(), "failed to close bookmark handle") + require.ErrorContains(t, err, "failed to close bookmark handle") } func TestBookmarkCloseSuccess(t *testing.T) { @@ -99,8 +93,7 @@ func TestBookmarkRenderWhenClosed(t *testing.T) { bookmark := NewBookmark() buffer := NewBuffer() _, err := bookmark.Render(buffer) - require.Error(t, err) - require.Contains(t, err.Error(), "bookmark handle is not open") + require.ErrorContains(t, err, "bookmark handle is not open") } func TestBookmarkRenderInvalidSyscall(t *testing.T) { @@ -108,6 +101,5 @@ func TestBookmarkRenderInvalidSyscall(t *testing.T) { buffer := NewBuffer() renderProc = SimpleMockProc(0, 0, ErrorNotSupported) _, err := bookmark.Render(buffer) - require.Error(t, err) - require.Contains(t, err.Error(), "syscall to 'EvtRender' failed") + require.ErrorContains(t, err, "syscall to 'EvtRender' failed") } diff --git a/pkg/stanza/operator/input/windows/buffer.go b/pkg/stanza/operator/input/windows/buffer.go index 149eade2b4dd..3f939b38f42a 100644 --- a/pkg/stanza/operator/input/windows/buffer.go +++ b/pkg/stanza/operator/input/windows/buffer.go @@ -23,6 +23,9 @@ type Buffer struct { // ReadBytes will read UTF-8 bytes from the buffer, where offset is the number of bytes to be read func (b *Buffer) ReadBytes(offset uint32) ([]byte, error) { + if offset > uint32(len(b.buffer)) { + offset = uint32(len(b.buffer)) + } utf16 := b.buffer[:offset] utf8, err := unicode.UTF16(unicode.LittleEndian, unicode.UseBOM).NewDecoder().Bytes(utf16) if err != nil { @@ -72,8 +75,8 @@ func (b *Buffer) FirstByte() *byte { } // NewBuffer creates a new buffer with the default buffer size -func NewBuffer() Buffer { - return Buffer{ +func NewBuffer() *Buffer { + return &Buffer{ buffer: make([]byte, defaultBufferSize), } } diff --git a/pkg/stanza/operator/input/windows/buffer_test.go b/pkg/stanza/operator/input/windows/buffer_test.go index 64106a832eef..f8376706ec78 100644 --- a/pkg/stanza/operator/input/windows/buffer_test.go +++ b/pkg/stanza/operator/input/windows/buffer_test.go @@ -46,13 +46,13 @@ func TestBufferReadString(t *testing.T) { func TestBufferUpdateSize(t *testing.T) { buffer := NewBuffer() buffer.UpdateSizeBytes(1) - require.Equal(t, 1, len(buffer.buffer)) + require.Len(t, buffer.buffer, 1) } func TestBufferUpdateSizeWide(t *testing.T) { buffer := NewBuffer() buffer.UpdateSizeWide(1) - require.Equal(t, 2, len(buffer.buffer)) + require.Len(t, buffer.buffer, 2) } func TestBufferSize(t *testing.T) { diff --git a/pkg/stanza/operator/input/windows/config_all.go b/pkg/stanza/operator/input/windows/config_all.go index 3fe9e71ee352..1952edf5c27f 100644 --- a/pkg/stanza/operator/input/windows/config_all.go +++ b/pkg/stanza/operator/input/windows/config_all.go @@ -28,11 +28,21 @@ func NewConfigWithID(operatorID string) *Config { // Config is the configuration of a windows event log operator. type Config struct { - helper.InputConfig `mapstructure:",squash"` - Channel string `mapstructure:"channel"` - MaxReads int `mapstructure:"max_reads,omitempty"` - StartAt string `mapstructure:"start_at,omitempty"` - PollInterval time.Duration `mapstructure:"poll_interval,omitempty"` - Raw bool `mapstructure:"raw,omitempty"` - ExcludeProviders []string `mapstructure:"exclude_providers,omitempty"` + helper.InputConfig `mapstructure:",squash"` + Channel string `mapstructure:"channel"` + MaxReads int `mapstructure:"max_reads,omitempty"` + StartAt string `mapstructure:"start_at,omitempty"` + PollInterval time.Duration `mapstructure:"poll_interval,omitempty"` + Raw bool `mapstructure:"raw,omitempty"` + SuppressRenderingInfo bool `mapstructure:"suppress_rendering_info,omitempty"` + ExcludeProviders []string `mapstructure:"exclude_providers,omitempty"` + Remote RemoteConfig `mapstructure:"remote,omitempty"` +} + +// RemoteConfig is the configuration for a remote server. +type RemoteConfig struct { + Server string `mapstructure:"server"` + Username string `mapstructure:"username"` + Password string `mapstructure:"password"` + Domain string `mapstructure:"domain,omitempty"` } diff --git a/pkg/stanza/operator/input/windows/config_windows.go b/pkg/stanza/operator/input/windows/config_windows.go index eb1324bc7d07..72c5ec48f820 100644 --- a/pkg/stanza/operator/input/windows/config_windows.go +++ b/pkg/stanza/operator/input/windows/config_windows.go @@ -36,7 +36,12 @@ func (c *Config) Build(set component.TelemetrySettings) (operator.Operator, erro return nil, fmt.Errorf("the `start_at` field must be set to `beginning` or `end`") } - return &Input{ + if (c.Remote.Server != "" || c.Remote.Username != "" || c.Remote.Password != "") && // any not empty + (c.Remote.Server == "" || c.Remote.Username == "" || c.Remote.Password == "") { // any empty + return nil, fmt.Errorf("remote configuration must have non-empty `username` and `password`") + } + + input := &Input{ InputOperator: inputOperator, buffer: NewBuffer(), channel: c.Channel, @@ -44,6 +49,24 @@ func (c *Config) Build(set component.TelemetrySettings) (operator.Operator, erro startAt: c.StartAt, pollInterval: c.PollInterval, raw: c.Raw, - excludeProviders: c.ExcludeProviders, - }, nil + excludeProviders: excludeProvidersSet(c.ExcludeProviders), + remote: c.Remote, + } + input.startRemoteSession = input.defaultStartRemoteSession + + if c.SuppressRenderingInfo { + input.processEvent = input.processEventWithoutRenderingInfo + } else { + input.processEvent = input.processEventWithRenderingInfo + } + + return input, nil +} + +func excludeProvidersSet(providers []string) map[string]struct{} { + set := make(map[string]struct{}, len(providers)) + for _, provider := range providers { + set[provider] = struct{}{} + } + return set } diff --git a/pkg/stanza/operator/input/windows/event.go b/pkg/stanza/operator/input/windows/event.go index 81eb2cd478c8..7fa8c52292a6 100644 --- a/pkg/stanza/operator/input/windows/event.go +++ b/pkg/stanza/operator/input/windows/event.go @@ -8,64 +8,117 @@ package windows // import "github.com/open-telemetry/opentelemetry-collector-con import ( "errors" "fmt" + "unicode/utf16" + "unsafe" ) -// errUnknownNextFrame is an error returned when a systemcall indicates the next frame is 0 bytes. -var errUnknownNextFrame = errors.New("the buffer size needed by the next frame of a render syscall was 0, unable to determine size of next frame") +// systemPropertiesRenderContext stores a custom rendering context to get only the event properties. +var ( + systemPropertiesRenderContext = uintptr(0) + systemPropertiesRenderContextErr error +) + +func init() { + // This is not expected to fail, however, collecting the error if a new failure mode appears. + systemPropertiesRenderContext, systemPropertiesRenderContextErr = evtCreateRenderContext(0, nil, EvtRenderContextSystem) +} // Event is an event stored in windows event log. type Event struct { handle uintptr } -// RenderSimple will render the event as EventXML without formatted info. -func (e *Event) RenderSimple(buffer Buffer) (EventXML, error) { +// GetPublisherName will get the publisher name of the event. +func (e *Event) GetPublisherName(buffer *Buffer) (string, error) { if e.handle == 0 { - return EventXML{}, fmt.Errorf("event handle does not exist") + return "", fmt.Errorf("event handle does not exist") } - bufferUsed, err := evtRender(0, e.handle, EvtRenderEventXML, buffer.SizeBytes(), buffer.FirstByte()) + if systemPropertiesRenderContextErr != nil { + return "", fmt.Errorf("failed to create render context: %w", systemPropertiesRenderContextErr) + } + + bufferUsed, err := evtRender(systemPropertiesRenderContext, e.handle, EvtRenderEventValues, buffer.SizeBytes(), buffer.FirstByte()) if errors.Is(err, ErrorInsufficientBuffer) { buffer.UpdateSizeBytes(*bufferUsed) - return e.RenderSimple(buffer) + return e.GetPublisherName(buffer) } if err != nil { - return EventXML{}, fmt.Errorf("syscall to 'EvtRender' failed: %w", err) + return "", fmt.Errorf("failed to get provider name: %w", err) } - bytes, err := buffer.ReadBytes(*bufferUsed) - if err != nil { - return EventXML{}, fmt.Errorf("failed to read bytes from buffer: %w", err) + utf16Ptr := (**uint16)(unsafe.Pointer(buffer.FirstByte())) + providerName := utf16PtrToString(*utf16Ptr) + + return providerName, nil +} + +// utf16PtrToString converts Windows API LPWSTR (pointer to string) to go string +func utf16PtrToString(s *uint16) string { + if s == nil { + return "" } - return unmarshalEventXML(bytes) + utf16Len := 0 + curPtr := unsafe.Pointer(s) + for *(*uint16)(curPtr) != 0 { + curPtr = unsafe.Pointer(uintptr(curPtr) + unsafe.Sizeof(*s)) + utf16Len++ + } + + slice := unsafe.Slice(s, utf16Len) + return string(utf16.Decode(slice)) } -// RenderFormatted will render the event as EventXML with formatted info. -func (e *Event) RenderFormatted(buffer Buffer, publisher Publisher) (EventXML, error) { +// NewEvent will create a new event from an event handle. +func NewEvent(handle uintptr) Event { + return Event{ + handle: handle, + } +} + +// RenderSimple will render the event as EventXML without formatted info. +func (e *Event) RenderSimple(buffer *Buffer) (*EventXML, error) { if e.handle == 0 { - return EventXML{}, fmt.Errorf("event handle does not exist") + return nil, fmt.Errorf("event handle does not exist") } - bufferUsed, err := evtFormatMessage(publisher.handle, e.handle, 0, 0, 0, EvtFormatMessageXML, buffer.SizeWide(), buffer.FirstByte()) - if errors.Is(err, ErrorInsufficientBuffer) { - // If the bufferUsed is 0 return an error as we don't want to make a recursive call with no buffer - if *bufferUsed == 0 { - return EventXML{}, errUnknownNextFrame + bufferUsed, err := evtRender(0, e.handle, EvtRenderEventXML, buffer.SizeBytes(), buffer.FirstByte()) + if err != nil { + if errors.Is(err, ErrorInsufficientBuffer) { + buffer.UpdateSizeBytes(*bufferUsed) + return e.RenderSimple(buffer) } + return nil, fmt.Errorf("syscall to 'EvtRender' failed: %w", err) + } + + bytes, err := buffer.ReadBytes(*bufferUsed) + if err != nil { + return nil, fmt.Errorf("failed to read bytes from buffer: %w", err) + } + + return unmarshalEventXML(bytes) +} - buffer.UpdateSizeWide(*bufferUsed) - return e.RenderFormatted(buffer, publisher) +// RenderDeep will render the event as EventXML with all available formatted info. +func (e *Event) RenderDeep(buffer *Buffer, publisher Publisher) (*EventXML, error) { + if e.handle == 0 { + return nil, fmt.Errorf("event handle does not exist") } + bufferUsed, err := evtFormatMessage(publisher.handle, e.handle, 0, 0, 0, EvtFormatMessageXML, buffer.SizeWide(), buffer.FirstByte()) if err != nil { - return EventXML{}, fmt.Errorf("syscall to 'EvtFormatMessage' failed: %w", err) + if errors.Is(err, ErrorInsufficientBuffer) { + buffer.UpdateSizeWide(*bufferUsed) + return e.RenderDeep(buffer, publisher) + } + return nil, fmt.Errorf("syscall to 'EvtFormatMessage' failed: %w", err) } bytes, err := buffer.ReadWideChars(*bufferUsed) if err != nil { - return EventXML{}, fmt.Errorf("failed to read bytes from buffer: %w", err) + return nil, fmt.Errorf("failed to read bytes from buffer: %w", err) } return unmarshalEventXML(bytes) @@ -84,33 +137,3 @@ func (e *Event) Close() error { e.handle = 0 return nil } - -func (e *Event) RenderRaw(buffer Buffer) (EventRaw, error) { - if e.handle == 0 { - return EventRaw{}, fmt.Errorf("event handle does not exist") - } - - bufferUsed, err := evtRender(0, e.handle, EvtRenderEventXML, buffer.SizeBytes(), buffer.FirstByte()) - if errors.Is(err, ErrorInsufficientBuffer) { - // If the bufferUsed is 0 return an error as we don't want to make a recursive call with no buffer - if *bufferUsed == 0 { - return EventRaw{}, errUnknownNextFrame - } - - buffer.UpdateSizeBytes(*bufferUsed) - return e.RenderRaw(buffer) - } - bytes, err := buffer.ReadBytes(*bufferUsed) - if err != nil { - return EventRaw{}, fmt.Errorf("failed to read bytes from buffer: %w", err) - } - - return unmarshalEventRaw(bytes) -} - -// NewEvent will create a new event from an event handle. -func NewEvent(handle uintptr) Event { - return Event{ - handle: handle, - } -} diff --git a/pkg/stanza/operator/input/windows/event_test.go b/pkg/stanza/operator/input/windows/event_test.go index 0acc6240c62c..4650cdf736ce 100644 --- a/pkg/stanza/operator/input/windows/event_test.go +++ b/pkg/stanza/operator/input/windows/event_test.go @@ -21,8 +21,7 @@ func TestEventCloseSyscallFailure(t *testing.T) { event := NewEvent(5) closeProc = SimpleMockProc(0, 0, ErrorNotSupported) err := event.Close() - require.Error(t, err) - require.Contains(t, err.Error(), "failed to close event handle") + require.ErrorContains(t, err, "failed to close event handle") } func TestEventCloseSuccess(t *testing.T) { diff --git a/pkg/stanza/operator/input/windows/input.go b/pkg/stanza/operator/input/windows/input.go index 9196ad29e7a2..a7cace3e7363 100644 --- a/pkg/stanza/operator/input/windows/input.go +++ b/pkg/stanza/operator/input/windows/input.go @@ -7,11 +7,14 @@ package windows // import "github.com/open-telemetry/opentelemetry-collector-con import ( "context" + "errors" "fmt" "sync" "time" + "go.opentelemetry.io/collector/component" "go.uber.org/zap" + "golang.org/x/sys/windows" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper" @@ -20,19 +23,80 @@ import ( // Input is an operator that creates entries using the windows event log api. type Input struct { helper.InputOperator - bookmark Bookmark - subscription Subscription - buffer Buffer - channel string - maxReads int - startAt string - raw bool - excludeProviders []string - pollInterval time.Duration - persister operator.Persister - publisherCache publisherCache - cancel context.CancelFunc - wg sync.WaitGroup + bookmark Bookmark + buffer *Buffer + channel string + maxReads int + startAt string + raw bool + excludeProviders map[string]struct{} + pollInterval time.Duration + persister operator.Persister + publisherCache publisherCache + cancel context.CancelFunc + wg sync.WaitGroup + subscription Subscription + remote RemoteConfig + remoteSessionHandle windows.Handle + startRemoteSession func() error + processEvent func(context.Context, Event) error +} + +// newInput creates a new Input operator. +func newInput(settings component.TelemetrySettings) *Input { + basicConfig := helper.NewBasicConfig("windowseventlog", "input") + basicOperator, _ := basicConfig.Build(settings) + + input := &Input{ + InputOperator: helper.InputOperator{ + WriterOperator: helper.WriterOperator{ + BasicOperator: basicOperator, + }, + }, + } + input.startRemoteSession = input.defaultStartRemoteSession + return input +} + +// defaultStartRemoteSession starts a remote session for reading event logs from a remote server. +func (i *Input) defaultStartRemoteSession() error { + if i.remote.Server == "" { + return nil + } + + login := EvtRPCLogin{ + Server: windows.StringToUTF16Ptr(i.remote.Server), + User: windows.StringToUTF16Ptr(i.remote.Username), + Password: windows.StringToUTF16Ptr(i.remote.Password), + } + + sessionHandle, err := evtOpenSession(EvtRPCLoginClass, &login, 0, 0) + if err != nil { + return fmt.Errorf("failed to open session for server %s: %w", i.remote.Server, err) + } + i.remoteSessionHandle = sessionHandle + return nil +} + +// stopRemoteSession stops the remote session if it is active. +func (i *Input) stopRemoteSession() error { + if i.remoteSessionHandle != 0 { + if err := evtClose(uintptr(i.remoteSessionHandle)); err != nil { + return fmt.Errorf("failed to close remote session handle for server %s: %w", i.remote.Server, err) + } + i.remoteSessionHandle = 0 + } + return nil +} + +// isRemote checks if the input is configured for remote access. +func (i *Input) isRemote() bool { + return i.remote.Server != "" +} + +// isNonTransientError checks if the error is likely non-transient. +func isNonTransientError(err error) bool { + return errors.Is(err, windows.ERROR_EVT_CHANNEL_NOT_FOUND) || errors.Is(err, windows.ERROR_ACCESS_DENIED) } // Start will start reading events from a subscription. @@ -42,10 +106,15 @@ func (i *Input) Start(persister operator.Persister) error { i.persister = persister + if i.isRemote() { + if err := i.startRemoteSession(); err != nil { + return fmt.Errorf("failed to start remote session for server %s: %w", i.remote.Server, err) + } + } + i.bookmark = NewBookmark() offsetXML, err := i.getBookmarkOffset(ctx) if err != nil { - i.Logger().Error("Failed to open bookmark, continuing without previous bookmark", zap.Error(err)) _ = i.persister.Delete(ctx, i.channel) } @@ -55,39 +124,61 @@ func (i *Input) Start(persister operator.Persister) error { } } - i.subscription = NewSubscription() - if err := i.subscription.Open(i.channel, i.startAt, i.bookmark); err != nil { - return fmt.Errorf("failed to open subscription: %w", err) + i.publisherCache = newPublisherCache() + + subscription := NewLocalSubscription() + if i.isRemote() { + subscription = NewRemoteSubscription(i.remote.Server) } - i.publisherCache = newPublisherCache() + if err := subscription.Open(i.startAt, uintptr(i.remoteSessionHandle), i.channel, i.bookmark); err != nil { + if isNonTransientError(err) { + if i.isRemote() { + return fmt.Errorf("failed to open subscription for remote server %s: %w", i.remote.Server, err) + } + return fmt.Errorf("failed to open local subscription: %w", err) + } + if i.isRemote() { + i.Logger().Warn("Transient error opening subscription for remote server, continuing", zap.String("server", i.remote.Server), zap.Error(err)) + } else { + i.Logger().Warn("Transient error opening local subscription, continuing", zap.Error(err)) + } + } + i.subscription = subscription i.wg.Add(1) go i.readOnInterval(ctx) + return nil } // Stop will stop reading events from a subscription. func (i *Input) Stop() error { - i.cancel() + // Warning: all calls made below must be safe to be done even if Start() was not called or failed. + + if i.cancel != nil { + i.cancel() + } + i.wg.Wait() + var errs error if err := i.subscription.Close(); err != nil { - return fmt.Errorf("failed to close subscription: %w", err) + errs = errors.Join(errs, fmt.Errorf("failed to close subscription: %w", err)) } if err := i.bookmark.Close(); err != nil { - return fmt.Errorf("failed to close bookmark: %w", err) + errs = errors.Join(errs, fmt.Errorf("failed to close bookmark: %w", err)) } if err := i.publisherCache.evictAll(); err != nil { - return fmt.Errorf("failed to close publishers: %w", err) + errs = errors.Join(errs, fmt.Errorf("failed to close publishers: %w", err)) } - return nil + return errors.Join(errs, i.stopRemoteSession()) } -// readOnInterval will read events with respect to the polling interval. +// readOnInterval will read events with respect to the polling interval until it reaches the end of the channel. func (i *Input) readOnInterval(ctx context.Context) { defer i.wg.Done() @@ -99,128 +190,134 @@ func (i *Input) readOnInterval(ctx context.Context) { case <-ctx.Done(): return case <-ticker.C: - i.readToEnd(ctx) - } - } -} - -// readToEnd will read events from the subscription until it reaches the end of the channel. -func (i *Input) readToEnd(ctx context.Context) { - for { - select { - case <-ctx.Done(): - return - default: - if count := i.read(ctx); count == 0 { - return - } + i.read(ctx) } } } // read will read events from the subscription. -func (i *Input) read(ctx context.Context) int { +func (i *Input) read(ctx context.Context) { events, err := i.subscription.Read(i.maxReads) if err != nil { i.Logger().Error("Failed to read events from subscription", zap.Error(err)) - return 0 + if i.isRemote() && (errors.Is(err, windows.ERROR_INVALID_HANDLE) || errors.Is(err, errSubscriptionHandleNotOpen)) { + i.Logger().Info("Resubscribing, closing remote subscription") + closeErr := i.subscription.Close() + if closeErr != nil { + i.Logger().Error("Failed to close remote subscription", zap.Error(closeErr)) + return + } + if err := i.stopRemoteSession(); err != nil { + i.Logger().Error("Failed to close remote session", zap.Error(err)) + } + i.Logger().Info("Resubscribing, creating remote subscription") + i.subscription = NewRemoteSubscription(i.remote.Server) + if err := i.startRemoteSession(); err != nil { + i.Logger().Error("Failed to re-establish remote session", zap.String("server", i.remote.Server), zap.Error(err)) + return + } + if err := i.subscription.Open(i.startAt, uintptr(i.remoteSessionHandle), i.channel, i.bookmark); err != nil { + i.Logger().Error("Failed to re-open subscription for remote server", zap.String("server", i.remote.Server), zap.Error(err)) + return + } + } + return } for n, event := range events { - i.processEvent(ctx, event) + if err := i.processEvent(ctx, event); err != nil { + i.Logger().Error("process event", zap.Error(err)) + } if len(events) == n+1 { i.updateBookmarkOffset(ctx, event) } event.Close() } - - return len(events) } -// processEvent will process and send an event retrieved from windows event log. -func (i *Input) processEvent(ctx context.Context, event Event) { - if i.raw { - if len(i.excludeProviders) > 0 { - simpleEvent, err := event.RenderSimple(i.buffer) - if err != nil { - i.Logger().Error("Failed to render simple event", zap.Error(err)) - return - } +func (i *Input) getPublisherName(event Event) (name string, excluded bool) { + providerName, err := event.GetPublisherName(i.buffer) + if err != nil { + i.Logger().Error("Failed to get provider name", zap.Error(err)) + return "", true + } + if _, exclude := i.excludeProviders[providerName]; exclude { + return "", true + } - for _, excludeProvider := range i.excludeProviders { - if simpleEvent.Provider.Name == excludeProvider { - return - } - } - } + return providerName, false +} - rawEvent, err := event.RenderRaw(i.buffer) - if err != nil { - i.Logger().Error("Failed to render raw event", zap.Error(err)) - return - } - i.sendEventRaw(ctx, rawEvent) - return - } +func (i *Input) renderSimpleAndSend(ctx context.Context, event Event) error { simpleEvent, err := event.RenderSimple(i.buffer) if err != nil { - i.Logger().Error("Failed to render simple event", zap.Error(err)) - return + return fmt.Errorf("render simple event: %w", err) } + return i.sendEvent(ctx, simpleEvent) +} - for _, excludeProvider := range i.excludeProviders { - if simpleEvent.Provider.Name == excludeProvider { - return - } +func (i *Input) renderDeepAndSend(ctx context.Context, event Event, publisher Publisher) error { + deepEvent, err := event.RenderDeep(i.buffer, publisher) + if err == nil { + return i.sendEvent(ctx, deepEvent) } + return errors.Join( + fmt.Errorf("render deep event: %w", err), + i.renderSimpleAndSend(ctx, event), + ) +} - publisher, openPublisherErr := i.publisherCache.get(simpleEvent.Provider.Name) - if openPublisherErr != nil { - i.Logger().Warn( - "Failed to open event source, respective log entries cannot be formatted", - zap.String("provider", simpleEvent.Provider.Name), zap.Error(openPublisherErr)) +// processEvent will process and send an event retrieved from windows event log. +func (i *Input) processEventWithoutRenderingInfo(ctx context.Context, event Event) error { + if len(i.excludeProviders) == 0 { + return i.renderSimpleAndSend(ctx, event) + } + if _, exclude := i.getPublisherName(event); exclude { + return nil } + return i.renderSimpleAndSend(ctx, event) +} - if !publisher.Valid() { - i.sendEvent(ctx, simpleEvent) - return +func (i *Input) processEventWithRenderingInfo(ctx context.Context, event Event) error { + providerName, exclude := i.getPublisherName(event) + if exclude { + return nil } - formattedEvent, err := event.RenderFormatted(i.buffer, publisher) + publisher, err := i.publisherCache.get(providerName) if err != nil { - i.Logger().Error("Failed to render formatted event", zap.Error(err)) - i.sendEvent(ctx, simpleEvent) - return + return errors.Join( + fmt.Errorf("open event source for provider %q: %w", providerName, err), + i.renderSimpleAndSend(ctx, event), + ) } - i.sendEvent(ctx, formattedEvent) + if publisher.Valid() { + return i.renderDeepAndSend(ctx, event, publisher) + } + return i.renderSimpleAndSend(ctx, event) } // sendEvent will send EventXML as an entry to the operator's output. -func (i *Input) sendEvent(ctx context.Context, eventXML EventXML) { - body := eventXML.parseBody() - entry, err := i.NewEntry(body) +func (i *Input) sendEvent(ctx context.Context, eventXML *EventXML) error { + var body any = eventXML.Original + if !i.raw { + body = formattedBody(eventXML) + } + + e, err := i.NewEntry(body) if err != nil { - i.Logger().Error("Failed to create entry", zap.Error(err)) - return + return fmt.Errorf("create entry: %w", err) } - entry.Timestamp = eventXML.parseTimestamp() - entry.Severity = eventXML.parseRenderedSeverity() - i.Write(ctx, entry) -} + e.Timestamp = parseTimestamp(eventXML.TimeCreated.SystemTime) + e.Severity = parseSeverity(eventXML.RenderedLevel, eventXML.Level) -func (i *Input) sendEventRaw(ctx context.Context, eventRaw EventRaw) { - body := eventRaw.parseBody() - entry, err := i.NewEntry(body) - if err != nil { - i.Logger().Error("Failed to create entry", zap.Error(err)) - return + if i.remote.Server != "" { + e.Attributes["server.address"] = i.remote.Server } - entry.Timestamp = eventRaw.parseTimestamp() - entry.Severity = eventRaw.parseRenderedSeverity() - i.Write(ctx, entry) + return i.Write(ctx, e) } // getBookmarkXML will get the bookmark xml from the offsets database. diff --git a/pkg/stanza/operator/input/windows/input_test.go b/pkg/stanza/operator/input/windows/input_test.go new file mode 100644 index 000000000000..462dad9a499a --- /dev/null +++ b/pkg/stanza/operator/input/windows/input_test.go @@ -0,0 +1,130 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +//go:build windows + +package windows // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/input/windows" + +import ( + "errors" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "go.opentelemetry.io/collector/component" + "go.uber.org/zap" + "golang.org/x/sys/windows" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/testutil" +) + +func newTestInput() *Input { + return newInput(component.TelemetrySettings{ + Logger: zap.NewNop(), + }) +} + +// TestInputCreate_Stop ensures the input correctly shuts down even if it was never started. +func TestInputCreate_Stop(t *testing.T) { + input := newTestInput() + assert.NoError(t, input.Stop()) +} + +// TestInputStart_LocalSubscriptionError ensures the input correctly handles local subscription errors. +func TestInputStart_LocalSubscriptionError(t *testing.T) { + persister := testutil.NewMockPersister("") + + input := newTestInput() + input.channel = "test-channel" + input.startAt = "beginning" + input.pollInterval = 1 * time.Second + + err := input.Start(persister) + assert.ErrorContains(t, err, "The specified channel could not be found") +} + +// TestInputStart_RemoteSubscriptionError ensures the input correctly handles remote subscription errors. +func TestInputStart_RemoteSubscriptionError(t *testing.T) { + persister := testutil.NewMockPersister("") + + input := newTestInput() + input.startRemoteSession = func() error { return nil } + input.channel = "test-channel" + input.startAt = "beginning" + input.pollInterval = 1 * time.Second + input.remote = RemoteConfig{ + Server: "remote-server", + } + + err := input.Start(persister) + assert.ErrorContains(t, err, "The specified channel could not be found") +} + +// TestInputStart_RemoteSessionError ensures the input correctly handles remote session errors. +func TestInputStart_RemoteSessionError(t *testing.T) { + persister := testutil.NewMockPersister("") + + input := newTestInput() + input.startRemoteSession = func() error { + return errors.New("remote session error") + } + input.channel = "test-channel" + input.startAt = "beginning" + input.pollInterval = 1 * time.Second + input.remote = RemoteConfig{ + Server: "remote-server", + } + + err := input.Start(persister) + assert.ErrorContains(t, err, "failed to start remote session for server remote-server: remote session error") +} + +// TestInputStart_RemoteAccessDeniedError ensures the input correctly handles remote access denied errors. +func TestInputStart_RemoteAccessDeniedError(t *testing.T) { + persister := testutil.NewMockPersister("") + + originalEvtSubscribeFunc := evtSubscribeFunc + defer func() { evtSubscribeFunc = originalEvtSubscribeFunc }() + + evtSubscribeFunc = func(_ uintptr, _ windows.Handle, _ *uint16, _ *uint16, _ uintptr, _ uintptr, _ uintptr, _ uint32) (uintptr, error) { + return 0, windows.ERROR_ACCESS_DENIED + } + + input := newTestInput() + input.startRemoteSession = func() error { return nil } + input.channel = "test-channel" + input.startAt = "beginning" + input.pollInterval = 1 * time.Second + input.remote = RemoteConfig{ + Server: "remote-server", + } + + err := input.Start(persister) + assert.ErrorContains(t, err, "failed to open subscription for remote server") + assert.ErrorContains(t, err, "Access is denied") +} + +// TestInputStart_BadChannelName ensures the input correctly handles bad channel names. +func TestInputStart_BadChannelName(t *testing.T) { + persister := testutil.NewMockPersister("") + + originalEvtSubscribeFunc := evtSubscribeFunc + defer func() { evtSubscribeFunc = originalEvtSubscribeFunc }() + + evtSubscribeFunc = func(_ uintptr, _ windows.Handle, _ *uint16, _ *uint16, _ uintptr, _ uintptr, _ uintptr, _ uint32) (uintptr, error) { + return 0, windows.ERROR_EVT_CHANNEL_NOT_FOUND + } + + input := newTestInput() + input.startRemoteSession = func() error { return nil } + input.channel = "bad-channel" + input.startAt = "beginning" + input.pollInterval = 1 * time.Second + input.remote = RemoteConfig{ + Server: "remote-server", + } + + err := input.Start(persister) + assert.ErrorContains(t, err, "failed to open subscription for remote server") + assert.ErrorContains(t, err, "The specified channel could not be found") +} diff --git a/pkg/stanza/operator/input/windows/publisher_test.go b/pkg/stanza/operator/input/windows/publisher_test.go index 1a061d976aa5..75ca47798d20 100644 --- a/pkg/stanza/operator/input/windows/publisher_test.go +++ b/pkg/stanza/operator/input/windows/publisher_test.go @@ -13,9 +13,8 @@ import ( func TestPublisherOpenPreexisting(t *testing.T) { publisher := Publisher{handle: 5} - err := publisher.Open("") - require.Error(t, err) - require.Contains(t, err.Error(), "publisher handle is already open") + err := publisher.Open("provider_name_does_not_matter_for_this_test") + require.ErrorContains(t, err, "publisher handle is already open") require.True(t, publisher.Valid()) } @@ -23,8 +22,7 @@ func TestPublisherOpenInvalidUTF8(t *testing.T) { publisher := NewPublisher() invalidUTF8 := "\u0000" err := publisher.Open(invalidUTF8) - require.Error(t, err) - require.Contains(t, err.Error(), "failed to convert the provider name \"\\x00\" to utf16: invalid argument") + require.ErrorContains(t, err, "failed to convert the provider name \"\\x00\" to utf16: invalid argument") require.False(t, publisher.Valid()) } @@ -33,8 +31,7 @@ func TestPublisherOpenSyscallFailure(t *testing.T) { provider := "provider" defer mockWithDeferredRestore(&openPublisherMetadataProc, SimpleMockProc(0, 0, ErrorNotSupported))() err := publisher.Open(provider) - require.Error(t, err) - require.Contains(t, err.Error(), "failed to open the metadata for the \"provider\" provider: The request is not supported.") + require.ErrorContains(t, err, "failed to open the metadata for the \"provider\" provider: The request is not supported.") require.False(t, publisher.Valid()) } @@ -59,8 +56,7 @@ func TestPublisherCloseSyscallFailure(t *testing.T) { publisher := Publisher{handle: 5} defer mockWithDeferredRestore(&closeProc, SimpleMockProc(0, 0, ErrorNotSupported))() err := publisher.Close() - require.Error(t, err) - require.Contains(t, err.Error(), "failed to close publisher") + require.ErrorContains(t, err, "failed to close publisher") require.True(t, publisher.Valid()) } diff --git a/pkg/stanza/operator/input/windows/publishercache.go b/pkg/stanza/operator/input/windows/publishercache.go index d9e08c3e2f98..f00b8406528c 100644 --- a/pkg/stanza/operator/input/windows/publishercache.go +++ b/pkg/stanza/operator/input/windows/publishercache.go @@ -19,14 +19,19 @@ func newPublisherCache() publisherCache { } } -func (c *publisherCache) get(provider string) (publisher Publisher, openPublisherErr error) { +func (c *publisherCache) get(provider string) (Publisher, error) { publisher, ok := c.cache[provider] if ok { return publisher, nil } + var err error publisher = NewPublisher() - err := publisher.Open(provider) + if provider != "" { + // If the provider is empty, there is nothing to be formatted on the event + // keep the invalid publisher in the cache. See issue #35135 + err = publisher.Open(provider) + } // Always store the publisher even if there was an error opening it. c.cache[provider] = publisher diff --git a/pkg/stanza/operator/input/windows/publishercache_test.go b/pkg/stanza/operator/input/windows/publishercache_test.go index 92a2b29f6c63..3a3e07e7601d 100644 --- a/pkg/stanza/operator/input/windows/publishercache_test.go +++ b/pkg/stanza/operator/input/windows/publishercache_test.go @@ -45,6 +45,22 @@ func TestGetInvalidPublisher(t *testing.T) { require.False(t, publisher.Valid()) } +func TestEmptyPublisherNameBehavior(t *testing.T) { + publisherCache := newPublisherCache() + defer func() { + require.NoError(t, publisherCache.evictAll()) + }() + + publisher, openPublisherErr := publisherCache.get("") + require.NoError(t, openPublisherErr) // There should be no error for an empty provider. + require.False(t, publisher.Valid()) + + // Checked that the cached version works as expected. + publisher, openPublisherErr = publisherCache.get("") + require.NoError(t, openPublisherErr) + require.False(t, publisher.Valid()) +} + func TestValidAndInvalidPublishers(t *testing.T) { publisherCache := newPublisherCache() defer func() { diff --git a/pkg/stanza/operator/input/windows/raw.go b/pkg/stanza/operator/input/windows/raw.go deleted file mode 100644 index 7c94934c412b..000000000000 --- a/pkg/stanza/operator/input/windows/raw.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package windows // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/input/windows" - -import ( - "encoding/xml" - "fmt" - "time" - - "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/entry" -) - -// EventRaw is the rendered xml of an event, however, its message is the original XML of the entire event. -type EventRaw struct { - TimeCreated TimeCreated `xml:"System>TimeCreated"` - RenderedLevel string `xml:"RenderingInfo>Level"` - Level string `xml:"System>Level"` - Body string `xml:"-"` -} - -// parseTimestamp will parse the timestamp of the event. -func (e *EventRaw) parseTimestamp() time.Time { - if timestamp, err := time.Parse(time.RFC3339Nano, e.TimeCreated.SystemTime); err == nil { - return timestamp - } - return time.Now() -} - -// parseRenderedSeverity will parse the severity of the event. -func (e *EventRaw) parseRenderedSeverity() entry.Severity { - switch e.RenderedLevel { - case "": - return e.parseSeverity() - case "Critical": - return entry.Fatal - case "Error": - return entry.Error - case "Warning": - return entry.Warn - case "Information": - return entry.Info - default: - return entry.Default - } -} - -// parseSeverity will parse the severity of the event when RenderingInfo is not populated -func (e *EventRaw) parseSeverity() entry.Severity { - switch e.Level { - case "1": - return entry.Fatal - case "2": - return entry.Error - case "3": - return entry.Warn - case "4": - return entry.Info - default: - return entry.Default - } -} - -// parseBody will parse a body from the event. -func (e *EventRaw) parseBody() string { - return e.Body -} - -// unmarshalEventRaw will unmarshal EventRaw from xml bytes. -func unmarshalEventRaw(bytes []byte) (EventRaw, error) { - var eventRaw EventRaw - if err := xml.Unmarshal(bytes, &eventRaw); err != nil { - return EventRaw{}, fmt.Errorf("failed to unmarshal xml bytes into event: %w (%s)", err, string(bytes)) - } - eventRaw.Body = string(bytes) - return eventRaw, nil -} diff --git a/pkg/stanza/operator/input/windows/raw_test.go b/pkg/stanza/operator/input/windows/raw_test.go deleted file mode 100644 index 10e36d9154ee..000000000000 --- a/pkg/stanza/operator/input/windows/raw_test.go +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package windows - -import ( - "os" - "path/filepath" - "testing" - "time" - - "github.com/stretchr/testify/require" - - "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/entry" -) - -func TestParseValidTimestampRaw(t *testing.T) { - raw := EventRaw{ - TimeCreated: TimeCreated{ - SystemTime: "2020-07-30T01:01:01.123456789Z", - }, - } - timestamp := raw.parseTimestamp() - expected, _ := time.Parse(time.RFC3339Nano, "2020-07-30T01:01:01.123456789Z") - require.Equal(t, expected, timestamp) -} - -func TestParseInvalidTimestampRaw(t *testing.T) { - raw := EventRaw{ - TimeCreated: TimeCreated{ - SystemTime: "invalid", - }, - } - timestamp := raw.parseTimestamp() - require.Equal(t, time.Now().Year(), timestamp.Year()) - require.Equal(t, time.Now().Month(), timestamp.Month()) - require.Equal(t, time.Now().Day(), timestamp.Day()) -} - -func TestParseSeverityRaw(t *testing.T) { - rawRenderedCritical := EventRaw{RenderedLevel: "Critical"} - rawRenderedError := EventRaw{RenderedLevel: "Error"} - rawRenderedWarning := EventRaw{RenderedLevel: "Warning"} - rawRenderedInformation := EventRaw{RenderedLevel: "Information"} - rawRenderedUnknown := EventRaw{RenderedLevel: "Unknown"} - rawCritical := EventRaw{Level: "1"} - rawError := EventRaw{Level: "2"} - rawWarning := EventRaw{Level: "3"} - rawInformation := EventRaw{Level: "4"} - rawUnknown := EventRaw{Level: "0"} - require.Equal(t, entry.Fatal, rawRenderedCritical.parseRenderedSeverity()) - require.Equal(t, entry.Error, rawRenderedError.parseRenderedSeverity()) - require.Equal(t, entry.Warn, rawRenderedWarning.parseRenderedSeverity()) - require.Equal(t, entry.Info, rawRenderedInformation.parseRenderedSeverity()) - require.Equal(t, entry.Default, rawRenderedUnknown.parseRenderedSeverity()) - require.Equal(t, entry.Fatal, rawCritical.parseRenderedSeverity()) - require.Equal(t, entry.Error, rawError.parseRenderedSeverity()) - require.Equal(t, entry.Warn, rawWarning.parseRenderedSeverity()) - require.Equal(t, entry.Info, rawInformation.parseRenderedSeverity()) - require.Equal(t, entry.Default, rawUnknown.parseRenderedSeverity()) -} - -func TestParseBodyRaw(t *testing.T) { - raw := EventRaw{ - Body: "foo", - } - - require.Equal(t, "foo", raw.parseBody()) -} - -func TestInvalidUnmarshalRaw(t *testing.T) { - _, err := unmarshalEventRaw([]byte("Test \n Invalid \t Unmarshal")) - require.Error(t, err) - -} - -func TestUnmarshalRaw(t *testing.T) { - data, err := os.ReadFile(filepath.Join("testdata", "xmlSample.xml")) - require.NoError(t, err) - - event, err := unmarshalEventRaw(data) - require.NoError(t, err) - - raw := EventRaw{ - TimeCreated: TimeCreated{ - SystemTime: "2022-04-22T10:20:52.3778625Z", - }, - Level: "4", - Body: string(data), - } - - require.Equal(t, raw, event) -} diff --git a/pkg/stanza/operator/input/windows/subscription.go b/pkg/stanza/operator/input/windows/subscription.go index 77b6738c27d0..32bded038afe 100644 --- a/pkg/stanza/operator/input/windows/subscription.go +++ b/pkg/stanza/operator/input/windows/subscription.go @@ -16,10 +16,13 @@ import ( // Subscription is a subscription to a windows eventlog channel. type Subscription struct { handle uintptr + Server string } // Open will open the subscription handle. -func (s *Subscription) Open(channel string, startAt string, bookmark Bookmark) error { +// It returns an error if the subscription handle is already open or if any step in the process fails. +// If the remote server is not reachable, it returns an error indicating the failure. +func (s *Subscription) Open(startAt string, sessionHandle uintptr, channel string, bookmark Bookmark) error { if s.handle != 0 { return fmt.Errorf("subscription handle is already open") } @@ -38,7 +41,7 @@ func (s *Subscription) Open(channel string, startAt string, bookmark Bookmark) e } flags := s.createFlags(startAt, bookmark) - subscriptionHandle, err := evtSubscribe(0, signalEvent, channelPtr, nil, bookmark.handle, 0, 0, flags) + subscriptionHandle, err := evtSubscribeFunc(sessionHandle, signalEvent, channelPtr, nil, bookmark.handle, 0, 0, flags) if err != nil { return fmt.Errorf("failed to subscribe to %s channel: %w", channel, err) } @@ -61,10 +64,12 @@ func (s *Subscription) Close() error { return nil } +var errSubscriptionHandleNotOpen = errors.New("subscription handle is not open") + // Read will read events from the subscription. func (s *Subscription) Read(maxReads int) ([]Event, error) { if s.handle == 0 { - return nil, fmt.Errorf("subscription handle is not open") + return nil, errSubscriptionHandleNotOpen } if maxReads < 1 { @@ -105,9 +110,18 @@ func (s *Subscription) createFlags(startAt string, bookmark Bookmark) uint32 { return EvtSubscribeToFutureEvents } -// NewSubscription will create a new subscription with an empty handle. -func NewSubscription() Subscription { +// NewRemoteSubscription will create a new remote subscription with an empty handle. +func NewRemoteSubscription(server string) Subscription { + return Subscription{ + Server: server, + handle: 0, + } +} + +// NewLocalSubscription will create a new local subscription with an empty handle. +func NewLocalSubscription() Subscription { return Subscription{ + Server: "", handle: 0, } } diff --git a/pkg/stanza/operator/input/windows/xml.go b/pkg/stanza/operator/input/windows/xml.go index 859d72a0b527..18cfc65a0ccb 100644 --- a/pkg/stanza/operator/input/windows/xml.go +++ b/pkg/stanza/operator/input/windows/xml.go @@ -13,6 +13,7 @@ import ( // EventXML is the rendered xml of an event. type EventXML struct { + Original string `xml:"-"` EventID EventID `xml:"System>EventID"` Provider Provider `xml:"System>Provider"` Computer string `xml:"System>Computer"` @@ -34,18 +35,29 @@ type EventXML struct { } // parseTimestamp will parse the timestamp of the event. -func (e *EventXML) parseTimestamp() time.Time { - if timestamp, err := time.Parse(time.RFC3339Nano, e.TimeCreated.SystemTime); err == nil { +func parseTimestamp(ts string) time.Time { + if timestamp, err := time.Parse(time.RFC3339Nano, ts); err == nil { return timestamp } return time.Now() } // parseRenderedSeverity will parse the severity of the event. -func (e *EventXML) parseRenderedSeverity() entry.Severity { - switch e.RenderedLevel { +func parseSeverity(renderedLevel, level string) entry.Severity { + switch renderedLevel { case "": - return e.parseSeverity() + switch level { + case "1": + return entry.Fatal + case "2": + return entry.Error + case "3": + return entry.Warn + case "4": + return entry.Info + default: + return entry.Default + } case "Critical": return entry.Fatal case "Error": @@ -59,25 +71,9 @@ func (e *EventXML) parseRenderedSeverity() entry.Severity { } } -// parseSeverity will parse the severity of the event when RenderingInfo is not populated -func (e *EventXML) parseSeverity() entry.Severity { - switch e.Level { - case "1": - return entry.Fatal - case "2": - return entry.Error - case "3": - return entry.Warn - case "4": - return entry.Info - default: - return entry.Default - } -} - -// parseBody will parse a body from the event. -func (e *EventXML) parseBody() map[string]any { - message, details := e.parseMessage() +// formattedBody will parse a body from the event. +func formattedBody(e *EventXML) map[string]any { + message, details := parseMessage(e.Channel, e.Message) level := e.RenderedLevel if level == "" { @@ -139,12 +135,12 @@ func (e *EventXML) parseBody() map[string]any { } // parseMessage will attempt to parse a message into a message and details -func (e *EventXML) parseMessage() (string, map[string]any) { - switch e.Channel { +func parseMessage(channel, message string) (string, map[string]any) { + switch channel { case "Security": - return parseSecurity(e.Message) + return parseSecurity(message) default: - return e.Message, nil + return message, nil } } @@ -175,15 +171,6 @@ func parseEventData(eventData EventData) map[string]any { return outputMap } -// unmarshalEventXML will unmarshal EventXML from xml bytes. -func unmarshalEventXML(bytes []byte) (EventXML, error) { - var eventXML EventXML - if err := xml.Unmarshal(bytes, &eventXML); err != nil { - return EventXML{}, fmt.Errorf("failed to unmarshal xml bytes into event: %w (%s)", err, string(bytes)) - } - return eventXML, nil -} - // EventID is the identifier of the event. type EventID struct { Qualifiers uint16 `xml:"Qualifiers,attr"` @@ -262,3 +249,13 @@ func (e Execution) asMap() map[string]any { return result } + +// unmarshalEventXML will unmarshal EventXML from xml bytes. +func unmarshalEventXML(bytes []byte) (*EventXML, error) { + var eventXML EventXML + if err := xml.Unmarshal(bytes, &eventXML); err != nil { + return nil, fmt.Errorf("failed to unmarshal xml bytes into event: %w (%s)", err, string(bytes)) + } + eventXML.Original = string(bytes) + return &eventXML, nil +} diff --git a/pkg/stanza/operator/input/windows/xml_test.go b/pkg/stanza/operator/input/windows/xml_test.go index 734ccc881b69..313a09f15101 100644 --- a/pkg/stanza/operator/input/windows/xml_test.go +++ b/pkg/stanza/operator/input/windows/xml_test.go @@ -15,53 +15,33 @@ import ( ) func TestParseValidTimestamp(t *testing.T) { - xml := EventXML{ - TimeCreated: TimeCreated{ - SystemTime: "2020-07-30T01:01:01.123456789Z", - }, - } - timestamp := xml.parseTimestamp() + timestamp := parseTimestamp("2020-07-30T01:01:01.123456789Z") expected, _ := time.Parse(time.RFC3339Nano, "2020-07-30T01:01:01.123456789Z") require.Equal(t, expected, timestamp) } func TestParseInvalidTimestamp(t *testing.T) { - xml := EventXML{ - TimeCreated: TimeCreated{ - SystemTime: "invalid", - }, - } - timestamp := xml.parseTimestamp() + timestamp := parseTimestamp("invalid") require.Equal(t, time.Now().Year(), timestamp.Year()) require.Equal(t, time.Now().Month(), timestamp.Month()) require.Equal(t, time.Now().Day(), timestamp.Day()) } func TestParseSeverity(t *testing.T) { - xmlRenderedCritical := EventXML{RenderedLevel: "Critical"} - xmlRenderedError := EventXML{RenderedLevel: "Error"} - xmlRenderedWarning := EventXML{RenderedLevel: "Warning"} - xmlRenderedInformation := EventXML{RenderedLevel: "Information"} - xmlRenderedUnknown := EventXML{RenderedLevel: "Unknown"} - xmlCritical := EventXML{Level: "1"} - xmlError := EventXML{Level: "2"} - xmlWarning := EventXML{Level: "3"} - xmlInformation := EventXML{Level: "4"} - xmlUnknown := EventXML{Level: "0"} - require.Equal(t, entry.Fatal, xmlRenderedCritical.parseRenderedSeverity()) - require.Equal(t, entry.Error, xmlRenderedError.parseRenderedSeverity()) - require.Equal(t, entry.Warn, xmlRenderedWarning.parseRenderedSeverity()) - require.Equal(t, entry.Info, xmlRenderedInformation.parseRenderedSeverity()) - require.Equal(t, entry.Default, xmlRenderedUnknown.parseRenderedSeverity()) - require.Equal(t, entry.Fatal, xmlCritical.parseRenderedSeverity()) - require.Equal(t, entry.Error, xmlError.parseRenderedSeverity()) - require.Equal(t, entry.Warn, xmlWarning.parseRenderedSeverity()) - require.Equal(t, entry.Info, xmlInformation.parseRenderedSeverity()) - require.Equal(t, entry.Default, xmlUnknown.parseRenderedSeverity()) + require.Equal(t, entry.Fatal, parseSeverity("Critical", "")) + require.Equal(t, entry.Error, parseSeverity("Error", "")) + require.Equal(t, entry.Warn, parseSeverity("Warning", "")) + require.Equal(t, entry.Info, parseSeverity("Information", "")) + require.Equal(t, entry.Default, parseSeverity("Unknown", "")) + require.Equal(t, entry.Fatal, parseSeverity("", "1")) + require.Equal(t, entry.Error, parseSeverity("", "2")) + require.Equal(t, entry.Warn, parseSeverity("", "3")) + require.Equal(t, entry.Info, parseSeverity("", "4")) + require.Equal(t, entry.Default, parseSeverity("", "0")) } func TestParseBody(t *testing.T) { - xml := EventXML{ + xml := &EventXML{ EventID: EventID{ ID: 1, Qualifiers: 2, @@ -118,11 +98,11 @@ func TestParseBody(t *testing.T) { }, } - require.Equal(t, expected, xml.parseBody()) + require.Equal(t, expected, formattedBody(xml)) } func TestParseBodySecurityExecution(t *testing.T) { - xml := EventXML{ + xml := &EventXML{ EventID: EventID{ ID: 1, Qualifiers: 2, @@ -193,7 +173,7 @@ func TestParseBodySecurityExecution(t *testing.T) { }, } - require.Equal(t, expected, xml.parseBody()) + require.Equal(t, expected, formattedBody(xml)) } func TestParseBodyFullExecution(t *testing.T) { @@ -203,7 +183,7 @@ func TestParseBodyFullExecution(t *testing.T) { userTime := uint(100) processorTime := uint(200) - xml := EventXML{ + xml := &EventXML{ EventID: EventID{ ID: 1, Qualifiers: 2, @@ -284,11 +264,11 @@ func TestParseBodyFullExecution(t *testing.T) { }, } - require.Equal(t, expected, xml.parseBody()) + require.Equal(t, expected, formattedBody(xml)) } func TestParseNoRendered(t *testing.T) { - xml := EventXML{ + xml := &EventXML{ EventID: EventID{ ID: 1, Qualifiers: 2, @@ -341,11 +321,11 @@ func TestParseNoRendered(t *testing.T) { }, } - require.Equal(t, expected, xml.parseBody()) + require.Equal(t, expected, formattedBody(xml)) } func TestParseBodySecurity(t *testing.T) { - xml := EventXML{ + xml := &EventXML{ EventID: EventID{ ID: 1, Qualifiers: 2, @@ -402,11 +382,11 @@ func TestParseBodySecurity(t *testing.T) { }, } - require.Equal(t, expected, xml.parseBody()) + require.Equal(t, expected, formattedBody(xml)) } func TestParseEventData(t *testing.T) { - xmlMap := EventXML{ + xmlMap := &EventXML{ EventData: EventData{ Name: "EVENT_DATA", Data: []Data{{Name: "name", Value: "value"}}, @@ -414,7 +394,7 @@ func TestParseEventData(t *testing.T) { }, } - parsed := xmlMap.parseBody() + parsed := formattedBody(xmlMap) expectedMap := map[string]any{ "name": "EVENT_DATA", "data": []any{ @@ -424,17 +404,18 @@ func TestParseEventData(t *testing.T) { } require.Equal(t, expectedMap, parsed["event_data"]) - xmlMixed := EventXML{ + xmlMixed := &EventXML{ EventData: EventData{ Data: []Data{{Name: "name", Value: "value"}, {Value: "no_name"}}, }, } - parsed = xmlMixed.parseBody() + parsed = formattedBody(xmlMixed) expectedSlice := map[string]any{ "data": []any{ map[string]any{"name": "value"}, - map[string]any{"": "no_name"}}, + map[string]any{"": "no_name"}, + }, } require.Equal(t, expectedSlice, parsed["event_data"]) } @@ -442,8 +423,8 @@ func TestParseEventData(t *testing.T) { func TestInvalidUnmarshal(t *testing.T) { _, err := unmarshalEventXML([]byte("Test \n Invalid \t Unmarshal")) require.Error(t, err) - } + func TestUnmarshalWithEventData(t *testing.T) { data, err := os.ReadFile(filepath.Join("testdata", "xmlSample.xml")) require.NoError(t, err) @@ -451,7 +432,7 @@ func TestUnmarshalWithEventData(t *testing.T) { event, err := unmarshalEventXML(data) require.NoError(t, err) - xml := EventXML{ + xml := &EventXML{ EventID: EventID{ ID: 16384, Qualifiers: 16384, @@ -476,9 +457,11 @@ func TestUnmarshalWithEventData(t *testing.T) { EventData: EventData{ Data: []Data{ {Name: "Time", Value: "2022-04-28T19:48:52Z"}, - {Name: "Source", Value: "RulesEngine"}}, + {Name: "Source", Value: "RulesEngine"}, + }, }, Keywords: []string{"0x80000000000000"}, + Original: string(data), } require.Equal(t, xml, event) @@ -491,7 +474,7 @@ func TestUnmarshalWithAnonymousEventDataEntries(t *testing.T) { event, err := unmarshalEventXML(data) require.NoError(t, err) - xml := EventXML{ + xml := &EventXML{ EventID: EventID{ ID: 8194, Qualifiers: 0, @@ -516,6 +499,7 @@ func TestUnmarshalWithAnonymousEventDataEntries(t *testing.T) { Keywords: []string{"0x80000000000000"}, Security: &Security{}, Execution: &Execution{}, + Original: string(data), } require.Equal(t, xml, event) @@ -528,7 +512,7 @@ func TestUnmarshalWithUserData(t *testing.T) { event, err := unmarshalEventXML(data) require.NoError(t, err) - xml := EventXML{ + xml := &EventXML{ EventID: EventID{ ID: 1102, }, @@ -554,6 +538,7 @@ func TestUnmarshalWithUserData(t *testing.T) { ProcessID: 1472, ThreadID: 7784, }, + Original: string(data), } require.Equal(t, xml, event) diff --git a/pkg/stanza/operator/operatortest/confmap.go b/pkg/stanza/operator/operatortest/confmap.go index f5ce8b4c9f31..dc237dfaa6ce 100644 --- a/pkg/stanza/operator/operatortest/confmap.go +++ b/pkg/stanza/operator/operatortest/confmap.go @@ -4,11 +4,9 @@ package operatortest // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/operatortest" import ( - "fmt" "testing" "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/confmap" "go.opentelemetry.io/collector/confmap/confmaptest" @@ -38,10 +36,10 @@ func (c ConfigUnmarshalTests) Run(t *testing.T) { t.Run(tc.Name, func(t *testing.T) { testConfMap, err := testConfMaps.Sub(tc.Name) require.NoError(t, err) - require.NotZero(t, len(testConfMap.AllKeys()), fmt.Sprintf("config not found: '%s'", tc.Name)) + require.NotEmpty(t, testConfMap.AllKeys(), "config not found: '%s'", tc.Name) cfg := newAnyOpConfig(c.DefaultConfig) - err = component.UnmarshalConfig(testConfMap, cfg) + err = testConfMap.Unmarshal(cfg) if tc.ExpectErr { require.Error(t, err) diff --git a/pkg/stanza/operator/output/drop/output_test.go b/pkg/stanza/operator/output/drop/output_test.go index 469a36752614..520dcfee6e4b 100644 --- a/pkg/stanza/operator/output/drop/output_test.go +++ b/pkg/stanza/operator/output/drop/output_test.go @@ -26,8 +26,7 @@ func TestBuildIvalid(t *testing.T) { set := componenttest.NewNopTelemetrySettings() set.Logger = nil _, err := cfg.Build(set) - require.Error(t, err) - require.Contains(t, err.Error(), "build context is missing a logger") + require.ErrorContains(t, err, "build context is missing a logger") } func TestProcess(t *testing.T) { @@ -38,5 +37,5 @@ func TestProcess(t *testing.T) { entry := entry.New() result := op.Process(context.Background(), entry) - require.Nil(t, result) + require.NoError(t, result) } diff --git a/pkg/stanza/operator/output/file/config.go b/pkg/stanza/operator/output/file/config.go index 510b95c49a7f..f27ac156fba8 100644 --- a/pkg/stanza/operator/output/file/config.go +++ b/pkg/stanza/operator/output/file/config.go @@ -5,7 +5,7 @@ package file // import "github.com/open-telemetry/opentelemetry-collector-contri import ( "fmt" - "html/template" + "text/template" "go.opentelemetry.io/collector/component" diff --git a/pkg/stanza/operator/output/file/output.go b/pkg/stanza/operator/output/file/output.go index 6f98c3a09196..157a0d3414ec 100644 --- a/pkg/stanza/operator/output/file/output.go +++ b/pkg/stanza/operator/output/file/output.go @@ -6,9 +6,9 @@ package file // import "github.com/open-telemetry/opentelemetry-collector-contri import ( "context" "encoding/json" - "html/template" "os" "sync" + "text/template" "go.uber.org/zap" @@ -31,7 +31,7 @@ type Output struct { // Start will open the output file. func (o *Output) Start(_ operator.Persister) error { var err error - o.file, err = os.OpenFile(o.path, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0600) + o.file, err = os.OpenFile(o.path, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0o600) if err != nil { return err } diff --git a/pkg/stanza/operator/parser/container/config.go b/pkg/stanza/operator/parser/container/config.go index 39c279c3369f..81e6f2339be9 100644 --- a/pkg/stanza/operator/parser/container/config.go +++ b/pkg/stanza/operator/parser/container/config.go @@ -7,8 +7,9 @@ import ( "fmt" "sync" - jsoniter "github.com/json-iterator/go" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/featuregate" + "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/entry" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/errors" @@ -18,9 +19,17 @@ import ( ) const ( - operatorType = "container" - recombineSourceIdentifier = "log.file.path" - recombineIsLastEntry = "attributes.logtag == 'F'" + operatorType = "container" + recombineSourceIdentifier = "log.file.path" + recombineIsLastEntry = "attributes.logtag == 'F'" + removeOriginalTimeFieldFeatureFlag = "filelog.container.removeOriginalTimeField" +) + +var removeOriginalTimeField = featuregate.GlobalRegistry().MustRegister( + removeOriginalTimeFieldFeatureFlag, + featuregate.StageBeta, + featuregate.WithRegisterDescription("When enabled, deletes the original `time` field from the Log Attributes. Time is parsed to Timestamp field, which should be used instead."), + featuregate.WithRegisterReferenceURL("https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/33389"), ) func init() { @@ -58,14 +67,6 @@ func (c Config) Build(set component.TelemetrySettings) (operator.Operator, error return nil, err } - cLogEmitter := helper.NewLogEmitter(set) - recombineParser, err := createRecombine(set, c, cLogEmitter) - if err != nil { - return nil, fmt.Errorf("failed to create internal recombine config: %w", err) - } - - wg := sync.WaitGroup{} - if c.Format != "" { switch c.Format { case dockerFormat, crioFormat, containerdFormat: @@ -78,15 +79,32 @@ func (c Config) Build(set component.TelemetrySettings) (operator.Operator, error } } + if !removeOriginalTimeField.IsEnabled() { + // https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/33389 + set.Logger.Info("`time` log record attribute will be removed in a future release. Switch now using the feature gate.", + zap.String("attribute", "time"), + zap.String("feature gate", removeOriginalTimeFieldFeatureFlag), + ) + } + + wg := sync.WaitGroup{} + p := &Parser{ ParserOperator: parserOperator, - recombineParser: recombineParser, - json: jsoniter.ConfigFastest, format: c.Format, addMetadataFromFilepath: c.AddMetadataFromFilePath, - crioLogEmitter: cLogEmitter, criConsumers: &wg, } + + cLogEmitter := helper.NewLogEmitter(set, p.consumeEntries) + p.criLogEmitter = cLogEmitter + recombineParser, err := createRecombine(set, c, cLogEmitter) + if err != nil { + return nil, fmt.Errorf("failed to create internal recombine config: %w", err) + } + + p.recombineParser = recombineParser + return p, nil } diff --git a/pkg/stanza/operator/parser/container/parser.go b/pkg/stanza/operator/parser/container/parser.go index 384097c53283..4e111360d3fb 100644 --- a/pkg/stanza/operator/parser/container/parser.go +++ b/pkg/stanza/operator/parser/container/parser.go @@ -12,7 +12,7 @@ import ( "sync" "time" - jsoniter "github.com/json-iterator/go" + "github.com/goccy/go-json" "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/timeutils" @@ -21,17 +21,19 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper" ) -const dockerFormat = "docker" -const crioFormat = "crio" -const containerdFormat = "containerd" -const recombineInternalID = "recombine_container_internal" -const dockerPattern = "^\\{" -const crioPattern = "^(?P
Windows Server 2003 Deployment Kit. - //The counter type constants are defined in Winperf.h. + // Counter type. For a list of counter types, see the Counter Types section of the Windows Server 2003 Deployment Kit. + // The counter type constants are defined in Winperf.h. DwType uint32 - //Counter version information. Not used. + // Counter version information. Not used. CVersion uint32 - //Counter status that indicates if the counter value is valid. For a list of possible values, - //see Checking PDH Interface Return Values. + // Counter status that indicates if the counter value is valid. For a list of possible values, + // see Checking PDH Interface Return Values. CStatus uint32 - //Scale factor to use when computing the displayable value of the counter. The scale factor is a power of ten. - //The valid range of this parameter is PDH_MIN_SCALE (–7) (the returned value is the actual value times 10–⁷) to - //PDH_MAX_SCALE (+7) (the returned value is the actual value times 10⁺⁷). A value of zero will set the scale to one, so that the actual value is returned + // Scale factor to use when computing the displayable value of the counter. The scale factor is a power of ten. + // The valid range of this parameter is PDH_MIN_SCALE (–7) (the returned value is the actual value times 10–⁷) to + // PDH_MAX_SCALE (+7) (the returned value is the actual value times 10⁺⁷). A value of zero will set the scale to one, so that the actual value is returned LScale int32 - //Default scale factor as suggested by the counter's provider. + // Default scale factor as suggested by the counter's provider. LDefaultScale int32 - //The value passed in the dwUserData parameter when calling PdhAddCounter. + // The value passed in the dwUserData parameter when calling PdhAddCounter. DwUserData *uint32 - //The value passed in the dwUserData parameter when calling PdhOpenQuery. + // The value passed in the dwUserData parameter when calling PdhOpenQuery. DwQueryUserData *uint32 - //Null-terminated string that specifies the full counter path. The string follows this structure in memory. + // Null-terminated string that specifies the full counter path. The string follows this structure in memory. SzFullPath *uint16 // pointer to a string - //Null-terminated string that contains the name of the computer specified in the counter path. Is NULL, if the path does not specify a computer. - //The string follows this structure in memory. + // Null-terminated string that contains the name of the computer specified in the counter path. Is NULL, if the path does not specify a computer. + // The string follows this structure in memory. SzMachineName *uint16 // pointer to a string - //Null-terminated string that contains the name of the performance object specified in the counter path. The string follows this structure in memory. + // Null-terminated string that contains the name of the performance object specified in the counter path. The string follows this structure in memory. SzObjectName *uint16 // pointer to a string - //Null-terminated string that contains the name of the object instance specified in the counter path. Is NULL, if the path does not specify an instance. - //The string follows this structure in memory. + // Null-terminated string that contains the name of the object instance specified in the counter path. Is NULL, if the path does not specify an instance. + // The string follows this structure in memory. SzInstanceName *uint16 // pointer to a string - //Null-terminated string that contains the name of the parent instance specified in the counter path. Is NULL, if the path does not specify a parent instance. - //The string follows this structure in memory. + // Null-terminated string that contains the name of the parent instance specified in the counter path. Is NULL, if the path does not specify a parent instance. + // The string follows this structure in memory. SzParentInstance *uint16 // pointer to a string - //Instance index specified in the counter path. Is 0, if the path does not specify an instance index. + // Instance index specified in the counter path. Is 0, if the path does not specify an instance index. DwInstanceIndex uint32 // pointer to a string - //Null-terminated string that contains the counter name. The string follows this structure in memory. + // Null-terminated string that contains the counter name. The string follows this structure in memory. SzCounterName *uint16 // pointer to a string - //padding + // padding Padding [4]byte - //Help text that describes the counter. Is NULL if the source is a log file. + // Help text that describes the counter. Is NULL if the source is a log file. SzExplainText *uint16 // pointer to a string - //Start of the string data that is appended to the structure. + // Start of the string data that is appended to the structure. DataBuffer [1]uint32 // pointer to an extra space } diff --git a/pkg/winperfcounters/internal/third_party/telegraf/win_perf_counters/pdh_amd64.go b/pkg/winperfcounters/internal/third_party/telegraf/win_perf_counters/pdh_amd64.go index 2c2599880e65..30c64b3d71e9 100644 --- a/pkg/winperfcounters/internal/third_party/telegraf/win_perf_counters/pdh_amd64.go +++ b/pkg/winperfcounters/internal/third_party/telegraf/win_perf_counters/pdh_amd64.go @@ -70,45 +70,45 @@ type PDH_FMT_COUNTERVALUE_ITEM_LONG struct { // PDH_COUNTER_INFO structure contains information describing the properties of a counter. This information also includes the counter path. type PDH_COUNTER_INFO struct { - //Size of the structure, including the appended strings, in bytes. + // Size of the structure, including the appended strings, in bytes. DwLength uint32 - //Counter type. For a list of counter types, see the Counter Types section of the Windows Server 2003 Deployment Kit. - //The counter type constants are defined in Winperf.h. + // Counter type. For a list of counter types, see the Counter Types section of the Windows Server 2003 Deployment Kit. + // The counter type constants are defined in Winperf.h. DwType uint32 - //Counter version information. Not used. + // Counter version information. Not used. CVersion uint32 - //Counter status that indicates if the counter value is valid. For a list of possible values, - //see Checking PDH Interface Return Values. + // Counter status that indicates if the counter value is valid. For a list of possible values, + // see Checking PDH Interface Return Values. CStatus uint32 - //Scale factor to use when computing the displayable value of the counter. The scale factor is a power of ten. - //The valid range of this parameter is PDH_MIN_SCALE (–7) (the returned value is the actual value times 10–⁷) to - //PDH_MAX_SCALE (+7) (the returned value is the actual value times 10⁺⁷). A value of zero will set the scale to one, so that the actual value is returned + // Scale factor to use when computing the displayable value of the counter. The scale factor is a power of ten. + // The valid range of this parameter is PDH_MIN_SCALE (–7) (the returned value is the actual value times 10–⁷) to + // PDH_MAX_SCALE (+7) (the returned value is the actual value times 10⁺⁷). A value of zero will set the scale to one, so that the actual value is returned LScale int32 - //Default scale factor as suggested by the counter's provider. + // Default scale factor as suggested by the counter's provider. LDefaultScale int32 - //The value passed in the dwUserData parameter when calling PdhAddCounter. + // The value passed in the dwUserData parameter when calling PdhAddCounter. DwUserData *uint32 - //The value passed in the dwUserData parameter when calling PdhOpenQuery. + // The value passed in the dwUserData parameter when calling PdhOpenQuery. DwQueryUserData *uint32 - //Null-terminated string that specifies the full counter path. The string follows this structure in memory. + // Null-terminated string that specifies the full counter path. The string follows this structure in memory. SzFullPath *uint16 // pointer to a string - //Null-terminated string that contains the name of the computer specified in the counter path. Is NULL, if the path does not specify a computer. - //The string follows this structure in memory. + // Null-terminated string that contains the name of the computer specified in the counter path. Is NULL, if the path does not specify a computer. + // The string follows this structure in memory. SzMachineName *uint16 // pointer to a string - //Null-terminated string that contains the name of the performance object specified in the counter path. The string follows this structure in memory. + // Null-terminated string that contains the name of the performance object specified in the counter path. The string follows this structure in memory. SzObjectName *uint16 // pointer to a string - //Null-terminated string that contains the name of the object instance specified in the counter path. Is NULL, if the path does not specify an instance. - //The string follows this structure in memory. + // Null-terminated string that contains the name of the object instance specified in the counter path. Is NULL, if the path does not specify an instance. + // The string follows this structure in memory. SzInstanceName *uint16 // pointer to a string - //Null-terminated string that contains the name of the parent instance specified in the counter path. Is NULL, if the path does not specify a parent instance. - //The string follows this structure in memory. + // Null-terminated string that contains the name of the parent instance specified in the counter path. Is NULL, if the path does not specify a parent instance. + // The string follows this structure in memory. SzParentInstance *uint16 // pointer to a string - //Instance index specified in the counter path. Is 0, if the path does not specify an instance index. + // Instance index specified in the counter path. Is 0, if the path does not specify an instance index. DwInstanceIndex uint32 // pointer to a string - //Null-terminated string that contains the counter name. The string follows this structure in memory. + // Null-terminated string that contains the counter name. The string follows this structure in memory. SzCounterName *uint16 // pointer to a string - //Help text that describes the counter. Is NULL if the source is a log file. + // Help text that describes the counter. Is NULL if the source is a log file. SzExplainText *uint16 // pointer to a string - //Start of the string data that is appended to the structure. + // Start of the string data that is appended to the structure. DataBuffer [1]uint32 // pointer to an extra space } diff --git a/pkg/winperfcounters/internal/third_party/telegraf/win_perf_counters/performance_query.go b/pkg/winperfcounters/internal/third_party/telegraf/win_perf_counters/performance_query.go index 2b094737e862..5c075e14e001 100644 --- a/pkg/winperfcounters/internal/third_party/telegraf/win_perf_counters/performance_query.go +++ b/pkg/winperfcounters/internal/third_party/telegraf/win_perf_counters/performance_query.go @@ -225,7 +225,7 @@ func UTF16PtrToString(s *uint16) string { return string(utf16.Decode(slice)) } -// UTF16ToStringArray converts list of Windows API NULL terminated strings to go string array +// UTF16ToStringArray converts list of Windows API NULL terminated strings to go string array func UTF16ToStringArray(buf []uint16) []string { var strings []string nextLineStart := 0 diff --git a/pkg/winperfcounters/metadata.yaml b/pkg/winperfcounters/metadata.yaml index da5f44930b47..d481d25e4b0f 100644 --- a/pkg/winperfcounters/metadata.yaml +++ b/pkg/winperfcounters/metadata.yaml @@ -1,3 +1,3 @@ status: codeowners: - active: [dashpole, Mrod1598, BinaryFissionGames, alxbl] \ No newline at end of file + active: [dashpole, Mrod1598, alxbl, pjanotti] \ No newline at end of file diff --git a/pkg/winperfcounters/watcher.go b/pkg/winperfcounters/watcher.go index 16b1bfb02576..a38e5369c994 100644 --- a/pkg/winperfcounters/watcher.go +++ b/pkg/winperfcounters/watcher.go @@ -23,6 +23,8 @@ type PerfCounterWatcher interface { Path() string // ScrapeData collects a measurement and returns the value(s). ScrapeData() ([]CounterValue, error) + // Resets the perfcounter query. + Reset() error // Close all counters/handles related to the query and free all associated memory. Close() error } @@ -37,12 +39,7 @@ type perfCounter struct { // NewWatcher creates new PerfCounterWatcher by provided parts of its path. func NewWatcher(object, instance, counterName string) (PerfCounterWatcher, error) { - path := counterPath(object, instance, counterName) - counter, err := newPerfCounter(path, true) - if err != nil { - return nil, fmt.Errorf("failed to create perf counter with path %v: %w", path, err) - } - return counter, nil + return NewWatcherFromPath(counterPath(object, instance, counterName)) } // NewWatcherFromPath creates new PerfCounterWatcher by provided path. @@ -64,16 +61,31 @@ func counterPath(object, instance, counterName string) string { // newPerfCounter returns a new performance counter for the specified descriptor. func newPerfCounter(counterPath string, collectOnStartup bool) (*perfCounter, error) { + query, handle, err := initQuery(counterPath, collectOnStartup) + if err != nil { + return nil, err + } + + counter := &perfCounter{ + path: counterPath, + query: query, + handle: *handle, + } + + return counter, nil +} + +func initQuery(counterPath string, collectOnStartup bool) (*win_perf_counters.PerformanceQueryImpl, *win_perf_counters.PDH_HCOUNTER, error) { query := &win_perf_counters.PerformanceQueryImpl{} err := query.Open() if err != nil { - return nil, err + return nil, nil, err } var handle win_perf_counters.PDH_HCOUNTER handle, err = query.AddEnglishCounterToQuery(counterPath) if err != nil { - return nil, err + return nil, nil, err } // Some perf counters (e.g. cpu) return the usage stats since the last measure. @@ -81,17 +93,29 @@ func newPerfCounter(counterPath string, collectOnStartup bool) (*perfCounter, er if collectOnStartup { err = query.CollectData() if err != nil { - return nil, err + // Ignore PDH_NO_DATA error, it is expected when there are no + // matching instances. + var pdhErr *win_perf_counters.PdhError + if !errors.As(err, &pdhErr) || pdhErr.ErrorCode != win_perf_counters.PDH_NO_DATA { + return nil, nil, err + } } } - counter := &perfCounter{ - path: counterPath, - query: query, - handle: handle, - } + return query, &handle, nil +} - return counter, nil +// Reset re-creates the PerformanceCounter query and if the operation succeeds, closes the previous query. +// This is useful when scraping wildcard counters. +func (pc *perfCounter) Reset() error { + query, handle, err := initQuery(pc.path, true) + if err != nil { + return err + } + _ = pc.Close() + pc.query = query + pc.handle = *handle + return nil } func (pc *perfCounter) Close() error { @@ -105,16 +129,23 @@ func (pc *perfCounter) Path() string { func (pc *perfCounter) ScrapeData() ([]CounterValue, error) { if err := pc.query.CollectData(); err != nil { var pdhErr *win_perf_counters.PdhError - if !errors.As(err, &pdhErr) || pdhErr.ErrorCode != win_perf_counters.PDH_CALC_NEGATIVE_DENOMINATOR { + if !errors.As(err, &pdhErr) || (pdhErr.ErrorCode != win_perf_counters.PDH_NO_DATA && pdhErr.ErrorCode != win_perf_counters.PDH_CALC_NEGATIVE_DENOMINATOR) { return nil, fmt.Errorf("failed to collect data for performance counter '%s': %w", pc.path, err) } - // A counter rolled over, so the value is invalid - // See https://support.microfocus.com/kb/doc.php?id=7010545 - // Wait one second and retry once - time.Sleep(time.Second) - if retryErr := pc.query.CollectData(); retryErr != nil { - return nil, fmt.Errorf("failed retry for performance counter '%s': %w", pc.path, err) + if pdhErr.ErrorCode == win_perf_counters.PDH_NO_DATA { + // No data is available for the counter, so return an empty slice. + return nil, nil + } + + if pdhErr.ErrorCode == win_perf_counters.PDH_CALC_NEGATIVE_DENOMINATOR { + // A counter rolled over, so the value is invalid + // See https://support.microfocus.com/kb/doc.php?id=7010545 + // Wait one second and retry once + time.Sleep(time.Second) + if retryErr := pc.query.CollectData(); retryErr != nil { + return nil, fmt.Errorf("failed retry for performance counter '%s': %w", pc.path, err) + } } } @@ -123,7 +154,7 @@ func (pc *perfCounter) ScrapeData() ([]CounterValue, error) { return nil, fmt.Errorf("failed to format data for performance counter '%s': %w", pc.path, err) } - vals = removeTotalIfMultipleValues(vals) + vals = cleanupScrapedValues(vals) return vals, nil } @@ -132,24 +163,42 @@ func ExpandWildCardPath(counterPath string) ([]string, error) { return win_perf_counters.ExpandWildCardPath(counterPath) } -func removeTotalIfMultipleValues(vals []CounterValue) []CounterValue { +// cleanupScrapedValues handles instance name collisions and standardizes names. +// It cleans up the list in-place to avoid unnecessary copies. +func cleanupScrapedValues(vals []CounterValue) []CounterValue { if len(vals) == 0 { return vals } - if len(vals) == 1 { - // if there is only one item & the instance name is "_Total", clear the instance name - if vals[0].InstanceName == totalInstanceName { - vals[0].InstanceName = "" - } + // If there is only one "_Total" instance, clear the instance name. + if len(vals) == 1 && vals[0].InstanceName == totalInstanceName { + vals[0].InstanceName = "" return vals } - // if there is more than one item, remove an item that has the instance name "_Total" - for i, val := range vals { - if val.InstanceName == totalInstanceName { - return removeItemAt(vals, i) + occurrences := map[string]int{} + totalIndex := -1 + + for i := range vals { + instanceName := vals[i].InstanceName + + if instanceName == totalInstanceName { + // Remember if a "_Total" instance was present. + totalIndex = i } + + if n, ok := occurrences[instanceName]; ok { + // Append indices to duplicate instance names. + occurrences[instanceName]++ + vals[i].InstanceName = fmt.Sprintf("%s#%d", instanceName, n) + } else { + occurrences[instanceName] = 1 + } + } + + // Remove the "_Total" instance, as it can be computed with a sum aggregation. + if totalIndex >= 0 { + return removeItemAt(vals, totalIndex) } return vals diff --git a/pkg/winperfcounters/watcher_test.go b/pkg/winperfcounters/watcher_test.go index 186bf519400f..72569a6339a7 100644 --- a/pkg/winperfcounters/watcher_test.go +++ b/pkg/winperfcounters/watcher_test.go @@ -108,6 +108,36 @@ func TestPerfCounter_Close(t *testing.T) { } } +func TestPerfCounter_NonExistentInstance_NoError(t *testing.T) { + pc, err := newPerfCounter(`\.NET CLR Memory(NonExistentInstance)\% Time in GC`, true) + require.NoError(t, err) + + data, err := pc.ScrapeData() + require.NoError(t, err) + + assert.Empty(t, data) +} + +func TestPerfCounter_Reset(t *testing.T) { + pc, err := newPerfCounter(`\Memory\Committed Bytes`, false) + require.NoError(t, err) + + path, handle, query := pc.Path(), pc.handle, pc.query + + err = pc.Reset() + + // new query is different instance of same counter. + require.NoError(t, err) + assert.NotEqual(t, handle, pc.handle) + assert.NotSame(t, query, pc.query) + assert.Equal(t, path, pc.Path()) + + err = query.Close() // previous query is closed + if assert.Error(t, err) { + assert.Equal(t, "uninitialised query", err.Error()) + } +} + func TestPerfCounter_ScrapeData(t *testing.T) { type testCase struct { name string @@ -128,7 +158,7 @@ func TestPerfCounter_ScrapeData(t *testing.T) { name: "total instance", path: `\LogicalDisk(_Total)\Free Megabytes`, assertExpected: func(t *testing.T, data []CounterValue) { - assert.Equal(t, 1, len(data)) + assert.Len(t, data, 1) assert.Empty(t, data[0].InstanceName) }, }, @@ -156,3 +186,142 @@ func TestPerfCounter_ScrapeData(t *testing.T) { }) } } + +func Test_InstanceNameIndexing(t *testing.T) { + type testCase struct { + name string + vals []CounterValue + expected []CounterValue + } + + testCases := []testCase{ + { + name: "Multiple distinct instances", + vals: []CounterValue{ + { + InstanceName: "A", + Value: 1.0, + }, + { + InstanceName: "B", + Value: 1.0, + }, + { + InstanceName: "C", + Value: 1.0, + }, + }, + expected: []CounterValue{ + { + InstanceName: "A", + Value: 1.0, + }, + { + InstanceName: "B", + Value: 1.0, + }, + { + InstanceName: "C", + Value: 1.0, + }, + }, + }, + { + name: "Single repeated instance name", + vals: []CounterValue{ + { + InstanceName: "A", + Value: 1.0, + }, + { + InstanceName: "A", + Value: 1.0, + }, + { + InstanceName: "A", + Value: 1.0, + }, + }, + expected: []CounterValue{ + { + InstanceName: "A", + Value: 1.0, + }, + { + InstanceName: "A#1", + Value: 1.0, + }, + { + InstanceName: "A#2", + Value: 1.0, + }, + }, + }, + { + name: "Multiple repeated instance name", + vals: []CounterValue{ + { + InstanceName: "A", + Value: 1.0, + }, + { + InstanceName: "B", + Value: 1.0, + }, + { + InstanceName: "A", + Value: 1.0, + }, + { + InstanceName: "B", + Value: 1.0, + }, + { + InstanceName: "B", + Value: 1.0, + }, + { + InstanceName: "C", + Value: 1.0, + }, + }, + expected: []CounterValue{ + { + InstanceName: "A", + Value: 1.0, + }, + { + InstanceName: "B", + Value: 1.0, + }, + { + InstanceName: "A#1", + Value: 1.0, + }, + { + InstanceName: "B#1", + Value: 1.0, + }, + { + InstanceName: "B#2", + Value: 1.0, + }, + { + InstanceName: "C", + Value: 1.0, + }, + }, + }, + } + + for _, test := range testCases { + actual := cleanupScrapedValues(test.vals) + t.Run(test.name, func(t *testing.T) { + compareCounterValues(t, test.expected, actual) + }) + } +} + +func compareCounterValues(t *testing.T, expected []CounterValue, actual []CounterValue) { + assert.EqualValues(t, expected, actual) +} diff --git a/processor/attributesprocessor/README.md b/processor/attributesprocessor/README.md index eaa312a98710..f70818718dc2 100644 --- a/processor/attributesprocessor/README.md +++ b/processor/attributesprocessor/README.md @@ -4,14 +4,15 @@ | Status | | | ------------- |-----------| | Stability | [beta]: traces, metrics, logs | -| Distributions | [core], [contrib] | +| Distributions | [core], [contrib], [k8s] | | Warnings | [Identity Conflict](#warnings) | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aprocessor%2Fattributes%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aprocessor%2Fattributes) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aprocessor%2Fattributes%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aprocessor%2Fattributes) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@boostchicken](https://www.github.com/boostchicken) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [core]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s The attributes processor modifies attributes of a span, log, or metric. Please refer to @@ -59,10 +60,12 @@ For the actions `insert`, `update` and `upsert`, action: {insert, update, upsert} # FromContext specifies the context value to use to populate the attribute value. # If the key is prefixed with `metadata.`, the values are searched - # in the receiver's transport protocol additional information like gRPC Metadata or HTTP Headers. + # in the receiver's transport protocol additional information like gRPC Metadata or HTTP Headers + # (be sure to set `include_metadata: true` on the receiver). # If the key is prefixed with `auth.`, the values are searched - # in the authentication information set by the server authenticator. + # in the authentication information set by the server authenticator. # Refer to the server authenticator's documentation part of your pipeline for more information about which attributes are available. + # If the key is `client.address`, the value will be set to the client address. # If the key doesn't exist, no action is performed. # If the key has multiple values the values will be joined with `;` separator. from_context: @@ -190,8 +193,8 @@ must be specified with a non-empty value for a valid configuration. The `log_bod - For logs, one of `log_bodies`, `log_severity_texts`, `log_severity_number`, `attributes`, `resources` or `libraries` must be specified with a non-empty value for a valid configuration. The `span_names`, `span_kinds`, `metric_names` and `services` fields are invalid. -- For metrics, one of `metric_names` or `resources` must be specified with a valid non-empty value for -a valid configuration. The `span_names`, `span_kinds`, `log_bodies`, `log_severity_texts`, +- For metrics, `metric_names` must be specified with a valid non-empty value for +a valid configuration. The `span_names`, `span_kinds`, `resources`, `log_bodies`, `log_severity_texts`, `log_severity_number`, `services`, `attributes` and `libraries` fields are invalid. diff --git a/processor/attributesprocessor/attributes_log.go b/processor/attributesprocessor/attributes_log.go index 7b7e9659d93c..310f64f7e196 100644 --- a/processor/attributesprocessor/attributes_log.go +++ b/processor/attributesprocessor/attributes_log.go @@ -44,7 +44,7 @@ func (a *logAttributesProcessor) processLogs(ctx context.Context, ld plog.Logs) for k := 0; k < logs.Len(); k++ { lr := logs.At(k) if a.skipExpr != nil { - skip, err := a.skipExpr.Eval(ctx, ottllog.NewTransformContext(lr, library, resource)) + skip, err := a.skipExpr.Eval(ctx, ottllog.NewTransformContext(lr, library, resource, ils, rs)) if err != nil { return ld, err } diff --git a/processor/attributesprocessor/attributes_log_test.go b/processor/attributesprocessor/attributes_log_test.go index cab02f936e5d..5d1a1d14f562 100644 --- a/processor/attributesprocessor/attributes_log_test.go +++ b/processor/attributesprocessor/attributes_log_test.go @@ -80,8 +80,8 @@ func TestLogProcessor_NilEmptyData(t *testing.T) { {Key: "attribute1", Action: attraction.DELETE}, } - tp, err := factory.CreateLogsProcessor( - context.Background(), processortest.NewNopCreateSettings(), oCfg, consumertest.NewNop()) + tp, err := factory.CreateLogs( + context.Background(), processortest.NewNopSettings(), oCfg, consumertest.NewNop()) require.NoError(t, err) require.NotNil(t, tp) for i := range testCases { @@ -136,7 +136,7 @@ func TestAttributes_FilterLogs(t *testing.T) { } oCfg.Include = &filterconfig.MatchProperties{ Resources: []filterconfig.Attribute{{Key: "name", Value: "^[^i].*"}}, - //Libraries: []filterconfig.InstrumentationLibrary{{Name: "^[^i].*"}}, + // Libraries: []filterconfig.InstrumentationLibrary{{Name: "^[^i].*"}}, Config: *createConfig(filterset.Regexp), } oCfg.Exclude = &filterconfig.MatchProperties{ @@ -145,7 +145,7 @@ func TestAttributes_FilterLogs(t *testing.T) { }, Config: *createConfig(filterset.Strict), } - tp, err := factory.CreateLogsProcessor(context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + tp, err := factory.CreateLogs(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) require.NoError(t, err) require.NotNil(t, tp) @@ -208,7 +208,7 @@ func TestAttributes_FilterLogsByNameStrict(t *testing.T) { Resources: []filterconfig.Attribute{{Key: "name", Value: "dont_apply"}}, Config: *createConfig(filterset.Strict), } - tp, err := factory.CreateLogsProcessor(context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + tp, err := factory.CreateLogs(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) require.NoError(t, err) require.NotNil(t, tp) @@ -271,7 +271,7 @@ func TestAttributes_FilterLogsByNameRegexp(t *testing.T) { Resources: []filterconfig.Attribute{{Key: "name", Value: ".*dont_apply$"}}, Config: *createConfig(filterset.Regexp), } - tp, err := factory.CreateLogsProcessor(context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + tp, err := factory.CreateLogs(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) require.NoError(t, err) require.NotNil(t, tp) @@ -330,7 +330,7 @@ func TestLogAttributes_Hash(t *testing.T) { {Key: "user.authenticated", Action: attraction.HASH}, } - tp, err := factory.CreateLogsProcessor(context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + tp, err := factory.CreateLogs(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) require.NoError(t, err) require.NotNil(t, tp) @@ -406,7 +406,7 @@ func TestLogAttributes_Convert(t *testing.T) { {Key: "to.string", Action: attraction.CONVERT, ConvertedType: "string"}, } - tp, err := factory.CreateLogsProcessor(context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + tp, err := factory.CreateLogs(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) require.NoError(t, err) require.NotNil(t, tp) @@ -451,7 +451,7 @@ func BenchmarkAttributes_FilterLogsByName(b *testing.B) { Config: *createConfig(filterset.Regexp), Resources: []filterconfig.Attribute{{Key: "name", Value: "^apply.*"}}, } - tp, err := factory.CreateLogsProcessor(context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + tp, err := factory.CreateLogs(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) require.NoError(b, err) require.NotNil(b, tp) diff --git a/processor/attributesprocessor/attributes_metric.go b/processor/attributesprocessor/attributes_metric.go index 72a4d9d03fcf..3ae4afa77319 100644 --- a/processor/attributesprocessor/attributes_metric.go +++ b/processor/attributesprocessor/attributes_metric.go @@ -44,7 +44,7 @@ func (a *metricAttributesProcessor) processMetrics(ctx context.Context, md pmetr for k := 0; k < metrics.Len(); k++ { m := metrics.At(k) if a.skipExpr != nil { - skip, err := a.skipExpr.Eval(ctx, ottlmetric.NewTransformContext(m, metrics, scope, resource)) + skip, err := a.skipExpr.Eval(ctx, ottlmetric.NewTransformContext(m, metrics, scope, resource, ils, rs)) if err != nil { return md, err } @@ -62,7 +62,6 @@ func (a *metricAttributesProcessor) processMetrics(ctx context.Context, md pmetr // Attributes are provided for each log and trace, but not at the metric level // Need to process attributes for every data point within a metric. func (a *metricAttributesProcessor) processMetricAttributes(ctx context.Context, m pmetric.Metric) { - // This is a lot of repeated code, but since there is no single parent superclass // between metric data types, we can't use polymorphism. //exhaustive:enforce diff --git a/processor/attributesprocessor/attributes_metric_test.go b/processor/attributesprocessor/attributes_metric_test.go index 3fc5f7f09d98..c8b0f49414f4 100644 --- a/processor/attributesprocessor/attributes_metric_test.go +++ b/processor/attributesprocessor/attributes_metric_test.go @@ -88,7 +88,7 @@ func TestMetricProcessor_NilEmptyData(t *testing.T) { {Key: "attribute1", Action: attraction.DELETE}, } - mp, err := factory.CreateMetricsProcessor(context.Background(), processortest.NewNopCreateSettings(), oCfg, consumertest.NewNop()) + mp, err := factory.CreateMetrics(context.Background(), processortest.NewNopSettings(), oCfg, consumertest.NewNop()) require.NoError(t, err) require.NotNil(t, mp) for i := range metricTestCases { @@ -152,7 +152,7 @@ func TestAttributes_FilterMetrics(t *testing.T) { }, Config: *createConfig(filterset.Strict), } - mp, err := factory.CreateMetricsProcessor(context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + mp, err := factory.CreateMetrics(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) require.NoError(t, err) require.NotNil(t, mp) @@ -216,7 +216,7 @@ func TestAttributes_FilterMetricsByNameStrict(t *testing.T) { Resources: []filterconfig.Attribute{{Key: "name", Value: "dont_apply"}}, Config: *createConfig(filterset.Strict), } - mp, err := factory.CreateMetricsProcessor(context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + mp, err := factory.CreateMetrics(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) require.NoError(t, err) require.NotNil(t, mp) @@ -280,7 +280,7 @@ func TestAttributes_FilterMetricsByNameRegexp(t *testing.T) { Resources: []filterconfig.Attribute{{Key: "name", Value: ".*dont_apply$"}}, Config: *createConfig(filterset.Regexp), } - mp, err := factory.CreateMetricsProcessor(context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + mp, err := factory.CreateMetrics(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) require.NoError(t, err) require.NotNil(t, mp) @@ -339,7 +339,7 @@ func TestMetricAttributes_Hash(t *testing.T) { {Key: "user.authenticated", Action: attraction.HASH}, } - mp, err := factory.CreateMetricsProcessor(context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + mp, err := factory.CreateMetrics(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) require.NoError(t, err) require.NotNil(t, mp) @@ -347,6 +347,7 @@ func TestMetricAttributes_Hash(t *testing.T) { runIndividualMetricTestCase(t, tc, mp) } } + func TestMetricAttributes_Convert(t *testing.T) { testCases := []metricTestCase{ { @@ -396,7 +397,7 @@ func TestMetricAttributes_Convert(t *testing.T) { {Key: "to.string", Action: attraction.CONVERT, ConvertedType: "string"}, } - tp, err := factory.CreateMetricsProcessor(context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + tp, err := factory.CreateMetrics(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) require.NoError(t, err) require.NotNil(t, tp) @@ -441,7 +442,7 @@ func BenchmarkAttributes_FilterMetricsByName(b *testing.B) { Config: *createConfig(filterset.Regexp), Resources: []filterconfig.Attribute{{Key: "name", Value: "^apply.*"}}, } - mp, err := factory.CreateMetricsProcessor(context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + mp, err := factory.CreateMetrics(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) require.NoError(b, err) require.NotNil(b, mp) diff --git a/processor/attributesprocessor/attributes_trace.go b/processor/attributesprocessor/attributes_trace.go index 64aa73e524ba..c3d1b6fd4fc1 100644 --- a/processor/attributesprocessor/attributes_trace.go +++ b/processor/attributesprocessor/attributes_trace.go @@ -44,7 +44,7 @@ func (a *spanAttributesProcessor) processTraces(ctx context.Context, td ptrace.T for k := 0; k < spans.Len(); k++ { span := spans.At(k) if a.skipExpr != nil { - skip, err := a.skipExpr.Eval(ctx, ottlspan.NewTransformContext(span, scope, resource)) + skip, err := a.skipExpr.Eval(ctx, ottlspan.NewTransformContext(span, scope, resource, ils, rs)) if err != nil { return td, err } diff --git a/processor/attributesprocessor/attributes_trace_test.go b/processor/attributesprocessor/attributes_trace_test.go index 9ab14590fc6b..7cdb128ee6b7 100644 --- a/processor/attributesprocessor/attributes_trace_test.go +++ b/processor/attributesprocessor/attributes_trace_test.go @@ -90,7 +90,7 @@ func TestSpanProcessor_NilEmptyData(t *testing.T) { {Key: "attribute1", Action: attraction.DELETE}, } - tp, err := factory.CreateTracesProcessor(context.Background(), processortest.NewNopCreateSettings(), oCfg, consumertest.NewNop()) + tp, err := factory.CreateTraces(context.Background(), processortest.NewNopSettings(), oCfg, consumertest.NewNop()) require.NoError(t, err) require.NotNil(t, tp) for i := range testCases { @@ -157,7 +157,7 @@ func TestAttributes_FilterSpans(t *testing.T) { }, Config: *createConfig(filterset.Strict), } - tp, err := factory.CreateTracesProcessor(context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + tp, err := factory.CreateTraces(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) require.NoError(t, err) require.NotNil(t, tp) @@ -225,7 +225,7 @@ func TestAttributes_FilterSpansByNameStrict(t *testing.T) { SpanNames: []string{"dont_apply"}, Config: *createConfig(filterset.Strict), } - tp, err := factory.CreateTracesProcessor(context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + tp, err := factory.CreateTraces(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) require.NoError(t, err) require.NotNil(t, tp) @@ -293,7 +293,7 @@ func TestAttributes_FilterSpansByNameRegexp(t *testing.T) { SpanNames: []string{".*dont_apply$"}, Config: *createConfig(filterset.Regexp), } - tp, err := factory.CreateTracesProcessor(context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + tp, err := factory.CreateTraces(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) require.NoError(t, err) require.NotNil(t, tp) @@ -352,7 +352,7 @@ func TestAttributes_Hash(t *testing.T) { {Key: "user.authenticated", Action: attraction.HASH}, } - tp, err := factory.CreateTracesProcessor(context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + tp, err := factory.CreateTraces(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) require.NoError(t, err) require.NotNil(t, tp) @@ -455,7 +455,7 @@ func TestAttributes_Convert(t *testing.T) { {Key: "to.string", Action: attraction.CONVERT, ConvertedType: "string"}, } - tp, err := factory.CreateTracesProcessor(context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + tp, err := factory.CreateTraces(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) require.NoError(t, err) require.NotNil(t, tp) @@ -499,8 +499,8 @@ func BenchmarkAttributes_FilterSpansByName(b *testing.B) { oCfg.Include = &filterconfig.MatchProperties{ SpanNames: []string{"^apply.*"}, } - tp, err := factory.CreateTracesProcessor(context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) - require.Nil(b, err) + tp, err := factory.CreateTraces(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) + require.NoError(b, err) require.NotNil(b, tp) for _, tt := range testCases { diff --git a/processor/attributesprocessor/config_test.go b/processor/attributesprocessor/config_test.go index d2b3208db6bc..bb37cab77391 100644 --- a/processor/attributesprocessor/config_test.go +++ b/processor/attributesprocessor/config_test.go @@ -209,7 +209,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) diff --git a/processor/attributesprocessor/factory.go b/processor/attributesprocessor/factory.go index 069db38d0447..5844db4744d2 100644 --- a/processor/attributesprocessor/factory.go +++ b/processor/attributesprocessor/factory.go @@ -38,7 +38,7 @@ func createDefaultConfig() component.Config { func createTracesProcessor( ctx context.Context, - set processor.CreateSettings, + set processor.Settings, cfg component.Config, nextConsumer consumer.Traces, ) (processor.Traces, error) { @@ -51,7 +51,7 @@ func createTracesProcessor( if err != nil { return nil, err } - return processorhelper.NewTracesProcessor( + return processorhelper.NewTraces( ctx, set, cfg, @@ -62,7 +62,7 @@ func createTracesProcessor( func createLogsProcessor( ctx context.Context, - set processor.CreateSettings, + set processor.Settings, cfg component.Config, nextConsumer consumer.Logs, ) (processor.Logs, error) { @@ -77,7 +77,7 @@ func createLogsProcessor( return nil, err } - return processorhelper.NewLogsProcessor( + return processorhelper.NewLogs( ctx, set, cfg, @@ -88,11 +88,10 @@ func createLogsProcessor( func createMetricsProcessor( ctx context.Context, - set processor.CreateSettings, + set processor.Settings, cfg component.Config, nextConsumer consumer.Metrics, ) (processor.Metrics, error) { - oCfg := cfg.(*Config) attrProc, err := attraction.NewAttrProc(&oCfg.Settings) if err != nil { @@ -107,7 +106,7 @@ func createMetricsProcessor( return nil, err } - return processorhelper.NewMetricsProcessor( + return processorhelper.NewMetrics( ctx, set, cfg, diff --git a/processor/attributesprocessor/factory_test.go b/processor/attributesprocessor/factory_test.go index 193f2217c02f..c210ffd08a1d 100644 --- a/processor/attributesprocessor/factory_test.go +++ b/processor/attributesprocessor/factory_test.go @@ -26,7 +26,7 @@ func TestFactory_Type(t *testing.T) { func TestFactory_CreateDefaultConfig(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() - assert.Equal(t, cfg, &Config{}) + assert.Equal(t, &Config{}, cfg) assert.NoError(t, componenttest.CheckConfigStruct(cfg)) } @@ -36,7 +36,7 @@ func TestValidateConfig(t *testing.T) { assert.Error(t, component.ValidateConfig(cfg)) } -func TestFactoryCreateTracesProcessor_InvalidActions(t *testing.T) { +func TestFactoryCreateTraces_InvalidActions(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() oCfg := cfg.(*Config) @@ -44,20 +44,19 @@ func TestFactoryCreateTracesProcessor_InvalidActions(t *testing.T) { oCfg.Actions = []attraction.ActionKeyValue{ {Key: "", Value: 123, Action: attraction.UPSERT}, } - ap, err := factory.CreateTracesProcessor(context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + ap, err := factory.CreateTraces(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) assert.Error(t, err) assert.Nil(t, ap) // Invalid target type oCfg.Actions = []attraction.ActionKeyValue{ {Key: "http.status_code", ConvertedType: "array", Action: attraction.CONVERT}, } - ap2, err2 := factory.CreateTracesProcessor(context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) - assert.Error(t, err2) - assert.Equal(t, "error creating AttrProc due to invalid value \"array\" in field \"converted_type\" for action \"convert\" at the 0-th action", err2.Error()) + ap2, err2 := factory.CreateTraces(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) + require.EqualError(t, err2, "error creating AttrProc due to invalid value \"array\" in field \"converted_type\" for action \"convert\" at the 0-th action") assert.Nil(t, ap2) } -func TestFactoryCreateTracesProcessor(t *testing.T) { +func TestFactoryCreateTraces(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() oCfg := cfg.(*Config) @@ -65,26 +64,26 @@ func TestFactoryCreateTracesProcessor(t *testing.T) { {Key: "a key", Action: attraction.DELETE}, } - tp, err := factory.CreateTracesProcessor(context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + tp, err := factory.CreateTraces(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) assert.NotNil(t, tp) assert.NoError(t, err) oCfg.Actions = []attraction.ActionKeyValue{ {Action: attraction.DELETE}, } - tp, err = factory.CreateTracesProcessor(context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + tp, err = factory.CreateTraces(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) assert.Nil(t, tp) assert.Error(t, err) } -func TestFactory_CreateMetricsProcessor(t *testing.T) { +func TestFactory_CreateMetrics(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() cfg.(*Config).Actions = []attraction.ActionKeyValue{ {Key: "fake_key", Action: attraction.INSERT, Value: "100"}, } - mp, err := factory.CreateMetricsProcessor(context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + mp, err := factory.CreateMetrics(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) require.NotNil(t, mp) require.NoError(t, err) @@ -93,12 +92,12 @@ func TestFactory_CreateMetricsProcessor(t *testing.T) { } // Upsert should fail on non-existent key - mp, err = factory.CreateMetricsProcessor(context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + mp, err = factory.CreateMetrics(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) require.Nil(t, mp) require.Error(t, err) } -func TestFactoryCreateLogsProcessor_InvalidActions(t *testing.T) { +func TestFactoryCreateLogs_InvalidActions(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() oCfg := cfg.(*Config) @@ -106,12 +105,12 @@ func TestFactoryCreateLogsProcessor_InvalidActions(t *testing.T) { oCfg.Actions = []attraction.ActionKeyValue{ {Key: "", Value: 123, Action: attraction.UPSERT}, } - ap, err := factory.CreateLogsProcessor(context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + ap, err := factory.CreateLogs(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) assert.Error(t, err) assert.Nil(t, ap) } -func TestFactoryCreateLogsProcessor(t *testing.T) { +func TestFactoryCreateLogs(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() oCfg := cfg.(*Config) @@ -119,16 +118,16 @@ func TestFactoryCreateLogsProcessor(t *testing.T) { {Key: "a key", Action: attraction.DELETE}, } - tp, err := factory.CreateLogsProcessor( - context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + tp, err := factory.CreateLogs( + context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) assert.NotNil(t, tp) assert.NoError(t, err) oCfg.Actions = []attraction.ActionKeyValue{ {Action: attraction.DELETE}, } - tp, err = factory.CreateLogsProcessor( - context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + tp, err = factory.CreateLogs( + context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) assert.Nil(t, tp) assert.Error(t, err) } diff --git a/processor/attributesprocessor/generated_component_test.go b/processor/attributesprocessor/generated_component_test.go index 89488a2e703b..aba2ed0f1d46 100644 --- a/processor/attributesprocessor/generated_component_test.go +++ b/processor/attributesprocessor/generated_component_test.go @@ -33,27 +33,27 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsProcessor(ctx, set, cfg, consumertest.NewNop()) + createFn: func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg, consumertest.NewNop()) }, }, { name: "metrics", - createFn: func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsProcessor(ctx, set, cfg, consumertest.NewNop()) + createFn: func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg, consumertest.NewNop()) }, }, { name: "traces", - createFn: func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesProcessor(ctx, set, cfg, consumertest.NewNop()) + createFn: func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg, consumertest.NewNop()) }, }, } @@ -65,21 +65,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), processortest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), processortest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), processortest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), processortest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(processor.Logs) require.True(t, ok) diff --git a/processor/attributesprocessor/go.mod b/processor/attributesprocessor/go.mod index 361159158c6b..902a73a02bac 100644 --- a/processor/attributesprocessor/go.mod +++ b/processor/attributesprocessor/go.mod @@ -1,70 +1,83 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/processor v0.102.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/processor v0.116.0 + go.opentelemetry.io/collector/processor/processortest v0.116.0 + go.opentelemetry.io/collector/semconv v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) require ( github.com/alecthomas/participle/v2 v2.1.1 // indirect - github.com/beorn7/perks v1.0.1 // indirect + github.com/antchfx/xmlquery v1.4.2 // indirect + github.com/antchfx/xpath v1.3.2 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/elastic/go-grok v0.3.1 // indirect + github.com/elastic/lunes v0.1.0 // indirect github.com/expr-lang/expr v1.16.9 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gobwas/glob v0.2.3 // indirect + github.com/goccy/go-json v0.10.4 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect + github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/iancoleman/strcase v0.3.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect + github.com/magefile/mage v1.15.0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/pdata/testdata v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 // indirect + go.opentelemetry.io/collector/client v1.22.0 // indirect + go.opentelemetry.io/collector/component/componentstatus v0.116.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/testdata v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/processor/xprocessor v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/processor/attributesprocessor/go.sum b/processor/attributesprocessor/go.sum index 35e43e3367f4..4b1495e4f7d8 100644 --- a/processor/attributesprocessor/go.sum +++ b/processor/attributesprocessor/go.sum @@ -4,26 +4,38 @@ github.com/alecthomas/participle/v2 v2.1.1 h1:hrjKESvSqGHzRb4yW1ciisFJ4p3MGYih6i github.com/alecthomas/participle/v2 v2.1.1/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= -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/antchfx/xmlquery v1.4.2 h1:MZKd9+wblwxfQ1zd1AdrTsqVaMjMCwow3IqkCSe00KA= +github.com/antchfx/xmlquery v1.4.2/go.mod h1:QXhvf5ldTuGqhd1SHNvvtlhhdQLks4dD0awIVhXIDTA= +github.com/antchfx/xpath v1.3.2 h1:LNjzlsSjinu3bQpw9hWMY9ocB80oLOWuQqFvO6xt51U= +github.com/antchfx/xpath v1.3.2/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/elastic/go-grok v0.3.1 h1:WEhUxe2KrwycMnlvMimJXvzRa7DoByJB4PVUIE1ZD/U= +github.com/elastic/go-grok v0.3.1/go.mod h1:n38ls8ZgOboZRgKcjMY8eFeZFMmcL9n2lP0iHhIDk64= +github.com/elastic/lunes v0.1.0 h1:amRtLPjwkWtzDF/RKzcEPMvSsSseLDLW+bnhfNSLRe4= +github.com/elastic/lunes v0.1.0/go.mod h1:xGphYIt3XdZRtyWosHQTErsQTd4OP1p9wsbVoHelrd4= github.com/expr-lang/expr v1.16.9 h1:WUAzmR0JNI9JCiF0/ewwHB1gmcGw5wW7nWt8gc6PpCI= github.com/expr-lang/expr v1.16.9/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= +github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -31,6 +43,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= @@ -45,12 +59,14 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= +github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= @@ -62,54 +78,63 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 h1:SIKIoA4e/5Y9ZOl0DCe3eVMLPOQzJxgZpfdHHeauNTM= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6/go.mod h1:BUbeWZiieNxAuuADTBNb3/aeje6on3DhU3rpWsQSB1E= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/processor v0.102.0 h1:JsjTlpBRmoSYxcu3cAbKBchOmL6aNUxLa03ZkWIqZr8= -go.opentelemetry.io/collector/processor v0.102.0/go.mod h1:IaCSDcfy75uQTaOM+LgR1bMf/bUw2eFfzn20uvWYfLQ= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/processor v0.116.0 h1:Kyu4tPzTdWNHtZjcxvI/bGNAgyv8L8Kem2r/Mk4IDAw= +go.opentelemetry.io/collector/processor v0.116.0/go.mod h1:+/Ugy48RAxlZEXmN2cw51W8t5wdHS9No+GAoP+moskk= +go.opentelemetry.io/collector/processor/processortest v0.116.0 h1:+IqNEVEE0E2MsO2g7+Y/9dz35sDuvAXRXrLts9NdXrA= +go.opentelemetry.io/collector/processor/processortest v0.116.0/go.mod h1:DLaQDBxzgeeaUO0ULMn/efos9PmHZkmYCHuxwCsiVHI= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0 h1:iin/UwuWvSLB7ZNfINFUYbZ5lxIi1NjZ2brkyyFdiRA= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0/go.mod h1:cnA43/XpKDbaOmd8buqKp/LGJ2l/OoCqbR//u5DMfn8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -119,44 +144,64 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/processor/attributesprocessor/internal/metadata/generated_status.go b/processor/attributesprocessor/internal/metadata/generated_status.go index e2dfa8cb94e5..43a9445d0897 100644 --- a/processor/attributesprocessor/internal/metadata/generated_status.go +++ b/processor/attributesprocessor/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("attributes") + Type = component.MustNewType("attributes") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor" ) const ( diff --git a/processor/attributesprocessor/internal/metadata/generated_telemetry.go b/processor/attributesprocessor/internal/metadata/generated_telemetry.go deleted file mode 100644 index e9d8542ef687..000000000000 --- a/processor/attributesprocessor/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/attributes") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/attributes") -} diff --git a/processor/attributesprocessor/internal/metadata/generated_telemetry_test.go b/processor/attributesprocessor/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index d690a1855a66..000000000000 --- a/processor/attributesprocessor/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/attributes", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/attributes", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/processor/attributesprocessor/metadata.yaml b/processor/attributesprocessor/metadata.yaml index cd2e5bfb3ef6..17aa06b27561 100644 --- a/processor/attributesprocessor/metadata.yaml +++ b/processor/attributesprocessor/metadata.yaml @@ -1,13 +1,10 @@ type: attributes -scope_name: otelcol/attributes status: class: processor stability: beta: [traces, metrics, logs] - distributions: - - core - - contrib + distributions: [core, contrib, k8s] warnings: [Identity Conflict] codeowners: active: [boostchicken] diff --git a/processor/coralogixprocessor/Makefile b/processor/coralogixprocessor/Makefile new file mode 100644 index 000000000000..ded7a36092dc --- /dev/null +++ b/processor/coralogixprocessor/Makefile @@ -0,0 +1 @@ +include ../../Makefile.Common diff --git a/processor/coralogixprocessor/README.md b/processor/coralogixprocessor/README.md new file mode 100644 index 000000000000..7a165bab1c94 --- /dev/null +++ b/processor/coralogixprocessor/README.md @@ -0,0 +1,88 @@ +# Coralogix Processor + + +| Status | | +| ------------- |-----------| +| Stability | [development]: traces | +| Distributions | [] | +| Warnings | [Statefulness](#warnings) | +| Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aprocessor%2Fcoralogix%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aprocessor%2Fcoralogix) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aprocessor%2Fcoralogix%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aprocessor%2Fcoralogix) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@crobert-1](https://www.github.com/crobert-1), [@galrose](https://www.github.com/galrose) | + +[development]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#development + + +## Description + +The Coralogix processor adds attributes to spans that enable features in Coralogix. + +## Features + +### DB Statement Blueprints + +This feature enables the processor to create blueprints from SQL queries, this means replacing any variables with `?`. +The blueprint is also hashed to be able to be used with the spanmetrics connector. +Long queries can be an issue when being stored in certain metric stores. +Blueprints alleviate this problem by using the hash as the identifying dimension on the metric, which enables +users to query metrics by blueprints. + +The added attributes are `db.statement.blueprint` and `db.statement.blueprint.id`. + +* `db.statement.blueprint` contains the blueprinted version of the statement, we require them to be sent to Coralogix to + display your blueprinted statement +* `db.statement.blueprint.id` contains a hash of the statement, this way we can add it as a dimension in the spanmetrics + connector and use it to query your blueprints. +* `sampling.priority` if enabled contains the value 100 for new blueprints, further explanation below. + +#### Sampling + +If sampling is enabled then it stores the found blueprints in an in-memory cache to be able to send only new blueprints +that haven't been seen yet. +This only adds an attribute to the span named `sampling.priority`, if the blueprint is new then the sampling priority +will be `100`. + +Using this key it's possible to use either +the [Tail Sampler](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/tailsamplingprocessor) +or +the [Probabilistic Sampler](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/probabilisticsamplerprocessor) +to only send new blueprints to Coralogix. +If sampling is not enabled it won't cache anything and the `sampling.priority` attribute won't be added. + +The cache is limited by the `max_cache_size_mib` configuration, if the cache is full it will remove the oldest entries +to make space for new ones. +The cache stores hashes of the queries, each hash is 8 bytes, so the number of maximum cache entries is calculated +by `max_cache_size_mib * 1024 * 1024 / 8`. + +## Config + +* `db_statement_blueprints` + * `sampling`: + * `enabled`: (default: `false`) If enabled, adds the attribute `sampling.priority` with a value of `100` to spans with new + blueprints. + Refer to the [Sampling section](#sampling) for more information. + * `max_cache_size_mib` (default: `1024`) The size of the cache in mebibytes to store seen blueprints hashes. + +### Basic Setup + +This setup is without sampling meaning no `sampling.priority` attribute will be added to spans. +The cache will be disabled. + +```yaml +processors: + coralogix: + db_statement_blueprints: +``` + +### With Sampling Config + +This setup will enable the cache to store seen blueprints and add the `sampling.priority` attribute to spans with new +blueprints. + +```yaml +processors: + coralogix: + db_statement_blueprints: + sampling: + enabled: true + max_cache_size_mib: 1024 #1GiB + ``` \ No newline at end of file diff --git a/processor/coralogixprocessor/config.go b/processor/coralogixprocessor/config.go new file mode 100644 index 000000000000..fc5a576092d7 --- /dev/null +++ b/processor/coralogixprocessor/config.go @@ -0,0 +1,29 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package coralogixprocessor // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/coralogixprocessor" + +import "fmt" + +type samplingConfig struct { + enabled bool `mapstructure:"enabled"` + maxCacheSizeMib int64 `mapstructure:"max_cache_size_mib"` +} + +type databaseBlueprintsConfig struct { + sampling samplingConfig `mapstructure:"sampling"` +} + +type Config struct { + databaseBlueprintsConfig `mapstructure:"database_blueprints_config"` +} + +func (c *Config) Validate() error { + if c.databaseBlueprintsConfig.sampling.enabled && c.databaseBlueprintsConfig.sampling.maxCacheSizeMib <= 0 { + return fmt.Errorf("max_cache_size_mib must be a positive integer") + } + if c.databaseBlueprintsConfig.sampling.enabled && c.databaseBlueprintsConfig.sampling.maxCacheSizeMib != 0 { + return fmt.Errorf("max_cache_size_mib can only be defined when sampling is enabled") + } + return nil +} diff --git a/processor/coralogixprocessor/doc.go b/processor/coralogixprocessor/doc.go new file mode 100644 index 000000000000..66eb6cacd45f --- /dev/null +++ b/processor/coralogixprocessor/doc.go @@ -0,0 +1,6 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +//go:generate mdatagen metadata.yaml + +package coralogixprocessor // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/coralogixprocessor" diff --git a/processor/coralogixprocessor/factory.go b/processor/coralogixprocessor/factory.go new file mode 100644 index 000000000000..56262e9a0e0c --- /dev/null +++ b/processor/coralogixprocessor/factory.go @@ -0,0 +1,45 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package coralogixprocessor // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/coralogixprocessor" + +import ( + "context" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/consumer" + "go.opentelemetry.io/collector/processor" + + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/coralogixprocessor/internal/metadata" +) + +// NewFactory returns a new factory for the Span processor. +func NewFactory() processor.Factory { + return processor.NewFactory( + metadata.Type, + createDefaultConfig, + processor.WithTraces(createTracesProcessor, component.StabilityLevelDevelopment)) +} + +func createDefaultConfig() component.Config { + return &Config{} +} + +func createTracesProcessor( + ctx context.Context, + params processor.Settings, + baseCfg component.Config, + nextConsumer consumer.Traces, +) (processor.Traces, error) { + coralogixCfg := baseCfg.(*Config) + + coralogixProcessor, err := newCoralogixProcessor(ctx, + params, + coralogixCfg, + nextConsumer) + if err != nil { + return nil, err + } + + return coralogixProcessor, nil +} diff --git a/processor/coralogixprocessor/generated_component_test.go b/processor/coralogixprocessor/generated_component_test.go new file mode 100644 index 000000000000..c6e530533a5e --- /dev/null +++ b/processor/coralogixprocessor/generated_component_test.go @@ -0,0 +1,135 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package coralogixprocessor + +import ( + "context" + "testing" + "time" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/confmap/confmaptest" + "go.opentelemetry.io/collector/consumer/consumertest" + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/plog" + "go.opentelemetry.io/collector/pdata/pmetric" + "go.opentelemetry.io/collector/pdata/ptrace" + "go.opentelemetry.io/collector/processor" + "go.opentelemetry.io/collector/processor/processortest" +) + +func TestComponentFactoryType(t *testing.T) { + require.Equal(t, "coralogix", NewFactory().Type().String()) +} + +func TestComponentConfigStruct(t *testing.T) { + require.NoError(t, componenttest.CheckConfigStruct(NewFactory().CreateDefaultConfig())) +} + +func TestComponentLifecycle(t *testing.T) { + factory := NewFactory() + + tests := []struct { + name string + createFn func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) + }{ + + { + name: "traces", + createFn: func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg, consumertest.NewNop()) + }, + }, + } + + cm, err := confmaptest.LoadConf("metadata.yaml") + require.NoError(t, err) + cfg := factory.CreateDefaultConfig() + sub, err := cm.Sub("tests::config") + require.NoError(t, err) + require.NoError(t, sub.Unmarshal(&cfg)) + + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), processortest.NewNopSettings(), cfg) + require.NoError(t, err) + err = c.Shutdown(context.Background()) + require.NoError(t, err) + }) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), processortest.NewNopSettings(), cfg) + require.NoError(t, err) + host := componenttest.NewNopHost() + err = c.Start(context.Background(), host) + require.NoError(t, err) + require.NotPanics(t, func() { + switch tt.name { + case "logs": + e, ok := c.(processor.Logs) + require.True(t, ok) + logs := generateLifecycleTestLogs() + if !e.Capabilities().MutatesData { + logs.MarkReadOnly() + } + err = e.ConsumeLogs(context.Background(), logs) + case "metrics": + e, ok := c.(processor.Metrics) + require.True(t, ok) + metrics := generateLifecycleTestMetrics() + if !e.Capabilities().MutatesData { + metrics.MarkReadOnly() + } + err = e.ConsumeMetrics(context.Background(), metrics) + case "traces": + e, ok := c.(processor.Traces) + require.True(t, ok) + traces := generateLifecycleTestTraces() + if !e.Capabilities().MutatesData { + traces.MarkReadOnly() + } + err = e.ConsumeTraces(context.Background(), traces) + } + }) + require.NoError(t, err) + err = c.Shutdown(context.Background()) + require.NoError(t, err) + }) + } +} + +func generateLifecycleTestLogs() plog.Logs { + logs := plog.NewLogs() + rl := logs.ResourceLogs().AppendEmpty() + rl.Resource().Attributes().PutStr("resource", "R1") + l := rl.ScopeLogs().AppendEmpty().LogRecords().AppendEmpty() + l.Body().SetStr("test log message") + l.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) + return logs +} + +func generateLifecycleTestMetrics() pmetric.Metrics { + metrics := pmetric.NewMetrics() + rm := metrics.ResourceMetrics().AppendEmpty() + rm.Resource().Attributes().PutStr("resource", "R1") + m := rm.ScopeMetrics().AppendEmpty().Metrics().AppendEmpty() + m.SetName("test_metric") + dp := m.SetEmptyGauge().DataPoints().AppendEmpty() + dp.Attributes().PutStr("test_attr", "value_1") + dp.SetIntValue(123) + dp.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) + return metrics +} + +func generateLifecycleTestTraces() ptrace.Traces { + traces := ptrace.NewTraces() + rs := traces.ResourceSpans().AppendEmpty() + rs.Resource().Attributes().PutStr("resource", "R1") + span := rs.ScopeSpans().AppendEmpty().Spans().AppendEmpty() + span.Attributes().PutStr("test_attr", "value_1") + span.SetName("test_span") + span.SetStartTimestamp(pcommon.NewTimestampFromTime(time.Now().Add(-1 * time.Second))) + span.SetEndTimestamp(pcommon.NewTimestampFromTime(time.Now())) + return traces +} diff --git a/processor/coralogixprocessor/generated_package_test.go b/processor/coralogixprocessor/generated_package_test.go new file mode 100644 index 000000000000..7d30ccefb64f --- /dev/null +++ b/processor/coralogixprocessor/generated_package_test.go @@ -0,0 +1,13 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package coralogixprocessor + +import ( + "testing" + + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + goleak.VerifyTestMain(m) +} diff --git a/processor/coralogixprocessor/go.mod b/processor/coralogixprocessor/go.mod new file mode 100644 index 000000000000..e7e0ec2c537e --- /dev/null +++ b/processor/coralogixprocessor/go.mod @@ -0,0 +1,57 @@ +module github.com/open-telemetry/opentelemetry-collector-contrib/processor/coralogixprocessor + +go 1.22.0 + +require ( + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/processor v0.116.0 + go.opentelemetry.io/collector/processor/processortest v0.116.0 + go.uber.org/goleak v1.3.0 +) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/knadh/koanf/maps v0.1.1 // indirect + github.com/knadh/koanf/providers/confmap v0.1.0 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + go.opentelemetry.io/collector/component/componentstatus v0.116.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/testdata v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/processor/xprocessor v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto v0.0.0-20200911024640-645f7a48b24f // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/processor/coralogixprocessor/go.sum b/processor/coralogixprocessor/go.sum new file mode 100644 index 000000000000..b0dfd87014dd --- /dev/null +++ b/processor/coralogixprocessor/go.sum @@ -0,0 +1,195 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= +github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= +github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= +github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/processor v0.116.0 h1:Kyu4tPzTdWNHtZjcxvI/bGNAgyv8L8Kem2r/Mk4IDAw= +go.opentelemetry.io/collector/processor v0.116.0/go.mod h1:+/Ugy48RAxlZEXmN2cw51W8t5wdHS9No+GAoP+moskk= +go.opentelemetry.io/collector/processor/processortest v0.116.0 h1:+IqNEVEE0E2MsO2g7+Y/9dz35sDuvAXRXrLts9NdXrA= +go.opentelemetry.io/collector/processor/processortest v0.116.0/go.mod h1:DLaQDBxzgeeaUO0ULMn/efos9PmHZkmYCHuxwCsiVHI= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0 h1:iin/UwuWvSLB7ZNfINFUYbZ5lxIi1NjZ2brkyyFdiRA= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0/go.mod h1:cnA43/XpKDbaOmd8buqKp/LGJ2l/OoCqbR//u5DMfn8= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200911024640-645f7a48b24f h1:Yv4xsIx7HZOoyUGSJ2ksDyWE2qIBXROsZKt2ny3hCGM= +google.golang.org/genproto v0.0.0-20200911024640-645f7a48b24f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/processor/coralogixprocessor/internal/metadata/generated_status.go b/processor/coralogixprocessor/internal/metadata/generated_status.go new file mode 100644 index 000000000000..aaafd9ad0652 --- /dev/null +++ b/processor/coralogixprocessor/internal/metadata/generated_status.go @@ -0,0 +1,16 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "go.opentelemetry.io/collector/component" +) + +var ( + Type = component.MustNewType("coralogix") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/processor/coralogixprocessor" +) + +const ( + TracesStability = component.StabilityLevelDevelopment +) diff --git a/processor/coralogixprocessor/metadata.yaml b/processor/coralogixprocessor/metadata.yaml new file mode 100644 index 000000000000..8bcd525c2377 --- /dev/null +++ b/processor/coralogixprocessor/metadata.yaml @@ -0,0 +1,10 @@ +type: coralogix + +status: + class: processor + stability: + development: [traces] + distributions: [] + warnings: [Statefulness] + codeowners: + active: [crobert-1, galrose] diff --git a/processor/coralogixprocessor/span.go b/processor/coralogixprocessor/span.go new file mode 100644 index 000000000000..55439599cbb6 --- /dev/null +++ b/processor/coralogixprocessor/span.go @@ -0,0 +1,37 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package coralogixprocessor // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/coralogixprocessor" + +import ( + "context" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/consumer" + "go.opentelemetry.io/collector/pdata/ptrace" + "go.opentelemetry.io/collector/processor" + "go.opentelemetry.io/collector/processor/processorhelper" +) + +type coralogixProcessor struct { + config *Config + component.StartFunc + component.ShutdownFunc +} + +func newCoralogixProcessor(ctx context.Context, set processor.Settings, cfg *Config, nextConsumer consumer.Traces) (processor.Traces, error) { + sp := &coralogixProcessor{ + config: cfg, + } + + return processorhelper.NewTraces(ctx, + set, + cfg, + nextConsumer, + sp.processTraces, + processorhelper.WithCapabilities(consumer.Capabilities{MutatesData: true})) +} + +func (sp *coralogixProcessor) processTraces(_ context.Context, td ptrace.Traces) (ptrace.Traces, error) { + return td, nil +} diff --git a/processor/cumulativetodeltaprocessor/README.md b/processor/cumulativetodeltaprocessor/README.md index 4079e00561f8..6963e47000ae 100644 --- a/processor/cumulativetodeltaprocessor/README.md +++ b/processor/cumulativetodeltaprocessor/README.md @@ -3,13 +3,14 @@ | Status | | | ------------- |-----------| | Stability | [beta]: metrics | -| Distributions | [contrib] | +| Distributions | [contrib], [k8s] | | Warnings | [Statefulness](#warnings) | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aprocessor%2Fcumulativetodelta%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aprocessor%2Fcumulativetodelta) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aprocessor%2Fcumulativetodelta%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aprocessor%2Fcumulativetodelta) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@TylerHelmuth](https://www.github.com/TylerHelmuth) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s ## Description diff --git a/processor/cumulativetodeltaprocessor/config_test.go b/processor/cumulativetodeltaprocessor/config_test.go index a915bebbeec4..97c3f8952077 100644 --- a/processor/cumulativetodeltaprocessor/config_test.go +++ b/processor/cumulativetodeltaprocessor/config_test.go @@ -120,7 +120,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) if tt.expected == nil { assert.EqualError(t, component.ValidateConfig(cfg), tt.errorMessage) diff --git a/processor/cumulativetodeltaprocessor/factory.go b/processor/cumulativetodeltaprocessor/factory.go index a27ca00a330a..24ffc9c3e334 100644 --- a/processor/cumulativetodeltaprocessor/factory.go +++ b/processor/cumulativetodeltaprocessor/factory.go @@ -31,7 +31,7 @@ func createDefaultConfig() component.Config { func createMetricsProcessor( ctx context.Context, - set processor.CreateSettings, + set processor.Settings, cfg component.Config, nextConsumer consumer.Metrics, ) (processor.Metrics, error) { @@ -42,7 +42,7 @@ func createMetricsProcessor( metricsProcessor := newCumulativeToDeltaProcessor(processorConfig, set.Logger) - return processorhelper.NewMetricsProcessor( + return processorhelper.NewMetrics( ctx, set, cfg, diff --git a/processor/cumulativetodeltaprocessor/factory_test.go b/processor/cumulativetodeltaprocessor/factory_test.go index 01cd92a35474..6926b4257d6d 100644 --- a/processor/cumulativetodeltaprocessor/factory_test.go +++ b/processor/cumulativetodeltaprocessor/factory_test.go @@ -10,7 +10,6 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/confmap/confmaptest" "go.opentelemetry.io/collector/consumer/consumertest" @@ -28,7 +27,7 @@ func TestType(t *testing.T) { func TestCreateDefaultConfig(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() - assert.Equal(t, cfg, &Config{}) + assert.Equal(t, &Config{}, cfg) assert.NoError(t, componenttest.CheckConfigStruct(cfg)) } @@ -46,20 +45,20 @@ func TestCreateProcessors(t *testing.T) { sub, err := cm.Sub(k) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) - tp, tErr := factory.CreateTracesProcessor( + tp, tErr := factory.CreateTraces( context.Background(), - processortest.NewNopCreateSettings(), + processortest.NewNopSettings(), cfg, consumertest.NewNop()) // Not implemented error assert.Error(t, tErr) assert.Nil(t, tp) - mp, mErr := factory.CreateMetricsProcessor( + mp, mErr := factory.CreateMetrics( context.Background(), - processortest.NewNopCreateSettings(), + processortest.NewNopSettings(), cfg, consumertest.NewNop()) assert.NotNil(t, mp) diff --git a/processor/cumulativetodeltaprocessor/generated_component_test.go b/processor/cumulativetodeltaprocessor/generated_component_test.go index de81dc0c296e..eb63ec347d57 100644 --- a/processor/cumulativetodeltaprocessor/generated_component_test.go +++ b/processor/cumulativetodeltaprocessor/generated_component_test.go @@ -33,13 +33,13 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) }{ { name: "metrics", - createFn: func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsProcessor(ctx, set, cfg, consumertest.NewNop()) + createFn: func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg, consumertest.NewNop()) }, }, } @@ -51,21 +51,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), processortest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), processortest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), processortest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), processortest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(processor.Logs) require.True(t, ok) diff --git a/processor/cumulativetodeltaprocessor/go.mod b/processor/cumulativetodeltaprocessor/go.mod index c29b6d98ce38..2101e95b704f 100644 --- a/processor/cumulativetodeltaprocessor/go.mod +++ b/processor/cumulativetodeltaprocessor/go.mod @@ -1,59 +1,61 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/processor v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/processor v0.116.0 + go.opentelemetry.io/collector/processor/processortest v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/pdata/testdata v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + go.opentelemetry.io/collector/component/componentstatus v0.116.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/testdata v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/processor/xprocessor v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/processor/cumulativetodeltaprocessor/go.sum b/processor/cumulativetodeltaprocessor/go.sum index c7d766ce570f..7751d694f8dd 100644 --- a/processor/cumulativetodeltaprocessor/go.sum +++ b/processor/cumulativetodeltaprocessor/go.sum @@ -1,19 +1,19 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -29,8 +29,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -46,50 +46,54 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/processor v0.102.0 h1:JsjTlpBRmoSYxcu3cAbKBchOmL6aNUxLa03ZkWIqZr8= -go.opentelemetry.io/collector/processor v0.102.0/go.mod h1:IaCSDcfy75uQTaOM+LgR1bMf/bUw2eFfzn20uvWYfLQ= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/processor v0.116.0 h1:Kyu4tPzTdWNHtZjcxvI/bGNAgyv8L8Kem2r/Mk4IDAw= +go.opentelemetry.io/collector/processor v0.116.0/go.mod h1:+/Ugy48RAxlZEXmN2cw51W8t5wdHS9No+GAoP+moskk= +go.opentelemetry.io/collector/processor/processortest v0.116.0 h1:+IqNEVEE0E2MsO2g7+Y/9dz35sDuvAXRXrLts9NdXrA= +go.opentelemetry.io/collector/processor/processortest v0.116.0/go.mod h1:DLaQDBxzgeeaUO0ULMn/efos9PmHZkmYCHuxwCsiVHI= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0 h1:iin/UwuWvSLB7ZNfINFUYbZ5lxIi1NjZ2brkyyFdiRA= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0/go.mod h1:cnA43/XpKDbaOmd8buqKp/LGJ2l/OoCqbR//u5DMfn8= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -105,20 +109,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -127,12 +131,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/processor/cumulativetodeltaprocessor/internal/metadata/generated_status.go b/processor/cumulativetodeltaprocessor/internal/metadata/generated_status.go index 860cd26e0937..093893af757a 100644 --- a/processor/cumulativetodeltaprocessor/internal/metadata/generated_status.go +++ b/processor/cumulativetodeltaprocessor/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("cumulativetodelta") + Type = component.MustNewType("cumulativetodelta") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor" ) const ( diff --git a/processor/cumulativetodeltaprocessor/internal/metadata/generated_telemetry.go b/processor/cumulativetodeltaprocessor/internal/metadata/generated_telemetry.go deleted file mode 100644 index f3504365f054..000000000000 --- a/processor/cumulativetodeltaprocessor/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/cumulativetodelta") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/cumulativetodelta") -} diff --git a/processor/cumulativetodeltaprocessor/internal/metadata/generated_telemetry_test.go b/processor/cumulativetodeltaprocessor/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 48a0368ce948..000000000000 --- a/processor/cumulativetodeltaprocessor/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/cumulativetodelta", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/cumulativetodelta", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/processor/cumulativetodeltaprocessor/internal/tracking/identity.go b/processor/cumulativetodeltaprocessor/internal/tracking/identity.go index 2b7400358f3b..c89675512dc9 100644 --- a/processor/cumulativetodeltaprocessor/internal/tracking/identity.go +++ b/processor/cumulativetodeltaprocessor/internal/tracking/identity.go @@ -25,9 +25,11 @@ type MetricIdentity struct { MetricValueType pmetric.NumberDataPointValueType } -const A = int32('A') -const SEP = byte(0x1E) -const SEPSTR = string(SEP) +const ( + A = int32('A') + SEP = byte(0x1E) + SEPSTR = string(SEP) +) func (mi *MetricIdentity) Write(b *bytes.Buffer) { b.WriteRune(A + int32(mi.MetricType)) diff --git a/processor/cumulativetodeltaprocessor/internal/tracking/identity_test.go b/processor/cumulativetodeltaprocessor/internal/tracking/identity_test.go index 343185c248bd..0d8d7b053a53 100644 --- a/processor/cumulativetodeltaprocessor/internal/tracking/identity_test.go +++ b/processor/cumulativetodeltaprocessor/internal/tracking/identity_test.go @@ -8,6 +8,7 @@ import ( "strings" "testing" + "github.com/stretchr/testify/assert" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" @@ -137,9 +138,7 @@ func TestMetricIdentity_IsFloatVal(t *testing.T) { MetricType: pmetric.MetricTypeSum, MetricValueType: tt.fields.MetricValueType, } - if got := mi.IsFloatVal(); got != tt.want { - t.Errorf("MetricIdentity.IsFloatVal() = %v, want %v", got, tt.want) - } + assert.Equal(t, tt.want, mi.IsFloatVal(), "MetricIdentity.IsFloatVal()") }) } } @@ -204,9 +203,7 @@ func TestMetricIdentity_IsSupportedMetricType(t *testing.T) { Attributes: pcommon.NewMap(), MetricType: tt.fields.MetricType, } - if got := mi.IsSupportedMetricType(); got != tt.want { - t.Errorf("MetricIdentity.IsSupportedMetricType() = %v, want %v", got, tt.want) - } + assert.Equal(t, tt.want, mi.IsSupportedMetricType(), "MetricIdentity.IsSupportedMetricType()") }) } } diff --git a/processor/cumulativetodeltaprocessor/internal/tracking/tracker_test.go b/processor/cumulativetodeltaprocessor/internal/tracking/tracker_test.go index 8312532b7e4c..8ebcdb188f23 100644 --- a/processor/cumulativetodeltaprocessor/internal/tracking/tracker_test.go +++ b/processor/cumulativetodeltaprocessor/internal/tracking/tracker_test.go @@ -242,9 +242,7 @@ func TestMetricTracker_Convert(t *testing.T) { IntValue: 100, }, }) - if valid { - t.Error("Expected invalid for non cumulative metric") - } + assert.False(t, valid, "Expected invalid for non cumulative metric") }) } @@ -338,7 +336,5 @@ func Test_metricTracker_sweeper(t *testing.T) { cancel() for range sweepEvent { // nolint } - if !closed.Load() { - t.Errorf("Sweeper did not terminate.") - } + assert.True(t, closed.Load(), "Sweeper did not terminate.") } diff --git a/processor/cumulativetodeltaprocessor/metadata.yaml b/processor/cumulativetodeltaprocessor/metadata.yaml index b5ca69f191ef..070a6ecc00cc 100644 --- a/processor/cumulativetodeltaprocessor/metadata.yaml +++ b/processor/cumulativetodeltaprocessor/metadata.yaml @@ -1,11 +1,10 @@ type: cumulativetodelta -scope_name: otelcol/cumulativetodelta status: class: processor stability: beta: [metrics] - distributions: [contrib] + distributions: [contrib, k8s] warnings: [Statefulness] codeowners: active: [TylerHelmuth] diff --git a/processor/cumulativetodeltaprocessor/processor.go b/processor/cumulativetodeltaprocessor/processor.go index 83130ea97ee4..0c7673a9a169 100644 --- a/processor/cumulativetodeltaprocessor/processor.go +++ b/processor/cumulativetodeltaprocessor/processor.go @@ -66,7 +66,7 @@ func (ctdp *cumulativeToDeltaProcessor) processMetrics(_ context.Context, md pme MetricUnit: m.Unit(), MetricIsMonotonic: ms.IsMonotonic(), } - ctdp.convertDataPoints(ms.DataPoints(), baseIdentity) + ctdp.convertNumberDataPoints(ms.DataPoints(), baseIdentity) ms.SetAggregationTemporality(pmetric.AggregationTemporalityDelta) return ms.DataPoints().Len() == 0 case pmetric.MetricTypeHistogram: @@ -116,47 +116,45 @@ func (ctdp *cumulativeToDeltaProcessor) shouldConvertMetric(metricName string) b (ctdp.excludeFS == nil || !ctdp.excludeFS.Matches(metricName)) } -func (ctdp *cumulativeToDeltaProcessor) convertDataPoints(in any, baseIdentity tracking.MetricIdentity) { - if dps, ok := in.(pmetric.NumberDataPointSlice); ok { - dps.RemoveIf(func(dp pmetric.NumberDataPoint) bool { - id := baseIdentity - id.StartTimestamp = dp.StartTimestamp() - id.Attributes = dp.Attributes() - id.MetricValueType = dp.ValueType() - point := tracking.ValuePoint{ - ObservedTimestamp: dp.Timestamp(), - } - - if dp.Flags().NoRecordedValue() { - // drop points with no value - return true - } - if id.IsFloatVal() { - // Do not attempt to transform NaN values - if math.IsNaN(dp.DoubleValue()) { - return false - } - point.FloatValue = dp.DoubleValue() - } else { - point.IntValue = dp.IntValue() - } - trackingPoint := tracking.MetricPoint{ - Identity: id, - Value: point, - } - delta, valid := ctdp.deltaCalculator.Convert(trackingPoint) - if !valid { - return true - } - dp.SetStartTimestamp(delta.StartTimestamp) - if id.IsFloatVal() { - dp.SetDoubleValue(delta.FloatValue) - } else { - dp.SetIntValue(delta.IntValue) +func (ctdp *cumulativeToDeltaProcessor) convertNumberDataPoints(dps pmetric.NumberDataPointSlice, baseIdentity tracking.MetricIdentity) { + dps.RemoveIf(func(dp pmetric.NumberDataPoint) bool { + id := baseIdentity + id.StartTimestamp = dp.StartTimestamp() + id.Attributes = dp.Attributes() + id.MetricValueType = dp.ValueType() + point := tracking.ValuePoint{ + ObservedTimestamp: dp.Timestamp(), + } + + if dp.Flags().NoRecordedValue() { + // drop points with no value + return true + } + if id.IsFloatVal() { + // Do not attempt to transform NaN values + if math.IsNaN(dp.DoubleValue()) { + return false } - return false - }) - } + point.FloatValue = dp.DoubleValue() + } else { + point.IntValue = dp.IntValue() + } + trackingPoint := tracking.MetricPoint{ + Identity: id, + Value: point, + } + delta, valid := ctdp.deltaCalculator.Convert(trackingPoint) + if !valid { + return true + } + dp.SetStartTimestamp(delta.StartTimestamp) + if id.IsFloatVal() { + dp.SetDoubleValue(delta.FloatValue) + } else { + dp.SetIntValue(delta.IntValue) + } + return false + }) } func (ctdp *cumulativeToDeltaProcessor) convertHistogramDataPoints(in any, baseIdentity tracking.MetricIdentity) { diff --git a/processor/cumulativetodeltaprocessor/processor_test.go b/processor/cumulativetodeltaprocessor/processor_test.go index 9656aa7346a0..d7b0a19ab6cc 100644 --- a/processor/cumulativetodeltaprocessor/processor_test.go +++ b/processor/cumulativetodeltaprocessor/processor_test.go @@ -447,9 +447,9 @@ func TestCumulativeToDeltaProcessor(t *testing.T) { Exclude: test.exclude, } factory := NewFactory() - mgp, err := factory.CreateMetricsProcessor( + mgp, err := factory.CreateMetrics( context.Background(), - processortest.NewNopCreateSettings(), + processortest.NewNopSettings(), cfg, next, ) @@ -462,10 +462,10 @@ func TestCumulativeToDeltaProcessor(t *testing.T) { require.NoError(t, mgp.Start(ctx, nil)) cErr := mgp.ConsumeMetrics(context.Background(), test.inMetrics) - assert.Nil(t, cErr) + assert.NoError(t, cErr) got := next.AllMetrics() - require.Equal(t, 1, len(got)) + require.Len(t, got, 1) require.Equal(t, test.outMetrics.ResourceMetrics().Len(), got[0].ResourceMetrics().Len()) expectedMetrics := test.outMetrics.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics() @@ -594,7 +594,7 @@ func generateTestHistogramMetrics(tm testHistogramMetric) pmetric.Metrics { if tm.metricMins != nil { mins := tm.metricMins[i] if len(mins) > 0 { - dp.SetMin(sums[index]) + dp.SetMin(mins[index]) } } if tm.metricMaxes != nil { @@ -615,7 +615,7 @@ func generateTestHistogramMetrics(tm testHistogramMetric) pmetric.Metrics { func BenchmarkConsumeMetrics(b *testing.B) { c := consumertest.NewNop() - params := processor.CreateSettings{ + params := processor.Settings{ TelemetrySettings: component.TelemetrySettings{ Logger: zap.NewNop(), }, @@ -623,9 +623,7 @@ func BenchmarkConsumeMetrics(b *testing.B) { } cfg := createDefaultConfig().(*Config) p, err := createMetricsProcessor(context.Background(), params, cfg, c) - if err != nil { - b.Fatal(err) - } + require.NoError(b, err) metrics := pmetric.NewMetrics() rms := metrics.ResourceMetrics().AppendEmpty() diff --git a/processor/deltatocumulativeprocessor/README.md b/processor/deltatocumulativeprocessor/README.md index ffceda1c3d3b..04548d5f7f8e 100644 --- a/processor/deltatocumulativeprocessor/README.md +++ b/processor/deltatocumulativeprocessor/README.md @@ -3,13 +3,15 @@ | Status | | | ------------- |-----------| -| Stability | [development]: metrics | -| Distributions | [] | +| Stability | [alpha]: metrics | +| Distributions | [contrib], [k8s] | | Warnings | [Statefulness](#warnings) | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aprocessor%2Fdeltatocumulative%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aprocessor%2Fdeltatocumulative) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aprocessor%2Fdeltatocumulative%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aprocessor%2Fdeltatocumulative) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@sh0rez](https://www.github.com/sh0rez), [@RichieSams](https://www.github.com/RichieSams), [@jpkrohling](https://www.github.com/jpkrohling) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@sh0rez](https://www.github.com/sh0rez), [@RichieSams](https://www.github.com/RichieSams) | -[development]: https://github.com/open-telemetry/opentelemetry-collector#development +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha +[contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s @@ -28,7 +30,7 @@ processors: # upper limit of streams to track. new streams exceeding this limit # will be dropped - [ max_streams: | default = 0 (off) ] + [ max_streams: | default = 9223372036854775807 (max int) ] ``` @@ -36,15 +38,5 @@ There is no further configuration required. All delta samples are converted to c ## Troubleshooting -The following metrics are recorded when [telemetry is -enabled](https://opentelemetry.io/docs/collector/configuration/#telemetry): - -| Name | Description | Unit | -|------------------------------------------|---------------------------------------------------------------------------------------|---------------| -| `deltatocumulative.streams.tracked` | Number of streams currently tracked by the aggregation state | `{stream}` | -| `deltatocumulative.streams.limit` | Upper limit of tracked streams | `{stream}` | -| `deltatocumulative.streams.evicted` | Number of streams removed from tracking to ingest newer streams | `{stream}` | -| `deltatocumulative.streams.max_stale` | Duration without new samples after which streams are dropped | `second` | -| `deltatocumulative.datapoints.processed` | Total number of datapoints processed, whether successful or not | `{datapoint}` | -| `deltatocumulative.datapoints.dropped` | Faulty datapoints that were dropped due to the reason given in the `reason` attribute | `{datapoint}` | -| `deltatocumulative.gaps.length` | Total length of all gaps in the streams, which occur e.g. due to lost in transit | `second` | +When [Telemetry is +enabled](https://opentelemetry.io/docs/collector/configuration/#telemetry), this component exports [several metrics](./documentation.md). diff --git a/processor/deltatocumulativeprocessor/benchmark_test.go b/processor/deltatocumulativeprocessor/benchmark_test.go new file mode 100644 index 000000000000..cfe6e5146c8d --- /dev/null +++ b/processor/deltatocumulativeprocessor/benchmark_test.go @@ -0,0 +1,161 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package deltatocumulativeprocessor + +import ( + "context" + "math/rand/v2" + "strconv" + "testing" + "time" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/consumer/consumertest" + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/pmetric" + + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/expo" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/expo/expotest" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/histo" +) + +var out *consumertest.MetricsSink + +func BenchmarkProcessor(gb *testing.B) { + const ( + metrics = 5 + streams = 10 + ) + + now := time.Now() + start := pcommon.NewTimestampFromTime(now) + ts := pcommon.NewTimestampFromTime(now.Add(time.Minute)) + + type Case struct { + name string + fill func(m pmetric.Metric) + next func(m pmetric.Metric) + } + cases := []Case{{ + name: "sums", + fill: func(m pmetric.Metric) { + sum := m.SetEmptySum() + sum.SetAggregationTemporality(pmetric.AggregationTemporalityDelta) + for i := range streams { + dp := sum.DataPoints().AppendEmpty() + dp.SetIntValue(int64(rand.IntN(10))) + dp.Attributes().PutStr("idx", strconv.Itoa(i)) + dp.SetStartTimestamp(start) + dp.SetTimestamp(ts) + } + }, + next: func(m pmetric.Metric) { + dps := m.Sum().DataPoints() + for i := range dps.Len() { + dp := dps.At(i) + dp.SetStartTimestamp(dp.Timestamp()) + dp.SetTimestamp(pcommon.NewTimestampFromTime( + dp.Timestamp().AsTime().Add(time.Minute), + )) + } + }, + }, { + name: "histogram", + fill: func(m pmetric.Metric) { + hist := m.SetEmptyHistogram() + hist.SetAggregationTemporality(pmetric.AggregationTemporalityDelta) + for i := range streams { + dp := hist.DataPoints().AppendEmpty() + histo.DefaultBounds.Observe( + float64(rand.IntN(1000)), + float64(rand.IntN(1000)), + float64(rand.IntN(1000)), + float64(rand.IntN(1000)), + ).CopyTo(dp) + + dp.SetStartTimestamp(start) + dp.SetTimestamp(ts) + dp.Attributes().PutStr("idx", strconv.Itoa(i)) + } + }, + next: func(m pmetric.Metric) { + dps := m.Histogram().DataPoints() + for i := range dps.Len() { + dp := dps.At(i) + dp.SetStartTimestamp(dp.Timestamp()) + dp.SetTimestamp(pcommon.NewTimestampFromTime( + dp.Timestamp().AsTime().Add(time.Minute), + )) + } + }, + }, { + name: "exponential", + fill: func(m pmetric.Metric) { + ex := m.SetEmptyExponentialHistogram() + ex.SetAggregationTemporality(pmetric.AggregationTemporalityDelta) + for i := range streams { + dp := ex.DataPoints().AppendEmpty() + o := expotest.Observe(expo.Scale(2), + float64(rand.IntN(31)+1), + float64(rand.IntN(31)+1), + float64(rand.IntN(31)+1), + float64(rand.IntN(31)+1), + ) + o.CopyTo(dp.Positive()) + o.CopyTo(dp.Negative()) + + dp.SetStartTimestamp(start) + dp.SetTimestamp(ts) + dp.Attributes().PutStr("idx", strconv.Itoa(i)) + } + }, + next: func(m pmetric.Metric) { + dps := m.ExponentialHistogram().DataPoints() + for i := range dps.Len() { + dp := dps.At(i) + dp.SetStartTimestamp(dp.Timestamp()) + dp.SetTimestamp(pcommon.NewTimestampFromTime( + dp.Timestamp().AsTime().Add(time.Minute), + )) + } + }, + }} + + for _, cs := range cases { + gb.Run(cs.name, func(b *testing.B) { + st := setup(b, nil) + out = st.sink + + md := pmetric.NewMetrics() + ms := md.ResourceMetrics().AppendEmpty().ScopeMetrics().AppendEmpty().Metrics() + for i := range metrics { + m := ms.AppendEmpty() + m.SetName(strconv.Itoa(i)) + cs.fill(m) + } + + b.ReportAllocs() + b.ResetTimer() + b.StopTimer() + + ctx := context.Background() + for range b.N { + for i := range ms.Len() { + cs.next(ms.At(i)) + } + req := pmetric.NewMetrics() + md.CopyTo(req) + + b.StartTimer() + err := st.proc.ConsumeMetrics(ctx, req) + b.StopTimer() + require.NoError(b, err) + } + + // verify all dps are processed without error + b.StopTimer() + require.Equal(b, b.N*metrics*streams, st.sink.DataPointCount()) + }) + } +} diff --git a/processor/deltatocumulativeprocessor/config.go b/processor/deltatocumulativeprocessor/config.go index b97793d0b6d8..f5b5c1c59dfa 100644 --- a/processor/deltatocumulativeprocessor/config.go +++ b/processor/deltatocumulativeprocessor/config.go @@ -4,10 +4,14 @@ package deltatocumulativeprocessor // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor" import ( + "context" "fmt" + "math" "time" "go.opentelemetry.io/collector/component" + + telemetry "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/telemetry" ) var _ component.ConfigValidator = (*Config)(nil) @@ -31,8 +35,14 @@ func createDefaultConfig() component.Config { return &Config{ MaxStale: 5 * time.Minute, - // disable. TODO: find good default + // TODO: find good default // https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/31603 - MaxStreams: 0, + MaxStreams: math.MaxInt, } } + +func (c Config) Metrics(tel telemetry.Metrics) { + ctx := context.Background() + tel.DeltatocumulativeStreamsMaxStale.Record(ctx, int64(c.MaxStale.Seconds())) + tel.DeltatocumulativeStreamsLimit.Record(ctx, int64(c.MaxStreams)) +} diff --git a/processor/deltatocumulativeprocessor/config_test.go b/processor/deltatocumulativeprocessor/config_test.go index 79348b2aa6a7..371afcc05c0d 100644 --- a/processor/deltatocumulativeprocessor/config_test.go +++ b/processor/deltatocumulativeprocessor/config_test.go @@ -4,6 +4,7 @@ package deltatocumulativeprocessor // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor" import ( + "math" "path/filepath" "testing" "time" @@ -37,7 +38,7 @@ func TestLoadConfig(t *testing.T) { id: component.NewIDWithName(metadata.Type, "set-valid-max_stale"), expected: &Config{ MaxStale: 2 * time.Minute, - MaxStreams: 0, + MaxStreams: math.MaxInt, }, }, { @@ -56,7 +57,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) diff --git a/processor/deltatocumulativeprocessor/documentation.md b/processor/deltatocumulativeprocessor/documentation.md new file mode 100644 index 000000000000..f9c560a8703e --- /dev/null +++ b/processor/deltatocumulativeprocessor/documentation.md @@ -0,0 +1,79 @@ +[comment]: <> (Code generated by mdatagen. DO NOT EDIT.) + +# deltatocumulative + +## Internal Telemetry + +The following telemetry is emitted by this component. + +### otelcol_deltatocumulative.datapoints.dropped + +number of datapoints dropped due to given 'reason' + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| {datapoint} | Sum | Int | true | + +### otelcol_deltatocumulative.datapoints.linear + +total number of datapoints processed. may have 'error' attribute, if processing failed + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| {datapoint} | Sum | Int | true | + +### otelcol_deltatocumulative.datapoints.processed + +number of datapoints processed + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| {datapoint} | Sum | Int | true | + +### otelcol_deltatocumulative.gaps.length + +total duration where data was expected but not received + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| s | Sum | Int | true | + +### otelcol_deltatocumulative.streams.evicted + +number of streams evicted + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| {stream} | Sum | Int | true | + +### otelcol_deltatocumulative.streams.limit + +upper limit of tracked streams + +| Unit | Metric Type | Value Type | +| ---- | ----------- | ---------- | +| {stream} | Gauge | Int | + +### otelcol_deltatocumulative.streams.max_stale + +duration after which streams inactive streams are dropped + +| Unit | Metric Type | Value Type | +| ---- | ----------- | ---------- | +| s | Gauge | Int | + +### otelcol_deltatocumulative.streams.tracked + +number of streams tracked + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| {dps} | Sum | Int | false | + +### otelcol_deltatocumulative.streams.tracked.linear + +number of streams tracked + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| {dps} | Sum | Int | false | diff --git a/processor/deltatocumulativeprocessor/factory.go b/processor/deltatocumulativeprocessor/factory.go index 1162165174d1..904ae1ee6827 100644 --- a/processor/deltatocumulativeprocessor/factory.go +++ b/processor/deltatocumulativeprocessor/factory.go @@ -12,6 +12,7 @@ import ( "go.opentelemetry.io/collector/processor" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/metadata" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/telemetry" ) func NewFactory() processor.Factory { @@ -22,12 +23,16 @@ func NewFactory() processor.Factory { ) } -func createMetricsProcessor(_ context.Context, set processor.CreateSettings, cfg component.Config, next consumer.Metrics) (processor.Metrics, error) { +func createMetricsProcessor(_ context.Context, set processor.Settings, cfg component.Config, next consumer.Metrics) (processor.Metrics, error) { pcfg, ok := cfg.(*Config) if !ok { return nil, fmt.Errorf("configuration parsing error") } - meter := metadata.Meter(set.TelemetrySettings) - return newProcessor(pcfg, set.Logger, meter, next), nil + tel, err := telemetry.New(set.TelemetrySettings) + if err != nil { + return nil, err + } + + return newProcessor(pcfg, tel, next), nil } diff --git a/processor/deltatocumulativeprocessor/generated_component_telemetry_test.go b/processor/deltatocumulativeprocessor/generated_component_telemetry_test.go new file mode 100644 index 000000000000..81de4b732dc0 --- /dev/null +++ b/processor/deltatocumulativeprocessor/generated_component_telemetry_test.go @@ -0,0 +1,84 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package deltatocumulativeprocessor + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + sdkmetric "go.opentelemetry.io/otel/sdk/metric" + "go.opentelemetry.io/otel/sdk/metric/metricdata" + "go.opentelemetry.io/otel/sdk/metric/metricdata/metricdatatest" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/config/configtelemetry" + "go.opentelemetry.io/collector/processor" + "go.opentelemetry.io/collector/processor/processortest" +) + +type componentTestTelemetry struct { + reader *sdkmetric.ManualReader + meterProvider *sdkmetric.MeterProvider +} + +func (tt *componentTestTelemetry) NewSettings() processor.Settings { + set := processortest.NewNopSettings() + set.ID = component.NewID(component.MustNewType("deltatocumulative")) + set.TelemetrySettings = tt.newTelemetrySettings() + return set +} + +func (tt *componentTestTelemetry) newTelemetrySettings() component.TelemetrySettings { + set := componenttest.NewNopTelemetrySettings() + set.MeterProvider = tt.meterProvider + set.MetricsLevel = configtelemetry.LevelDetailed + return set +} + +func setupTestTelemetry() componentTestTelemetry { + reader := sdkmetric.NewManualReader() + return componentTestTelemetry{ + reader: reader, + meterProvider: sdkmetric.NewMeterProvider(sdkmetric.WithReader(reader)), + } +} + +func (tt *componentTestTelemetry) assertMetrics(t *testing.T, expected []metricdata.Metrics) { + var md metricdata.ResourceMetrics + require.NoError(t, tt.reader.Collect(context.Background(), &md)) + // ensure all required metrics are present + for _, want := range expected { + got := tt.getMetric(want.Name, md) + metricdatatest.AssertEqual(t, want, got, metricdatatest.IgnoreTimestamp()) + } + + // ensure no additional metrics are emitted + require.Equal(t, len(expected), tt.len(md)) +} + +func (tt *componentTestTelemetry) getMetric(name string, got metricdata.ResourceMetrics) metricdata.Metrics { + for _, sm := range got.ScopeMetrics { + for _, m := range sm.Metrics { + if m.Name == name { + return m + } + } + } + + return metricdata.Metrics{} +} + +func (tt *componentTestTelemetry) len(got metricdata.ResourceMetrics) int { + metricsCount := 0 + for _, sm := range got.ScopeMetrics { + metricsCount += len(sm.Metrics) + } + + return metricsCount +} + +func (tt *componentTestTelemetry) Shutdown(ctx context.Context) error { + return tt.meterProvider.Shutdown(ctx) +} diff --git a/processor/deltatocumulativeprocessor/generated_component_test.go b/processor/deltatocumulativeprocessor/generated_component_test.go index 590c07c51882..bfc1bb359bdc 100644 --- a/processor/deltatocumulativeprocessor/generated_component_test.go +++ b/processor/deltatocumulativeprocessor/generated_component_test.go @@ -33,13 +33,13 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) }{ { name: "metrics", - createFn: func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsProcessor(ctx, set, cfg, consumertest.NewNop()) + createFn: func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg, consumertest.NewNop()) }, }, } @@ -51,21 +51,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), processortest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), processortest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), processortest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), processortest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(processor.Logs) require.True(t, ok) diff --git a/processor/deltatocumulativeprocessor/go.mod b/processor/deltatocumulativeprocessor/go.mod index 9db4d2cb4fde..afb6d53dd812 100644 --- a/processor/deltatocumulativeprocessor/go.mod +++ b/processor/deltatocumulativeprocessor/go.mod @@ -1,60 +1,63 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/processor v0.102.0 - go.opentelemetry.io/otel v1.27.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/google/go-cmp v0.6.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/processor v0.116.0 + go.opentelemetry.io/collector/processor/processortest v0.116.0 + go.opentelemetry.io/otel v1.32.0 + go.opentelemetry.io/otel/metric v1.32.0 + go.opentelemetry.io/otel/sdk/metric v1.32.0 + go.opentelemetry.io/otel/trace v1.32.0 go.uber.org/goleak v1.3.0 - go.uber.org/zap v1.27.0 + golang.org/x/tools v0.27.0 + gopkg.in/yaml.v3 v3.0.1 ) require ( - github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/pdata/testdata v0.102.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/component/componentstatus v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/testdata v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/processor/xprocessor v0.116.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect + go.uber.org/zap v1.27.0 // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.20.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect ) replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../../pkg/pdatautil diff --git a/processor/deltatocumulativeprocessor/go.sum b/processor/deltatocumulativeprocessor/go.sum index 394c41a60040..16e8f6f098c8 100644 --- a/processor/deltatocumulativeprocessor/go.sum +++ b/processor/deltatocumulativeprocessor/go.sum @@ -1,19 +1,19 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -27,8 +27,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -44,50 +44,54 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/processor v0.102.0 h1:JsjTlpBRmoSYxcu3cAbKBchOmL6aNUxLa03ZkWIqZr8= -go.opentelemetry.io/collector/processor v0.102.0/go.mod h1:IaCSDcfy75uQTaOM+LgR1bMf/bUw2eFfzn20uvWYfLQ= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/processor v0.116.0 h1:Kyu4tPzTdWNHtZjcxvI/bGNAgyv8L8Kem2r/Mk4IDAw= +go.opentelemetry.io/collector/processor v0.116.0/go.mod h1:+/Ugy48RAxlZEXmN2cw51W8t5wdHS9No+GAoP+moskk= +go.opentelemetry.io/collector/processor/processortest v0.116.0 h1:+IqNEVEE0E2MsO2g7+Y/9dz35sDuvAXRXrLts9NdXrA= +go.opentelemetry.io/collector/processor/processortest v0.116.0/go.mod h1:DLaQDBxzgeeaUO0ULMn/efos9PmHZkmYCHuxwCsiVHI= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0 h1:iin/UwuWvSLB7ZNfINFUYbZ5lxIi1NjZ2brkyyFdiRA= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0/go.mod h1:cnA43/XpKDbaOmd8buqKp/LGJ2l/OoCqbR//u5DMfn8= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -103,34 +107,36 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.27.0 h1:qEKojBykQkQ4EynWy4S8Weg69NumxKdn40Fce3uc/8o= +golang.org/x/tools v0.27.0/go.mod h1:sUi0ZgbwW9ZPAq26Ekut+weQPR5eIM6GQLQ1Yjm1H0Q= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/processor/deltatocumulativeprocessor/internal/data/add.go b/processor/deltatocumulativeprocessor/internal/data/add.go index 94a575b1bd9f..33c2f283c840 100644 --- a/processor/deltatocumulativeprocessor/internal/data/add.go +++ b/processor/deltatocumulativeprocessor/internal/data/add.go @@ -9,6 +9,7 @@ import ( "go.opentelemetry.io/collector/pdata/pmetric" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/expo" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/putil/pslice" ) func (dp Number) Add(in Number) Number { @@ -24,9 +25,44 @@ func (dp Number) Add(in Number) Number { return dp } -// nolint func (dp Histogram) Add(in Histogram) Histogram { - panic("todo") + // bounds different: no way to merge, so reset observation to new boundaries + if !pslice.Equal(dp.ExplicitBounds(), in.ExplicitBounds()) { + in.MoveTo(dp.HistogramDataPoint) + return dp + } + + // spec requires len(BucketCounts) == len(ExplicitBounds)+1. + // given we have limited error handling at this stage (and already verified boundaries are correct), + // doing a best-effort add of whatever we have appears reasonable. + n := min(dp.BucketCounts().Len(), in.BucketCounts().Len()) + for i := 0; i < n; i++ { + sum := dp.BucketCounts().At(i) + in.BucketCounts().At(i) + dp.BucketCounts().SetAt(i, sum) + } + + dp.SetTimestamp(in.Timestamp()) + dp.SetCount(dp.Count() + in.Count()) + + if dp.HasSum() && in.HasSum() { + dp.SetSum(dp.Sum() + in.Sum()) + } else { + dp.RemoveSum() + } + + if dp.HasMin() && in.HasMin() { + dp.SetMin(math.Min(dp.Min(), in.Min())) + } else { + dp.RemoveMin() + } + + if dp.HasMax() && in.HasMax() { + dp.SetMax(math.Max(dp.Max(), in.Max())) + } else { + dp.RemoveMax() + } + + return dp } func (dp ExpHistogram) Add(in ExpHistogram) ExpHistogram { @@ -72,3 +108,7 @@ func (dp ExpHistogram) Add(in ExpHistogram) ExpHistogram { return dp } + +func (dp Summary) Add(Summary) Summary { + panic("todo") +} diff --git a/processor/deltatocumulativeprocessor/internal/data/data.go b/processor/deltatocumulativeprocessor/internal/data/data.go index eade94eadf92..3a36f6d552d2 100644 --- a/processor/deltatocumulativeprocessor/internal/data/data.go +++ b/processor/deltatocumulativeprocessor/internal/data/data.go @@ -4,75 +4,23 @@ package data // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data" import ( - "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/expo" ) -type Point[Self any] interface { - StartTimestamp() pcommon.Timestamp - Timestamp() pcommon.Timestamp - Attributes() pcommon.Map - - Clone() Self - CopyTo(Self) - - Add(Self) Self -} - type Number struct { pmetric.NumberDataPoint } -func (dp Number) Clone() Number { - clone := Number{NumberDataPoint: pmetric.NewNumberDataPoint()} - if dp.NumberDataPoint != (pmetric.NumberDataPoint{}) { - dp.CopyTo(clone) - } - return clone -} - -func (dp Number) CopyTo(dst Number) { - dp.NumberDataPoint.CopyTo(dst.NumberDataPoint) -} - type Histogram struct { pmetric.HistogramDataPoint } -func (dp Histogram) Clone() Histogram { - clone := Histogram{HistogramDataPoint: pmetric.NewHistogramDataPoint()} - if dp.HistogramDataPoint != (pmetric.HistogramDataPoint{}) { - dp.CopyTo(clone) - } - return clone -} - -func (dp Histogram) CopyTo(dst Histogram) { - dp.HistogramDataPoint.CopyTo(dst.HistogramDataPoint) -} - type ExpHistogram struct { expo.DataPoint } -func (dp ExpHistogram) Clone() ExpHistogram { - clone := ExpHistogram{DataPoint: pmetric.NewExponentialHistogramDataPoint()} - if dp.DataPoint != (expo.DataPoint{}) { - dp.CopyTo(clone) - } - return clone -} - -func (dp ExpHistogram) CopyTo(dst ExpHistogram) { - dp.DataPoint.CopyTo(dst.DataPoint) +type Summary struct { + pmetric.SummaryDataPoint } - -type mustPoint[D Point[D]] struct{ _ D } - -var ( - _ = mustPoint[Number]{} - _ = mustPoint[Histogram]{} - _ = mustPoint[ExpHistogram]{} -) diff --git a/processor/deltatocumulativeprocessor/internal/data/expo/expotest/equal.go b/processor/deltatocumulativeprocessor/internal/data/datatest/equal.go similarity index 78% rename from processor/deltatocumulativeprocessor/internal/data/expo/expotest/equal.go rename to processor/deltatocumulativeprocessor/internal/data/datatest/equal.go index c34e7c1665bc..1ad4f2d23569 100644 --- a/processor/deltatocumulativeprocessor/internal/data/expo/expotest/equal.go +++ b/processor/deltatocumulativeprocessor/internal/data/datatest/equal.go @@ -1,18 +1,18 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -package expotest // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/expo/expotest" +package datatest // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/datatest" import ( "reflect" "strings" "testing" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/pmetrictest" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/expo" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/testing/compare" ) // T is the testing helper. Most notably it provides [T.Equal] @@ -20,8 +20,8 @@ type T struct { testing.TB } -func Is(t testing.TB) T { - return T{TB: t} +func New(tb testing.TB) T { + return T{TB: tb} } // Equal reports whether want and got are deeply equal. @@ -50,17 +50,17 @@ func (is T) Equalf(want, got any, name string) { equal(is.TB, want, got, name) } -func equal(t testing.TB, want, got any, name string) bool { - t.Helper() - require.IsType(t, want, got) +func equal(tb testing.TB, want, got any, name string) bool { + tb.Helper() + require.IsType(tb, want, got) vw := reflect.ValueOf(want) vg := reflect.ValueOf(got) if vw.Kind() != reflect.Struct { - ok := reflect.DeepEqual(want, got) + ok := compare.Equal(want, got) if !ok { - t.Errorf("%s: %+v != %+v", name, want, got) + tb.Errorf("%s: %+v != %+v", name, want, got) } return ok } @@ -79,14 +79,14 @@ func equal(t testing.TB, want, got any, name string) bool { continue } // Append(Empty) fails above heuristic, exclude it - if strings.HasPrefix(mname, "Append") { + if strings.HasPrefix(mname, "Append") || strings.HasPrefix(mname, "Clone") { continue } rw := mw.Call(nil)[0].Interface() rg := mg.Call(nil)[0].Interface() - ok = equal(t, rw, rg, fname) && ok + ok = equal(tb, rw, rg, fname) && ok } // compare all exported fields of the struct @@ -97,7 +97,7 @@ func equal(t testing.TB, want, got any, name string) bool { fname := name + "." + vw.Type().Field(i).Name fw := vw.Field(i).Interface() fg := vg.Field(i).Interface() - ok = equal(t, fw, fg, fname) && ok + ok = equal(tb, fw, fg, fname) && ok } if !ok { return false @@ -106,10 +106,15 @@ func equal(t testing.TB, want, got any, name string) bool { if _, ok := want.(expo.DataPoint); ok { err := pmetrictest.CompareExponentialHistogramDataPoint(want.(expo.DataPoint), got.(expo.DataPoint)) if err != nil { - t.Error(err) + tb.Error(err) } } // fallback to a full deep-equal for rare cases (unexported fields, etc) - return assert.Equal(t, want, got) + if diff := compare.Diff(want, got); diff != "" { + tb.Error(diff) + return false + } + + return true } diff --git a/processor/deltatocumulativeprocessor/internal/data/datatest/equal_test.go b/processor/deltatocumulativeprocessor/internal/data/datatest/equal_test.go new file mode 100644 index 000000000000..d2522a16e4d1 --- /dev/null +++ b/processor/deltatocumulativeprocessor/internal/data/datatest/equal_test.go @@ -0,0 +1,68 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package datatest + +import ( + "fmt" + "path/filepath" + "runtime" + "strconv" + "strings" + "testing" + + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/expo" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/expo/expotest" +) + +var tb testing.TB = fakeT{} + +var datatest = struct{ New func(tb testing.TB) T }{New: New} + +func ExampleT_Equal() { + is := datatest.New(tb) + + want := expotest.Histogram{ + PosNeg: expotest.Observe(expo.Scale(0), 1, 2, 3, 4), + Scale: 0, + }.Into() + + got := expotest.Histogram{ + PosNeg: expotest.Observe(expo.Scale(1), 1, 1, 1, 1), + Scale: 1, + }.Into() + + is.Equal(want, got) + + // Output: + // equal_test.go:35: Negative().BucketCounts().AsRaw(): [1 1 2] != [4] + // equal_test.go:35: Negative().BucketCounts().Len(): 3 != 1 + // equal_test.go:35: Positive().BucketCounts().AsRaw(): [1 1 2] != [4] + // equal_test.go:35: Positive().BucketCounts().Len(): 3 != 1 + // equal_test.go:35: Scale(): 0 != 1 +} + +func TestNone(*testing.T) {} + +type fakeT struct { + testing.TB +} + +func (t fakeT) Helper() {} + +func (t fakeT) Errorf(format string, args ...any) { + var from string + for i := 0; ; i++ { + pc, file, line, ok := runtime.Caller(i) + if !ok { + break + } + fn := runtime.FuncForPC(pc) + if strings.HasSuffix(fn.Name(), ".ExampleT_Equal") { + from = filepath.Base(file) + ":" + strconv.Itoa(line) + break + } + } + + fmt.Printf("%s: %s\n", from, fmt.Sprintf(format, args...)) +} diff --git a/processor/deltatocumulativeprocessor/internal/data/expo/expo_test.go b/processor/deltatocumulativeprocessor/internal/data/expo/expo_test.go index d7eb0cb2e9b3..60be5a1980fd 100644 --- a/processor/deltatocumulativeprocessor/internal/data/expo/expo_test.go +++ b/processor/deltatocumulativeprocessor/internal/data/expo/expo_test.go @@ -7,12 +7,13 @@ import ( "fmt" "testing" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/datatest" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/expo" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/expo/expotest" ) func TestAbsolute(t *testing.T) { - is := expotest.Is(t) + is := datatest.New(t) bs := expotest.Bins{ø, 1, 2, 3, 4, 5, ø, ø}.Into() abs := expo.Abs(bs) diff --git a/processor/deltatocumulativeprocessor/internal/data/expo/expotest/equal_test.go b/processor/deltatocumulativeprocessor/internal/data/expo/expotest/equal_test.go deleted file mode 100644 index 7fb7c42b586e..000000000000 --- a/processor/deltatocumulativeprocessor/internal/data/expo/expotest/equal_test.go +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package expotest - -import ( - "fmt" - "path/filepath" - "runtime" - "strconv" - "strings" - "testing" - - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/expo" -) - -var t testing.TB = fakeT{} - -var expotest = struct { - Is func(t testing.TB) T - Observe func(expo.Scale, ...float64) expo.Buckets -}{ - Is: Is, - Observe: Observe, -} - -func ExampleT_Equal() { - is := expotest.Is(t) - - want := Histogram{ - PosNeg: expotest.Observe(expo.Scale(0), 1, 2, 3, 4), - Scale: 0, - }.Into() - - got := Histogram{ - PosNeg: expotest.Observe(expo.Scale(1), 1, 1, 1, 1), - Scale: 1, - }.Into() - - is.Equal(want, got) - - // Output: - // equal_test.go:40: Negative().BucketCounts().AsRaw(): [1 1 2] != [4] - // equal_test.go:40: Negative().BucketCounts().Len(): 3 != 1 - // equal_test.go:40: Positive().BucketCounts().AsRaw(): [1 1 2] != [4] - // equal_test.go:40: Positive().BucketCounts().Len(): 3 != 1 - // equal_test.go:40: Scale(): 0 != 1 -} - -func TestNone(*testing.T) {} - -type fakeT struct { - testing.TB -} - -func (t fakeT) Helper() {} - -func (t fakeT) Errorf(format string, args ...any) { - var from string - for i := 0; ; i++ { - pc, file, line, ok := runtime.Caller(i) - if !ok { - break - } - fn := runtime.FuncForPC(pc) - if strings.HasSuffix(fn.Name(), ".ExampleT_Equal") { - from = filepath.Base(file) + ":" + strconv.Itoa(line) - break - } - } - - fmt.Printf("%s: %s\n", from, fmt.Sprintf(format, args...)) -} diff --git a/processor/deltatocumulativeprocessor/internal/data/expo/merge_test.go b/processor/deltatocumulativeprocessor/internal/data/expo/merge_test.go index 4d3791721bcd..a10ae2d73ffe 100644 --- a/processor/deltatocumulativeprocessor/internal/data/expo/merge_test.go +++ b/processor/deltatocumulativeprocessor/internal/data/expo/merge_test.go @@ -7,6 +7,7 @@ import ( "fmt" "testing" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/datatest" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/expo" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/expo/expotest" ) @@ -46,7 +47,7 @@ func TestMerge(t *testing.T) { name := fmt.Sprintf("(%+d,%d)+(%+d,%d)=(%+d,%d)", a.Offset(), a.BucketCounts().Len(), b.Offset(), b.BucketCounts().Len(), want.Offset(), want.BucketCounts().Len()) t.Run(name, func(t *testing.T) { expo.Merge(a, b) - is := expotest.Is(t) + is := datatest.New(t) is.Equal(want, a) }) } diff --git a/processor/deltatocumulativeprocessor/internal/data/expo/scale.go b/processor/deltatocumulativeprocessor/internal/data/expo/scale.go index ac075158dc3c..5201806fb82f 100644 --- a/processor/deltatocumulativeprocessor/internal/data/expo/scale.go +++ b/processor/deltatocumulativeprocessor/internal/data/expo/scale.go @@ -72,7 +72,7 @@ func Downscale(bs Buckets, from, to Scale) { func Collapse(bs Buckets) { counts := bs.BucketCounts() size := counts.Len() / 2 - if counts.Len()%2 != 0 { + if counts.Len()%2 != 0 || bs.Offset()%2 != 0 { size++ } diff --git a/processor/deltatocumulativeprocessor/internal/data/expo/scale_test.go b/processor/deltatocumulativeprocessor/internal/data/expo/scale_test.go index ceb76eb1d44d..22dbd1fbfc0b 100644 --- a/processor/deltatocumulativeprocessor/internal/data/expo/scale_test.go +++ b/processor/deltatocumulativeprocessor/internal/data/expo/scale_test.go @@ -12,8 +12,8 @@ import ( "github.com/stretchr/testify/assert" "go.opentelemetry.io/collector/pdata/pmetric" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/datatest" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/expo" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/expo/expotest" ) func TestDownscale(t *testing.T) { @@ -45,6 +45,18 @@ func TestDownscale(t *testing.T) { }, { {scale: 2, bkt: "1 1 1 1 1 1 1 1 1 1 1 1"}, {scale: 0, bkt: " 4 4 4 "}, + }, { + {scale: 1, bkt: "ø 1 1 0"}, + {scale: 0, bkt: " 1 1 "}, + }, { + {scale: 1, bkt: "ø 1 1 "}, + {scale: 0, bkt: " 1 1"}, + }, { + {scale: 1, bkt: " - 1 1 "}, + {scale: 0, bkt: "- 1 1"}, + }, { + {scale: 5, bkt: "- 4 0 3 0 3 0 0 8 "}, + {scale: 4, bkt: "- 4 3 3 0 8 "}, }} type B = expo.Buckets @@ -58,6 +70,10 @@ func TestDownscale(t *testing.T) { bkt.SetOffset(bkt.Offset() + 1) continue } + if elem == "-" { + bkt.SetOffset(bkt.Offset() - 1) + continue + } n, err := strconv.Atoi(elem) if err != nil { panic(err) @@ -67,7 +83,7 @@ func TestDownscale(t *testing.T) { buckets[i] = Repr[B]{scale: r.scale, bkt: bkt} } - is := expotest.Is(t) + is := datatest.New(t) for i := 0; i < len(buckets)-1; i++ { expo.Downscale(buckets[i].bkt, buckets[i].scale, buckets[i+1].scale) diff --git a/processor/deltatocumulativeprocessor/internal/data/expo/zero_test.go b/processor/deltatocumulativeprocessor/internal/data/expo/zero_test.go index 92e9d88a38d1..6c095bc098d0 100644 --- a/processor/deltatocumulativeprocessor/internal/data/expo/zero_test.go +++ b/processor/deltatocumulativeprocessor/internal/data/expo/zero_test.go @@ -9,6 +9,7 @@ import ( "github.com/stretchr/testify/assert" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/datatest" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/expo" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/expo/expotest" ) @@ -56,7 +57,7 @@ func TestWidenZero(t *testing.T) { } expo.WidenZero(hist, zt) - is := expotest.Is(t) + is := datatest.New(t) is.Equal(want, hist) }) } @@ -108,7 +109,7 @@ func TestSlice(t *testing.T) { expo.Abs(bins).Slice(from, to) - is := expotest.Is(t) + is := datatest.New(t) is.Equal(want, bins) }) } diff --git a/processor/deltatocumulativeprocessor/internal/data/expo_test.go b/processor/deltatocumulativeprocessor/internal/data/expo_test.go index b910b409cb55..190dd848c213 100644 --- a/processor/deltatocumulativeprocessor/internal/data/expo_test.go +++ b/processor/deltatocumulativeprocessor/internal/data/expo_test.go @@ -9,6 +9,7 @@ import ( "go.opentelemetry.io/collector/pdata/pmetric" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/datatest" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/expo" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/expo/expotest" ) @@ -16,10 +17,10 @@ import ( // represents none/absent/unset in several tests const ø = math.MaxUint64 -func TestAdd(t *testing.T) { +func TestExpoAdd(t *testing.T) { type expdp = expotest.Histogram type bins = expotest.Bins - var obs0 = expotest.Observe0 + obs0 := expotest.Observe0 cases := []struct { name string @@ -92,7 +93,7 @@ func TestAdd(t *testing.T) { for _, cs := range cases { run := func(dp, in expdp) func(t *testing.T) { return func(t *testing.T) { - is := expotest.Is(t) + is := datatest.New(t) var ( dp = ExpHistogram{dp.Into()} @@ -116,7 +117,6 @@ func TestAdd(t *testing.T) { } t.Run(cs.name, run(cs.dp, cs.in)) } - } func rawbs(data []uint64, offset int32) expo.Buckets { diff --git a/processor/deltatocumulativeprocessor/internal/data/histo/histo.go b/processor/deltatocumulativeprocessor/internal/data/histo/histo.go new file mode 100644 index 000000000000..8b486d75d98c --- /dev/null +++ b/processor/deltatocumulativeprocessor/internal/data/histo/histo.go @@ -0,0 +1,46 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package histo // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/histo" + +import ( + "slices" + + "go.opentelemetry.io/collector/pdata/pmetric" +) + +type DataPoint = pmetric.HistogramDataPoint + +type Bounds []float64 + +// Default boundaries, as defined per SDK spec: +// https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/sdk.md#explicit-bucket-histogram-aggregation +var DefaultBounds = Bounds{0, 5, 10, 25, 50, 75, 100, 250, 500, 750, 1000, 2500, 5000, 7500, 10000} + +func (bs Bounds) Observe(observations ...float64) DataPoint { + dp := pmetric.NewHistogramDataPoint() + dp.ExplicitBounds().FromRaw(bs) + dp.BucketCounts().EnsureCapacity(len(bs) + 1) + dp.BucketCounts().FromRaw(make([]uint64, len(bs)+1)) + + for _, obs := range observations { + at, _ := slices.BinarySearch(bs, obs) + dp.BucketCounts().SetAt(at, dp.BucketCounts().At(at)) + dp.SetCount(dp.Count() + 1) + dp.SetSum(dp.Sum() + obs) + + if !dp.HasMin() { + dp.SetMin(obs) + } else { + dp.SetMin(min(dp.Min(), obs)) + } + + if !dp.HasMax() { + dp.SetMax(obs) + } else { + dp.SetMax(max(dp.Max(), obs)) + } + } + + return dp +} diff --git a/processor/deltatocumulativeprocessor/internal/data/histo/histotest/histotest.go b/processor/deltatocumulativeprocessor/internal/data/histo/histotest/histotest.go new file mode 100644 index 000000000000..d564dea0834c --- /dev/null +++ b/processor/deltatocumulativeprocessor/internal/data/histo/histotest/histotest.go @@ -0,0 +1,68 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package histotest // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/histo/histotest" + +import ( + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/pmetric" + + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/histo" +) + +type Histogram struct { + Ts pcommon.Timestamp + + Bounds histo.Bounds + Buckets []uint64 + + Count uint64 + Sum *float64 + + Min, Max *float64 +} + +func (hist Histogram) Into() pmetric.HistogramDataPoint { + dp := pmetric.NewHistogramDataPoint() + + dp.SetTimestamp(hist.Ts) + + dp.ExplicitBounds().FromRaw(hist.Bounds) + if hist.Bounds == nil { + dp.ExplicitBounds().FromRaw(histo.DefaultBounds) + } + dp.BucketCounts().FromRaw(hist.Buckets) + + dp.SetCount(hist.Count) + if hist.Sum != nil { + dp.SetSum(*hist.Sum) + } + + if hist.Min != nil { + dp.SetMin(*hist.Min) + } + if hist.Max != nil { + dp.SetMax(*hist.Max) + } + + return dp +} + +type Bounds histo.Bounds + +func (bs Bounds) Observe(observations ...float64) Histogram { + dp := histo.Bounds(bs).Observe(observations...) + return Histogram{ + Ts: dp.Timestamp(), + Bounds: dp.ExplicitBounds().AsRaw(), + Buckets: dp.BucketCounts().AsRaw(), + Count: dp.Count(), + Sum: ptr(dp.Sum()), + Min: ptr(dp.Min()), + Max: ptr(dp.Max()), + } +} + +func ptr[T any](v T) *T { + return &v +} diff --git a/processor/deltatocumulativeprocessor/internal/data/histo_test.go b/processor/deltatocumulativeprocessor/internal/data/histo_test.go new file mode 100644 index 000000000000..86542bda4bfe --- /dev/null +++ b/processor/deltatocumulativeprocessor/internal/data/histo_test.go @@ -0,0 +1,74 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package data + +import ( + "testing" + + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/datatest" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/histo" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/histo/histotest" +) + +func TestHistoAdd(t *testing.T) { + type histdp = histotest.Histogram + obs := histotest.Bounds(histo.DefaultBounds).Observe + + cases := []struct { + name string + dp, in histdp + want histdp + flip bool + }{{ + name: "noop", + }, { + name: "simple", + dp: obs(-12, 5.5, 7.3, 43.3, 412.4 /* */), + in: obs( /* */ 4.3, 14.5, 2677.4), + want: obs(-12, 5.5, 7.3, 43.3, 412.4, 4.3, 14.5, 2677.4), + }, { + name: "diff-len", + dp: histdp{Buckets: []uint64{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, Count: 11}, + in: histdp{Buckets: []uint64{1, 1, 1, 1, 1 /* */}, Count: 5}, + want: histdp{Buckets: []uint64{2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1}, Count: 11 + 5}, + }, { + name: "diff-bounds", + dp: histotest.Bounds{12, 17}.Observe(3, 14, 187), + in: histotest.Bounds{34, 55}.Observe(8, 77, 142), + want: histotest.Bounds{34, 55}.Observe(8, 77, 142), + }, { + name: "no-counts", + dp: histdp{Count: 42 /**/, Sum: ptr(777.12 /* */), Min: ptr(12.3), Max: ptr(66.8)}, + in: histdp{Count: /**/ 33, Sum: ptr( /* */ 568.2), Min: ptr(8.21), Max: ptr(23.6)}, + want: histdp{Count: 42 + 33, Sum: ptr(777.12 + 568.2), Min: ptr(8.21), Max: ptr(66.8)}, + }, { + name: "optional-missing", + dp: histdp{Count: 42 /**/, Sum: ptr(777.0) /* */, Min: ptr(12.3), Max: ptr(66.8)}, + in: histdp{Count: /**/ 33}, + want: histdp{Count: 42 + 33}, + }} + + for _, cs := range cases { + t.Run(cs.name, func(t *testing.T) { + is := datatest.New(t) + + var ( + dp = Histogram{cs.dp.Into()} + in = Histogram{cs.in.Into()} + want = Histogram{cs.want.Into()} + ) + + dp.SetTimestamp(0) + in.SetTimestamp(1) + want.SetTimestamp(1) + + got := dp.Add(in) + is.Equal(got, want) + }) + } +} + +func ptr[T any](v T) *T { + return &v +} diff --git a/processor/deltatocumulativeprocessor/internal/delta/delta.go b/processor/deltatocumulativeprocessor/internal/delta/delta.go index 5539eb8c8e49..f2a759e9bfe9 100644 --- a/processor/deltatocumulativeprocessor/internal/delta/delta.go +++ b/processor/deltatocumulativeprocessor/internal/delta/delta.go @@ -7,56 +7,11 @@ import ( "fmt" "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/pmetric" - exp "github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics/streams" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/streams" ) -func New[D data.Point[D]]() Accumulator[D] { - return Accumulator[D]{ - Map: make(exp.HashMap[D]), - } -} - -var _ streams.Map[data.Number] = (*Accumulator[data.Number])(nil) - -type Accumulator[D data.Point[D]] struct { - streams.Map[D] -} - -func (a Accumulator[D]) Store(id streams.Ident, dp D) error { - aggr, ok := a.Map.Load(id) - - // new series: initialize with current sample - if !ok { - clone := dp.Clone() - return a.Map.Store(id, clone) - } - - // drop bad samples - switch { - case dp.StartTimestamp() < aggr.StartTimestamp(): - // belongs to older series - return ErrOlderStart{Start: aggr.StartTimestamp(), Sample: dp.StartTimestamp()} - case dp.Timestamp() <= aggr.Timestamp(): - // out of order - return ErrOutOfOrder{Last: aggr.Timestamp(), Sample: dp.Timestamp()} - } - - // detect gaps - var gap error - if dp.StartTimestamp() > aggr.Timestamp() { - gap = ErrGap{From: aggr.Timestamp(), To: dp.StartTimestamp()} - } - - res := aggr.Add(dp) - if err := a.Map.Store(id, res); err != nil { - return err - } - return gap -} - type ErrOlderStart struct { Start pcommon.Timestamp Sample pcommon.Timestamp @@ -75,10 +30,36 @@ func (e ErrOutOfOrder) Error() string { return fmt.Sprintf("out of order: dropped sample from time=%s, because series is already at time=%s", e.Sample, e.Last) } -type ErrGap struct { - From, To pcommon.Timestamp +type Type interface { + pmetric.NumberDataPoint | pmetric.HistogramDataPoint | pmetric.ExponentialHistogramDataPoint + + StartTimestamp() pcommon.Timestamp + Timestamp() pcommon.Timestamp } -func (e ErrGap) Error() string { - return fmt.Sprintf("gap in stream from %s to %s. samples were likely lost in transit", e.From, e.To) +// AccumulateInto adds state and dp, storing the result in state +// +// state = state + dp +func AccumulateInto[T Type](state, dp T) error { + switch { + case dp.StartTimestamp() < state.StartTimestamp(): + // belongs to older series + return ErrOlderStart{Start: state.StartTimestamp(), Sample: dp.StartTimestamp()} + case dp.Timestamp() <= state.Timestamp(): + // out of order + return ErrOutOfOrder{Last: state.Timestamp(), Sample: dp.Timestamp()} + } + + switch dp := any(dp).(type) { + case pmetric.NumberDataPoint: + state := any(state).(pmetric.NumberDataPoint) + data.Number{NumberDataPoint: state}.Add(data.Number{NumberDataPoint: dp}) + case pmetric.HistogramDataPoint: + state := any(state).(pmetric.HistogramDataPoint) + data.Histogram{HistogramDataPoint: state}.Add(data.Histogram{HistogramDataPoint: dp}) + case pmetric.ExponentialHistogramDataPoint: + state := any(state).(pmetric.ExponentialHistogramDataPoint) + data.ExpHistogram{DataPoint: state}.Add(data.ExpHistogram{DataPoint: dp}) + } + return nil } diff --git a/processor/deltatocumulativeprocessor/internal/delta/delta_test.go b/processor/deltatocumulativeprocessor/internal/delta/delta_test.go deleted file mode 100644 index 919d4b852251..000000000000 --- a/processor/deltatocumulativeprocessor/internal/delta/delta_test.go +++ /dev/null @@ -1,215 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package delta_test - -import ( - "fmt" - "math/rand" - "strconv" - "sync" - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/pdata/pcommon" - - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/delta" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/streams" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/testdata/random" -) - -var result any - -func aggr() streams.Aggregator[data.Number] { - return streams.IntoAggregator(delta.New[data.Number]()) -} - -func BenchmarkAccumulator(b *testing.B) { - acc := aggr() - sum := random.Sum() - - bench := func(b *testing.B, nstreams int) { - nsamples := b.N / nstreams - - ids := make([]streams.Ident, nstreams) - dps := make([]data.Number, nstreams) - for i := 0; i < nstreams; i++ { - ids[i], dps[i] = sum.Stream() - } - - b.ResetTimer() - - var wg sync.WaitGroup - for i := 0; i < nstreams; i++ { - wg.Add(1) - go func(id streams.Ident, num data.Number) { - for n := 0; n < nsamples; n++ { - num.SetTimestamp(num.Timestamp() + 1) - val, err := acc.Aggregate(id, num) - if err != nil { - panic(err) - } - result = val - } - wg.Done() - }(ids[i], dps[i]) - } - - wg.Wait() - } - - nstreams := []int{1, 2, 10, 100, 1000} - for _, n := range nstreams { - b.Run(strconv.Itoa(n), func(b *testing.B) { - bench(b, n) - }) - } -} - -// verify the distinction between streams and the accumulated value -func TestAddition(t *testing.T) { - acc := aggr() - sum := random.Sum() - - type Idx int - type Stream struct { - idx Idx - id streams.Ident - dp data.Number - } - - streams := make([]Stream, 10) - for i := range streams { - id, dp := sum.Stream() - streams[i] = Stream{ - idx: Idx(i), - id: id, - dp: dp, - } - } - - want := make(map[Idx]int64) - for i := 0; i < 100; i++ { - stream := streams[rand.Intn(10)] - dp := stream.dp.Clone() - dp.SetTimestamp(dp.Timestamp() + pcommon.Timestamp(i)) - - val := int64(rand.Intn(255)) - dp.SetIntValue(val) - want[stream.idx] += val - - got, err := acc.Aggregate(stream.id, dp) - require.NoError(t, err) - - require.Equal(t, want[stream.idx], got.IntValue()) - } -} - -// verify that start + last times are updated -func TestTimes(t *testing.T) { - acc := aggr() - id, base := random.Sum().Stream() - point := func(start, last pcommon.Timestamp) data.Number { - dp := base.Clone() - dp.SetStartTimestamp(start) - dp.SetTimestamp(last) - return dp - } - - // first sample: its the first ever, so take it as-is - { - dp := point(1000, 1000) - res, err := acc.Aggregate(id, dp) - - require.NoError(t, err) - require.Equal(t, time(1000), res.StartTimestamp()) - require.Equal(t, time(1000), res.Timestamp()) - } - - // second sample: its subsequent, so keep original startTime, but update lastSeen - { - dp := point(1000, 1100) - res, err := acc.Aggregate(id, dp) - - require.NoError(t, err) - require.Equal(t, time(1000), res.StartTimestamp()) - require.Equal(t, time(1100), res.Timestamp()) - } - - // third sample: its subsequent, but has a more recent startTime, which is - // PERMITTED by the spec. - // still keep original startTime, but update lastSeen. - { - dp := point(1100, 1200) - res, err := acc.Aggregate(id, dp) - - require.NoError(t, err) - require.Equal(t, time(1000), res.StartTimestamp()) - require.Equal(t, time(1200), res.Timestamp()) - } -} - -func TestErrs(t *testing.T) { - type Point struct { - Start int - Time int - Value int - } - type Case struct { - Good Point - Bad Point - Err error - } - - cases := []Case{ - { - Good: Point{Start: 1234, Time: 1337, Value: 42}, - Bad: Point{Start: 1000, Time: 2000, Value: 24}, - Err: delta.ErrOlderStart{Start: time(1234), Sample: time(1000)}, - }, - { - Good: Point{Start: 1234, Time: 1337, Value: 42}, - Bad: Point{Start: 1234, Time: 1336, Value: 24}, - Err: delta.ErrOutOfOrder{Last: time(1337), Sample: time(1336)}, - }, - } - - for _, c := range cases { - c := c - t.Run(fmt.Sprintf("%T", c.Err), func(t *testing.T) { - acc := aggr() - id, data := random.Sum().Stream() - - good := data.Clone() - good.SetStartTimestamp(pcommon.Timestamp(c.Good.Start)) - good.SetTimestamp(pcommon.Timestamp(c.Good.Time)) - good.SetIntValue(int64(c.Good.Value)) - - r1, err := acc.Aggregate(id, good) - require.NoError(t, err) - - require.Equal(t, good.StartTimestamp(), r1.StartTimestamp()) - require.Equal(t, good.Timestamp(), r1.Timestamp()) - require.Equal(t, good.IntValue(), r1.IntValue()) - - bad := data.Clone() - bad.SetStartTimestamp(pcommon.Timestamp(c.Bad.Start)) - bad.SetTimestamp(pcommon.Timestamp(c.Bad.Time)) - bad.SetIntValue(int64(c.Bad.Value)) - - r2, err := acc.Aggregate(id, bad) - require.ErrorIs(t, err, c.Err) - - // sample must be dropped => no change - require.Equal(t, r1.StartTimestamp(), r2.StartTimestamp()) - require.Equal(t, r1.Timestamp(), r2.Timestamp()) - require.Equal(t, r1.IntValue(), r2.IntValue()) - }) - } - -} - -func time(ts int) pcommon.Timestamp { - return pcommon.Timestamp(ts) -} diff --git a/processor/deltatocumulativeprocessor/internal/maybe/ptr.go b/processor/deltatocumulativeprocessor/internal/maybe/ptr.go deleted file mode 100644 index 8f40b8d277b3..000000000000 --- a/processor/deltatocumulativeprocessor/internal/maybe/ptr.go +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -// maybe provides utilities for representing data may or may not exist at -// runtime in a safe way. -// -// A typical approach to this are pointers, but they suffer from two issues: -// - Unsafety: permitting nil pointers must require careful checking on each use, -// which is easily forgotten -// - Blindness: nil itself does cannot differentiate between "set to nil" and -// "not set all", leading to unexepcted edge cases -// -// The [Ptr] type of this package provides a safe alternative with a clear -// distinction between "not set" and "set to nil". -package maybe // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/maybe" - -// Ptr references some value of type T that is not guaranteed to exist. -// Callers must use [Ptr.Try] to access the underlying value, checking the -// ok return value too. -// This provides a clear distinction between "not set" and "set to nil". -// -// Use [Some] and [None] to create Ptrs. -type Ptr[T any] struct { - to *T - ok bool -} - -// None returns a Ptr that represents "not-set". -// This is equal to a zero-value Ptr. -func None[T any]() Ptr[T] { - return Ptr[T]{to: nil, ok: false} -} - -// Some returns a pointer to the passed T. -// -// The ptr argument may be nil, in which case this represents "explicitly set to -// nil". -func Some[T any](ptr *T) Ptr[T] { - return Ptr[T]{to: ptr, ok: true} -} - -// Try attempts to de-reference the Ptr, giving one of three results: -// -// - nil, false: not-set -// - nil, true: explicitly set to nil -// - non-nil, true: set to some value -// -// This provides extra safety over bare pointers, because callers are forced by -// the compiler to either check or explicitly ignore the ok value. -func (ptr Ptr[T]) Try() (_ *T, ok bool) { - return ptr.to, ptr.ok -} diff --git a/processor/deltatocumulativeprocessor/internal/maybe/ptr_test.go b/processor/deltatocumulativeprocessor/internal/maybe/ptr_test.go deleted file mode 100644 index c32c34e7e505..000000000000 --- a/processor/deltatocumulativeprocessor/internal/maybe/ptr_test.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package maybe_test - -import ( - "fmt" - "testing" - - "github.com/stretchr/testify/require" - - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/maybe" -) - -func TestMaybe(t *testing.T) { - t.Run("zero-not-ok", func(t *testing.T) { - var ptr maybe.Ptr[int] - _, ok := ptr.Try() - require.False(t, ok) - }) - t.Run("none-not-ok", func(t *testing.T) { - ptr := maybe.None[int]() - _, ok := ptr.Try() - require.False(t, ok) - }) - t.Run("explicit-nil", func(t *testing.T) { - ptr := maybe.Some[int](nil) - v, ok := ptr.Try() - require.Nil(t, v) - require.True(t, ok) - }) - t.Run("value", func(t *testing.T) { - num := 42 - ptr := maybe.Some(&num) - v, ok := ptr.Try() - require.True(t, ok) - require.Equal(t, num, *v) - }) -} - -func ExamplePtr() { - var unset maybe.Ptr[int] // = maybe.None() - if v, ok := unset.Try(); ok { - fmt.Println("unset:", v) - } else { - fmt.Println("unset: !ok") - } - - var xnil maybe.Ptr[int] = maybe.Some[int](nil) - if v, ok := xnil.Try(); ok { - fmt.Println("explicit nil:", v) - } - - num := 42 - var set maybe.Ptr[int] = maybe.Some(&num) - if v, ok := set.Try(); ok { - fmt.Println("set:", *v) - } - - // Output: - // unset: !ok - // explicit nil: - // set: 42 -} diff --git a/processor/deltatocumulativeprocessor/internal/metadata/generated_status.go b/processor/deltatocumulativeprocessor/internal/metadata/generated_status.go index b05ad319d0bb..25a4f5a32ff2 100644 --- a/processor/deltatocumulativeprocessor/internal/metadata/generated_status.go +++ b/processor/deltatocumulativeprocessor/internal/metadata/generated_status.go @@ -7,9 +7,10 @@ import ( ) var ( - Type = component.MustNewType("deltatocumulative") + Type = component.MustNewType("deltatocumulative") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor" ) const ( - MetricsStability = component.StabilityLevelDevelopment + MetricsStability = component.StabilityLevelAlpha ) diff --git a/processor/deltatocumulativeprocessor/internal/metadata/generated_telemetry.go b/processor/deltatocumulativeprocessor/internal/metadata/generated_telemetry.go index 47e60276e3a3..82a4476ba92c 100644 --- a/processor/deltatocumulativeprocessor/internal/metadata/generated_telemetry.go +++ b/processor/deltatocumulativeprocessor/internal/metadata/generated_telemetry.go @@ -3,15 +3,133 @@ package metadata import ( - "go.opentelemetry.io/collector/component" + "context" + "errors" + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/metric/noop" "go.opentelemetry.io/otel/trace" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configtelemetry" ) func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/deltatocumulative") + return settings.MeterProvider.Meter("github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor") } func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/deltatocumulative") + return settings.TracerProvider.Tracer("github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor") +} + +// TelemetryBuilder provides an interface for components to report telemetry +// as defined in metadata and user config. +type TelemetryBuilder struct { + meter metric.Meter + DeltatocumulativeDatapointsDropped metric.Int64Counter + DeltatocumulativeDatapointsLinear metric.Int64Counter + DeltatocumulativeDatapointsProcessed metric.Int64Counter + DeltatocumulativeGapsLength metric.Int64Counter + DeltatocumulativeStreamsEvicted metric.Int64Counter + DeltatocumulativeStreamsLimit metric.Int64Gauge + DeltatocumulativeStreamsMaxStale metric.Int64Gauge + DeltatocumulativeStreamsTracked metric.Int64UpDownCounter + DeltatocumulativeStreamsTrackedLinear metric.Int64ObservableUpDownCounter + observeDeltatocumulativeStreamsTrackedLinear func(context.Context, metric.Observer) error +} + +// TelemetryBuilderOption applies changes to default builder. +type TelemetryBuilderOption interface { + apply(*TelemetryBuilder) +} + +type telemetryBuilderOptionFunc func(mb *TelemetryBuilder) + +func (tbof telemetryBuilderOptionFunc) apply(mb *TelemetryBuilder) { + tbof(mb) +} + +// WithDeltatocumulativeStreamsTrackedLinearCallback sets callback for observable DeltatocumulativeStreamsTrackedLinear metric. +func WithDeltatocumulativeStreamsTrackedLinearCallback(cb func() int64, opts ...metric.ObserveOption) TelemetryBuilderOption { + return telemetryBuilderOptionFunc(func(builder *TelemetryBuilder) { + builder.observeDeltatocumulativeStreamsTrackedLinear = func(_ context.Context, o metric.Observer) error { + o.ObserveInt64(builder.DeltatocumulativeStreamsTrackedLinear, cb(), opts...) + return nil + } + }) +} + +// NewTelemetryBuilder provides a struct with methods to update all internal telemetry +// for a component +func NewTelemetryBuilder(settings component.TelemetrySettings, options ...TelemetryBuilderOption) (*TelemetryBuilder, error) { + builder := TelemetryBuilder{} + for _, op := range options { + op.apply(&builder) + } + builder.meter = Meter(settings) + var err, errs error + builder.DeltatocumulativeDatapointsDropped, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_deltatocumulative.datapoints.dropped", + metric.WithDescription("number of datapoints dropped due to given 'reason'"), + metric.WithUnit("{datapoint}"), + ) + errs = errors.Join(errs, err) + builder.DeltatocumulativeDatapointsLinear, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_deltatocumulative.datapoints.linear", + metric.WithDescription("total number of datapoints processed. may have 'error' attribute, if processing failed"), + metric.WithUnit("{datapoint}"), + ) + errs = errors.Join(errs, err) + builder.DeltatocumulativeDatapointsProcessed, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_deltatocumulative.datapoints.processed", + metric.WithDescription("number of datapoints processed"), + metric.WithUnit("{datapoint}"), + ) + errs = errors.Join(errs, err) + builder.DeltatocumulativeGapsLength, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_deltatocumulative.gaps.length", + metric.WithDescription("total duration where data was expected but not received"), + metric.WithUnit("s"), + ) + errs = errors.Join(errs, err) + builder.DeltatocumulativeStreamsEvicted, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_deltatocumulative.streams.evicted", + metric.WithDescription("number of streams evicted"), + metric.WithUnit("{stream}"), + ) + errs = errors.Join(errs, err) + builder.DeltatocumulativeStreamsLimit, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Gauge( + "otelcol_deltatocumulative.streams.limit", + metric.WithDescription("upper limit of tracked streams"), + metric.WithUnit("{stream}"), + ) + errs = errors.Join(errs, err) + builder.DeltatocumulativeStreamsMaxStale, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Gauge( + "otelcol_deltatocumulative.streams.max_stale", + metric.WithDescription("duration after which streams inactive streams are dropped"), + metric.WithUnit("s"), + ) + errs = errors.Join(errs, err) + builder.DeltatocumulativeStreamsTracked, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64UpDownCounter( + "otelcol_deltatocumulative.streams.tracked", + metric.WithDescription("number of streams tracked"), + metric.WithUnit("{dps}"), + ) + errs = errors.Join(errs, err) + builder.DeltatocumulativeStreamsTrackedLinear, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64ObservableUpDownCounter( + "otelcol_deltatocumulative.streams.tracked.linear", + metric.WithDescription("number of streams tracked"), + metric.WithUnit("{dps}"), + ) + errs = errors.Join(errs, err) + _, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).RegisterCallback(builder.observeDeltatocumulativeStreamsTrackedLinear, builder.DeltatocumulativeStreamsTrackedLinear) + errs = errors.Join(errs, err) + return &builder, errs +} + +func getLeveledMeter(meter metric.Meter, cfgLevel, srvLevel configtelemetry.Level) metric.Meter { + if cfgLevel <= srvLevel { + return meter + } + return noop.Meter{} } diff --git a/processor/deltatocumulativeprocessor/internal/metadata/generated_telemetry_test.go b/processor/deltatocumulativeprocessor/internal/metadata/generated_telemetry_test.go index 492fa62a3832..72c9d3fd624c 100644 --- a/processor/deltatocumulativeprocessor/internal/metadata/generated_telemetry_test.go +++ b/processor/deltatocumulativeprocessor/internal/metadata/generated_telemetry_test.go @@ -14,6 +14,7 @@ import ( nooptrace "go.opentelemetry.io/otel/trace/noop" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" ) type mockMeter struct { @@ -49,15 +50,25 @@ func TestProviders(t *testing.T) { meter := Meter(set) if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/deltatocumulative", m.name) + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor", m.name) } else { require.Fail(t, "returned Meter not mockMeter") } tracer := Tracer(set) if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/deltatocumulative", m.name) + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor", m.name) } else { require.Fail(t, "returned Meter not mockTracer") } } + +func TestNewTelemetryBuilder(t *testing.T) { + set := componenttest.NewNopTelemetrySettings() + applied := false + _, err := NewTelemetryBuilder(set, telemetryBuilderOptionFunc(func(b *TelemetryBuilder) { + applied = true + })) + require.NoError(t, err) + require.True(t, applied) +} diff --git a/processor/deltatocumulativeprocessor/internal/metrics/data.go b/processor/deltatocumulativeprocessor/internal/metrics/data.go index f063475055f7..cb9b2c0ef73d 100644 --- a/processor/deltatocumulativeprocessor/internal/metrics/data.go +++ b/processor/deltatocumulativeprocessor/internal/metrics/data.go @@ -4,22 +4,11 @@ package metrics // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/metrics" import ( - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data" + "go.opentelemetry.io/collector/pdata/pmetric" ) -type Data[D data.Point[D]] interface { - At(i int) D - Len() int - Ident() Ident -} - type Sum Metric -func (s Sum) At(i int) data.Number { - dp := Metric(s).Sum().DataPoints().At(i) - return data.Number{NumberDataPoint: dp} -} - func (s Sum) Len() int { return Metric(s).Sum().DataPoints().Len() } @@ -28,13 +17,12 @@ func (s Sum) Ident() Ident { return (*Metric)(&s).Ident() } -type Histogram Metric - -func (s Histogram) At(i int) data.Histogram { - dp := Metric(s).Histogram().DataPoints().At(i) - return data.Histogram{HistogramDataPoint: dp} +func (s Sum) SetAggregationTemporality(at pmetric.AggregationTemporality) { + s.Sum().SetAggregationTemporality(at) } +type Histogram Metric + func (s Histogram) Len() int { return Metric(s).Histogram().DataPoints().Len() } @@ -43,13 +31,12 @@ func (s Histogram) Ident() Ident { return (*Metric)(&s).Ident() } -type ExpHistogram Metric - -func (s ExpHistogram) At(i int) data.ExpHistogram { - dp := Metric(s).ExponentialHistogram().DataPoints().At(i) - return data.ExpHistogram{DataPoint: dp} +func (s Histogram) SetAggregationTemporality(at pmetric.AggregationTemporality) { + s.Histogram().SetAggregationTemporality(at) } +type ExpHistogram Metric + func (s ExpHistogram) Len() int { return Metric(s).ExponentialHistogram().DataPoints().Len() } @@ -57,3 +44,31 @@ func (s ExpHistogram) Len() int { func (s ExpHistogram) Ident() Ident { return (*Metric)(&s).Ident() } + +func (s ExpHistogram) SetAggregationTemporality(at pmetric.AggregationTemporality) { + s.ExponentialHistogram().SetAggregationTemporality(at) +} + +type Gauge Metric + +func (s Gauge) Len() int { + return Metric(s).Gauge().DataPoints().Len() +} + +func (s Gauge) Ident() Ident { + return (*Metric)(&s).Ident() +} + +func (s Gauge) SetAggregationTemporality(pmetric.AggregationTemporality) {} + +type Summary Metric + +func (s Summary) Len() int { + return Metric(s).Summary().DataPoints().Len() +} + +func (s Summary) Ident() Ident { + return (*Metric)(&s).Ident() +} + +func (s Summary) SetAggregationTemporality(pmetric.AggregationTemporality) {} diff --git a/processor/deltatocumulativeprocessor/internal/metrics/iter.go b/processor/deltatocumulativeprocessor/internal/metrics/iter.go new file mode 100644 index 000000000000..29d94051bfa2 --- /dev/null +++ b/processor/deltatocumulativeprocessor/internal/metrics/iter.go @@ -0,0 +1,20 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package metrics // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/metrics" + +import ( + "go.opentelemetry.io/collector/pdata/pmetric" +) + +func Filter(md pmetric.Metrics, keep func(Metric) bool) { + md.ResourceMetrics().RemoveIf(func(rm pmetric.ResourceMetrics) bool { + rm.ScopeMetrics().RemoveIf(func(sm pmetric.ScopeMetrics) bool { + sm.Metrics().RemoveIf(func(m pmetric.Metric) bool { + return !keep(From(rm.Resource(), sm.Scope(), m)) + }) + return sm.Metrics().Len() == 0 + }) + return rm.ScopeMetrics().Len() == 0 + }) +} diff --git a/processor/deltatocumulativeprocessor/internal/metrics/metrics.go b/processor/deltatocumulativeprocessor/internal/metrics/metrics.go index 6b705f5a7d24..d65e3b8341a0 100644 --- a/processor/deltatocumulativeprocessor/internal/metrics/metrics.go +++ b/processor/deltatocumulativeprocessor/internal/metrics/metrics.go @@ -22,6 +22,89 @@ func (m *Metric) Ident() Ident { return identity.OfResourceMetric(m.res, m.scope, m.Metric) } +func (m *Metric) Resource() pcommon.Resource { + return m.res +} + +func (m *Metric) Scope() pcommon.InstrumentationScope { + return m.scope +} + func From(res pcommon.Resource, scope pcommon.InstrumentationScope, metric pmetric.Metric) Metric { return Metric{res: res, scope: scope, Metric: metric} } + +func (m Metric) AggregationTemporality() pmetric.AggregationTemporality { + switch m.Type() { + case pmetric.MetricTypeSum: + return m.Sum().AggregationTemporality() + case pmetric.MetricTypeHistogram: + return m.Histogram().AggregationTemporality() + case pmetric.MetricTypeExponentialHistogram: + return m.ExponentialHistogram().AggregationTemporality() + } + + return pmetric.AggregationTemporalityUnspecified +} + +func (m Metric) Typed() Any { + //exhaustive:enforce + switch m.Type() { + case pmetric.MetricTypeSum: + return Sum(m) + case pmetric.MetricTypeGauge: + return Gauge(m) + case pmetric.MetricTypeExponentialHistogram: + return ExpHistogram(m) + case pmetric.MetricTypeHistogram: + return Histogram(m) + case pmetric.MetricTypeSummary: + return Summary(m) + } + panic("unreachable") +} + +var ( + _ Any = Sum{} + _ Any = Gauge{} + _ Any = ExpHistogram{} + _ Any = Histogram{} + _ Any = Summary{} +) + +type Any interface { + Len() int + Ident() identity.Metric + SetAggregationTemporality(pmetric.AggregationTemporality) +} + +func (m Metric) Filter(ok func(id identity.Stream, dp any) bool) { + mid := m.Ident() + switch m.Type() { + case pmetric.MetricTypeSum: + m.Sum().DataPoints().RemoveIf(func(dp pmetric.NumberDataPoint) bool { + id := identity.OfStream(mid, dp) + return !ok(id, dp) + }) + case pmetric.MetricTypeGauge: + m.Gauge().DataPoints().RemoveIf(func(dp pmetric.NumberDataPoint) bool { + id := identity.OfStream(mid, dp) + return !ok(id, dp) + }) + case pmetric.MetricTypeHistogram: + m.Histogram().DataPoints().RemoveIf(func(dp pmetric.HistogramDataPoint) bool { + id := identity.OfStream(mid, dp) + return !ok(id, dp) + }) + case pmetric.MetricTypeExponentialHistogram: + m.ExponentialHistogram().DataPoints().RemoveIf(func(dp pmetric.ExponentialHistogramDataPoint) bool { + id := identity.OfStream(mid, dp) + return !ok(id, dp) + }) + case pmetric.MetricTypeSummary: + m.Summary().DataPoints().RemoveIf(func(dp pmetric.SummaryDataPoint) bool { + id := identity.OfStream(mid, dp) + return !ok(id, dp) + }) + } +} diff --git a/processor/deltatocumulativeprocessor/internal/metrics/util.go b/processor/deltatocumulativeprocessor/internal/metrics/util.go deleted file mode 100644 index 985716b3cc0f..000000000000 --- a/processor/deltatocumulativeprocessor/internal/metrics/util.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package metrics // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/metrics" - -import "go.opentelemetry.io/collector/pdata/pmetric" - -func Filter(metrics pmetric.Metrics, fn func(m Metric) bool) { - metrics.ResourceMetrics().RemoveIf(func(rm pmetric.ResourceMetrics) bool { - rm.ScopeMetrics().RemoveIf(func(sm pmetric.ScopeMetrics) bool { - sm.Metrics().RemoveIf(func(m pmetric.Metric) bool { - return !fn(From(rm.Resource(), sm.Scope(), m)) - }) - return false - }) - return false - }) -} - -func Each(metrics pmetric.Metrics, fn func(m Metric)) { - Filter(metrics, func(m Metric) bool { - fn(m) - return true - }) -} diff --git a/processor/deltatocumulativeprocessor/internal/putil/pslice/pslice.go b/processor/deltatocumulativeprocessor/internal/putil/pslice/pslice.go new file mode 100644 index 000000000000..6cc97af04132 --- /dev/null +++ b/processor/deltatocumulativeprocessor/internal/putil/pslice/pslice.go @@ -0,0 +1,31 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package pslice // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/putil/pslice" + +type Slice[E any] interface { + At(int) E + Len() int +} + +func Equal[E comparable, S Slice[E]](a, b S) bool { + if a.Len() != b.Len() { + return false + } + for i := 0; i < a.Len(); i++ { + if a.At(i) != b.At(i) { + return false + } + } + return true +} + +func All[E any, S Slice[E]](slice S) func(func(E) bool) { + return func(yield func(E) bool) { + for i := 0; i < slice.Len(); i++ { + if !yield(slice.At(i)) { + break + } + } + } +} diff --git a/processor/deltatocumulativeprocessor/internal/streams/data.go b/processor/deltatocumulativeprocessor/internal/streams/data.go deleted file mode 100644 index 435202cffabe..000000000000 --- a/processor/deltatocumulativeprocessor/internal/streams/data.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package streams // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/streams" - -import ( - "errors" - - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics/identity" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/metrics" -) - -// Samples returns an Iterator over each sample of all streams in the metric -func Samples[D data.Point[D]](m metrics.Data[D]) Seq[D] { - mid := m.Ident() - - return func(yield func(Ident, D) bool) bool { - for i := 0; i < m.Len(); i++ { - dp := m.At(i) - id := identity.OfStream(mid, dp) - if !yield(id, dp) { - break - } - } - return false - } -} - -// Aggregate each point and replace it by the result -func Aggregate[D data.Point[D]](m metrics.Data[D], aggr Aggregator[D]) error { - var errs error - - // for id, dp := range Samples(m) - Samples(m)(func(id Ident, dp D) bool { - next, err := aggr.Aggregate(id, dp) - if err != nil { - errs = errors.Join(errs, Error(id, err)) - return true - } - next.CopyTo(dp) - return true - }) - - return errs -} diff --git a/processor/deltatocumulativeprocessor/internal/streams/data_test.go b/processor/deltatocumulativeprocessor/internal/streams/data_test.go deleted file mode 100644 index 69bef711eb7e..000000000000 --- a/processor/deltatocumulativeprocessor/internal/streams/data_test.go +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package streams_test - -import ( - "testing" - - "github.com/stretchr/testify/require" - - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics/identity" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/metrics" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/streams" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/testdata/random" -) - -var rdp data.Number -var rid streams.Ident - -func BenchmarkSamples(b *testing.B) { - b.Run("iterfn", func(b *testing.B) { - dps := generate(b.N) - b.ResetTimer() - - streams.Samples[data.Number](dps)(func(id streams.Ident, dp data.Number) bool { - rdp = dp - rid = id - return true - }) - }) - - b.Run("iface", func(b *testing.B) { - dps := generate(b.N) - mid := dps.id.Metric() - b.ResetTimer() - - for i := 0; i < dps.Len(); i++ { - dp := dps.At(i) - rid = identity.OfStream(mid, dp) - rdp = dp - } - }) - - b.Run("loop", func(b *testing.B) { - dps := generate(b.N) - mid := dps.id.Metric() - b.ResetTimer() - - for i := range dps.dps { - dp := dps.dps[i] - rid = identity.OfStream(mid, dp) - rdp = dp - } - }) -} - -func TestSample(t *testing.T) { - const total = 1000 - dps := generate(total) - - // check that all samples are visited - seen := 0 - streams.Samples[data.Number](dps)(func(id streams.Ident, dp data.Number) bool { - require.Equal(t, dps.id, id) - require.Equal(t, dps.dps[seen], dp) - seen++ - return true - }) - - require.Equal(t, total, seen) -} - -func TestAggregate(t *testing.T) { - const total = 1000 - dps := generate(total) - - // inv aggregator inverts each sample - inv := aggr(func(_ streams.Ident, n data.Number) (data.Number, error) { - dp := n.Clone() - dp.SetIntValue(-dp.IntValue()) - return dp, nil - }) - - err := streams.Aggregate(dps, inv) - require.NoError(t, err) - - // check that all samples are inverted - for i := 0; i < total; i++ { - require.Equal(t, int64(-i), dps.dps[i].IntValue()) - } -} - -func generate(n int) Data { - id, ndp := random.Sum().Stream() - dps := Data{id: id, dps: make([]data.Number, n)} - for i := range dps.dps { - dp := ndp.Clone() - dp.SetIntValue(int64(i)) - dps.dps[i] = dp - } - return dps -} - -type Data struct { - id streams.Ident - dps []data.Number -} - -func (l Data) At(i int) data.Number { - return l.dps[i] -} - -func (l Data) Len() int { - return len(l.dps) -} - -func (l Data) Ident() metrics.Ident { - return l.id.Metric() -} - -type aggr func(streams.Ident, data.Number) (data.Number, error) - -func (a aggr) Aggregate(id streams.Ident, dp data.Number) (data.Number, error) { - return a(id, dp) -} diff --git a/processor/deltatocumulativeprocessor/internal/streams/errors.go b/processor/deltatocumulativeprocessor/internal/streams/errors.go deleted file mode 100644 index e69827a6212c..000000000000 --- a/processor/deltatocumulativeprocessor/internal/streams/errors.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package streams // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/streams" - -import ( - "fmt" -) - -func Error(id Ident, err error) error { - return StreamErr{Ident: id, Err: err} -} - -type StreamErr struct { - Ident Ident - Err error -} - -func (e StreamErr) Error() string { - return fmt.Sprintf("%s: %s", e.Ident, e.Err) -} diff --git a/processor/deltatocumulativeprocessor/internal/streams/limit.go b/processor/deltatocumulativeprocessor/internal/streams/limit.go deleted file mode 100644 index dd1d927687c9..000000000000 --- a/processor/deltatocumulativeprocessor/internal/streams/limit.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package streams // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/streams" - -import ( - "errors" - "fmt" - - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics/identity" - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics/streams" -) - -func Limit[T any](m Map[T], max int) LimitMap[T] { - return LimitMap[T]{ - Map: m, Max: max, - Evictor: EvictorFunc(func() (identity.Stream, bool) { - return identity.Stream{}, false - }), - } -} - -type LimitMap[T any] struct { - Max int - - Evictor streams.Evictor - streams.Map[T] -} - -func (m LimitMap[T]) Store(id identity.Stream, v T) error { - _, exist := m.Map.Load(id) - - var errEv error - // if not already tracked and no space: try to evict - if !exist && m.Map.Len() >= m.Max { - errl := ErrLimit(m.Max) - gone, ok := m.Evictor.Evict() - if !ok { - // if no eviction possible, fail as there is no space - return errl - } - errEv = ErrEvicted{ErrLimit: errl, Ident: gone} - } - - // there was space, or we made space: store it - if err := m.Map.Store(id, v); err != nil { - return err - } - - // we may have evicted something, let the caller know - return errEv -} - -type ErrLimit int - -func (e ErrLimit) Error() string { - return fmt.Sprintf("stream limit of %d reached", e) -} - -func AtLimit(err error) bool { - var errLimit ErrLimit - return errors.As(err, &errLimit) -} - -type ErrEvicted struct { - ErrLimit - Ident Ident -} - -func (e ErrEvicted) Error() string { - return fmt.Sprintf("%s. evicted stream %s", e.ErrLimit, e.Ident) -} - -type EvictorFunc func() (identity.Stream, bool) - -func (ev EvictorFunc) Evict() (identity.Stream, bool) { - return ev() -} diff --git a/processor/deltatocumulativeprocessor/internal/streams/limit_test.go b/processor/deltatocumulativeprocessor/internal/streams/limit_test.go deleted file mode 100644 index 380f657eb227..000000000000 --- a/processor/deltatocumulativeprocessor/internal/streams/limit_test.go +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package streams_test - -import ( - "testing" - - "github.com/stretchr/testify/require" - - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics/identity" - exp "github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics/streams" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/streams" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/testdata/random" -) - -func TestLimit(t *testing.T) { - sum := random.Sum() - - items := make(exp.HashMap[data.Number]) - lim := streams.Limit(items, 10) - - ids := make([]identity.Stream, 10) - dps := make([]data.Number, 10) - - // write until limit must work - for i := 0; i < 10; i++ { - id, dp := sum.Stream() - ids[i] = id - dps[i] = dp - err := lim.Store(id, dp) - require.NoError(t, err) - } - - // one over limit must be rejected - { - id, dp := sum.Stream() - err := lim.Store(id, dp) - want := streams.ErrLimit(10) - require.ErrorAs(t, err, &want) - require.True(t, streams.AtLimit(err)) - } - - // write to existing must work - { - err := lim.Store(ids[3], dps[3]) - require.NoError(t, err) - } - - // after removing one, must be accepted again - { - lim.Delete(ids[0]) - - id, dp := sum.Stream() - err := lim.Store(id, dp) - require.NoError(t, err) - } -} - -func TestLimitEvict(t *testing.T) { - sum := random.Sum() - evictable := make(map[identity.Stream]struct{}) - - items := make(exp.HashMap[data.Number]) - lim := streams.Limit(items, 5) - - ids := make([]identity.Stream, 10) - lim.Evictor = streams.EvictorFunc(func() (identity.Stream, bool) { - for _, id := range ids { - if _, ok := evictable[id]; ok { - delete(evictable, id) - return id, true - } - } - return identity.Stream{}, false - }) - - dps := make([]data.Number, 10) - for i := 0; i < 10; i++ { - id, dp := sum.Stream() - ids[i] = id - dps[i] = dp - } - - // store up to limit must work - for i := 0; i < 5; i++ { - err := lim.Store(ids[i], dps[i]) - require.NoError(t, err) - } - - // store beyond limit must fail - for i := 5; i < 10; i++ { - err := lim.Store(ids[i], dps[i]) - require.Equal(t, streams.ErrLimit(5), err) - } - - // put two streams up for eviction - evictable[ids[2]] = struct{}{} - evictable[ids[3]] = struct{}{} - - // while evictable do so, fail again afterwards - for i := 5; i < 10; i++ { - err := lim.Store(ids[i], dps[i]) - if i < 7 { - require.Equal(t, streams.ErrEvicted{ErrLimit: streams.ErrLimit(5), Ident: ids[i-3]}, err) - } else { - require.Equal(t, streams.ErrLimit(5), err) - } - } -} diff --git a/processor/deltatocumulativeprocessor/internal/streams/streams.go b/processor/deltatocumulativeprocessor/internal/streams/streams.go deleted file mode 100644 index 1b34f806b272..000000000000 --- a/processor/deltatocumulativeprocessor/internal/streams/streams.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package streams // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/streams" - -import ( - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics/identity" - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics/streams" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data" -) - -type Ident = identity.Stream - -type ( - Seq[T any] streams.Seq[T] - Map[T any] streams.Map[T] -) - -type Aggregator[D data.Point[D]] interface { - Aggregate(Ident, D) (D, error) -} - -func IntoAggregator[D data.Point[D]](m Map[D]) MapAggr[D] { - return MapAggr[D]{Map: m} -} - -type MapAggr[D data.Point[D]] struct { - Map[D] -} - -func (a MapAggr[D]) Aggregate(id Ident, dp D) (D, error) { - err := a.Map.Store(id, dp) - v, _ := a.Map.Load(id) - return v, err -} - -type Evictor = streams.Evictor diff --git a/processor/deltatocumulativeprocessor/internal/telemetry/attr.go b/processor/deltatocumulativeprocessor/internal/telemetry/attr.go new file mode 100644 index 000000000000..ccfac6553fcb --- /dev/null +++ b/processor/deltatocumulativeprocessor/internal/telemetry/attr.go @@ -0,0 +1,12 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package telemetry // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/telemetry" + +import "go.opentelemetry.io/otel/attribute" + +type Attributes []attribute.KeyValue + +func (a *Attributes) Set(attr attribute.KeyValue) { + *a = append(*a, attr) +} diff --git a/processor/deltatocumulativeprocessor/internal/telemetry/faults_test.go b/processor/deltatocumulativeprocessor/internal/telemetry/faults_test.go deleted file mode 100644 index 51081099995d..000000000000 --- a/processor/deltatocumulativeprocessor/internal/telemetry/faults_test.go +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package telemetry_test - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/pdata/pcommon" - "go.opentelemetry.io/otel/metric/noop" - - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics/identity" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/delta" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/streams" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/telemetry" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/testdata/random" -) - -// TestFaults verifies certain non-fatal errors are actually caused and -// subsequently dropped. It does so by writing bad samples to the actual -// implementation instead of fabricating errors manually. -func TestFaults(t *testing.T) { - type Map = streams.Map[data.Number] - type Case struct { - Name string - Map Map - Pre func(Map, identity.Stream, data.Number) error - Bad func(Map, identity.Stream, data.Number) error - Err error - } - - sum := random.Sum() - evid, evdp := sum.Stream() - - cases := []Case{ - { - Name: "older-start", - Pre: func(dps Map, id identity.Stream, dp data.Number) error { - dp.SetStartTimestamp(ts(20)) - dp.SetTimestamp(ts(30)) - return dps.Store(id, dp) - }, - Bad: func(dps Map, id identity.Stream, dp data.Number) error { - dp.SetStartTimestamp(ts(10)) - dp.SetTimestamp(ts(40)) - return dps.Store(id, dp) - }, - Err: delta.ErrOlderStart{Start: ts(20), Sample: ts(10)}, - }, - { - Name: "out-of-order", - Pre: func(dps Map, id identity.Stream, dp data.Number) error { - dp.SetTimestamp(ts(20)) - return dps.Store(id, dp) - }, - Bad: func(dps Map, id identity.Stream, dp data.Number) error { - dp.SetTimestamp(ts(10)) - return dps.Store(id, dp) - }, - Err: delta.ErrOutOfOrder{Last: ts(20), Sample: ts(10)}, - }, - { - Name: "gap", - Pre: func(dps Map, id identity.Stream, dp data.Number) error { - dp.SetStartTimestamp(ts(10)) - dp.SetTimestamp(ts(20)) - return dps.Store(id, dp) - }, - Bad: func(dps Map, id identity.Stream, dp data.Number) error { - dp.SetStartTimestamp(ts(30)) - dp.SetTimestamp(ts(40)) - return dps.Store(id, dp) - }, - Err: delta.ErrGap{From: ts(20), To: ts(30)}, - }, - { - Name: "limit", - Map: streams.Limit(delta.New[data.Number](), 1), - Pre: func(dps Map, id identity.Stream, dp data.Number) error { - dp.SetTimestamp(ts(10)) - return dps.Store(id, dp) - }, - Bad: func(dps Map, _ identity.Stream, _ data.Number) error { - id, dp := sum.Stream() - dp.SetTimestamp(ts(20)) - return dps.Store(id, dp) - }, - Err: streams.ErrLimit(1), - }, - { - Name: "evict", - Map: func() Map { - ev := HeadEvictor[data.Number]{Map: delta.New[data.Number]()} - lim := streams.Limit(ev, 1) - lim.Evictor = ev - return lim - }(), - Pre: func(dps Map, _ identity.Stream, _ data.Number) error { - evdp.SetTimestamp(ts(10)) - return dps.Store(evid, evdp) - }, - Bad: func(dps Map, _ identity.Stream, _ data.Number) error { - id, dp := sum.Stream() - dp.SetTimestamp(ts(20)) - return dps.Store(id, dp) - }, - Err: streams.ErrEvicted{Ident: evid, ErrLimit: streams.ErrLimit(1)}, - }, - } - - for _, c := range cases { - t.Run(c.Name, func(t *testing.T) { - id, dp := sum.Stream() - tel := telemetry.New(noop.Meter{}) - - dps := c.Map - if dps == nil { - dps = delta.New[data.Number]() - } - onf := telemetry.ObserveNonFatal(dps, &tel.Metrics) - - if c.Pre != nil { - err := c.Pre(onf, id, dp.Clone()) - require.NoError(t, err) - } - - err := c.Bad(dps, id, dp.Clone()) - require.Equal(t, c.Err, err) - - err = c.Bad(onf, id, dp.Clone()) - require.NoError(t, err) - }) - } -} - -type ts = pcommon.Timestamp - -// HeadEvictor drops the first stream on Evict() -type HeadEvictor[T any] struct{ streams.Map[T] } - -func (e HeadEvictor[T]) Evict() (evicted identity.Stream, ok bool) { - e.Items()(func(id identity.Stream, _ T) bool { - e.Delete(id) - evicted = id - return false - }) - return evicted, true -} diff --git a/processor/deltatocumulativeprocessor/internal/telemetry/metrics.go b/processor/deltatocumulativeprocessor/internal/telemetry/metrics.go index 946ffd98d1d6..ab6fde655005 100644 --- a/processor/deltatocumulativeprocessor/internal/telemetry/metrics.go +++ b/processor/deltatocumulativeprocessor/internal/telemetry/metrics.go @@ -6,214 +6,66 @@ package telemetry // import "github.com/open-telemetry/opentelemetry-collector-c import ( "context" "errors" - "time" + "reflect" - "go.opentelemetry.io/collector/processor/processorhelper" + "go.opentelemetry.io/collector/component" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/metric" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/delta" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/metadata" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/streams" ) -type Telemetry struct { - Metrics - - meter metric.Meter -} - -func New(meter metric.Meter) Telemetry { - return Telemetry{ - Metrics: metrics(meter), - meter: meter, - } -} - -type Streams struct { - tracked metric.Int64UpDownCounter - limit metric.Int64ObservableGauge - evicted metric.Int64Counter - stale metric.Int64ObservableGauge -} - -type Datapoints struct { - total metric.Int64Counter - dropped metric.Int64Counter -} - -type Metrics struct { - streams Streams - dps Datapoints - - gaps metric.Int64Counter -} - -func metrics(meter metric.Meter) Metrics { - var ( - count = use(meter.Int64Counter) - updown = use(meter.Int64UpDownCounter) - gauge = use(meter.Int64ObservableGauge) - ) - - return Metrics{ - streams: Streams{ - tracked: updown("streams.tracked", - metric.WithDescription("number of streams tracked"), - metric.WithUnit("{stream}"), - ), - limit: gauge("streams.limit", - metric.WithDescription("upper limit of tracked streams"), - metric.WithUnit("{stream}"), - ), - evicted: count("streams.evicted", - metric.WithDescription("number of streams evicted"), - metric.WithUnit("{stream}"), - ), - stale: gauge("streams.max_stale", - metric.WithDescription("duration without new samples after which streams are dropped"), - metric.WithUnit("s"), - ), - }, - dps: Datapoints{ - total: count("datapoints.processed", - metric.WithDescription("number of datapoints processed"), - metric.WithUnit("{datapoint}"), - ), - dropped: count("datapoints.dropped", - metric.WithDescription("number of dropped datapoints due to given 'reason'"), - metric.WithUnit("{datapoint}"), - ), - }, - gaps: count("gaps.length", - metric.WithDescription("total duration where data was expected but not received"), - metric.WithUnit("s"), - ), +func New(set component.TelemetrySettings) (Metrics, error) { + zero := func() int { return -1 } + m := Metrics{ + tracked: &zero, } -} -func (tel Telemetry) WithLimit(max int64) { - then := metric.Callback(func(_ context.Context, o metric.Observer) error { - o.ObserveInt64(tel.streams.limit, max) - return nil + trackedCb := metadata.WithDeltatocumulativeStreamsTrackedLinearCallback(func() int64 { + return int64((*m.tracked)()) }) - _, err := tel.meter.RegisterCallback(then, tel.streams.limit) - if err != nil { - panic(err) - } -} -func (tel Telemetry) WithStale(max time.Duration) { - then := metric.Callback(func(_ context.Context, o metric.Observer) error { - o.ObserveInt64(tel.streams.stale, int64(max.Seconds())) - return nil - }) - _, err := tel.meter.RegisterCallback(then, tel.streams.stale) + telb, err := metadata.NewTelemetryBuilder(set, trackedCb) if err != nil { - panic(err) + return Metrics{}, err } -} + m.TelemetryBuilder = *telb -func ObserveItems[T any](items streams.Map[T], metrics *Metrics) Items[T] { - return Items[T]{ - Map: items, - Metrics: metrics, - } + return m, nil } -func ObserveNonFatal[T any](items streams.Map[T], metrics *Metrics) Faults[T] { - return Faults[T]{ - Map: items, - Metrics: metrics, - } -} +type Metrics struct { + metadata.TelemetryBuilder -type Items[T any] struct { - streams.Map[T] - *Metrics + tracked *func() int } -func (i Items[T]) Store(id streams.Ident, v T) error { - inc(i.dps.total) - - _, old := i.Map.Load(id) - err := i.Map.Store(id, v) - if err == nil && !old { - inc(i.streams.tracked) - } - - return err +func (m Metrics) Datapoints() Counter { + return Counter{Int64Counter: m.DeltatocumulativeDatapointsLinear} } -func (i Items[T]) Delete(id streams.Ident) { - dec(i.streams.tracked) - i.Map.Delete(id) +func (m *Metrics) WithTracked(streams func() int) { + *m.tracked = streams } -type Faults[T any] struct { - streams.Map[T] - *Metrics +func Error(msg string) attribute.KeyValue { + return attribute.String("error", msg) } -func (f Faults[T]) Store(id streams.Ident, v T) error { - var ( - olderStart delta.ErrOlderStart - outOfOrder delta.ErrOutOfOrder - gap delta.ErrGap - limit streams.ErrLimit - evict streams.ErrEvicted - ) - - err := f.Map.Store(id, v) - switch { - default: - return err - case errors.As(err, &olderStart): - inc(f.dps.dropped, reason("older-start")) - case errors.As(err, &outOfOrder): - inc(f.dps.dropped, reason("out-of-order")) - case errors.As(err, &limit): - inc(f.dps.dropped, reason("stream-limit")) - case errors.As(err, &evict): - inc(f.streams.evicted) - case errors.As(err, &gap): - from := gap.From.AsTime() - to := gap.To.AsTime() - lost := to.Sub(from).Seconds() - f.gaps.Add(context.TODO(), int64(lost)) +func Cause(err error) attribute.KeyValue { + for { + uw := errors.Unwrap(err) + if uw == nil { + break + } + err = uw } - return nil + return Error(reflect.TypeOf(err).String()) } -var ( - _ streams.Map[any] = (*Items[any])(nil) - _ streams.Map[any] = (*Faults[any])(nil) -) +type Counter struct{ metric.Int64Counter } -type addable[Opts any] interface { - Add(context.Context, int64, ...Opts) -} - -func inc[A addable[O], O any](a A, opts ...O) { - a.Add(context.Background(), 1, opts...) -} - -func dec[A addable[O], O any](a A, opts ...O) { - a.Add(context.Background(), -1, opts...) -} - -func reason(reason string) metric.AddOption { - return metric.WithAttributes(attribute.String("reason", reason)) -} - -func use[F func(string, ...O) (M, error), M any, O any](f F) func(string, ...O) M { - return func(name string, opts ...O) M { - name = processorhelper.BuildCustomMetricName(metadata.Type.String(), name) - m, err := f(name, opts...) - if err != nil { - panic(err) - } - return m - } +func (c Counter) Inc(ctx context.Context, attrs ...attribute.KeyValue) { + c.Add(ctx, 1, metric.WithAttributes(attrs...)) } diff --git a/processor/deltatocumulativeprocessor/internal/testdata/random/random.go b/processor/deltatocumulativeprocessor/internal/testdata/random/random.go deleted file mode 100644 index 58ec3c2488c8..000000000000 --- a/processor/deltatocumulativeprocessor/internal/testdata/random/random.go +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package random - -import ( - "math" - "math/rand" - "strconv" - "time" - - "go.opentelemetry.io/collector/pdata/pcommon" - "go.opentelemetry.io/collector/pdata/pmetric" - - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics/identity" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/metrics" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/streams" -) - -func Sum() Metric { - metric := pmetric.NewMetric() - metric.SetEmptySum() - metric.SetName(randStr()) - metric.SetDescription(randStr()) - metric.SetUnit(randStr()) - return Metric{Metric: metrics.From(Resource(), Scope(), metric)} -} - -type Metric struct { - metrics.Metric -} - -func (m Metric) Stream() (streams.Ident, data.Number) { - dp := pmetric.NewNumberDataPoint() - dp.SetIntValue(int64(randInt())) - dp.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) - - for i := 0; i < 10; i++ { - dp.Attributes().PutStr(randStr(), randStr()) - } - id := identity.OfStream(m.Ident(), dp) - - return id, data.Number{NumberDataPoint: dp} -} - -func Resource() pcommon.Resource { - res := pcommon.NewResource() - for i := 0; i < 10; i++ { - res.Attributes().PutStr(randStr(), randStr()) - } - return res -} - -func Scope() pcommon.InstrumentationScope { - scope := pcommon.NewInstrumentationScope() - scope.SetName(randStr()) - scope.SetVersion(randStr()) - for i := 0; i < 3; i++ { - scope.Attributes().PutStr(randStr(), randStr()) - } - return scope -} - -func randStr() string { - return strconv.FormatInt(randInt(), 16) -} - -func randInt() int64 { - return int64(rand.Intn(math.MaxInt16)) -} - -func randFloat() float64 { - return float64(randInt()) / float64(randInt()) -} diff --git a/processor/deltatocumulativeprocessor/internal/testing/compare/compare.go b/processor/deltatocumulativeprocessor/internal/testing/compare/compare.go new file mode 100644 index 000000000000..d3c6c927566a --- /dev/null +++ b/processor/deltatocumulativeprocessor/internal/testing/compare/compare.go @@ -0,0 +1,38 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package compare // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/testing/compare" + +import ( + "reflect" + "strings" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" +) + +var allow = []string{ + "go.opentelemetry.io/collector/pdata", + "go.opentelemetry.io/otel", + "github.com/open-telemetry/opentelemetry-collector-contrib", +} + +var Opts = cmp.Options{ + cmpopts.EquateApprox(0, 1e-9), + cmp.Exporter(func(ty reflect.Type) bool { + for _, prefix := range allow { + if strings.HasPrefix(ty.PkgPath(), prefix) { + return true + } + } + return false + }), +} + +func Equal[T any](a, b T, opts ...cmp.Option) bool { + return cmp.Equal(a, b, Opts, cmp.Options(opts)) +} + +func Diff[T any](a, b T, opts ...cmp.Option) string { + return cmp.Diff(a, b, Opts, cmp.Options(opts)) +} diff --git a/processor/deltatocumulativeprocessor/internal/testing/sdktest/compare.go b/processor/deltatocumulativeprocessor/internal/testing/sdktest/compare.go new file mode 100644 index 000000000000..d6af542b1dd9 --- /dev/null +++ b/processor/deltatocumulativeprocessor/internal/testing/sdktest/compare.go @@ -0,0 +1,136 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// sdktest performs partial comparison of [sdk.ResourceMetrics] to a [Spec]. +package sdktest // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/testing/sdktest" + +import ( + "context" + "fmt" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/sdk/metric" + sdk "go.opentelemetry.io/otel/sdk/metric/metricdata" + + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/testing/compare" +) + +type Option = cmp.Option + +// Test the metrics returned by [metric.ManualReader.Collect] against the [Spec] +func Test(spec Spec, mr *metric.ManualReader, opts ...Option) error { + var rm sdk.ResourceMetrics + if err := mr.Collect(context.Background(), &rm); err != nil { + return err + } + return Compare(spec, rm, opts...) +} + +// Compare the [sdk.ResourceMetrics] against the [Spec] +func Compare(spec Spec, rm sdk.ResourceMetrics, opts ...Option) error { + got := Flatten(rm) + want := Metrics(spec) + + diff := compare.Diff(want, got, + IgnoreUnspec(spec), + IgnoreTime(), + IgnoreMetadata(), + cmpopts.EquateEmpty(), + Transform(), + Sort(), + cmp.Options(opts), + ) + + if diff != "" { + return fmt.Errorf("\n%s", diff) + } + return nil +} + +// IgnoreTime ignores [sdk.DataPoint.Time] and [sdk.DataPoint.StartTime], +// because those are changing per run and typically not of interest. +func IgnoreTime() Option { + return cmp.Options{ + cmpopts.IgnoreFields(sdk.DataPoint[int64]{}, "StartTime", "Time"), + cmpopts.IgnoreFields(sdk.DataPoint[float64]{}, "StartTime", "Time"), + } +} + +// IgnoreTime ignores [sdk.Metrics.Unit] and [sdk.Metrics.Description], +// because those are usually static +func IgnoreMetadata() Option { + return cmpopts.IgnoreFields(sdk.Metrics{}, "Description", "Unit") +} + +// IgnoreUnspec ignores any Metrics not present in the [Spec] +func IgnoreUnspec(spec Spec) Option { + return cmpopts.IgnoreSliceElements(func(m sdk.Metrics) bool { + _, ok := spec[m.Name] + return !ok + }) +} + +// Sort [sdk.Metrics] by name and [sdk.DataPoint] by their [attribute.Set] +func Sort() Option { + return cmp.Options{ + cmpopts.SortSlices(func(a, b sdk.Metrics) bool { + return a.Name < b.Name + }), + sort[int64](), sort[float64](), + } +} + +func sort[N int64 | float64]() Option { + return cmpopts.SortSlices(func(a, b DataPoint[N]) bool { + as := a.DataPoint.Attributes.Encoded(attribute.DefaultEncoder()) + bs := b.DataPoint.Attributes.Encoded(attribute.DefaultEncoder()) + return as < bs + }) +} + +// DataPoint holds a [sdk.DataPoints] and its attributes as a plain map. +// See [Transform] +type DataPoint[N int64 | float64] struct { + Attributes map[string]any + sdk.DataPoint[N] +} + +// Transform turns []sdk.DataPoint[N] into []DataPoint[N]. +// +// Primarily done to have DataPoint.Attributes as a flat, diffable map instead +// of the hard to understand internal structure of [attribute.Set], which is +// being truncated by go-cmp before reaching the depth where attribute values +// appear. +// +// This must happen on the slice level, transforming the values is not +// sufficient because when entire DataPoints are added / removed, go-cmp does +// not apply transformers on the fields. +func Transform() Option { + return cmp.Options{ + transform[int64](), + transform[float64](), + cmpopts.IgnoreTypes(attribute.Set{}), + } +} + +func transform[N int64 | float64]() Option { + return cmpopts.AcyclicTransformer(fmt.Sprintf("sdktest.Transform.%T", *new(N)), + func(dps []sdk.DataPoint[N]) []DataPoint[N] { + out := make([]DataPoint[N], len(dps)) + for i, dp := range dps { + out[i] = DataPoint[N]{DataPoint: dp, Attributes: attrMap(dp.Attributes)} + } + return out + }, + ) +} + +func attrMap(set attribute.Set) map[string]any { + m := make(map[string]any) + for _, kv := range set.ToSlice() { + m[string(kv.Key)] = kv.Value.AsInterface() + } + return m +} diff --git a/processor/deltatocumulativeprocessor/internal/testing/sdktest/example_test.go b/processor/deltatocumulativeprocessor/internal/testing/sdktest/example_test.go new file mode 100644 index 000000000000..e7dc5ba5d067 --- /dev/null +++ b/processor/deltatocumulativeprocessor/internal/testing/sdktest/example_test.go @@ -0,0 +1,80 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package sdktest + +import ( + "context" + "fmt" + + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric" + sdk "go.opentelemetry.io/otel/sdk/metric" +) + +// The output of [Test] and [Compare] is similar to the following: +// +// []metricdata.Metrics{ +// - { +// - Name: "not.exist", +// - Data: metricdata.Sum[float64]{ +// - DataPoints: []metricdata.DataPoint[float64]{{...}}, +// - Temporality: s"CumulativeTemporality", +// - }, +// - }, +// { +// Name: "requests.total", +// Description: "I will be inherited", +// Unit: "", +// Data: metricdata.Sum[int64]{ +// DataPoints: []metricdata.DataPoint[int64](Inverse(sdktest.Transform.int64, []sdktest.DataPoint[int64]{ +// {DataPoint: {StartTime: s"2024-10-11 11:23:37.966150738 +0200 CEST m=+0.001489569", Time: s"2024-10-11 11:23:37.966174238 +0200 CEST m=+0.001513070", Value: 20, ...}, Attributes: {}}, +// { +// DataPoint: metricdata.DataPoint[int64]{ +// ... // 1 ignored field +// StartTime: s"2024-10-11 11:23:37.966150738 +0200 CEST m=+0.001489569", +// Time: s"2024-10-11 11:23:37.966174238 +0200 CEST m=+0.001513070", +// - Value: 4, +// + Value: 3, +// Exemplars: nil, +// }, +// Attributes: {"error": string("limit")}, +// }, +// })), +// Temporality: s"CumulativeTemporality", +// IsMonotonic: true, +// }, +// }, +// } +// +// Which is used as follows: +func Example() { + var spec Spec + _ = Unmarshal([]byte(` +gauge streams.tracked: + - int: 40 + +counter requests.total: + - int: 20 + - int: 4 + attr: {error: "limit"} + +updown not.exist: + - float: 33.3 +`), &spec) + + mr := sdk.NewManualReader() + meter := sdk.NewMeterProvider(sdk.WithReader(mr)).Meter("test") + + ctx := context.TODO() + + gauge, _ := meter.Int64Gauge("streams.tracked") + gauge.Record(ctx, 40) + + count, _ := meter.Int64Counter("requests.total", metric.WithDescription("I will be inherited")) + count.Add(ctx, 20) + count.Add(ctx, 3, metric.WithAttributes(attribute.String("error", "limit"))) + + err := Test(spec, mr) + fmt.Println(err) +} diff --git a/processor/deltatocumulativeprocessor/internal/testing/sdktest/into.go b/processor/deltatocumulativeprocessor/internal/testing/sdktest/into.go new file mode 100644 index 000000000000..ca65c55512ab --- /dev/null +++ b/processor/deltatocumulativeprocessor/internal/testing/sdktest/into.go @@ -0,0 +1,68 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package sdktest // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/testing/sdktest" + +import ( + sdk "go.opentelemetry.io/otel/sdk/metric/metricdata" +) + +// Metrics returns the [sdk.Metrics] defined by this [Spec] +func Metrics(spec Spec) []sdk.Metrics { + md := make([]sdk.Metrics, 0, len(spec)) + for _, spec := range spec { + md = append(md, spec.Into()) + } + return md +} + +func (spec Metric) Into() sdk.Metrics { + m := sdk.Metrics{Name: spec.Name} + if len(spec.Numbers) == 0 { + return m + } + + var ( + ints []sdk.DataPoint[int64] + floats []sdk.DataPoint[float64] + ) + for _, n := range spec.Numbers { + attr := n.Attr.Into() + switch { + case n.Int != nil: + ints = append(ints, sdk.DataPoint[int64]{Attributes: attr, Value: *n.Int}) + case n.Float != nil: + floats = append(floats, sdk.DataPoint[float64]{Attributes: attr, Value: *n.Float}) + } + } + + switch { + case spec.Type == TypeGauge && ints != nil: + m.Data = sdk.Gauge[int64]{DataPoints: ints} + case spec.Type == TypeGauge && floats != nil: + m.Data = sdk.Gauge[float64]{DataPoints: floats} + case spec.Type == TypeSum && ints != nil: + m.Data = sdk.Sum[int64]{DataPoints: ints, Temporality: spec.Temporality, IsMonotonic: spec.Monotonic} + case spec.Type == TypeSum && floats != nil: + m.Data = sdk.Sum[float64]{DataPoints: floats, Temporality: spec.Temporality, IsMonotonic: spec.Monotonic} + } + + return m +} + +// Flatten turns the nested [sdk.ResourceMetrics] structure into a flat +// [sdk.Metrics] slice. If a metric is present multiple time in different scopes +// / resources, the last occurrence is used. +func Flatten(rm sdk.ResourceMetrics) []sdk.Metrics { + set := make(map[string]sdk.Metrics) + for _, sm := range rm.ScopeMetrics { + for _, m := range sm.Metrics { + set[m.Name] = m + } + } + md := make([]sdk.Metrics, 0, len(set)) + for _, m := range set { + md = append(md, m) + } + return md +} diff --git a/processor/deltatocumulativeprocessor/internal/testing/sdktest/metrics.go b/processor/deltatocumulativeprocessor/internal/testing/sdktest/metrics.go new file mode 100644 index 000000000000..440d094ba274 --- /dev/null +++ b/processor/deltatocumulativeprocessor/internal/testing/sdktest/metrics.go @@ -0,0 +1,125 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package sdktest // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/testing/sdktest" + +import ( + "fmt" + "strings" + + "go.opentelemetry.io/otel/attribute" + sdk "go.opentelemetry.io/otel/sdk/metric/metricdata" + "gopkg.in/yaml.v3" +) + +// Spec is the partial metric specification. To be used with [Compare] +type Spec = map[string]Metric + +type Type string + +const ( + TypeSum Type = "sum" + TypeGauge Type = "gauge" +) + +type Metric struct { + Type + Name string + + Numbers []Number + Monotonic bool + Temporality sdk.Temporality +} + +type Number struct { + Int *int64 + Float *float64 + Attr attributes +} + +// Unmarshal specification in [Format] into the given [Spec]. +func Unmarshal(data Format, into *Spec) error { + var doc map[string]yaml.Node + if err := yaml.Unmarshal(data, &doc); err != nil { + return err + } + + if *into == nil { + *into = make(map[string]Metric, len(doc)) + } + md := *into + + for key, node := range doc { + args := strings.Fields(key) + if len(args) < 2 { + return fmt.Errorf("key must of form ' ', but got %q", key) + } + + m := Metric{Name: args[1]} + switch args[0] { + case "counter": + m.Type = TypeSum + m.Monotonic = true + case "updown": + m.Type = TypeSum + m.Monotonic = false + case "gauge": + m.Type = TypeGauge + default: + return fmt.Errorf("no such instrument type: %q", args[0]) + } + + m.Temporality = sdk.CumulativeTemporality + for _, arg := range args[2:] { + switch arg { + case "delta": + m.Temporality = sdk.DeltaTemporality + case "cumulative": + m.Temporality = sdk.CumulativeTemporality + } + } + + var into any + switch m.Type { + case TypeGauge, TypeSum: + into = &m.Numbers + default: + panic("unreachable") + } + + if err := node.Decode(into); err != nil { + return err + } + + md[m.Name] = m + } + + return nil +} + +type attributes map[string]string + +func (attr attributes) Into() attribute.Set { + kvs := make([]attribute.KeyValue, 0, len(attr)) + for k, v := range attr { + kvs = append(kvs, attribute.String(k, v)) + } + return attribute.NewSet(kvs...) +} + +// Format defines the yaml-based format to be used with [Unmarshal] for specifying [Spec]. +// +// It looks as follows: +// +// [ delta|cumulative ]: +// - int: | float: +// attr: +// [string]: +// +// The supported instruments are: +// - counter: [TypeSum], monotonic +// - updown: [TypeSum], non-monotonic +// - gauge: [TypeGauge] +// +// Temporality is optional and defaults to [sdk.CumulativeTemporality] +type Format = []byte diff --git a/processor/deltatocumulativeprocessor/internal/testing/testar/crlf/crlf.go b/processor/deltatocumulativeprocessor/internal/testing/testar/crlf/crlf.go new file mode 100644 index 000000000000..bc00f79f978f --- /dev/null +++ b/processor/deltatocumulativeprocessor/internal/testing/testar/crlf/crlf.go @@ -0,0 +1,29 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package crlf // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/testing/testar/crlf" + +import ( + "bytes" + "strings" +) + +const ( + CR = '\r' + LF = '\n' + CRLF = "\r\n" +) + +// Strip turns CRLF line endings (\r\n) into LF (\n) +func Strip(data []byte) []byte { + at := bytes.IndexByte(data, LF) + if at == 0 || data[at-1] != CR { + return data + } + return bytes.ReplaceAll(data, []byte(CRLF), []byte{LF}) +} + +// Join concats all lines with the [CRLF] separator +func Join(lines ...string) []byte { + return []byte(strings.Join(lines, CRLF)) +} diff --git a/processor/deltatocumulativeprocessor/internal/testing/testar/decode.go b/processor/deltatocumulativeprocessor/internal/testing/testar/decode.go new file mode 100644 index 000000000000..6b7cdd1a7f45 --- /dev/null +++ b/processor/deltatocumulativeprocessor/internal/testing/testar/decode.go @@ -0,0 +1,118 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// testar is a textual archive (based on [golang.org/x/tools/txtar]) to define +// test fixtures. +// +// Archive data is read into struct fields, optionally calling parsers for field +// types other than string or []byte: +// +// type T struct { +// Literal string `testar:"file1"` +// Parsed int `testar:"file2,myparser"` +// } +// +// var into T +// err := Read(data, &into) +// +// See [Read] and [Parser] for examples. +package testar // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/testing/testar" + +import ( + "fmt" + "io/fs" + "os" + "reflect" + "strings" + + "golang.org/x/tools/txtar" + + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/testing/testar/crlf" +) + +// Read archive data into the fields of struct *T +func Read[T any](data []byte, into *T, parsers ...Format) error { + data = crlf.Strip(data) + ar := txtar.Parse(data) + return Decode(ar, into, parsers...) +} + +func ReadFile[T any](file string, into *T, parsers ...Format) error { + data, err := os.ReadFile(file) + if err != nil { + return err + } + return Read(data, into, parsers...) +} + +func Decode[T any](ar *txtar.Archive, into *T, parsers ...Format) error { + arfs, err := txtar.FS(ar) + if err != nil { + return err + } + + pv := reflect.ValueOf(into) + if pv.Kind() != reflect.Pointer { + return fmt.Errorf("into must be pointer") + } + sv := pv.Elem() + + for i := range sv.NumField() { + f := sv.Type().Field(i) + tag := f.Tag.Get("testar") + if tag == "" { + continue + } + + name, format, _ := strings.Cut(tag, ",") + data, err := fs.ReadFile(arfs, name) + if err != nil { + return fmt.Errorf("%s: %w", name, err) + } + + err = formats(parsers).Parse(format, data, sv.Field(i).Addr().Interface()) + if err != nil { + return fmt.Errorf("%s: %w", name, err) + } + } + return nil +} + +type formats []Format + +func (fmts formats) Parse(name string, data []byte, into any) error { + if name == "" { + return LiteralParser(data, into) + } + + for _, f := range fmts { + if f.name == name { + return f.parse(data, into) + } + } + return fmt.Errorf("no such format: %q", name) +} + +type Format struct { + name string + parse func(file []byte, into any) error +} + +func Parser[T any](name string, fn func([]byte, *T) error) Format { + return Format{name: name, parse: func(file []byte, ptr any) error { + return fn(file, ptr.(*T)) + }} +} + +// LiteralParser sets data unaltered into a []byte or string +func LiteralParser(data []byte, into any) error { + switch ptr := into.(type) { + case *[]byte: + *ptr = append([]byte(nil), data...) + case *string: + *ptr = string(data) + default: + return fmt.Errorf("pass *[]byte, *string or use a parser. got %T", into) + } + return nil +} diff --git a/processor/deltatocumulativeprocessor/internal/testing/testar/read_test.go b/processor/deltatocumulativeprocessor/internal/testing/testar/read_test.go new file mode 100644 index 000000000000..842ace3eca58 --- /dev/null +++ b/processor/deltatocumulativeprocessor/internal/testing/testar/read_test.go @@ -0,0 +1,84 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package testar + +import ( + "fmt" + "strconv" + "strings" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/testing/testar/crlf" +) + +func ExampleRead() { + data := []byte(` +-- foo -- +hello + +-- bar -- +world +`) + + var into struct { + Foo string `testar:"foo"` + Bar []byte `testar:"bar"` + } + + _ = Read(data, &into) + fmt.Printf("foo: %T(%q)\n", into.Foo, into.Foo) + fmt.Printf("bar: %T(%q)\n", into.Bar, into.Bar) + + // Output: + // foo: string("hello\n\n") + // bar: []uint8("world\n") +} + +func ExampleParser() { + data := []byte(` +-- foobar -- +377927 +`) + + var into struct { + Foobar int `testar:"foobar,atoi"` + } + + _ = Read(data, &into, Parser("atoi", func(file []byte, into *int) error { + n, err := strconv.Atoi(strings.TrimSpace(string(file))) + if err != nil { + return err + } + *into = n + return nil + })) + + fmt.Printf("foobar: %T(%d)\n", into.Foobar, into.Foobar) + + // Output: + // foobar: int(377927) +} + +func TestCRLF(t *testing.T) { + data := crlf.Join( + "-- string --", + "foobar", + ) + + var into struct { + String string `testar:"string"` + } + + err := Read(data, &into) + require.NoError(t, err) + + must(t, into.String, "foobar\n") +} + +func must[T string | int](t *testing.T, v, want T) { + t.Helper() + require.Equal(t, want, v, "got '%q' != '%q' want", v, want) +} diff --git a/processor/deltatocumulativeprocessor/metadata.yaml b/processor/deltatocumulativeprocessor/metadata.yaml index 43e5ba4f3877..be925197db82 100644 --- a/processor/deltatocumulativeprocessor/metadata.yaml +++ b/processor/deltatocumulativeprocessor/metadata.yaml @@ -1,11 +1,78 @@ type: deltatocumulative -scope_name: otelcol/deltatocumulative status: class: processor stability: - development: [metrics] - distributions: [] + alpha: [metrics] + distributions: [contrib, k8s] warnings: [Statefulness] codeowners: - active: [sh0rez, RichieSams, jpkrohling] + active: [sh0rez, RichieSams] + +telemetry: + metrics: + # streams + deltatocumulative.streams.tracked: + description: number of streams tracked + unit: "{dps}" + sum: + value_type: int + monotonic: false + enabled: true + deltatocumulative.streams.tracked.linear: + description: number of streams tracked + unit: "{dps}" + sum: + value_type: int + monotonic: false + async: true + enabled: true + deltatocumulative.streams.limit: + description: upper limit of tracked streams + unit: "{stream}" + gauge: + value_type: int + enabled: true + deltatocumulative.streams.evicted: + description: number of streams evicted + unit: "{stream}" + sum: + value_type: int + monotonic: true + enabled: true + deltatocumulative.streams.max_stale: + description: duration after which streams inactive streams are dropped + unit: "s" + gauge: + value_type: int + enabled: true + # datapoints + deltatocumulative.datapoints.processed: + description: number of datapoints processed + unit: "{datapoint}" + sum: + value_type: int + monotonic: true + enabled: true + deltatocumulative.datapoints.dropped: + description: number of datapoints dropped due to given 'reason' + unit: "{datapoint}" + sum: + value_type: int + monotonic: true + enabled: true + + deltatocumulative.datapoints.linear: + description: total number of datapoints processed. may have 'error' attribute, if processing failed + unit: "{datapoint}" + sum: + value_type: int + monotonic: true + enabled: true + deltatocumulative.gaps.length: + description: total duration where data was expected but not received + unit: "s" + sum: + value_type: int + monotonic: true + enabled: true diff --git a/processor/deltatocumulativeprocessor/processor.go b/processor/deltatocumulativeprocessor/processor.go index 01e1cef4f916..149431b8970c 100644 --- a/processor/deltatocumulativeprocessor/processor.go +++ b/processor/deltatocumulativeprocessor/processor.go @@ -5,7 +5,6 @@ package deltatocumulativeprocessor // import "github.com/open-telemetry/opentele import ( "context" - "errors" "sync" "time" @@ -13,15 +12,11 @@ import ( "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/processor" - "go.opentelemetry.io/otel/metric" - "go.uber.org/zap" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics/identity" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics/staleness" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/delta" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/maybe" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/metrics" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/streams" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/telemetry" ) @@ -29,89 +24,145 @@ var _ processor.Metrics = (*Processor)(nil) type Processor struct { next consumer.Metrics + cfg Config + + last state + mtx sync.Mutex - log *zap.Logger ctx context.Context cancel context.CancelFunc - sums Pipeline[data.Number] - expo Pipeline[data.ExpHistogram] - - mtx sync.Mutex + stale staleness.Tracker + tel telemetry.Metrics } -func newProcessor(cfg *Config, log *zap.Logger, meter metric.Meter, next consumer.Metrics) *Processor { +func newProcessor(cfg *Config, tel telemetry.Metrics, next consumer.Metrics) *Processor { ctx, cancel := context.WithCancel(context.Background()) - tel := telemetry.New(meter) - proc := Processor{ - log: log, + next: next, + cfg: *cfg, + last: state{ + nums: make(map[identity.Stream]pmetric.NumberDataPoint), + hist: make(map[identity.Stream]pmetric.HistogramDataPoint), + expo: make(map[identity.Stream]pmetric.ExponentialHistogramDataPoint), + }, ctx: ctx, cancel: cancel, - next: next, - sums: pipeline[data.Number](cfg, &tel), - expo: pipeline[data.ExpHistogram](cfg, &tel), + stale: staleness.NewTracker(), + tel: tel, } + tel.WithTracked(proc.last.Len) + cfg.Metrics(tel) + return &proc } -type Pipeline[D data.Point[D]] struct { - aggr streams.Aggregator[D] - stale maybe.Ptr[staleness.Staleness[D]] -} +func (p *Processor) ConsumeMetrics(ctx context.Context, md pmetric.Metrics) error { + p.mtx.Lock() + defer p.mtx.Unlock() -func pipeline[D data.Point[D]](cfg *Config, tel *telemetry.Telemetry) Pipeline[D] { - var pipe Pipeline[D] + now := time.Now() - var dps streams.Map[D] - dps = delta.New[D]() - dps = telemetry.ObserveItems(dps, &tel.Metrics) + const ( + keep = true + drop = false + ) - if cfg.MaxStale > 0 { - tel.WithStale(cfg.MaxStale) - stale := maybe.Some(staleness.NewStaleness(cfg.MaxStale, dps)) - pipe.stale = stale - dps, _ = stale.Try() - } - if cfg.MaxStreams > 0 { - tel.WithLimit(int64(cfg.MaxStreams)) - lim := streams.Limit(dps, cfg.MaxStreams) - if stale, ok := pipe.stale.Try(); ok { - lim.Evictor = stale + metrics.Filter(md, func(m metrics.Metric) bool { + if m.AggregationTemporality() != pmetric.AggregationTemporalityDelta { + return keep } - dps = lim - } - dps = telemetry.ObserveNonFatal(dps, &tel.Metrics) + // aggregate the datapoints. + // using filter here, as the pmetric.*DataPoint are reference types so + // we can modify them using their "value". + m.Filter(func(id identity.Stream, dp any) bool { + // count the processed datatype. + // uses whatever value of attrs has at return-time + var attrs telemetry.Attributes + defer func() { p.tel.Datapoints().Inc(ctx, attrs...) }() + + // if stream new and state capacity reached, reject + exist := p.last.Has(id) + if !exist && p.last.Len() >= p.cfg.MaxStreams { + attrs.Set(telemetry.Error("limit")) + return drop + } + + // stream is ok and active, update stale tracker + p.stale.Refresh(now, id) - pipe.aggr = streams.IntoAggregator(dps) - return pipe -} + // this is the first sample of the stream. there is nothing to + // aggregate with, so clone this value into the state and done + if !exist { + p.last.BeginWith(id, dp) + return keep + } -func (p *Processor) Start(_ context.Context, _ component.Host) error { - sums, sok := p.sums.stale.Try() - expo, eok := p.expo.stale.Try() - if !(sok && eok) { + // aggregate with state from previous requests. + // delta.AccumulateInto(state, dp) stores result in `state`. + // this is then copied into `dp` (the value passed onto the pipeline) + var err error + switch dp := dp.(type) { + case pmetric.NumberDataPoint: + state := p.last.nums[id] + err = delta.AccumulateInto(state, dp) + state.CopyTo(dp) + case pmetric.HistogramDataPoint: + state := p.last.hist[id] + err = delta.AccumulateInto(state, dp) + state.CopyTo(dp) + case pmetric.ExponentialHistogramDataPoint: + state := p.last.expo[id] + err = delta.AccumulateInto(state, dp) + state.CopyTo(dp) + } + if err != nil { + attrs.Set(telemetry.Cause(err)) + return drop + } + + return keep + }) + + // all remaining datapoints of this metric are now cumulative + m.Typed().SetAggregationTemporality(pmetric.AggregationTemporalityCumulative) + // if no datapoints remain, drop empty metric + return m.Typed().Len() > 0 + }) + + // no need to continue pipeline if we dropped all metrics + if md.MetricCount() == 0 { return nil } + return p.next.ConsumeMetrics(ctx, md) +} - go func() { - tick := time.NewTicker(time.Minute) - for { - select { - case <-p.ctx.Done(): - return - case <-tick.C: - p.mtx.Lock() - sums.ExpireOldEntries() - expo.ExpireOldEntries() - p.mtx.Unlock() +func (p *Processor) Start(_ context.Context, _ component.Host) error { + if p.cfg.MaxStale != 0 { + // delete stale streams once per minute + go func() { + tick := time.NewTicker(time.Minute) + defer tick.Stop() + for { + select { + case <-p.ctx.Done(): + return + case <-tick.C: + p.mtx.Lock() + stale := p.stale.Collect(p.cfg.MaxStale) + for _, id := range stale { + p.last.Delete(id) + } + p.mtx.Unlock() + } } - } - }() + }() + } + return nil } @@ -124,38 +175,40 @@ func (p *Processor) Capabilities() consumer.Capabilities { return consumer.Capabilities{MutatesData: true} } -func (p *Processor) ConsumeMetrics(ctx context.Context, md pmetric.Metrics) error { - if err := context.Cause(p.ctx); err != nil { - return err - } +// state keeps a cumulative value, aggregated over time, per stream +type state struct { + nums map[identity.Stream]pmetric.NumberDataPoint + hist map[identity.Stream]pmetric.HistogramDataPoint + expo map[identity.Stream]pmetric.ExponentialHistogramDataPoint +} - p.mtx.Lock() - defer p.mtx.Unlock() +func (m state) Len() int { + return len(m.nums) + len(m.hist) + len(m.expo) +} - var errs error - metrics.Each(md, func(m metrics.Metric) { - switch m.Type() { - case pmetric.MetricTypeSum: - sum := m.Sum() - if sum.AggregationTemporality() == pmetric.AggregationTemporalityDelta { - err := streams.Aggregate(metrics.Sum(m), p.sums.aggr) - errs = errors.Join(errs, err) - sum.SetAggregationTemporality(pmetric.AggregationTemporalityCumulative) - } - case pmetric.MetricTypeHistogram: - // TODO - case pmetric.MetricTypeExponentialHistogram: - expo := m.ExponentialHistogram() - if expo.AggregationTemporality() == pmetric.AggregationTemporalityDelta { - err := streams.Aggregate(metrics.ExpHistogram(m), p.expo.aggr) - errs = errors.Join(errs, err) - expo.SetAggregationTemporality(pmetric.AggregationTemporalityCumulative) - } - } - }) - if errs != nil { - return errs - } +func (m state) Has(id identity.Stream) bool { + _, nok := m.nums[id] + _, hok := m.hist[id] + _, eok := m.expo[id] + return nok || hok || eok +} - return p.next.ConsumeMetrics(ctx, md) +func (m state) Delete(id identity.Stream) { + delete(m.nums, id) + delete(m.hist, id) + delete(m.expo, id) +} + +func (m state) BeginWith(id identity.Stream, dp any) { + switch dp := dp.(type) { + case pmetric.NumberDataPoint: + m.nums[id] = pmetric.NewNumberDataPoint() + dp.CopyTo(m.nums[id]) + case pmetric.HistogramDataPoint: + m.hist[id] = pmetric.NewHistogramDataPoint() + dp.CopyTo(m.hist[id]) + case pmetric.ExponentialHistogramDataPoint: + m.expo[id] = pmetric.NewExponentialHistogramDataPoint() + dp.CopyTo(m.expo[id]) + } } diff --git a/processor/deltatocumulativeprocessor/processor_test.go b/processor/deltatocumulativeprocessor/processor_test.go new file mode 100644 index 000000000000..daaacda42d56 --- /dev/null +++ b/processor/deltatocumulativeprocessor/processor_test.go @@ -0,0 +1,164 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package deltatocumulativeprocessor + +import ( + "context" + "encoding/json" + "errors" + "io/fs" + "math" + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/confmap/confmaptest" + "go.opentelemetry.io/collector/consumer/consumertest" + "go.opentelemetry.io/collector/pdata/pmetric" + "go.opentelemetry.io/collector/processor" + "go.opentelemetry.io/otel/sdk/metric/metricdata" + "gopkg.in/yaml.v3" + + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/testing/compare" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/testing/sdktest" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/testing/testar" +) + +func TestProcessor(t *testing.T) { + fis, err := os.ReadDir("testdata") + require.NoError(t, err) + + for _, fi := range fis { + if !fi.IsDir() { + continue + } + + type Stage struct { + In pmetric.Metrics `testar:"in,pmetric"` + Out pmetric.Metrics `testar:"out,pmetric"` + + Sdk sdktest.Spec `testar:"telemetry,sdk"` + } + + read := func(file string, into *Stage) error { + return testar.ReadFile(file, into, + testar.Parser("pmetric", unmarshalMetrics), + testar.Parser("sdk", sdktest.Unmarshal), + ) + } + + dir := fi.Name() + t.Run(dir, func(t *testing.T) { + file := func(f string) string { + return filepath.Join("testdata", dir, f) + } + + ctx := context.Background() + cfg := config(t, file("config.yaml")) + + st := setup(t, cfg) + proc, sink := st.proc, st.sink + + stages, _ := filepath.Glob(file("*.test")) + for _, file := range stages { + var stage Stage + err := read(file, &stage) + require.NoError(t, err) + + sink.Reset() + err = proc.ConsumeMetrics(ctx, stage.In) + require.NoError(t, err) + + out := []pmetric.Metrics{stage.Out} + if diff := compare.Diff(out, sink.AllMetrics()); diff != "" { + t.Fatal(diff) + } + + if err := sdktest.Test(stage.Sdk, st.tel.reader); err != nil { + t.Fatal(err) + } + } + }) + } +} + +func config(t *testing.T, file string) *Config { + cfg := NewFactory().CreateDefaultConfig().(*Config) + cm, err := confmaptest.LoadConf(file) + if errors.Is(err, fs.ErrNotExist) { + return cfg + } + require.NoError(t, err) + + err = cm.Unmarshal(cfg) + require.NoError(t, err) + return cfg +} + +func setup(tb testing.TB, cfg *Config) State { + tb.Helper() + + next := &consumertest.MetricsSink{} + if cfg == nil { + cfg = &Config{MaxStale: 0, MaxStreams: math.MaxInt} + } + + tt := setupTestTelemetry() + proc, err := NewFactory().CreateMetrics( + context.Background(), + tt.NewSettings(), + cfg, + next, + ) + require.NoError(tb, err) + + return State{ + proc: proc, + sink: next, + tel: tt, + } +} + +type State struct { + proc processor.Metrics + sink *consumertest.MetricsSink + + tel componentTestTelemetry +} + +func unmarshalMetrics(data []byte, into *pmetric.Metrics) error { + var tmp any + if err := yaml.Unmarshal(data, &tmp); err != nil { + return err + } + data, err := json.Marshal(tmp) + if err != nil { + return err + } + md, err := (&pmetric.JSONUnmarshaler{}).UnmarshalMetrics(data) + if err != nil { + return err + } + *into = md + return nil +} + +func TestTelemetry(t *testing.T) { + tt := setupTestTelemetry() + + next := &consumertest.MetricsSink{} + cfg := createDefaultConfig() + + _, err := NewFactory().CreateMetrics( + context.Background(), + tt.NewSettings(), + cfg, + next, + ) + require.NoError(t, err) + + var rm metricdata.ResourceMetrics + require.NoError(t, tt.reader.Collect(context.Background(), &rm)) +} diff --git a/processor/deltatocumulativeprocessor/testdata/exponential/1.test b/processor/deltatocumulativeprocessor/testdata/exponential/1.test new file mode 100644 index 000000000000..8aa87775ae80 --- /dev/null +++ b/processor/deltatocumulativeprocessor/testdata/exponential/1.test @@ -0,0 +1,96 @@ +-- in -- +resourceMetrics: + - schemaUrl: https://test.com/resource + scopeMetrics: + - schemaUrl: https://test.com/scope + scope: + name: Test + version: 1.2.3 + metrics: + - name: expo.simple + exponential_histogram: + aggregationTemporality: 1 + dataPoints: + - timeUnixNano: 10 + scale: 4 + zeroCount: 5 + positive: + offset: 2 + bucketCounts: [4, 7, 9, 6, 25] + negative: + offset: 6 + bucketCounts: [2, 13, 7, 12, 4] + - timeUnixNano: 20 + scale: 4 + zeroCount: 2 + positive: + offset: 2 + bucketCounts: [1, 2, 1, 2, 1] + negative: + offset: 6 + bucketCounts: [1, 2, 1, 2, 1] + - name: expo.downscale + exponential_histogram: + aggregationTemporality: 1 + dataPoints: + - timeUnixNano: 10 + scale: 2 + zeroCount: 1 + positive: + bucketCounts: [1,2,3,4,5] + - timeUnixNano: 20 + scale: 1 + zeroCount: 0 + positive: + bucketCounts: [0,0,0,0,0] + +-- out -- +resourceMetrics: + - schemaUrl: https://test.com/resource + scopeMetrics: + - schemaUrl: https://test.com/scope + scope: + name: Test + version: 1.2.3 + metrics: + - name: expo.simple + exponential_histogram: + aggregationTemporality: 2 + dataPoints: + - timeUnixNano: 10 + scale: 4 + zeroCount: 5 + positive: + offset: 2 + bucketCounts: [4, 7, 9, 6, 25] + negative: + offset: 6 + bucketCounts: [2, 13, 7, 12, 4] + - timeUnixNano: 20 + scale: 4 + zeroCount: 7 + positive: + offset: 2 + bucketCounts: [5, 9, 10, 8, 26] + negative: + offset: 6 + bucketCounts: [3, 15, 8, 14, 5] + + - name: expo.downscale + exponential_histogram: + aggregationTemporality: 2 + dataPoints: + - timeUnixNano: 10 + scale: 2 + zeroCount: 1 + positive: + bucketCounts: [1,2,3,4,5] + - timeUnixNano: 20 + scale: 1 + zeroCount: 1 + positive: + bucketCounts: [3,7,5,0,0] + +-- telemetry -- +updown otelcol_deltatocumulative.streams.tracked.linear: +- int: 2 diff --git a/processor/deltatocumulativeprocessor/testdata/histograms/1.test b/processor/deltatocumulativeprocessor/testdata/histograms/1.test new file mode 100644 index 000000000000..ed1265db7713 --- /dev/null +++ b/processor/deltatocumulativeprocessor/testdata/histograms/1.test @@ -0,0 +1,53 @@ +-- in -- +resourceMetrics: + - schemaUrl: https://test.com/resource + scopeMetrics: + - schemaUrl: https://test.com/scope + scope: + name: test + version: 1.2.3 + metrics: + - name: some.histogram + histogram: + aggregationTemporality: 1 + dataPoints: + - timeUnixNano: 10 + explicitBounds: [0.01, 0.1, 1, 10, 100] + bucketCounts: [1, 2, 3, 4, 5] + - timeUnixNano: 20 + explicitBounds: [0.01, 0.1, 1, 10, 100] + bucketCounts: [1, 0, 1, 0, 1] + + # bounds change + - timeUnixNano: 30 + explicitBounds: [ 0.1, 1, 10, 100] + bucketCounts: [ 1, 2, 3, 4] + +-- out -- +resourceMetrics: + - schemaUrl: https://test.com/resource + scopeMetrics: + - schemaUrl: https://test.com/scope + scope: + name: test + version: 1.2.3 + metrics: + - name: some.histogram + histogram: + aggregationTemporality: 2 + dataPoints: + - timeUnixNano: 10 + explicitBounds: [0.01, 0.1, 1, 10, 100] + bucketCounts: [1, 2, 3, 4, 5] + - timeUnixNano: 20 + explicitBounds: [0.01, 0.1, 1, 10, 100] + bucketCounts: [2, 2, 4, 4, 6] + + # bounds change: reset + - timeUnixNano: 30 + explicitBounds: [ 0.1, 1, 10, 100] + bucketCounts: [ 1, 2, 3, 4] + +-- telemetry -- +updown otelcol_deltatocumulative.streams.tracked.linear: +- int: 1 diff --git a/processor/deltatocumulativeprocessor/testdata/limit/1.test b/processor/deltatocumulativeprocessor/testdata/limit/1.test new file mode 100644 index 000000000000..cdc6d8a97f39 --- /dev/null +++ b/processor/deltatocumulativeprocessor/testdata/limit/1.test @@ -0,0 +1,55 @@ +-- in -- +resourceMetrics: + - schemaUrl: https://test.com/resource + scopeMetrics: + - schemaUrl: https://test.com/scope + scope: + name: Test + version: 1.2.3 + metrics: + - name: sum + sum: + aggregationTemporality: 1 # delta + dataPoints: + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "0"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "1"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "2"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "3"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "4"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "5"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "6"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "7"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "8"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "9"}}]} + +-- out -- +resourceMetrics: + - schemaUrl: https://test.com/resource + scopeMetrics: + - schemaUrl: https://test.com/scope + scope: + name: Test + version: 1.2.3 + metrics: + - name: sum + sum: + aggregationTemporality: 2 # cumulative + dataPoints: + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "0"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "1"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "2"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "3"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "4"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "5"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "6"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "7"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "8"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "9"}}]} + +-- telemetry -- +counter otelcol_deltatocumulative.datapoints.linear: + - int: 10 + attr: {} + +updown otelcol_deltatocumulative.streams.tracked.linear: + - int: 10 diff --git a/processor/deltatocumulativeprocessor/testdata/limit/2.test b/processor/deltatocumulativeprocessor/testdata/limit/2.test new file mode 100644 index 000000000000..236e518aee0a --- /dev/null +++ b/processor/deltatocumulativeprocessor/testdata/limit/2.test @@ -0,0 +1,59 @@ +-- in -- +resourceMetrics: + - schemaUrl: https://test.com/resource + scopeMetrics: + - schemaUrl: https://test.com/scope + scope: + name: Test + version: 1.2.3 + metrics: + - name: sum + sum: + aggregationTemporality: 1 # delta + dataPoints: + - {timeUnixNano: 2, asDouble: 1, attributes: [{key: series, value: {stringValue: "0"}}]} + - {timeUnixNano: 2, asDouble: 1, attributes: [{key: series, value: {stringValue: "1"}}]} + - {timeUnixNano: 2, asDouble: 1, attributes: [{key: series, value: {stringValue: "2"}}]} + - {timeUnixNano: 2, asDouble: 1, attributes: [{key: series, value: {stringValue: "3"}}]} + - {timeUnixNano: 2, asDouble: 1, attributes: [{key: series, value: {stringValue: "4"}}]} + - {timeUnixNano: 2, asDouble: 1, attributes: [{key: series, value: {stringValue: "5"}}]} + - {timeUnixNano: 2, asDouble: 1, attributes: [{key: series, value: {stringValue: "6"}}]} + - {timeUnixNano: 2, asDouble: 1, attributes: [{key: series, value: {stringValue: "7"}}]} + - {timeUnixNano: 2, asDouble: 1, attributes: [{key: series, value: {stringValue: "8"}}]} + - {timeUnixNano: 2, asDouble: 1, attributes: [{key: series, value: {stringValue: "9"}}]} + - {timeUnixNano: 2, asDouble: 1, attributes: [{key: series, value: {stringValue: "x"}}]} # will exceed limit + +-- out -- +resourceMetrics: + - schemaUrl: https://test.com/resource + scopeMetrics: + - schemaUrl: https://test.com/scope + scope: + name: Test + version: 1.2.3 + metrics: + - name: sum + sum: + aggregationTemporality: 2 # cumulative + dataPoints: + - {timeUnixNano: 2, asDouble: 2, attributes: [{key: series, value: {stringValue: "0"}}]} + - {timeUnixNano: 2, asDouble: 2, attributes: [{key: series, value: {stringValue: "1"}}]} + - {timeUnixNano: 2, asDouble: 2, attributes: [{key: series, value: {stringValue: "2"}}]} + - {timeUnixNano: 2, asDouble: 2, attributes: [{key: series, value: {stringValue: "3"}}]} + - {timeUnixNano: 2, asDouble: 2, attributes: [{key: series, value: {stringValue: "4"}}]} + - {timeUnixNano: 2, asDouble: 2, attributes: [{key: series, value: {stringValue: "5"}}]} + - {timeUnixNano: 2, asDouble: 2, attributes: [{key: series, value: {stringValue: "6"}}]} + - {timeUnixNano: 2, asDouble: 2, attributes: [{key: series, value: {stringValue: "7"}}]} + - {timeUnixNano: 2, asDouble: 2, attributes: [{key: series, value: {stringValue: "8"}}]} + - {timeUnixNano: 2, asDouble: 2, attributes: [{key: series, value: {stringValue: "9"}}]} + # - {timeUnixNano: 2, asDouble: 2, attributes: [{key: series, value: {stringValue: "x"}}]} # dropped + +-- telemetry -- +counter otelcol_deltatocumulative.datapoints.linear: + - int: 20 + attr: {} + - int: 1 + attr: {error: "limit"} + +updown otelcol_deltatocumulative.streams.tracked.linear: + - int: 10 diff --git a/processor/deltatocumulativeprocessor/testdata/limit/config.yaml b/processor/deltatocumulativeprocessor/testdata/limit/config.yaml new file mode 100644 index 000000000000..b8642c6cd928 --- /dev/null +++ b/processor/deltatocumulativeprocessor/testdata/limit/config.yaml @@ -0,0 +1 @@ +max_streams: 10 diff --git a/processor/deltatocumulativeprocessor/testdata/notemporality-ignored/1.test b/processor/deltatocumulativeprocessor/testdata/notemporality-ignored/1.test new file mode 100644 index 000000000000..556a59bae0f5 --- /dev/null +++ b/processor/deltatocumulativeprocessor/testdata/notemporality-ignored/1.test @@ -0,0 +1,76 @@ +-- in -- +resourceMetrics: + - schemaUrl: https://test.com/resource + resource: + attributes: + - key: resattr + value: { stringValue: stringoo } + scopeMetrics: + - schemaUrl: https://test.com/scope + scope: + name: Test + version: 1.2.3 + attributes: + - key: scopeattr + value: { stringValue: string } + metrics: + - name: test.sum + sum: + aggregationTemporality: 1 + dataPoints: + - timeUnixNano: 1 + asInt: 3 + - name: test.gauge + gauge: + dataPoints: + - timeUnixNano: 1 + asDouble: 1 + - name: test.summary + summary: + dataPoints: + - timeUnixNano: 1 + quantileValues: + - quantile: 0.25 + value: 25 + +-- out -- +resourceMetrics: + - schemaUrl: https://test.com/resource + resource: + attributes: + - key: resattr + value: { stringValue: stringoo } + scopeMetrics: + - schemaUrl: https://test.com/scope + scope: + name: Test + version: 1.2.3 + attributes: + - key: scopeattr + value: { stringValue: string } + metrics: + - name: test.sum + sum: + aggregationTemporality: 2 + dataPoints: + - timeUnixNano: 1 + asInt: 3 + - name: test.gauge + gauge: + dataPoints: + - timeUnixNano: 1 + asDouble: 1 + - name: test.summary + summary: + dataPoints: + - timeUnixNano: 1 + quantileValues: + - quantile: 0.25 + value: 25 + +-- telemetry -- +counter otelcol_deltatocumulative.datapoints.linear: +- int: 1 + +updown otelcol_deltatocumulative.streams.tracked.linear: +- int: 1 diff --git a/processor/deltatocumulativeprocessor/testdata/timestamps/1.test b/processor/deltatocumulativeprocessor/testdata/timestamps/1.test new file mode 100644 index 000000000000..cae1f8af87ab --- /dev/null +++ b/processor/deltatocumulativeprocessor/testdata/timestamps/1.test @@ -0,0 +1,44 @@ +-- in -- +resourceMetrics: + - schemaUrl: https://test.com/resource + scopeMetrics: + - schemaUrl: https://test.com/scope + scope: + name: Test + version: 1.2.3 + metrics: + - name: sum + sum: + aggregationTemporality: 1 # delta + dataPoints: + - {startTimeUnixNano: 1000, timeUnixNano: 1100, asDouble: 0} + - {startTimeUnixNano: 1100, timeUnixNano: 1200, asDouble: 0} + # - {startTimeUnixNano: 1200, timeUnixNano: 1300, asDouble: 0} + - {startTimeUnixNano: 1300, timeUnixNano: 1400, asDouble: 0} # gap (previous sample missing): accept + - {startTimeUnixNano: 1200, timeUnixNano: 1300, asDouble: 0} # out of order: drop + - {startTimeUnixNano: 500, timeUnixNano: 550, asDouble: 0} # belongs to older series: drop + +-- out -- +resourceMetrics: + - schemaUrl: https://test.com/resource + scopeMetrics: + - schemaUrl: https://test.com/scope + scope: + name: Test + version: 1.2.3 + metrics: + - name: sum + sum: + aggregationTemporality: 2 # cumulative + dataPoints: + - {startTimeUnixNano: 1000, timeUnixNano: 1100, asDouble: 0} + - {startTimeUnixNano: 1000, timeUnixNano: 1200, asDouble: 0} + - {startTimeUnixNano: 1000, timeUnixNano: 1400, asDouble: 0} + +-- telemetry -- +counter otelcol_deltatocumulative.datapoints.linear: +- int: 3 +- attr: {error: "delta.ErrOutOfOrder"} + int: 1 +- attr: {error: "delta.ErrOlderStart"} + int: 1 diff --git a/processor/deltatocumulativeprocessor/testdata/tracking/1.test b/processor/deltatocumulativeprocessor/testdata/tracking/1.test new file mode 100644 index 000000000000..152fee2b5934 --- /dev/null +++ b/processor/deltatocumulativeprocessor/testdata/tracking/1.test @@ -0,0 +1,379 @@ +-- in -- +resourceMetrics: + - resource: + attributes: + - {key: "21f4", value: {stringValue: "42c8"}} + - {key: "7e7", value: {stringValue: "4b13"}} + scopeMetrics: + - metrics: + - description: 754d + name: 29c9 + sum: + aggregationTemporality: 1 + dataPoints: + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "1100", asInt: "124"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "1700", asInt: "22"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "2400", asInt: "27"} + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "3100", asInt: "115"} + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "4600", asInt: "47"} + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "5200", asInt: "34"} + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "6400", asInt: "98"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "6800", asInt: "36"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "7100", asInt: "48"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "8200", asInt: "118"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "8300", asInt: "62"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "8700", asInt: "118"} + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "9000", asInt: "51"} + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "9400", asInt: "49"} + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "10200", asInt: "97"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "10400", asInt: "21"} + unit: "7337" + - description: 611d + name: "5e04" + sum: + aggregationTemporality: 1 + dataPoints: + - {attributes: [{key: "1f1d", value: {stringValue: "762b"}}], startTimeUnixNano: "1000", timeUnixNano: "1400", asInt: "84"} + - {attributes: [{key: "1f1d", value: {stringValue: "762b"}}], startTimeUnixNano: "1000", timeUnixNano: "1800", asInt: "53"} + - {attributes: [{key: "6eeb", value: {stringValue: "e44"}}], startTimeUnixNano: "1000", timeUnixNano: "3400", asInt: "122"} + - {attributes: [{key: "6eeb", value: {stringValue: "e44"}}], startTimeUnixNano: "1000", timeUnixNano: "3600", asInt: "104"} + - {attributes: [{key: "6eeb", value: {stringValue: "e44"}}], startTimeUnixNano: "1000", timeUnixNano: "4100", asInt: "91"} + - {attributes: [{key: "6eeb", value: {stringValue: "e44"}}], startTimeUnixNano: "1000", timeUnixNano: "5300", asInt: "123"} + - {attributes: [{key: "6eeb", value: {stringValue: "e44"}}], startTimeUnixNano: "1000", timeUnixNano: "5600", asInt: "112"} + - {attributes: [{key: "1f1d", value: {stringValue: "762b"}}], startTimeUnixNano: "1000", timeUnixNano: "7600", asInt: "83"} + - {attributes: [{key: "1f1d", value: {stringValue: "762b"}}], startTimeUnixNano: "1000", timeUnixNano: "7700", asInt: "8"} + - {attributes: [{key: "6eeb", value: {stringValue: "e44"}}], startTimeUnixNano: "1000", timeUnixNano: "8500", asInt: "12"} + - {attributes: [{key: "6eeb", value: {stringValue: "e44"}}], startTimeUnixNano: "1000", timeUnixNano: "9100", asInt: "57"} + unit: 6db0 + scope: + attributes: + - {key: "553", value: {stringValue: "144a"}} + - {key: "5ab6", value: {stringValue: "9a8"}} + name: "7715" + version: 7bfb + - metrics: + - description: 52f4 + name: 476d + sum: + aggregationTemporality: 1 + dataPoints: + - {attributes: [{key: "19b0", value: {stringValue: "114f"}}], startTimeUnixNano: "1000", timeUnixNano: "2100", asInt: "66"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "2900", asInt: "112"} + - {attributes: [{key: "19b0", value: {stringValue: "114f"}}], startTimeUnixNano: "1000", timeUnixNano: "3000", asInt: "63"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "3900", asInt: "86"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "4000", asInt: "11"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "4200", asInt: "116"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "4300", asInt: "69"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "5400", asInt: "31"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "6500", asInt: "31"} + - {attributes: [{key: "19b0", value: {stringValue: "114f"}}], startTimeUnixNano: "1000", timeUnixNano: "7300", asInt: "78"} + - {attributes: [{key: "19b0", value: {stringValue: "114f"}}], startTimeUnixNano: "1000", timeUnixNano: "7900", asInt: "3"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "8000", asInt: "73"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "8900", asInt: "30"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "9500", asInt: "85"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "9600", asInt: "52"} + - {attributes: [{key: "19b0", value: {stringValue: "114f"}}], startTimeUnixNano: "1000", timeUnixNano: "9900", asInt: "66"} + - {attributes: [{key: "19b0", value: {stringValue: "114f"}}], startTimeUnixNano: "1000", timeUnixNano: "10000", asInt: "43"} + unit: 331a + - description: "3985" + name: "2128" + sum: + aggregationTemporality: 1 + dataPoints: + - {attributes: [{key: "b0", value: {stringValue: "3b97"}}], startTimeUnixNano: "1000", timeUnixNano: "1500", asInt: "63"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "1600", asInt: "26"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "2500", asInt: "105"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "3200", asInt: "68"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "5500", asInt: "8"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "5800", asInt: "16"} + - {attributes: [{key: "b0", value: {stringValue: "3b97"}}], startTimeUnixNano: "1000", timeUnixNano: "6100", asInt: "5"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "6700", asInt: "78"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "7000", asInt: "1"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "7500", asInt: "10"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "9800", asInt: "119"} + - {attributes: [{key: "b0", value: {stringValue: "3b97"}}], startTimeUnixNano: "1000", timeUnixNano: "10300", asInt: "80"} + - {attributes: [{key: "b0", value: {stringValue: "3b97"}}], startTimeUnixNano: "1000", timeUnixNano: "10500", asInt: "49"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "10600", asInt: "62"} + - {attributes: [{key: "b0", value: {stringValue: "3b97"}}], startTimeUnixNano: "1000", timeUnixNano: "10700", asInt: "87"} + unit: 164b + scope: + attributes: + - {key: "6c70", value: {stringValue: "2773"}} + - {key: "766b", value: {stringValue: "370c"}} + name: 6c45 + version: 74f9 + - resource: + attributes: + - {key: "2aa", value: {stringValue: "7f34"}} + - {key: "261e", value: {stringValue: "3076"}} + scopeMetrics: + - metrics: + - description: 2d50 + name: "5863" + sum: + aggregationTemporality: 1 + dataPoints: + - {attributes: [{key: "27bd", value: {stringValue: "21a"}}], startTimeUnixNano: "1000", timeUnixNano: "2200", asInt: "52"} + - {attributes: [{key: "27bd", value: {stringValue: "21a"}}], startTimeUnixNano: "1000", timeUnixNano: "2700", asInt: "46"} + - {attributes: [{key: "33cf", value: {stringValue: "23b0"}}], startTimeUnixNano: "1000", timeUnixNano: "4400", asInt: "84"} + - {attributes: [{key: "27bd", value: {stringValue: "21a"}}], startTimeUnixNano: "1000", timeUnixNano: "4700", asInt: "23"} + - {attributes: [{key: "33cf", value: {stringValue: "23b0"}}], startTimeUnixNano: "1000", timeUnixNano: "5100", asInt: "21"} + - {attributes: [{key: "33cf", value: {stringValue: "23b0"}}], startTimeUnixNano: "1000", timeUnixNano: "5900", asInt: "54"} + - {attributes: [{key: "33cf", value: {stringValue: "23b0"}}], startTimeUnixNano: "1000", timeUnixNano: "6300", asInt: "120"} + - {attributes: [{key: "27bd", value: {stringValue: "21a"}}], startTimeUnixNano: "1000", timeUnixNano: "7800", asInt: "112"} + - {attributes: [{key: "27bd", value: {stringValue: "21a"}}], startTimeUnixNano: "1000", timeUnixNano: "9300", asInt: "57"} + - {attributes: [{key: "33cf", value: {stringValue: "23b0"}}], startTimeUnixNano: "1000", timeUnixNano: "10800", asInt: "55"} + - {attributes: [{key: "33cf", value: {stringValue: "23b0"}}], startTimeUnixNano: "1000", timeUnixNano: "10900", asInt: "29"} + unit: 541a + - description: 6b2c + name: 430c + sum: + aggregationTemporality: 1 + dataPoints: + - {attributes: [{key: "1ac7", value: {stringValue: "5b1f"}}], startTimeUnixNano: "1000", timeUnixNano: "1200", asInt: "51"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "1900", asInt: "50"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "2800", asInt: "86"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "3300", asInt: "79"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "3500", asInt: "97"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "6200", asInt: "58"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "6900", asInt: "96"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "7200", asInt: "34"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "7400", asInt: "5"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "8800", asInt: "117"} + unit: 785e + scope: + attributes: + - {key: "509", value: {stringValue: "2bcd"}} + - {key: "2aec", value: {stringValue: "390b"}} + name: "6812" + version: 17ce + - metrics: + - description: c6a + name: 3ccc + sum: + aggregationTemporality: 1 + dataPoints: + - {attributes: [{key: "75d9", value: {stringValue: "4b59"}}], startTimeUnixNano: "1000", timeUnixNano: "1300", asInt: "77"} + - {attributes: [{key: "75d9", value: {stringValue: "4b59"}}], startTimeUnixNano: "1000", timeUnixNano: "2300", asInt: "8"} + - {attributes: [{key: "306c", value: {stringValue: "3c61"}}], startTimeUnixNano: "1000", timeUnixNano: "3800", asInt: "41"} + - {attributes: [{key: "306c", value: {stringValue: "3c61"}}], startTimeUnixNano: "1000", timeUnixNano: "5700", asInt: "31"} + - {attributes: [{key: "75d9", value: {stringValue: "4b59"}}], startTimeUnixNano: "1000", timeUnixNano: "6600", asInt: "38"} + - {attributes: [{key: "75d9", value: {stringValue: "4b59"}}], startTimeUnixNano: "1000", timeUnixNano: "8400", asInt: "13"} + - {attributes: [{key: "75d9", value: {stringValue: "4b59"}}], startTimeUnixNano: "1000", timeUnixNano: "8600", asInt: "106"} + - {attributes: [{key: "306c", value: {stringValue: "3c61"}}], startTimeUnixNano: "1000", timeUnixNano: "9200", asInt: "49"} + - {attributes: [{key: "75d9", value: {stringValue: "4b59"}}], startTimeUnixNano: "1000", timeUnixNano: "9700", asInt: "0"} + unit: 1adc + - description: 20fb + name: 61b6 + sum: + aggregationTemporality: 1 + dataPoints: + - {attributes: [{key: "2fad", value: {stringValue: "3ea1"}}], startTimeUnixNano: "1000", timeUnixNano: "1000", asInt: "45"} + - {attributes: [{key: "2afe", value: {stringValue: "22f1"}}], startTimeUnixNano: "1000", timeUnixNano: "2000", asInt: "53"} + - {attributes: [{key: "2fad", value: {stringValue: "3ea1"}}], startTimeUnixNano: "1000", timeUnixNano: "2600", asInt: "47"} + - {attributes: [{key: "2fad", value: {stringValue: "3ea1"}}], startTimeUnixNano: "1000", timeUnixNano: "3700", asInt: "61"} + - {attributes: [{key: "2fad", value: {stringValue: "3ea1"}}], startTimeUnixNano: "1000", timeUnixNano: "4500", asInt: "27"} + - {attributes: [{key: "2fad", value: {stringValue: "3ea1"}}], startTimeUnixNano: "1000", timeUnixNano: "4800", asInt: "37"} + - {attributes: [{key: "2fad", value: {stringValue: "3ea1"}}], startTimeUnixNano: "1000", timeUnixNano: "4900", asInt: "100"} + - {attributes: [{key: "2fad", value: {stringValue: "3ea1"}}], startTimeUnixNano: "1000", timeUnixNano: "5000", asInt: "73"} + - {attributes: [{key: "2afe", value: {stringValue: "22f1"}}], startTimeUnixNano: "1000", timeUnixNano: "6000", asInt: "71"} + - {attributes: [{key: "2afe", value: {stringValue: "22f1"}}], startTimeUnixNano: "1000", timeUnixNano: "8100", asInt: "55"} + - {attributes: [{key: "2afe", value: {stringValue: "22f1"}}], startTimeUnixNano: "1000", timeUnixNano: "10100", asInt: "71"} + unit: "5679" + scope: + attributes: + - {key: "14cf", value: {stringValue: "64ea"}} + - {key: "67ef", value: {stringValue: "4299"}} + name: 58a7 + version: 1cd0 +-- out -- +resourceMetrics: + - resource: + attributes: + - {key: "21f4", value: {stringValue: "42c8"}} + - {key: "7e7", value: {stringValue: "4b13"}} + scopeMetrics: + - metrics: + - description: 754d + name: 29c9 + sum: + aggregationTemporality: 2 + dataPoints: + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "1100", asInt: "124"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "1700", asInt: "22"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "2400", asInt: "49"} + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "3100", asInt: "239"} + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "4600", asInt: "286"} + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "5200", asInt: "320"} + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "6400", asInt: "418"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "6800", asInt: "85"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "7100", asInt: "133"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "8200", asInt: "251"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "8300", asInt: "313"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "8700", asInt: "431"} + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "9000", asInt: "469"} + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "9400", asInt: "518"} + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "10200", asInt: "615"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "10400", asInt: "452"} + unit: "7337" + - description: 611d + name: "5e04" + sum: + aggregationTemporality: 2 + dataPoints: + - {attributes: [{key: "1f1d", value: {stringValue: "762b"}}], startTimeUnixNano: "1000", timeUnixNano: "1400", asInt: "84"} + - {attributes: [{key: "1f1d", value: {stringValue: "762b"}}], startTimeUnixNano: "1000", timeUnixNano: "1800", asInt: "137"} + - {attributes: [{key: "6eeb", value: {stringValue: "e44"}}], startTimeUnixNano: "1000", timeUnixNano: "3400", asInt: "122"} + - {attributes: [{key: "6eeb", value: {stringValue: "e44"}}], startTimeUnixNano: "1000", timeUnixNano: "3600", asInt: "226"} + - {attributes: [{key: "6eeb", value: {stringValue: "e44"}}], startTimeUnixNano: "1000", timeUnixNano: "4100", asInt: "317"} + - {attributes: [{key: "6eeb", value: {stringValue: "e44"}}], startTimeUnixNano: "1000", timeUnixNano: "5300", asInt: "440"} + - {attributes: [{key: "6eeb", value: {stringValue: "e44"}}], startTimeUnixNano: "1000", timeUnixNano: "5600", asInt: "552"} + - {attributes: [{key: "1f1d", value: {stringValue: "762b"}}], startTimeUnixNano: "1000", timeUnixNano: "7600", asInt: "220"} + - {attributes: [{key: "1f1d", value: {stringValue: "762b"}}], startTimeUnixNano: "1000", timeUnixNano: "7700", asInt: "228"} + - {attributes: [{key: "6eeb", value: {stringValue: "e44"}}], startTimeUnixNano: "1000", timeUnixNano: "8500", asInt: "564"} + - {attributes: [{key: "6eeb", value: {stringValue: "e44"}}], startTimeUnixNano: "1000", timeUnixNano: "9100", asInt: "621"} + unit: 6db0 + scope: + attributes: + - {key: "553", value: {stringValue: "144a"}} + - {key: "5ab6", value: {stringValue: "9a8"}} + name: "7715" + version: 7bfb + - metrics: + - description: 52f4 + name: 476d + sum: + aggregationTemporality: 2 + dataPoints: + - {attributes: [{key: "19b0", value: {stringValue: "114f"}}], startTimeUnixNano: "1000", timeUnixNano: "2100", asInt: "66"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "2900", asInt: "112"} + - {attributes: [{key: "19b0", value: {stringValue: "114f"}}], startTimeUnixNano: "1000", timeUnixNano: "3000", asInt: "129"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "3900", asInt: "198"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "4000", asInt: "209"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "4200", asInt: "325"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "4300", asInt: "394"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "5400", asInt: "425"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "6500", asInt: "456"} + - {attributes: [{key: "19b0", value: {stringValue: "114f"}}], startTimeUnixNano: "1000", timeUnixNano: "7300", asInt: "207"} + - {attributes: [{key: "19b0", value: {stringValue: "114f"}}], startTimeUnixNano: "1000", timeUnixNano: "7900", asInt: "210"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "8000", asInt: "529"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "8900", asInt: "559"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "9500", asInt: "644"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "9600", asInt: "696"} + - {attributes: [{key: "19b0", value: {stringValue: "114f"}}], startTimeUnixNano: "1000", timeUnixNano: "9900", asInt: "276"} + - {attributes: [{key: "19b0", value: {stringValue: "114f"}}], startTimeUnixNano: "1000", timeUnixNano: "10000", asInt: "319"} + unit: 331a + - description: "3985" + name: "2128" + sum: + aggregationTemporality: 2 + dataPoints: + - {attributes: [{key: "b0", value: {stringValue: "3b97"}}], startTimeUnixNano: "1000", timeUnixNano: "1500", asInt: "63"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "1600", asInt: "26"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "2500", asInt: "131"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "3200", asInt: "199"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "5500", asInt: "207"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "5800", asInt: "223"} + - {attributes: [{key: "b0", value: {stringValue: "3b97"}}], startTimeUnixNano: "1000", timeUnixNano: "6100", asInt: "68"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "6700", asInt: "301"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "7000", asInt: "302"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "7500", asInt: "312"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "9800", asInt: "431"} + - {attributes: [{key: "b0", value: {stringValue: "3b97"}}], startTimeUnixNano: "1000", timeUnixNano: "10300", asInt: "148"} + - {attributes: [{key: "b0", value: {stringValue: "3b97"}}], startTimeUnixNano: "1000", timeUnixNano: "10500", asInt: "197"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "10600", asInt: "493"} + - {attributes: [{key: "b0", value: {stringValue: "3b97"}}], startTimeUnixNano: "1000", timeUnixNano: "10700", asInt: "284"} + unit: 164b + scope: + attributes: + - {key: "6c70", value: {stringValue: "2773"}} + - {key: "766b", value: {stringValue: "370c"}} + name: 6c45 + version: 74f9 + - resource: + attributes: + - {key: "2aa", value: {stringValue: "7f34"}} + - {key: "261e", value: {stringValue: "3076"}} + scopeMetrics: + - metrics: + - description: 2d50 + name: "5863" + sum: + aggregationTemporality: 2 + dataPoints: + - {attributes: [{key: "27bd", value: {stringValue: "21a"}}], startTimeUnixNano: "1000", timeUnixNano: "2200", asInt: "52"} + - {attributes: [{key: "27bd", value: {stringValue: "21a"}}], startTimeUnixNano: "1000", timeUnixNano: "2700", asInt: "98"} + - {attributes: [{key: "33cf", value: {stringValue: "23b0"}}], startTimeUnixNano: "1000", timeUnixNano: "4400", asInt: "84"} + - {attributes: [{key: "27bd", value: {stringValue: "21a"}}], startTimeUnixNano: "1000", timeUnixNano: "4700", asInt: "121"} + - {attributes: [{key: "33cf", value: {stringValue: "23b0"}}], startTimeUnixNano: "1000", timeUnixNano: "5100", asInt: "105"} + - {attributes: [{key: "33cf", value: {stringValue: "23b0"}}], startTimeUnixNano: "1000", timeUnixNano: "5900", asInt: "159"} + - {attributes: [{key: "33cf", value: {stringValue: "23b0"}}], startTimeUnixNano: "1000", timeUnixNano: "6300", asInt: "279"} + - {attributes: [{key: "27bd", value: {stringValue: "21a"}}], startTimeUnixNano: "1000", timeUnixNano: "7800", asInt: "233"} + - {attributes: [{key: "27bd", value: {stringValue: "21a"}}], startTimeUnixNano: "1000", timeUnixNano: "9300", asInt: "290"} + - {attributes: [{key: "33cf", value: {stringValue: "23b0"}}], startTimeUnixNano: "1000", timeUnixNano: "10800", asInt: "334"} + - {attributes: [{key: "33cf", value: {stringValue: "23b0"}}], startTimeUnixNano: "1000", timeUnixNano: "10900", asInt: "363"} + unit: 541a + - description: 6b2c + name: 430c + sum: + aggregationTemporality: 2 + dataPoints: + - {attributes: [{key: "1ac7", value: {stringValue: "5b1f"}}], startTimeUnixNano: "1000", timeUnixNano: "1200", asInt: "51"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "1900", asInt: "50"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "2800", asInt: "136"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "3300", asInt: "215"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "3500", asInt: "312"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "6200", asInt: "370"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "6900", asInt: "466"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "7200", asInt: "500"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "7400", asInt: "505"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "8800", asInt: "622"} + unit: 785e + scope: + attributes: + - {key: "509", value: {stringValue: "2bcd"}} + - {key: "2aec", value: {stringValue: "390b"}} + name: "6812" + version: 17ce + - metrics: + - description: c6a + name: 3ccc + sum: + aggregationTemporality: 2 + dataPoints: + - {attributes: [{key: "75d9", value: {stringValue: "4b59"}}], startTimeUnixNano: "1000", timeUnixNano: "1300", asInt: "77"} + - {attributes: [{key: "75d9", value: {stringValue: "4b59"}}], startTimeUnixNano: "1000", timeUnixNano: "2300", asInt: "85"} + - {attributes: [{key: "306c", value: {stringValue: "3c61"}}], startTimeUnixNano: "1000", timeUnixNano: "3800", asInt: "41"} + - {attributes: [{key: "306c", value: {stringValue: "3c61"}}], startTimeUnixNano: "1000", timeUnixNano: "5700", asInt: "72"} + - {attributes: [{key: "75d9", value: {stringValue: "4b59"}}], startTimeUnixNano: "1000", timeUnixNano: "6600", asInt: "123"} + - {attributes: [{key: "75d9", value: {stringValue: "4b59"}}], startTimeUnixNano: "1000", timeUnixNano: "8400", asInt: "136"} + - {attributes: [{key: "75d9", value: {stringValue: "4b59"}}], startTimeUnixNano: "1000", timeUnixNano: "8600", asInt: "242"} + - {attributes: [{key: "306c", value: {stringValue: "3c61"}}], startTimeUnixNano: "1000", timeUnixNano: "9200", asInt: "121"} + - {attributes: [{key: "75d9", value: {stringValue: "4b59"}}], startTimeUnixNano: "1000", timeUnixNano: "9700", asInt: "242"} + unit: 1adc + - description: 20fb + name: 61b6 + sum: + aggregationTemporality: 2 + dataPoints: + - {attributes: [{key: "2fad", value: {stringValue: "3ea1"}}], startTimeUnixNano: "1000", timeUnixNano: "1000", asInt: "45"} + - {attributes: [{key: "2afe", value: {stringValue: "22f1"}}], startTimeUnixNano: "1000", timeUnixNano: "2000", asInt: "53"} + - {attributes: [{key: "2fad", value: {stringValue: "3ea1"}}], startTimeUnixNano: "1000", timeUnixNano: "2600", asInt: "92"} + - {attributes: [{key: "2fad", value: {stringValue: "3ea1"}}], startTimeUnixNano: "1000", timeUnixNano: "3700", asInt: "153"} + - {attributes: [{key: "2fad", value: {stringValue: "3ea1"}}], startTimeUnixNano: "1000", timeUnixNano: "4500", asInt: "180"} + - {attributes: [{key: "2fad", value: {stringValue: "3ea1"}}], startTimeUnixNano: "1000", timeUnixNano: "4800", asInt: "217"} + - {attributes: [{key: "2fad", value: {stringValue: "3ea1"}}], startTimeUnixNano: "1000", timeUnixNano: "4900", asInt: "317"} + - {attributes: [{key: "2fad", value: {stringValue: "3ea1"}}], startTimeUnixNano: "1000", timeUnixNano: "5000", asInt: "390"} + - {attributes: [{key: "2afe", value: {stringValue: "22f1"}}], startTimeUnixNano: "1000", timeUnixNano: "6000", asInt: "124"} + - {attributes: [{key: "2afe", value: {stringValue: "22f1"}}], startTimeUnixNano: "1000", timeUnixNano: "8100", asInt: "179"} + - {attributes: [{key: "2afe", value: {stringValue: "22f1"}}], startTimeUnixNano: "1000", timeUnixNano: "10100", asInt: "250"} + unit: "5679" + scope: + attributes: + - {key: "14cf", value: {stringValue: "64ea"}} + - {key: "67ef", value: {stringValue: "4299"}} + name: 58a7 + version: 1cd0 + +-- telemetry -- +# skip diff --git a/processor/deltatorateprocessor/README.md b/processor/deltatorateprocessor/README.md index 4e919130803f..a50b4f14bbf3 100644 --- a/processor/deltatorateprocessor/README.md +++ b/processor/deltatorateprocessor/README.md @@ -2,13 +2,14 @@ | Status | | | ------------- |-----------| -| Stability | [development]: metrics | -| Distributions | [contrib] | +| Stability | [alpha]: metrics | +| Distributions | [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aprocessor%2Fdeltatorate%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aprocessor%2Fdeltatorate) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aprocessor%2Fdeltatorate%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aprocessor%2Fdeltatorate) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@Aneurysm9](https://www.github.com/Aneurysm9) | -[development]: https://github.com/open-telemetry/opentelemetry-collector#development +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s **Status: under development; Not recommended for production usage.** diff --git a/processor/deltatorateprocessor/config.go b/processor/deltatorateprocessor/config.go index 15d6e5cd7971..99efcfd45391 100644 --- a/processor/deltatorateprocessor/config.go +++ b/processor/deltatorateprocessor/config.go @@ -9,7 +9,6 @@ import ( // Config defines the configuration for the processor. type Config struct { - // List of delta sum metrics to convert to rates Metrics []string `mapstructure:"metrics"` } diff --git a/processor/deltatorateprocessor/config_test.go b/processor/deltatorateprocessor/config_test.go index c23b912f0bf9..05a1cb797db4 100644 --- a/processor/deltatorateprocessor/config_test.go +++ b/processor/deltatorateprocessor/config_test.go @@ -48,7 +48,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) if tt.expected == nil { assert.EqualError(t, component.ValidateConfig(cfg), tt.errorMessage) diff --git a/processor/deltatorateprocessor/factory.go b/processor/deltatorateprocessor/factory.go index bab0a2059f29..549c1c3f15d8 100644 --- a/processor/deltatorateprocessor/factory.go +++ b/processor/deltatorateprocessor/factory.go @@ -31,7 +31,7 @@ func createDefaultConfig() component.Config { func createMetricsProcessor( ctx context.Context, - set processor.CreateSettings, + set processor.Settings, cfg component.Config, nextConsumer consumer.Metrics, ) (processor.Metrics, error) { @@ -42,7 +42,7 @@ func createMetricsProcessor( metricsProcessor := newDeltaToRateProcessor(processorConfig, set.Logger) - return processorhelper.NewMetricsProcessor( + return processorhelper.NewMetrics( ctx, set, cfg, diff --git a/processor/deltatorateprocessor/factory_test.go b/processor/deltatorateprocessor/factory_test.go index 5b1f0c24cc9a..c2107d0ec652 100644 --- a/processor/deltatorateprocessor/factory_test.go +++ b/processor/deltatorateprocessor/factory_test.go @@ -10,7 +10,6 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/confmap/confmaptest" "go.opentelemetry.io/collector/consumer/consumertest" @@ -28,7 +27,7 @@ func TestType(t *testing.T) { func TestCreateDefaultConfig(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() - assert.Equal(t, cfg, &Config{}) + assert.Equal(t, &Config{}, cfg) assert.NoError(t, componenttest.CheckConfigStruct(cfg)) } @@ -46,20 +45,20 @@ func TestCreateProcessors(t *testing.T) { sub, err := cm.Sub(k) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) - tp, tErr := factory.CreateTracesProcessor( + tp, tErr := factory.CreateTraces( context.Background(), - processortest.NewNopCreateSettings(), + processortest.NewNopSettings(), cfg, consumertest.NewNop()) // Not implemented error assert.Error(t, tErr) assert.Nil(t, tp) - mp, mErr := factory.CreateMetricsProcessor( + mp, mErr := factory.CreateMetrics( context.Background(), - processortest.NewNopCreateSettings(), + processortest.NewNopSettings(), cfg, consumertest.NewNop()) assert.NotNil(t, mp) diff --git a/processor/deltatorateprocessor/generated_component_test.go b/processor/deltatorateprocessor/generated_component_test.go index 1f6523bdd97b..fdbb01deb243 100644 --- a/processor/deltatorateprocessor/generated_component_test.go +++ b/processor/deltatorateprocessor/generated_component_test.go @@ -33,13 +33,13 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) }{ { name: "metrics", - createFn: func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsProcessor(ctx, set, cfg, consumertest.NewNop()) + createFn: func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg, consumertest.NewNop()) }, }, } @@ -51,21 +51,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), processortest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), processortest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), processortest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), processortest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(processor.Logs) require.True(t, ok) diff --git a/processor/deltatorateprocessor/go.mod b/processor/deltatorateprocessor/go.mod index b68d4f8d3617..03dd65803e3e 100644 --- a/processor/deltatorateprocessor/go.mod +++ b/processor/deltatorateprocessor/go.mod @@ -1,56 +1,58 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor -go 1.21.0 +go 1.22.0 require ( - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/processor v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/processor v0.116.0 + go.opentelemetry.io/collector/processor/processortest v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/pdata/testdata v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + go.opentelemetry.io/collector/component/componentstatus v0.116.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/testdata v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/processor/xprocessor v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/processor/deltatorateprocessor/go.sum b/processor/deltatorateprocessor/go.sum index 394c41a60040..c7d73ec8a87f 100644 --- a/processor/deltatorateprocessor/go.sum +++ b/processor/deltatorateprocessor/go.sum @@ -1,19 +1,17 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -27,8 +25,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -44,50 +42,56 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/processor v0.102.0 h1:JsjTlpBRmoSYxcu3cAbKBchOmL6aNUxLa03ZkWIqZr8= -go.opentelemetry.io/collector/processor v0.102.0/go.mod h1:IaCSDcfy75uQTaOM+LgR1bMf/bUw2eFfzn20uvWYfLQ= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/processor v0.116.0 h1:Kyu4tPzTdWNHtZjcxvI/bGNAgyv8L8Kem2r/Mk4IDAw= +go.opentelemetry.io/collector/processor v0.116.0/go.mod h1:+/Ugy48RAxlZEXmN2cw51W8t5wdHS9No+GAoP+moskk= +go.opentelemetry.io/collector/processor/processortest v0.116.0 h1:+IqNEVEE0E2MsO2g7+Y/9dz35sDuvAXRXrLts9NdXrA= +go.opentelemetry.io/collector/processor/processortest v0.116.0/go.mod h1:DLaQDBxzgeeaUO0ULMn/efos9PmHZkmYCHuxwCsiVHI= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0 h1:iin/UwuWvSLB7ZNfINFUYbZ5lxIi1NjZ2brkyyFdiRA= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0/go.mod h1:cnA43/XpKDbaOmd8buqKp/LGJ2l/OoCqbR//u5DMfn8= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -103,20 +107,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -125,12 +129,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/processor/deltatorateprocessor/internal/metadata/generated_status.go b/processor/deltatorateprocessor/internal/metadata/generated_status.go index ea52e618621f..a3c862ffa791 100644 --- a/processor/deltatorateprocessor/internal/metadata/generated_status.go +++ b/processor/deltatorateprocessor/internal/metadata/generated_status.go @@ -7,9 +7,10 @@ import ( ) var ( - Type = component.MustNewType("deltatorate") + Type = component.MustNewType("deltatorate") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor" ) const ( - MetricsStability = component.StabilityLevelDevelopment + MetricsStability = component.StabilityLevelAlpha ) diff --git a/processor/deltatorateprocessor/internal/metadata/generated_telemetry.go b/processor/deltatorateprocessor/internal/metadata/generated_telemetry.go deleted file mode 100644 index 42521cdcfb50..000000000000 --- a/processor/deltatorateprocessor/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/deltatorate") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/deltatorate") -} diff --git a/processor/deltatorateprocessor/internal/metadata/generated_telemetry_test.go b/processor/deltatorateprocessor/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 1daf4f8e9681..000000000000 --- a/processor/deltatorateprocessor/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/deltatorate", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/deltatorate", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/processor/deltatorateprocessor/metadata.yaml b/processor/deltatorateprocessor/metadata.yaml index 87b0b6c9802d..9edc398290b9 100644 --- a/processor/deltatorateprocessor/metadata.yaml +++ b/processor/deltatorateprocessor/metadata.yaml @@ -1,11 +1,10 @@ type: deltatorate -scope_name: otelcol/deltatorate status: class: processor stability: - development: [metrics] - distributions: [contrib] + alpha: [metrics] + distributions: [contrib, k8s] codeowners: active: [Aneurysm9] tests: diff --git a/processor/deltatorateprocessor/processor.go b/processor/deltatorateprocessor/processor.go index 8da2382ef0ee..a9ba3aca4697 100644 --- a/processor/deltatorateprocessor/processor.go +++ b/processor/deltatorateprocessor/processor.go @@ -55,33 +55,26 @@ func (dtrp *deltaToRateProcessor) processMetrics(_ context.Context, md pmetric.M dtrp.logger.Info(fmt.Sprintf("Configured metric for rate calculation %s is not a delta sum\n", metric.Name())) continue } - newDoubleDataPointSlice := pmetric.NewNumberDataPointSlice() - dataPoints := metric.Sum().DataPoints() + dataPointSlice := metric.Sum().DataPoints() - for i := 0; i < dataPoints.Len(); i++ { - fromDataPoint := dataPoints.At(i) - newDp := newDoubleDataPointSlice.AppendEmpty() - fromDataPoint.CopyTo(newDp) + for i := 0; i < dataPointSlice.Len(); i++ { + dataPoint := dataPointSlice.At(i) - durationNanos := time.Duration(fromDataPoint.Timestamp() - fromDataPoint.StartTimestamp()) + durationNanos := time.Duration(dataPoint.Timestamp() - dataPoint.StartTimestamp()) var rate float64 - switch fromDataPoint.ValueType() { + switch dataPoint.ValueType() { case pmetric.NumberDataPointValueTypeDouble: - rate = calculateRate(fromDataPoint.DoubleValue(), durationNanos) + rate = calculateRate(dataPoint.DoubleValue(), durationNanos) case pmetric.NumberDataPointValueTypeInt: - rate = calculateRate(float64(fromDataPoint.IntValue()), durationNanos) + rate = calculateRate(float64(dataPoint.IntValue()), durationNanos) default: - return md, consumererror.NewPermanent(fmt.Errorf("invalid data point type:%d", fromDataPoint.ValueType())) + return md, consumererror.NewPermanent(fmt.Errorf("invalid data point type:%d", dataPoint.ValueType())) } - newDp.SetDoubleValue(rate) + dataPoint.SetDoubleValue(rate) } - dps := metric.SetEmptyGauge().DataPoints() - dps.EnsureCapacity(newDoubleDataPointSlice.Len()) - for d := 0; d < newDoubleDataPointSlice.Len(); d++ { - dp := dps.AppendEmpty() - newDoubleDataPointSlice.At(d).CopyTo(dp) - } + // Setting the data type removed all the data points, so we must move them back to the metric. + dataPointSlice.MoveAndAppendTo(metric.SetEmptyGauge().DataPoints()) } } } diff --git a/processor/deltatorateprocessor/processor_test.go b/processor/deltatorateprocessor/processor_test.go index 3e8ba37177b8..d05bdc78774d 100644 --- a/processor/deltatorateprocessor/processor_test.go +++ b/processor/deltatorateprocessor/processor_test.go @@ -31,84 +31,82 @@ type deltaToRateTest struct { outMetrics pmetric.Metrics } -var ( - testCases = []deltaToRateTest{ - { - name: "delta_to_rate_expect_same", - metrics: nil, - inMetrics: generateSumMetrics(testMetric{ - metricNames: []string{"metric_1", "metric_2"}, - metricValues: [][]float64{{100}, {4}}, - isDelta: []bool{true, true}, - deltaSecond: 120, - }), - outMetrics: generateSumMetrics(testMetric{ - metricNames: []string{"metric_1", "metric_2"}, - metricValues: [][]float64{{100}, {4}}, - isDelta: []bool{true, true}, - deltaSecond: 120, - }), - }, - { - name: "delta_to_rate_one_positive", - metrics: []string{"metric_1", "metric_2"}, - inMetrics: generateSumMetrics(testMetric{ - metricNames: []string{"metric_1", "metric_2"}, - metricValues: [][]float64{{120, 240, 360}, {360}}, - isDelta: []bool{true, true}, - deltaSecond: 120, - }), - outMetrics: generateGaugeMetrics(testMetric{ - metricNames: []string{"metric_1", "metric_2"}, - metricValues: [][]float64{{1, 2, 3}, {3}}, - }), - }, - { - name: "delta_to_rate_with_cumulative", - metrics: []string{"metric_1", "metric_2"}, - inMetrics: generateSumMetrics(testMetric{ - metricNames: []string{"metric_1", "metric_2"}, - metricValues: [][]float64{{100}, {4}}, - isDelta: []bool{false, false}, - deltaSecond: 120, - }), - outMetrics: generateSumMetrics(testMetric{ - metricNames: []string{"metric_1", "metric_2"}, - metricValues: [][]float64{{100}, {4}}, - isDelta: []bool{false, false}, - deltaSecond: 120, - }), - }, - { - name: "delta_to_rate_expect_zero", - metrics: []string{"metric_1", "metric_2"}, - inMetrics: generateSumMetrics(testMetric{ - metricNames: []string{"metric_1", "metric_2"}, - metricValues: [][]float64{{120, 240, 360}, {360}}, - isDelta: []bool{true, true}, - deltaSecond: 0, - }), - outMetrics: generateGaugeMetrics(testMetric{ - metricNames: []string{"metric_1", "metric_2"}, - metricValues: [][]float64{{0, 0, 0}, {0}}, - }), - }, - { - name: "int64-delta_to_rate_one_positive", - metrics: []string{"metric_1", "metric_2"}, - inMetrics: generateSumMetrics(testMetric{ - metricNames: []string{"metric_1", "metric_2"}, - metricIntValues: [][]int64{{120, 240, 360}, {360}}, - isDelta: []bool{true, true}, - deltaSecond: 120, - }), - outMetrics: generateGaugeMetrics(testMetric{ - metricNames: []string{"metric_1", "metric_2"}, - metricValues: [][]float64{{1, 2, 3}, {3}}, - }), - }, - } -) +var testCases = []deltaToRateTest{ + { + name: "delta_to_rate_expect_same", + metrics: nil, + inMetrics: generateSumMetrics(testMetric{ + metricNames: []string{"metric_1", "metric_2"}, + metricValues: [][]float64{{100}, {4}}, + isDelta: []bool{true, true}, + deltaSecond: 120, + }), + outMetrics: generateSumMetrics(testMetric{ + metricNames: []string{"metric_1", "metric_2"}, + metricValues: [][]float64{{100}, {4}}, + isDelta: []bool{true, true}, + deltaSecond: 120, + }), + }, + { + name: "delta_to_rate_one_positive", + metrics: []string{"metric_1", "metric_2"}, + inMetrics: generateSumMetrics(testMetric{ + metricNames: []string{"metric_1", "metric_2"}, + metricValues: [][]float64{{120, 240, 360}, {360}}, + isDelta: []bool{true, true}, + deltaSecond: 120, + }), + outMetrics: generateGaugeMetrics(testMetric{ + metricNames: []string{"metric_1", "metric_2"}, + metricValues: [][]float64{{1, 2, 3}, {3}}, + }), + }, + { + name: "delta_to_rate_with_cumulative", + metrics: []string{"metric_1", "metric_2"}, + inMetrics: generateSumMetrics(testMetric{ + metricNames: []string{"metric_1", "metric_2"}, + metricValues: [][]float64{{100}, {4}}, + isDelta: []bool{false, false}, + deltaSecond: 120, + }), + outMetrics: generateSumMetrics(testMetric{ + metricNames: []string{"metric_1", "metric_2"}, + metricValues: [][]float64{{100}, {4}}, + isDelta: []bool{false, false}, + deltaSecond: 120, + }), + }, + { + name: "delta_to_rate_expect_zero", + metrics: []string{"metric_1", "metric_2"}, + inMetrics: generateSumMetrics(testMetric{ + metricNames: []string{"metric_1", "metric_2"}, + metricValues: [][]float64{{120, 240, 360}, {360}}, + isDelta: []bool{true, true}, + deltaSecond: 0, + }), + outMetrics: generateGaugeMetrics(testMetric{ + metricNames: []string{"metric_1", "metric_2"}, + metricValues: [][]float64{{0, 0, 0}, {0}}, + }), + }, + { + name: "int64-delta_to_rate_one_positive", + metrics: []string{"metric_1", "metric_2"}, + inMetrics: generateSumMetrics(testMetric{ + metricNames: []string{"metric_1", "metric_2"}, + metricIntValues: [][]int64{{120, 240, 360}, {360}}, + isDelta: []bool{true, true}, + deltaSecond: 120, + }), + outMetrics: generateGaugeMetrics(testMetric{ + metricNames: []string{"metric_1", "metric_2"}, + metricValues: [][]float64{{1, 2, 3}, {3}}, + }), + }, +} func TestCumulativeToDeltaProcessor(t *testing.T) { for _, test := range testCases { @@ -119,9 +117,9 @@ func TestCumulativeToDeltaProcessor(t *testing.T) { Metrics: test.metrics, } factory := NewFactory() - mgp, err := factory.CreateMetricsProcessor( + mgp, err := factory.CreateMetrics( context.Background(), - processortest.NewNopCreateSettings(), + processortest.NewNopSettings(), cfg, next, ) @@ -134,10 +132,10 @@ func TestCumulativeToDeltaProcessor(t *testing.T) { require.NoError(t, mgp.Start(ctx, nil)) cErr := mgp.ConsumeMetrics(context.Background(), test.inMetrics) - assert.Nil(t, cErr) + assert.NoError(t, cErr) got := next.AllMetrics() - require.Equal(t, 1, len(got)) + require.Len(t, got, 1) require.Equal(t, test.outMetrics.ResourceMetrics().Len(), got[0].ResourceMetrics().Len()) expectedMetrics := test.outMetrics.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics() @@ -172,7 +170,6 @@ func TestCumulativeToDeltaProcessor(t *testing.T) { require.Equal(t, eDataPoints.At(j).DoubleValue(), aDataPoints.At(j).DoubleValue()) } } - } require.NoError(t, mgp.Shutdown(ctx)) diff --git a/processor/filterprocessor/README.md b/processor/filterprocessor/README.md index 092747e61083..ba1c9b575e17 100644 --- a/processor/filterprocessor/README.md +++ b/processor/filterprocessor/README.md @@ -3,14 +3,15 @@ | Status | | | ------------- |-----------| | Stability | [alpha]: traces, metrics, logs | -| Distributions | [core], [contrib] | +| Distributions | [core], [contrib], [k8s] | | Warnings | [Orphaned Telemetry, Other](#warnings) | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aprocessor%2Ffilter%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aprocessor%2Ffilter) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aprocessor%2Ffilter%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aprocessor%2Ffilter) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@TylerHelmuth](https://www.github.com/TylerHelmuth), [@boostchicken](https://www.github.com/boostchicken) | -[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha [core]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s The filterprocessor allows dropping spans, span events, metrics, datapoints, and logs from the collector. @@ -32,7 +33,7 @@ See the table below for details on each context and the fields it exposes. | `logs.log_record` | [Log](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/pkg/ottl/contexts/ottllog/README.md) | The OTTL allows the use of `and`, `or`, and `()` in conditions. -See [OTTL Boolean Expressions](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/pkg/ottl/README.md#boolean-expressions) for more details. +See [OTTL Boolean Expressions](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/pkg/ottl/LANGUAGE.md#boolean-expressions) for more details. For conditions that apply to the same signal, such as spans and span events, if the "higher" level telemetry matches a condition and is dropped, the "lower" level condition will not be checked. This means that if a span is dropped but a span event condition was defined, the span event condition will not be checked for that span. @@ -178,6 +179,48 @@ filter/keep_good_metrics: - 'HasAttrOnDatapoint("bad.metric", "true")' ``` +## Troubleshooting + +When using OTTL you can enable debug logging in the collector to print out useful information, +such as if the condition matched and the TransformContext used in the condition, to help you troubleshoot +why a condition is not behaving as you expect. This feature is very verbose, but provides you an accurate +view into how OTTL views the underlying data. + +```yaml +receivers: + filelog: + start_at: beginning + include: [ /Users/tylerhelmuth/projects/opentelemetry-collector-contrib/local/test.log ] + + +processors: + filter: + error_mode: ignore + logs: + log_record: + - body == "test" + +exporters: + debug: + +service: + telemetry: + logs: + level: debug + pipelines: + logs: + receivers: + - filelog + processors: + - filter + exporters: + - debug +``` + +``` +2024-05-29T16:47:04.362-0600 debug ottl@v0.101.0/parser.go:338 condition evaluation result {"kind": "processor", "name": "filter", "pipeline": "logs", "condition": "body == \"test\"", "match": true, "TransformContext": {"resource": {"attributes": {}, "dropped_attribute_count": 0}, "scope": {"attributes": {}, "dropped_attribute_count": 0, "name": "", "version": ""}, "log_record": {"attributes": {"log.file.name": "test.log"}, "body": "test", "dropped_attribute_count": 0, "flags": 0, "observed_time_unix_nano": 1717022824262063000, "severity_number": 0, "severity_text": "", "span_id": "", "time_unix_nano": 0, "trace_id": ""}, "cache": {}}} +``` + ## Warnings In general, understand your data before using the filter processor. diff --git a/processor/filterprocessor/config_test.go b/processor/filterprocessor/config_test.go index 9ebf9ee47cba..d009cdd739a0 100644 --- a/processor/filterprocessor/config_test.go +++ b/processor/filterprocessor/config_test.go @@ -87,7 +87,7 @@ func TestLoadingConfigStrict(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) @@ -97,7 +97,6 @@ func TestLoadingConfigStrict(t *testing.T) { // TestLoadingConfigStrictLogs tests loading testdata/config_logs_strict.yaml func TestLoadingConfigStrictLogs(t *testing.T) { - testDataLogPropertiesInclude := &LogMatchProperties{ LogMatchType: strictType, ResourceAttributes: []filterconfig.Attribute{ @@ -170,7 +169,7 @@ func TestLoadingConfigStrictLogs(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) @@ -180,7 +179,6 @@ func TestLoadingConfigStrictLogs(t *testing.T) { // TestLoadingConfigSeverityLogsStrict tests loading testdata/config_logs_severity_strict.yaml func TestLoadingConfigSeverityLogsStrict(t *testing.T) { - testDataLogPropertiesInclude := &LogMatchProperties{ LogMatchType: strictType, SeverityTexts: []string{"INFO"}, @@ -233,7 +231,7 @@ func TestLoadingConfigSeverityLogsStrict(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) @@ -295,7 +293,7 @@ func TestLoadingConfigSeverityLogsRegexp(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) @@ -305,7 +303,6 @@ func TestLoadingConfigSeverityLogsRegexp(t *testing.T) { // TestLoadingConfigBodyLogsStrict tests loading testdata/config_logs_body_strict.yaml func TestLoadingConfigBodyLogsStrict(t *testing.T) { - testDataLogPropertiesInclude := &LogMatchProperties{ LogMatchType: strictType, LogBodies: []string{"This is an important event"}, @@ -358,7 +355,7 @@ func TestLoadingConfigBodyLogsStrict(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) @@ -368,7 +365,6 @@ func TestLoadingConfigBodyLogsStrict(t *testing.T) { // TestLoadingConfigBodyLogsStrict tests loading testdata/config_logs_body_regexp.yaml func TestLoadingConfigBodyLogsRegexp(t *testing.T) { - testDataLogPropertiesInclude := &LogMatchProperties{ LogMatchType: regexpType, LogBodies: []string{"^IMPORTANT:"}, @@ -421,7 +417,7 @@ func TestLoadingConfigBodyLogsRegexp(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) @@ -486,7 +482,7 @@ func TestLoadingConfigMinSeverityNumberLogs(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) @@ -575,7 +571,7 @@ func TestLoadingConfigRegexp(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) @@ -625,7 +621,7 @@ func TestLoadingSpans(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) @@ -710,7 +706,7 @@ func TestLoadingConfigExpr(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) @@ -832,7 +828,6 @@ func TestLogSeverity_severityValidate(t *testing.T) { } func TestLoadingConfigOTTL(t *testing.T) { - cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config_ottl.yaml")) require.NoError(t, err) @@ -916,7 +911,7 @@ func TestLoadingConfigOTTL(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) if tt.expected == nil { if tt.errorMessage != "" { diff --git a/processor/filterprocessor/documentation.md b/processor/filterprocessor/documentation.md index b9bb78c5b78d..d82c6d106bc3 100644 --- a/processor/filterprocessor/documentation.md +++ b/processor/filterprocessor/documentation.md @@ -6,7 +6,7 @@ The following telemetry is emitted by this component. -### processor_filter_datapoints.filtered +### otelcol_processor_filter_datapoints.filtered Number of metric data points dropped by the filter processor @@ -14,7 +14,7 @@ Number of metric data points dropped by the filter processor | ---- | ----------- | ---------- | --------- | | 1 | Sum | Int | true | -### processor_filter_logs.filtered +### otelcol_processor_filter_logs.filtered Number of logs dropped by the filter processor @@ -22,7 +22,7 @@ Number of logs dropped by the filter processor | ---- | ----------- | ---------- | --------- | | 1 | Sum | Int | true | -### processor_filter_spans.filtered +### otelcol_processor_filter_spans.filtered Number of spans dropped by the filter processor diff --git a/processor/filterprocessor/expr_test.go b/processor/filterprocessor/expr_test.go index bd804cbf955c..259328827c85 100644 --- a/processor/filterprocessor/expr_test.go +++ b/processor/filterprocessor/expr_test.go @@ -21,8 +21,10 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter/filterconfig" ) -const filteredMetric = "p0_metric_1" -const filteredAttrKey = "pt-label-key-1" +const ( + filteredMetric = "p0_metric_1" + filteredAttrKey = "pt-label-key-1" +) var filteredAttrVal = pcommon.NewValueStr("pt-label-val-1") @@ -41,7 +43,7 @@ func testMatchError(t *testing.T, mdType pmetric.MetricType, mvType pmetric.Numb err := proc.ConsumeMetrics(context.Background(), testData("", 1, mdType, mvType)) assert.Error(t, err) // assert that metrics not be filtered as a result - assert.Len(t, next.AllMetrics(), 0) + assert.Empty(t, next.AllMetrics()) }) } @@ -126,9 +128,9 @@ func testProcessor(t *testing.T, include []string, exclude []string) (processor. cfg := exprConfig(factory, include, exclude) ctx := context.Background() next := &consumertest.MetricsSink{} - proc, err := factory.CreateMetricsProcessor( + proc, err := factory.CreateMetrics( ctx, - processortest.NewNopCreateSettings(), + processortest.NewNopSettings(), cfg, next, ) diff --git a/processor/filterprocessor/factory.go b/processor/filterprocessor/factory.go index 894a190b2c53..22c3a443f4bb 100644 --- a/processor/filterprocessor/factory.go +++ b/processor/filterprocessor/factory.go @@ -36,7 +36,7 @@ func createDefaultConfig() component.Config { func createMetricsProcessor( ctx context.Context, - set processor.CreateSettings, + set processor.Settings, cfg component.Config, nextConsumer consumer.Metrics, ) (processor.Metrics, error) { @@ -44,7 +44,7 @@ func createMetricsProcessor( if err != nil { return nil, err } - return processorhelper.NewMetricsProcessor( + return processorhelper.NewMetrics( ctx, set, cfg, @@ -55,7 +55,7 @@ func createMetricsProcessor( func createLogsProcessor( ctx context.Context, - set processor.CreateSettings, + set processor.Settings, cfg component.Config, nextConsumer consumer.Logs, ) (processor.Logs, error) { @@ -63,7 +63,7 @@ func createLogsProcessor( if err != nil { return nil, err } - return processorhelper.NewLogsProcessor( + return processorhelper.NewLogs( ctx, set, cfg, @@ -74,7 +74,7 @@ func createLogsProcessor( func createTracesProcessor( ctx context.Context, - set processor.CreateSettings, + set processor.Settings, cfg component.Config, nextConsumer consumer.Traces, ) (processor.Traces, error) { @@ -82,7 +82,7 @@ func createTracesProcessor( if err != nil { return nil, err } - return processorhelper.NewTracesProcessor( + return processorhelper.NewTraces( ctx, set, cfg, diff --git a/processor/filterprocessor/factory_test.go b/processor/filterprocessor/factory_test.go index 6a241a1e289a..9a00074b083f 100644 --- a/processor/filterprocessor/factory_test.go +++ b/processor/filterprocessor/factory_test.go @@ -11,7 +11,6 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/confmap/confmaptest" "go.opentelemetry.io/collector/consumer/consumertest" @@ -31,9 +30,9 @@ func TestType(t *testing.T) { func TestCreateDefaultConfig(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() - assert.Equal(t, cfg, &Config{ + assert.Equal(t, &Config{ ErrorMode: ottl.PropagateError, - }) + }, cfg) assert.NoError(t, componenttest.CheckConfigStruct(cfg)) } @@ -86,16 +85,16 @@ func TestCreateProcessors(t *testing.T) { sub, err := cm.Sub(k) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) - tp, tErr := factory.CreateTracesProcessor( + tp, tErr := factory.CreateTraces( context.Background(), - processortest.NewNopCreateSettings(), + processortest.NewNopSettings(), cfg, consumertest.NewNop(), ) - mp, mErr := factory.CreateMetricsProcessor( + mp, mErr := factory.CreateMetrics( context.Background(), - processortest.NewNopCreateSettings(), + processortest.NewNopSettings(), cfg, consumertest.NewNop(), ) @@ -104,11 +103,11 @@ func TestCreateProcessors(t *testing.T) { assert.Equal(t, tt.succeed, tErr == nil) assert.NotNil(t, mp) - assert.Nil(t, mErr) + assert.NoError(t, mErr) } else { // Should not break configs with no trace data assert.NotNil(t, tp) - assert.Nil(t, tErr) + assert.NoError(t, tErr) assert.Equal(t, tt.succeed, mp != nil) assert.Equal(t, tt.succeed, mErr == nil) diff --git a/processor/filterprocessor/generated_component_telemetry_test.go b/processor/filterprocessor/generated_component_telemetry_test.go index 2ecce9c53305..ea374ea08e93 100644 --- a/processor/filterprocessor/generated_component_telemetry_test.go +++ b/processor/filterprocessor/generated_component_telemetry_test.go @@ -12,6 +12,8 @@ import ( "go.opentelemetry.io/otel/sdk/metric/metricdata/metricdatatest" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/config/configtelemetry" "go.opentelemetry.io/collector/processor" "go.opentelemetry.io/collector/processor/processortest" ) @@ -21,12 +23,18 @@ type componentTestTelemetry struct { meterProvider *sdkmetric.MeterProvider } -func (tt *componentTestTelemetry) NewCreateSettings() processor.CreateSettings { - settings := processortest.NewNopCreateSettings() - settings.MeterProvider = tt.meterProvider - settings.ID = component.NewID(component.MustNewType("filter")) +func (tt *componentTestTelemetry) NewSettings() processor.Settings { + set := processortest.NewNopSettings() + set.ID = component.NewID(component.MustNewType("filter")) + set.TelemetrySettings = tt.newTelemetrySettings() + return set +} - return settings +func (tt *componentTestTelemetry) newTelemetrySettings() component.TelemetrySettings { + set := componenttest.NewNopTelemetrySettings() + set.MeterProvider = tt.meterProvider + set.MetricsLevel = configtelemetry.LevelDetailed + return set } func setupTestTelemetry() componentTestTelemetry { diff --git a/processor/filterprocessor/generated_component_test.go b/processor/filterprocessor/generated_component_test.go index bee2f713d090..4a79aa6cfc44 100644 --- a/processor/filterprocessor/generated_component_test.go +++ b/processor/filterprocessor/generated_component_test.go @@ -33,27 +33,27 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsProcessor(ctx, set, cfg, consumertest.NewNop()) + createFn: func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg, consumertest.NewNop()) }, }, { name: "metrics", - createFn: func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsProcessor(ctx, set, cfg, consumertest.NewNop()) + createFn: func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg, consumertest.NewNop()) }, }, { name: "traces", - createFn: func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesProcessor(ctx, set, cfg, consumertest.NewNop()) + createFn: func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg, consumertest.NewNop()) }, }, } @@ -65,21 +65,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), processortest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), processortest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), processortest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), processortest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(processor.Logs) require.True(t, ok) diff --git a/processor/filterprocessor/go.mod b/processor/filterprocessor/go.mod index 8eeaa3c2a308..9aec42779ae2 100644 --- a/processor/filterprocessor/go.mod +++ b/processor/filterprocessor/go.mod @@ -1,22 +1,26 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/processor v0.102.0 - go.opentelemetry.io/otel v1.27.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/sdk/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/pipeline v0.116.0 + go.opentelemetry.io/collector/processor v0.116.0 + go.opentelemetry.io/collector/processor/processortest v0.116.0 + go.opentelemetry.io/otel v1.32.0 + go.opentelemetry.io/otel/metric v1.32.0 + go.opentelemetry.io/otel/sdk/metric v1.32.0 + go.opentelemetry.io/otel/trace v1.32.0 go.uber.org/goleak v1.3.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 @@ -24,46 +28,54 @@ require ( require ( github.com/alecthomas/participle/v2 v2.1.1 // indirect - github.com/beorn7/perks v1.0.1 // indirect + github.com/antchfx/xmlquery v1.4.2 // indirect + github.com/antchfx/xpath v1.3.2 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/elastic/go-grok v0.3.1 // indirect + github.com/elastic/lunes v0.1.0 // indirect github.com/expr-lang/expr v1.16.9 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gobwas/glob v0.2.3 // indirect + github.com/goccy/go-json v0.10.4 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect + github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/iancoleman/strcase v0.3.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect + github.com/magefile/mage v1.15.0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/pdata/testdata v0.102.0 // indirect - go.opentelemetry.io/collector/semconv v0.102.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 // indirect + go.opentelemetry.io/collector/component/componentstatus v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/testdata v0.116.0 // indirect + go.opentelemetry.io/collector/processor/xprocessor v0.116.0 // indirect + go.opentelemetry.io/collector/semconv v0.116.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/processor/filterprocessor/go.sum b/processor/filterprocessor/go.sum index 35e43e3367f4..3e6fefe454da 100644 --- a/processor/filterprocessor/go.sum +++ b/processor/filterprocessor/go.sum @@ -4,26 +4,38 @@ github.com/alecthomas/participle/v2 v2.1.1 h1:hrjKESvSqGHzRb4yW1ciisFJ4p3MGYih6i github.com/alecthomas/participle/v2 v2.1.1/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= -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/antchfx/xmlquery v1.4.2 h1:MZKd9+wblwxfQ1zd1AdrTsqVaMjMCwow3IqkCSe00KA= +github.com/antchfx/xmlquery v1.4.2/go.mod h1:QXhvf5ldTuGqhd1SHNvvtlhhdQLks4dD0awIVhXIDTA= +github.com/antchfx/xpath v1.3.2 h1:LNjzlsSjinu3bQpw9hWMY9ocB80oLOWuQqFvO6xt51U= +github.com/antchfx/xpath v1.3.2/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/elastic/go-grok v0.3.1 h1:WEhUxe2KrwycMnlvMimJXvzRa7DoByJB4PVUIE1ZD/U= +github.com/elastic/go-grok v0.3.1/go.mod h1:n38ls8ZgOboZRgKcjMY8eFeZFMmcL9n2lP0iHhIDk64= +github.com/elastic/lunes v0.1.0 h1:amRtLPjwkWtzDF/RKzcEPMvSsSseLDLW+bnhfNSLRe4= +github.com/elastic/lunes v0.1.0/go.mod h1:xGphYIt3XdZRtyWosHQTErsQTd4OP1p9wsbVoHelrd4= github.com/expr-lang/expr v1.16.9 h1:WUAzmR0JNI9JCiF0/ewwHB1gmcGw5wW7nWt8gc6PpCI= github.com/expr-lang/expr v1.16.9/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= +github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -31,6 +43,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= @@ -45,12 +59,14 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= +github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= @@ -62,54 +78,61 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 h1:SIKIoA4e/5Y9ZOl0DCe3eVMLPOQzJxgZpfdHHeauNTM= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6/go.mod h1:BUbeWZiieNxAuuADTBNb3/aeje6on3DhU3rpWsQSB1E= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/processor v0.102.0 h1:JsjTlpBRmoSYxcu3cAbKBchOmL6aNUxLa03ZkWIqZr8= -go.opentelemetry.io/collector/processor v0.102.0/go.mod h1:IaCSDcfy75uQTaOM+LgR1bMf/bUw2eFfzn20uvWYfLQ= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/processor v0.116.0 h1:Kyu4tPzTdWNHtZjcxvI/bGNAgyv8L8Kem2r/Mk4IDAw= +go.opentelemetry.io/collector/processor v0.116.0/go.mod h1:+/Ugy48RAxlZEXmN2cw51W8t5wdHS9No+GAoP+moskk= +go.opentelemetry.io/collector/processor/processortest v0.116.0 h1:+IqNEVEE0E2MsO2g7+Y/9dz35sDuvAXRXrLts9NdXrA= +go.opentelemetry.io/collector/processor/processortest v0.116.0/go.mod h1:DLaQDBxzgeeaUO0ULMn/efos9PmHZkmYCHuxwCsiVHI= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0 h1:iin/UwuWvSLB7ZNfINFUYbZ5lxIi1NjZ2brkyyFdiRA= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0/go.mod h1:cnA43/XpKDbaOmd8buqKp/LGJ2l/OoCqbR//u5DMfn8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -119,44 +142,64 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/processor/filterprocessor/internal/metadata/generated_status.go b/processor/filterprocessor/internal/metadata/generated_status.go index d1d914c86b7e..87b7737b7970 100644 --- a/processor/filterprocessor/internal/metadata/generated_status.go +++ b/processor/filterprocessor/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("filter") + Type = component.MustNewType("filter") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor" ) const ( diff --git a/processor/filterprocessor/internal/metadata/generated_telemetry.go b/processor/filterprocessor/internal/metadata/generated_telemetry.go index d8af8699d2e8..ea918acc4187 100644 --- a/processor/filterprocessor/internal/metadata/generated_telemetry.go +++ b/processor/filterprocessor/internal/metadata/generated_telemetry.go @@ -14,65 +14,66 @@ import ( ) func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/filter") + return settings.MeterProvider.Meter("github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor") } func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/filter") + return settings.TracerProvider.Tracer("github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor") } // TelemetryBuilder provides an interface for components to report telemetry // as defined in metadata and user config. type TelemetryBuilder struct { + meter metric.Meter ProcessorFilterDatapointsFiltered metric.Int64Counter ProcessorFilterLogsFiltered metric.Int64Counter ProcessorFilterSpansFiltered metric.Int64Counter - level configtelemetry.Level } -// telemetryBuilderOption applies changes to default builder. -type telemetryBuilderOption func(*TelemetryBuilder) +// TelemetryBuilderOption applies changes to default builder. +type TelemetryBuilderOption interface { + apply(*TelemetryBuilder) +} -// WithLevel sets the current telemetry level for the component. -func WithLevel(lvl configtelemetry.Level) telemetryBuilderOption { - return func(builder *TelemetryBuilder) { - builder.level = lvl - } +type telemetryBuilderOptionFunc func(mb *TelemetryBuilder) + +func (tbof telemetryBuilderOptionFunc) apply(mb *TelemetryBuilder) { + tbof(mb) } // NewTelemetryBuilder provides a struct with methods to update all internal telemetry // for a component -func NewTelemetryBuilder(settings component.TelemetrySettings, options ...telemetryBuilderOption) (*TelemetryBuilder, error) { - builder := TelemetryBuilder{level: configtelemetry.LevelBasic} +func NewTelemetryBuilder(settings component.TelemetrySettings, options ...TelemetryBuilderOption) (*TelemetryBuilder, error) { + builder := TelemetryBuilder{} for _, op := range options { - op(&builder) - } - var ( - err, errs error - meter metric.Meter - ) - if builder.level >= configtelemetry.LevelBasic { - meter = Meter(settings) - } else { - meter = noop.Meter{} + op.apply(&builder) } - builder.ProcessorFilterDatapointsFiltered, err = meter.Int64Counter( - "processor_filter_datapoints.filtered", + builder.meter = Meter(settings) + var err, errs error + builder.ProcessorFilterDatapointsFiltered, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_processor_filter_datapoints.filtered", metric.WithDescription("Number of metric data points dropped by the filter processor"), metric.WithUnit("1"), ) errs = errors.Join(errs, err) - builder.ProcessorFilterLogsFiltered, err = meter.Int64Counter( - "processor_filter_logs.filtered", + builder.ProcessorFilterLogsFiltered, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_processor_filter_logs.filtered", metric.WithDescription("Number of logs dropped by the filter processor"), metric.WithUnit("1"), ) errs = errors.Join(errs, err) - builder.ProcessorFilterSpansFiltered, err = meter.Int64Counter( - "processor_filter_spans.filtered", + builder.ProcessorFilterSpansFiltered, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_processor_filter_spans.filtered", metric.WithDescription("Number of spans dropped by the filter processor"), metric.WithUnit("1"), ) errs = errors.Join(errs, err) return &builder, errs } + +func getLeveledMeter(meter metric.Meter, cfgLevel, srvLevel configtelemetry.Level) metric.Meter { + if cfgLevel <= srvLevel { + return meter + } + return noop.Meter{} +} diff --git a/processor/filterprocessor/internal/metadata/generated_telemetry_test.go b/processor/filterprocessor/internal/metadata/generated_telemetry_test.go index 65e6db21aa00..e963b837d3c2 100644 --- a/processor/filterprocessor/internal/metadata/generated_telemetry_test.go +++ b/processor/filterprocessor/internal/metadata/generated_telemetry_test.go @@ -14,6 +14,7 @@ import ( nooptrace "go.opentelemetry.io/otel/trace/noop" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" ) type mockMeter struct { @@ -49,28 +50,25 @@ func TestProviders(t *testing.T) { meter := Meter(set) if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/filter", m.name) + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor", m.name) } else { require.Fail(t, "returned Meter not mockMeter") } tracer := Tracer(set) if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/filter", m.name) + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor", m.name) } else { require.Fail(t, "returned Meter not mockTracer") } } func TestNewTelemetryBuilder(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } + set := componenttest.NewNopTelemetrySettings() applied := false - _, err := NewTelemetryBuilder(set, func(b *TelemetryBuilder) { + _, err := NewTelemetryBuilder(set, telemetryBuilderOptionFunc(func(b *TelemetryBuilder) { applied = true - }) + })) require.NoError(t, err) require.True(t, applied) } diff --git a/processor/filterprocessor/logs.go b/processor/filterprocessor/logs.go index 421eea9c8b6e..7cd8be05ec1c 100644 --- a/processor/filterprocessor/logs.go +++ b/processor/filterprocessor/logs.go @@ -8,6 +8,7 @@ import ( "fmt" "go.opentelemetry.io/collector/pdata/plog" + "go.opentelemetry.io/collector/pipeline" "go.opentelemetry.io/collector/processor" "go.opentelemetry.io/collector/processor/processorhelper" "go.uber.org/multierr" @@ -22,16 +23,16 @@ import ( type filterLogProcessor struct { skipExpr expr.BoolExpr[ottllog.TransformContext] - telemetry *filterProcessorTelemetry + telemetry *filterTelemetry logger *zap.Logger } -func newFilterLogsProcessor(set processor.CreateSettings, cfg *Config) (*filterLogProcessor, error) { +func newFilterLogsProcessor(set processor.Settings, cfg *Config) (*filterLogProcessor, error) { flp := &filterLogProcessor{ logger: set.Logger, } - fpt, err := newfilterProcessorTelemetry(set) + fpt, err := newFilterTelemetry(set, pipeline.SignalLogs) if err != nil { return nil, fmt.Errorf("error creating filter processor telemetry: %w", err) } @@ -78,7 +79,7 @@ func (flp *filterLogProcessor) processLogs(ctx context.Context, ld plog.Logs) (p scope := sl.Scope() lrs := sl.LogRecords() lrs.RemoveIf(func(lr plog.LogRecord) bool { - skip, err := flp.skipExpr.Eval(ctx, ottllog.NewTransformContext(lr, scope, resource)) + skip, err := flp.skipExpr.Eval(ctx, ottllog.NewTransformContext(lr, scope, resource, sl, rl)) if err != nil { errors = multierr.Append(errors, err) return false @@ -92,7 +93,7 @@ func (flp *filterLogProcessor) processLogs(ctx context.Context, ld plog.Logs) (p }) logCountAfterFilters := ld.LogRecordCount() - flp.telemetry.record(triggerLogsDropped, int64(logCountBeforeFilters-logCountAfterFilters)) + flp.telemetry.record(ctx, int64(logCountBeforeFilters-logCountAfterFilters)) if errors != nil { flp.logger.Error("failed processing logs", zap.Error(errors)) diff --git a/processor/filterprocessor/logs_test.go b/processor/filterprocessor/logs_test.go index 104bf1ad91c5..208abf6e4820 100644 --- a/processor/filterprocessor/logs_test.go +++ b/processor/filterprocessor/logs_test.go @@ -15,6 +15,8 @@ import ( "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/processor/processorhelper" "go.opentelemetry.io/collector/processor/processortest" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/sdk/metric/metricdata" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter/filterconfig" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" @@ -578,9 +580,9 @@ func TestFilterLogProcessor(t *testing.T) { }, } factory := NewFactory() - flp, err := factory.CreateLogsProcessor( + flp, err := factory.CreateLogs( context.Background(), - processortest.NewNopCreateSettings(), + processortest.NewNopSettings(), cfg, next, ) @@ -593,7 +595,7 @@ func TestFilterLogProcessor(t *testing.T) { assert.NoError(t, flp.Start(ctx, nil)) cErr := flp.ConsumeLogs(context.Background(), test.inLogs) - assert.Nil(t, cErr) + assert.NoError(t, cErr) got := next.AllLogs() require.Len(t, got, 1) @@ -674,9 +676,9 @@ func requireNotPanicsLogs(t *testing.T, logs plog.Logs) { Exclude: nil, } ctx := context.Background() - proc, _ := factory.CreateLogsProcessor( + proc, _ := factory.CreateLogs( ctx, - processortest.NewNopCreateSettings(), + processortest.NewNopSettings(), cfg, consumertest.NewNop(), ) @@ -747,7 +749,7 @@ func TestFilterLogProcessorWithOTTL(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - processor, err := newFilterLogsProcessor(processortest.NewNopCreateSettings(), &Config{Logs: LogFilters{LogConditions: tt.conditions}}) + processor, err := newFilterLogsProcessor(processortest.NewNopSettings(), &Config{Logs: LogFilters{LogConditions: tt.conditions}}) assert.NoError(t, err) got, err := processor.processLogs(context.Background(), constructLogs()) @@ -764,19 +766,35 @@ func TestFilterLogProcessorWithOTTL(t *testing.T) { } func TestFilterLogProcessorTelemetry(t *testing.T) { - telemetryTest(t, "FilterLogProcessorTelemetry", func(t *testing.T, tel testTelemetry) { - processor, err := newFilterLogsProcessor(tel.NewProcessorCreateSettings(), &Config{ - Logs: LogFilters{LogConditions: []string{`IsMatch(body, "operationA")`}}, - }) - assert.NoError(t, err) + tel := setupTestTelemetry() + processor, err := newFilterLogsProcessor(tel.NewSettings(), &Config{ + Logs: LogFilters{LogConditions: []string{`IsMatch(body, "operationA")`}}, + }) + assert.NoError(t, err) - _, err = processor.processLogs(context.Background(), constructLogs()) - assert.NoError(t, err) + _, err = processor.processLogs(context.Background(), constructLogs()) + assert.NoError(t, err) - tel.assertMetrics(t, expectedMetrics{ - logsFiltered: 2, - }) - }) + want := []metricdata.Metrics{ + { + Name: "otelcol_processor_filter_logs.filtered", + Description: "Number of logs dropped by the filter processor", + Unit: "1", + Data: metricdata.Sum[int64]{ + Temporality: metricdata.CumulativeTemporality, + IsMonotonic: true, + DataPoints: []metricdata.DataPoint[int64]{ + { + Value: 2, + Attributes: attribute.NewSet(attribute.String("filter", "filter")), + }, + }, + }, + }, + } + + tel.assertMetrics(t, want) + require.NoError(t, tel.Shutdown(context.Background())) } func constructLogs() plog.Logs { @@ -807,7 +825,6 @@ func fillLogOne(log plog.LogRecord) { log.Attributes().PutStr("http.path", "/health") log.Attributes().PutStr("http.url", "http://localhost/health") log.Attributes().PutStr("flags", "A|B|C") - } func fillLogTwo(log plog.LogRecord) { @@ -818,5 +835,4 @@ func fillLogTwo(log plog.LogRecord) { log.Attributes().PutStr("http.path", "/health") log.Attributes().PutStr("http.url", "http://localhost/health") log.Attributes().PutStr("flags", "C|D") - } diff --git a/processor/filterprocessor/metadata.yaml b/processor/filterprocessor/metadata.yaml index 516979b85d34..bfccf18b9374 100644 --- a/processor/filterprocessor/metadata.yaml +++ b/processor/filterprocessor/metadata.yaml @@ -1,11 +1,10 @@ type: filter -scope_name: otelcol/filter status: class: processor stability: alpha: [traces, metrics, logs] - distributions: [core, contrib] + distributions: [core, contrib, k8s] warnings: [Orphaned Telemetry, Other] codeowners: active: [TylerHelmuth, boostchicken] @@ -17,21 +16,21 @@ telemetry: processor_filter_datapoints.filtered: enabled: true description: Number of metric data points dropped by the filter processor - unit: 1 + unit: "1" sum: value_type: int monotonic: true processor_filter_logs.filtered: enabled: true description: Number of logs dropped by the filter processor - unit: 1 + unit: "1" sum: value_type: int monotonic: true processor_filter_spans.filtered: enabled: true description: Number of spans dropped by the filter processor - unit: 1 + unit: "1" sum: value_type: int monotonic: true diff --git a/processor/filterprocessor/metrics.go b/processor/filterprocessor/metrics.go index 10551d3dd117..63beb811e2d6 100644 --- a/processor/filterprocessor/metrics.go +++ b/processor/filterprocessor/metrics.go @@ -9,6 +9,7 @@ import ( "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" + "go.opentelemetry.io/collector/pipeline" "go.opentelemetry.io/collector/processor" "go.opentelemetry.io/collector/processor/processorhelper" "go.uber.org/multierr" @@ -29,17 +30,17 @@ type filterMetricProcessor struct { skipResourceExpr expr.BoolExpr[ottlresource.TransformContext] skipMetricExpr expr.BoolExpr[ottlmetric.TransformContext] skipDataPointExpr expr.BoolExpr[ottldatapoint.TransformContext] - telemetry *filterProcessorTelemetry + telemetry *filterTelemetry logger *zap.Logger } -func newFilterMetricProcessor(set processor.CreateSettings, cfg *Config) (*filterMetricProcessor, error) { +func newFilterMetricProcessor(set processor.Settings, cfg *Config) (*filterMetricProcessor, error) { var err error fsp := &filterMetricProcessor{ logger: set.Logger, } - fpt, err := newfilterProcessorTelemetry(set) + fpt, err := newFilterTelemetry(set, pipeline.SignalMetrics) if err != nil { return nil, fmt.Errorf("error creating filter processor telemetry: %w", err) } @@ -122,7 +123,7 @@ func (fmp *filterMetricProcessor) processMetrics(ctx context.Context, md pmetric md.ResourceMetrics().RemoveIf(func(rmetrics pmetric.ResourceMetrics) bool { resource := rmetrics.Resource() if fmp.skipResourceExpr != nil { - skip, err := fmp.skipResourceExpr.Eval(ctx, ottlresource.NewTransformContext(resource)) + skip, err := fmp.skipResourceExpr.Eval(ctx, ottlresource.NewTransformContext(resource, rmetrics)) if err != nil { errors = multierr.Append(errors, err) return false @@ -135,7 +136,7 @@ func (fmp *filterMetricProcessor) processMetrics(ctx context.Context, md pmetric scope := smetrics.Scope() smetrics.Metrics().RemoveIf(func(metric pmetric.Metric) bool { if fmp.skipMetricExpr != nil { - skip, err := fmp.skipMetricExpr.Eval(ctx, ottlmetric.NewTransformContext(metric, smetrics.Metrics(), scope, resource)) + skip, err := fmp.skipMetricExpr.Eval(ctx, ottlmetric.NewTransformContext(metric, smetrics.Metrics(), scope, resource, smetrics, rmetrics)) if err != nil { errors = multierr.Append(errors, err) } @@ -173,7 +174,7 @@ func (fmp *filterMetricProcessor) processMetrics(ctx context.Context, md pmetric }) metricDataPointCountAfterFilters := md.DataPointCount() - fmp.telemetry.record(triggerMetricDataPointsDropped, int64(metricDataPointCountBeforeFilters-metricDataPointCountAfterFilters)) + fmp.telemetry.record(ctx, int64(metricDataPointCountBeforeFilters-metricDataPointCountAfterFilters)) if errors != nil { fmp.logger.Error("failed processing metrics", zap.Error(errors)) @@ -259,7 +260,7 @@ func newResExpr(mp *filterconfig.MetricMatchProperties) (expr.BoolExpr[ottlresou func (fmp *filterMetricProcessor) handleNumberDataPoints(ctx context.Context, dps pmetric.NumberDataPointSlice, metric pmetric.Metric, metrics pmetric.MetricSlice, is pcommon.InstrumentationScope, resource pcommon.Resource) error { var errors error dps.RemoveIf(func(datapoint pmetric.NumberDataPoint) bool { - skip, err := fmp.skipDataPointExpr.Eval(ctx, ottldatapoint.NewTransformContext(datapoint, metric, metrics, is, resource)) + skip, err := fmp.skipDataPointExpr.Eval(ctx, ottldatapoint.NewTransformContext(datapoint, metric, metrics, is, resource, pmetric.NewScopeMetrics(), pmetric.NewResourceMetrics())) if err != nil { errors = multierr.Append(errors, err) return false @@ -272,7 +273,7 @@ func (fmp *filterMetricProcessor) handleNumberDataPoints(ctx context.Context, dp func (fmp *filterMetricProcessor) handleHistogramDataPoints(ctx context.Context, dps pmetric.HistogramDataPointSlice, metric pmetric.Metric, metrics pmetric.MetricSlice, is pcommon.InstrumentationScope, resource pcommon.Resource) error { var errors error dps.RemoveIf(func(datapoint pmetric.HistogramDataPoint) bool { - skip, err := fmp.skipDataPointExpr.Eval(ctx, ottldatapoint.NewTransformContext(datapoint, metric, metrics, is, resource)) + skip, err := fmp.skipDataPointExpr.Eval(ctx, ottldatapoint.NewTransformContext(datapoint, metric, metrics, is, resource, pmetric.NewScopeMetrics(), pmetric.NewResourceMetrics())) if err != nil { errors = multierr.Append(errors, err) return false @@ -285,7 +286,7 @@ func (fmp *filterMetricProcessor) handleHistogramDataPoints(ctx context.Context, func (fmp *filterMetricProcessor) handleExponetialHistogramDataPoints(ctx context.Context, dps pmetric.ExponentialHistogramDataPointSlice, metric pmetric.Metric, metrics pmetric.MetricSlice, is pcommon.InstrumentationScope, resource pcommon.Resource) error { var errors error dps.RemoveIf(func(datapoint pmetric.ExponentialHistogramDataPoint) bool { - skip, err := fmp.skipDataPointExpr.Eval(ctx, ottldatapoint.NewTransformContext(datapoint, metric, metrics, is, resource)) + skip, err := fmp.skipDataPointExpr.Eval(ctx, ottldatapoint.NewTransformContext(datapoint, metric, metrics, is, resource, pmetric.NewScopeMetrics(), pmetric.NewResourceMetrics())) if err != nil { errors = multierr.Append(errors, err) return false @@ -298,7 +299,7 @@ func (fmp *filterMetricProcessor) handleExponetialHistogramDataPoints(ctx contex func (fmp *filterMetricProcessor) handleSummaryDataPoints(ctx context.Context, dps pmetric.SummaryDataPointSlice, metric pmetric.Metric, metrics pmetric.MetricSlice, is pcommon.InstrumentationScope, resource pcommon.Resource) error { var errors error dps.RemoveIf(func(datapoint pmetric.SummaryDataPoint) bool { - skip, err := fmp.skipDataPointExpr.Eval(ctx, ottldatapoint.NewTransformContext(datapoint, metric, metrics, is, resource)) + skip, err := fmp.skipDataPointExpr.Eval(ctx, ottldatapoint.NewTransformContext(datapoint, metric, metrics, is, resource, pmetric.NewScopeMetrics(), pmetric.NewResourceMetrics())) if err != nil { errors = multierr.Append(errors, err) return false diff --git a/processor/filterprocessor/metrics_test.go b/processor/filterprocessor/metrics_test.go index 554484293537..46c2a5785c1d 100644 --- a/processor/filterprocessor/metrics_test.go +++ b/processor/filterprocessor/metrics_test.go @@ -16,6 +16,8 @@ import ( "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/processor/processorhelper" "go.opentelemetry.io/collector/processor/processortest" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/sdk/metric/metricdata" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/goldendataset" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter/filterconfig" @@ -328,9 +330,9 @@ func TestFilterMetricProcessor(t *testing.T) { }, } factory := NewFactory() - fmp, err := factory.CreateMetricsProcessor( + fmp, err := factory.CreateMetrics( context.Background(), - processortest.NewNopCreateSettings(), + processortest.NewNopSettings(), cfg, next, ) @@ -343,15 +345,15 @@ func TestFilterMetricProcessor(t *testing.T) { assert.NoError(t, fmp.Start(ctx, nil)) cErr := fmp.ConsumeMetrics(context.Background(), test.inMetrics) - assert.Nil(t, cErr) + assert.NoError(t, cErr) got := next.AllMetrics() if len(test.outMN) == 0 { - require.Equal(t, 0, len(got)) + require.Empty(t, got) return } - require.Equal(t, 1, len(got)) + require.Len(t, got, 1) require.Equal(t, len(test.outMN), got[0].ResourceMetrics().Len()) for i, wantOut := range test.outMN { gotMetrics := got[0].ResourceMetrics().At(i).ScopeMetrics().At(0).Metrics() @@ -366,74 +368,50 @@ func TestFilterMetricProcessor(t *testing.T) { } func TestFilterMetricProcessorTelemetry(t *testing.T) { - telemetryTest(t, "FilterMetricProcessorTelemetry", func(t *testing.T, tel testTelemetry) { - next := new(consumertest.MetricsSink) - cfg := &Config{ - Metrics: MetricFilters{ - MetricConditions: []string{ - "name==\"metric1\"", - }, - }, - } - factory := NewFactory() - fmp, err := factory.CreateMetricsProcessor( - context.Background(), - tel.NewProcessorCreateSettings(), - cfg, - next, - ) - assert.NotNil(t, fmp) - assert.NoError(t, err) - - caps := fmp.Capabilities() - assert.True(t, caps.MutatesData) - ctx := context.Background() - assert.NoError(t, fmp.Start(ctx, nil)) - - err = fmp.ConsumeMetrics(context.Background(), testResourceMetrics([]metricWithResource{ - { - metricNames: []string{"foo", "bar"}, - resourceAttributes: map[string]any{ - "attr1": "attr1/val1", - }, + tel := setupTestTelemetry() + cfg := &Config{ + Metrics: MetricFilters{ + MetricConditions: []string{ + "name==\"metric1\"", }, - })) - assert.NoError(t, err) - - tel.assertMetrics(t, expectedMetrics{ - metricDataPointsFiltered: 0, - }) + }, + } + fmp, err := newFilterMetricProcessor( + tel.NewSettings(), + cfg, + ) + assert.NotNil(t, fmp) + assert.NoError(t, err) - err = fmp.ConsumeMetrics(context.Background(), testResourceMetrics([]metricWithResource{ - { - metricNames: []string{"metric1", "metric2"}, - resourceAttributes: map[string]any{ - "attr1": "attr1/val1", - }, + _, err = fmp.processMetrics(context.Background(), testResourceMetrics([]metricWithResource{ + { + metricNames: []string{"metric1", "metric2"}, + resourceAttributes: map[string]any{ + "attr1": "attr1/val1", }, - })) - assert.NoError(t, err) - - tel.assertMetrics(t, expectedMetrics{ - metricDataPointsFiltered: 1, - }) + }, + })) + assert.NoError(t, err) - err = fmp.ConsumeMetrics(context.Background(), testResourceMetrics([]metricWithResource{ - { - metricNames: []string{"metric1"}, - resourceAttributes: map[string]any{ - "attr1": "attr1/val1", + want := []metricdata.Metrics{ + { + Name: "otelcol_processor_filter_datapoints.filtered", + Description: "Number of metric data points dropped by the filter processor", + Unit: "1", + Data: metricdata.Sum[int64]{ + Temporality: metricdata.CumulativeTemporality, + IsMonotonic: true, + DataPoints: []metricdata.DataPoint[int64]{ + { + Value: 1, + Attributes: attribute.NewSet(attribute.String("filter", "filter")), + }, }, }, - })) - assert.NoError(t, err) - - tel.assertMetrics(t, expectedMetrics{ - metricDataPointsFiltered: 2, - }) - - assert.NoError(t, fmp.Shutdown(ctx)) - }) + }, + } + tel.assertMetrics(t, want) + require.NoError(t, tel.Shutdown(context.Background())) } func testResourceMetrics(mwrs []metricWithResource) pmetric.Metrics { @@ -488,9 +466,9 @@ func benchmarkFilter(b *testing.B, mp *filterconfig.MetricMatchProperties) { Exclude: mp, } ctx := context.Background() - proc, _ := factory.CreateMetricsProcessor( + proc, _ := factory.CreateMetrics( ctx, - processortest.NewNopCreateSettings(), + processortest.NewNopSettings(), cfg, consumertest.NewNop(), ) @@ -566,9 +544,9 @@ func requireNotPanics(t *testing.T, metrics pmetric.Metrics) { }, } ctx := context.Background() - proc, _ := factory.CreateMetricsProcessor( + proc, _ := factory.CreateMetrics( ctx, - processortest.NewNopCreateSettings(), + processortest.NewNopSettings(), cfg, consumertest.NewNop(), ) @@ -798,7 +776,7 @@ func TestFilterMetricProcessorWithOTTL(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - processor, err := newFilterMetricProcessor(processortest.NewNopCreateSettings(), &Config{Metrics: tt.conditions, ErrorMode: tt.errorMode}) + processor, err := newFilterMetricProcessor(processortest.NewNopSettings(), &Config{Metrics: tt.conditions, ErrorMode: tt.errorMode}) assert.NoError(t, err) got, err := processor.processMetrics(context.Background(), constructMetrics()) @@ -806,7 +784,6 @@ func TestFilterMetricProcessorWithOTTL(t *testing.T) { if tt.filterEverything { assert.Equal(t, processorhelper.ErrSkipProcessingData, err) } else { - exTd := constructMetrics() tt.want(exTd) assert.Equal(t, exTd, got) @@ -1100,7 +1077,7 @@ func Test_ResourceSkipExpr_With_Bridge(t *testing.T) { resource := pcommon.NewResource() resource.Attributes().PutStr("test", "test") - tCtx := ottlresource.NewTransformContext(resource) + tCtx := ottlresource.NewTransformContext(resource, pmetric.NewResourceMetrics()) boolExpr, err := newSkipResExpr(filterconfig.CreateMetricMatchPropertiesFromDefault(tt.condition.Include), filterconfig.CreateMetricMatchPropertiesFromDefault(tt.condition.Exclude)) require.NoError(t, err) diff --git a/processor/filterprocessor/telemetry.go b/processor/filterprocessor/telemetry.go index 302bc3b1a7af..dd21cf783ce8 100644 --- a/processor/filterprocessor/telemetry.go +++ b/processor/filterprocessor/telemetry.go @@ -5,7 +5,9 @@ package filterprocessor // import "github.com/open-telemetry/opentelemetry-colle import ( "context" + "fmt" + "go.opentelemetry.io/collector/pipeline" "go.opentelemetry.io/collector/processor" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/metric" @@ -13,45 +15,35 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor/internal/metadata" ) -type trigger int - -const ( - triggerMetricDataPointsDropped trigger = iota - triggerLogsDropped - triggerSpansDropped -) - -type filterProcessorTelemetry struct { - exportCtx context.Context - - processorAttr []attribute.KeyValue - - telemetryBuilder *metadata.TelemetryBuilder +type filterTelemetry struct { + attr metric.MeasurementOption + counter metric.Int64Counter } -func newfilterProcessorTelemetry(set processor.CreateSettings) (*filterProcessorTelemetry, error) { +func newFilterTelemetry(set processor.Settings, signal pipeline.Signal) (*filterTelemetry, error) { telemetryBuilder, err := metadata.NewTelemetryBuilder(set.TelemetrySettings) if err != nil { return nil, err } - return &filterProcessorTelemetry{ - processorAttr: []attribute.KeyValue{attribute.String(metadata.Type.String(), set.ID.String())}, - exportCtx: context.Background(), - telemetryBuilder: telemetryBuilder, + var counter metric.Int64Counter + switch signal { + case pipeline.SignalMetrics: + counter = telemetryBuilder.ProcessorFilterDatapointsFiltered + case pipeline.SignalLogs: + counter = telemetryBuilder.ProcessorFilterLogsFiltered + case pipeline.SignalTraces: + counter = telemetryBuilder.ProcessorFilterSpansFiltered + default: + return nil, fmt.Errorf("unsupported signal type: %v", signal) + } + + return &filterTelemetry{ + attr: metric.WithAttributeSet(attribute.NewSet(attribute.String(metadata.Type.String(), set.ID.String()))), + counter: counter, }, nil } -func (fpt *filterProcessorTelemetry) record(trigger trigger, dropped int64) { - var triggerMeasure metric.Int64Counter - switch trigger { - case triggerMetricDataPointsDropped: - triggerMeasure = fpt.telemetryBuilder.ProcessorFilterDatapointsFiltered - case triggerLogsDropped: - triggerMeasure = fpt.telemetryBuilder.ProcessorFilterLogsFiltered - case triggerSpansDropped: - triggerMeasure = fpt.telemetryBuilder.ProcessorFilterSpansFiltered - } - - triggerMeasure.Add(fpt.exportCtx, dropped, metric.WithAttributes(fpt.processorAttr...)) +func (fpt *filterTelemetry) record(ctx context.Context, dropped int64) { + fpt.counter.Add(ctx, dropped, fpt.attr) } diff --git a/processor/filterprocessor/telemetry_test.go b/processor/filterprocessor/telemetry_test.go deleted file mode 100644 index 0529df8a9917..000000000000 --- a/processor/filterprocessor/telemetry_test.go +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package filterprocessor - -import ( - "context" - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/processor" - "go.opentelemetry.io/collector/processor/processortest" - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/sdk/metric" - "go.opentelemetry.io/otel/sdk/metric/metricdata" - "go.opentelemetry.io/otel/sdk/metric/metricdata/metricdatatest" - - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor/internal/metadata" -) - -type testTelemetry struct { - reader *metric.ManualReader - meterProvider *metric.MeterProvider -} - -type expectedMetrics struct { - // processor_filter_metrics_filtered - metricDataPointsFiltered int64 - // processor_filter_logs_filtered - logsFiltered int64 - // processor_filter_spans_filtered - spansFiltered int64 -} - -func telemetryTest(t *testing.T, name string, testFunc func(t *testing.T, tel testTelemetry)) { - t.Run(name, func(t *testing.T) { - testFunc(t, setupTelemetry()) - }) -} - -func setupTelemetry() testTelemetry { - reader := metric.NewManualReader() - return testTelemetry{ - reader: reader, - meterProvider: metric.NewMeterProvider(metric.WithReader(reader)), - } -} - -func (tt *testTelemetry) NewProcessorCreateSettings() processor.CreateSettings { - settings := processortest.NewNopCreateSettings() - settings.MeterProvider = tt.meterProvider - settings.ID = component.NewID(metadata.Type) - - return settings -} - -func (tt *testTelemetry) assertMetrics(t *testing.T, expected expectedMetrics) { - var md metricdata.ResourceMetrics - require.NoError(t, tt.reader.Collect(context.Background(), &md)) - - if expected.metricDataPointsFiltered > 0 { - name := "processor_filter_datapoints.filtered" - got := tt.getMetric(name, md) - want := metricdata.Metrics{ - Name: name, - Description: "Number of metric data points dropped by the filter processor", - Unit: "1", - Data: metricdata.Sum[int64]{ - Temporality: metricdata.CumulativeTemporality, - IsMonotonic: true, - DataPoints: []metricdata.DataPoint[int64]{ - { - Value: expected.metricDataPointsFiltered, - Attributes: attribute.NewSet(attribute.String("filter", "filter")), - }, - }, - }, - } - metricdatatest.AssertEqual(t, want, got, metricdatatest.IgnoreTimestamp()) - } - if expected.logsFiltered > 0 { - name := "processor_filter_logs.filtered" - got := tt.getMetric(name, md) - want := metricdata.Metrics{ - Name: name, - Description: "Number of logs dropped by the filter processor", - Unit: "1", - Data: metricdata.Sum[int64]{ - Temporality: metricdata.CumulativeTemporality, - IsMonotonic: true, - DataPoints: []metricdata.DataPoint[int64]{ - { - Value: expected.logsFiltered, - Attributes: attribute.NewSet(attribute.String("filter", "filter")), - }, - }, - }, - } - metricdatatest.AssertEqual(t, want, got, metricdatatest.IgnoreTimestamp()) - } - if expected.spansFiltered > 0 { - name := "processor_filter_spans.filtered" - got := tt.getMetric(name, md) - want := metricdata.Metrics{ - Name: name, - Description: "Number of spans dropped by the filter processor", - Unit: "1", - Data: metricdata.Sum[int64]{ - Temporality: metricdata.CumulativeTemporality, - IsMonotonic: true, - DataPoints: []metricdata.DataPoint[int64]{ - { - Value: expected.spansFiltered, - Attributes: attribute.NewSet(attribute.String("filter", "filter")), - }, - }, - }, - } - metricdatatest.AssertEqual(t, want, got, metricdatatest.IgnoreTimestamp()) - } -} - -func (tt *testTelemetry) getMetric(name string, got metricdata.ResourceMetrics) metricdata.Metrics { - for _, sm := range got.ScopeMetrics { - for _, m := range sm.Metrics { - if m.Name == name { - return m - } - } - } - - return metricdata.Metrics{} -} diff --git a/processor/filterprocessor/traces.go b/processor/filterprocessor/traces.go index ff64e85470d1..3b444cd5897c 100644 --- a/processor/filterprocessor/traces.go +++ b/processor/filterprocessor/traces.go @@ -8,6 +8,7 @@ import ( "fmt" "go.opentelemetry.io/collector/pdata/ptrace" + "go.opentelemetry.io/collector/pipeline" "go.opentelemetry.io/collector/processor" "go.opentelemetry.io/collector/processor/processorhelper" "go.uber.org/multierr" @@ -23,17 +24,17 @@ import ( type filterSpanProcessor struct { skipSpanExpr expr.BoolExpr[ottlspan.TransformContext] skipSpanEventExpr expr.BoolExpr[ottlspanevent.TransformContext] - telemetry *filterProcessorTelemetry + telemetry *filterTelemetry logger *zap.Logger } -func newFilterSpansProcessor(set processor.CreateSettings, cfg *Config) (*filterSpanProcessor, error) { +func newFilterSpansProcessor(set processor.Settings, cfg *Config) (*filterSpanProcessor, error) { var err error fsp := &filterSpanProcessor{ logger: set.Logger, } - fpt, err := newfilterProcessorTelemetry(set) + fpt, err := newFilterTelemetry(set, pipeline.SignalTraces) if err != nil { return nil, fmt.Errorf("error creating filter processor telemetry: %w", err) } @@ -93,7 +94,7 @@ func (fsp *filterSpanProcessor) processTraces(ctx context.Context, td ptrace.Tra scope := ss.Scope() ss.Spans().RemoveIf(func(span ptrace.Span) bool { if fsp.skipSpanExpr != nil { - skip, err := fsp.skipSpanExpr.Eval(ctx, ottlspan.NewTransformContext(span, scope, resource)) + skip, err := fsp.skipSpanExpr.Eval(ctx, ottlspan.NewTransformContext(span, scope, resource, ss, rs)) if err != nil { errors = multierr.Append(errors, err) return false @@ -104,7 +105,7 @@ func (fsp *filterSpanProcessor) processTraces(ctx context.Context, td ptrace.Tra } if fsp.skipSpanEventExpr != nil { span.Events().RemoveIf(func(spanEvent ptrace.SpanEvent) bool { - skip, err := fsp.skipSpanEventExpr.Eval(ctx, ottlspanevent.NewTransformContext(spanEvent, span, scope, resource)) + skip, err := fsp.skipSpanEventExpr.Eval(ctx, ottlspanevent.NewTransformContext(spanEvent, span, scope, resource, ss, rs)) if err != nil { errors = multierr.Append(errors, err) return false @@ -120,7 +121,7 @@ func (fsp *filterSpanProcessor) processTraces(ctx context.Context, td ptrace.Tra }) spanCountAfterFilters := td.SpanCount() - fsp.telemetry.record(triggerSpansDropped, int64(spanCountBeforeFilters-spanCountAfterFilters)) + fsp.telemetry.record(ctx, int64(spanCountBeforeFilters-spanCountAfterFilters)) if errors != nil { fsp.logger.Error("failed processing traces", zap.Error(errors)) diff --git a/processor/filterprocessor/traces_test.go b/processor/filterprocessor/traces_test.go index afb7735fe961..bee2b497e2fa 100644 --- a/processor/filterprocessor/traces_test.go +++ b/processor/filterprocessor/traces_test.go @@ -15,6 +15,8 @@ import ( "go.opentelemetry.io/collector/pdata/ptrace" "go.opentelemetry.io/collector/processor/processorhelper" "go.opentelemetry.io/collector/processor/processortest" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/sdk/metric/metricdata" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter/filterconfig" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter/filterset" @@ -128,9 +130,9 @@ func TestFilterTraceProcessor(t *testing.T) { }, } factory := NewFactory() - fmp, err := factory.CreateTracesProcessor( + fmp, err := factory.CreateTraces( ctx, - processortest.NewNopCreateSettings(), + processortest.NewNopSettings(), cfg, next, ) @@ -143,12 +145,12 @@ func TestFilterTraceProcessor(t *testing.T) { require.NoError(t, fmp.Start(ctx, nil)) cErr := fmp.ConsumeTraces(ctx, test.inTraces) - require.Nil(t, cErr) + require.NoError(t, cErr) got := next.AllTraces() // If all traces got filtered you shouldn't even have ResourceSpans if test.allTracesFiltered { - require.Equal(t, 0, len(got)) + require.Empty(t, got) } else { require.Equal(t, test.spanCountExpected, got[0].SpanCount()) } @@ -263,7 +265,7 @@ func TestFilterTraceProcessorWithOTTL(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - processor, err := newFilterSpansProcessor(processortest.NewNopCreateSettings(), &Config{Traces: tt.conditions, ErrorMode: tt.errorMode}) + processor, err := newFilterSpansProcessor(processortest.NewNopSettings(), &Config{Traces: tt.conditions, ErrorMode: tt.errorMode}) assert.NoError(t, err) got, err := processor.processTraces(context.Background(), constructTraces()) @@ -271,7 +273,6 @@ func TestFilterTraceProcessorWithOTTL(t *testing.T) { if tt.filterEverything { assert.Equal(t, processorhelper.ErrSkipProcessingData, err) } else { - exTd := constructTraces() tt.want(exTd) assert.Equal(t, exTd, got) @@ -281,23 +282,39 @@ func TestFilterTraceProcessorWithOTTL(t *testing.T) { } func TestFilterTraceProcessorTelemetry(t *testing.T) { - telemetryTest(t, "FilterTraceProcessorTelemetry", func(t *testing.T, tel testTelemetry) { - processor, err := newFilterSpansProcessor(tel.NewProcessorCreateSettings(), &Config{ - Traces: TraceFilters{ - SpanConditions: []string{ - `name == "operationA"`, - }, - }, ErrorMode: ottl.IgnoreError, - }) - assert.NoError(t, err) + tel := setupTestTelemetry() + processor, err := newFilterSpansProcessor(tel.NewSettings(), &Config{ + Traces: TraceFilters{ + SpanConditions: []string{ + `name == "operationA"`, + }, + }, ErrorMode: ottl.IgnoreError, + }) + assert.NoError(t, err) - _, err = processor.processTraces(context.Background(), constructTraces()) - assert.NoError(t, err) + _, err = processor.processTraces(context.Background(), constructTraces()) + assert.NoError(t, err) - tel.assertMetrics(t, expectedMetrics{ - spansFiltered: 2, - }) - }) + want := []metricdata.Metrics{ + { + Name: "otelcol_processor_filter_spans.filtered", + Description: "Number of spans dropped by the filter processor", + Unit: "1", + Data: metricdata.Sum[int64]{ + Temporality: metricdata.CumulativeTemporality, + IsMonotonic: true, + DataPoints: []metricdata.DataPoint[int64]{ + { + Value: 2, + Attributes: attribute.NewSet(attribute.String("filter", "filter")), + }, + }, + }, + }, + } + + tel.assertMetrics(t, want) + require.NoError(t, tel.Shutdown(context.Background())) } func constructTraces() ptrace.Traces { diff --git a/processor/geoipprocessor/README.md b/processor/geoipprocessor/README.md index 696918367598..6d91b7b6a7d5 100644 --- a/processor/geoipprocessor/README.md +++ b/processor/geoipprocessor/README.md @@ -3,14 +3,55 @@ | Status | | | ------------- |-----------| -| Stability | [development]: traces, metrics, logs | -| Distributions | [] | +| Stability | [alpha]: traces, metrics, logs | +| Distributions | [contrib] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aprocessor%2Fgeoip%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aprocessor%2Fgeoip) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aprocessor%2Fgeoip%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aprocessor%2Fgeoip) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@andrzej-stencel](https://www.github.com/andrzej-stencel), [@michalpristas](https://www.github.com/michalpristas), [@rogercoll](https://www.github.com/rogercoll) | -[development]: https://github.com/open-telemetry/opentelemetry-collector#development +[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha +[contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib -## Overview +## Description -This processor is currently under development and is presently a **NOP (No Operation) processor**. Further features and functionalities will be added in upcoming versions. +The geoIP processor `geoipprocessor` enhances the attributes of a span, log, or metric by appending information about the geographical location of an IP address. To add geographical information, the IP address must be included in the attributes using the [`source.address` semantic conventions key attribute](https://github.com/open-telemetry/semantic-conventions/blob/v1.26.0/docs/general/attributes.md#source). By default, only the resource attributes will be modified. Please refer to [config.go](./config.go) for the config spec. + +### Geographical location metadata + +The following [resource attributes](./internal/convention/attributes.go) will be added if the corresponding information is found: + +``` + * geo.city_name + * geo.postal_code + * geo.country_name + * geo.country_iso_code + * geo.continent_name + * geo.continent_code + * geo.region_name + * geo.region_iso_code + * geo.timezone + * geo.location.lat + * geo.location.lon +``` + +## Configuration + +The following settings must be configured: + +- `providers`: A map containing geographical location information providers. These providers are used to search for the geographical location attributes associated with an IP. Supported providers: + - [maxmind](./internal/provider/maxmindprovider/README.md) +- `context`: Allows specifying the underlying telemetry context the processor will work with. Available values: + - `resource`(default): Resource attributes. + - `record`: Attributes within a data point, log record or a span. + +## Examples + +```yaml +processors: + # processor name: geoip + geoip: + context: resource + providers: + maxmind: + database_path: /tmp/mygeodb +``` diff --git a/processor/geoipprocessor/config.go b/processor/geoipprocessor/config.go index 318739c3b360..03144906d360 100644 --- a/processor/geoipprocessor/config.go +++ b/processor/geoipprocessor/config.go @@ -3,9 +3,108 @@ package geoipprocessor // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor" +import ( + "errors" + "fmt" + "strings" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/confmap" + + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor/internal/provider" +) + +const ( + providersKey = "providers" +) + +type ContextID string + +const ( + resource ContextID = "resource" + record ContextID = "record" +) + +func (c *ContextID) UnmarshalText(text []byte) error { + str := ContextID(strings.ToLower(string(text))) + switch str { + case resource, record: + *c = str + return nil + default: + return fmt.Errorf("unknown context %s, available values: %s, %s", str, resource, record) + } +} + // Config holds the configuration for the GeoIP processor. -type Config struct{} +type Config struct { + // Providers specifies the sources to extract geographical information about a given IP. + Providers map[string]provider.Config `mapstructure:"-"` + + // Context section allows specifying the source type to look for the IP. Available options: resource or record. + Context ContextID `mapstructure:"context"` +} + +var ( + _ component.Config = (*Config)(nil) + _ confmap.Unmarshaler = (*Config)(nil) +) func (cfg *Config) Validate() error { + if len(cfg.Providers) == 0 { + return errors.New("must specify at least one geo IP data provider when using the geoip processor") + } + + // validate all provider's configuration + for providerID, providerConfig := range cfg.Providers { + if err := providerConfig.Validate(); err != nil { + return fmt.Errorf("error validating provider %s: %w", providerID, err) + } + } + + return nil +} + +// Unmarshal a config.Parser into the config struct. +func (cfg *Config) Unmarshal(componentParser *confmap.Conf) error { + if componentParser == nil { + return nil + } + + // load the non-dynamic config normally + err := componentParser.Unmarshal(cfg, confmap.WithIgnoreUnused()) + if err != nil { + return err + } + + // dynamically load the individual providers configs based on the key name + cfg.Providers = map[string]provider.Config{} + + // retrieve `providers` configuration section + providersSection, err := componentParser.Sub(providersKey) + if err != nil { + return err + } + + // loop through all defined providers and load their configuration + for key := range providersSection.ToStringMap() { + factory, ok := getProviderFactory(key) + if !ok { + return fmt.Errorf("invalid provider key: %s", key) + } + + providerCfg := factory.CreateDefaultConfig() + providerSection, err := providersSection.Sub(key) + if err != nil { + return err + } + err = providerSection.Unmarshal(providerCfg) + if err != nil { + return fmt.Errorf("error reading settings for provider type %q: %w", key, err) + } + + cfg.Providers[key] = providerCfg + } + return nil } diff --git a/processor/geoipprocessor/config_test.go b/processor/geoipprocessor/config_test.go index 6f41589941fe..746b210685fc 100644 --- a/processor/geoipprocessor/config_test.go +++ b/processor/geoipprocessor/config_test.go @@ -4,6 +4,7 @@ package geoipprocessor import ( + "errors" "path/filepath" "testing" @@ -11,20 +12,51 @@ import ( "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/confmap/confmaptest" + "go.opentelemetry.io/collector/otelcol/otelcoltest" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor/internal/metadata" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor/internal/provider" + maxmind "github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor/internal/provider/maxmindprovider" ) func TestLoadConfig(t *testing.T) { t.Parallel() tests := []struct { - id component.ID - expected component.Config + id component.ID + expected component.Config + validateErrorMessage string + unmarshalErrorMessage string }{ { - id: component.NewID(metadata.Type), - expected: &Config{}, + id: component.NewID(metadata.Type), + validateErrorMessage: "must specify at least one geo IP data provider when using the geoip processor", + }, + { + id: component.NewIDWithName(metadata.Type, "maxmind"), + expected: &Config{ + Context: resource, + Providers: map[string]provider.Config{ + "maxmind": &maxmind.Config{DatabasePath: "/tmp/db"}, + }, + }, + }, + { + id: component.NewIDWithName(metadata.Type, "maxmind_record_context"), + expected: &Config{ + Context: record, + Providers: map[string]provider.Config{ + "maxmind": &maxmind.Config{DatabasePath: "/tmp/db"}, + }, + }, + }, + { + id: component.NewIDWithName(metadata.Type, "invalid_providers_config"), + unmarshalErrorMessage: "unexpected sub-config value kind for key:providers value:this should be a map kind:string", + }, + { + id: component.NewIDWithName(metadata.Type, "invalid_source"), + unmarshalErrorMessage: "unknown context not.an.otlp.context, available values: resource, record", }, } @@ -38,15 +70,87 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) - if tt.expected == nil { - err = component.ValidateConfig(cfg) - assert.Error(t, err) + if tt.unmarshalErrorMessage != "" { + assert.ErrorContains(t, sub.Unmarshal(cfg), tt.unmarshalErrorMessage) return } + require.NoError(t, sub.Unmarshal(cfg)) + + if tt.validateErrorMessage != "" { + assert.EqualError(t, component.ValidateConfig(cfg), tt.validateErrorMessage) + return + } + assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) }) } } + +func TestLoadConfig_InvalidProviderKey(t *testing.T) { + factories, err := otelcoltest.NopFactories() + require.NoError(t, err) + + factory := NewFactory() + factories.Processors[metadata.Type] = factory + _, err = otelcoltest.LoadConfigAndValidate(filepath.Join("testdata", "config-invalidProviderKey.yaml"), factories) + + require.ErrorContains(t, err, "error reading configuration for \"geoip\": invalid provider key: invalidProviderKey") +} + +func TestLoadConfig_ValidProviderKey(t *testing.T) { + type dbMockConfig struct { + Database string `mapstructure:"database"` + providerConfigMock + } + baseMockFactory.CreateDefaultConfigF = func() provider.Config { + return &dbMockConfig{providerConfigMock: providerConfigMock{func() error { return nil }}} + } + providerFactories["mock"] = &baseMockFactory + + factories, err := otelcoltest.NopFactories() + require.NoError(t, err) + + factory := NewFactory() + factories.Processors[metadata.Type] = factory + collectorConfig, err := otelcoltest.LoadConfigAndValidate(filepath.Join("testdata", "config-mockProvider.yaml"), factories) + + require.NoError(t, err) + actualDbMockConfig := collectorConfig.Processors[component.NewID(metadata.Type)].(*Config).Providers["mock"].(*dbMockConfig) + require.Equal(t, "/tmp/geodata.csv", actualDbMockConfig.Database) + + // assert provider unmarshall configuration error by removing the database fieldfrom the configuration struct + baseMockFactory.CreateDefaultConfigF = func() provider.Config { + return &providerConfigMock{func() error { return nil }} + } + providerFactories["mock"] = &baseMockFactory + + factories.Processors[metadata.Type] = factory + _, err = otelcoltest.LoadConfigAndValidate(filepath.Join("testdata", "config-mockProvider.yaml"), factories) + + require.ErrorContains(t, err, "has invalid keys: database") +} + +func TestLoadConfig_ProviderValidateError(t *testing.T) { + baseMockFactory.CreateDefaultConfigF = func() provider.Config { + sampleConfig := struct { + Database string `mapstructure:"database"` + providerConfigMock + }{ + "", + providerConfigMock{func() error { return errors.New("error validating mocked config") }}, + } + return &sampleConfig + } + providerFactories["mock"] = &baseMockFactory + + factories, err := otelcoltest.NopFactories() + require.NoError(t, err) + + factory := NewFactory() + factories.Processors[metadata.Type] = factory + _, err = otelcoltest.LoadConfigAndValidate(filepath.Join("testdata", "config-mockProvider.yaml"), factories) + + require.ErrorContains(t, err, "error validating provider mock") +} diff --git a/processor/geoipprocessor/factory.go b/processor/geoipprocessor/factory.go index ade49bf4accd..fc2f40e0b0b2 100644 --- a/processor/geoipprocessor/factory.go +++ b/processor/geoipprocessor/factory.go @@ -5,16 +5,33 @@ package geoipprocessor // import "github.com/open-telemetry/opentelemetry-collec import ( "context" + "fmt" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/processor" "go.opentelemetry.io/collector/processor/processorhelper" + "go.opentelemetry.io/otel/attribute" + semconv "go.opentelemetry.io/otel/semconv/v1.25.0" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor/internal/metadata" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor/internal/provider" + maxmind "github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor/internal/provider/maxmindprovider" ) -var processorCapabilities = consumer.Capabilities{MutatesData: true} +var ( + processorCapabilities = consumer.Capabilities{MutatesData: true} + // defaultResourceAttributes holds a list of default resource attribute keys. + // These keys are used to identify an IP address attribute associated with the resource. + defaultResourceAttributes = []attribute.Key{ + semconv.SourceAddressKey, // This key represents the standard source address attribute as defined in the OpenTelemetry semantic conventions. + } +) + +// providerFactories is a map that stores GeoIPProviderFactory instances, keyed by the provider type. +var providerFactories = map[string]provider.GeoIPProviderFactory{ + maxmind.TypeStr: &maxmind.Factory{}, +} // NewFactory creates a new processor factory with default configuration, // and registers the processors for metrics, traces, and logs. @@ -22,19 +39,72 @@ func NewFactory() processor.Factory { return processor.NewFactory(metadata.Type, createDefaultConfig, processor.WithMetrics(createMetricsProcessor, metadata.MetricsStability), processor.WithLogs(createLogsProcessor, metadata.LogsStability), processor.WithTraces(createTracesProcessor, metadata.TracesStability)) } +// getProviderFactory retrieves the GeoIPProviderFactory for the given key. +// It returns the factory and a boolean indicating whether the factory was found. +func getProviderFactory(key string) (provider.GeoIPProviderFactory, bool) { + if factory, ok := providerFactories[key]; ok { + return factory, true + } + + return nil, false +} + // createDefaultConfig returns a default configuration for the processor. func createDefaultConfig() component.Config { - return &Config{} + return &Config{ + Context: resource, + } +} + +// createGeoIPProviders creates a list of GeoIPProvider instances based on the provided configuration and providers factories. +func createGeoIPProviders( + ctx context.Context, + set processor.Settings, + config *Config, + factories map[string]provider.GeoIPProviderFactory, +) ([]provider.GeoIPProvider, error) { + providers := make([]provider.GeoIPProvider, 0, len(config.Providers)) + + for key, cfg := range config.Providers { + factory := factories[key] + if factory == nil { + return nil, fmt.Errorf("geoIP provider factory not found for key: %q", key) + } + + provider, err := factory.CreateGeoIPProvider(ctx, set, cfg) + if err != nil { + return nil, fmt.Errorf("failed to create provider for key %q: %w", key, err) + } + + providers = append(providers, provider) + } + + return providers, nil } -func createMetricsProcessor(ctx context.Context, set processor.CreateSettings, cfg component.Config, nextConsumer consumer.Metrics) (processor.Metrics, error) { - return processorhelper.NewMetricsProcessor(ctx, set, cfg, nextConsumer, newGeoIPProcessor().processMetrics, processorhelper.WithCapabilities(processorCapabilities)) +func createMetricsProcessor(ctx context.Context, set processor.Settings, cfg component.Config, nextConsumer consumer.Metrics) (processor.Metrics, error) { + geoCfg := cfg.(*Config) + providers, err := createGeoIPProviders(ctx, set, geoCfg, providerFactories) + if err != nil { + return nil, err + } + return processorhelper.NewMetrics(ctx, set, cfg, nextConsumer, newGeoIPProcessor(geoCfg, defaultResourceAttributes, providers, set).processMetrics, processorhelper.WithCapabilities(processorCapabilities)) } -func createTracesProcessor(ctx context.Context, set processor.CreateSettings, cfg component.Config, nextConsumer consumer.Traces) (processor.Traces, error) { - return processorhelper.NewTracesProcessor(ctx, set, cfg, nextConsumer, newGeoIPProcessor().processTraces, processorhelper.WithCapabilities(processorCapabilities)) +func createTracesProcessor(ctx context.Context, set processor.Settings, cfg component.Config, nextConsumer consumer.Traces) (processor.Traces, error) { + geoCfg := cfg.(*Config) + providers, err := createGeoIPProviders(ctx, set, geoCfg, providerFactories) + if err != nil { + return nil, err + } + return processorhelper.NewTraces(ctx, set, cfg, nextConsumer, newGeoIPProcessor(geoCfg, defaultResourceAttributes, providers, set).processTraces, processorhelper.WithCapabilities(processorCapabilities)) } -func createLogsProcessor(ctx context.Context, set processor.CreateSettings, cfg component.Config, nextConsumer consumer.Logs) (processor.Logs, error) { - return processorhelper.NewLogsProcessor(ctx, set, cfg, nextConsumer, newGeoIPProcessor().processLogs, processorhelper.WithCapabilities(processorCapabilities)) +func createLogsProcessor(ctx context.Context, set processor.Settings, cfg component.Config, nextConsumer consumer.Logs) (processor.Logs, error) { + geoCfg := cfg.(*Config) + providers, err := createGeoIPProviders(ctx, set, geoCfg, providerFactories) + if err != nil { + return nil, err + } + return processorhelper.NewLogs(ctx, set, cfg, nextConsumer, newGeoIPProcessor(geoCfg, defaultResourceAttributes, providers, set).processLogs, processorhelper.WithCapabilities(processorCapabilities)) } diff --git a/processor/geoipprocessor/factory_test.go b/processor/geoipprocessor/factory_test.go index 08b20813462b..1e676eb24298 100644 --- a/processor/geoipprocessor/factory_test.go +++ b/processor/geoipprocessor/factory_test.go @@ -5,12 +5,17 @@ package geoipprocessor import ( "context" + "errors" + "fmt" "testing" "github.com/stretchr/testify/assert" "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/consumer/consumertest" + "go.opentelemetry.io/collector/processor" "go.opentelemetry.io/collector/processor/processortest" + + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor/internal/provider" ) func TestCreateDefaultConfig(t *testing.T) { @@ -24,29 +29,60 @@ func TestCreateProcessor(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() - params := processortest.NewNopCreateSettings() + params := processortest.NewNopSettings() - tp, err := factory.CreateTracesProcessor(context.Background(), params, cfg, consumertest.NewNop()) + tp, err := factory.CreateTraces(context.Background(), params, cfg, consumertest.NewNop()) assert.NotNil(t, tp) assert.NoError(t, err) - mp, err := factory.CreateMetricsProcessor(context.Background(), params, cfg, consumertest.NewNop()) + mp, err := factory.CreateMetrics(context.Background(), params, cfg, consumertest.NewNop()) assert.NotNil(t, mp) assert.NoError(t, err) - lp, err := factory.CreateLogsProcessor(context.Background(), params, cfg, consumertest.NewNop()) + lp, err := factory.CreateLogs(context.Background(), params, cfg, consumertest.NewNop()) assert.NotNil(t, lp) assert.NoError(t, err) - tp, err = factory.CreateTracesProcessor(context.Background(), params, cfg, consumertest.NewNop()) + tp, err = factory.CreateTraces(context.Background(), params, cfg, consumertest.NewNop()) assert.NotNil(t, tp) assert.NoError(t, err) - mp, err = factory.CreateMetricsProcessor(context.Background(), params, cfg, consumertest.NewNop()) + mp, err = factory.CreateMetrics(context.Background(), params, cfg, consumertest.NewNop()) assert.NotNil(t, mp) assert.NoError(t, err) - lp, err = factory.CreateLogsProcessor(context.Background(), params, cfg, consumertest.NewNop()) + lp, err = factory.CreateLogs(context.Background(), params, cfg, consumertest.NewNop()) assert.NotNil(t, lp) assert.NoError(t, err) } + +func TestCreateProcessor_ProcessorKeyConfigError(t *testing.T) { + const errorKey string = "error" + + factory := NewFactory() + cfg := &Config{Providers: map[string]provider.Config{errorKey: &providerConfigMock{}}} + + _, err := factory.CreateMetrics(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) + assert.EqualError(t, err, fmt.Sprintf("geoIP provider factory not found for key: %q", errorKey)) + + _, err = factory.CreateLogs(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) + assert.EqualError(t, err, fmt.Sprintf("geoIP provider factory not found for key: %q", errorKey)) + + _, err = factory.CreateTraces(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) + assert.EqualError(t, err, fmt.Sprintf("geoIP provider factory not found for key: %q", errorKey)) +} + +func TestCreateProcessor_FailedProvider(t *testing.T) { + baseMockFactory.CreateGeoIPProviderF = func(context.Context, processor.Settings, provider.Config) (provider.GeoIPProvider, error) { + return nil, errors.New("error creating provider") + } + + const providerKey string = "mock" + providerFactories[providerKey] = &baseMockFactory + + factory := NewFactory() + cfg := &Config{Providers: map[string]provider.Config{providerKey: &providerConfigMock{}}} + + _, err := factory.CreateMetrics(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) + assert.EqualError(t, err, fmt.Errorf("failed to create provider for key %q: %w", providerKey, errors.New("error creating provider")).Error()) +} diff --git a/processor/geoipprocessor/generated_component_test.go b/processor/geoipprocessor/generated_component_test.go index 785c50bd4a79..eef01908379c 100644 --- a/processor/geoipprocessor/generated_component_test.go +++ b/processor/geoipprocessor/generated_component_test.go @@ -33,27 +33,27 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsProcessor(ctx, set, cfg, consumertest.NewNop()) + createFn: func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg, consumertest.NewNop()) }, }, { name: "metrics", - createFn: func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsProcessor(ctx, set, cfg, consumertest.NewNop()) + createFn: func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg, consumertest.NewNop()) }, }, { name: "traces", - createFn: func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesProcessor(ctx, set, cfg, consumertest.NewNop()) + createFn: func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg, consumertest.NewNop()) }, }, } @@ -65,21 +65,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), processortest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), processortest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), processortest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), processortest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(processor.Logs) require.True(t, ok) diff --git a/processor/geoipprocessor/geoip_processor.go b/processor/geoipprocessor/geoip_processor.go index 207e2e1644a9..c78d112c0725 100644 --- a/processor/geoipprocessor/geoip_processor.go +++ b/processor/geoipprocessor/geoip_processor.go @@ -5,26 +5,115 @@ package geoipprocessor // import "github.com/open-telemetry/opentelemetry-collec import ( "context" + "errors" + "fmt" + "net" - "go.opentelemetry.io/collector/pdata/plog" - "go.opentelemetry.io/collector/pdata/pmetric" - "go.opentelemetry.io/collector/pdata/ptrace" + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/processor" + "go.opentelemetry.io/otel/attribute" + "go.uber.org/zap" + + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor/internal/provider" +) + +var ( + errIPNotFound = errors.New("no IP address found in the resource attributes") + errParseIP = errors.New("could not parse IP address") + errUnspecifiedIP = errors.New("unspecified address") + errUnspecifiedSource = errors.New("no source attributes defined") ) -type geoIPProcessor struct{} +// newGeoIPProcessor creates a new instance of geoIPProcessor with the specified fields. +type geoIPProcessor struct { + providers []provider.GeoIPProvider + resourceAttributes []attribute.Key + logger *zap.Logger + + cfg *Config +} + +func newGeoIPProcessor(processorConfig *Config, resourceAttributes []attribute.Key, providers []provider.GeoIPProvider, params processor.Settings) *geoIPProcessor { + return &geoIPProcessor{ + resourceAttributes: resourceAttributes, + providers: providers, + cfg: processorConfig, + logger: params.Logger, + } +} -func newGeoIPProcessor() *geoIPProcessor { - return &geoIPProcessor{} +// parseIP parses a string to a net.IP type and returns an error if the IP is invalid or unspecified. +func parseIP(strIP string) (net.IP, error) { + ip := net.ParseIP(strIP) + if ip == nil { + return nil, fmt.Errorf("%w address: %s", errParseIP, strIP) + } else if ip.IsUnspecified() { + return nil, fmt.Errorf("%w address: %s", errUnspecifiedIP, strIP) + } + return ip, nil } -func (g *geoIPProcessor) processMetrics(_ context.Context, ms pmetric.Metrics) (pmetric.Metrics, error) { - return ms, nil +// ipFromAttributes extracts an IP address from the given attributes based on the specified fields. +// It returns the first IP address if found, or an error if no valid IP address is found. +func ipFromAttributes(attributes []attribute.Key, resource pcommon.Map) (net.IP, error) { + for _, attr := range attributes { + if ipField, found := resource.Get(string(attr)); found { + // The attribute might contain a domain name. Skip any net.ParseIP error until we have a fine-grained error propagation strategy. + // TODO: propagate an error once error_mode configuration option is available (e.g. transformprocessor) + ipAttribute, err := parseIP(ipField.AsString()) + if err == nil && ipAttribute != nil { + return ipAttribute, nil + } + } + } + + return nil, errIPNotFound } -func (g *geoIPProcessor) processTraces(_ context.Context, ts ptrace.Traces) (ptrace.Traces, error) { - return ts, nil +// geoLocation fetches geolocation information for the given IP address using the configured providers. +// It returns a set of attributes containing the geolocation data, or an error if the location could not be determined. +func (g *geoIPProcessor) geoLocation(ctx context.Context, ip net.IP) (attribute.Set, error) { + allAttributes := &attribute.Set{} + for _, geoProvider := range g.providers { + geoAttributes, err := geoProvider.Location(ctx, ip) + if err != nil { + // continue if no metadata is found + if errors.Is(err, provider.ErrNoMetadataFound) { + g.logger.Debug(err.Error(), zap.String("IP", ip.String())) + continue + } + return attribute.Set{}, err + } + *allAttributes = attribute.NewSet(append(allAttributes.ToSlice(), geoAttributes.ToSlice()...)...) + } + + return *allAttributes, nil } -func (g *geoIPProcessor) processLogs(_ context.Context, ls plog.Logs) (plog.Logs, error) { - return ls, nil +// processAttributes processes a pcommon.Map by adding geolocation attributes based on the found IP address. +func (g *geoIPProcessor) processAttributes(ctx context.Context, metadata pcommon.Map) error { + ipAddr, err := ipFromAttributes(g.resourceAttributes, metadata) + if err != nil { + // TODO: log IP error not found + if errors.Is(err, errIPNotFound) { + return nil + } + return err + } + + attributes, err := g.geoLocation(ctx, ipAddr) + if err != nil { + return err + } + + for _, geoAttr := range attributes.ToSlice() { + switch geoAttr.Value.Type() { + case attribute.FLOAT64: + metadata.PutDouble(string(geoAttr.Key), geoAttr.Value.AsFloat64()) + case attribute.STRING: + metadata.PutStr(string(geoAttr.Key), geoAttr.Value.AsString()) + } + } + + return nil } diff --git a/processor/geoipprocessor/geoip_processor_logs.go b/processor/geoipprocessor/geoip_processor_logs.go new file mode 100644 index 000000000000..166cbf487170 --- /dev/null +++ b/processor/geoipprocessor/geoip_processor_logs.go @@ -0,0 +1,35 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package geoipprocessor // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor" + +import ( + "context" + + "go.opentelemetry.io/collector/pdata/plog" +) + +func (g *geoIPProcessor) processLogs(ctx context.Context, ls plog.Logs) (plog.Logs, error) { + rl := ls.ResourceLogs() + for i := 0; i < rl.Len(); i++ { + switch g.cfg.Context { + case resource: + err := g.processAttributes(ctx, rl.At(i).Resource().Attributes()) + if err != nil { + return ls, err + } + case record: + for j := 0; j < rl.At(i).ScopeLogs().Len(); j++ { + for k := 0; k < rl.At(i).ScopeLogs().At(j).LogRecords().Len(); k++ { + err := g.processAttributes(ctx, rl.At(i).ScopeLogs().At(j).LogRecords().At(k).Attributes()) + if err != nil { + return ls, err + } + } + } + default: + return ls, errUnspecifiedSource + } + } + return ls, nil +} diff --git a/processor/geoipprocessor/geoip_processor_metrics.go b/processor/geoipprocessor/geoip_processor_metrics.go new file mode 100644 index 000000000000..ada8710de234 --- /dev/null +++ b/processor/geoipprocessor/geoip_processor_metrics.go @@ -0,0 +1,87 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package geoipprocessor // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor" + +import ( + "context" + + "go.opentelemetry.io/collector/pdata/pmetric" +) + +func (g *geoIPProcessor) processMetrics(ctx context.Context, ms pmetric.Metrics) (pmetric.Metrics, error) { + rm := ms.ResourceMetrics() + for i := 0; i < rm.Len(); i++ { + switch g.cfg.Context { + case resource: + err := g.processAttributes(ctx, rm.At(i).Resource().Attributes()) + if err != nil { + return ms, err + } + case record: + for j := 0; j < rm.At(i).ScopeMetrics().Len(); j++ { + for k := 0; k < rm.At(i).ScopeMetrics().At(j).Metrics().Len(); k++ { + err := g.processMetricAttributes(ctx, rm.At(i).ScopeMetrics().At(j).Metrics().At(k)) + if err != nil { + return ms, err + } + } + } + default: + return ms, errUnspecifiedSource + } + } + return ms, nil +} + +func (g *geoIPProcessor) processMetricAttributes(ctx context.Context, m pmetric.Metric) error { + // This is a lot of repeated code, but since there is no single parent superclass + // between metric data types, we can't use polymorphism. + //exhaustive:enforce + + switch m.Type() { + case pmetric.MetricTypeGauge: + dps := m.Gauge().DataPoints() + for i := 0; i < dps.Len(); i++ { + err := g.processAttributes(ctx, dps.At(i).Attributes()) + if err != nil { + return err + } + } + case pmetric.MetricTypeSum: + dps := m.Sum().DataPoints() + for i := 0; i < dps.Len(); i++ { + err := g.processAttributes(ctx, dps.At(i).Attributes()) + if err != nil { + return err + } + } + case pmetric.MetricTypeHistogram: + dps := m.Histogram().DataPoints() + for i := 0; i < dps.Len(); i++ { + err := g.processAttributes(ctx, dps.At(i).Attributes()) + if err != nil { + return err + } + } + case pmetric.MetricTypeExponentialHistogram: + dps := m.ExponentialHistogram().DataPoints() + for i := 0; i < dps.Len(); i++ { + err := g.processAttributes(ctx, dps.At(i).Attributes()) + if err != nil { + return err + } + } + case pmetric.MetricTypeSummary: + dps := m.Summary().DataPoints() + for i := 0; i < dps.Len(); i++ { + err := g.processAttributes(ctx, dps.At(i).Attributes()) + if err != nil { + return err + } + } + case pmetric.MetricTypeEmpty: + } + + return nil +} diff --git a/processor/geoipprocessor/geoip_processor_test.go b/processor/geoipprocessor/geoip_processor_test.go new file mode 100644 index 000000000000..f0498b7150f8 --- /dev/null +++ b/processor/geoipprocessor/geoip_processor_test.go @@ -0,0 +1,233 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package geoipprocessor + +import ( + "context" + "net" + "path/filepath" + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/consumer/consumertest" + "go.opentelemetry.io/collector/processor" + "go.opentelemetry.io/collector/processor/processortest" + "go.opentelemetry.io/otel/attribute" + semconv "go.opentelemetry.io/otel/semconv/v1.21.0" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/plogtest" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/pmetrictest" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/ptracetest" + conventions "github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor/internal/convention" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor/internal/provider" +) + +type providerConfigMock struct { + ValidateF func() error +} + +type providerFactoryMock struct { + CreateDefaultConfigF func() provider.Config + CreateGeoIPProviderF func(context.Context, processor.Settings, provider.Config) (provider.GeoIPProvider, error) +} + +type providerMock struct { + LocationF func(context.Context, net.IP) (attribute.Set, error) +} + +var ( + _ provider.GeoIPProvider = (*providerMock)(nil) + _ provider.GeoIPProvider = (*providerMock)(nil) + _ provider.GeoIPProviderFactory = (*providerFactoryMock)(nil) +) + +func (cm *providerConfigMock) Validate() error { + return cm.ValidateF() +} + +func (fm *providerFactoryMock) CreateDefaultConfig() provider.Config { + return fm.CreateDefaultConfigF() +} + +func (fm *providerFactoryMock) CreateGeoIPProvider(ctx context.Context, settings processor.Settings, cfg provider.Config) (provider.GeoIPProvider, error) { + return fm.CreateGeoIPProviderF(ctx, settings, cfg) +} + +func (pm *providerMock) Location(ctx context.Context, ip net.IP) (attribute.Set, error) { + return pm.LocationF(ctx, ip) +} + +var baseMockProvider = providerMock{ + LocationF: func(context.Context, net.IP) (attribute.Set, error) { + return attribute.Set{}, nil + }, +} + +var baseMockFactory = providerFactoryMock{ + CreateDefaultConfigF: func() provider.Config { + return &providerConfigMock{ValidateF: func() error { return nil }} + }, + CreateGeoIPProviderF: func(context.Context, processor.Settings, provider.Config) (provider.GeoIPProvider, error) { + return &baseMockProvider, nil + }, +} + +var baseProviderMock = providerMock{ + LocationF: func(context.Context, net.IP) (attribute.Set, error) { + return attribute.Set{}, nil + }, +} + +var testCases = []struct { + name string + goldenDir string + context ContextID + lookupAttributes []attribute.Key +}{ + { + name: "default source.address attribute, not found", + goldenDir: "no_source_address", + context: resource, + lookupAttributes: defaultResourceAttributes, + }, + { + name: "default source.address attribute", + goldenDir: "source_address", + context: resource, + lookupAttributes: defaultResourceAttributes, + }, + { + name: "default source.address attribute no geo metadata found by providers", + goldenDir: "source_address_geo_not_found", + context: resource, + lookupAttributes: defaultResourceAttributes, + }, + { + name: "default source.ip attribute with an unspecified IP address should be skipped", + goldenDir: "unspecified_address", + context: resource, + lookupAttributes: defaultResourceAttributes, + }, + { + name: "custom source attributes", + goldenDir: "custom_sources", + context: resource, + lookupAttributes: []attribute.Key{"ip", "host.ip"}, + }, + { + name: "do not add resource attributes with an invalid ip", + goldenDir: "invalid_address", + context: resource, + lookupAttributes: defaultResourceAttributes, + }, + { + name: "source address located in inner attributes", + goldenDir: "attribute_source_address", + context: record, + lookupAttributes: defaultResourceAttributes, + }, +} + +func compareAllSignals(cfg component.Config, goldenDir string) func(t *testing.T) { + return func(t *testing.T) { + dir := filepath.Join("testdata", goldenDir) + factory := NewFactory() + + // compare metrics + nextMetrics := new(consumertest.MetricsSink) + metricsProcessor, err := factory.CreateMetrics(context.Background(), processortest.NewNopSettings(), cfg, nextMetrics) + require.NoError(t, err) + + inputMetrics, err := golden.ReadMetrics(filepath.Join(dir, "input-metrics.yaml")) + require.NoError(t, err) + + expectedMetrics, err := golden.ReadMetrics(filepath.Join(dir, "output-metrics.yaml")) + require.NoError(t, err) + + err = metricsProcessor.ConsumeMetrics(context.Background(), inputMetrics) + require.NoError(t, err) + + actualMetrics := nextMetrics.AllMetrics() + require.Len(t, actualMetrics, 1) + // golden.WriteMetrics(t, filepath.Join(dir, "output-metrics.yaml"), actualMetrics[0]) + require.NoError(t, pmetrictest.CompareMetrics(expectedMetrics, actualMetrics[0])) + + // compare traces + nextTraces := new(consumertest.TracesSink) + tracesProcessor, err := factory.CreateTraces(context.Background(), processortest.NewNopSettings(), cfg, nextTraces) + require.NoError(t, err) + + inputTraces, err := golden.ReadTraces(filepath.Join(dir, "input-traces.yaml")) + require.NoError(t, err) + + expectedTraces, err := golden.ReadTraces(filepath.Join(dir, "output-traces.yaml")) + require.NoError(t, err) + + err = tracesProcessor.ConsumeTraces(context.Background(), inputTraces) + require.NoError(t, err) + + actualTraces := nextTraces.AllTraces() + require.Len(t, actualTraces, 1) + // golden.WriteTraces(t, filepath.Join(dir, "output-traces.yaml"), actualTraces[0]) + require.NoError(t, ptracetest.CompareTraces(expectedTraces, actualTraces[0])) + + // compare logs + nextLogs := new(consumertest.LogsSink) + logsProcessor, err := factory.CreateLogs(context.Background(), processortest.NewNopSettings(), cfg, nextLogs) + require.NoError(t, err) + + inputLogs, err := golden.ReadLogs(filepath.Join(dir, "input-logs.yaml")) + require.NoError(t, err) + + err = logsProcessor.ConsumeLogs(context.Background(), inputLogs) + require.NoError(t, err) + + expectedLogs, err := golden.ReadLogs(filepath.Join(dir, "output-logs.yaml")) + require.NoError(t, err) + + actualLogs := nextLogs.AllLogs() + require.Len(t, actualLogs, 1) + // golden.WriteLogs(t, filepath.Join(dir, "output-logs.yaml"), actualLogs[0]) + require.NoError(t, plogtest.CompareLogs(expectedLogs, actualLogs[0])) + } +} + +func TestProcessor(t *testing.T) { + t.Parallel() + + baseMockFactory.CreateGeoIPProviderF = func(context.Context, processor.Settings, provider.Config) (provider.GeoIPProvider, error) { + return &baseProviderMock, nil + } + + baseProviderMock.LocationF = func(_ context.Context, sourceIP net.IP) (attribute.Set, error) { + if sourceIP.Equal(net.IPv4(1, 2, 3, 4)) { + return attribute.NewSet([]attribute.KeyValue{ + semconv.SourceAddress("1.2.3.4"), + attribute.String(conventions.AttributeGeoCityName, "Boxford"), + attribute.String(conventions.AttributeGeoContinentCode, "EU"), + attribute.String(conventions.AttributeGeoContinentName, "Europe"), + attribute.String(conventions.AttributeGeoCountryIsoCode, "GB"), + attribute.String(conventions.AttributeGeoCountryName, "United Kingdom"), + attribute.String(conventions.AttributeGeoTimezone, "Europe/London"), + attribute.String(conventions.AttributeGeoRegionIsoCode, "WBK"), + attribute.String(conventions.AttributeGeoRegionName, "West Berkshire"), + attribute.String(conventions.AttributeGeoPostalCode, "OX1"), + attribute.Float64(conventions.AttributeGeoLocationLat, 1234), + attribute.Float64(conventions.AttributeGeoLocationLon, 5678), + }...), nil + } + return attribute.Set{}, provider.ErrNoMetadataFound + } + const providerKey string = "mock" + providerFactories[providerKey] = &baseMockFactory + + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + cfg := &Config{Context: tt.context, Providers: map[string]provider.Config{providerKey: &providerConfigMock{}}} + compareAllSignals(cfg, tt.goldenDir)(t) + }) + } +} diff --git a/processor/geoipprocessor/geoip_processor_traces.go b/processor/geoipprocessor/geoip_processor_traces.go new file mode 100644 index 000000000000..590b3805cdf1 --- /dev/null +++ b/processor/geoipprocessor/geoip_processor_traces.go @@ -0,0 +1,35 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package geoipprocessor // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor" + +import ( + "context" + + "go.opentelemetry.io/collector/pdata/ptrace" +) + +func (g *geoIPProcessor) processTraces(ctx context.Context, ts ptrace.Traces) (ptrace.Traces, error) { + rt := ts.ResourceSpans() + for i := 0; i < rt.Len(); i++ { + switch g.cfg.Context { + case resource: + err := g.processAttributes(ctx, rt.At(i).Resource().Attributes()) + if err != nil { + return ts, err + } + case record: + for j := 0; j < rt.At(i).ScopeSpans().Len(); j++ { + for k := 0; k < rt.At(i).ScopeSpans().At(j).Spans().Len(); k++ { + err := g.processAttributes(ctx, rt.At(i).ScopeSpans().At(j).Spans().At(k).Attributes()) + if err != nil { + return ts, err + } + } + } + default: + return ts, errUnspecifiedSource + } + } + return ts, nil +} diff --git a/processor/geoipprocessor/go.mod b/processor/geoipprocessor/go.mod index abd47d534811..d4a678aa875d 100644 --- a/processor/geoipprocessor/go.mod +++ b/processor/geoipprocessor/go.mod @@ -1,55 +1,135 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor -go 1.21.0 +go 1.22.0 require ( - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/processor v0.102.0 + github.com/maxmind/MaxMind-DB v0.0.0-20240605211347-880f6b4b5eb6 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.116.0 + github.com/oschwald/geoip2-golang v1.11.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/otelcol/otelcoltest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/processor v0.116.0 + go.opentelemetry.io/collector/processor/processortest v0.116.0 + go.opentelemetry.io/otel v1.32.0 go.uber.org/goleak v1.3.0 + go.uber.org/zap v1.27.0 ) +require go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + require ( github.com/beorn7/perks v1.0.1 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/ebitengine/purego v0.8.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect + github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/maxmind/mmdbwriter v1.0.0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 // indirect + github.com/oschwald/maxminddb-golang v1.13.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect + github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/prometheus/client_golang v1.20.5 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/pdata/testdata v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/metric v1.27.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - go.opentelemetry.io/otel/trace v1.27.0 // indirect + github.com/prometheus/common v0.61.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/shirou/gopsutil/v4 v4.24.11 // indirect + github.com/spf13/cobra v1.8.1 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/collector/component/componentstatus v0.116.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0 // indirect + go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0 // indirect + go.opentelemetry.io/collector/confmap/provider/httpprovider v1.22.0 // indirect + go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.22.0 // indirect + go.opentelemetry.io/collector/connector v0.116.0 // indirect + go.opentelemetry.io/collector/connector/connectortest v0.116.0 // indirect + go.opentelemetry.io/collector/connector/xconnector v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/exporter v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/exportertest v0.116.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0 // indirect + go.opentelemetry.io/collector/extension/extensiontest v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/otelcol v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/testdata v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 // indirect + go.opentelemetry.io/collector/processor/xprocessor v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect + go.opentelemetry.io/collector/semconv v0.116.0 // indirect + go.opentelemetry.io/collector/service v0.116.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.6.0 // indirect + go.opentelemetry.io/contrib/config v0.10.0 // indirect + go.opentelemetry.io/contrib/propagators/b3 v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.54.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 // indirect + go.opentelemetry.io/otel/log v0.8.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.7.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.27.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + go4.org/netipx v0.0.0-20230824141953-6213f710f925 // indirect + golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + gonum.org/v1/gonum v0.15.1 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../../pkg/pdatautil + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest => ../../pkg/pdatatest + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden => ../../pkg/golden diff --git a/processor/geoipprocessor/go.sum b/processor/geoipprocessor/go.sum index 394c41a60040..1cb9c103c99a 100644 --- a/processor/geoipprocessor/go.sum +++ b/processor/geoipprocessor/go.sum @@ -1,38 +1,70 @@ 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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/BE= +github.com/ebitengine/purego v0.8.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/maxmind/MaxMind-DB v0.0.0-20240605211347-880f6b4b5eb6 h1:q3FNO1NzvowWXqFEam6FwbsgGeTXBL5FOxjMT45x2Ls= +github.com/maxmind/MaxMind-DB v0.0.0-20240605211347-880f6b4b5eb6/go.mod h1:8uyvr1CxDqu0x6NrZZ7CAs6nR0G/wSY8K+Q7uQlNwK4= +github.com/maxmind/mmdbwriter v1.0.0 h1:bieL4P6yaYaHvbtLSwnKtEvScUKKD6jcKaLiTM3WSMw= +github.com/maxmind/mmdbwriter v1.0.0/go.mod h1:noBMCUtyN5PUQ4H8ikkOvGSHhzhLok51fON2hcrpKj8= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= @@ -42,81 +74,234 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/oschwald/geoip2-golang v1.11.0 h1:hNENhCn1Uyzhf9PTmquXENiWS6AlxAEnBII6r8krA3w= +github.com/oschwald/geoip2-golang v1.11.0/go.mod h1:P9zG+54KPEFOliZ29i7SeYZ/GM6tfEL+rgSn03hYuUo= +github.com/oschwald/maxminddb-golang v1.13.0 h1:R8xBorY71s84yO06NgTmQvqvTvlS/bnYZrrWX1MElnU= +github.com/oschwald/maxminddb-golang v1.13.0/go.mod h1:BU0z8BfFVhi1LQaonTwwGQlsHUEu9pWNdMfmq4ztm0o= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/prometheus/common v0.61.0 h1:3gv/GThfX0cV2lpO7gkTUwZru38mxevy90Bj8YFSRQQ= +github.com/prometheus/common v0.61.0/go.mod h1:zr29OCN/2BsJRaFwG8QOBr41D6kkchKbpeNH7pAjb/s= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/shirou/gopsutil/v4 v4.24.11 h1:WaU9xqGFKvFfsUv94SXcUPD7rCkU0vr/asVdQOBZNj8= +github.com/shirou/gopsutil/v4 v4.24.11/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/processor v0.102.0 h1:JsjTlpBRmoSYxcu3cAbKBchOmL6aNUxLa03ZkWIqZr8= -go.opentelemetry.io/collector/processor v0.102.0/go.mod h1:IaCSDcfy75uQTaOM+LgR1bMf/bUw2eFfzn20uvWYfLQ= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/collector v0.116.0 h1:Dscd6Nsnc7hjFQosO0SofcPQsXRfcj5N5PjQAslnmj4= +go.opentelemetry.io/collector v0.116.0/go.mod h1:Ug2hpW0SINPmJAGVEALRlux78NTZc3YXSuh5/Q/hFrA= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= +go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0 h1:AdHaQo/GSSRLJvEFLCMHo02r+u6Ed8j0/MNz7u3noug= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0/go.mod h1:InKYEGFdkwz3H2q648kT6rMCFBhPvevIW9ZbWIY5QR4= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0 h1:upFhnU8EyPp0WMR53mJIdx+UR2EGFOr+ppYKzUCY/Vg= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0/go.mod h1:FhjMWU5nf3IctX27lVZomM5SKMyRywShRsA4/rHoBe8= +go.opentelemetry.io/collector/confmap/provider/httpprovider v1.22.0 h1:jKLicfZRiA+G/sgso26aM6Dmmva4Dx9Txk2R58+R3e8= +go.opentelemetry.io/collector/confmap/provider/httpprovider v1.22.0/go.mod h1:nZhEGDufHuZAaeVyFVz15IluXwrnQRCp+U/w7j8Lx9Y= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.22.0 h1:dkiNwLxBqeNDN5fIwtvr2GoA0I2xZB2SEdQ9ceBbJVs= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.22.0/go.mod h1:P9SxKZvim1C3K1R2j3gI+Qb4/l9MffX2sY5f9ajsk7Y= +go.opentelemetry.io/collector/connector v0.116.0 h1:0Pz8RAXH1swLeA1fiyGGQWdv0Kemz4mbq+jnmd1TACE= +go.opentelemetry.io/collector/connector v0.116.0/go.mod h1:VQiZ2yW9KhZuF0yjDbvlgrAxm7+o8KQoxHxurQWLjKU= +go.opentelemetry.io/collector/connector/connectortest v0.116.0 h1:MdttvjqdZmp0ewW5IPCEtzzYmCqxrQxsjJ5m6gMVjzA= +go.opentelemetry.io/collector/connector/connectortest v0.116.0/go.mod h1:ko7aPyvAVf6SvRhWGZdPXSyk+7zPmsSCcMq0gYPMMIQ= +go.opentelemetry.io/collector/connector/xconnector v0.116.0 h1:fFJzrRco0g7HMkhnQ+ehlvicFf58vzsCLXnfuHyQM8w= +go.opentelemetry.io/collector/connector/xconnector v0.116.0/go.mod h1:m9oCk32zX6wDciYBpy+qMQkWKtOxb0gAkEUm8+trflY= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= +go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= +go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= +go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0 h1:bXDgoiDiwFfrO5S6q1Wpe0su303CW4Qxthoy4CxG6eg= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0/go.mod h1:uFZlAPxk2+s6zk1W+u22DgxxSDugWy0QaY5kQzjNy7Q= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= +go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= +go.opentelemetry.io/collector/extension/zpagesextension v0.116.0 h1:D0VY/ESPwkREfMaqJleGVTiCYoCs3MDipU93ywaIn68= +go.opentelemetry.io/collector/extension/zpagesextension v0.116.0/go.mod h1:MqkQSYKarMrjVSyGrAes1FBcsW6HDDPj/ouvcDvSjfk= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 h1:KKFb3u8iLk4V5GYz7eVpw8QgEdob5koX6GNEbaoDQJY= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0/go.mod h1:YyWHUWeSnRmy2CF7kPHpwJ6qkVjufbLZ8PYuY0Ph0o8= +go.opentelemetry.io/collector/otelcol v0.116.0 h1:8NoPEY2uAemwNzUcMxiZuuI8w/Ff+0p1DXXk6NVEGlk= +go.opentelemetry.io/collector/otelcol v0.116.0/go.mod h1:c/EhsBdHmC44SxhWMi7pTlYB+I6GBSJNBsj9NCwXMxM= +go.opentelemetry.io/collector/otelcol/otelcoltest v0.116.0 h1:ZNg2kFLKnreaGSMfbr74k1yEbHLxG4ZbVvSIr+XleXo= +go.opentelemetry.io/collector/otelcol/otelcoltest v0.116.0/go.mod h1:TruQJSWWiDRlSYZTcLSE0GeECJZALDw8X8dvoYXUJ+A= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 h1:PFNy+Il/kqPdPL9rhG+1kG63Aauya+FhBKGXoB6ivxU= +go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0/go.mod h1:bVn9V4TGyeXi58/JDkeXCuKtc+V+qcOoTl8hNpV0qa8= +go.opentelemetry.io/collector/processor v0.116.0 h1:Kyu4tPzTdWNHtZjcxvI/bGNAgyv8L8Kem2r/Mk4IDAw= +go.opentelemetry.io/collector/processor v0.116.0/go.mod h1:+/Ugy48RAxlZEXmN2cw51W8t5wdHS9No+GAoP+moskk= +go.opentelemetry.io/collector/processor/processortest v0.116.0 h1:+IqNEVEE0E2MsO2g7+Y/9dz35sDuvAXRXrLts9NdXrA= +go.opentelemetry.io/collector/processor/processortest v0.116.0/go.mod h1:DLaQDBxzgeeaUO0ULMn/efos9PmHZkmYCHuxwCsiVHI= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0 h1:iin/UwuWvSLB7ZNfINFUYbZ5lxIi1NjZ2brkyyFdiRA= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0/go.mod h1:cnA43/XpKDbaOmd8buqKp/LGJ2l/OoCqbR//u5DMfn8= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/collector/service v0.116.0 h1:1rFmax3ILOlQq4bW//0VKRcG/HmN2rxrgfTybn6bisU= +go.opentelemetry.io/collector/service v0.116.0/go.mod h1:CzQzj72mWr5arag+q8uUWGRuUkenNo5Gw9oA97SFZ78= +go.opentelemetry.io/contrib/bridges/otelzap v0.6.0 h1:j8icMXyyqNf6HGuwlYhniPnVsbJIq7n+WirDu3VAJdQ= +go.opentelemetry.io/contrib/bridges/otelzap v0.6.0/go.mod h1:evIOZpl+kAlU5IsaYX2Siw+IbpacAZvXemVsgt70uvw= +go.opentelemetry.io/contrib/config v0.10.0 h1:2JknAzMaYjxrHkTnZh3eOme/Y2P5eHE2SWfhfV6Xd6c= +go.opentelemetry.io/contrib/config v0.10.0/go.mod h1:aND2M6/KfNkntI5cyvHriR/zvZgPf8j9yETdSmvpfmc= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/contrib/propagators/b3 v1.31.0 h1:PQPXYscmwbCp76QDvO4hMngF2j8Bx/OTV86laEl8uqo= +go.opentelemetry.io/contrib/propagators/b3 v1.31.0/go.mod h1:jbqfV8wDdqSDrAYxVpXQnpM0XFMq2FtDesblJ7blOwQ= +go.opentelemetry.io/contrib/zpages v0.56.0 h1:W7vP6s3juzL5KiHpr41zLNmsJ0QAZudYu8ay0zGAoko= +go.opentelemetry.io/contrib/zpages v0.56.0/go.mod h1:IxPRP4TYHw9jLeaEOSDIiA9zmyJNZNO6sbW55iMvSXs= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 h1:mMOmtYie9Fx6TSVzw4W+NTpvoaS1JWWga37oI1a/4qQ= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0/go.mod h1:yy7nDsMMBUkD+jeekJ36ur5f3jJIrmCwUrY67VFhNpA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 h1:j7ZSD+5yn+lo3sGV69nW04rRR0jhYnBwjuX3r0HvnK0= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0/go.mod h1:WXbYJTUaZXAbYd8lbgGuvih0yuCfOFC5RJoYnoLcGz8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 h1:t/Qur3vKSkUCcDVaSumWF2PKHt85pc7fRvFuoVT8qFU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0/go.mod h1:Rl61tySSdcOJWoEgYZVtmnKdA0GeKrSqkHC1t+91CH8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 h1:K0XaT3DwHAcV4nKLzcQvwAgSyisUghWoY20I7huthMk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0/go.mod h1:B5Ki776z/MBnVha1Nzwp5arlzBbE3+1jk+pGmaP5HME= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy03iVTXP6ffeN2iXrxfGsZGCjVx0/4KlizjyBwU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0/go.mod h1:TMu73/k1CP8nBUpDLc71Wj/Kf7ZS9FK5b53VapRsP9o= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 h1:lUsI2TYsQw2r1IASwoROaCnjdj2cvC2+Jbxvk6nHnWU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0/go.mod h1:2HpZxxQurfGxJlJDblybejHB6RX6pmExPNe517hREw4= +go.opentelemetry.io/otel/exporters/prometheus v0.54.0 h1:rFwzp68QMgtzu9PgP3jm9XaMICI6TsofWWPcBDKwlsU= +go.opentelemetry.io/otel/exporters/prometheus v0.54.0/go.mod h1:QyjcV9qDP6VeK5qPyKETvNjmaaEc7+gqjh4SS0ZYzDU= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 h1:TwmL3O3fRR80m8EshBrd8YydEZMcUCsZXzOUlnFohwM= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0/go.mod h1:tH98dDv5KPmPThswbXA0fr0Lwfs+OhK8HgaCo7PjRrk= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 h1:SZmDnHcgp3zwlPBS2JX2urGYe/jBKEIT6ZedHRUyCz8= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0/go.mod h1:fdWW0HtZJ7+jNpTKUR0GpMEDP69nR8YBJQxNiVCE3jk= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 h1:UGZ1QwZWY67Z6BmckTU+9Rxn04m2bD3gD6Mk0OIOCPk= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0/go.mod h1:fcwWuDuaObkkChiDlhEpSq9+X1C0omv+s5mBtToAQ64= +go.opentelemetry.io/otel/log v0.8.0 h1:egZ8vV5atrUWUbnSsHn6vB8R21G2wrKqNiDt3iWertk= +go.opentelemetry.io/otel/log v0.8.0/go.mod h1:M9qvDdUTRCopJcGRKg57+JSQ9LgLBrwwfC32epk5NX8= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/log v0.7.0 h1:dXkeI2S0MLc5g0/AwxTZv6EUEjctiH8aG14Am56NTmQ= +go.opentelemetry.io/otel/sdk/log v0.7.0/go.mod h1:oIRXpW+WD6M8BuGj5rtS0aRu/86cbDV/dAfNaZBIjYM= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go4.org/netipx v0.0.0-20230824141953-6213f710f925 h1:eeQDDVKFkx0g4Hyy8pHgmZaK0EqB4SD6rvKbUdN3ziQ= +go4.org/netipx v0.0.0-20230824141953-6213f710f925/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -125,12 +310,16 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= +gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/processor/geoipprocessor/integration_test.go b/processor/geoipprocessor/integration_test.go new file mode 100644 index 000000000000..57892c2a35a8 --- /dev/null +++ b/processor/geoipprocessor/integration_test.go @@ -0,0 +1,30 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package geoipprocessor + +import ( + "os" + "testing" + + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor/internal/provider" + maxmind "github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor/internal/provider/maxmindprovider" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor/internal/provider/maxmindprovider/testdata" +) + +func TestProcessorWithMaxMind(t *testing.T) { + tmpDBfiles := testdata.GenerateLocalDB(t, "./internal/provider/maxmindprovider/testdata/") + defer os.RemoveAll(tmpDBfiles) + + maxmindConfig := maxmind.Config{ + DatabasePath: tmpDBfiles + "/" + "GeoLite2-City-Test.mmdb", + } + + for _, tt := range testCases { + t.Run("maxmind_"+tt.name, func(t *testing.T) { + cfg := &Config{Context: tt.context, Providers: map[string]provider.Config{"maxmind": &maxmindConfig}} + + compareAllSignals(cfg, tt.goldenDir)(t) + }) + } +} diff --git a/processor/geoipprocessor/internal/convention/attributes.go b/processor/geoipprocessor/internal/convention/attributes.go new file mode 100644 index 000000000000..b2ae1be866e5 --- /dev/null +++ b/processor/geoipprocessor/internal/convention/attributes.go @@ -0,0 +1,40 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package conventions // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor/internal/convention" + +// TODO: replace for semconv once https://github.com/open-telemetry/semantic-conventions/issues/1033 is closed. +const ( + // AttributeGeoCityName represents the attribute name for the city name in geographical data. + AttributeGeoCityName = "geo.city_name" + + // AttributeGeoPostalCode represents the attribute name for the city postal code. + AttributeGeoPostalCode = "geo.postal_code" + + // AttributeGeoCountryName represents the attribute name for the country name in geographical data. + AttributeGeoCountryName = "geo.country_name" + + // AttributeGeoCountryIsoCode represents the attribute name for the Two-letter ISO Country Code. + AttributeGeoCountryIsoCode = "geo.country_iso_code" + + // AttributeGeoContinentName represents the attribute name for the continent name in geographical data. + AttributeGeoContinentName = "geo.continent_name" + + // AttributeGeoContinentIsoCode represents the attribute name for the Two-letter Continent Code. + AttributeGeoContinentCode = "geo.continent_code" + + // AttributeGeoRegionName represents the attribute name for the region name in geographical data. + AttributeGeoRegionName = "geo.region_name" + + // AttributeGeoRegionIsoCode represents the attribute name for the Two-letter ISO Region Code. + AttributeGeoRegionIsoCode = "geo.region_iso_code" + + // AttributeGeoTimezone represents the attribute name for the timezone. + AttributeGeoTimezone = "geo.timezone" + + // AttributeGeoLocationLat represents the attribute name for the latitude. + AttributeGeoLocationLat = "geo.location.lat" + + // AttributeGeoLocationLon represents the attribute name for the longitude. + AttributeGeoLocationLon = "geo.location.lon" +) diff --git a/processor/geoipprocessor/internal/metadata/generated_status.go b/processor/geoipprocessor/internal/metadata/generated_status.go index 67aa25ecf0b0..03e0704bc9b1 100644 --- a/processor/geoipprocessor/internal/metadata/generated_status.go +++ b/processor/geoipprocessor/internal/metadata/generated_status.go @@ -7,11 +7,12 @@ import ( ) var ( - Type = component.MustNewType("geoip") + Type = component.MustNewType("geoip") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor" ) const ( - TracesStability = component.StabilityLevelDevelopment - MetricsStability = component.StabilityLevelDevelopment - LogsStability = component.StabilityLevelDevelopment + TracesStability = component.StabilityLevelAlpha + MetricsStability = component.StabilityLevelAlpha + LogsStability = component.StabilityLevelAlpha ) diff --git a/processor/geoipprocessor/internal/provider/geoipprovider.go b/processor/geoipprocessor/internal/provider/geoipprovider.go new file mode 100644 index 000000000000..e0d5cb41f0d5 --- /dev/null +++ b/processor/geoipprocessor/internal/provider/geoipprovider.go @@ -0,0 +1,37 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package provider // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor/internal/provider" + +import ( + "context" + "errors" + "net" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/processor" + "go.opentelemetry.io/otel/attribute" +) + +// ErrNoMetadataFound error should be returned when a provider could not find the corresponding IP metadata +var ErrNoMetadataFound = errors.New("no geo IP metadata found") + +// Config is the configuration of a GeoIPProvider. +type Config interface { + component.ConfigValidator +} + +// GeoIPProvider defines methods for obtaining the geographical location based on the provided IP address. +type GeoIPProvider interface { + // Location returns a set of attributes representing the geographical location for the given IP address. It requires a context for managing request lifetime. + Location(context.Context, net.IP) (attribute.Set, error) +} + +// GeoIPProviderFactory can create GeoIPProvider instances. +type GeoIPProviderFactory interface { + // CreateDefaultConfig creates the default configuration for the GeoIPProvider. + CreateDefaultConfig() Config + + // CreateGeoIPProvider creates a provider based on this config. Processor's settings are provided as an argument to initialize the logger if needed. + CreateGeoIPProvider(ctx context.Context, settings processor.Settings, cfg Config) (GeoIPProvider, error) +} diff --git a/processor/geoipprocessor/internal/provider/maxmindprovider/README.md b/processor/geoipprocessor/internal/provider/maxmindprovider/README.md new file mode 100644 index 000000000000..70857fe0cb81 --- /dev/null +++ b/processor/geoipprocessor/internal/provider/maxmindprovider/README.md @@ -0,0 +1,14 @@ +# MaxMind GeoIP Provider + +This package provides a MaxMind GeoIP provider for use with the OpenTelemetry GeoIP processor. It leverages the [geoip2-golang package](https://github.com/oschwald/geoip2-golang) to query geographical information associated with IP addresses from MaxMind databases. See recommended clients: https://dev.maxmind.com/geoip/docs/databases#api-clients + +# Features + +- Supports GeoIP2-City and GeoLite2-City database types. +- Retrieves and returns geographical metadata for a given IP address. The generated attributes follow the internal [Geo conventions](../../convention/attributes.go). + +## Configuration + +The following configuration must be provided: + +- `database_path`: local file path to a GeoIP2-City or GeoLite2-City database. diff --git a/processor/geoipprocessor/internal/provider/maxmindprovider/config.go b/processor/geoipprocessor/internal/provider/maxmindprovider/config.go new file mode 100644 index 000000000000..88c6666a5c64 --- /dev/null +++ b/processor/geoipprocessor/internal/provider/maxmindprovider/config.go @@ -0,0 +1,27 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package maxmind // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor/internal/provider/maxmindprovider" + +import ( + "errors" + + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor/internal/provider" +) + +// Config defines configuration for MaxMind provider. +type Config struct { + // DatabasePath section allows specifying a local GeoIP database + // file to retrieve the geographical metadata from. + DatabasePath string `mapstructure:"database_path"` +} + +var _ provider.Config = (*Config)(nil) + +// Validate implements provider.Config. +func (c *Config) Validate() error { + if c.DatabasePath == "" { + return errors.New("a local geoIP database path must be provided") + } + return nil +} diff --git a/processor/geoipprocessor/internal/provider/maxmindprovider/factory.go b/processor/geoipprocessor/internal/provider/maxmindprovider/factory.go new file mode 100644 index 000000000000..061dee9cd1d0 --- /dev/null +++ b/processor/geoipprocessor/internal/provider/maxmindprovider/factory.go @@ -0,0 +1,33 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package maxmind // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor/internal/provider/maxmindprovider" + +import ( + "context" + + "go.opentelemetry.io/collector/processor" + + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor/internal/provider" +) + +const ( + // TypeStr the value of "type" key in configuration. + TypeStr = "maxmind" +) + +// Factory is the Factory for the MaxMind GeoIP provider. +type Factory struct{} + +var _ provider.GeoIPProviderFactory = (*Factory)(nil) + +// CreateDefaultConfig creates the default configuration for the Provider. +func (f *Factory) CreateDefaultConfig() provider.Config { + return &Config{} +} + +// CreateGeoIPProvider creates a provider based on this config. +func (f *Factory) CreateGeoIPProvider(_ context.Context, _ processor.Settings, cfg provider.Config) (provider.GeoIPProvider, error) { + maxMindConfig := cfg.(*Config) + return newMaxMindProvider(maxMindConfig) +} diff --git a/processor/geoipprocessor/internal/provider/maxmindprovider/factory_test.go b/processor/geoipprocessor/internal/provider/maxmindprovider/factory_test.go new file mode 100644 index 000000000000..fcc6fa48d18c --- /dev/null +++ b/processor/geoipprocessor/internal/provider/maxmindprovider/factory_test.go @@ -0,0 +1,30 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package maxmind + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + "go.opentelemetry.io/collector/processor/processortest" +) + +func TestCreateDefaultConfig(t *testing.T) { + factory := &Factory{} + cfg := factory.CreateDefaultConfig() + assert.IsType(t, &Config{}, cfg) +} + +func TestCreateProvider(t *testing.T) { + factory := &Factory{} + cfg := &Config{ + DatabasePath: "", + } + + provider, err := factory.CreateGeoIPProvider(context.Background(), processortest.NewNopSettings(), cfg) + + assert.ErrorContains(t, err, "could not open geoip database") + assert.Nil(t, provider) +} diff --git a/processor/geoipprocessor/internal/provider/maxmindprovider/provider.go b/processor/geoipprocessor/internal/provider/maxmindprovider/provider.go new file mode 100644 index 000000000000..f56b02fe4de0 --- /dev/null +++ b/processor/geoipprocessor/internal/provider/maxmindprovider/provider.go @@ -0,0 +1,102 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package maxmind // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor/internal/provider/maxmindprovider" + +import ( + "context" + "errors" + "fmt" + "net" + + "github.com/oschwald/geoip2-golang" + "go.opentelemetry.io/otel/attribute" + + conventions "github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor/internal/convention" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor/internal/provider" +) + +var ( + // defaultLanguageCode specifies English as the default Geolocation language code, see https://dev.maxmind.com/geoip/docs/web-services/responses#languages + defaultLanguageCode = "en" + geoIP2CityDBType = "GeoIP2-City" + geoLite2CityDBType = "GeoLite2-City" + + errUnsupportedDB = errors.New("unsupported geo IP database type") +) + +type maxMindProvider struct { + geoReader *geoip2.Reader + // language code to be used in name retrieval, e.g. "en" or "pt-BR" + langCode string +} + +var _ provider.GeoIPProvider = (*maxMindProvider)(nil) + +func newMaxMindProvider(cfg *Config) (*maxMindProvider, error) { + geoReader, err := geoip2.Open(cfg.DatabasePath) + if err != nil { + return nil, fmt.Errorf("could not open geoip database: %w", err) + } + + return &maxMindProvider{geoReader: geoReader, langCode: defaultLanguageCode}, nil +} + +// Location implements provider.GeoIPProvider for MaxMind. If a non City database type is used or no metadata is found in the database, an error will be returned. +func (g *maxMindProvider) Location(_ context.Context, ipAddress net.IP) (attribute.Set, error) { + switch g.geoReader.Metadata().DatabaseType { + case geoIP2CityDBType, geoLite2CityDBType: + attrs, err := g.cityAttributes(ipAddress) + if err != nil { + return attribute.Set{}, err + } else if len(*attrs) == 0 { + return attribute.Set{}, provider.ErrNoMetadataFound + } + return attribute.NewSet(*attrs...), nil + default: + return attribute.Set{}, fmt.Errorf("%w type: %s", errUnsupportedDB, g.geoReader.Metadata().DatabaseType) + } +} + +// cityAttributes returns a list of key-values containing geographical metadata associated to the provided IP. The key names are populated using the internal geo IP conventions package. If the an invalid or nil IP is provided, an error is returned. +func (g *maxMindProvider) cityAttributes(ipAddress net.IP) (*[]attribute.KeyValue, error) { + attributes := make([]attribute.KeyValue, 0, 11) + + city, err := g.geoReader.City(ipAddress) + if err != nil { + return nil, err + } + + // The exact set of top-level keys varies based on the particular GeoIP2 web service you are using. If a key maps to an undefined or empty value, it is not included in the JSON object. The following anonymous function appends the given key-value only if the value is not empty. + appendIfNotEmpty := func(keyName, value string) { + if value != "" { + attributes = append(attributes, attribute.String(keyName, value)) + } + } + + // city + appendIfNotEmpty(conventions.AttributeGeoCityName, city.City.Names[g.langCode]) + // country + appendIfNotEmpty(conventions.AttributeGeoCountryName, city.Country.Names[g.langCode]) + appendIfNotEmpty(conventions.AttributeGeoCountryIsoCode, city.Country.IsoCode) + // continent + appendIfNotEmpty(conventions.AttributeGeoContinentName, city.Continent.Names[g.langCode]) + appendIfNotEmpty(conventions.AttributeGeoContinentCode, city.Continent.Code) + // postal code + appendIfNotEmpty(conventions.AttributeGeoPostalCode, city.Postal.Code) + // region + if len(city.Subdivisions) > 0 { + // The most specific subdivision is located at the last array position, see https://github.com/maxmind/GeoIP2-java/blob/2fe4c65424fed2c3c2449e5530381b6452b0560f/src/main/java/com/maxmind/geoip2/model/AbstractCityResponse.java#L112 + mostSpecificSubdivision := city.Subdivisions[len(city.Subdivisions)-1] + appendIfNotEmpty(conventions.AttributeGeoRegionName, mostSpecificSubdivision.Names[g.langCode]) + appendIfNotEmpty(conventions.AttributeGeoRegionIsoCode, mostSpecificSubdivision.IsoCode) + } + + // location + appendIfNotEmpty(conventions.AttributeGeoTimezone, city.Location.TimeZone) + if city.Location.Latitude != 0 && city.Location.Longitude != 0 { + attributes = append(attributes, attribute.Float64(conventions.AttributeGeoLocationLat, city.Location.Latitude), attribute.Float64(conventions.AttributeGeoLocationLon, city.Location.Longitude)) + } + + return &attributes, err +} diff --git a/processor/geoipprocessor/internal/provider/maxmindprovider/provider_test.go b/processor/geoipprocessor/internal/provider/maxmindprovider/provider_test.go new file mode 100644 index 000000000000..34b7befe144c --- /dev/null +++ b/processor/geoipprocessor/internal/provider/maxmindprovider/provider_test.go @@ -0,0 +1,114 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package maxmind + +import ( + "context" + "net" + "os" + "runtime" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/otel/attribute" + + conventions "github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor/internal/convention" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/geoipprocessor/internal/provider/maxmindprovider/testdata" +) + +func TestInvalidNewProvider(t *testing.T) { + _, err := newMaxMindProvider(&Config{}) + expectedErrMsgSuffix := "no such file or directory" + if runtime.GOOS == "windows" { + expectedErrMsgSuffix = "The system cannot find the file specified." + } + require.ErrorContains(t, err, "could not open geoip database: open : "+expectedErrMsgSuffix) + + _, err = newMaxMindProvider(&Config{DatabasePath: "no valid path"}) + require.ErrorContains(t, err, "could not open geoip database: open no valid path: "+expectedErrMsgSuffix) +} + +// TestProviderLocation asserts that the MaxMind provider adds the geo location data given an IP. +func TestProviderLocation(t *testing.T) { + tmpDBfiles := testdata.GenerateLocalDB(t, "./testdata") + defer os.RemoveAll(tmpDBfiles) + + t.Parallel() + + tests := []struct { + name string + testDatabase string + sourceIP net.IP + expectedAttributes attribute.Set + expectedErrMsg string + }{ + { + name: "nil IP address", + testDatabase: "GeoIP2-City-Test.mmdb", + expectedErrMsg: "IP passed to Lookup cannot be nil", + }, + { + name: "unsupported database type", + sourceIP: net.IPv4(0, 0, 0, 0), + testDatabase: "GeoIP2-ISP-Test.mmdb", + expectedErrMsg: "unsupported geo IP database type type: GeoIP2-ISP", + }, + { + name: "no IP metadata in database", + sourceIP: net.IPv4(0, 0, 0, 0), + testDatabase: "GeoIP2-City-Test.mmdb", + expectedErrMsg: "no geo IP metadata found", + }, + { + name: "all attributes should be present for IPv4 using GeoLite2-City database", + sourceIP: net.IPv4(1, 2, 3, 4), + testDatabase: "GeoLite2-City-Test.mmdb", + expectedAttributes: attribute.NewSet([]attribute.KeyValue{ + attribute.String(conventions.AttributeGeoCityName, "Boxford"), + attribute.String(conventions.AttributeGeoContinentCode, "EU"), + attribute.String(conventions.AttributeGeoContinentName, "Europe"), + attribute.String(conventions.AttributeGeoCountryIsoCode, "GB"), + attribute.String(conventions.AttributeGeoCountryName, "United Kingdom"), + attribute.String(conventions.AttributeGeoTimezone, "Europe/London"), + attribute.String(conventions.AttributeGeoRegionIsoCode, "WBK"), + attribute.String(conventions.AttributeGeoRegionName, "West Berkshire"), + attribute.String(conventions.AttributeGeoPostalCode, "OX1"), + attribute.Float64(conventions.AttributeGeoLocationLat, 1234), + attribute.Float64(conventions.AttributeGeoLocationLon, 5678), + }...), + }, + { + name: "subset attributes for IPv6 IP using GeoIP2-City database", + sourceIP: net.ParseIP("2001:220::"), + testDatabase: "GeoIP2-City-Test.mmdb", + expectedAttributes: attribute.NewSet([]attribute.KeyValue{ + attribute.String(conventions.AttributeGeoContinentCode, "AS"), + attribute.String(conventions.AttributeGeoContinentName, "Asia"), + attribute.String(conventions.AttributeGeoCountryIsoCode, "KR"), + attribute.String(conventions.AttributeGeoCountryName, "South Korea"), + attribute.String(conventions.AttributeGeoTimezone, "Asia/Seoul"), + attribute.Float64(conventions.AttributeGeoLocationLat, 1), + attribute.Float64(conventions.AttributeGeoLocationLon, 1), + }...), + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // prepare provider + provider, err := newMaxMindProvider(&Config{DatabasePath: tmpDBfiles + "/" + tt.testDatabase}) + assert.NoError(t, err) + + // assert metrics + actualAttributes, err := provider.Location(context.Background(), tt.sourceIP) + if tt.expectedErrMsg != "" { + assert.EqualError(t, err, tt.expectedErrMsg) + return + } + + assert.True(t, tt.expectedAttributes.Equals(&actualAttributes)) + }) + } +} diff --git a/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-Anonymous-IP-Test.json b/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-Anonymous-IP-Test.json new file mode 100644 index 000000000000..93d51406d63f --- /dev/null +++ b/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-Anonymous-IP-Test.json @@ -0,0 +1 @@ +[{}] diff --git a/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-City-Test.json b/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-City-Test.json new file mode 100644 index 000000000000..79ae7a667dff --- /dev/null +++ b/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-City-Test.json @@ -0,0 +1,54 @@ +[ + { + "2001:220::/32" : { + "continent" : { + "code" : "AS", + "geoname_id" : 6255147, + "names" : { + "de" : "Asien", + "en" : "Asia", + "es" : "Asia", + "fr" : "Asie", + "ja" : "アジア", + "pt-BR" : "Ásia", + "ru" : "Азия", + "zh-CN" : "亚洲" + } + }, + "country" : { + "geoname_id" : 1835841, + "iso_code" : "KR", + "names" : { + "de" : "Republik Korea", + "en" : "South Korea", + "es" : "Corea, República de", + "fr" : "Corée du Sud", + "ja" : "大韓民国", + "pt-BR" : "Coréia, República da", + "ru" : "Южная Корея", + "zh-CN" : "韩国" + } + }, + "location" : { + "accuracy_radius" : 100, + "latitude" : 1, + "longitude" : 1, + "time_zone" : "Asia/Seoul" + }, + "registered_country" : { + "geoname_id" : 1835841, + "iso_code" : "KR", + "names" : { + "de" : "Republik Korea", + "en" : "South Korea", + "es" : "Corea, República de", + "fr" : "Corée du Sud", + "ja" : "大韓民国", + "pt-BR" : "Coréia, República da", + "ru" : "Южная Корея", + "zh-CN" : "韩国" + } + } + } + } +] diff --git a/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-Connection-Type-Test.json b/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-Connection-Type-Test.json new file mode 100644 index 000000000000..93d51406d63f --- /dev/null +++ b/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-Connection-Type-Test.json @@ -0,0 +1 @@ +[{}] diff --git a/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-Country-Test.json b/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-Country-Test.json new file mode 100644 index 000000000000..93d51406d63f --- /dev/null +++ b/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-Country-Test.json @@ -0,0 +1 @@ +[{}] diff --git a/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-DensityIncome-Test.json b/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-DensityIncome-Test.json new file mode 100644 index 000000000000..93d51406d63f --- /dev/null +++ b/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-DensityIncome-Test.json @@ -0,0 +1 @@ +[{}] diff --git a/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-Domain-Test.json b/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-Domain-Test.json new file mode 100644 index 000000000000..93d51406d63f --- /dev/null +++ b/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-Domain-Test.json @@ -0,0 +1 @@ +[{}] diff --git a/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-Enterprise-Test.json b/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-Enterprise-Test.json new file mode 100644 index 000000000000..93d51406d63f --- /dev/null +++ b/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-Enterprise-Test.json @@ -0,0 +1 @@ +[{}] diff --git a/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-ISP-Test.json b/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-ISP-Test.json new file mode 100644 index 000000000000..93d51406d63f --- /dev/null +++ b/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-ISP-Test.json @@ -0,0 +1 @@ +[{}] diff --git a/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-Precision-Enterprise-Test.json b/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-Precision-Enterprise-Test.json new file mode 100644 index 000000000000..93d51406d63f --- /dev/null +++ b/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-Precision-Enterprise-Test.json @@ -0,0 +1 @@ +[{}] diff --git a/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-Static-IP-Score-Test.json b/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-Static-IP-Score-Test.json new file mode 100644 index 000000000000..93d51406d63f --- /dev/null +++ b/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-Static-IP-Score-Test.json @@ -0,0 +1 @@ +[{}] diff --git a/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-User-Count-Test.json b/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-User-Count-Test.json new file mode 100644 index 000000000000..93d51406d63f --- /dev/null +++ b/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoIP2-User-Count-Test.json @@ -0,0 +1 @@ +[{}] diff --git a/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoLite2-ASN-Test.json b/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoLite2-ASN-Test.json new file mode 100644 index 000000000000..93d51406d63f --- /dev/null +++ b/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoLite2-ASN-Test.json @@ -0,0 +1 @@ +[{}] diff --git a/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoLite2-City-Test.json b/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoLite2-City-Test.json new file mode 100644 index 000000000000..eaff5474a903 --- /dev/null +++ b/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoLite2-City-Test.json @@ -0,0 +1,83 @@ +[ + { + "1.2.3.4/32" : { + "city" : { + "names" : { + "en" : "Boxford" + } + }, + "continent" : { + "code" : "EU", + "names" : { + "de" : "Europa", + "en" : "Europe", + "es" : "Europa", + "fr" : "Europe", + "ja" : "ヨーロッパ", + "pt-BR" : "Europa", + "ru" : "Европа", + "zh-CN" : "欧洲" + } + }, + "country" : { + "geoname_id" : 2635167, + "iso_code" : "GB", + "names" : { + "de" : "Vereinigtes Königreich", + "en" : "United Kingdom", + "es" : "Reino Unido", + "fr" : "Royaume-Uni", + "ja" : "イギリス", + "pt-BR" : "Reino Unido", + "ru" : "Великобритания", + "zh-CN" : "英国" + } + }, + "location" : { + "accuracy_radius" : 100, + "latitude" : 1234, + "longitude" : 5678, + "time_zone" : "Europe/London" + }, + "postal" : { + "code" : "OX1" + }, + "registered_country" : { + "geoname_id" : 3017382, + "is_in_european_union" : true, + "iso_code" : "FR", + "names" : { + "de" : "Frankreich", + "en" : "France", + "es" : "Francia", + "fr" : "France", + "ja" : "フランス共和国", + "pt-BR" : "França", + "ru" : "Франция", + "zh-CN" : "法国" + } + }, + "subdivisions" : [ + { + "geoname_id" : 6269131, + "iso_code" : "ENG", + "names" : { + "en" : "England", + "es" : "Inglaterra", + "fr" : "Angleterre", + "pt-BR" : "Inglaterra" + } + }, + { + "geoname_id" : 3333217, + "iso_code" : "WBK", + "names" : { + "en" : "West Berkshire", + "ru" : "Западный Беркшир", + "zh-CN" : "西伯克郡" + } + } + ] + } + } +] diff --git a/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoLite2-Country-Test.json b/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoLite2-Country-Test.json new file mode 100644 index 000000000000..93d51406d63f --- /dev/null +++ b/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/GeoLite2-Country-Test.json @@ -0,0 +1 @@ +[{}] diff --git a/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/generate_db.go b/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/generate_db.go new file mode 100644 index 000000000000..335713f2deec --- /dev/null +++ b/processor/geoipprocessor/internal/provider/maxmindprovider/testdata/generate_db.go @@ -0,0 +1,31 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package testdata + +import ( + "os" + "testing" + + "github.com/maxmind/MaxMind-DB/pkg/writer" +) + +// GenerateLocalDB generates *.mmdb databases files given a source directory data. It uses a the writer functionality provided by MaxMind-Db/pkg/writer +func GenerateLocalDB(t *testing.T, sourceData string) string { + tmpDir, err := os.MkdirTemp("", "") + if err != nil { + t.Fatal(err) + } + + w, err := writer.New(sourceData, tmpDir) + if err != nil { + t.Fatal(err) + } + + err = w.WriteGeoIP2TestDB() + if err != nil { + t.Fatal(err) + } + + return tmpDir +} diff --git a/processor/geoipprocessor/metadata.yaml b/processor/geoipprocessor/metadata.yaml index 014cf6dc5c39..50486031189b 100644 --- a/processor/geoipprocessor/metadata.yaml +++ b/processor/geoipprocessor/metadata.yaml @@ -3,6 +3,7 @@ type: geoip status: class: processor stability: - development: [traces, metrics, logs] + alpha: [traces, metrics, logs] + distributions: [contrib] codeowners: active: [andrzej-stencel, michalpristas, rogercoll] diff --git a/processor/geoipprocessor/testdata/attribute_source_address/input-logs.yaml b/processor/geoipprocessor/testdata/attribute_source_address/input-logs.yaml new file mode 100644 index 000000000000..4a6d152029a3 --- /dev/null +++ b/processor/geoipprocessor/testdata/attribute_source_address/input-logs.yaml @@ -0,0 +1,23 @@ +resourceLogs: + - resource: + attributes: + - key: ip + value: + stringValue: 1.2.2.1 + scopeLogs: + - logRecords: + - attributes: + - key: source.address + value: + stringValue: 1.2.3.4 + - key: host.name + value: + stringValue: HOST.ONE + - key: log.file.name + value: + stringValue: one.log + body: + stringValue: hello one + spanId: "" + traceId: "" + scope: {} diff --git a/processor/geoipprocessor/testdata/attribute_source_address/input-metrics.yaml b/processor/geoipprocessor/testdata/attribute_source_address/input-metrics.yaml new file mode 100644 index 000000000000..96ea1823ca43 --- /dev/null +++ b/processor/geoipprocessor/testdata/attribute_source_address/input-metrics.yaml @@ -0,0 +1,72 @@ +resourceMetrics: + - resource: + attributes: + - key: ip + value: + stringValue: 1.2.2.1 + schemaUrl: https://test-res-schema.com/schema + scopeMetrics: + - metrics: + - description: This also isn't a real metric + name: storage.amplitude + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "0" + attributes: + - key: a + value: + stringValue: AAAA + - key: source.address + value: + stringValue: 1.2.3.4 + isMonotonic: false + unit: "1" + - name: delta.histogram.test + histogram: + aggregationTemporality: 1 + dataPoints: + - explicitBounds: [0.01, 0.1, 1, 10, 100] + timeUnixNano: "1000000" + bucketCounts: [9, 12, 17, 8, 34] + attributes: + - key: source.address + value: + stringValue: 1.2.3.4 + - name: summary.test + summary: + dataPoints: + - timeUnixNano: "1000000" + quantileValues: + - quantile: 0.25 + value: 50 + - quantile: 0.5 + value: 20 + - quantile: 0.75 + value: 75 + - quantile: 0.95 + value: 10 + attributes: + - key: source.address + value: + stringValue: 1.2.3.4 + - gauge: + dataPoints: + - asDouble: 345 + attributes: + - key: source.address + value: + stringValue: 1.2.3.4 + - key: aaa + value: + stringValue: bbb + timeUnixNano: "1000000" + name: test.gauge + schemaUrl: https://test-scope-schema.com/schema + scope: + attributes: + - key: foo + value: + stringValue: bar + name: MyTestInstrument + version: 1.2.3 diff --git a/processor/geoipprocessor/testdata/attribute_source_address/input-traces.yaml b/processor/geoipprocessor/testdata/attribute_source_address/input-traces.yaml new file mode 100644 index 000000000000..d53288e5fccb --- /dev/null +++ b/processor/geoipprocessor/testdata/attribute_source_address/input-traces.yaml @@ -0,0 +1,39 @@ +resourceSpans: + - resource: + attributes: + scopeSpans: + - scope: {} + spans: + - attributes: + - key: http.request.method + value: + stringValue: POST + - key: url.full + value: + stringValue: https://www.foo.bar/search?q=OpenTelemetry#SemConv + - key: http.response.status_code + value: + intValue: "201" + - key: ip + value: + stringValue: 1.2.2.1 + - key: source.address + value: + stringValue: 1.2.3.4 + endTimeUnixNano: "1581452773000000789" + events: + - attributes: + - key: event.attr1 + value: + stringValue: foo2 + - key: event.attr2 + value: + stringValue: bar2 + name: event2 + timeUnixNano: "1581452773000000123" + name: span-elastic-http + parentSpanId: bcff497b5a47310f + spanId: "" + startTimeUnixNano: "1581452772000000321" + status: {} + traceId: "" diff --git a/processor/geoipprocessor/testdata/attribute_source_address/output-logs.yaml b/processor/geoipprocessor/testdata/attribute_source_address/output-logs.yaml new file mode 100644 index 000000000000..fba5e9be6d04 --- /dev/null +++ b/processor/geoipprocessor/testdata/attribute_source_address/output-logs.yaml @@ -0,0 +1,56 @@ +resourceLogs: + - resource: + attributes: + - key: ip + value: + stringValue: 1.2.2.1 + scopeLogs: + - logRecords: + - attributes: + - key: source.address + value: + stringValue: 1.2.3.4 + - key: host.name + value: + stringValue: HOST.ONE + - key: log.file.name + value: + stringValue: one.log + - key: geo.city_name + value: + stringValue: Boxford + - key: geo.continent_code + value: + stringValue: EU + - key: geo.continent_name + value: + stringValue: Europe + - key: geo.country_iso_code + value: + stringValue: GB + - key: geo.country_name + value: + stringValue: United Kingdom + - key: geo.location.lat + value: + doubleValue: 1234 + - key: geo.location.lon + value: + doubleValue: 5678 + - key: geo.postal_code + value: + stringValue: OX1 + - key: geo.region_iso_code + value: + stringValue: WBK + - key: geo.region_name + value: + stringValue: West Berkshire + - key: geo.timezone + value: + stringValue: Europe/London + body: + stringValue: hello one + spanId: "" + traceId: "" + scope: {} diff --git a/processor/geoipprocessor/testdata/attribute_source_address/output-metrics.yaml b/processor/geoipprocessor/testdata/attribute_source_address/output-metrics.yaml new file mode 100644 index 000000000000..0873a9e7352f --- /dev/null +++ b/processor/geoipprocessor/testdata/attribute_source_address/output-metrics.yaml @@ -0,0 +1,213 @@ +resourceMetrics: + - resource: + attributes: + - key: ip + value: + stringValue: 1.2.2.1 + schemaUrl: https://test-res-schema.com/schema + scopeMetrics: + - metrics: + - description: This also isn't a real metric + name: storage.amplitude + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "0" + attributes: + - key: a + value: + stringValue: AAAA + - key: geo.city_name + value: + stringValue: Boxford + - key: geo.continent_code + value: + stringValue: EU + - key: geo.continent_name + value: + stringValue: Europe + - key: geo.country_iso_code + value: + stringValue: GB + - key: geo.country_name + value: + stringValue: United Kingdom + - key: geo.location.lat + value: + doubleValue: 1234 + - key: geo.location.lon + value: + doubleValue: 5678 + - key: geo.postal_code + value: + stringValue: OX1 + - key: geo.region_iso_code + value: + stringValue: WBK + - key: geo.region_name + value: + stringValue: West Berkshire + - key: geo.timezone + value: + stringValue: Europe/London + - key: source.address + value: + stringValue: 1.2.3.4 + unit: "1" + - histogram: + aggregationTemporality: 1 + dataPoints: + - attributes: + - key: geo.city_name + value: + stringValue: Boxford + - key: geo.continent_code + value: + stringValue: EU + - key: geo.continent_name + value: + stringValue: Europe + - key: geo.country_iso_code + value: + stringValue: GB + - key: geo.country_name + value: + stringValue: United Kingdom + - key: geo.location.lat + value: + doubleValue: 1234 + - key: geo.location.lon + value: + doubleValue: 5678 + - key: geo.postal_code + value: + stringValue: OX1 + - key: geo.region_iso_code + value: + stringValue: WBK + - key: geo.region_name + value: + stringValue: West Berkshire + - key: geo.timezone + value: + stringValue: Europe/London + - key: source.address + value: + stringValue: 1.2.3.4 + bucketCounts: + - "9" + - "12" + - "17" + - "8" + - "34" + explicitBounds: + - 0.01 + - 0.1 + - 1 + - 10 + - 100 + timeUnixNano: "1000000" + name: delta.histogram.test + - name: summary.test + summary: + dataPoints: + - attributes: + - key: geo.city_name + value: + stringValue: Boxford + - key: geo.continent_code + value: + stringValue: EU + - key: geo.continent_name + value: + stringValue: Europe + - key: geo.country_iso_code + value: + stringValue: GB + - key: geo.country_name + value: + stringValue: United Kingdom + - key: geo.location.lat + value: + doubleValue: 1234 + - key: geo.location.lon + value: + doubleValue: 5678 + - key: geo.postal_code + value: + stringValue: OX1 + - key: geo.region_iso_code + value: + stringValue: WBK + - key: geo.region_name + value: + stringValue: West Berkshire + - key: geo.timezone + value: + stringValue: Europe/London + - key: source.address + value: + stringValue: 1.2.3.4 + quantileValues: + - quantile: 0.25 + value: 50 + - quantile: 0.5 + value: 20 + - quantile: 0.75 + value: 75 + - quantile: 0.95 + value: 10 + timeUnixNano: "1000000" + - gauge: + dataPoints: + - asDouble: 345 + attributes: + - key: aaa + value: + stringValue: bbb + - key: geo.city_name + value: + stringValue: Boxford + - key: geo.continent_code + value: + stringValue: EU + - key: geo.continent_name + value: + stringValue: Europe + - key: geo.country_iso_code + value: + stringValue: GB + - key: geo.country_name + value: + stringValue: United Kingdom + - key: geo.location.lat + value: + doubleValue: 1234 + - key: geo.location.lon + value: + doubleValue: 5678 + - key: geo.postal_code + value: + stringValue: OX1 + - key: geo.region_iso_code + value: + stringValue: WBK + - key: geo.region_name + value: + stringValue: West Berkshire + - key: geo.timezone + value: + stringValue: Europe/London + - key: source.address + value: + stringValue: 1.2.3.4 + timeUnixNano: "1000000" + name: test.gauge + schemaUrl: https://test-scope-schema.com/schema + scope: + attributes: + - key: foo + value: + stringValue: bar + name: MyTestInstrument + version: 1.2.3 diff --git a/processor/geoipprocessor/testdata/attribute_source_address/output-traces.yaml b/processor/geoipprocessor/testdata/attribute_source_address/output-traces.yaml new file mode 100644 index 000000000000..482f03c4166f --- /dev/null +++ b/processor/geoipprocessor/testdata/attribute_source_address/output-traces.yaml @@ -0,0 +1,70 @@ +resourceSpans: + - resource: {} + scopeSpans: + - scope: {} + spans: + - attributes: + - key: http.request.method + value: + stringValue: POST + - key: url.full + value: + stringValue: https://www.foo.bar/search?q=OpenTelemetry#SemConv + - key: http.response.status_code + value: + intValue: "201" + - key: ip + value: + stringValue: 1.2.2.1 + - key: source.address + value: + stringValue: 1.2.3.4 + - key: geo.city_name + value: + stringValue: Boxford + - key: geo.continent_code + value: + stringValue: EU + - key: geo.continent_name + value: + stringValue: Europe + - key: geo.country_iso_code + value: + stringValue: GB + - key: geo.country_name + value: + stringValue: United Kingdom + - key: geo.location.lat + value: + doubleValue: 1234 + - key: geo.location.lon + value: + doubleValue: 5678 + - key: geo.postal_code + value: + stringValue: OX1 + - key: geo.region_iso_code + value: + stringValue: WBK + - key: geo.region_name + value: + stringValue: West Berkshire + - key: geo.timezone + value: + stringValue: Europe/London + events: + - attributes: + - key: event.attr1 + value: + stringValue: foo2 + - key: event.attr2 + value: + stringValue: bar2 + name: event2 + timeUnixNano: "1581452773000000123" + name: span-elastic-http + parentSpanId: bcff497b5a47310f + spanId: "" + startTimeUnixNano: "1581452772000000321" + status: {} + traceId: "" diff --git a/processor/geoipprocessor/testdata/config-invalidProviderKey.yaml b/processor/geoipprocessor/testdata/config-invalidProviderKey.yaml new file mode 100644 index 000000000000..5f3aa0a58d41 --- /dev/null +++ b/processor/geoipprocessor/testdata/config-invalidProviderKey.yaml @@ -0,0 +1,4 @@ +processors: + geoip: + providers: + invalidProviderKey: diff --git a/processor/geoipprocessor/testdata/config-mockProvider.yaml b/processor/geoipprocessor/testdata/config-mockProvider.yaml new file mode 100644 index 000000000000..d6107cb3db01 --- /dev/null +++ b/processor/geoipprocessor/testdata/config-mockProvider.yaml @@ -0,0 +1,17 @@ +processors: + geoip: + providers: + mock: + database: "/tmp/geodata.csv" +receivers: + nop: + +exporters: + nop: + +service: + pipelines: + metrics: + receivers: [nop] + processors: [geoip] + exporters: [nop] diff --git a/processor/geoipprocessor/testdata/config.yaml b/processor/geoipprocessor/testdata/config.yaml index 870494e36a73..01c7234a1b3c 100644 --- a/processor/geoipprocessor/testdata/config.yaml +++ b/processor/geoipprocessor/testdata/config.yaml @@ -1 +1,17 @@ geoip: +geoip/maxmind: + providers: + maxmind: + database_path: /tmp/db +geoip/maxmind_record_context: + context: record + providers: + maxmind: + database_path: /tmp/db +geoip/invalid_providers_config: + providers: "this should be a map" +geoip/invalid_source: + providers: + maxmind: + database_path: /tmp/db + context: not.an.otlp.context diff --git a/processor/geoipprocessor/testdata/custom_sources/input-logs.yaml b/processor/geoipprocessor/testdata/custom_sources/input-logs.yaml new file mode 100644 index 000000000000..33c04700e776 --- /dev/null +++ b/processor/geoipprocessor/testdata/custom_sources/input-logs.yaml @@ -0,0 +1,20 @@ +resourceLogs: + - resource: + attributes: + - key: host.ip + value: + stringValue: 1.2.3.4 + - key: ip + value: + stringValue: 1.2.3.4 + scopeLogs: + - logRecords: + - body: + stringValue: "hello one" + attributes: + - key: host.name + value: + stringValue: HOST.ONE + - key: log.file.name + value: + stringValue: one.log diff --git a/processor/geoipprocessor/testdata/custom_sources/input-metrics.yaml b/processor/geoipprocessor/testdata/custom_sources/input-metrics.yaml new file mode 100644 index 000000000000..9a36a49f7534 --- /dev/null +++ b/processor/geoipprocessor/testdata/custom_sources/input-metrics.yaml @@ -0,0 +1,29 @@ +resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: host.ip + value: + stringValue: 1.2.3.4 + - key: ip + value: + stringValue: 1.2.3.4 + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: foo + value: + stringValue: bar + metrics: + - name: test.gauge + gauge: + dataPoints: + - timeUnixNano: "1000000" + asDouble: 345 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/processor/geoipprocessor/testdata/custom_sources/input-traces.yaml b/processor/geoipprocessor/testdata/custom_sources/input-traces.yaml new file mode 100644 index 000000000000..23eb39fc427a --- /dev/null +++ b/processor/geoipprocessor/testdata/custom_sources/input-traces.yaml @@ -0,0 +1,36 @@ +resourceSpans: + - resource: + attributes: + - key: host.ip + value: + stringValue: 1.2.3.4 + - key: ip + value: + stringValue: 1.2.3.4 + scopeSpans: + - scope: {} + spans: + - attributes: + - key: http.request.method + value: + stringValue: POST + - key: url.full + value: + stringValue: https://www.foo.bar/search?q=OpenTelemetry#SemConv + - key: http.response.status_code + value: + intValue: 201 + endTimeUnixNano: "1581452773000000789" + events: + - attributes: + - key: event.attr1 + value: + stringValue: foo2 + - key: event.attr2 + value: + stringValue: bar2 + name: event2 + timeUnixNano: "1581452773000000123" + name: span-elastic-http + parentSpanId: "bcff497b5a47310f" + startTimeUnixNano: "1581452772000000321" diff --git a/processor/geoipprocessor/testdata/custom_sources/output-logs.yaml b/processor/geoipprocessor/testdata/custom_sources/output-logs.yaml new file mode 100644 index 000000000000..df50e8eace83 --- /dev/null +++ b/processor/geoipprocessor/testdata/custom_sources/output-logs.yaml @@ -0,0 +1,23 @@ +resourceLogs: + - resource: + attributes: + - key: host.ip + value: + stringValue: 1.2.3.4 + - key: ip + value: + stringValue: 1.2.3.4 + scopeLogs: + - logRecords: + - attributes: + - key: host.name + value: + stringValue: HOST.ONE + - key: log.file.name + value: + stringValue: one.log + body: + stringValue: hello one + spanId: "" + traceId: "" + scope: {} diff --git a/processor/geoipprocessor/testdata/custom_sources/output-metrics.yaml b/processor/geoipprocessor/testdata/custom_sources/output-metrics.yaml new file mode 100644 index 000000000000..092b79b2b3f7 --- /dev/null +++ b/processor/geoipprocessor/testdata/custom_sources/output-metrics.yaml @@ -0,0 +1,29 @@ +resourceMetrics: + - resource: + attributes: + - key: host.ip + value: + stringValue: 1.2.3.4 + - key: ip + value: + stringValue: 1.2.3.4 + schemaUrl: https://test-res-schema.com/schema + scopeMetrics: + - metrics: + - gauge: + dataPoints: + - asDouble: 345 + attributes: + - key: aaa + value: + stringValue: bbb + timeUnixNano: "1000000" + name: test.gauge + schemaUrl: https://test-scope-schema.com/schema + scope: + attributes: + - key: foo + value: + stringValue: bar + name: MyTestInstrument + version: 1.2.3 diff --git a/processor/geoipprocessor/testdata/custom_sources/output-traces.yaml b/processor/geoipprocessor/testdata/custom_sources/output-traces.yaml new file mode 100644 index 000000000000..18b233132028 --- /dev/null +++ b/processor/geoipprocessor/testdata/custom_sources/output-traces.yaml @@ -0,0 +1,39 @@ +resourceSpans: + - resource: + attributes: + - key: host.ip + value: + stringValue: 1.2.3.4 + - key: ip + value: + stringValue: 1.2.3.4 + scopeSpans: + - scope: {} + spans: + - attributes: + - key: http.request.method + value: + stringValue: POST + - key: url.full + value: + stringValue: https://www.foo.bar/search?q=OpenTelemetry#SemConv + - key: http.response.status_code + value: + intValue: "201" + endTimeUnixNano: "1581452773000000789" + events: + - attributes: + - key: event.attr1 + value: + stringValue: foo2 + - key: event.attr2 + value: + stringValue: bar2 + name: event2 + timeUnixNano: "1581452773000000123" + name: span-elastic-http + parentSpanId: bcff497b5a47310f + spanId: "" + startTimeUnixNano: "1581452772000000321" + status: {} + traceId: "" diff --git a/processor/geoipprocessor/testdata/invalid_address/input-logs.yaml b/processor/geoipprocessor/testdata/invalid_address/input-logs.yaml new file mode 100644 index 000000000000..76470bc75090 --- /dev/null +++ b/processor/geoipprocessor/testdata/invalid_address/input-logs.yaml @@ -0,0 +1,20 @@ +resourceLogs: + - resource: + attributes: + - key: source.address + value: + stringValue: '%' + - key: ip + value: + stringValue: 1.2.3.4 + scopeLogs: + - logRecords: + - body: + stringValue: "hello one" + attributes: + - key: host.name + value: + stringValue: HOST.ONE + - key: log.file.name + value: + stringValue: one.log diff --git a/processor/geoipprocessor/testdata/invalid_address/input-metrics.yaml b/processor/geoipprocessor/testdata/invalid_address/input-metrics.yaml new file mode 100644 index 000000000000..4d2ec219f92c --- /dev/null +++ b/processor/geoipprocessor/testdata/invalid_address/input-metrics.yaml @@ -0,0 +1,29 @@ +resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: source.address + value: + stringValue: '%' + - key: ip + value: + stringValue: 1.2.3.4 + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: foo + value: + stringValue: bar + metrics: + - name: test.gauge + gauge: + dataPoints: + - timeUnixNano: "1000000" + asDouble: 345 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/processor/geoipprocessor/testdata/invalid_address/input-traces.yaml b/processor/geoipprocessor/testdata/invalid_address/input-traces.yaml new file mode 100644 index 000000000000..e3ee36e7f2c3 --- /dev/null +++ b/processor/geoipprocessor/testdata/invalid_address/input-traces.yaml @@ -0,0 +1,36 @@ +resourceSpans: + - resource: + attributes: + - key: source.address + value: + stringValue: '%' + - key: ip + value: + stringValue: 1.2.3.4 + scopeSpans: + - scope: {} + spans: + - attributes: + - key: http.request.method + value: + stringValue: POST + - key: url.full + value: + stringValue: https://www.foo.bar/search?q=OpenTelemetry#SemConv + - key: http.response.status_code + value: + intValue: 201 + endTimeUnixNano: "1581452773000000789" + events: + - attributes: + - key: event.attr1 + value: + stringValue: foo2 + - key: event.attr2 + value: + stringValue: bar2 + name: event2 + timeUnixNano: "1581452773000000123" + name: span-elastic-http + parentSpanId: "bcff497b5a47310f" + startTimeUnixNano: "1581452772000000321" diff --git a/processor/geoipprocessor/testdata/invalid_address/output-logs.yaml b/processor/geoipprocessor/testdata/invalid_address/output-logs.yaml new file mode 100644 index 000000000000..f1f6e4d84a09 --- /dev/null +++ b/processor/geoipprocessor/testdata/invalid_address/output-logs.yaml @@ -0,0 +1,23 @@ +resourceLogs: + - resource: + attributes: + - key: source.address + value: + stringValue: '%' + - key: ip + value: + stringValue: 1.2.3.4 + scopeLogs: + - logRecords: + - attributes: + - key: host.name + value: + stringValue: HOST.ONE + - key: log.file.name + value: + stringValue: one.log + body: + stringValue: hello one + spanId: "" + traceId: "" + scope: {} diff --git a/processor/geoipprocessor/testdata/invalid_address/output-metrics.yaml b/processor/geoipprocessor/testdata/invalid_address/output-metrics.yaml new file mode 100644 index 000000000000..1e6a760e9e10 --- /dev/null +++ b/processor/geoipprocessor/testdata/invalid_address/output-metrics.yaml @@ -0,0 +1,29 @@ +resourceMetrics: + - resource: + attributes: + - key: ip + value: + stringValue: 1.2.3.4 + - key: source.address + value: + stringValue: '%' + schemaUrl: https://test-res-schema.com/schema + scopeMetrics: + - metrics: + - gauge: + dataPoints: + - asDouble: 345 + attributes: + - key: aaa + value: + stringValue: bbb + timeUnixNano: "1000000" + name: test.gauge + schemaUrl: https://test-scope-schema.com/schema + scope: + attributes: + - key: foo + value: + stringValue: bar + name: MyTestInstrument + version: 1.2.3 diff --git a/processor/geoipprocessor/testdata/invalid_address/output-traces.yaml b/processor/geoipprocessor/testdata/invalid_address/output-traces.yaml new file mode 100644 index 000000000000..6b0b6dca2487 --- /dev/null +++ b/processor/geoipprocessor/testdata/invalid_address/output-traces.yaml @@ -0,0 +1,39 @@ +resourceSpans: + - resource: + attributes: + - key: source.address + value: + stringValue: '%' + - key: ip + value: + stringValue: 1.2.3.4 + scopeSpans: + - scope: {} + spans: + - attributes: + - key: http.request.method + value: + stringValue: POST + - key: url.full + value: + stringValue: https://www.foo.bar/search?q=OpenTelemetry#SemConv + - key: http.response.status_code + value: + intValue: "201" + endTimeUnixNano: "1581452773000000789" + events: + - attributes: + - key: event.attr1 + value: + stringValue: foo2 + - key: event.attr2 + value: + stringValue: bar2 + name: event2 + timeUnixNano: "1581452773000000123" + name: span-elastic-http + parentSpanId: bcff497b5a47310f + spanId: "" + startTimeUnixNano: "1581452772000000321" + status: {} + traceId: "" diff --git a/processor/geoipprocessor/testdata/no_source_address/input-logs.yaml b/processor/geoipprocessor/testdata/no_source_address/input-logs.yaml new file mode 100644 index 000000000000..beca85de6259 --- /dev/null +++ b/processor/geoipprocessor/testdata/no_source_address/input-logs.yaml @@ -0,0 +1,14 @@ +resourceLogs: + - resource: + attributes: + scopeLogs: + - logRecords: + - body: + stringValue: "hello one" + attributes: + - key: host.name + value: + stringValue: HOST.ONE + - key: log.file.name + value: + stringValue: one.log diff --git a/processor/geoipprocessor/testdata/no_source_address/input-metrics.yaml b/processor/geoipprocessor/testdata/no_source_address/input-metrics.yaml new file mode 100644 index 000000000000..895a10bbe372 --- /dev/null +++ b/processor/geoipprocessor/testdata/no_source_address/input-metrics.yaml @@ -0,0 +1,26 @@ +resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: asdf + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: foo + value: + stringValue: bar + metrics: + - name: test.gauge + gauge: + dataPoints: + - timeUnixNano: "1000000" + asDouble: 345 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/processor/geoipprocessor/testdata/no_source_address/input-traces.yaml b/processor/geoipprocessor/testdata/no_source_address/input-traces.yaml new file mode 100644 index 000000000000..0371c1331972 --- /dev/null +++ b/processor/geoipprocessor/testdata/no_source_address/input-traces.yaml @@ -0,0 +1,33 @@ +resourceSpans: + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + scopeSpans: + - scope: {} + spans: + - attributes: + - key: http.request.method + value: + stringValue: POST + - key: url.full + value: + stringValue: https://www.foo.bar/search?q=OpenTelemetry#SemConv + - key: http.response.status_code + value: + intValue: 201 + endTimeUnixNano: "1581452773000000789" + events: + - attributes: + - key: event.attr1 + value: + stringValue: foo2 + - key: event.attr2 + value: + stringValue: bar2 + name: event2 + timeUnixNano: "1581452773000000123" + name: span-elastic-http + parentSpanId: "bcff497b5a47310f" + startTimeUnixNano: "1581452772000000321" diff --git a/processor/geoipprocessor/testdata/no_source_address/output-logs.yaml b/processor/geoipprocessor/testdata/no_source_address/output-logs.yaml new file mode 100644 index 000000000000..ece1a6cca6b1 --- /dev/null +++ b/processor/geoipprocessor/testdata/no_source_address/output-logs.yaml @@ -0,0 +1,16 @@ +resourceLogs: + - resource: {} + scopeLogs: + - logRecords: + - attributes: + - key: host.name + value: + stringValue: HOST.ONE + - key: log.file.name + value: + stringValue: one.log + body: + stringValue: hello one + spanId: "" + traceId: "" + scope: {} diff --git a/processor/geoipprocessor/testdata/no_source_address/output-metrics.yaml b/processor/geoipprocessor/testdata/no_source_address/output-metrics.yaml new file mode 100644 index 000000000000..083d0d1dfea5 --- /dev/null +++ b/processor/geoipprocessor/testdata/no_source_address/output-metrics.yaml @@ -0,0 +1,26 @@ +resourceMetrics: + - resource: + attributes: + - key: asdf + value: + stringValue: foo + schemaUrl: https://test-res-schema.com/schema + scopeMetrics: + - metrics: + - gauge: + dataPoints: + - asDouble: 345 + attributes: + - key: aaa + value: + stringValue: bbb + timeUnixNano: "1000000" + name: test.gauge + schemaUrl: https://test-scope-schema.com/schema + scope: + attributes: + - key: foo + value: + stringValue: bar + name: MyTestInstrument + version: 1.2.3 diff --git a/processor/geoipprocessor/testdata/no_source_address/output-traces.yaml b/processor/geoipprocessor/testdata/no_source_address/output-traces.yaml new file mode 100644 index 000000000000..394e8d2ce6a8 --- /dev/null +++ b/processor/geoipprocessor/testdata/no_source_address/output-traces.yaml @@ -0,0 +1,36 @@ +resourceSpans: + - resource: + attributes: + - key: resource.required + value: + stringValue: foo + scopeSpans: + - scope: {} + spans: + - attributes: + - key: http.request.method + value: + stringValue: POST + - key: url.full + value: + stringValue: https://www.foo.bar/search?q=OpenTelemetry#SemConv + - key: http.response.status_code + value: + intValue: "201" + endTimeUnixNano: "1581452773000000789" + events: + - attributes: + - key: event.attr1 + value: + stringValue: foo2 + - key: event.attr2 + value: + stringValue: bar2 + name: event2 + timeUnixNano: "1581452773000000123" + name: span-elastic-http + parentSpanId: bcff497b5a47310f + spanId: "" + startTimeUnixNano: "1581452772000000321" + status: {} + traceId: "" diff --git a/processor/geoipprocessor/testdata/source_address/input-logs.yaml b/processor/geoipprocessor/testdata/source_address/input-logs.yaml new file mode 100644 index 000000000000..fc0666cbac20 --- /dev/null +++ b/processor/geoipprocessor/testdata/source_address/input-logs.yaml @@ -0,0 +1,23 @@ +resourceLogs: + - resource: + attributes: + - key: source.address + value: + stringValue: 1.2.3.4 + - key: ip + value: + stringValue: 1.2.2.1 + scopeLogs: + - logRecords: + - attributes: + - key: host.name + value: + stringValue: HOST.ONE + - key: log.file.name + value: + stringValue: one.log + body: + stringValue: hello one + spanId: "" + traceId: "" + scope: {} diff --git a/processor/geoipprocessor/testdata/source_address/input-metrics.yaml b/processor/geoipprocessor/testdata/source_address/input-metrics.yaml new file mode 100644 index 000000000000..6e2216ab9cba --- /dev/null +++ b/processor/geoipprocessor/testdata/source_address/input-metrics.yaml @@ -0,0 +1,63 @@ +resourceMetrics: + - resource: + attributes: + - key: ip + value: + stringValue: 1.2.2.1 + - key: source.address + value: + stringValue: 1.2.3.4 + schemaUrl: https://test-res-schema.com/schema + scopeMetrics: + - metrics: + - description: This also isn't a real metric + name: storage.amplitude + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "0" + attributes: + - key: a + value: + stringValue: AAAA + isMonotonic: false + unit: "1" + - name: delta.histogram.test + histogram: + aggregationTemporality: 1 + dataPoints: + - explicitBounds: [0.01, 0.1, 1, 10, 100] + bucketCounts: [9, 12, 17, 8, 34] + attributes: + - key: aaa + value: + stringValue: bbb + - name: summary.test + summary: + dataPoints: + - quantileValues: + - quantile: 0.25 + value: 50 + - quantile: 0.5 + value: 20 + - quantile: 0.75 + value: 75 + - quantile: 0.95 + value: 10 + - gauge: + dataPoints: + - asDouble: 345 + attributes: + - key: aaa + value: + stringValue: bbb + timeUnixNano: "1000000" + name: test.gauge + schemaUrl: https://test-scope-schema.com/schema + scope: + attributes: + - key: foo + value: + stringValue: bar + name: MyTestInstrument + version: 1.2.3 diff --git a/processor/geoipprocessor/testdata/source_address/input-traces.yaml b/processor/geoipprocessor/testdata/source_address/input-traces.yaml new file mode 100644 index 000000000000..31de3b7287a8 --- /dev/null +++ b/processor/geoipprocessor/testdata/source_address/input-traces.yaml @@ -0,0 +1,39 @@ +resourceSpans: + - resource: + attributes: + - key: source.address + value: + stringValue: 1.2.3.4 + - key: ip + value: + stringValue: 1.2.2.1 + scopeSpans: + - scope: {} + spans: + - attributes: + - key: http.request.method + value: + stringValue: POST + - key: url.full + value: + stringValue: https://www.foo.bar/search?q=OpenTelemetry#SemConv + - key: http.response.status_code + value: + intValue: "201" + endTimeUnixNano: "1581452773000000789" + events: + - attributes: + - key: event.attr1 + value: + stringValue: foo2 + - key: event.attr2 + value: + stringValue: bar2 + name: event2 + timeUnixNano: "1581452773000000123" + name: span-elastic-http + parentSpanId: bcff497b5a47310f + spanId: "" + startTimeUnixNano: "1581452772000000321" + status: {} + traceId: "" diff --git a/processor/geoipprocessor/testdata/source_address/output-logs.yaml b/processor/geoipprocessor/testdata/source_address/output-logs.yaml new file mode 100644 index 000000000000..e4f7788ce0b5 --- /dev/null +++ b/processor/geoipprocessor/testdata/source_address/output-logs.yaml @@ -0,0 +1,56 @@ +resourceLogs: + - resource: + attributes: + - key: source.address + value: + stringValue: 1.2.3.4 + - key: ip + value: + stringValue: 1.2.2.1 + - key: geo.city_name + value: + stringValue: Boxford + - key: geo.continent_code + value: + stringValue: EU + - key: geo.continent_name + value: + stringValue: Europe + - key: geo.country_iso_code + value: + stringValue: GB + - key: geo.country_name + value: + stringValue: United Kingdom + - key: geo.location.lat + value: + doubleValue: 1234 + - key: geo.location.lon + value: + doubleValue: 5678 + - key: geo.postal_code + value: + stringValue: OX1 + - key: geo.region_iso_code + value: + stringValue: WBK + - key: geo.region_name + value: + stringValue: West Berkshire + - key: geo.timezone + value: + stringValue: Europe/London + scopeLogs: + - logRecords: + - attributes: + - key: host.name + value: + stringValue: HOST.ONE + - key: log.file.name + value: + stringValue: one.log + body: + stringValue: hello one + spanId: "" + traceId: "" + scope: {} diff --git a/processor/geoipprocessor/testdata/source_address/output-metrics.yaml b/processor/geoipprocessor/testdata/source_address/output-metrics.yaml new file mode 100644 index 000000000000..dbeef1345fa6 --- /dev/null +++ b/processor/geoipprocessor/testdata/source_address/output-metrics.yaml @@ -0,0 +1,105 @@ +resourceMetrics: + - resource: + attributes: + - key: geo.city_name + value: + stringValue: Boxford + - key: geo.continent_code + value: + stringValue: EU + - key: geo.continent_name + value: + stringValue: Europe + - key: geo.country_iso_code + value: + stringValue: GB + - key: geo.country_name + value: + stringValue: United Kingdom + - key: geo.location.lat + value: + doubleValue: 1234 + - key: geo.location.lon + value: + doubleValue: 5678 + - key: geo.postal_code + value: + stringValue: OX1 + - key: geo.region_iso_code + value: + stringValue: WBK + - key: geo.region_name + value: + stringValue: West Berkshire + - key: geo.timezone + value: + stringValue: Europe/London + - key: ip + value: + stringValue: 1.2.2.1 + - key: source.address + value: + stringValue: 1.2.3.4 + schemaUrl: https://test-res-schema.com/schema + scopeMetrics: + - metrics: + - description: This also isn't a real metric + name: storage.amplitude + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "0" + attributes: + - key: a + value: + stringValue: AAAA + unit: "1" + - histogram: + aggregationTemporality: 1 + dataPoints: + - attributes: + - key: aaa + value: + stringValue: bbb + bucketCounts: + - "9" + - "12" + - "17" + - "8" + - "34" + explicitBounds: + - 0.01 + - 0.1 + - 1 + - 10 + - 100 + name: delta.histogram.test + - name: summary.test + summary: + dataPoints: + - quantileValues: + - quantile: 0.25 + value: 50 + - quantile: 0.5 + value: 20 + - quantile: 0.75 + value: 75 + - quantile: 0.95 + value: 10 + - gauge: + dataPoints: + - asDouble: 345 + attributes: + - key: aaa + value: + stringValue: bbb + timeUnixNano: "1000000" + name: test.gauge + schemaUrl: https://test-scope-schema.com/schema + scope: + attributes: + - key: foo + value: + stringValue: bar + name: MyTestInstrument + version: 1.2.3 diff --git a/processor/geoipprocessor/testdata/source_address/output-traces.yaml b/processor/geoipprocessor/testdata/source_address/output-traces.yaml new file mode 100644 index 000000000000..39bf526a772a --- /dev/null +++ b/processor/geoipprocessor/testdata/source_address/output-traces.yaml @@ -0,0 +1,72 @@ +resourceSpans: + - resource: + attributes: + - key: source.address + value: + stringValue: 1.2.3.4 + - key: ip + value: + stringValue: 1.2.2.1 + - key: geo.city_name + value: + stringValue: Boxford + - key: geo.continent_code + value: + stringValue: EU + - key: geo.continent_name + value: + stringValue: Europe + - key: geo.country_iso_code + value: + stringValue: GB + - key: geo.country_name + value: + stringValue: United Kingdom + - key: geo.location.lat + value: + doubleValue: 1234 + - key: geo.location.lon + value: + doubleValue: 5678 + - key: geo.postal_code + value: + stringValue: OX1 + - key: geo.region_iso_code + value: + stringValue: WBK + - key: geo.region_name + value: + stringValue: West Berkshire + - key: geo.timezone + value: + stringValue: Europe/London + scopeSpans: + - scope: {} + spans: + - attributes: + - key: http.request.method + value: + stringValue: POST + - key: url.full + value: + stringValue: https://www.foo.bar/search?q=OpenTelemetry#SemConv + - key: http.response.status_code + value: + intValue: "201" + endTimeUnixNano: "1581452773000000789" + events: + - attributes: + - key: event.attr1 + value: + stringValue: foo2 + - key: event.attr2 + value: + stringValue: bar2 + name: event2 + timeUnixNano: "1581452773000000123" + name: span-elastic-http + parentSpanId: bcff497b5a47310f + spanId: "" + startTimeUnixNano: "1581452772000000321" + status: {} + traceId: "" diff --git a/processor/geoipprocessor/testdata/source_address_geo_not_found/input-logs.yaml b/processor/geoipprocessor/testdata/source_address_geo_not_found/input-logs.yaml new file mode 100644 index 000000000000..b0bcc78ae503 --- /dev/null +++ b/processor/geoipprocessor/testdata/source_address_geo_not_found/input-logs.yaml @@ -0,0 +1,23 @@ +resourceLogs: + - resource: + attributes: + - key: source.address + value: + stringValue: 1.2.3.5 + - key: ip + value: + stringValue: 1.2.2.1 + scopeLogs: + - logRecords: + - attributes: + - key: host.name + value: + stringValue: HOST.ONE + - key: log.file.name + value: + stringValue: one.log + body: + stringValue: hello one + spanId: "" + traceId: "" + scope: {} diff --git a/processor/geoipprocessor/testdata/source_address_geo_not_found/input-metrics.yaml b/processor/geoipprocessor/testdata/source_address_geo_not_found/input-metrics.yaml new file mode 100644 index 000000000000..956bdd3eef0a --- /dev/null +++ b/processor/geoipprocessor/testdata/source_address_geo_not_found/input-metrics.yaml @@ -0,0 +1,63 @@ +resourceMetrics: + - resource: + attributes: + - key: ip + value: + stringValue: 1.2.2.1 + - key: source.address + value: + stringValue: 1.2.3.5 + schemaUrl: https://test-res-schema.com/schema + scopeMetrics: + - metrics: + - description: This also isn't a real metric + name: storage.amplitude + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "0" + attributes: + - key: a + value: + stringValue: AAAA + isMonotonic: false + unit: "1" + - name: delta.histogram.test + histogram: + aggregationTemporality: 1 + dataPoints: + - explicitBounds: [0.01, 0.1, 1, 10, 100] + bucketCounts: [9, 12, 17, 8, 34] + attributes: + - key: aaa + value: + stringValue: bbb + - name: summary.test + summary: + dataPoints: + - quantileValues: + - quantile: 0.25 + value: 50 + - quantile: 0.5 + value: 20 + - quantile: 0.75 + value: 75 + - quantile: 0.95 + value: 10 + - gauge: + dataPoints: + - asDouble: 345 + attributes: + - key: aaa + value: + stringValue: bbb + timeUnixNano: "1000000" + name: test.gauge + schemaUrl: https://test-scope-schema.com/schema + scope: + attributes: + - key: foo + value: + stringValue: bar + name: MyTestInstrument + version: 1.2.3 diff --git a/processor/geoipprocessor/testdata/source_address_geo_not_found/input-traces.yaml b/processor/geoipprocessor/testdata/source_address_geo_not_found/input-traces.yaml new file mode 100644 index 000000000000..de031b30164f --- /dev/null +++ b/processor/geoipprocessor/testdata/source_address_geo_not_found/input-traces.yaml @@ -0,0 +1,39 @@ +resourceSpans: + - resource: + attributes: + - key: source.address + value: + stringValue: 1.2.3.5 + - key: ip + value: + stringValue: 1.2.2.1 + scopeSpans: + - scope: {} + spans: + - attributes: + - key: http.request.method + value: + stringValue: POST + - key: url.full + value: + stringValue: https://www.foo.bar/search?q=OpenTelemetry#SemConv + - key: http.response.status_code + value: + intValue: "201" + endTimeUnixNano: "1581452773000000789" + events: + - attributes: + - key: event.attr1 + value: + stringValue: foo2 + - key: event.attr2 + value: + stringValue: bar2 + name: event2 + timeUnixNano: "1581452773000000123" + name: span-elastic-http + parentSpanId: bcff497b5a47310f + spanId: "" + startTimeUnixNano: "1581452772000000321" + status: {} + traceId: "" diff --git a/processor/geoipprocessor/testdata/source_address_geo_not_found/output-logs.yaml b/processor/geoipprocessor/testdata/source_address_geo_not_found/output-logs.yaml new file mode 100644 index 000000000000..b0bcc78ae503 --- /dev/null +++ b/processor/geoipprocessor/testdata/source_address_geo_not_found/output-logs.yaml @@ -0,0 +1,23 @@ +resourceLogs: + - resource: + attributes: + - key: source.address + value: + stringValue: 1.2.3.5 + - key: ip + value: + stringValue: 1.2.2.1 + scopeLogs: + - logRecords: + - attributes: + - key: host.name + value: + stringValue: HOST.ONE + - key: log.file.name + value: + stringValue: one.log + body: + stringValue: hello one + spanId: "" + traceId: "" + scope: {} diff --git a/processor/geoipprocessor/testdata/source_address_geo_not_found/output-metrics.yaml b/processor/geoipprocessor/testdata/source_address_geo_not_found/output-metrics.yaml new file mode 100644 index 000000000000..01f02c7c61d7 --- /dev/null +++ b/processor/geoipprocessor/testdata/source_address_geo_not_found/output-metrics.yaml @@ -0,0 +1,72 @@ +resourceMetrics: + - resource: + attributes: + - key: ip + value: + stringValue: 1.2.2.1 + - key: source.address + value: + stringValue: 1.2.3.5 + schemaUrl: https://test-res-schema.com/schema + scopeMetrics: + - metrics: + - description: This also isn't a real metric + name: storage.amplitude + sum: + aggregationTemporality: 2 + dataPoints: + - asInt: "0" + attributes: + - key: a + value: + stringValue: AAAA + unit: "1" + - histogram: + aggregationTemporality: 1 + dataPoints: + - attributes: + - key: aaa + value: + stringValue: bbb + bucketCounts: + - "9" + - "12" + - "17" + - "8" + - "34" + explicitBounds: + - 0.01 + - 0.1 + - 1 + - 10 + - 100 + name: delta.histogram.test + - name: summary.test + summary: + dataPoints: + - quantileValues: + - quantile: 0.25 + value: 50 + - quantile: 0.5 + value: 20 + - quantile: 0.75 + value: 75 + - quantile: 0.95 + value: 10 + - gauge: + dataPoints: + - asDouble: 345 + attributes: + - key: aaa + value: + stringValue: bbb + timeUnixNano: "1000000" + name: test.gauge + schemaUrl: https://test-scope-schema.com/schema + scope: + attributes: + - key: foo + value: + stringValue: bar + name: MyTestInstrument + version: 1.2.3 diff --git a/processor/geoipprocessor/testdata/source_address_geo_not_found/output-traces.yaml b/processor/geoipprocessor/testdata/source_address_geo_not_found/output-traces.yaml new file mode 100644 index 000000000000..de031b30164f --- /dev/null +++ b/processor/geoipprocessor/testdata/source_address_geo_not_found/output-traces.yaml @@ -0,0 +1,39 @@ +resourceSpans: + - resource: + attributes: + - key: source.address + value: + stringValue: 1.2.3.5 + - key: ip + value: + stringValue: 1.2.2.1 + scopeSpans: + - scope: {} + spans: + - attributes: + - key: http.request.method + value: + stringValue: POST + - key: url.full + value: + stringValue: https://www.foo.bar/search?q=OpenTelemetry#SemConv + - key: http.response.status_code + value: + intValue: "201" + endTimeUnixNano: "1581452773000000789" + events: + - attributes: + - key: event.attr1 + value: + stringValue: foo2 + - key: event.attr2 + value: + stringValue: bar2 + name: event2 + timeUnixNano: "1581452773000000123" + name: span-elastic-http + parentSpanId: bcff497b5a47310f + spanId: "" + startTimeUnixNano: "1581452772000000321" + status: {} + traceId: "" diff --git a/processor/geoipprocessor/testdata/unspecified_address/input-logs.yaml b/processor/geoipprocessor/testdata/unspecified_address/input-logs.yaml new file mode 100644 index 000000000000..88e41cf64143 --- /dev/null +++ b/processor/geoipprocessor/testdata/unspecified_address/input-logs.yaml @@ -0,0 +1,20 @@ +resourceLogs: + - resource: + attributes: + - key: source.address + value: + stringValue: 0.0.0.0 + - key: ip + value: + stringValue: 1.2.3.4 + scopeLogs: + - logRecords: + - body: + stringValue: "hello one" + attributes: + - key: host.name + value: + stringValue: HOST.ONE + - key: log.file.name + value: + stringValue: one.log diff --git a/processor/geoipprocessor/testdata/unspecified_address/input-metrics.yaml b/processor/geoipprocessor/testdata/unspecified_address/input-metrics.yaml new file mode 100644 index 000000000000..20e07e560ae0 --- /dev/null +++ b/processor/geoipprocessor/testdata/unspecified_address/input-metrics.yaml @@ -0,0 +1,29 @@ +resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: source.address + value: + stringValue: 0.0.0.0 + - key: ip + value: + stringValue: 1.2.3.4 + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: foo + value: + stringValue: bar + metrics: + - name: test.gauge + gauge: + dataPoints: + - timeUnixNano: "1000000" + asDouble: 345 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/processor/geoipprocessor/testdata/unspecified_address/input-traces.yaml b/processor/geoipprocessor/testdata/unspecified_address/input-traces.yaml new file mode 100644 index 000000000000..8869e5bd2896 --- /dev/null +++ b/processor/geoipprocessor/testdata/unspecified_address/input-traces.yaml @@ -0,0 +1,36 @@ +resourceSpans: + - resource: + attributes: + - key: source.address + value: + stringValue: 0.0.0.0 + - key: ip + value: + stringValue: 1.2.3.4 + scopeSpans: + - scope: {} + spans: + - attributes: + - key: http.request.method + value: + stringValue: POST + - key: url.full + value: + stringValue: https://www.foo.bar/search?q=OpenTelemetry#SemConv + - key: http.response.status_code + value: + intValue: 201 + endTimeUnixNano: "1581452773000000789" + events: + - attributes: + - key: event.attr1 + value: + stringValue: foo2 + - key: event.attr2 + value: + stringValue: bar2 + name: event2 + timeUnixNano: "1581452773000000123" + name: span-elastic-http + parentSpanId: "bcff497b5a47310f" + startTimeUnixNano: "1581452772000000321" diff --git a/processor/geoipprocessor/testdata/unspecified_address/output-logs.yaml b/processor/geoipprocessor/testdata/unspecified_address/output-logs.yaml new file mode 100644 index 000000000000..38bf4198972b --- /dev/null +++ b/processor/geoipprocessor/testdata/unspecified_address/output-logs.yaml @@ -0,0 +1,23 @@ +resourceLogs: + - resource: + attributes: + - key: source.address + value: + stringValue: 0.0.0.0 + - key: ip + value: + stringValue: 1.2.3.4 + scopeLogs: + - logRecords: + - attributes: + - key: host.name + value: + stringValue: HOST.ONE + - key: log.file.name + value: + stringValue: one.log + body: + stringValue: hello one + spanId: "" + traceId: "" + scope: {} diff --git a/processor/geoipprocessor/testdata/unspecified_address/output-metrics.yaml b/processor/geoipprocessor/testdata/unspecified_address/output-metrics.yaml new file mode 100644 index 000000000000..acd8c526da42 --- /dev/null +++ b/processor/geoipprocessor/testdata/unspecified_address/output-metrics.yaml @@ -0,0 +1,29 @@ +resourceMetrics: + - resource: + attributes: + - key: ip + value: + stringValue: 1.2.3.4 + - key: source.address + value: + stringValue: 0.0.0.0 + schemaUrl: https://test-res-schema.com/schema + scopeMetrics: + - metrics: + - gauge: + dataPoints: + - asDouble: 345 + attributes: + - key: aaa + value: + stringValue: bbb + timeUnixNano: "1000000" + name: test.gauge + schemaUrl: https://test-scope-schema.com/schema + scope: + attributes: + - key: foo + value: + stringValue: bar + name: MyTestInstrument + version: 1.2.3 diff --git a/processor/geoipprocessor/testdata/unspecified_address/output-traces.yaml b/processor/geoipprocessor/testdata/unspecified_address/output-traces.yaml new file mode 100644 index 000000000000..d327d631c565 --- /dev/null +++ b/processor/geoipprocessor/testdata/unspecified_address/output-traces.yaml @@ -0,0 +1,39 @@ +resourceSpans: + - resource: + attributes: + - key: source.address + value: + stringValue: 0.0.0.0 + - key: ip + value: + stringValue: 1.2.3.4 + scopeSpans: + - scope: {} + spans: + - attributes: + - key: http.request.method + value: + stringValue: POST + - key: url.full + value: + stringValue: https://www.foo.bar/search?q=OpenTelemetry#SemConv + - key: http.response.status_code + value: + intValue: "201" + endTimeUnixNano: "1581452773000000789" + events: + - attributes: + - key: event.attr1 + value: + stringValue: foo2 + - key: event.attr2 + value: + stringValue: bar2 + name: event2 + timeUnixNano: "1581452773000000123" + name: span-elastic-http + parentSpanId: bcff497b5a47310f + spanId: "" + startTimeUnixNano: "1581452772000000321" + status: {} + traceId: "" diff --git a/processor/groupbyattrsprocessor/README.md b/processor/groupbyattrsprocessor/README.md index e09c64cd8d60..952537efbdbf 100644 --- a/processor/groupbyattrsprocessor/README.md +++ b/processor/groupbyattrsprocessor/README.md @@ -3,12 +3,13 @@ | Status | | | ------------- |-----------| | Stability | [beta]: traces, metrics, logs | -| Distributions | [contrib] | +| Distributions | [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aprocessor%2Fgroupbyattrs%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aprocessor%2Fgroupbyattrs) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aprocessor%2Fgroupbyattrs%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aprocessor%2Fgroupbyattrs) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@rnishtala-sumo](https://www.github.com/rnishtala-sumo) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s ## Description diff --git a/processor/groupbyattrsprocessor/attribute_groups.go b/processor/groupbyattrsprocessor/attribute_groups.go index e106d79c112f..fef49f112033 100644 --- a/processor/groupbyattrsprocessor/attribute_groups.go +++ b/processor/groupbyattrsprocessor/attribute_groups.go @@ -64,7 +64,6 @@ func (mg *metricsGroup) findOrCreateResourceMetrics(originResource pcommon.Resou referenceResource.MoveTo(rm.Resource()) mg.resourceHashes = append(mg.resourceHashes, referenceResourceHash) return rm - } type logsGroup struct { diff --git a/processor/groupbyattrsprocessor/config.go b/processor/groupbyattrsprocessor/config.go index ccd078dbeddf..c02f29995b10 100644 --- a/processor/groupbyattrsprocessor/config.go +++ b/processor/groupbyattrsprocessor/config.go @@ -5,7 +5,6 @@ package groupbyattrsprocessor // import "github.com/open-telemetry/opentelemetry // Config is the configuration for the processor. type Config struct { - // GroupByKeys describes the attribute names that are going to be used for grouping. // Empty value is allowed, since processor in such case can compact data GroupByKeys []string `mapstructure:"keys"` diff --git a/processor/groupbyattrsprocessor/config_test.go b/processor/groupbyattrsprocessor/config_test.go index 24395a09ad88..e5fd565797ed 100644 --- a/processor/groupbyattrsprocessor/config_test.go +++ b/processor/groupbyattrsprocessor/config_test.go @@ -46,7 +46,7 @@ func TestLoadingConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) assert.NoError(t, component.ValidateConfig(cfg)) assert.Equal(t, tt.expected, cfg) diff --git a/processor/groupbyattrsprocessor/documentation.md b/processor/groupbyattrsprocessor/documentation.md index 2795dd6d0126..274b703e7fa1 100644 --- a/processor/groupbyattrsprocessor/documentation.md +++ b/processor/groupbyattrsprocessor/documentation.md @@ -6,7 +6,7 @@ The following telemetry is emitted by this component. -### processor_groupbyattrs_log_groups +### otelcol_processor_groupbyattrs_log_groups Distribution of groups extracted for logs @@ -14,7 +14,7 @@ Distribution of groups extracted for logs | ---- | ----------- | ---------- | | 1 | Histogram | Int | -### processor_groupbyattrs_metric_groups +### otelcol_processor_groupbyattrs_metric_groups Distribution of groups extracted for metrics @@ -22,7 +22,7 @@ Distribution of groups extracted for metrics | ---- | ----------- | ---------- | | 1 | Histogram | Int | -### processor_groupbyattrs_num_grouped_logs +### otelcol_processor_groupbyattrs_num_grouped_logs Number of logs that had attributes grouped @@ -30,7 +30,7 @@ Number of logs that had attributes grouped | ---- | ----------- | ---------- | --------- | | 1 | Sum | Int | true | -### processor_groupbyattrs_num_grouped_metrics +### otelcol_processor_groupbyattrs_num_grouped_metrics Number of metrics that had attributes grouped @@ -38,7 +38,7 @@ Number of metrics that had attributes grouped | ---- | ----------- | ---------- | --------- | | 1 | Sum | Int | true | -### processor_groupbyattrs_num_grouped_spans +### otelcol_processor_groupbyattrs_num_grouped_spans Number of spans that had attributes grouped @@ -46,7 +46,7 @@ Number of spans that had attributes grouped | ---- | ----------- | ---------- | --------- | | 1 | Sum | Int | true | -### processor_groupbyattrs_num_non_grouped_logs +### otelcol_processor_groupbyattrs_num_non_grouped_logs Number of logs that did not have attributes grouped @@ -54,7 +54,7 @@ Number of logs that did not have attributes grouped | ---- | ----------- | ---------- | --------- | | 1 | Sum | Int | true | -### processor_groupbyattrs_num_non_grouped_metrics +### otelcol_processor_groupbyattrs_num_non_grouped_metrics Number of metrics that did not have attributes grouped @@ -62,7 +62,7 @@ Number of metrics that did not have attributes grouped | ---- | ----------- | ---------- | --------- | | 1 | Sum | Int | true | -### processor_groupbyattrs_num_non_grouped_spans +### otelcol_processor_groupbyattrs_num_non_grouped_spans Number of spans that did not have attributes grouped @@ -70,7 +70,7 @@ Number of spans that did not have attributes grouped | ---- | ----------- | ---------- | --------- | | 1 | Sum | Int | true | -### processor_groupbyattrs_span_groups +### otelcol_processor_groupbyattrs_span_groups Distribution of groups extracted for spans diff --git a/processor/groupbyattrsprocessor/factory.go b/processor/groupbyattrsprocessor/factory.go index 505cbc9c97d8..66ddf0f98d57 100644 --- a/processor/groupbyattrsprocessor/factory.go +++ b/processor/groupbyattrsprocessor/factory.go @@ -15,9 +15,7 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor/internal/metadata" ) -var ( - consumerCapabilities = consumer.Capabilities{MutatesData: true} -) +var consumerCapabilities = consumer.Capabilities{MutatesData: true} // NewFactory returns a new factory for the Filter processor. func NewFactory() processor.Factory { @@ -36,7 +34,7 @@ func createDefaultConfig() component.Config { } } -func createGroupByAttrsProcessor(set processor.CreateSettings, attributes []string) (*groupByAttrsProcessor, error) { +func createGroupByAttrsProcessor(set processor.Settings, attributes []string) (*groupByAttrsProcessor, error) { var nonEmptyAttributes []string presentAttributes := make(map[string]struct{}) @@ -62,17 +60,17 @@ func createGroupByAttrsProcessor(set processor.CreateSettings, attributes []stri // createTracesProcessor creates a trace processor based on this config. func createTracesProcessor( ctx context.Context, - set processor.CreateSettings, + set processor.Settings, cfg component.Config, - nextConsumer consumer.Traces) (processor.Traces, error) { - + nextConsumer consumer.Traces, +) (processor.Traces, error) { oCfg := cfg.(*Config) gap, err := createGroupByAttrsProcessor(set, oCfg.GroupByKeys) if err != nil { return nil, err } - return processorhelper.NewTracesProcessor( + return processorhelper.NewTraces( ctx, set, cfg, @@ -84,17 +82,17 @@ func createTracesProcessor( // createLogsProcessor creates a logs processor based on this config. func createLogsProcessor( ctx context.Context, - set processor.CreateSettings, + set processor.Settings, cfg component.Config, - nextConsumer consumer.Logs) (processor.Logs, error) { - + nextConsumer consumer.Logs, +) (processor.Logs, error) { oCfg := cfg.(*Config) gap, err := createGroupByAttrsProcessor(set, oCfg.GroupByKeys) if err != nil { return nil, err } - return processorhelper.NewLogsProcessor( + return processorhelper.NewLogs( ctx, set, cfg, @@ -106,17 +104,17 @@ func createLogsProcessor( // createMetricsProcessor creates a metrics processor based on this config. func createMetricsProcessor( ctx context.Context, - set processor.CreateSettings, + set processor.Settings, cfg component.Config, - nextConsumer consumer.Metrics) (processor.Metrics, error) { - + nextConsumer consumer.Metrics, +) (processor.Metrics, error) { oCfg := cfg.(*Config) gap, err := createGroupByAttrsProcessor(set, oCfg.GroupByKeys) if err != nil { return nil, err } - return processorhelper.NewMetricsProcessor( + return processorhelper.NewMetrics( ctx, set, cfg, diff --git a/processor/groupbyattrsprocessor/factory_test.go b/processor/groupbyattrsprocessor/factory_test.go index 01892cd50f7b..885049330a87 100644 --- a/processor/groupbyattrsprocessor/factory_test.go +++ b/processor/groupbyattrsprocessor/factory_test.go @@ -23,31 +23,31 @@ func TestCreateTestProcessor(t *testing.T) { GroupByKeys: []string{"foo"}, } - tp, err := createTracesProcessor(context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + tp, err := createTracesProcessor(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) assert.NoError(t, err) assert.NotNil(t, tp) - assert.Equal(t, true, tp.Capabilities().MutatesData) + assert.True(t, tp.Capabilities().MutatesData) - lp, err := createLogsProcessor(context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + lp, err := createLogsProcessor(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) assert.NoError(t, err) assert.NotNil(t, lp) - assert.Equal(t, true, lp.Capabilities().MutatesData) + assert.True(t, lp.Capabilities().MutatesData) - mp, err := createMetricsProcessor(context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + mp, err := createMetricsProcessor(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) assert.NoError(t, err) assert.NotNil(t, mp) - assert.Equal(t, true, mp.Capabilities().MutatesData) + assert.True(t, mp.Capabilities().MutatesData) } func TestNoKeys(t *testing.T) { // This is allowed since can be used for compacting data - gap, err := createGroupByAttrsProcessor(processortest.NewNopCreateSettings(), []string{}) + gap, err := createGroupByAttrsProcessor(processortest.NewNopSettings(), []string{}) require.NoError(t, err) assert.NotNil(t, gap) } func TestDuplicateKeys(t *testing.T) { - gbap, err := createGroupByAttrsProcessor(processortest.NewNopCreateSettings(), []string{"foo", "foo", ""}) + gbap, err := createGroupByAttrsProcessor(processortest.NewNopSettings(), []string{"foo", "foo", ""}) require.NoError(t, err) assert.NotNil(t, gbap) assert.EqualValues(t, []string{"foo"}, gbap.groupByKeys) diff --git a/processor/groupbyattrsprocessor/generated_component_telemetry_test.go b/processor/groupbyattrsprocessor/generated_component_telemetry_test.go index 3625483dd337..876acb407754 100644 --- a/processor/groupbyattrsprocessor/generated_component_telemetry_test.go +++ b/processor/groupbyattrsprocessor/generated_component_telemetry_test.go @@ -12,6 +12,8 @@ import ( "go.opentelemetry.io/otel/sdk/metric/metricdata/metricdatatest" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/config/configtelemetry" "go.opentelemetry.io/collector/processor" "go.opentelemetry.io/collector/processor/processortest" ) @@ -21,12 +23,18 @@ type componentTestTelemetry struct { meterProvider *sdkmetric.MeterProvider } -func (tt *componentTestTelemetry) NewCreateSettings() processor.CreateSettings { - settings := processortest.NewNopCreateSettings() - settings.MeterProvider = tt.meterProvider - settings.ID = component.NewID(component.MustNewType("groupbyattrs")) +func (tt *componentTestTelemetry) NewSettings() processor.Settings { + set := processortest.NewNopSettings() + set.ID = component.NewID(component.MustNewType("groupbyattrs")) + set.TelemetrySettings = tt.newTelemetrySettings() + return set +} - return settings +func (tt *componentTestTelemetry) newTelemetrySettings() component.TelemetrySettings { + set := componenttest.NewNopTelemetrySettings() + set.MeterProvider = tt.meterProvider + set.MetricsLevel = configtelemetry.LevelDetailed + return set } func setupTestTelemetry() componentTestTelemetry { diff --git a/processor/groupbyattrsprocessor/generated_component_test.go b/processor/groupbyattrsprocessor/generated_component_test.go index 8dd4a8be1c3e..3b42427401f3 100644 --- a/processor/groupbyattrsprocessor/generated_component_test.go +++ b/processor/groupbyattrsprocessor/generated_component_test.go @@ -33,27 +33,27 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsProcessor(ctx, set, cfg, consumertest.NewNop()) + createFn: func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg, consumertest.NewNop()) }, }, { name: "metrics", - createFn: func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsProcessor(ctx, set, cfg, consumertest.NewNop()) + createFn: func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg, consumertest.NewNop()) }, }, { name: "traces", - createFn: func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesProcessor(ctx, set, cfg, consumertest.NewNop()) + createFn: func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg, consumertest.NewNop()) }, }, } @@ -65,21 +65,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), processortest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), processortest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), processortest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), processortest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(processor.Logs) require.True(t, ok) diff --git a/processor/groupbyattrsprocessor/go.mod b/processor/groupbyattrsprocessor/go.mod index fbdb2485bafa..922f83a4f984 100644 --- a/processor/groupbyattrsprocessor/go.mod +++ b/processor/groupbyattrsprocessor/go.mod @@ -1,57 +1,59 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/processor v0.102.0 - go.opentelemetry.io/otel v1.27.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/sdk/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/processor v0.116.0 + go.opentelemetry.io/collector/processor/processortest v0.116.0 + go.opentelemetry.io/otel v1.32.0 + go.opentelemetry.io/otel/metric v1.32.0 + go.opentelemetry.io/otel/sdk/metric v1.32.0 + go.opentelemetry.io/otel/trace v1.32.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/pdata/testdata v0.102.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + go.opentelemetry.io/collector/component/componentstatus v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/testdata v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/processor/xprocessor v0.116.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/processor/groupbyattrsprocessor/go.sum b/processor/groupbyattrsprocessor/go.sum index 394c41a60040..189409ced908 100644 --- a/processor/groupbyattrsprocessor/go.sum +++ b/processor/groupbyattrsprocessor/go.sum @@ -1,19 +1,19 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -27,8 +27,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -44,50 +44,54 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/processor v0.102.0 h1:JsjTlpBRmoSYxcu3cAbKBchOmL6aNUxLa03ZkWIqZr8= -go.opentelemetry.io/collector/processor v0.102.0/go.mod h1:IaCSDcfy75uQTaOM+LgR1bMf/bUw2eFfzn20uvWYfLQ= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/processor v0.116.0 h1:Kyu4tPzTdWNHtZjcxvI/bGNAgyv8L8Kem2r/Mk4IDAw= +go.opentelemetry.io/collector/processor v0.116.0/go.mod h1:+/Ugy48RAxlZEXmN2cw51W8t5wdHS9No+GAoP+moskk= +go.opentelemetry.io/collector/processor/processortest v0.116.0 h1:+IqNEVEE0E2MsO2g7+Y/9dz35sDuvAXRXrLts9NdXrA= +go.opentelemetry.io/collector/processor/processortest v0.116.0/go.mod h1:DLaQDBxzgeeaUO0ULMn/efos9PmHZkmYCHuxwCsiVHI= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0 h1:iin/UwuWvSLB7ZNfINFUYbZ5lxIi1NjZ2brkyyFdiRA= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0/go.mod h1:cnA43/XpKDbaOmd8buqKp/LGJ2l/OoCqbR//u5DMfn8= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -103,20 +107,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -125,12 +129,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/processor/groupbyattrsprocessor/internal/metadata/generated_status.go b/processor/groupbyattrsprocessor/internal/metadata/generated_status.go index 444eeb337a9a..2e51ce799c82 100644 --- a/processor/groupbyattrsprocessor/internal/metadata/generated_status.go +++ b/processor/groupbyattrsprocessor/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("groupbyattrs") + Type = component.MustNewType("groupbyattrs") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor" ) const ( diff --git a/processor/groupbyattrsprocessor/internal/metadata/generated_telemetry.go b/processor/groupbyattrsprocessor/internal/metadata/generated_telemetry.go index 38038b7a7eb1..a2d3472e7d22 100644 --- a/processor/groupbyattrsprocessor/internal/metadata/generated_telemetry.go +++ b/processor/groupbyattrsprocessor/internal/metadata/generated_telemetry.go @@ -14,16 +14,17 @@ import ( ) func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/groupbyattrs") + return settings.MeterProvider.Meter("github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor") } func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/groupbyattrs") + return settings.TracerProvider.Tracer("github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor") } // TelemetryBuilder provides an interface for components to report telemetry // as defined in metadata and user config. type TelemetryBuilder struct { + meter metric.Meter ProcessorGroupbyattrsLogGroups metric.Int64Histogram ProcessorGroupbyattrsMetricGroups metric.Int64Histogram ProcessorGroupbyattrsNumGroupedLogs metric.Int64Counter @@ -33,88 +34,88 @@ type TelemetryBuilder struct { ProcessorGroupbyattrsNumNonGroupedMetrics metric.Int64Counter ProcessorGroupbyattrsNumNonGroupedSpans metric.Int64Counter ProcessorGroupbyattrsSpanGroups metric.Int64Histogram - level configtelemetry.Level } -// telemetryBuilderOption applies changes to default builder. -type telemetryBuilderOption func(*TelemetryBuilder) +// TelemetryBuilderOption applies changes to default builder. +type TelemetryBuilderOption interface { + apply(*TelemetryBuilder) +} -// WithLevel sets the current telemetry level for the component. -func WithLevel(lvl configtelemetry.Level) telemetryBuilderOption { - return func(builder *TelemetryBuilder) { - builder.level = lvl - } +type telemetryBuilderOptionFunc func(mb *TelemetryBuilder) + +func (tbof telemetryBuilderOptionFunc) apply(mb *TelemetryBuilder) { + tbof(mb) } // NewTelemetryBuilder provides a struct with methods to update all internal telemetry // for a component -func NewTelemetryBuilder(settings component.TelemetrySettings, options ...telemetryBuilderOption) (*TelemetryBuilder, error) { - builder := TelemetryBuilder{level: configtelemetry.LevelBasic} +func NewTelemetryBuilder(settings component.TelemetrySettings, options ...TelemetryBuilderOption) (*TelemetryBuilder, error) { + builder := TelemetryBuilder{} for _, op := range options { - op(&builder) - } - var ( - err, errs error - meter metric.Meter - ) - if builder.level >= configtelemetry.LevelBasic { - meter = Meter(settings) - } else { - meter = noop.Meter{} + op.apply(&builder) } - builder.ProcessorGroupbyattrsLogGroups, err = meter.Int64Histogram( - "processor_groupbyattrs_log_groups", + builder.meter = Meter(settings) + var err, errs error + builder.ProcessorGroupbyattrsLogGroups, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Histogram( + "otelcol_processor_groupbyattrs_log_groups", metric.WithDescription("Distribution of groups extracted for logs"), metric.WithUnit("1"), ) errs = errors.Join(errs, err) - builder.ProcessorGroupbyattrsMetricGroups, err = meter.Int64Histogram( - "processor_groupbyattrs_metric_groups", + builder.ProcessorGroupbyattrsMetricGroups, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Histogram( + "otelcol_processor_groupbyattrs_metric_groups", metric.WithDescription("Distribution of groups extracted for metrics"), metric.WithUnit("1"), ) errs = errors.Join(errs, err) - builder.ProcessorGroupbyattrsNumGroupedLogs, err = meter.Int64Counter( - "processor_groupbyattrs_num_grouped_logs", + builder.ProcessorGroupbyattrsNumGroupedLogs, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_processor_groupbyattrs_num_grouped_logs", metric.WithDescription("Number of logs that had attributes grouped"), metric.WithUnit("1"), ) errs = errors.Join(errs, err) - builder.ProcessorGroupbyattrsNumGroupedMetrics, err = meter.Int64Counter( - "processor_groupbyattrs_num_grouped_metrics", + builder.ProcessorGroupbyattrsNumGroupedMetrics, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_processor_groupbyattrs_num_grouped_metrics", metric.WithDescription("Number of metrics that had attributes grouped"), metric.WithUnit("1"), ) errs = errors.Join(errs, err) - builder.ProcessorGroupbyattrsNumGroupedSpans, err = meter.Int64Counter( - "processor_groupbyattrs_num_grouped_spans", + builder.ProcessorGroupbyattrsNumGroupedSpans, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_processor_groupbyattrs_num_grouped_spans", metric.WithDescription("Number of spans that had attributes grouped"), metric.WithUnit("1"), ) errs = errors.Join(errs, err) - builder.ProcessorGroupbyattrsNumNonGroupedLogs, err = meter.Int64Counter( - "processor_groupbyattrs_num_non_grouped_logs", + builder.ProcessorGroupbyattrsNumNonGroupedLogs, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_processor_groupbyattrs_num_non_grouped_logs", metric.WithDescription("Number of logs that did not have attributes grouped"), metric.WithUnit("1"), ) errs = errors.Join(errs, err) - builder.ProcessorGroupbyattrsNumNonGroupedMetrics, err = meter.Int64Counter( - "processor_groupbyattrs_num_non_grouped_metrics", + builder.ProcessorGroupbyattrsNumNonGroupedMetrics, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_processor_groupbyattrs_num_non_grouped_metrics", metric.WithDescription("Number of metrics that did not have attributes grouped"), metric.WithUnit("1"), ) errs = errors.Join(errs, err) - builder.ProcessorGroupbyattrsNumNonGroupedSpans, err = meter.Int64Counter( - "processor_groupbyattrs_num_non_grouped_spans", + builder.ProcessorGroupbyattrsNumNonGroupedSpans, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_processor_groupbyattrs_num_non_grouped_spans", metric.WithDescription("Number of spans that did not have attributes grouped"), metric.WithUnit("1"), ) errs = errors.Join(errs, err) - builder.ProcessorGroupbyattrsSpanGroups, err = meter.Int64Histogram( - "processor_groupbyattrs_span_groups", + builder.ProcessorGroupbyattrsSpanGroups, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Histogram( + "otelcol_processor_groupbyattrs_span_groups", metric.WithDescription("Distribution of groups extracted for spans"), metric.WithUnit("1"), ) errs = errors.Join(errs, err) return &builder, errs } + +func getLeveledMeter(meter metric.Meter, cfgLevel, srvLevel configtelemetry.Level) metric.Meter { + if cfgLevel <= srvLevel { + return meter + } + return noop.Meter{} +} diff --git a/processor/groupbyattrsprocessor/internal/metadata/generated_telemetry_test.go b/processor/groupbyattrsprocessor/internal/metadata/generated_telemetry_test.go index 64ef0a52037c..2ddc375e5d6b 100644 --- a/processor/groupbyattrsprocessor/internal/metadata/generated_telemetry_test.go +++ b/processor/groupbyattrsprocessor/internal/metadata/generated_telemetry_test.go @@ -14,6 +14,7 @@ import ( nooptrace "go.opentelemetry.io/otel/trace/noop" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" ) type mockMeter struct { @@ -49,28 +50,25 @@ func TestProviders(t *testing.T) { meter := Meter(set) if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/groupbyattrs", m.name) + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor", m.name) } else { require.Fail(t, "returned Meter not mockMeter") } tracer := Tracer(set) if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/groupbyattrs", m.name) + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor", m.name) } else { require.Fail(t, "returned Meter not mockTracer") } } func TestNewTelemetryBuilder(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } + set := componenttest.NewNopTelemetrySettings() applied := false - _, err := NewTelemetryBuilder(set, func(b *TelemetryBuilder) { + _, err := NewTelemetryBuilder(set, telemetryBuilderOptionFunc(func(b *TelemetryBuilder) { applied = true - }) + })) require.NoError(t, err) require.True(t, applied) } diff --git a/processor/groupbyattrsprocessor/metadata.yaml b/processor/groupbyattrsprocessor/metadata.yaml index 7db4cd69d3ee..f6917f563813 100644 --- a/processor/groupbyattrsprocessor/metadata.yaml +++ b/processor/groupbyattrsprocessor/metadata.yaml @@ -1,11 +1,10 @@ type: groupbyattrs -scope_name: otelcol/groupbyattrs status: class: processor stability: beta: [traces, metrics, logs] - distributions: [contrib] + distributions: [contrib, k8s] warnings: [] codeowners: active: [rnishtala-sumo] @@ -17,60 +16,60 @@ telemetry: processor_groupbyattrs_num_grouped_spans: enabled: true description: Number of spans that had attributes grouped - unit: 1 + unit: "1" sum: value_type: int monotonic: true processor_groupbyattrs_num_non_grouped_spans: enabled: true description: Number of spans that did not have attributes grouped - unit: 1 + unit: "1" sum: value_type: int monotonic: true processor_groupbyattrs_span_groups: enabled: true description: Distribution of groups extracted for spans - unit: 1 + unit: "1" histogram: value_type: int processor_groupbyattrs_num_grouped_logs: enabled: true description: Number of logs that had attributes grouped - unit: 1 + unit: "1" sum: value_type: int monotonic: true processor_groupbyattrs_num_non_grouped_logs: enabled: true description: Number of logs that did not have attributes grouped - unit: 1 + unit: "1" sum: value_type: int monotonic: true processor_groupbyattrs_log_groups: enabled: true description: Distribution of groups extracted for logs - unit: 1 + unit: "1" histogram: value_type: int processor_groupbyattrs_num_grouped_metrics: enabled: true description: Number of metrics that had attributes grouped - unit: 1 + unit: "1" sum: value_type: int monotonic: true processor_groupbyattrs_num_non_grouped_metrics: enabled: true description: Number of metrics that did not have attributes grouped - unit: 1 + unit: "1" sum: value_type: int monotonic: true processor_groupbyattrs_metric_groups: enabled: true description: Distribution of groups extracted for metrics - unit: 1 + unit: "1" histogram: value_type: int diff --git a/processor/groupbyattrsprocessor/processor.go b/processor/groupbyattrsprocessor/processor.go index 734721bebe22..ac1b14224267 100644 --- a/processor/groupbyattrsprocessor/processor.go +++ b/processor/groupbyattrsprocessor/processor.go @@ -90,7 +90,6 @@ func (gap *groupByAttrsProcessor) processLogs(ctx context.Context, ld plog.Logs) log.CopyTo(lr) } } - } // Copy the grouped data into output @@ -114,7 +113,6 @@ func (gap *groupByAttrsProcessor) processMetrics(ctx context.Context, md pmetric //exhaustive:enforce switch metric.Type() { - case pmetric.MetricTypeGauge: for pointIndex := 0; pointIndex < metric.Gauge().DataPoints().Len(); pointIndex++ { dataPoint := metric.Gauge().DataPoints().At(pointIndex) @@ -174,7 +172,6 @@ func deleteAttributes(attrsForRemoval, targetAttrs pcommon.Map) { // - whether any attribute matched (true) or none (false) // - the extracted AttributeMap of matching keys and their corresponding values func (gap *groupByAttrsProcessor) extractGroupingAttributes(attrMap pcommon.Map) (bool, pcommon.Map) { - groupingAttributes := pcommon.NewMap() foundMatch := false @@ -191,7 +188,6 @@ func (gap *groupByAttrsProcessor) extractGroupingAttributes(attrMap pcommon.Map) // Searches for metric with same name in the specified InstrumentationLibrary and returns it. If nothing is found, create it. func getMetricInInstrumentationLibrary(ilm pmetric.ScopeMetrics, searchedMetric pmetric.Metric) pmetric.Metric { - // Loop through all metrics and try to find the one that matches with the one we search for // (name and type) for i := 0; i < ilm.Metrics().Len(); i++ { @@ -206,11 +202,11 @@ func getMetricInInstrumentationLibrary(ilm pmetric.ScopeMetrics, searchedMetric metric.SetDescription(searchedMetric.Description()) metric.SetName(searchedMetric.Name()) metric.SetUnit(searchedMetric.Unit()) + searchedMetric.Metadata().CopyTo(metric.Metadata()) // Move other special type specific values //exhaustive:enforce switch searchedMetric.Type() { - case pmetric.MetricTypeHistogram: metric.SetEmptyHistogram().SetAggregationTemporality(searchedMetric.Histogram().AggregationTemporality()) @@ -242,7 +238,6 @@ func (gap *groupByAttrsProcessor) getGroupedMetricsFromAttributes( metric pmetric.Metric, attributes pcommon.Map, ) pmetric.Metric { - toBeGrouped, requiredAttributes := gap.extractGroupingAttributes(attributes) if toBeGrouped { gap.telemetryBuilder.ProcessorGroupbyattrsNumGroupedMetrics.Add(ctx, 1) @@ -261,5 +256,4 @@ func (gap *groupByAttrsProcessor) getGroupedMetricsFromAttributes( // Return the metric in this resource return getMetricInInstrumentationLibrary(groupedInstrumentationLibrary, metric) - } diff --git a/processor/groupbyattrsprocessor/processor_test.go b/processor/groupbyattrsprocessor/processor_test.go index 863b393841d7..cb0465955ffc 100644 --- a/processor/groupbyattrsprocessor/processor_test.go +++ b/processor/groupbyattrsprocessor/processor_test.go @@ -18,11 +18,11 @@ import ( "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" "go.opentelemetry.io/collector/processor/processortest" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/sdk/metric/metricdata" ) -var ( - attrMap = prepareAttributeMap() -) +var attrMap = prepareAttributeMap() func prepareAttributeMap() pcommon.Map { am := pcommon.NewMap() @@ -270,8 +270,8 @@ func TestComplexAttributeGrouping(t *testing.T) { inputMetrics := someComplexMetrics(tt.withResourceAttrIndex, tt.inputResourceCount, tt.inputInstrumentationLibraryCount, 2) inputHistogramMetrics := someComplexHistogramMetrics(tt.withResourceAttrIndex, tt.inputResourceCount, tt.inputInstrumentationLibraryCount, 2, 2) - tel := setupTelemetry() - gap, err := createGroupByAttrsProcessor(tel.NewProcessorCreateSettings(), tt.groupByKeys) + tel := setupTestTelemetry() + gap, err := createGroupByAttrsProcessor(tel.NewSettings(), tt.groupByKeys) require.NoError(t, err) processedLogs, err := gap.processLogs(context.Background(), inputLogs) @@ -364,30 +364,220 @@ func TestComplexAttributeGrouping(t *testing.T) { metrics := rm.ScopeMetrics().At(j).Metrics() for k := 0; k < metrics.Len(); k++ { metric := metrics.At(k) - assert.Equal(t, metric.Histogram().AggregationTemporality(), pmetric.AggregationTemporalityCumulative) + assert.Equal(t, pmetric.AggregationTemporalityCumulative, metric.Histogram().AggregationTemporality()) for l := 0; l < metric.Histogram().DataPoints().Len(); l++ { assert.EqualValues(t, outputRecordAttrs, metric.Histogram().DataPoints().At(l).Attributes()) } } } } - - expected := expectedMetrics{} + var want []metricdata.Metrics if tt.shouldMoveCommonGroupedAttr { - expected.mDistLogGroups = int64(tt.outputResourceCount) - expected.mNumGroupedLogs = int64(tt.outputTotalRecordsCount) - - expected.mDistMetricGroups = int64(tt.outputResourceCount) - expected.mNumGroupedMetrics = 4 * int64(tt.outputTotalRecordsCount) - - expected.mDistSpanGroups = int64(tt.outputResourceCount) - expected.mNumGroupedSpans = int64(tt.outputTotalRecordsCount) + want = []metricdata.Metrics{ + { + Name: "otelcol_processor_groupbyattrs_num_grouped_logs", + Description: "Number of logs that had attributes grouped", + Unit: "1", + Data: metricdata.Sum[int64]{ + Temporality: metricdata.CumulativeTemporality, + IsMonotonic: true, + DataPoints: []metricdata.DataPoint[int64]{ + { + Value: int64(tt.outputTotalRecordsCount), + }, + }, + }, + }, + { + Name: "otelcol_processor_groupbyattrs_num_grouped_metrics", + Description: "Number of metrics that had attributes grouped", + Unit: "1", + Data: metricdata.Sum[int64]{ + Temporality: metricdata.CumulativeTemporality, + IsMonotonic: true, + DataPoints: []metricdata.DataPoint[int64]{ + { + Value: 4 * int64(tt.outputTotalRecordsCount), + }, + }, + }, + }, + { + Name: "otelcol_processor_groupbyattrs_num_grouped_spans", + Description: "Number of spans that had attributes grouped", + Unit: "1", + Data: metricdata.Sum[int64]{ + Temporality: metricdata.CumulativeTemporality, + IsMonotonic: true, + DataPoints: []metricdata.DataPoint[int64]{ + { + Value: int64(tt.outputTotalRecordsCount), + }, + }, + }, + }, + { + Name: "otelcol_processor_groupbyattrs_log_groups", + Description: "Distribution of groups extracted for logs", + Unit: "1", + Data: metricdata.Histogram[int64]{ + Temporality: metricdata.CumulativeTemporality, + DataPoints: []metricdata.HistogramDataPoint[int64]{ + { + Attributes: *attribute.EmptySet(), + Bounds: []float64{0, 5, 10, 25, 50, 75, 100, 250, 500, 750, 1000, 2500, 5000, 7500, 10000}, + BucketCounts: []uint64{0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + Count: 1, + Min: metricdata.NewExtrema(int64(tt.outputResourceCount)), + Max: metricdata.NewExtrema(int64(tt.outputResourceCount)), + Sum: int64(tt.outputResourceCount), + }, + }, + }, + }, + { + Name: "otelcol_processor_groupbyattrs_metric_groups", + Description: "Distribution of groups extracted for metrics", + Unit: "1", + Data: metricdata.Histogram[int64]{ + Temporality: metricdata.CumulativeTemporality, + DataPoints: []metricdata.HistogramDataPoint[int64]{ + { + Attributes: *attribute.EmptySet(), + Bounds: []float64{0, 5, 10, 25, 50, 75, 100, 250, 500, 750, 1000, 2500, 5000, 7500, 10000}, + BucketCounts: []uint64{0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + Count: 2, + Min: metricdata.NewExtrema(int64(tt.outputResourceCount)), + Max: metricdata.NewExtrema(int64(tt.outputResourceCount)), + Sum: 2 * int64(tt.outputResourceCount), + }, + }, + }, + }, + { + Name: "otelcol_processor_groupbyattrs_span_groups", + Description: "Distribution of groups extracted for spans", + Unit: "1", + Data: metricdata.Histogram[int64]{ + Temporality: metricdata.CumulativeTemporality, + DataPoints: []metricdata.HistogramDataPoint[int64]{ + { + Attributes: *attribute.EmptySet(), + Bounds: []float64{0, 5, 10, 25, 50, 75, 100, 250, 500, 750, 1000, 2500, 5000, 7500, 10000}, + BucketCounts: []uint64{0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + Count: 1, + Min: metricdata.NewExtrema(int64(tt.outputResourceCount)), + Max: metricdata.NewExtrema(int64(tt.outputResourceCount)), + Sum: int64(tt.outputResourceCount), + }, + }, + }, + }, + } } else { - expected.mNumNonGroupedLogs = int64(tt.outputTotalRecordsCount) - expected.mNumNonGroupedMetrics = 4 * int64(tt.outputTotalRecordsCount) - expected.mNumNonGroupedSpans = int64(tt.outputTotalRecordsCount) + want = []metricdata.Metrics{ + { + Name: "otelcol_processor_groupbyattrs_num_non_grouped_logs", + Description: "Number of logs that did not have attributes grouped", + Unit: "1", + Data: metricdata.Sum[int64]{ + Temporality: metricdata.CumulativeTemporality, + IsMonotonic: true, + DataPoints: []metricdata.DataPoint[int64]{ + { + Value: int64(tt.outputTotalRecordsCount), + }, + }, + }, + }, + { + Name: "otelcol_processor_groupbyattrs_num_non_grouped_metrics", + Description: "Number of metrics that did not have attributes grouped", + Unit: "1", + Data: metricdata.Sum[int64]{ + Temporality: metricdata.CumulativeTemporality, + IsMonotonic: true, + DataPoints: []metricdata.DataPoint[int64]{ + { + Value: 4 * int64(tt.outputTotalRecordsCount), + }, + }, + }, + }, + { + Name: "otelcol_processor_groupbyattrs_num_non_grouped_spans", + Description: "Number of spans that did not have attributes grouped", + Unit: "1", + Data: metricdata.Sum[int64]{ + Temporality: metricdata.CumulativeTemporality, + IsMonotonic: true, + DataPoints: []metricdata.DataPoint[int64]{ + { + Value: int64(tt.outputTotalRecordsCount), + }, + }, + }, + }, + { + Name: "otelcol_processor_groupbyattrs_log_groups", + Description: "Distribution of groups extracted for logs", + Unit: "1", + Data: metricdata.Histogram[int64]{ + Temporality: metricdata.CumulativeTemporality, + DataPoints: []metricdata.HistogramDataPoint[int64]{ + { + Attributes: *attribute.EmptySet(), + Bounds: []float64{0, 5, 10, 25, 50, 75, 100, 250, 500, 750, 1000, 2500, 5000, 7500, 10000}, + BucketCounts: []uint64{0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + Count: 1, + Min: metricdata.NewExtrema(int64(tt.outputResourceCount)), + Max: metricdata.NewExtrema(int64(tt.outputResourceCount)), + Sum: int64(tt.outputResourceCount), + }, + }, + }, + }, + { + Name: "otelcol_processor_groupbyattrs_metric_groups", + Description: "Distribution of groups extracted for metrics", + Unit: "1", + Data: metricdata.Histogram[int64]{ + Temporality: metricdata.CumulativeTemporality, + DataPoints: []metricdata.HistogramDataPoint[int64]{ + { + Attributes: *attribute.EmptySet(), + Bounds: []float64{0, 5, 10, 25, 50, 75, 100, 250, 500, 750, 1000, 2500, 5000, 7500, 10000}, + BucketCounts: []uint64{0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + Count: 2, + Min: metricdata.NewExtrema(int64(tt.outputResourceCount)), + Max: metricdata.NewExtrema(int64(tt.outputResourceCount)), + Sum: 2 * int64(tt.outputResourceCount), + }, + }, + }, + }, + { + Name: "otelcol_processor_groupbyattrs_span_groups", + Description: "Distribution of groups extracted for spans", + Unit: "1", + Data: metricdata.Histogram[int64]{ + Temporality: metricdata.CumulativeTemporality, + DataPoints: []metricdata.HistogramDataPoint[int64]{ + { + Attributes: *attribute.EmptySet(), + Bounds: []float64{0, 5, 10, 25, 50, 75, 100, 250, 500, 750, 1000, 2500, 5000, 7500, 10000}, + BucketCounts: []uint64{0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + Count: 1, + Min: metricdata.NewExtrema(int64(tt.outputResourceCount)), + Max: metricdata.NewExtrema(int64(tt.outputResourceCount)), + Sum: int64(tt.outputResourceCount), + }, + }, + }, + }, + } } - tel.assertMetrics(t, expected) + tel.assertMetrics(t, want) }) } } @@ -435,7 +625,7 @@ func TestAttributeGrouping(t *testing.T) { histogramMetrics := someHistogramMetrics(attrMap, 1, tt.count) exponentialHistogramMetrics := someExponentialHistogramMetrics(attrMap, 1, tt.count) - gap, err := createGroupByAttrsProcessor(processortest.NewNopCreateSettings(), tt.groupByKeys) + gap, err := createGroupByAttrsProcessor(processortest.NewNopSettings(), tt.groupByKeys) require.NoError(t, err) expectedResource := prepareResource(attrMap, tt.groupByKeys) @@ -653,7 +843,6 @@ func someExponentialHistogramMetrics(attrs pcommon.Map, instrumentationLibraryCo } func TestMetricAdvancedGrouping(t *testing.T) { - // Input: // // Resource {host.name="localhost"} @@ -747,7 +936,7 @@ func TestMetricAdvancedGrouping(t *testing.T) { datapoint.Attributes().PutStr("id", "eth0") // Perform the test - gap, err := createGroupByAttrsProcessor(processortest.NewNopCreateSettings(), []string{"host.name"}) + gap, err := createGroupByAttrsProcessor(processortest.NewNopSettings(), []string{"host.name"}) require.NoError(t, err) processedMetrics, err := gap.processMetrics(context.Background(), metrics) @@ -832,7 +1021,7 @@ func TestCompacting(t *testing.T) { assert.Equal(t, 100, logs.ResourceLogs().Len()) assert.Equal(t, 100, metrics.ResourceMetrics().Len()) - gap, err := createGroupByAttrsProcessor(processortest.NewNopCreateSettings(), []string{}) + gap, err := createGroupByAttrsProcessor(processortest.NewNopSettings(), []string{}) require.NoError(t, err) processedSpans, err := gap.processTraces(context.Background(), spans) @@ -869,6 +1058,59 @@ func TestCompacting(t *testing.T) { } } +func Test_GetMetricInInstrumentationLibrary(t *testing.T) { + // input metric with datapoint + m := pmetric.NewMetric() + m.SetName("metric") + m.SetDescription("description") + m.SetUnit("unit") + d := m.SetEmptyGauge().DataPoints().AppendEmpty() + d.SetDoubleValue(1.0) + + // expected metric without datapoint + // the datapoints are not copied to the resulting metric, since + // datapoints are moved in between metrics in the processor + m2 := pmetric.NewMetric() + m2.SetName("metric") + m2.SetDescription("description") + m2.SetUnit("unit") + m2.SetEmptyGauge() + + metadata := pcommon.NewMap() + metadata.PutStr("key", "val") + metadata.CopyTo(m.Metadata()) + metadata.CopyTo(m2.Metadata()) + + sm := pmetric.NewScopeMetrics() + m.CopyTo(sm.Metrics().AppendEmpty()) + + tests := []struct { + name string + ilm pmetric.ScopeMetrics + searched pmetric.Metric + want pmetric.Metric + }{ + { + name: "existing metric", + ilm: sm, + searched: m, + want: m, + }, + { + name: "non-existing metric - datapoints will be removed", + ilm: pmetric.NewScopeMetrics(), + searched: m, + want: m2, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + require.Equal(t, tt.want, getMetricInInstrumentationLibrary(tt.ilm, tt.searched)) + }) + } +} + func BenchmarkCompacting(bb *testing.B) { runs := []struct { ilCount int @@ -891,7 +1133,7 @@ func BenchmarkCompacting(bb *testing.B) { for _, run := range runs { bb.Run(fmt.Sprintf("instrumentation_library_count=%d, spans_per_library_count=%d", run.ilCount, run.spanCount), func(b *testing.B) { spans := someSpans(attrMap, run.ilCount, run.spanCount) - gap, err := createGroupByAttrsProcessor(processortest.NewNopCreateSettings(), []string{}) + gap, err := createGroupByAttrsProcessor(processortest.NewNopSettings(), []string{}) require.NoError(b, err) b.ResetTimer() diff --git a/processor/groupbyattrsprocessor/telemetry_test.go b/processor/groupbyattrsprocessor/telemetry_test.go deleted file mode 100644 index 885b24c85456..000000000000 --- a/processor/groupbyattrsprocessor/telemetry_test.go +++ /dev/null @@ -1,258 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package groupbyattrsprocessor - -import ( - "context" - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/processor" - "go.opentelemetry.io/collector/processor/processortest" - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/sdk/metric" - "go.opentelemetry.io/otel/sdk/metric/metricdata" - "go.opentelemetry.io/otel/sdk/metric/metricdata/metricdatatest" - - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor/internal/metadata" -) - -type testTelemetry struct { - reader *metric.ManualReader - meterProvider *metric.MeterProvider -} - -type expectedMetrics struct { - mNumGroupedSpans int64 - mNumNonGroupedSpans int64 - mDistSpanGroups int64 - - mNumGroupedLogs int64 - mNumNonGroupedLogs int64 - mDistLogGroups int64 - - mNumGroupedMetrics int64 - mNumNonGroupedMetrics int64 - mDistMetricGroups int64 -} - -func setupTelemetry() testTelemetry { - reader := metric.NewManualReader() - return testTelemetry{ - reader: reader, - meterProvider: metric.NewMeterProvider(metric.WithReader(reader)), - } -} - -func (tt *testTelemetry) assertMetrics(t *testing.T, expected expectedMetrics) { - var md metricdata.ResourceMetrics - require.NoError(t, tt.reader.Collect(context.Background(), &md)) - if expected.mNumGroupedLogs > 0 { - name := "processor_groupbyattrs_num_grouped_logs" - got := tt.getMetric(name, md) - want := metricdata.Metrics{ - Name: name, - Description: "Number of logs that had attributes grouped", - Unit: "1", - Data: metricdata.Sum[int64]{ - Temporality: metricdata.CumulativeTemporality, - IsMonotonic: true, - DataPoints: []metricdata.DataPoint[int64]{ - { - Value: expected.mNumGroupedLogs, - }, - }, - }, - } - metricdatatest.AssertEqual(t, want, got, metricdatatest.IgnoreTimestamp()) - } - if expected.mNumGroupedMetrics > 0 { - name := "processor_groupbyattrs_num_grouped_metrics" - got := tt.getMetric(name, md) - want := metricdata.Metrics{ - Name: name, - Description: "Number of metrics that had attributes grouped", - Unit: "1", - Data: metricdata.Sum[int64]{ - Temporality: metricdata.CumulativeTemporality, - IsMonotonic: true, - DataPoints: []metricdata.DataPoint[int64]{ - { - Value: expected.mNumGroupedMetrics, - }, - }, - }, - } - metricdatatest.AssertEqual(t, want, got, metricdatatest.IgnoreTimestamp()) - } - if expected.mNumGroupedSpans > 0 { - name := "processor_groupbyattrs_num_grouped_spans" - got := tt.getMetric(name, md) - want := metricdata.Metrics{ - Name: name, - Description: "Number of spans that had attributes grouped", - Unit: "1", - Data: metricdata.Sum[int64]{ - Temporality: metricdata.CumulativeTemporality, - IsMonotonic: true, - DataPoints: []metricdata.DataPoint[int64]{ - { - Value: expected.mNumGroupedSpans, - }, - }, - }, - } - metricdatatest.AssertEqual(t, want, got, metricdatatest.IgnoreTimestamp()) - } - if expected.mNumNonGroupedLogs > 0 { - name := "processor_groupbyattrs_num_non_grouped_logs" - got := tt.getMetric(name, md) - want := metricdata.Metrics{ - Name: name, - Description: "Number of logs that did not have attributes grouped", - Unit: "1", - Data: metricdata.Sum[int64]{ - Temporality: metricdata.CumulativeTemporality, - IsMonotonic: true, - DataPoints: []metricdata.DataPoint[int64]{ - { - Value: expected.mNumNonGroupedLogs, - }, - }, - }, - } - metricdatatest.AssertEqual(t, want, got, metricdatatest.IgnoreTimestamp()) - } - if expected.mNumNonGroupedMetrics > 0 { - name := "processor_groupbyattrs_num_non_grouped_metrics" - got := tt.getMetric(name, md) - want := metricdata.Metrics{ - Name: name, - Description: "Number of metrics that did not have attributes grouped", - Unit: "1", - Data: metricdata.Sum[int64]{ - Temporality: metricdata.CumulativeTemporality, - IsMonotonic: true, - DataPoints: []metricdata.DataPoint[int64]{ - { - Value: expected.mNumNonGroupedMetrics, - }, - }, - }, - } - metricdatatest.AssertEqual(t, want, got, metricdatatest.IgnoreTimestamp()) - } - if expected.mNumNonGroupedSpans > 0 { - name := "processor_groupbyattrs_num_non_grouped_spans" - got := tt.getMetric(name, md) - want := metricdata.Metrics{ - Name: name, - Description: "Number of spans that did not have attributes grouped", - Unit: "1", - Data: metricdata.Sum[int64]{ - Temporality: metricdata.CumulativeTemporality, - IsMonotonic: true, - DataPoints: []metricdata.DataPoint[int64]{ - { - Value: expected.mNumNonGroupedSpans, - }, - }, - }, - } - metricdatatest.AssertEqual(t, want, got, metricdatatest.IgnoreTimestamp()) - } - if expected.mDistLogGroups > 0 { - name := "processor_groupbyattrs_log_groups" - got := tt.getMetric(name, md) - want := metricdata.Metrics{ - Name: name, - Description: "Distribution of groups extracted for logs", - Unit: "1", - Data: metricdata.Histogram[int64]{ - Temporality: metricdata.CumulativeTemporality, - DataPoints: []metricdata.HistogramDataPoint[int64]{ - { - Attributes: *attribute.EmptySet(), - Bounds: []float64{0, 5, 10, 25, 50, 75, 100, 250, 500, 750, 1000, 2500, 5000, 7500, 10000}, - BucketCounts: []uint64{0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - Count: 1, - Min: metricdata.NewExtrema(expected.mDistLogGroups), - Max: metricdata.NewExtrema(expected.mDistLogGroups), - Sum: expected.mDistLogGroups, - }, - }, - }, - } - metricdatatest.AssertEqual(t, want, got, metricdatatest.IgnoreTimestamp(), metricdatatest.IgnoreExemplars()) - } - if expected.mDistMetricGroups > 0 { - name := "processor_groupbyattrs_metric_groups" - got := tt.getMetric(name, md) - want := metricdata.Metrics{ - Name: name, - Description: "Distribution of groups extracted for metrics", - Unit: "1", - Data: metricdata.Histogram[int64]{ - Temporality: metricdata.CumulativeTemporality, - DataPoints: []metricdata.HistogramDataPoint[int64]{ - { - Attributes: *attribute.EmptySet(), - Bounds: []float64{0, 5, 10, 25, 50, 75, 100, 250, 500, 750, 1000, 2500, 5000, 7500, 10000}, - BucketCounts: []uint64{0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - Count: 2, - Min: metricdata.NewExtrema(expected.mDistMetricGroups), - Max: metricdata.NewExtrema(expected.mDistMetricGroups), - Sum: 2 * expected.mDistMetricGroups, - }, - }, - }, - } - metricdatatest.AssertEqual(t, want, got, metricdatatest.IgnoreTimestamp(), metricdatatest.IgnoreExemplars()) - } - if expected.mDistSpanGroups > 0 { - name := "processor_groupbyattrs_span_groups" - got := tt.getMetric(name, md) - want := metricdata.Metrics{ - Name: name, - Description: "Distribution of groups extracted for spans", - Unit: "1", - Data: metricdata.Histogram[int64]{ - Temporality: metricdata.CumulativeTemporality, - DataPoints: []metricdata.HistogramDataPoint[int64]{ - { - Attributes: *attribute.EmptySet(), - Bounds: []float64{0, 5, 10, 25, 50, 75, 100, 250, 500, 750, 1000, 2500, 5000, 7500, 10000}, - BucketCounts: []uint64{0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - Count: 1, - Min: metricdata.NewExtrema(expected.mDistSpanGroups), - Max: metricdata.NewExtrema(expected.mDistSpanGroups), - Sum: expected.mDistSpanGroups, - }, - }, - }, - } - metricdatatest.AssertEqual(t, want, got, metricdatatest.IgnoreTimestamp(), metricdatatest.IgnoreExemplars()) - } -} - -func (tt *testTelemetry) NewProcessorCreateSettings() processor.CreateSettings { - settings := processortest.NewNopCreateSettings() - settings.MeterProvider = tt.meterProvider - settings.ID = component.NewID(metadata.Type) - - return settings -} - -func (tt *testTelemetry) getMetric(name string, got metricdata.ResourceMetrics) metricdata.Metrics { - for _, sm := range got.ScopeMetrics { - for _, m := range sm.Metrics { - if m.Name == name { - return m - } - } - } - - return metricdata.Metrics{} -} diff --git a/processor/groupbytraceprocessor/README.md b/processor/groupbytraceprocessor/README.md index bea789f741db..c4fc5e14ba3a 100644 --- a/processor/groupbytraceprocessor/README.md +++ b/processor/groupbytraceprocessor/README.md @@ -3,13 +3,14 @@ | Status | | | ------------- |-----------| | Stability | [beta]: traces | -| Distributions | [contrib] | +| Distributions | [contrib], [k8s] | | Warnings | [Statefulness](#warnings) | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aprocessor%2Fgroupbytrace%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aprocessor%2Fgroupbytrace) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aprocessor%2Fgroupbytrace%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aprocessor%2Fgroupbytrace) | | [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@jpkrohling](https://www.github.com/jpkrohling) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s This processor collects all the spans from the same trace, waiting a diff --git a/processor/groupbytraceprocessor/config.go b/processor/groupbytraceprocessor/config.go index 6dcc6286ae1b..050512433f37 100644 --- a/processor/groupbytraceprocessor/config.go +++ b/processor/groupbytraceprocessor/config.go @@ -9,7 +9,6 @@ import ( // Config is the configuration for the processor. type Config struct { - // NumTraces is the max number of traces to keep in memory waiting for the duration. // Default: 1_000_000. NumTraces int `mapstructure:"num_traces"` diff --git a/processor/groupbytraceprocessor/documentation.md b/processor/groupbytraceprocessor/documentation.md new file mode 100644 index 000000000000..be8bb8183fe8 --- /dev/null +++ b/processor/groupbytraceprocessor/documentation.md @@ -0,0 +1,71 @@ +[comment]: <> (Code generated by mdatagen. DO NOT EDIT.) + +# groupbytrace + +## Internal Telemetry + +The following telemetry is emitted by this component. + +### otelcol_processor_groupbytrace_conf_num_traces + +Maximum number of traces to hold in the internal storage + +| Unit | Metric Type | Value Type | +| ---- | ----------- | ---------- | +| 1 | Gauge | Int | + +### otelcol_processor_groupbytrace_event_latency + +How long the queue events are taking to be processed + +| Unit | Metric Type | Value Type | +| ---- | ----------- | ---------- | +| ms | Histogram | Int | + +### otelcol_processor_groupbytrace_incomplete_releases + +Releases that are suspected to have been incomplete + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| {releases} | Sum | Int | true | + +### otelcol_processor_groupbytrace_num_events_in_queue + +Number of events currently in the queue + +| Unit | Metric Type | Value Type | +| ---- | ----------- | ---------- | +| 1 | Gauge | Int | + +### otelcol_processor_groupbytrace_num_traces_in_memory + +Number of traces currently in the in-memory storage + +| Unit | Metric Type | Value Type | +| ---- | ----------- | ---------- | +| 1 | Gauge | Int | + +### otelcol_processor_groupbytrace_spans_released + +Spans released to the next consumer + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| 1 | Sum | Int | true | + +### otelcol_processor_groupbytrace_traces_evicted + +Traces evicted from the internal buffer + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| 1 | Sum | Int | true | + +### otelcol_processor_groupbytrace_traces_released + +Traces released to the next consumer + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| 1 | Sum | Int | true | diff --git a/processor/groupbytraceprocessor/event.go b/processor/groupbytraceprocessor/event.go index d7c26ca1b449..58519db2652e 100644 --- a/processor/groupbytraceprocessor/event.go +++ b/processor/groupbytraceprocessor/event.go @@ -11,11 +11,13 @@ import ( "sync" "time" - "go.opencensus.io/stats" - "go.opencensus.io/tag" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric" "go.uber.org/zap" + + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor/internal/metadata" ) const ( @@ -44,15 +46,15 @@ var ( return &hash }, } - - eventTagKey = tag.MustNewKey("event") ) -type eventType int -type event struct { - typ eventType - payload any -} +type ( + eventType int + event struct { + typ eventType + payload any + } +) type tracesWithID struct { id pcommon.TraceID @@ -70,8 +72,8 @@ type eventMachine struct { metricsCollectionInterval time.Duration shutdownTimeout time.Duration - logger *zap.Logger - + logger *zap.Logger + telemetry *metadata.TelemetryBuilder onTraceReceived func(td tracesWithID, worker *eventMachineWorker) error onTraceExpired func(traceID pcommon.TraceID, worker *eventMachineWorker) error onTraceReleased func(rss []ptrace.ResourceSpans) error @@ -84,9 +86,10 @@ type eventMachine struct { closed bool } -func newEventMachine(logger *zap.Logger, bufferSize int, numWorkers int, numTraces int) *eventMachine { +func newEventMachine(logger *zap.Logger, bufferSize int, numWorkers int, numTraces int, telemetry *metadata.TelemetryBuilder) *eventMachine { em := &eventMachine{ logger: logger, + telemetry: telemetry, workers: make([]*eventMachineWorker, numWorkers), close: make(chan struct{}), shutdownLock: &sync.RWMutex{}, @@ -119,7 +122,7 @@ func (em *eventMachine) numEvents() int { func (em *eventMachine) periodicMetrics() { numEvents := em.numEvents() em.logger.Debug("recording current state of the queue", zap.Int("num-events", numEvents)) - stats.Record(context.Background(), mNumEventsInQueue.M(int64(numEvents))) + em.telemetry.ProcessorGroupbytraceNumEventsInQueue.Record(context.Background(), int64(numEvents)) em.shutdownLock.RLock() closed := em.closed @@ -288,8 +291,7 @@ func (em *eventMachine) handleEventWithObservability(event string, do func() err start := time.Now() succeeded, err := doWithTimeout(time.Second, do) duration := time.Since(start) - - _ = stats.RecordWithTags(context.Background(), []tag.Mutator{tag.Upsert(eventTagKey, event)}, mEventLatency.M(duration.Milliseconds())) + em.telemetry.ProcessorGroupbytraceEventLatency.Record(context.Background(), duration.Milliseconds(), metric.WithAttributeSet(attribute.NewSet(attribute.String("event", event)))) if err != nil { em.logger.Error("failed to process event", zap.Error(err), zap.String("event", event)) diff --git a/processor/groupbytraceprocessor/event_test.go b/processor/groupbytraceprocessor/event_test.go index 0f657c6472ce..eb7fd5065745 100644 --- a/processor/groupbytraceprocessor/event_test.go +++ b/processor/groupbytraceprocessor/event_test.go @@ -4,6 +4,7 @@ package groupbytraceprocessor import ( + "context" "errors" "strings" "sync" @@ -13,14 +14,19 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.opencensus.io/stats" - "go.opencensus.io/stats/view" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" + "go.opentelemetry.io/collector/processor/processortest" + "go.opentelemetry.io/otel/sdk/metric/metricdata" "go.uber.org/zap" + + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor/internal/metadata" ) func TestEventCallback(t *testing.T) { + set := processortest.NewNopSettings() + tel, _ := metadata.NewTelemetryBuilder(set.TelemetrySettings) + for _, tt := range []struct { casename string typ eventType @@ -80,7 +86,7 @@ func TestEventCallback(t *testing.T) { require.NoError(t, err) wg := &sync.WaitGroup{} - em := newEventMachine(logger, 50, 1, 1_000) + em := newEventMachine(logger, 50, 1, 1_000, tel) tt.registerCallback(em, wg) em.startInBackground() @@ -100,6 +106,8 @@ func TestEventCallback(t *testing.T) { } func TestEventCallbackNotSet(t *testing.T) { + set := processortest.NewNopSettings() + tel, _ := metadata.NewTelemetryBuilder(set.TelemetrySettings) for _, tt := range []struct { casename string typ eventType @@ -127,7 +135,7 @@ func TestEventCallbackNotSet(t *testing.T) { require.NoError(t, err) wg := &sync.WaitGroup{} - em := newEventMachine(logger, 50, 1, 1_000) + em := newEventMachine(logger, 50, 1, 1_000, tel) em.onError = func(_ event) { wg.Done() } @@ -147,6 +155,8 @@ func TestEventCallbackNotSet(t *testing.T) { } func TestEventInvalidPayload(t *testing.T) { + set := processortest.NewNopSettings() + tel, _ := metadata.NewTelemetryBuilder(set.TelemetrySettings) for _, tt := range []struct { casename string typ eventType @@ -195,7 +205,7 @@ func TestEventInvalidPayload(t *testing.T) { require.NoError(t, err) wg := &sync.WaitGroup{} - em := newEventMachine(logger, 50, 1, 1_000) + em := newEventMachine(logger, 50, 1, 1_000, tel) em.onError = func(_ event) { wg.Done() } @@ -216,12 +226,14 @@ func TestEventInvalidPayload(t *testing.T) { } func TestEventUnknownType(t *testing.T) { + set := processortest.NewNopSettings() + tel, _ := metadata.NewTelemetryBuilder(set.TelemetrySettings) // prepare logger, err := zap.NewDevelopment() require.NoError(t, err) wg := &sync.WaitGroup{} - em := newEventMachine(logger, 50, 1, 1_000) + em := newEventMachine(logger, 50, 1, 1_000, tel) em.onError = func(_ event) { wg.Done() } @@ -239,6 +251,8 @@ func TestEventUnknownType(t *testing.T) { } func TestEventTracePerWorker(t *testing.T) { + set := processortest.NewNopSettings() + tel, _ := metadata.NewTelemetryBuilder(set.TelemetrySettings) for _, tt := range []struct { casename string traceID [16]byte @@ -265,7 +279,7 @@ func TestEventTracePerWorker(t *testing.T) { }, } { t.Run(tt.casename, func(t *testing.T) { - em := newEventMachine(zap.NewNop(), 200, 100, 1_000) + em := newEventMachine(zap.NewNop(), 200, 100, 1_000, tel) var wg sync.WaitGroup var workerForTrace *eventMachineWorker @@ -342,13 +356,15 @@ func TestEventConsumeConsistency(t *testing.T) { } func TestEventShutdown(t *testing.T) { + set := processortest.NewNopSettings() + tel, _ := metadata.NewTelemetryBuilder(set.TelemetrySettings) // prepare wg := sync.WaitGroup{} wg.Add(1) traceReceivedFired := &atomic.Int64{} traceExpiredFired := &atomic.Int64{} - em := newEventMachine(zap.NewNop(), 50, 1, 1_000) + em := newEventMachine(zap.NewNop(), 50, 1, 1_000, tel) em.onTraceReceived = func(tracesWithID, *eventMachineWorker) error { traceReceivedFired.Store(1) return nil @@ -413,16 +429,11 @@ func TestEventShutdown(t *testing.T) { func TestPeriodicMetrics(t *testing.T) { // prepare - views := metricViews() - - // ensure that we are starting with a clean state - view.Unregister(views...) - assert.NoError(t, view.Register(views...)) - - // try to be nice with the next consumer (test) - defer view.Unregister(views...) + s := setupTestTelemetry() + telemetryBuilder, err := metadata.NewTelemetryBuilder(s.NewSettings().TelemetrySettings) + require.NoError(t, err) - em := newEventMachine(zap.NewNop(), 50, 1, 1_000) + em := newEventMachine(zap.NewNop(), 50, 1, 1_000, telemetryBuilder) em.metricsCollectionInterval = time.Millisecond wg := sync.WaitGroup{} @@ -443,7 +454,7 @@ func TestPeriodicMetrics(t *testing.T) { }() // sanity check - assertGaugeNotCreated(t, mNumEventsInQueue) + assertGaugeNotCreated(t, "otelcol_processor_groupbytrace_num_events_in_queue", s) // test em.workers[0].fire(event{typ: traceReceived}) @@ -452,14 +463,14 @@ func TestPeriodicMetrics(t *testing.T) { // ensure our gauge is showing 1 item in the queue assert.Eventually(t, func() bool { - return getGaugeValue(t, mNumEventsInQueue) == 1 + return getGaugeValue(t, "otelcol_processor_groupbytrace_num_events_in_queue", s) == 1 }, 1*time.Second, 10*time.Millisecond) wg.Done() // release all events // ensure our gauge is now showing no items in the queue assert.Eventually(t, func() bool { - return getGaugeValue(t, mNumEventsInQueue) == 0 + return getGaugeValue(t, "otelcol_processor_groupbytrace_num_events_in_queue", s) == 0 }, 1*time.Second, 10*time.Millisecond) // signal and wait for the recursive call to finish @@ -470,8 +481,10 @@ func TestPeriodicMetrics(t *testing.T) { } func TestForceShutdown(t *testing.T) { + set := processortest.NewNopSettings() + tel, _ := metadata.NewTelemetryBuilder(set.TelemetrySettings) // prepare - em := newEventMachine(zap.NewNop(), 50, 1, 1_000) + em := newEventMachine(zap.NewNop(), 50, 1, 1_000, tel) em.shutdownTimeout = 20 * time.Millisecond // test @@ -482,7 +495,7 @@ func TestForceShutdown(t *testing.T) { duration := time.Since(start) // verify - assert.True(t, duration > 20*time.Millisecond) + assert.Greater(t, duration, 20*time.Millisecond) // wait for shutdown goroutine to end time.Sleep(100 * time.Millisecond) @@ -515,16 +528,18 @@ func TestDoWithTimeout_TimeoutTrigger(t *testing.T) { assert.WithinDuration(t, start, time.Now(), 100*time.Millisecond) } -func getGaugeValue(t *testing.T, gauge *stats.Int64Measure) float64 { - viewData, err := view.RetrieveData("processor_groupbytrace_" + gauge.Name()) - require.NoError(t, err) - require.Len(t, viewData, 1) // we expect exactly one data point, the last value - - return viewData[0].Data.(*view.LastValueData).Value +func getGaugeValue(t *testing.T, name string, tt componentTestTelemetry) int64 { + var md metricdata.ResourceMetrics + require.NoError(t, tt.reader.Collect(context.Background(), &md)) + m := tt.getMetric(name, md).Data + g := m.(metricdata.Gauge[int64]) + assert.Len(t, g.DataPoints, 1, "expected exactly one data point") + return g.DataPoints[0].Value } -func assertGaugeNotCreated(t *testing.T, gauge *stats.Int64Measure) { - viewData, err := view.RetrieveData("processor_groupbytrace_" + gauge.Name()) - require.NoError(t, err) - assert.Len(t, viewData, 0, "gauge exists already but shouldn't") +func assertGaugeNotCreated(t *testing.T, name string, tt componentTestTelemetry) { + var md metricdata.ResourceMetrics + require.NoError(t, tt.reader.Collect(context.Background(), &md)) + got := tt.getMetric(name, md) + assert.Equal(t, metricdata.Metrics{}, got, "gauge exists already but shouldn't") } diff --git a/processor/groupbytraceprocessor/factory.go b/processor/groupbytraceprocessor/factory.go index d474d91350f7..91b1cfc6abbb 100644 --- a/processor/groupbytraceprocessor/factory.go +++ b/processor/groupbytraceprocessor/factory.go @@ -8,7 +8,6 @@ import ( "fmt" "time" - "go.opencensus.io/stats/view" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/processor" @@ -31,9 +30,6 @@ var ( // NewFactory returns a new factory for the Filter processor. func NewFactory() processor.Factory { - // TODO: find a more appropriate way to get this done, as we are swallowing the error here - _ = view.Register(metricViews()...) - return processor.NewFactory( metadata.Type, createDefaultConfig, @@ -56,10 +52,10 @@ func createDefaultConfig() component.Config { // createTracesProcessor creates a trace processor based on this config. func createTracesProcessor( _ context.Context, - params processor.CreateSettings, + params processor.Settings, cfg component.Config, - nextConsumer consumer.Traces) (processor.Traces, error) { - + nextConsumer consumer.Traces, +) (processor.Traces, error) { oCfg := cfg.(*Config) var st storage @@ -70,8 +66,9 @@ func createTracesProcessor( return nil, errDiscardOrphansNotSupported } + processor := newGroupByTraceProcessor(params, nextConsumer, *oCfg) // the only supported storage for now - st = newMemoryStorage() - - return newGroupByTraceProcessor(params.Logger, st, nextConsumer, *oCfg), nil + st = newMemoryStorage(processor.telemetryBuilder) + processor.st = st + return processor, nil } diff --git a/processor/groupbytraceprocessor/factory_test.go b/processor/groupbytraceprocessor/factory_test.go index e5e7a8b54106..8b6c2a6a5f9e 100644 --- a/processor/groupbytraceprocessor/factory_test.go +++ b/processor/groupbytraceprocessor/factory_test.go @@ -8,6 +8,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "go.opentelemetry.io/collector/consumer/consumertest" "go.opentelemetry.io/collector/processor/processortest" ) @@ -26,10 +27,8 @@ func TestDefaultConfiguration(t *testing.T) { func TestCreateTestProcessor(t *testing.T) { c := createDefaultConfig().(*Config) - next := &mockProcessor{} - // test - p, err := createTracesProcessor(context.Background(), processortest.NewNopCreateSettings(), c, next) + p, err := createTracesProcessor(context.Background(), processortest.NewNopSettings(), c, consumertest.NewNop()) // verify assert.NoError(t, err) @@ -39,7 +38,6 @@ func TestCreateTestProcessor(t *testing.T) { func TestCreateTestProcessorWithNotImplementedOptions(t *testing.T) { // prepare f := NewFactory() - next := &mockProcessor{} // test for _, tt := range []struct { @@ -59,10 +57,10 @@ func TestCreateTestProcessorWithNotImplementedOptions(t *testing.T) { errDiskStorageNotSupported, }, } { - p, err := f.CreateTracesProcessor(context.Background(), processortest.NewNopCreateSettings(), tt.config, next) + p, err := f.CreateTraces(context.Background(), processortest.NewNopSettings(), tt.config, consumertest.NewNop()) // verify - assert.Error(t, tt.expectedErr, err) + assert.ErrorIs(t, tt.expectedErr, err) assert.Nil(t, p) } } diff --git a/processor/groupbytraceprocessor/generated_component_telemetry_test.go b/processor/groupbytraceprocessor/generated_component_telemetry_test.go new file mode 100644 index 000000000000..a2977719e613 --- /dev/null +++ b/processor/groupbytraceprocessor/generated_component_telemetry_test.go @@ -0,0 +1,84 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package groupbytraceprocessor + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + sdkmetric "go.opentelemetry.io/otel/sdk/metric" + "go.opentelemetry.io/otel/sdk/metric/metricdata" + "go.opentelemetry.io/otel/sdk/metric/metricdata/metricdatatest" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/config/configtelemetry" + "go.opentelemetry.io/collector/processor" + "go.opentelemetry.io/collector/processor/processortest" +) + +type componentTestTelemetry struct { + reader *sdkmetric.ManualReader + meterProvider *sdkmetric.MeterProvider +} + +func (tt *componentTestTelemetry) NewSettings() processor.Settings { + set := processortest.NewNopSettings() + set.ID = component.NewID(component.MustNewType("groupbytrace")) + set.TelemetrySettings = tt.newTelemetrySettings() + return set +} + +func (tt *componentTestTelemetry) newTelemetrySettings() component.TelemetrySettings { + set := componenttest.NewNopTelemetrySettings() + set.MeterProvider = tt.meterProvider + set.MetricsLevel = configtelemetry.LevelDetailed + return set +} + +func setupTestTelemetry() componentTestTelemetry { + reader := sdkmetric.NewManualReader() + return componentTestTelemetry{ + reader: reader, + meterProvider: sdkmetric.NewMeterProvider(sdkmetric.WithReader(reader)), + } +} + +func (tt *componentTestTelemetry) assertMetrics(t *testing.T, expected []metricdata.Metrics) { + var md metricdata.ResourceMetrics + require.NoError(t, tt.reader.Collect(context.Background(), &md)) + // ensure all required metrics are present + for _, want := range expected { + got := tt.getMetric(want.Name, md) + metricdatatest.AssertEqual(t, want, got, metricdatatest.IgnoreTimestamp()) + } + + // ensure no additional metrics are emitted + require.Equal(t, len(expected), tt.len(md)) +} + +func (tt *componentTestTelemetry) getMetric(name string, got metricdata.ResourceMetrics) metricdata.Metrics { + for _, sm := range got.ScopeMetrics { + for _, m := range sm.Metrics { + if m.Name == name { + return m + } + } + } + + return metricdata.Metrics{} +} + +func (tt *componentTestTelemetry) len(got metricdata.ResourceMetrics) int { + metricsCount := 0 + for _, sm := range got.ScopeMetrics { + metricsCount += len(sm.Metrics) + } + + return metricsCount +} + +func (tt *componentTestTelemetry) Shutdown(ctx context.Context) error { + return tt.meterProvider.Shutdown(ctx) +} diff --git a/processor/groupbytraceprocessor/generated_component_test.go b/processor/groupbytraceprocessor/generated_component_test.go index f2f6b1836fa1..d1f7ff9c238f 100644 --- a/processor/groupbytraceprocessor/generated_component_test.go +++ b/processor/groupbytraceprocessor/generated_component_test.go @@ -33,13 +33,13 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) }{ { name: "traces", - createFn: func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesProcessor(ctx, set, cfg, consumertest.NewNop()) + createFn: func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg, consumertest.NewNop()) }, }, } @@ -51,21 +51,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), processortest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), processortest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), processortest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), processortest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(processor.Logs) require.True(t, ok) diff --git a/processor/groupbytraceprocessor/generated_package_test.go b/processor/groupbytraceprocessor/generated_package_test.go index c43485899052..84daac2b263f 100644 --- a/processor/groupbytraceprocessor/generated_package_test.go +++ b/processor/groupbytraceprocessor/generated_package_test.go @@ -3,11 +3,11 @@ package groupbytraceprocessor import ( + "os" "testing" - - "go.uber.org/goleak" ) func TestMain(m *testing.M) { - goleak.VerifyTestMain(m, goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), goleak.IgnoreAnyFunction("github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor.doWithTimeout.func1")) + // skipping goleak test as per metadata.yml configuration + os.Exit(m.Run()) } diff --git a/processor/groupbytraceprocessor/go.mod b/processor/groupbytraceprocessor/go.mod index c205b554fe8a..6b51b34a0e09 100644 --- a/processor/groupbytraceprocessor/go.mod +++ b/processor/groupbytraceprocessor/go.mod @@ -1,58 +1,56 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opencensus.io v0.24.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/processor v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 - go.uber.org/goleak v1.3.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/processor v0.116.0 + go.opentelemetry.io/collector/processor/processortest v0.116.0 + go.opentelemetry.io/otel v1.32.0 + go.opentelemetry.io/otel/metric v1.32.0 + go.opentelemetry.io/otel/sdk/metric v1.32.0 + go.opentelemetry.io/otel/trace v1.32.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/pdata/testdata v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + go.opentelemetry.io/collector/component/componentstatus v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/testdata v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/processor/xprocessor v0.116.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/processor/groupbytraceprocessor/go.sum b/processor/groupbytraceprocessor/go.sum index d3ba6d702978..9fdc208799c0 100644 --- a/processor/groupbytraceprocessor/go.sum +++ b/processor/groupbytraceprocessor/go.sum @@ -1,51 +1,20 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -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/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -56,8 +25,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -73,58 +42,54 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/processor v0.102.0 h1:JsjTlpBRmoSYxcu3cAbKBchOmL6aNUxLa03ZkWIqZr8= -go.opentelemetry.io/collector/processor v0.102.0/go.mod h1:IaCSDcfy75uQTaOM+LgR1bMf/bUw2eFfzn20uvWYfLQ= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/processor v0.116.0 h1:Kyu4tPzTdWNHtZjcxvI/bGNAgyv8L8Kem2r/Mk4IDAw= +go.opentelemetry.io/collector/processor v0.116.0/go.mod h1:+/Ugy48RAxlZEXmN2cw51W8t5wdHS9No+GAoP+moskk= +go.opentelemetry.io/collector/processor/processortest v0.116.0 h1:+IqNEVEE0E2MsO2g7+Y/9dz35sDuvAXRXrLts9NdXrA= +go.opentelemetry.io/collector/processor/processortest v0.116.0/go.mod h1:DLaQDBxzgeeaUO0ULMn/efos9PmHZkmYCHuxwCsiVHI= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0 h1:iin/UwuWvSLB7ZNfINFUYbZ5lxIi1NjZ2brkyyFdiRA= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0/go.mod h1:cnA43/XpKDbaOmd8buqKp/LGJ2l/OoCqbR//u5DMfn8= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -134,44 +99,27 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -179,36 +127,14 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/processor/groupbytraceprocessor/internal/metadata/generated_status.go b/processor/groupbytraceprocessor/internal/metadata/generated_status.go index 856d332ae8ed..763d38dee2f8 100644 --- a/processor/groupbytraceprocessor/internal/metadata/generated_status.go +++ b/processor/groupbytraceprocessor/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("groupbytrace") + Type = component.MustNewType("groupbytrace") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor" ) const ( diff --git a/processor/groupbytraceprocessor/internal/metadata/generated_telemetry.go b/processor/groupbytraceprocessor/internal/metadata/generated_telemetry.go index fef5d85b17af..fa8050ff879b 100644 --- a/processor/groupbytraceprocessor/internal/metadata/generated_telemetry.go +++ b/processor/groupbytraceprocessor/internal/metadata/generated_telemetry.go @@ -3,15 +3,113 @@ package metadata import ( - "go.opentelemetry.io/collector/component" + "errors" + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/metric/noop" "go.opentelemetry.io/otel/trace" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configtelemetry" ) func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/groupbytrace") + return settings.MeterProvider.Meter("github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor") } func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/groupbytrace") + return settings.TracerProvider.Tracer("github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor") +} + +// TelemetryBuilder provides an interface for components to report telemetry +// as defined in metadata and user config. +type TelemetryBuilder struct { + meter metric.Meter + ProcessorGroupbytraceConfNumTraces metric.Int64Gauge + ProcessorGroupbytraceEventLatency metric.Int64Histogram + ProcessorGroupbytraceIncompleteReleases metric.Int64Counter + ProcessorGroupbytraceNumEventsInQueue metric.Int64Gauge + ProcessorGroupbytraceNumTracesInMemory metric.Int64Gauge + ProcessorGroupbytraceSpansReleased metric.Int64Counter + ProcessorGroupbytraceTracesEvicted metric.Int64Counter + ProcessorGroupbytraceTracesReleased metric.Int64Counter +} + +// TelemetryBuilderOption applies changes to default builder. +type TelemetryBuilderOption interface { + apply(*TelemetryBuilder) +} + +type telemetryBuilderOptionFunc func(mb *TelemetryBuilder) + +func (tbof telemetryBuilderOptionFunc) apply(mb *TelemetryBuilder) { + tbof(mb) +} + +// NewTelemetryBuilder provides a struct with methods to update all internal telemetry +// for a component +func NewTelemetryBuilder(settings component.TelemetrySettings, options ...TelemetryBuilderOption) (*TelemetryBuilder, error) { + builder := TelemetryBuilder{} + for _, op := range options { + op.apply(&builder) + } + builder.meter = Meter(settings) + var err, errs error + builder.ProcessorGroupbytraceConfNumTraces, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Gauge( + "otelcol_processor_groupbytrace_conf_num_traces", + metric.WithDescription("Maximum number of traces to hold in the internal storage"), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + builder.ProcessorGroupbytraceEventLatency, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Histogram( + "otelcol_processor_groupbytrace_event_latency", + metric.WithDescription("How long the queue events are taking to be processed"), + metric.WithUnit("ms"), + metric.WithExplicitBucketBoundaries([]float64{5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000}...), + ) + errs = errors.Join(errs, err) + builder.ProcessorGroupbytraceIncompleteReleases, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_processor_groupbytrace_incomplete_releases", + metric.WithDescription("Releases that are suspected to have been incomplete"), + metric.WithUnit("{releases}"), + ) + errs = errors.Join(errs, err) + builder.ProcessorGroupbytraceNumEventsInQueue, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Gauge( + "otelcol_processor_groupbytrace_num_events_in_queue", + metric.WithDescription("Number of events currently in the queue"), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + builder.ProcessorGroupbytraceNumTracesInMemory, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Gauge( + "otelcol_processor_groupbytrace_num_traces_in_memory", + metric.WithDescription("Number of traces currently in the in-memory storage"), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + builder.ProcessorGroupbytraceSpansReleased, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_processor_groupbytrace_spans_released", + metric.WithDescription("Spans released to the next consumer"), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + builder.ProcessorGroupbytraceTracesEvicted, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_processor_groupbytrace_traces_evicted", + metric.WithDescription("Traces evicted from the internal buffer"), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + builder.ProcessorGroupbytraceTracesReleased, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_processor_groupbytrace_traces_released", + metric.WithDescription("Traces released to the next consumer"), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + return &builder, errs +} + +func getLeveledMeter(meter metric.Meter, cfgLevel, srvLevel configtelemetry.Level) metric.Meter { + if cfgLevel <= srvLevel { + return meter + } + return noop.Meter{} } diff --git a/processor/groupbytraceprocessor/internal/metadata/generated_telemetry_test.go b/processor/groupbytraceprocessor/internal/metadata/generated_telemetry_test.go index 3be99d34dfdb..b379ef6221dc 100644 --- a/processor/groupbytraceprocessor/internal/metadata/generated_telemetry_test.go +++ b/processor/groupbytraceprocessor/internal/metadata/generated_telemetry_test.go @@ -14,6 +14,7 @@ import ( nooptrace "go.opentelemetry.io/otel/trace/noop" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" ) type mockMeter struct { @@ -49,15 +50,25 @@ func TestProviders(t *testing.T) { meter := Meter(set) if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/groupbytrace", m.name) + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor", m.name) } else { require.Fail(t, "returned Meter not mockMeter") } tracer := Tracer(set) if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/groupbytrace", m.name) + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor", m.name) } else { require.Fail(t, "returned Meter not mockTracer") } } + +func TestNewTelemetryBuilder(t *testing.T) { + set := componenttest.NewNopTelemetrySettings() + applied := false + _, err := NewTelemetryBuilder(set, telemetryBuilderOptionFunc(func(b *TelemetryBuilder) { + applied = true + })) + require.NoError(t, err) + require.True(t, applied) +} diff --git a/processor/groupbytraceprocessor/metadata.yaml b/processor/groupbytraceprocessor/metadata.yaml index 64bc82d3f13c..a4f1738124aa 100644 --- a/processor/groupbytraceprocessor/metadata.yaml +++ b/processor/groupbytraceprocessor/metadata.yaml @@ -1,20 +1,72 @@ type: groupbytrace -scope_name: otelcol/groupbytrace status: class: processor stability: beta: [traces] - distributions: [contrib] + distributions: [contrib, k8s] warnings: [Statefulness] codeowners: active: [jpkrohling] tests: config: goleak: - ignore: - # See https://github.com/census-instrumentation/opencensus-go/issues/1191 for more information. - top: go.opencensus.io/stats/view.(*worker).start - # TODO: Regarding doWithTimeout ignore: https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/32572 - any: github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor.doWithTimeout.func1 + skip: true + +telemetry: + metrics: + processor_groupbytrace_conf_num_traces: + enabled: true + description: Maximum number of traces to hold in the internal storage + unit: "1" + gauge: + value_type: int + processor_groupbytrace_num_events_in_queue: + enabled: true + description: Number of events currently in the queue + unit: "1" + gauge: + value_type: int + processor_groupbytrace_num_traces_in_memory: + enabled: true + description: Number of traces currently in the in-memory storage + unit: "1" + gauge: + value_type: int + processor_groupbytrace_traces_evicted: + enabled: true + description: Traces evicted from the internal buffer + unit: "1" + sum: + value_type: int + monotonic: true + processor_groupbytrace_spans_released: + enabled: true + description: Spans released to the next consumer + unit: "1" + sum: + value_type: int + monotonic: true + processor_groupbytrace_traces_released: + enabled: true + description: Traces released to the next consumer + unit: "1" + sum: + value_type: int + monotonic: true + processor_groupbytrace_incomplete_releases: + enabled: true + description: Releases that are suspected to have been incomplete + unit: "{releases}" + sum: + value_type: int + monotonic: true + processor_groupbytrace_event_latency: + enabled: true + description: How long the queue events are taking to be processed + unit: ms + histogram: + value_type: int + bucket_boundaries: [5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000] + diff --git a/processor/groupbytraceprocessor/metrics.go b/processor/groupbytraceprocessor/metrics.go deleted file mode 100644 index 6867e1f36c66..000000000000 --- a/processor/groupbytraceprocessor/metrics.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package groupbytraceprocessor // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor" - -import ( - "go.opencensus.io/stats" - "go.opencensus.io/stats/view" - "go.opencensus.io/tag" - "go.opentelemetry.io/collector/processor/processorhelper" - - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor/internal/metadata" -) - -var ( - mNumTracesConf = stats.Int64("conf_num_traces", "Maximum number of traces to hold in the internal storage", stats.UnitDimensionless) - mNumEventsInQueue = stats.Int64("num_events_in_queue", "Number of events currently in the queue", stats.UnitDimensionless) - mNumTracesInMemory = stats.Int64("num_traces_in_memory", "Number of traces currently in the in-memory storage", stats.UnitDimensionless) - mTracesEvicted = stats.Int64("traces_evicted", "Traces evicted from the internal buffer", stats.UnitDimensionless) - mReleasedSpans = stats.Int64("spans_released", "Spans released to the next consumer", stats.UnitDimensionless) - mReleasedTraces = stats.Int64("traces_released", "Traces released to the next consumer", stats.UnitDimensionless) - mIncompleteReleases = stats.Int64("incomplete_releases", "Releases that are suspected to have been incomplete", stats.UnitDimensionless) - mEventLatency = stats.Int64("event_latency", "How long the queue events are taking to be processed", stats.UnitMilliseconds) -) - -// metricViews return the metrics views according to given telemetry level. -func metricViews() []*view.View { - return []*view.View{ - { - Name: processorhelper.BuildCustomMetricName(metadata.Type.String(), mNumTracesConf.Name()), - Measure: mNumTracesConf, - Description: mNumTracesConf.Description(), - Aggregation: view.LastValue(), - }, - { - Name: processorhelper.BuildCustomMetricName(metadata.Type.String(), mNumEventsInQueue.Name()), - Measure: mNumEventsInQueue, - Description: mNumEventsInQueue.Description(), - Aggregation: view.LastValue(), - }, - { - Name: processorhelper.BuildCustomMetricName(metadata.Type.String(), mNumTracesInMemory.Name()), - Measure: mNumTracesInMemory, - Description: mNumTracesInMemory.Description(), - Aggregation: view.LastValue(), - }, - { - Name: processorhelper.BuildCustomMetricName(metadata.Type.String(), mTracesEvicted.Name()), - Measure: mTracesEvicted, - Description: mTracesEvicted.Description(), - // sum allows us to start from 0, count will only show up if there's at least one eviction, which might take a while to happen (if ever!) - Aggregation: view.Sum(), - }, - { - Name: processorhelper.BuildCustomMetricName(metadata.Type.String(), mReleasedSpans.Name()), - Measure: mReleasedSpans, - Description: mReleasedSpans.Description(), - Aggregation: view.Sum(), - }, - { - Name: processorhelper.BuildCustomMetricName(metadata.Type.String(), mReleasedTraces.Name()), - Measure: mReleasedTraces, - Description: mReleasedTraces.Description(), - Aggregation: view.Sum(), - }, - { - Name: processorhelper.BuildCustomMetricName(metadata.Type.String(), mIncompleteReleases.Name()), - Measure: mIncompleteReleases, - Description: mIncompleteReleases.Description(), - Aggregation: view.Sum(), - }, - { - Name: processorhelper.BuildCustomMetricName(metadata.Type.String(), mEventLatency.Name()), - Measure: mEventLatency, - Description: mEventLatency.Description(), - TagKeys: []tag.Key{ - tag.MustNewKey("event"), - }, - Aggregation: view.Distribution(0, 5, 10, 20, 50, 100, 200, 500, 1000), - }, - } -} diff --git a/processor/groupbytraceprocessor/metrics_test.go b/processor/groupbytraceprocessor/metrics_test.go deleted file mode 100644 index abbe57c321d6..000000000000 --- a/processor/groupbytraceprocessor/metrics_test.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package groupbytraceprocessor - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestProcessorMetrics(t *testing.T) { - expectedViewNames := []string{ - "processor_groupbytrace_conf_num_traces", - "processor_groupbytrace_num_events_in_queue", - "processor_groupbytrace_num_traces_in_memory", - "processor_groupbytrace_traces_evicted", - "processor_groupbytrace_spans_released", - "processor_groupbytrace_traces_released", - "processor_groupbytrace_incomplete_releases", - "processor_groupbytrace_event_latency", - } - - views := metricViews() - for i, viewName := range expectedViewNames { - assert.Equal(t, viewName, views[i].Name) - } -} diff --git a/processor/groupbytraceprocessor/processor.go b/processor/groupbytraceprocessor/processor.go index ad249e17bd3e..e5863dfff767 100644 --- a/processor/groupbytraceprocessor/processor.go +++ b/processor/groupbytraceprocessor/processor.go @@ -8,7 +8,6 @@ import ( "fmt" "time" - "go.opencensus.io/stats" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/pdata/pcommon" @@ -18,6 +17,7 @@ import ( "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor/internal/metadata" ) // groupByTraceProcessor is a processor that keeps traces in memory for a given duration, with the expectation @@ -33,10 +33,10 @@ import ( // Each worker in the eventMachine also uses a ring buffer to hold the in-flight trace IDs, so that we don't hold more than the given maximum number // of traces in memory/storage. Items that are evicted from the buffer are discarded without warning. type groupByTraceProcessor struct { - nextConsumer consumer.Traces - config Config - logger *zap.Logger - + nextConsumer consumer.Traces + config Config + logger *zap.Logger + telemetryBuilder *metadata.TelemetryBuilder // the event machine handling all operations for this processor eventMachine *eventMachine @@ -49,16 +49,21 @@ var _ processor.Traces = (*groupByTraceProcessor)(nil) const bufferSize = 10_000 // newGroupByTraceProcessor returns a new processor. -func newGroupByTraceProcessor(logger *zap.Logger, st storage, nextConsumer consumer.Traces, config Config) *groupByTraceProcessor { +func newGroupByTraceProcessor(set processor.Settings, nextConsumer consumer.Traces, config Config) *groupByTraceProcessor { + telemetryBuilder, err := metadata.NewTelemetryBuilder(set.TelemetrySettings) + if err != nil { + return nil + } + // the event machine will buffer up to N concurrent events before blocking - eventMachine := newEventMachine(logger, 10000, config.NumWorkers, config.NumTraces) + eventMachine := newEventMachine(set.Logger, 10000, config.NumWorkers, config.NumTraces, telemetryBuilder) sp := &groupByTraceProcessor{ - logger: logger, - nextConsumer: nextConsumer, - config: config, - eventMachine: eventMachine, - st: st, + logger: set.Logger, + nextConsumer: nextConsumer, + config: config, + telemetryBuilder: telemetryBuilder, + eventMachine: eventMachine, } // register the callbacks @@ -85,10 +90,9 @@ func (sp *groupByTraceProcessor) Capabilities() consumer.Capabilities { // Start is invoked during service startup. func (sp *groupByTraceProcessor) Start(context.Context, component.Host) error { // start these metrics, as it might take a while for them to receive their first event - stats.Record(context.Background(), mTracesEvicted.M(0)) - stats.Record(context.Background(), mIncompleteReleases.M(0)) - stats.Record(context.Background(), mNumTracesConf.M(int64(sp.config.NumTraces))) - + sp.telemetryBuilder.ProcessorGroupbytraceTracesEvicted.Add(context.Background(), 0) + sp.telemetryBuilder.ProcessorGroupbytraceIncompleteReleases.Add(context.Background(), 0) + sp.telemetryBuilder.ProcessorGroupbytraceConfNumTraces.Record(context.Background(), (int64(sp.config.NumTraces))) sp.eventMachine.startInBackground() return sp.st.start() } @@ -124,8 +128,7 @@ func (sp *groupByTraceProcessor) onTraceReceived(trace tracesWithID, worker *eve typ: traceRemoved, payload: evicted, }) - - stats.Record(context.Background(), mTracesEvicted.M(1)) + sp.telemetryBuilder.ProcessorGroupbytraceTracesEvicted.Add(context.Background(), 1) sp.logger.Info("trace evicted: in order to avoid this in the future, adjust the wait duration and/or number of traces to keep in memory", zap.Stringer("traceID", evicted)) @@ -155,8 +158,7 @@ func (sp *groupByTraceProcessor) onTraceExpired(traceID pcommon.TraceID, worker // we likely received multiple batches with spans for the same trace // and released this trace already sp.logger.Debug("skipping the processing of expired trace", zap.Stringer("traceID", traceID)) - - stats.Record(context.Background(), mIncompleteReleases.M(1)) + sp.telemetryBuilder.ProcessorGroupbytraceIncompleteReleases.Add(context.Background(), 1) return nil } @@ -204,10 +206,9 @@ func (sp *groupByTraceProcessor) onTraceReleased(rss []ptrace.ResourceSpans) err trs := trace.ResourceSpans().AppendEmpty() rs.CopyTo(trs) } - stats.Record(context.Background(), - mReleasedSpans.M(int64(trace.SpanCount())), - mReleasedTraces.M(1), - ) + + sp.telemetryBuilder.ProcessorGroupbytraceSpansReleased.Add(context.Background(), int64(trace.SpanCount())) + sp.telemetryBuilder.ProcessorGroupbytraceTracesReleased.Add(context.Background(), 1) // Do async consuming not to block event worker go func() { diff --git a/processor/groupbytraceprocessor/processor_test.go b/processor/groupbytraceprocessor/processor_test.go index 6a0b0959d959..162738d8b8f6 100644 --- a/processor/groupbytraceprocessor/processor_test.go +++ b/processor/groupbytraceprocessor/processor_test.go @@ -14,12 +14,15 @@ import ( "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/consumer" + "go.opentelemetry.io/collector/consumer/consumertest" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" "go.opentelemetry.io/collector/processor" + "go.opentelemetry.io/collector/processor/processortest" "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor/internal/metadata" ) func TestTraceIsDispatchedAfterDuration(t *testing.T) { @@ -41,7 +44,9 @@ func TestTraceIsDispatchedAfterDuration(t *testing.T) { } wgDeleted := &sync.WaitGroup{} // we wait for the next (mock) processor to receive the trace - backing := newMemoryStorage() + + p := newGroupByTraceProcessor(processortest.NewNopSettings(), mockProcessor, config) + backing := newMemoryStorage(p.telemetryBuilder) st := &mockStorage{ onCreateOrAppend: backing.createOrAppend, onGet: backing.get, @@ -50,8 +55,7 @@ func TestTraceIsDispatchedAfterDuration(t *testing.T) { return backing.delete(traceID) }, } - - p := newGroupByTraceProcessor(zap.NewNop(), st, mockProcessor, config) + p.st = st ctx := context.Background() assert.NoError(t, p.Start(ctx, nil)) defer func() { @@ -94,10 +98,9 @@ func TestInternalCacheLimit(t *testing.T) { return nil } - st := newMemoryStorage() - - p := newGroupByTraceProcessor(zap.NewNop(), st, mockProcessor, config) - + p := newGroupByTraceProcessor(processortest.NewNopSettings(), mockProcessor, config) + st := newMemoryStorage(p.telemetryBuilder) + p.st = st ctx := context.Background() assert.NoError(t, p.Start(ctx, nil)) defer func() { @@ -123,7 +126,7 @@ func TestInternalCacheLimit(t *testing.T) { wg.Wait() // verify - assert.Equal(t, 5, len(receivedTraceIDs)) + assert.Len(t, receivedTraceIDs, 5) for i := 5; i > 0; i-- { // last 5 traces traceID := pcommon.TraceID(traceIDs[i]) @@ -141,16 +144,15 @@ func TestProcessorCapabilities(t *testing.T) { NumTraces: 10, NumWorkers: 1, } - st := newMemoryStorage() - next := &mockProcessor{} - // test - p := newGroupByTraceProcessor(zap.NewNop(), st, next, config) + p := newGroupByTraceProcessor(processortest.NewNopSettings(), consumertest.NewNop(), config) + st := newMemoryStorage(p.telemetryBuilder) + p.st = st caps := p.Capabilities() // verify assert.NotNil(t, p) - assert.Equal(t, true, caps.MutatesData) + assert.True(t, caps.MutatesData) } func TestProcessBatchDoesntFail(t *testing.T) { @@ -160,8 +162,6 @@ func TestProcessBatchDoesntFail(t *testing.T) { NumTraces: 10, NumWorkers: 1, } - st := newMemoryStorage() - next := &mockProcessor{} traceID := pcommon.TraceID([16]byte{1, 2, 3, 4}) @@ -172,9 +172,10 @@ func TestProcessBatchDoesntFail(t *testing.T) { span.SetTraceID(traceID) span.SetSpanID([8]byte{1, 2, 3, 4}) - p := newGroupByTraceProcessor(zap.NewNop(), st, next, config) + p := newGroupByTraceProcessor(processortest.NewNopSettings(), consumertest.NewNop(), config) assert.NotNil(t, p) - + st := newMemoryStorage(p.telemetryBuilder) + p.st = st // test assert.NoError(t, p.onTraceReceived(tracesWithID{id: traceID, td: trace}, p.eventMachine.workers[0])) } @@ -191,11 +192,12 @@ func TestTraceDisappearedFromStorageBeforeReleasing(t *testing.T) { return nil, nil }, } - next := &mockProcessor{} - p := newGroupByTraceProcessor(zap.NewNop(), st, next, config) + p := newGroupByTraceProcessor(processortest.NewNopSettings(), consumertest.NewNop(), config) require.NotNil(t, p) + p.st = st + traceID := pcommon.TraceID([16]byte{1, 2, 3, 4}) batch := simpleTracesWithID(traceID) @@ -229,10 +231,10 @@ func TestTraceErrorFromStorageWhileReleasing(t *testing.T) { return nil, expectedError }, } - next := &mockProcessor{} - p := newGroupByTraceProcessor(zap.NewNop(), st, next, config) + p := newGroupByTraceProcessor(processortest.NewNopSettings(), consumertest.NewNop(), config) require.NotNil(t, p) + p.st = st traceID := pcommon.TraceID([16]byte{1, 2, 3, 4}) batch := simpleTracesWithID(traceID) @@ -251,7 +253,7 @@ func TestTraceErrorFromStorageWhileReleasing(t *testing.T) { err = p.markAsReleased(traceID, p.eventMachine.workers[workerIndexForTraceID(traceID, config.NumWorkers)].fire) // verify - assert.True(t, errors.Is(err, expectedError)) + assert.ErrorIs(t, err, expectedError) } func TestTraceErrorFromStorageWhileProcessingTrace(t *testing.T) { @@ -267,10 +269,10 @@ func TestTraceErrorFromStorageWhileProcessingTrace(t *testing.T) { return expectedError }, } - next := &mockProcessor{} - p := newGroupByTraceProcessor(zap.NewNop(), st, next, config) + p := newGroupByTraceProcessor(processortest.NewNopSettings(), consumertest.NewNop(), config) require.NotNil(t, p) + p.st = st traceID := pcommon.TraceID([16]byte{1, 2, 3, 4}) @@ -288,7 +290,7 @@ func TestTraceErrorFromStorageWhileProcessingTrace(t *testing.T) { err := p.onTraceReceived(tracesWithID{id: traceID, td: batch[0]}, p.eventMachine.workers[0]) // verify - assert.True(t, errors.Is(err, expectedError)) + assert.ErrorIs(t, err, expectedError) } func TestAddSpansToExistingTrace(t *testing.T) { @@ -299,7 +301,6 @@ func TestAddSpansToExistingTrace(t *testing.T) { NumTraces: 8, NumWorkers: 4, } - st := newMemoryStorage() var receivedTraces []ptrace.ResourceSpans next := &mockProcessor{ @@ -312,8 +313,10 @@ func TestAddSpansToExistingTrace(t *testing.T) { }, } - p := newGroupByTraceProcessor(zap.NewNop(), st, next, config) + p := newGroupByTraceProcessor(processortest.NewNopSettings(), next, config) require.NotNil(t, p) + st := newMemoryStorage(p.telemetryBuilder) + p.st = st ctx := context.Background() assert.NoError(t, p.Start(ctx, nil)) @@ -351,8 +354,9 @@ func TestTraceErrorFromStorageWhileProcessingSecondTrace(t *testing.T) { st := &mockStorage{} next := &mockProcessor{} - p := newGroupByTraceProcessor(zap.NewNop(), st, next, config) + p := newGroupByTraceProcessor(processortest.NewNopSettings(), next, config) require.NotNil(t, p) + p.st = st traceID := pcommon.TraceID([16]byte{1, 2, 3, 4}) @@ -381,7 +385,7 @@ func TestTraceErrorFromStorageWhileProcessingSecondTrace(t *testing.T) { ) // verify - assert.True(t, errors.Is(err, expectedError)) + assert.ErrorIs(t, err, expectedError) } func TestErrorFromStorageWhileRemovingTrace(t *testing.T) { @@ -399,16 +403,16 @@ func TestErrorFromStorageWhileRemovingTrace(t *testing.T) { } next := &mockProcessor{} - p := newGroupByTraceProcessor(zap.NewNop(), st, next, config) + p := newGroupByTraceProcessor(processortest.NewNopSettings(), next, config) require.NotNil(t, p) - + p.st = st traceID := pcommon.TraceID([16]byte{1, 2, 3, 4}) // test err := p.onTraceRemoved(traceID) // verify - assert.True(t, errors.Is(err, expectedError)) + assert.ErrorIs(t, err, expectedError) } func TestTraceNotFoundWhileRemovingTrace(t *testing.T) { @@ -425,9 +429,9 @@ func TestTraceNotFoundWhileRemovingTrace(t *testing.T) { } next := &mockProcessor{} - p := newGroupByTraceProcessor(zap.NewNop(), st, next, config) + p := newGroupByTraceProcessor(processortest.NewNopSettings(), next, config) require.NotNil(t, p) - + p.st = st traceID := pcommon.TraceID([16]byte{1, 2, 3, 4}) // test @@ -446,7 +450,7 @@ func TestTracesAreDispatchedInIndividualBatches(t *testing.T) { NumTraces: 8, NumWorkers: 4, } - st := newMemoryStorage() + next := &mockProcessor{ onTraces: func(_ context.Context, traces ptrace.Traces) error { // we should receive two batches, each one with one trace @@ -456,9 +460,10 @@ func TestTracesAreDispatchedInIndividualBatches(t *testing.T) { }, } - p := newGroupByTraceProcessor(zap.NewNop(), st, next, config) + p := newGroupByTraceProcessor(processortest.NewNopSettings(), next, config) require.NotNil(t, p) - + st := newMemoryStorage(p.telemetryBuilder) + p.st = st ctx := context.Background() assert.NoError(t, p.Start(ctx, nil)) defer func() { @@ -504,9 +509,9 @@ func TestErrorOnProcessResourceSpansContinuesProcessing(t *testing.T) { st := &mockStorage{} next := &mockProcessor{} - p := newGroupByTraceProcessor(zap.NewNop(), st, next, config) + p := newGroupByTraceProcessor(processortest.NewNopSettings(), next, config) require.NotNil(t, p) - + p.st = st traceID := pcommon.TraceID([16]byte{1, 2, 3, 4}) trace := ptrace.NewTraces() @@ -536,10 +541,12 @@ func TestAsyncOnRelease(t *testing.T) { blocker := &blockingConsumer{ blockCh: blockCh, } - + set := processortest.NewNopSettings() + tel, _ := metadata.NewTelemetryBuilder(set.TelemetrySettings) sp := &groupByTraceProcessor{ - logger: zap.NewNop(), - nextConsumer: blocker, + logger: zap.NewNop(), + nextConsumer: blocker, + telemetryBuilder: tel, } assert.NoError(t, sp.onTraceReleased(nil)) close(blockCh) @@ -552,7 +559,6 @@ func BenchmarkConsumeTracesCompleteOnFirstBatch(b *testing.B) { NumTraces: defaultNumTraces, NumWorkers: 4 * defaultNumWorkers, } - st := newMemoryStorage() // For each input trace there are always <= 2 events in the machine simultaneously. semaphoreCh := make(chan struct{}, bufferSize/2) @@ -561,9 +567,10 @@ func BenchmarkConsumeTracesCompleteOnFirstBatch(b *testing.B) { return nil }} - p := newGroupByTraceProcessor(zap.NewNop(), st, next, config) + p := newGroupByTraceProcessor(processortest.NewNopSettings(), next, config) require.NotNil(b, p) - + st := newMemoryStorage(p.telemetryBuilder) + p.st = st ctx := context.Background() require.NoError(b, p.Start(ctx, nil)) defer func() { @@ -592,12 +599,15 @@ func (m *mockProcessor) ConsumeTraces(ctx context.Context, td ptrace.Traces) err } return nil } + func (m *mockProcessor) Capabilities() consumer.Capabilities { return consumer.Capabilities{MutatesData: true} } + func (m *mockProcessor) Shutdown(context.Context) error { return nil } + func (m *mockProcessor) Start(_ context.Context, _ component.Host) error { return nil } @@ -618,24 +628,28 @@ func (st *mockStorage) createOrAppend(traceID pcommon.TraceID, trace ptrace.Trac } return nil } + func (st *mockStorage) get(traceID pcommon.TraceID) ([]ptrace.ResourceSpans, error) { if st.onGet != nil { return st.onGet(traceID) } return nil, nil } + func (st *mockStorage) delete(traceID pcommon.TraceID) ([]ptrace.ResourceSpans, error) { if st.onDelete != nil { return st.onDelete(traceID) } return nil, nil } + func (st *mockStorage) start() error { if st.onStart != nil { return st.onStart() } return nil } + func (st *mockStorage) shutdown() error { if st.onShutdown != nil { return st.onShutdown() @@ -652,6 +666,7 @@ var _ consumer.Traces = (*blockingConsumer)(nil) func (b *blockingConsumer) Capabilities() consumer.Capabilities { return consumer.Capabilities{MutatesData: false} } + func (b *blockingConsumer) ConsumeTraces(context.Context, ptrace.Traces) error { <-b.blockCh return nil diff --git a/processor/groupbytraceprocessor/storage_memory.go b/processor/groupbytraceprocessor/storage_memory.go index 909164d12330..9de15d877c94 100644 --- a/processor/groupbytraceprocessor/storage_memory.go +++ b/processor/groupbytraceprocessor/storage_memory.go @@ -8,14 +8,16 @@ import ( "sync" "time" - "go.opencensus.io/stats" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" + + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor/internal/metadata" ) type memoryStorage struct { sync.RWMutex content map[pcommon.TraceID][]ptrace.ResourceSpans + telemetry *metadata.TelemetryBuilder stopped bool stoppedLock sync.RWMutex metricsCollectionInterval time.Duration @@ -23,10 +25,11 @@ type memoryStorage struct { var _ storage = (*memoryStorage)(nil) -func newMemoryStorage() *memoryStorage { +func newMemoryStorage(telemetry *metadata.TelemetryBuilder) *memoryStorage { return &memoryStorage{ content: make(map[pcommon.TraceID][]ptrace.ResourceSpans), metricsCollectionInterval: time.Second, + telemetry: telemetry, } } @@ -46,6 +49,7 @@ func (st *memoryStorage) createOrAppend(traceID pcommon.TraceID, td ptrace.Trace return nil } + func (st *memoryStorage) get(traceID pcommon.TraceID) ([]ptrace.ResourceSpans, error) { st.RLock() rss, ok := st.content[traceID] @@ -88,7 +92,7 @@ func (st *memoryStorage) shutdown() error { func (st *memoryStorage) periodicMetrics() { numTraces := st.count() - stats.Record(context.Background(), mNumTracesInMemory.M(int64(numTraces))) + st.telemetry.ProcessorGroupbytraceNumTracesInMemory.Record(context.Background(), int64(numTraces)) st.stoppedLock.RLock() stopped := st.stopped diff --git a/processor/groupbytraceprocessor/storage_memory_test.go b/processor/groupbytraceprocessor/storage_memory_test.go index 673569d36ffc..2a4abbb706f8 100644 --- a/processor/groupbytraceprocessor/storage_memory_test.go +++ b/processor/groupbytraceprocessor/storage_memory_test.go @@ -10,11 +10,15 @@ import ( "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" + "go.opentelemetry.io/collector/processor/processortest" + + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor/internal/metadata" ) func TestMemoryCreateAndGetTrace(t *testing.T) { - // prepare - st := newMemoryStorage() + set := processortest.NewNopSettings() + tel, _ := metadata.NewTelemetryBuilder(set.TelemetrySettings) + st := newMemoryStorage(tel) traceIDs := []pcommon.TraceID{ pcommon.TraceID([16]byte{1, 2, 3, 4}), @@ -48,8 +52,9 @@ func TestMemoryCreateAndGetTrace(t *testing.T) { } func TestMemoryDeleteTrace(t *testing.T) { - // prepare - st := newMemoryStorage() + set := processortest.NewNopSettings() + tel, _ := metadata.NewTelemetryBuilder(set.TelemetrySettings) // prepare + st := newMemoryStorage(tel) traceID := pcommon.TraceID([16]byte{1, 2, 3, 4}) @@ -75,8 +80,9 @@ func TestMemoryDeleteTrace(t *testing.T) { } func TestMemoryAppendSpans(t *testing.T) { - // prepare - st := newMemoryStorage() + set := processortest.NewNopSettings() + tel, _ := metadata.NewTelemetryBuilder(set.TelemetrySettings) // prepare + st := newMemoryStorage(tel) traceID := pcommon.TraceID([16]byte{1, 2, 3, 4}) @@ -126,8 +132,9 @@ func TestMemoryAppendSpans(t *testing.T) { } func TestMemoryTraceIsBeingCloned(t *testing.T) { - // prepare - st := newMemoryStorage() + set := processortest.NewNopSettings() + tel, _ := metadata.NewTelemetryBuilder(set.TelemetrySettings) // prepare + st := newMemoryStorage(tel) traceID := pcommon.TraceID([16]byte{1, 2, 3, 4}) trace := ptrace.NewTraces() diff --git a/processor/intervalprocessor/README.md b/processor/intervalprocessor/README.md index 0c4971e73566..3e958b9d72d4 100644 --- a/processor/intervalprocessor/README.md +++ b/processor/intervalprocessor/README.md @@ -7,9 +7,9 @@ | Distributions | [] | | Warnings | [Statefulness](#warnings) | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aprocessor%2Finterval%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aprocessor%2Finterval) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aprocessor%2Finterval%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aprocessor%2Finterval) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@RichieSams](https://www.github.com/RichieSams), [@sh0rez](https://www.github.com/sh0rez), [@djaglowski](https://www.github.com/djaglowski) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@RichieSams](https://www.github.com/RichieSams), [@sh0rez](https://www.github.com/sh0rez) | -[development]: https://github.com/open-telemetry/opentelemetry-collector#development +[development]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#development ## Description @@ -19,19 +19,31 @@ The interval processor (`intervalprocessor`) aggregates metrics and periodically * Monotonically increasing, cumulative sums * Monotonically increasing, cumulative histograms * Monotonically increasing, cumulative exponential histograms +* Gauges +* Summaries The following metric types will *not* be aggregated, and will instead be passed, unchanged, to the next component in the pipeline: * All delta metrics * Non-monotonically increasing sums -* Gauges -* Summaries + +> NOTE: Aggregating data over an interval is an inherently "lossy" process. For monotonically increasing, cumulative sums, histograms, and exponential histograms, you "lose" precision, but you don't lose overall data. But for non-monotonically increasing sums, gauges, and summaries, aggregation represents actual data loss. IE you could "lose" that a value increased and then decreased back to the original value. In most cases, this data "loss" is ok. However, if you would rather these values be passed through, and *not* aggregated, you can set that in the configuration ## Configuration The following settings can be optionally configured: -* `interval`: The interval in which the processor should export the aggregated metrics. Default: 60s +```yaml +intervalprocessor: + # The interval in which the processor should export the aggregated metrics. + [ interval: | default = 60s ] + + pass_through: + # Whether gauges should be aggregated or passed through to the next component as they are + [ gauge: | default = false ] + # Whether summaries should be aggregated or passed through to the next component as they are + [ summary: l | default = false ] +``` ## Example of metric flows diff --git a/processor/intervalprocessor/config.go b/processor/intervalprocessor/config.go index 1967afc972bb..9a9e7d56b87d 100644 --- a/processor/intervalprocessor/config.go +++ b/processor/intervalprocessor/config.go @@ -10,16 +10,26 @@ import ( "go.opentelemetry.io/collector/component" ) -var ( - ErrInvalidIntervalValue = errors.New("invalid interval value") -) +var ErrInvalidIntervalValue = errors.New("invalid interval value") var _ component.Config = (*Config)(nil) // Config defines the configuration for the processor. type Config struct { - // Interval is the time + // Interval is the time interval at which the processor will aggregate metrics. Interval time.Duration `mapstructure:"interval"` + // PassThrough is a configuration that determines whether gauge and summary metrics should be passed through + // as they are or aggregated. + PassThrough PassThrough `mapstructure:"pass_through"` +} + +type PassThrough struct { + // Gauge is a flag that determines whether gauge metrics should be passed through + // as they are or aggregated. + Gauge bool `mapstructure:"gauge"` + // Summary is a flag that determines whether summary metrics should be passed through + // as they are or aggregated. + Summary bool `mapstructure:"summary"` } // Validate checks whether the input configuration has all of the required fields for the processor. diff --git a/processor/intervalprocessor/factory.go b/processor/intervalprocessor/factory.go index 91127dcaa119..cfca47850b02 100644 --- a/processor/intervalprocessor/factory.go +++ b/processor/intervalprocessor/factory.go @@ -26,10 +26,14 @@ func NewFactory() processor.Factory { func createDefaultConfig() component.Config { return &Config{ Interval: 60 * time.Second, + PassThrough: PassThrough{ + Gauge: false, + Summary: false, + }, } } -func createMetricsProcessor(_ context.Context, set processor.CreateSettings, cfg component.Config, nextConsumer consumer.Metrics) (processor.Metrics, error) { +func createMetricsProcessor(_ context.Context, set processor.Settings, cfg component.Config, nextConsumer consumer.Metrics) (processor.Metrics, error) { processorConfig, ok := cfg.(*Config) if !ok { return nil, fmt.Errorf("configuration parsing error") diff --git a/processor/intervalprocessor/generated_component_test.go b/processor/intervalprocessor/generated_component_test.go index 4e6299c92388..9f02f0e34116 100644 --- a/processor/intervalprocessor/generated_component_test.go +++ b/processor/intervalprocessor/generated_component_test.go @@ -33,13 +33,13 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) }{ { name: "metrics", - createFn: func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsProcessor(ctx, set, cfg, consumertest.NewNop()) + createFn: func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg, consumertest.NewNop()) }, }, } @@ -51,21 +51,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), processortest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), processortest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), processortest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), processortest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(processor.Logs) require.True(t, ok) diff --git a/processor/intervalprocessor/go.mod b/processor/intervalprocessor/go.mod index 33303d1a9b98..2b1ca5219551 100644 --- a/processor/intervalprocessor/go.mod +++ b/processor/intervalprocessor/go.mod @@ -1,59 +1,61 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/processor/intervalprocessor -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/processor v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/processor v0.116.0 + go.opentelemetry.io/collector/processor/processortest v0.116.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/pdata/testdata v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/component/componentstatus v0.116.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/testdata v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/processor/xprocessor v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/processor/intervalprocessor/go.sum b/processor/intervalprocessor/go.sum index 53a43b8844bb..d79b13079492 100644 --- a/processor/intervalprocessor/go.sum +++ b/processor/intervalprocessor/go.sum @@ -1,19 +1,19 @@ -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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -27,8 +27,8 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -44,48 +44,54 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/processor v0.102.0 h1:JsjTlpBRmoSYxcu3cAbKBchOmL6aNUxLa03ZkWIqZr8= -go.opentelemetry.io/collector/processor v0.102.0/go.mod h1:IaCSDcfy75uQTaOM+LgR1bMf/bUw2eFfzn20uvWYfLQ= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/processor v0.116.0 h1:Kyu4tPzTdWNHtZjcxvI/bGNAgyv8L8Kem2r/Mk4IDAw= +go.opentelemetry.io/collector/processor v0.116.0/go.mod h1:+/Ugy48RAxlZEXmN2cw51W8t5wdHS9No+GAoP+moskk= +go.opentelemetry.io/collector/processor/processortest v0.116.0 h1:+IqNEVEE0E2MsO2g7+Y/9dz35sDuvAXRXrLts9NdXrA= +go.opentelemetry.io/collector/processor/processortest v0.116.0/go.mod h1:DLaQDBxzgeeaUO0ULMn/efos9PmHZkmYCHuxwCsiVHI= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0 h1:iin/UwuWvSLB7ZNfINFUYbZ5lxIi1NjZ2brkyyFdiRA= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0/go.mod h1:cnA43/XpKDbaOmd8buqKp/LGJ2l/OoCqbR//u5DMfn8= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -101,20 +107,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -123,12 +129,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/processor/intervalprocessor/internal/metadata/generated_status.go b/processor/intervalprocessor/internal/metadata/generated_status.go index 9c4715601ded..b0b04e036877 100644 --- a/processor/intervalprocessor/internal/metadata/generated_status.go +++ b/processor/intervalprocessor/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("interval") + Type = component.MustNewType("interval") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/processor/intervalprocessor" ) const ( diff --git a/processor/intervalprocessor/internal/metadata/generated_telemetry.go b/processor/intervalprocessor/internal/metadata/generated_telemetry.go deleted file mode 100644 index 33fb1febbfd7..000000000000 --- a/processor/intervalprocessor/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/interval") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/interval") -} diff --git a/processor/intervalprocessor/internal/metadata/generated_telemetry_test.go b/processor/intervalprocessor/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 38337fa04e19..000000000000 --- a/processor/intervalprocessor/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/interval", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/interval", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/processor/intervalprocessor/internal/metrics/metrics.go b/processor/intervalprocessor/internal/metrics/metrics.go index c3febf1a173a..f06a91a8bc06 100644 --- a/processor/intervalprocessor/internal/metrics/metrics.go +++ b/processor/intervalprocessor/internal/metrics/metrics.go @@ -5,7 +5,6 @@ package metrics // import "github.com/open-telemetry/opentelemetry-collector-con import ( "go.opentelemetry.io/collector/pdata/pcommon" - "go.opentelemetry.io/collector/pdata/pmetric" ) type DataPointSlice[DP DataPoint[DP]] interface { @@ -15,8 +14,6 @@ type DataPointSlice[DP DataPoint[DP]] interface { } type DataPoint[Self any] interface { - pmetric.NumberDataPoint | pmetric.HistogramDataPoint | pmetric.ExponentialHistogramDataPoint - Timestamp() pcommon.Timestamp Attributes() pcommon.Map CopyTo(dest Self) diff --git a/processor/intervalprocessor/metadata.yaml b/processor/intervalprocessor/metadata.yaml index b12086e75c48..2a4700c3e069 100644 --- a/processor/intervalprocessor/metadata.yaml +++ b/processor/intervalprocessor/metadata.yaml @@ -1,5 +1,4 @@ type: interval -scope_name: otelcol/interval status: class: processor @@ -8,6 +7,6 @@ status: distributions: [] warnings: [Statefulness] codeowners: - active: [RichieSams, sh0rez, djaglowski] + active: [RichieSams, sh0rez] tests: config: diff --git a/processor/intervalprocessor/processor.go b/processor/intervalprocessor/processor.go index 6960472e5395..5a9df9f4e0b0 100644 --- a/processor/intervalprocessor/processor.go +++ b/processor/intervalprocessor/processor.go @@ -36,8 +36,9 @@ type Processor struct { numberLookup map[identity.Stream]pmetric.NumberDataPoint histogramLookup map[identity.Stream]pmetric.HistogramDataPoint expHistogramLookup map[identity.Stream]pmetric.ExponentialHistogramDataPoint + summaryLookup map[identity.Stream]pmetric.SummaryDataPoint - exportInterval time.Duration + config *Config nextConsumer consumer.Metrics } @@ -59,15 +60,16 @@ func newProcessor(config *Config, log *zap.Logger, nextConsumer consumer.Metrics numberLookup: map[identity.Stream]pmetric.NumberDataPoint{}, histogramLookup: map[identity.Stream]pmetric.HistogramDataPoint{}, expHistogramLookup: map[identity.Stream]pmetric.ExponentialHistogramDataPoint{}, + summaryLookup: map[identity.Stream]pmetric.SummaryDataPoint{}, - exportInterval: config.Interval, + config: config, nextConsumer: nextConsumer, } } func (p *Processor) Start(_ context.Context, _ component.Host) error { - exportTicker := time.NewTicker(p.exportInterval) + exportTicker := time.NewTicker(p.config.Interval) go func() { for { select { @@ -102,8 +104,22 @@ func (p *Processor) ConsumeMetrics(ctx context.Context, md pmetric.Metrics) erro rm.ScopeMetrics().RemoveIf(func(sm pmetric.ScopeMetrics) bool { sm.Metrics().RemoveIf(func(m pmetric.Metric) bool { switch m.Type() { - case pmetric.MetricTypeGauge, pmetric.MetricTypeSummary: - return false + case pmetric.MetricTypeSummary: + if p.config.PassThrough.Summary { + return false + } + + mClone, metricID := p.getOrCloneMetric(rm, sm, m) + aggregateDataPoints(m.Summary().DataPoints(), mClone.Summary().DataPoints(), metricID, p.summaryLookup) + return true + case pmetric.MetricTypeGauge: + if p.config.PassThrough.Gauge { + return false + } + + mClone, metricID := p.getOrCloneMetric(rm, sm, m) + aggregateDataPoints(m.Gauge().DataPoints(), mClone.Gauge().DataPoints(), metricID, p.numberLookup) + return true case pmetric.MetricTypeSum: // Check if we care about this value sum := m.Sum() @@ -202,6 +218,7 @@ func (p *Processor) exportMetrics() { clear(p.numberLookup) clear(p.histogramLookup) clear(p.expHistogramLookup) + clear(p.summaryLookup) return out }() diff --git a/processor/intervalprocessor/processor_test.go b/processor/intervalprocessor/processor_test.go index 0515ef631e07..cd0b1f002da7 100644 --- a/processor/intervalprocessor/processor_test.go +++ b/processor/intervalprocessor/processor_test.go @@ -21,39 +21,42 @@ import ( func TestAggregation(t *testing.T) { t.Parallel() - testCases := []string{ - "basic_aggregation", - "non_monotonic_sums_are_passed_through", - "summaries_are_passed_through", - "histograms_are_aggregated", - "exp_histograms_are_aggregated", - "all_delta_metrics_are_passed_through", + testCases := []struct { + name string + passThrough bool + }{ + {name: "basic_aggregation"}, + {name: "histograms_are_aggregated"}, + {name: "exp_histograms_are_aggregated"}, + {name: "gauges_are_aggregated"}, + {name: "summaries_are_aggregated"}, + {name: "all_delta_metrics_are_passed_through"}, // Deltas are passed through even when aggregation is enabled + {name: "non_monotonic_sums_are_passed_through"}, // Non-monotonic sums are passed through even when aggregation is enabled + {name: "gauges_are_passed_through", passThrough: true}, + {name: "summaries_are_passed_through", passThrough: true}, } ctx, cancel := context.WithCancel(context.Background()) defer cancel() - config := &Config{Interval: time.Second} - + var config *Config for _, tc := range testCases { - testName := tc - - t.Run(testName, func(t *testing.T) { - t.Parallel() + config = &Config{Interval: time.Second, PassThrough: PassThrough{Gauge: tc.passThrough, Summary: tc.passThrough}} + t.Run(tc.name, func(t *testing.T) { // next stores the results of the filter metric processor next := &consumertest.MetricsSink{} factory := NewFactory() - mgp, err := factory.CreateMetricsProcessor( + mgp, err := factory.CreateMetrics( context.Background(), - processortest.NewNopCreateSettings(), + processortest.NewNopSettings(), config, next, ) require.NoError(t, err) - dir := filepath.Join("testdata", testName) + dir := filepath.Join("testdata", tc.name) md, err := golden.ReadMetrics(filepath.Join(dir, "input.yaml")) require.NoError(t, err) @@ -75,6 +78,7 @@ func TestAggregation(t *testing.T) { require.Empty(t, processor.numberLookup) require.Empty(t, processor.histogramLookup) require.Empty(t, processor.expHistogramLookup) + require.Empty(t, processor.summaryLookup) // Exporting again should return nothing processor.exportMetrics() diff --git a/processor/intervalprocessor/testdata/exp_histograms_are_aggregated/input.yaml b/processor/intervalprocessor/testdata/exp_histograms_are_aggregated/input.yaml index ccbc4815195d..23c4f66979fa 100644 --- a/processor/intervalprocessor/testdata/exp_histograms_are_aggregated/input.yaml +++ b/processor/intervalprocessor/testdata/exp_histograms_are_aggregated/input.yaml @@ -16,7 +16,7 @@ resourceMetrics: stringValue: bar metrics: - name: cumulative.exphistogram.test - histogram: + exponentialHistogram: aggregationTemporality: 2 dataPoints: - timeUnixNano: 50 diff --git a/processor/intervalprocessor/testdata/exp_histograms_are_aggregated/output.yaml b/processor/intervalprocessor/testdata/exp_histograms_are_aggregated/output.yaml index 3973030fef16..38985e088ac2 100644 --- a/processor/intervalprocessor/testdata/exp_histograms_are_aggregated/output.yaml +++ b/processor/intervalprocessor/testdata/exp_histograms_are_aggregated/output.yaml @@ -16,18 +16,18 @@ resourceMetrics: stringValue: bar metrics: - name: cumulative.exphistogram.test - histogram: + exponentialHistogram: aggregationTemporality: 2 dataPoints: - timeUnixNano: 80 scale: 4 zeroCount: 5 positive: - offset: 2 bucketCounts: [9, 12, 17, 8, 34] + offset: 2 negative: - offset: 6 bucketCounts: [6, 21, 9, 19, 7] + offset: 6 attributes: - key: aaa value: diff --git a/processor/intervalprocessor/testdata/gauges_are_aggregated/input.yaml b/processor/intervalprocessor/testdata/gauges_are_aggregated/input.yaml new file mode 100644 index 000000000000..019dd6dd8511 --- /dev/null +++ b/processor/intervalprocessor/testdata/gauges_are_aggregated/input.yaml @@ -0,0 +1,40 @@ +resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: asdf + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: foo + value: + stringValue: bar + metrics: + - name: test.gauge + gauge: + aggregationTemporality: 2 + dataPoints: + - timeUnixNano: 50 + asDouble: 345 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 20 + asDouble: 258 + attributes: + - key: aaa + value: + stringValue: bbb + # For interval processor point of view, only the last datapoint should be passed through. + - timeUnixNano: 80 + asDouble: 178 + attributes: + - key: aaa + value: + stringValue: bbb \ No newline at end of file diff --git a/processor/intervalprocessor/testdata/gauges_are_aggregated/next.yaml b/processor/intervalprocessor/testdata/gauges_are_aggregated/next.yaml new file mode 100644 index 000000000000..d2e76ef0f16b --- /dev/null +++ b/processor/intervalprocessor/testdata/gauges_are_aggregated/next.yaml @@ -0,0 +1 @@ +resourceMetrics: [] \ No newline at end of file diff --git a/processor/intervalprocessor/testdata/gauges_are_aggregated/output.yaml b/processor/intervalprocessor/testdata/gauges_are_aggregated/output.yaml new file mode 100644 index 000000000000..fe0b264bd1db --- /dev/null +++ b/processor/intervalprocessor/testdata/gauges_are_aggregated/output.yaml @@ -0,0 +1,27 @@ +resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: asdf + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: foo + value: + stringValue: bar + metrics: + - name: test.gauge + gauge: + aggregationTemporality: 2 + dataPoints: + - timeUnixNano: 80 + asDouble: 178 + attributes: + - key: aaa + value: + stringValue: bbb \ No newline at end of file diff --git a/processor/intervalprocessor/testdata/gauges_are_passed_through/input.yaml b/processor/intervalprocessor/testdata/gauges_are_passed_through/input.yaml index a3d65c2986e0..89b1879ee4d8 100644 --- a/processor/intervalprocessor/testdata/gauges_are_passed_through/input.yaml +++ b/processor/intervalprocessor/testdata/gauges_are_passed_through/input.yaml @@ -36,4 +36,4 @@ resourceMetrics: attributes: - key: aaa value: - stringValue: bbb + stringValue: bbb \ No newline at end of file diff --git a/processor/intervalprocessor/testdata/gauges_are_passed_through/next.yaml b/processor/intervalprocessor/testdata/gauges_are_passed_through/next.yaml index a3d65c2986e0..c1e8b3add92e 100644 --- a/processor/intervalprocessor/testdata/gauges_are_passed_through/next.yaml +++ b/processor/intervalprocessor/testdata/gauges_are_passed_through/next.yaml @@ -36,4 +36,4 @@ resourceMetrics: attributes: - key: aaa value: - stringValue: bbb + stringValue: bbb \ No newline at end of file diff --git a/processor/intervalprocessor/testdata/gauges_are_passed_through/output.yaml b/processor/intervalprocessor/testdata/gauges_are_passed_through/output.yaml index 3949e7c54ded..d2e76ef0f16b 100644 --- a/processor/intervalprocessor/testdata/gauges_are_passed_through/output.yaml +++ b/processor/intervalprocessor/testdata/gauges_are_passed_through/output.yaml @@ -1 +1 @@ -resourceMetrics: [] +resourceMetrics: [] \ No newline at end of file diff --git a/processor/intervalprocessor/testdata/summaries_are_aggregated/input.yaml b/processor/intervalprocessor/testdata/summaries_are_aggregated/input.yaml new file mode 100644 index 000000000000..c0190dd5c614 --- /dev/null +++ b/processor/intervalprocessor/testdata/summaries_are_aggregated/input.yaml @@ -0,0 +1,63 @@ +resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: asdf + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: foo + value: + stringValue: bar + metrics: + - name: summary.test + summary: + dataPoints: + - timeUnixNano: 50 + quantileValues: + - quantile: 0.25 + value: 50 + - quantile: 0.5 + value: 20 + - quantile: 0.75 + value: 75 + - quantile: 0.95 + value: 10 + attributes: + - key: aaa + value: + stringValue: bbb + - timeUnixNano: 20 + quantileValues: + - quantile: 0.25 + value: 40 + - quantile: 0.5 + value: 10 + - quantile: 0.75 + value: 60 + - quantile: 0.95 + value: 5 + attributes: + - key: aaa + value: + stringValue: bbb + # Only last summary should pass through + - timeUnixNano: 80 + quantileValues: + - quantile: 0.25 + value: 80 + - quantile: 0.5 + value: 35 + - quantile: 0.75 + value: 90 + - quantile: 0.95 + value: 15 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/processor/intervalprocessor/testdata/summaries_are_aggregated/next.yaml b/processor/intervalprocessor/testdata/summaries_are_aggregated/next.yaml new file mode 100644 index 000000000000..d2e76ef0f16b --- /dev/null +++ b/processor/intervalprocessor/testdata/summaries_are_aggregated/next.yaml @@ -0,0 +1 @@ +resourceMetrics: [] \ No newline at end of file diff --git a/processor/intervalprocessor/testdata/summaries_are_aggregated/output.yaml b/processor/intervalprocessor/testdata/summaries_are_aggregated/output.yaml new file mode 100644 index 000000000000..75b8475e9ba7 --- /dev/null +++ b/processor/intervalprocessor/testdata/summaries_are_aggregated/output.yaml @@ -0,0 +1,34 @@ +resourceMetrics: + - schemaUrl: https://test-res-schema.com/schema + resource: + attributes: + - key: asdf + value: + stringValue: foo + scopeMetrics: + - schemaUrl: https://test-scope-schema.com/schema + scope: + name: MyTestInstrument + version: "1.2.3" + attributes: + - key: foo + value: + stringValue: bar + metrics: + - name: summary.test + summary: + dataPoints: + - timeUnixNano: 80 + quantileValues: + - quantile: 0.25 + value: 80 + - quantile: 0.5 + value: 35 + - quantile: 0.75 + value: 90 + - quantile: 0.95 + value: 15 + attributes: + - key: aaa + value: + stringValue: bbb diff --git a/processor/intervalprocessor/testdata/summaries_are_passed_through/input.yaml b/processor/intervalprocessor/testdata/summaries_are_passed_through/input.yaml index 15862ceb73e8..7d9cdfd5b6fd 100644 --- a/processor/intervalprocessor/testdata/summaries_are_passed_through/input.yaml +++ b/processor/intervalprocessor/testdata/summaries_are_passed_through/input.yaml @@ -59,4 +59,4 @@ resourceMetrics: attributes: - key: aaa value: - stringValue: bbb + stringValue: bbb \ No newline at end of file diff --git a/processor/intervalprocessor/testdata/summaries_are_passed_through/next.yaml b/processor/intervalprocessor/testdata/summaries_are_passed_through/next.yaml index 15862ceb73e8..7d9cdfd5b6fd 100644 --- a/processor/intervalprocessor/testdata/summaries_are_passed_through/next.yaml +++ b/processor/intervalprocessor/testdata/summaries_are_passed_through/next.yaml @@ -59,4 +59,4 @@ resourceMetrics: attributes: - key: aaa value: - stringValue: bbb + stringValue: bbb \ No newline at end of file diff --git a/processor/intervalprocessor/testdata/summaries_are_passed_through/output.yaml b/processor/intervalprocessor/testdata/summaries_are_passed_through/output.yaml index 3949e7c54ded..d2e76ef0f16b 100644 --- a/processor/intervalprocessor/testdata/summaries_are_passed_through/output.yaml +++ b/processor/intervalprocessor/testdata/summaries_are_passed_through/output.yaml @@ -1 +1 @@ -resourceMetrics: [] +resourceMetrics: [] \ No newline at end of file diff --git a/processor/k8sattributesprocessor/README.md b/processor/k8sattributesprocessor/README.md index a8dfeb684d5e..ca38d8599ff9 100644 --- a/processor/k8sattributesprocessor/README.md +++ b/processor/k8sattributesprocessor/README.md @@ -2,13 +2,17 @@ | Status | | | ------------- |-----------| -| Stability | [beta]: logs, metrics, traces | -| Distributions | [contrib] | +| Stability | [development]: profiles | +| | [beta]: logs, metrics, traces | +| Distributions | [contrib], [k8s] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aprocessor%2Fk8sattributes%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aprocessor%2Fk8sattributes) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aprocessor%2Fk8sattributes%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aprocessor%2Fk8sattributes) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@dmitryax](https://www.github.com/dmitryax), [@rmfitzpatrick](https://www.github.com/rmfitzpatrick), [@fatsheep9146](https://www.github.com/fatsheep9146), [@TylerHelmuth](https://www.github.com/TylerHelmuth) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@dmitryax](https://www.github.com/dmitryax), [@fatsheep9146](https://www.github.com/fatsheep9146), [@TylerHelmuth](https://www.github.com/TylerHelmuth), [@ChrsMark](https://www.github.com/ChrsMark) | +| Emeritus | [@rmfitzpatrick](https://www.github.com/rmfitzpatrick) | -[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[development]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#development +[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta [contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[k8s]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-k8s Kubernetes attributes processor allow automatic setting of spans, metrics and logs resource attributes with k8s metadata. @@ -26,7 +30,8 @@ The processor stores the list of running pods and the associated metadata. When to the pod from where the datapoint originated, so we can add the relevant pod metadata to the datapoint. By default, it associates the incoming connection IP to the Pod IP. But for cases where this approach doesn't work (sending through a proxy, etc.), a custom association rule can be specified. -Each association is specified as a list of sources of associations. A source is a rule that matches metadata from the datapoint to pod metadata. +Each association is specified as a list of sources of associations. The maximum number of sources within an association is 4. +A source is a rule that matches metadata from the datapoint to pod metadata. In order to get an association applied, all the sources specified need to match. Each sources rule is specified as a pair of `from` (representing the rule type) and `name` (representing the attribute name if `from` is set to `resource_attribute`). @@ -35,7 +40,7 @@ The following rule types are available: - `connection`: Takes the IP attribute from connection context (if available). In this case the processor must appear before any batching or tail sampling, which remove this information. - `resource_attribute`: Allows specifying the attribute name to lookup in the list of attributes of the received Resource. Semantic convention should be used for naming. -Pod association configuration. +Example for a pod association configuration: ```yaml pod_association: @@ -64,7 +69,31 @@ The following attributes are added by default: - k8s.deployment.name - k8s.node.name -You can change this list with `metadata` configuration. +These attributes are also available for the use within association rules by default. +The `metadata` section can also be extended with additional attributes which, if present in the `metadata` section, +are then also available for the use within association rules. Available attributes are: + - k8s.namespace.name + - k8s.pod.name + - k8s.pod.hostname + - k8s.pod.ip + - k8s.pod.start_time + - k8s.pod.uid + - k8s.replicaset.uid + - k8s.replicaset.name + - k8s.deployment.uid + - k8s.deployment.name + - k8s.daemonset.uid + - k8s.daemonset.name + - k8s.statefulset.uid + - k8s.statefulset.name + - k8s.cronjob.uid + - k8s.cronjob.name + - k8s.job.uid + - k8s.job.name + - k8s.node.name + - k8s.cluster.uid + - Any tags extracted from the pod labels and annotations, as described in [extracting attributes from pod labels and annotations](#extracting-attributes-from-pod-labels-and-annotations) + Not all the attributes are guaranteed to be added. Only attribute names from `metadata` should be used for pod_association's `resource_attribute`, because empty or non-existing values will be ignored. @@ -75,13 +104,118 @@ Additional container level attributes can be extracted provided that certain res - k8s.container.name - container.image.name - container.image.tag + - container.image.repo_digests (if k8s CRI populates [repository digest field](https://github.com/open-telemetry/semantic-conventions/blob/v1.26.0/model/registry/container.yaml#L60-L71)) 2. If the `k8s.container.name` resource attribute is provided, the following additional attributes will be available: + - container.id (if the `k8s.container.restart_count` resource attribute is not provided, it's not guaranteed to get the right container ID.) - container.image.name - container.image.tag + - container.image.repo_digests (if k8s CRI populates [repository digest field](https://github.com/open-telemetry/semantic-conventions/blob/v1.26.0/model/registry/container.yaml#L60-L71)) 3. If the `k8s.container.restart_count` resource attribute is provided, it can be used to associate with a particular container instance. If it's not set, the latest container instance will be used: - container.id (not added by default, has to be specified in `metadata`) +Please note, however, that container level attributes can't be used for source rules in the pod_association. + +Example for extracting container level attributes: + +```yaml +pod_association: +- sources: + - from: connection +extract: + metadata: + - k8s.pod.name + - k8s.pod.uid + - container.image.name + - container.image.tag + - k8s.container.name +``` + +The previous configuration attaches the attributes listed in the `metadata` section to all resources received by a matching pod with the `k8s.container.name` attribute being present. For example, when the following trace + +```json +{ + "name": "lets-go", + "context": { + "trace_id": "0x5b8aa5a2d2c872e8321cf37308d69df2", + "span_id": "0x051581bf3cb55c13" + }, + "parent_id": null, + "start_time": "2022-04-29T18:52:58.114201Z", + "end_time": "2022-04-29T18:52:58.114687Z", + "attributes": { + "k8s.container.name": "telemetrygen" + } +} +``` + +is sent to the collector by the following pod, + +```yaml +apiVersion: v1 +kind: Pod +metadata: + annotations: + workload: deployment + name: telemetrygen-pod + namespace: e2ek8senrichment + uid: 038e2267-b473-489b-b48c-46bafdb852eb +spec: + containers: + - command: + - /telemetrygen + - traces + - --otlp-insecure + - --otlp-endpoint=otelcollector.svc.cluster.local:4317 + - --duration=10s + - --rate=1 + - --otlp-attributes=k8s.container.name="telemetrygen" + image: ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen:0.112.0@sha256:b248ef911f93ae27cbbc85056d1ffacc87fd941bbdc2ffd951b6df8df72b8096 + name: telemetrygen +status: + podIP: 10.244.0.11 +``` + +the processor associates the received trace to the pod, based on the connection IP, and add those attributes to the resulting span: + +```json +{ + "name": "lets-go", + "context": { + "trace_id": "0x5b8aa5a2d2c872e8321cf37308d69df2", + "span_id": "0x051581bf3cb55c13" + }, + "parent_id": null, + "start_time": "2022-04-29T18:52:58.114201Z", + "end_time": "2022-04-29T18:52:58.114687Z", + "attributes": { + "k8s.container.name": "telemetrygen", + "k8s.pod.name": "telemetrygen-pod", + "k8s.pod.uid": "038e2267-b473-489b-b48c-46bafdb852eb", + "container.image.name": "telemetrygen", + "container.image.tag": "0.112.0", + "container.image.repo_digests": ["ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen@sha256:b248ef911f93ae27cbbc85056d1ffacc87fd941bbdc2ffd951b6df8df72b8096"] + } +} +``` + +By default, the processor will be ready as soon as it starts, even if no metadata has been fetched yet. +If data is sent to this processor before the metadata is synced, there will be no metadata to enrich the data with. + +To wait for the metadata to be synced before the processor is ready, set the `wait_for_metadata` option to `true`. +Then the processor will not be ready until the metadata is fully synced. As a result, the start-up of the Collector will be blocked. If the metadata cannot be synced, the Collector will ultimately fail to start. +If a timeout is reached, the processor will fail to start and return an error, which will cause the collector to exit. +The timeout defaults to 10s and can be configured with the `metadata_sync_timeout` option. + +example for setting the processor to wait for metadata to be synced before it is ready: + +```yaml +wait_for_metadata: true +wait_for_metadata_timeout: 10s +``` + +## Extracting attributes from pod labels and annotations + The k8sattributesprocessor can also set resource attributes from k8s labels and annotations of pods, namespaces and nodes. The config for associating the data passing through the processor (spans, metrics and logs) with specific Pod/Namespace/Node annotations/labels is configured via "annotations" and "labels" keys. This config represents a list of annotations/labels that are extracted from pods/namespaces/nodes and added to spans, metrics and logs. @@ -126,8 +260,10 @@ k8sattributes/2: auth_type: "serviceAccount" passthrough: false filter: + # only retrieve pods running on the same node as the collector node_from_env_var: KUBE_NODE_NAME extract: + # The attributes provided in 'metadata' will be added to associated resources metadata: - k8s.pod.name - k8s.pod.uid @@ -135,18 +271,22 @@ k8sattributes/2: - k8s.namespace.name - k8s.node.name - k8s.pod.start_time - labels: + labels: + # This label extraction rule takes the value 'app.kubernetes.io/component' label and maps it to the 'app.label.component' attribute which will be added to the associated resources - tag_name: app.label.component key: app.kubernetes.io/component from: pod pod_association: - sources: + # This rule associates all resources containing the 'k8s.pod.ip' attribute with the matching pods. If this attribute is not present in the resource, this rule will not be able to find the matching pod. - from: resource_attribute name: k8s.pod.ip - sources: + # This rule associates all resources containing the 'k8s.pod.uid' attribute with the matching pods. If this attribute is not present in the resource, this rule will not be able to find the matching pod. - from: resource_attribute name: k8s.pod.uid - sources: + # This rule will use the IP from the incoming connection from which the resource is received, and find the matching pod, based on the 'pod.status.podIP' of the observed pods - from: connection ``` @@ -332,3 +472,51 @@ as tags. By default, the `k8s.pod.start_time` uses [Time.MarshalText()](https://pkg.go.dev/time#Time.MarshalText) to format the timestamp value as an RFC3339 compliant timestamp. + +## Feature Gate + +### `k8sattr.fieldExtractConfigRegex.disallow` + +The `k8sattr.fieldExtractConfigRegex.disallow` [feature gate](https://github.com/open-telemetry/opentelemetry-collector/blob/main/featuregate/README.md#collector-feature-gates) disallows the usage of the `extract.annotations.regex` and `extract.labels.regex` fields. +The validation performed on the configuration will fail, if at least one of the parameters is set (non-empty) and `k8sattr.fieldExtractConfigRegex.disallow` is set to `true` (default `false`). + +#### Example Usage + +The following config with the feature gate set will lead to validation error: + +`config.yaml`: + + ```yaml + extract: + labels: + regex: + annotations: + regex: + ``` + + Run collector: `./otelcol --config config.yaml --feature-gates=k8sattr.fieldExtractConfigRegex.disallow` + +#### Migration + +Deprecation of the `extract.annotations.regex` and `extract.labels.regex` fields means that it is recommended to use the `ExtractPatterns` function from the transform processor instead. To convert your current configuration please check the `ExtractPatterns` function [documentation](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/pkg/ottl/ottlfuncs#extractpatterns). You should use the `pattern` parameter of `ExtractPatterns` instead of using the the `extract.annotations.regex` and `extract.labels.regex` fields. + +##### Example + +The following configuration of `k8sattributes processor`: + +`config.yaml`: + + ```yaml + annotations: + - tag_name: a2 # extracts value of annotation with key `annotation2` with regexp and inserts it as a tag with key `a2` + key: annotation2 + regex: field=(?P.+) + from: pod + ``` + +can be converted with the usage of `ExtractPatterns` function: + +```yaml + - set(cache["annotations"], ExtractPatterns(attributes["k8s.pod.annotations["annotation2"], "field=(?P.+))") + - set(k8s.pod.annotations["a2"], cache["annotations"]["value"]) +``` diff --git a/processor/k8sattributesprocessor/client_test.go b/processor/k8sattributesprocessor/client_test.go index 0ab0d830d28f..c69e0638301a 100644 --- a/processor/k8sattributesprocessor/client_test.go +++ b/processor/k8sattributesprocessor/client_test.go @@ -4,7 +4,9 @@ package k8sattributesprocessor import ( - "go.uber.org/zap" + "time" + + "go.opentelemetry.io/collector/component" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" "k8s.io/client-go/kubernetes/fake" @@ -35,7 +37,7 @@ func selectors() (labels.Selector, fields.Selector) { } // newFakeClient instantiates a new FakeClient object and satisfies the ClientProvider type -func newFakeClient(_ *zap.Logger, _ k8sconfig.APIConfig, rules kube.ExtractionRules, filters kube.Filters, associations []kube.Association, _ kube.Excludes, _ kube.APIClientsetProvider, _ kube.InformerProvider, _ kube.InformerProviderNamespace, _ kube.InformerProviderReplicaSet) (kube.Client, error) { +func newFakeClient(_ component.TelemetrySettings, _ k8sconfig.APIConfig, rules kube.ExtractionRules, filters kube.Filters, associations []kube.Association, _ kube.Excludes, _ kube.APIClientsetProvider, _ kube.InformerProvider, _ kube.InformerProviderNamespace, _ kube.InformerProviderReplicaSet, _ bool, _ time.Duration) (kube.Client, error) { cs := fake.NewSimpleClientset() ls, fs := selectors() @@ -70,10 +72,11 @@ func (f *fakeClient) GetNode(nodeName string) (*kube.Node, bool) { } // Start is a noop for FakeClient. -func (f *fakeClient) Start() { +func (f *fakeClient) Start() error { if f.Informer != nil { - f.Informer.Run(f.StopCh) + go f.Informer.Run(f.StopCh) } + return nil } // Stop is a noop for FakeClient. diff --git a/processor/k8sattributesprocessor/config.go b/processor/k8sattributesprocessor/config.go index 809ff4fe301f..336a50cd3809 100644 --- a/processor/k8sattributesprocessor/config.go +++ b/processor/k8sattributesprocessor/config.go @@ -6,13 +6,22 @@ package k8sattributesprocessor // import "github.com/open-telemetry/opentelemetr import ( "fmt" "regexp" + "time" + "go.opentelemetry.io/collector/featuregate" conventions "go.opentelemetry.io/collector/semconv/v1.6.1" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor/internal/kube" ) +var disallowFieldExtractConfigRegex = featuregate.GlobalRegistry().MustRegister( + "k8sattr.fieldExtractConfigRegex.disallow", + featuregate.StageBeta, + featuregate.WithRegisterDescription("When enabled, usage of the FieldExtractConfig.Regex field is disallowed"), + featuregate.WithRegisterFromVersion("v0.106.0"), +) + // Config defines configuration for k8s attributes processor. type Config struct { k8sconfig.APIConfig `mapstructure:",squash"` @@ -38,6 +47,12 @@ type Config struct { // Exclude section allows to define names of pod that should be // ignored while tagging. Exclude ExcludeConfig `mapstructure:"exclude"` + + // WaitForMetadata is a flag that determines if the processor should wait k8s metadata to be synced when starting. + WaitForMetadata bool `mapstructure:"wait_for_metadata"` + + // WaitForMetadataTimeout is the maximum time the processor will wait for the k8s metadata to be synced. + WaitForMetadataTimeout time.Duration `mapstructure:"wait_for_metadata_timeout"` } func (cfg *Config) Validate() error { @@ -63,6 +78,9 @@ func (cfg *Config) Validate() error { } if f.Regex != "" { + if disallowFieldExtractConfigRegex.IsEnabled() { + return fmt.Errorf("the extract.annotations.regex and extract.labels.regex fields have been deprecated, please use the `ExtractPatterns` function in the transform processor instead") + } r, err := regexp.Compile(f.Regex) if err != nil { return err @@ -84,7 +102,7 @@ func (cfg *Config) Validate() error { for _, field := range cfg.Extract.Metadata { switch field { case conventions.AttributeK8SNamespaceName, conventions.AttributeK8SPodName, conventions.AttributeK8SPodUID, - specPodHostName, metadataPodStartTime, + specPodHostName, metadataPodStartTime, metadataPodIP, conventions.AttributeK8SDeploymentName, conventions.AttributeK8SDeploymentUID, conventions.AttributeK8SReplicaSetName, conventions.AttributeK8SReplicaSetUID, conventions.AttributeK8SDaemonSetName, conventions.AttributeK8SDaemonSetUID, @@ -94,7 +112,7 @@ func (cfg *Config) Validate() error { conventions.AttributeK8SNodeName, conventions.AttributeK8SNodeUID, conventions.AttributeK8SContainerName, conventions.AttributeContainerID, conventions.AttributeContainerImageName, conventions.AttributeContainerImageTag, - clusterUID: + containerImageRepoDigests, clusterUID: default: return fmt.Errorf("\"%s\" is not a supported metadata field", field) } @@ -132,8 +150,8 @@ type ExtractConfig struct { // k8s.daemonset.name, k8s.daemonset.uid, // k8s.job.name, k8s.job.uid, k8s.cronjob.name, // k8s.statefulset.name, k8s.statefulset.uid, - // k8s.container.name, container.image.name, - // container.image.tag, container.id + // k8s.container.name, container.id, container.image.name, + // container.image.tag, container.image.repo_digests // k8s.cluster.uid // // Specifying anything other than these values will result in an error. @@ -213,10 +231,12 @@ type FieldExtractConfig struct { // regex: JENKINS=(?P[\w]+) // // this will add the `git.sha` and `ci.build` resource attributes. + // Deprecated: [v0.106.0] Use the `ExtractPatterns` function in the transform processor instead. + // More information about how to replace the regex field can be found in the k8sattributes processor readme. Regex string `mapstructure:"regex"` // From represents the source of the labels/annotations. - // Allowed values are "pod" and "namespace". The default is pod. + // Allowed values are "pod", "namespace", and "node". The default is pod. From string `mapstructure:"from"` } diff --git a/processor/k8sattributesprocessor/config_test.go b/processor/k8sattributesprocessor/config_test.go index 9ec78ede8856..db8ae337737c 100644 --- a/processor/k8sattributesprocessor/config_test.go +++ b/processor/k8sattributesprocessor/config_test.go @@ -6,11 +6,13 @@ package k8sattributesprocessor import ( "path/filepath" "testing" + "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/confmap/confmaptest" + "go.opentelemetry.io/collector/featuregate" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor/internal/kube" @@ -21,8 +23,9 @@ func TestLoadConfig(t *testing.T) { t.Parallel() tests := []struct { - id component.ID - expected component.Config + id component.ID + expected component.Config + disallowRegex bool }{ { id: component.NewID(metadata.Type), @@ -32,6 +35,7 @@ func TestLoadConfig(t *testing.T) { Extract: ExtractConfig{ Metadata: enabledAttributes(), }, + WaitForMetadataTimeout: 10 * time.Second, }, }, { @@ -40,7 +44,7 @@ func TestLoadConfig(t *testing.T) { APIConfig: k8sconfig.APIConfig{AuthType: k8sconfig.AuthTypeKubeConfig}, Passthrough: false, Extract: ExtractConfig{ - Metadata: []string{"k8s.pod.name", "k8s.pod.uid", "k8s.deployment.name", "k8s.namespace.name", "k8s.node.name", "k8s.pod.start_time", "k8s.cluster.uid"}, + Metadata: []string{"k8s.pod.name", "k8s.pod.uid", "k8s.pod.ip", "k8s.deployment.name", "k8s.namespace.name", "k8s.node.name", "k8s.pod.start_time", "k8s.cluster.uid"}, Annotations: []FieldExtractConfig{ {TagName: "a1", Key: "annotation-one", From: "pod"}, {TagName: "a2", Key: "annotation-two", Regex: "field=(?P.+)", From: kube.MetadataFromPod}, @@ -103,7 +107,9 @@ func TestLoadConfig(t *testing.T) { {Name: "jaeger-collector"}, }, }, + WaitForMetadataTimeout: 10 * time.Second, }, + disallowRegex: false, }, { id: component.NewIDWithName(metadata.Type, "3"), @@ -125,11 +131,40 @@ func TestLoadConfig(t *testing.T) { {Name: "jaeger-collector"}, }, }, + WaitForMetadataTimeout: 10 * time.Second, }, }, + { + id: component.NewIDWithName(metadata.Type, "deprecated-regex"), + expected: &Config{ + APIConfig: k8sconfig.APIConfig{AuthType: k8sconfig.AuthTypeKubeConfig}, + Passthrough: false, + Extract: ExtractConfig{ + Metadata: enabledAttributes(), + Annotations: []FieldExtractConfig{ + {Regex: "field=(?P.+)", From: "pod"}, + }, + Labels: []FieldExtractConfig{ + {Regex: "field=(?P.+)", From: "pod"}, + }, + }, + Exclude: ExcludeConfig{ + Pods: []ExcludePodConfig{ + {Name: "jaeger-agent"}, + {Name: "jaeger-collector"}, + }, + }, + WaitForMetadataTimeout: 10 * time.Second, + }, + disallowRegex: false, + }, { id: component.NewIDWithName(metadata.Type, "too_many_sources"), }, + { + id: component.NewIDWithName(metadata.Type, "deprecated-regex"), + disallowRegex: true, + }, { id: component.NewIDWithName(metadata.Type, "bad_keys_labels"), }, @@ -176,6 +211,12 @@ func TestLoadConfig(t *testing.T) { for _, tt := range tests { t.Run(tt.id.String(), func(t *testing.T) { + if !tt.disallowRegex { + require.NoError(t, featuregate.GlobalRegistry().Set(disallowFieldExtractConfigRegex.ID(), false)) + t.Cleanup(func() { + require.NoError(t, featuregate.GlobalRegistry().Set(disallowFieldExtractConfigRegex.ID(), true)) + }) + } cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml")) require.NoError(t, err) @@ -184,7 +225,7 @@ func TestLoadConfig(t *testing.T) { sub, err := cm.Sub(tt.id.String()) require.NoError(t, err) - require.NoError(t, component.UnmarshalConfig(sub, cfg)) + require.NoError(t, sub.Unmarshal(cfg)) if tt.expected == nil { err = component.ValidateConfig(cfg) diff --git a/processor/k8sattributesprocessor/documentation.md b/processor/k8sattributesprocessor/documentation.md new file mode 100644 index 000000000000..fd68ea6a2372 --- /dev/null +++ b/processor/k8sattributesprocessor/documentation.md @@ -0,0 +1,149 @@ +[comment]: <> (Code generated by mdatagen. DO NOT EDIT.) + +# k8sattributes + +## Resource Attributes + +| Name | Description | Values | Enabled | +| ---- | ----------- | ------ | ------- | +| container.id | Container ID. Usually a UUID, as for example used to identify Docker containers. The UUID might be abbreviated. Requires k8s.container.restart_count. | Any Str | false | +| container.image.name | Name of the image the container was built on. Requires container.id or k8s.container.name. | Any Str | true | +| container.image.repo_digests | Repo digests of the container image as provided by the container runtime. | Any Slice | false | +| container.image.tag | Container image tag. Defaults to "latest" if not provided (unless digest also in image path) Requires container.id or k8s.container.name. | Any Str | true | +| k8s.cluster.uid | Gives cluster uid identified with kube-system namespace | Any Str | false | +| k8s.container.name | The name of the Container in a Pod template. Requires container.id. | Any Str | false | +| k8s.cronjob.name | The name of the CronJob. | Any Str | false | +| k8s.daemonset.name | The name of the DaemonSet. | Any Str | false | +| k8s.daemonset.uid | The UID of the DaemonSet. | Any Str | false | +| k8s.deployment.name | The name of the Deployment. | Any Str | true | +| k8s.deployment.uid | The UID of the Deployment. | Any Str | false | +| k8s.job.name | The name of the Job. | Any Str | false | +| k8s.job.uid | The UID of the Job. | Any Str | false | +| k8s.namespace.name | The name of the namespace that the pod is running in. | Any Str | true | +| k8s.node.name | The name of the Node. | Any Str | true | +| k8s.node.uid | The UID of the Node. | Any Str | false | +| k8s.pod.hostname | The hostname of the Pod. | Any Str | false | +| k8s.pod.ip | The IP address of the Pod. | Any Str | false | +| k8s.pod.name | The name of the Pod. | Any Str | true | +| k8s.pod.start_time | The start time of the Pod. | Any Str | true | +| k8s.pod.uid | The UID of the Pod. | Any Str | true | +| k8s.replicaset.name | The name of the ReplicaSet. | Any Str | false | +| k8s.replicaset.uid | The UID of the ReplicaSet. | Any Str | false | +| k8s.statefulset.name | The name of the StatefulSet. | Any Str | false | +| k8s.statefulset.uid | The UID of the StatefulSet. | Any Str | false | + +## Internal Telemetry + +The following telemetry is emitted by this component. + +### otelcol_otelsvc_k8s_ip_lookup_miss + +Number of times pod by IP lookup failed. + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| 1 | Sum | Int | true | + +### otelcol_otelsvc_k8s_namespace_added + +Number of namespace add events received + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| 1 | Sum | Int | true | + +### otelcol_otelsvc_k8s_namespace_deleted + +Number of namespace delete events received + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| 1 | Sum | Int | true | + +### otelcol_otelsvc_k8s_namespace_updated + +Number of namespace update events received + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| 1 | Sum | Int | true | + +### otelcol_otelsvc_k8s_node_added + +Number of node add events received + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| 1 | Sum | Int | true | + +### otelcol_otelsvc_k8s_node_deleted + +Number of node delete events received + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| 1 | Sum | Int | true | + +### otelcol_otelsvc_k8s_node_updated + +Number of node update events received + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| 1 | Sum | Int | true | + +### otelcol_otelsvc_k8s_pod_added + +Number of pod add events received + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| 1 | Sum | Int | true | + +### otelcol_otelsvc_k8s_pod_deleted + +Number of pod delete events received + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| 1 | Sum | Int | true | + +### otelcol_otelsvc_k8s_pod_table_size + +Size of table containing pod info + +| Unit | Metric Type | Value Type | +| ---- | ----------- | ---------- | +| 1 | Gauge | Int | + +### otelcol_otelsvc_k8s_pod_updated + +Number of pod update events received + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| 1 | Sum | Int | true | + +### otelcol_otelsvc_k8s_replicaset_added + +Number of ReplicaSet add events received + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| 1 | Sum | Int | true | + +### otelcol_otelsvc_k8s_replicaset_deleted + +Number of ReplicaSet delete events received + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| 1 | Sum | Int | true | + +### otelcol_otelsvc_k8s_replicaset_updated + +Number of ReplicaSet update events received + +| Unit | Metric Type | Value Type | Monotonic | +| ---- | ----------- | ---------- | --------- | +| 1 | Sum | Int | true | diff --git a/processor/k8sattributesprocessor/e2e_test.go b/processor/k8sattributesprocessor/e2e_test.go index 9057ce96c06f..47d57b2c6a29 100644 --- a/processor/k8sattributesprocessor/e2e_test.go +++ b/processor/k8sattributesprocessor/e2e_test.go @@ -17,12 +17,14 @@ import ( "github.com/google/uuid" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/consumer/consumertest" "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pipeline" + "go.opentelemetry.io/collector/pipeline/pipelineprofiles" "go.opentelemetry.io/collector/receiver/otlpreceiver" "go.opentelemetry.io/collector/receiver/receivertest" + "go.opentelemetry.io/collector/receiver/xreceiver" "go.uber.org/multierr" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8stest" @@ -32,6 +34,7 @@ const ( equal = iota regex exist + shouldnotexist testKubeConfig = "/tmp/kube-config-otelcol-e2e-testing" uidRe = "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}" startTimeRe = "^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}%3A\\\\d{2}%3A\\\\d{2}(?:%2E\\\\d+)?[A-Z]?(?:[+.-](?:08%3A\\\\d{2}|\\\\d{2}[A-Z]))?$" @@ -51,7 +54,7 @@ func newExpectedValue(mode int, value string) *expectedValue { // TestE2E_ClusterRBAC tests the k8s attributes processor in a k8s cluster with the collector's service account having // cluster-wide permissions to list/watch namespaces, nodes, pods and replicasets. The config in the test does not -// set filter::namespace. +// set filter::namespace, and the telemetrygen image has a latest tag but no digest. // The test requires a prebuilt otelcontribcol image uploaded to a kind k8s cluster defined in // `/tmp/kube-config-otelcol-e2e-testing`. Run the following command prior to running the test locally: // @@ -78,7 +81,8 @@ func TestE2E_ClusterRBAC(t *testing.T) { metricsConsumer := new(consumertest.MetricsSink) tracesConsumer := new(consumertest.TracesSink) logsConsumer := new(consumertest.LogsSink) - shutdownSinks := startUpSinks(t, metricsConsumer, tracesConsumer, logsConsumer) + profilesConsumer := new(consumertest.ProfilesSink) + shutdownSinks := startUpSinks(t, metricsConsumer, tracesConsumer, logsConsumer, profilesConsumer) defer shutdownSinks() testID := uuid.NewString()[:8] @@ -87,7 +91,10 @@ func TestE2E_ClusterRBAC(t *testing.T) { ManifestsDir: filepath.Join(testDir, "telemetrygen"), TestID: testID, OtlpEndpoint: fmt.Sprintf("otelcol-%s.%s:4317", testID, testNs), - DataTypes: []string{"metrics", "logs", "traces"}, + // `telemetrygen` doesn't support profiles + // https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/36127 + // TODO: add "profiles" to DataTypes once #36127 is resolved + DataTypes: []string{"metrics", "logs", "traces"}, } telemetryGenObjs, telemetryGenObjInfos := k8stest.CreateTelemetryGenObjects(t, k8sClient, createTeleOpts) defer func() { @@ -100,304 +107,417 @@ func TestE2E_ClusterRBAC(t *testing.T) { k8stest.WaitForTelemetryGenToStart(t, k8sClient, info.Namespace, info.PodLabelSelectors, info.Workload, info.DataType) } - wantEntries := 128 // Minimal number of metrics/traces/logs to wait for. - waitForData(t, wantEntries, metricsConsumer, tracesConsumer, logsConsumer) + wantEntries := 128 // Minimal number of metrics/traces/logs/profiles to wait for. + waitForData(t, wantEntries, metricsConsumer, tracesConsumer, logsConsumer, profilesConsumer) tcs := []struct { name string - dataType component.DataType + dataType pipeline.Signal service string attrs map[string]*expectedValue }{ { name: "traces-job", - dataType: component.DataTypeTraces, + dataType: pipeline.SignalTraces, service: "test-traces-job", attrs: map[string]*expectedValue{ - "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-traces-job-[a-z0-9]*"), - "k8s.pod.ip": newExpectedValue(exist, ""), - "k8s.pod.uid": newExpectedValue(regex, uidRe), - "k8s.pod.start_time": newExpectedValue(exist, ""), - "k8s.node.name": newExpectedValue(exist, ""), - "k8s.namespace.name": newExpectedValue(equal, testNs), - "k8s.job.name": newExpectedValue(equal, "telemetrygen-"+testID+"-traces-job"), - "k8s.job.uid": newExpectedValue(exist, ""), - "k8s.annotations.workload": newExpectedValue(equal, "job"), - "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-traces-job"), - "k8s.container.name": newExpectedValue(equal, "telemetrygen"), - "k8s.cluster.uid": newExpectedValue(regex, uidRe), - "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), - "container.image.tag": newExpectedValue(equal, "latest"), - "container.id": newExpectedValue(exist, ""), - "k8s.node.labels.foo": newExpectedValue(equal, "too"), - "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), + "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-traces-job-[a-z0-9]*"), + "k8s.pod.ip": newExpectedValue(exist, ""), + "k8s.pod.uid": newExpectedValue(regex, uidRe), + "k8s.pod.start_time": newExpectedValue(exist, ""), + "k8s.node.name": newExpectedValue(exist, ""), + "k8s.namespace.name": newExpectedValue(equal, testNs), + "k8s.job.name": newExpectedValue(equal, "telemetrygen-"+testID+"-traces-job"), + "k8s.job.uid": newExpectedValue(exist, ""), + "k8s.annotations.workload": newExpectedValue(equal, "job"), + "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-traces-job"), + "k8s.container.name": newExpectedValue(equal, "telemetrygen"), + "k8s.cluster.uid": newExpectedValue(regex, uidRe), + "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), + "container.image.repo_digests": newExpectedValue(regex, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen@sha256:[0-9a-fA-f]{64}"), + "container.image.tag": newExpectedValue(equal, "latest"), + "container.id": newExpectedValue(exist, ""), + "k8s.node.labels.foo": newExpectedValue(equal, "too"), + "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), }, }, { name: "traces-statefulset", - dataType: component.DataTypeTraces, + dataType: pipeline.SignalTraces, service: "test-traces-statefulset", attrs: map[string]*expectedValue{ - "k8s.pod.name": newExpectedValue(equal, "telemetrygen-"+testID+"-traces-statefulset-0"), - "k8s.pod.ip": newExpectedValue(exist, ""), - "k8s.pod.uid": newExpectedValue(regex, uidRe), - "k8s.pod.start_time": newExpectedValue(exist, ""), - "k8s.node.name": newExpectedValue(exist, ""), - "k8s.namespace.name": newExpectedValue(equal, testNs), - "k8s.statefulset.name": newExpectedValue(equal, "telemetrygen-"+testID+"-traces-statefulset"), - "k8s.statefulset.uid": newExpectedValue(exist, ""), - "k8s.annotations.workload": newExpectedValue(equal, "statefulset"), - "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-traces-statefulset"), - "k8s.container.name": newExpectedValue(equal, "telemetrygen"), - "k8s.cluster.uid": newExpectedValue(regex, uidRe), - "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), - "container.image.tag": newExpectedValue(equal, "latest"), - "container.id": newExpectedValue(exist, ""), - "k8s.node.labels.foo": newExpectedValue(equal, "too"), - "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), + "k8s.pod.name": newExpectedValue(equal, "telemetrygen-"+testID+"-traces-statefulset-0"), + "k8s.pod.ip": newExpectedValue(exist, ""), + "k8s.pod.uid": newExpectedValue(regex, uidRe), + "k8s.pod.start_time": newExpectedValue(exist, ""), + "k8s.node.name": newExpectedValue(exist, ""), + "k8s.namespace.name": newExpectedValue(equal, testNs), + "k8s.statefulset.name": newExpectedValue(equal, "telemetrygen-"+testID+"-traces-statefulset"), + "k8s.statefulset.uid": newExpectedValue(exist, ""), + "k8s.annotations.workload": newExpectedValue(equal, "statefulset"), + "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-traces-statefulset"), + "k8s.container.name": newExpectedValue(equal, "telemetrygen"), + "k8s.cluster.uid": newExpectedValue(regex, uidRe), + "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), + "container.image.repo_digests": newExpectedValue(regex, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen@sha256:[0-9a-fA-f]{64}"), + "container.image.tag": newExpectedValue(equal, "latest"), + "container.id": newExpectedValue(exist, ""), + "k8s.node.labels.foo": newExpectedValue(equal, "too"), + "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), }, }, { name: "traces-deployment", - dataType: component.DataTypeTraces, + dataType: pipeline.SignalTraces, service: "test-traces-deployment", attrs: map[string]*expectedValue{ - "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-traces-deployment-[a-z0-9]*-[a-z0-9]*"), - "k8s.pod.ip": newExpectedValue(exist, ""), - "k8s.pod.uid": newExpectedValue(regex, uidRe), - "k8s.pod.start_time": newExpectedValue(exist, ""), - "k8s.node.name": newExpectedValue(exist, ""), - "k8s.namespace.name": newExpectedValue(equal, testNs), - "k8s.deployment.name": newExpectedValue(equal, "telemetrygen-"+testID+"-traces-deployment"), - "k8s.deployment.uid": newExpectedValue(exist, ""), - "k8s.replicaset.name": newExpectedValue(regex, "telemetrygen-"+testID+"-traces-deployment-[a-z0-9]*"), - "k8s.replicaset.uid": newExpectedValue(exist, ""), - "k8s.annotations.workload": newExpectedValue(equal, "deployment"), - "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-traces-deployment"), - "k8s.container.name": newExpectedValue(equal, "telemetrygen"), - "k8s.cluster.uid": newExpectedValue(regex, uidRe), - "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), - "container.image.tag": newExpectedValue(equal, "latest"), - "container.id": newExpectedValue(exist, ""), - "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), + "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-traces-deployment-[a-z0-9]*-[a-z0-9]*"), + "k8s.pod.ip": newExpectedValue(exist, ""), + "k8s.pod.uid": newExpectedValue(regex, uidRe), + "k8s.pod.start_time": newExpectedValue(exist, ""), + "k8s.node.name": newExpectedValue(exist, ""), + "k8s.namespace.name": newExpectedValue(equal, testNs), + "k8s.deployment.name": newExpectedValue(equal, "telemetrygen-"+testID+"-traces-deployment"), + "k8s.deployment.uid": newExpectedValue(exist, ""), + "k8s.replicaset.name": newExpectedValue(regex, "telemetrygen-"+testID+"-traces-deployment-[a-z0-9]*"), + "k8s.replicaset.uid": newExpectedValue(exist, ""), + "k8s.annotations.workload": newExpectedValue(equal, "deployment"), + "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-traces-deployment"), + "k8s.container.name": newExpectedValue(equal, "telemetrygen"), + "k8s.cluster.uid": newExpectedValue(regex, uidRe), + "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), + "container.image.repo_digests": newExpectedValue(regex, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen@sha256:[0-9a-fA-f]{64}"), + "container.image.tag": newExpectedValue(equal, "latest"), + "container.id": newExpectedValue(exist, ""), + "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), }, }, { name: "traces-daemonset", - dataType: component.DataTypeTraces, + dataType: pipeline.SignalTraces, service: "test-traces-daemonset", attrs: map[string]*expectedValue{ - "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-traces-daemonset-[a-z0-9]*"), - "k8s.pod.ip": newExpectedValue(exist, ""), - "k8s.pod.uid": newExpectedValue(regex, uidRe), - "k8s.pod.start_time": newExpectedValue(exist, ""), - "k8s.node.name": newExpectedValue(exist, ""), - "k8s.namespace.name": newExpectedValue(equal, testNs), - "k8s.daemonset.name": newExpectedValue(equal, "telemetrygen-"+testID+"-traces-daemonset"), - "k8s.daemonset.uid": newExpectedValue(exist, ""), - "k8s.annotations.workload": newExpectedValue(equal, "daemonset"), - "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-traces-daemonset"), - "k8s.container.name": newExpectedValue(equal, "telemetrygen"), - "k8s.cluster.uid": newExpectedValue(regex, uidRe), - "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), - "container.image.tag": newExpectedValue(equal, "latest"), - "container.id": newExpectedValue(exist, ""), - "k8s.node.labels.foo": newExpectedValue(equal, "too"), - "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), + "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-traces-daemonset-[a-z0-9]*"), + "k8s.pod.ip": newExpectedValue(exist, ""), + "k8s.pod.uid": newExpectedValue(regex, uidRe), + "k8s.pod.start_time": newExpectedValue(exist, ""), + "k8s.node.name": newExpectedValue(exist, ""), + "k8s.namespace.name": newExpectedValue(equal, testNs), + "k8s.daemonset.name": newExpectedValue(equal, "telemetrygen-"+testID+"-traces-daemonset"), + "k8s.daemonset.uid": newExpectedValue(exist, ""), + "k8s.annotations.workload": newExpectedValue(equal, "daemonset"), + "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-traces-daemonset"), + "k8s.container.name": newExpectedValue(equal, "telemetrygen"), + "k8s.cluster.uid": newExpectedValue(regex, uidRe), + "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), + "container.image.repo_digests": newExpectedValue(regex, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen@sha256:[0-9a-fA-f]{64}"), + "container.image.tag": newExpectedValue(equal, "latest"), + "container.id": newExpectedValue(exist, ""), + "k8s.node.labels.foo": newExpectedValue(equal, "too"), + "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), }, }, { name: "metrics-job", - dataType: component.DataTypeMetrics, + dataType: pipeline.SignalMetrics, service: "test-metrics-job", attrs: map[string]*expectedValue{ - "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-metrics-job-[a-z0-9]*"), - "k8s.pod.ip": newExpectedValue(exist, ""), - "k8s.pod.uid": newExpectedValue(regex, uidRe), - "k8s.pod.start_time": newExpectedValue(exist, ""), - "k8s.node.name": newExpectedValue(exist, ""), - "k8s.namespace.name": newExpectedValue(equal, testNs), - "k8s.job.name": newExpectedValue(equal, "telemetrygen-"+testID+"-metrics-job"), - "k8s.job.uid": newExpectedValue(exist, ""), - "k8s.annotations.workload": newExpectedValue(equal, "job"), - "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-metrics-job"), - "k8s.container.name": newExpectedValue(equal, "telemetrygen"), - "k8s.cluster.uid": newExpectedValue(regex, uidRe), - "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), - "container.image.tag": newExpectedValue(equal, "latest"), - "container.id": newExpectedValue(exist, ""), - "k8s.node.labels.foo": newExpectedValue(equal, "too"), - "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), + "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-metrics-job-[a-z0-9]*"), + "k8s.pod.ip": newExpectedValue(exist, ""), + "k8s.pod.uid": newExpectedValue(regex, uidRe), + "k8s.pod.start_time": newExpectedValue(exist, ""), + "k8s.node.name": newExpectedValue(exist, ""), + "k8s.namespace.name": newExpectedValue(equal, testNs), + "k8s.job.name": newExpectedValue(equal, "telemetrygen-"+testID+"-metrics-job"), + "k8s.job.uid": newExpectedValue(exist, ""), + "k8s.annotations.workload": newExpectedValue(equal, "job"), + "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-metrics-job"), + "k8s.container.name": newExpectedValue(equal, "telemetrygen"), + "k8s.cluster.uid": newExpectedValue(regex, uidRe), + "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), + "container.image.repo_digests": newExpectedValue(regex, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen@sha256:[0-9a-fA-f]{64}"), + "container.image.tag": newExpectedValue(equal, "latest"), + "container.id": newExpectedValue(exist, ""), + "k8s.node.labels.foo": newExpectedValue(equal, "too"), + "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), }, }, { name: "metrics-statefulset", - dataType: component.DataTypeMetrics, + dataType: pipeline.SignalMetrics, service: "test-metrics-statefulset", attrs: map[string]*expectedValue{ - "k8s.pod.name": newExpectedValue(equal, "telemetrygen-"+testID+"-metrics-statefulset-0"), - "k8s.pod.ip": newExpectedValue(exist, ""), - "k8s.pod.uid": newExpectedValue(regex, uidRe), - "k8s.pod.start_time": newExpectedValue(exist, ""), - "k8s.node.name": newExpectedValue(exist, ""), - "k8s.namespace.name": newExpectedValue(equal, testNs), - "k8s.statefulset.name": newExpectedValue(equal, "telemetrygen-"+testID+"-metrics-statefulset"), - "k8s.statefulset.uid": newExpectedValue(exist, ""), - "k8s.annotations.workload": newExpectedValue(equal, "statefulset"), - "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-metrics-statefulset"), - "k8s.container.name": newExpectedValue(equal, "telemetrygen"), - "k8s.cluster.uid": newExpectedValue(regex, uidRe), - "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), - "container.image.tag": newExpectedValue(equal, "latest"), - "container.id": newExpectedValue(exist, ""), - "k8s.node.labels.foo": newExpectedValue(equal, "too"), - "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), + "k8s.pod.name": newExpectedValue(equal, "telemetrygen-"+testID+"-metrics-statefulset-0"), + "k8s.pod.ip": newExpectedValue(exist, ""), + "k8s.pod.uid": newExpectedValue(regex, uidRe), + "k8s.pod.start_time": newExpectedValue(exist, ""), + "k8s.node.name": newExpectedValue(exist, ""), + "k8s.namespace.name": newExpectedValue(equal, testNs), + "k8s.statefulset.name": newExpectedValue(equal, "telemetrygen-"+testID+"-metrics-statefulset"), + "k8s.statefulset.uid": newExpectedValue(exist, ""), + "k8s.annotations.workload": newExpectedValue(equal, "statefulset"), + "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-metrics-statefulset"), + "k8s.container.name": newExpectedValue(equal, "telemetrygen"), + "k8s.cluster.uid": newExpectedValue(regex, uidRe), + "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), + "container.image.repo_digests": newExpectedValue(regex, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen@sha256:[0-9a-fA-f]{64}"), + "container.image.tag": newExpectedValue(equal, "latest"), + "container.id": newExpectedValue(exist, ""), + "k8s.node.labels.foo": newExpectedValue(equal, "too"), + "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), }, }, { name: "metrics-deployment", - dataType: component.DataTypeMetrics, + dataType: pipeline.SignalMetrics, service: "test-metrics-deployment", attrs: map[string]*expectedValue{ - "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-metrics-deployment-[a-z0-9]*-[a-z0-9]*"), - "k8s.pod.ip": newExpectedValue(exist, ""), - "k8s.pod.uid": newExpectedValue(regex, uidRe), - "k8s.pod.start_time": newExpectedValue(exist, ""), - "k8s.node.name": newExpectedValue(exist, ""), - "k8s.namespace.name": newExpectedValue(equal, testNs), - "k8s.deployment.name": newExpectedValue(equal, "telemetrygen-"+testID+"-metrics-deployment"), - "k8s.deployment.uid": newExpectedValue(exist, ""), - "k8s.replicaset.name": newExpectedValue(regex, "telemetrygen-"+testID+"-metrics-deployment-[a-z0-9]*"), - "k8s.replicaset.uid": newExpectedValue(exist, ""), - "k8s.annotations.workload": newExpectedValue(equal, "deployment"), - "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-metrics-deployment"), - "k8s.container.name": newExpectedValue(equal, "telemetrygen"), - "k8s.cluster.uid": newExpectedValue(regex, uidRe), - "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), - "container.image.tag": newExpectedValue(equal, "latest"), - "container.id": newExpectedValue(exist, ""), - "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), + "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-metrics-deployment-[a-z0-9]*-[a-z0-9]*"), + "k8s.pod.ip": newExpectedValue(exist, ""), + "k8s.pod.uid": newExpectedValue(regex, uidRe), + "k8s.pod.start_time": newExpectedValue(exist, ""), + "k8s.node.name": newExpectedValue(exist, ""), + "k8s.namespace.name": newExpectedValue(equal, testNs), + "k8s.deployment.name": newExpectedValue(equal, "telemetrygen-"+testID+"-metrics-deployment"), + "k8s.deployment.uid": newExpectedValue(exist, ""), + "k8s.replicaset.name": newExpectedValue(regex, "telemetrygen-"+testID+"-metrics-deployment-[a-z0-9]*"), + "k8s.replicaset.uid": newExpectedValue(exist, ""), + "k8s.annotations.workload": newExpectedValue(equal, "deployment"), + "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-metrics-deployment"), + "k8s.container.name": newExpectedValue(equal, "telemetrygen"), + "k8s.cluster.uid": newExpectedValue(regex, uidRe), + "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), + "container.image.repo_digests": newExpectedValue(regex, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen@sha256:[0-9a-fA-f]{64}"), + "container.image.tag": newExpectedValue(equal, "latest"), + "container.id": newExpectedValue(exist, ""), + "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), }, }, { name: "metrics-daemonset", - dataType: component.DataTypeMetrics, + dataType: pipeline.SignalMetrics, service: "test-metrics-daemonset", attrs: map[string]*expectedValue{ - "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-metrics-daemonset-[a-z0-9]*"), - "k8s.pod.ip": newExpectedValue(exist, ""), - "k8s.pod.uid": newExpectedValue(regex, uidRe), - "k8s.pod.start_time": newExpectedValue(exist, ""), - "k8s.node.name": newExpectedValue(exist, ""), - "k8s.namespace.name": newExpectedValue(equal, testNs), - "k8s.daemonset.name": newExpectedValue(equal, "telemetrygen-"+testID+"-metrics-daemonset"), - "k8s.daemonset.uid": newExpectedValue(exist, ""), - "k8s.annotations.workload": newExpectedValue(equal, "daemonset"), - "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-metrics-daemonset"), - "k8s.container.name": newExpectedValue(equal, "telemetrygen"), - "k8s.cluster.uid": newExpectedValue(regex, uidRe), - "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), - "container.image.tag": newExpectedValue(equal, "latest"), - "container.id": newExpectedValue(exist, ""), - "k8s.node.labels.foo": newExpectedValue(equal, "too"), - "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), + "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-metrics-daemonset-[a-z0-9]*"), + "k8s.pod.ip": newExpectedValue(exist, ""), + "k8s.pod.uid": newExpectedValue(regex, uidRe), + "k8s.pod.start_time": newExpectedValue(exist, ""), + "k8s.node.name": newExpectedValue(exist, ""), + "k8s.namespace.name": newExpectedValue(equal, testNs), + "k8s.daemonset.name": newExpectedValue(equal, "telemetrygen-"+testID+"-metrics-daemonset"), + "k8s.daemonset.uid": newExpectedValue(exist, ""), + "k8s.annotations.workload": newExpectedValue(equal, "daemonset"), + "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-metrics-daemonset"), + "k8s.container.name": newExpectedValue(equal, "telemetrygen"), + "k8s.cluster.uid": newExpectedValue(regex, uidRe), + "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), + "container.image.repo_digests": newExpectedValue(regex, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen@sha256:[0-9a-fA-f]{64}"), + "container.image.tag": newExpectedValue(equal, "latest"), + "container.id": newExpectedValue(exist, ""), + "k8s.node.labels.foo": newExpectedValue(equal, "too"), + "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), }, }, { name: "logs-job", - dataType: component.DataTypeLogs, + dataType: pipeline.SignalLogs, service: "test-logs-job", attrs: map[string]*expectedValue{ - "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-logs-job-[a-z0-9]*"), - "k8s.pod.ip": newExpectedValue(exist, ""), - "k8s.pod.uid": newExpectedValue(regex, uidRe), - "k8s.pod.start_time": newExpectedValue(exist, ""), - "k8s.node.name": newExpectedValue(exist, ""), - "k8s.namespace.name": newExpectedValue(equal, testNs), - "k8s.job.name": newExpectedValue(equal, "telemetrygen-"+testID+"-logs-job"), - "k8s.job.uid": newExpectedValue(exist, ""), - "k8s.annotations.workload": newExpectedValue(equal, "job"), - "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-logs-job"), - "k8s.container.name": newExpectedValue(equal, "telemetrygen"), - "k8s.cluster.uid": newExpectedValue(regex, uidRe), - "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), - "container.image.tag": newExpectedValue(equal, "latest"), - "container.id": newExpectedValue(exist, ""), - "k8s.node.labels.foo": newExpectedValue(equal, "too"), - "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), + "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-logs-job-[a-z0-9]*"), + "k8s.pod.ip": newExpectedValue(exist, ""), + "k8s.pod.uid": newExpectedValue(regex, uidRe), + "k8s.pod.start_time": newExpectedValue(exist, ""), + "k8s.node.name": newExpectedValue(exist, ""), + "k8s.namespace.name": newExpectedValue(equal, testNs), + "k8s.job.name": newExpectedValue(equal, "telemetrygen-"+testID+"-logs-job"), + "k8s.job.uid": newExpectedValue(exist, ""), + "k8s.annotations.workload": newExpectedValue(equal, "job"), + "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-logs-job"), + "k8s.container.name": newExpectedValue(equal, "telemetrygen"), + "k8s.cluster.uid": newExpectedValue(regex, uidRe), + "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), + "container.image.repo_digests": newExpectedValue(regex, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen@sha256:[0-9a-fA-f]{64}"), + "container.image.tag": newExpectedValue(equal, "latest"), + "container.id": newExpectedValue(exist, ""), + "k8s.node.labels.foo": newExpectedValue(equal, "too"), + "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), }, }, { name: "logs-statefulset", - dataType: component.DataTypeLogs, + dataType: pipeline.SignalLogs, service: "test-logs-statefulset", attrs: map[string]*expectedValue{ - "k8s.pod.name": newExpectedValue(equal, "telemetrygen-"+testID+"-logs-statefulset-0"), - "k8s.pod.ip": newExpectedValue(exist, ""), - "k8s.pod.uid": newExpectedValue(regex, uidRe), - "k8s.pod.start_time": newExpectedValue(exist, ""), - "k8s.node.name": newExpectedValue(exist, ""), - "k8s.namespace.name": newExpectedValue(equal, testNs), - "k8s.statefulset.name": newExpectedValue(equal, "telemetrygen-"+testID+"-logs-statefulset"), - "k8s.statefulset.uid": newExpectedValue(exist, ""), - "k8s.annotations.workload": newExpectedValue(equal, "statefulset"), - "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-logs-statefulset"), - "k8s.container.name": newExpectedValue(equal, "telemetrygen"), - "k8s.cluster.uid": newExpectedValue(regex, uidRe), - "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), - "container.image.tag": newExpectedValue(equal, "latest"), - "container.id": newExpectedValue(exist, ""), - "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), + "k8s.pod.name": newExpectedValue(equal, "telemetrygen-"+testID+"-logs-statefulset-0"), + "k8s.pod.ip": newExpectedValue(exist, ""), + "k8s.pod.uid": newExpectedValue(regex, uidRe), + "k8s.pod.start_time": newExpectedValue(exist, ""), + "k8s.node.name": newExpectedValue(exist, ""), + "k8s.namespace.name": newExpectedValue(equal, testNs), + "k8s.statefulset.name": newExpectedValue(equal, "telemetrygen-"+testID+"-logs-statefulset"), + "k8s.statefulset.uid": newExpectedValue(exist, ""), + "k8s.annotations.workload": newExpectedValue(equal, "statefulset"), + "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-logs-statefulset"), + "k8s.container.name": newExpectedValue(equal, "telemetrygen"), + "k8s.cluster.uid": newExpectedValue(regex, uidRe), + "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), + "container.image.repo_digests": newExpectedValue(regex, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen@sha256:[0-9a-fA-f]{64}"), + "container.image.tag": newExpectedValue(equal, "latest"), + "container.id": newExpectedValue(exist, ""), + "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), }, }, { name: "logs-deployment", - dataType: component.DataTypeLogs, + dataType: pipeline.SignalLogs, service: "test-logs-deployment", attrs: map[string]*expectedValue{ - "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-logs-deployment-[a-z0-9]*-[a-z0-9]*"), - "k8s.pod.ip": newExpectedValue(exist, ""), - "k8s.pod.uid": newExpectedValue(regex, uidRe), - "k8s.pod.start_time": newExpectedValue(exist, ""), - "k8s.node.name": newExpectedValue(exist, ""), - "k8s.namespace.name": newExpectedValue(equal, testNs), - "k8s.deployment.name": newExpectedValue(equal, "telemetrygen-"+testID+"-logs-deployment"), - "k8s.deployment.uid": newExpectedValue(exist, ""), - "k8s.replicaset.name": newExpectedValue(regex, "telemetrygen-"+testID+"-logs-deployment-[a-z0-9]*"), - "k8s.replicaset.uid": newExpectedValue(exist, ""), - "k8s.annotations.workload": newExpectedValue(equal, "deployment"), - "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-logs-deployment"), - "k8s.container.name": newExpectedValue(equal, "telemetrygen"), - "k8s.cluster.uid": newExpectedValue(regex, uidRe), - "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), - "container.image.tag": newExpectedValue(equal, "latest"), - "container.id": newExpectedValue(exist, ""), - "k8s.node.labels.foo": newExpectedValue(equal, "too"), - "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), + "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-logs-deployment-[a-z0-9]*-[a-z0-9]*"), + "k8s.pod.ip": newExpectedValue(exist, ""), + "k8s.pod.uid": newExpectedValue(regex, uidRe), + "k8s.pod.start_time": newExpectedValue(exist, ""), + "k8s.node.name": newExpectedValue(exist, ""), + "k8s.namespace.name": newExpectedValue(equal, testNs), + "k8s.deployment.name": newExpectedValue(equal, "telemetrygen-"+testID+"-logs-deployment"), + "k8s.deployment.uid": newExpectedValue(exist, ""), + "k8s.replicaset.name": newExpectedValue(regex, "telemetrygen-"+testID+"-logs-deployment-[a-z0-9]*"), + "k8s.replicaset.uid": newExpectedValue(exist, ""), + "k8s.annotations.workload": newExpectedValue(equal, "deployment"), + "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-logs-deployment"), + "k8s.container.name": newExpectedValue(equal, "telemetrygen"), + "k8s.cluster.uid": newExpectedValue(regex, uidRe), + "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), + "container.image.repo_digests": newExpectedValue(regex, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen@sha256:[0-9a-fA-f]{64}"), + "container.image.tag": newExpectedValue(equal, "latest"), + "container.id": newExpectedValue(exist, ""), + "k8s.node.labels.foo": newExpectedValue(equal, "too"), + "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), }, }, { name: "logs-daemonset", - dataType: component.DataTypeLogs, + dataType: pipeline.SignalLogs, service: "test-logs-daemonset", attrs: map[string]*expectedValue{ - "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-logs-daemonset-[a-z0-9]*"), - "k8s.pod.ip": newExpectedValue(exist, ""), - "k8s.pod.uid": newExpectedValue(regex, uidRe), - "k8s.pod.start_time": newExpectedValue(exist, ""), - "k8s.node.name": newExpectedValue(exist, ""), - "k8s.namespace.name": newExpectedValue(equal, testNs), - "k8s.daemonset.name": newExpectedValue(equal, "telemetrygen-"+testID+"-logs-daemonset"), - "k8s.daemonset.uid": newExpectedValue(exist, ""), - "k8s.annotations.workload": newExpectedValue(equal, "daemonset"), - "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-logs-daemonset"), - "k8s.container.name": newExpectedValue(equal, "telemetrygen"), - "k8s.cluster.uid": newExpectedValue(regex, uidRe), - "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), - "container.image.tag": newExpectedValue(equal, "latest"), - "container.id": newExpectedValue(exist, ""), - "k8s.node.labels.foo": newExpectedValue(equal, "too"), - "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), + "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-logs-daemonset-[a-z0-9]*"), + "k8s.pod.ip": newExpectedValue(exist, ""), + "k8s.pod.uid": newExpectedValue(regex, uidRe), + "k8s.pod.start_time": newExpectedValue(exist, ""), + "k8s.node.name": newExpectedValue(exist, ""), + "k8s.namespace.name": newExpectedValue(equal, testNs), + "k8s.daemonset.name": newExpectedValue(equal, "telemetrygen-"+testID+"-logs-daemonset"), + "k8s.daemonset.uid": newExpectedValue(exist, ""), + "k8s.annotations.workload": newExpectedValue(equal, "daemonset"), + "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-logs-daemonset"), + "k8s.container.name": newExpectedValue(equal, "telemetrygen"), + "k8s.cluster.uid": newExpectedValue(regex, uidRe), + "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), + "container.image.repo_digests": newExpectedValue(regex, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen@sha256:[0-9a-fA-f]{64}"), + "container.image.tag": newExpectedValue(equal, "latest"), + "container.id": newExpectedValue(exist, ""), + "k8s.node.labels.foo": newExpectedValue(equal, "too"), + "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), + }, + }, + { + name: "profiles-job", + dataType: pipelineprofiles.SignalProfiles, + service: "test-profiles-job", + attrs: map[string]*expectedValue{ + "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-profiles-job-[a-z0-9]*"), + "k8s.pod.ip": newExpectedValue(exist, ""), + "k8s.pod.uid": newExpectedValue(regex, uidRe), + "k8s.pod.start_time": newExpectedValue(exist, ""), + "k8s.node.name": newExpectedValue(exist, ""), + "k8s.namespace.name": newExpectedValue(equal, testNs), + "k8s.job.name": newExpectedValue(equal, "telemetrygen-"+testID+"-profiles-job"), + "k8s.job.uid": newExpectedValue(exist, ""), + "k8s.annotations.workload": newExpectedValue(equal, "job"), + "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-profiles-job"), + "k8s.container.name": newExpectedValue(equal, "telemetrygen"), + "k8s.cluster.uid": newExpectedValue(regex, uidRe), + "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), + "container.image.repo_digests": newExpectedValue(regex, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen@sha256:[0-9a-fA-f]{64}"), + "container.image.tag": newExpectedValue(equal, "latest"), + "container.id": newExpectedValue(exist, ""), + "k8s.node.labels.foo": newExpectedValue(equal, "too"), + "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), + }, + }, + { + name: "profiles-statefulset", + dataType: pipelineprofiles.SignalProfiles, + service: "test-profiles-statefulset", + attrs: map[string]*expectedValue{ + "k8s.pod.name": newExpectedValue(equal, "telemetrygen-"+testID+"-profiles-statefulset-0"), + "k8s.pod.ip": newExpectedValue(exist, ""), + "k8s.pod.uid": newExpectedValue(regex, uidRe), + "k8s.pod.start_time": newExpectedValue(exist, ""), + "k8s.node.name": newExpectedValue(exist, ""), + "k8s.namespace.name": newExpectedValue(equal, testNs), + "k8s.statefulset.name": newExpectedValue(equal, "telemetrygen-"+testID+"-profiles-statefulset"), + "k8s.statefulset.uid": newExpectedValue(exist, ""), + "k8s.annotations.workload": newExpectedValue(equal, "statefulset"), + "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-profiles-statefulset"), + "k8s.container.name": newExpectedValue(equal, "telemetrygen"), + "k8s.cluster.uid": newExpectedValue(regex, uidRe), + "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), + "container.image.repo_digests": newExpectedValue(regex, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen@sha256:[0-9a-fA-f]{64}"), + "container.image.tag": newExpectedValue(equal, "latest"), + "container.id": newExpectedValue(exist, ""), + "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), + }, + }, + { + name: "profiles-deployment", + dataType: pipelineprofiles.SignalProfiles, + service: "test-profiles-deployment", + attrs: map[string]*expectedValue{ + "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-profiles-deployment-[a-z0-9]*-[a-z0-9]*"), + "k8s.pod.ip": newExpectedValue(exist, ""), + "k8s.pod.uid": newExpectedValue(regex, uidRe), + "k8s.pod.start_time": newExpectedValue(exist, ""), + "k8s.node.name": newExpectedValue(exist, ""), + "k8s.namespace.name": newExpectedValue(equal, testNs), + "k8s.deployment.name": newExpectedValue(equal, "telemetrygen-"+testID+"-profiles-deployment"), + "k8s.deployment.uid": newExpectedValue(exist, ""), + "k8s.replicaset.name": newExpectedValue(regex, "telemetrygen-"+testID+"-profiles-deployment-[a-z0-9]*"), + "k8s.replicaset.uid": newExpectedValue(exist, ""), + "k8s.annotations.workload": newExpectedValue(equal, "deployment"), + "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-profiles-deployment"), + "k8s.container.name": newExpectedValue(equal, "telemetrygen"), + "k8s.cluster.uid": newExpectedValue(regex, uidRe), + "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), + "container.image.repo_digests": newExpectedValue(regex, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen@sha256:[0-9a-fA-f]{64}"), + "container.image.tag": newExpectedValue(equal, "latest"), + "container.id": newExpectedValue(exist, ""), + "k8s.node.labels.foo": newExpectedValue(equal, "too"), + "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), + }, + }, + { + name: "profiles-daemonset", + dataType: pipelineprofiles.SignalProfiles, + service: "test-profiles-daemonset", + attrs: map[string]*expectedValue{ + "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-profiles-daemonset-[a-z0-9]*"), + "k8s.pod.ip": newExpectedValue(exist, ""), + "k8s.pod.uid": newExpectedValue(regex, uidRe), + "k8s.pod.start_time": newExpectedValue(exist, ""), + "k8s.node.name": newExpectedValue(exist, ""), + "k8s.namespace.name": newExpectedValue(equal, testNs), + "k8s.daemonset.name": newExpectedValue(equal, "telemetrygen-"+testID+"-profiles-daemonset"), + "k8s.daemonset.uid": newExpectedValue(exist, ""), + "k8s.annotations.workload": newExpectedValue(equal, "daemonset"), + "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-profiles-daemonset"), + "k8s.container.name": newExpectedValue(equal, "telemetrygen"), + "k8s.cluster.uid": newExpectedValue(regex, uidRe), + "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), + "container.image.repo_digests": newExpectedValue(regex, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen@sha256:[0-9a-fA-f]{64}"), + "container.image.tag": newExpectedValue(equal, "latest"), + "container.id": newExpectedValue(exist, ""), + "k8s.node.labels.foo": newExpectedValue(equal, "too"), + "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), }, }, } @@ -405,12 +525,14 @@ func TestE2E_ClusterRBAC(t *testing.T) { for _, tc := range tcs { t.Run(tc.name, func(t *testing.T) { switch tc.dataType { - case component.DataTypeTraces: + case pipeline.SignalTraces: scanTracesForAttributes(t, tracesConsumer, tc.service, tc.attrs) - case component.DataTypeMetrics: + case pipeline.SignalMetrics: scanMetricsForAttributes(t, metricsConsumer, tc.service, tc.attrs) - case component.DataTypeLogs: + case pipeline.SignalLogs: scanLogsForAttributes(t, logsConsumer, tc.service, tc.attrs) + case pipelineprofiles.SignalProfiles: + scanProfilesForAttributes(t, profilesConsumer, tc.service, tc.attrs) default: t.Fatalf("unknown data type %s", tc.dataType) } @@ -418,7 +540,8 @@ func TestE2E_ClusterRBAC(t *testing.T) { } } -// Test with `filter::namespace` set and only role binding to collector's SA. We can't get node and namespace labels/annotations. +// Test with `filter::namespace` set and only role binding to collector's SA. We can't get node and namespace labels/annotations, +// and the telemetrygen image has a digest but no tag. func TestE2E_NamespacedRBAC(t *testing.T) { testDir := filepath.Join("testdata", "e2e", "namespacedrbac") @@ -438,7 +561,8 @@ func TestE2E_NamespacedRBAC(t *testing.T) { metricsConsumer := new(consumertest.MetricsSink) tracesConsumer := new(consumertest.TracesSink) logsConsumer := new(consumertest.LogsSink) - shutdownSinks := startUpSinks(t, metricsConsumer, tracesConsumer, logsConsumer) + profilesConsumer := new(consumertest.ProfilesSink) + shutdownSinks := startUpSinks(t, metricsConsumer, tracesConsumer, logsConsumer, profilesConsumer) defer shutdownSinks() testID := uuid.NewString()[:8] @@ -447,7 +571,10 @@ func TestE2E_NamespacedRBAC(t *testing.T) { ManifestsDir: filepath.Join(testDir, "telemetrygen"), TestID: testID, OtlpEndpoint: fmt.Sprintf("otelcol-%s.%s:4317", testID, nsName), - DataTypes: []string{"metrics", "logs", "traces"}, + // `telemetrygen` doesn't support profiles + // https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/36127 + // TODO: add "profiles" to DataTypes once #36127 is resolved + DataTypes: []string{"metrics", "logs", "traces"}, } telemetryGenObjs, telemetryGenObjInfos := k8stest.CreateTelemetryGenObjects(t, k8sClient, createTeleOpts) defer func() { @@ -460,82 +587,109 @@ func TestE2E_NamespacedRBAC(t *testing.T) { k8stest.WaitForTelemetryGenToStart(t, k8sClient, info.Namespace, info.PodLabelSelectors, info.Workload, info.DataType) } - wantEntries := 20 // Minimal number of metrics/traces/logs to wait for. - waitForData(t, wantEntries, metricsConsumer, tracesConsumer, logsConsumer) + wantEntries := 20 // Minimal number of metrics/traces/logs/profiles to wait for. + waitForData(t, wantEntries, metricsConsumer, tracesConsumer, logsConsumer, profilesConsumer) tcs := []struct { name string - dataType component.DataType + dataType pipeline.Signal service string attrs map[string]*expectedValue }{ { name: "traces-deployment", - dataType: component.DataTypeTraces, + dataType: pipeline.SignalTraces, service: "test-traces-deployment", attrs: map[string]*expectedValue{ - "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-traces-deployment-[a-z0-9]*-[a-z0-9]*"), - "k8s.pod.ip": newExpectedValue(exist, ""), - "k8s.pod.uid": newExpectedValue(regex, uidRe), - "k8s.pod.start_time": newExpectedValue(exist, startTimeRe), - "k8s.node.name": newExpectedValue(exist, ""), - "k8s.namespace.name": newExpectedValue(equal, nsName), - "k8s.deployment.name": newExpectedValue(equal, "telemetrygen-"+testID+"-traces-deployment"), - "k8s.deployment.uid": newExpectedValue(regex, uidRe), - "k8s.replicaset.name": newExpectedValue(regex, "telemetrygen-"+testID+"-traces-deployment-[a-z0-9]*"), - "k8s.replicaset.uid": newExpectedValue(regex, uidRe), - "k8s.annotations.workload": newExpectedValue(equal, "deployment"), - "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-traces-deployment"), - "k8s.container.name": newExpectedValue(equal, "telemetrygen"), - "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), - "container.image.tag": newExpectedValue(equal, "latest"), - "container.id": newExpectedValue(exist, ""), + "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-traces-deployment-[a-z0-9]*-[a-z0-9]*"), + "k8s.pod.ip": newExpectedValue(exist, ""), + "k8s.pod.uid": newExpectedValue(regex, uidRe), + "k8s.pod.start_time": newExpectedValue(exist, startTimeRe), + "k8s.node.name": newExpectedValue(exist, ""), + "k8s.namespace.name": newExpectedValue(equal, nsName), + "k8s.deployment.name": newExpectedValue(equal, "telemetrygen-"+testID+"-traces-deployment"), + "k8s.deployment.uid": newExpectedValue(regex, uidRe), + "k8s.replicaset.name": newExpectedValue(regex, "telemetrygen-"+testID+"-traces-deployment-[a-z0-9]*"), + "k8s.replicaset.uid": newExpectedValue(regex, uidRe), + "k8s.annotations.workload": newExpectedValue(equal, "deployment"), + "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-traces-deployment"), + "k8s.container.name": newExpectedValue(equal, "telemetrygen"), + "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), + "container.image.repo_digests": newExpectedValue(regex, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen@sha256:[0-9a-fA-f]{64}"), + "container.image.tag": newExpectedValue(shouldnotexist, ""), + "container.id": newExpectedValue(exist, ""), }, }, { name: "metrics-deployment", - dataType: component.DataTypeMetrics, + dataType: pipeline.SignalMetrics, service: "test-metrics-deployment", attrs: map[string]*expectedValue{ - "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-metrics-deployment-[a-z0-9]*-[a-z0-9]*"), - "k8s.pod.ip": newExpectedValue(exist, ""), - "k8s.pod.uid": newExpectedValue(regex, uidRe), - "k8s.pod.start_time": newExpectedValue(exist, startTimeRe), - "k8s.node.name": newExpectedValue(exist, ""), - "k8s.namespace.name": newExpectedValue(equal, nsName), - "k8s.deployment.name": newExpectedValue(equal, "telemetrygen-"+testID+"-metrics-deployment"), - "k8s.deployment.uid": newExpectedValue(regex, uidRe), - "k8s.replicaset.name": newExpectedValue(regex, "telemetrygen-"+testID+"-metrics-deployment-[a-z0-9]*"), - "k8s.replicaset.uid": newExpectedValue(regex, uidRe), - "k8s.annotations.workload": newExpectedValue(equal, "deployment"), - "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-metrics-deployment"), - "k8s.container.name": newExpectedValue(equal, "telemetrygen"), - "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), - "container.image.tag": newExpectedValue(equal, "latest"), - "container.id": newExpectedValue(exist, ""), + "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-metrics-deployment-[a-z0-9]*-[a-z0-9]*"), + "k8s.pod.ip": newExpectedValue(exist, ""), + "k8s.pod.uid": newExpectedValue(regex, uidRe), + "k8s.pod.start_time": newExpectedValue(exist, startTimeRe), + "k8s.node.name": newExpectedValue(exist, ""), + "k8s.namespace.name": newExpectedValue(equal, nsName), + "k8s.deployment.name": newExpectedValue(equal, "telemetrygen-"+testID+"-metrics-deployment"), + "k8s.deployment.uid": newExpectedValue(regex, uidRe), + "k8s.replicaset.name": newExpectedValue(regex, "telemetrygen-"+testID+"-metrics-deployment-[a-z0-9]*"), + "k8s.replicaset.uid": newExpectedValue(regex, uidRe), + "k8s.annotations.workload": newExpectedValue(equal, "deployment"), + "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-metrics-deployment"), + "k8s.container.name": newExpectedValue(equal, "telemetrygen"), + "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), + "container.image.repo_digests": newExpectedValue(regex, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen@sha256:[0-9a-fA-f]{64}"), + "container.image.tag": newExpectedValue(shouldnotexist, ""), + "container.id": newExpectedValue(exist, ""), }, }, { name: "logs-deployment", - dataType: component.DataTypeLogs, + dataType: pipeline.SignalLogs, service: "test-logs-deployment", attrs: map[string]*expectedValue{ - "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-logs-deployment-[a-z0-9]*-[a-z0-9]*"), - "k8s.pod.ip": newExpectedValue(exist, ""), - "k8s.pod.uid": newExpectedValue(regex, uidRe), - "k8s.pod.start_time": newExpectedValue(exist, startTimeRe), - "k8s.node.name": newExpectedValue(exist, ""), - "k8s.namespace.name": newExpectedValue(equal, nsName), - "k8s.deployment.name": newExpectedValue(equal, "telemetrygen-"+testID+"-logs-deployment"), - "k8s.deployment.uid": newExpectedValue(regex, uidRe), - "k8s.replicaset.name": newExpectedValue(regex, "telemetrygen-"+testID+"-logs-deployment-[a-z0-9]*"), - "k8s.replicaset.uid": newExpectedValue(regex, uidRe), - "k8s.annotations.workload": newExpectedValue(equal, "deployment"), - "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-logs-deployment"), - "k8s.container.name": newExpectedValue(equal, "telemetrygen"), - "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), - "container.image.tag": newExpectedValue(equal, "latest"), - "container.id": newExpectedValue(exist, ""), + "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-logs-deployment-[a-z0-9]*-[a-z0-9]*"), + "k8s.pod.ip": newExpectedValue(exist, ""), + "k8s.pod.uid": newExpectedValue(regex, uidRe), + "k8s.pod.start_time": newExpectedValue(exist, startTimeRe), + "k8s.node.name": newExpectedValue(exist, ""), + "k8s.namespace.name": newExpectedValue(equal, nsName), + "k8s.deployment.name": newExpectedValue(equal, "telemetrygen-"+testID+"-logs-deployment"), + "k8s.deployment.uid": newExpectedValue(regex, uidRe), + "k8s.replicaset.name": newExpectedValue(regex, "telemetrygen-"+testID+"-logs-deployment-[a-z0-9]*"), + "k8s.replicaset.uid": newExpectedValue(regex, uidRe), + "k8s.annotations.workload": newExpectedValue(equal, "deployment"), + "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-logs-deployment"), + "k8s.container.name": newExpectedValue(equal, "telemetrygen"), + "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), + "container.image.repo_digests": newExpectedValue(regex, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen@sha256:[0-9a-fA-f]{64}"), + "container.image.tag": newExpectedValue(shouldnotexist, ""), + "container.id": newExpectedValue(exist, ""), + }, + }, + { + name: "profiles-deployment", + dataType: pipelineprofiles.SignalProfiles, + service: "test-profiles-deployment", + attrs: map[string]*expectedValue{ + "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-profiles-deployment-[a-z0-9]*-[a-z0-9]*"), + "k8s.pod.ip": newExpectedValue(exist, ""), + "k8s.pod.uid": newExpectedValue(regex, uidRe), + "k8s.pod.start_time": newExpectedValue(exist, startTimeRe), + "k8s.node.name": newExpectedValue(exist, ""), + "k8s.namespace.name": newExpectedValue(equal, nsName), + "k8s.deployment.name": newExpectedValue(equal, "telemetrygen-"+testID+"-profiles-deployment"), + "k8s.deployment.uid": newExpectedValue(regex, uidRe), + "k8s.replicaset.name": newExpectedValue(regex, "telemetrygen-"+testID+"-profiles-deployment-[a-z0-9]*"), + "k8s.replicaset.uid": newExpectedValue(regex, uidRe), + "k8s.annotations.workload": newExpectedValue(equal, "deployment"), + "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-profiles-deployment"), + "k8s.container.name": newExpectedValue(equal, "telemetrygen"), + "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), + "container.image.repo_digests": newExpectedValue(regex, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen@sha256:[0-9a-fA-f]{64}"), + "container.image.tag": newExpectedValue(equal, "latest"), + "container.id": newExpectedValue(exist, ""), }, }, } @@ -543,12 +697,14 @@ func TestE2E_NamespacedRBAC(t *testing.T) { for _, tc := range tcs { t.Run(tc.name, func(t *testing.T) { switch tc.dataType { - case component.DataTypeTraces: + case pipeline.SignalTraces: scanTracesForAttributes(t, tracesConsumer, tc.service, tc.attrs) - case component.DataTypeMetrics: + case pipeline.SignalMetrics: scanMetricsForAttributes(t, metricsConsumer, tc.service, tc.attrs) - case component.DataTypeLogs: + case pipeline.SignalLogs: scanLogsForAttributes(t, logsConsumer, tc.service, tc.attrs) + case pipelineprofiles.SignalProfiles: + scanProfilesForAttributes(t, profilesConsumer, tc.service, tc.attrs) default: t.Fatalf("unknown data type %s", tc.dataType) } @@ -557,7 +713,7 @@ func TestE2E_NamespacedRBAC(t *testing.T) { } // Test with `filter::namespace` set, role binding for namespace-scoped objects (pod, replicaset) and clusterrole -// binding for node and namespace objects. +// binding for node and namespace objects, and the telemetrygen image has a tag and digest. func TestE2E_MixRBAC(t *testing.T) { testDir := filepath.Join("testdata", "e2e", "mixrbac") @@ -567,7 +723,8 @@ func TestE2E_MixRBAC(t *testing.T) { metricsConsumer := new(consumertest.MetricsSink) tracesConsumer := new(consumertest.TracesSink) logsConsumer := new(consumertest.LogsSink) - shutdownSinks := startUpSinks(t, metricsConsumer, tracesConsumer, logsConsumer) + profilesConsumer := new(consumertest.ProfilesSink) + shutdownSinks := startUpSinks(t, metricsConsumer, tracesConsumer, logsConsumer, profilesConsumer) defer shutdownSinks() var workloadNs, otelNs string @@ -600,7 +757,10 @@ func TestE2E_MixRBAC(t *testing.T) { ManifestsDir: filepath.Join(testDir, "telemetrygen"), TestID: testID, OtlpEndpoint: fmt.Sprintf("otelcol-%s.%s:4317", testID, otelNs), - DataTypes: []string{"metrics", "logs", "traces"}, + // `telemetrygen` doesn't support profiles + // https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/36127 + // TODO: add "profiles" to DataTypes once #36127 is resolved + DataTypes: []string{"metrics", "logs", "traces"}, } telemetryGenObjs, telemetryGenObjInfos := k8stest.CreateTelemetryGenObjects(t, k8sClient, createTeleOpts) @@ -614,91 +774,121 @@ func TestE2E_MixRBAC(t *testing.T) { k8stest.WaitForTelemetryGenToStart(t, k8sClient, info.Namespace, info.PodLabelSelectors, info.Workload, info.DataType) } - wantEntries := 20 // Minimal number of metrics/traces/logs to wait for. - waitForData(t, wantEntries, metricsConsumer, tracesConsumer, logsConsumer) + wantEntries := 20 // Minimal number of metrics/traces/logs/profiles to wait for. + waitForData(t, wantEntries, metricsConsumer, tracesConsumer, logsConsumer, profilesConsumer) tcs := []struct { name string - dataType component.DataType + dataType pipeline.Signal service string attrs map[string]*expectedValue }{ { name: "traces-deployment", - dataType: component.DataTypeTraces, + dataType: pipeline.SignalTraces, service: "test-traces-deployment", attrs: map[string]*expectedValue{ - "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-traces-deployment-[a-z0-9]*-[a-z0-9]*"), - "k8s.pod.ip": newExpectedValue(exist, ""), - "k8s.pod.uid": newExpectedValue(regex, uidRe), - "k8s.pod.start_time": newExpectedValue(exist, ""), - "k8s.node.name": newExpectedValue(exist, ""), - "k8s.namespace.name": newExpectedValue(equal, workloadNs), - "k8s.deployment.name": newExpectedValue(equal, "telemetrygen-"+testID+"-traces-deployment"), - "k8s.deployment.uid": newExpectedValue(regex, uidRe), - "k8s.replicaset.name": newExpectedValue(regex, "telemetrygen-"+testID+"-traces-deployment-[a-z0-9]*"), - "k8s.replicaset.uid": newExpectedValue(regex, uidRe), - "k8s.annotations.workload": newExpectedValue(equal, "deployment"), - "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-traces-deployment"), - "k8s.container.name": newExpectedValue(equal, "telemetrygen"), - "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), - "container.image.tag": newExpectedValue(equal, "latest"), - "container.id": newExpectedValue(exist, ""), - "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), - "k8s.node.labels.foo": newExpectedValue(equal, "too"), - "k8s.cluster.uid": newExpectedValue(regex, uidRe), + "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-traces-deployment-[a-z0-9]*-[a-z0-9]*"), + "k8s.pod.ip": newExpectedValue(exist, ""), + "k8s.pod.uid": newExpectedValue(regex, uidRe), + "k8s.pod.start_time": newExpectedValue(exist, ""), + "k8s.node.name": newExpectedValue(exist, ""), + "k8s.namespace.name": newExpectedValue(equal, workloadNs), + "k8s.deployment.name": newExpectedValue(equal, "telemetrygen-"+testID+"-traces-deployment"), + "k8s.deployment.uid": newExpectedValue(regex, uidRe), + "k8s.replicaset.name": newExpectedValue(regex, "telemetrygen-"+testID+"-traces-deployment-[a-z0-9]*"), + "k8s.replicaset.uid": newExpectedValue(regex, uidRe), + "k8s.annotations.workload": newExpectedValue(equal, "deployment"), + "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-traces-deployment"), + "k8s.container.name": newExpectedValue(equal, "telemetrygen"), + "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), + "container.image.repo_digests": newExpectedValue(regex, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen@sha256:[0-9a-fA-f]{64}"), + "container.image.tag": newExpectedValue(equal, "0.112.0"), + "container.id": newExpectedValue(exist, ""), + "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), + "k8s.node.labels.foo": newExpectedValue(equal, "too"), + "k8s.cluster.uid": newExpectedValue(regex, uidRe), }, }, { name: "metrics-deployment", - dataType: component.DataTypeMetrics, + dataType: pipeline.SignalMetrics, service: "test-metrics-deployment", attrs: map[string]*expectedValue{ - "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-metrics-deployment-[a-z0-9]*-[a-z0-9]*"), - "k8s.pod.ip": newExpectedValue(exist, ""), - "k8s.pod.uid": newExpectedValue(regex, uidRe), - "k8s.pod.start_time": newExpectedValue(exist, ""), - "k8s.node.name": newExpectedValue(exist, ""), - "k8s.namespace.name": newExpectedValue(equal, workloadNs), - "k8s.deployment.name": newExpectedValue(equal, "telemetrygen-"+testID+"-metrics-deployment"), - "k8s.deployment.uid": newExpectedValue(regex, uidRe), - "k8s.replicaset.name": newExpectedValue(regex, "telemetrygen-"+testID+"-metrics-deployment-[a-z0-9]*"), - "k8s.replicaset.uid": newExpectedValue(regex, uidRe), - "k8s.annotations.workload": newExpectedValue(equal, "deployment"), - "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-metrics-deployment"), - "k8s.container.name": newExpectedValue(equal, "telemetrygen"), - "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), - "container.image.tag": newExpectedValue(equal, "latest"), - "container.id": newExpectedValue(exist, ""), - "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), - "k8s.node.labels.foo": newExpectedValue(equal, "too"), - "k8s.cluster.uid": newExpectedValue(regex, uidRe), + "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-metrics-deployment-[a-z0-9]*-[a-z0-9]*"), + "k8s.pod.ip": newExpectedValue(exist, ""), + "k8s.pod.uid": newExpectedValue(regex, uidRe), + "k8s.pod.start_time": newExpectedValue(exist, ""), + "k8s.node.name": newExpectedValue(exist, ""), + "k8s.namespace.name": newExpectedValue(equal, workloadNs), + "k8s.deployment.name": newExpectedValue(equal, "telemetrygen-"+testID+"-metrics-deployment"), + "k8s.deployment.uid": newExpectedValue(regex, uidRe), + "k8s.replicaset.name": newExpectedValue(regex, "telemetrygen-"+testID+"-metrics-deployment-[a-z0-9]*"), + "k8s.replicaset.uid": newExpectedValue(regex, uidRe), + "k8s.annotations.workload": newExpectedValue(equal, "deployment"), + "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-metrics-deployment"), + "k8s.container.name": newExpectedValue(equal, "telemetrygen"), + "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), + "container.image.repo_digests": newExpectedValue(regex, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen@sha256:[0-9a-fA-f]{64}"), + "container.image.tag": newExpectedValue(equal, "0.112.0"), + "container.id": newExpectedValue(exist, ""), + "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), + "k8s.node.labels.foo": newExpectedValue(equal, "too"), + "k8s.cluster.uid": newExpectedValue(regex, uidRe), }, }, { name: "logs-deployment", - dataType: component.DataTypeLogs, + dataType: pipeline.SignalLogs, service: "test-logs-deployment", attrs: map[string]*expectedValue{ - "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-logs-deployment-[a-z0-9]*-[a-z0-9]*"), - "k8s.pod.ip": newExpectedValue(exist, ""), - "k8s.pod.uid": newExpectedValue(regex, uidRe), - "k8s.pod.start_time": newExpectedValue(exist, ""), - "k8s.node.name": newExpectedValue(exist, ""), - "k8s.namespace.name": newExpectedValue(equal, workloadNs), - "k8s.deployment.name": newExpectedValue(equal, "telemetrygen-"+testID+"-logs-deployment"), - "k8s.deployment.uid": newExpectedValue(regex, uidRe), - "k8s.replicaset.name": newExpectedValue(regex, "telemetrygen-"+testID+"-logs-deployment-[a-z0-9]*"), - "k8s.replicaset.uid": newExpectedValue(regex, uidRe), - "k8s.annotations.workload": newExpectedValue(equal, "deployment"), - "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-logs-deployment"), - "k8s.container.name": newExpectedValue(equal, "telemetrygen"), - "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), - "container.image.tag": newExpectedValue(equal, "latest"), - "container.id": newExpectedValue(exist, ""), - "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), - "k8s.node.labels.foo": newExpectedValue(equal, "too"), - "k8s.cluster.uid": newExpectedValue(regex, uidRe), + "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-logs-deployment-[a-z0-9]*-[a-z0-9]*"), + "k8s.pod.ip": newExpectedValue(exist, ""), + "k8s.pod.uid": newExpectedValue(regex, uidRe), + "k8s.pod.start_time": newExpectedValue(exist, ""), + "k8s.node.name": newExpectedValue(exist, ""), + "k8s.namespace.name": newExpectedValue(equal, workloadNs), + "k8s.deployment.name": newExpectedValue(equal, "telemetrygen-"+testID+"-logs-deployment"), + "k8s.deployment.uid": newExpectedValue(regex, uidRe), + "k8s.replicaset.name": newExpectedValue(regex, "telemetrygen-"+testID+"-logs-deployment-[a-z0-9]*"), + "k8s.replicaset.uid": newExpectedValue(regex, uidRe), + "k8s.annotations.workload": newExpectedValue(equal, "deployment"), + "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-logs-deployment"), + "k8s.container.name": newExpectedValue(equal, "telemetrygen"), + "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), + "container.image.repo_digests": newExpectedValue(regex, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen@sha256:[0-9a-fA-f]{64}"), + "container.image.tag": newExpectedValue(equal, "0.112.0"), + "container.id": newExpectedValue(exist, ""), + "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), + "k8s.node.labels.foo": newExpectedValue(equal, "too"), + "k8s.cluster.uid": newExpectedValue(regex, uidRe), + }, + }, + { + name: "profiles-deployment", + dataType: pipelineprofiles.SignalProfiles, + service: "test-profiles-deployment", + attrs: map[string]*expectedValue{ + "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-profiles-deployment-[a-z0-9]*-[a-z0-9]*"), + "k8s.pod.ip": newExpectedValue(exist, ""), + "k8s.pod.uid": newExpectedValue(regex, uidRe), + "k8s.pod.start_time": newExpectedValue(exist, ""), + "k8s.node.name": newExpectedValue(exist, ""), + "k8s.namespace.name": newExpectedValue(equal, workloadNs), + "k8s.deployment.name": newExpectedValue(equal, "telemetrygen-"+testID+"-profiles-deployment"), + "k8s.deployment.uid": newExpectedValue(regex, uidRe), + "k8s.replicaset.name": newExpectedValue(regex, "telemetrygen-"+testID+"-profiles-deployment-[a-z0-9]*"), + "k8s.replicaset.uid": newExpectedValue(regex, uidRe), + "k8s.annotations.workload": newExpectedValue(equal, "deployment"), + "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-profiles-deployment"), + "k8s.container.name": newExpectedValue(equal, "telemetrygen"), + "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), + "container.image.repo_digests": newExpectedValue(regex, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen@sha256:[0-9a-fA-f]{64}"), + "container.image.tag": newExpectedValue(equal, "latest"), + "container.id": newExpectedValue(exist, ""), + "k8s.namespace.labels.foons": newExpectedValue(equal, "barns"), + "k8s.node.labels.foo": newExpectedValue(equal, "too"), + "k8s.cluster.uid": newExpectedValue(regex, uidRe), }, }, } @@ -706,12 +896,190 @@ func TestE2E_MixRBAC(t *testing.T) { for _, tc := range tcs { t.Run(tc.name, func(t *testing.T) { switch tc.dataType { - case component.DataTypeTraces: + case pipeline.SignalTraces: scanTracesForAttributes(t, tracesConsumer, tc.service, tc.attrs) - case component.DataTypeMetrics: + case pipeline.SignalMetrics: scanMetricsForAttributes(t, metricsConsumer, tc.service, tc.attrs) - case component.DataTypeLogs: + case pipeline.SignalLogs: scanLogsForAttributes(t, logsConsumer, tc.service, tc.attrs) + case pipelineprofiles.SignalProfiles: + scanProfilesForAttributes(t, profilesConsumer, tc.service, tc.attrs) + default: + t.Fatalf("unknown data type %s", tc.dataType) + } + }) + } +} + +// Test with `filter::namespace` set and only role binding to collector's SA. We can't get node and namespace labels/annotations. +// While `k8s.pod.ip` is not set in `k8sattributes:extract:metadata` and the `pod_association` is not `connection` +// we expect that the `k8s.pod.ip` metadata is not added. +// While `container.image.repo_digests` is not set in `k8sattributes::extract::metadata`, we expect +// that the `container.image.repo_digests` metadata is not added. +// The telemetrygen image has neither a tag nor digest (implicitly latest version) +func TestE2E_NamespacedRBACNoPodIP(t *testing.T) { + testDir := filepath.Join("testdata", "e2e", "namespaced_rbac_no_pod_ip") + + k8sClient, err := k8stest.NewK8sClient(testKubeConfig) + require.NoError(t, err) + + nsFile := filepath.Join(testDir, "namespace.yaml") + buf, err := os.ReadFile(nsFile) + require.NoErrorf(t, err, "failed to read namespace object file %s", nsFile) + nsObj, err := k8stest.CreateObject(k8sClient, buf) + require.NoErrorf(t, err, "failed to create k8s namespace from file %s", nsFile) + nsName := nsObj.GetName() + defer func() { + require.NoErrorf(t, k8stest.DeleteObject(k8sClient, nsObj), "failed to delete namespace %s", nsName) + }() + + metricsConsumer := new(consumertest.MetricsSink) + tracesConsumer := new(consumertest.TracesSink) + logsConsumer := new(consumertest.LogsSink) + profilesConsumer := new(consumertest.ProfilesSink) + shutdownSinks := startUpSinks(t, metricsConsumer, tracesConsumer, logsConsumer, profilesConsumer) + defer shutdownSinks() + + testID := uuid.NewString()[:8] + collectorObjs := k8stest.CreateCollectorObjects(t, k8sClient, testID, filepath.Join(testDir, "collector")) + createTeleOpts := &k8stest.TelemetrygenCreateOpts{ + ManifestsDir: filepath.Join(testDir, "telemetrygen"), + TestID: testID, + OtlpEndpoint: fmt.Sprintf("otelcol-%s.%s:4317", testID, nsName), + // `telemetrygen` doesn't support profiles + // https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/36127 + // TODO: add "profiles" to DataTypes once #36127 is resolved + DataTypes: []string{"metrics", "logs", "traces"}, + } + telemetryGenObjs, telemetryGenObjInfos := k8stest.CreateTelemetryGenObjects(t, k8sClient, createTeleOpts) + defer func() { + for _, obj := range append(collectorObjs, telemetryGenObjs...) { + require.NoErrorf(t, k8stest.DeleteObject(k8sClient, obj), "failed to delete object %s", obj.GetName()) + } + }() + + for _, info := range telemetryGenObjInfos { + k8stest.WaitForTelemetryGenToStart(t, k8sClient, info.Namespace, info.PodLabelSelectors, info.Workload, info.DataType) + } + + wantEntries := 20 // Minimal number of metrics/traces/logs/profiles to wait for. + waitForData(t, wantEntries, metricsConsumer, tracesConsumer, logsConsumer, profilesConsumer) + + tcs := []struct { + name string + dataType pipeline.Signal + service string + attrs map[string]*expectedValue + }{ + { + name: "traces-deployment", + dataType: pipeline.SignalTraces, + service: "test-traces-deployment", + attrs: map[string]*expectedValue{ + "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-traces-deployment-[a-z0-9]*-[a-z0-9]*"), + "k8s.pod.ip": newExpectedValue(shouldnotexist, ""), + "k8s.pod.uid": newExpectedValue(regex, uidRe), + "k8s.pod.start_time": newExpectedValue(exist, startTimeRe), + "k8s.node.name": newExpectedValue(exist, ""), + "k8s.namespace.name": newExpectedValue(equal, nsName), + "k8s.deployment.name": newExpectedValue(equal, "telemetrygen-"+testID+"-traces-deployment"), + "k8s.deployment.uid": newExpectedValue(regex, uidRe), + "k8s.replicaset.name": newExpectedValue(regex, "telemetrygen-"+testID+"-traces-deployment-[a-z0-9]*"), + "k8s.replicaset.uid": newExpectedValue(regex, uidRe), + "k8s.annotations.workload": newExpectedValue(equal, "deployment"), + "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-traces-deployment"), + "k8s.container.name": newExpectedValue(equal, "telemetrygen"), + "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), + "container.image.repo_digests": newExpectedValue(shouldnotexist, ""), + "container.image.tag": newExpectedValue(equal, "latest"), + "container.id": newExpectedValue(exist, ""), + }, + }, + { + name: "metrics-deployment", + dataType: pipeline.SignalMetrics, + service: "test-metrics-deployment", + attrs: map[string]*expectedValue{ + "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-metrics-deployment-[a-z0-9]*-[a-z0-9]*"), + "k8s.pod.ip": newExpectedValue(shouldnotexist, ""), + "k8s.pod.uid": newExpectedValue(regex, uidRe), + "k8s.pod.start_time": newExpectedValue(exist, startTimeRe), + "k8s.node.name": newExpectedValue(exist, ""), + "k8s.namespace.name": newExpectedValue(equal, nsName), + "k8s.deployment.name": newExpectedValue(equal, "telemetrygen-"+testID+"-metrics-deployment"), + "k8s.deployment.uid": newExpectedValue(regex, uidRe), + "k8s.replicaset.name": newExpectedValue(regex, "telemetrygen-"+testID+"-metrics-deployment-[a-z0-9]*"), + "k8s.replicaset.uid": newExpectedValue(regex, uidRe), + "k8s.annotations.workload": newExpectedValue(equal, "deployment"), + "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-metrics-deployment"), + "k8s.container.name": newExpectedValue(equal, "telemetrygen"), + "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), + "container.image.repo_digests": newExpectedValue(shouldnotexist, ""), + "container.image.tag": newExpectedValue(equal, "latest"), + "container.id": newExpectedValue(exist, ""), + }, + }, + { + name: "logs-deployment", + dataType: pipeline.SignalLogs, + service: "test-logs-deployment", + attrs: map[string]*expectedValue{ + "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-logs-deployment-[a-z0-9]*-[a-z0-9]*"), + "k8s.pod.ip": newExpectedValue(shouldnotexist, ""), + "k8s.pod.uid": newExpectedValue(regex, uidRe), + "k8s.pod.start_time": newExpectedValue(exist, startTimeRe), + "k8s.node.name": newExpectedValue(exist, ""), + "k8s.namespace.name": newExpectedValue(equal, nsName), + "k8s.deployment.name": newExpectedValue(equal, "telemetrygen-"+testID+"-logs-deployment"), + "k8s.deployment.uid": newExpectedValue(regex, uidRe), + "k8s.replicaset.name": newExpectedValue(regex, "telemetrygen-"+testID+"-logs-deployment-[a-z0-9]*"), + "k8s.replicaset.uid": newExpectedValue(regex, uidRe), + "k8s.annotations.workload": newExpectedValue(equal, "deployment"), + "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-logs-deployment"), + "k8s.container.name": newExpectedValue(equal, "telemetrygen"), + "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), + "container.image.repo_digests": newExpectedValue(shouldnotexist, ""), + "container.image.tag": newExpectedValue(equal, "latest"), + "container.id": newExpectedValue(exist, ""), + }, + }, + { + name: "profiles-deployment", + dataType: pipelineprofiles.SignalProfiles, + service: "test-profiles-deployment", + attrs: map[string]*expectedValue{ + "k8s.pod.name": newExpectedValue(regex, "telemetrygen-"+testID+"-profiles-deployment-[a-z0-9]*-[a-z0-9]*"), + "k8s.pod.ip": newExpectedValue(shouldnotexist, ""), + "k8s.pod.uid": newExpectedValue(regex, uidRe), + "k8s.pod.start_time": newExpectedValue(exist, startTimeRe), + "k8s.node.name": newExpectedValue(exist, ""), + "k8s.namespace.name": newExpectedValue(equal, nsName), + "k8s.deployment.name": newExpectedValue(equal, "telemetrygen-"+testID+"-profiles-deployment"), + "k8s.deployment.uid": newExpectedValue(regex, uidRe), + "k8s.replicaset.name": newExpectedValue(regex, "telemetrygen-"+testID+"-profiles-deployment-[a-z0-9]*"), + "k8s.replicaset.uid": newExpectedValue(regex, uidRe), + "k8s.annotations.workload": newExpectedValue(equal, "deployment"), + "k8s.labels.app": newExpectedValue(equal, "telemetrygen-"+testID+"-profiles-deployment"), + "k8s.container.name": newExpectedValue(equal, "telemetrygen"), + "container.image.name": newExpectedValue(equal, "ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen"), + "container.image.repo_digests": newExpectedValue(shouldnotexist, ""), + "container.image.tag": newExpectedValue(equal, "latest"), + "container.id": newExpectedValue(exist, ""), + }, + }, + } + + for _, tc := range tcs { + t.Run(tc.name, func(t *testing.T) { + switch tc.dataType { + case pipeline.SignalTraces: + scanTracesForAttributes(t, tracesConsumer, tc.service, tc.attrs) + case pipeline.SignalMetrics: + scanMetricsForAttributes(t, metricsConsumer, tc.service, tc.attrs) + case pipeline.SignalLogs: + scanLogsForAttributes(t, logsConsumer, tc.service, tc.attrs) + case pipelineprofiles.SignalProfiles: + scanProfilesForAttributes(t, profilesConsumer, tc.service, tc.attrs) default: t.Fatalf("unknown data type %s", tc.dataType) } @@ -720,7 +1088,8 @@ func TestE2E_MixRBAC(t *testing.T) { } func scanTracesForAttributes(t *testing.T, ts *consumertest.TracesSink, expectedService string, - kvs map[string]*expectedValue) { + kvs map[string]*expectedValue, +) { // Iterate over the received set of traces starting from the most recent entries due to a bug in the processor: // https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/18892 // TODO: Remove the reverse loop once it's fixed. All the metrics should be properly annotated. @@ -729,7 +1098,7 @@ func scanTracesForAttributes(t *testing.T, ts *consumertest.TracesSink, expected for i := 0; i < traces.ResourceSpans().Len(); i++ { resource := traces.ResourceSpans().At(i).Resource() service, exist := resource.Attributes().Get("service.name") - assert.Equal(t, true, exist, "span do not has 'service.name' attribute in resource") + assert.True(t, exist, "span do not has 'service.name' attribute in resource") if service.AsString() != expectedService { continue } @@ -741,7 +1110,8 @@ func scanTracesForAttributes(t *testing.T, ts *consumertest.TracesSink, expected } func scanMetricsForAttributes(t *testing.T, ms *consumertest.MetricsSink, expectedService string, - kvs map[string]*expectedValue) { + kvs map[string]*expectedValue, +) { // Iterate over the received set of metrics starting from the most recent entries due to a bug in the processor: // https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/18892 // TODO: Remove the reverse loop once it's fixed. All the metrics should be properly annotated. @@ -750,7 +1120,7 @@ func scanMetricsForAttributes(t *testing.T, ms *consumertest.MetricsSink, expect for i := 0; i < metrics.ResourceMetrics().Len(); i++ { resource := metrics.ResourceMetrics().At(i).Resource() service, exist := resource.Attributes().Get("service.name") - assert.Equal(t, true, exist, "metric do not has 'service.name' attribute in resource") + assert.True(t, exist, "metric do not has 'service.name' attribute in resource") if service.AsString() != expectedService { continue } @@ -762,7 +1132,8 @@ func scanMetricsForAttributes(t *testing.T, ms *consumertest.MetricsSink, expect } func scanLogsForAttributes(t *testing.T, ls *consumertest.LogsSink, expectedService string, - kvs map[string]*expectedValue) { + kvs map[string]*expectedValue, +) { // Iterate over the received set of logs starting from the most recent entries due to a bug in the processor: // https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/18892 // TODO: Remove the reverse loop once it's fixed. All the metrics should be properly annotated. @@ -771,7 +1142,7 @@ func scanLogsForAttributes(t *testing.T, ls *consumertest.LogsSink, expectedServ for i := 0; i < logs.ResourceLogs().Len(); i++ { resource := logs.ResourceLogs().At(i).Resource() service, exist := resource.Attributes().Get("service.name") - assert.Equal(t, true, exist, "log do not has 'service.name' attribute in resource") + assert.True(t, exist, "log do not has 'service.name' attribute in resource") if service.AsString() != expectedService { continue } @@ -782,10 +1153,42 @@ func scanLogsForAttributes(t *testing.T, ls *consumertest.LogsSink, expectedServ t.Fatalf("no logs found for service %s", expectedService) } +func scanProfilesForAttributes(t *testing.T, ps *consumertest.ProfilesSink, expectedService string, + kvs map[string]*expectedValue, +) { + // `telemetrygen` doesn't support profiles + // https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/36127 + // TODO: Remove `t.Skip()` once #36127 is resolved + t.Skip("Skip profiles test") + + // Iterate over the received set of profiles starting from the most recent entries due to a bug in the processor: + // https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/18892 + // TODO: Remove the reverse loop once it's fixed. All the metrics should be properly annotated. + for i := len(ps.AllProfiles()) - 1; i >= 0; i-- { + profiles := ps.AllProfiles()[i] + for i := 0; i < profiles.ResourceProfiles().Len(); i++ { + resource := profiles.ResourceProfiles().At(i).Resource() + service, exist := resource.Attributes().Get("service.name") + assert.True(t, exist, "profile do not has 'service.name' attribute in resource") + if service.AsString() != expectedService { + continue + } + assert.NoError(t, resourceHasAttributes(resource, kvs)) + return + } + } + t.Fatalf("no profiles found for service %s", expectedService) +} + func resourceHasAttributes(resource pcommon.Resource, kvs map[string]*expectedValue) error { foundAttrs := make(map[string]bool) - for k := range kvs { - foundAttrs[k] = false + shouldNotFoundAttrs := make(map[string]bool) + for k, v := range kvs { + if v.mode != shouldnotexist { + foundAttrs[k] = false + continue + } + shouldNotFoundAttrs[k] = false } resource.Attributes().Range( @@ -803,14 +1206,20 @@ func resourceHasAttributes(resource pcommon.Resource, kvs map[string]*expectedVa } case exist: foundAttrs[k] = true + case shouldnotexist: + shouldNotFoundAttrs[k] = true } - } return true }, ) var err error + for k, v := range shouldNotFoundAttrs { + if v { + err = multierr.Append(err, fmt.Errorf("%v attribute should not be added", k)) + } + } for k, v := range foundAttrs { if !v { err = multierr.Append(err, fmt.Errorf("%v attribute not found", k)) @@ -819,27 +1228,34 @@ func resourceHasAttributes(resource pcommon.Resource, kvs map[string]*expectedVa return err } -func startUpSinks(t *testing.T, mc *consumertest.MetricsSink, tc *consumertest.TracesSink, lc *consumertest.LogsSink) func() { +func startUpSinks(t *testing.T, mc *consumertest.MetricsSink, tc *consumertest.TracesSink, lc *consumertest.LogsSink, pc *consumertest.ProfilesSink) func() { f := otlpreceiver.NewFactory() cfg := f.CreateDefaultConfig().(*otlpreceiver.Config) + cfg.HTTP = nil + cfg.GRPC.NetAddr.Endpoint = "0.0.0.0:4317" - _, err := f.CreateMetricsReceiver(context.Background(), receivertest.NewNopCreateSettings(), cfg, mc) + _, err := f.CreateMetrics(context.Background(), receivertest.NewNopSettings(), cfg, mc) require.NoError(t, err, "failed creating metrics receiver") - _, err = f.CreateTracesReceiver(context.Background(), receivertest.NewNopCreateSettings(), cfg, tc) + _, err = f.CreateTraces(context.Background(), receivertest.NewNopSettings(), cfg, tc) require.NoError(t, err, "failed creating traces receiver") - rcvr, err := f.CreateLogsReceiver(context.Background(), receivertest.NewNopCreateSettings(), cfg, lc) + _, err = f.CreateLogs(context.Background(), receivertest.NewNopSettings(), cfg, lc) require.NoError(t, err, "failed creating logs receiver") + rcvr, err := f.(xreceiver.Factory).CreateProfiles(context.Background(), receivertest.NewNopSettings(), cfg, pc) + require.NoError(t, err, "failed creating profiles receiver") require.NoError(t, rcvr.Start(context.Background(), componenttest.NewNopHost())) return func() { assert.NoError(t, rcvr.Shutdown(context.Background())) } } -func waitForData(t *testing.T, entriesNum int, mc *consumertest.MetricsSink, tc *consumertest.TracesSink, lc *consumertest.LogsSink) { +func waitForData(t *testing.T, entriesNum int, mc *consumertest.MetricsSink, tc *consumertest.TracesSink, lc *consumertest.LogsSink, pc *consumertest.ProfilesSink) { timeoutMinutes := 3 require.Eventuallyf(t, func() bool { + // `telemetrygen` doesn't support profiles + // https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/36127 + // TODO: assert `len(pc.AllProfiles()) > entriesNum` once #36127 is resolved return len(mc.AllMetrics()) > entriesNum && len(tc.AllTraces()) > entriesNum && len(lc.AllLogs()) > entriesNum }, time.Duration(timeoutMinutes)*time.Minute, 1*time.Second, - "failed to receive %d entries, received %d metrics, %d traces, %d logs in %d minutes", entriesNum, - len(mc.AllMetrics()), len(tc.AllTraces()), len(lc.AllLogs()), timeoutMinutes) + "failed to receive %d entries, received %d metrics, %d traces, %d logs, %d profiles in %d minutes", entriesNum, + len(mc.AllMetrics()), len(tc.AllTraces()), len(lc.AllLogs()), len(pc.AllProfiles()), timeoutMinutes) } diff --git a/processor/k8sattributesprocessor/factory.go b/processor/k8sattributesprocessor/factory.go index e994ed6df256..c3b66d049cac 100644 --- a/processor/k8sattributesprocessor/factory.go +++ b/processor/k8sattributesprocessor/factory.go @@ -5,29 +5,36 @@ package k8sattributesprocessor // import "github.com/open-telemetry/opentelemetr import ( "context" + "time" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/consumer" + "go.opentelemetry.io/collector/consumer/xconsumer" "go.opentelemetry.io/collector/processor" "go.opentelemetry.io/collector/processor/processorhelper" + "go.opentelemetry.io/collector/processor/processorhelper/xprocessorhelper" + "go.opentelemetry.io/collector/processor/xprocessor" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor/internal/kube" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor/internal/metadata" ) -var kubeClientProvider = kube.ClientProvider(nil) -var consumerCapabilities = consumer.Capabilities{MutatesData: true} -var defaultExcludes = ExcludeConfig{Pods: []ExcludePodConfig{{Name: "jaeger-agent"}, {Name: "jaeger-collector"}}} +var ( + kubeClientProvider = kube.ClientProvider(nil) + consumerCapabilities = consumer.Capabilities{MutatesData: true} + defaultExcludes = ExcludeConfig{Pods: []ExcludePodConfig{{Name: "jaeger-agent"}, {Name: "jaeger-collector"}}} +) // NewFactory returns a new factory for the k8s processor. func NewFactory() processor.Factory { - return processor.NewFactory( + return xprocessor.NewFactory( metadata.Type, createDefaultConfig, - processor.WithTraces(createTracesProcessor, metadata.TracesStability), - processor.WithMetrics(createMetricsProcessor, metadata.MetricsStability), - processor.WithLogs(createLogsProcessor, metadata.LogsStability), + xprocessor.WithTraces(createTracesProcessor, metadata.TracesStability), + xprocessor.WithMetrics(createMetricsProcessor, metadata.MetricsStability), + xprocessor.WithLogs(createLogsProcessor, metadata.LogsStability), + xprocessor.WithProfiles(createProfilesProcessor, metadata.ProfilesStability), ) } @@ -38,12 +45,13 @@ func createDefaultConfig() component.Config { Extract: ExtractConfig{ Metadata: enabledAttributes(), }, + WaitForMetadataTimeout: 10 * time.Second, } } func createTracesProcessor( ctx context.Context, - params processor.CreateSettings, + params processor.Settings, cfg component.Config, next consumer.Traces, ) (processor.Traces, error) { @@ -52,7 +60,7 @@ func createTracesProcessor( func createLogsProcessor( ctx context.Context, - params processor.CreateSettings, + params processor.Settings, cfg component.Config, nextLogsConsumer consumer.Logs, ) (processor.Logs, error) { @@ -61,23 +69,32 @@ func createLogsProcessor( func createMetricsProcessor( ctx context.Context, - params processor.CreateSettings, + params processor.Settings, cfg component.Config, nextMetricsConsumer consumer.Metrics, ) (processor.Metrics, error) { return createMetricsProcessorWithOptions(ctx, params, cfg, nextMetricsConsumer) } +func createProfilesProcessor( + ctx context.Context, + params processor.Settings, + cfg component.Config, + nextProfilesConsumer xconsumer.Profiles, +) (xprocessor.Profiles, error) { + return createProfilesProcessorWithOptions(ctx, params, cfg, nextProfilesConsumer) +} + func createTracesProcessorWithOptions( ctx context.Context, - set processor.CreateSettings, + set processor.Settings, cfg component.Config, next consumer.Traces, options ...option, ) (processor.Traces, error) { kp := createKubernetesProcessor(set, cfg, options...) - return processorhelper.NewTracesProcessor( + return processorhelper.NewTraces( ctx, set, cfg, @@ -90,14 +107,14 @@ func createTracesProcessorWithOptions( func createMetricsProcessorWithOptions( ctx context.Context, - set processor.CreateSettings, + set processor.Settings, cfg component.Config, nextMetricsConsumer consumer.Metrics, options ...option, ) (processor.Metrics, error) { kp := createKubernetesProcessor(set, cfg, options...) - return processorhelper.NewMetricsProcessor( + return processorhelper.NewMetrics( ctx, set, cfg, @@ -110,14 +127,14 @@ func createMetricsProcessorWithOptions( func createLogsProcessorWithOptions( ctx context.Context, - set processor.CreateSettings, + set processor.Settings, cfg component.Config, nextLogsConsumer consumer.Logs, options ...option, ) (processor.Logs, error) { kp := createKubernetesProcessor(set, cfg, options...) - return processorhelper.NewLogsProcessor( + return processorhelper.NewLogs( ctx, set, cfg, @@ -128,12 +145,34 @@ func createLogsProcessorWithOptions( processorhelper.WithShutdown(kp.Shutdown)) } +func createProfilesProcessorWithOptions( + ctx context.Context, + set processor.Settings, + cfg component.Config, + nextProfilesConsumer xconsumer.Profiles, + options ...option, +) (xprocessor.Profiles, error) { + kp := createKubernetesProcessor(set, cfg, options...) + + return xprocessorhelper.NewProfiles( + ctx, + set, + cfg, + nextProfilesConsumer, + kp.processProfiles, + xprocessorhelper.WithCapabilities(consumerCapabilities), + xprocessorhelper.WithStart(kp.Start), + xprocessorhelper.WithShutdown(kp.Shutdown), + ) +} + func createKubernetesProcessor( - params processor.CreateSettings, + params processor.Settings, cfg component.Config, options ...option, ) *kubernetesprocessor { - kp := &kubernetesprocessor{logger: params.Logger, + kp := &kubernetesprocessor{ + logger: params.Logger, cfg: cfg, options: options, telemetrySettings: params.TelemetrySettings, @@ -165,5 +204,10 @@ func createProcessorOpts(cfg component.Config) []option { opts = append(opts, withExcludes(oCfg.Exclude)) + opts = append(opts, withWaitForMetadataTimeout(oCfg.WaitForMetadataTimeout)) + if oCfg.WaitForMetadata { + opts = append(opts, withWaitForMetadata(true)) + } + return opts } diff --git a/processor/k8sattributesprocessor/factory_test.go b/processor/k8sattributesprocessor/factory_test.go index b9342520fa9b..ee1714423f39 100644 --- a/processor/k8sattributesprocessor/factory_test.go +++ b/processor/k8sattributesprocessor/factory_test.go @@ -11,6 +11,7 @@ import ( "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/consumer/consumertest" "go.opentelemetry.io/collector/processor/processortest" + "go.opentelemetry.io/collector/processor/xprocessor" ) func TestCreateDefaultConfig(t *testing.T) { @@ -27,35 +28,43 @@ func TestCreateProcessor(t *testing.T) { kubeClientProvider = newFakeClient cfg := factory.CreateDefaultConfig() - params := processortest.NewNopCreateSettings() + params := processortest.NewNopSettings() - tp, err := factory.CreateTracesProcessor(context.Background(), params, cfg, consumertest.NewNop()) + tp, err := factory.CreateTraces(context.Background(), params, cfg, consumertest.NewNop()) assert.NotNil(t, tp) assert.NoError(t, err) - mp, err := factory.CreateMetricsProcessor(context.Background(), params, cfg, consumertest.NewNop()) + mp, err := factory.CreateMetrics(context.Background(), params, cfg, consumertest.NewNop()) assert.NotNil(t, mp) assert.NoError(t, err) - lp, err := factory.CreateLogsProcessor(context.Background(), params, cfg, consumertest.NewNop()) + lp, err := factory.CreateLogs(context.Background(), params, cfg, consumertest.NewNop()) assert.NotNil(t, lp) assert.NoError(t, err) + pp, err := factory.(xprocessor.Factory).CreateProfiles(context.Background(), params, cfg, consumertest.NewNop()) + assert.NotNil(t, pp) + assert.NoError(t, err) + oCfg := cfg.(*Config) oCfg.Passthrough = true - tp, err = factory.CreateTracesProcessor(context.Background(), params, cfg, consumertest.NewNop()) + tp, err = factory.CreateTraces(context.Background(), params, cfg, consumertest.NewNop()) assert.NotNil(t, tp) assert.NoError(t, err) - mp, err = factory.CreateMetricsProcessor(context.Background(), params, cfg, consumertest.NewNop()) + mp, err = factory.CreateMetrics(context.Background(), params, cfg, consumertest.NewNop()) assert.NotNil(t, mp) assert.NoError(t, err) - lp, err = factory.CreateLogsProcessor(context.Background(), params, cfg, consumertest.NewNop()) + lp, err = factory.CreateLogs(context.Background(), params, cfg, consumertest.NewNop()) assert.NotNil(t, lp) assert.NoError(t, err) + pp, err = factory.(xprocessor.Factory).CreateProfiles(context.Background(), params, cfg, consumertest.NewNop()) + assert.NotNil(t, pp) + assert.NoError(t, err) + // Switch it back so other tests run afterwards will not fail on unexpected state kubeClientProvider = realClient } diff --git a/processor/k8sattributesprocessor/generated_component_telemetry_test.go b/processor/k8sattributesprocessor/generated_component_telemetry_test.go new file mode 100644 index 000000000000..9f66d0f06499 --- /dev/null +++ b/processor/k8sattributesprocessor/generated_component_telemetry_test.go @@ -0,0 +1,84 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package k8sattributesprocessor + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + sdkmetric "go.opentelemetry.io/otel/sdk/metric" + "go.opentelemetry.io/otel/sdk/metric/metricdata" + "go.opentelemetry.io/otel/sdk/metric/metricdata/metricdatatest" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/config/configtelemetry" + "go.opentelemetry.io/collector/processor" + "go.opentelemetry.io/collector/processor/processortest" +) + +type componentTestTelemetry struct { + reader *sdkmetric.ManualReader + meterProvider *sdkmetric.MeterProvider +} + +func (tt *componentTestTelemetry) NewSettings() processor.Settings { + set := processortest.NewNopSettings() + set.ID = component.NewID(component.MustNewType("k8sattributes")) + set.TelemetrySettings = tt.newTelemetrySettings() + return set +} + +func (tt *componentTestTelemetry) newTelemetrySettings() component.TelemetrySettings { + set := componenttest.NewNopTelemetrySettings() + set.MeterProvider = tt.meterProvider + set.MetricsLevel = configtelemetry.LevelDetailed + return set +} + +func setupTestTelemetry() componentTestTelemetry { + reader := sdkmetric.NewManualReader() + return componentTestTelemetry{ + reader: reader, + meterProvider: sdkmetric.NewMeterProvider(sdkmetric.WithReader(reader)), + } +} + +func (tt *componentTestTelemetry) assertMetrics(t *testing.T, expected []metricdata.Metrics) { + var md metricdata.ResourceMetrics + require.NoError(t, tt.reader.Collect(context.Background(), &md)) + // ensure all required metrics are present + for _, want := range expected { + got := tt.getMetric(want.Name, md) + metricdatatest.AssertEqual(t, want, got, metricdatatest.IgnoreTimestamp()) + } + + // ensure no additional metrics are emitted + require.Equal(t, len(expected), tt.len(md)) +} + +func (tt *componentTestTelemetry) getMetric(name string, got metricdata.ResourceMetrics) metricdata.Metrics { + for _, sm := range got.ScopeMetrics { + for _, m := range sm.Metrics { + if m.Name == name { + return m + } + } + } + + return metricdata.Metrics{} +} + +func (tt *componentTestTelemetry) len(got metricdata.ResourceMetrics) int { + metricsCount := 0 + for _, sm := range got.ScopeMetrics { + metricsCount += len(sm.Metrics) + } + + return metricsCount +} + +func (tt *componentTestTelemetry) Shutdown(ctx context.Context) error { + return tt.meterProvider.Shutdown(ctx) +} diff --git a/processor/k8sattributesprocessor/generated_component_test.go b/processor/k8sattributesprocessor/generated_component_test.go index f19d5de873ab..38c00260ae43 100644 --- a/processor/k8sattributesprocessor/generated_component_test.go +++ b/processor/k8sattributesprocessor/generated_component_test.go @@ -33,27 +33,27 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsProcessor(ctx, set, cfg, consumertest.NewNop()) + createFn: func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg, consumertest.NewNop()) }, }, { name: "metrics", - createFn: func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateMetricsProcessor(ctx, set, cfg, consumertest.NewNop()) + createFn: func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateMetrics(ctx, set, cfg, consumertest.NewNop()) }, }, { name: "traces", - createFn: func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateTracesProcessor(ctx, set, cfg, consumertest.NewNop()) + createFn: func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateTraces(ctx, set, cfg, consumertest.NewNop()) }, }, } @@ -65,47 +65,9 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), processortest.NewNopCreateSettings(), cfg) - require.NoError(t, err) - err = c.Shutdown(context.Background()) - require.NoError(t, err) - }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), processortest.NewNopCreateSettings(), cfg) - require.NoError(t, err) - host := componenttest.NewNopHost() - err = c.Start(context.Background(), host) - require.NoError(t, err) - require.NotPanics(t, func() { - switch test.name { - case "logs": - e, ok := c.(processor.Logs) - require.True(t, ok) - logs := generateLifecycleTestLogs() - if !e.Capabilities().MutatesData { - logs.MarkReadOnly() - } - err = e.ConsumeLogs(context.Background(), logs) - case "metrics": - e, ok := c.(processor.Metrics) - require.True(t, ok) - metrics := generateLifecycleTestMetrics() - if !e.Capabilities().MutatesData { - metrics.MarkReadOnly() - } - err = e.ConsumeMetrics(context.Background(), metrics) - case "traces": - e, ok := c.(processor.Traces) - require.True(t, ok) - traces := generateLifecycleTestTraces() - if !e.Capabilities().MutatesData { - traces.MarkReadOnly() - } - err = e.ConsumeTraces(context.Background(), traces) - } - }) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), processortest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) diff --git a/processor/k8sattributesprocessor/go.mod b/processor/k8sattributesprocessor/go.mod index 8201edf3174f..32f448e1b56b 100644 --- a/processor/k8sattributesprocessor/go.mod +++ b/processor/k8sattributesprocessor/go.mod @@ -1,56 +1,66 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor -go 1.21.0 +go 1.22.0 require ( + github.com/distribution/reference v0.6.0 github.com/google/go-cmp v0.6.0 github.com/google/uuid v1.6.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8stest v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opencensus.io v0.24.0 - go.opentelemetry.io/collector v0.102.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/featuregate v1.9.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/processor v0.102.0 - go.opentelemetry.io/collector/receiver v0.102.0 - go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0 - go.opentelemetry.io/collector/semconv v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8stest v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/client v1.22.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componentstatus v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 + go.opentelemetry.io/collector/featuregate v1.22.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 + go.opentelemetry.io/collector/pipeline v0.116.0 + go.opentelemetry.io/collector/pipeline/pipelineprofiles v0.116.0 + go.opentelemetry.io/collector/processor v0.116.0 + go.opentelemetry.io/collector/processor/processorhelper/xprocessorhelper v0.116.0 + go.opentelemetry.io/collector/processor/processortest v0.116.0 + go.opentelemetry.io/collector/processor/xprocessor v0.116.0 + go.opentelemetry.io/collector/receiver/otlpreceiver v0.116.0 + go.opentelemetry.io/collector/receiver/receivertest v0.116.0 + go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 + go.opentelemetry.io/collector/semconv v0.116.0 + go.opentelemetry.io/otel/metric v1.32.0 + go.opentelemetry.io/otel/sdk/metric v1.32.0 + go.opentelemetry.io/otel/trace v1.32.0 go.uber.org/goleak v1.3.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 - k8s.io/api v0.29.3 - k8s.io/apimachinery v0.29.3 - k8s.io/client-go v0.29.3 + k8s.io/api v0.31.3 + k8s.io/apimachinery v0.31.3 + k8s.io/client-go v0.31.3 ) require ( github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/distribution/reference v0.5.0 // indirect - github.com/docker/docker v25.0.5+incompatible // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/docker/docker v27.4.0+incompatible // indirect github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect - github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/swag v0.22.3 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-openapi/swag v0.22.4 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/gnostic-models v0.6.8 // indirect @@ -59,69 +69,68 @@ require ( github.com/imdario/mergo v0.3.13 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/mostynb/go-grpc-compression v1.2.2 // indirect + github.com/mostynb/go-grpc-compression v1.2.3 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.1.0-rc5 // indirect + github.com/opencontainers/image-spec v1.1.0 // indirect github.com/openshift/api v3.9.0+incompatible // indirect github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/rs/cors v1.10.1 // indirect - github.com/sirupsen/logrus v1.9.3 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/rs/cors v1.11.1 // indirect github.com/spf13/pflag v1.0.5 // indirect - go.opentelemetry.io/collector/config/configauth v0.102.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.9.0 // indirect - go.opentelemetry.io/collector/config/configgrpc v0.102.0 // indirect - go.opentelemetry.io/collector/config/confighttp v0.102.0 // indirect - go.opentelemetry.io/collector/config/confignet v0.102.0 // indirect - go.opentelemetry.io/collector/config/configopaque v1.9.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.102.0 // indirect - go.opentelemetry.io/collector/config/internal v0.102.0 // indirect - go.opentelemetry.io/collector/extension v0.102.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.102.0 // indirect - go.opentelemetry.io/collector/pdata/testdata v0.102.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - golang.org/x/mod v0.14.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/oauth2 v0.18.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/term v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect + github.com/x448/float16 v0.8.4 // indirect + go.opentelemetry.io/collector v0.116.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.116.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect + go.opentelemetry.io/collector/config/configgrpc v0.116.0 // indirect + go.opentelemetry.io/collector/config/confighttp v0.116.0 // indirect + go.opentelemetry.io/collector/config/confignet v1.22.0 // indirect + go.opentelemetry.io/collector/config/configopaque v1.22.0 // indirect + go.opentelemetry.io/collector/config/configtls v1.22.0 // indirect + go.opentelemetry.io/collector/config/internal v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect + go.opentelemetry.io/collector/internal/sharedcomponent v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/testdata v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/oauth2 v0.23.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect golang.org/x/time v0.4.0 // indirect - golang.org/x/tools v0.16.1 // indirect - google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect + gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/klog/v2 v2.110.1 // indirect - k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect - k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect + k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig => ./../../internal/k8sconfig @@ -135,7 +144,15 @@ retract ( v0.65.0 ) +replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal => ../../internal/coreinternal + replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8stest => ../../internal/k8stest // ambiguous import: found package cloud.google.com/go/compute/metadata in multiple modules replace cloud.google.com/go v0.54.0 => cloud.google.com/go v0.110.10 + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../../pkg/pdatautil + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest => ../../pkg/pdatatest + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden => ../../pkg/golden diff --git a/processor/k8sattributesprocessor/go.sum b/processor/k8sattributesprocessor/go.sum index 52f28b7dfe8b..9f8c6b6b475a 100644 --- a/processor/k8sattributesprocessor/go.sum +++ b/processor/k8sattributesprocessor/go.sum @@ -767,8 +767,8 @@ github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBp github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= @@ -784,8 +784,6 @@ github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4x github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg= github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -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/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= @@ -796,8 +794,6 @@ github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91 github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -821,12 +817,13 @@ github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= -github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= -github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/docker v27.4.0+incompatible h1:I9z7sQ5qyzO0BfAb9IMOawRkAGxhYsidKiTMcm0DU+A= +github.com/docker/docker v27.4.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -860,16 +857,16 @@ github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6Ni github.com/envoyproxy/protoc-gen-validate v1.0.1/go.mod h1:0vj8bNkYbSTNS2PIyH87KZaeN4x9zpL9Qt8fQC7d+vs= github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= @@ -885,9 +882,8 @@ github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7 github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= @@ -902,14 +898,15 @@ github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8 github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= +github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= @@ -921,7 +918,6 @@ github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/ github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= @@ -999,8 +995,9 @@ github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af h1:kmjWCqn2qkEml422C2Rrd27c3VGxi6a/6HNq8QmHRKM= +github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.0/go.mod h1:OJpEgntRZo8ugHpF9hkoLJbS5dSI20XZeXJ9JVywLlM= github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= @@ -1069,15 +1066,15 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -1111,6 +1108,8 @@ github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HK github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= @@ -1123,8 +1122,8 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mostynb/go-grpc-compression v1.2.2 h1:XaDbnRvt2+1vgr0b/l0qh4mJAfIxE0bKXtz2Znl3GGI= -github.com/mostynb/go-grpc-compression v1.2.2/go.mod h1:GOCr2KBxXcblCuczg3YdLQlcin1/NfyDA348ckuCH6w= +github.com/mostynb/go-grpc-compression v1.2.3 h1:42/BKWMy0KEJGSdWvzqIyOZ95YcR9mLPqKctH7Uo//I= +github.com/mostynb/go-grpc-compression v1.2.3/go.mod h1:AghIxF3P57umzqM9yz795+y1Vjs47Km/Y2FE6ouQ7Lg= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= @@ -1134,16 +1133,16 @@ github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= -github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= +github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= +github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg= -github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= -github.com/opencontainers/image-spec v1.1.0-rc5/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= github.com/openshift/api v0.0.0-20180801171038-322a19404e37 h1:05irGU4HK4IauGGDbsk+ZHrm1wOzMLYjMlfaiqMrBYc= github.com/openshift/api v0.0.0-20180801171038-322a19404e37/go.mod h1:dh9o4Fs58gpFXGSYfnVxGR9PnV53I8TW84pQaJDdGiY= github.com/openshift/api v0.0.0-20210521075222-e273a339932a/go.mod h1:izBmoXbUu3z5kUa4FjZhvekTsyzIWiOoaIgJiZBBMQs= @@ -1155,36 +1154,31 @@ github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2 github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= @@ -1212,8 +1206,10 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1230,89 +1226,106 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configauth v0.102.0 h1:SMtTwysDzpGPgTrjGtxilP0jLbP2vcUvVf2reF5kIf4= -go.opentelemetry.io/collector/config/configauth v0.102.0/go.mod h1:DXDbCaehy9XIBkZ3dGAMSQmEby6CFhXjfLJqZbkeRcw= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= -go.opentelemetry.io/collector/config/configgrpc v0.102.0 h1:cQi5HwpkHvrZJUxZjoGXkWpAuK+gEyp/1Zjn0BrkvmQ= -go.opentelemetry.io/collector/config/configgrpc v0.102.0/go.mod h1:ASpBXzDWLiDGlG8iRFovU5R4LhAefoC4ajm+qIdslOw= -go.opentelemetry.io/collector/config/confighttp v0.102.0 h1:rWdOoyChzyUnEPKJFLhvE69ztS7xwq4QZxCk+b78gsc= -go.opentelemetry.io/collector/config/confighttp v0.102.0/go.mod h1:gnpwVekcqmJB7Ljubs/aw8z8cwvB+crxxU/wfkTDtr4= -go.opentelemetry.io/collector/config/confignet v0.102.0 h1:+wQevJ/iBnPxL+roY7WWnAjMxB8v4M5QrS3+0iEmauw= -go.opentelemetry.io/collector/config/confignet v0.102.0/go.mod h1:pfOrCTfSZEB6H2rKtx41/3RN4dKs+X2EKQbw3MGRh0E= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/config/configtls v0.102.0 h1:U9xbye6bzsnQnJMCgYURyUcF1HGBGLb4+b3uIyxtmDE= -go.opentelemetry.io/collector/config/configtls v0.102.0/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= -go.opentelemetry.io/collector/config/internal v0.102.0 h1:tkkt6WFS6TNcSDPdWyqAOVStb5A2fuyY87khRVjZ4FI= -go.opentelemetry.io/collector/config/internal v0.102.0/go.mod h1:Yil8exjr0GTK+g27IftW1ch+DqsDI5dup4pNeGTF9S4= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/extension/auth v0.102.0 h1:q3A3J0c5QE2SJHyZCXmdiV+9j+zbvQ4zdiAokuV3llw= -go.opentelemetry.io/collector/extension/auth v0.102.0/go.mod h1:3wc9a+pOyngaD8wIwOsAArOJfDCzHBQMBuNtzOGaFuY= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/processor v0.102.0 h1:JsjTlpBRmoSYxcu3cAbKBchOmL6aNUxLa03ZkWIqZr8= -go.opentelemetry.io/collector/processor v0.102.0/go.mod h1:IaCSDcfy75uQTaOM+LgR1bMf/bUw2eFfzn20uvWYfLQ= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0 h1:eLc+AK0IQDDysrMt3SLwKaOFIjEwdO8ipwSck3+TUXE= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.0/go.mod h1:p9yeFJktNrpwV9ATvaWeZwCMvVkVWnrfbJ4RHI/RS/I= -go.opentelemetry.io/collector/semconv v0.102.0 h1:VEOdog9IbSfaGR7yg4AVmT54MwHAgH9lzITH6C33uyc= -go.opentelemetry.io/collector/semconv v0.102.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= -go.opentelemetry.io/contrib/config v0.7.0 h1:b1rK5tGTuhhPirJiMxOcyQfZs76j2VapY6ODn3b2Dbs= -go.opentelemetry.io/contrib/config v0.7.0/go.mod h1:8tdiFd8N5etOi3XzBmAoMxplEzI3TcL8dU5rM5/xcOQ= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 h1:vS1Ao/R55RNV4O7TA2Qopok8yN+X0LIP6RVWLFkprck= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0/go.mod h1:BMsdeOxN04K0L5FNUBfjFdvwWGNe/rkmSwH4Aelu/X0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 h1:bFgvUr3/O4PHj3VQcFEuYKvRZJX1SJDQ+11JXuSB3/w= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0/go.mod h1:xJntEd2KL6Qdg5lwp97HMLQDVeAhrYxmzFseAMDPQ8I= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 h1:CIHWikMsN3wO+wq1Tp5VGdVRTcON+DmOJSfDjXypKOc= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0/go.mod h1:TNupZ6cxqyFEpLXAZW7On+mLFL0/g0TE3unIYL91xWc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0 h1:/jlt1Y8gXWiHG9FBx6cJaIC5hYx5Fe64nC8w5Cylt/0= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.27.0/go.mod h1:bmToOGOBZ4hA9ghphIc1PAf66VA8KOtsuy3+ScStG20= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 h1:/0YaXu3755A/cFbtXp+21lkXgI0QE5avTWA2HjU9/WE= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0/go.mod h1:m7SFxp0/7IxmJPLIY3JhOcU9CoFzDaCPL6xxQIxhA+o= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector v0.116.0 h1:Dscd6Nsnc7hjFQosO0SofcPQsXRfcj5N5PjQAslnmj4= +go.opentelemetry.io/collector v0.116.0/go.mod h1:Ug2hpW0SINPmJAGVEALRlux78NTZc3YXSuh5/Q/hFrA= +go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= +go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= +go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= +go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= +go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/configgrpc v0.116.0 h1:O8Y1X9wDH5dDdqDJ9kqoaMrxEauaDSJBg9aNC6QgB7g= +go.opentelemetry.io/collector/config/configgrpc v0.116.0/go.mod h1:RPrSQrr6xhIaAK2DdcECi142NjSo0npQfVQB3nommSo= +go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= +go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= +go.opentelemetry.io/collector/config/confignet v1.22.0 h1:SBEMHJZWD8J4qgFw1O+BEkXW9AWldDi6Fz5YeDeoU58= +go.opentelemetry.io/collector/config/confignet v1.22.0/go.mod h1:ZppUH1hgUJOubawEsxsQ9MzEYFytqo2GnVSS7d4CVxc= +go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= +go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= +go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= +go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= +go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= +go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= +go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/internal/sharedcomponent v0.116.0 h1:5QhpnwgogQhBrcsOjk1Yhkugopj043XlSDB1lpHKCGo= +go.opentelemetry.io/collector/internal/sharedcomponent v0.116.0/go.mod h1:wMQM1Sqbj6J6jNVBb5hawkCfmqrLJ0hAeDKkalUfrEY= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/pipeline/pipelineprofiles v0.116.0 h1:vRdnwIU40bYtxntVOmxg4Bhrh9QVKtx5wwlxK21rc1s= +go.opentelemetry.io/collector/pipeline/pipelineprofiles v0.116.0/go.mod h1:KxDMUOfbVy8lzZ85CZEG3gCJEYMyWiBKdN+HWUwQWTM= +go.opentelemetry.io/collector/processor v0.116.0 h1:Kyu4tPzTdWNHtZjcxvI/bGNAgyv8L8Kem2r/Mk4IDAw= +go.opentelemetry.io/collector/processor v0.116.0/go.mod h1:+/Ugy48RAxlZEXmN2cw51W8t5wdHS9No+GAoP+moskk= +go.opentelemetry.io/collector/processor/processorhelper/xprocessorhelper v0.116.0 h1:1tIEJSN3HeCY602B5h2b1K6ocNn/HMNC2E+u7o3ceZA= +go.opentelemetry.io/collector/processor/processorhelper/xprocessorhelper v0.116.0/go.mod h1:r8oKp+HrgZDp4L6RiNYoEk3x+LMrt9lEiCW6WiaYuJM= +go.opentelemetry.io/collector/processor/processortest v0.116.0 h1:+IqNEVEE0E2MsO2g7+Y/9dz35sDuvAXRXrLts9NdXrA= +go.opentelemetry.io/collector/processor/processortest v0.116.0/go.mod h1:DLaQDBxzgeeaUO0ULMn/efos9PmHZkmYCHuxwCsiVHI= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0 h1:iin/UwuWvSLB7ZNfINFUYbZ5lxIi1NjZ2brkyyFdiRA= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0/go.mod h1:cnA43/XpKDbaOmd8buqKp/LGJ2l/OoCqbR//u5DMfn8= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.116.0 h1:81u+wJsQp9VfrAdVpVvcV31YAs8qsZp/UnMmG9YCJ0A= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.116.0/go.mod h1:JXIwjUyh3Q+gNvr7YE937se4/E4UJ/oz5z9xbJeVl3M= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 h1:yMkBS9yViCc7U7yeLzJPM2XizlfdVvBRSmsQDWu6qc0= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0/go.mod h1:n8MR6/liuGB5EmTETUBeU5ZgqMOlqKRxUaqPQBOANZ8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 h1:lsInsfvhVIfOI6qHVyysXMNDnjO9Npvl7tlDPJFBVd4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0/go.mod h1:KQsVNh4OjgjTG0G6EiNi1jVpnaeeKsKMRwbLN+f1+8M= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 h1:j9+03ymgYhPKmeXGk5Zu+cIZOlVzd9Zv7QIiyItjFBU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0/go.mod h1:Y5+XiUG4Emn1hTfciPzGPJaSI+RpDts6BnCIir0SLqk= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= -go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -1398,8 +1411,6 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1466,8 +1477,8 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1499,8 +1510,8 @@ golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= -golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= -golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= +golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= +golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1519,8 +1530,6 @@ golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1590,7 +1599,6 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1606,8 +1614,8 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -1623,8 +1631,8 @@ golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1644,8 +1652,8 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1722,8 +1730,8 @@ golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4= golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/tools v0.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM= -golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= -golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1810,8 +1818,6 @@ google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1963,8 +1969,8 @@ google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go. google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5/go.mod h1:5DZzOUPCLYL3mNkQ0ms0F3EuUNZ7py1Bqeq6sxzI7/Q= google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 h1:P8OJ/WCl/Xo4E4zoe4/bifHpSmmKwARqyqE4nW6J2GQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= @@ -1975,8 +1981,8 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go. google.golang.org/genproto/googleapis/rpc v0.0.0-20230731190214-cbb8c96f2d6d/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= google.golang.org/genproto/googleapis/rpc v0.0.0-20230803162519-f966b187b2e5/go.mod h1:zBEcrKX2ZOcEkHWxBPAIvYUWOKKMIhYcmNiUIu2ji3I= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 h1:QCqS/PdaHTSWGvupk2F/ehwHtGc0/GYkT+3GAcR1CCc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -2023,8 +2029,8 @@ google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpX google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -2044,8 +2050,8 @@ google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -2053,6 +2059,8 @@ gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= +gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= @@ -2079,28 +2087,28 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= k8s.io/api v0.21.1/go.mod h1:FstGROTmsSHBarKc8bylzXih8BLNYTiS3TZcsoEDg2s= -k8s.io/api v0.29.3 h1:2ORfZ7+bGC3YJqGpV0KSDDEVf8hdGQ6A03/50vj8pmw= -k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80= +k8s.io/api v0.31.3 h1:umzm5o8lFbdN/hIXbrK9oRpOproJO62CV1zqxXrLgk8= +k8s.io/api v0.31.3/go.mod h1:UJrkIp9pnMOI9K2nlL6vwpxRzzEX5sWgn8kGQe92kCE= k8s.io/apimachinery v0.21.1/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY= -k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= -k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= +k8s.io/apimachinery v0.31.3 h1:6l0WhcYgasZ/wk9ktLq5vLaoXJJr5ts6lkaQzgeYPq4= +k8s.io/apimachinery v0.31.3/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= k8s.io/client-go v0.21.1/go.mod h1:/kEw4RgW+3xnBGzvp9IWxKSNA+lXn3A7AuH3gdOAzLs= -k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg= -k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= +k8s.io/client-go v0.31.3 h1:CAlZuM+PH2cm+86LOBemaJI/lQ5linJ6UFxKX/SoG+4= +k8s.io/client-go v0.31.3/go.mod h1:2CgjPUTpv3fE5dNygAr2NcM8nhHzXvxB8KL5gYc3kJs= k8s.io/code-generator v0.21.1/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= -k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= @@ -2163,5 +2171,5 @@ sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/processor/k8sattributesprocessor/internal/kube/client.go b/processor/k8sattributesprocessor/internal/kube/client.go index 7488519dd925..a984e7f85cbd 100644 --- a/processor/k8sattributesprocessor/internal/kube/client.go +++ b/processor/k8sattributesprocessor/internal/kube/client.go @@ -4,12 +4,16 @@ package kube // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor/internal/kube" import ( + "context" + "errors" "fmt" "regexp" "strings" "sync" "time" + "github.com/distribution/reference" + "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/featuregate" conventions "go.opentelemetry.io/collector/semconv/v1.6.1" "go.uber.org/zap" @@ -23,7 +27,7 @@ import ( "k8s.io/client-go/tools/cache" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor/internal/observability" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor/internal/metadata" ) var enableRFC3339Timestamp = featuregate.GlobalRegistry().MustRegister( @@ -36,18 +40,20 @@ var enableRFC3339Timestamp = featuregate.GlobalRegistry().MustRegister( // WatchClient is the main interface provided by this package to a kubernetes cluster. type WatchClient struct { - m sync.RWMutex - deleteMut sync.Mutex - logger *zap.Logger - kc kubernetes.Interface - informer cache.SharedInformer - namespaceInformer cache.SharedInformer - nodeInformer cache.SharedInformer - replicasetInformer cache.SharedInformer - replicasetRegex *regexp.Regexp - cronJobRegex *regexp.Regexp - deleteQueue []deleteRequest - stopCh chan struct{} + m sync.RWMutex + deleteMut sync.Mutex + logger *zap.Logger + kc kubernetes.Interface + informer cache.SharedInformer + namespaceInformer cache.SharedInformer + nodeInformer cache.SharedInformer + replicasetInformer cache.SharedInformer + replicasetRegex *regexp.Regexp + cronJobRegex *regexp.Regexp + deleteQueue []deleteRequest + stopCh chan struct{} + waitForMetadata bool + waitForMetadataTimeout time.Duration // A map containing Pod related data, used to associate them with resources. // Key can be either an IP address or Pod UID @@ -68,6 +74,8 @@ type WatchClient struct { // A map containing ReplicaSets related data, used to associate them with resources. // Key is replicaset uid ReplicaSets map[string]*ReplicaSet + + telemetryBuilder *metadata.TelemetryBuilder } // Extract replicaset name from the pod name. Pod name is created using @@ -79,16 +87,36 @@ var rRegex = regexp.MustCompile(`^(.*)-[0-9a-zA-Z]+$`) var cronJobRegex = regexp.MustCompile(`^(.*)-[0-9]+$`) // New initializes a new k8s Client. -func New(logger *zap.Logger, apiCfg k8sconfig.APIConfig, rules ExtractionRules, filters Filters, associations []Association, exclude Excludes, newClientSet APIClientsetProvider, newInformer InformerProvider, newNamespaceInformer InformerProviderNamespace, newReplicaSetInformer InformerProviderReplicaSet) (Client, error) { +func New( + set component.TelemetrySettings, + apiCfg k8sconfig.APIConfig, + rules ExtractionRules, + filters Filters, + associations []Association, + exclude Excludes, + newClientSet APIClientsetProvider, + newInformer InformerProvider, + newNamespaceInformer InformerProviderNamespace, + newReplicaSetInformer InformerProviderReplicaSet, + waitForMetadata bool, + waitForMetadataTimeout time.Duration, +) (Client, error) { + telemetryBuilder, err := metadata.NewTelemetryBuilder(set) + if err != nil { + return nil, err + } c := &WatchClient{ - logger: logger, - Rules: rules, - Filters: filters, - Associations: associations, - Exclude: exclude, - replicasetRegex: rRegex, - cronJobRegex: cronJobRegex, - stopCh: make(chan struct{}), + logger: set.Logger, + Rules: rules, + Filters: filters, + Associations: associations, + Exclude: exclude, + replicasetRegex: rRegex, + cronJobRegex: cronJobRegex, + stopCh: make(chan struct{}), + telemetryBuilder: telemetryBuilder, + waitForMetadata: waitForMetadata, + waitForMetadataTimeout: waitForMetadataTimeout, } go c.deleteLoop(time.Second*30, defaultPodDeleteGracePeriod) @@ -110,7 +138,7 @@ func New(logger *zap.Logger, apiCfg k8sconfig.APIConfig, rules ExtractionRules, if err != nil { return nil, err } - logger.Info( + set.Logger.Info( "k8s filtering", zap.String("labelSelector", labelSelector.String()), zap.String("fieldSelector", fieldSelector.String()), @@ -179,50 +207,67 @@ func New(logger *zap.Logger, apiCfg k8sconfig.APIConfig, rules ExtractionRules, } // Start registers pod event handlers and starts watching the kubernetes cluster for pod changes. -func (c *WatchClient) Start() { - _, err := c.informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ +func (c *WatchClient) Start() error { + synced := make([]cache.InformerSynced, 0) + reg, err := c.informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: c.handlePodAdd, UpdateFunc: c.handlePodUpdate, DeleteFunc: c.handlePodDelete, }) if err != nil { - c.logger.Error("error adding event handler to pod informer", zap.Error(err)) + return err } + synced = append(synced, reg.HasSynced) go c.informer.Run(c.stopCh) - _, err = c.namespaceInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{ + reg, err = c.namespaceInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: c.handleNamespaceAdd, UpdateFunc: c.handleNamespaceUpdate, DeleteFunc: c.handleNamespaceDelete, }) if err != nil { - c.logger.Error("error adding event handler to namespace informer", zap.Error(err)) + return err } + synced = append(synced, reg.HasSynced) go c.namespaceInformer.Run(c.stopCh) if c.Rules.DeploymentName || c.Rules.DeploymentUID { - _, err = c.replicasetInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{ + reg, err = c.replicasetInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: c.handleReplicaSetAdd, UpdateFunc: c.handleReplicaSetUpdate, DeleteFunc: c.handleReplicaSetDelete, }) if err != nil { - c.logger.Error("error adding event handler to replicaset informer", zap.Error(err)) + return err } + synced = append(synced, reg.HasSynced) go c.replicasetInformer.Run(c.stopCh) } if c.nodeInformer != nil { - _, err = c.nodeInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{ + reg, err = c.nodeInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: c.handleNodeAdd, UpdateFunc: c.handleNodeUpdate, DeleteFunc: c.handleNodeDelete, }) if err != nil { - c.logger.Error("error adding event handler to node informer", zap.Error(err)) + return err } + synced = append(synced, reg.HasSynced) go c.nodeInformer.Run(c.stopCh) } + + if c.waitForMetadata { + timeoutCh := make(chan struct{}) + t := time.AfterFunc(c.waitForMetadataTimeout, func() { + close(timeoutCh) + }) + defer t.Stop() + if !cache.WaitForCacheSync(timeoutCh, synced...) { + return errors.New("failed to wait for caches to sync") + } + } + return nil } // Stop signals the the k8s watcher/informer to stop watching for new events. @@ -231,18 +276,18 @@ func (c *WatchClient) Stop() { } func (c *WatchClient) handlePodAdd(obj any) { - observability.RecordPodAdded() + c.telemetryBuilder.OtelsvcK8sPodAdded.Add(context.Background(), 1) if pod, ok := obj.(*api_v1.Pod); ok { c.addOrUpdatePod(pod) } else { c.logger.Error("object received was not of type api_v1.Pod", zap.Any("received", obj)) } podTableSize := len(c.Pods) - observability.RecordPodTableSize(int64(podTableSize)) + c.telemetryBuilder.OtelsvcK8sPodTableSize.Record(context.Background(), int64(podTableSize)) } func (c *WatchClient) handlePodUpdate(_, newPod any) { - observability.RecordPodUpdated() + c.telemetryBuilder.OtelsvcK8sPodUpdated.Add(context.Background(), 1) if pod, ok := newPod.(*api_v1.Pod); ok { // TODO: update or remove based on whether container is ready/unready?. c.addOrUpdatePod(pod) @@ -250,22 +295,22 @@ func (c *WatchClient) handlePodUpdate(_, newPod any) { c.logger.Error("object received was not of type api_v1.Pod", zap.Any("received", newPod)) } podTableSize := len(c.Pods) - observability.RecordPodTableSize(int64(podTableSize)) + c.telemetryBuilder.OtelsvcK8sPodTableSize.Record(context.Background(), int64(podTableSize)) } func (c *WatchClient) handlePodDelete(obj any) { - observability.RecordPodDeleted() + c.telemetryBuilder.OtelsvcK8sPodDeleted.Add(context.Background(), 1) if pod, ok := ignoreDeletedFinalStateUnknown(obj).(*api_v1.Pod); ok { c.forgetPod(pod) } else { c.logger.Error("object received was not of type api_v1.Pod", zap.Any("received", obj)) } podTableSize := len(c.Pods) - observability.RecordPodTableSize(int64(podTableSize)) + c.telemetryBuilder.OtelsvcK8sPodTableSize.Record(context.Background(), int64(podTableSize)) } func (c *WatchClient) handleNamespaceAdd(obj any) { - observability.RecordNamespaceAdded() + c.telemetryBuilder.OtelsvcK8sNamespaceAdded.Add(context.Background(), 1) if namespace, ok := obj.(*api_v1.Namespace); ok { c.addOrUpdateNamespace(namespace) } else { @@ -274,7 +319,7 @@ func (c *WatchClient) handleNamespaceAdd(obj any) { } func (c *WatchClient) handleNamespaceUpdate(_, newNamespace any) { - observability.RecordNamespaceUpdated() + c.telemetryBuilder.OtelsvcK8sNamespaceUpdated.Add(context.Background(), 1) if namespace, ok := newNamespace.(*api_v1.Namespace); ok { c.addOrUpdateNamespace(namespace) } else { @@ -283,7 +328,7 @@ func (c *WatchClient) handleNamespaceUpdate(_, newNamespace any) { } func (c *WatchClient) handleNamespaceDelete(obj any) { - observability.RecordNamespaceDeleted() + c.telemetryBuilder.OtelsvcK8sNamespaceDeleted.Add(context.Background(), 1) if namespace, ok := ignoreDeletedFinalStateUnknown(obj).(*api_v1.Namespace); ok { c.m.Lock() if ns, ok := c.Namespaces[namespace.Name]; ok { @@ -299,7 +344,7 @@ func (c *WatchClient) handleNamespaceDelete(obj any) { } func (c *WatchClient) handleNodeAdd(obj any) { - observability.RecordNodeAdded() + c.telemetryBuilder.OtelsvcK8sNodeAdded.Add(context.Background(), 1) if node, ok := obj.(*api_v1.Node); ok { c.addOrUpdateNode(node) } else { @@ -308,7 +353,7 @@ func (c *WatchClient) handleNodeAdd(obj any) { } func (c *WatchClient) handleNodeUpdate(_, newNode any) { - observability.RecordNodeUpdated() + c.telemetryBuilder.OtelsvcK8sNodeUpdated.Add(context.Background(), 1) if node, ok := newNode.(*api_v1.Node); ok { c.addOrUpdateNode(node) } else { @@ -317,7 +362,7 @@ func (c *WatchClient) handleNodeUpdate(_, newNode any) { } func (c *WatchClient) handleNodeDelete(obj any) { - observability.RecordNodeDeleted() + c.telemetryBuilder.OtelsvcK8sNodeDeleted.Add(context.Background(), 1) if node, ok := ignoreDeletedFinalStateUnknown(obj).(*api_v1.Node); ok { c.m.Lock() if n, ok := c.Nodes[node.Name]; ok { @@ -360,7 +405,7 @@ func (c *WatchClient) deleteLoop(interval time.Duration, gracePeriod time.Durati } } podTableSize := len(c.Pods) - observability.RecordPodTableSize(int64(podTableSize)) + c.telemetryBuilder.OtelsvcK8sPodTableSize.Record(context.Background(), int64(podTableSize)) c.m.Unlock() case <-c.stopCh: @@ -380,7 +425,7 @@ func (c *WatchClient) GetPod(identifier PodIdentifier) (*Pod, bool) { } return pod, ok } - observability.RecordIPLookupMiss() + c.telemetryBuilder.OtelsvcK8sIPLookupMiss.Add(context.Background(), 1) return nil, false } @@ -416,6 +461,10 @@ func (c *WatchClient) extractPodAttributes(pod *api_v1.Pod) map[string]string { tags[tagHostName] = pod.Spec.Hostname } + if c.Rules.PodIP { + tags[K8sIPLabelName] = pod.Status.PodIP + } + if c.Rules.Namespace { tags[conventions.AttributeK8SNamespaceName] = pod.GetNamespace() } @@ -524,7 +573,6 @@ func (c *WatchClient) extractPodAttributes(pod *api_v1.Pod) map[string]string { // This function removes all data from the Pod except what is required by extraction rules and pod association func removeUnnecessaryPodData(pod *api_v1.Pod, rules ExtractionRules) *api_v1.Pod { - // name, namespace, uid, start time and ip are needed for identifying Pods // there's room to optimize this further, it's kept this way for simplicity transformedPod := api_v1.Pod{ @@ -559,24 +607,26 @@ func removeUnnecessaryPodData(pod *api_v1.Pod, rules ExtractionRules) *api_v1.Po } if needContainerAttributes(rules) { + removeUnnecessaryContainerStatus := func(c api_v1.ContainerStatus) api_v1.ContainerStatus { + transformedContainerStatus := api_v1.ContainerStatus{ + Name: c.Name, + ContainerID: c.ContainerID, + RestartCount: c.RestartCount, + } + if rules.ContainerImageRepoDigests { + transformedContainerStatus.ImageID = c.ImageID + } + return transformedContainerStatus + } + for _, containerStatus := range pod.Status.ContainerStatuses { transformedPod.Status.ContainerStatuses = append( - transformedPod.Status.ContainerStatuses, - api_v1.ContainerStatus{ - Name: containerStatus.Name, - ContainerID: containerStatus.ContainerID, - RestartCount: containerStatus.RestartCount, - }, + transformedPod.Status.ContainerStatuses, removeUnnecessaryContainerStatus(containerStatus), ) } for _, containerStatus := range pod.Status.InitContainerStatuses { transformedPod.Status.InitContainerStatuses = append( - transformedPod.Status.InitContainerStatuses, - api_v1.ContainerStatus{ - Name: containerStatus.Name, - ContainerID: containerStatus.ContainerID, - RestartCount: containerStatus.RestartCount, - }, + transformedPod.Status.InitContainerStatuses, removeUnnecessaryContainerStatus(containerStatus), ) } @@ -616,6 +666,30 @@ func removeUnnecessaryPodData(pod *api_v1.Pod, rules ExtractionRules) *api_v1.Po return &transformedPod } +// parseNameAndTagFromImage parses the image name and tag for differently-formatted image names. +// returns "latest" as the default if tag not present. also checks if the image contains a digest. +// if it does, no latest tag is assumed. +func parseNameAndTagFromImage(image string) (name, tag string, err error) { + ref, err := reference.Parse(image) + if err != nil { + return + } + namedRef, ok := ref.(reference.Named) + if !ok { + return "", "", errors.New("cannot retrieve image name") + } + name = namedRef.Name() + if taggedRef, ok := namedRef.(reference.Tagged); ok { + tag = taggedRef.Tag() + } + if tag == "" { + if digestedRef, ok := namedRef.(reference.Digested); !ok || digestedRef.String() == "" { + tag = "latest" + } + } + return +} + func (c *WatchClient) extractPodContainersAttributes(pod *api_v1.Pod) PodContainers { containers := PodContainers{ ByID: map[string]*Container{}, @@ -627,16 +701,14 @@ func (c *WatchClient) extractPodContainersAttributes(pod *api_v1.Pod) PodContain if c.Rules.ContainerImageName || c.Rules.ContainerImageTag { for _, spec := range append(pod.Spec.Containers, pod.Spec.InitContainers...) { container := &Container{} - nameTagSep := strings.LastIndex(spec.Image, ":") - if c.Rules.ContainerImageName { - if nameTagSep > 0 { - container.ImageName = spec.Image[:nameTagSep] - } else { - container.ImageName = spec.Image + name, tag, err := parseNameAndTagFromImage(spec.Image) + if err == nil { + if c.Rules.ContainerImageName { + container.ImageName = name + } + if c.Rules.ContainerImageTag { + container.ImageTag = tag } - } - if c.Rules.ContainerImageTag && nameTagSep > 0 { - container.ImageTag = spec.Image[nameTagSep+1:] } containers.ByName[spec.Name] = container } @@ -657,11 +729,26 @@ func (c *WatchClient) extractPodContainersAttributes(pod *api_v1.Pod) PodContain containerID = parts[1] } containers.ByID[containerID] = container - if c.Rules.ContainerID { + if c.Rules.ContainerID || c.Rules.ContainerImageRepoDigests { if container.Statuses == nil { container.Statuses = map[int]ContainerStatus{} } - container.Statuses[int(apiStatus.RestartCount)] = ContainerStatus{containerID} + containerStatus := ContainerStatus{} + if c.Rules.ContainerID { + containerStatus.ContainerID = containerID + } + + if c.Rules.ContainerImageRepoDigests { + if parsed, err := reference.ParseAnyReference(apiStatus.ImageID); err == nil { + switch parsed.(type) { + case reference.Canonical: + containerStatus.ImageRepoDigest = parsed.String() + default: + } + } + } + + container.Statuses[int(apiStatus.RestartCount)] = containerStatus } } return containers @@ -952,11 +1039,12 @@ func needContainerAttributes(rules ExtractionRules) bool { return rules.ContainerImageName || rules.ContainerName || rules.ContainerImageTag || + rules.ContainerImageRepoDigests || rules.ContainerID } func (c *WatchClient) handleReplicaSetAdd(obj any) { - observability.RecordReplicaSetAdded() + c.telemetryBuilder.OtelsvcK8sReplicasetAdded.Add(context.Background(), 1) if replicaset, ok := obj.(*apps_v1.ReplicaSet); ok { c.addOrUpdateReplicaSet(replicaset) } else { @@ -965,7 +1053,7 @@ func (c *WatchClient) handleReplicaSetAdd(obj any) { } func (c *WatchClient) handleReplicaSetUpdate(_, newRS any) { - observability.RecordReplicaSetUpdated() + c.telemetryBuilder.OtelsvcK8sReplicasetUpdated.Add(context.Background(), 1) if replicaset, ok := newRS.(*apps_v1.ReplicaSet); ok { c.addOrUpdateReplicaSet(replicaset) } else { @@ -974,7 +1062,7 @@ func (c *WatchClient) handleReplicaSetUpdate(_, newRS any) { } func (c *WatchClient) handleReplicaSetDelete(obj any) { - observability.RecordReplicaSetDeleted() + c.telemetryBuilder.OtelsvcK8sReplicasetDeleted.Add(context.Background(), 1) if replicaset, ok := ignoreDeletedFinalStateUnknown(obj).(*apps_v1.ReplicaSet); ok { c.m.Lock() key := string(replicaset.UID) diff --git a/processor/k8sattributesprocessor/internal/kube/client_test.go b/processor/k8sattributesprocessor/internal/kube/client_test.go index e92d47fa3f38..de701f6fd673 100644 --- a/processor/k8sattributesprocessor/internal/kube/client_test.go +++ b/processor/k8sattributesprocessor/internal/kube/client_test.go @@ -11,12 +11,15 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component/componenttest" "go.uber.org/zap" "go.uber.org/zap/zapcore" "go.uber.org/zap/zaptest/observer" apps_v1 "k8s.io/api/apps/v1" api_v1 "k8s.io/api/core/v1" meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/fields" + "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/selection" "k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes/fake" @@ -46,18 +49,18 @@ func newPodIdentifier(from string, name string, value string) PodIdentifier { } func podAddAndUpdateTest(t *testing.T, c *WatchClient, handler func(obj any)) { - assert.Equal(t, 0, len(c.Pods)) + assert.Empty(t, c.Pods) // pod without IP pod := &api_v1.Pod{} handler(pod) - assert.Equal(t, 0, len(c.Pods)) + assert.Empty(t, c.Pods) pod = &api_v1.Pod{} pod.Name = "podA" pod.Status.PodIP = "1.1.1.1" handler(pod) - assert.Equal(t, 2, len(c.Pods)) + assert.Len(t, c.Pods, 2) got := c.Pods[newPodIdentifier("connection", "k8s.pod.ip", "1.1.1.1")] assert.Equal(t, "1.1.1.1", got.Address) assert.Equal(t, "podA", got.Name) @@ -67,7 +70,7 @@ func podAddAndUpdateTest(t *testing.T, c *WatchClient, handler func(obj any)) { pod.Name = "podB" pod.Status.PodIP = "1.1.1.1" handler(pod) - assert.Equal(t, 2, len(c.Pods)) + assert.Len(t, c.Pods, 2) got = c.Pods[newPodIdentifier("connection", "k8s.pod.ip", "1.1.1.1")] assert.Equal(t, "1.1.1.1", got.Address) assert.Equal(t, "podB", got.Name) @@ -78,7 +81,7 @@ func podAddAndUpdateTest(t *testing.T, c *WatchClient, handler func(obj any)) { pod.Status.PodIP = "2.2.2.2" pod.UID = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" handler(pod) - assert.Equal(t, 5, len(c.Pods)) + assert.Len(t, c.Pods, 5) got = c.Pods[newPodIdentifier("connection", "k8s.pod.ip", "2.2.2.2")] assert.Equal(t, "2.2.2.2", got.Address) assert.Equal(t, "podC", got.Name) @@ -87,20 +90,19 @@ func podAddAndUpdateTest(t *testing.T, c *WatchClient, handler func(obj any)) { assert.Equal(t, "2.2.2.2", got.Address) assert.Equal(t, "podC", got.Name) assert.Equal(t, "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", got.PodUID) - } func namespaceAddAndUpdateTest(t *testing.T, c *WatchClient, handler func(obj any)) { - assert.Equal(t, 0, len(c.Namespaces)) + assert.Empty(t, c.Namespaces) namespace := &api_v1.Namespace{} handler(namespace) - assert.Equal(t, 0, len(c.Namespaces)) + assert.Empty(t, c.Namespaces) namespace = &api_v1.Namespace{} namespace.Name = "namespaceA" handler(namespace) - assert.Equal(t, 1, len(c.Namespaces)) + assert.Len(t, c.Namespaces, 1) got := c.Namespaces["namespaceA"] assert.Equal(t, "namespaceA", got.Name) assert.Equal(t, "", got.NamespaceUID) @@ -109,23 +111,23 @@ func namespaceAddAndUpdateTest(t *testing.T, c *WatchClient, handler func(obj an namespace.Name = "namespaceB" namespace.UID = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" handler(namespace) - assert.Equal(t, 2, len(c.Namespaces)) + assert.Len(t, c.Namespaces, 2) got = c.Namespaces["namespaceB"] assert.Equal(t, "namespaceB", got.Name) assert.Equal(t, "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", got.NamespaceUID) } func nodeAddAndUpdateTest(t *testing.T, c *WatchClient, handler func(obj any)) { - assert.Equal(t, 0, len(c.Nodes)) + assert.Empty(t, c.Nodes) node := &api_v1.Node{} handler(node) - assert.Equal(t, 0, len(c.Nodes)) + assert.Empty(t, c.Nodes) node = &api_v1.Node{} node.Name = "nodeA" handler(node) - assert.Equal(t, 1, len(c.Nodes)) + assert.Len(t, c.Nodes, 1) got, ok := c.GetNode("nodeA") assert.True(t, ok) assert.Equal(t, "nodeA", got.Name) @@ -135,7 +137,7 @@ func nodeAddAndUpdateTest(t *testing.T, c *WatchClient, handler func(obj any)) { node.Name = "nodeB" node.UID = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" handler(node) - assert.Equal(t, 2, len(c.Nodes)) + assert.Len(t, c.Nodes, 2) got, ok = c.GetNode("nodeB") assert.True(t, ok) assert.Equal(t, "nodeB", got.Name) @@ -143,29 +145,17 @@ func nodeAddAndUpdateTest(t *testing.T, c *WatchClient, handler func(obj any)) { } func TestDefaultClientset(t *testing.T) { - c, err := New(zap.NewNop(), k8sconfig.APIConfig{}, ExtractionRules{}, Filters{}, []Association{}, Excludes{}, nil, nil, nil, nil) - assert.Error(t, err) - assert.Equal(t, "invalid authType for kubernetes: ", err.Error()) + c, err := New(componenttest.NewNopTelemetrySettings(), k8sconfig.APIConfig{}, ExtractionRules{}, Filters{}, []Association{}, Excludes{}, nil, nil, nil, nil, false, 10*time.Second) + require.EqualError(t, err, "invalid authType for kubernetes: ") assert.Nil(t, c) - c, err = New(zap.NewNop(), k8sconfig.APIConfig{}, ExtractionRules{}, Filters{}, []Association{}, Excludes{}, newFakeAPIClientset, nil, nil, nil) + c, err = New(componenttest.NewNopTelemetrySettings(), k8sconfig.APIConfig{}, ExtractionRules{}, Filters{}, []Association{}, Excludes{}, newFakeAPIClientset, nil, nil, nil, false, 10*time.Second) assert.NoError(t, err) assert.NotNil(t, c) } func TestBadFilters(t *testing.T) { - c, err := New( - zap.NewNop(), - k8sconfig.APIConfig{}, - ExtractionRules{}, - Filters{Fields: []FieldFilter{{Op: selection.Exists}}}, - []Association{}, - Excludes{}, - newFakeAPIClientset, - NewFakeInformer, - NewFakeNamespaceInformer, - NewFakeReplicaSetInformer, - ) + c, err := New(componenttest.NewNopTelemetrySettings(), k8sconfig.APIConfig{}, ExtractionRules{}, Filters{Fields: []FieldFilter{{Op: selection.Exists}}}, []Association{}, Excludes{}, newFakeAPIClientset, NewFakeInformer, NewFakeNamespaceInformer, NewFakeReplicaSetInformer, false, 10*time.Second) assert.Error(t, err) assert.Nil(t, c) } @@ -180,7 +170,7 @@ func TestClientStartStop(t *testing.T) { done := make(chan struct{}) assert.False(t, fctr.HasStopped()) go func() { - c.Start() + assert.NoError(t, c.Start()) close(done) }() c.Stop() @@ -201,10 +191,9 @@ func TestConstructorErrors(t *testing.T) { gotAPIConfig = c return nil, fmt.Errorf("error creating k8s client") } - c, err := New(zap.NewNop(), apiCfg, er, ff, []Association{}, Excludes{}, clientProvider, NewFakeInformer, NewFakeNamespaceInformer, nil) + c, err := New(componenttest.NewNopTelemetrySettings(), apiCfg, er, ff, []Association{}, Excludes{}, clientProvider, NewFakeInformer, NewFakeNamespaceInformer, nil, false, 10*time.Second) assert.Nil(t, c) - assert.Error(t, err) - assert.Equal(t, "error creating k8s client", err.Error()) + require.EqualError(t, err, "error creating k8s client") assert.Equal(t, apiCfg, gotAPIConfig) }) } @@ -226,11 +215,11 @@ func TestNodeAdd(t *testing.T) { func TestReplicaSetHandler(t *testing.T) { c, _ := newTestClient(t) - assert.Equal(t, len(c.ReplicaSets), 0) + assert.Empty(t, c.ReplicaSets) replicaset := &apps_v1.ReplicaSet{} c.handleReplicaSetAdd(replicaset) - assert.Equal(t, len(c.ReplicaSets), 0) + assert.Empty(t, c.ReplicaSets) // test add replicaset replicaset = &apps_v1.ReplicaSet{} @@ -255,46 +244,45 @@ func TestReplicaSetHandler(t *testing.T) { }, } c.handleReplicaSetAdd(replicaset) - assert.Equal(t, len(c.ReplicaSets), 1) + assert.Len(t, c.ReplicaSets, 1) got := c.ReplicaSets[string(replicaset.UID)] - assert.Equal(t, got.Name, "deployment-aaa") - assert.Equal(t, got.Namespace, "namespaceA") - assert.Equal(t, got.UID, "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee") - assert.Equal(t, got.Deployment, Deployment{ + assert.Equal(t, "deployment-aaa", got.Name) + assert.Equal(t, "namespaceA", got.Namespace) + assert.Equal(t, "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", got.UID) + assert.Equal(t, Deployment{ Name: "deployment", UID: "ffffffff-gggg-hhhh-iiii-jjjjjjjjjjj", - }) + }, got.Deployment) // test update replicaset updatedReplicaset := replicaset updatedReplicaset.ResourceVersion = "444444" c.handleReplicaSetUpdate(replicaset, updatedReplicaset) - assert.Equal(t, len(c.ReplicaSets), 1) + assert.Len(t, c.ReplicaSets, 1) got = c.ReplicaSets[string(replicaset.UID)] - assert.Equal(t, got.Name, "deployment-aaa") - assert.Equal(t, got.Namespace, "namespaceA") - assert.Equal(t, got.UID, "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee") - assert.Equal(t, got.Deployment, Deployment{ + assert.Equal(t, "deployment-aaa", got.Name) + assert.Equal(t, "namespaceA", got.Namespace) + assert.Equal(t, "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", got.UID) + assert.Equal(t, Deployment{ Name: "deployment", UID: "ffffffff-gggg-hhhh-iiii-jjjjjjjjjjj", - }) + }, got.Deployment) // test delete replicaset c.handleReplicaSetDelete(updatedReplicaset) - assert.Equal(t, len(c.ReplicaSets), 0) + assert.Empty(t, c.ReplicaSets) // test delete replicaset when DeletedFinalStateUnknown c.handleReplicaSetAdd(replicaset) - require.Equal(t, len(c.ReplicaSets), 1) + require.Len(t, c.ReplicaSets, 1) c.handleReplicaSetDelete(cache.DeletedFinalStateUnknown{ Obj: replicaset, }) - assert.Equal(t, len(c.ReplicaSets), 0) - + assert.Empty(t, c.ReplicaSets) } func TestPodHostNetwork(t *testing.T) { c, _ := newTestClient(t) - assert.Equal(t, 0, len(c.Pods)) + assert.Empty(t, c.Pods) // pod will not be added if no rule matches pod := &api_v1.Pod{} @@ -302,7 +290,7 @@ func TestPodHostNetwork(t *testing.T) { pod.Status.PodIP = "1.1.1.1" pod.Spec.HostNetwork = true c.handlePodAdd(pod) - assert.Equal(t, 0, len(c.Pods)) + assert.Empty(t, c.Pods) // pod will be added if rule matches pod.Name = "podB" @@ -310,7 +298,7 @@ func TestPodHostNetwork(t *testing.T) { pod.UID = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" pod.Spec.HostNetwork = true c.handlePodAdd(pod) - assert.Equal(t, 1, len(c.Pods)) + assert.Len(t, c.Pods, 1) got := c.Pods[newPodIdentifier("resource_attribute", "k8s.pod.uid", "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")] assert.Equal(t, "2.2.2.2", got.Address) assert.Equal(t, "podB", got.Name) @@ -322,14 +310,14 @@ func TestPodHostNetwork(t *testing.T) { // correctly func TestPodCreate(t *testing.T) { c, _ := newTestClient(t) - assert.Equal(t, 0, len(c.Pods)) + assert.Empty(t, c.Pods) // pod is created in Pending phase. At this point it has a UID but no start time or pod IP address pod := &api_v1.Pod{} pod.Name = "podD" pod.UID = "11111111-2222-3333-4444-555555555555" c.handlePodAdd(pod) - assert.Equal(t, 1, len(c.Pods)) + assert.Len(t, c.Pods, 1) got := c.Pods[newPodIdentifier("resource_attribute", "k8s.pod.uid", "11111111-2222-3333-4444-555555555555")] assert.Equal(t, "", got.Address) assert.Equal(t, "podD", got.Name) @@ -340,7 +328,7 @@ func TestPodCreate(t *testing.T) { startTime := meta_v1.NewTime(time.Now()) pod.Status.StartTime = &startTime c.handlePodUpdate(&api_v1.Pod{}, pod) - assert.Equal(t, 1, len(c.Pods)) + assert.Len(t, c.Pods, 1) got = c.Pods[newPodIdentifier("resource_attribute", "k8s.pod.uid", "11111111-2222-3333-4444-555555555555")] assert.Equal(t, "", got.Address) assert.Equal(t, "podD", got.Name) @@ -349,7 +337,7 @@ func TestPodCreate(t *testing.T) { // pod is Running and has an IP address pod.Status.PodIP = "3.3.3.3" c.handlePodUpdate(&api_v1.Pod{}, pod) - assert.Equal(t, 3, len(c.Pods)) + assert.Len(t, c.Pods, 3) got = c.Pods[newPodIdentifier("resource_attribute", "k8s.pod.uid", "11111111-2222-3333-4444-555555555555")] assert.Equal(t, "3.3.3.3", got.Address) assert.Equal(t, "podD", got.Name) @@ -376,7 +364,7 @@ func TestPodAddOutOfSync(t *testing.T) { }, }, }) - assert.Equal(t, 0, len(c.Pods)) + assert.Empty(t, c.Pods) pod := &api_v1.Pod{} pod.Name = "podA" @@ -384,7 +372,7 @@ func TestPodAddOutOfSync(t *testing.T) { startTime := meta_v1.NewTime(time.Now()) pod.Status.StartTime = &startTime c.handlePodAdd(pod) - assert.Equal(t, 3, len(c.Pods)) + assert.Len(t, c.Pods, 3) got := c.Pods[newPodIdentifier("connection", "k8s.pod.ip", "1.1.1.1")] assert.Equal(t, "1.1.1.1", got.Address) assert.Equal(t, "podA", got.Name) @@ -398,7 +386,7 @@ func TestPodAddOutOfSync(t *testing.T) { startTime2 := meta_v1.NewTime(time.Now().Add(-time.Second * 10)) pod2.Status.StartTime = &startTime2 c.handlePodAdd(pod2) - assert.Equal(t, 4, len(c.Pods)) + assert.Len(t, c.Pods, 4) got = c.Pods[newPodIdentifier("connection", "k8s.pod.ip", "1.1.1.1")] assert.Equal(t, "1.1.1.1", got.Address) assert.Equal(t, "podA", got.Name) @@ -434,7 +422,7 @@ func TestNodeUpdate(t *testing.T) { func TestPodDelete(t *testing.T) { c, _ := newTestClient(t) podAddAndUpdateTest(t, c, c.handlePodAdd) - assert.Equal(t, 5, len(c.Pods)) + assert.Len(t, c.Pods, 5) assert.Equal(t, "1.1.1.1", c.Pods[newPodIdentifier("connection", "k8s.pod.ip", "1.1.1.1")].Address) // delete empty IP pod @@ -445,10 +433,10 @@ func TestPodDelete(t *testing.T) { pod := &api_v1.Pod{} pod.Status.PodIP = "9.9.9.9" c.handlePodDelete(pod) - assert.Equal(t, 5, len(c.Pods)) + assert.Len(t, c.Pods, 5) got := c.Pods[newPodIdentifier("connection", "k8s.pod.ip", "1.1.1.1")] assert.Equal(t, "1.1.1.1", got.Address) - assert.Equal(t, 0, len(c.deleteQueue)) + assert.Empty(t, c.deleteQueue) // delete matching IP with wrong name/different pod c.deleteQueue = c.deleteQueue[:0] @@ -456,9 +444,9 @@ func TestPodDelete(t *testing.T) { pod.Status.PodIP = "1.1.1.1" c.handlePodDelete(pod) got = c.Pods[newPodIdentifier("connection", "k8s.pod.ip", "1.1.1.1")] - assert.Equal(t, 5, len(c.Pods)) + assert.Len(t, c.Pods, 5) assert.Equal(t, "1.1.1.1", got.Address) - assert.Equal(t, 0, len(c.deleteQueue)) + assert.Empty(t, c.deleteQueue) // delete matching IP and name c.deleteQueue = c.deleteQueue[:0] @@ -467,8 +455,8 @@ func TestPodDelete(t *testing.T) { pod.Status.PodIP = "1.1.1.1" tsBeforeDelete := time.Now() c.handlePodDelete(pod) - assert.Equal(t, 5, len(c.Pods)) - assert.Equal(t, 3, len(c.deleteQueue)) + assert.Len(t, c.Pods, 5) + assert.Len(t, c.deleteQueue, 3) deleteRequest := c.deleteQueue[0] assert.Equal(t, newPodIdentifier("connection", "k8s.pod.ip", "1.1.1.1"), deleteRequest.id) assert.Equal(t, "podB", deleteRequest.podName) @@ -483,8 +471,8 @@ func TestPodDelete(t *testing.T) { pod.UID = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" tsBeforeDelete = time.Now() c.handlePodDelete(cache.DeletedFinalStateUnknown{Obj: pod}) - assert.Equal(t, 5, len(c.Pods)) - assert.Equal(t, 5, len(c.deleteQueue)) + assert.Len(t, c.Pods, 5) + assert.Len(t, c.deleteQueue, 5) deleteRequest = c.deleteQueue[0] assert.Equal(t, newPodIdentifier("connection", "k8s.pod.ip", "2.2.2.2"), deleteRequest.id) assert.Equal(t, "podC", deleteRequest.podName) @@ -500,7 +488,7 @@ func TestPodDelete(t *testing.T) { func TestNamespaceDelete(t *testing.T) { c, _ := newTestClient(t) namespaceAddAndUpdateTest(t, c, c.handleNamespaceAdd) - assert.Equal(t, 2, len(c.Namespaces)) + assert.Len(t, c.Namespaces, 2) assert.Equal(t, "namespaceA", c.Namespaces["namespaceA"].Name) // delete empty namespace @@ -510,32 +498,32 @@ func TestNamespaceDelete(t *testing.T) { namespace := &api_v1.Namespace{} namespace.Name = "namespaceC" c.handleNamespaceDelete(namespace) - assert.Equal(t, 2, len(c.Namespaces)) + assert.Len(t, c.Namespaces, 2) got := c.Namespaces["namespaceA"] assert.Equal(t, "namespaceA", got.Name) // delete non-existent namespace when DeletedFinalStateUnknown c.handleNamespaceDelete(cache.DeletedFinalStateUnknown{Obj: namespace}) - assert.Equal(t, 2, len(c.Namespaces)) + assert.Len(t, c.Namespaces, 2) got = c.Namespaces["namespaceA"] assert.Equal(t, "namespaceA", got.Name) // delete namespace A namespace.Name = "namespaceA" c.handleNamespaceDelete(namespace) - assert.Equal(t, 1, len(c.Namespaces)) + assert.Len(t, c.Namespaces, 1) got = c.Namespaces["namespaceB"] assert.Equal(t, "namespaceB", got.Name) // delete namespace B when DeletedFinalStateUnknown namespace.Name = "namespaceB" c.handleNamespaceDelete(cache.DeletedFinalStateUnknown{Obj: namespace}) - assert.Equal(t, 0, len(c.Namespaces)) + assert.Empty(t, c.Namespaces) } func TestNodeDelete(t *testing.T) { c, _ := newTestClient(t) nodeAddAndUpdateTest(t, c, c.handleNodeAdd) - assert.Equal(t, 2, len(c.Nodes)) + assert.Len(t, c.Nodes, 2) assert.Equal(t, "nodeA", c.Nodes["nodeA"].Name) // delete empty node @@ -545,32 +533,32 @@ func TestNodeDelete(t *testing.T) { node := &api_v1.Node{} node.Name = "nodeC" c.handleNodeDelete(node) - assert.Equal(t, 2, len(c.Nodes)) + assert.Len(t, c.Nodes, 2) got := c.Nodes["nodeA"] assert.Equal(t, "nodeA", got.Name) // delete non-existent namespace when DeletedFinalStateUnknown c.handleNodeDelete(cache.DeletedFinalStateUnknown{Obj: node}) - assert.Equal(t, 2, len(c.Nodes)) + assert.Len(t, c.Nodes, 2) got = c.Nodes["nodeA"] assert.Equal(t, "nodeA", got.Name) // delete node A node.Name = "nodeA" c.handleNodeDelete(node) - assert.Equal(t, 1, len(c.Nodes)) + assert.Len(t, c.Nodes, 1) got = c.Nodes["nodeB"] assert.Equal(t, "nodeB", got.Name) // delete node B when DeletedFinalStateUnknown node.Name = "nodeB" c.handleNodeDelete(cache.DeletedFinalStateUnknown{Obj: node}) - assert.Equal(t, 0, len(c.Nodes)) + assert.Empty(t, c.Nodes) } func TestDeleteQueue(t *testing.T) { c, _ := newTestClient(t) podAddAndUpdateTest(t, c, c.handlePodAdd) - assert.Equal(t, 5, len(c.Pods)) + assert.Len(t, c.Pods, 5) assert.Equal(t, "1.1.1.1", c.Pods[newPodIdentifier("connection", "k8s.pod.ip", "1.1.1.1")].Address) // delete pod @@ -578,8 +566,8 @@ func TestDeleteQueue(t *testing.T) { pod.Name = "podB" pod.Status.PodIP = "1.1.1.1" c.handlePodDelete(pod) - assert.Equal(t, 5, len(c.Pods)) - assert.Equal(t, 3, len(c.deleteQueue)) + assert.Len(t, c.Pods, 5) + assert.Len(t, c.deleteQueue, 3) } func TestDeleteLoop(t *testing.T) { @@ -589,30 +577,30 @@ func TestDeleteLoop(t *testing.T) { pod := &api_v1.Pod{} pod.Status.PodIP = "1.1.1.1" c.handlePodAdd(pod) - assert.Equal(t, 2, len(c.Pods)) - assert.Equal(t, 0, len(c.deleteQueue)) + assert.Len(t, c.Pods, 2) + assert.Empty(t, c.deleteQueue) c.handlePodDelete(pod) - assert.Equal(t, 2, len(c.Pods)) - assert.Equal(t, 3, len(c.deleteQueue)) + assert.Len(t, c.Pods, 2) + assert.Len(t, c.deleteQueue, 3) gracePeriod := time.Millisecond * 500 go c.deleteLoop(time.Millisecond, gracePeriod) go func() { time.Sleep(time.Millisecond * 50) c.m.Lock() - assert.Equal(t, 2, len(c.Pods)) + assert.Len(t, c.Pods, 2) c.m.Unlock() c.deleteMut.Lock() - assert.Equal(t, 3, len(c.deleteQueue)) + assert.Len(t, c.deleteQueue, 3) c.deleteMut.Unlock() time.Sleep(gracePeriod + (time.Millisecond * 50)) c.m.Lock() - assert.Equal(t, 0, len(c.Pods)) + assert.Empty(t, c.Pods) c.m.Unlock() c.deleteMut.Lock() - assert.Equal(t, 0, len(c.deleteQueue)) + assert.Empty(t, c.deleteQueue) c.deleteMut.Unlock() close(c.stopCh) }() @@ -718,176 +706,197 @@ func TestExtractionRules(t *testing.T) { name string rules ExtractionRules attributes map[string]string - }{{ - name: "no-rules", - rules: ExtractionRules{}, - attributes: nil, - }, { - name: "deployment", - rules: ExtractionRules{ - DeploymentName: true, - DeploymentUID: true, - }, - attributes: map[string]string{ - "k8s.deployment.name": "auth-service", - "k8s.deployment.uid": "ffff-gggg-hhhh-iiii-eeeeeeeeeeee", - }, - }, { - name: "replicasetId", - rules: ExtractionRules{ - ReplicaSetID: true, - }, - attributes: map[string]string{ - "k8s.replicaset.uid": "207ea729-c779-401d-8347-008ecbc137e3", - }, - }, { - name: "replicasetName", - rules: ExtractionRules{ - ReplicaSetName: true, - }, - attributes: map[string]string{ - "k8s.replicaset.name": "auth-service-66f5996c7c", - }, - }, { - name: "daemonsetUID", - rules: ExtractionRules{ - DaemonSetUID: true, - }, - attributes: map[string]string{ - "k8s.daemonset.uid": "c94d3814-2253-427a-ab13-2cf609e4dafa", - }, - }, { - name: "daemonsetName", - rules: ExtractionRules{ - DaemonSetName: true, - }, - attributes: map[string]string{ - "k8s.daemonset.name": "auth-daemonset", - }, - }, { - name: "jobUID", - rules: ExtractionRules{ - JobUID: true, - }, - attributes: map[string]string{ - "k8s.job.uid": "59f27ac1-5c71-42e5-abe9-2c499d603706", - }, - }, { - name: "jobName", - rules: ExtractionRules{ - JobName: true, - }, - attributes: map[string]string{ - "k8s.job.name": "auth-cronjob-27667920", - }, - }, { - name: "cronJob", - rules: ExtractionRules{ - CronJobName: true, + }{ + { + name: "no-rules", + rules: ExtractionRules{}, + attributes: nil, }, - attributes: map[string]string{ - "k8s.cronjob.name": "auth-cronjob", + { + name: "deployment", + rules: ExtractionRules{ + DeploymentName: true, + DeploymentUID: true, + }, + attributes: map[string]string{ + "k8s.deployment.name": "auth-service", + "k8s.deployment.uid": "ffff-gggg-hhhh-iiii-eeeeeeeeeeee", + }, }, - }, { - name: "statefulsetUID", - rules: ExtractionRules{ - StatefulSetUID: true, + { + name: "replicasetId", + rules: ExtractionRules{ + ReplicaSetID: true, + }, + attributes: map[string]string{ + "k8s.replicaset.uid": "207ea729-c779-401d-8347-008ecbc137e3", + }, }, - attributes: map[string]string{ - "k8s.statefulset.uid": "03755eb1-6175-47d5-afd5-05cfc30244d7", + { + name: "replicasetName", + rules: ExtractionRules{ + ReplicaSetName: true, + }, + attributes: map[string]string{ + "k8s.replicaset.name": "auth-service-66f5996c7c", + }, }, - }, { - name: "jobName", - rules: ExtractionRules{ - StatefulSetName: true, + { + name: "daemonsetUID", + rules: ExtractionRules{ + DaemonSetUID: true, + }, + attributes: map[string]string{ + "k8s.daemonset.uid": "c94d3814-2253-427a-ab13-2cf609e4dafa", + }, }, - attributes: map[string]string{ - "k8s.statefulset.name": "pi-statefulset", + { + name: "daemonsetName", + rules: ExtractionRules{ + DaemonSetName: true, + }, + attributes: map[string]string{ + "k8s.daemonset.name": "auth-daemonset", + }, }, - }, { - name: "metadata", - rules: ExtractionRules{ - DeploymentName: true, - DeploymentUID: true, - Namespace: true, - PodName: true, - PodUID: true, - PodHostName: true, - Node: true, - StartTime: true, + { + name: "jobUID", + rules: ExtractionRules{ + JobUID: true, + }, + attributes: map[string]string{ + "k8s.job.uid": "59f27ac1-5c71-42e5-abe9-2c499d603706", + }, }, - attributes: map[string]string{ - "k8s.deployment.name": "auth-service", - "k8s.deployment.uid": "ffff-gggg-hhhh-iiii-eeeeeeeeeeee", - "k8s.namespace.name": "ns1", - "k8s.node.name": "node1", - "k8s.pod.name": "auth-service-abc12-xyz3", - "k8s.pod.hostname": "host1", - "k8s.pod.uid": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", - "k8s.pod.start_time": func() string { - b, err := pod.GetCreationTimestamp().MarshalText() - require.NoError(t, err) - return string(b) - }(), + { + name: "jobName", + rules: ExtractionRules{ + JobName: true, + }, + attributes: map[string]string{ + "k8s.job.name": "auth-cronjob-27667920", + }, }, - }, { - name: "labels", - rules: ExtractionRules{ - Annotations: []FieldExtractionRule{{ - Name: "a1", - Key: "annotation1", - From: MetadataFromPod, + { + name: "cronJob", + rules: ExtractionRules{ + CronJobName: true, }, + attributes: map[string]string{ + "k8s.cronjob.name": "auth-cronjob", }, - Labels: []FieldExtractionRule{{ - Name: "l1", - Key: "label1", - From: MetadataFromPod, - }, { - Name: "l2", - Key: "label2", - Regex: regexp.MustCompile(`k5=(?P[^\s]+)`), - From: MetadataFromPod, + }, + { + name: "statefulsetUID", + rules: ExtractionRules{ + StatefulSetUID: true, }, + attributes: map[string]string{ + "k8s.statefulset.uid": "03755eb1-6175-47d5-afd5-05cfc30244d7", }, }, - attributes: map[string]string{ - "l1": "lv1", - "l2": "v5", - "a1": "av1", + { + name: "jobName", + rules: ExtractionRules{ + StatefulSetName: true, + }, + attributes: map[string]string{ + "k8s.statefulset.name": "pi-statefulset", + }, }, - }, { - // By default if the From field is not set for labels and annotations we want to extract them from pod - name: "labels-annotations-default-pod", - rules: ExtractionRules{ - Annotations: []FieldExtractionRule{{ - Name: "a1", - Key: "annotation1", + { + name: "metadata", + rules: ExtractionRules{ + DeploymentName: true, + DeploymentUID: true, + Namespace: true, + PodName: true, + PodUID: true, + PodHostName: true, + PodIP: true, + Node: true, + StartTime: true, }, + attributes: map[string]string{ + "k8s.deployment.name": "auth-service", + "k8s.deployment.uid": "ffff-gggg-hhhh-iiii-eeeeeeeeeeee", + "k8s.namespace.name": "ns1", + "k8s.node.name": "node1", + "k8s.pod.name": "auth-service-abc12-xyz3", + "k8s.pod.hostname": "host1", + "k8s.pod.uid": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", + "k8s.pod.ip": "1.1.1.1", + "k8s.pod.start_time": func() string { + b, err := pod.GetCreationTimestamp().MarshalText() + require.NoError(t, err) + return string(b) + }(), }, - Labels: []FieldExtractionRule{{ - Name: "l1", - Key: "label1", - }, { - Name: "l2", - Key: "label2", - Regex: regexp.MustCompile(`k5=(?P[^\s]+)`), + }, + { + name: "labels", + rules: ExtractionRules{ + Annotations: []FieldExtractionRule{ + { + Name: "a1", + Key: "annotation1", + From: MetadataFromPod, + }, + }, + Labels: []FieldExtractionRule{ + { + Name: "l1", + Key: "label1", + From: MetadataFromPod, + }, { + Name: "l2", + Key: "label2", + Regex: regexp.MustCompile(`k5=(?P[^\s]+)`), + From: MetadataFromPod, + }, + }, }, + attributes: map[string]string{ + "l1": "lv1", + "l2": "v5", + "a1": "av1", }, }, - attributes: map[string]string{ - "l1": "lv1", - "l2": "v5", - "a1": "av1", + { + // By default if the From field is not set for labels and annotations we want to extract them from pod + name: "labels-annotations-default-pod", + rules: ExtractionRules{ + Annotations: []FieldExtractionRule{ + { + Name: "a1", + Key: "annotation1", + }, + }, + Labels: []FieldExtractionRule{ + { + Name: "l1", + Key: "label1", + }, { + Name: "l2", + Key: "label2", + Regex: regexp.MustCompile(`k5=(?P[^\s]+)`), + }, + }, + }, + attributes: map[string]string{ + "l1": "lv1", + "l2": "v5", + "a1": "av1", + }, }, - }, { name: "all-labels", rules: ExtractionRules{ - Labels: []FieldExtractionRule{{ - KeyRegex: regexp.MustCompile("^(?:la.*)$"), - From: MetadataFromPod, - }, + Labels: []FieldExtractionRule{ + { + KeyRegex: regexp.MustCompile("^(?:la.*)$"), + From: MetadataFromPod, + }, }, }, attributes: map[string]string{ @@ -898,10 +907,11 @@ func TestExtractionRules(t *testing.T) { { name: "all-annotations", rules: ExtractionRules{ - Annotations: []FieldExtractionRule{{ - KeyRegex: regexp.MustCompile("^(?:an.*)$"), - From: MetadataFromPod, - }, + Annotations: []FieldExtractionRule{ + { + KeyRegex: regexp.MustCompile("^(?:an.*)$"), + From: MetadataFromPod, + }, }, }, attributes: map[string]string{ @@ -911,10 +921,11 @@ func TestExtractionRules(t *testing.T) { { name: "all-annotations-not-match", rules: ExtractionRules{ - Annotations: []FieldExtractionRule{{ - KeyRegex: regexp.MustCompile("^(?:an*)$"), - From: MetadataFromPod, - }, + Annotations: []FieldExtractionRule{ + { + KeyRegex: regexp.MustCompile("^(?:an*)$"), + From: MetadataFromPod, + }, }, }, attributes: map[string]string{}, @@ -922,12 +933,13 @@ func TestExtractionRules(t *testing.T) { { name: "captured-groups", rules: ExtractionRules{ - Annotations: []FieldExtractionRule{{ - Name: "$1", - KeyRegex: regexp.MustCompile(`^(?:annotation(\d+))$`), - HasKeyRegexReference: true, - From: MetadataFromPod, - }, + Annotations: []FieldExtractionRule{ + { + Name: "$1", + KeyRegex: regexp.MustCompile(`^(?:annotation(\d+))$`), + HasKeyRegexReference: true, + From: MetadataFromPod, + }, }, }, attributes: map[string]string{ @@ -937,12 +949,13 @@ func TestExtractionRules(t *testing.T) { { name: "captured-groups-$0", rules: ExtractionRules{ - Annotations: []FieldExtractionRule{{ - Name: "prefix-$0", - KeyRegex: regexp.MustCompile(`^(?:annotation(\d+))$`), - HasKeyRegexReference: true, - From: MetadataFromPod, - }, + Annotations: []FieldExtractionRule{ + { + Name: "prefix-$0", + KeyRegex: regexp.MustCompile(`^(?:annotation(\d+))$`), + HasKeyRegexReference: true, + From: MetadataFromPod, + }, }, }, attributes: map[string]string{ @@ -1023,86 +1036,87 @@ func TestReplicaSetExtractionRules(t *testing.T) { rules ExtractionRules ownerReferences []meta_v1.OwnerReference attributes map[string]string - }{{ - name: "no-rules", - rules: ExtractionRules{}, - attributes: nil, - }, { - name: "one_deployment_is_controller", - ownerReferences: []meta_v1.OwnerReference{ - { - Name: "auth-service", - Kind: "Deployment", - UID: "ffff-gggg-hhhh-iiii-eeeeeeeeeeee", - Controller: &isController, + }{ + { + name: "no-rules", + rules: ExtractionRules{}, + attributes: nil, + }, { + name: "one_deployment_is_controller", + ownerReferences: []meta_v1.OwnerReference{ + { + Name: "auth-service", + Kind: "Deployment", + UID: "ffff-gggg-hhhh-iiii-eeeeeeeeeeee", + Controller: &isController, + }, }, - }, - rules: ExtractionRules{ - DeploymentName: true, - DeploymentUID: true, - ReplicaSetID: true, - }, - attributes: map[string]string{ - "k8s.replicaset.uid": "207ea729-c779-401d-8347-008ecbc137e3", - "k8s.deployment.name": "auth-service", - "k8s.deployment.uid": "ffff-gggg-hhhh-iiii-eeeeeeeeeeee", - }, - }, { - name: "one_deployment_is_controller_another_deployment_is_not_controller", - ownerReferences: []meta_v1.OwnerReference{ - { - Name: "auth-service", - Kind: "Deployment", - UID: "ffff-gggg-hhhh-iiii-eeeeeeeeeeee", - Controller: &isController, + rules: ExtractionRules{ + DeploymentName: true, + DeploymentUID: true, + ReplicaSetID: true, }, - { - Name: "auth-service-not-controller", - Kind: "Deployment", - UID: "kkkk-gggg-hhhh-iiii-eeeeeeeeeeee", - Controller: &isNotController, + attributes: map[string]string{ + "k8s.replicaset.uid": "207ea729-c779-401d-8347-008ecbc137e3", + "k8s.deployment.name": "auth-service", + "k8s.deployment.uid": "ffff-gggg-hhhh-iiii-eeeeeeeeeeee", }, - }, - rules: ExtractionRules{ - ReplicaSetID: true, - DeploymentName: true, - DeploymentUID: true, - }, - attributes: map[string]string{ - "k8s.replicaset.uid": "207ea729-c779-401d-8347-008ecbc137e3", - "k8s.deployment.name": "auth-service", - "k8s.deployment.uid": "ffff-gggg-hhhh-iiii-eeeeeeeeeeee", - }, - }, { - name: "one_deployment_is_not_controller", - ownerReferences: []meta_v1.OwnerReference{ - { - Name: "auth-service", - Kind: "Deployment", - UID: "ffff-gggg-hhhh-iiii-eeeeeeeeeeee", - Controller: &isNotController, + }, { + name: "one_deployment_is_controller_another_deployment_is_not_controller", + ownerReferences: []meta_v1.OwnerReference{ + { + Name: "auth-service", + Kind: "Deployment", + UID: "ffff-gggg-hhhh-iiii-eeeeeeeeeeee", + Controller: &isController, + }, + { + Name: "auth-service-not-controller", + Kind: "Deployment", + UID: "kkkk-gggg-hhhh-iiii-eeeeeeeeeeee", + Controller: &isNotController, + }, + }, + rules: ExtractionRules{ + ReplicaSetID: true, + DeploymentName: true, + DeploymentUID: true, + }, + attributes: map[string]string{ + "k8s.replicaset.uid": "207ea729-c779-401d-8347-008ecbc137e3", + "k8s.deployment.name": "auth-service", + "k8s.deployment.uid": "ffff-gggg-hhhh-iiii-eeeeeeeeeeee", + }, + }, { + name: "one_deployment_is_not_controller", + ownerReferences: []meta_v1.OwnerReference{ + { + Name: "auth-service", + Kind: "Deployment", + UID: "ffff-gggg-hhhh-iiii-eeeeeeeeeeee", + Controller: &isNotController, + }, + }, + rules: ExtractionRules{ + ReplicaSetID: true, + DeploymentName: true, + DeploymentUID: true, + }, + attributes: map[string]string{ + "k8s.replicaset.uid": "207ea729-c779-401d-8347-008ecbc137e3", + }, + }, { + name: "no_deployment", + ownerReferences: []meta_v1.OwnerReference{}, + rules: ExtractionRules{ + ReplicaSetID: true, + DeploymentName: true, + DeploymentUID: true, + }, + attributes: map[string]string{ + "k8s.replicaset.uid": "207ea729-c779-401d-8347-008ecbc137e3", }, }, - rules: ExtractionRules{ - ReplicaSetID: true, - DeploymentName: true, - DeploymentUID: true, - }, - attributes: map[string]string{ - "k8s.replicaset.uid": "207ea729-c779-401d-8347-008ecbc137e3", - }, - }, { - name: "no_deployment", - ownerReferences: []meta_v1.OwnerReference{}, - rules: ExtractionRules{ - ReplicaSetID: true, - DeploymentName: true, - DeploymentUID: true, - }, - attributes: map[string]string{ - "k8s.replicaset.uid": "207ea729-c779-401d-8347-008ecbc137e3", - }, - }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { @@ -1149,38 +1163,43 @@ func TestNamespaceExtractionRules(t *testing.T) { name string rules ExtractionRules attributes map[string]string - }{{ - name: "no-rules", - rules: ExtractionRules{}, - attributes: nil, - }, { - name: "labels", - rules: ExtractionRules{ - Annotations: []FieldExtractionRule{{ - Name: "a1", - Key: "annotation1", - From: MetadataFromNamespace, - }, - }, - Labels: []FieldExtractionRule{{ - Name: "l1", - Key: "label1", - From: MetadataFromNamespace, + }{ + { + name: "no-rules", + rules: ExtractionRules{}, + attributes: nil, + }, + { + name: "labels", + rules: ExtractionRules{ + Annotations: []FieldExtractionRule{ + { + Name: "a1", + Key: "annotation1", + From: MetadataFromNamespace, + }, + }, + Labels: []FieldExtractionRule{ + { + Name: "l1", + Key: "label1", + From: MetadataFromNamespace, + }, + }, }, + attributes: map[string]string{ + "l1": "lv1", + "a1": "av1", }, }, - attributes: map[string]string{ - "l1": "lv1", - "a1": "av1", - }, - }, { name: "all-labels", rules: ExtractionRules{ - Labels: []FieldExtractionRule{{ - KeyRegex: regexp.MustCompile("^(?:la.*)$"), - From: MetadataFromNamespace, - }, + Labels: []FieldExtractionRule{ + { + KeyRegex: regexp.MustCompile("^(?:la.*)$"), + From: MetadataFromNamespace, + }, }, }, attributes: map[string]string{ @@ -1190,10 +1209,11 @@ func TestNamespaceExtractionRules(t *testing.T) { { name: "all-annotations", rules: ExtractionRules{ - Annotations: []FieldExtractionRule{{ - KeyRegex: regexp.MustCompile("^(?:an.*)$"), - From: MetadataFromNamespace, - }, + Annotations: []FieldExtractionRule{ + { + KeyRegex: regexp.MustCompile("^(?:an.*)$"), + From: MetadataFromNamespace, + }, }, }, attributes: map[string]string{ @@ -1239,38 +1259,43 @@ func TestNodeExtractionRules(t *testing.T) { name string rules ExtractionRules attributes map[string]string - }{{ - name: "no-rules", - rules: ExtractionRules{}, - attributes: nil, - }, { - name: "labels", - rules: ExtractionRules{ - Annotations: []FieldExtractionRule{{ - Name: "a1", - Key: "annotation1", - From: MetadataFromNode, - }, - }, - Labels: []FieldExtractionRule{{ - Name: "l1", - Key: "label1", - From: MetadataFromNode, + }{ + { + name: "no-rules", + rules: ExtractionRules{}, + attributes: nil, + }, + { + name: "labels", + rules: ExtractionRules{ + Annotations: []FieldExtractionRule{ + { + Name: "a1", + Key: "annotation1", + From: MetadataFromNode, + }, + }, + Labels: []FieldExtractionRule{ + { + Name: "l1", + Key: "label1", + From: MetadataFromNode, + }, + }, }, + attributes: map[string]string{ + "l1": "lv1", + "a1": "av1", }, }, - attributes: map[string]string{ - "l1": "lv1", - "a1": "av1", - }, - }, { name: "all-labels", rules: ExtractionRules{ - Labels: []FieldExtractionRule{{ - KeyRegex: regexp.MustCompile("^(?:la.*)$"), - From: MetadataFromNode, - }, + Labels: []FieldExtractionRule{ + { + KeyRegex: regexp.MustCompile("^(?:la.*)$"), + From: MetadataFromNode, + }, }, }, attributes: map[string]string{ @@ -1280,10 +1305,11 @@ func TestNodeExtractionRules(t *testing.T) { { name: "all-annotations", rules: ExtractionRules{ - Annotations: []FieldExtractionRule{{ - KeyRegex: regexp.MustCompile("^(?:an.*)$"), - From: MetadataFromNode, - }, + Annotations: []FieldExtractionRule{ + { + KeyRegex: regexp.MustCompile("^(?:an.*)$"), + From: MetadataFromNode, + }, }, }, attributes: map[string]string{ @@ -1314,51 +1340,52 @@ func TestFilters(t *testing.T) { filters Filters labels string fields string - }{{ - name: "no-filters", - filters: Filters{}, - }, { - name: "namespace", - filters: Filters{ - Namespace: "default", - }, - }, { - name: "node", - filters: Filters{ - Node: "ec2-test", - }, - fields: "spec.nodeName=ec2-test", - }, { - name: "labels-and-fields", - filters: Filters{ - Labels: []FieldFilter{ - { - Key: "k1", - Value: "v1", - Op: selection.Equals, - }, - { - Key: "k2", - Value: "v2", - Op: selection.NotEquals, - }, + }{ + { + name: "no-filters", + filters: Filters{}, + }, { + name: "namespace", + filters: Filters{ + Namespace: "default", }, - Fields: []FieldFilter{ - { - Key: "k1", - Value: "v1", - Op: selection.Equals, + }, { + name: "node", + filters: Filters{ + Node: "ec2-test", + }, + fields: "spec.nodeName=ec2-test", + }, { + name: "labels-and-fields", + filters: Filters{ + Labels: []FieldFilter{ + { + Key: "k1", + Value: "v1", + Op: selection.Equals, + }, + { + Key: "k2", + Value: "v2", + Op: selection.NotEquals, + }, }, - { - Key: "k2", - Value: "v2", - Op: selection.NotEquals, + Fields: []FieldFilter{ + { + Key: "k1", + Value: "v1", + Op: selection.Equals, + }, + { + Key: "k2", + Value: "v2", + Op: selection.NotEquals, + }, }, }, + labels: "k1=v1,k2!=v2", + fields: "k1=v1,k2!=v2", }, - labels: "k1=v1,k2!=v2", - fields: "k1=v1,k2!=v2", - }, } for _, tc := range testCases { @@ -1370,88 +1397,88 @@ func TestFilters(t *testing.T) { assert.Equal(t, tc.fields, inf.fieldSelector.String()) }) } - } func TestPodIgnorePatterns(t *testing.T) { testCases := []struct { ignore bool pod *api_v1.Pod - }{{ - ignore: false, - pod: &api_v1.Pod{}, - }, { - ignore: false, - pod: &api_v1.Pod{ - Spec: api_v1.PodSpec{ - HostNetwork: true, + }{ + { + ignore: false, + pod: &api_v1.Pod{}, + }, { + ignore: false, + pod: &api_v1.Pod{ + Spec: api_v1.PodSpec{ + HostNetwork: true, + }, }, - }, - }, { - ignore: true, - pod: &api_v1.Pod{ - ObjectMeta: meta_v1.ObjectMeta{ - Annotations: map[string]string{ - "opentelemetry.io/k8s-processor/ignore": "True ", + }, { + ignore: true, + pod: &api_v1.Pod{ + ObjectMeta: meta_v1.ObjectMeta{ + Annotations: map[string]string{ + "opentelemetry.io/k8s-processor/ignore": "True ", + }, }, }, - }, - }, { - ignore: true, - pod: &api_v1.Pod{ - ObjectMeta: meta_v1.ObjectMeta{ - Annotations: map[string]string{ - "opentelemetry.io/k8s-processor/ignore": "true", + }, { + ignore: true, + pod: &api_v1.Pod{ + ObjectMeta: meta_v1.ObjectMeta{ + Annotations: map[string]string{ + "opentelemetry.io/k8s-processor/ignore": "true", + }, }, }, - }, - }, { - ignore: false, - pod: &api_v1.Pod{ - ObjectMeta: meta_v1.ObjectMeta{ - Annotations: map[string]string{ - "opentelemetry.io/k8s-processor/ignore": "false", + }, { + ignore: false, + pod: &api_v1.Pod{ + ObjectMeta: meta_v1.ObjectMeta{ + Annotations: map[string]string{ + "opentelemetry.io/k8s-processor/ignore": "false", + }, }, }, - }, - }, { - ignore: false, - pod: &api_v1.Pod{ - ObjectMeta: meta_v1.ObjectMeta{ - Annotations: map[string]string{ - "opentelemetry.io/k8s-processor/ignore": "", + }, { + ignore: false, + pod: &api_v1.Pod{ + ObjectMeta: meta_v1.ObjectMeta{ + Annotations: map[string]string{ + "opentelemetry.io/k8s-processor/ignore": "", + }, }, }, - }, - }, { - ignore: true, - pod: &api_v1.Pod{ - ObjectMeta: meta_v1.ObjectMeta{ - Name: "jaeger-agent", + }, { + ignore: true, + pod: &api_v1.Pod{ + ObjectMeta: meta_v1.ObjectMeta{ + Name: "jaeger-agent", + }, }, - }, - }, { - ignore: true, - pod: &api_v1.Pod{ - ObjectMeta: meta_v1.ObjectMeta{ - Name: "jaeger-collector", + }, { + ignore: true, + pod: &api_v1.Pod{ + ObjectMeta: meta_v1.ObjectMeta{ + Name: "jaeger-collector", + }, }, - }, - }, { - ignore: true, - pod: &api_v1.Pod{ - ObjectMeta: meta_v1.ObjectMeta{ - Name: "jaeger-agent-b2zdv", + }, { + ignore: true, + pod: &api_v1.Pod{ + ObjectMeta: meta_v1.ObjectMeta{ + Name: "jaeger-agent-b2zdv", + }, }, - }, - }, { - ignore: false, - pod: &api_v1.Pod{ - ObjectMeta: meta_v1.ObjectMeta{ - Name: "test-pod-name", + }, { + ignore: false, + pod: &api_v1.Pod{ + ObjectMeta: meta_v1.ObjectMeta{ + Name: "test-pod-name", + }, }, }, - }, } c, _ := newTestClient(t) @@ -1466,17 +1493,21 @@ func Test_extractPodContainersAttributes(t *testing.T) { Containers: []api_v1.Container{ { Name: "container1", - Image: "test/image1:0.1.0", + Image: "example.com:5000/test/image1:0.1.0", }, { Name: "container2", - Image: "example.com:port1/image2:0.2.0", + Image: "example.com:81/image2@sha256:430ac608abaa332de4ce45d68534447c7a206edc5e98aaff9923ecc12f8a80d9", + }, + { + Name: "container3", + Image: "example-website.com/image3:1.0@sha256:4b0b1b6f6cdd3e5b9e55f74a1e8d19ed93a3f5a04c6b6c3c57c4e6d19f6b7c4d", }, }, InitContainers: []api_v1.Container{ { Name: "init_container", - Image: "test/init-image:1.0.2", + Image: "test/init-image", }, }, }, @@ -1485,18 +1516,27 @@ func Test_extractPodContainersAttributes(t *testing.T) { { Name: "container1", ContainerID: "docker://container1-id-123", + ImageID: "docker.io/otel/collector@sha256:55d008bc28344c3178645d40e7d07df30f9d90abe4b53c3fc4e5e9c0295533da", RestartCount: 0, }, { Name: "container2", ContainerID: "docker://container2-id-456", + ImageID: "sha256:4b0b1b6f6cdd3e5b9e55f74a1e8d19ed93a3f5a04c6b6c3c57c4e6d19f6b7c4d", + RestartCount: 2, + }, + { + Name: "container3", + ContainerID: "docker://container3-id-abc", + ImageID: "docker.io/otel/collector:2.0.0@sha256:430ac608abaa332de4ce45d68534447c7a206edc5e98aaff9923ecc12f8a80d9", RestartCount: 2, }, }, InitContainerStatuses: []api_v1.ContainerStatus{ { Name: "init_container", - ContainerID: "containerd://init-container-id-123", + ContainerID: "containerd://init-container-id-789", + ImageID: "ghcr.io/initimage1@sha256:42e8ba40f9f70d604684c3a2a0ed321206b7e2e3509fdb2c8836d34f2edfb57b", RestartCount: 0, }, }, @@ -1532,13 +1572,15 @@ func Test_extractPodContainersAttributes(t *testing.T) { pod: &pod, want: PodContainers{ ByID: map[string]*Container{ - "container1-id-123": {ImageName: "test/image1"}, - "container2-id-456": {ImageName: "example.com:port1/image2"}, - "init-container-id-123": {ImageName: "test/init-image"}, + "container1-id-123": {ImageName: "example.com:5000/test/image1"}, + "container2-id-456": {ImageName: "example.com:81/image2"}, + "container3-id-abc": {ImageName: "example-website.com/image3"}, + "init-container-id-789": {ImageName: "test/init-image"}, }, ByName: map[string]*Container{ - "container1": {ImageName: "test/image1"}, - "container2": {ImageName: "example.com:port1/image2"}, + "container1": {ImageName: "example.com:5000/test/image1"}, + "container2": {ImageName: "example.com:81/image2"}, + "container3": {ImageName: "example-website.com/image3"}, "init_container": {ImageName: "test/init-image"}, }, }, @@ -1583,9 +1625,14 @@ func Test_extractPodContainersAttributes(t *testing.T) { 2: {ContainerID: "container2-id-456"}, }, }, - "init-container-id-123": { + "container3-id-abc": { Statuses: map[int]ContainerStatus{ - 0: {ContainerID: "init-container-id-123"}, + 2: {ContainerID: "container3-id-abc"}, + }, + }, + "init-container-id-789": { + Statuses: map[int]ContainerStatus{ + 0: {ContainerID: "init-container-id-789"}, }, }, }, @@ -1600,9 +1647,67 @@ func Test_extractPodContainersAttributes(t *testing.T) { 2: {ContainerID: "container2-id-456"}, }, }, + "container3": { + Statuses: map[int]ContainerStatus{ + 2: {ContainerID: "container3-id-abc"}, + }, + }, "init_container": { Statuses: map[int]ContainerStatus{ - 0: {ContainerID: "init-container-id-123"}, + 0: {ContainerID: "init-container-id-789"}, + }, + }, + }, + }, + }, + { + name: "container-image-repo-digest-only", + rules: ExtractionRules{ + ContainerImageRepoDigests: true, + }, + pod: &pod, + want: PodContainers{ + ByID: map[string]*Container{ + "container1-id-123": { + Statuses: map[int]ContainerStatus{ + 0: {ImageRepoDigest: "docker.io/otel/collector@sha256:55d008bc28344c3178645d40e7d07df30f9d90abe4b53c3fc4e5e9c0295533da"}, + }, + }, + "container2-id-456": { + Statuses: map[int]ContainerStatus{ + 2: {}, + }, + }, + "container3-id-abc": { + Statuses: map[int]ContainerStatus{ + 2: {ImageRepoDigest: "docker.io/otel/collector:2.0.0@sha256:430ac608abaa332de4ce45d68534447c7a206edc5e98aaff9923ecc12f8a80d9"}, + }, + }, + "init-container-id-789": { + Statuses: map[int]ContainerStatus{ + 0: {ImageRepoDigest: "ghcr.io/initimage1@sha256:42e8ba40f9f70d604684c3a2a0ed321206b7e2e3509fdb2c8836d34f2edfb57b"}, + }, + }, + }, + ByName: map[string]*Container{ + "container1": { + Statuses: map[int]ContainerStatus{ + 0: {ImageRepoDigest: "docker.io/otel/collector@sha256:55d008bc28344c3178645d40e7d07df30f9d90abe4b53c3fc4e5e9c0295533da"}, + }, + }, + "container2": { + Statuses: map[int]ContainerStatus{ + 2: {}, + }, + }, + "container3": { + Statuses: map[int]ContainerStatus{ + 2: {ImageRepoDigest: "docker.io/otel/collector:2.0.0@sha256:430ac608abaa332de4ce45d68534447c7a206edc5e98aaff9923ecc12f8a80d9"}, + }, + }, + "init_container": { + Statuses: map[int]ContainerStatus{ + 0: {ImageRepoDigest: "ghcr.io/initimage1@sha256:42e8ba40f9f70d604684c3a2a0ed321206b7e2e3509fdb2c8836d34f2edfb57b"}, }, }, }, @@ -1611,55 +1716,68 @@ func Test_extractPodContainersAttributes(t *testing.T) { { name: "all-container-attributes", rules: ExtractionRules{ - ContainerImageName: true, - ContainerImageTag: true, - ContainerID: true, + ContainerImageName: true, + ContainerImageTag: true, + ContainerID: true, + ContainerImageRepoDigests: true, }, pod: &pod, want: PodContainers{ ByID: map[string]*Container{ "container1-id-123": { - ImageName: "test/image1", + ImageName: "example.com:5000/test/image1", ImageTag: "0.1.0", Statuses: map[int]ContainerStatus{ - 0: {ContainerID: "container1-id-123"}, + 0: {ContainerID: "container1-id-123", ImageRepoDigest: "docker.io/otel/collector@sha256:55d008bc28344c3178645d40e7d07df30f9d90abe4b53c3fc4e5e9c0295533da"}, }, }, "container2-id-456": { - ImageName: "example.com:port1/image2", - ImageTag: "0.2.0", + ImageName: "example.com:81/image2", Statuses: map[int]ContainerStatus{ 2: {ContainerID: "container2-id-456"}, }, }, - "init-container-id-123": { + "container3-id-abc": { + ImageName: "example-website.com/image3", + ImageTag: "1.0", + Statuses: map[int]ContainerStatus{ + 2: {ContainerID: "container3-id-abc", ImageRepoDigest: "docker.io/otel/collector:2.0.0@sha256:430ac608abaa332de4ce45d68534447c7a206edc5e98aaff9923ecc12f8a80d9"}, + }, + }, + "init-container-id-789": { ImageName: "test/init-image", - ImageTag: "1.0.2", + ImageTag: "latest", Statuses: map[int]ContainerStatus{ - 0: {ContainerID: "init-container-id-123"}, + 0: {ContainerID: "init-container-id-789", ImageRepoDigest: "ghcr.io/initimage1@sha256:42e8ba40f9f70d604684c3a2a0ed321206b7e2e3509fdb2c8836d34f2edfb57b"}, }, }, }, ByName: map[string]*Container{ "container1": { - ImageName: "test/image1", + ImageName: "example.com:5000/test/image1", ImageTag: "0.1.0", Statuses: map[int]ContainerStatus{ - 0: {ContainerID: "container1-id-123"}, + 0: {ContainerID: "container1-id-123", ImageRepoDigest: "docker.io/otel/collector@sha256:55d008bc28344c3178645d40e7d07df30f9d90abe4b53c3fc4e5e9c0295533da"}, }, }, "container2": { - ImageName: "example.com:port1/image2", - ImageTag: "0.2.0", + ImageName: "example.com:81/image2", Statuses: map[int]ContainerStatus{ 2: {ContainerID: "container2-id-456"}, }, }, + "container3": { + ImageName: "example-website.com/image3", + ImageTag: "1.0", + Statuses: map[int]ContainerStatus{ + 2: {ContainerID: "container3-id-abc", ImageRepoDigest: "docker.io/otel/collector:2.0.0@sha256:430ac608abaa332de4ce45d68534447c7a206edc5e98aaff9923ecc12f8a80d9"}, + }, + }, "init_container": { ImageName: "test/init-image", - ImageTag: "1.0.2", + ImageTag: "latest", Statuses: map[int]ContainerStatus{ - 0: {ContainerID: "init-container-id-123"}, + 0: {ContainerID: "init-container-id-789", ImageRepoDigest: "ghcr.io/initimage1@sha256:42e8ba40f9f70d604684c3a2a0ed321206b7e2e3509fdb2c8836d34f2edfb57b"}, }, }, }, @@ -1714,9 +1832,7 @@ func Test_extractField(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := tt.args.r.extractField(tt.args.v); got != tt.want { - t.Errorf("extractField() = %v, want %v", got, tt.want) - } + assert.Equal(t, tt.want, tt.args.r.extractField(tt.args.v), "extractField()") }) } } @@ -1753,50 +1869,55 @@ func TestExtractNamespaceLabelsAnnotations(t *testing.T) { name string shouldExtractNamespace bool rules ExtractionRules - }{{ - name: "empty-rules", - shouldExtractNamespace: false, - rules: ExtractionRules{}, - }, { - name: "pod-rules", - shouldExtractNamespace: false, - rules: ExtractionRules{ - Annotations: []FieldExtractionRule{{ - Name: "a1", - Key: "annotation1", - From: MetadataFromPod, - }, - }, - Labels: []FieldExtractionRule{{ - Name: "l1", - Key: "label1", - From: MetadataFromPod, - }, - }, - }, - }, { - name: "namespace-rules-only-annotations", - shouldExtractNamespace: true, - rules: ExtractionRules{ - Annotations: []FieldExtractionRule{{ - Name: "a1", - Key: "annotation1", - From: MetadataFromNamespace, - }, + }{ + { + name: "empty-rules", + shouldExtractNamespace: false, + rules: ExtractionRules{}, + }, { + name: "pod-rules", + shouldExtractNamespace: false, + rules: ExtractionRules{ + Annotations: []FieldExtractionRule{ + { + Name: "a1", + Key: "annotation1", + From: MetadataFromPod, + }, + }, + Labels: []FieldExtractionRule{ + { + Name: "l1", + Key: "label1", + From: MetadataFromPod, + }, + }, }, - }, - }, { - name: "namespace-rules-only-labels", - shouldExtractNamespace: true, - rules: ExtractionRules{ - Labels: []FieldExtractionRule{{ - Name: "l1", - Key: "label1", - From: MetadataFromNamespace, + }, { + name: "namespace-rules-only-annotations", + shouldExtractNamespace: true, + rules: ExtractionRules{ + Annotations: []FieldExtractionRule{ + { + Name: "a1", + Key: "annotation1", + From: MetadataFromNamespace, + }, + }, }, + }, { + name: "namespace-rules-only-labels", + shouldExtractNamespace: true, + rules: ExtractionRules{ + Labels: []FieldExtractionRule{ + { + Name: "l1", + Key: "label1", + From: MetadataFromNamespace, + }, + }, }, }, - }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { @@ -1807,8 +1928,9 @@ func TestExtractNamespaceLabelsAnnotations(t *testing.T) { } func newTestClientWithRulesAndFilters(t *testing.T, f Filters) (*WatchClient, *observer.ObservedLogs) { + set := componenttest.NewNopTelemetrySettings() observedLogger, logs := observer.New(zapcore.WarnLevel) - logger := zap.New(observedLogger) + set.Logger = zap.New(observedLogger) exclude := Excludes{ Pods: []ExcludePods{ {Name: regexp.MustCompile(`jaeger-agent`)}, @@ -1832,7 +1954,7 @@ func newTestClientWithRulesAndFilters(t *testing.T, f Filters) (*WatchClient, *o }, }, } - c, err := New(logger, k8sconfig.APIConfig{}, ExtractionRules{}, f, associations, exclude, newFakeAPIClientset, NewFakeInformer, NewFakeNamespaceInformer, NewFakeReplicaSetInformer) + c, err := New(set, k8sconfig.APIConfig{}, ExtractionRules{}, f, associations, exclude, newFakeAPIClientset, NewFakeInformer, NewFakeNamespaceInformer, NewFakeReplicaSetInformer, false, 10*time.Second) require.NoError(t, err) return c.(*WatchClient), logs } @@ -1840,3 +1962,55 @@ func newTestClientWithRulesAndFilters(t *testing.T, f Filters) (*WatchClient, *o func newTestClient(t *testing.T) (*WatchClient, *observer.ObservedLogs) { return newTestClientWithRulesAndFilters(t, Filters{}) } + +type neverSyncedFakeClient struct { + cache.SharedInformer +} + +type neverSyncedResourceEventHandlerRegistration struct { + cache.ResourceEventHandlerRegistration +} + +func (n *neverSyncedResourceEventHandlerRegistration) HasSynced() bool { + return false +} + +func (n *neverSyncedFakeClient) AddEventHandler(handler cache.ResourceEventHandler) (cache.ResourceEventHandlerRegistration, error) { + delegate, err := n.SharedInformer.AddEventHandler(handler) + if err != nil { + return nil, err + } + return &neverSyncedResourceEventHandlerRegistration{ResourceEventHandlerRegistration: delegate}, nil +} + +func TestWaitForMetadata(t *testing.T) { + testCases := []struct { + name string + informerProvider InformerProvider + err bool + }{{ + name: "no wait", + informerProvider: NewFakeInformer, + err: false, + }, { + name: "wait but never synced", + informerProvider: func(client kubernetes.Interface, namespace string, labelSelector labels.Selector, fieldSelector fields.Selector) cache.SharedInformer { + return &neverSyncedFakeClient{NewFakeInformer(client, namespace, labelSelector, fieldSelector)} + }, + err: true, + }} + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + c, err := New(componenttest.NewNopTelemetrySettings(), k8sconfig.APIConfig{}, ExtractionRules{}, Filters{}, []Association{}, Excludes{}, newFakeAPIClientset, tc.informerProvider, nil, nil, true, 1*time.Second) + require.NoError(t, err) + + err = c.Start() + if tc.err { + require.Error(t, err) + } else { + require.NoError(t, err) + } + }) + } +} diff --git a/processor/k8sattributesprocessor/internal/kube/fake_informer.go b/processor/k8sattributesprocessor/internal/kube/fake_informer.go index 20a9ca879afc..15d63c4e9c0c 100644 --- a/processor/k8sattributesprocessor/internal/kube/fake_informer.go +++ b/processor/k8sattributesprocessor/internal/kube/fake_informer.go @@ -40,7 +40,7 @@ func (f *FakeInformer) AddEventHandler(handler cache.ResourceEventHandler) (cach } func (f *FakeInformer) AddEventHandlerWithResyncPeriod(_ cache.ResourceEventHandler, _ time.Duration) (cache.ResourceEventHandlerRegistration, error) { - return nil, nil + return f, nil } func (f *FakeInformer) RemoveEventHandler(_ cache.ResourceEventHandlerRegistration) error { @@ -163,8 +163,9 @@ func NewNoOpInformer( func (f *NoOpInformer) AddEventHandler(handler cache.ResourceEventHandler) (cache.ResourceEventHandlerRegistration, error) { return f.AddEventHandlerWithResyncPeriod(handler, time.Second) } + func (f *NoOpInformer) AddEventHandlerWithResyncPeriod(_ cache.ResourceEventHandler, _ time.Duration) (cache.ResourceEventHandlerRegistration, error) { - return nil, nil + return f, nil } func (f *NoOpInformer) RemoveEventHandler(_ cache.ResourceEventHandlerRegistration) error { @@ -193,9 +194,11 @@ func (c *NoOpController) Run(stopCh <-chan struct{}) { c.hasStopped = true }() } + func (c *NoOpController) IsStopped() bool { return c.hasStopped } + func (c *NoOpController) HasSynced() bool { return true } diff --git a/processor/k8sattributesprocessor/internal/kube/informer.go b/processor/k8sattributesprocessor/internal/kube/informer.go index ddb10c24f060..85459afe53bb 100644 --- a/processor/k8sattributesprocessor/internal/kube/informer.go +++ b/processor/k8sattributesprocessor/internal/kube/informer.go @@ -70,7 +70,6 @@ func informerListFuncWithSelectors(client kubernetes.Interface, namespace string opts.FieldSelector = fs.String() return client.CoreV1().Pods(namespace).List(context.Background(), opts) } - } func informerWatchFuncWithSelectors(client kubernetes.Interface, namespace string, ls labels.Selector, fs fields.Selector) cache.WatchFunc { @@ -120,7 +119,6 @@ func namespaceInformerListFunc(client kubernetes.Interface) cache.ListFunc { return func(opts metav1.ListOptions) (runtime.Object, error) { return client.CoreV1().Namespaces().List(context.Background(), opts) } - } func namespaceInformerWatchFunc(client kubernetes.Interface) cache.WatchFunc { diff --git a/processor/k8sattributesprocessor/internal/kube/kube.go b/processor/k8sattributesprocessor/internal/kube/kube.go index 06d025ca21fa..9faeee2452dd 100644 --- a/processor/k8sattributesprocessor/internal/kube/kube.go +++ b/processor/k8sattributesprocessor/internal/kube/kube.go @@ -8,7 +8,7 @@ import ( "regexp" "time" - "go.uber.org/zap" + "go.opentelemetry.io/collector/component" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/selection" "k8s.io/client-go/kubernetes" @@ -91,12 +91,12 @@ type Client interface { GetPod(PodIdentifier) (*Pod, bool) GetNamespace(string) (*Namespace, bool) GetNode(string) (*Node, bool) - Start() + Start() error Stop() } // ClientProvider defines a func type that returns a new Client. -type ClientProvider func(*zap.Logger, k8sconfig.APIConfig, ExtractionRules, Filters, []Association, Excludes, APIClientsetProvider, InformerProvider, InformerProviderNamespace, InformerProviderReplicaSet) (Client, error) +type ClientProvider func(component.TelemetrySettings, k8sconfig.APIConfig, ExtractionRules, Filters, []Association, Excludes, APIClientsetProvider, InformerProvider, InformerProviderNamespace, InformerProviderReplicaSet, bool, time.Duration) (Client, error) // APIClientsetProvider defines a func type that initializes and return a new kubernetes // Clientset object. @@ -140,7 +140,8 @@ type Container struct { // ContainerStatus stores resource attributes for a particular container run defined by k8s pod status. type ContainerStatus struct { - ContainerID string + ContainerID string + ImageRepoDigest string } // Namespace represents a kubernetes namespace. @@ -194,29 +195,31 @@ type FieldFilter struct { // ExtractionRules is used to specify the information that needs to be extracted // from pods and added to the spans as tags. type ExtractionRules struct { - CronJobName bool - DeploymentName bool - DeploymentUID bool - DaemonSetUID bool - DaemonSetName bool - JobUID bool - JobName bool - Namespace bool - PodName bool - PodUID bool - PodHostName bool - ReplicaSetID bool - ReplicaSetName bool - StatefulSetUID bool - StatefulSetName bool - Node bool - NodeUID bool - StartTime bool - ContainerName bool - ContainerID bool - ContainerImageName bool - ContainerImageTag bool - ClusterUID bool + CronJobName bool + DeploymentName bool + DeploymentUID bool + DaemonSetUID bool + DaemonSetName bool + JobUID bool + JobName bool + Namespace bool + PodName bool + PodUID bool + PodHostName bool + PodIP bool + ReplicaSetID bool + ReplicaSetName bool + StatefulSetUID bool + StatefulSetName bool + Node bool + NodeUID bool + StartTime bool + ContainerName bool + ContainerID bool + ContainerImageName bool + ContainerImageRepoDigests bool + ContainerImageTag bool + ClusterUID bool Annotations []FieldExtractionRule Labels []FieldExtractionRule diff --git a/processor/k8sattributesprocessor/internal/metadata/generated_config.go b/processor/k8sattributesprocessor/internal/metadata/generated_config.go index 0f5901f5ab62..aa6c1caa9f5c 100644 --- a/processor/k8sattributesprocessor/internal/metadata/generated_config.go +++ b/processor/k8sattributesprocessor/internal/metadata/generated_config.go @@ -27,29 +27,31 @@ func (rac *ResourceAttributeConfig) Unmarshal(parser *confmap.Conf) error { // ResourceAttributesConfig provides config for k8sattributes resource attributes. type ResourceAttributesConfig struct { - ContainerID ResourceAttributeConfig `mapstructure:"container.id"` - ContainerImageName ResourceAttributeConfig `mapstructure:"container.image.name"` - ContainerImageTag ResourceAttributeConfig `mapstructure:"container.image.tag"` - K8sClusterUID ResourceAttributeConfig `mapstructure:"k8s.cluster.uid"` - K8sContainerName ResourceAttributeConfig `mapstructure:"k8s.container.name"` - K8sCronjobName ResourceAttributeConfig `mapstructure:"k8s.cronjob.name"` - K8sDaemonsetName ResourceAttributeConfig `mapstructure:"k8s.daemonset.name"` - K8sDaemonsetUID ResourceAttributeConfig `mapstructure:"k8s.daemonset.uid"` - K8sDeploymentName ResourceAttributeConfig `mapstructure:"k8s.deployment.name"` - K8sDeploymentUID ResourceAttributeConfig `mapstructure:"k8s.deployment.uid"` - K8sJobName ResourceAttributeConfig `mapstructure:"k8s.job.name"` - K8sJobUID ResourceAttributeConfig `mapstructure:"k8s.job.uid"` - K8sNamespaceName ResourceAttributeConfig `mapstructure:"k8s.namespace.name"` - K8sNodeName ResourceAttributeConfig `mapstructure:"k8s.node.name"` - K8sNodeUID ResourceAttributeConfig `mapstructure:"k8s.node.uid"` - K8sPodHostname ResourceAttributeConfig `mapstructure:"k8s.pod.hostname"` - K8sPodName ResourceAttributeConfig `mapstructure:"k8s.pod.name"` - K8sPodStartTime ResourceAttributeConfig `mapstructure:"k8s.pod.start_time"` - K8sPodUID ResourceAttributeConfig `mapstructure:"k8s.pod.uid"` - K8sReplicasetName ResourceAttributeConfig `mapstructure:"k8s.replicaset.name"` - K8sReplicasetUID ResourceAttributeConfig `mapstructure:"k8s.replicaset.uid"` - K8sStatefulsetName ResourceAttributeConfig `mapstructure:"k8s.statefulset.name"` - K8sStatefulsetUID ResourceAttributeConfig `mapstructure:"k8s.statefulset.uid"` + ContainerID ResourceAttributeConfig `mapstructure:"container.id"` + ContainerImageName ResourceAttributeConfig `mapstructure:"container.image.name"` + ContainerImageRepoDigests ResourceAttributeConfig `mapstructure:"container.image.repo_digests"` + ContainerImageTag ResourceAttributeConfig `mapstructure:"container.image.tag"` + K8sClusterUID ResourceAttributeConfig `mapstructure:"k8s.cluster.uid"` + K8sContainerName ResourceAttributeConfig `mapstructure:"k8s.container.name"` + K8sCronjobName ResourceAttributeConfig `mapstructure:"k8s.cronjob.name"` + K8sDaemonsetName ResourceAttributeConfig `mapstructure:"k8s.daemonset.name"` + K8sDaemonsetUID ResourceAttributeConfig `mapstructure:"k8s.daemonset.uid"` + K8sDeploymentName ResourceAttributeConfig `mapstructure:"k8s.deployment.name"` + K8sDeploymentUID ResourceAttributeConfig `mapstructure:"k8s.deployment.uid"` + K8sJobName ResourceAttributeConfig `mapstructure:"k8s.job.name"` + K8sJobUID ResourceAttributeConfig `mapstructure:"k8s.job.uid"` + K8sNamespaceName ResourceAttributeConfig `mapstructure:"k8s.namespace.name"` + K8sNodeName ResourceAttributeConfig `mapstructure:"k8s.node.name"` + K8sNodeUID ResourceAttributeConfig `mapstructure:"k8s.node.uid"` + K8sPodHostname ResourceAttributeConfig `mapstructure:"k8s.pod.hostname"` + K8sPodIP ResourceAttributeConfig `mapstructure:"k8s.pod.ip"` + K8sPodName ResourceAttributeConfig `mapstructure:"k8s.pod.name"` + K8sPodStartTime ResourceAttributeConfig `mapstructure:"k8s.pod.start_time"` + K8sPodUID ResourceAttributeConfig `mapstructure:"k8s.pod.uid"` + K8sReplicasetName ResourceAttributeConfig `mapstructure:"k8s.replicaset.name"` + K8sReplicasetUID ResourceAttributeConfig `mapstructure:"k8s.replicaset.uid"` + K8sStatefulsetName ResourceAttributeConfig `mapstructure:"k8s.statefulset.name"` + K8sStatefulsetUID ResourceAttributeConfig `mapstructure:"k8s.statefulset.uid"` } func DefaultResourceAttributesConfig() ResourceAttributesConfig { @@ -60,6 +62,9 @@ func DefaultResourceAttributesConfig() ResourceAttributesConfig { ContainerImageName: ResourceAttributeConfig{ Enabled: true, }, + ContainerImageRepoDigests: ResourceAttributeConfig{ + Enabled: false, + }, ContainerImageTag: ResourceAttributeConfig{ Enabled: true, }, @@ -102,6 +107,9 @@ func DefaultResourceAttributesConfig() ResourceAttributesConfig { K8sPodHostname: ResourceAttributeConfig{ Enabled: false, }, + K8sPodIP: ResourceAttributeConfig{ + Enabled: false, + }, K8sPodName: ResourceAttributeConfig{ Enabled: true, }, diff --git a/processor/k8sattributesprocessor/internal/metadata/generated_config_test.go b/processor/k8sattributesprocessor/internal/metadata/generated_config_test.go index 2d191e7d5623..e4e3f7dc32c5 100644 --- a/processor/k8sattributesprocessor/internal/metadata/generated_config_test.go +++ b/processor/k8sattributesprocessor/internal/metadata/generated_config_test.go @@ -24,66 +24,69 @@ func TestResourceAttributesConfig(t *testing.T) { { name: "all_set", want: ResourceAttributesConfig{ - ContainerID: ResourceAttributeConfig{Enabled: true}, - ContainerImageName: ResourceAttributeConfig{Enabled: true}, - ContainerImageTag: ResourceAttributeConfig{Enabled: true}, - K8sClusterUID: ResourceAttributeConfig{Enabled: true}, - K8sContainerName: ResourceAttributeConfig{Enabled: true}, - K8sCronjobName: ResourceAttributeConfig{Enabled: true}, - K8sDaemonsetName: ResourceAttributeConfig{Enabled: true}, - K8sDaemonsetUID: ResourceAttributeConfig{Enabled: true}, - K8sDeploymentName: ResourceAttributeConfig{Enabled: true}, - K8sDeploymentUID: ResourceAttributeConfig{Enabled: true}, - K8sJobName: ResourceAttributeConfig{Enabled: true}, - K8sJobUID: ResourceAttributeConfig{Enabled: true}, - K8sNamespaceName: ResourceAttributeConfig{Enabled: true}, - K8sNodeName: ResourceAttributeConfig{Enabled: true}, - K8sNodeUID: ResourceAttributeConfig{Enabled: true}, - K8sPodHostname: ResourceAttributeConfig{Enabled: true}, - K8sPodName: ResourceAttributeConfig{Enabled: true}, - K8sPodStartTime: ResourceAttributeConfig{Enabled: true}, - K8sPodUID: ResourceAttributeConfig{Enabled: true}, - K8sReplicasetName: ResourceAttributeConfig{Enabled: true}, - K8sReplicasetUID: ResourceAttributeConfig{Enabled: true}, - K8sStatefulsetName: ResourceAttributeConfig{Enabled: true}, - K8sStatefulsetUID: ResourceAttributeConfig{Enabled: true}, + ContainerID: ResourceAttributeConfig{Enabled: true}, + ContainerImageName: ResourceAttributeConfig{Enabled: true}, + ContainerImageRepoDigests: ResourceAttributeConfig{Enabled: true}, + ContainerImageTag: ResourceAttributeConfig{Enabled: true}, + K8sClusterUID: ResourceAttributeConfig{Enabled: true}, + K8sContainerName: ResourceAttributeConfig{Enabled: true}, + K8sCronjobName: ResourceAttributeConfig{Enabled: true}, + K8sDaemonsetName: ResourceAttributeConfig{Enabled: true}, + K8sDaemonsetUID: ResourceAttributeConfig{Enabled: true}, + K8sDeploymentName: ResourceAttributeConfig{Enabled: true}, + K8sDeploymentUID: ResourceAttributeConfig{Enabled: true}, + K8sJobName: ResourceAttributeConfig{Enabled: true}, + K8sJobUID: ResourceAttributeConfig{Enabled: true}, + K8sNamespaceName: ResourceAttributeConfig{Enabled: true}, + K8sNodeName: ResourceAttributeConfig{Enabled: true}, + K8sNodeUID: ResourceAttributeConfig{Enabled: true}, + K8sPodHostname: ResourceAttributeConfig{Enabled: true}, + K8sPodIP: ResourceAttributeConfig{Enabled: true}, + K8sPodName: ResourceAttributeConfig{Enabled: true}, + K8sPodStartTime: ResourceAttributeConfig{Enabled: true}, + K8sPodUID: ResourceAttributeConfig{Enabled: true}, + K8sReplicasetName: ResourceAttributeConfig{Enabled: true}, + K8sReplicasetUID: ResourceAttributeConfig{Enabled: true}, + K8sStatefulsetName: ResourceAttributeConfig{Enabled: true}, + K8sStatefulsetUID: ResourceAttributeConfig{Enabled: true}, }, }, { name: "none_set", want: ResourceAttributesConfig{ - ContainerID: ResourceAttributeConfig{Enabled: false}, - ContainerImageName: ResourceAttributeConfig{Enabled: false}, - ContainerImageTag: ResourceAttributeConfig{Enabled: false}, - K8sClusterUID: ResourceAttributeConfig{Enabled: false}, - K8sContainerName: ResourceAttributeConfig{Enabled: false}, - K8sCronjobName: ResourceAttributeConfig{Enabled: false}, - K8sDaemonsetName: ResourceAttributeConfig{Enabled: false}, - K8sDaemonsetUID: ResourceAttributeConfig{Enabled: false}, - K8sDeploymentName: ResourceAttributeConfig{Enabled: false}, - K8sDeploymentUID: ResourceAttributeConfig{Enabled: false}, - K8sJobName: ResourceAttributeConfig{Enabled: false}, - K8sJobUID: ResourceAttributeConfig{Enabled: false}, - K8sNamespaceName: ResourceAttributeConfig{Enabled: false}, - K8sNodeName: ResourceAttributeConfig{Enabled: false}, - K8sNodeUID: ResourceAttributeConfig{Enabled: false}, - K8sPodHostname: ResourceAttributeConfig{Enabled: false}, - K8sPodName: ResourceAttributeConfig{Enabled: false}, - K8sPodStartTime: ResourceAttributeConfig{Enabled: false}, - K8sPodUID: ResourceAttributeConfig{Enabled: false}, - K8sReplicasetName: ResourceAttributeConfig{Enabled: false}, - K8sReplicasetUID: ResourceAttributeConfig{Enabled: false}, - K8sStatefulsetName: ResourceAttributeConfig{Enabled: false}, - K8sStatefulsetUID: ResourceAttributeConfig{Enabled: false}, + ContainerID: ResourceAttributeConfig{Enabled: false}, + ContainerImageName: ResourceAttributeConfig{Enabled: false}, + ContainerImageRepoDigests: ResourceAttributeConfig{Enabled: false}, + ContainerImageTag: ResourceAttributeConfig{Enabled: false}, + K8sClusterUID: ResourceAttributeConfig{Enabled: false}, + K8sContainerName: ResourceAttributeConfig{Enabled: false}, + K8sCronjobName: ResourceAttributeConfig{Enabled: false}, + K8sDaemonsetName: ResourceAttributeConfig{Enabled: false}, + K8sDaemonsetUID: ResourceAttributeConfig{Enabled: false}, + K8sDeploymentName: ResourceAttributeConfig{Enabled: false}, + K8sDeploymentUID: ResourceAttributeConfig{Enabled: false}, + K8sJobName: ResourceAttributeConfig{Enabled: false}, + K8sJobUID: ResourceAttributeConfig{Enabled: false}, + K8sNamespaceName: ResourceAttributeConfig{Enabled: false}, + K8sNodeName: ResourceAttributeConfig{Enabled: false}, + K8sNodeUID: ResourceAttributeConfig{Enabled: false}, + K8sPodHostname: ResourceAttributeConfig{Enabled: false}, + K8sPodIP: ResourceAttributeConfig{Enabled: false}, + K8sPodName: ResourceAttributeConfig{Enabled: false}, + K8sPodStartTime: ResourceAttributeConfig{Enabled: false}, + K8sPodUID: ResourceAttributeConfig{Enabled: false}, + K8sReplicasetName: ResourceAttributeConfig{Enabled: false}, + K8sReplicasetUID: ResourceAttributeConfig{Enabled: false}, + K8sStatefulsetName: ResourceAttributeConfig{Enabled: false}, + K8sStatefulsetUID: ResourceAttributeConfig{Enabled: false}, }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { cfg := loadResourceAttributesConfig(t, tt.name) - if diff := cmp.Diff(tt.want, cfg, cmpopts.IgnoreUnexported(ResourceAttributeConfig{})); diff != "" { - t.Errorf("Config mismatch (-expected +actual):\n%s", diff) - } + diff := cmp.Diff(tt.want, cfg, cmpopts.IgnoreUnexported(ResourceAttributeConfig{})) + require.Emptyf(t, diff, "Config mismatch (-expected +actual):\n%s", diff) }) } } diff --git a/processor/k8sattributesprocessor/internal/metadata/generated_resource.go b/processor/k8sattributesprocessor/internal/metadata/generated_resource.go index ab0c0746fca4..6545b2c918c1 100644 --- a/processor/k8sattributesprocessor/internal/metadata/generated_resource.go +++ b/processor/k8sattributesprocessor/internal/metadata/generated_resource.go @@ -35,6 +35,13 @@ func (rb *ResourceBuilder) SetContainerImageName(val string) { } } +// SetContainerImageRepoDigests sets provided value as "container.image.repo_digests" attribute. +func (rb *ResourceBuilder) SetContainerImageRepoDigests(val []any) { + if rb.config.ContainerImageRepoDigests.Enabled { + rb.res.Attributes().PutEmptySlice("container.image.repo_digests").FromRaw(val) + } +} + // SetContainerImageTag sets provided value as "container.image.tag" attribute. func (rb *ResourceBuilder) SetContainerImageTag(val string) { if rb.config.ContainerImageTag.Enabled { @@ -133,6 +140,13 @@ func (rb *ResourceBuilder) SetK8sPodHostname(val string) { } } +// SetK8sPodIP sets provided value as "k8s.pod.ip" attribute. +func (rb *ResourceBuilder) SetK8sPodIP(val string) { + if rb.config.K8sPodIP.Enabled { + rb.res.Attributes().PutStr("k8s.pod.ip", val) + } +} + // SetK8sPodName sets provided value as "k8s.pod.name" attribute. func (rb *ResourceBuilder) SetK8sPodName(val string) { if rb.config.K8sPodName.Enabled { diff --git a/processor/k8sattributesprocessor/internal/metadata/generated_resource_test.go b/processor/k8sattributesprocessor/internal/metadata/generated_resource_test.go index fd96be1e87fe..774643d4677f 100644 --- a/processor/k8sattributesprocessor/internal/metadata/generated_resource_test.go +++ b/processor/k8sattributesprocessor/internal/metadata/generated_resource_test.go @@ -9,12 +9,13 @@ import ( ) func TestResourceBuilder(t *testing.T) { - for _, test := range []string{"default", "all_set", "none_set"} { - t.Run(test, func(t *testing.T) { - cfg := loadResourceAttributesConfig(t, test) + for _, tt := range []string{"default", "all_set", "none_set"} { + t.Run(tt, func(t *testing.T) { + cfg := loadResourceAttributesConfig(t, tt) rb := NewResourceBuilder(cfg) rb.SetContainerID("container.id-val") rb.SetContainerImageName("container.image.name-val") + rb.SetContainerImageRepoDigests([]any{"container.image.repo_digests-item1", "container.image.repo_digests-item2"}) rb.SetContainerImageTag("container.image.tag-val") rb.SetK8sClusterUID("k8s.cluster.uid-val") rb.SetK8sContainerName("k8s.container.name-val") @@ -29,6 +30,7 @@ func TestResourceBuilder(t *testing.T) { rb.SetK8sNodeName("k8s.node.name-val") rb.SetK8sNodeUID("k8s.node.uid-val") rb.SetK8sPodHostname("k8s.pod.hostname-val") + rb.SetK8sPodIP("k8s.pod.ip-val") rb.SetK8sPodName("k8s.pod.name-val") rb.SetK8sPodStartTime("k8s.pod.start_time-val") rb.SetK8sPodUID("k8s.pod.uid-val") @@ -40,20 +42,20 @@ func TestResourceBuilder(t *testing.T) { res := rb.Emit() assert.Equal(t, 0, rb.Emit().Attributes().Len()) // Second call should return empty Resource - switch test { + switch tt { case "default": assert.Equal(t, 8, res.Attributes().Len()) case "all_set": - assert.Equal(t, 23, res.Attributes().Len()) + assert.Equal(t, 25, res.Attributes().Len()) case "none_set": assert.Equal(t, 0, res.Attributes().Len()) return default: - assert.Failf(t, "unexpected test case: %s", test) + assert.Failf(t, "unexpected test case: %s", tt) } val, ok := res.Attributes().Get("container.id") - assert.Equal(t, test == "all_set", ok) + assert.Equal(t, tt == "all_set", ok) if ok { assert.EqualValues(t, "container.id-val", val.Str()) } @@ -62,33 +64,38 @@ func TestResourceBuilder(t *testing.T) { if ok { assert.EqualValues(t, "container.image.name-val", val.Str()) } + val, ok = res.Attributes().Get("container.image.repo_digests") + assert.Equal(t, tt == "all_set", ok) + if ok { + assert.EqualValues(t, []any{"container.image.repo_digests-item1", "container.image.repo_digests-item2"}, val.Slice().AsRaw()) + } val, ok = res.Attributes().Get("container.image.tag") assert.True(t, ok) if ok { assert.EqualValues(t, "container.image.tag-val", val.Str()) } val, ok = res.Attributes().Get("k8s.cluster.uid") - assert.Equal(t, test == "all_set", ok) + assert.Equal(t, tt == "all_set", ok) if ok { assert.EqualValues(t, "k8s.cluster.uid-val", val.Str()) } val, ok = res.Attributes().Get("k8s.container.name") - assert.Equal(t, test == "all_set", ok) + assert.Equal(t, tt == "all_set", ok) if ok { assert.EqualValues(t, "k8s.container.name-val", val.Str()) } val, ok = res.Attributes().Get("k8s.cronjob.name") - assert.Equal(t, test == "all_set", ok) + assert.Equal(t, tt == "all_set", ok) if ok { assert.EqualValues(t, "k8s.cronjob.name-val", val.Str()) } val, ok = res.Attributes().Get("k8s.daemonset.name") - assert.Equal(t, test == "all_set", ok) + assert.Equal(t, tt == "all_set", ok) if ok { assert.EqualValues(t, "k8s.daemonset.name-val", val.Str()) } val, ok = res.Attributes().Get("k8s.daemonset.uid") - assert.Equal(t, test == "all_set", ok) + assert.Equal(t, tt == "all_set", ok) if ok { assert.EqualValues(t, "k8s.daemonset.uid-val", val.Str()) } @@ -98,17 +105,17 @@ func TestResourceBuilder(t *testing.T) { assert.EqualValues(t, "k8s.deployment.name-val", val.Str()) } val, ok = res.Attributes().Get("k8s.deployment.uid") - assert.Equal(t, test == "all_set", ok) + assert.Equal(t, tt == "all_set", ok) if ok { assert.EqualValues(t, "k8s.deployment.uid-val", val.Str()) } val, ok = res.Attributes().Get("k8s.job.name") - assert.Equal(t, test == "all_set", ok) + assert.Equal(t, tt == "all_set", ok) if ok { assert.EqualValues(t, "k8s.job.name-val", val.Str()) } val, ok = res.Attributes().Get("k8s.job.uid") - assert.Equal(t, test == "all_set", ok) + assert.Equal(t, tt == "all_set", ok) if ok { assert.EqualValues(t, "k8s.job.uid-val", val.Str()) } @@ -123,15 +130,20 @@ func TestResourceBuilder(t *testing.T) { assert.EqualValues(t, "k8s.node.name-val", val.Str()) } val, ok = res.Attributes().Get("k8s.node.uid") - assert.Equal(t, test == "all_set", ok) + assert.Equal(t, tt == "all_set", ok) if ok { assert.EqualValues(t, "k8s.node.uid-val", val.Str()) } val, ok = res.Attributes().Get("k8s.pod.hostname") - assert.Equal(t, test == "all_set", ok) + assert.Equal(t, tt == "all_set", ok) if ok { assert.EqualValues(t, "k8s.pod.hostname-val", val.Str()) } + val, ok = res.Attributes().Get("k8s.pod.ip") + assert.Equal(t, tt == "all_set", ok) + if ok { + assert.EqualValues(t, "k8s.pod.ip-val", val.Str()) + } val, ok = res.Attributes().Get("k8s.pod.name") assert.True(t, ok) if ok { @@ -148,22 +160,22 @@ func TestResourceBuilder(t *testing.T) { assert.EqualValues(t, "k8s.pod.uid-val", val.Str()) } val, ok = res.Attributes().Get("k8s.replicaset.name") - assert.Equal(t, test == "all_set", ok) + assert.Equal(t, tt == "all_set", ok) if ok { assert.EqualValues(t, "k8s.replicaset.name-val", val.Str()) } val, ok = res.Attributes().Get("k8s.replicaset.uid") - assert.Equal(t, test == "all_set", ok) + assert.Equal(t, tt == "all_set", ok) if ok { assert.EqualValues(t, "k8s.replicaset.uid-val", val.Str()) } val, ok = res.Attributes().Get("k8s.statefulset.name") - assert.Equal(t, test == "all_set", ok) + assert.Equal(t, tt == "all_set", ok) if ok { assert.EqualValues(t, "k8s.statefulset.name-val", val.Str()) } val, ok = res.Attributes().Get("k8s.statefulset.uid") - assert.Equal(t, test == "all_set", ok) + assert.Equal(t, tt == "all_set", ok) if ok { assert.EqualValues(t, "k8s.statefulset.uid-val", val.Str()) } diff --git a/processor/k8sattributesprocessor/internal/metadata/generated_status.go b/processor/k8sattributesprocessor/internal/metadata/generated_status.go index 523d8a68b35f..e93559703fe5 100644 --- a/processor/k8sattributesprocessor/internal/metadata/generated_status.go +++ b/processor/k8sattributesprocessor/internal/metadata/generated_status.go @@ -7,11 +7,13 @@ import ( ) var ( - Type = component.MustNewType("k8sattributes") + Type = component.MustNewType("k8sattributes") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor" ) const ( - LogsStability = component.StabilityLevelBeta - MetricsStability = component.StabilityLevelBeta - TracesStability = component.StabilityLevelBeta + ProfilesStability = component.StabilityLevelDevelopment + LogsStability = component.StabilityLevelBeta + MetricsStability = component.StabilityLevelBeta + TracesStability = component.StabilityLevelBeta ) diff --git a/processor/k8sattributesprocessor/internal/metadata/generated_telemetry.go b/processor/k8sattributesprocessor/internal/metadata/generated_telemetry.go index f8e7479c749e..de87e9f26aaa 100644 --- a/processor/k8sattributesprocessor/internal/metadata/generated_telemetry.go +++ b/processor/k8sattributesprocessor/internal/metadata/generated_telemetry.go @@ -3,15 +3,154 @@ package metadata import ( - "go.opentelemetry.io/collector/component" + "errors" + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/metric/noop" "go.opentelemetry.io/otel/trace" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configtelemetry" ) func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/k8sattributes") + return settings.MeterProvider.Meter("github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor") } func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/k8sattributes") + return settings.TracerProvider.Tracer("github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor") +} + +// TelemetryBuilder provides an interface for components to report telemetry +// as defined in metadata and user config. +type TelemetryBuilder struct { + meter metric.Meter + OtelsvcK8sIPLookupMiss metric.Int64Counter + OtelsvcK8sNamespaceAdded metric.Int64Counter + OtelsvcK8sNamespaceDeleted metric.Int64Counter + OtelsvcK8sNamespaceUpdated metric.Int64Counter + OtelsvcK8sNodeAdded metric.Int64Counter + OtelsvcK8sNodeDeleted metric.Int64Counter + OtelsvcK8sNodeUpdated metric.Int64Counter + OtelsvcK8sPodAdded metric.Int64Counter + OtelsvcK8sPodDeleted metric.Int64Counter + OtelsvcK8sPodTableSize metric.Int64Gauge + OtelsvcK8sPodUpdated metric.Int64Counter + OtelsvcK8sReplicasetAdded metric.Int64Counter + OtelsvcK8sReplicasetDeleted metric.Int64Counter + OtelsvcK8sReplicasetUpdated metric.Int64Counter +} + +// TelemetryBuilderOption applies changes to default builder. +type TelemetryBuilderOption interface { + apply(*TelemetryBuilder) +} + +type telemetryBuilderOptionFunc func(mb *TelemetryBuilder) + +func (tbof telemetryBuilderOptionFunc) apply(mb *TelemetryBuilder) { + tbof(mb) +} + +// NewTelemetryBuilder provides a struct with methods to update all internal telemetry +// for a component +func NewTelemetryBuilder(settings component.TelemetrySettings, options ...TelemetryBuilderOption) (*TelemetryBuilder, error) { + builder := TelemetryBuilder{} + for _, op := range options { + op.apply(&builder) + } + builder.meter = Meter(settings) + var err, errs error + builder.OtelsvcK8sIPLookupMiss, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_otelsvc_k8s_ip_lookup_miss", + metric.WithDescription("Number of times pod by IP lookup failed."), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + builder.OtelsvcK8sNamespaceAdded, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_otelsvc_k8s_namespace_added", + metric.WithDescription("Number of namespace add events received"), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + builder.OtelsvcK8sNamespaceDeleted, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_otelsvc_k8s_namespace_deleted", + metric.WithDescription("Number of namespace delete events received"), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + builder.OtelsvcK8sNamespaceUpdated, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_otelsvc_k8s_namespace_updated", + metric.WithDescription("Number of namespace update events received"), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + builder.OtelsvcK8sNodeAdded, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_otelsvc_k8s_node_added", + metric.WithDescription("Number of node add events received"), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + builder.OtelsvcK8sNodeDeleted, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_otelsvc_k8s_node_deleted", + metric.WithDescription("Number of node delete events received"), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + builder.OtelsvcK8sNodeUpdated, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_otelsvc_k8s_node_updated", + metric.WithDescription("Number of node update events received"), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + builder.OtelsvcK8sPodAdded, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_otelsvc_k8s_pod_added", + metric.WithDescription("Number of pod add events received"), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + builder.OtelsvcK8sPodDeleted, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_otelsvc_k8s_pod_deleted", + metric.WithDescription("Number of pod delete events received"), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + builder.OtelsvcK8sPodTableSize, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Gauge( + "otelcol_otelsvc_k8s_pod_table_size", + metric.WithDescription("Size of table containing pod info"), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + builder.OtelsvcK8sPodUpdated, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_otelsvc_k8s_pod_updated", + metric.WithDescription("Number of pod update events received"), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + builder.OtelsvcK8sReplicasetAdded, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_otelsvc_k8s_replicaset_added", + metric.WithDescription("Number of ReplicaSet add events received"), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + builder.OtelsvcK8sReplicasetDeleted, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_otelsvc_k8s_replicaset_deleted", + metric.WithDescription("Number of ReplicaSet delete events received"), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + builder.OtelsvcK8sReplicasetUpdated, err = getLeveledMeter(builder.meter, configtelemetry.LevelBasic, settings.MetricsLevel).Int64Counter( + "otelcol_otelsvc_k8s_replicaset_updated", + metric.WithDescription("Number of ReplicaSet update events received"), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + return &builder, errs +} + +func getLeveledMeter(meter metric.Meter, cfgLevel, srvLevel configtelemetry.Level) metric.Meter { + if cfgLevel <= srvLevel { + return meter + } + return noop.Meter{} } diff --git a/processor/k8sattributesprocessor/internal/metadata/generated_telemetry_test.go b/processor/k8sattributesprocessor/internal/metadata/generated_telemetry_test.go index 9c549be7840f..7dce31df5124 100644 --- a/processor/k8sattributesprocessor/internal/metadata/generated_telemetry_test.go +++ b/processor/k8sattributesprocessor/internal/metadata/generated_telemetry_test.go @@ -14,6 +14,7 @@ import ( nooptrace "go.opentelemetry.io/otel/trace/noop" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" ) type mockMeter struct { @@ -49,15 +50,25 @@ func TestProviders(t *testing.T) { meter := Meter(set) if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/k8sattributes", m.name) + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor", m.name) } else { require.Fail(t, "returned Meter not mockMeter") } tracer := Tracer(set) if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/k8sattributes", m.name) + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor", m.name) } else { require.Fail(t, "returned Meter not mockTracer") } } + +func TestNewTelemetryBuilder(t *testing.T) { + set := componenttest.NewNopTelemetrySettings() + applied := false + _, err := NewTelemetryBuilder(set, telemetryBuilderOptionFunc(func(b *TelemetryBuilder) { + applied = true + })) + require.NoError(t, err) + require.True(t, applied) +} diff --git a/processor/k8sattributesprocessor/internal/metadata/testdata/config.yaml b/processor/k8sattributesprocessor/internal/metadata/testdata/config.yaml index d7f95e5bf943..d2fee538b731 100644 --- a/processor/k8sattributesprocessor/internal/metadata/testdata/config.yaml +++ b/processor/k8sattributesprocessor/internal/metadata/testdata/config.yaml @@ -5,6 +5,8 @@ all_set: enabled: true container.image.name: enabled: true + container.image.repo_digests: + enabled: true container.image.tag: enabled: true k8s.cluster.uid: @@ -33,6 +35,8 @@ all_set: enabled: true k8s.pod.hostname: enabled: true + k8s.pod.ip: + enabled: true k8s.pod.name: enabled: true k8s.pod.start_time: @@ -53,6 +57,8 @@ none_set: enabled: false container.image.name: enabled: false + container.image.repo_digests: + enabled: false container.image.tag: enabled: false k8s.cluster.uid: @@ -81,6 +87,8 @@ none_set: enabled: false k8s.pod.hostname: enabled: false + k8s.pod.ip: + enabled: false k8s.pod.name: enabled: false k8s.pod.start_time: diff --git a/processor/k8sattributesprocessor/internal/observability/empty_test.go b/processor/k8sattributesprocessor/internal/observability/empty_test.go deleted file mode 100644 index 71526f6d1b28..000000000000 --- a/processor/k8sattributesprocessor/internal/observability/empty_test.go +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package observability diff --git a/processor/k8sattributesprocessor/internal/observability/observability.go b/processor/k8sattributesprocessor/internal/observability/observability.go deleted file mode 100644 index 749b801f03f4..000000000000 --- a/processor/k8sattributesprocessor/internal/observability/observability.go +++ /dev/null @@ -1,194 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package observability // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor/internal/observability" - -import ( - "context" - - "go.opencensus.io/stats" - "go.opencensus.io/stats/view" -) - -// TODO: re-think if processor should register it's own telemetry views or if some other -// mechanism should be used by the collector to discover views from all components - -func init() { - _ = view.Register( - viewPodsUpdated, - viewPodsAdded, - viewPodsDeleted, - viewIPLookupMiss, - viewPodTableSize, - viewNamespacesAdded, - viewNamespacesUpdated, - viewNamespacesDeleted, - viewNodesAdded, - viewNodesUpdated, - viewNodesDeleted, - ) -} - -var ( - mPodsUpdated = stats.Int64("otelsvc/k8s/pod_updated", "Number of pod update events received", "1") - mPodsAdded = stats.Int64("otelsvc/k8s/pod_added", "Number of pod add events received", "1") - mPodsDeleted = stats.Int64("otelsvc/k8s/pod_deleted", "Number of pod delete events received", "1") - mPodTableSize = stats.Int64("otelsvc/k8s/pod_table_size", "Size of table containing pod info", "1") - mIPLookupMiss = stats.Int64("otelsvc/k8s/ip_lookup_miss", "Number of times pod by IP lookup failed.", "1") - mNamespacesUpdated = stats.Int64("otelsvc/k8s/namespace_updated", "Number of namespace update events received", "1") - mNamespacesAdded = stats.Int64("otelsvc/k8s/namespace_added", "Number of namespace add events received", "1") - mNamespacesDeleted = stats.Int64("otelsvc/k8s/namespace_deleted", "Number of namespace delete events received", "1") - mNodesUpdated = stats.Int64("otelsvc/k8s/node_updated", "Number of node update events received", "1") - mNodesAdded = stats.Int64("otelsvc/k8s/node_added", "Number of node add events received", "1") - mNodesDeleted = stats.Int64("otelsvc/k8s/node_deleted", "Number of node delete events received", "1") - mReplicaSetsUpdated = stats.Int64("otelsvc/k8s/replicaset_updated", "Number of ReplicaSet update events received", "1") - mReplicaSetsAdded = stats.Int64("otelsvc/k8s/replicaset_added", "Number of ReplicaSet add events received", "1") - mReplicaSetsDeleted = stats.Int64("otelsvc/k8s/replicaset_deleted", "Number of ReplicaSet delete events received", "1") -) - -var viewPodsUpdated = &view.View{ - Name: mPodsUpdated.Name(), - Description: mPodsUpdated.Description(), - Measure: mPodsUpdated, - Aggregation: view.Sum(), -} - -var viewPodsAdded = &view.View{ - Name: mPodsAdded.Name(), - Description: mPodsAdded.Description(), - Measure: mPodsAdded, - Aggregation: view.Sum(), -} - -var viewPodsDeleted = &view.View{ - Name: mPodsDeleted.Name(), - Description: mPodsDeleted.Description(), - Measure: mPodsDeleted, - Aggregation: view.Sum(), -} - -var viewIPLookupMiss = &view.View{ - Name: mIPLookupMiss.Name(), - Description: mIPLookupMiss.Description(), - Measure: mIPLookupMiss, - Aggregation: view.Sum(), -} - -var viewPodTableSize = &view.View{ - Name: mPodTableSize.Name(), - Description: mPodTableSize.Description(), - Measure: mPodTableSize, - Aggregation: view.LastValue(), -} - -var viewNamespacesUpdated = &view.View{ - Name: mNamespacesUpdated.Name(), - Description: mNamespacesUpdated.Description(), - Measure: mNamespacesUpdated, - Aggregation: view.Sum(), -} - -var viewNamespacesAdded = &view.View{ - Name: mNamespacesAdded.Name(), - Description: mNamespacesAdded.Description(), - Measure: mNamespacesAdded, - Aggregation: view.Sum(), -} - -var viewNamespacesDeleted = &view.View{ - Name: mNamespacesDeleted.Name(), - Description: mNamespacesDeleted.Description(), - Measure: mNamespacesDeleted, - Aggregation: view.Sum(), -} - -var viewNodesUpdated = &view.View{ - Name: mNodesUpdated.Name(), - Description: mNodesUpdated.Description(), - Measure: mNodesUpdated, - Aggregation: view.Sum(), -} - -var viewNodesAdded = &view.View{ - Name: mNodesAdded.Name(), - Description: mNodesAdded.Description(), - Measure: mNodesAdded, - Aggregation: view.Sum(), -} - -var viewNodesDeleted = &view.View{ - Name: mNodesDeleted.Name(), - Description: mNodesDeleted.Description(), - Measure: mNodesDeleted, - Aggregation: view.Sum(), -} - -// RecordPodUpdated increments the metric that records pod update events received. -func RecordPodUpdated() { - stats.Record(context.Background(), mPodsUpdated.M(int64(1))) -} - -// RecordPodAdded increments the metric that records pod add events receiver. -func RecordPodAdded() { - stats.Record(context.Background(), mPodsAdded.M(int64(1))) -} - -// RecordPodDeleted increments the metric that records pod events deleted. -func RecordPodDeleted() { - stats.Record(context.Background(), mPodsDeleted.M(int64(1))) -} - -// RecordIPLookupMiss increments the metric that records Pod lookup by IP misses. -func RecordIPLookupMiss() { - stats.Record(context.Background(), mIPLookupMiss.M(int64(1))) -} - -// RecordPodTableSize store size of pod table field in WatchClient -func RecordPodTableSize(podTableSize int64) { - stats.Record(context.Background(), mPodTableSize.M(podTableSize)) -} - -// RecordNamespaceUpdated increments the metric that records namespace update events received. -func RecordNamespaceUpdated() { - stats.Record(context.Background(), mNamespacesUpdated.M(int64(1))) -} - -// RecordNamespaceAdded increments the metric that records namespace add events receiver. -func RecordNamespaceAdded() { - stats.Record(context.Background(), mNamespacesAdded.M(int64(1))) -} - -// RecordNamespaceDeleted increments the metric that records namespace events deleted. -func RecordNamespaceDeleted() { - stats.Record(context.Background(), mNamespacesDeleted.M(int64(1))) -} - -// RecordNodeUpdated increments the metric that records node update events received. -func RecordNodeUpdated() { - stats.Record(context.Background(), mNodesUpdated.M(int64(1))) -} - -// RecordNodeAdded increments the metric that records node add events receiver. -func RecordNodeAdded() { - stats.Record(context.Background(), mNodesAdded.M(int64(1))) -} - -// RecordNodeDeleted increments the metric that records node events deleted. -func RecordNodeDeleted() { - stats.Record(context.Background(), mNodesDeleted.M(int64(1))) -} - -// RecordReplicaSetUpdated increments the metric that records ReplicaSet update events received. -func RecordReplicaSetUpdated() { - stats.Record(context.Background(), mReplicaSetsUpdated.M(int64(1))) -} - -// RecordReplicaSetAdded increments the metric that records ReplicaSet add events receiver. -func RecordReplicaSetAdded() { - stats.Record(context.Background(), mReplicaSetsAdded.M(int64(1))) -} - -// RecordReplicaSetDeleted increments the metric that records ReplicaSet events deleted. -func RecordReplicaSetDeleted() { - stats.Record(context.Background(), mReplicaSetsDeleted.M(int64(1))) -} diff --git a/processor/k8sattributesprocessor/internal/observability/observability_test.go b/processor/k8sattributesprocessor/internal/observability/observability_test.go deleted file mode 100644 index 70567a7b9827..000000000000 --- a/processor/k8sattributesprocessor/internal/observability/observability_test.go +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package observability - -import ( - "context" - "sort" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "go.opencensus.io/metric/metricdata" - "go.opencensus.io/metric/metricexport" -) - -type exporter struct { - pipe chan *metricdata.Metric -} - -func newExporter() *exporter { - return &exporter{make(chan *metricdata.Metric)} -} - -func (e *exporter) ReturnAfter(after int) chan []*metricdata.Metric { - ch := make(chan []*metricdata.Metric) - go func() { - // Sometimes we can get only subset of all metrics, so lets make sure - // we look at unique records - receivedUnique := map[string]*metricdata.Metric{} - for m := range e.pipe { - receivedUnique[m.Descriptor.Name] = m - if len(receivedUnique) >= after { - break - } - } - - var received []*metricdata.Metric - for _, value := range receivedUnique { - received = append(received, value) - } - ch <- received - }() - return ch -} - -func (e *exporter) ExportMetrics(_ context.Context, data []*metricdata.Metric) error { - for _, m := range data { - e.pipe <- m - } - return nil -} - -// NOTE: -// This test can only be run with -count 1 because of static -// metricproducer.GlobalManager() used in metricexport.NewReader(). -func TestMetrics(t *testing.T) { - type testCase struct { - name string - recordFunc func() - } - tests := []testCase{ - { - "otelsvc/k8s/pod_added", - RecordPodAdded, - }, - { - "otelsvc/k8s/pod_deleted", - RecordPodDeleted, - }, - { - "otelsvc/k8s/pod_updated", - RecordPodUpdated, - }, - { - "otelsvc/k8s/ip_lookup_miss", - RecordIPLookupMiss, - }, - { - "otelsvc/k8s/namespace_added", - RecordNamespaceAdded, - }, - { - "otelsvc/k8s/namespace_updated", - RecordNamespaceUpdated, - }, - { - "otelsvc/k8s/namespace_deleted", - RecordNamespaceDeleted, - }, - { - "otelsvc/k8s/node_added", - RecordNodeAdded, - }, - { - "otelsvc/k8s/node_updated", - RecordNodeUpdated, - }, - { - "otelsvc/k8s/node_deleted", - RecordNodeDeleted, - }, - } - - var ( - fail = make(chan struct{}) - chData = make(chan []*metricdata.Metric) - ) - - go func() { - reader := metricexport.NewReader() - e := newExporter() - ch := e.ReturnAfter(len(tests)) - - // Add a manual retry mechanism in case there's a hiccup reading the - // metrics from producers in ReadAndExport(): we can wait for the metrics - // to come instead of failing because they didn't come right away. - for i := 0; i < 10; i++ { - go reader.ReadAndExport(e) - - select { - case <-time.After(500 * time.Millisecond): - - case data := <-ch: - chData <- data - return - } - } - - fail <- struct{}{} - }() - - for _, tt := range tests { - tt.recordFunc() - } - - var data []*metricdata.Metric - select { - case <-fail: - t.Fatalf("timedout waiting for metrics to arrive") - case data = <-chData: - } - - sort.Slice(tests, func(i, j int) bool { - return tests[i].name < tests[j].name - }) - - sort.Slice(data, func(i, j int) bool { - return data[i].Descriptor.Name < data[j].Descriptor.Name - }) - - assert.Len(t, data, len(tests)) - - for i, tt := range tests { - d := data[i] - assert.Equal(t, tt.name, d.Descriptor.Name) - assert.Len(t, d.TimeSeries, 1) - assert.Len(t, d.TimeSeries[0].Points, 1) - assert.Equal(t, int64(1), d.TimeSeries[0].Points[0].Value) - } -} diff --git a/processor/k8sattributesprocessor/metadata.yaml b/processor/k8sattributesprocessor/metadata.yaml index 50ee16e37f51..bd506593dafd 100644 --- a/processor/k8sattributesprocessor/metadata.yaml +++ b/processor/k8sattributesprocessor/metadata.yaml @@ -1,13 +1,14 @@ type: k8sattributes -scope_name: otelcol/k8sattributes status: class: processor stability: beta: [logs, metrics, traces] - distributions: [contrib] + development: [profiles] + distributions: [contrib, k8s] codeowners: - active: [dmitryax, rmfitzpatrick, fatsheep9146, TylerHelmuth] + active: [dmitryax, fatsheep9146, TylerHelmuth, ChrsMark] + emeritus: [rmfitzpatrick] # resource attributes are exposed through a different configuration interface (extract::metadata). resource_attributes: k8s.cluster.uid: @@ -34,6 +35,10 @@ resource_attributes: description: The start time of the Pod. type: string enabled: true + k8s.pod.ip: + description: The IP address of the Pod. + type: string + enabled: false k8s.deployment.name: description: The name of the Deployment. type: string @@ -98,12 +103,117 @@ resource_attributes: description: Name of the image the container was built on. Requires container.id or k8s.container.name. type: string enabled: true + container.image.repo_digests: + description: Repo digests of the container image as provided by the container runtime. + type: slice + enabled: false container.image.tag: - description: Container image tag. Requires container.id or k8s.container.name. + description: Container image tag. Defaults to "latest" if not provided (unless digest also in image path) Requires container.id or k8s.container.name. type: string enabled: true tests: config: + skip_lifecycle: true goleak: skip: true + +telemetry: + metrics: + otelsvc_k8s_pod_updated: + enabled: true + description: Number of pod update events received + unit: "1" + sum: + value_type: int + monotonic: true + otelsvc_k8s_pod_added: + enabled: true + description: Number of pod add events received + unit: "1" + sum: + value_type: int + monotonic: true + otelsvc_k8s_pod_deleted: + enabled: true + description: Number of pod delete events received + unit: "1" + sum: + value_type: int + monotonic: true + otelsvc_k8s_pod_table_size: + enabled: true + description: Size of table containing pod info + unit: "1" + gauge: + value_type: int + otelsvc_k8s_ip_lookup_miss: + enabled: true + description: Number of times pod by IP lookup failed. + unit: "1" + sum: + value_type: int + monotonic: true + otelsvc_k8s_namespace_updated: + enabled: true + description: Number of namespace update events received + unit: "1" + sum: + value_type: int + monotonic: true + otelsvc_k8s_namespace_added: + enabled: true + description: Number of namespace add events received + unit: "1" + sum: + value_type: int + monotonic: true + otelsvc_k8s_namespace_deleted: + enabled: true + description: Number of namespace delete events received + unit: "1" + sum: + value_type: int + monotonic: true + otelsvc_k8s_node_updated: + enabled: true + description: Number of node update events received + unit: "1" + sum: + value_type: int + monotonic: true + otelsvc_k8s_node_added: + enabled: true + description: Number of node add events received + unit: "1" + sum: + value_type: int + monotonic: true + otelsvc_k8s_node_deleted: + enabled: true + description: Number of node delete events received + unit: "1" + sum: + value_type: int + monotonic: true + otelsvc_k8s_replicaset_updated: + enabled: true + description: Number of ReplicaSet update events received + unit: "1" + sum: + value_type: int + monotonic: true + otelsvc_k8s_replicaset_added: + enabled: true + description: Number of ReplicaSet add events received + unit: "1" + sum: + value_type: int + monotonic: true + otelsvc_k8s_replicaset_deleted: + enabled: true + description: Number of ReplicaSet delete events received + unit: "1" + sum: + value_type: int + monotonic: true diff --git a/processor/k8sattributesprocessor/options.go b/processor/k8sattributesprocessor/options.go index 033d3bb303c0..4ccccb0d4638 100644 --- a/processor/k8sattributesprocessor/options.go +++ b/processor/k8sattributesprocessor/options.go @@ -7,6 +7,7 @@ import ( "fmt" "os" "regexp" + "time" conventions "go.opentelemetry.io/collector/semconv/v1.6.1" "k8s.io/apimachinery/pkg/selection" @@ -21,10 +22,15 @@ const ( filterOPNotEquals = "not-equals" filterOPExists = "exists" filterOPDoesNotExist = "does-not-exist" + metadataPodIP = "k8s.pod.ip" metadataPodStartTime = "k8s.pod.start_time" specPodHostName = "k8s.pod.hostname" - // TODO: use k8s.cluster.uid from semconv when available, and replace clusterUID with conventions.AttributeClusterUid - clusterUID = "k8s.cluster.uid" + // TODO: use k8s.cluster.uid, container.image.repo_digests + // from semconv when available, + // replace clusterUID with conventions.AttributeK8SClusterUID + // replace containerRepoDigests with conventions.AttributeContainerImageRepoDigests + clusterUID = "k8s.cluster.uid" + containerImageRepoDigests = "container.image.repo_digests" ) // option represents a configuration option that can be passes. @@ -61,6 +67,9 @@ func enabledAttributes() (attributes []string) { if defaultConfig.ContainerImageName.Enabled { attributes = append(attributes, conventions.AttributeContainerImageName) } + if defaultConfig.ContainerImageRepoDigests.Enabled { + attributes = append(attributes, containerImageRepoDigests) + } if defaultConfig.ContainerImageTag.Enabled { attributes = append(attributes, conventions.AttributeContainerImageTag) } @@ -109,6 +118,9 @@ func enabledAttributes() (attributes []string) { if defaultConfig.K8sPodUID.Enabled { attributes = append(attributes, conventions.AttributeK8SPodUID) } + if defaultConfig.K8sPodIP.Enabled { + attributes = append(attributes, metadataPodIP) + } if defaultConfig.K8sReplicasetName.Enabled { attributes = append(attributes, conventions.AttributeK8SReplicaSetName) } @@ -140,6 +152,8 @@ func withExtractMetadata(fields ...string) option { p.rules.PodHostName = true case metadataPodStartTime: p.rules.StartTime = true + case metadataPodIP: + p.rules.PodIP = true case conventions.AttributeK8SDeploymentName: p.rules.DeploymentName = true case conventions.AttributeK8SDeploymentUID: @@ -172,6 +186,8 @@ func withExtractMetadata(fields ...string) option { p.rules.ContainerID = true case conventions.AttributeContainerImageName: p.rules.ContainerImageName = true + case containerImageRepoDigests: + p.rules.ContainerImageRepoDigests = true case conventions.AttributeContainerImageTag: p.rules.ContainerImageTag = true case clusterUID: @@ -366,3 +382,19 @@ func withExcludes(podExclude ExcludeConfig) option { return nil } } + +// withWaitForMetadata allows specifying whether to wait for pod metadata to be synced. +func withWaitForMetadata(wait bool) option { + return func(p *kubernetesprocessor) error { + p.waitForMetadata = wait + return nil + } +} + +// withWaitForMetadataTimeout allows specifying the timeout for waiting for pod metadata to be synced. +func withWaitForMetadataTimeout(timeout time.Duration) option { + return func(p *kubernetesprocessor) error { + p.waitForMetadataTimeout = timeout + return nil + } +} diff --git a/processor/k8sattributesprocessor/options_test.go b/processor/k8sattributesprocessor/options_test.go index a87874597c7c..17ca2716a19f 100644 --- a/processor/k8sattributesprocessor/options_test.go +++ b/processor/k8sattributesprocessor/options_test.go @@ -20,12 +20,11 @@ func TestWithAPIConfig(t *testing.T) { p := &kubernetesprocessor{} apiConfig := k8sconfig.APIConfig{AuthType: "test-auth-type"} err := withAPIConfig(apiConfig)(p) - assert.Error(t, err) - assert.Equal(t, "invalid authType for kubernetes: test-auth-type", err.Error()) + require.EqualError(t, err, "invalid authType for kubernetes: test-auth-type") apiConfig = k8sconfig.APIConfig{AuthType: "kubeConfig"} err = withAPIConfig(apiConfig)(p) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, apiConfig, p.apiConfig) } @@ -200,15 +199,12 @@ func TestWithExtractAnnotations(t *testing.T) { p := &kubernetesprocessor{} opt := withExtractAnnotations(tt.args...) err := opt(p) - if tt.wantError == "" { - assert.NoError(t, err) + if tt.wantError != "" { + require.EqualError(t, err, tt.wantError) } else { - assert.Error(t, err) - assert.Equal(t, tt.wantError, err.Error()) - return + require.NoError(t, err) + assert.Equal(t, tt.want, p.rules.Annotations) } - got := p.rules.Annotations - assert.Equal(t, tt.want, got) }) } } @@ -342,14 +338,12 @@ func TestWithExtractLabels(t *testing.T) { p := &kubernetesprocessor{} opt := withExtractLabels(tt.args...) err := opt(p) - if tt.wantError == "" { - assert.NoError(t, err) + if tt.wantError != "" { + require.EqualError(t, err, tt.wantError) } else { - assert.Error(t, err) - assert.Equal(t, tt.wantError, err.Error()) - return + require.NoError(t, err) + assert.Equal(t, tt.want, p.rules.Labels) } - assert.Equal(t, tt.want, p.rules.Labels) }) } } @@ -490,7 +484,6 @@ func TestWithFilterLabels(t *testing.T) { } func TestWithFilterFields(t *testing.T) { - tests := []struct { name string args []FieldFilterConfig diff --git a/processor/k8sattributesprocessor/pod_association.go b/processor/k8sattributesprocessor/pod_association.go index 621ce03b11c7..d40ab81bc873 100644 --- a/processor/k8sattributesprocessor/pod_association.go +++ b/processor/k8sattributesprocessor/pod_association.go @@ -6,12 +6,12 @@ package k8sattributesprocessor // import "github.com/open-telemetry/opentelemetr import ( "context" "net" - "strings" "go.opentelemetry.io/collector/client" "go.opentelemetry.io/collector/pdata/pcommon" conventions "go.opentelemetry.io/collector/semconv/v1.6.1" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/clientutil" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor/internal/kube" ) @@ -22,7 +22,7 @@ func extractPodID(ctx context.Context, attrs pcommon.Map, associations []kube.As return extractPodIDNoAssociations(ctx, attrs) } - connectionIP := connectionIP(ctx) + connectionIP := clientutil.Address(client.FromContext(ctx)) for _, asso := range associations { skip := false @@ -81,7 +81,7 @@ func extractPodIDNoAssociations(ctx context.Context, attrs pcommon.Map) kube.Pod } } - connectionIP := connectionIP(ctx) + connectionIP := clientutil.Address(client.FromContext(ctx)) if connectionIP != "" { return kube.PodIdentifier{ kube.PodIdentifierAttributeFromConnection(connectionIP), @@ -98,36 +98,6 @@ func extractPodIDNoAssociations(ctx context.Context, attrs pcommon.Map) kube.Pod return kube.PodIdentifier{} } -func connectionIP(ctx context.Context) string { - c := client.FromContext(ctx) - if c.Addr == nil { - return "" - } - switch addr := c.Addr.(type) { - case *net.UDPAddr: - return addr.IP.String() - case *net.TCPAddr: - return addr.IP.String() - case *net.IPAddr: - return addr.IP.String() - } - - // If this is not a known address type, check for known "untyped" formats. - // 1.1.1.1: - - lastColonIndex := strings.LastIndex(c.Addr.String(), ":") - if lastColonIndex != -1 { - ipString := c.Addr.String()[:lastColonIndex] - ip := net.ParseIP(ipString) - if ip != nil { - return ip.String() - } - } - - return c.Addr.String() - -} - func stringAttributeFromMap(attrs pcommon.Map, key string) string { if val, ok := attrs.Get(key); ok { if val.Type() == pcommon.ValueTypeStr { diff --git a/processor/k8sattributesprocessor/processor.go b/processor/k8sattributesprocessor/processor.go index b2c4e82490f0..e656a41469bc 100644 --- a/processor/k8sattributesprocessor/processor.go +++ b/processor/k8sattributesprocessor/processor.go @@ -7,11 +7,14 @@ import ( "context" "fmt" "strconv" + "time" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componentstatus" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/pmetric" + "go.opentelemetry.io/collector/pdata/pprofile" "go.opentelemetry.io/collector/pdata/ptrace" conventions "go.opentelemetry.io/collector/semconv/v1.8.0" "go.uber.org/zap" @@ -25,25 +28,27 @@ const ( ) type kubernetesprocessor struct { - cfg component.Config - options []option - telemetrySettings component.TelemetrySettings - logger *zap.Logger - apiConfig k8sconfig.APIConfig - kc kube.Client - passthroughMode bool - rules kube.ExtractionRules - filters kube.Filters - podAssociations []kube.Association - podIgnore kube.Excludes + cfg component.Config + options []option + telemetrySettings component.TelemetrySettings + logger *zap.Logger + apiConfig k8sconfig.APIConfig + kc kube.Client + passthroughMode bool + rules kube.ExtractionRules + filters kube.Filters + podAssociations []kube.Association + podIgnore kube.Excludes + waitForMetadata bool + waitForMetadataTimeout time.Duration } -func (kp *kubernetesprocessor) initKubeClient(logger *zap.Logger, kubeClient kube.ClientProvider) error { +func (kp *kubernetesprocessor) initKubeClient(set component.TelemetrySettings, kubeClient kube.ClientProvider) error { if kubeClient == nil { kubeClient = kube.New } if !kp.passthroughMode { - kc, err := kubeClient(logger, kp.apiConfig, kp.rules, kp.filters, kp.podAssociations, kp.podIgnore, nil, nil, nil, nil) + kc, err := kubeClient(set, kp.apiConfig, kp.rules, kp.filters, kp.podAssociations, kp.podIgnore, nil, nil, nil, nil, kp.waitForMetadata, kp.waitForMetadataTimeout) if err != nil { return err } @@ -52,26 +57,32 @@ func (kp *kubernetesprocessor) initKubeClient(logger *zap.Logger, kubeClient kub return nil } -func (kp *kubernetesprocessor) Start(_ context.Context, _ component.Host) error { +func (kp *kubernetesprocessor) Start(_ context.Context, host component.Host) error { allOptions := append(createProcessorOpts(kp.cfg), kp.options...) for _, opt := range allOptions { if err := opt(kp); err != nil { - kp.telemetrySettings.ReportStatus(component.NewFatalErrorEvent(err)) - return nil + kp.logger.Error("Could not apply option", zap.Error(err)) + componentstatus.ReportStatus(host, componentstatus.NewFatalErrorEvent(err)) + return err } } // This might have been set by an option already if kp.kc == nil { - err := kp.initKubeClient(kp.logger, kubeClientProvider) + err := kp.initKubeClient(kp.telemetrySettings, kubeClientProvider) if err != nil { - kp.telemetrySettings.ReportStatus(component.NewFatalErrorEvent(err)) - return nil + kp.logger.Error("Could not initialize kube client", zap.Error(err)) + componentstatus.ReportStatus(host, componentstatus.NewFatalErrorEvent(err)) + return err } } if !kp.passthroughMode { - go kp.kc.Start() + err := kp.kc.Start() + if err != nil { + componentstatus.ReportStatus(host, componentstatus.NewFatalErrorEvent(err)) + return err + } } return nil } @@ -116,6 +127,16 @@ func (kp *kubernetesprocessor) processLogs(ctx context.Context, ld plog.Logs) (p return ld, nil } +// processProfiles process profiles and add k8s metadata using resource IP, hostname or incoming IP as pod origin. +func (kp *kubernetesprocessor) processProfiles(ctx context.Context, pd pprofile.Profiles) (pprofile.Profiles, error) { + rp := pd.ResourceProfiles() + for i := 0; i < rp.Len(); i++ { + kp.processResource(ctx, rp.At(i).Resource()) + } + + return pd, nil +} + // processResource adds Pod metadata tags to resource based on pod association configuration func (kp *kubernetesprocessor) processResource(ctx context.Context, resource pcommon.Resource) { podIdentifierValue := extractPodID(ctx, resource.Attributes(), kp.podAssociations) @@ -123,9 +144,7 @@ func (kp *kubernetesprocessor) processResource(ctx context.Context, resource pco for i := range podIdentifierValue { if podIdentifierValue[i].Source.From == kube.ConnectionSource && podIdentifierValue[i].Value != "" { - if _, found := resource.Attributes().Get(kube.K8sIPLabelName); !found { - resource.Attributes().PutStr(kube.K8sIPLabelName, podIdentifierValue[i].Value) - } + setResourceAttribute(resource.Attributes(), kube.K8sIPLabelName, podIdentifierValue[i].Value) break } } @@ -140,9 +159,7 @@ func (kp *kubernetesprocessor) processResource(ctx context.Context, resource pco kp.logger.Debug("getting the pod", zap.Any("pod", pod)) for key, val := range pod.Attributes { - if _, found := resource.Attributes().Get(key); !found { - resource.Attributes().PutStr(key, val) - } + setResourceAttribute(resource.Attributes(), key, val) } kp.addContainerAttributes(resource.Attributes(), pod) } @@ -152,9 +169,7 @@ func (kp *kubernetesprocessor) processResource(ctx context.Context, resource pco if namespace != "" { attrsToAdd := kp.getAttributesForPodsNamespace(namespace) for key, val := range attrsToAdd { - if _, found := resource.Attributes().Get(key); !found { - resource.Attributes().PutStr(key, val) - } + setResourceAttribute(resource.Attributes(), key, val) } } @@ -162,19 +177,22 @@ func (kp *kubernetesprocessor) processResource(ctx context.Context, resource pco if nodeName != "" { attrsToAdd := kp.getAttributesForPodsNode(nodeName) for key, val := range attrsToAdd { - if _, found := resource.Attributes().Get(key); !found { - resource.Attributes().PutStr(key, val) - } + setResourceAttribute(resource.Attributes(), key, val) } nodeUID := kp.getUIDForPodsNode(nodeName) if nodeUID != "" { - if _, found := resource.Attributes().Get(conventions.AttributeK8SNodeUID); !found { - resource.Attributes().PutStr(conventions.AttributeK8SNodeUID, nodeUID) - } + setResourceAttribute(resource.Attributes(), conventions.AttributeK8SNodeUID, nodeUID) } } } +func setResourceAttribute(attributes pcommon.Map, key string, val string) { + attr, found := attributes.Get(key) + if !found || attr.AsString() == "" { + attributes.PutStr(key, val) + } +} + func getNamespace(pod *kube.Pod, resAttrs pcommon.Map) string { if pod != nil && pod.Namespace != "" { return pod.Namespace @@ -212,19 +230,13 @@ func (kp *kubernetesprocessor) addContainerAttributes(attrs pcommon.Map, pod *ku return } if containerSpec.Name != "" { - if _, found := attrs.Get(conventions.AttributeK8SContainerName); !found { - attrs.PutStr(conventions.AttributeK8SContainerName, containerSpec.Name) - } + setResourceAttribute(attrs, conventions.AttributeK8SContainerName, containerSpec.Name) } if containerSpec.ImageName != "" { - if _, found := attrs.Get(conventions.AttributeContainerImageName); !found { - attrs.PutStr(conventions.AttributeContainerImageName, containerSpec.ImageName) - } + setResourceAttribute(attrs, conventions.AttributeContainerImageName, containerSpec.ImageName) } if containerSpec.ImageTag != "" { - if _, found := attrs.Get(conventions.AttributeContainerImageTag); !found { - attrs.PutStr(conventions.AttributeContainerImageTag, containerSpec.ImageTag) - } + setResourceAttribute(attrs, conventions.AttributeContainerImageTag, containerSpec.ImageTag) } // attempt to get container ID from restart count runID := -1 @@ -245,10 +257,13 @@ func (kp *kubernetesprocessor) addContainerAttributes(attrs pcommon.Map, pod *ku } } if runID != -1 { - if containerStatus, ok := containerSpec.Statuses[runID]; ok && containerStatus.ContainerID != "" { - if _, found := attrs.Get(conventions.AttributeContainerID); !found { + if containerStatus, ok := containerSpec.Statuses[runID]; ok { + if _, found := attrs.Get(conventions.AttributeContainerID); !found && containerStatus.ContainerID != "" { attrs.PutStr(conventions.AttributeContainerID, containerStatus.ContainerID) } + if _, found := attrs.Get(containerImageRepoDigests); !found && containerStatus.ImageRepoDigest != "" { + attrs.PutEmptySlice(containerImageRepoDigests).AppendEmpty().SetStr(containerStatus.ImageRepoDigest) + } } } } diff --git a/processor/k8sattributesprocessor/processor_test.go b/processor/k8sattributesprocessor/processor_test.go index d22de00d7259..ee51cc82d9f0 100644 --- a/processor/k8sattributesprocessor/processor_test.go +++ b/processor/k8sattributesprocessor/processor_test.go @@ -14,17 +14,20 @@ import ( "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/client" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componentstatus" "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/consumer/consumertest" + "go.opentelemetry.io/collector/consumer/xconsumer" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/pmetric" + "go.opentelemetry.io/collector/pdata/pprofile" "go.opentelemetry.io/collector/pdata/ptrace" "go.opentelemetry.io/collector/processor" "go.opentelemetry.io/collector/processor/processortest" + "go.opentelemetry.io/collector/processor/xprocessor" conventions "go.opentelemetry.io/collector/semconv/v1.8.0" - "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor/internal/kube" @@ -42,13 +45,10 @@ func newPodIdentifier(from string, name string, value string) kube.PodIdentifier } } -func newTracesProcessor(cfg component.Config, next consumer.Traces, errFunc func(error), options ...option) (processor.Traces, error) { +func newTracesProcessor(cfg component.Config, next consumer.Traces, options ...option) (processor.Traces, error) { opts := options opts = append(opts, withKubeClientProvider(newFakeClient)) - set := processortest.NewNopCreateSettings() - set.ReportStatus = func(event *component.StatusEvent) { - errFunc(event.Err()) - } + set := processortest.NewNopSettings() return createTracesProcessorWithOptions( context.Background(), set, @@ -58,13 +58,10 @@ func newTracesProcessor(cfg component.Config, next consumer.Traces, errFunc func ) } -func newMetricsProcessor(cfg component.Config, nextMetricsConsumer consumer.Metrics, errFunc func(error), options ...option) (processor.Metrics, error) { +func newMetricsProcessor(cfg component.Config, nextMetricsConsumer consumer.Metrics, options ...option) (processor.Metrics, error) { opts := options opts = append(opts, withKubeClientProvider(newFakeClient)) - set := processortest.NewNopCreateSettings() - set.ReportStatus = func(event *component.StatusEvent) { - errFunc(event.Err()) - } + set := processortest.NewNopSettings() return createMetricsProcessorWithOptions( context.Background(), set, @@ -74,13 +71,10 @@ func newMetricsProcessor(cfg component.Config, nextMetricsConsumer consumer.Metr ) } -func newLogsProcessor(cfg component.Config, nextLogsConsumer consumer.Logs, errFunc func(error), options ...option) (processor.Logs, error) { +func newLogsProcessor(cfg component.Config, nextLogsConsumer consumer.Logs, options ...option) (processor.Logs, error) { opts := options opts = append(opts, withKubeClientProvider(newFakeClient)) - set := processortest.NewNopCreateSettings() - set.ReportStatus = func(event *component.StatusEvent) { - errFunc(event.Err()) - } + set := processortest.NewNopSettings() return createLogsProcessorWithOptions( context.Background(), set, @@ -90,10 +84,23 @@ func newLogsProcessor(cfg component.Config, nextLogsConsumer consumer.Logs, errF ) } +func newProfilesProcessor(cfg component.Config, nextProfilesConsumer xconsumer.Profiles, options ...option) (xprocessor.Profiles, error) { + opts := options + opts = append(opts, withKubeClientProvider(newFakeClient)) + set := processortest.NewNopSettings() + return createProfilesProcessorWithOptions( + context.Background(), + set, + cfg, + nextProfilesConsumer, + opts..., + ) +} + // withKubeClientProvider sets the specific implementation for getting K8s Client instances func withKubeClientProvider(kcp kube.ClientProvider) option { return func(p *kubernetesprocessor) error { - return p.initKubeClient(p.logger, kcp) + return p.initKubeClient(p.telemetrySettings, kcp) } } @@ -111,14 +118,17 @@ type multiTest struct { tp processor.Traces mp processor.Metrics lp processor.Logs + pp xprocessor.Profiles - nextTrace *consumertest.TracesSink - nextMetrics *consumertest.MetricsSink - nextLogs *consumertest.LogsSink + nextTrace *consumertest.TracesSink + nextMetrics *consumertest.MetricsSink + nextLogs *consumertest.LogsSink + nextProfiles *consumertest.ProfilesSink - kpMetrics *kubernetesprocessor - kpTrace *kubernetesprocessor - kpLogs *kubernetesprocessor + kpMetrics *kubernetesprocessor + kpTrace *kubernetesprocessor + kpLogs *kubernetesprocessor + kpProfiles *kubernetesprocessor } func newMultiTest( @@ -128,39 +138,65 @@ func newMultiTest( options ...option, ) *multiTest { m := &multiTest{ - t: t, - nextTrace: new(consumertest.TracesSink), - nextMetrics: new(consumertest.MetricsSink), - nextLogs: new(consumertest.LogsSink), + t: t, + nextTrace: new(consumertest.TracesSink), + nextMetrics: new(consumertest.MetricsSink), + nextLogs: new(consumertest.LogsSink), + nextProfiles: new(consumertest.ProfilesSink), } - tp, err := newTracesProcessor(cfg, m.nextTrace, errFunc, append(options, withExtractKubernetesProcessorInto(&m.kpTrace))...) + tp, err := newTracesProcessor(cfg, m.nextTrace, append(options, withExtractKubernetesProcessorInto(&m.kpTrace))...) require.NoError(t, err) - err = tp.Start(context.Background(), componenttest.NewNopHost()) + err = tp.Start(context.Background(), &nopHost{ + reportFunc: func(event *componentstatus.Event) { + errFunc(event.Err()) + }, + }) if errFunc == nil { assert.NotNil(t, tp) require.NoError(t, err) } - mp, err := newMetricsProcessor(cfg, m.nextMetrics, errFunc, append(options, withExtractKubernetesProcessorInto(&m.kpMetrics))...) + mp, err := newMetricsProcessor(cfg, m.nextMetrics, append(options, withExtractKubernetesProcessorInto(&m.kpMetrics))...) require.NoError(t, err) - err = mp.Start(context.Background(), componenttest.NewNopHost()) + err = mp.Start(context.Background(), &nopHost{ + reportFunc: func(event *componentstatus.Event) { + errFunc(event.Err()) + }, + }) if errFunc == nil { assert.NotNil(t, mp) require.NoError(t, err) } - lp, err := newLogsProcessor(cfg, m.nextLogs, errFunc, append(options, withExtractKubernetesProcessorInto(&m.kpLogs))...) + lp, err := newLogsProcessor(cfg, m.nextLogs, append(options, withExtractKubernetesProcessorInto(&m.kpLogs))...) require.NoError(t, err) - err = lp.Start(context.Background(), componenttest.NewNopHost()) + err = lp.Start(context.Background(), &nopHost{ + reportFunc: func(event *componentstatus.Event) { + errFunc(event.Err()) + }, + }) if errFunc == nil { assert.NotNil(t, lp) require.NoError(t, err) } + pp, err := newProfilesProcessor(cfg, m.nextProfiles, append(options, withExtractKubernetesProcessorInto(&m.kpProfiles))...) + require.NoError(t, err) + err = pp.Start(context.Background(), &nopHost{ + reportFunc: func(event *componentstatus.Event) { + errFunc(event.Err()) + }, + }) + if errFunc == nil { + assert.NotNil(t, pp) + require.NoError(t, err) + } + m.tp = tp m.mp = mp m.lp = lp + m.pp = pp return m } @@ -169,12 +205,14 @@ func (m *multiTest) testConsume( traces ptrace.Traces, metrics pmetric.Metrics, logs plog.Logs, + profiles pprofile.Profiles, errFunc func(err error), ) { errs := []error{ m.tp.ConsumeTraces(ctx, traces), m.mp.ConsumeMetrics(ctx, metrics), m.lp.ConsumeLogs(ctx, logs), + m.pp.ConsumeProfiles(ctx, profiles), } for _, err := range errs { @@ -188,24 +226,28 @@ func (m *multiTest) kubernetesProcessorOperation(kpOp func(kp *kubernetesprocess kpOp(m.kpTrace) kpOp(m.kpMetrics) kpOp(m.kpLogs) + kpOp(m.kpProfiles) } func (m *multiTest) assertBatchesLen(batchesLen int) { require.Len(m.t, m.nextTrace.AllTraces(), batchesLen) require.Len(m.t, m.nextMetrics.AllMetrics(), batchesLen) require.Len(m.t, m.nextLogs.AllLogs(), batchesLen) + require.Len(m.t, m.nextProfiles.AllProfiles(), batchesLen) } func (m *multiTest) assertResourceObjectLen(batchNo int) { assert.Equal(m.t, 1, m.nextTrace.AllTraces()[batchNo].ResourceSpans().Len()) assert.Equal(m.t, 1, m.nextMetrics.AllMetrics()[batchNo].ResourceMetrics().Len()) assert.Equal(m.t, 1, m.nextLogs.AllLogs()[batchNo].ResourceLogs().Len()) + assert.Equal(m.t, 1, m.nextProfiles.AllProfiles()[batchNo].ResourceProfiles().Len()) } func (m *multiTest) assertResourceAttributesLen(batchNo int, attrsLen int) { assert.Equal(m.t, attrsLen, m.nextTrace.AllTraces()[batchNo].ResourceSpans().At(0).Resource().Attributes().Len()) assert.Equal(m.t, attrsLen, m.nextMetrics.AllMetrics()[batchNo].ResourceMetrics().At(0).Resource().Attributes().Len()) assert.Equal(m.t, attrsLen, m.nextLogs.AllLogs()[batchNo].ResourceLogs().At(0).Resource().Attributes().Len()) + assert.Equal(m.t, attrsLen, m.nextProfiles.AllProfiles()[batchNo].ResourceProfiles().At(0).Resource().Attributes().Len()) } func (m *multiTest) assertResource(batchNum int, resourceFunc func(res pcommon.Resource)) { @@ -224,13 +266,12 @@ func TestNewProcessor(t *testing.T) { } func TestProcessorBadClientProvider(t *testing.T) { - clientProvider := func(_ *zap.Logger, _ k8sconfig.APIConfig, _ kube.ExtractionRules, _ kube.Filters, _ []kube.Association, _ kube.Excludes, _ kube.APIClientsetProvider, _ kube.InformerProvider, _ kube.InformerProviderNamespace, _ kube.InformerProviderReplicaSet) (kube.Client, error) { + clientProvider := func(_ component.TelemetrySettings, _ k8sconfig.APIConfig, _ kube.ExtractionRules, _ kube.Filters, _ []kube.Association, _ kube.Excludes, _ kube.APIClientsetProvider, _ kube.InformerProvider, _ kube.InformerProviderNamespace, _ kube.InformerProviderReplicaSet, _ bool, _ time.Duration) (kube.Client, error) { return nil, fmt.Errorf("bad client error") } newMultiTest(t, NewFactory().CreateDefaultConfig(), func(err error) { - require.Error(t, err) - assert.Equal(t, "bad client error", err.Error()) + require.EqualError(t, err, "bad client error") }, withKubeClientProvider(clientProvider)) } @@ -271,6 +312,17 @@ func generateLogs(resourceFunc ...generateResourceFunc) plog.Logs { return l } +func generateProfiles(resourceFunc ...generateResourceFunc) pprofile.Profiles { + p := pprofile.NewProfiles() + ps := p.ResourceProfiles().AppendEmpty() + for _, resFun := range resourceFunc { + res := ps.Resource() + resFun(res) + } + ps.ScopeProfiles().AppendEmpty().Profiles().AppendEmpty() + return p +} + func withPassthroughIP(passthroughIP string) generateResourceFunc { return func(res pcommon.Resource) { res.Attributes().PutStr(kube.K8sIPLabelName, passthroughIP) @@ -318,7 +370,6 @@ func (strAddr) Network() string { } func TestIPDetectionFromContext(t *testing.T) { - addresses := []net.Addr{ &net.IPAddr{ IP: net.IPv4(1, 1, 1, 1), @@ -343,6 +394,7 @@ func TestIPDetectionFromContext(t *testing.T) { generateTraces(), generateMetrics(), generateLogs(), + generateProfiles(), func(err error) { assert.NoError(t, err) }) @@ -350,11 +402,10 @@ func TestIPDetectionFromContext(t *testing.T) { m.assertBatchesLen(1) m.assertResourceObjectLen(0) m.assertResource(0, func(r pcommon.Resource) { - require.Greater(t, r.Attributes().Len(), 0) + require.Positive(t, r.Attributes().Len()) assertResourceHasStringAttribute(t, r, "k8s.pod.ip", "1.1.1.1") }) } - } func TestNilBatch(t *testing.T) { @@ -364,6 +415,7 @@ func TestNilBatch(t *testing.T) { ptrace.NewTraces(), pmetric.NewMetrics(), generateLogs(), + generateProfiles(), func(err error) { assert.NoError(t, err) }) @@ -398,6 +450,7 @@ func TestProcessorNoAttrs(t *testing.T) { generateTraces(), generateMetrics(), generateLogs(), + generateProfiles(), func(err error) { assert.NoError(t, err) }) @@ -427,6 +480,7 @@ func TestProcessorNoAttrs(t *testing.T) { generateTraces(), generateMetrics(), generateLogs(), + generateProfiles(), func(err error) { assert.NoError(t, err) }) @@ -444,6 +498,7 @@ func TestProcessorNoAttrs(t *testing.T) { generateTraces(), generateMetrics(), generateLogs(), + generateProfiles(), func(err error) { assert.NoError(t, err) }) @@ -460,7 +515,7 @@ func TestNoIP(t *testing.T) { nil, ) - m.testConsume(context.Background(), generateTraces(), generateMetrics(), generateLogs(), nil) + m.testConsume(context.Background(), generateTraces(), generateMetrics(), generateLogs(), generateProfiles(), nil) m.assertBatchesLen(1) m.assertResourceObjectLen(0) @@ -516,6 +571,7 @@ func TestIPSourceWithoutPodAssociation(t *testing.T) { traces := generateTraces() metrics := generateMetrics() logs := generateLogs() + profiles := generateProfiles() resources := []pcommon.Resource{ traces.ResourceSpans().At(0).Resource(), @@ -531,10 +587,10 @@ func TestIPSourceWithoutPodAssociation(t *testing.T) { } } - m.testConsume(ctx, traces, metrics, logs, nil) + m.testConsume(ctx, traces, metrics, logs, profiles, nil) m.assertBatchesLen(i + 1) m.assertResource(i, func(res pcommon.Resource) { - require.Greater(t, res.Attributes().Len(), 0) + require.Positive(t, res.Attributes().Len()) assertResourceHasStringAttribute(t, res, "k8s.pod.ip", tc.out) }) }) @@ -606,21 +662,23 @@ func TestIPSourceWithPodAssociation(t *testing.T) { traces := generateTraces() metrics := generateMetrics() logs := generateLogs() + profiles := generateProfiles() resources := []pcommon.Resource{ traces.ResourceSpans().At(0).Resource(), metrics.ResourceMetrics().At(0).Resource(), logs.ResourceLogs().At(0).Resource(), + profiles.ResourceProfiles().At(0).Resource(), } for _, res := range resources { res.Attributes().PutStr(tc.labelName, tc.labelValue) } - m.testConsume(ctx, traces, metrics, logs, nil) + m.testConsume(ctx, traces, metrics, logs, profiles, nil) m.assertBatchesLen(i + 1) m.assertResource(i, func(res pcommon.Resource) { - require.Greater(t, res.Attributes().Len(), 0) + require.Positive(t, res.Attributes().Len()) assertResourceHasStringAttribute(t, res, tc.outLabel, tc.outValue) }) }) @@ -658,12 +716,13 @@ func TestPodUID(t *testing.T) { generateTraces(withPodUID("ef10d10b-2da5-4030-812e-5f45c1531227")), generateMetrics(withPodUID("ef10d10b-2da5-4030-812e-5f45c1531227")), generateLogs(withPodUID("ef10d10b-2da5-4030-812e-5f45c1531227")), + generateProfiles(withPodUID("ef10d10b-2da5-4030-812e-5f45c1531227")), nil) m.assertBatchesLen(1) m.assertResourceObjectLen(0) m.assertResource(0, func(r pcommon.Resource) { - require.Greater(t, r.Attributes().Len(), 0) + require.Positive(t, r.Attributes().Len()) assertResourceHasStringAttribute(t, r, "k8s.pod.uid", "ef10d10b-2da5-4030-812e-5f45c1531227") }) } @@ -718,6 +777,7 @@ func TestAddPodLabels(t *testing.T) { generateTraces(), generateMetrics(), generateLogs(), + generateProfiles(), func(err error) { assert.NoError(t, err) }) @@ -725,7 +785,7 @@ func TestAddPodLabels(t *testing.T) { m.assertBatchesLen(i + 1) m.assertResourceObjectLen(i) m.assertResource(i, func(res pcommon.Resource) { - require.Greater(t, res.Attributes().Len(), 0) + require.Positive(t, res.Attributes().Len()) assertResourceHasStringAttribute(t, res, "k8s.pod.ip", ip) for k, v := range attrs { assertResourceHasStringAttribute(t, res, k, v) @@ -795,6 +855,7 @@ func TestAddNamespaceLabels(t *testing.T) { generateTraces(), generateMetrics(), generateLogs(), + generateProfiles(), func(err error) { assert.NoError(t, err) }) @@ -867,6 +928,7 @@ func TestAddNodeLabels(t *testing.T) { generateTraces(), generateMetrics(), generateLogs(), + generateProfiles(), func(err error) { assert.NoError(t, err) }) @@ -932,6 +994,7 @@ func TestAddNodeUID(t *testing.T) { generateTraces(), generateMetrics(), generateLogs(), + generateProfiles(), func(err error) { assert.NoError(t, err) }) @@ -951,7 +1014,7 @@ func TestProcessorAddContainerAttributes(t *testing.T) { name string op func(kp *kubernetesprocessor) resourceGens []generateResourceFunc - wantAttrs map[string]string + wantAttrs map[string]any }{ { name: "all-by-name", @@ -983,7 +1046,7 @@ func TestProcessorAddContainerAttributes(t *testing.T) { withPodUID("19f651bc-73e4-410f-b3e9-f0241679d3b8"), withContainerName("app"), }, - wantAttrs: map[string]string{ + wantAttrs: map[string]any{ conventions.AttributeK8SPodUID: "19f651bc-73e4-410f-b3e9-f0241679d3b8", conventions.AttributeK8SContainerName: "app", conventions.AttributeContainerImageName: "test/app", @@ -1020,7 +1083,7 @@ func TestProcessorAddContainerAttributes(t *testing.T) { withPodUID("19f651bc-73e4-410f-b3e9-f0241679d3b8"), withContainerID("767dc30d4fece77038e8ec2585a33471944d0b754659af7aa7e101181418f0dd"), }, - wantAttrs: map[string]string{ + wantAttrs: map[string]any{ conventions.AttributeK8SPodUID: "19f651bc-73e4-410f-b3e9-f0241679d3b8", conventions.AttributeContainerID: "767dc30d4fece77038e8ec2585a33471944d0b754659af7aa7e101181418f0dd", conventions.AttributeK8SContainerName: "app", @@ -1057,7 +1120,7 @@ func TestProcessorAddContainerAttributes(t *testing.T) { withPodUID("19f651bc-73e4-410f-b3e9-f0241679d3b8"), withContainerName("app"), }, - wantAttrs: map[string]string{ + wantAttrs: map[string]any{ conventions.AttributeK8SPodUID: "19f651bc-73e4-410f-b3e9-f0241679d3b8", conventions.AttributeK8SContainerName: "app", conventions.AttributeContainerImageName: "test/app", @@ -1065,7 +1128,7 @@ func TestProcessorAddContainerAttributes(t *testing.T) { }, }, { - name: "container-id-only", + name: "container-id-with-runid", op: func(kp *kubernetesprocessor) { kp.kc.(*fakeClient).Pods[newPodIdentifier("connection", "k8s.pod.ip", "1.1.1.1")] = &kube.Pod{ Containers: kube.PodContainers{ @@ -1074,6 +1137,7 @@ func TestProcessorAddContainerAttributes(t *testing.T) { Statuses: map[int]kube.ContainerStatus{ 0: {ContainerID: "fcd58c97330c1dc6615bd520031f6a703a7317cd92adc96013c4dd57daad0b5f"}, 1: {ContainerID: "6a7f1a598b5dafec9c193f8f8d63f6e5839b8b0acd2fe780f94285e26c05580e"}, + 2: {ContainerID: "5ba4e0e5a5eb1f37bc6e7fc76495914400a3ee309d8828d16407e4b3d5410848"}, }, }, }, @@ -1085,7 +1149,7 @@ func TestProcessorAddContainerAttributes(t *testing.T) { withContainerName("app"), withContainerRunID("1"), }, - wantAttrs: map[string]string{ + wantAttrs: map[string]any{ kube.K8sIPLabelName: "1.1.1.1", conventions.AttributeK8SContainerName: "app", conventions.AttributeK8SContainerRestartCount: "1", @@ -1113,12 +1177,37 @@ func TestProcessorAddContainerAttributes(t *testing.T) { withPassthroughIP("1.1.1.1"), withContainerName("app"), }, - wantAttrs: map[string]string{ + wantAttrs: map[string]any{ kube.K8sIPLabelName: "1.1.1.1", conventions.AttributeK8SContainerName: "app", conventions.AttributeContainerID: "5ba4e0e5a5eb1f37bc6e7fc76495914400a3ee309d8828d16407e4b3d5410848", }, }, + { + name: "container-repo-digests", + op: func(kp *kubernetesprocessor) { + kp.kc.(*fakeClient).Pods[newPodIdentifier("connection", "k8s.pod.ip", "1.1.1.1")] = &kube.Pod{ + Containers: kube.PodContainers{ + ByName: map[string]*kube.Container{ + "app": { + Statuses: map[int]kube.ContainerStatus{ + 2: {ImageRepoDigest: "docker.io/otel/collector:1.2.3@sha256:deadbeef02"}, + }, + }, + }, + }, + } + }, + resourceGens: []generateResourceFunc{ + withPassthroughIP("1.1.1.1"), + withContainerName("app"), + }, + wantAttrs: map[string]any{ + kube.K8sIPLabelName: "1.1.1.1", + conventions.AttributeK8SContainerName: "app", + containerImageRepoDigests: []string{"docker.io/otel/collector:1.2.3@sha256:deadbeef02"}, + }, + }, { name: "container-name-mismatch", op: func(kp *kubernetesprocessor) { @@ -1141,7 +1230,7 @@ func TestProcessorAddContainerAttributes(t *testing.T) { withContainerName("new-app"), withContainerRunID("0"), }, - wantAttrs: map[string]string{ + wantAttrs: map[string]any{ kube.K8sIPLabelName: "1.1.1.1", conventions.AttributeK8SContainerName: "new-app", conventions.AttributeK8SContainerRestartCount: "0", @@ -1168,7 +1257,7 @@ func TestProcessorAddContainerAttributes(t *testing.T) { withContainerName("app"), withContainerRunID("1"), }, - wantAttrs: map[string]string{ + wantAttrs: map[string]any{ kube.K8sIPLabelName: "1.1.1.1", conventions.AttributeK8SContainerName: "app", conventions.AttributeK8SContainerRestartCount: "1", @@ -1188,6 +1277,7 @@ func TestProcessorAddContainerAttributes(t *testing.T) { generateTraces(tt.resourceGens...), generateMetrics(tt.resourceGens...), generateLogs(tt.resourceGens...), + generateProfiles(tt.resourceGens...), nil, ) @@ -1195,7 +1285,12 @@ func TestProcessorAddContainerAttributes(t *testing.T) { m.assertResource(0, func(r pcommon.Resource) { require.Equal(t, len(tt.wantAttrs), r.Attributes().Len()) for k, v := range tt.wantAttrs { - assertResourceHasStringAttribute(t, r, k, v) + switch val := v.(type) { + case string: + assertResourceHasStringAttribute(t, r, k, val) + case []string: + assertResourceHasStringSlice(t, r, k, val) + } } }) } @@ -1234,6 +1329,7 @@ func TestProcessorPicksUpPassthoughPodIp(t *testing.T) { generateTraces(withPassthroughIP("2.2.2.2")), generateMetrics(withPassthroughIP("2.2.2.2")), generateLogs(withPassthroughIP("2.2.2.2")), + generateProfiles(withPassthroughIP("2.2.2.2")), func(err error) { assert.NoError(t, err) }) @@ -1255,7 +1351,6 @@ func TestMetricsProcessorHostname(t *testing.T) { p, err := newMetricsProcessor( NewFactory().CreateDefaultConfig(), next, - nil, withExtractMetadata(conventions.AttributeK8SPodName), withExtractKubernetesProcessorInto(&kp), ) @@ -1319,7 +1414,6 @@ func TestMetricsProcessorHostname(t *testing.T) { } }) } - } func TestMetricsProcessorHostnameWithPodAssociation(t *testing.T) { @@ -1328,7 +1422,6 @@ func TestMetricsProcessorHostnameWithPodAssociation(t *testing.T) { p, err := newMetricsProcessor( NewFactory().CreateDefaultConfig(), next, - nil, withExtractMetadata(conventions.AttributeK8SPodName), withExtractKubernetesProcessorInto(&kp), ) @@ -1403,7 +1496,6 @@ func TestMetricsProcessorHostnameWithPodAssociation(t *testing.T) { } }) } - } func TestPassthroughStart(t *testing.T) { @@ -1413,7 +1505,6 @@ func TestPassthroughStart(t *testing.T) { p, err := newTracesProcessor( NewFactory().CreateDefaultConfig(), next, - nil, opts..., ) require.NoError(t, err) @@ -1428,8 +1519,7 @@ func TestRealClient(t *testing.T) { t, NewFactory().CreateDefaultConfig(), func(err error) { - require.Error(t, err) - assert.Equal(t, "unable to load k8s config, KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT must be defined", err.Error()) + require.EqualError(t, err, "unable to load k8s config, KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT must be defined") }, withKubeClientProvider(kubeClientProvider), withAPIConfig(k8sconfig.APIConfig{AuthType: "none"}), @@ -1452,7 +1542,6 @@ func TestStartStop(t *testing.T) { p, err := newTracesProcessor( NewFactory().CreateDefaultConfig(), consumertest.NewNop(), - nil, withExtractKubernetesProcessorInto(&kp), ) require.NoError(t, err) @@ -1472,11 +1561,22 @@ func TestStartStop(t *testing.T) { func assertResourceHasStringAttribute(t *testing.T, r pcommon.Resource, k, v string) { got, ok := r.Attributes().Get(k) - require.True(t, ok, fmt.Sprintf("resource does not contain attribute %s", k)) + require.Truef(t, ok, "resource does not contain attribute %s", k) assert.EqualValues(t, pcommon.ValueTypeStr, got.Type(), "attribute %s is not of type string", k) assert.EqualValues(t, v, got.Str(), "attribute %s is not equal to %s", k, v) } +func assertResourceHasStringSlice(t *testing.T, r pcommon.Resource, k string, v []string) { + got, ok := r.Attributes().Get(k) + require.Truef(t, ok, "resource does not contain attribute %s", k) + assert.EqualValues(t, pcommon.ValueTypeSlice, got.Type(), "attribute %s is not of type slice", k) + slice := got.Slice() + for i := 0; i < slice.Len(); i++ { + assert.EqualValues(t, pcommon.ValueTypeStr, slice.At(i).Type()) + assert.EqualValues(t, v[i], slice.At(i).AsString(), "attribute %s[%d] is not equal to %s", k, i, v[i]) + } +} + func Test_intFromAttribute(t *testing.T) { tests := []struct { name string @@ -1521,3 +1621,76 @@ func Test_intFromAttribute(t *testing.T) { }) } } + +var _ componentstatus.Reporter = (*nopHost)(nil) + +type nopHost struct { + reportFunc func(event *componentstatus.Event) +} + +func (nh *nopHost) GetExtensions() map[component.ID]component.Component { + return nil +} + +func (nh *nopHost) Report(event *componentstatus.Event) { + nh.reportFunc(event) +} + +func Test_setResourceAttribute(t *testing.T) { + tests := []struct { + name string + attributes func() pcommon.Map + key string + val string + wantAttrs func() pcommon.Map + }{ + { + name: "attribute not present - add value", + attributes: pcommon.NewMap, + key: "foo", + val: "bar", + wantAttrs: func() pcommon.Map { + m := pcommon.NewMap() + m.PutStr("foo", "bar") + return m + }, + }, + { + name: "attribute present with non-empty value - do not overwrite value", + attributes: func() pcommon.Map { + m := pcommon.NewMap() + m.PutStr("foo", "bar") + return m + }, + key: "foo", + val: "baz", + wantAttrs: func() pcommon.Map { + m := pcommon.NewMap() + m.PutStr("foo", "bar") + return m + }, + }, + { + name: "attribute present with empty value - set value", + attributes: func() pcommon.Map { + m := pcommon.NewMap() + m.PutStr("foo", "") + return m + }, + key: "foo", + val: "bar", + wantAttrs: func() pcommon.Map { + m := pcommon.NewMap() + m.PutStr("foo", "bar") + return m + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + attrs := tt.attributes() + setResourceAttribute(attrs, tt.key, tt.val) + require.Equal(t, tt.wantAttrs(), attrs) + }) + } +} diff --git a/processor/k8sattributesprocessor/testdata/config.yaml b/processor/k8sattributesprocessor/testdata/config.yaml index 99b62032d734..1078ab73b7c5 100644 --- a/processor/k8sattributesprocessor/testdata/config.yaml +++ b/processor/k8sattributesprocessor/testdata/config.yaml @@ -14,6 +14,7 @@ k8sattributes/2: # extract the following well-known metadata fields from pods and namespaces - k8s.pod.name - k8s.pod.uid + - k8s.pod.ip - k8s.deployment.name - k8s.namespace.name - k8s.node.name @@ -105,6 +106,17 @@ k8sattributes/too_many_sources: - from: connection name: ip +k8sattributes/deprecated-regex: + passthrough: false + auth_type: "kubeConfig" + extract: + labels: + - regex: field=(?P.+) + from: pod + annotations: + - regex: field=(?P.+) + from: pod + k8sattributes/bad_keys_labels: extract: labels: diff --git a/processor/k8sattributesprocessor/testdata/e2e/clusterrbac/collector/configmap.yaml b/processor/k8sattributesprocessor/testdata/e2e/clusterrbac/collector/configmap.yaml index 384903a4b1fd..2a55e8a87bf0 100644 --- a/processor/k8sattributesprocessor/testdata/e2e/clusterrbac/collector/configmap.yaml +++ b/processor/k8sattributesprocessor/testdata/e2e/clusterrbac/collector/configmap.yaml @@ -11,7 +11,8 @@ data: tls: insecure: true extensions: - health_check: {} + health_check: + endpoint: 0.0.0.0:13133 processors: k8sattributes: extract: @@ -47,6 +48,7 @@ data: - k8s.cluster.uid - container.id - container.image.name + - container.image.repo_digests - container.image.tag pod_association: - sources: diff --git a/processor/k8sattributesprocessor/testdata/e2e/clusterrbac/collector/deployment.yaml b/processor/k8sattributesprocessor/testdata/e2e/clusterrbac/collector/deployment.yaml index a2011605a3e0..70dc41d4beb4 100644 --- a/processor/k8sattributesprocessor/testdata/e2e/clusterrbac/collector/deployment.yaml +++ b/processor/k8sattributesprocessor/testdata/e2e/clusterrbac/collector/deployment.yaml @@ -21,6 +21,7 @@ spec: command: - /otelcontribcol - --config=/conf/relay.yaml + - --feature-gates=service.profilesSupport image: "otelcontribcol:latest" imagePullPolicy: Never ports: diff --git a/processor/k8sattributesprocessor/testdata/e2e/mixrbac/collector/configmap.yaml b/processor/k8sattributesprocessor/testdata/e2e/mixrbac/collector/configmap.yaml index 33a368cf7bec..81cb2e79ecbe 100644 --- a/processor/k8sattributesprocessor/testdata/e2e/mixrbac/collector/configmap.yaml +++ b/processor/k8sattributesprocessor/testdata/e2e/mixrbac/collector/configmap.yaml @@ -11,7 +11,8 @@ data: tls: insecure: true extensions: - health_check: {} + health_check: + endpoint: 0.0.0.0:13133 processors: k8sattributes: filter: @@ -42,6 +43,7 @@ data: - container.id - container.image.name - container.image.tag + - container.image.repo_digests - k8s.cluster.uid pod_association: - sources: diff --git a/processor/k8sattributesprocessor/testdata/e2e/mixrbac/collector/deployment.yaml b/processor/k8sattributesprocessor/testdata/e2e/mixrbac/collector/deployment.yaml index 14860e9513fd..36f669cf952b 100644 --- a/processor/k8sattributesprocessor/testdata/e2e/mixrbac/collector/deployment.yaml +++ b/processor/k8sattributesprocessor/testdata/e2e/mixrbac/collector/deployment.yaml @@ -21,6 +21,7 @@ spec: command: - /otelcontribcol - --config=/conf/relay.yaml + - --feature-gates=service.profilesSupport image: "otelcontribcol:latest" imagePullPolicy: Never ports: diff --git a/processor/k8sattributesprocessor/testdata/e2e/mixrbac/telemetrygen/deployment.yaml b/processor/k8sattributesprocessor/testdata/e2e/mixrbac/telemetrygen/deployment.yaml index a09257347f5e..32a2f063566e 100644 --- a/processor/k8sattributesprocessor/testdata/e2e/mixrbac/telemetrygen/deployment.yaml +++ b/processor/k8sattributesprocessor/testdata/e2e/mixrbac/telemetrygen/deployment.yaml @@ -28,7 +28,7 @@ spec: {{- if eq .DataType "traces" }} - --status-code= {{- end }} - image: ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen:latest + image: ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen:0.112.0@sha256:b248ef911f93ae27cbbc85056d1ffacc87fd941bbdc2ffd951b6df8df72b8096 imagePullPolicy: IfNotPresent name: telemetrygen restartPolicy: Always diff --git a/processor/k8sattributesprocessor/testdata/e2e/namespaced_rbac_no_pod_ip/collector/configmap.yaml b/processor/k8sattributesprocessor/testdata/e2e/namespaced_rbac_no_pod_ip/collector/configmap.yaml new file mode 100644 index 000000000000..9915c07c40b2 --- /dev/null +++ b/processor/k8sattributesprocessor/testdata/e2e/namespaced_rbac_no_pod_ip/collector/configmap.yaml @@ -0,0 +1,84 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ .Name }}-config + namespace: e2ek8sattribute-namespacedrbac-no-pod-ip +data: + relay: | + exporters: + otlp: + endpoint: {{ .HostEndpoint }}:4317 + tls: + insecure: true + extensions: + health_check: + endpoint: 0.0.0.0:13133 + processors: + k8sattributes: + filter: + namespace: e2ek8sattribute-namespacedrbac-no-pod-ip + node_from_env_var: MY_NODE_NAME + labels: + - key: component + value: telemetrygen + op: equals + fields: + - key: spec.restartPolicy + value: Never + op: not-equals + extract: + annotations: + - from: pod + key: workload + tag_name: k8s.annotations.workload + labels: + - from: pod + key: app + tag_name: k8s.labels.app + metadata: + - k8s.pod.name + - k8s.pod.start_time + - k8s.pod.uid + - k8s.namespace.name + - k8s.deployment.name + - k8s.deployment.uid + - k8s.replicaset.name + - k8s.replicaset.uid + - k8s.node.name + - container.id + - container.image.name + - container.image.tag + pod_association: + - sources: + - from: resource_attribute + name: k8s.deployment.name + receivers: + otlp: + protocols: + grpc: + endpoint: ${env:MY_POD_IP}:4317 + service: + extensions: + - health_check + pipelines: + metrics: + exporters: + - otlp + processors: + - k8sattributes + receivers: + - otlp + traces: + exporters: + - otlp + processors: + - k8sattributes + receivers: + - otlp + logs: + exporters: + - otlp + processors: + - k8sattributes + receivers: + - otlp diff --git a/processor/k8sattributesprocessor/testdata/e2e/namespaced_rbac_no_pod_ip/collector/deployment.yaml b/processor/k8sattributesprocessor/testdata/e2e/namespaced_rbac_no_pod_ip/collector/deployment.yaml new file mode 100644 index 000000000000..5b0d166325c8 --- /dev/null +++ b/processor/k8sattributesprocessor/testdata/e2e/namespaced_rbac_no_pod_ip/collector/deployment.yaml @@ -0,0 +1,65 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Name }} + namespace: e2ek8sattribute-namespacedrbac-no-pod-ip +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: opentelemetry-collector + app.kubernetes.io/instance: {{ .Name }} + template: + metadata: + labels: + app.kubernetes.io/name: opentelemetry-collector + app.kubernetes.io/instance: {{ .Name }} + spec: + serviceAccountName: {{ .Name }} + containers: + - name: opentelemetry-collector + command: + - /otelcontribcol + - --config=/conf/relay.yaml + - --feature-gates=service.profilesSupport + image: "otelcontribcol:latest" + imagePullPolicy: Never + ports: + - name: otlp + containerPort: 4317 + protocol: TCP + env: + - name: MY_POD_IP + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: status.podIP + - name: MY_NODE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.nodeName + livenessProbe: + httpGet: + path: / + port: 13133 + initialDelaySeconds: 3 + readinessProbe: + httpGet: + path: / + port: 13133 + initialDelaySeconds: 3 + resources: + limits: + cpu: 128m + memory: 256Mi + volumeMounts: + - mountPath: /conf + name: opentelemetry-collector-configmap + volumes: + - name: opentelemetry-collector-configmap + configMap: + name: {{ .Name }}-config + items: + - key: relay + path: relay.yaml diff --git a/processor/k8sattributesprocessor/testdata/e2e/namespaced_rbac_no_pod_ip/collector/role.yaml b/processor/k8sattributesprocessor/testdata/e2e/namespaced_rbac_no_pod_ip/collector/role.yaml new file mode 100644 index 000000000000..45ef35c64af7 --- /dev/null +++ b/processor/k8sattributesprocessor/testdata/e2e/namespaced_rbac_no_pod_ip/collector/role.yaml @@ -0,0 +1,12 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: {{ .Name }} + namespace: e2ek8sattribute-namespacedrbac-no-pod-ip +rules: + - apiGroups: [""] + resources: ["pods"] + verbs: ["get", "watch", "list"] + - apiGroups: ["apps"] + resources: ["replicasets"] + verbs: ["get", "watch", "list"] diff --git a/processor/k8sattributesprocessor/testdata/e2e/namespaced_rbac_no_pod_ip/collector/rolebinding.yaml b/processor/k8sattributesprocessor/testdata/e2e/namespaced_rbac_no_pod_ip/collector/rolebinding.yaml new file mode 100644 index 000000000000..875195f8a8a1 --- /dev/null +++ b/processor/k8sattributesprocessor/testdata/e2e/namespaced_rbac_no_pod_ip/collector/rolebinding.yaml @@ -0,0 +1,13 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: {{ .Name }} + namespace: e2ek8sattribute-namespacedrbac-no-pod-ip +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: {{ .Name }} +subjects: + - kind: ServiceAccount + name: {{ .Name }} + namespace: e2ek8sattribute-namespacedrbac-no-pod-ip diff --git a/processor/k8sattributesprocessor/testdata/e2e/namespaced_rbac_no_pod_ip/collector/service.yaml b/processor/k8sattributesprocessor/testdata/e2e/namespaced_rbac_no_pod_ip/collector/service.yaml new file mode 100644 index 000000000000..0eaaa6696a7f --- /dev/null +++ b/processor/k8sattributesprocessor/testdata/e2e/namespaced_rbac_no_pod_ip/collector/service.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ .Name }} + namespace: e2ek8sattribute-namespacedrbac-no-pod-ip +spec: + type: ClusterIP + ports: + - name: otlp + port: 4317 + targetPort: 4317 + protocol: TCP + appProtocol: grpc + selector: + app.kubernetes.io/name: opentelemetry-collector + app.kubernetes.io/instance: {{ .Name }} diff --git a/processor/k8sattributesprocessor/testdata/e2e/namespaced_rbac_no_pod_ip/collector/serviceaccount.yaml b/processor/k8sattributesprocessor/testdata/e2e/namespaced_rbac_no_pod_ip/collector/serviceaccount.yaml new file mode 100644 index 000000000000..9e723f72346a --- /dev/null +++ b/processor/k8sattributesprocessor/testdata/e2e/namespaced_rbac_no_pod_ip/collector/serviceaccount.yaml @@ -0,0 +1,5 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ .Name }} + namespace: e2ek8sattribute-namespacedrbac-no-pod-ip diff --git a/processor/k8sattributesprocessor/testdata/e2e/namespaced_rbac_no_pod_ip/namespace.yaml b/processor/k8sattributesprocessor/testdata/e2e/namespaced_rbac_no_pod_ip/namespace.yaml new file mode 100644 index 000000000000..3350dd9743ed --- /dev/null +++ b/processor/k8sattributesprocessor/testdata/e2e/namespaced_rbac_no_pod_ip/namespace.yaml @@ -0,0 +1,6 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: e2ek8sattribute-namespacedrbac-no-pod-ip + labels: + foons: barns diff --git a/processor/k8sattributesprocessor/testdata/e2e/namespaced_rbac_no_pod_ip/telemetrygen/deployment.yaml b/processor/k8sattributesprocessor/testdata/e2e/namespaced_rbac_no_pod_ip/telemetrygen/deployment.yaml new file mode 100644 index 000000000000..b64a7ac87acf --- /dev/null +++ b/processor/k8sattributesprocessor/testdata/e2e/namespaced_rbac_no_pod_ip/telemetrygen/deployment.yaml @@ -0,0 +1,36 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Name }}-{{ .DataType }}-deployment + namespace: e2ek8sattribute-namespacedrbac-no-pod-ip +spec: + replicas: 1 + selector: + matchLabels: + app: {{ .Name }}-{{ .DataType }}-deployment + template: + metadata: + annotations: + workload: deployment + labels: + app: {{ .Name }}-{{ .DataType }}-deployment + component: telemetrygen + spec: + containers: + - command: + - /telemetrygen + - {{ .DataType }} + - --otlp-insecure + - --otlp-endpoint={{ .OTLPEndpoint }} + - --duration=36000s + - --rate=1 + - --otlp-attributes=service.name="test-{{ .DataType }}-deployment" + - --otlp-attributes=k8s.container.name="telemetrygen" + - --otlp-attributes=k8s.deployment.name="{{ .Name }}-{{ .DataType }}-deployment" +{{- if eq .DataType "traces" }} + - --status-code= +{{- end }} + image: ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen + imagePullPolicy: IfNotPresent + name: telemetrygen + restartPolicy: Always diff --git a/processor/k8sattributesprocessor/testdata/e2e/namespacedrbac/collector/configmap.yaml b/processor/k8sattributesprocessor/testdata/e2e/namespacedrbac/collector/configmap.yaml index e8170c327bf5..6521187953f4 100644 --- a/processor/k8sattributesprocessor/testdata/e2e/namespacedrbac/collector/configmap.yaml +++ b/processor/k8sattributesprocessor/testdata/e2e/namespacedrbac/collector/configmap.yaml @@ -11,7 +11,8 @@ data: tls: insecure: true extensions: - health_check: {} + health_check: + endpoint: 0.0.0.0:13133 processors: k8sattributes: filter: @@ -46,6 +47,7 @@ data: - k8s.node.name - container.id - container.image.name + - container.image.repo_digests - container.image.tag pod_association: - sources: diff --git a/processor/k8sattributesprocessor/testdata/e2e/namespacedrbac/collector/deployment.yaml b/processor/k8sattributesprocessor/testdata/e2e/namespacedrbac/collector/deployment.yaml index b7ae9cb34342..a0f6ca56d1ff 100644 --- a/processor/k8sattributesprocessor/testdata/e2e/namespacedrbac/collector/deployment.yaml +++ b/processor/k8sattributesprocessor/testdata/e2e/namespacedrbac/collector/deployment.yaml @@ -21,6 +21,7 @@ spec: command: - /otelcontribcol - --config=/conf/relay.yaml + - --feature-gates=service.profilesSupport image: "otelcontribcol:latest" imagePullPolicy: Never ports: diff --git a/processor/k8sattributesprocessor/testdata/e2e/namespacedrbac/telemetrygen/deployment.yaml b/processor/k8sattributesprocessor/testdata/e2e/namespacedrbac/telemetrygen/deployment.yaml index fd56c39d4eff..18f35425807a 100644 --- a/processor/k8sattributesprocessor/testdata/e2e/namespacedrbac/telemetrygen/deployment.yaml +++ b/processor/k8sattributesprocessor/testdata/e2e/namespacedrbac/telemetrygen/deployment.yaml @@ -29,7 +29,7 @@ spec: {{- if eq .DataType "traces" }} - --status-code= {{- end }} - image: ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen:latest + image: ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen@sha256:b248ef911f93ae27cbbc85056d1ffacc87fd941bbdc2ffd951b6df8df72b8096 imagePullPolicy: IfNotPresent name: telemetrygen restartPolicy: Always diff --git a/processor/logdedupprocessor/Makefile b/processor/logdedupprocessor/Makefile new file mode 100644 index 000000000000..ded7a36092dc --- /dev/null +++ b/processor/logdedupprocessor/Makefile @@ -0,0 +1 @@ +include ../../Makefile.Common diff --git a/processor/logdedupprocessor/README.md b/processor/logdedupprocessor/README.md new file mode 100644 index 000000000000..004f7862caac --- /dev/null +++ b/processor/logdedupprocessor/README.md @@ -0,0 +1,115 @@ +# Log DeDuplication Processor + + +| Status | | +| ------------- |-----------| +| Stability | [alpha]: logs | +| Distributions | [] | +| Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aprocessor%2Flogdedup%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aprocessor%2Flogdedup) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aprocessor%2Flogdedup%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aprocessor%2Flogdedup) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@BinaryFissionGames](https://www.github.com/BinaryFissionGames), [@MikeGoldsmith](https://www.github.com/MikeGoldsmith), [@djaglowski](https://www.github.com/djaglowski) | + +[alpha]: https://github.com/open-telemetry/opentelemetry-collector#alpha + + +This processor is used to deduplicate logs by detecting identical logs over a range of time and emitting a single log with the count of logs that were deduplicated. + +## How It Works +1. The user configures the log deduplication processor in the desired logs pipeline. +2. If the processor does not provide `conditions`, all logs are considered eligible for aggregation. If the processor does have configured `conditions`, all log entries where at least one of the `conditions` evaluates `true` are considered eligible for aggregation. Eligible identical logs are aggregated over the configured `interval`. Logs are considered identical if they have the same body, resource attributes, severity, and log attributes. Logs that do not match any condition in `conditions` are passed onward in the pipeline without aggregating. +3. After the interval, the processor emits a single log with the count of logs that were deduplicated. The emitted log will have the same body, resource attributes, severity, and log attributes as the original log. The emitted log will also have the following new attributes: + + - `log_count`: The count of logs that were deduplicated over the interval. The name of the attribute is configurable via the `log_count_attribute` parameter. + - `first_observed_timestamp`: The timestamp of the first log that was observed during the aggregation interval. + - `last_observed_timestamp`: The timestamp of the last log that was observed during the aggregation interval. + +**Note**: The `ObservedTimestamp` and `Timestamp` of the emitted log will be the time that the aggregated log was emitted and will not be the same as the `ObservedTimestamp` and `Timestamp` of the original logs. + +## Configuration +| Field | Type | Default | Description | +| --- | --- | --- | --- | +| interval | duration | `10s` | The interval at which logs are aggregated. The counter will reset after each interval. | +| conditions | []string | `[]` | A slice of [OTTL] expressions used to evaluate which log records are deduped. All paths in the [log context] are available to reference. All [converters] are available to use. | +| log_count_attribute | string | `log_count` | The name of the count attribute of deduplicated logs that will be added to the emitted aggregated log. | +| timezone | string | `UTC` | The timezone of the `first_observed_timestamp` and `last_observed_timestamp` timestamps on the emitted aggregated log. The available locations depend on the local IANA Time Zone database. [This page](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) contains many examples, such as `America/New_York`. | +| exclude_fields | []string | `[]` | Fields to exclude from duplication matching. Fields can be excluded from the log `body` or `attributes`. These fields will not be present in the emitted aggregated log. Nested fields must be `.` delimited. If a field contains a `.` it can be escaped by using a `\` see [example config](#example-config-with-excluded-fields).

**Note**: The entire `body` cannot be excluded. If the body is a map then fields within it can be excluded. | + +[OTTL]: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.109.0/pkg/ottl#readme +[converters]: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/v0.109.0/pkg/ottl/ottlfuncs/README.md#converters +[log context]: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/v0.109.0/pkg/ottl/contexts/ottllog/README.md + +### Example Config +The following config is an example configuration for the log deduplication processor. It is configured with an aggregation interval of `60 seconds`, a timezone of `America/Los_Angeles`, and a log count attribute of `dedup_count`. It has no fields being excluded. +```yaml +receivers: + filelog: + include: [./example/*.log] +processors: + logdedup: + interval: 60s + log_count_attribute: dedup_count + timezone: 'America/Los_Angeles' +exporters: + googlecloud: + +service: + pipelines: + logs: + receivers: [filelog] + processors: [logdedup] + exporters: [googlecloud] +``` + +### Example Config with Excluded Fields +The following config is an example configuration that excludes the following fields from being considered when searching for duplicate logs: + +- `timestamp` field from the body +- `host.name` field from attributes +- `ip` nested attribute inside a map attribute named `src` + +```yaml +receivers: + filelog: + include: [./example/*.log] +processors: + logdedup: + exclude_fields: + - body.timestamp + - attributes.host\.name + - attributes.src.ip +exporters: + googlecloud: + +service: + pipelines: + logs: + receivers: [filelog] + processors: [logdedup] + exporters: [googlecloud] +``` + + +### Example Config with Conditions +The following config is an example configuration that only performs the deduping process on telemetry where Attribute `ID` equals `1` OR where Resource Attribute `service.name` equals `my-service`: + +```yaml +receivers: + filelog: + include: [./example/*.log] +processors: + logdedup: + conditions: + - attributes["ID"] == 1 + - resource.attributes["service.name"] == "my-service" + interval: 60s + log_count_attribute: dedup_count + timezone: 'America/Los_Angeles' +exporters: + googlecloud: + +service: + pipelines: + logs: + receivers: [filelog] + processors: [logdedup] + exporters: [googlecloud] +``` diff --git a/processor/logdedupprocessor/config.go b/processor/logdedupprocessor/config.go new file mode 100644 index 000000000000..04459d3ecbf8 --- /dev/null +++ b/processor/logdedupprocessor/config.go @@ -0,0 +1,104 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package logdedupprocessor provides a processor that counts logs as metrics. +package logdedupprocessor // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/logdedupprocessor" + +import ( + "errors" + "fmt" + "strings" + "time" + + "go.opentelemetry.io/collector/component" +) + +// Config defaults +const ( + // defaultInterval is the default export interval. + defaultInterval = 10 * time.Second + + // defaultLogCountAttribute is the default log count attribute + defaultLogCountAttribute = "log_count" + + // defaultTimezone is the default timezone + defaultTimezone = "UTC" + + // bodyField is the name of the body field + bodyField = "body" + + // attributeField is the name of the attribute field + attributeField = "attributes" +) + +// Config errors +var ( + errInvalidLogCountAttribute = errors.New("log_count_attribute must be set") + errInvalidInterval = errors.New("interval must be greater than 0") + errCannotExcludeBody = errors.New("cannot exclude the entire body") +) + +// Config is the config of the processor. +type Config struct { + LogCountAttribute string `mapstructure:"log_count_attribute"` + Interval time.Duration `mapstructure:"interval"` + Timezone string `mapstructure:"timezone"` + ExcludeFields []string `mapstructure:"exclude_fields"` + Conditions []string `mapstructure:"conditions"` +} + +// createDefaultConfig returns the default config for the processor. +func createDefaultConfig() component.Config { + return &Config{ + LogCountAttribute: defaultLogCountAttribute, + Interval: defaultInterval, + Timezone: defaultTimezone, + ExcludeFields: []string{}, + Conditions: []string{}, + } +} + +// Validate validates the configuration +func (c Config) Validate() error { + if c.Interval <= 0 { + return errInvalidInterval + } + + if c.LogCountAttribute == "" { + return errInvalidLogCountAttribute + } + + _, err := time.LoadLocation(c.Timezone) + if err != nil { + return fmt.Errorf("timezone is invalid: %w", err) + } + + return c.validateExcludeFields() +} + +// validateExcludeFields validates that all the exclude fields +func (c Config) validateExcludeFields() error { + knownExcludeFields := make(map[string]struct{}) + + for _, field := range c.ExcludeFields { + // Special check to make sure the entire body is not excluded + if field == bodyField { + return errCannotExcludeBody + } + + // Split and ensure the field starts with `body` or `attributes` + parts := strings.Split(field, fieldDelimiter) + if parts[0] != bodyField && parts[0] != attributeField { + return fmt.Errorf("an excludefield must start with %s or %s", bodyField, attributeField) + } + + // If a field is valid make sure we haven't already seen it + if _, ok := knownExcludeFields[field]; ok { + return fmt.Errorf("duplicate exclude_field %s", field) + } + + knownExcludeFields[field] = struct{}{} + } + + return nil +} diff --git a/processor/logdedupprocessor/config_test.go b/processor/logdedupprocessor/config_test.go new file mode 100644 index 000000000000..a4e8fb120cd5 --- /dev/null +++ b/processor/logdedupprocessor/config_test.go @@ -0,0 +1,110 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package logdedupprocessor + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestCreateDefaultProcessorConfig(t *testing.T) { + cfg := createDefaultConfig().(*Config) + require.Equal(t, defaultInterval, cfg.Interval) + require.Equal(t, defaultLogCountAttribute, cfg.LogCountAttribute) + require.Equal(t, defaultTimezone, cfg.Timezone) + require.Equal(t, []string{}, cfg.ExcludeFields) +} + +func TestValidateConfig(t *testing.T) { + testCases := []struct { + desc string + cfg *Config + expectedErr error + }{ + { + desc: "invalid LogCountAttribute config", + cfg: &Config{ + LogCountAttribute: "", + Interval: defaultInterval, + Timezone: defaultTimezone, + ExcludeFields: []string{}, + }, + expectedErr: errInvalidLogCountAttribute, + }, + { + desc: "invalid Interval config", + cfg: &Config{ + LogCountAttribute: defaultLogCountAttribute, + Interval: -1, + Timezone: defaultTimezone, + ExcludeFields: []string{}, + }, + expectedErr: errInvalidInterval, + }, + { + desc: "invalid Timezone config", + cfg: &Config{ + LogCountAttribute: defaultLogCountAttribute, + Interval: defaultInterval, + Timezone: "not a timezone", + ExcludeFields: []string{}, + }, + expectedErr: errors.New("timezone is invalid"), + }, + { + desc: "invalid exclude entire body", + cfg: &Config{ + LogCountAttribute: defaultLogCountAttribute, + Interval: defaultInterval, + Timezone: defaultTimezone, + ExcludeFields: []string{bodyField}, + }, + expectedErr: errCannotExcludeBody, + }, + { + desc: "invalid exclude field body", + cfg: &Config{ + LogCountAttribute: defaultLogCountAttribute, + Interval: defaultInterval, + Timezone: defaultTimezone, + ExcludeFields: []string{"not.value"}, + }, + expectedErr: errors.New("an excludefield must start with"), + }, + { + desc: "invalid duplice exclude field", + cfg: &Config{ + LogCountAttribute: defaultLogCountAttribute, + Interval: defaultInterval, + Timezone: defaultTimezone, + ExcludeFields: []string{"body.thing", "body.thing"}, + }, + expectedErr: errors.New("duplicate exclude_field"), + }, + { + desc: "valid config", + cfg: &Config{ + LogCountAttribute: defaultLogCountAttribute, + Interval: defaultInterval, + Timezone: defaultTimezone, + Conditions: []string{}, + ExcludeFields: []string{"body.thing", "attributes.otherthing"}, + }, + expectedErr: nil, + }, + } + + for _, tc := range testCases { + t.Run(tc.desc, func(t *testing.T) { + err := tc.cfg.Validate() + if tc.expectedErr != nil { + require.ErrorContains(t, err, tc.expectedErr.Error()) + } else { + require.NoError(t, err) + } + }) + } +} diff --git a/processor/logdedupprocessor/counter.go b/processor/logdedupprocessor/counter.go new file mode 100644 index 000000000000..8e701f39fa25 --- /dev/null +++ b/processor/logdedupprocessor/counter.go @@ -0,0 +1,195 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package logdedupprocessor // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/logdedupprocessor" + +import ( + "context" + "time" + + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/plog" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/logdedupprocessor/internal/metadata" +) + +// Attributes names for first and last observed timestamps +const ( + firstObservedTSAttr = "first_observed_timestamp" + lastObservedTSAttr = "last_observed_timestamp" +) + +// timeNow can be reassigned for testing +var timeNow = time.Now + +// logAggregator tracks the number of times a specific logRecord has been seen. +type logAggregator struct { + resources map[uint64]*resourceAggregator + logCountAttribute string + timezone *time.Location + telemetryBuilder *metadata.TelemetryBuilder +} + +// newLogAggregator creates a new LogCounter. +func newLogAggregator(logCountAttribute string, timezone *time.Location, telemetryBuilder *metadata.TelemetryBuilder) *logAggregator { + return &logAggregator{ + resources: make(map[uint64]*resourceAggregator), + logCountAttribute: logCountAttribute, + timezone: timezone, + telemetryBuilder: telemetryBuilder, + } +} + +// Export exports the counter as a Logs +func (l *logAggregator) Export(ctx context.Context) plog.Logs { + logs := plog.NewLogs() + + for _, resourceAggregator := range l.resources { + rl := logs.ResourceLogs().AppendEmpty() + resourceAggregator.resource.CopyTo(rl.Resource()) + + for _, scopeAggregator := range resourceAggregator.scopeCounters { + sl := rl.ScopeLogs().AppendEmpty() + scopeAggregator.scope.CopyTo(sl.Scope()) + + for _, logAggregator := range scopeAggregator.logCounters { + // Record aggregated logs records + l.telemetryBuilder.DedupProcessorAggregatedLogs.Record(ctx, logAggregator.count) + + lr := sl.LogRecords().AppendEmpty() + logAggregator.logRecord.CopyTo(lr) + + // Set log record timestamps + lr.SetTimestamp(pcommon.NewTimestampFromTime(timeNow())) + lr.SetObservedTimestamp(pcommon.NewTimestampFromTime(logAggregator.firstObservedTimestamp)) + + // Add attributes for log count and first/last observed timestamps + lr.Attributes().EnsureCapacity(lr.Attributes().Len() + 3) + lr.Attributes().PutInt(l.logCountAttribute, logAggregator.count) + firstTimestampStr := logAggregator.firstObservedTimestamp.In(l.timezone).Format(time.RFC3339) + lr.Attributes().PutStr(firstObservedTSAttr, firstTimestampStr) + lastTimestampStr := logAggregator.lastObservedTimestamp.In(l.timezone).Format(time.RFC3339) + lr.Attributes().PutStr(lastObservedTSAttr, lastTimestampStr) + } + } + } + + return logs +} + +// Add adds the logRecord to the resource aggregator that is identified by the resource attributes +func (l *logAggregator) Add(resource pcommon.Resource, scope pcommon.InstrumentationScope, logRecord plog.LogRecord) { + key := getResourceKey(resource) + resourceAggregator, ok := l.resources[key] + if !ok { + resourceAggregator = newResourceAggregator(resource) + l.resources[key] = resourceAggregator + } + resourceAggregator.Add(scope, logRecord) +} + +// Reset resets the counter. +func (l *logAggregator) Reset() { + l.resources = make(map[uint64]*resourceAggregator) +} + +// resourceAggregator dimensions the counter by resource. +type resourceAggregator struct { + resource pcommon.Resource + scopeCounters map[uint64]*scopeAggregator +} + +// newResourceAggregator creates a new ResourceCounter. +func newResourceAggregator(resource pcommon.Resource) *resourceAggregator { + return &resourceAggregator{ + resource: resource, + scopeCounters: make(map[uint64]*scopeAggregator), + } +} + +// Add increments the counter that the logRecord matches. +func (r *resourceAggregator) Add(scope pcommon.InstrumentationScope, logRecord plog.LogRecord) { + key := getScopeKey(scope) + scopeAggregator, ok := r.scopeCounters[key] + if !ok { + scopeAggregator = newScopeAggregator(scope) + r.scopeCounters[key] = scopeAggregator + } + scopeAggregator.Add(logRecord) +} + +// scopeAggregator dimensions the counter by scope. +type scopeAggregator struct { + scope pcommon.InstrumentationScope + logCounters map[uint64]*logCounter +} + +// newScopeAggregator creates a new ScopeCounter. +func newScopeAggregator(scope pcommon.InstrumentationScope) *scopeAggregator { + return &scopeAggregator{ + scope: scope, + logCounters: make(map[uint64]*logCounter), + } +} + +// Add increments the counter that the logRecord matches. +func (s *scopeAggregator) Add(logRecord plog.LogRecord) { + key := getLogKey(logRecord) + lc, ok := s.logCounters[key] + if !ok { + lc = newLogCounter(logRecord) + s.logCounters[key] = lc + } + lc.Increment() +} + +// logCounter is a counter for a log record. +type logCounter struct { + logRecord plog.LogRecord + firstObservedTimestamp time.Time + lastObservedTimestamp time.Time + count int64 +} + +// newLogCounter creates a new AttributeCounter. +func newLogCounter(logRecord plog.LogRecord) *logCounter { + return &logCounter{ + logRecord: logRecord, + count: 0, + firstObservedTimestamp: timeNow().UTC(), + lastObservedTimestamp: timeNow().UTC(), + } +} + +// Increment increments the counter. +func (a *logCounter) Increment() { + a.lastObservedTimestamp = timeNow().UTC() + a.count++ +} + +// getResourceKey creates a unique hash for the resource to use as a map key +func getResourceKey(resource pcommon.Resource) uint64 { + return pdatautil.Hash64( + pdatautil.WithMap(resource.Attributes()), + ) +} + +// getScopeKey creates a unique hash for the scope to use as a map key +func getScopeKey(scope pcommon.InstrumentationScope) uint64 { + return pdatautil.Hash64( + pdatautil.WithMap(scope.Attributes()), + pdatautil.WithString(scope.Name()), + pdatautil.WithString(scope.Version()), + ) +} + +// getLogKey creates a unique hash for the log record to use as a map key +func getLogKey(logRecord plog.LogRecord) uint64 { + return pdatautil.Hash64( + pdatautil.WithMap(logRecord.Attributes()), + pdatautil.WithValue(logRecord.Body()), + pdatautil.WithString(logRecord.SeverityNumber().String()), + pdatautil.WithString(logRecord.SeverityText()), + ) +} diff --git a/processor/logdedupprocessor/counter_test.go b/processor/logdedupprocessor/counter_test.go new file mode 100644 index 000000000000..2a701e2a4217 --- /dev/null +++ b/processor/logdedupprocessor/counter_test.go @@ -0,0 +1,293 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package logdedupprocessor + +import ( + "context" + "testing" + "time" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/plog" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/logdedupprocessor/internal/metadata" +) + +func Test_newLogAggregator(t *testing.T) { + cfg := createDefaultConfig().(*Config) + telemetryBuilder, err := metadata.NewTelemetryBuilder(componenttest.NewNopTelemetrySettings()) + require.NoError(t, err) + + aggregator := newLogAggregator(cfg.LogCountAttribute, time.UTC, telemetryBuilder) + require.Equal(t, cfg.LogCountAttribute, aggregator.logCountAttribute) + require.Equal(t, time.UTC, aggregator.timezone) + require.NotNil(t, aggregator.resources) +} + +func Test_logAggregatorAdd(t *testing.T) { + oldTimeNow := timeNow + defer func() { + timeNow = oldTimeNow + }() + + // Set timeNow to return a known value + firstExpectedTimestamp := time.Now().UTC() + timeNow = func() time.Time { + return firstExpectedTimestamp + } + + telemetryBuilder, err := metadata.NewTelemetryBuilder(componenttest.NewNopTelemetrySettings()) + require.NoError(t, err) + + // Setup aggregator + aggregator := newLogAggregator("log_count", time.UTC, telemetryBuilder) + logRecord := plog.NewLogRecord() + + resource := pcommon.NewResource() + resource.Attributes().PutStr("one", "two") + + scope := pcommon.NewInstrumentationScope() + + expectedResourceKey := getResourceKey(resource) + expectedScopeKey := getScopeKey(scope) + expectedLogKey := getLogKey(logRecord) + + // Add logRecord + aggregator.Add(resource, scope, logRecord) + + // Check resourceCounter was set + resourceCounter, ok := aggregator.resources[expectedResourceKey] + require.True(t, ok) + require.Equal(t, resource, resourceCounter.resource) + + // check scopeCounter was set + scopeCounter, ok := resourceCounter.scopeCounters[expectedScopeKey] + require.True(t, ok) + require.Equal(t, scope, scopeCounter.scope) + + // Check logCounter was set + lc, ok := scopeCounter.logCounters[expectedLogKey] + require.True(t, ok) + + // Check fields on logCounter + require.Equal(t, logRecord, lc.logRecord) + require.Equal(t, int64(1), lc.count) + require.Equal(t, firstExpectedTimestamp, lc.firstObservedTimestamp) + require.Equal(t, firstExpectedTimestamp, lc.lastObservedTimestamp) + + // Add a matching logRecord to update counter and last observedTimestamp + secondExpectedTimestamp := time.Now().Add(2 * time.Minute).UTC() + timeNow = func() time.Time { + return secondExpectedTimestamp + } + + aggregator.Add(resource, scope, logRecord) + require.Equal(t, int64(2), lc.count) + require.Equal(t, secondExpectedTimestamp, lc.lastObservedTimestamp) +} + +func Test_logAggregatorReset(t *testing.T) { + telemetryBuilder, err := metadata.NewTelemetryBuilder(componenttest.NewNopTelemetrySettings()) + require.NoError(t, err) + + aggregator := newLogAggregator("log_count", time.UTC, telemetryBuilder) + for i := 0; i < 2; i++ { + resource := pcommon.NewResource() + resource.Attributes().PutInt("i", int64(i)) + key := getResourceKey(resource) + aggregator.resources[key] = newResourceAggregator(resource) + } + + require.Len(t, aggregator.resources, 2) + + aggregator.Reset() + + require.Empty(t, aggregator.resources) +} + +func Test_logAggregatorExport(t *testing.T) { + oldTimeNow := timeNow + defer func() { + timeNow = oldTimeNow + }() + + location, err := time.LoadLocation("America/New_York") + require.NoError(t, err) + + // Set timeNow to return a known value + expectedTimestamp := time.Now().UTC() + expectedTimestampStr := expectedTimestamp.In(location).Format(time.RFC3339) + timeNow = func() time.Time { + return expectedTimestamp + } + + // Setup aggregator + telemetryBuilder, err := metadata.NewTelemetryBuilder(componenttest.NewNopTelemetrySettings()) + require.NoError(t, err) + + aggregator := newLogAggregator(defaultLogCountAttribute, location, telemetryBuilder) + resource := pcommon.NewResource() + resource.Attributes().PutStr("one", "two") + expectedHash := pdatautil.MapHash(resource.Attributes()) + + scope := pcommon.NewInstrumentationScope() + + logRecord := generateTestLogRecord(t, "body string") + + // Add logRecord + aggregator.Add(resource, scope, logRecord) + + exportedLogs := aggregator.Export(context.Background()) + require.Equal(t, 1, exportedLogs.LogRecordCount()) + require.Equal(t, 1, exportedLogs.ResourceLogs().Len()) + + // Check resource + rl := exportedLogs.ResourceLogs().At(0) + actualAttrs := rl.Resource().Attributes() + actualHash := pdatautil.MapHash(actualAttrs) + require.Equal(t, expectedHash, actualHash) + + require.Equal(t, 1, rl.ScopeLogs().Len()) + sl := rl.ScopeLogs().At(0) + + require.Equal(t, 1, sl.LogRecords().Len()) + actualLogRecord := sl.LogRecords().At(0) + + // Check logRecord + require.Equal(t, logRecord.Body().AsString(), actualLogRecord.Body().AsString()) + require.Equal(t, logRecord.SeverityNumber(), actualLogRecord.SeverityNumber()) + require.Equal(t, logRecord.SeverityText(), actualLogRecord.SeverityText()) + require.Equal(t, expectedTimestamp.UnixMilli(), actualLogRecord.ObservedTimestamp().AsTime().UnixMilli()) + require.Equal(t, expectedTimestamp.UnixMilli(), actualLogRecord.Timestamp().AsTime().UnixMilli()) + + actualRawAttrs := actualLogRecord.Attributes().AsRaw() + for key, val := range logRecord.Attributes().AsRaw() { + actualVal, ok := actualRawAttrs[key] + require.True(t, ok) + require.Equal(t, val, actualVal) + } + + // Ensure new attributes were added + actualLogCount, ok := actualRawAttrs[defaultLogCountAttribute] + require.True(t, ok) + require.Equal(t, int64(1), actualLogCount) + + actualFirstObserved, ok := actualRawAttrs[firstObservedTSAttr] + require.True(t, ok) + require.Equal(t, expectedTimestampStr, actualFirstObserved) + + actualLastObserved, ok := actualRawAttrs[lastObservedTSAttr] + require.True(t, ok) + require.Equal(t, expectedTimestampStr, actualLastObserved) +} + +func Test_newResourceAggregator(t *testing.T) { + resource := pcommon.NewResource() + resource.Attributes().PutStr("one", "two") + aggregator := newResourceAggregator(resource) + require.NotNil(t, aggregator.scopeCounters) + require.Equal(t, resource, aggregator.resource) +} + +func Test_newScopeCounter(t *testing.T) { + scope := pcommon.NewInstrumentationScope() + scope.Attributes().PutStr("one", "two") + sc := newScopeAggregator(scope) + require.Equal(t, scope, sc.scope) + require.NotNil(t, sc.logCounters) +} + +func Test_newLogCounter(t *testing.T) { + oldTimeNow := timeNow + defer func() { + timeNow = oldTimeNow + }() + + now := time.Now().UTC() + timeNow = func() time.Time { return now } + logRecord := plog.NewLogRecord() + lc := newLogCounter(logRecord) + require.Equal(t, logRecord, lc.logRecord) + require.Equal(t, int64(0), lc.count) + require.Equal(t, now, lc.firstObservedTimestamp) + require.Equal(t, now, lc.lastObservedTimestamp) +} + +func Test_logCounterIncrement(t *testing.T) { + oldTimeNow := timeNow + defer func() { + timeNow = oldTimeNow + }() + + first := time.Now().UTC() + timeNow = func() time.Time { return first } + logRecord := plog.NewLogRecord() + lc := newLogCounter(logRecord) + require.Equal(t, logRecord, lc.logRecord) + require.Equal(t, int64(0), lc.count) + require.Equal(t, first, lc.firstObservedTimestamp) + + last := time.Now().UTC() + timeNow = func() time.Time { return last } + lc.Increment() + require.Equal(t, int64(1), lc.count) + require.Equal(t, first, lc.firstObservedTimestamp) + require.Equal(t, last, lc.lastObservedTimestamp) +} + +func Test_getLogKey(t *testing.T) { + testCases := []struct { + desc string + testFunc func(*testing.T) + }{ + { + desc: "getLogKey returns the same key for logs that should match", + testFunc: func(t *testing.T) { + logRecord1 := generateTestLogRecord(t, "Body of the log") + + // Differ by timestamp + logRecord1.SetTimestamp(pcommon.NewTimestampFromTime(time.Now().Add(time.Minute))) + + logRecord2 := generateTestLogRecord(t, "Body of the log") + + key1 := getLogKey(logRecord1) + key2 := getLogKey(logRecord2) + + require.Equal(t, key1, key2) + }, + }, + { + desc: "getLogKey returns the different key for logs that shouldn't match", + testFunc: func(t *testing.T) { + logRecord1 := generateTestLogRecord(t, "Body of the log") + + logRecord2 := generateTestLogRecord(t, "A different Body of the log") + + key1 := getLogKey(logRecord1) + key2 := getLogKey(logRecord2) + + require.NotEqual(t, key1, key2) + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.desc, tc.testFunc) + } +} + +func generateTestLogRecord(t *testing.T, body string) plog.LogRecord { + t.Helper() + logRecord := plog.NewLogRecord() + logRecord.Body().SetStr(body) + logRecord.SetSeverityText("info") + logRecord.SetSeverityNumber(0) + logRecord.Attributes().PutBool("bool", true) + logRecord.Attributes().PutStr("str", "attr str") + logRecord.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) + return logRecord +} diff --git a/processor/logdedupprocessor/documentation.md b/processor/logdedupprocessor/documentation.md new file mode 100644 index 000000000000..c807912fbd00 --- /dev/null +++ b/processor/logdedupprocessor/documentation.md @@ -0,0 +1,15 @@ +[comment]: <> (Code generated by mdatagen. DO NOT EDIT.) + +# logdedup + +## Internal Telemetry + +The following telemetry is emitted by this component. + +### otelcol_dedup_processor_aggregated_logs + +Number of log records that were aggregated together. + +| Unit | Metric Type | Value Type | +| ---- | ----------- | ---------- | +| {records} | Histogram | Int | diff --git a/processor/logdedupprocessor/factory.go b/processor/logdedupprocessor/factory.go new file mode 100644 index 000000000000..0931e06cc176 --- /dev/null +++ b/processor/logdedupprocessor/factory.go @@ -0,0 +1,56 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package logdedupprocessor // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/logdedupprocessor" + +import ( + "context" + "fmt" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/consumer" + "go.opentelemetry.io/collector/processor" + + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter/filterottl" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/logdedupprocessor/internal/metadata" +) + +// NewFactory creates a new factory for the processor. +func NewFactory() processor.Factory { + return processor.NewFactory( + metadata.Type, + createDefaultConfig, + processor.WithLogs(createLogsProcessor, metadata.LogsStability), + ) +} + +// createLogsProcessor creates a log processor. +func createLogsProcessor(_ context.Context, settings processor.Settings, cfg component.Config, consumer consumer.Logs) (processor.Logs, error) { + processorCfg, ok := cfg.(*Config) + if !ok { + return nil, fmt.Errorf("invalid config type: %+v", cfg) + } + + processor, err := newProcessor(processorCfg, consumer, settings) + if err != nil { + return nil, fmt.Errorf("error creating processor: %w", err) + } + + if len(processorCfg.Conditions) == 0 { + processor.conditions = nil + } else { + conditions, err := filterottl.NewBoolExprForLog( + processorCfg.Conditions, + filterottl.StandardLogFuncs(), + ottl.PropagateError, + settings.TelemetrySettings, + ) + if err != nil { + return nil, fmt.Errorf("invalid condition: %w", err) + } + processor.conditions = conditions + } + + return processor, nil +} diff --git a/processor/logdedupprocessor/factory_test.go b/processor/logdedupprocessor/factory_test.go new file mode 100644 index 000000000000..14f523c5895c --- /dev/null +++ b/processor/logdedupprocessor/factory_test.go @@ -0,0 +1,86 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package logdedupprocessor + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/processor/processortest" + + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/logdedupprocessor/internal/metadata" +) + +func TestNewProcessorFactory(t *testing.T) { + f := NewFactory() + require.Equal(t, metadata.Type, f.Type()) + require.Equal(t, metadata.LogsStability, f.LogsStability()) + require.NotNil(t, f.CreateDefaultConfig()) + require.NotNil(t, f.CreateLogs) +} + +func TestCreateLogs(t *testing.T) { + testCases := []struct { + name string + cfg component.Config + expectedErr string + }{ + { + name: "valid config", + cfg: createDefaultConfig().(*Config), + }, + { + name: "invalid config type", + cfg: nil, + expectedErr: "invalid config type", + }, + { + name: "valid custom condition", + cfg: &Config{ + LogCountAttribute: defaultLogCountAttribute, + Interval: defaultInterval, + Timezone: defaultTimezone, + ExcludeFields: []string{}, + Conditions: []string{"false"}, + }, + }, + { + name: "valid multiple conditions", + cfg: &Config{ + LogCountAttribute: defaultLogCountAttribute, + Interval: defaultInterval, + Timezone: defaultTimezone, + ExcludeFields: []string{}, + Conditions: []string{"false", `(attributes["ID"] == 1)`}, + }, + }, + { + name: "invalid condition", + cfg: &Config{ + LogCountAttribute: defaultLogCountAttribute, + Interval: defaultInterval, + Timezone: defaultTimezone, + ExcludeFields: []string{}, + Conditions: []string{"x"}, + }, + expectedErr: "invalid condition", + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + f := NewFactory() + p, err := f.CreateLogs(context.Background(), processortest.NewNopSettings(), tc.cfg, nil) + if tc.expectedErr == "" { + require.NoError(t, err) + require.IsType(t, &logDedupProcessor{}, p) + } else { + require.ErrorContains(t, err, tc.expectedErr) + require.Nil(t, p) + } + }) + } +} diff --git a/processor/logdedupprocessor/field_remover.go b/processor/logdedupprocessor/field_remover.go new file mode 100644 index 000000000000..bd82a7715214 --- /dev/null +++ b/processor/logdedupprocessor/field_remover.go @@ -0,0 +1,111 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package logdedupprocessor // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/logdedupprocessor" + +import ( + "fmt" + "strings" + + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/plog" +) + +const ( + // fieldDelimiter is the delimiter used to split a field key into its parts. + fieldDelimiter = "." + + // fieldEscapeKeyReplacement is the string used to temporarily replace escaped delimters while splitting a field key. + fieldEscapeKeyReplacement = "{TEMP_REPLACE}" +) + +// fieldRemover handles removing excluded fields from log records +type fieldRemover struct { + fields []*field +} + +// field represents a field and it's compound key to match on +type field struct { + keyParts []string +} + +// newFieldRemover creates a new field remover based on the passed in field keys +func newFieldRemover(fieldKeys []string) *fieldRemover { + fe := &fieldRemover{ + fields: make([]*field, 0, len(fieldKeys)), + } + + for _, f := range fieldKeys { + fe.fields = append(fe.fields, &field{ + keyParts: splitField(f), + }) + } + + return fe +} + +// RemoveFields removes any body or attribute fields that match in the log record +func (fe *fieldRemover) RemoveFields(logRecord plog.LogRecord) { + for _, field := range fe.fields { + field.removeField(logRecord) + } +} + +// removeField removes the field from the log record if it exists +func (f *field) removeField(logRecord plog.LogRecord) { + firstPart, remainingParts := f.keyParts[0], f.keyParts[1:] + + switch firstPart { + case bodyField: + // If body is a map then recurse through to remove the field + if logRecord.Body().Type() == pcommon.ValueTypeMap { + removeFieldFromMap(logRecord.Body().Map(), remainingParts) + } + case attributeField: + // Remove all attributes + if len(remainingParts) == 0 { + logRecord.Attributes().Clear() + return + } + + // Recurse through map and remove fields + removeFieldFromMap(logRecord.Attributes(), remainingParts) + } +} + +// removeFieldFromMap recurses through the map and removes the field if it's found. +func removeFieldFromMap(valueMap pcommon.Map, keyParts []string) { + nextKeyPart, remainingParts := keyParts[0], keyParts[1:] + + // Look for the value associated with the next key part. + // If we don't find it then return + value, ok := valueMap.Get(nextKeyPart) + if !ok { + return + } + + // No more key parts that means we have found the value and remove it + if len(remainingParts) == 0 { + valueMap.Remove(nextKeyPart) + return + } + + // If the value is a map then recurse through with the remaining parts + if value.Type() == pcommon.ValueTypeMap { + removeFieldFromMap(value.Map(), remainingParts) + } +} + +// splitField splits a field key into its parts. +// It replaces escaped delimiters with the full delimiter after splitting. +func splitField(fieldKey string) []string { + escapedKey := strings.ReplaceAll(fieldKey, fmt.Sprintf("\\%s", fieldDelimiter), fieldEscapeKeyReplacement) + keyParts := strings.Split(escapedKey, fieldDelimiter) + + // Replace the temporarily escaped delimiters with the actual delimiter. + for i := range keyParts { + keyParts[i] = strings.ReplaceAll(keyParts[i], fieldEscapeKeyReplacement, fieldDelimiter) + } + + return keyParts +} diff --git a/processor/logdedupprocessor/field_remover_test.go b/processor/logdedupprocessor/field_remover_test.go new file mode 100644 index 000000000000..173bee6b2e9e --- /dev/null +++ b/processor/logdedupprocessor/field_remover_test.go @@ -0,0 +1,100 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package logdedupprocessor + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/plog" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil" +) + +func Test_newFieldRemover(t *testing.T) { + fieldKeys := []string{ + "single_field", + "compound.field.one", + "escaped\\.field", + "escaped\\.compound.field", + } + + expected := &fieldRemover{ + fields: []*field{ + { + keyParts: []string{"single_field"}, + }, + { + keyParts: []string{"compound", "field", "one"}, + }, + { + keyParts: []string{"escaped.field"}, + }, + { + keyParts: []string{"escaped.compound", "field"}, + }, + }, + } + + actual := newFieldRemover(fieldKeys) + require.Equal(t, expected, actual) +} + +// TestRemoveFieldsAttributes tests when a remove field is attributes +func TestRemoveFieldsAttributes(t *testing.T) { + fields := []string{attributeField} + remover := newFieldRemover(fields) + + expectedBody := "test body" + logRecord := generateTestLogRecord(t, expectedBody) + + remover.RemoveFields(logRecord) + require.Equal(t, expectedBody, logRecord.Body().AsString()) + require.Equal(t, 0, logRecord.Attributes().Len()) +} + +func TestRemoveFields(t *testing.T) { + fields := []string{ + fmt.Sprintf("%s.nested\\.map.bool", bodyField), + fmt.Sprintf("%s.bool", attributeField), + fmt.Sprintf("%s.nested", attributeField), + fmt.Sprintf("%s.not_present", bodyField), + } + remover := newFieldRemover(fields) + + logRecord := plog.NewLogRecord() + + // Fill attribute map + logRecord.Attributes().PutBool("bool", true) + logRecord.Attributes().PutStr("str", "attr str") + nestedAttrMap := logRecord.Attributes().PutEmptyMap("nested") + nestedAttrMap.PutInt("int", 2) + + // Expected attribut map + expectedAttrsMap := pcommon.NewMap() + expectedAttrsMap.PutStr("str", "attr str") + expectedAttrHash := pdatautil.MapHash(expectedAttrsMap) + + // Fill body map + bodyMap := logRecord.Body().SetEmptyMap() + bodyMap.PutInt("safe", 10) + nestedBodyMap := bodyMap.PutEmptyMap("nested.map") + nestedBodyMap.PutBool("bool", true) + + // expected body map + expectedBodyMap := pcommon.NewMap() + expectedBodyMap.PutEmptyMap("nested.map") + expectedBodyMap.PutInt("safe", 10) + expectedBodyHash := pdatautil.MapHash(expectedBodyMap) + + remover.RemoveFields(logRecord) + + actualAttrHash := pdatautil.MapHash(logRecord.Attributes()) + actualBodyHash := pdatautil.MapHash(logRecord.Body().Map()) + + require.Equal(t, expectedAttrHash, actualAttrHash) + require.Equal(t, expectedBodyHash, actualBodyHash) +} diff --git a/processor/logdedupprocessor/generated_component_telemetry_test.go b/processor/logdedupprocessor/generated_component_telemetry_test.go new file mode 100644 index 000000000000..3254ebfd89d1 --- /dev/null +++ b/processor/logdedupprocessor/generated_component_telemetry_test.go @@ -0,0 +1,75 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package logdedupprocessor + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/processor" + "go.opentelemetry.io/collector/processor/processortest" + sdkmetric "go.opentelemetry.io/otel/sdk/metric" + "go.opentelemetry.io/otel/sdk/metric/metricdata" + "go.opentelemetry.io/otel/sdk/metric/metricdata/metricdatatest" +) + +type componentTestTelemetry struct { + reader *sdkmetric.ManualReader + meterProvider *sdkmetric.MeterProvider +} + +func (tt *componentTestTelemetry) NewSettings() processor.Settings { + settings := processortest.NewNopSettings() + settings.MeterProvider = tt.meterProvider + settings.ID = component.NewID(component.MustNewType("logdedup")) + + return settings +} + +func setupTestTelemetry() componentTestTelemetry { + reader := sdkmetric.NewManualReader() + return componentTestTelemetry{ + reader: reader, + meterProvider: sdkmetric.NewMeterProvider(sdkmetric.WithReader(reader)), + } +} + +func (tt *componentTestTelemetry) assertMetrics(t *testing.T, expected []metricdata.Metrics) { + var md metricdata.ResourceMetrics + require.NoError(t, tt.reader.Collect(context.Background(), &md)) + // ensure all required metrics are present + for _, want := range expected { + got := tt.getMetric(want.Name, md) + metricdatatest.AssertEqual(t, want, got, metricdatatest.IgnoreTimestamp()) + } + + // ensure no additional metrics are emitted + require.Equal(t, len(expected), tt.len(md)) +} + +func (tt *componentTestTelemetry) getMetric(name string, got metricdata.ResourceMetrics) metricdata.Metrics { + for _, sm := range got.ScopeMetrics { + for _, m := range sm.Metrics { + if m.Name == name { + return m + } + } + } + + return metricdata.Metrics{} +} + +func (tt *componentTestTelemetry) len(got metricdata.ResourceMetrics) int { + metricsCount := 0 + for _, sm := range got.ScopeMetrics { + metricsCount += len(sm.Metrics) + } + + return metricsCount +} + +func (tt *componentTestTelemetry) Shutdown(ctx context.Context) error { + return tt.meterProvider.Shutdown(ctx) +} diff --git a/processor/logdedupprocessor/generated_component_test.go b/processor/logdedupprocessor/generated_component_test.go new file mode 100644 index 000000000000..2b7a9b06609b --- /dev/null +++ b/processor/logdedupprocessor/generated_component_test.go @@ -0,0 +1,135 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package logdedupprocessor + +import ( + "context" + "testing" + "time" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/confmap/confmaptest" + "go.opentelemetry.io/collector/consumer/consumertest" + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/plog" + "go.opentelemetry.io/collector/pdata/pmetric" + "go.opentelemetry.io/collector/pdata/ptrace" + "go.opentelemetry.io/collector/processor" + "go.opentelemetry.io/collector/processor/processortest" +) + +func TestComponentFactoryType(t *testing.T) { + require.Equal(t, "logdedup", NewFactory().Type().String()) +} + +func TestComponentConfigStruct(t *testing.T) { + require.NoError(t, componenttest.CheckConfigStruct(NewFactory().CreateDefaultConfig())) +} + +func TestComponentLifecycle(t *testing.T) { + factory := NewFactory() + + tests := []struct { + name string + createFn func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) + }{ + + { + name: "logs", + createFn: func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg, consumertest.NewNop()) + }, + }, + } + + cm, err := confmaptest.LoadConf("metadata.yaml") + require.NoError(t, err) + cfg := factory.CreateDefaultConfig() + sub, err := cm.Sub("tests::config") + require.NoError(t, err) + require.NoError(t, sub.Unmarshal(&cfg)) + + for _, test := range tests { + t.Run(test.name+"-shutdown", func(t *testing.T) { + c, err := test.createFn(context.Background(), processortest.NewNopSettings(), cfg) + require.NoError(t, err) + err = c.Shutdown(context.Background()) + require.NoError(t, err) + }) + t.Run(test.name+"-lifecycle", func(t *testing.T) { + c, err := test.createFn(context.Background(), processortest.NewNopSettings(), cfg) + require.NoError(t, err) + host := componenttest.NewNopHost() + err = c.Start(context.Background(), host) + require.NoError(t, err) + require.NotPanics(t, func() { + switch test.name { + case "logs": + e, ok := c.(processor.Logs) + require.True(t, ok) + logs := generateLifecycleTestLogs() + if !e.Capabilities().MutatesData { + logs.MarkReadOnly() + } + err = e.ConsumeLogs(context.Background(), logs) + case "metrics": + e, ok := c.(processor.Metrics) + require.True(t, ok) + metrics := generateLifecycleTestMetrics() + if !e.Capabilities().MutatesData { + metrics.MarkReadOnly() + } + err = e.ConsumeMetrics(context.Background(), metrics) + case "traces": + e, ok := c.(processor.Traces) + require.True(t, ok) + traces := generateLifecycleTestTraces() + if !e.Capabilities().MutatesData { + traces.MarkReadOnly() + } + err = e.ConsumeTraces(context.Background(), traces) + } + }) + require.NoError(t, err) + err = c.Shutdown(context.Background()) + require.NoError(t, err) + }) + } +} + +func generateLifecycleTestLogs() plog.Logs { + logs := plog.NewLogs() + rl := logs.ResourceLogs().AppendEmpty() + rl.Resource().Attributes().PutStr("resource", "R1") + l := rl.ScopeLogs().AppendEmpty().LogRecords().AppendEmpty() + l.Body().SetStr("test log message") + l.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) + return logs +} + +func generateLifecycleTestMetrics() pmetric.Metrics { + metrics := pmetric.NewMetrics() + rm := metrics.ResourceMetrics().AppendEmpty() + rm.Resource().Attributes().PutStr("resource", "R1") + m := rm.ScopeMetrics().AppendEmpty().Metrics().AppendEmpty() + m.SetName("test_metric") + dp := m.SetEmptyGauge().DataPoints().AppendEmpty() + dp.Attributes().PutStr("test_attr", "value_1") + dp.SetIntValue(123) + dp.SetTimestamp(pcommon.NewTimestampFromTime(time.Now())) + return metrics +} + +func generateLifecycleTestTraces() ptrace.Traces { + traces := ptrace.NewTraces() + rs := traces.ResourceSpans().AppendEmpty() + rs.Resource().Attributes().PutStr("resource", "R1") + span := rs.ScopeSpans().AppendEmpty().Spans().AppendEmpty() + span.Attributes().PutStr("test_attr", "value_1") + span.SetName("test_span") + span.SetStartTimestamp(pcommon.NewTimestampFromTime(time.Now().Add(-1 * time.Second))) + span.SetEndTimestamp(pcommon.NewTimestampFromTime(time.Now())) + return traces +} diff --git a/processor/logdedupprocessor/generated_package_test.go b/processor/logdedupprocessor/generated_package_test.go new file mode 100644 index 000000000000..bb93eddab91e --- /dev/null +++ b/processor/logdedupprocessor/generated_package_test.go @@ -0,0 +1,13 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package logdedupprocessor + +import ( + "testing" + + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + goleak.VerifyTestMain(m) +} diff --git a/processor/logdedupprocessor/go.mod b/processor/logdedupprocessor/go.mod new file mode 100644 index 000000000000..32b5f3febd64 --- /dev/null +++ b/processor/logdedupprocessor/go.mod @@ -0,0 +1,93 @@ +module github.com/open-telemetry/opentelemetry-collector-contrib/processor/logdedupprocessor + +go 1.22.0 + +require ( + github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/processor v0.116.0 + go.opentelemetry.io/collector/processor/processortest v0.116.0 + go.opentelemetry.io/otel/metric v1.32.0 + go.opentelemetry.io/otel/sdk/metric v1.32.0 + go.opentelemetry.io/otel/trace v1.32.0 + go.uber.org/goleak v1.3.0 + go.uber.org/zap v1.27.0 +) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +require ( + github.com/alecthomas/participle/v2 v2.1.1 // indirect + github.com/antchfx/xmlquery v1.4.2 // indirect + github.com/antchfx/xpath v1.3.2 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/elastic/go-grok v0.3.1 // indirect + github.com/elastic/lunes v0.1.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/gobwas/glob v0.2.3 // indirect + github.com/goccy/go-json v0.10.4 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/golang-lru v0.5.4 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect + github.com/iancoleman/strcase v0.3.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/knadh/koanf/maps v0.1.1 // indirect + github.com/knadh/koanf/providers/confmap v0.1.0 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect + github.com/magefile/mage v1.15.0 // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 // indirect + github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 // indirect + go.opentelemetry.io/collector/component/componentstatus v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/testdata v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/processor/xprocessor v0.116.0 // indirect + go.opentelemetry.io/collector/semconv v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect +) + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../../pkg/pdatautil + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest => ../../pkg/pdatatest + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden => ../../pkg/golden + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl => ../../pkg/ottl + +replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter => ../../internal/filter + +replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal => ../../internal/coreinternal diff --git a/processor/logdedupprocessor/go.sum b/processor/logdedupprocessor/go.sum new file mode 100644 index 000000000000..3537a0654b4f --- /dev/null +++ b/processor/logdedupprocessor/go.sum @@ -0,0 +1,199 @@ +github.com/alecthomas/assert/v2 v2.3.0 h1:mAsH2wmvjsuvyBvAmCtm7zFsBlb8mIHx5ySLVdDZXL0= +github.com/alecthomas/assert/v2 v2.3.0/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= +github.com/alecthomas/participle/v2 v2.1.1 h1:hrjKESvSqGHzRb4yW1ciisFJ4p3MGYih6icjJvbsmV8= +github.com/alecthomas/participle/v2 v2.1.1/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= +github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= +github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= +github.com/antchfx/xmlquery v1.4.2 h1:MZKd9+wblwxfQ1zd1AdrTsqVaMjMCwow3IqkCSe00KA= +github.com/antchfx/xmlquery v1.4.2/go.mod h1:QXhvf5ldTuGqhd1SHNvvtlhhdQLks4dD0awIVhXIDTA= +github.com/antchfx/xpath v1.3.2 h1:LNjzlsSjinu3bQpw9hWMY9ocB80oLOWuQqFvO6xt51U= +github.com/antchfx/xpath v1.3.2/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/elastic/go-grok v0.3.1 h1:WEhUxe2KrwycMnlvMimJXvzRa7DoByJB4PVUIE1ZD/U= +github.com/elastic/go-grok v0.3.1/go.mod h1:n38ls8ZgOboZRgKcjMY8eFeZFMmcL9n2lP0iHhIDk64= +github.com/elastic/lunes v0.1.0 h1:amRtLPjwkWtzDF/RKzcEPMvSsSseLDLW+bnhfNSLRe4= +github.com/elastic/lunes v0.1.0/go.mod h1:xGphYIt3XdZRtyWosHQTErsQTd4OP1p9wsbVoHelrd4= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= +github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= +github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= +github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= +github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= +github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= +github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= +github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= +github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 h1:SIKIoA4e/5Y9ZOl0DCe3eVMLPOQzJxgZpfdHHeauNTM= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6/go.mod h1:BUbeWZiieNxAuuADTBNb3/aeje6on3DhU3rpWsQSB1E= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/processor v0.116.0 h1:Kyu4tPzTdWNHtZjcxvI/bGNAgyv8L8Kem2r/Mk4IDAw= +go.opentelemetry.io/collector/processor v0.116.0/go.mod h1:+/Ugy48RAxlZEXmN2cw51W8t5wdHS9No+GAoP+moskk= +go.opentelemetry.io/collector/processor/processortest v0.116.0 h1:+IqNEVEE0E2MsO2g7+Y/9dz35sDuvAXRXrLts9NdXrA= +go.opentelemetry.io/collector/processor/processortest v0.116.0/go.mod h1:DLaQDBxzgeeaUO0ULMn/efos9PmHZkmYCHuxwCsiVHI= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0 h1:iin/UwuWvSLB7ZNfINFUYbZ5lxIi1NjZ2brkyyFdiRA= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0/go.mod h1:cnA43/XpKDbaOmd8buqKp/LGJ2l/OoCqbR//u5DMfn8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/processor/logdedupprocessor/internal/metadata/generated_status.go b/processor/logdedupprocessor/internal/metadata/generated_status.go new file mode 100644 index 000000000000..e33991b25de6 --- /dev/null +++ b/processor/logdedupprocessor/internal/metadata/generated_status.go @@ -0,0 +1,16 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "go.opentelemetry.io/collector/component" +) + +var ( + Type = component.MustNewType("logdedup") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/processor/logdedupprocessor" +) + +const ( + LogsStability = component.StabilityLevelAlpha +) diff --git a/processor/logdedupprocessor/internal/metadata/generated_telemetry.go b/processor/logdedupprocessor/internal/metadata/generated_telemetry.go new file mode 100644 index 000000000000..0fd0abafca48 --- /dev/null +++ b/processor/logdedupprocessor/internal/metadata/generated_telemetry.go @@ -0,0 +1,61 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "errors" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configtelemetry" + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/metric/noop" + "go.opentelemetry.io/otel/trace" +) + +func Meter(settings component.TelemetrySettings) metric.Meter { + return settings.MeterProvider.Meter("github.com/open-telemetry/opentelemetry-collector-contrib/processor/logdedupprocessor") +} + +func Tracer(settings component.TelemetrySettings) trace.Tracer { + return settings.TracerProvider.Tracer("github.com/open-telemetry/opentelemetry-collector-contrib/processor/logdedupprocessor") +} + +// TelemetryBuilder provides an interface for components to report telemetry +// as defined in metadata and user config. +type TelemetryBuilder struct { + meter metric.Meter + DedupProcessorAggregatedLogs metric.Int64Histogram + level configtelemetry.Level +} + +// telemetryBuilderOption applies changes to default builder. +type telemetryBuilderOption func(*TelemetryBuilder) + +// WithLevel sets the current telemetry level for the component. +func WithLevel(lvl configtelemetry.Level) telemetryBuilderOption { + return func(builder *TelemetryBuilder) { + builder.level = lvl + } +} + +// NewTelemetryBuilder provides a struct with methods to update all internal telemetry +// for a component +func NewTelemetryBuilder(settings component.TelemetrySettings, options ...telemetryBuilderOption) (*TelemetryBuilder, error) { + builder := TelemetryBuilder{level: configtelemetry.LevelBasic} + for _, op := range options { + op(&builder) + } + var err, errs error + if builder.level >= configtelemetry.LevelBasic { + builder.meter = Meter(settings) + } else { + builder.meter = noop.Meter{} + } + builder.DedupProcessorAggregatedLogs, err = builder.meter.Int64Histogram( + "otelcol_dedup_processor_aggregated_logs", + metric.WithDescription("Number of log records that were aggregated together."), + metric.WithUnit("{records}"), + ) + errs = errors.Join(errs, err) + return &builder, errs +} diff --git a/processor/logdedupprocessor/internal/metadata/generated_telemetry_test.go b/processor/logdedupprocessor/internal/metadata/generated_telemetry_test.go new file mode 100644 index 000000000000..bd8fe035313b --- /dev/null +++ b/processor/logdedupprocessor/internal/metadata/generated_telemetry_test.go @@ -0,0 +1,75 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/otel/metric" + embeddedmetric "go.opentelemetry.io/otel/metric/embedded" + noopmetric "go.opentelemetry.io/otel/metric/noop" + "go.opentelemetry.io/otel/trace" + embeddedtrace "go.opentelemetry.io/otel/trace/embedded" + nooptrace "go.opentelemetry.io/otel/trace/noop" +) + +type mockMeter struct { + noopmetric.Meter + name string +} +type mockMeterProvider struct { + embeddedmetric.MeterProvider +} + +func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { + return mockMeter{name: name} +} + +type mockTracer struct { + nooptrace.Tracer + name string +} + +type mockTracerProvider struct { + embeddedtrace.TracerProvider +} + +func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { + return mockTracer{name: name} +} + +func TestProviders(t *testing.T) { + set := component.TelemetrySettings{ + MeterProvider: mockMeterProvider{}, + TracerProvider: mockTracerProvider{}, + } + + meter := Meter(set) + if m, ok := meter.(mockMeter); ok { + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/processor/logdedupprocessor", m.name) + } else { + require.Fail(t, "returned Meter not mockMeter") + } + + tracer := Tracer(set) + if m, ok := tracer.(mockTracer); ok { + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/processor/logdedupprocessor", m.name) + } else { + require.Fail(t, "returned Meter not mockTracer") + } +} + +func TestNewTelemetryBuilder(t *testing.T) { + set := component.TelemetrySettings{ + MeterProvider: mockMeterProvider{}, + TracerProvider: mockTracerProvider{}, + } + applied := false + _, err := NewTelemetryBuilder(set, func(b *TelemetryBuilder) { + applied = true + }) + require.NoError(t, err) + require.True(t, applied) +} diff --git a/processor/logdedupprocessor/metadata.yaml b/processor/logdedupprocessor/metadata.yaml new file mode 100644 index 000000000000..ed34c04ace12 --- /dev/null +++ b/processor/logdedupprocessor/metadata.yaml @@ -0,0 +1,22 @@ +type: logdedup + +status: + class: processor + stability: + alpha: [logs] + distributions: [contrib, k8s] + warnings: [] + codeowners: + active: [MikeGoldsmith, djaglowski] + +tests: + config: + +telemetry: + metrics: + dedup_processor_aggregated_logs: + description: Number of log records that were aggregated together. + unit: "{records}" + enabled: true + histogram: + value_type: int \ No newline at end of file diff --git a/processor/logdedupprocessor/processor.go b/processor/logdedupprocessor/processor.go new file mode 100644 index 000000000000..efd5095a2eaf --- /dev/null +++ b/processor/logdedupprocessor/processor.go @@ -0,0 +1,170 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package logdedupprocessor // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/logdedupprocessor" + +import ( + "context" + "fmt" + "sync" + "time" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/consumer" + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/plog" + "go.opentelemetry.io/collector/processor" + "go.uber.org/zap" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottllog" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/logdedupprocessor/internal/metadata" +) + +// logDedupProcessor is a logDedupProcessor that counts duplicate instances of logs. +type logDedupProcessor struct { + emitInterval time.Duration + conditions *ottl.ConditionSequence[ottllog.TransformContext] + aggregator *logAggregator + remover *fieldRemover + nextConsumer consumer.Logs + logger *zap.Logger + cancel context.CancelFunc + wg sync.WaitGroup + mux sync.Mutex +} + +func newProcessor(cfg *Config, nextConsumer consumer.Logs, settings processor.Settings) (*logDedupProcessor, error) { + telemetryBuilder, err := metadata.NewTelemetryBuilder(settings.TelemetrySettings) + if err != nil { + return nil, fmt.Errorf("failed to create telemetry builder: %w", err) + } + + // This should not happen due to config validation but we check anyways. + timezone, err := time.LoadLocation(cfg.Timezone) + if err != nil { + return nil, fmt.Errorf("invalid timezone: %w", err) + } + + return &logDedupProcessor{ + emitInterval: cfg.Interval, + aggregator: newLogAggregator(cfg.LogCountAttribute, timezone, telemetryBuilder), + remover: newFieldRemover(cfg.ExcludeFields), + nextConsumer: nextConsumer, + logger: settings.Logger, + }, nil +} + +// Start starts the processor. +func (p *logDedupProcessor) Start(ctx context.Context, _ component.Host) error { + ctx, cancel := context.WithCancel(ctx) + p.cancel = cancel + + p.wg.Add(1) + go p.handleExportInterval(ctx) + + return nil +} + +// Capabilities returns the consumer's capabilities. +func (p *logDedupProcessor) Capabilities() consumer.Capabilities { + return consumer.Capabilities{MutatesData: true} +} + +// Shutdown stops the processor. +func (p *logDedupProcessor) Shutdown(_ context.Context) error { + if p.cancel != nil { + // Call cancel to stop the export interval goroutine and wait for it to finish. + p.cancel() + p.wg.Wait() + } + return nil +} + +// ConsumeLogs processes the logs. +func (p *logDedupProcessor) ConsumeLogs(ctx context.Context, pl plog.Logs) error { + p.mux.Lock() + defer p.mux.Unlock() + + for i := 0; i < pl.ResourceLogs().Len(); i++ { + rl := pl.ResourceLogs().At(i) + resource := rl.Resource() + + for j := 0; j < rl.ScopeLogs().Len(); j++ { + sl := rl.ScopeLogs().At(j) + scope := sl.Scope() + logs := sl.LogRecords() + + logs.RemoveIf(func(logRecord plog.LogRecord) bool { + if p.conditions == nil { + p.aggregateLog(logRecord, scope, resource) + return true + } + + logCtx := ottllog.NewTransformContext(logRecord, scope, resource, sl, rl) + logMatch, err := p.conditions.Eval(ctx, logCtx) + if err != nil { + p.logger.Error("error matching conditions", zap.Error(err)) + return false + } + if logMatch { + p.aggregateLog(logRecord, scope, resource) + } + return logMatch + }) + } + } + + // immediately consume any logs that didn't match any conditions + if pl.LogRecordCount() > 0 { + err := p.nextConsumer.ConsumeLogs(ctx, pl) + if err != nil { + p.logger.Error("failed to consume logs", zap.Error(err)) + } + } + + return nil +} + +func (p *logDedupProcessor) aggregateLog(logRecord plog.LogRecord, scope pcommon.InstrumentationScope, resource pcommon.Resource) { + p.remover.RemoveFields(logRecord) + p.aggregator.Add(resource, scope, logRecord) +} + +// handleExportInterval sends metrics at the configured interval. +func (p *logDedupProcessor) handleExportInterval(ctx context.Context) { + defer p.wg.Done() + + ticker := time.NewTicker(p.emitInterval) + defer ticker.Stop() + + for { + select { + case <-ctx.Done(): + // Export any remaining logs + p.exportLogs(ctx) + if err := ctx.Err(); err != context.Canceled { + p.logger.Error("context error", zap.Error(err)) + } + return + case <-ticker.C: + p.exportLogs(ctx) + } + } +} + +// exportLogs exports the logs to the next consumer. +func (p *logDedupProcessor) exportLogs(ctx context.Context) { + p.mux.Lock() + defer p.mux.Unlock() + + logs := p.aggregator.Export(ctx) + // Only send logs if we have some + if logs.LogRecordCount() > 0 { + err := p.nextConsumer.ConsumeLogs(ctx, logs) + if err != nil { + p.logger.Error("failed to consume logs", zap.Error(err)) + } + } + p.aggregator.Reset() +} diff --git a/processor/logdedupprocessor/processor_test.go b/processor/logdedupprocessor/processor_test.go new file mode 100644 index 000000000000..72aa5919aad7 --- /dev/null +++ b/processor/logdedupprocessor/processor_test.go @@ -0,0 +1,310 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package logdedupprocessor + +import ( + "context" + "errors" + "fmt" + "path/filepath" + "testing" + "time" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/consumer" + "go.opentelemetry.io/collector/consumer/consumertest" + "go.opentelemetry.io/collector/pdata/plog" + "go.opentelemetry.io/collector/processor/processortest" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/plogtest" +) + +func Test_newProcessor(t *testing.T) { + testCases := []struct { + desc string + cfg *Config + expected *logDedupProcessor + expectedErr error + }{ + { + desc: "Timezone error", + cfg: &Config{ + LogCountAttribute: defaultLogCountAttribute, + Interval: defaultInterval, + Conditions: []string{}, + Timezone: "bad timezone", + }, + expected: nil, + expectedErr: errors.New("invalid timezone"), + }, + { + desc: "valid config", + cfg: &Config{ + LogCountAttribute: defaultLogCountAttribute, + Interval: defaultInterval, + Conditions: []string{}, + Timezone: defaultTimezone, + }, + expected: &logDedupProcessor{ + emitInterval: defaultInterval, + }, + expectedErr: nil, + }, + } + + for _, tc := range testCases { + t.Run(tc.desc, func(t *testing.T) { + logsSink := &consumertest.LogsSink{} + settings := processortest.NewNopSettings() + + if tc.expected != nil { + tc.expected.nextConsumer = logsSink + } + + actual, err := newProcessor(tc.cfg, logsSink, settings) + if tc.expectedErr != nil { + require.ErrorContains(t, err, tc.expectedErr.Error()) + require.Nil(t, actual) + } else { + require.NoError(t, err) + require.Equal(t, tc.expected.emitInterval, actual.emitInterval) + require.NotNil(t, actual.aggregator) + require.NotNil(t, actual.remover) + require.Equal(t, tc.expected.nextConsumer, actual.nextConsumer) + } + }) + } +} + +func TestProcessorShutdownCtxError(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + cancel() + + logsSink := &consumertest.LogsSink{} + settings := processortest.NewNopSettings() + cfg := &Config{ + LogCountAttribute: defaultLogCountAttribute, + Interval: 1 * time.Second, + Timezone: defaultTimezone, + Conditions: []string{}, + } + + // Create a processor + p, err := createLogsProcessor(context.Background(), settings, cfg, logsSink) + require.NoError(t, err) + + // Start then stop the processor checking for errors + err = p.Start(ctx, componenttest.NewNopHost()) + require.NoError(t, err) + err = p.Shutdown(ctx) + require.NoError(t, err) +} + +func TestProcessorCapabilities(t *testing.T) { + p := &logDedupProcessor{} + require.Equal(t, consumer.Capabilities{MutatesData: true}, p.Capabilities()) +} + +func TestShutdownBeforeStart(t *testing.T) { + logsSink := &consumertest.LogsSink{} + settings := processortest.NewNopSettings() + cfg := &Config{ + LogCountAttribute: defaultLogCountAttribute, + Interval: 1 * time.Second, + Timezone: defaultTimezone, + Conditions: []string{}, + ExcludeFields: []string{ + fmt.Sprintf("%s.remove_me", attributeField), + }, + } + + // Create a processor + p, err := createLogsProcessor(context.Background(), settings, cfg, logsSink) + require.NoError(t, err) + require.NotPanics(t, func() { + err := p.Shutdown(context.Background()) + require.NoError(t, err) + }) +} + +func TestProcessorConsume(t *testing.T) { + logsSink := &consumertest.LogsSink{} + settings := processortest.NewNopSettings() + cfg := &Config{ + LogCountAttribute: defaultLogCountAttribute, + Interval: 1 * time.Second, + Timezone: defaultTimezone, + Conditions: []string{}, + ExcludeFields: []string{ + fmt.Sprintf("%s.remove_me", attributeField), + }, + } + + // Create a processor + p, err := createLogsProcessor(context.Background(), settings, cfg, logsSink) + require.NoError(t, err) + + err = p.Start(context.Background(), componenttest.NewNopHost()) + require.NoError(t, err) + + logs, err := golden.ReadLogs(filepath.Join("testdata", "input", "basicLogs.yaml")) + require.NoError(t, err) + + // Consume the payload + err = p.ConsumeLogs(context.Background(), logs) + require.NoError(t, err) + + // Wait for the logs to be emitted + require.Eventually(t, func() bool { + return logsSink.LogRecordCount() > 0 + }, 3*time.Second, 200*time.Millisecond) + + expectedLogs, err := golden.ReadLogs(filepath.Join("testdata", "expected", "basicLogs.yaml")) + require.NoError(t, err) + + allSinkLogs := logsSink.AllLogs() + require.Len(t, allSinkLogs, 1) + + require.NoError(t, plogtest.CompareLogs(expectedLogs, allSinkLogs[0], plogtest.IgnoreObservedTimestamp(), plogtest.IgnoreTimestamp(), plogtest.IgnoreLogRecordAttributeValue("first_observed_timestamp"), plogtest.IgnoreLogRecordAttributeValue("last_observed_timestamp"))) + + // Cleanup + err = p.Shutdown(context.Background()) + require.NoError(t, err) +} + +func Test_unsetLogsAreExportedOnShutdown(t *testing.T) { + logsSink := &consumertest.LogsSink{} + cfg := &Config{ + LogCountAttribute: defaultLogCountAttribute, + Interval: 1 * time.Second, + Timezone: defaultTimezone, + Conditions: []string{}, + } + + // Create & start a processor + p, err := createLogsProcessor(context.Background(), processortest.NewNopSettings(), cfg, logsSink) + require.NoError(t, err) + err = p.Start(context.Background(), componenttest.NewNopHost()) + require.NoError(t, err) + + // Create logs payload + logs := plog.NewLogs() + rl := logs.ResourceLogs().AppendEmpty() + sl := rl.ScopeLogs().AppendEmpty() + sl.LogRecords().AppendEmpty() + + // Consume the logs + err = p.ConsumeLogs(context.Background(), logs) + require.NoError(t, err) + + // Shutdown the processor before it exports the logs + err = p.Shutdown(context.Background()) + require.NoError(t, err) + + // Ensure the logs are exported + exportedLogs := logsSink.AllLogs() + require.Len(t, exportedLogs, 1) +} + +func TestProcessorConsumeCondition(t *testing.T) { + logsSink := &consumertest.LogsSink{} + cfg := &Config{ + LogCountAttribute: defaultLogCountAttribute, + Interval: 1 * time.Second, + Timezone: defaultTimezone, + Conditions: []string{`(attributes["ID"] == 1)`}, + ExcludeFields: []string{ + fmt.Sprintf("%s.remove_me", attributeField), + }, + } + + // Create a processor + p, err := createLogsProcessor(context.Background(), processortest.NewNopSettings(), cfg, logsSink) + require.NoError(t, err) + + err = p.Start(context.Background(), componenttest.NewNopHost()) + require.NoError(t, err) + + logs, err := golden.ReadLogs(filepath.Join("testdata", "input", "conditionLogs.yaml")) + require.NoError(t, err) + + // Consume the payload + err = p.ConsumeLogs(context.Background(), logs) + require.NoError(t, err) + + // Wait for the logs to be emitted + require.Eventually(t, func() bool { + return logsSink.LogRecordCount() > 4 + }, 3*time.Second, 200*time.Millisecond) + + allSinkLogs := logsSink.AllLogs() + require.Len(t, allSinkLogs, 2) + + expectedConsumedLogs, err := golden.ReadLogs(filepath.Join("testdata", "expected", "conditionConsumedLogs.yaml")) + require.NoError(t, err) + expectedDedupedLogs, err := golden.ReadLogs(filepath.Join("testdata", "expected", "conditionDedupedLogs.yaml")) + require.NoError(t, err) + + consumedLogs := allSinkLogs[0] + dedupedLogs := allSinkLogs[1] + + require.NoError(t, plogtest.CompareLogs(expectedConsumedLogs, consumedLogs, plogtest.IgnoreObservedTimestamp(), plogtest.IgnoreTimestamp(), plogtest.IgnoreLogRecordAttributeValue("first_observed_timestamp"), plogtest.IgnoreLogRecordAttributeValue("last_observed_timestamp"), plogtest.IgnoreLogRecordsOrder())) + require.NoError(t, plogtest.CompareLogs(expectedDedupedLogs, dedupedLogs, plogtest.IgnoreObservedTimestamp(), plogtest.IgnoreTimestamp(), plogtest.IgnoreLogRecordAttributeValue("first_observed_timestamp"), plogtest.IgnoreLogRecordAttributeValue("last_observed_timestamp"), plogtest.IgnoreLogRecordsOrder())) + + // Cleanup + err = p.Shutdown(context.Background()) + require.NoError(t, err) +} + +func TestProcessorConsumeMultipleConditions(t *testing.T) { + logsSink := &consumertest.LogsSink{} + cfg := &Config{ + LogCountAttribute: defaultLogCountAttribute, + Interval: 1 * time.Second, + Timezone: defaultTimezone, + Conditions: []string{`attributes["ID"] == 1`, `attributes["ID"] == 3`}, + ExcludeFields: []string{ + fmt.Sprintf("%s.remove_me", attributeField), + }, + } + + // Create a processor + p, err := createLogsProcessor(context.Background(), processortest.NewNopSettings(), cfg, logsSink) + require.NoError(t, err) + + err = p.Start(context.Background(), componenttest.NewNopHost()) + require.NoError(t, err) + + logs, err := golden.ReadLogs(filepath.Join("testdata", "input", "conditionLogs.yaml")) + require.NoError(t, err) + + // Consume the payload + err = p.ConsumeLogs(context.Background(), logs) + require.NoError(t, err) + + // Wait for the logs to be emitted + require.Eventually(t, func() bool { + return logsSink.LogRecordCount() > 3 + }, 3*time.Second, 200*time.Millisecond) + + allSinkLogs := logsSink.AllLogs() + require.Len(t, allSinkLogs, 2) + + consumedLogs := allSinkLogs[0] + dedupedLogs := allSinkLogs[1] + + expectedConsumedLogs, err := golden.ReadLogs(filepath.Join("testdata", "expected", "multipleConditionsConsumedLogs.yaml")) + require.NoError(t, err) + expectedDedupedLogs, err := golden.ReadLogs(filepath.Join("testdata", "expected", "multipleConditionsDedupedLogs.yaml")) + require.NoError(t, err) + + require.NoError(t, plogtest.CompareLogs(expectedConsumedLogs, consumedLogs, plogtest.IgnoreObservedTimestamp(), plogtest.IgnoreTimestamp(), plogtest.IgnoreLogRecordAttributeValue("first_observed_timestamp"), plogtest.IgnoreLogRecordAttributeValue("last_observed_timestamp"), plogtest.IgnoreLogRecordsOrder())) + require.NoError(t, plogtest.CompareLogs(expectedDedupedLogs, dedupedLogs, plogtest.IgnoreObservedTimestamp(), plogtest.IgnoreTimestamp(), plogtest.IgnoreLogRecordAttributeValue("first_observed_timestamp"), plogtest.IgnoreLogRecordAttributeValue("last_observed_timestamp"), plogtest.IgnoreLogRecordsOrder())) + + // Cleanup + err = p.Shutdown(context.Background()) + require.NoError(t, err) +} diff --git a/processor/logdedupprocessor/testdata/conditionConsumedLogs.yaml b/processor/logdedupprocessor/testdata/conditionConsumedLogs.yaml new file mode 100644 index 000000000000..93d3910a70f7 --- /dev/null +++ b/processor/logdedupprocessor/testdata/conditionConsumedLogs.yaml @@ -0,0 +1,69 @@ +resourceLogs: + - resource: {} + scopeLogs: + - logRecords: + - attributes: + - key: bool + value: + boolValue: true + - key: str + value: + stringValue: attr str + - key: ID + value: + intValue: "2" + body: + stringValue: Body of the log2 + severityText: info + spanId: "" + timeUnixNano: "1728069505995028000" + traceId: "" + - attributes: + - key: bool + value: + boolValue: true + - key: str + value: + stringValue: attr str + - key: ID + value: + intValue: "2" + body: + stringValue: Body of the log2 + severityText: info + spanId: "" + timeUnixNano: "1728069565995028000" + traceId: "" + - attributes: + - key: bool + value: + boolValue: true + - key: str + value: + stringValue: attr str + - key: ID + value: + intValue: "3" + body: + stringValue: Body of the log3 + severityText: info + spanId: "" + timeUnixNano: "1728069625995028000" + traceId: "" + - attributes: + - key: bool + value: + boolValue: true + - key: str + value: + stringValue: attr str + - key: ID + value: + intValue: "3" + body: + stringValue: Body of the log3 + severityText: info + spanId: "" + timeUnixNano: "1728069685995028000" + traceId: "" + scope: {} diff --git a/processor/logdedupprocessor/testdata/expected/basicLogs.yaml b/processor/logdedupprocessor/testdata/expected/basicLogs.yaml new file mode 100644 index 000000000000..337aebd8429a --- /dev/null +++ b/processor/logdedupprocessor/testdata/expected/basicLogs.yaml @@ -0,0 +1,32 @@ +resourceLogs: + - resource: + attributes: + - key: one + value: + intValue: "1" + scopeLogs: + - logRecords: + - attributes: + - key: bool + value: + boolValue: true + - key: str + value: + stringValue: attr str + - key: log_count + value: + intValue: "2" + - key: first_observed_timestamp + value: + stringValue: "2024-10-04T19:21:47Z" + - key: last_observed_timestamp + value: + stringValue: "2024-10-04T19:21:47Z" + body: + stringValue: Body of the log + observedTimeUnixNano: "1728069707998122000" + severityText: info + spanId: "" + timeUnixNano: "1728069708998920000" + traceId: "" + scope: {} diff --git a/processor/logdedupprocessor/testdata/expected/conditionConsumedLogs.yaml b/processor/logdedupprocessor/testdata/expected/conditionConsumedLogs.yaml new file mode 100644 index 000000000000..93d3910a70f7 --- /dev/null +++ b/processor/logdedupprocessor/testdata/expected/conditionConsumedLogs.yaml @@ -0,0 +1,69 @@ +resourceLogs: + - resource: {} + scopeLogs: + - logRecords: + - attributes: + - key: bool + value: + boolValue: true + - key: str + value: + stringValue: attr str + - key: ID + value: + intValue: "2" + body: + stringValue: Body of the log2 + severityText: info + spanId: "" + timeUnixNano: "1728069505995028000" + traceId: "" + - attributes: + - key: bool + value: + boolValue: true + - key: str + value: + stringValue: attr str + - key: ID + value: + intValue: "2" + body: + stringValue: Body of the log2 + severityText: info + spanId: "" + timeUnixNano: "1728069565995028000" + traceId: "" + - attributes: + - key: bool + value: + boolValue: true + - key: str + value: + stringValue: attr str + - key: ID + value: + intValue: "3" + body: + stringValue: Body of the log3 + severityText: info + spanId: "" + timeUnixNano: "1728069625995028000" + traceId: "" + - attributes: + - key: bool + value: + boolValue: true + - key: str + value: + stringValue: attr str + - key: ID + value: + intValue: "3" + body: + stringValue: Body of the log3 + severityText: info + spanId: "" + timeUnixNano: "1728069685995028000" + traceId: "" + scope: {} diff --git a/processor/logdedupprocessor/testdata/expected/conditionDedupedLogs.yaml b/processor/logdedupprocessor/testdata/expected/conditionDedupedLogs.yaml new file mode 100644 index 000000000000..ada5796a37aa --- /dev/null +++ b/processor/logdedupprocessor/testdata/expected/conditionDedupedLogs.yaml @@ -0,0 +1,31 @@ +resourceLogs: + - resource: {} + scopeLogs: + - logRecords: + - attributes: + - key: bool + value: + boolValue: true + - key: str + value: + stringValue: attr str + - key: ID + value: + intValue: "1" + - key: log_count + value: + intValue: "2" + - key: first_observed_timestamp + value: + stringValue: "2024-10-04T19:40:31Z" + - key: last_observed_timestamp + value: + stringValue: "2024-10-04T19:40:31Z" + body: + stringValue: Body of the log1 + observedTimeUnixNano: "1728070831326144000" + severityText: info + spanId: "" + timeUnixNano: "1728070832326078000" + traceId: "" + scope: {} diff --git a/processor/logdedupprocessor/testdata/expected/multipleConditionsConsumedLogs.yaml b/processor/logdedupprocessor/testdata/expected/multipleConditionsConsumedLogs.yaml new file mode 100644 index 000000000000..2001fc0908e2 --- /dev/null +++ b/processor/logdedupprocessor/testdata/expected/multipleConditionsConsumedLogs.yaml @@ -0,0 +1,37 @@ +resourceLogs: + - resource: {} + scopeLogs: + - logRecords: + - attributes: + - key: bool + value: + boolValue: true + - key: str + value: + stringValue: attr str + - key: ID + value: + intValue: "2" + body: + stringValue: Body of the log2 + severityText: info + spanId: "" + timeUnixNano: "1728069505995028000" + traceId: "" + - attributes: + - key: bool + value: + boolValue: true + - key: str + value: + stringValue: attr str + - key: ID + value: + intValue: "2" + body: + stringValue: Body of the log2 + severityText: info + spanId: "" + timeUnixNano: "1728069565995028000" + traceId: "" + scope: {} diff --git a/processor/logdedupprocessor/testdata/expected/multipleConditionsDedupedLogs.yaml b/processor/logdedupprocessor/testdata/expected/multipleConditionsDedupedLogs.yaml new file mode 100644 index 000000000000..04c55be19df3 --- /dev/null +++ b/processor/logdedupprocessor/testdata/expected/multipleConditionsDedupedLogs.yaml @@ -0,0 +1,57 @@ +resourceLogs: + - resource: {} + scopeLogs: + - logRecords: + - attributes: + - key: bool + value: + boolValue: true + - key: str + value: + stringValue: attr str + - key: ID + value: + intValue: "1" + - key: log_count + value: + intValue: "2" + - key: first_observed_timestamp + value: + stringValue: "2024-10-04T19:46:39Z" + - key: last_observed_timestamp + value: + stringValue: "2024-10-04T19:46:39Z" + body: + stringValue: Body of the log1 + observedTimeUnixNano: "1728071199778796000" + severityText: info + spanId: "" + timeUnixNano: "1728071200779450000" + traceId: "" + - attributes: + - key: bool + value: + boolValue: true + - key: str + value: + stringValue: attr str + - key: ID + value: + intValue: "3" + - key: log_count + value: + intValue: "2" + - key: first_observed_timestamp + value: + stringValue: "2024-10-04T19:46:39Z" + - key: last_observed_timestamp + value: + stringValue: "2024-10-04T19:46:39Z" + body: + stringValue: Body of the log3 + observedTimeUnixNano: "1728071199778800000" + severityText: info + spanId: "" + timeUnixNano: "1728071200779466000" + traceId: "" + scope: {} diff --git a/processor/logdedupprocessor/testdata/input/basicLogs.yaml b/processor/logdedupprocessor/testdata/input/basicLogs.yaml new file mode 100644 index 000000000000..601a729be289 --- /dev/null +++ b/processor/logdedupprocessor/testdata/input/basicLogs.yaml @@ -0,0 +1,38 @@ +resourceLogs: + - resource: + attributes: + - key: one + value: + intValue: "1" + scopeLogs: + - logRecords: + - attributes: + - key: bool + value: + boolValue: true + - key: str + value: + stringValue: attr str + body: + stringValue: Body of the log + severityText: info + spanId: "" + timeUnixNano: "1728069266547395000" + traceId: "" + - attributes: + - key: bool + value: + boolValue: true + - key: str + value: + stringValue: attr str + - key: remove_me + value: + boolValue: false + body: + stringValue: Body of the log + severityText: info + spanId: "" + timeUnixNano: "1728069206547395000" + traceId: "" + scope: {} diff --git a/processor/logdedupprocessor/testdata/input/conditionLogs.yaml b/processor/logdedupprocessor/testdata/input/conditionLogs.yaml new file mode 100644 index 000000000000..b353aa339351 --- /dev/null +++ b/processor/logdedupprocessor/testdata/input/conditionLogs.yaml @@ -0,0 +1,101 @@ +resourceLogs: + - resource: {} + scopeLogs: + - logRecords: + - attributes: + - key: bool + value: + boolValue: true + - key: str + value: + stringValue: attr str + - key: ID + value: + intValue: "1" + body: + stringValue: Body of the log1 + severityText: info + spanId: "" + timeUnixNano: "1728069385995028000" + traceId: "" + - attributes: + - key: bool + value: + boolValue: true + - key: str + value: + stringValue: attr str + - key: ID + value: + intValue: "2" + body: + stringValue: Body of the log2 + severityText: info + spanId: "" + timeUnixNano: "1728069505995028000" + traceId: "" + - attributes: + - key: bool + value: + boolValue: true + - key: str + value: + stringValue: attr str + - key: ID + value: + intValue: "1" + body: + stringValue: Body of the log1 + severityText: info + spanId: "" + timeUnixNano: "1728069445995028000" + traceId: "" + - attributes: + - key: bool + value: + boolValue: true + - key: str + value: + stringValue: attr str + - key: ID + value: + intValue: "2" + body: + stringValue: Body of the log2 + severityText: info + spanId: "" + timeUnixNano: "1728069565995028000" + traceId: "" + - attributes: + - key: bool + value: + boolValue: true + - key: str + value: + stringValue: attr str + - key: ID + value: + intValue: "3" + body: + stringValue: Body of the log3 + severityText: info + spanId: "" + timeUnixNano: "1728069625995028000" + traceId: "" + - attributes: + - key: bool + value: + boolValue: true + - key: str + value: + stringValue: attr str + - key: ID + value: + intValue: "3" + body: + stringValue: Body of the log3 + severityText: info + spanId: "" + timeUnixNano: "1728069685995028000" + traceId: "" + scope: {} diff --git a/processor/logdedupprocessor/timezone.md b/processor/logdedupprocessor/timezone.md new file mode 100644 index 000000000000..370b6662012c --- /dev/null +++ b/processor/logdedupprocessor/timezone.md @@ -0,0 +1,430 @@ +# Timezone + +Below is a list of acceptable values for `timezone` parameters: + +- "UTC" +- "Africa/Abidjan" +- "Africa/Accra" +- "Africa/Addis_Ababa" +- "Africa/Algiers" +- "Africa/Asmara" +- "Africa/Bamako" +- "Africa/Bangui" +- "Africa/Banjul" +- "Africa/Bissau" +- "Africa/Blantyre" +- "Africa/Brazzaville" +- "Africa/Bujumbura" +- "Africa/Cairo" +- "Africa/Casablanca" +- "Africa/Ceuta" +- "Africa/Conakry" +- "Africa/Dakar" +- "Africa/Dar_es_Salaam" +- "Africa/Djibouti" +- "Africa/Douala" +- "Africa/El_Aaiun" +- "Africa/Freetown" +- "Africa/Gaborone" +- "Africa/Harare" +- "Africa/Johannesburg" +- "Africa/Juba" +- "Africa/Kampala" +- "Africa/Khartoum" +- "Africa/Kigali" +- "Africa/Kinshasa" +- "Africa/Lagos" +- "Africa/Libreville" +- "Africa/Lome" +- "Africa/Luanda" +- "Africa/Lubumbashi" +- "Africa/Lusaka" +- "Africa/Malabo" +- "Africa/Maputo" +- "Africa/Maseru" +- "Africa/Mbabane" +- "Africa/Mogadishu" +- "Africa/Monrovia" +- "Africa/Nairobi" +- "Africa/Ndjamena" +- "Africa/Niamey" +- "Africa/Nouakchott" +- "Africa/Ouagadougou" +- "Africa/Porto-Novo" +- "Africa/Sao_Tome" +- "Africa/Tripoli" +- "Africa/Tunis" +- "Africa/Windhoek" +- "America/Adak" +- "America/Anchorage" +- "America/Anguilla" +- "America/Antigua" +- "America/Araguaina" +- "America/Argentina/Buenos_Aires" +- "America/Argentina/Catamarca" +- "America/Argentina/Cordoba" +- "America/Argentina/Jujuy" +- "America/Argentina/La_Rioja" +- "America/Argentina/Mendoza" +- "America/Argentina/Rio_Gallegos" +- "America/Argentina/Salta" +- "America/Argentina/San_Juan" +- "America/Argentina/San_Luis" +- "America/Argentina/Tucuman" +- "America/Argentina/Ushuaia" +- "America/Aruba" +- "America/Asuncion" +- "America/Atikokan" +- "America/Bahia" +- "America/Bahia_Banderas" +- "America/Barbados" +- "America/Belem" +- "America/Belize" +- "America/Blanc-Sablon" +- "America/Boa_Vista" +- "America/Bogota" +- "America/Boise" +- "America/Cambridge_Bay" +- "America/Campo_Grande" +- "America/Cancun" +- "America/Caracas" +- "America/Cayenne" +- "America/Cayman" +- "America/Chicago" +- "America/Chihuahua" +- "America/Costa_Rica" +- "America/Creston" +- "America/Cuiaba" +- "America/Curacao" +- "America/Danmarkshavn" +- "America/Dawson" +- "America/Dawson_Creek" +- "America/Denver" +- "America/Detroit" +- "America/Dominica" +- "America/Edmonton" +- "America/Eirunepe" +- "America/El_Salvador" +- "America/Fort_Nelson" +- "America/Fortaleza" +- "America/Glace_Bay" +- "America/Goose_Bay" +- "America/Grand_Turk" +- "America/Grenada" +- "America/Guadeloupe" +- "America/Guatemala" +- "America/Guayaquil" +- "America/Guyana" +- "America/Halifax" +- "America/Havana" +- "America/Hermosillo" +- "America/Indiana/Indianapolis" +- "America/Indiana/Knox" +- "America/Indiana/Marengo" +- "America/Indiana/Petersburg" +- "America/Indiana/Tell_City" +- "America/Indiana/Vevay" +- "America/Indiana/Vincennes" +- "America/Indiana/Winamac" +- "America/Inuvik" +- "America/Iqaluit" +- "America/Jamaica" +- "America/Juneau" +- "America/Kentucky/Louisville" +- "America/Kentucky/Monticello" +- "America/Kralendijk" +- "America/La_Paz" +- "America/Lima" +- "America/Los_Angeles" +- "America/Lower_Princes" +- "America/Maceio" +- "America/Managua" +- "America/Manaus" +- "America/Marigot" +- "America/Martinique" +- "America/Matamoros" +- "America/Mazatlan" +- "America/Menominee" +- "America/Merida" +- "America/Metlakatla" +- "America/Mexico_City" +- "America/Miquelon" +- "America/Moncton" +- "America/Monterrey" +- "America/Montevideo" +- "America/Montserrat" +- "America/Nassau" +- "America/New_York" +- "America/Nipigon" +- "America/Nome" +- "America/Noronha" +- "America/North_Dakota/Beulah" +- "America/North_Dakota/Center" +- "America/North_Dakota/New_Salem" +- "America/Nuuk" +- "America/Ojinaga" +- "America/Panama" +- "America/Pangnirtung" +- "America/Paramaribo" +- "America/Phoenix" +- "America/Port-au-Prince" +- "America/Port_of_Spain" +- "America/Porto_Velho" +- "America/Puerto_Rico" +- "America/Punta_Arenas" +- "America/Rainy_River" +- "America/Rankin_Inlet" +- "America/Recife" +- "America/Regina" +- "America/Resolute" +- "America/Rio_Branco" +- "America/Santarem" +- "America/Santiago" +- "America/Santo_Domingo" +- "America/Sao_Paulo" +- "America/Scoresbysund" +- "America/Sitka" +- "America/St_Barthelemy" +- "America/St_Johns" +- "America/St_Kitts" +- "America/St_Lucia" +- "America/St_Thomas" +- "America/St_Vincent" +- "America/Swift_Current" +- "America/Tegucigalpa" +- "America/Thule" +- "America/Thunder_Bay" +- "America/Tijuana" +- "America/Toronto" +- "America/Tortola" +- "America/Vancouver" +- "America/Whitehorse" +- "America/Winnipeg" +- "America/Yakutat" +- "America/Yellowknife" +- "Antarctica/Casey" +- "Antarctica/Davis" +- "Antarctica/DumontDUrville" +- "Antarctica/Macquarie" +- "Antarctica/Mawson" +- "Antarctica/McMurdo" +- "Antarctica/Palmer" +- "Antarctica/Rothera" +- "Antarctica/Syowa" +- "Antarctica/Troll" +- "Antarctica/Vostok" +- "Arctic/Longyearbyen" +- "Asia/Aden" +- "Asia/Almaty" +- "Asia/Amman" +- "Asia/Anadyr" +- "Asia/Aqtau" +- "Asia/Aqtobe" +- "Asia/Ashgabat" +- "Asia/Atyrau" +- "Asia/Baghdad" +- "Asia/Bahrain" +- "Asia/Baku" +- "Asia/Bangkok" +- "Asia/Barnaul" +- "Asia/Beirut" +- "Asia/Bishkek" +- "Asia/Brunei" +- "Asia/Chita" +- "Asia/Choibalsan" +- "Asia/Colombo" +- "Asia/Damascus" +- "Asia/Dhaka" +- "Asia/Dili" +- "Asia/Dubai" +- "Asia/Dushanbe" +- "Asia/Famagusta" +- "Asia/Gaza" +- "Asia/Hebron" +- "Asia/Ho_Chi_Minh" +- "Asia/Hong_Kong" +- "Asia/Hovd" +- "Asia/Irkutsk" +- "Asia/Jakarta" +- "Asia/Jayapura" +- "Asia/Jerusalem" +- "Asia/Kabul" +- "Asia/Kamchatka" +- "Asia/Karachi" +- "Asia/Kathmandu" +- "Asia/Khandyga" +- "Asia/Kolkata" +- "Asia/Krasnoyarsk" +- "Asia/Kuala_Lumpur" +- "Asia/Kuching" +- "Asia/Kuwait" +- "Asia/Macau" +- "Asia/Magadan" +- "Asia/Makassar" +- "Asia/Manila" +- "Asia/Muscat" +- "Asia/Nicosia" +- "Asia/Novokuznetsk" +- "Asia/Novosibirsk" +- "Asia/Omsk" +- "Asia/Oral" +- "Asia/Phnom_Penh" +- "Asia/Pontianak" +- "Asia/Pyongyang" +- "Asia/Qatar" +- "Asia/Qostanay" +- "Asia/Qyzylorda" +- "Asia/Riyadh" +- "Asia/Sakhalin" +- "Asia/Samarkand" +- "Asia/Seoul" +- "Asia/Shanghai" +- "Asia/Singapore" +- "Asia/Srednekolymsk" +- "Asia/Taipei" +- "Asia/Tashkent" +- "Asia/Tbilisi" +- "Asia/Tehran" +- "Asia/Thimphu" +- "Asia/Tokyo" +- "Asia/Tomsk" +- "Asia/Ulaanbaatar" +- "Asia/Urumqi" +- "Asia/Ust-Nera" +- "Asia/Vientiane" +- "Asia/Vladivostok" +- "Asia/Yakutsk" +- "Asia/Yangon" +- "Asia/Yekaterinburg" +- "Asia/Yerevan" +- "Atlantic/Azores" +- "Atlantic/Bermuda" +- "Atlantic/Canary" +- "Atlantic/Cape_Verde" +- "Atlantic/Faroe" +- "Atlantic/Madeira" +- "Atlantic/Reykjavik" +- "Atlantic/South_Georgia" +- "Atlantic/St_Helena" +- "Atlantic/Stanley" +- "Australia/Adelaide" +- "Australia/Brisbane" +- "Australia/Broken_Hill" +- "Australia/Currie" +- "Australia/Darwin" +- "Australia/Eucla" +- "Australia/Hobart" +- "Australia/Lindeman" +- "Australia/Lord_Howe" +- "Australia/Melbourne" +- "Australia/Perth" +- "Australia/Sydney" +- "Europe/Amsterdam" +- "Europe/Andorra" +- "Europe/Astrakhan" +- "Europe/Athens" +- "Europe/Belgrade" +- "Europe/Berlin" +- "Europe/Bratislava" +- "Europe/Brussels" +- "Europe/Bucharest" +- "Europe/Budapest" +- "Europe/Busingen" +- "Europe/Chisinau" +- "Europe/Copenhagen" +- "Europe/Dublin" +- "Europe/Gibraltar" +- "Europe/Guernsey" +- "Europe/Helsinki" +- "Europe/Isle_of_Man" +- "Europe/Istanbul" +- "Europe/Jersey" +- "Europe/Kaliningrad" +- "Europe/Kiev" +- "Europe/Kirov" +- "Europe/Lisbon" +- "Europe/Ljubljana" +- "Europe/London" +- "Europe/Luxembourg" +- "Europe/Madrid" +- "Europe/Malta" +- "Europe/Mariehamn" +- "Europe/Minsk" +- "Europe/Monaco" +- "Europe/Moscow" +- "Europe/Oslo" +- "Europe/Paris" +- "Europe/Podgorica" +- "Europe/Prague" +- "Europe/Riga" +- "Europe/Rome" +- "Europe/Samara" +- "Europe/San_Marino" +- "Europe/Sarajevo" +- "Europe/Saratov" +- "Europe/Simferopol" +- "Europe/Skopje" +- "Europe/Sofia" +- "Europe/Stockholm" +- "Europe/Tallinn" +- "Europe/Tirane" +- "Europe/Ulyanovsk" +- "Europe/Uzhgorod" +- "Europe/Vaduz" +- "Europe/Vatican" +- "Europe/Vienna" +- "Europe/Vilnius" +- "Europe/Volgograd" +- "Europe/Warsaw" +- "Europe/Zagreb" +- "Europe/Zaporozhye" +- "Europe/Zurich" +- "Indian/Antananarivo" +- "Indian/Chagos" +- "Indian/Christmas" +- "Indian/Cocos" +- "Indian/Comoro" +- "Indian/Kerguelen" +- "Indian/Mahe" +- "Indian/Maldives" +- "Indian/Mauritius" +- "Indian/Mayotte" +- "Indian/Reunion" +- "Pacific/Apia" +- "Pacific/Auckland" +- "Pacific/Bougainville" +- "Pacific/Chatham" +- "Pacific/Chuuk" +- "Pacific/Easter" +- "Pacific/Efate" +- "Pacific/Enderbury" +- "Pacific/Fakaofo" +- "Pacific/Fiji" +- "Pacific/Funafuti" +- "Pacific/Galapagos" +- "Pacific/Gambier" +- "Pacific/Guadalcanal" +- "Pacific/Guam" +- "Pacific/Honolulu" +- "Pacific/Kiritimati" +- "Pacific/Kosrae" +- "Pacific/Kwajalein" +- "Pacific/Majuro" +- "Pacific/Marquesas" +- "Pacific/Midway" +- "Pacific/Nauru" +- "Pacific/Niue" +- "Pacific/Norfolk" +- "Pacific/Noumea" +- "Pacific/Pago_Pago" +- "Pacific/Palau" +- "Pacific/Pitcairn" +- "Pacific/Pohnpei" +- "Pacific/Port_Moresby" +- "Pacific/Rarotonga" +- "Pacific/Saipan" +- "Pacific/Tahiti" +- "Pacific/Tarawa" +- "Pacific/Tongatapu" +- "Pacific/Wake" +- "Pacific/Wallis" \ No newline at end of file diff --git a/processor/logstransformprocessor/README.md b/processor/logstransformprocessor/README.md index 96198751b7f4..056783848276 100644 --- a/processor/logstransformprocessor/README.md +++ b/processor/logstransformprocessor/README.md @@ -6,9 +6,9 @@ | Stability | [development]: logs | | Distributions | [] | | Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aprocessor%2Flogstransform%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aprocessor%2Flogstransform) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aprocessor%2Flogstransform%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aprocessor%2Flogstransform) | -| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@djaglowski](https://www.github.com/djaglowski), [@dehaansa](https://www.github.com/dehaansa) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@dehaansa](https://www.github.com/dehaansa) | -[development]: https://github.com/open-telemetry/opentelemetry-collector#development +[development]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#development NOTE - This processor is experimental, with the intention that its functionality will be reimplemented in the [transform processor](../transformprocessor/README.md) in the future. diff --git a/processor/logstransformprocessor/config_test.go b/processor/logstransformprocessor/config_test.go index c81d782bc550..866f8f2c7048 100644 --- a/processor/logstransformprocessor/config_test.go +++ b/processor/logstransformprocessor/config_test.go @@ -9,7 +9,6 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/confmap/confmaptest" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/adapter" @@ -24,7 +23,7 @@ func TestLoadConfig(t *testing.T) { require.NoError(t, err) factory := NewFactory() cfg := factory.CreateDefaultConfig() - assert.NoError(t, component.UnmarshalConfig(cm, cfg)) + assert.NoError(t, cm.Unmarshal(cfg)) assert.Equal(t, &Config{ BaseConfig: adapter.BaseConfig{ Operators: []operator.Config{ diff --git a/processor/logstransformprocessor/factory.go b/processor/logstransformprocessor/factory.go index f86b3cefc7df..a297a70ed9c6 100644 --- a/processor/logstransformprocessor/factory.go +++ b/processor/logstransformprocessor/factory.go @@ -35,9 +35,10 @@ func createDefaultConfig() component.Config { func createLogsProcessor( _ context.Context, - set processor.CreateSettings, + set processor.Settings, cfg component.Config, - nextConsumer consumer.Logs) (processor.Logs, error) { + nextConsumer consumer.Logs, +) (processor.Logs, error) { pCfg, ok := cfg.(*Config) if !ok { return nil, errors.New("could not initialize logs transform processor") diff --git a/processor/logstransformprocessor/factory_test.go b/processor/logstransformprocessor/factory_test.go index 646a260e4eb8..669b4042ac76 100644 --- a/processor/logstransformprocessor/factory_test.go +++ b/processor/logstransformprocessor/factory_test.go @@ -51,7 +51,7 @@ func TestCreateProcessor(t *testing.T) { }, } - tp, err := factory.CreateLogsProcessor(context.Background(), processortest.NewNopCreateSettings(), cfg, consumertest.NewNop()) + tp, err := factory.CreateLogs(context.Background(), processortest.NewNopSettings(), cfg, consumertest.NewNop()) assert.NoError(t, err) assert.NotNil(t, tp) } @@ -69,6 +69,6 @@ func TestInvalidOperators(t *testing.T) { }, } - _, err := factory.CreateLogsProcessor(context.Background(), processortest.NewNopCreateSettings(), cfg, nil) + _, err := factory.CreateLogs(context.Background(), processortest.NewNopSettings(), cfg, nil) assert.Error(t, err) } diff --git a/processor/logstransformprocessor/generated_component_test.go b/processor/logstransformprocessor/generated_component_test.go index c9f8eef3dc47..6a4fb2208908 100644 --- a/processor/logstransformprocessor/generated_component_test.go +++ b/processor/logstransformprocessor/generated_component_test.go @@ -33,13 +33,13 @@ func TestComponentLifecycle(t *testing.T) { tests := []struct { name string - createFn func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) + createFn func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) }{ { name: "logs", - createFn: func(ctx context.Context, set processor.CreateSettings, cfg component.Config) (component.Component, error) { - return factory.CreateLogsProcessor(ctx, set, cfg, consumertest.NewNop()) + createFn: func(ctx context.Context, set processor.Settings, cfg component.Config) (component.Component, error) { + return factory.CreateLogs(ctx, set, cfg, consumertest.NewNop()) }, }, } @@ -51,21 +51,21 @@ func TestComponentLifecycle(t *testing.T) { require.NoError(t, err) require.NoError(t, sub.Unmarshal(&cfg)) - for _, test := range tests { - t.Run(test.name+"-shutdown", func(t *testing.T) { - c, err := test.createFn(context.Background(), processortest.NewNopCreateSettings(), cfg) + for _, tt := range tests { + t.Run(tt.name+"-shutdown", func(t *testing.T) { + c, err := tt.createFn(context.Background(), processortest.NewNopSettings(), cfg) require.NoError(t, err) err = c.Shutdown(context.Background()) require.NoError(t, err) }) - t.Run(test.name+"-lifecycle", func(t *testing.T) { - c, err := test.createFn(context.Background(), processortest.NewNopCreateSettings(), cfg) + t.Run(tt.name+"-lifecycle", func(t *testing.T) { + c, err := tt.createFn(context.Background(), processortest.NewNopSettings(), cfg) require.NoError(t, err) host := componenttest.NewNopHost() err = c.Start(context.Background(), host) require.NoError(t, err) require.NotPanics(t, func() { - switch test.name { + switch tt.name { case "logs": e, ok := c.(processor.Logs) require.True(t, ok) diff --git a/processor/logstransformprocessor/go.mod b/processor/logstransformprocessor/go.mod index cf03524652bb..3fb9faa622ba 100644 --- a/processor/logstransformprocessor/go.mod +++ b/processor/logstransformprocessor/go.mod @@ -1,70 +1,80 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/processor/logstransformprocessor -go 1.21.0 +go 1.22.0 require ( - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.102.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.102.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/collector/component v0.102.0 - go.opentelemetry.io/collector/confmap v0.102.0 - go.opentelemetry.io/collector/consumer v0.102.0 - go.opentelemetry.io/collector/extension v0.102.0 - go.opentelemetry.io/collector/pdata v1.9.0 - go.opentelemetry.io/collector/processor v0.102.0 - go.opentelemetry.io/otel/metric v1.27.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.116.0 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/collector/component v0.116.0 + go.opentelemetry.io/collector/confmap v1.22.0 + go.opentelemetry.io/collector/consumer v1.22.0 + go.opentelemetry.io/collector/extension v0.116.0 // indirect + go.opentelemetry.io/collector/pdata v1.22.0 + go.opentelemetry.io/collector/processor v0.116.0 + go.opentelemetry.io/collector/semconv v0.116.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect + go.opentelemetry.io/collector/component/componenttest v0.116.0 + go.opentelemetry.io/collector/consumer/consumertest v0.116.0 + go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 + go.opentelemetry.io/collector/processor/processortest v0.116.0 +) + +require ( github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/elastic/lunes v0.1.0 // indirect github.com/expr-lang/expr v1.16.9 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/goccy/go-json v0.10.4 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect - github.com/knadh/koanf/v2 v2.1.1 // indirect - github.com/leodido/go-syslog/v4 v4.1.0 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect + github.com/leodido/go-syslog/v4 v4.2.0 // indirect github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b // indirect + github.com/magefile/mage v1.15.0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect github.com/valyala/fastjson v1.6.4 // indirect - go.opentelemetry.io/collector v0.102.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.102.0 // indirect - go.opentelemetry.io/collector/featuregate v1.9.0 // indirect - go.opentelemetry.io/collector/pdata/testdata v0.102.0 // indirect - go.opentelemetry.io/collector/receiver v0.102.0 // indirect - go.opentelemetry.io/otel v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/collector/component/componentstatus v0.116.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect + go.opentelemetry.io/collector/featuregate v1.22.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect + go.opentelemetry.io/collector/pdata/testdata v0.116.0 // indirect + go.opentelemetry.io/collector/pipeline v0.116.0 // indirect + go.opentelemetry.io/collector/processor/xprocessor v0.116.0 // indirect + go.opentelemetry.io/collector/receiver v0.116.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - gonum.org/v1/gonum v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + gonum.org/v1/gonum v0.15.1 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.1 // indirect + google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/processor/logstransformprocessor/go.sum b/processor/logstransformprocessor/go.sum index 774235315b2f..48eb0846cdf8 100644 --- a/processor/logstransformprocessor/go.sum +++ b/processor/logstransformprocessor/go.sum @@ -1,5 +1,3 @@ -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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= @@ -7,17 +5,23 @@ github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/elastic/lunes v0.1.0 h1:amRtLPjwkWtzDF/RKzcEPMvSsSseLDLW+bnhfNSLRe4= +github.com/elastic/lunes v0.1.0/go.mod h1:xGphYIt3XdZRtyWosHQTErsQTd4OP1p9wsbVoHelrd4= github.com/expr-lang/expr v1.16.9 h1:WUAzmR0JNI9JCiF0/ewwHB1gmcGw5wW7nWt8gc6PpCI= github.com/expr-lang/expr v1.16.9/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= +github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -34,16 +38,18 @@ github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NI github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/leodido/go-syslog/v4 v4.1.0 h1:Wsl194qyWXr7V6DrGWC3xmxA9Ra6XgWO+toNt2fmCaI= -github.com/leodido/go-syslog/v4 v4.1.0/go.mod h1:eJ8rUfDN5OS6dOkCOBYlg2a+hbAg6pJa99QXXgMrd98= +github.com/leodido/go-syslog/v4 v4.2.0 h1:A7vpbYxsO4e2E8udaurkLlxP5LDpDbmPMsGnuhb7jVk= +github.com/leodido/go-syslog/v4 v4.2.0/go.mod h1:eJ8rUfDN5OS6dOkCOBYlg2a+hbAg6pJa99QXXgMrd98= github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b h1:11UHH39z1RhZ5dc4y4r/4koJo6IYFgTRMe/LlwRTEw0= github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b/go.mod h1:WZxr2/6a/Ar9bMDc2rN/LJrE/hF6bXE4LPyDSIxwAfg= +github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= +github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= @@ -55,60 +61,74 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ= github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector v0.102.0 h1:xRY7aUMKRR+Ls7HqZrs4haGApdrs9+KiGlx76lq4Nq8= -go.opentelemetry.io/collector v0.102.0/go.mod h1:+Ay+kMhmcnJ+bVtVPEOwU4td0SnvCGwUK1w9Jh76Zj8= -go.opentelemetry.io/collector/component v0.102.0 h1:9AH7RIgX0Xc/tb34BxEDQwThY7GihwZWF0SbtYx9HtA= -go.opentelemetry.io/collector/component v0.102.0/go.mod h1:RArpKhkv2o0k9Ea0Weg0Ryt1sWqrLX2sn7NISt+P7h0= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0 h1:gusHa1X0NpzwDSc2Th1gRYEGAWcD1EdXPV4hwJWxYaA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.0/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= -go.opentelemetry.io/collector/confmap v0.102.0 h1:2mDkvQH3uCFb3PVsv8RRJX2PMbw3x4jV25wNticJEOU= -go.opentelemetry.io/collector/confmap v0.102.0/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/consumer v0.102.0 h1:GX3ggzbMYXovz3iGLHkJ+LP36XUBQBDD/6rS6ukWkyM= -go.opentelemetry.io/collector/consumer v0.102.0/go.mod h1:jlN5KsJ7AFi4fJbK6J/dx/wfYwYwZCtXq7X3+T7Hd7Y= -go.opentelemetry.io/collector/extension v0.102.0 h1:R5PHbdRT31BgKNgmlY30kD0VI78SIWfQ2uKD8XAJkAY= -go.opentelemetry.io/collector/extension v0.102.0/go.mod h1:Q159CNiohyuXt1nDOH+rw4covTXWie8dsdls0sLuz7k= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= -go.opentelemetry.io/collector/pdata v1.9.0 h1:qyXe3HEVYYxerIYu0rzgo1Tx2d1Zs6iF+TCckbHLFOw= -go.opentelemetry.io/collector/pdata v1.9.0/go.mod h1:vk7LrfpyVpGZrRWcpjyy0DDZzL3SZiYMQxfap25551w= -go.opentelemetry.io/collector/pdata/testdata v0.102.0 h1:hDTnmWPWWFtGHdZM/II8G9RW2nInvRoCIwBe3ekdDxg= -go.opentelemetry.io/collector/pdata/testdata v0.102.0/go.mod h1:JEoSJTMgeTKyGxoMRy48RMYyhkA5vCCq/abJq9B6vXs= -go.opentelemetry.io/collector/processor v0.102.0 h1:JsjTlpBRmoSYxcu3cAbKBchOmL6aNUxLa03ZkWIqZr8= -go.opentelemetry.io/collector/processor v0.102.0/go.mod h1:IaCSDcfy75uQTaOM+LgR1bMf/bUw2eFfzn20uvWYfLQ= -go.opentelemetry.io/collector/receiver v0.102.0 h1:8rHNjWjV90bL0dgvKVc/7D10NCbM7bXCiqpcLRz5jBI= -go.opentelemetry.io/collector/receiver v0.102.0/go.mod h1:bYDwYItMrj7Drx0Pn4wZQ8Ii67lp9Nta62gbau93FhA= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= -go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= -go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= +go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= +go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= +go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= +go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= +go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= +go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= +go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= +go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= +go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= +go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= +go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= +go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= +go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= +go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= +go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= +go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= +go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= +go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= +go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= +go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/processor v0.116.0 h1:Kyu4tPzTdWNHtZjcxvI/bGNAgyv8L8Kem2r/Mk4IDAw= +go.opentelemetry.io/collector/processor v0.116.0/go.mod h1:+/Ugy48RAxlZEXmN2cw51W8t5wdHS9No+GAoP+moskk= +go.opentelemetry.io/collector/processor/processortest v0.116.0 h1:+IqNEVEE0E2MsO2g7+Y/9dz35sDuvAXRXrLts9NdXrA= +go.opentelemetry.io/collector/processor/processortest v0.116.0/go.mod h1:DLaQDBxzgeeaUO0ULMn/efos9PmHZkmYCHuxwCsiVHI= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0 h1:iin/UwuWvSLB7ZNfINFUYbZ5lxIi1NjZ2brkyyFdiRA= +go.opentelemetry.io/collector/processor/xprocessor v0.116.0/go.mod h1:cnA43/XpKDbaOmd8buqKp/LGJ2l/OoCqbR//u5DMfn8= +go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= +go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= +go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= +go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= +go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= +go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -126,20 +146,20 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -148,14 +168,14 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= -gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= +gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/processor/logstransformprocessor/internal/metadata/generated_status.go b/processor/logstransformprocessor/internal/metadata/generated_status.go index fe4d8c602b70..939171474048 100644 --- a/processor/logstransformprocessor/internal/metadata/generated_status.go +++ b/processor/logstransformprocessor/internal/metadata/generated_status.go @@ -7,7 +7,8 @@ import ( ) var ( - Type = component.MustNewType("logstransform") + Type = component.MustNewType("logstransform") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/processor/logstransformprocessor" ) const ( diff --git a/processor/logstransformprocessor/internal/metadata/generated_telemetry.go b/processor/logstransformprocessor/internal/metadata/generated_telemetry.go deleted file mode 100644 index eba0f76d9bac..000000000000 --- a/processor/logstransformprocessor/internal/metadata/generated_telemetry.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" -) - -func Meter(settings component.TelemetrySettings) metric.Meter { - return settings.MeterProvider.Meter("otelcol/logstransform") -} - -func Tracer(settings component.TelemetrySettings) trace.Tracer { - return settings.TracerProvider.Tracer("otelcol/logstransform") -} diff --git a/processor/logstransformprocessor/internal/metadata/generated_telemetry_test.go b/processor/logstransformprocessor/internal/metadata/generated_telemetry_test.go deleted file mode 100644 index 95ffe79b6114..000000000000 --- a/processor/logstransformprocessor/internal/metadata/generated_telemetry_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mdatagen. DO NOT EDIT. - -package metadata - -import ( - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - embeddedmetric "go.opentelemetry.io/otel/metric/embedded" - noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/trace" - embeddedtrace "go.opentelemetry.io/otel/trace/embedded" - nooptrace "go.opentelemetry.io/otel/trace/noop" - - "go.opentelemetry.io/collector/component" -) - -type mockMeter struct { - noopmetric.Meter - name string -} -type mockMeterProvider struct { - embeddedmetric.MeterProvider -} - -func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { - return mockMeter{name: name} -} - -type mockTracer struct { - nooptrace.Tracer - name string -} - -type mockTracerProvider struct { - embeddedtrace.TracerProvider -} - -func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { - return mockTracer{name: name} -} - -func TestProviders(t *testing.T) { - set := component.TelemetrySettings{ - MeterProvider: mockMeterProvider{}, - TracerProvider: mockTracerProvider{}, - } - - meter := Meter(set) - if m, ok := meter.(mockMeter); ok { - require.Equal(t, "otelcol/logstransform", m.name) - } else { - require.Fail(t, "returned Meter not mockMeter") - } - - tracer := Tracer(set) - if m, ok := tracer.(mockTracer); ok { - require.Equal(t, "otelcol/logstransform", m.name) - } else { - require.Fail(t, "returned Meter not mockTracer") - } -} diff --git a/processor/logstransformprocessor/metadata.yaml b/processor/logstransformprocessor/metadata.yaml index d31075f3d632..8e3aa5ac57cd 100644 --- a/processor/logstransformprocessor/metadata.yaml +++ b/processor/logstransformprocessor/metadata.yaml @@ -1,5 +1,4 @@ type: logstransform -scope_name: otelcol/logstransform status: class: processor @@ -7,7 +6,7 @@ status: development: [logs] distributions: [] codeowners: - active: [djaglowski, dehaansa] + active: [dehaansa] tests: config: diff --git a/processor/logstransformprocessor/processor.go b/processor/logstransformprocessor/processor.go index 270ea0439488..72d36fec1307 100644 --- a/processor/logstransformprocessor/processor.go +++ b/processor/logstransformprocessor/processor.go @@ -17,6 +17,7 @@ import ( "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/adapter" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/entry" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/pipeline" @@ -31,7 +32,6 @@ type logsTransformProcessor struct { pipe *pipeline.DirectedPipeline firstOperator operator.Operator emitter *helper.LogEmitter - converter *adapter.Converter fromConverter *adapter.FromPdataConverter shutdownFns []component.ShutdownFunc } @@ -45,7 +45,7 @@ func newProcessor(config *Config, nextConsumer consumer.Logs, set component.Tele baseCfg := p.config.BaseConfig - p.emitter = helper.NewLogEmitter(p.set) + p.emitter = helper.NewLogEmitter(p.set, p.consumeStanzaLogEntries) pipe, err := pipeline.Config{ Operators: baseCfg.Operators, DefaultOutput: p.emitter, @@ -79,9 +79,6 @@ func (ltp *logsTransformProcessor) Shutdown(ctx context.Context) error { } func (ltp *logsTransformProcessor) Start(ctx context.Context, _ component.Host) error { - // create all objects before starting them, since the loops (consumerLoop, converterLoop) depend on these converters not being nil. - ltp.converter = adapter.NewConverter(ltp.set) - wkrCount := int(math.Max(1, float64(runtime.NumCPU()))) ltp.fromConverter = adapter.NewFromPdataConverter(ltp.set, wkrCount) @@ -90,15 +87,10 @@ func (ltp *logsTransformProcessor) Start(ctx context.Context, _ component.Host) // fromConverter: converts logs to stanza format -> // converterLoop: forwards converted logs to the stanza pipeline -> // pipeline: performs user configured operations on the logs -> - // emitterLoop: forwards output stanza logs for conversion to OTLP -> - // converter: converts stanza logs to OTLP -> - // consumerLoop: sends the converted OTLP logs to the next consumer + // transformProcessor: receives []*entry.Entries, converts them to plog.Logs and sends the converted OTLP logs to the next consumer // // We should start these components in reverse order of the data flow, then stop them in order of the data flow, // in order to allow for pipeline draining. - ltp.startConsumerLoop(ctx) - ltp.startConverter() - ltp.startEmitterLoop(ctx) err := ltp.startPipeline() if err != nil { return err @@ -151,41 +143,6 @@ func (ltp *logsTransformProcessor) startPipeline() error { return nil } -// startEmitterLoop starts the loop which reads all the logs modified by the pipeline and then forwards -// them to converter -func (ltp *logsTransformProcessor) startEmitterLoop(ctx context.Context) { - wg := &sync.WaitGroup{} - wg.Add(1) - go ltp.emitterLoop(ctx, wg) - - ltp.shutdownFns = append(ltp.shutdownFns, func(_ context.Context) error { - wg.Wait() - return nil - }) -} - -func (ltp *logsTransformProcessor) startConverter() { - ltp.converter.Start() - - ltp.shutdownFns = append(ltp.shutdownFns, func(_ context.Context) error { - ltp.converter.Stop() - return nil - }) -} - -// startConsumerLoop starts the loop which reads all the logs produced by the converter -// (aggregated by Resource) and then places them on the next consumer -func (ltp *logsTransformProcessor) startConsumerLoop(ctx context.Context) { - wg := &sync.WaitGroup{} - wg.Add(1) - go ltp.consumerLoop(ctx, wg) - - ltp.shutdownFns = append(ltp.shutdownFns, func(_ context.Context) error { - wg.Wait() - return nil - }) -} - func (ltp *logsTransformProcessor) ConsumeLogs(_ context.Context, ld plog.Logs) error { // Add the logs to the chain return ltp.fromConverter.Batch(ld) @@ -219,48 +176,9 @@ func (ltp *logsTransformProcessor) converterLoop(ctx context.Context, wg *sync.W } } -// emitterLoop reads the log entries produced by the emitter and batches them -// in converter. -func (ltp *logsTransformProcessor) emitterLoop(ctx context.Context, wg *sync.WaitGroup) { - defer wg.Done() - - for { - select { - case <-ctx.Done(): - ltp.set.Logger.Debug("emitter loop stopped") - return - case e, ok := <-ltp.emitter.OutChannel(): - if !ok { - ltp.set.Logger.Debug("emitter channel got closed") - return - } - - if err := ltp.converter.Batch(e); err != nil { - ltp.set.Logger.Error("processor encountered an issue with the converter", zap.Error(err)) - } - } - } -} - -// consumerLoop reads converter log entries and calls the consumer to consumer them. -func (ltp *logsTransformProcessor) consumerLoop(ctx context.Context, wg *sync.WaitGroup) { - defer wg.Done() - - for { - select { - case <-ctx.Done(): - ltp.set.Logger.Debug("consumer loop stopped") - return - - case pLogs, ok := <-ltp.converter.OutChannel(): - if !ok { - ltp.set.Logger.Debug("converter channel got closed") - return - } - - if err := ltp.consumer.ConsumeLogs(ctx, pLogs); err != nil { - ltp.set.Logger.Error("processor encountered an issue with next consumer", zap.Error(err)) - } - } +func (ltp *logsTransformProcessor) consumeStanzaLogEntries(ctx context.Context, entries []*entry.Entry) { + pLogs := adapter.ConvertEntries(entries) + if err := ltp.consumer.ConsumeLogs(ctx, pLogs); err != nil { + ltp.set.Logger.Error("processor encountered an issue with next consumer", zap.Error(err)) } } diff --git a/processor/logstransformprocessor/processor_test.go b/processor/logstransformprocessor/processor_test.go index 4f51240a313c..c51bb042911d 100644 --- a/processor/logstransformprocessor/processor_test.go +++ b/processor/logstransformprocessor/processor_test.go @@ -25,30 +25,28 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/parser/regex" ) -var ( - cfg = &Config{ - BaseConfig: adapter.BaseConfig{ - Operators: []operator.Config{ - { - Builder: func() *regex.Config { - cfg := regex.NewConfig() - cfg.Regex = "^(?P